WGET: Возможно ли автоматически ВОЗОБНОВИТЬ загрузку HTTP URL?

WGET: Возможно ли автоматически ВОЗОБНОВИТЬ загрузку HTTP URL?

Я использую задания cron для выполнения скриптов оболочки, которые являются очень простыми вызовами wget. Вот один из таких примеров:

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

Это интернет-радио. Проблема в том, что хотя это и работает отлично, очень часто бывают моменты, когда поток "прерывается" (насколько я могу судить), и я получаю урезанную копию потока. Если бы был переключатель, который я мог бы включить в WGET, чтобы сказать "автоматически возобновлять после прерывания", я был бы намного, намного, намного (ГОРАЗДО!) счастливее.

Есть идеи?

решение1

Как написал C0deDaedalus, wget -cозначает возобновление загрузки частично загруженного файла путем отправки заголовка "Range". Поскольку вы имеете дело с потоком в реальном времени, этот флаг не будет работать так, как задумано. В лучшем случае он может позволить вам продолжить добавление потока в тот же загруженный файл, игнорируя тот факт, что вы потеряли часть, когда поток был прерван, и в лучшем случае отсутствующий кусок не вызовет проблем для вашего MP3-плеера.

Несмотря на это, у вас, похоже, есть и другая проблема: ваш сценарий должен на самом делеобнаружитькогда wgetпроцесс завершается слишком рано, так что он даже может попытаться возобновить загрузку. Вот способ определить, завершился ли процесс, используя статус выхода kill -0. Это значит, что вы не можете просто использовать sleep 3600что-то одно, поэтому вам понадобитсядругой способ закончить через 1 час. Итак, у вас будет что-то вроде этого:

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

Как написано, это запускает новый файл после каждого прерывания. Вы также могли бы, вероятно, включить wget -c, чтобы поместить все в один файл, но тогда вы не сможете легко диагностировать, сколько было прерываний и когда они произошли.

решение2

Ну, чтобы продолжить прерванные загрузки, wgetвы можете использовать-cвариант, означающий продолжить.

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

Вот несколько моментов:

  • Предполагается, что на вашей локальной системе имеется частично загруженный файл.
  • Если файл загрузки с предыдущим вызовом пуст, он откажется продолжаться. В этом случае вам нужно сначала удалить пустой файл.
  • При использовании -cлюбой файл, который на сервере больше, чем локально, будет считаться незавершенной загрузкой и только

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

    будет загружен и добавлен в конец локального файла.

  • Important

    -cтолькоработает(См. последнюю строку под опцией -c) с FTP-серверами и с HTTP servers that support the Range headerи в вашем случае это HTTP.

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

Так что удачи вам в этом!

Не стесняйтесь добавлять больше подробностей.

Связанный контент