Пятница , 20 Январь 2017
Конкурс «Книга за вопрос»
ДомойПубликацииКак получить содержимое плейлиста с youtube?

Как получить содержимое плейлиста с youtube?

Доброго дня, друзья!

Сегодня мы научимся парсить плейлисты youtube. Если для кого-то это звучит дико, не волнуйтесь; во всём обязательно разберёмся.

Будет код функции, которая берёт на себя всю работу по получению содержимого фида. Разбираться в ней совершенно не обязательно. Но если желание возникнет, комментации, я надеюсь, в этом помогут. И, конечно же, будет пример использования. Поехали!

Получение содержимого фида на PHP

 
Внимание! Данная статья устарела. Для получения содержимого фидов нужно использовать YouTube Data API. Новая реализация функции находится здесь.
 

Функция getYoutubePlaylistDataXml() может принимать 3 параметра, из которых обязательный только первый — идентификатор плейлиста.

Второй параметр задаёт количество видео, которые хотелось бы получить. Верхний предел ограничен числом, которое возвращает фид.

Третий параметр — время кеширования предыдущего ответа до очередного запроса на youtube, в секундах. Вы можете задать этому параметру нулевое значение, но в таком случае запрос будет совершаться каждый раз. Плюс такого подхода — изменения в фиде мгновенно отразятся и на странице (вы же туда выводите получаемую информацию, верно?). Из минусов:

  1. Избыточное число совершаемых запросов, что может быть критично для виртуального хостинга;
  2. Если ваш сайт достаточно посещаемый, то в секунду будет генерироваться несколько запросов на сервера youtube. Нужно ли предупреждать, что это чревато баном IP?

Файл кеша создаётся в том же месте, откуда вызвана функция. Вы можете установить своё значение, заменив код dirname(__FILE__) . DIRECTORY_SEPARATOR на полный путь к директории, в которой должны храниться файлы; желательно указывать абсолютный путь, например: ‘/var/www/users/username/domain.my/caches/’ (указывайте путь к своей папке на сервере, это лишь пример!).

Если вы решите разобраться в коде, вам придётся познакомиться с классом для работы с xml файлами — SimpleXMLElement() и «въехать» в манипуляции с элементами $xml и $item.

<?php
/**
* Получить список последних видео заданного плейлиста
*
* @param string $ytlist идентификатор плейлиста
* @param int $cnt по сколько позиций обрабатывать (не всегда нужно содержимое всего плейлиста)
* @param int $cache_life время жизни кеша в секундах (чтобы не получить бан IP за рилтайм запросы)
* @return array список найденных видео, не более $cnt штук
*/
function getYoutubePlaylistDataXml($ytlist$cnt 5$cache_life 3600) {
    
# файл, содержащий копию ленты
    
$cache_file dirname(__FILE__) . DIRECTORY_SEPARATOR $ytlist '.xml';
    
    
# специальный адрес, отвечающий за выдачу фида
    
$url 'http://gdata.youtube.com/feeds/api/playlists/' $ytlist '?v=1';
    
    
# если кеш устарел...
    
if (time() - @filemtime($cache_file) >= $cache_life) {
        
# ...пытаемся обновить его
        
$buf file_get_contents($url);
        
# в случае успеха запишем в файл обновлённые данные
        # проверка на пустоту нужна для того, чтобы не запороть кеш при ошибке
        
if ($buffile_put_contents($cache_file$buf);
    }
    
    
# если фид получить не удалось...
    
if (empty($buf)) {
        
# ...просто берём содержимое из кеша
        
$buf file_get_contents($cache_file);
    }
    
    
# парсим фид
    
$xml = new SimpleXMLElement($buf);
    
    
$result $xml->xpath('openSearch:totalResults'); # всего записей
    
$all_cnt = (int) $result[0];
    if (
$all_cnt $cnt$cnt $all_cnt;
    
    
$arr = array();
    
    for (
$i 0$i $cnt; ++$i) {
        
# пустых узлов быть не должно, если встретился, прекратить обработку
        
if (empty($xml->entry[$i])) break;
        
        
# получить очередной узел
        
$item $xml->entry[$i];
        
        
# получить все изображения
        # в элементе $thumbnails['all'] будет содержаться список всех урлов на картинки
        
$thumbnails = array();
        foreach (
$item->xpath('media:group/media:thumbnail') as $media_thumbs) {
            
# привести данные к ожидаемому виду
            
$url = (string) $media_thumbs['url'];
            
$w   = (int) $media_thumbs['width'];
            
$h   = (int) $media_thumbs['height'];
            
            
# размер изображения: ШИРИНАxВЫСОТА
            
$sizes $w 'x' $h;
            
            
# в элемент 'all' помещаются все найденные картинки
            
if (empty($thumbnails['all'])) $thumbnails['all'] = array();
            
# картинки дополнительно группируются по размеру
            
if (empty($thumbnails[$sizes])) $thumbnails[$sizes] = array();
            
            
$thumbnails[$sizes][] = $url;
            
$thumbnails['all'][] = $url;
        }
        
        
# добавить очередной элемент
        
$arr[] = array(
            
'title' => (string) $item->title# название
            
'desc'  => (string) $item->content# описание
            
'url'   => (string) $item->link[0]['href'], # адрес
            
'imgs'  => $thumbnails# изображения
        
);
    }
    
    return 
$arr;
}

Код функции можно поместить в какой-нибудь файл и подключать его с помощью конструкции:

require_once '/путь/к/файлу/имя_файла.php';

После этого вызывайте функцию и формируйте html содержимое.

В примере показано, как можно получить часть содержимого плейлиста. Данные будут записаны в массив $arr. При этом, второй и третий параметры автоматически устанавливаются в «умолчательное» состояние: вернуть 5 элементов, кешировать на 1 час (3600 секунд).

Если нужно получить, допустим, 6 элементов, то просто добавляете второй параметр:

$arr = getYoutubePlaylistDataXml($playlist_id, 6);

Для уменьшения времени кеширования до 5 минут (5 * 60 = 300 секунд) добавляем третий параметр:

$arr = getYoutubePlaylistDataXml($playlist_id, 6, 300);

Проблем возникнуть не должно. Если что-то не будет получаться — пишите в комментариях, разберёмся.

# пример работы с функцией
$playlist_id 'PLC6A0625DCA9AAE2D';
$arr getYoutubePlaylistDataXml($playlist_id);

# если что-то получено...
if ($arr) {
    
# ...построить табличку с изображением, названием и ссылкой на ролик
?>
<p><strong>Список роликов</strong></p>
<table>
  <tbody>
  <?php foreach ($arr as $v) { # цикл по массиву ?>
    <tr>
      <td><?= isset($v['imgs']['120x90']) ? '<img src="' $v['imgs']['120x90'][0] . '">' '&nbsp;' ?></td>
      <td><a href="https://youtu.be/<?=$v['url']?>" target="_blank"><?=$v['title']?></a></td>
    </tr>
  <?php ?>
  </tbody>
</table>
<?php
} else {
    
# ...иначе, если массив данных пуст, вывести соответствующее сообщение
    
echo 'Не удалось получить данные';
}

В случае успеха, в $arr помещается список хешей. Общий вид показан ниже:

Array
(
  [0] => Array
    (
      [title] => Название видео
      [desc] => Описание видео
      [url] => Адрес для просмотра ролика
      [imgs] => Array
        (
          [all] => Array
            (
              [0] => картинка №1
              [1] => картинка №2
              [2] => картинка №3
              [3] => картинка №4
            )
          [480x360] => Array
            (
              [0] => картинка №1, размером 480x360
            )
          [120x90] => Array
            (
              [0] => картинка №1, размером 120x90
              [1] => картинка №2, размером 120x90
              [2] => картинка №3, размером 120x90
            )
        )
    )
  [1] => Array
    (
      ...
    )
)

Теперь время вывести результаты. Самое интересное здесь — построение таблицы. На этом можно остановиться и разобрать код подробнее.

Инструкция foreach перебирает массив $arr, на каждом шаге помещая очередной элемент в переменную $v.

Далее следует вывод контейнера html строки таблицы tr и двух ячеек td.

В первую ячейку помещаем изображение, если есть. Инструкция <?= — сокращённая запись для <?php echo, т. е. вывода указанной строки/переменной в документ. Вся работа по проверке ложится на «плечи» тернарного оператора, который записывается в виде:

условие ? если_истина : если_ложь

Что полностью соответствует следующей конструкции:

if (условие) {
    если_истина
} else {
    если_ложь
}

Если массив картинок, размером 120×90 есть:
isset($v[‘imgs’][‘120×90’])
формируется изображение:
‘<img src="’ . $v[‘imgs’][‘120×90’][0] . ‘">’
в качестве картинки берётся первая запись (строка) в массиве. В противном случае, выводится неразрывный пробел: ‘&nbsp;’.

Во вторую ячейку записывается ссылка на элемент. В качестве «пункта назначения» выводим $v[‘url’], анкора (текста ссылки) — $v[‘title’].

Всего и «делов». Теперь, основываясь на коде функции, можно работать с rss или любым xml документом.

Успехов!

Поддержать проект

WebMoney

Яндекс.Деньги


Рейтинг: 0

Автор публикации

1 207
не в сети 1 день

x64 (aka andi)

Комментарии: 1850Публикации: 303Регистрация: 02-04-2009
Так себеНеплохоХорошоЗамечательноСупер! (Оценок пока нет)
Загрузка...

24 комментария

  1. Ыыы laugh Какой у него забавный вкус(подумала бы телка с батоном) …
    Не банят за распарсы?

    Рейтинг: 0
    • А чего ж банить-то? Парсер работает, фактически, как какой-нибудь rss-ридер. 24 запроса в сутки (если раз в час обновлять) это вообще ни о чём.

      Рейтинг: 0
  2. Угу. Если API которое объяснили…

    В целом как бы банят, если без браузера, без спроса, без куки и вообще просто взял и HTML у них распердолил … Еще мануал если выложил …. Ууууу … У тебя 24 и еще 1000 халявщиков начнут ковырятос продвигатос делать с помощью wget laugh

    Рейтинг: 0
    • Так не html берётся. Адрес:
      http://gdata.youtube.com/feeds/api/
      Люди говорят, что десяток запросов в секунду держит, но на мой взгляд, лучше перестраховаться.
      Обновление на стороне гугля происходит раз в несколько минут: видео уже загружено и в канале, а тут выдаётся старое содержимое.

      Рейтинг: 0
  3. Вот smile То, что надо )))) Спасибо тебе smile

    Рейтинг: 0
  4. А где брать/искать эти самые $playlist_id????

    Рейтинг: 0
    • Здравствуйте.
      Заходите на youtube к пользователю, в плейлисты, жмёте на требуемый, в адресной строке будет что-то вроде:
      youtube.com/playlist?list=НАБОР-ЦИФР-И-БУКВ
      НАБОР-ЦИФР-И-БУКВ и есть идентификатор плейлиста.

      Рейтинг: 0
  5. Не работает ничего

    Рейтинг: 0
  6. День добрый.
    Пытаюсь с помощью вашей статьи вывести видео с плей листа на сайт, только вот не получается — на скриншоте результат нажатия на ссылку.

    А первоначально скрипт у меня показывает картинки, хотя я от скрипта жду, что он будет показывать мне видео.

    Рейтинг: 0
  7. День добрый.
    Спасибо.
    Только пример всё таки не работает, но его хватило чтобы понять — почему видео у меня не открывалось.
    В итоге написал вот так:
    <a href="https://youtu.be/» target=»_blank»>

    Рейтинг: 0
  8. Сайт не всё отображает
    Теперь понятно почему Ваш пример у меня не работал, не всё отобразилось.
    Внизу скрин

    Рейтинг: 1
  9. *просто вставлял ваш пример в код и хотел чтобы ано работало, а ано было со мной не согласно, и работать отказывалось.

    Рейтинг: 1
  10. Андрей, а парсить конкретный канал можно или самые популярные видео, хочется в этом разобраться, чтобы к себе на сайт добавить. Я так понимаю, их можно будет смотреть сразу в сайдбаре?

    Рейтинг: 1
  11. Добрый день.
    А у Вас есть статья как залить видео с сайта на ютуб?
    Недавно они перешли на YouTube API v3.0
    И в интернете на эту тему, заливка видео на ютуб с использованием YouTube API v3.0, ничего нет.
    (https://habrahabr.ru/post/112291/)

    Рейтинг: 1
    • Подобной статьи у меня нет.
      Ни один проект не требует подобного, да и как-то не представляю, где оно может потребоваться. boast

      Рейтинг: 0
  12. Добрый день.
    А как получить картинку размером побольше?
    <?= isset($v['imgs']['120×90']) ? '’ : ‘ ‘ ?>
    Пробую менять 120 на 240 и 90 на 180 — но ничего не получается.

    Рейтинг: 0
  13. Максимилиан

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

    Рейтинг: 0

Оставить комментарий

Ваш email не будет опубликован.Необходимы поля отмечены *

*

Добавьте изображение (jpg/gif/png)

Авторизация

Регистрация

Пароль не введен

Генерация пароля