YouTube 비디오 검색 및 보기/다운로드를 위한 CLI 유틸리티

YouTube 비디오 검색 및 보기/다운로드를 위한 CLI 유틸리티

명령줄에서 YouTube를 검색하고 다음을 수행할 수 있는 유틸리티가 있습니까?보다또는다운로드사용자 입력을 기반으로 한 검색 결과?

$ youtube-search madonna

1 Madonna - Hung Up (Official Music Video)
madonna ♩ 180M views 9 years ago
https://www.youtube.com/watch?v=EDwb9jOVRtU
"Hung Up" by Madonna from Confessions On A Dance Floor, available now.

2 Madonna - Like A Prayer (Official Music Video)
madonna ♩ 69M views 9 years ago
https://www.youtube.com/watch?v=79fzeNUqQbQ
2006 WMG Like A Prayer.

etc.

그런 다음 다음을 입력할 수 있습니다.

  • "v1" 비디오 1 보기(VLC 등 사용)
  • "d1-3"은 비디오 1-3을 다운로드합니다(youtube-dl 등 사용).
  • 검색 결과의 다음 페이지를 보려면 "n"

내가 지금까지 시도한 것 :

Google 직원YouTube에서는 부분적으로 작동하지만 어떤 이유로 "Madonna"를 검색하면 검색 결과가 두 개만 표시됩니다. 또한 보기와 다운로드 중에서 선택할 수 있는 방법이 없습니다.

유튜브-DL검색 기능이 있지만 검색 결과를 인쇄하거나 사용자 입력을 받아들이지 않는 것 같습니다. youtube-dl -j ytsearch:madonna검색 결과에 대한 메타데이터를 나열하지만 필수 비디오 링크, 제목 및 설명은 포함되지 않은 것으로 보입니다.

답변1

먼저, 결과에 ytsearchN:대해 물어봐야 합니다 . N둘째, 최신 버전인지 확인하세요 youtube-dl(이전 버전에서는 몇 가지 문제가 있었습니다).

다음 기본 스크립트는 5개의 결과를 가져와 제목과 URL을 표시하고 어떤 결과를 다운로드할지 묻습니다. "vN" 및 "dN" 명령에 응답하도록 만드는 것은 간단합니다("dN"은 실제로 이미 구현되어 있습니다). 그러나 다음 결과 페이지를 어떻게 얻을 수 있는지 잘 모르겠습니다.

#!/bin/bash

tempfile=$(mktemp)
youtube_dl_log=$(mktemp)

youtube-dl -j "ytsearch5:$*" > $tempfile

# workaround for lack of mapfile in bash < 4
# https://stackoverflow.com/a/41475317/6598435
while IFS= read -r line
do
    youtube_urls+=("$line")
done < <(cat $tempfile | jq '.webpage_url' | tr -d '"' )
# # for bash >= 4
# mapfile -t youtube_urls < <(cat $tempfile | jq '.webpage_url' | tr -d '"' )

cat $tempfile | jq '.fulltitle, .webpage_url'

while :
do
    echo "Enter video number to download."
    read i
    # don't download anything if you just press enter
    if [ ! x"$i" == x"" ]
    then
        # to make numbering of videos more intuitive (start from 1 not 0)
        youtube-dl --no-progress ${youtube_urls[$i - 1]} &
    fi
done

유용하다고 간주될 수도 있지만 출력을 youtube-dl파일(또는 )로 리디렉션할 수도 있습니다./dev/null

답변2

셀레늄 기반 솔루션:

#!/usr/bin/env python

from pyvirtualdisplay import Display
from selenium import webdriver
import time
import argparse
import re
import subprocess


class bcolors:
    BLUE = '\033[94m'
    GREEN = '\033[92m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'

pattern1=re.compile("v:[0-9]");
pattern2=re.compile("d:[0-9](-[0-9])?$")

parser = argparse.ArgumentParser()
parser.add_argument("query", help="enter the youtube search query here")
args = parser.parse_args()
query=args.query

display = Display(visible=0, size=(800, 600))
display.start()

driver = webdriver.Chrome()  # Optional argument, if not specified will search path.
driver.get('https://youtube.com');
search_box = driver.find_element_by_name('search_query')
search_box.send_keys(query)
search_box.submit()

i=1
page = driver.find_elements_by_css_selector("ytd-video-renderer.ytd-item-section-renderer")
link_list=[];
for video in page:
    a1=video.find_element_by_id('thumbnail').get_attribute('href')
    a2=video.find_element_by_id('video-title').text
    a3=video.find_elements_by_css_selector('yt-formatted-string[has-link-only_]:not([force-default-style]) a.yt-simple-endpoint.yt-formatted-string')[0].text
    a4=video.find_elements_by_css_selector('#metadata-line.ytd-video-meta-block span.ytd-video-meta-block')[0].text
    a5=video.find_elements_by_css_selector('#metadata-line.ytd-video-meta-block span.ytd-video-meta-block')[1].text
    a6=video.find_elements_by_css_selector('#description-text.ytd-video-renderer')[0].text
    #ink=video.get_attribute('innerHTML')
    print i,a2
    print a3+"    "+a4+"    "+a5
    print a1
    print a6
    print
    i+=1
    link_list.append(a1)


driver.quit()
display.stop()

print bcolors.BOLD+bcolors.GREEN+"Available options- v: open video in VLC media player, d: download video by number, q: quit"+bcolors.ENDC
print bcolors.BOLD+bcolors.BLUE+"Usage - option:number    or    option:beginning-end"+bcolors.ENDC
print
entry="y"
while entry!="q":
    entry=raw_input(">")
    if pattern1.match(entry):
        link=entry.split(":")[1]
        bashCommand="vlc "+link_list[int(link)]
        pass
    elif pattern2.match(entry):
        nums=entry.split(":")[1]
        b=int(nums.split("-")[0])
        e=int(nums.split("-")[1])
        bashCommand="youtube-dl "+" ".join(link_list[b:e])
    print bashCommand
    process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE)
    output, error = process.communicate()
    pass

실제 명령( )을 실행해보지는 않았지만 Popen이것이 효과가 있을 것이라고 생각합니다.

답변3

완전히 순수한 CLI는 아니지만 선택 프로세스를 사용 yad하거나 단순화하는 것은 어떨까요 ?zenity

개발자로 등록하고 받기API 키YouTube의 경우 이는 "있는 그대로" 작동합니다.

API를 사용하고 싶지 않다면 주석 처리된 줄의 주석 처리를 해제하고 주석 처리하면 대신 "youtube-dl"이 사용되지만 검색 속도는 느려집니다.

#!/bin/bash

APIKEY="GET YOUR OWN API KEY!"
APIURL="https://www.googleapis.com/youtube/v3/search"
NORESULTS=25
DOWNURL="https://www.youtube.com/watch?v="

function down { youtube-dl  "$DOWNURL$1"; }
function watch { xdg-open "$DOWNURL$1"; }

SEARCH=$( yad --center --title="Search for clip" --text="Enter search term" --entry 2>/dev/null)
SEARCH=$(echo $SEARCH | sed 's/ /%20/g')

#uncomment the 2 lines below to use youtube-dl 
#youtube-dl -j "ytsearch$NORESULTS:$SEARCH" | jq '.id, .title' > yt.search
#SELECTION=$(cat yt.search | sed 's/^\"\"$/\"No entry\"/' | sed 's/&/+/g' | sed '/^[^ ]*$/ i \"FALSE\"' | yad --center --checklist --list --width=1000 --height=800 --column=Check --column=ID --column=Title --button='gtk-cancel':0 --button='Download':2 --button='watch':4)

#comment out the following 3 lines if using youtube-dl
QUERY="part=snippet&maxResults=$NORESULTS&q=$SEARCH&type=video&key=$APIKEY"
curl -i -G -d "$QUERY" "$APIURL" |  sed '1,15d' | jq '.items[] | .id.videoId, .snippet.title, .snippet.description' > yt.search
SELECTION=$(cat yt.search | sed 's/^\"\"$/\"No entry\"/' | sed 's/&/+/g' | sed '/^[^ ]*$/ i \"FALSE\"' | yad --center --checklist --list --width=1000 --height=800 --column=Check --column=ID --column=Title --column=Description --button='gtk-cancel':0 --button='Download':2 --button='watch':4)

ACTION=$?
case $ACTION in
    0)
        echo "cancelled"
        exit
        ;;
    *)
        for i in $(echo $SELECTION | sed 's/|/\n/g' | grep -P "^\"[^ ]*\"$" | sed 's/\"//g'); do 
            if [ $ACTION -eq "2" ]; then #the download button was pressed 
                down "$i"
            else #the watch button was pressed
                watch "$i"
            fi
        done
    ;;
esac

답변4

여기터미널 기반 도구입니다: ytfzf.관련 정보 찾기여기.

2022 K/ubuntu에서 테스트해 본 결과 mps-youtube보다 버그가 적고 단순하다는 것을 알았습니다.

ytfzf시작하려면 터미널을 입력하세요 . ytfzf -h오디오 전용 및 다운로드와 같은 옵션은 리소스를 참조하세요 .

변수를 설정한 후 검색이 수행됩니다.

  • 오디오만 얻으려면:ytfzf -m <search_term>
  • 비디오를 다운로드하려면:ytfzf -d <search_term>

Exec=konsole -e ytfzf -m다른 옵션과 유사하게 "Youtube Audio..."라는 줄을 사용하여 앱 실행기에 이를 추가할 수 있습니다 .

여기에 이미지 설명을 입력하세요.

여기에 이미지 설명을 입력하세요.

여기에 이미지 설명을 입력하세요.

위나 아래로 스크롤하고 Enter 키를 누르거나 두 번 클릭하여 제목을 선택합니다.

여기에 이미지 설명을 입력하세요.

기본 플레이어는 이고 mpv, 다운로드는 를 통해 이루어지며 curl, 설정은 에 있습니다 ~/.config/ytfzf/conf.sh.

관련 정보