![当网络断开时暂停 youtube-dl 并在再次连接时恢复](https://linux22.com/image/185893/%E5%BD%93%E7%BD%91%E7%BB%9C%E6%96%AD%E5%BC%80%E6%97%B6%E6%9A%82%E5%81%9C%20youtube-dl%20%E5%B9%B6%E5%9C%A8%E5%86%8D%E6%AC%A1%E8%BF%9E%E6%8E%A5%E6%97%B6%E6%81%A2%E5%A4%8D.png)
我正在使用 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 。
如果没有与网站的连接,您尝试从中下载的内容将循环,直到连接恢复(您可能需要在其上添加一些超时,因为它不会停止。)
我使用了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
- 之后,当下载完成时,我传递了 1 作为第二个参数,以确保下载的所有内容我更改了我的代码,不幸的是,之前的代码不起作用。我测试了它并且运行良好。