- Stream aufnehmen und speichern von internet-radio in python
Ich bin auf der Suche nach einem python-snippet zum Lesen ein internet-radio-stream(.asx, .pls etc) und speichern Sie es in eine Datei.
Das Letzte Projekt ist cron ' ed-Skript, das für die Aufnahme von ein oder zwei Stunden internet-radio und übertragen Sie es dann auf mein Handy für die Wiedergabe während meiner pendeln. (3g ist die Art von Flecken auf meinem pendeln)
jede snippits oder Hinweise sind willkommen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgende hat bei mir geklappt mit den Anforderungen der Bibliothek zum verarbeiten der http-Anfrage.
Retten wird ein stream an den
stream.mp3
Datei, bis Sie es unterbrechen mitctrl+C
.requests
nicht unterstützt SHOUTcast-Protokoll (manche radios), wirft es eine Fehlermeldung mitBadStatusLine('ICY 200 OK\r\n',))
ICY 200 OK
ist wirklichHTTP/1.0 200 OK
das ist der sauberste Weg, um Vergangenheit und auf noch mehr Spaß. Hoffe, es hilft!So nach basteln und spielen mit ihm, Ich fand Streamripper am besten zu funktionieren. Dies ist der Befehl, den ich verwenden
Wenn Sie finden, dass Ihre Anforderungen oder das urllib.verlangen in Python 3 ausfällt, um zu sparen Strom, weil Sie "ICY 200 OK" zurück, anstatt ein "HTTP/1.0 200 OK", header, müssen Sie auf die zugrunde liegenden Funktionen ICY 200 OK " ist OK!
Was kann man effektiv tun ist, abzufangen, die routine, die Handgriffe Lesen des status nach dem öffnen der stream erst kurz vor der Verarbeitung der Header.
Einfach eine routine wie diese über den stream öffnen code.
Dann fügen Sie die folgenden Zeilen am Anfang deiner main-routine, bevor Sie öffnen Sie die URL.
Werden Sie überschreiben die standard-routine (dieses eine mal), und führen Sie die NiceToICY Funktion an Stelle des normalen status zu überprüfen, wenn es geöffnet hat der stream. NiceToICY ersetzt die unerkannte status Antwort, kopiert dann über den entsprechenden bits der original-Antwort, die das 'echte' _read_status Funktion. Schließlich wird die ursprüngliche genannt wird und die Werte aus, die an den Aufrufer übergeben und alles andere normal weiterläuft.
Habe ich festgestellt, dass das der einfachste Weg, um das problem der status-Meldung verursacht einen Fehler. Hoffe, es ist nützlich für Sie, zu.
Ich bin mir bewusst, das ist ein Jahr alt, aber das ist immer noch eine brauchbare Frage, die ich habe in letzter Zeit das hantieren mit.
Meisten internet-radio-Stationen geben Sie eine option der Art des downloads, wähle ich die MP3-version, dann Lesen Sie die Informationen aus einem raw-socket und schreibt Sie in eine Datei. Der trick ist, herauszufinden, wie schnell dein download ist im Vergleich zu den song, damit Sie eine Bilanz erstellen, die auf der read/write Größe. Dies wäre in Ihrem Puffer def.
Nun, dass Sie die Datei haben, ist es gut, lassen Sie es einfach auf Ihre Festplatte (record), aber die meisten Spieler löschen von Datei die bereits gespielten Stück, und deaktivieren Sie die Datei aus dem Laufwerk und ram, wenn das streaming angehalten wird.
Ich habe einige code-Schnipsel aus einer Datei ein Archiv ohne Kompression, app zu viel von der Datei, Datei-handling, spielen, Pufferung Magie. Es ist sehr ähnlich wie der Prozess fließt. Wenn Sie schreiben, bis einige sudo-code (die ich sehr empfehlen kann), können Sie sehen die ähnlichkeiten.
req=urllib.request.Request(URL); resp=urllib.request.urlopen(req); headers=resp.getheaders(); with open(outfile, 'wb') as f: shutil.copyfileobj(resp, f)
Ich bin nur vertraut mit, wie shoutcast-streaming funktioniert (das wäre die .pls Datei, die Sie erwähnen):
Sie download der pls-Datei, die nur eine playlist. Es-format ist ziemlich einfach, da es nur eine text-Datei, die Punkte, wo das eigentliche stream ist.
Können Sie eine Verbindung zu diesem stream, wie es nur HTTP, das Streaming von MP3-oder AAC. Für Ihre Nutzung, speichern Sie einfach jedes byte gelangen Sie auf eine Datei, und Sie bekommen die MP3-oder AAC-Datei, die Sie übertragen können, um Ihren mp3-player.
Shoutcast hat ein Zusatz ist optional: Metadaten. Sie können herausfinden, wie das funktioniert hier, aber ist nicht wirklich notwendig.
Wenn Sie möchten, eine Beispiel-Anwendung, die dies kann, lass es mich wissen und ich werde machen, bis etwas später.