Почему мой сценарий заканчивается только после того, как я ^ D его? - PullRequest
0 голосов
/ 29 марта 2020

У меня есть скрипт, который берет ссылку на YouTube и извлекает доступные разрешения этого видео в файл «res.txt», используя youtube-dl. Файл res.txt содержит требуемый вывод, но отображается только после того, как я нажму ^ D. Может кто-нибудь сказать мне, почему мой сценарий застревает?

#!/bin/bash
youtube-dl -F https://www.youtube.com/watch?v=jVv_aSTVpyI > info.txt
echo Start
cat > res.txt
for i in '144p' '240p' '360p' '480p' '720p' '1080p' '1440p' '2160p' ; do
    while read p ; do
        if [[ "$p" == *"$i"* ]] ; then
            echo "$i" >> res.txt
            break
        fi
    done < info.txt
done 
echo "done"
a=1
sed -i '1d' res.txt
echo "Please Type required resolution: "
while read p ; do
     echo -n $a
     echo -n ")"
     echo $p
     a=$((a+1))
done < res.txt
read reso
youtube-dl -f 'bestvideo[height<=$reso]+bestaudio' $link

1 Ответ

2 голосов
/ 29 марта 2020

Это будет короче и эффективнее с:

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"
...