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」を押すと検索結果の次のページが表示されます

これまで試したこと:

グーグルYouTube では部分的に動作しますが、何らかの理由で「マドンナ」を検索すると 2 つの検索結果しか表示されません。また、表示とダウンロードの選択肢がありません。

ユーチューブ検索機能はありますが、検索結果を印刷したり、ユーザー入力を受け付けたりはしないようです。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 よりもバグが少なく、複雑さも少ないことがわかりました。

開始するにはターミナルに入力しますytfzfytfzf -hオーディオのみやダウンロードなどのオプションについては、こちらをご覧ください。

検索は変数が設定された後に行われるので、例えば

  • 音声のみを取得するには:ytfzf -m <search_term>
  • ビデオをダウンロードするには:ytfzf -d <search_term>

これを、"Youtube audio..." という行のようなアプリケーション ランチャーに追加できますExec=konsole -e ytfzf -m。他のオプションについても同様です。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

上下にスクロールして Enter キーを押すか、ダブルクリックしてタイトルを選択します。

ここに画像の説明を入力してください

デフォルトのプレーヤーはmpv、ダウンロードはcurl、設定は で行われます~/.config/ytfzf/conf.sh

関連情報