Александр Марков
18 июня 2016 г., 22:02

Получение списка видео на youtube по идентификатору плейлиста

В блоге Tips & tricks

На сайте, который я сопровождаю, есть страничка с галереями видео, размещенного на youtube. Изначально я сделал ее с использованием MIGX, но на днях выяснилось, что постоянно добавляются новые видеофайлы. Вариант с ручным добавлением перестал нравиться.
Галереи организованы на youtube в виде плейлистов, и это позволяет строить их на сайте динамически, сразу из youtube.
Здесь хорошо описано, как получить список видеороликов из плейлиста по его идентификатору.
Теперь на сайте достаточно просто хранить массив идентификаторов списков видео, и при пополнении коллекции на youtube это будет автоматически отражаться на сайте. В шаблоне Smarty это может выглядеть так:
{$albums=json_decode($modx->resource->getTVValue('video_gallery'),1)} {* список идентификаторов плейлистов *} {foreach $albums as $album}

{$album.title}

{$params=['list_id'=>$album.list_id]} {processor action='web/youtube/getlist' ns=modxsite params=$params assign=items}
    {foreach $items.object as $item}
  • {$item.title}
  • {/foreach}
{/foreach}
Код процессора:
setDefaultProperties(array( 'list_id' => '', 'limit'=>50, 'cache_life'=>3600 )); return parent::initialize(); } public function process() { # файл, содержащий копию ленты $cache_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . $this->getProperty('list_id') . '.json'; # специальный адрес, отвечающий за выдачу фида $url = 'https://www.googleapis.com/youtube/v3/playlistItems?part=snippet' . '&playlistId=' . $this->getProperty('list_id') . '&maxResults=' . $this->getProperty('limit') . '&key=' . $this->api_key; # если кеш устарел... if (time() - @filemtime($cache_file) >= $this->getProperty('cache_life')) { # ...пытаемся обновить его $buf = file_get_contents($url); # в случае успеха запишем в файл обновлённые данные # проверка на пустоту нужна для того, чтобы не запороть кеш при ошибке if ($buf) file_put_contents($cache_file, $buf); } # если фид получить не удалось... if (empty($buf)) { # ...просто берём содержимое из кеша $buf = file_get_contents($cache_file); } # декодируем JSON данные $json = json_decode($buf, 1); $arr = array(); # если данных нет — на выход if (empty($json['items'])) { return $this->failure('', $arr); } # перебор доступных значений foreach ($json['items'] as $v) { $t = array( 'title' => $v['snippet']['title'], # название 'desc' => $v['snippet']['description'], # описание 'url' => $v['snippet']['resourceId']['videoId'], # адрес ); # изображения if (isset($v['snippet']['thumbnails'])) { $t['imgs']['all'] = array(); foreach ($v['snippet']['thumbnails'] as $name => $item) { $t['imgs']['all'][] = $item['url']; $wh = $item['width'] . 'x' . $item['height']; $t['imgs'][$wh][0] = $item['url']; } } $arr[] = $t; } return $this->success('',$arr); } } return 'modWebYoutubeGetlistProcessor';
Структура возвращаемого списка:
[object] => Array ( [0] => Array ( [title] => Обработка мебельного фасада первым слоем высокоглянцевого лака [desc] => Описание видео [url] => Lx-QWKgVLLg [imgs] => Array ( [all] => Array ( [0] => https://i.ytimg.com/vi/Lx-QWKgVLLg/default.jpg [1] => https://i.ytimg.com/vi/Lx-QWKgVLLg/mqdefault.jpg [2] => https://i.ytimg.com/vi/Lx-QWKgVLLg/hqdefault.jpg ) [120x90] => Array ( [0] => https://i.ytimg.com/vi/Lx-QWKgVLLg/default.jpg ) [320x180] => Array ( [0] => https://i.ytimg.com/vi/Lx-QWKgVLLg/mqdefault.jpg ) [480x360] => Array ( [0] => https://i.ytimg.com/vi/Lx-QWKgVLLg/hqdefault.jpg ) ) ) [1] => Array ( [title] => Покрытие мебельного фасада высокоглянцевой эмалью, второй этап. . . .
Результат можно посмотреть здесь.

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