次のように、パラメータだけではこれを行うことはできません。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
。ビデオやプレイリストをダウンロードするさまざまなシナリオを処理するためのいくつかの機能を提供します。このスクリプトの機能の詳細な説明は次のとおりです。
共通オプション
yt-dlp
youtube-dl
:部分的にダウンロードされたファイルを続行する、上書きを防ぐ、詳細な出力を有効にする、ファイル名をASCII文字に制限するなどの共通のオプションを定義します。yt-dlp/youtube-dl検出:このスクリプトは特定の場所を確認するか、コマンドを使用してシステム上の実行可能ファイルを見つけようとします
yt-dlp
。youtube-dl
which
貼り付けコマンドの設定:オペレーティングシステム(macOSまたはLinux)に応じて、スクリプトはクリップボードの内容(
pbpaste
、、xsel
またはxclip
)を貼り付けるための適切なコマンドを設定します。get_log_filename関数:この関数は入力からログファイル名を生成し、英数字以外の文字を下線で置き換え、入力を200文字に切り捨てます。
get_uploader関数
yt-dlp
:この関数は、指定された動画URLのアップローダ名を検索/検索しますyoutube-dl
。download_video_into_uploaders_folder関数:提供されたURL(またはクリップボードの内容)の動画をアップローダの名前を付けたフォルダにダウンロードする機能です。各アップローダのサブフォルダを作成し、ダウンロードしたビデオを追跡するためにアーカイブファイルを保存します。動画ファイル名には、アップローダ名、アップロード日、タイトル、動画IDが含まれます。
ytdlvu関数:この関数はラッパーで、バック
download_video_into_uploaders_folder
グラウンドで実行されます。download_video_with_metadata_into_uploaders_folder関数:に似ています
download_video_into_uploaders_folder
が、動画のメタデータ(情報JSON、コメント、サムネイル)もダウンロードします。ytdlvmu関数:この関数はラッパーで、バック
download_video_with_metadata_into_uploaders_folder
グラウンドで実行されます。download_video_playlist_with_metadata_into_uploaders_folder関数:プレイリスト全体をダウンロードし、提供されたプレイリストURLから動画URLを抽出して
ytdlvmu
各動画を呼び出す機能です。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 &
}