WGET:是否可以自動復原 HTTP URL 的下載?

WGET:是否可以自動復原 HTTP URL 的下載?

我使用 cron 作業來執行 shell 腳本,這些腳本是對 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
    

所以,祝你好運!

請隨意添加更多詳細資訊。

相關內容