WGET: É possível RETOMAR automaticamente o download de uma URL HTTP?

WGET: É possível RETOMAR automaticamente o download de uma URL HTTP?

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 -csignifica 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 wgetprocesso 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 3600nenhum 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 -ccolocar 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, wgetvocê pode usar-copçã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

    -capenasfunciona(Veja a última linha na opção -c) com servidores FTP e com HTTP servers that support the Range headere 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.

informação relacionada