雑多なブログ

音楽や語学、プログラム関連の話題について書いています

Youtube APIについて

やりたい事はこの通り

Youtube APIを使って、動画を特定のキーワードで検索し、   
動画それぞれの視聴数・like/unlikeの数などを取得したい。

これを実現するには、search/list APIで動画のIDを取得し、個々の動画のlike/dislikeの情報を videos APIで取得する必要があるようだ。

APIについての概要はこちらから。 [:contents]

search API

search APIのレスポンスには、動画のIDやサムネイルの情報などの基本的な情報しか含まれていないため、動画の詳細な情報はvideosAPIにて個別に取得する必要がある。

ドキュメントURL: https://developers.google.com/youtube/v3/docs/search/list

APIエンドポイントURL:

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

レスポンス:

{
  "kind": "youtube#searchListResponse",
  "etag": etag,
  "nextPageToken": string,
  "prevPageToken": string,
  "pageInfo": {
    "totalResults": integer,
    "resultsPerPage": integer
  },
  "items": [
    検索リソース
  ]
}

検索リソースのデータ構造

{
  "kind": "youtube#searchResult",
  "etag": etag,
  "id": {
    "kind": string,
    "videoId": string,
    "channelId": string,
    "playlistId": string
  },
  "snippet": {
    "publishedAt": datetime,
    "channelId": string,
    "title": string,
    "description": string,
    "thumbnails": {
      (key): {
        "url": string,
        "width": unsigned integer,
        "height": unsigned integer
      }
    },
    "channelTitle": string
  }
}

videos API

レスポンスのデータ構造を見たところ、自分が必要としているlike/dislikeの情報が含まれている事が確認できた。

ドキュメントURL:
https://developers.google.com/youtube/v3/docs/videos/list

APIエンドポイントURL:
GET https://www.googleapis.com/youtube/v3/videos

レスポンス:

{
  "kind": "youtube#videoListResponse",
  "etag": etag,
  "nextPageToken": string,
  "prevPageToken": string,
  "pageInfo": {
    "totalResults": integer,
    "resultsPerPage": integer
  },
  "items": [
    動画リソース
  ]
}

動画リソースのデータ構造

{
  "kind": "youtube#video",
  "etag": etag,
  "id": string,
  "snippet": {
    "publishedAt": datetime,
    "channelId": string,
    "title": string,
    "description": string,
    "thumbnails": {
      (key): {
        "url": string,
        "width": unsigned integer,
        "height": unsigned integer
      }
    },
    "channelTitle": string,
    "tags": [
      string
    ],
    "categoryId": string
  },
  "contentDetails": {
    "duration": string,
    "dimension": string,
    "definition": string,
    "caption": string,
    "licensedContent": boolean,
    "regionRestriction": {
      "allowed": [
        string
      ],
      "blocked": [
        string
      ]
    },
    "contentRating": {
      "mpaaRating": string,
      "tvpgRating": string,
      "bbfcRating": string,
      "chvrsRating": string,
      "eirinRating": string,
      "cbfcRating": string,
      "fmocRating": string,
      "icaaRating": string,
      "acbRating": string,
      "oflcRating": string,
      "fskRating": string,
      "kmrbRating": string,
      "djctqRating": string,
      "russiaRating": string,
      "rtcRating": string,
      "ytRating": string
    }
  },
  "status": {
    "uploadStatus": string,
    "failureReason": string,
    "rejectionReason": string,
    "privacyStatus": string,
    "license": string,
    "embeddable": boolean,
    "publicStatsViewable": boolean
  },
  "statistics": {
    "viewCount": unsigned long,
    "likeCount": unsigned long,
    "dislikeCount": unsigned long,
    "favoriteCount": unsigned long,
    "commentCount": unsigned long
  },
  "player": {
    "embedHtml": string
  },
  "topicDetails": {
    "topicIds": [
      string
    ],
    "relevantTopicIds": [
      string
    ]
  },
  "recordingDetails": {
    "locationDescription": string,
    "location": {
      "latitude": double,
      "longitude": double,
      "altitude": double
    },
    "recordingDate": datetime
  },
  "fileDetails": {
    "fileName": string,
    "fileSize": unsigned long,
    "fileType": string,
    "container": string,
    "videoStreams": [
      {
        "widthPixels": unsigned integer,
        "heightPixels": unsigned integer,
        "frameRateFps": double,
        "aspectRatio": double,
        "codec": string,
        "bitrateBps": unsigned long,
        "rotation": string,
        "vendor": string
      }
    ],
    "audioStreams": [
      {
        "channelCount": unsigned integer,
        "codec": string,
        "bitrateBps": unsigned long,
        "vendor": string
      }
    ],
    "durationMs": unsigned long,
    "bitrateBps": unsigned long,
    "recordingLocation": {
      "latitude": double,
      "longitude": double,
      "altitude": double
    },
    "creationTime": string
  },
  "processingDetails": {
    "processingStatus": string,
    "processingProgress": {
      "partsTotal": unsigned long,
      "partsProcessed": unsigned long,
      "timeLeftMs": unsigned long
    },
    "processingFailureReason": string,
    "fileDetailsAvailability": string,
    "processingIssuesAvailability": string,
    "tagSuggestionsAvailability": string,
    "editorSuggestionsAvailability": string,
    "thumbnailsAvailability": string
  },
  "suggestions": {
    "processingErrors": [
      string
    ],
    "processingWarnings": [
      string
    ],
    "processingHints": [
      string
    ],
    "tagSuggestions": [
      {
        "tag": string,
        "categoryRestricts": [
          string
        ]
      }
    ],
    "editorSuggestions": [
      string
    ]
  }
}

とりあえず、概要調べて力尽きたので、今度はAPIを実際にリクエストするところまではやってみたい・・・・