WGET: ¿Es posible REANUDAR automáticamente la descarga de una URL HTTP?

WGET: ¿Es posible REANUDAR automáticamente la descarga de una URL HTTP?

Utilizo trabajos cron para ejecutar scripts de shell que son invocaciones muy simples de wget. He aquí uno de esos ejemplos:

#!/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."

Esta es una transmisión de radio por Internet. Mi problema es que si bien esto funciona bien, hay ocasiones muy frecuentes en las que la transmisión se "interrumpe" (lo mejor que puedo decir) y termino con una copia truncada de la transmisión. Si hubiera un interruptor que pudiera activar en WGET para decir "reanudar automáticamente después de la interrupción", sería mucho, mucho, mucho (¡MUCHO!) más feliz.

¿Algunas ideas?

Respuesta1

Como escribió C0deDaedalus, wget -csignifica reanudar la descarga de un archivo parcialmente descargado enviando el encabezado "Rango". Dado que se trata de una transmisión en vivo por Internet, esta bandera no funcionará según lo previsto. En el mejor de los casos, puede permitirle continuar agregando la transmisión al mismo archivo descargado, ignorando el hecho de que perdió una parte cuando la transmisión se interrumpió y, en el mejor de los casos, la parte faltante no causará problemas a su reproductor MP3.

De todos modos, parece que también tienes un problema diferente: tu script realmente necesitadetectarcuando el wgetproceso termina demasiado pronto, por lo que incluso puede intentar reanudar la descarga. A continuación se muestra una manera de detectar si un proceso ha finalizado, utilizando el estado de salida de kill -0. Esto significa que no puedes usar sleep 3600cualquiera de los dos, por lo que necesitarásuna forma diferente de terminar después de 1 hora. Entonces tendrías algo como esto:

#!/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."

Tal como está escrito, esto inicia un nuevo archivo después de cada interrupción. Probablemente también podrías incorporarlo wget -cpara poner todo en el mismo archivo, pero entonces no podrás diagnosticar fácilmente cuántas interrupciones hubo y cuándo sucedieron.

Respuesta2

Bueno, para continuar con las descargas interrumpidas wgetpuedes usar-copción que significa continuar.

wget -c http://playerservices.streamtheworld.com/api/livestream-redirect/WRTI_JAZZ.mp3 -O "$directory$fileName.mp3" -q

Algunos puntos aquí:

  • Se supone que tiene un archivo descargado parcialmente en su sistema local.
  • Si el archivo de descarga con la invocación anterior está vacío, se negará a continuar. En ese caso, primero debe eliminar el archivo vacío.
  • Mientras se usa -c, cualquier archivo que sea más grande en el servidor que localmente se considerará una descarga incompleta y solo

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

    se descargará y se pegará al final del archivo local.

  • Important

    -csoloobras(Consulte la última línea en la opción -c) con servidores FTP y con HTTP servers that support the Range headery en su caso es HTTP.

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

¡Buena suerte con eso!

Siéntase libre de agregar más detalles.

información relacionada