네트워크 연결이 끊어지면 youtube-dl을 일시 중지하고 다시 연결되면 재개합니다.

네트워크 연결이 끊어지면 youtube-dl을 일시 중지하고 다시 연결되면 재개합니다.

저는 리눅스 민트 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

확실하지는 않지만 핑을 보내면 네트워크가 작동하는지 알 수 있을 것 같습니다.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을 실행하는 내가 작성한 내용입니다 .
웹 사이트에 연결되어 있지 않으면 연결이 다시 돌아올 때까지 다운로드하려는 내용이 반복됩니다(중지되지 않으므로 시간 초과를 추가해야 할 수도 있습니다.). 예상되는 상태 코드를
사용했습니다. 이 작품을 다운로드하지 못할 수도 있습니다.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
  • 이후 다운로드가 완료되면 모든 것이 다운로드되었는지 확인하기 위해 두 번째 매개변수로 1을 전달했습니다. 불행히도 이전 코드는 작동하지 않았습니다. 테스트해봤는데 잘 작동합니다.

관련 정보