0

2 つの youtube-dl プロセス (またはできるだけ多く) を並行して実行したいと考えています。方法を教えてください。前もって感謝します。

#!/bin/bash
#package: youtube-dl axel

#file that contains youtube links
FILE="/srv/backup/temp/youtube.txt"

#number of lines in FILE
COUNTER=`wc -l $FILE | cut -f1 -d' '`

#download destination
cd /srv/backup/transmission/completed

if [[ -s $FILE ]]; then
  while [ $COUNTER -gt 0 ]; do

    #get video link
    URL=`head -n 1 $FILE`

    #get video name
    NAME=`youtube-dl --get-filename -o "%(title)s.%(ext)s" "$URL" --restrict-filenames`

    #real video url
    vURL=`youtube-dl --get-url $URL`

    #remove first link
    sed -i 1d $FILE

    #download file
    axel -n 10 -o "$NAME" $vURL &

    #update number of lines
    COUNTER=`wc -l $FILE | cut -f1 -d' '`
  done
else
  break
fi
4

4 に答える 4

2

これは GNU Parallel で動作するはずです:

cd /srv/backup/transmission/completed
parallel -j0 'axel -n 10 -o $(youtube-dl --get-filename -o "%(title)s.%(ext)s" "{}" --restrict-filenames) $(youtube-dl --get-url {})' :::: /srv/backup/temp/youtube.txt

詳細: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

于 2013-02-16T01:42:59.503 に答える
1

解決

サブシェルでコマンドを実行する必要があります。つまり、コマンドを に入れます( cmd ) &

意味

シェルスクリプト自体がサブプロセスを起動できます。これらのサブシェルにより、スクリプトは並列処理を行うことができ、実際には複数のサブタスクを同時に実行できます。

コード

あなたにとっては、次のようになります(引用を追加します$vURL):

( axel -n 10 -o "$NAME" "$vURL" ) &
于 2013-02-15T18:05:00.190 に答える
0

これが私の見解です。いくつかのコマンドを回避することで、目立たないかもしれませんが、速度がわずかに向上するはずです。壊れた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"
于 2013-02-15T18:54:49.587 に答える
0

それが最善の方法かどうかはわかりません。関数を定義してからバックグラウンドで呼び出すことができます

このようなもの:

#!/bin/bash
#package: youtube-dl axel

#file that contains youtube links
FILE="/srv/backup/temp/youtube.txt"

# define a function
download_video() {
  sleep 3
  echo $1
}

while read -r line; do
  # call it in background, with &
  download_video $line &
done < $FILE

スクリプトはすぐに終了しますが、関数は引き続きバックグラウンドで実行され、3 秒後にエコーが表示されます

read および while ループも使用して、ファイルの読み取りを簡素化しました

于 2013-02-15T18:29:27.227 に答える