CLI-Dienstprogramm zum Suchen und Anzeigen/Herunterladen von YouTube-Videos

CLI-Dienstprogramm zum Suchen und Anzeigen/Herunterladen von YouTube-Videos

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:madonnalistet 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-dlin 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 yadoder zenityum 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 ytfzfzum Starten in das Terminal ein. ytfzf -hOptionen 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.

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Scrollen Sie nach oben und unten und drücken Sie die Eingabetaste oder doppelklicken Sie, um den Titel auszuwählen.

Bildbeschreibung hier eingeben

Der Standardplayer ist mpv, der Download erfolgt durch curl, die Einstellungen sind in ~/.config/ytfzf/conf.sh.

verwandte Informationen