全力回避フラグちゃん!の動画情報を取得してみよう(Videos リソース)

# はじめに


今まで書いた記事はこちら↓↓
- [「全力回避フラグちゃん!」チャンネルの動画をグラフ化するとどうなるのか？【Python】【グラフ化】](https://qiita.com/mypsychology0/items/7f5dace26c4c375754e5)
- [全力回避フラグちゃん! の動画再生数の分布を調べてみた【Python】【グラフ化】](https://qiita.com/mypsychology0/items/1844f675717025970325)
- [全力回避フラグちゃん!の動画の再生数と評価/コメント数をグラフにしたらどうなるのか？【Python】【グラフ化】](https://qiita.com/mypsychology0/items/409e0597509e568b60aa)
- [全力回避フラグちゃん!で少しわかるYouTube Data API Channels リソースから取得できる主な情報](https://qiita.com/mypsychology0/items/f161fef45ee6a02ef9fa)
- [全力回避フラグちゃん!のチャンネルの人気は本当にほぼフラグちゃんで成り立っているのか？【検証】【可視化】](https://qiita.com/mypsychology0/items/cc2fee15657c50d8b694)
- [全力回避フラグちゃん!の動画を再生回数と高評価でスコアリングしてランキング化してみた【正規化】【ランキング】](https://qiita.com/mypsychology0/items/1807b08ffc89fa3c45cf)


## 注意事項
2021/1/22 18:30時点で取得した情報を利用しています．
データ取得や処理，グラフプロットといった一連のプログラムは，関連リンクのGitHub から参照してください．ここでは，おまけとしてそこにアップロードしていない暫定的なプログラムを載せます．

# 動画再生時間の取得方法

YouTube Data API のVideos リソースを使用し，2021/1/22 18:30時点において，全力回避フラグちゃん! のチャンネルにアップロードされている動画の再生回数と再生時間を取得して，可視化します．

```terminal:VideosリソースのURL
https://www.googleapis.com/youtube/v3/videos
```

このURL に対して，引数として以下の3つのパラメーターを指定します．

|パラメーター名  |値 | 説明 |
|:-:|:-:|:------------------------:|
| id | 1I4yBjCFh8M | 情報を取得したい動画のID です．例として，ストーリー編第6話のID を載せました．|
| part | snippet,contentDetails,status,statistics,<br>player,topicDetails,player,recordingDetails | どういった情報が取得したいかを指定します．今回は，動画の非所有者が取得できる情報すべてを取得するように指定しています|
| key | api key | API にアクセスするためのキーの値です |


API のアクセスには，cURL，もしくは関連リンクにある公式ドキュメントのサンプルプログラムを利用してください．
手っ取り早く実行するなら，cURL はお勧めです．

2021/1/22 18:30 時点で実際に取得した情報は以下の通りです．

```json:Videosリソースから取得した情報(ストーリー編第6話)
{
  "kind": "youtube#videoListResponse",
  "etag": "iJAVQvOuv_uFrPX-Wm0qfmYJlZs",
  "items": [
    {
      "kind": "youtube#video",
      "etag": "AyBmTveSlOpThJ58L-Q36Ps0AOs",
      "id": "1I4yBjCFh8M",
      "snippet": {
        "publishedAt": "2021-01-16T09:00:11Z",
        "channelId": "UCo_nZN5yB0rmfoPBVjYRMmw",
        "title": "【ストーリー編】第6話「最高のオモチャ」【アニメ】【漫画動画】",
        "description": "今までのストーリー編はこちら→https://youtube.com/playlist?list=PLnN2g2346RAXJzpPY4A2-LUUdCYn64X9P\n\n立ちました❗️\n死亡フラグです🚩\n\n今日の動画は\n【ストーリー編第6話】です✨💘\n\nそういえば恋愛フラグさんは\nどうして私たちと一緒に\n修行を始めたんでしょう…？🤔\n\n「全力回避フラグちゃん！」ラバーストラップ発売開始！！！\nお買い求めはこちら→→ https://plott.store/\nチャンネル登録、高評価よろしくお願いします！\nhttps://www.youtube.com/channel/UCo_nZN5yB0rmfoPBVjYRMmw?sub_confirm=1\nフラグちゃんLINEスタンプ発売中です！\nhttps://store.line.me/stickershop/product/12763172\nツイッターもフォローしてくれると嬉しいです！\nhttps://twitter.com/flag__chan\nファンアートなどは# フラグちゃんでツイートしてくださいね！\n◆お問い合わせやお仕事の依頼はこちら\nflagchan@plott.tokyo\n\n\n原作：biki\nhttps://twitter.com/biki_relic\n企画・製作：株式会社Plott\n\n【使用している音楽素材など】\naudiostock https://audiostock.jp/\nhttp://www.music-note.jp/index.html\nhttps://taira-komori.jpn.org/human01.html\nhttps://soundeffect-lab.info/sound/anime/",
        "thumbnails": {
          "default": {
            "url": "https://i.ytimg.com/vi/1I4yBjCFh8M/default.jpg",
            "width": 120,
            "height": 90
          },
          "medium": {
            "url": "https://i.ytimg.com/vi/1I4yBjCFh8M/mqdefault.jpg",
            "width": 320,
            "height": 180
          },
          "high": {
            "url": "https://i.ytimg.com/vi/1I4yBjCFh8M/hqdefault.jpg",
            "width": 480,
            "height": 360
          },
          "standard": {
            "url": "https://i.ytimg.com/vi/1I4yBjCFh8M/sddefault.jpg",
            "width": 640,
            "height": 480
          },
          "maxres": {
            "url": "https://i.ytimg.com/vi/1I4yBjCFh8M/maxresdefault.jpg",
            "width": 1280,
            "height": 720
          }
        },
        "channelTitle": "全力回避フラグちゃん!",
        "tags": [
          "全力回避フラグちゃん",
          "フラグちゃん",
          "アニメ",
          "漫画",
          "マンガ",
          "まんが",
          "漫画動画",
          "マンガ動画"
        ],
        "categoryId": "1",
        "liveBroadcastContent": "none",
        "localized": {
          "title": "【ストーリー編】第6話「最高のオモチャ」【アニメ】【漫画動画】",
          "description": "今までのストーリー編はこちら→https://youtube.com/playlist?list=PLnN2g2346RAXJzpPY4A2-LUUdCYn64X9P\n\n立ちました❗️\n死亡フラグです🚩\n\n今日の動画は\n【ストーリー編第6話】です✨💘\n\nそういえば恋愛フラグさんは\nどうして私たちと一緒に\n修行を始めたんでしょう…？🤔\n\n「全力回避フラグちゃん！」ラバーストラップ発売開始！！！\nお買い求めはこちら→→ https://plott.store/\nチャンネル登録、高評価よろしくお願いします！\nhttps://www.youtube.com/channel/UCo_nZN5yB0rmfoPBVjYRMmw?sub_confirm=1\nフラグちゃんLINEスタンプ発売中です！\nhttps://store.line.me/stickershop/product/12763172\nツイッターもフォローしてくれると嬉しいです！\nhttps://twitter.com/flag__chan\nファンアートなどは# フラグちゃんでツイートしてくださいね！\n◆お問い合わせやお仕事の依頼はこちら\nflagchan@plott.tokyo\n\n\n原作：biki\nhttps://twitter.com/biki_relic\n企画・製作：株式会社Plott\n\n【使用している音楽素材など】\naudiostock https://audiostock.jp/\nhttp://www.music-note.jp/index.html\nhttps://taira-komori.jpn.org/human01.html\nhttps://soundeffect-lab.info/sound/anime/"
        },
        "defaultAudioLanguage": "ja"
      },
      "contentDetails": {
        "duration": "PT9M28S",
        "dimension": "2d",
        "definition": "hd",
        "caption": "false",
        "licensedContent": true,
        "contentRating": {},
        "projection": "rectangular"
      },
      "status": {
        "uploadStatus": "processed",
        "privacyStatus": "public",
        "license": "youtube",
        "embeddable": true,
        "publicStatsViewable": true,
        "madeForKids": false
      },
      "statistics": {
        "viewCount": "325653",
        "likeCount": "7316",
        "dislikeCount": "129",
        "favoriteCount": "0",
        "commentCount": "1608"
      },
      "player": {
        "embedHtml": "\u003ciframe width=\"480\" height=\"270\" src=\"//www.youtube.com/embed/1I4yBjCFh8M\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen\u003e\u003c/iframe\u003e"
      },
      "topicDetails": {
        "relevantTopicIds": [
          "/m/02jjt",
          "/m/02vxn",
          "/m/02jjt",
          "/m/02vxn"
        ],
        "topicCategories": [
          "https://en.wikipedia.org/wiki/Entertainment",
          "https://en.wikipedia.org/wiki/Film"
        ]
      },
      "recordingDetails": {}
    }
  ],
  "pageInfo": {
    "totalResults": 1,
    "resultsPerPage": 1
  }
}
```

とりあえず必要か不要かは取得後に判断して処理するため，取れる情報をすべて取ってきています．
そのため，使わない情報もいくつか混じっているので，中身を見ていき取捨選択します．

## 主な情報抜粋一覧

上記の情報が取得できるので，ここから必要な情報を抽出して，Excel やPython などで使いやすくするため，csv などにしておきましょう．今回は，動画ID をキーに再生回数と再生時間の情報を持ったcsv へと出力します．上記の結果に対して，以下のコマンドを実行すれば，csv へと出力できます．

```terminal:動画ID,再生回数，再生時間をCSV形式で出力
jq -r '.items[] | [.id, .statistics.viewCount, .contentDetails.duration] | @csv'
```

以下が，その出力結果(頭尾のみの抜粋)です．

```terminal:動画ID,再生回数，再生時間
"5tPE8hZEEDM","681471","PT5M26S"
"I8heFOsZJW4","714488","PT4M2S"
"pgYM_6VKA54","614186","PT4M54S"
...省略...
"1I4yBjCFh8M","325653","PT9M28S"
"hgm6ZHQJTZM","381890","PT8M1S"
"bU1r_z-NzLQ","387810","PT8M12S"
"RbLQRNMvTFU","7768","PT5M59S"
```

ここで問題となるのが再生時間です．少し特殊な形で取得できるので，Excel は問題なかったのですが，Python で扱うには特殊な処理が必要でした．以下のようにして，上記の値を「hh: mm: ss」の表記に変換します．

```py:時刻表記の変換
#Date, 再生時間
num_time = pd.read_csv(file, header=None, encoding='UTF8', usecols=[0, 2])
num_time = num_time.dropna(how='all')

y9 = []

for i in range(len(x)):
    try:
        dt = datetime.datetime.strptime(num_time[num_time.columns[1]][i], "PT%MM%SS")
    except ValueError:
        dt = datetime.datetime.strptime(num_time[num_time.columns[1]][i], "PT%MM")
    
    y9.append(dt.time())
```

上記のコードを実行すると，以下のような形として時刻情報を保持することができます．

```terminal:変換後の時刻情報
00:05:26
00:04:02
00:04:54
...省略...
00:09:28
00:08:01
00:08:12
00:05:59
```

これで，Python でもプロットできる形になったと思います．
以下が，実際に再生回数と動画の再生時間ですべての動画を動画公開日を横軸にとってプロットした結果です．

![viewCount-videoTime_20210122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/989429/55b4c4e3-8b29-8db1-f637-175ac55e6070.png)

左の縦軸が，動画再生回数，右の縦軸が動画の再生時間で，「hh: mm :ss」で表記しています．(00の場合は省略されている)
ざっと見てみると，前半部分よりも後半部分の方が動画の再生時間が大きくなっていそうです．
また，高評価とは異なり，再生回数が大きいからと言って再生時間が大きくなるわけではなさそう．

以下は，縦軸に再生回数，横軸に再生時間をとった散布図です．(これはExcel で出力しました)

![flag_viewcount_videotime.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/989429/568c7581-1e60-9de2-a225-9a770d4d633a.png)

Excel で引いた近似の直線的には，再生時間が伸びると再生回数も伸びる感じにはなっていますが，再生時間を大きくしてもそこに大きく依存するほど再生回数が伸びるわけではなさそうです．

[全力回避フラグちゃん!のデータの散布図からわかること](https://flag-analysis.hatenablog.com/entry/2021/01/22/213416) で書きましたが，可視化してみると5分帯の長さの動画が一番多く，きっとその長さくらいが作りやすい動画時間かと思います．
その長さの動画でも150万から200万再生に達している動画もあるので，今後も作りやすい動画の長さで面白い動画を作っていただけたらと思います．

# 簡単なまとめ
- YouTube Data API のVideos リソースから動画の再生回数と再生時間を取得する方法を書いた
- API から取得した再生時間をPython で扱える形に変換する方法について書いた
- 動画の再生回数と再生時間には相関はありそう

# 今後の予定
他にも気になることがあったら，記事を作成していきます．

# おわりに

ここまで読んでいる人はいないと思いますが，もしいたらまずは，以下のリンクから<b>全力回避フラグちゃん!</b> チャンネルとフラグちゃんのTwitter をフォローしてください．この記事を読むより大切なことです．
大事なことなのでもう一度，<b>チャンネル登録</b>と<b>Twitter のフォロー</b>をよろしくお願いいたします．

# 関連リンク
- YouTube Data API Videos  https://developers.google.com/youtube/v3/docs/videos?hl=ja
- 全力回避フラグちゃん! https://www.youtube.com/channel/UCo_nZN5yB0rmfoPBVjYRMmw/videos
- 株式会社Plott / Plott Inc. https://plott.tokyo/#top
- フラグちゃんのTwitter https://twitter.com/flag__chan
- Github  https://github.com/uky007/flag_analysis