Youtubeの自動ダウンロード環境を構築する(Python)
概要
Pythonで、Youtubeの動画を自動でダウンロードする環境を構築する。
- 任意のチャンネルの動画を対象とする。
- EDCBの録画開始によるスリープ復帰時ダウンロードを実行する。
- 前回ダウンロード以降にアップロードされた動画をダウンロードする。
目次
環境
ソフトウェア
ハードウェア
- とくになし
手順
Pythonをインストールする
この辺を参考に。
Pythonのライブラリをインストールする
各項目に記述されているコマンドを、コマンドプロンプトから実行する。
oauth2client
$ pip install --upgrade oauth2client
google-api-python-client
$ pip install --upgrade google-api-python-client
python-dotenv
$ pip install -U python-dotenv
ライブラリをインストールできない場合の対処法
コマンドライン上のメッセージにpython -m pip install --upgrade pip
と表示されている場合は、そのコマンドを実行しpipをアップデートする必要がある。
YoutubeのAIPキー(DeveloperKEY)を発行する
承認の認証情報を取得するの手順に従いAPIキーを発行する。
コードの内容
Youtubeの動画を検索する
from googleapiclient.discovery import build from googleapiclient.errors import HttpError from oauth2client.tools import argparser def youtube_search(options): youtube = build("youtube", "v3", developerKey=<YoutubeのAIPキー>) search_response = youtube.search().list( q = options["q"], part = "id,snippet", maxResults = options["max_results"], channelId = options["channel_id"], publishedAfter = options["published_after"] ).execute() videos = [] for search_result in search_response.get("items", []): if search_result["id"]["kind"] == "youtube#video": videos.append({"title": search_result["snippet"]["title"], "videoId": search_result["id"]["videoId"]}) for video in videos: print(video["videoId"], video["title"]) return videos
Pythonからyoutube-dlを実行する
import subprocess def exec_youtube_dl(url): result = subprocess.check_output( [<yutube-dlのフルパス>, "--ffmpeg-location", <ffmpegのフルパス>, #"-f", # mp4に限定する場合は有効 #"mp4", # mp4に限定する場合は有効 url ] ) print(result) return result
ビデオをダウンロードする
def download_videos(video_ids): for video_id in video_ids: exec_youtube_dl( "https://www.youtube.com/watch?v=" + video_id )
ビデオのIDを取得する
from youtube_search_api import youtube_search from googleapiclient.errors import HttpError def get_video_ids(channelId, date, max_results, q): options = { "channel_id": channelId, "published_after": date, "max_results": max_results, "q": q } try: results = youtube_search(options) video_ids = [result["videoId"] for result in results] except HttpError as e: print("An HTTP error %d occurred:\n%s" % (e.resp.status, e.content)) exit(-1) if video_ids is not None: return video_ids
メイン関数
from datetime import datetime, date, timedelta if __name__ == "__main__": date = "" try: with open("date.txt","r") as f: date = f.read() except: date = datetime.strftime(datetime.today(), "%Y-%m-%dT00:00:00Z") with open("date.txt","w") as f: f.write(datetime.strftime(datetime.now(), "%Y-%m-%dT%H:%M:00Z")) channels = { "<任意の名称>" : "<チャンネルID>", "<任意の名称>" : "<チャンネルID>" } max_results = 50 q = "" video_id_all = [] for name, channelId in channels.items(): video_id_all += get_video_ids(channelId, date, max_results, q) download_videos(video_id_all)
- 4~9行目 : 前回の実行時間を取得する。
- 8~9行目 : ファイルが無い場合に、本日の0時以降の動画を対象にしている。
https://www.youtube.com/channel/ABCDEFG
のABCDEFG
の部分。
- 8~9行目 : ファイルが無い場合に、本日の0時以降の動画を対象にしている。
- 11~12行目 : 今回の実行時間をファイルに記述する。
- 14~19行目 : ダウンロードするチャンネルを設定する。
- 14~17行目 : 対象にするチャンネルを記述する。
- 18行目 : 基本的に変更不要。
- 19行目 : 特定のキーワードを含む動画のみを対象としたい場合に、キーワードを記述する。
スリープから復帰時にダウンロードを実行する
- タスクスケジューラを開く。
- メニューから、操作⇒タスクの作成 を選択する。
- 以下の設定を行う。
- "OK"ボタンを押下し、タスクを登録する。