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.

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

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

지금까지 시도한 것:

구글러부분적으로 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>

"Youtube audio..."라는 줄을 사용하여 애플리케이션 시작 관리자에 이를 추가할 수 Exec=konsole -e ytfzf -m있으며 다른 옵션에도 유사하게 추가할 수 있습니다.

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

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

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

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

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

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

관련 정보