蛇ノ目の記

技術のことも。そうでないことも。

アイドルで理解するYoutube Data API - 動画情報取得編

アイドルで理解するhogehogeシリーズ第2弾です。

PyLadies Tokyo 5周年パーティのLT大会で@meliさんが発表した、Youtube Data APITwitterとLambdaを使って「Pythonで推しの役に立ちたい!」というLTに刺激を受けて、Youtube Data API面白そうじゃんと思うも使ったことなかったので使い方を書いてみる。

TL;DR

3行でおk

下準備

  1. Google API Consoleでプロジェクトを作成する。

  2. API Consoleの認証情報からAPI Keyを作成する

  3. ダッシュボードのライブラリからYouTube Data API v3を選択して、APIを有効にする

これでYoutube Data APIを使う準備が整った。

今回はOAuthを必要としないAPIを使っていく。

APIを叩くのを簡単に済ませたいのでrequestsを使う。仮想環境を作ってrequestsをインストールしておく。

$ python3 -m venv venv
$ . venv/bin/activate
(venv)$ pip install requests

API Keyはconfig.pyに書いておいて、複数のスクリプトで使いやすくしておく。

# config.py
API_KEY = YOUR API KEY

余談

requestsのドキュメントでレスポンスをJSON形式で取得するメソッドを検索したら、

このサイトは安全に接続できません

2.python-requests.org から無効な応答が送信されました。

ERR_SSL_PROTOCOL_ERROR

とか出てきた。Kenneth氏〜

動画の情報を取得してみる

動画情報のAPIVideos エンドポイントにまとめられている。

developers.google.com

その中でも情報の取得にはVideos:listを使う。

developers.google.com

GETメソッドを使う。

GET https://www.googleapis.com/youtube/v3/videos

Videos:listでは例えば以下のような情報が取れる。

  • snippet: 動画の基本的な情報(タイトルやアップロード日時、説明など)

  • ContentDetail: 動画の長さやアスペクト比、字幕の有無、各国でのレーティング状況など

  • statistics: 動画の統計情報(再生回数, 高評価・低評価の数など)

その他の情報はリファレンスを参照のこと。

一部の情報(fileDetail, processingDetail, suggestions)は動画の所有者しか取得できないので注意。

基本的な情報を取得してみる

パラメータのうち、今回は必須パラメータであるpartと動画IDのidを使う。

partはどの情報を取得するかを指定するパラメータで、snippetstatisticsなどをカンマ区切りリストで指定する。

まずはpartにはsnippetidにはsora tob sakana 3rdシングル「flash」のティザーMVのIDを指定する。

flashは11/13(水)に発売される新曲。先行配信は10/26(土)から始まったのでみんなチェックしような。

CDの方はアーティスト盤のジャケ写がめっちゃかっこいい。ポスター欲しくなる出来。

import requests

from config import API_KEY

URL = 'https://www.googleapis.com/youtube/v3/videos'

part = ['snippet']
ids = ['JTpFWzKGhFU']

payload = {
    'part': ','.join(part),
    'id': ','.join(ids),
    'key': API_KEY,
}

r = requests.get(URL, params=payload)
res = r.json()
snippet = res['items'][0]['snippet']
print(snippet['title'])
print(snippet['publishedAt'])
print(snippet['channelTitle'])
print(snippet['description'])

レスポンスはJSON形式で返ってくるため、requests.models.Response.json()で辞書形式にしている。

JSONの詳細についてはリファレンスのリソース表現を見てもらうとして、itemsフィールドに各動画の情報が格納されている。ここでは動画IDを一つだけ指定しているのでres['items'][0]を参照している。複数の動画IDを指定した場合は指定した順に格納される。

各動画の情報はさらに辞書形式になっている。ここにpartで指定した種類の情報が入っている。ここではsnippetのみなので、res['items'][0]['snippet']を参照している。

sora tob sakana/flash(Teaser)
2019-10-18T15:00:07.000Z
sora tob sakana Official YouTube Channel
【新曲「flash」CD発売に先駆けての先行配信決定】
2019年10月26日(土)より順次配信開始します。
各配信リンク先は追ってお知らせします。

==

2019年11月13日発売3rdシングル「flash」MUSIC VIDEOのティザーVです。

flash
(TVアニメ「ハイスコアガールⅡ」オープニングテーマ)
Lylic/music/arrange:照井順政

ーーMUSIC VIDEO STAFFーー
Director 斉藤友和(epoch)

Producer 須貝日東史(koe Inc.)

Cameraman 柳沼貴幸
Camera Assistant  横山穂高

Lighting Designer 二階堂 譲
Lighting Assistant 高谷英之 堀尾秀樹

Hair&Make(sora tob sakana Member) 横山 藍 
Costume Design/Styling 浅野実希

Choreographer MARIKA

Production Staff 平田樹生 木﨑 竣



=====================================================
sora tob sakana/flash
発売日:2019年11月13日(水)
<アーティスト盤>CD+DVD 1000749884 2,091円+税
=CD=
1.flash
(TVアニメ「ハイスコアガールⅡ」オープニングテーマ)
作詞・作曲・編曲:照井順政
2.パレードがはじまる
作詞・作曲・編曲:照井順政
3.踊り子たち
作詞・作曲・編曲:照井順政

=特典DVD=
「flash」 Music Video

=ジャケット仕様=
16Pブックレット
  ・ライナーノーツ
  ・イラストレーター「ayaka nakamura」「Megumi Fujita」
   による描きおろしのイラスト

<通常盤>CD 1000749885 1,182円+税
=CD=
1.flash
(TVアニメ「ハイスコアガールⅡ」オープニングテーマ)
作詞・作曲・編曲:照井順政

2.flash-TV Size-
3.flash-YMCK Remix- 

=ジャケット仕様= 
アニメ「ハイスコアガールⅡ」描き下ろしイラスト差し替え
ジャケット
8Pブックレット
=====================================================
【公式HP】http://soratobsakana.tokyo
【公式Blog】http://ameblo.jp/soratobsakana/
【公式Twitter】@soratobsakana
【公式Instagram】
  神﨑風花:@fuka_sakana
  寺口夏花:@natsuka_sakana
  山崎 愛:@mana_sakana
【レギュラー番組】
<ラジオ>文化放送「sora tob sakanaの飛ばなきゃ損損」(毎週木曜26時30分~27時)

通常盤にはRemixが入ってる。どっちも買おうな。

descriptionは普段、YouTubeで折り畳まれている部分。今回のようにとても長い場合がある。

動画の統計情報を取得してみる

partstatisticsを指定するだけ。とても簡単。

import pprint

import requests

from config import API_KEY

URL = 'https://www.googleapis.com/youtube/v3/videos'

part = ['statistics']
ids = ['JTpFWzKGhFU']

payload = {
    'part': ','.join(part),
    'id': ','.join(ids),
    'key': API_KEY,
}

r = requests.get(URL, params=payload)
print(type(r))
res = r.json()
stat = res['items'][0]['statistics']
pprint.pprint(stat)

statisticsはフィールドが少ないのでpprintで整形してすべて表示してみた。

{'commentCount': '68',
 'dislikeCount': '4',
 'favoriteCount': '0',
 'likeCount': '625',
 'viewCount': '13296'}

投稿から1週間程度で1万再生以上。いいぞ。

複数の動画を扱う

最後にsora tob sakanaの3つの動画を対象に、複数動画の情報を取得してみる。

import requests

from config import API_KEY

URL = 'https://www.googleapis.com/youtube/v3/videos'

part = ['snippet', 'statistics']
ids = ['JTpFWzKGhFU', 'K_Qx7EE4ucY', 'MyikIWSAEE4']  # flash(Teaser), ささやかな祝祭, knock!knock!

payload = {
    'part': ','.join(part),
    'id': ','.join(ids),
    'key': API_KEY,
}

r = requests.get(URL, params=payload)

res = r.json()

for item, _ in zip(res['items'], ids):
    print('-' * 50)
    print(item['snippet']['title'])
    print(item['snippet']['publishedAt'][:10])
    print(item['statistics'])

ISO 8601(YYYY-MM-DDThh:mm:ss.sZ)形式のpublishedAtを10文字目までスライスしてYYYY-MM-DDにしている。

sora tob sakana/flash(Teaser)
2019-10-18
{'viewCount': '13300', 'likeCount': '625', 'dislikeCount': '4', 'favoriteCount': '0', 'commentCount': '68'}
--------------------------------------------------
sora tob sakana/ささやかな祝祭(Full)
2019-07-06
{'viewCount': '191270', 'likeCount': '3129', 'dislikeCount': '88', 'favoriteCount': '0', 'commentCount': '269'}
--------------------------------------------------
sora tob sakana/knock!knock! (Full)
2019-02-06
{'viewCount': '299740', 'likeCount': '3969', 'dislikeCount': '98', 'favoriteCount': '0', 'commentCount': '434'}

動画情報の格納順はIDを渡した順と一致していることがわかる。

Videosエンドポイントを使って動画の情報を取得する方法がざっくりわかったところで今回はここまで。

次回は特定のチャンネルから動画IDを取ってくる方法を書きたい思っている。