재생목록을 다운로드하려면 youtube-dl을 사용하세요. 각 동영상의 모든 데이터(보관 파일 포함)를 업로더의 폴더에 저장합니다.

재생목록을 다운로드하려면 youtube-dl을 사용하세요. 각 동영상의 모든 데이터(보관 파일 포함)를 업로더의 폴더에 저장합니다.

다음과 같이 매개변수만으로는 이 작업을 수행할 수 없습니다.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. 비디오 및 재생 목록을 다운로드하는 다양한 시나리오를 처리하는 여러 기능을 제공합니다. 이 스크립트의 기능에 대한 자세한 설명은 다음과 같습니다.

  1. 공통 옵션yt-dlpyoutube-dl: 부분적으로 다운로드된 파일 계속하기, 덮어쓰기 방지, 자세한 출력 활성화, 파일 이름을 ASCII 문자로 제한 등 / 에 대한 일련의 공통 옵션을 정의합니다 .

  2. yt-dlp/youtube-dl 감지: 이 스크립트는 특정 위치를 확인하거나 명령을 사용하여 시스템에서 실행 파일을 찾으려고 시도합니다 yt-dlp.youtube-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(또는 기타 지원되는 웹사이트)에서 동영상과 재생목록을 다운로드하는 동시에 업로더별로 구성하고 메타데이터를 포함하는 기능 세트를 제공합니다. 다양한 운영 체제에 대한 클립보드 액세스를 지원 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 &
}

관련 정보