Я использую задания 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
Так что удачи вам в этом!
Не стесняйтесь добавлять больше подробностей.