명령줄에서 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
.