Интеграция 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    d8P   888                    d8b 
888 d8P 888 Y8P
888 d8P 888
888d88K 88888b. 888 888 8888
8888888b 888 "88b 888 888 "888
888 Y88b 888 888 888 888 888
888 Y88b 888 d88P Y88b 888 888
888 Y88b 88888P" "Y88888 888
888
d88P
888P"
Зарегистрируйтесь для добавления материалов без проверки.