WGET: Ist es möglich, den Download einer HTTP-URL automatisch fortzusetzen?

WGET: Ist es möglich, den Download einer HTTP-URL automatisch fortzusetzen?

Ich verwende Cron-Jobs, um Shell-Skripte auszuführen, die sehr einfache Aufrufe von wget sind. Hier ist ein solches Beispiel:

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

Dies ist ein Internetradio-Stream. Mein Problem ist, dass dies zwar gut funktioniert, es aber sehr häufig vorkommt, dass der Stream „unterbrochen“ wird (soweit ich das beurteilen kann) und ich am Ende eine gekürzte Kopie des Streams habe. Wenn es einen Schalter gäbe, den ich bei WGET umlegen könnte, um „nach der Unterbrechung automatisch fortfahren“ zu lassen, wäre ich viel, viel, viel (VIEL!) glücklicher.

Irgendwelche Ideen?

Antwort1

Wie C0deDaedalus schrieb, wget -cbedeutet dies, dass der Download einer teilweise heruntergeladenen Datei durch Senden des Headers „Range“ fortgesetzt werden soll. Da es sich um einen Live-Internet-Stream handelt, funktioniert dieses Flag nicht wie vorgesehen. Bestenfalls können Sie damit den Stream weiterhin an dieselbe heruntergeladene Datei anhängen und dabei die Tatsache ignorieren, dass Sie beim Unterbrechen des Streams einen Teil verloren haben. Bestenfalls verursacht der fehlende Teil keine Probleme für Ihren MP3-Player.

Unabhängig davon scheinen Sie auch ein anderes Problem zu haben: Ihr Skript muss tatsächlicherkennenwenn der wgetVorgang zu früh endet, um überhaupt versuchen zu können, den Download fortzusetzen. Hier erfahren Sie, wie Sie anhand des Beendigungsstatus feststellen können, ob ein Prozess beendet wurde kill -0. Das heißt, Sie können nicht einfach sleep 3600beides verwenden. Sie benötigen alsoeine andere Art, nach 1 Stunde zu enden. Sie würden also etwa Folgendes erhalten:

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

So wie es geschrieben ist, startet dies nach jeder Unterbrechung eine neue Datei. Sie könnten wahrscheinlich auch wget -calles in dieselbe Datei packen, aber dann können Sie nicht einfach diagnostizieren, wie viele Unterbrechungen es gab und wann sie auftraten.

Antwort2

Um unterbrochene Downloads fortzusetzen, wgetkönnen Sie verwenden-cOption, die „Fortfahren“ bedeutet.

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

Einige Punkte hier:

  • Es wird davon ausgegangen, dass Sie die Datei auf Ihrem lokalen System teilweise heruntergeladen haben.
  • Wenn die Download-Datei mit dem vorherigen Aufruf leer ist, wird der Vorgang nicht fortgesetzt. In diesem Fall müssen Sie zuerst die leere Datei entfernen.
  • Bei der Verwendung von -cwird jede Datei, die auf dem Server größer ist als lokal, als unvollständiger Download betrachtet und nur

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

    wird heruntergeladen und an das Ende der lokalen Datei angehängt.

  • Important

    -cnurWerke(Siehe letzte Zeile unter der Option -c) mit FTP-Servern und mit HTTP servers that support the Range headerund in Ihrem Fall ist es HTTP.

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

Also, viel Glück damit!

Fügen Sie gerne weitere Details hinzu.

verwandte Informationen