Estou tentando baixar um feed de áudio de uma estação de rádio online.A estação costumava operar em um feed de Shoutcast MP3, mas agora foi atualizada para um feed de áudio HTTP AAC.
Eu costumava usar "streamripper" no terminal para explorar a estação para meus passeios de carro, masagora o streamripper não consegue copiar o novo stream. Tenho certeza de que a estação está utilizando codificação de transferência http fragmentada agora para seu stream, que o streamripper não suporta.
Eu criei uma nova solução, onde isolei o feed de áudio do web player da estação eEstou utilizando cURL para copiar o feed em um arquivo de áudioposso levar comigo.
No entantoEstou constantemente recebendo "conclusões" no meu cURL, quando ele deveria gravar indefinidamente. Até configurei o parâmetro de tempo máximo para 43200s (12 horas), mas acabo com tamanhos de arquivo variados. Normalmente, cada arquivo resultante não dura mais que 1 hora. Às vezes, pode demorar mais de uma hora. Os tamanhos e horários dos arquivos são diferentes. O arquivo "quebra/conclui" após um curto período e tenho que usar um script para reiniciar a gravação do cURL. Acabo com uma pasta grande de gravações fractais, quando deveria ter apenas 2 gravações por dia (a cada 12 horas). Quando olho para o detalhado da transferência cURL, ele termina com "conexão cURL deixada intacta". Não há erro no log cURL, portantoNão tenho certeza de como posso forçar o cURL a tentar "reconectar" e continuar analisando o fluxo no mesmo arquivo, mesmo que ele ache que terminou.
Eu também tentei usar "wget" e "Jdownloader", Ambos têm o mesmo resultado, onde termina após um curto período de tempo.
Não tenho certeza do que posso fazer para forçar uma reconexão e continuar baixando no mesmo arquivo sem substituí-lo.
O que posso fazer para garantir que minhas gravações não “quebrem”? Há algo que eu possa fazer para forçar uma reconexão? Ou talvez haja alguma maneira de dizer ao cURL para esperar mesmo que a velocidade de transferência do cURL caia para 0?
Qualquer pensamento seria muito apreciado.
Obrigado
Responder1
como posso forçar o cURL a tentar "reconectar" e continuar analisando o fluxo no mesmo arquivo, mesmo que ele ache que terminou
Uma maneira geral (não específica para curl
) é:
while true; do curl -o - … ; done >file
O ponto é curl
gravar em stdout. Redirecionamos todo o loop para um arquivo, não importa quantas reinicializações sejam necessárias. Dessa forma, a saída de vários curl
processos consecutivos é concatenada e vai para um único arquivo.
Para executar isso por 12 horas:
timeout 12h sh -c 'while true; do curl -o - … ; done >file'
Para executar sem parar e criar um novo arquivo a 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 um novo arquivo sob demanda basta matar o atual timeout
ou sh
aquele que é seu filho.
Observação: não sei se um fluxo com alguns segundos faltando de vez em quando, mas concatenado, resultará em um arquivo reproduzível. Espero que protocolos/contêineres/codecs projetados para serem transmitidos pela rede em tempo real possam ser sincronizados novamente após um fragmento ausente; isso deve funcionar independentemente de os dados virem de um servidor ou de um arquivo. Se o fluxo que você deseja capturar for assim, você experimentará "conteúdo ausente" durante a reprodução mais tarde (nos registros de data e hora em que um curl
saiu e o próximo ainda não assumiu), mas esse "soluço" não deve impedir um jogador que realmente sabe como lidar com esse fluxo.