Интеграция 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

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

  .d8888b.                        d888   
d88P Y88b d8888
.d88P 888
8888" 888 888 888 888 888
"Y8b. `Y8bd8P' 888 888 888
888 888 X88K 888 888 888
Y88b d88P .d8""8b. Y88b 888 888
"Y8888P" 888 888 "Y88888 8888888
888
Y8b d88P
"Y88P"
Зарегистрируйтесь для добавления материалов без проверки.