プレイリストをダウンロードするにはyoutube-dlを使用してください。各動画のすべてのデータ(保存ファイルを含む)をアップローダのフォルダに保存します。

プレイリストをダウンロードするにはyoutube-dlを使用してください。各動画のすべてのデータ(保存ファイルを含む)をアップローダのフォルダに保存します。

次のように、パラメータだけではこれを行うことはできません。argsを使用したダウンロードアーカイブパスの設定

2つの同様のスクリプトを作成したいと思います。ビデオをダウンロードし、各ビデオのアーカイブをアップローダのフォルダに保存します。別のスクリプトもメタデータをダウンロードします。

ダウンロードする前にアーカイブを確認したいと思います。

この機能を複数回並列に使用してバックグラウンドに配置したいと思います。

アップローダを取得するために私が考えることができる唯一の方法は、出力とともにメタデータをダウンロードすることです%(uploader)s

次に、アップローダ名でフォルダを作成し、ファイルを削除してから、作成したフォルダから正しい名前でファイルを再ダウンロードします。

私は持っています一部の機能すでに定義されていれば役に立ちます。

これは私が試したものですが、うまくいきません

# Video Playlist saving archive file to uploader's folder
ytp() {
  # Dl opts=(
    ${opts[@]}
    --skownload metadata
    --skip-download
    --write-info-json
  )
  # Get ten random characters
  local rand=$( cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1 )
  LOG_NAME=$( get_log_name "$(${paste[@]})" )

  $yt_dl ${opts[@]} --output "%(uploader|Anon-%(id)s)s.%(ext)s" "$(${paste[@]})" >> "/tmp/$LOG_NAME" 2>&1

  for f in *.info.json; do
    local name="${f%.*}"
    if [[ $name == Anon* ]]; then
      name="Anon"
    fi
    mkdir -p "$name"
    rm "$f"
    cd "$name" || exit

    # Download media
    ytv

    cd .. || exit
  done
}

答え1

よりエレガントなソリューションを提供できる一般的な質問があります。

[機能要求]ファイル名テンプレートのサポート--download-archive

#!/usr/bin/env bash

# Common options for yt-dlp/youtube-dl
COMMON_OPTIONS=(
  --continue  # Resume partially downloaded files
  --no-overwrites  # Do not overwrite any files
  --no-post-overwrites  # Do not overwrite post-processed files
  --verbose  # Print various debugging information
  --restrict-filenames  # Restrict filenames to only ASCII characters, and avoid "&" and spaces in filenames
  --retry-sleep fragment:exp=2:64  # Time  to  sleep  between retries in seconds
)

# Determine the location of either 'yt-dlp' or 'youtube-dl' executable
if [ -f /usr/local/bin/yt-dlp ]; then
  YT_DL="/usr/local/bin/yt-dlp"
elif [ -f /usr/local/bin/youtube-dl ]; then
  YT_DL="/usr/local/bin/youtube-dl"
else
  if command -v yt-dlp >/dev/null 2>&1; then
    YT_DL="$(which yt-dlp)"
  elif command -v youtube-dl >/dev/null 2>&1; then
    YT_DL="$(which youtube-dl)"
  else
    echo "ERROR: Neither yt-dlp nor youtube-dl found in PATH"
    return 1
  fi
fi

# Configure paste command based on the operating system
# For macOS (Darwin), use 'pbpaste' and set the ffmpeg location.
if [[ $OSTYPE == darwin* ]]; then
  if ! command -v pbpaste >/dev/null 2>&1; then
    echo "ERROR: 'pbpaste' is not found on macOS."
    exit 1
  fi
  PASTE_COMMAND=(pbpaste)
  COMMON_OPTIONS+=("--ffmpeg-location" "/usr/local/bin/ffmpeg")
# For Linux, use 'xsel' or 'xclip' for clipboard access or display an error message if none is executable.
else
  if [[ -x "$(command -v xsel)" ]]; then
    PASTE_COMMAND=(xsel -ob)
  elif [[ -x "$(command -v xclip)" ]]; then
    PASTE_COMMAND=(xclip -selection clipboard -o)
  else
    echo "ERROR: Neither xsel nor xclip is executable."
    exit 1
  fi
fi

# Get the log filename based on the input
get_log_filename() {
  local input="${1//[^[:alnum:].-]/_}"  # Replace non-alphanumeric characters with underscores
  input="${input:0:200}"  # Truncate the input to 200 characters
  echo "yt-dlp_$(date +%y%m%d%H%M%S)_${input}.log"
}

# Get the uploader of a video
get_uploader() {
  "${YT_DL}" --print '%(uploader|Unknown)s' "$1"
}

download_video_into_uploaders_folder() {
  local input="${1:-$(${PASTE_COMMAND[@]})}"
  local log_filename="$(get_log_filename "$input")"
  local uploader="$(get_uploader "$input")"
  local options=(
    ${COMMON_OPTIONS[@]}
    --format '(bv+(wa[abr>=64]/ba))/b'
    --format-sort res:720,tbr~2000
    --download-archive "$uploader/archive.txt"
  )
    
  # Deal with long filenames
  if ! "${YT_DL}" "${options[@]}" --output "%(uploader|Unknown)s/%(upload_date>%Y-%m-%d|)s%(upload_date& |)s%(title)s-%(id)s.%(ext)s" "${input}" >> "/tmp/${log_filename}" 2>&1; then
    echo "Long filename ERROR: ${input}"
    "${YT_DL}" "${options[@]}" --output "%(uploader|Unknown)s/%(upload_date>%Y-%m-%d|)s%(upload_date& |)s%(webpage_url_domain)s-%(id)s.%(ext)s" "${input}" >> "/tmp/${log_filename}" 2>&1
  fi
}

ytdlvu() {
  local input="${1:-$(${PASTE_COMMAND[@]})}"
  download_video_into_uploaders_folder "$input" &
}

download_video_with_metadata_into_uploaders_folder() {
  local input="${1:-$(${PASTE_COMMAND[@]})}"
  local log_filename="$(get_log_filename "$input")"
  local uploader="$(get_uploader "$input")"
  local options=(
    ${COMMON_OPTIONS[@]}
    --format '(bv+(wa[abr>=64]/ba))/b'
    --format-sort res:720,tbr~2000
    --download-archive "$uploader/archive.txt"
    --write-info-json
    --write-comments
    --write-thumbnail
  )
    
  # Deal with long filenames
  if ! "${YT_DL}" "${options[@]}" --output "%(uploader|Unknown)s/%(upload_date>%Y-%m-%d|)s%(upload_date& |)s%(title)s-%(id)s.%(ext)s" "${input}" >> "/tmp/${log_filename}" 2>&1; then
    echo "Long filename ERROR: ${input}"
    "${YT_DL}" "${options[@]}" --output "%(uploader|Unknown)s/%(upload_date>%Y-%m-%d|)s%(upload_date& |)s%(webpage_url_domain)s-%(id)s.%(ext)s" "${input}" >> "/tmp/${log_filename}" 2>&1
  fi
}

ytdlvmu() {
  local input="${1:-$(${PASTE_COMMAND[@]})}"
  download_video_with_metadata_into_uploaders_folder "$input" &
}

download_video_playlist_with_metadata_into_uploaders_folder() {
  local input="${1:-$(${PASTE_COMMAND[@]})}"
  local video_urls=$(get_playlist_urls "$playlist")

  for url in $video_urls; do
    ytdlvmu "$url"
  done
}

ytdlvpmu() {
  local input="${1:-$(${PASTE_COMMAND[@]})}"
  download_video_playlist_with_metadata_into_uploaders_folder "$input" &
}

yt-dlpこのBashスクリプトは、またはコマンドラインユーティリティを使用してYouTube(または他のサポートされているWebサイト)からビデオをダウンロードするように設計されていますyoutube-dl。ビデオやプレイリストをダウンロードするさまざまなシナリオを処理するためのいくつかの機能を提供します。このスクリプトの機能の詳細な説明は次のとおりです。

  1. 共通オプションyt-dlpyoutube-dl:部分的にダウンロードされたファイルを続行する、上書きを防ぐ、詳細な出力を有効にする、ファイル名をASCII文字に制限するなどの共通のオプションを定義します。

  2. yt-dlp/youtube-dl検出:このスクリプトは特定の場所を確認するか、コマンドを使用してシステム上の実行可能ファイルを見つけようとしますyt-dlpyoutube-dlwhich

  3. 貼り付けコマンドの設定:オペレーティングシステム(macOSまたはLinux)に応じて、スクリプトはクリップボードの内容(pbpaste、、xselまたはxclip)を貼り付けるための適切なコマンドを設定します。

  4. get_log_filename関数:この関数は入力からログファイル名を生成し、英数字以外の文字を下線で置き換え、入力を200文字に切り捨てます。

  5. get_uploader関数yt-dlp:この関数は、指定された動画URLのアップローダ名を検索/検索しますyoutube-dl

  6. download_video_into_uploaders_folder関数:提供されたURL(またはクリップボードの内容)の動画をアップローダの名前を付けたフォルダにダウンロードする機能です。各アップローダのサブフォルダを作成し、ダウンロードしたビデオを追跡するためにアーカイブファイルを保存します。動画ファイル名には、アップローダ名、アップロード日、タイトル、動画IDが含まれます。

  7. ytdlvu関数:この関数はラッパーで、バックdownload_video_into_uploaders_folderグラウンドで実行されます。

  8. download_video_with_metadata_into_uploaders_folder関数:に似ていますdownload_video_into_uploaders_folderが、動画のメタデータ(情報JSON、コメント、サムネイル)もダウンロードします。

  9. ytdlvmu関数:この関数はラッパーで、バックdownload_video_with_metadata_into_uploaders_folderグラウンドで実行されます。

  10. download_video_playlist_with_metadata_into_uploaders_folder関数:プレイリスト全体をダウンロードし、提供されたプレイリストURLから動画URLを抽出してytdlvmu各動画を呼び出す機能です。

  11. ytdlvpmu関数:この関数はラッパーで、バックdownload_video_playlist_with_metadata_into_uploaders_folderグラウンドで実行されます。

要約すると、このスクリプトは、YouTube(または他のサポートされているWebサイト)からビデオとプレイリストをダウンロードし、アップローダごとに設定し、メタデータを含む機能セットを提供します。さまざまなオペレーティングシステムへのクリップボードアクセスをサポート、ユーティリティ、およびyt-dlp処理します。youtube-dl

答え2

sh/bash/zsh タイプ シェルを使用している場合は、次のことができます。

touch temp_archive.txt; yt-dlp --write-info-json --download-archive temp_archive.txt -o "%(uploader)s/%(title)s-[%(id)s].%(ext)s" --exec after_video:'cat temp_archive.txt >> "%(uploader)s/archive.txt"; printf "" > temp_archive.txt' "URL"

関数では:

opts=(
  --continue
  --no-overwrites
  --no-post-overwrites
  --verbose
  --restrict-filenames
  --retry-sleep fragment:exp=2:64
)

get_log_name() {
  TIMESTAMP=$( date +%y%m%d%H%M%S )
  NAME=${1//[^[:alnum:].-]/_}
  echo "yt-dlp_${TIMESTAMP}_${NAME}.log"
}

deal_with_long_filename_playlist() {
  LOG_NAME=$( get_log_name "$(${paste[@]})" )
  if ! $yt_dl ${opts[@]} --output "%(uploader|Anon)s/%(upload_date>%Y-%m-%d|)s%(upload_date& |)s%(title)s-%(id)s.%(ext)s" "$(${paste[@]})" >> "/tmp/$LOG_NAME" 2>&1; then
    $yt_dl ${opts[@]} --output "%(uploader|Anon)s/%(upload_date>%Y-%m-%d|)s%(upload_date& |)s%(webpage_url_domain)s-%(id)s.%(ext)s" "$(${paste[@]})" >> "/tmp/$LOG_NAME" 2>&1
  fi
  rm temp_archive.txt
}

# Video Playlist saving archive file to uploader's folder
ytvp() {
  local opts=(
    ${opts[@]}
    --format '(bv+(wa[abr>=64]/ba))/b'
    --format-sort res:720,tbr~2000
    --download-archive temp_archive.txt 
    --exec after_video:'cat temp_archive.txt >> "%(uploader)s/archive.txt"; printf "" > temp_archive.txt'
  )
  deal_with_long_filename_playlist &
}

# Video playlist with metadata
ytvpm() {
  local opts=(
    ${opts[@]}
    --format '(bv+(wa[abr>=64]/ba))/b'
    --format-sort res:720,tbr~2000
    --download-archive temp_archive.txt 
    --exec after_video:'cat temp_archive.txt >> "%(uploader)s/archive.txt"; printf "" > temp_archive.txt'
    --write-info-json
    --write-comments
    --write-thumbnail
  )
  deal_with_long_filename_playlist &
}

関連情報