はじめに
今回は、動画に紐づいた動画メタ情報・統計情報の抽出、およびYouTube-dlによる楽曲解析スクリプトの入力となる複数動画のコンテンツID・メタ情報を収集する方法を紹介します。 抽出には、YouTube Data API を利用します。
- はじめに
- YouTube Data APIの導入
- YouTube Data APIでの検索系スクリプト基本構成
- あるChannelに含まれる複数動画のコンテンツID収集
- あるPlaylistに含まれる複数動画のコンテンツID収集
- 複数の動画のコンテンツIDから、動画メタ情報および統計情報を抽出
- 実行例:複数動画コンテンツIDをダンプ
- まとめ
- 補足:YouTube Data APIの活用例
YouTube Data APIの導入
導入の流れは、次のようになります。
- Google Cloud Platformで新規プロジェクトを立ち上げ、YouTube Data APIを導入(APIキーを取得)
- Python向けパッケージの導入(google-api-python-client)
導入に関しては、以下の文献を参考にしました。
YouTube Data APIでの検索系スクリプト基本構成
DEVELOPER_KEY="xxxxxxxx YourAPI-key xxxxxxxx", YOUTUBE_API_SERVICE_NAME="youtube", YOUTUBE_API_VERSION="v3" # Service objectを生成 youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, developerKey=DEVELOPER_KEY ) # 実行したいInstance Methodを呼ぶ。 # 検索系の場合、Method().list(**options)という形式が多い # 検索時のオーダー、範囲(ID)、個数などをオプションで指定する search_response = youtube.Method().list( opt_0=opt_0, opt_1=opt_1 ).execute() # 検索結果をリストで受け取る items = search_response.get("items", [])
あるChannelに含まれる複数動画のコンテンツID収集
search().list(options)を使い、動画itemだけからコンテンツIDを抜き出します。
def _get_channel_items(youtube, options): search_response = youtube.search().list( channelId=options.channelId, part="id,snippet", maxResults=options.max_results, order=options.order, ).execute() items = search_response.get("items", []) content_id_list = [item["id"]["videoId"] for item in items if item["id"]["kind"]=="youtube#video"]
あるPlaylistに含まれる複数動画のコンテンツID収集
playlistItems().list(options)を使います
def _get_playlist_items(youtube, options): search_response = youtube.playlistItems().list( playlistId=options.playlistId, part="id,snippet", maxResults=options.max_results ).execute() items = search_response.get("items", []) content_id_list = [item["snippet"]["resourceId"]["videoId"] for item in items if item["snippet"]["resourceId"]["kind"]=="youtube#video"]
複数の動画のコンテンツIDから、動画メタ情報および統計情報を抽出
videos().list(options)を利用します。
今回は、統計情報や動画メタ情報の一部を抽出していますが、動画によっては国ごとのレーティングなども
取得できるようです。詳しいクエリは上記リンクを参考にしてください。
なお、動画の取得情報を増やす際は、videos()list(options)
のoptions
にあるpart
で取得するキーを指定してやる必要があるので注意です。
スクリプト中のids
は一つの文字列であり、
カンマをセパレータとして動画のコンテンツIDを並べます。
"xxxxxxxx, yyyyyyyy, zzzzzzzz, ..."
上記の例にあるcontent_id_list
のようなコンテンツID配列を使う場合は、ids=','.join(content_id_list)
のような方法で一つの文字列に変換してください。
def _get_video_metadata_and_stats(youtube, ids): response = youtube.videos().list( part="id,snippet,statistics,contentDetails", id=ids ).execute() video_info_list = [] for result in response.get("items", []): #"contentRating": result["contentDetails"]["contentRating"], obj = { "id": _import_dict(result, "id"), "title": _import_dict(result["snippet"], "title"), "publishedAt": _import_dict(result["snippet"], "publishedAt"), "tags": _import_dict(result["snippet"], "tags"), "channelTitle": _import_dict(result["snippet"], "channelTitle"), "categoryId": _import_dict(result["snippet"], "categoryId"), "statistics": _import_dict(result, "statistics") } video_info_list.append(obj) return video_info_list
実行例:複数動画コンテンツIDをダンプ
以上の関数を利用して、プレイリストID⇒複数動画コンテンツIDをjson形式でダンプしてみました。 題材として、今回は[Perfume] Album 「GAME」のプレイリストIDを指定します。 動画のコンテンツID配列や、統計情報(再生数、like/dislike数、コメント数)が取得できていることを確認しました。
[Perfume] Album 「GAME」 - YouTube
まとめ
YouTube Data APIへアクセスするためのAPIキーを取得するのが面倒ですが、 一度取得してしまえば非常に便利です。 最近(2018年11月)、youtube-dlで動画の再生数が正常に取得できなくなってしまったこともあり、 メタ情報を取得するのはYouTube Data APIをお勧めします。
なお、無料ですが日ごとに利用限度があるようです。 qiita.com
補足:YouTube Data APIの活用例
Python コード サンプル | YouTube Data API | Google Developers
以上の例では、動画の検索以外のYouTube Data API活用例が紹介されていますので、YouTube動画ベースのサービス開発の参考になるかもしれません。 以下、抜粋です。
- チャンネルのお知らせメッセージの投稿
- おすすめ動画を追加
- マイ アップロード動画の取得
- 再生リストの作成
- トピックで検索
- キーワードで検索
- チャンネル登録の追加
- 動画のサムネイル画像のアップロード
- 動画をアップロード
- 動画の評価
- 動画の更新