Импорт видео с YouTube-канала в Drupal используя API v3

Опубликовано admin - вт, 04/21/2015 - 13:48

В YouTube API v3 нельзя ничего сделать без API key.
Чтобы его получить идем: https://console.developers.google.com/project
Создаем проект → APIs & auth → Credentials → Create New Key → Browser key
Если хотим чтобы API был доступен с любого хоста, то в Referers не пишем ничего.
Ждем какое-то время, ключ почему-то доступен не сразу. Так же как и изменения Referers применяются спустя какое-то время.

Затем нужно получить ID плейлиста загрузок канала. Для этого идем по ссылке:

https://www.googleapis.com/youtube/v3/channels?part=contentDetails&forUsername={CHANNEL_NAME}&key={YOUR_API_KEY}

Пример ответа:

{
"kind": "youtube#channelListResponse",
"etag": "\"IHLB7Mi__JPvvG2zLQWAg8l36UU/zeYzclTG4ewfhDNkxg0gBgbw6tk\"",
"pageInfo": {
  "totalResults": 1,
  "resultsPerPage": 5
},
"items": [
  {
   "kind": "youtube#channel",
   "etag": "\"IHLB7Mi__JPvvG2zLQWAg8l36UU/HO4agMuJTzvaU0t8LvtyE0nJpnY\"",
   "id": "UCJsxAwkchPTO4YM2deDfr4w",
   "contentDetails": {
    "relatedPlaylists": {
     "likes": "LLJsxAwkchPTO4YM2deDfr4w",
     "uploads": "UUJsxAwkchPTO4YM2deDfr4w"
    },
    "googlePlusUserId": "112412220286703121282"
   }
  }
]
}

Отсюда нам нужен uploads ID, с помощью него формируем ссылку по которой будем получать обновления на канале:

https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=5&playlistId={UPLOADS_ID}&key={YOUR_API_KEY}

Сокращенный пример ответа:

{
 "kind": "youtube#playlistItemListResponse",
 "etag": "\"IHLB7Mi__JPvvG2zLQWAg8l36UU/FPLhRfv98p__33rDj1UgDybUcQ0\"",
 "nextPageToken": "CAUQAA",
 "pageInfo": {
  "totalResults": 387,
  "resultsPerPage": 5
 },
 "items": [
  {
   "kind": "youtube#playlistItem",
   "etag": "\"IHLB7Mi__JPvvG2zLQWAg8l36UU/vz8KJuQDO4mV5G3hgGklpF_6a1c\"",
   "id": "UULpaWFN44Q6UNl9w3kIwSYcUYbwXB3_Es",
   "snippet": {
    "publishedAt": "2015-04-15T09:00:42.000Z",
    "channelId": "UCJsxAwkchPTO4YM2deDfr4w",
    "title": "Retrain Your Brain | Fender Strat Plus 1995 USA | SKIFMUSIC",
    "description": "Полное описание видео",
    "thumbnails": {
     "default": {
      "url": "https://i.ytimg.com/vi/CpCnwByDKpg/default.jpg",
      "width": 120,
      "height": 90
     },
     "medium": {
      "url": "https://i.ytimg.com/vi/CpCnwByDKpg/mqdefault.jpg",
      "width": 320,
      "height": 180
     },
     "high": {
      "url": "https://i.ytimg.com/vi/CpCnwByDKpg/hqdefault.jpg",
      "width": 480,
      "height": 360
     },
     "standard": {
      "url": "https://i.ytimg.com/vi/CpCnwByDKpg/sddefault.jpg",
      "width": 640,
      "height": 480
     },
     "maxres": {
      "url": "https://i.ytimg.com/vi/CpCnwByDKpg/maxresdefault.jpg",
      "width": 1280,
      "height": 720
     }
    },
    "channelTitle": "SKIFMUSIC",
    "playlistId": "UUJsxAwkchPTO4YM2deDfr4w",
    "position": 0,
    "resourceId": {
     "kind": "youtube#video",
     "videoId": "CpCnwByDKpg"
    }
   }
  },
...
 ]
}

На этом работа с API заканчивается.

Создаем новый тип материала, например Видео: YouTube


Устанавливаем модули FeedsFeeds JSONPath Parser и Feeds Tamper (по желанию для возможности фильтровать видео по ключевым словам и т.д.).

Идем по адресу /admin/structure/feeds и добавляем новый Importer.

Базовые настройки на скриншоте:

Сборщик → HTTP Fetcher
Обработчик → JSONPath parser
Процессор → Node processor

Затем идем в настройки JSONPath parser:
Контекст: $.items.*
title: snippet.title
body: snippet.description
created: snippet.publishedAt
field_thumbnail: snippet.thumbnails.high.url
field_video_id: snippet.resourceId.videoId
guid: snippet.resourceId.videoId

Сохраняем, идем по адресу /import и видим там наш импортер. Запускаем его не забывая указать в URL ссылку с &playlistId={UPLOADS_ID}&key={YOUR_API_KEY}

YouTube API v3 в этом запросе почему-то не хочет отдавать полный URL видео, поэтому можно его получить с помощью Feeds Tamper и плагина sprintf:
Tamper → field_video_id → Add plugin → Строка формата →

http://www.youtube.com/watch?v=%s


Для того чтобы вывести ID как embed-видео можно использовать модуль Custom Formatters.
Пример php-форматера для поля типа text:

$youtube_id = $variables['#items'][0]['value'];

$out  = '<iframe width="560" height="315" src="https://www.youtube.com/embed/' . $youtube_id . '" frameborder="0" allowfullscreen></iframe>';

return $out;

Еще пригодятся:
http://jsonlint.com — JSON Validator, его же можно использовать для приведения JSON в читаемый вид,
http://jsonpath.curiousconcept.com — JSONPath Expression Tester.

Яндекс.Метрика