Web-GUI und 3rdparty-App für Streamripper

Status
Für weitere Antworten geschlossen.

MoleWindu

Benutzer
Mitglied seit
09. Jan 2013
Beiträge
6
Punkte für Reaktionen
0
Punkte
0
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):
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 &
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;

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 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:
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
Im Verzeichnis "/usr/syno/synoman/webman/3rdparty/" muss ein symbolischer Link gesetzt werden:
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:
sr.JPG

Die Statusseite sieht so aus:
sr2.JPG

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

  • ripper.zip
    11,9 KB · Aufrufe: 16
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat