youtube-dl utils Tool (Audio Only, Script) Raspberry Pi

前回の作成からいろいろ使ってみました。気になるところを修正、追加しています。

video only + audio only

URL欄は以下の形式が利用できます。(YouTube)

https://www.youtube.com/watch?v=xxxxyyyyzzz
https://youtu.be/xxxxyyyyzzz
xxxxyyyyzzz

下記例の(best)は640×360 360pですがvideo only + audio onlyで必要なサイズ品質を指定できます。
135+140  854×480 480p (mp4)
244+251  854×480 480p (webm)

audio only

-f m4a ではmp4コンテナのm4a(mp4a AAC LC)音声のみがダウンロードできます。-f 251 は音声のみのwebm(opus)ですが拡張子は動画と同じwebmとなり区別がつきません。
youtube-dlオプション -x –audio-formatから各形式を指定出来ます。簡単に済ますためType欄の-f に続く形でインサートしています。そのためType欄へは140 or 251を入力後各ボタンのaudio-formatが入力可能になります。
flacはインストールが必要と思います。(# apt install flac)

# audio only
def aac_click():
    global ft; ft = "aac"; insert()
def flac_click():
    global ft; ft = "flac"; insert()
def mp3_click():
    global ft; ft = "mp3"; insert()
def opus_click():
    global ft; ft = "opus"; insert()
def vorbis_click():
    global ft; ft = "vorbis"; insert()
def wav_click():
    global ft; ft = "wav"; insert()

# audio Entory insert
def insert():
    t = t_entry.get()
    if not t:
        messagebox.showinfo('youtube-dl', 'Select a Format Type !')
        return
    # entry insert
    t_entry.insert(END," -x --audio-format " + ft)
    t = t_entry.get()
    proc = messagebox.askyesno('youtube-dl', "-f " + t + "\n\nYes/No ? (no clear) ")
    if proc == False:
        t_entry.delete("0","end")
    return

YouTubeがサポートしている形式m4a(aac),webm(opus)以外は再変換するものと思います。wav,flacについてはその形式で配布(サポート)しているサイトで本来の意味があるものと思われます。(mp4,webmは動画)

但し残念ながら当サイト環境のopus形式のファイルは大半が僅かにクリップ気味となってしまいます。特に音楽ファイルは動画に比べて出力レベルが高めとなっているためI2Sデバイスへの入力オーバーが原因と思われます。

Script file

ダウンロードはURLとTypeを入力してDLボタンで実行するだけですが少し大きめのファイルは数分かかります。纏めて実行できるようスクリプトファイルに書き出して実行します。
デフォルトディレクトリはmultimedia関連のディレクトリとしてListboxは隠しファイル(ピリオド)を表示することにします。(“ls -FA”)

# Listbox 1 (multimedia)
def media_list():
    global multimedia_dir, multimedia_list
    multimedia_list = "ls -FA"
    multimedia_list = (subprocess.Popen(multimedia_list, stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')

赤scriptボタン(add)

# script click
def script_click():
    url = url_entry.get(); url = url.strip()
    t = t_entry.get(); t = t.strip()
    if not url:
        messagebox.showinfo('youtube-dl', 'No URL !')
        return
    if not t:
        t = "mp4"
    cmd = ("'" + url + "' -f " + t)
    with open('.youtube_dl_download.sh', 'a') as f:
        f.write("youtube-dl -o " + "'%(title)s.%(ext)s' " + cmd + "\n")
        messagebox.showinfo('youtube-dl', 'Add URL !')
        # reload
        reload_click()
    return

緑scriptボタン(edit)

# script edit
def script_edit():
    y = os.path.isfile('.youtube_dl_download.sh')
    if y == False:
        messagebox.showinfo('youtube-dl', 'No file .youtube_dl_download.sh ! ')
        return
    subprocess.run("xterm -g 130x24 -e vi .youtube_dl_download.sh &", shell=True)
    return

URL Typeを入力、赤scriptボタンクリック(OK)でListBoxの先頭に’.youtube_dl_download.sh’が生えてきます。
緑scriptボタンは更に編集が可能、特殊なオプションが必要な場合は末尾または適当な位置に追記します。

実行はListBoxから選択、YouTube_DLボタンで開始(終了したらスクリプトファイル削除)
YouTubeサイトは5本目位から急にダウンロード速度が低下するようです。(できるだけマメに結果的に早い)

space & bracket (_)

ダウンロードしたファイルは半角(space)があるとListBoxが乱れます。また特殊記号があるとsubprocessはplayerにうまく渡せません。気がついた記号”&()”をアンダースコアに置き換えます。クォーテーションマーク(‘”)はうまく処理出来なかったので必要であれば手作業で修正(ファイルマネージャーやプレーヤーソフトからは問題ないと思います)
(# apt install rename)

# space & bracket (_)
def space_click():
    subprocess.run("find . -name '* *' | rename 's/ /_/g'", shell=True)
    subprocess.run("find . -name '*&*' | rename 's/&/_/g'", shell=True)
    subprocess.run("find . -name '*(*)*' | rename 's/[ ()]/_/g'", shell=True)
    # reload
    reload_click()
    return

youtube-dl

debian系からmpvをインストールすると依存でyoutube-dlもインストールされると思います。パッケージのyoutube-dlはバージョンが古いので最新のyoutube-dlをインストールします。
http://ytdl-org.github.io/youtube-dl/download.html
上記サイトのyoutube-dlは/usr/local/bin/以下にインストールされます。

$  which youtube-dl
/usr/local/bin/youtube-dl

パッケージからインストールしたyoutube-dlがある場合は優先するので削除

$ sudo apt remove youtube-dl

updateボタンクリック 更新があればup-to-dateは最新の日付になります

その他

Homeボタン デフォルトディレクトリに移動
URL欄が空欄の場合は最後に取得したフォーマット情報(/tmp/youtube_F.log)を表示(OS再起動で削除)

# url
def url_click():
    url = url_entry.get()
    url = url.strip()
    if not url:
        ls = os.path.isfile("/tmp/youtube_F.log")
        if ls == True:
            subprocess.run("xterm -g 135x25 -e lv /tmp/youtube_F.log &", shell=True)
        else:
            messagebox.showinfo('youtube-dl', 'No URL !')
        return


基本はこのボタンで間に合うと思います。当サイトはdevilspie2で起動サイズを指定、必要があれば引き伸ばします(好みで)

参考 youtube_dl_utils.py.20210903