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

1

Eu uso tarefas do cron para executar scripts 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 fluxo de rádio na internet. Meu problema é que, enquanto isso funciona bem, há momentos em que o fluxo fica "interrompido" (o melhor que posso dizer) e acabo com uma cópia truncada do fluxo. Se houvesse um interruptor que eu pudesse jogar no WGET para dizer "reiniciar automaticamente após a interrupção", eu seria muito, muito, muito, (MUITO!) Mais feliz.

Alguma idéia?

    
por Low Information Voter 04.04.2018 / 21:50

2 respostas

5

Como C0deDaedalus escreveu, wget -c significa retomar o download de um arquivo parcialmente baixado, enviando o cabeçalho "Range". Como você está lidando com um fluxo de transmissão ao vivo na Internet, esse sinalizador não funcionará como pretendido. Na melhor das hipóteses, ele pode permitir que você continue anexando o fluxo no mesmo arquivo baixado, ignorando o fato de que você perdeu um pedaço quando o fluxo foi interrompido e, na melhor das hipóteses, o pedaço ausente não causará problemas para o seu MP3 player. / p>

Independentemente disso, você também parece ter um problema diferente: seu script precisa detectar quando o processo wget termina muito cedo, para que ele possa até tentar retomar o download. Aqui está uma maneira de detectar se um processo terminou, usando o status de saída de kill -0 . Isso significa que você não pode simplesmente usar sleep 3600 , então você precisará de uma maneira diferente de terminar após 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."

Como escrito, isso inicia um novo arquivo após cada interrupção. Você provavelmente também pode incorporar wget -c para colocar tudo no mesmo arquivo, mas você não poderá diagnosticar facilmente quantas interrupções houve e quando elas aconteceram.

    
por 05.04.2018 / 08:11
1

Bem, para continuar os downloads interrompidos com wget você pode usar a opção -c 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 um arquivo baixado parcial no seu sistema local.
  • Se o arquivo de download com invocação anterior estiver vazio, ele se recusará a continuar. Nesse caso, você precisa remover o arquivo vazio primeiro.
  • Ao usar -c , qualquer arquivo que seja maior no servidor que localmente será considerado um download incompleto e somente

    (length(remote) - length(local)) bytes
    

    será baixado e colado no final do arquivo local.

  • Important

    -c only funciona (veja a última linha abaixo da opção -c) com servidores FTP e com HTTP servers that support the Range header e no seu caso é HTTP.

    http://playerservices.streamtheworld.com/api/livestream-redirect/WRTI_JAZZ.mp3
    

Então, Goodluck com isso!

Sinta-se à vontade para adicionar mais detalhes.

    
por 05.04.2018 / 06:26