Verwenden von cURL zum Herunterladen eines Web-Streams

Verwenden von cURL zum Herunterladen eines Web-Streams

Ich versuche, einen Streaming-Audio-Feed von einem Online-Radiosender herunterzuladen.Der Sender lief früher mit einem MP3-Shoutcast-Feed, ist jetzt aber auf einen AAC-HTTP-Audio-Feed umgestiegen..

Früher habe ich "Streamripper" im Terminal verwendet, um den Sender für meine Autofahrten zu rippen, aberjetzt kann Streamripper den neuen Stream nicht rippen. Ich bin ziemlich sicher, dass der Sender jetzt für seinen Stream die HTTP-Chunked-Transfer-Kodierung verwendet, die von Streamripper nicht unterstützt wird.

Ich habe eine neue Lösung gefunden, bei der ich den Audio-Feed vom Webplayer des Senders isoliert habe undIch verwende cURL, um den Feed in eine Audiodatei zu rippenKann ich mitnehmen.

JedochIch erhalte ständig "Vervollständigungen" auf meinem cURL, obwohl es endlos aufzeichnen sollte. Ich habe den Parameter für die maximale Zeit sogar auf 43200 s (12 Stunden) eingestellt, aber am Ende habe ich nur unterschiedliche Dateigrößen. Normalerweise ist jede resultierende Datei nicht länger als 1 Stunde. Manchmal kann sie jedoch länger als eine Stunde sein. Die Dateigrößen und -zeiten sind unterschiedlich. Die Datei „bricht ab/wird abgeschlossen“ nach kurzer Zeit und ich muss ein Skript verwenden, um die cURL-Aufzeichnung neu zu starten. Am Ende habe ich einen großen Ordner mit fraktalen Aufzeichnungen, obwohl ich nur 2 Aufzeichnungen pro Tag haben sollte (alle 12 Stunden). Wenn ich mir die ausführliche Beschreibung der cURL-Übertragung anschaue, endet sie einfach mit „cURL-Verbindung intakt geblieben“. Es gibt keinen Fehler im cURL-Protokoll, daherIch bin nicht sicher, wie ich cURL dazu zwingen kann, eine erneute Verbindung herzustellen und den Stream weiterhin in dieselbe Datei zu analysieren, obwohl es denkt, dass es fertig ist.

Ich habe auch versucht, "wget" und "Jdownloader" zu verwenden., Sie haben beide das gleiche Ergebnis, nämlich, dass es nach kurzer Zeit vorbei ist.

Ich bin nicht sicher, was ich tun kann, um eine erneute Verbindung zu erzwingen und den Download in dieselbe Datei fortzusetzen, ohne sie zu überschreiben.

Was kann ich tun, um sicherzustellen, dass meine Aufnahmen nicht „abbrechen“? Kann ich irgendetwas tun, um eine erneute Verbindung zu erzwingen? Oder gibt es vielleicht eine Möglichkeit, cURL anzuweisen, zu warten, selbst wenn die cURL-Übertragungsgeschwindigkeit auf 0 abfällt?

Ich wäre für alle Gedanken sehr dankbar.

Danke

Antwort1

Wie kann ich cURL zwingen, eine erneute Verbindung herzustellen und den Stream weiterhin in dieselbe Datei zu analysieren, obwohl es denkt, dass es fertig ist?

Eine allgemeine Methode (nicht spezifisch für curl) ist:

while true; do curl -o - … ; done >file

Der Punkt ist, dass curlin stdout geschrieben wird. Wir leiten die gesamte Schleife in eine Datei um, egal wie viele Neustarts erforderlich sind. Auf diese Weise curlwird die Ausgabe mehrerer aufeinanderfolgender Prozesse verkettet und in eine einzige Datei geschrieben.

So führen Sie dies 12 Stunden lang aus:

timeout 12h sh -c 'while true; do curl -o - … ; done >file'

So führen Sie den Vorgang ohne Unterbrechung aus und erstellen alle 12 Stunden eine neue Datei:

while true; do
   timeout 12h sh -c 'while true; do curl -o - … ; done >"audio_feed_$(date +%Y-%m-%d_%T)"'
done

Um bei Bedarf eine neue Datei zu starten, beenden Sie einfach die aktuelle Datei timeoutbzw. shderen untergeordnete Datei.


Hinweis: Ich weiß nicht, ob ein Stream, bei dem von Zeit zu Zeit ein paar Sekunden fehlen, der aber dennoch aneinandergereiht ist, eine abspielbare Datei ergibt. Ich erwarte, dass Protokolle/Container/Codecs, die für das Streaming über das Netzwerk in Echtzeit entwickelt wurden, nach einem fehlenden Fragment neu synchronisieren können; dies sollte unabhängig davon funktionieren, ob die Daten von einem Server oder einer Datei stammen. Wenn der Stream, den Sie erfassen möchten, so ist, werden Sie beim späteren Abspielen „fehlende Inhalte“ feststellen (zu Zeitpunkten, an denen einer curlbeendet wurde und der nächste noch nicht übernommen hat), aber dieser „Schluckauf“ sollte einen Player, der wirklich weiß, wie man mit einem solchen Stream umgeht, nicht aufhalten.

verwandte Informationen