ネットワークが切断された場合はyoutube-dlを一時停止し、再接続すると再開します。

ネットワークが切断された場合はyoutube-dlを一時停止し、再接続すると再開します。

私はLinux Mint 20を使用しています。

キルスイッチ()のあるVPNを使用していますprotonvpn-cli ks --on

したがって、何らかの理由でVPN接続が失われると、ネットワークがダウンします。

ネットワークがダウンすると、youtube-dlダウンロードはエラーで永久に停止します。

ERROR: Unable to download JSON metadata: <urlopen error [Errno -2] Name or service not known> (caused by URLError(gaierror(-2, 'Name or service not known')))

問題は、youtube-dl閉じるのではなく一時停止し、接続が再開されたら再起動したいということです。

確認しました切断が機能しない場合に再試行しかし、私の考えでは、これが私の問題とは何の関係もないようです。

私の設定ファイルは次のとおりです

--abort-on-error
--no-warnings
--console-title
--batch-file='batch-file.txt'
--socket-timeout 10
--retries 10
--continue
--fragment-retries 10 

バッチファイルを使用しているので、プロセスを最初から始めたくありません。youtube-dl再接続するまでプロセスを一時停止してから、プロセスを続行したいと思います。

どうすればいいですか?

アップデート1:

これまで私が見つけたのは、プロセスを一時停止するために次のことができることです。

$ kill -STOP 16143

プロセスを再開するには、次のようにします。

$ kill -CONT 16143

わかりませんが、pingを送信するとネットワークが機能しているかどうかがわかります。1 2:

#!/bin/bash
HOSTS="cyberciti.biz theos.in router"

COUNT=4

for myHost in $HOSTS
do
  count=$(ping -c $COUNT $myHost | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
  if [ $count -eq 0 ]; then
    # 100% failed 
    echo "Host : $myHost is down (ping failed) at $(date)"
  fi
done  

しかし、これは効率的な解決策ではないようです。

Linux:ネットワーク接続が復元された後にコマンドを実行するifplugd使用または使用することをお勧めします/etc/network/if-up.d/

またあります質問そしてブログ投稿を使用すると言われています/etc/NetworkManager/dispatcher.d

Linux Mintを使用している間、すべてのソリューションが次のように戻ると思います。ネットワーク管理者私にとっては簡単です。

答え1

batch-file.txt以下は、各行で実行され、そこからyoutube-dlを実行する私が書いたものです。
Webサイトに接続していない場合は、接続が再び戻るまでダウンロードしようとしている内容が繰り返されます(停止しないため、タイムアウトを追加する必要があるかもしれません)。予想されるステータスコードを
使用しました。この作品をダウンロードできない場合があります。curl200

内容はbatch-file.txt以前と同じです。

スクリプトを実行します。

download.sh ./batch-file.txt {download_web_site_url}
# Example:
download.sh ./batch-file.txt google.com`
#!/bin/bash
# B"H

# Insted of using youtube-dl batch-file option read the file using bash.
URLS=$1 # "batch-file.txt"
# Pass the URL for site you trying to download from.
SITE_URL=$2

# This function check if url is returning 200 status code.
check_site_connection()
{
    # curl to 'your_site_url' with -I option for only the respons info only
    # pipe the respons tp awk with 'NR < 2' so only the first line with the status code is printed.
    # Return up if respons is 200.
    if [[ $(curl -Is $SITE_URL | awk 'NR < 2 {print $2}') == "200" ]];
    then
        echo up;
    else
        echo down;
    fi
}

# read the batch-file.
while IFS= read -r line
do
    # for each line in batch-file loop until conection to site is up with 2 seconds delay.
    while [[ $(check_site_connection) == "down" ]]
    do
        echo "waiting for internet conection"
        sleep 2
    done
    # run youtube-dl where line is the url to dowmload.
    ./youtube-dl "$line"
done < "$URLS"

編集する:

ただ読む.mdそしてそれがどのように機能するかをテストしました。
この場合、各行は個別の動画ではなく再生リストです。

youtube-dl --download-archive archive.txt URL_TO_PLAYLIST

実行するたびに新しいビデオのみがダウンロードされるため、--download-archive archive.txt上記のスクリプトに追加して./youtube-dl --download-archive archive.txt "$line" 再起動すると、すべてのプレイリストを通過しますが、停止した部分からのみダウンロードが開始されます。

答え2

以下のコードを使用してください YoutubeDown.bash

#!/bin/bash
if [[ $2 == 0 ]]
then
  if [[ ! -a youtubePlayListNames ]] 
  then
    youtube-dl --get-filename -o '%(title)s' $1  --restrict-filenames | awk 'BEGIN{OFS=",";}{print NR,$0}' > youtubePlayListNames
  fi
  for q in $(cat youtubePlayListNames)
  do
    row=$(echo $q | awk -F',' '{print $1}')
    fName=$(echo "$q" | awk -F',' '{print $2}')
    [[ $(find . -name *$fName* | wc -l) -eq 1 ]] && continue || break
  done
  youtube-dl --playlist-start $row -o '%(uploader)s/%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s' $1 --restrict-filenames
elif [[ $2 == 1 ]]
then
  youtube-dl -o '%(uploader)s/%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s' $1 --restrict-filenames
fi

私は以下を使用しました:

  • 最初YoutubeDown.bash https://youtubeURL 0
  • その後、ダウンロードが完了したら、すべてがダウンロードされたことを確認するために2番目のパラメータに1を渡しました。残念ながら、以前のコードは機能しませんでした。テストしてみましたが、うまくいきます。

関連情報