다음과 같이 매개변수만으로는 이 작업을 수행할 수 없습니다.args를 사용하여 다운로드 아카이브 경로 설정
두 개의 유사한 스크립트를 만들고 싶습니다. 비디오를 다운로드하고 각 비디오의 보관 파일을 업로더의 폴더에 저장합니다. 또 다른 스크립트도 메타데이터를 다운로드합니다.
다운로드하기 전에 아카이브를 확인하고 싶습니다.
이 기능을 여러 번 병렬로 사용하여 백그라운드에 배치하고 싶습니다.
업로더를 얻기 위해 제가 생각할 수 있는 유일한 방법은 출력과 함께 메타데이터를 다운로드하는 것입니다 %(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(또는 기타 지원되는 웹사이트)에서 비디오를 다운로드하도록 설계되었습니다 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(또는 기타 지원되는 웹사이트)에서 동영상과 재생목록을 다운로드하는 동시에 업로더별로 구성하고 메타데이터를 포함하는 기능 세트를 제공합니다. 다양한 운영 체제에 대한 클립보드 액세스를 지원 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 &
}