Eu uso cron jobs para executar scripts de shell que são invocações muito simples do wget. Aqui está um exemplo:
#!/bin/sh
fileName="WRTI-"$(date +"%m-%d-%Y-%H%M")
directory=/volume1/multimedia/Internet\ Radio\ Recordings/WRTI/$1/
wget http://playerservices.streamtheworld.com/api/livestream-redirect/WRTI_JAZZ.mp3 -O "$directory$fileName.mp3" -q&
nWgetPID=$!
sleep 3600
kill $nWgetPID
echo "Done."
Este é um stream de rádio da Internet. Meu problema é que, embora isso funcione bem, há momentos em que o fluxo é "interrompido" com muita frequência (pelo que posso dizer) e acabo com uma cópia truncada do fluxo. Se houvesse uma opção que eu pudesse usar no WGET para dizer "retomar automaticamente após a interrupção", eu ficaria muito, muito, muito, (MUITO!) Mais feliz.
Alguma ideia?
Responder1
Como escreveu C0deDaedalus, wget -c
significa retomar o download de um arquivo parcialmente baixado enviando o cabeçalho “Range”. Como você está lidando com uma transmissão ao vivo pela Internet, esse sinalizador não funcionará conforme o esperado. Na melhor das hipóteses, isso pode permitir que você continue anexando o stream ao mesmo arquivo baixado, ignorando o fato de que você perdeu um pedaço quando o stream foi interrompido e, na melhor das hipóteses, o pedaço que falta não causará problemas ao seu MP3 player.
Independentemente disso, você parece ter um problema diferente também: seu script precisa realmentedetectarquando o wget
processo termina muito cedo, para que possa até tentar retomar o download. Aqui está uma maneira de detectar se um processo foi finalizado, usando o status de saída de kill -0
. Isso significa que você não pode simplesmente usar sleep 3600
nenhum dos dois, então você precisaráuma maneira diferente de terminar depois de 1 hora. Então você teria algo assim:
#!/usr/bin/bash
directory=/volume1/multimedia/Internet\ Radio\ Recordings/WRTI/$1/
endSeconds=$((SECONDS + 3600))
while [ $SECONDS -lt $endSeconds ]; do
fileName="WRTI-"$(date +"%m-%d-%Y-%H%M%S")
wget http://playerservices.streamtheworld.com/api/livestream-redirect/WRTI_JAZZ.mp3 -O "$directory$fileName.mp3" -q&
nWgetPID=$!
while kill -0 "$nWgetPID" >/dev/null 2>&1; do
if [ $SECONDS -gt $endSeconds ]
then
kill "$nWgetPID"
fi
sleep 1
done
done
echo "Done."
Conforme está escrito, isso inicia um novo arquivo após cada interrupção. Provavelmente, você também poderia incorporar wget -c
colocar tudo no mesmo arquivo, mas não será capaz de diagnosticar facilmente quantas interrupções ocorreram e quando elas aconteceram.
Responder2
Bem, para continuar downloads interrompidos, wget
você pode usar-c
opção que significa continuar.
wget -c http://playerservices.streamtheworld.com/api/livestream-redirect/WRTI_JAZZ.mp3 -O "$directory$fileName.mp3" -q
Alguns pontos aqui:
- Ele pressupõe que você tenha baixado parcialmente o arquivo em seu sistema local.
- Se o arquivo de download com invocação anterior estiver vazio, ele se recusará a continuar. Nesse caso, você precisa primeiro remover o arquivo vazio.
Ao usar
-c
, qualquer arquivo maior no servidor do que localmente será considerado um download incompleto e somente(length(remote) - length(local)) bytes
será baixado e anexado ao final do arquivo local.
Important
-c
apenasfunciona(Veja a última linha na opção -c) com servidores FTP e comHTTP servers that support the Range header
e no seu caso é HTTP.http://playerservices.streamtheworld.com/api/livestream-redirect/WRTI_JAZZ.mp3
Então, boa sorte com isso !
Sinta-se à vontade para adicionar mais detalhes.