Usando cURL para descargar una transmisión web

Usando cURL para descargar una transmisión web

Estoy intentando descargar una transmisión de audio en streaming desde una estación de radio en línea.La estación solía funcionar con una transmisión de voz MP3, pero ahora se ha actualizado a una transmisión de audio HTTP AAC..

Solía ​​usar "streamripper" en la terminal para aprovechar la estación para mis viajes en auto, peroAhora Streamripper no logra extraer la nueva transmisión.. Estoy bastante seguro de que la estación está utilizando codificación de transferencia fragmentada http ahora para su transmisión, que streamripper no admite.

Se me ocurrió una nueva solución: aislé la señal de audio del reproductor web de la estación yEstoy utilizando cURL para copiar el feed en un archivo de audio.Puedo llevar conmigo.

Sin embargoConstantemente recibo "finalizaciones" en mi cURL, cuando debería grabar sin cesar. Incluso configuré el parámetro de tiempo máximo en 43200 s (12 horas), pero termino con archivos de diferentes tamaños. Por lo general, cada archivo resultante no dura más de 1 hora. Aunque a veces puede tardar más de una hora. Los tamaños y tiempos de los archivos son diferentes. El archivo "se rompe/completa" después de un breve período y tengo que usar un script para reiniciar la grabación de cURL. Termino con una carpeta grande de grabaciones fractales, cuando debería tener solo 2 grabaciones por día (cada 12 horas). Cuando miro el detalle de la transferencia cURL, simplemente termina con "la conexión cURL queda intacta". No hay ningún error en el registro de cURL, por lo tantoNo estoy seguro de cómo puedo forzar a cURL a intentar "reconectarse" y seguir analizando la transmisión en el mismo archivo, aunque crea que ha terminado.

También intenté usar "wget" y "Jdownloader".Ambos tienen el mismo resultado, que termina después de un corto período de tiempo.

No estoy seguro de qué puedo hacer para forzar una reconexión y seguir descargando el mismo archivo sin sobrescribirlo.

¿Qué puedo hacer para asegurarme de que mis grabaciones no se "rompan"? ¿Hay algo que pueda hacer para forzar una reconexión? ¿O tal vez hay alguna manera de decirle a cURL que espere incluso si la velocidad de transferencia de cURL cae a 0?

Cualquier idea sería muy apreciada.

Gracias

Respuesta1

¿Cómo puedo forzar a cURL a intentar "reconectarse" y seguir analizando la transmisión en el mismo archivo, aunque crea que ha terminado?

Una forma general (no específica de curl) es:

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

El punto es curlescribir en la salida estándar. Redirigimos todo el bucle a un archivo, sin importar cuántos reinicios sean necesarios. De esta manera, la salida de múltiples curlprocesos consecutivos se concatena y va a un solo archivo.

Para ejecutar esto durante 12 horas:

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

Para ejecutar sin parar y crear un nuevo archivo cada 12 horas:

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

Para iniciar un nuevo archivo a pedido, simplemente elimine el actual timeouto shel que sea su hijo.


Nota: No sé si una transmisión a la que faltan algunos segundos de vez en cuando, pero concatenada, dará como resultado un archivo reproducible. Espero que los protocolos/contenedores/códecs diseñados para transmitirse a través de la red en tiempo real puedan volver a sincronizarse después de un fragmento faltante; esto debería funcionar independientemente de si los datos provienen de un servidor o de un archivo. Si la transmisión que desea capturar es así, experimentará "contenido faltante" mientras juega más tarde (en las marcas de tiempo en las que uno curlsalió y el siguiente aún no se ha hecho cargo), pero este "contratiempo" no debería detener al jugador. que realmente sabe cómo manejar esa corriente.

información relacionada