ChatGPTで動画ダウンローダーを作った

ChatGPTで動画ダウンローダーを作った

2025年5月21日 【AI 更新日:2025年5月26日

ChatGPTにプログラムを書いてもらって動画ダウンローダーを作りました。

以前にpythonのtkinterで動画のダウンローダーを作ったのですが、その後仕様の変更のためかダウンロードできなくなっていました。

ダウンロードすると広告は表示されないし早送りなどの操作がしやすくなります。普段はそんなに動画は見ないのですが時々必要になる時があります。

そこで今回現状でダウンロードできるpythonのライブラリがないのか調べてみると以前使用した「pytube」は現在でもダメなようですが「yt_dlp」というのがあるようで早速デスクトップアプリを作ってみました。

出来上がってダウンロードしてみると映像と音声が別々のファイルとしてダウンロードされてしまいます。これは動画編集ソフトか何かで合わせないといけないのかと一瞬がっかりしましたが、調べてみると「FFmpeg」というライブラリで結合できるようで早速取り掛かりました。しかし始めてすぐにそうだAIに聞いてみようとChatGPTにお願いするとあっという間にmerge.pyという別ファイルでプログラムを書いてくれます。AIは凄い。

そして無事に結合できたのでダウンロードと結合を一つのプログラムしてと頼むと「FFmpegで再結合する必要はありません。yt-dlp 自体に結合処理が内蔵されているため、以下のように「結合済みのMP4」を yt-dlp に出力させればOKです。」

ということで書いてもらったのが掲載したコードです。

インストールしたライブラリの環境変数のパスも教えてくれ設定の手順なども。パスを通すなどは時々しか行わないのでどのメニューから入れたかなど毎回調べていましたが、その手間が省け時間短縮になります。

ダウンロードと結合には少々時間がかかりますが、大きな画面サイズで保存することができました。

動画ダウンローダー

pythonのコードです。保存先の選択等は作っていません。

import tkinter as tk
from tkinter import messagebox
from tkinter import ttk
import yt_dlp
import os

def download_with_ytdlp(url, status_label):
    if not url:
        messagebox.showwarning("入力エラー", "URLを入力してください。")
        return

    status_label.config(text="📥 ダウンロード中...")
    root.update()

    try:
        ydl_opts = {
            'format': 'bv*+ba/best',
            'outtmpl': '%(title).80s.%(ext)s',  # 現在のフォルダにタイトル名で保存
            'merge_output_format': 'mp4',
        }

        with yt_dlp.YoutubeDL(ydl_opts) as ydl:
            info = ydl.extract_info(url, download=True)
            filename = ydl.prepare_filename(info).replace('.webm', '.mp4').replace('.mkv', '.mp4')

        status_label.config(text="✅ ダウンロード完了!")
        messagebox.showinfo("完了", f"動画が保存されました:\n{filename}")

    except Exception as e:
        status_label.config(text="❌ エラーが発生しました")
        messagebox.showerror("エラー", f"処理中に問題が発生しました:\n{str(e)}")

# GUIセットアップ
root = tk.Tk()
root.title("動画ダウンロードツール")
root.geometry("500x200")

tk.Label(root, text="🎯 ダウンロードする動画のURLを入力:").pack(pady=10)
url_entry = tk.Entry(root, width=60)
url_entry.pack()

status_label = tk.Label(root, text="", fg="green")
status_label.pack(pady=10)

download_button = ttk.Button(root, text="ダウンロード", command=lambda: download_with_ytdlp(url_entry.get(), status_label))
download_button.pack(pady=5)

root.mainloop()

関連記事

御嶽山の「日本一の溶岩流」の雄大な写真の現像レタッチ

御嶽山の「日本一の溶岩流」展望所から撮影した御嶽山と「馬の鞍滝」の写真。 肉眼で見た雄大さ、イメージを写真で表現したいのですがなかなか思うような写真になりません。そこでAIに相談したらどうなるのかと思い、ChatGPTに […]