web-dev-qa-db-ja.com

WGET:HTTP URLのダウンロードを自動的に再開することは可能ですか?

私はcronジョブを使用して、wgetの非常に単純な呼び出しであるシェルスクリプトを実行します。そのような例の1つを次に示します。

#!/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にスローできるスイッチがあれば、私ははるかに、はるかに、はるかに幸せになります。

何か案は?

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を組み込んですべてを同じファイルに入れることもできますが、そうすると、中断がいくつ発生したか、いつ発生したかを簡単に診断できなくなります。

5
krubo

さて、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のみ works (-cオプションの下の最後の行を参照)FTPサーバーとHTTP servers that support the Range header、そしてあなたの場合はHTTPです。

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

だから、それで頑張ってください!

詳細はお気軽に追加してください。

1
C0deDaedalus