Интеграция YouTube и Drupal: поиск видео через API

Всем привет! Захотелось мне на одном проекте прикрутить автоматический поиск видео на YouTube для каждой страницы сайта. Изначально думал писать парсер, а оказалось, что для этого существует готовое API.

Если кто-либо еще не в курсе, то YouTube является сервисом компании Google. Поэтому не удивительно, что работать с YouTube API придется через аккаунт в Google. API является условно бесплатным: для среднестатистического сайта должно хватить с лихвой.

Короче говоря, если у вас есть необходимость на вашем Drupal проекте получать список видеороликов по заданному поисковому запросу, то этот материал для вас.

Регистрация проекта в Google Developers Console

Прежде всего, вам потребуется зарегистрировать новое приложение – переходим в Google Developers Console. Хочу сразу предупредить, что потребуется SMS подтверждение ваших благих намерений.

Регистрация проекта в Google Developers Console

После этого необходимо подключить YouTube Data API v3, так как по умолчанию оно выключено.

Подключение YouTube Data API v3

Переходим к настройкам приложения. Принцип следующий: вы формируете список IP-адресов, с которых будут отправляться запросы к API, а взамен получаете API Key – именно по нему вы и будете получать доступ. Внимательно просмотрите картинку снизу и делайте по аналогии.

Получение API Key

Несколько противных моментов, связанных с IP-адресами:

  • указать домен вместо его IP-адреса сервера у меня не получилось;
  • да, при работе на локальной машине частенько придется обновлять настройки приложения, если у вас динамический IP-адрес.

Возможно, это лично мое недопонимание Google, но обойти эти моменты я не смог. Если у вас получится – расскажете в комментариях. На обновление настроек и API Key уходит, как правило, несколько минут.

Работа с YouTube Data API v3

Можете себя не утруждать доскональным изучением YouTube Data API v3 – для вас уже написана специальная библиотека, которую вы можете скачать совершенно безвозмездно - Google APIs Client Library for PHP. Это универсальная библиотека для работы со многими сервисами Google.

Однако для улучшения качества поиска видеороликов все же рекомендую ознакомиться с параметрами поиска – Search: list. Это позволит получать более релевантные ответы в результатах запросов.

Интеграция YouTube и Drupal

Первым делом необходимо поместить Google APIs Client Library в папку библиотек Drupal, допустим 'sites/all/libraries/google-api-php-client'. Далее пишем интеграцию с модулем Libraries API:

  1. /**
  2.  * Implements hook_libraries_info().
  3.  */
  4. function MY_MODULE_libraries_info() {
  5. $libraries['google-api-php-client'] = array(
  6. 'name' => 'Google API PHP Client',
  7. 'vendor url' => 'http://code.google.com/p/google-api-php-client/',
  8. 'download url' => 'http://code.google.com/p/google-api-php-client/downloads/list',
  9. 'version' => '0.6.7',
  10. 'path' => 'src',
  11. 'files' => array(
  12. 'php' => array(
  13. 'Google_Client.php',
  14. ),
  15. ),
  16. 'variants' => array(
  17. 'youtube' => array(
  18. 'files' => array(
  19. 'php' => array(
  20. 'Google_Client.php',
  21. 'contrib/Google_YouTubeService.php'
  22. ),
  23. ),
  24. ),
  25. ),
  26. );
  27.  
  28. return $libraries;
  29. }

Сразу можем написать функцию, через которую будет происходить запрос к сервису YouTube:

  1. /**
  2.  * Processes requests to YouTube service.
  3.  *
  4.  * @param $search_key
  5.  * @return array
  6.  */
  7. function MY_MODULE_youtube_parser_request($search_key) {
  8. libraries_load('google-api-php-client', 'youtube');
  9. $api_key = variable_get(YOUTUBE_DEVELOPER_API_KEY_NAME, '');
  10.  
  11. $client = new Google_Client();
  12. $client->setDeveloperKey($api_key);
  13. $youtube = new Google_YoutubeService($client);
  14.  
  15. // Read more: https://developers.google.com/youtube/v3/docs/search/list.
  16. $search_parameters = array(
  17. 'q' => $search_key,
  18. 'maxResults' => 10,
  19. 'type' => 'video',
  20. 'videoDuration' => 'medium',
  21. 'videoEmbeddable' => 'true',
  22. 'videoSyndicated' => 'true',
  23. );
  24.  
  25. try {
  26. $search_response = $youtube->search->listSearch('id,snippet', $search_parameters);
  27. } catch (Google_ServiceException $e) {
  28. $error = $e->getMessage();
  29. watchdog_exception('youtube', $e);
  30. } catch (Google_Exception $e) {
  31. $error = $e->getMessage();
  32. watchdog_exception('youtube', $e);
  33. }
  34.  
  35. if (!empty($error)) {
  36. return array('error' => $error);
  37. }
  38.  
  39. $value = '';
  40. if (!empty($search_response['items'])) {
  41. // Select random video from result.
  42. $rand_id = mt_rand(0, count($search_response['items']) - 1);
  43. $item = $search_response['items'][$rand_id];
  44. $value = $item['id']['videoId'];
  45. }
  46.  
  47. return array('value' => $value);
  48. }

А вот далее наши пути в процессе интеграции могут разойтись, так как все зависит от архитектуры и задач проекта. Приведу последовательность действий для наглядности:

  1. добавить к ноде новое поле, где будет храниться ID видеоролика (именно ID!);
  2. имплементируем hook_node_insert(), в котором получаем у ноды заголовок (или значение какого-либо поля) и передаем его в качестве поискового ключа в функцию для запроса к YouTube;
  3. в папке с темой переопределяем шаблон для поля с ID видео, например field--field_youtube_id.tpl.php, и закидывай туда следующий код (попрошу заметить, что указанный код даже проходит валидацию W3C).
  1. <div class="field-youtube-items"<?php print $content_attributes; ?>>
  2. <?php foreach ($items as $delta => $item): ?>
  3. <div class="field-item <?php print $delta % 2 ? 'odd' : 'even'; ?>"<?php print $item_attributes[$delta]; ?>>
  4. <object type="application/x-shockwave-flash" class="youtube-video" data="http://www.youtube.com/v/<?php print render($item); ?>?version=3&amp;hl=ru_RU">
  5. <param name="movie" value="http://www.youtube.com/v/<?php print render($item); ?>?version=3&amp;hl=ru_RU" />
  6. <param name="allowFullScreen" value="true" />
  7. <param name="allowscriptaccess" value="always" />
  8. </object>
  9. </div>
  10. <?php endforeach; ?>
  11. </div>

Не забудьте только в CSS добавить стили для .youtube-video согласно пропорциям YouTube. Например, у меня было так:

  1. .field-youtube-items .youtube-video {
  2. width: 300px;
  3. height: 169px;
  4. }

Вот такая нехитрая интеграция, которая мне на одном проекте стала существенно экономить время. Полный пример кода модуля выложить не могу, т.к. он слишком специфичен и содержит много лишнего. В случае появления вопросов – обращайтесь!

Комментарии

Аватар пользователя xandeadx
xandeadx

было бы гораздо интереснее, если бы ты написал плагин для views ;)

Аватар пользователя angarsky
angarsky
Нуу-у, мои проекты пока не просят такого :) Была мысль сделать гибкий модуль и поделиться, но потом, поигравшись с поисковыми запросами, понял, что сделать универсальным его не получится. Тут главное - идея, а остальное при желании толковый разработчик и сам допишет
Аватар пользователя alex
alex

слава тебе о Великий Гуру. Только благодаря Вашей статье все получилось)). А то https://console.developers.google.com/project/ не работает, не могу получить ключи.

Аватар пользователя Михаил
Михаил

Хорошая статья. А для 6 есть подобные решения?

Аватар пользователя angarsky
angarsky
Михаил, если есть знания Drupal API и опыт написания модулей, то я уверен, что и к 6ке все это дело получится прикрутить - принцип тот же
Аватар пользователя mamba
mamba

А этот модуль не такое делает?
https://www.drupal.org/project/youtube

Добавить комментарий

 888    888  888    d8P   8888888  888       888 
888 888 888 d8P 888 888 o 888
888 888 888 d8P 888 888 d8b 888
8888888888 888d88K 888 888 d888b 888
888 888 8888888b 888 888d88888b888
888 888 888 Y88b 888 88888P Y88888
888 888 888 Y88b 888 8888P Y8888
888 888 888 Y88b 8888888 888P Y888


Зарегистрируйтесь для добавления материалов без проверки.