Hallo allerseits,
ich habe mit meinen dürftigen PHP und HTML-Kenntnissen einmal etwas zusammengeschustert. Vorweg: Es funktioniert. Ob es nun optimal ist, wage ich zu bezweifeln, aber vielleicht kann ja einer etwas damit anfangen und etwas "effizienteres/schöneres/cooleres/Synology-Mäßiges" draus bauen.
Wenn man den Streamripper kennt und versteht, wie dieser arbeitet, lässt sich meine Anwendungen leichter verstehen.
Der normale Konsolenaufruf des Streamrippers lautet wie folgt (Pfade habe ich schon einmal angepasst):
In Kürze: (Beispiel)
Wichtig ist hier das "&" am Ende. Dies sorgt dafür, dass der Prozess in den Hintergrund verlegt wird und dort ganz normal weiterläuft (der Streamripper gibt sonst dauerhaft Informationen auf der Shell aus)
Das Ziel meiner Anwendung ist es nun, möglichst komfortabel diese Aufrufe zu generieren. Das meiste erledige ich mittels .txt-Dateien und .sh-Skripten (Bash), die ich über "exec_shell" Kommandos auf der Konsole generieren lasse und dann mittels Java-Skript-Schaltfläche auf der Konsole im Hintergrund ausführen lasse.
Damit man weiß, was gerade läuft und ob er auch noch arbeitet (denn, wenn der Streamripper sich mal aufhängt, taucht er zwar als Prozess auf, nimmt aber nicht weiter auf) lasse ich alle Ausgaben der Streamripper-Aufrufe in Logdateien schreiben. Diese Logdateien werden automatisch erzeugt und mit dem Namen des aktuellen Streams benannt, sodass man diese Zuordnen kann.
In der Anwendung ist es möglich, eine Art "Streamsammlung" zu verwalten und diese abzuspeichern. Möchte man nun einen Stream aufnehmen, kopiert man den in der Sammlung stehenden Stream in das linke Fenster und stößt mit einem Klick auf den darunterliegenden Knopf die Generierung der Aufrufe an. Mit dem Klick "Alle Starten" werden dann alle im Aufruf-Bash-Skript befindlichen Streams aufgenommen. Zuvor werden beim Klick auf "Alle Starten" die Logdateien gelöscht, damit nicht unnötig Platz verbraucht wird (10 Std rippen ~10MB-Logdatei).
Im rechten Fenster pflegt man die "Sammlung", wie ich sie nenne. Die Syntax muss immer gleich und einheitlich sein, da sonst das Skript auf Fehler läuft und fehlerhafte Aufrufe baut.
Syntax:
http://IP:Port;Relay-Port;Streamname;
Das Skript durchwühlt die Datei und sucht nach den Semikolon als "Trennzeichen" und baut daraus dann die Auruf-Statements.
Das Skript zum Generieren der Streamripper-Aufrufe sieht wie folgt aus:
Hierbei wird die Text-Datei "streams.txt" als Referenzliste verwendet und daraus per for-Schleife die Aufrufe generiert. Sieht vielleicht auf den ersten Blick ein wenig kompliziert aus, aber wenn man damit regelmäßig arbeitet und sich reinfuchst, findet man sich zurecht.
Wenn man dies nun ausführt, erhält man z.B. folgende "Aufruf-Datei" (Bash-Skript):
Zusätzlich habe ich noch eine php-Shoutcast abfrage eingebaut, die ich allerdings nicht selber erfunden habe, sondern im Netz gefunden habe.
Wer diese nicht braucht, kann ja einfach die betreffenen Zeilen auskommentieren und die shoutcast.php und die shoutstreams.php löschen. Letzere enthält alle Streams, die abgefragt werden sollen.
Damit man weiß, was gerade läuft, lass ich mittels Bash-Skript die laufenden Streamripper-Prozesse ermitteln:
Alle Streamripper-Prozesse werden in die Datei "out.txt" geschrieben, welche auf der "Status-Seite" in einer Text-Area geladen wird. So behält man den Überblick.
Die Hauptanwendung sieht wie folgt aus: (siehe "streamripper.php im Archiv)
Hierbei werden im Prinzip nur die Schaltflächen konfiguriert und die Text-Dateien als Textarea eingelesen. Wichtig ist hierbei, dass die beiden auf der Hauptseite schreibend eingelesen werden, damit Änderungen auch durchgeführt werden können.
Die Schaltfläche "Alle stoppen" führt ein "kill -9"-Bash-Skript aus, welches alle Streamripper ausnahmslos beendet. Auf der "Status"-Seite ist es zudem möglich, mittels der Prozess-ID (steht in der linken Text-Area in jeder Zeile) einen bestimmten Stream zu beenden. Damit man weiß, welcher welcher ist, habe ich die Textdatei der Sammlung rechts daneben gepackt, damit man die laufenden Streams zuordnen kann (mittels der verwendeten IP und Port).
Alle notwendigen Dateien (Icons für die 3rd-Party-App und Favicon) habe ich im Archiv eingepackt.
Für den Betrieb als 3rdparty-Anwendung muss folgende Datei im Verzeichnis "/volume1/@appstore/sr/" erstellt werden:
application.cfg:
Im Verzeichnis "/volume1/@appstore/sr/" müssen insgesamt (zumindest in der aktuellen Konfiguration) folgende Dateien liegen:
Zusätzlich können alle Dateien im web-Verzeichnis bleiben, damit man die Anwendung über die direkte URL der Webstation öffnen kann. Für den Betrieb als 3rd-Party-App müssen also nur folgende Dateien in das o.g. Verzeichnis:
Im Verzeichnis "/usr/syno/synoman/webman/3rdparty/" muss ein symbolischer Link gesetzt werden:
Der sieht in der Dateiansicht dann wie folgt aus:
Die Hauptseite sieht dann wie folgt aus:
Die Statusseite sieht so aus:
Sollte die Webstation laufen, kann das Interface auch direkt im Browser geöffnet werden, daher hatte ich es erst mal im "web"-Ordner abgelegt. Die 3rdparty-App ist auch im Browser aufrufbar:
Bei sämtlichen Fragen, immer her damit. Auch wer Verbesserungen findet und einbauen / umbauen möchte, kann dies gerne tun. Dann hätte ich allerdings gerne eine Kopie der Anwendung
WICHTIG: Bitte alle Dateien auf evtl. Pfad-Abweichungen überprüfen!
Euer
MoleWindu
ich habe mit meinen dürftigen PHP und HTML-Kenntnissen einmal etwas zusammengeschustert. Vorweg: Es funktioniert. Ob es nun optimal ist, wage ich zu bezweifeln, aber vielleicht kann ja einer etwas damit anfangen und etwas "effizienteres/schöneres/cooleres/Synology-Mäßiges" draus bauen.
Wenn man den Streamripper kennt und versteht, wie dieser arbeitet, lässt sich meine Anwendungen leichter verstehen.
Der normale Konsolenaufruf des Streamrippers lautet wie folgt (Pfade habe ich schon einmal angepasst):
Rich (BBCode):
/opt/bin/streamripper "http://IP:Port" -d "Speicherort als absoluter Pfad" -r "Port für den Relaystream (-> Verbindung wird ins interne Netz "relayed", sodass mit nur einem Slot mehrere Clients den Stream hören können) -o (overwrite im "incomplete"-Ordner, steht bei mir immer auf "larger", sodass kleinere Dateien im incomplete durch größere überschrieben werden..gibt auch noch andere) -u "User-Agent" (der Streamripper-Useragent wird gerne mal von den Serverbetreibern geblockt, da ja aufnehmen eher das sekundäre Ziel eines Shoutcast-Streams ist; meiner ist z.B. ein UserAgent von einem Android-Musikplayer) --codeset-filesys=UTF-8 --codeset-metadata=UTF-8 --codeset-relay=UTF8 (Kodierungsoptionen für Dateinamen, Metadaten und Relaystream) >>/absoluter/Pfad/zum/Speicherort/der/Logdatei
In Kürze: (Beispiel)
Rich (BBCode):
/opt/bin/streamripper http://87.106.59.72:8000 -d /volume1/Musik/6-Streamripper -r 8050 -o larger -u "WAFA/1.2.10 (Linux; Android 4.1; Winamp) Replicant/1.0" --codeset-filesys=UTF-8 --codeset-id3=UTF-8 --codeset-metadata=UTF-8 --codeset-relay=UTF8 >> /volume1/Musik/6-Streamripper/_log/Infinity.log &
Das Ziel meiner Anwendung ist es nun, möglichst komfortabel diese Aufrufe zu generieren. Das meiste erledige ich mittels .txt-Dateien und .sh-Skripten (Bash), die ich über "exec_shell" Kommandos auf der Konsole generieren lasse und dann mittels Java-Skript-Schaltfläche auf der Konsole im Hintergrund ausführen lasse.
Damit man weiß, was gerade läuft und ob er auch noch arbeitet (denn, wenn der Streamripper sich mal aufhängt, taucht er zwar als Prozess auf, nimmt aber nicht weiter auf) lasse ich alle Ausgaben der Streamripper-Aufrufe in Logdateien schreiben. Diese Logdateien werden automatisch erzeugt und mit dem Namen des aktuellen Streams benannt, sodass man diese Zuordnen kann.
In der Anwendung ist es möglich, eine Art "Streamsammlung" zu verwalten und diese abzuspeichern. Möchte man nun einen Stream aufnehmen, kopiert man den in der Sammlung stehenden Stream in das linke Fenster und stößt mit einem Klick auf den darunterliegenden Knopf die Generierung der Aufrufe an. Mit dem Klick "Alle Starten" werden dann alle im Aufruf-Bash-Skript befindlichen Streams aufgenommen. Zuvor werden beim Klick auf "Alle Starten" die Logdateien gelöscht, damit nicht unnötig Platz verbraucht wird (10 Std rippen ~10MB-Logdatei).
Im rechten Fenster pflegt man die "Sammlung", wie ich sie nenne. Die Syntax muss immer gleich und einheitlich sein, da sonst das Skript auf Fehler läuft und fehlerhafte Aufrufe baut.
Syntax:
http://IP:Port;Relay-Port;Streamname;
Rich (BBCode):
http://37.187.21.174:4000;8010;ww3.ath.cx-SingleCharts;
http://37.187.21.174:4010;8020;ww3.ath.cx-DanceCharts;
http://37.187.21.174:4020;8030;ww3.ath.cx-BlackCharts;
http://37.187.21.174:4030;8040;ww3.ath.cx-PartyCharts;
http://87.106.59.72:8000;8050;Infinity;
http://62.75.236.179:7150;8060;4Noises;
http://46.22.223.42:8000;8070;FavouredFM;
Das Skript zum Generieren der Streamripper-Aufrufe sieht wie folgt aus:
Rich (BBCode):
#!/bin/sh
datei=/volume1/web/ripper/aufruf.sh;
ort="/volume1/Musik/6-Streamripper";
log="$ort/_log";
liste=/volume1/web/ripper/streams.txt
param="-o larger -u \"WAFA/1.2.10 (Linux; Android 4.1; Winamp) Replicant/1.0\" --codeset-filesys=UTF-8 --codeset-id3=UTF-8 --codeset-metadata=UTF-8 --codeset-relay=UTF8";
##>>$log/$name.log
echo "#!/bin/sh" >$datei;
echo "##Generierte Streamripper-Strings" >>$datei;
for zeile in $(cat $liste); do url=$(echo $zeile|cut -f 1 -d ";"); name=$(echo $zeile|cut -f 3 -d ";"); relayp=$(echo $zeile|cut -f 2 -d ";"); echo "/opt/bin/streamripper $url -d $ort -r $relayp $param >>$log/$name.log &"; done >>$datei;
echo "exit 0">>$datei;
exit 0
Hierbei wird die Text-Datei "streams.txt" als Referenzliste verwendet und daraus per for-Schleife die Aufrufe generiert. Sieht vielleicht auf den ersten Blick ein wenig kompliziert aus, aber wenn man damit regelmäßig arbeitet und sich reinfuchst, findet man sich zurecht.
Wenn man dies nun ausführt, erhält man z.B. folgende "Aufruf-Datei" (Bash-Skript):
Rich (BBCode):
#!/bin/sh
##Generierte Streamripper-Strings
/opt/bin/streamripper http://87.106.59.72:8000 -d /volume1/Musik/6-Streamripper -r 8050 -o larger -u "WAFA/1.2.10 (Linux; Android 4.1; Winamp) Replicant/1.0" --codeset-filesys=UTF-8 --codeset-id3=UTF-8 --codeset-metadata=UTF-8 --codeset-relay=UTF8 >>/volume1/Musik/6-Streamripper/_log/Infinity.log &
/opt/bin/streamripper http://62.75.236.179:7150 -d /volume1/Musik/6-Streamripper -r 8060 -o larger -u "WAFA/1.2.10 (Linux; Android 4.1; Winamp) Replicant/1.0" --codeset-filesys=UTF-8 --codeset-id3=UTF-8 --codeset-metadata=UTF-8 --codeset-relay=UTF8 >>/volume1/Musik/6-Streamripper/_log/4Noises.log &
/opt/bin/streamripper http://46.22.223.42:8000 -d /volume1/Musik/6-Streamripper -r 8070 -o larger -u "WAFA/1.2.10 (Linux; Android 4.1; Winamp) Replicant/1.0" --codeset-filesys=UTF-8 --codeset-id3=UTF-8 --codeset-metadata=UTF-8 --codeset-relay=UTF8 >>/volume1/Musik/6-Streamripper/_log/Toolbase.log &
exit 0
Zusätzlich habe ich noch eine php-Shoutcast abfrage eingebaut, die ich allerdings nicht selber erfunden habe, sondern im Netz gefunden habe.
Wer diese nicht braucht, kann ja einfach die betreffenen Zeilen auskommentieren und die shoutcast.php und die shoutstreams.php löschen. Letzere enthält alle Streams, die abgefragt werden sollen.
Damit man weiß, was gerade läuft, lass ich mittels Bash-Skript die laufenden Streamripper-Prozesse ermitteln:
Rich (BBCode):
#!/bin/sh
#Prozessermittlung
datei="/volume1/web/ripper/out.txt"
>$datei
date >$datei;
echo "Liste aller Streamripper-Prozesse:">>$datei;
echo >>$datei;
echo " P-ID User UserID Kommando">>$datei;
sleep 1;
ps|grep streamripper|grep -v "grep streamripper" >> $datei;
exit 0
Alle Streamripper-Prozesse werden in die Datei "out.txt" geschrieben, welche auf der "Status-Seite" in einer Text-Area geladen wird. So behält man den Überblick.
Die Hauptanwendung sieht wie folgt aus: (siehe "streamripper.php im Archiv)
Hierbei werden im Prinzip nur die Schaltflächen konfiguriert und die Text-Dateien als Textarea eingelesen. Wichtig ist hierbei, dass die beiden auf der Hauptseite schreibend eingelesen werden, damit Änderungen auch durchgeführt werden können.
Die Schaltfläche "Alle stoppen" führt ein "kill -9"-Bash-Skript aus, welches alle Streamripper ausnahmslos beendet. Auf der "Status"-Seite ist es zudem möglich, mittels der Prozess-ID (steht in der linken Text-Area in jeder Zeile) einen bestimmten Stream zu beenden. Damit man weiß, welcher welcher ist, habe ich die Textdatei der Sammlung rechts daneben gepackt, damit man die laufenden Streams zuordnen kann (mittels der verwendeten IP und Port).
Alle notwendigen Dateien (Icons für die 3rd-Party-App und Favicon) habe ich im Archiv eingepackt.
Für den Betrieb als 3rdparty-Anwendung muss folgende Datei im Verzeichnis "/volume1/@appstore/sr/" erstellt werden:
application.cfg:
Rich (BBCode):
text = Streamripper
description = Ermoeglicht das Aufnehmen von Shoutcast-Streams
icon_16 = sr1.png
icon_32 = sr2.png
type = embedded
path = /webman/3rdparty/sr/streamripper.php
Im Verzeichnis "/volume1/@appstore/sr/" müssen insgesamt (zumindest in der aktuellen Konfiguration) folgende Dateien liegen:
Zusätzlich können alle Dateien im web-Verzeichnis bleiben, damit man die Anwendung über die direkte URL der Webstation öffnen kann. Für den Betrieb als 3rd-Party-App müssen also nur folgende Dateien in das o.g. Verzeichnis:
Rich (BBCode):
-rwxr-xr-x 1 root root 178 Sep 20 19:48 application.cfg
-rwxr-xr-x 1 root root 1406 Sep 20 19:48 favicon.ico
-rwxr-xr-x 1 root root 1927 Sep 20 19:49 shoutcast.php
-rwxr-xr-x 1 root root 1037 Sep 20 19:48 sr1.png
-rwxr-xr-x 1 root root 2925 Sep 20 19:48 sr2.png
-rwxr-xr-x 1 root root 2615 Sep 20 19:46 status.php
-rwxr-xr-x 1 root root 3265 Sep 20 19:45 streamripper.php
Rich (BBCode):
ln -s /volume1/@appstore/sr/ sr
Der sieht in der Dateiansicht dann wie folgt aus:
Rich (BBCode):
lrwxrwxrwx 1 root root 22 Jul 14 12:40 sr -> /volume1/@appstore/sr/
Die Hauptseite sieht dann wie folgt aus:
Die Statusseite sieht so aus:
Sollte die Webstation laufen, kann das Interface auch direkt im Browser geöffnet werden, daher hatte ich es erst mal im "web"-Ordner abgelegt. Die 3rdparty-App ist auch im Browser aufrufbar:
Rich (BBCode):
http://IP:Port/webman/3rdparty/sr/streamripper.php
Bei sämtlichen Fragen, immer her damit. Auch wer Verbesserungen findet und einbauen / umbauen möchte, kann dies gerne tun. Dann hätte ich allerdings gerne eine Kopie der Anwendung
WICHTIG: Bitte alle Dateien auf evtl. Pfad-Abweichungen überprüfen!
Euer
MoleWindu
Anhänge
Zuletzt bearbeitet: