Блог web-разработчика

Личные заметки из области web-разработки, программирования, администрирования, IT

Превьюшки видео (youtube, rutube, vimeo)

| Комментариев: 16

Иногда требуется получить превью-, thumbnail-картинку (или, по-другому, уменьшенную версию кадра) видеофайла. Данные функции позволяют вытащить превьюшки видеофайлов с таких популярных сервисов как youtube, rutube, vimeo.

getVideoUrl($data)

, где $data — html-код для встраивания видео (обычно, начинается с <object> или <iframe>)

getVideoThumbUrl($url)

, где $url — src видеофайла

Выкладываю как есть:

function getVideoUrl ($data) {
    if (preg_match("/<iframe.*?src=\"([^\"]+)\".*?><\/iframe>/i", $data, $matches)) {
        $url = $matches[1];
    }
    if (preg_match("/<object.*?>.*?<param name=\"movie\" value=\"([^\"]+)\"( \/>|><\/param>).*?<\/object>/i", $data, $matches)) {
        $url = $matches[1];
    }
    return $url;
}

function getVideoThumbUrl ($url) {
    if (!is_string($url) || empty($url)) return false;
    $url = str_replace("&amp;", "&", $url);
    $arr = parse_url($url);
    $arr[host] = str_replace('www.', '', $arr[host]);
    $url = "";
    switch ($arr[host]) {
        case 'rutube.ru':
            if (preg_match("/\/tracks\/(.+)\.html/i", $arr[path], $matches)) {
                $xml = simplexml_load_file("http://rutube.ru/cgi-bin/xmlapi.cgi?rt_mode=movie&rt_movie_id=".$matches[1]."&utf=1");
                if ($xml) {
                    $url = (string) $xml->response->movie->thumbnailLink;
                }
            }
            break;
        case 'video.rutube.ru':
            if (preg_match("/\/(.+)/i", $arr[path], $matches)) {
                $s[0] = substr($arr[path], 1, 2);
                $s[1] = substr($arr[path], 3, 2);
                $url = "http://tub.rutube.ru/thumbs/".$s[0]."/".$s[1]."/".$matches[1]."-1-1.jpg";
            }
            //$url = "http://img-1.rutube.ru/thumbs/".$link[0].$link[1]."/".$link[2].$link[3]."/".$link."-2.jpg";
            break;
        case 'youtube.com':
            if (preg_match("/\/(embed|v)\/(.+)\/?/i", $arr[path], $matches)) {
                $url = "http://img.youtube.com/vi/".$matches[2]."/0.jpg";
            }
            break;
        case 'player.vimeo.com':
            if (preg_match("/\/video\/(.+)\/?/i", $arr[path], $matches)) {
                $clip_id = $matches[1];
            }
            $xml = simplexml_load_file('http://vimeo.com/api/v2/video/'.$clip_id.'.xml');
            if ($xml) {
                $url = (string) $xml->video->thumbnail_medium;
            }
            break;
        case 'vimeo.com':
            parse_str($arr[query], $query);
            $clip_id = $query['clip_id'];
            $xml = simplexml_load_file('http://vimeo.com/api/v2/video/'.$clip_id.'.xml');
            if ($xml) {
                $url = (string) $xml->video->thumbnail_medium;
            }
            break;
        default:
            $url = "";
            break;
    }
    return $url;
}

Как использовать:

// вытаскиваем src видеофайла
$url = getVideoUrl ($html);
// генерируем ссылку на превьюшку
$th_url = getVideoThumbUrl ($url);
// $th_url теперь содержит ссылку на уменьшенную копию кадра из видео $url
echo '<img src="', $th_url, '" border="0" />';

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

  1. Thanks a lot. it is very usefull

  2. Спасибо огромное, помогло )))

  3. Как реализовать данный модуль на DLE?

  4. Спасибо за решение. Перепроверьте работу с rutube
    в моем случае для рабочей версии пришлось заменить строку
    $url = «http://tub.rutube.ru/thumbs/».$s[0].»/».$s[1].»/».$matches[1].»-1-1.jpg»;
    на
    $url = «http://tub.rutube.ru/thumbs/».$s[0].»/».$s[1].»/».$matches[1].»-2.jpg»;

  5. Спасибо за статью. А вы случаем не знаете как это можно реализовать с видеороликами myvi(.)ru. Уже третий день пытаюсь найти решение.

    • К сожалению, не подскажу.
      Но, думаю, надо искать закономерность в названиях файлов, а запрограммировать особого труда не составит )

  6. Спасибо! Прям выручили! Единственное долго обрабатывается, если много видео ан странице, подвисает хорошо.

    • Пожалуйста! Рад помочь! :)
      Ну можно попробовать оптимизировать скрипт (хотя тормозит скорее больше всего обращение к удаленным файлам, которое simplexml_load_file),
      или кэшировать/сохранять полученные результаты для каждого видео.

  7. Родион, добрый вечер! Добросовестно следуя вашим инструкциям не могу получить конечный результат! Не понимаю где ошибка…, и вообще мало, что понимаю -:) Вероятно в конце.. — не понимаю «как использовать». Не могли бы помочь.., — очень нужно.

  8. Вроде, всё и хорошо, но я бы не доверил свой код каким-то функциям. Есть уже готовые протестированные инструменты: Zend_Gdata_Youtube, например. У других видеохостингов, я уверен, есть тоже свой API.

    • Ваше право не использовать этот код :)
      На момент написания статьи я не нашёл готового решения, поэтому и написал своё.

  9. Подскажите пожалуйста, как это на DLE установить? Что, куда добавить, как вывести превью видео в краткой новости… Буду очень признателен! Спасибо!

  10. Спасибо за скрипт! Можете подсказать, как его внедрить в вордпресс? Первая часть, думаю, вставляется в functions.php, «echo »;» — это, скорее всего, внутри цикла вп, так? Не получается у меня :(

  11. Спасибо, очень помогло.

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

Обязательные поля отмечены *.

*

* Copy this password:

* Type or paste password here:

7,198 Spam Comments Blocked so far by Spam Free Wordpress