
Gibt es ein Dienstprogramm, mit dem man YouTube über die Befehlszeile durchsuchen und dann entwederSichtoderherunterladendie Suchergebnisse entsprechend der Benutzereingaben?
$ 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.
Und dann können Sie eingeben:
- „v1“ zum Anzeigen von Video 1 (mit VLC usw.)
- „d1-3“ zum Herunterladen der Videos 1–3 (mit YouTube-DL usw.)
- „n“, um die nächste Seite mit Suchergebnissen anzuzeigen
Was ich bisher versucht habe:
Googlerfunktioniert teilweise mit YouTube, zeigt aber aus irgendeinem Grund nur zwei Suchergebnisse bei der Suche nach „Madonna“ an. Auch gibt es keine Auswahl zwischen Ansehen und Herunterladen.
youtube-dlverfügt über eine Suchfunktion, scheint aber weder die Suchergebnisse auszudrucken noch Benutzereingaben zu akzeptieren. youtube-dl -j ytsearch:madonna
listet Metadaten zu Suchergebnissen auf, scheint aber den gewünschten Videolink, Titel und die Beschreibung nicht zu enthalten.
Antwort1
Erstens müssen Sie ytsearchN:
nach Ergebnissen fragen N
. Zweitens müssen Sie sicherstellen, dass Sie die neueste Version haben youtube-dl
(ich hatte einige Probleme mit einer alten Version).
Das folgende einfache Skript liefert 5 Ergebnisse, zeigt deren Titel und URLs an und fragt, welche heruntergeladen werden sollen. Es wäre einfach, es auf die Befehle „vN“ und „dN“ reagieren zu lassen („dN“ ist bereits implementiert); ich bin mir jedoch nicht sicher, wie Sie die nächste Seite mit Ergebnissen erhalten könnten.
#!/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
Möglicherweise möchten Sie die Ausgabe von youtube-dl
in eine Datei (oder /dev/null
) umleiten, obwohl dies auch nützlich sein könnte.
Antwort2
Eine auf Selen basierende Lösung:
#!/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
Ich habe nicht versucht, die eigentlichen Befehle ( Popen
) auszuführen, aber ich denke, das sollte funktionieren.
Antwort3
Nicht ganz reine CLI, aber warum nicht verwenden yad
oder zenity
um den Auswahlprozess zu vereinfachen?
Registrieren Sie sich als Entwickler und erhalten Sie eineAPI-Schlüsselfür YouTube, dann funktioniert es so wie es ist.
Wenn Sie die API nicht verwenden möchten, heben Sie die Kommentierung der Zeilen auf und kommentieren Sie sie wie angegeben aus. Stattdessen wird „youtube-dl“ verwendet, die Suche ist dann jedoch langsamer.
#!/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
Antwort4
Hierist ein terminalbasiertes Tool: ytfzf
. Habe es gefundenHier.
Beim Testen im Jahr 2022 auf K/Ubuntu finde ich, dass es weniger fehlerhaft und weniger kompliziert ist als mps-youtube.
Geben Sie es ytfzf
zum Starten in das Terminal ein. ytfzf -h
Optionen wie „Nur Audio“ und „Download“ finden Sie unter „Optionen“.
Die Suche wird durchgeführt, nachdem die Variable festgelegt wurde.
- um nur Audio zu erhalten:
ytfzf -m <search_term>
- um das Video herunterzuladen:
ytfzf -d <search_term>
Wir können das in einen Anwendungsstarter mit einer Zeile wie Exec=konsole -e ytfzf -m
„Youtube-Audio …“ einfügen – und das Gleiche gilt für andere Optionen.
Scrollen Sie nach oben und unten und drücken Sie die Eingabetaste oder doppelklicken Sie, um den Titel auszuwählen.
Der Standardplayer ist mpv
, der Download erfolgt durch curl
, die Einstellungen sind in ~/.config/ytfzf/conf.sh
.