Может показаться, что search
API - это хорошая идея для извлечения всех видео за один цикл, но, видимо, нет.Если на канале есть тысячи (более 1600) видео, search
не вернет их все: несколько страниц с последними результатами будут пустыми, число результатов будет неправильным, а количество данных страниц будет около 20 страниц..
Итак, если вам нужно получить все идентификаторы через API, то лучше сначала использовать channels
API для получения идентификатора "загружаемых" списков воспроизведения, а затем использовать его в playlistItems
API для получениявсе видео.
URL первого запроса будет выглядеть следующим образом (конечно, с использованием https://www.googleapis.com/youtube/v3/ в начале):
channels?part=contentDetails&id=CHANNEL_ID&key=YOUR_TOKEN
Результат:
{
"kind": "youtube#channelListResponse",
"etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/Nza6t_W5qltBCnHIHKgNiSRu0bE\"",
"pageInfo": {
"totalResults": 1,
"resultsPerPage": 1
},
"items": [
{
"kind": "youtube#channel",
"etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/95y8HKrtWV3t4apHu0KjgoaNbc0\"",
"id": "UC9-y-6csu5WGm29I7JiwpnA",
"contentDetails": {
"relatedPlaylists": {
"likes": "LL9-y-6csu5WGm29I7JiwpnA",
"favorites": "FL9-y-6csu5WGm29I7JiwpnA",
"uploads": "UU9-y-6csu5WGm29I7JiwpnA",
"watchHistory": "HL",
"watchLater": "WL"
}
}
}
]
}
Или, если вам не нужны тонны байтов, используйте поля фильтра, например:
channels?fields=items(contentDetails(relatedPlaylists(uploads)))&part=contentDetails&id=CHANNEL_ID&key=YOUR_TOKEN
Отфильтрованный результат:
{
"items": [
{
"contentDetails": {
"relatedPlaylists": {
"uploads": "UU9-y-6csu5WGm29I7JiwpnA"
}
}
}
]
}
Следующий шаг - получить список всех страниц сvideos:
playlistItems?maxResults=50&playlistId=PLAYLIST_ID&part=snippet&key=YOUR_TOKEN
Результат (сокращен на 1-й результат массива в ключе items
):
{
"kind": "youtube#playlistItemListResponse",
"etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/GmoHN7IVzBjFEtB0547SRegTL9c\"",
"nextPageToken": "CDIQAA",
"pageInfo": {
"totalResults": 399,
"resultsPerPage": 50
},
"items": [
{
"kind": "youtube#playlistItem",
"etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/5gxLp2iP0FwcZQWb98LCOGu0TfA\"",
"id": "VVU5LXktNmNzdTVXR20yOUk3Sml3cG5BLjlua3RyMU1nUy1B",
"snippet": {
"publishedAt": "2017-08-03T11:27:38.000Z",
"channelId": "UC9-y-6csu5WGm29I7JiwpnA",
"title": "Stop Button Solution? - Computerphile",
"description": "After seemingly insurmountable issues with Artificial General Intelligence, Rob Miles takes a look at a promising solution.\n\nConcrete Problems in AI Safety: blah blah blah blah blah blah blah blah blah",
"thumbnails": {
"default": {
"url": "https://i.ytimg.com/vi/9nktr1MgS-A/default.jpg",
"width": 120,
"height": 90
},
"medium": {
"url": "https://i.ytimg.com/vi/9nktr1MgS-A/mqdefault.jpg",
"width": 320,
"height": 180
},
"high": {
"url": "https://i.ytimg.com/vi/9nktr1MgS-A/hqdefault.jpg",
"width": 480,
"height": 360
},
"standard": {
"url": "https://i.ytimg.com/vi/9nktr1MgS-A/sddefault.jpg",
"width": 640,
"height": 480
},
"maxres": {
"url": "https://i.ytimg.com/vi/9nktr1MgS-A/maxresdefault.jpg",
"width": 1280,
"height": 720
}
},
"channelTitle": "Computerphile",
"playlistId": "UU9-y-6csu5WGm29I7JiwpnA",
"position": 0,
"resourceId": {
"kind": "youtube#video",
"videoId": "9nktr1MgS-A"
}
}
},
{
...
}
]
}
Или отфильтрованный, чтобы получить только идентификаторы видео (и следующей страницытокены):
playlistItems?fields=nextPageToken,items(snippet(resourceId(videoId)))&maxResults=50&playlistId=PLAYLIST_ID&part=snippet&key=YOUR_TOKEN
Результат:
{
"nextPageToken": "CDIQAA",
"items": [
{
"snippet": {
"resourceId": {
"videoId": "9nktr1MgS-A"
}
}
}
]
}
Вы можете получить следующие страницы, используя значение ключа nextPageToken
, добавив его to Получить параметры с помощью клавиши pageToken
:
(я взял токен из приведенного выше результата, например, он может отличаться для вашего запроса)
playlistItems?fields=nextPageToken,items(snippet(resourceId(videoId)))&maxResults=50&part=snippet&playlistId=PLAYLIST_ID&key=YOUR_TOKEN&pageToken=CDIQAA
На последней странице не будет клавиши nextPageToken
.