😃
pythonでyoutube自動ダウンロードメモ
前書き
こんにちは。くまと申します。
私は普段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