Tenho uma lista de 3 mil URLs em um arquivo de texto chamado "downloadmp3.txt", com o seguinte formato:
url1,filename1
url2,filename2
...
url3000,filename3000
Escrevi o seguinte código usando trechos que encontrei aqui:
while read p; do
a=$( echo $p | cut -d',' -f1 )
b=$( echo $p | cut -d',' -f2 )
ffmpeg -nostdin -loglevel quiet -stats -i ${a} ${b}.mp3 &
done <downloadmp3.txt
O problema que tenho é que meu script baixa cerca de 500 mp3s dos 3.000 (alguns inteiramente, outros parcialmente) e então simplesmente para. Qualquer conselho sobre quais mudanças fazer seria apreciado.
Obrigado!
Responder1
Você não mostrou nenhum registro que indique qual é o problema subjacente, mas está essencialmente iniciando 3.000 processos ao mesmo tempo, o que pode ter consequências inesperadas (por exemplo, o servidor remoto encerrando a conexão). Como &
coloca o trabalho em segundo plano, o loop deve sair rapidamente assim que todos ffmpeg
os processos forem iniciados, mas você terá 3.000 trabalhos em execução…
Em vez disso, eu recomendaria usarGNUparallel
baixarnarquivos por vez.
parallel --dry-run --colsep ',' ffmpeg -nostdin -loglevel error -stats -i {1} -c copy {2}.mp3 :::: downloadmp3.txt
Isso lê o arquivo de texto e processa cada linha, dividindo as colunas por ,
. Você pode então usar os valores da coluna como {1}
, {2}
e assim por diante.
Ele executaria os seguintes comandos em paralelo, com no máximontrabalhos em execução ao mesmo tempo. Por padrãoné igual ao número de núcleos da CPU:
ffmpeg -nostdin -loglevel error -stats -i url1 -c copy filename1.mp3
ffmpeg -nostdin -loglevel error -stats -i url2 -c copy filename2.mp3
ffmpeg -nostdin -loglevel error -stats -i url3000 -c copy filename3000.mp3
Remova o --dry-run
quando isso imprimir o que você deseja.
Você pode adicionar --joblog jobs.txt
para criar um arquivo de log e também adicionar --eta
ou --progress
imprimir algumas estimativas de quando os trabalhos serão concluídos. O número de trabalhos paralelos pode ser definido com -j
.
Observe que adicionei -c copy
porque normalmente você não deseja recodificar o fluxo de áudio se o URL já apontar para um arquivo MP3 existente. Se a sua entrada não for MP3, você pode querer omitir -c copy
novamente. E mudei quiet
para error
porque você provavelmente deseja que os erros sejam mostrados.