島根県安来市のフリーランスエンジニア_プログラマー画像1

PythonでYouTube一括ダウンロードツールをGUI付きで作った【ソースコード公開】

ふと「YouTubeの動画をまとめてダウンロードしたい」と思い立ち、Pythonで一括ダウンロードツールを作りました。GUI付きで操作も簡単、MP3変換にも対応しています。ソースコードをそのまま公開するので、同じものを作りたい方はコピペで使えます。

完成したツールの機能

✅ 複数URLを一括ダウンロード(1行に1URLで貼り付けるだけ)
✅ MP3変換に対応(チェックボックスで切り替え)
✅ 進捗をリアルタイムで表示
✅ GUI付きなのでコマンドライン不要
✅ exe化すればPython環境がなくても動く

必要なもの

1
Python
公式サイトからインストール。バージョンは3.8以上推奨。
2
yt-dlp
YouTubeダウンロードのライブラリ。pip install yt-dlp でインストール。
3
ffmpeg(MP3変換に必要)
BtbN/FFmpeg-Builds から ffmpeg-master-latest-win64-gpl-shared.zip をダウンロードして解凍。binフォルダのパスをコード内に指定する。

ソースコード

ffmpeg_location の部分は自分の環境に合わせて変更してください。

import yt_dlp
import os
import tkinter as tk
from tkinter import messagebox, scrolledtext

def download(urls, mode, log_widget):
    os.makedirs("downloads", exist_ok=True)
    
    if mode == "mp3":
        ydl_opts = {
            'outtmpl': 'downloads/%(title)s.%(ext)s',
            'format': 'bestaudio/best',
            'postprocessors': [{
                'key': 'FFmpegExtractAudio',
                'preferredcodec': 'mp3',
                'preferredquality': '192',
            }],
            'ffmpeg_location': r'C:\path\to\ffmpeg\bin',  # ここを変更
        }
    else:
        ydl_opts = {
            'outtmpl': 'downloads/%(title)s.%(ext)s',
            'format': 'best',
        }

    for i, url in enumerate(urls, 1):
        url = url.strip()
        if not url:
            continue
        log_widget.insert(tk.END, f"[{i}/{len(urls)}] ダウンロード中: {url}\n")
        log_widget.see(tk.END)
        root.update()
        try:
            with yt_dlp.YoutubeDL(ydl_opts) as ydl:
                ydl.download([url])
            log_widget.insert(tk.END, f"✅ 完了\n")
        except Exception as e:
            log_widget.insert(tk.END, f"❌ エラー: {e}\n")
        log_widget.see(tk.END)
        root.update()

def on_download():
    raw = url_text.get("1.0", tk.END).strip()
    urls = [u for u in raw.splitlines() if u.strip()]
    if not urls:
        messagebox.showwarning("エラー", "URLを入力してください")
        return
    log_text.delete("1.0", tk.END)
    mode = "mp3" if mp3_var.get() else "video"
    download(urls, mode, log_text)
    log_text.insert(tk.END, "\n🎉 全て完了!downloadsフォルダを確認してください\n")

root = tk.Tk()
root.title("YouTube 一括ダウンロード")
root.geometry("560x480")

tk.Label(root, text="YouTube URL(1行に1つ):").pack(pady=5)
url_text = scrolledtext.ScrolledText(root, width=65, height=8)
url_text.pack(pady=5)

mp3_var = tk.BooleanVar()
tk.Checkbutton(root, text="MP3としてダウンロード", variable=mp3_var).pack(pady=5)

tk.Button(root, text="一括ダウンロード", command=on_download,
          bg="green", fg="white", font=("", 12)).pack(pady=10)

tk.Label(root, text="進捗:").pack()
log_text = scrolledtext.ScrolledText(root, width=65, height=8, state="normal")
log_text.pack(pady=5)

root.mainloop()

exe化してPython不要にする

PyInstallerを使えばexeファイルに変換できます。Python環境がない人にも配布できます。

pip install pyinstaller
pyinstaller --onefile --windowed youtube_dl.py

完了すると dist フォルダの中に youtube_dl.exe が生成されます。

詰まったポイント

ffmpegのパスが通らない

wingetでインストールしても認識されないことがありました。BlueStacksのffmpegが先に見つかってしまい、MP3変換に必要なエンコーダーが入っていないバージョンだったのが原因。BtbNのビルドを直接ダウンロードして解決しました。

Unknown encoder ‘libmp3lame’ エラー

BlueStacksに同梱されているffmpegはMP3エンコーダーが含まれていないビルドでした。GPL版のffmpegを使うことで解決しました。

まとめ

yt-dlpとtkinterを使えば、GUI付きのYouTube一括ダウンロードツールを短時間で作れます。ffmpegのパス問題だけ注意すれば、あとはコードをコピペするだけで動きます。PyInstallerでexe化すればPython環境がない環境でも使えるので、自分用ツールとして普段使いできます。

MT4にClaude AIのシグナルを表示するEAを販売開始|相場をAIに読ませる

AIニュースサイトで伸びるジャンルの選び方|ニッチ・時流・英語ソースの3基準