Domanda

Sto cercando uno snippet Python per leggere un flusso radio Internet (.Asx, .pls ecc.) E salvalo in un file.

Il progetto finale è lo script Cron'ed che registrerà un'ora o due di radio Internet e poi lo trasferirà sul mio telefono per la riproduzione durante il mio tragitto giornaliero. (3G è un po 'macchiata lungo il mio tragitto)

Eventuali frammenti o puntatori sono i benvenuti.

È stato utile?

Soluzione 2

Quindi dopo aver armeggiato e giocato con esso ho trovato Streamripper lavorare meglio. Questo è il comando che uso

streamripper http://yp.shoutcast.com/sbin/tunein-station.pls?id=1377200 -d ./streams -l 10800 -a tb$FNAME

Altri suggerimenti

Quanto segue ha funzionato per me utilizzando la libreria delle richieste per gestire la richiesta HTTP.

import requests

stream_url = 'http://your-stream-source.com/stream'

r = requests.get(stream_url, stream=True)

with open('stream.mp3', 'wb') as f:
    try:
        for block in r.iter_content(1024):
            f.write(block)
    except KeyboardInterrupt:
        pass

Che salverà un flusso su stream.mp3 file fino a quando non lo interrompi con ctrl+C.

Se scopri che le tue richieste o Urllib.Request Call in Python 3 non riescono a salvare un flusso perché ricevi "Icy 200 OK" in cambio anziché un'intestazione "HTTP/1.0 200 OK", è necessario dire alle funzioni di base 200 Ok va bene!

Quello che puoi effettivamente fare è intercettare la routine che gestisce la lettura dello stato dopo l'apertura del flusso, poco prima di elaborare le intestazioni.

Inserisci semplicemente una routine come questa sopra il codice di apertura del flusso.

def NiceToICY(self):
    class InterceptedHTTPResponse():
        pass
    import io
    line = self.fp.readline().replace(b"ICY 200 OK\r\n", b"HTTP/1.0 200 OK\r\n")
    InterceptedSelf = InterceptedHTTPResponse()
    InterceptedSelf.fp = io.BufferedReader(io.BytesIO(line))
    InterceptedSelf.debuglevel = self.debuglevel
    InterceptedSelf._close_conn = self._close_conn
    return ORIGINAL_HTTP_CLIENT_READ_STATUS(InterceptedSelf)

Quindi metti queste linee all'inizio della tua routine principale, prima di aprire l'URL.

ORIGINAL_HTTP_CLIENT_READ_STATUS = urllib.request.http.client.HTTPResponse._read_status
urllib.request.http.client.HTTPResponse._read_status = NiceToICY

Sostituiranno la routine standard (solo una volta) ed eseguiranno la funzione NICETOICE al posto del normale controllo dello stato quando ha aperto il flusso. NiceToicy sostituisce la risposta dello stato non riconosciuta, quindi copie attraverso i bit pertinenti della risposta originale che sono necessari dalla funzione "reale" _read_status. Infine viene chiamato l'originale e i valori di ciò vengono passati al chiamante e tutto il resto continua normalmente.

Ho trovato che questo è il modo più semplice per aggirare il problema del messaggio di stato causando un errore. Spero sia utile anche per te.

Sono consapevole che questo ha un anno, ma questa è ancora una domanda praticabile, con cui ho recentemente armeggiato.

La maggior parte delle stazioni radio Internet ti darà un'opzione di tipo di download, scelgo la versione MP3, quindi leggo le informazioni da un socket non ele e scrivile in un file. Il trucco è capire quanto velocemente il tuo download viene confrontato con la canzone in modo da poter creare un equilibrio sulla dimensione di lettura/scrittura. Questo sarebbe nel tuo buffer def.

Ora che hai il file, va bene lasciarlo semplicemente sul tuo drive (record), ma la maggior parte dei giocatori eliminerà dal file il chunk già riprodotto e cancella il file dall'unità e dalla RAM quando lo streaming viene interrotto.

Ho usato alcuni frammenti di codice da un archivio di file senza app di compressione per gestire gran parte della gestione dei file, riprodurre, tamponare la magia. È molto simile a come scorre il processo. Se scrivi un po 'di sudo-code (che consiglio vivamente) puoi vedere le somiglianze.

Ho familiarità con il funzionamento dello streaming Shoutcast (che sarebbe il file .pls che menzioni):

Scarichi il file PLS, che è solo una playlist. Il suo formato è abbastanza semplice in quanto è solo un file di testo che indica dove si trova il flusso reale.

Puoi connetterti a quel flusso in quanto è solo HTTP, che flussi MP3 o AAC. Per il tuo utilizzo, salva ogni byte che arrivi a un file e otterrai un file MP3 o AAC che puoi trasferire al tuo lettore MP3.

Shoutcast ha un'aggiunta opzionale: metadati. Puoi trovare come funziona qui, ma non è davvero necessario.

Se vuoi un'applicazione di esempio che lo faccia, fammi sapere e inventerò qualcosa in seguito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top