私は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サイトに接続していない場合は、接続が再び戻るまでダウンロードしようとしている内容が繰り返されます(停止しないため、タイムアウトを追加する必要があるかもしれません)。予想されるステータスコードを
使用しました。この作品をダウンロードできない場合があります。curl
200
内容は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を渡しました。残念ながら、以前のコードは機能しませんでした。テストしてみましたが、うまくいきます。