[HowTo] Recorder für Streamripper mit "freetz" auf Fritz!Box

rapat

Neuer User
Mitglied seit
1 Jan 2008
Beiträge
2
Punkte für Reaktionen
0
Punkte
1
Hi,

Für das regelmässige Aufnehmen von Radio-Sendungen via Internet-Stream gibt es bereits eine Vielzahl an Software-Lösungen. Für den überwiegenden Teil muss dazu jedoch ein PC oder so an sein. Das muss nicht sein, denn die Fritz!- oder eine andere Netz-Box ist ja ohnehin da und an - und oft gelangweilt, weil keiner da sich ...

So war ich von der Idee, die Aufnahmen mittels Streamripper und Crontab-Jobs sozusagen im Hintergrund zu erledigen, recht angetan. Allein die langen Zeilen haben mir nicht gefallen, ich wollte es lieber kurz, etwa so:

29 08 * * 1-5 ./recorder ndrKultur "Am Morgen vorgelesen" 32 Stick
04 09 * * 1-5 ./recorder mdrFigaro Lesezeit 33 Onlinespeicher
04 10 * * 6 ./recorder DLF KPetc 57 usbHDD

Die letzte Zeile sähe im Orginal etwa so aus:

04 10 * * 6 ./recorder DLF KPetc 57 usbHDD streamripper http://dradio_mp3_dlf_m.akacast.aka...gnl.akacast.akamaistream.net/dradio_mp3_dlf_m --with-id3v1 --quiet -a RecorderTest_2014-03-19_21-52-27_DLF -s -A -o larger -k 1 -l 15 -d /var/media/ftp/usbHDD/Music/DLF/RecorderTest


Nicht wirklich praktikabel, zumal alles in einer Zeile stehen muss.
Also schnell ein Script geschrieben auf dass die Sache im Blick bleibt. ;)

Die Crontab-Zeile kurz erklärt:

mm HH DD MM W
Befehl Sender Programm Dauer HDD-Label
04 10 * * 6 ./recorder DLF KPetc 57 (min) Name lt. Datei-Manager

Zu gut deutsch: Nimm jeden Samstag (6) um 10:04 für 57 min das Programm "KPetc" vom DLF auf.

Noch einmal in Code-Format:
Code:
04 10 * * 6 ./recorder DLF KPetc 57 usbHDD
oder auch:
Code:
04 10 * * 6 sh recorder DLF "Klassik Pop etc" 57 usbHDD
Es ist also immer nur ein Leerzeichen "erlaubt", bzw., ansonsten halt in Anführungszeichen.


Wie ist der Script zu verwenden?


Ich unterstelle jetzt einmal, dass eine Freetz-Variante auf der Box mit Streamripper im Paket läuft. Dann sind die Grundlagen bereits gelegt. Wenn nicht, eine der Internet-Suchmaschinen wird da helfen können! :D

Den Code in eine Datei auf den USB-Stick / -HDD packen und ausführbar machen.
Danach im load-Zweig der rc.external folgende Zeile eintragen:
Code:
/var/media/ftp/Stick/scripts/recorder.sh
Stick an der Box angeschlossen - dann ist nach einem reboot / Neustart der Box bereits alles eingerichtet.
Bitte den Teil Stick/scripts/recorder den eigenen Wünschen /Gegebenheiten anpassen.


Code:
#!/bin/sh
# Stream-Aufnahmen per crontab via Streamripper mit ausgewähltem Sender
# $1 = Sender
# $2 = Programm
# $3 = Dauer
# $4 = Speicher-Namen (Label)

# 0. Wer lieber einen anderen Test-Stream will, bitte anpassen
def_sender="dlf"
def_stream="http://dradio_mp3_dlf_m.akacast.akamaistream.net/7/249/142684/v1/gnl.akacast.akamaistream.net/dradio_mp3_dlf_m"
cfg_ripper="/var/mod/etc/conf/streamripper.cfg"

##### Speicherorte, don`t edit #####
Speicherorte="uStor01 usbHDD online"

# 1. Start oder Teststrecke für die Konsole
if [ -z "$1" ] ; then
     echo & echo Das ist ein Test-Lauf
  sleep 5 & echo =====================
    sender=$def_sender
  programm=RecorderTest
     dauer=15          # sind Sekunden
      test=yes
else
  ## Input-Variable zuweisen
    sender=$1
  programm=$2
     dauer=$3
  speicher=$4
fi
echo memorys=$Speicherorte
echo \  Dauer=$dauer min
echo 1. Abschnitt: Start-Phase beendet.

# 2. Namen und default-Ordner ermitteln oder festlegen
echo   Start-Ort=\"$0\"
echo  Start-Pfad=\"$(pwd)\"
echo     dirTest=\"$(dirname $0)\"       
       startPfad=$(pwd)
         scripts=$(dirname $0)
if [ "$scripts" = "." ] ; then scripts=$(echo | pwd) ; fi

if  [ ${startPfad##*/} = "root" ] ; then
	       ortsTest=$(ls -l $0 | cut -d'>' -f2 | cut -d'.' -f1)
          echo ortsTest=\"$ortsTest\"
	           teil=${ortsTest%/*}
                scripts=/${teil#*/}
fi
echo scriptPfad=\"$scripts\"
         muster=$(basename $0)
     scriptName=${muster%.*}
echo scriptName=\"$scriptName\"

         string=$(grep MUSICDIR "$cfg_ripper" | cut -d'=' -f2 | cut -d'/' -f6 | cut -d'\' -f1)
echo     string=\"$string\"
           teil=${string%?}
         ordner=${teil#?}

if [ -z "$ordner" ] ; then  ordner=Music ; else ordner=${string%?} ; fi
echo      ordner=\"$ordner\"
echo 2. Abschnitt: Ordner-Suche beendet.

# 3. Speicher-Namen mit "mount" auslesen und den -Orten zuweisen
dev_Anz=$(mount | grep -c "ftp/" | cut -d' ' -f3 | cut -d'/' -f5)
dev_Name=$(mount | grep "ftp/" | cut -d' ' -f3 | cut -d'/' -f5)
echo $dev_Name > "/var/tmp/$scriptName.tmp"
read -t 1 $Speicherorte < "/var/tmp/$scriptName.tmp"

echo  dev_Anz=\"$dev_Anz\"
echo  uStor01=\"$uStor01\"
echo \ usbHDD=\"$usbHDD\"
echo \ online=\"$online\"
echo 3. Abschnitt: Speicher-Namen \(Label\) beendet.
# sleep 5 & exit

# 4. symLink für crontab und USB-Stick anlegen (./$scriptName ruft dann diesen script auf)
if [ ! -e "/var/mod/root/$scriptName" ] ; then
  ln -s "$scripts/$scriptName.sh" "/var/mod/root/$scriptName"
  echo "symLink erstellt"
   if [ -p "/var/tam/mount" ] ; then
     echo "/var/media/ftp/$uStor01" > /var/tam/mount
     rm -f /var/media/NEW_LINK
     ln -f -s /var/media/ftp/$uStor01 /var/media/NEW_LINK
   fi
exit
else
  echo "symLink bereits vorhanden"
fi
echo 4. Abschnitt: SymLink beendet.

# 5. URL des Streams in Streamripper-Config-Datei suchen
echo \  Sender-Suche=\"$sender\"
              string=$(grep -i -m 1 "$sender" "$cfg_ripper" | cut -d'=' -f2)
                teil=${string%?}
              sender=${teil#?}
echo  Sender lt. cfg=\"$sender\"
srch=$(grep "$sender" "$cfg_ripper" | cut -d'_' -f2 | cut -d'E' -f2 | cut -d'=' -f1)
srch=$(echo $srch | cut -d' ' -f1)
echo \ \ Sender-Platz=\"$srch\"

if [ -z "$srch" ] && [ "$test" = "yes" ] ; then
    srch=1
  string=$(grep NAME$srch "$cfg_ripper" | cut -d'=' -f2)
    teil=${string%?}
  sender=${teil#?}
fi
     string=$(grep SERVER$srch "$cfg_ripper" | cut -d'=' -f2)
echo Stream=$string
       teil=${string%??????}
     stream=${teil#?}
echo Stream=\"$stream\"

if [ -z "$stream" ] && [ "$test" = "yes" ] ; then
  echo Keine Stream-URL gefunden, setze Test-Stream auf $def_stream
  sender=Test-mit-$def_sender
  stream=$def_stream
  sleep 5 & echo
else
  echo Sender+Platz: $sender=$srch
fi
echo 5. Abschnitt: Stream-Suche beendet.

# 6. Speicher-Ort festlegen
if [ -z "$speicher" ] || [ -z "$4" ] ; then
    string=$(grep MUSICDIR "$cfg_ripper" | cut -d'=' -f2)
      teil=${string%?}
  speicher=${teil#?}
       HDD="$speicher/$sender/$programm"
else
  case $speicher in
    $uStor01) HDD="/var/media/ftp/$uStor01/$ordner/$sender/$programm"  ;;
     $usbHDD) HDD="/var/media/ftp/$usbHDD/$ordner/$sender/$programm"  ;;
     $online) HDD="/var/media/ftp/$online/$ordner/$sender/$programm"  ;;
  esac
fi

if [ -z "$HDD" ] ; then 
  muster=$(echo $scripts | cut -d'/' -f6)
  defHDD=$(echo ${scripts//$muster})
     HDD="$defHDD$ordner/$sender/$programm"
fi
echo Speicher=$HDD
echo 6. Abschnitt: Speicher-Ort beendet. & echo

# Frage beim Test-Lauf zum Beeenden
if [ "$test" = "yes" ] ; then
  echo "Wenn alle Werte richtig eingetragen sind, kann der Test-Lauf fortgesetzt werden."
  echo
  echo \ \ Sender=\"$sender\"
  echo \ \ Stream=\"$stream\"
  echo  \Programm=\"$programm\"
  echo \ \  Dauer=\"$dauer s\"
  echo \Speicher=\"$HDD\"
  echo \LogDatei=\"$scripts/$scriptName.log\"
  echo
  while true; do
    read -p "Alle Werte okay? $scriptName-Test fortsetzen? " jn
    case $jn in
        [Jj]* ) echo "Test wird fortgesetzt ..."; echo; sleep 2; break ;;
        [Nn]* ) exit ;;
    esac
  done
fi

# 7. Log-Buch 1. Eintrag schreiben
     zeit=$(date +"%a, %d.%m.%Y, %H:%M,%S Uhr")
dateiName=$(echo $programm\_$(date +%F_%H-%M-%S\_$sender))

if [ "$test" = "yes" ] ; then
  echo $zeit: $sender nimmt $dauer s "$programm" als \"$dateiName\" auf.
  echo $zeit: $sender nimmt $dauer s "$programm" in \"$HDD\" auf. >> "$scripts/$scriptName.log"
else
  echo $zeit: $sender startet $dauer min Aufnahme von \"$programm\". >> "$scripts/$scriptName.log"
fi
echo 7. Abschnitt: Logbuch, 1. Eintrag beendet.

# 8. Streamripper mit gefundendem Sender starten
if [ "$test" = "yes" ] ; then
  echo "streamripper $stream --with-id3v1 --quiet -a "$dateiName" -s -A -o larger -k 1 -l $dauer -d "$HDD" "
  echo & sleep 2 & echo "Aufnahme gestartet, es geht gleich weiter ..."
fi
if [ ! -z "$3" ] ; then  dauer=$(expr $3 \* 60) ; else dauer=$dauer ; fi # Minuten-Input in Sekunden umrechnen
streamripper $stream --with-id3v1 --quiet -a "$dateiName" -s -A -o larger -k 1 -l $dauer -d "$HDD"
errCode=$?
echo Streamripper, Exit-Code: \"$errCode\" 
echo 8. Abschnitt: Stream-Aufnahme beendet.

# 9. Log-Buch 2. Eintrag schreiben
if [ "$errCode" != "0" ] ; then
  echo Streamripper mit Fehler beendet: \"$errCode\"
  zeit=$(date +"%a, %d.%m.%Y, %H:%M,%S Uhr")
  echo $zeit: streamripper mit Fehler \"$errCode\" beendet.>>"$scripts/$scriptName.log"
  echo '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'>>"$scripts/$scriptName.log"
else
  echo Streamripper erfolgreich beendet.
  zeit=$(date +"%a, %d.%m.%Y, %H:%M,%S Uhr")
  echo $zeit: $sender auf \"$HDD\" beendet.>>"$scripts/$scriptName.log"
  echo '------------------------------'>>"$scripts/$scriptName.log"
fi
echo 9. Abschnitt: Logbuch, 2. Eintrag beendet. & echo

rm "/var/tmp/$scriptName.tmp"

Das Script ist so angelegt, dass es, so hoffe ich, für jeden (der sich schon einmal mit ...) nachvollziehbar bleibt.
Ansonsten stehen viele Hinweise bereits im Script.
Dieser sollte ohne weitere Anpassung, ausser man mag meinen Test-Sender nicht, :( laufen.
Bei mir heißt der Script "recorder.sh" und liegt im Ordner "/scripts".
Eigentlich sind diese Namen nicht zwingend, wenn auch logisch ...

Die notwendigen Informationen über Sender-Namen, Stream, HDD-Label etc. holt sich das Script aus der Config-Datei für den Streamripper und der lokalen Freetz-Umgebung. Das bedeutet, die in der Crontab verwendeten Begriffe sollten mit denen für den Streamripper übereinstimmen.

Die Aufnahme landet dann als .mp3 /.ogg (je nach Stream) in dem im Streamripper-Menü angegebenen Ordner,
wobei dort dann die Aufnahmen gleich nach Sender und Programm sortiert werden.
Je nach Fritz!Box und sonstiger Konstellation wie Onlinespeicher sind derzeit drei Speicher-Orte möglich:

  • USB-Stick
  • USB-Festplatte
  • Online-Speicher

Wer mehr braucht, müsste im 6. Abschnitt den case-Teil anpassen und entsprechend dazu im 0. Abschnitt die Variable "Speicherorte" anpassen. Doch dann entfällt die Gewährleistung. :cool:

Beim Erststart des Scripts werden im 4. Abschnitt zwei symbolische Links angelegt.
Der erste ist für die Crontab, der zweite ist für den Verweis des Anrufsbeantworters (AVM-Zweig der Box) auf den 1. USB-Speicher (uStor01).
Wer den 2. Link nicht will oder braucht, kann den Bereich über dem exit-Komanndo löschen oder einfach mit #auskommentieren:
Code:
   if [ -p "/var/tam/mount" ] ; then
     echo "/var/media/ftp/$uStor01" > /var/tam/mount
     rm -f /var/media/NEW_LINK
     ln -f -s /var/media/ftp/$uStor01 /var/media/NEW_LINK
   fi

In der Konsole kann direḱt nach dem Einloggen mit sh recorder das Script getestet werden.

So nun viel Spass beim Aufnehmen.

Cu, rapat
 

Anhänge

  • recorder.sh.tar.gz
    2.4 KB · Aufrufe: 1
Zuletzt bearbeitet:
Könnte man auch ein Script für 24/7 laufen lassen wie RadioFX ?
 
@kingbecher
Diese Möglichkeit ist bereits gegeben. Streamripper unter Freetz starten und laufen lassen. Doch wozu?
 
Um legal internet radio zu rippen
 

Zurzeit aktive Besucher

Neueste Beiträge

Statistik des Forums

Themen
244,872
Beiträge
2,219,909
Mitglieder
371,594
Neuestes Mitglied
AA-Idealbau
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.