1

Я использую задания 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, чтобы сказать "возобновить автоматически после прерывания", я бы очень, очень, очень много (МНОГО!) счастливее.

Есть идеи?

2 ответа2

5

Как писал 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 чтобы поместить все в один и тот же файл, но тогда вы не сможете легко диагностировать, сколько было прерываний и когда они произошли.

1

Ну, чтобы продолжить прерванную загрузку с помощью 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
    

Итак, Гудлак с этим!

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .