Интеграция YouTube и Drupal: поиск видео через API
Всем привет! Захотелось мне на одном проекте прикрутить автоматический поиск видео на YouTube для каждой страницы сайта. Изначально думал писать парсер, а оказалось, что для этого существует готовое API.
Если кто-либо еще не в курсе, то YouTube является сервисом компании Google. Поэтому не удивительно, что работать с YouTube API придется через аккаунт в Google. API является условно бесплатным: для среднестатистического сайта должно хватить с лихвой.
Короче говоря, если у вас есть необходимость на вашем Drupal проекте получать список видеороликов по заданному поисковому запросу, то этот материал для вас.
Регистрация проекта в Google Developers Console
Прежде всего, вам потребуется зарегистрировать новое приложение – переходим в Google Developers Console. Хочу сразу предупредить, что потребуется SMS подтверждение ваших благих намерений.
После этого необходимо подключить YouTube Data API v3, так как по умолчанию оно выключено.
Переходим к настройкам приложения. Принцип следующий: вы формируете список IP-адресов, с которых будут отправляться запросы к API, а взамен получаете 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, допустим
. Далее пишем интеграцию с модулем Libraries API:'sites/all/libraries/google-api-php-client'
- /**
- * Implements hook_libraries_info().
- */
- function MY_MODULE_libraries_info() {
- $libraries['google-api-php-client'] = array(
- 'name' => 'Google API PHP Client',
- 'vendor url' => 'http://code.google.com/p/google-api-php-client/',
- 'download url' => 'http://code.google.com/p/google-api-php-client/downloads/list',
- 'version' => '0.6.7',
- 'path' => 'src',
- 'files' => array(
- 'php' => array(
- 'Google_Client.php',
- ),
- ),
- 'variants' => array(
- 'youtube' => array(
- 'files' => array(
- 'php' => array(
- 'Google_Client.php',
- 'contrib/Google_YouTubeService.php'
- ),
- ),
- ),
- ),
- );
-
- return $libraries;
- }
Сразу можем написать функцию, через которую будет происходить запрос к сервису YouTube:
- /**
- * Processes requests to YouTube service.
- *
- * @param $search_key
- * @return array
- */
- function MY_MODULE_youtube_parser_request($search_key) {
- libraries_load('google-api-php-client', 'youtube');
- $api_key = variable_get(YOUTUBE_DEVELOPER_API_KEY_NAME, '');
-
- $client = new Google_Client();
- $client->setDeveloperKey($api_key);
- $youtube = new Google_YoutubeService($client);
-
- // Read more: https://developers.google.com/youtube/v3/docs/search/list.
- $search_parameters = array(
- 'q' => $search_key,
- 'maxResults' => 10,
- 'type' => 'video',
- 'videoDuration' => 'medium',
- 'videoEmbeddable' => 'true',
- 'videoSyndicated' => 'true',
- );
-
- try {
- $search_response = $youtube->search->listSearch('id,snippet', $search_parameters);
- } catch (Google_ServiceException $e) {
- $error = $e->getMessage();
- watchdog_exception('youtube', $e);
- } catch (Google_Exception $e) {
- $error = $e->getMessage();
- watchdog_exception('youtube', $e);
- }
-
- if (!empty($error)) {
- return array('error' => $error);
- }
-
- $value = '';
- if (!empty($search_response['items'])) {
- // Select random video from result.
- $rand_id = mt_rand(0, count($search_response['items']) - 1);
- $item = $search_response['items'][$rand_id];
- $value = $item['id']['videoId'];
- }
-
- return array('value' => $value);
- }
А вот далее наши пути в процессе интеграции могут разойтись, так как все зависит от архитектуры и задач проекта. Приведу последовательность действий для наглядности:
- добавить к ноде новое поле, где будет храниться ID видеоролика (именно ID!);
- имплементируем
, в котором получаем у ноды заголовок (или значение какого-либо поля) и передаем его в качестве поискового ключа в функцию для запроса к YouTube;hook_node_insert()
- в папке с темой переопределяем шаблон для поля с ID видео, например
, и закидывай туда следующий код (попрошу заметить, что указанный код даже проходит валидацию W3C).field--field_youtube_id.tpl.php
- <div class="field-youtube-items"<?php print $content_attributes; ?>>
- <?php foreach ($items as $delta => $item): ?>
- <div class="field-item <?php print $delta % 2 ? 'odd' : 'even'; ?>"<?php print $item_attributes[$delta]; ?>>
- <object type="application/x-shockwave-flash" class="youtube-video" data="http://www.youtube.com/v/<?php print render($item); ?>?version=3&hl=ru_RU">
- <param name="movie" value="http://www.youtube.com/v/<?php print render($item); ?>?version=3&hl=ru_RU" />
- <param name="allowFullScreen" value="true" />
- <param name="allowscriptaccess" value="always" />
- </object>
- </div>
- <?php endforeach; ?>
- </div>
Не забудьте только в CSS добавить стили для
согласно пропорциям YouTube. Например, у меня было так:.youtube-video
- .field-youtube-items .youtube-video {
- width: 300px;
- height: 169px;
- }
Вот такая нехитрая интеграция, которая мне на одном проекте стала существенно экономить время. Полный пример кода модуля выложить не могу, т.к. он слишком специфичен и содержит много лишнего. В случае появления вопросов – обращайтесь!
Комментарии
было бы гораздо интереснее, если бы ты написал плагин для views ;)
слава тебе о Великий Гуру. Только благодаря Вашей статье все получилось)). А то https://console.developers.google.com/project/ не работает, не могу получить ключи.
Хорошая статья. А для 6 есть подобные решения?
А этот модуль не такое делает?
https://www.drupal.org/project/youtube
Добавить комментарий