😃

pythonでyoutube自動ダウンロードメモ

2023/09/10に公開

前書き

こんにちは。くまと申します。
私は普段YouTubeで音楽を聴いているのですが、広告が嫌になったのであらかじめmp3でダウンロードすることにしました。
巷にあるダウンロードツールを使おうか迷ったのですが、せっかくなのでpythonを頼ることにしました。

やってみた

使用したもの

MacBook Pro
Python
PyCharm

①動画コード(11桁の半角英数字)を取得します。

②pythonで一括ダウンロードします。

import sys
# passの設定 (pip showで出てきた、LocationのPASSを以下に設定)
sys.path.append('/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages')
import os
import ssl
from pytube import YouTube
from mutagen.id3 import ID3, APIC
import requests
# 証明書バンドルを指定
ssl._create_default_https_context = ssl._create_unverified_context

# 動画コードのリスト
videoCodes = ["tKVN2mAKRI", "nhOhFOoURnE"]
# 動画情報を格納する辞書
videoInfo = {}

for videoCode in videoCodes:
    try:
        # YouTubeオブジェクトを作成
        yt = YouTube(f'https://www.youtube.com/watch?v={videoCode}')
        # 動画のタイトルを取得
        title = yt.title
        videoInfo[videoCode] = {"title": title}
        # アップロードした人の名前を取得
        author = yt.author
        videoInfo[videoCode] = {"uploader": author}
        # 最高品質の音声ストリームを取得
        audio_stream = yt.streams.filter(only_audio=True).first()
        # ダウンロード先のフォルダパスを指定
        download_folder = os.path.expanduser('your_path')
        # ファイルをダウンロード
        file_name = f'{author} - {title}.mp3'
        file_name = file_name.replace("/", "").replace('"', "").replace("*", "").replace(":", "").replace("|", "")
        audio_stream.download(output_path=download_folder, filename=file_name)
        print(f'{file_name} をダウンロードしました。')
    except Exception as e:
        print(f'エラー: {str(e)}')

今後の課題

ひとまずこれでできたのですが、今後修正したい部分がいくつかあります。

最初のコードを減らしたい

今は応急処置として、https://qiita.com/ymto/items/e00e95543aab2d4d45ee こちらの記事を参考に書いていますが、書かないに越したことはないと思うので...

サムネイルを反映させたい

下のコードを試しても、audio = ID3(mp3_file_path)の部分が実行できない感じになります。

# 動画のサムネイルURLを取得
        thumbnailUrl = f'https://img.youtube.com/vi/{videoCode}/hqdefault.jpg'
        videoInfo[videoCode] = {"thumbnail_url": thumbnailUrl}
        imageData = requests.get(thumbnailUrl).content
        print(f'動画のサムネイルURLを取得しました。{thumbnailUrl}です。')
        # MP3ファイルにアルバムアートを埋め込む
        mp3_file_path = os.path.join(download_folder, file_name)
        audio = ID3(mp3_file_path)
        print('audioを設定')
        audio["APIC"] = APIC(
            encoding=3,  # UTF-8
            mime="image/jpeg",
            type=3,  # Album front cover
            desc=u"Cover",
            data=imageData
        )
        print('アルバムアートワークを埋め込みました。')

Discussion