これが私の見解です。いくつかのコマンドを回避することで、目立たないかもしれませんが、速度がわずかに向上するはずです。壊れたURLの時間を節約できるエラーチェックを追加しました。
#file that contains youtube links
FILE="/srv/backup/temp/youtube.txt"
while read URL ; do
[ -z "$URL" ] && continue
#get video name
if NAME=$(youtube-dl --get-filename -o "%(title)s.%(ext)s" "$URL" --restrict-filenames) ; then
#real video url
if vURL=$(youtube-dl --get-url $URL) ; then
#download file
axel -n 10 -o "$NAME" $vURL &
else
echo "Could not get vURL from $URL"
fi
else
echo "Could not get NAME from $URL"
fi
done << "$FILE"
リクエストに応じて、ダウンロードだけでなく、vURLとNAMEのフェッチを並列化するための私の提案があります。注:ダウンロードはvURLとNAMEの両方に依存するため、3つのプロセスを作成しても意味がないため、2つを使用すると最良の結果が得られます。以下では、NAMEフェッチを独自のプロセスに配置しましたが、vURLの方が一貫して高速であることが判明した場合は、NAMEフェッチと交換することでわずかな見返りが得られる可能性があります。(こうすることで、ダウンロードプロセスのwhileループは、2回目のスリープでも無駄になりません。)注2:これはかなり粗雑で、テストされていません。カフから外れているため、おそらく作業が必要です。そして、いずれにせよ、おそらくもっとクールな方法があります。怖がる...
#!/bin/bash
#file that contains youtube links
FILE="/srv/backup/temp/youtube.txt"
GetName () { # URL, filename
if NAME=$(youtube-dl --get-filename -o "%(title)s.%(ext)s" "$1" --restrict-filenames) ; then
# Create a sourceable file with NAME value
echo "NAME='$NAME'" > "$2"
else
echo "Could not get NAME from $1"
fi
}
Download () { # URL, filename
if vURL=$(youtube-dl --get-url $1) ; then
# Wait to see if GetName's file appears
timeout=300 # Wait up to 5 minutes, adjust this if needed
while (( timeout-- )) ; do
if [ -f "$2" ] ; then
source "$2"
rm "$2"
#download file
if axel -n 10 -o "$NAME" "$vURL" ; then
echo "Download of $NAME from $1 finished"
return 0
else
echo "Download of $NAME from $1 failed"
fi
fi
sleep 1
done
echo "Download timed out waiting for file $2"
else
echo "Could not get vURL from $1"
fi
return 1
}
filebase="tempfile${$}_"
filecount=0
while read URL ; do
[ -z "$URL" ] && continue
filename="$filebase$filecount"
[ -f "$filename" ] && rm "$filename" # Just in case
(( filecount++ ))
( GetName "$URL" "$filename" ) &
( Download "$URL" "$filename" ) &
done << "$FILE"