Это будет короче и эффективнее с:
youtube-dl -F https://www.youtube.com/watch?v=jVv_aSTVpyI |
grep -oE '(144|240|360|480|720|1080|1440|2160)p' |
sort -u > res.txt
grep -oE
: извлекает строки, соответствующие расширенному регулярному выражению, и печатает только соответствующую часть. sort -u
: Сортировка строк и удаление дубликатов.
с JSON обработкой
В качестве альтернативы, если вы хотите надежно извлечь метаданные width
и height
, youtube-dl
может создать набор данных JSON с опциональным переключателем -j
, чтобы проанализировать его с помощью jq
:
youtube-dl -j https://www.youtube.com/watch?v=jVv_aSTVpyI |
jq -r '[ .formats| .[] | select(.width != null) | [.width,.height] ] | unique | .[] | @tsv'
Выбор разрешения для выбранного диалогового меню и загрузка
#!/usr/bin/env bash
[[ $# -eq 1 ]] || exit 2
# https://www.youtube.com/watch?v=jVv_aSTVpyI
link="$1"
declare -a res
IFS=$'\n' read -r -d '' -a res < <(
youtube-dl -j "$link" |
jq '[.formats|.[]|select(.width!=null)|[.width,.height]]|unique|.[]|@sh'
)
declare -a options=()
for i in "${!res[@]}"; do
read -r width height <<<"${res[i]}"
options+=("$i" "$width×$height")
done
{
choice=$(
dialog \
--clear \
--backtitle "youtube-dl $link" \
--title '[ V I D E O - R E S O L U T I O N ]' \
--menu 'Select the video resolution' 0 0 "${#options[@]}" "${options[@]}" \
1>&3 2>&1
)
} 3>&1 || exit
read -r width height <<<"${res[choice]}"
printf -v format 'bestvideo[height<=%d]+bestaudio' "$height"
youtube-dl -f "$format" "$link"