Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

YouTube Data API を使って複数の音楽動画のコンテンツID・メタ情報をまとめて収集

はじめに

今回は、動画に紐づいた動画メタ情報・統計情報の抽出、およびYouTube-dlによる楽曲解析スクリプトの入力となる複数動画のコンテンツID・メタ情報を収集する方法を紹介します。 抽出には、YouTube Data API を利用します。

YouTube Data APIの導入

導入の流れは、次のようになります。

  1. Google Cloud Platformで新規プロジェクトを立ち上げ、YouTube Data APIを導入(APIキーを取得)
  2. Python向けパッケージの導入(google-api-python-client)

導入に関しては、以下の文献を参考にしました。

PythonでYoutube動画検索 - 粗大メモ置き場

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動画ベースのサービス開発の参考になるかもしれません。 以下、抜粋です。

  • チャンネルのお知らせメッセージの投稿
  • おすすめ動画を追加
  • マイ アップロード動画の取得
  • 再生リストの作成
  • トピックで検索
  • キーワードで検索
  • チャンネル登録の追加
  • 動画のサムネイル画像のアップロード
  • 動画をアップロード
  • 動画の評価
  • 動画の更新