Как стать автором
Поиск
Написать публикацию
Обновить

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

image

Сейчас есть много сервисов для скачивания видео с youtube, но у всех есть свои недостатки.
Универсальным вариантом будет написать свой сервис, который будет предоставлять только те данные которые Вам нужны.
Для таких целей есть много решений, но для всех нужно подключать отдельные библиотеки, что не всегда возможно, в этой статье я расскажу как получить ссылки на скачивание видео и краткую информацию о нем без сторонних библиотек.

Приступим

Для получения информации о видеоролике мы будем использовать php, библиотеку curl и youtube.
Некоторые видеоролики запрещены в некоторых странах, для получения информации о таких видеороликах мы будем использовать прокси:
$proxy_list = array(
        '128.10.19.52:3128',
        '195.138.88.105:3128',
        '200.155.37.241:3128',
        '80.193.72.145:80',
        '80.193.72.145:0',
        '89.74.147.143:8080'
    ); 


Получение информации о видео я собрал в функцию для удобного использования
function get_video_info($id, $proxy = false, $i = 0){
        global $proxy_list;
        # Получение данных видео
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 'http://www.youtube.com/get_video_info?video_id='. $id);
       # Использование прокси
        if($proxy){
            $proxy = $proxy_list[($i-1)];
            curl_setopt($ch, CURLOPT_TIMEOUT, 3);
            curl_setopt($ch, CURLOPT_PROXY, $proxy);
        }
        curl_setopt ($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $links = curl_exec ($ch);
        curl_close ($ch);
        # Парсим данные
        parse_str($links, $info);
        # Проверяем возвратившийся статус и, если нужно, используем прокси
        # 3 - количество попыток для получения данных
        if($i<3){
            if(@$info['status'] != 'ok'){
                return get_video_info($id, true, ++$i);
            } else return $info;
        } else exit('Видео не доступно');
    }

Информация о видео у нас уже есть, теперь надо получить сами ссылки для загрузки видео.
Ссылки хранятся в переменной $info['fmt_url_map'], которую мы и будем парсить.
Но перед этим нужно знать, что youtube возвращает не только ссылки но и некоторые данные о видео(расширение и формат), и для того, что бы узнать эти данные, сопоставим значения, возвращаемые youtube и расширения (их можно найти на Википедии):
$formats = array(
            '17'=>'3gp',
            '5'=>'flv',
            '34'=>'flv',
            '35'=>'flv',
            '18'=>'mp4',
            '22'=>'mp4',
            '37'=>'mp4',
            '38'=>'mp4',
            '43'=>'webm',
            '44'=>'webm',
            '45'=>'webm'
        );

Для удобства код получения ссылок я тоже поместил в функцию:
function get_links($info){
        global $formats;
        $links_map = explode(',', $info['fmt_url_map']);
        $links = array();
        foreach($links_map as $link){
            $tmp = explode('|', $link);
            preg_match('|'.$tmp[0].'/([0-9]{2,4}x[0-9]{2,4})|', $info['fmt_map'], $format);
            $links[$formats[$tmp[0]] .'-'. $format[1]] = array($formats[$tmp[0]], $format[1], $tmp[1]);
        }
        return $links;
    }


Использование

Для начала нам понадобится id видеоролика. Возьмем первый попавшийся видеоролик www.youtube.com/watch?v=AhjcUft3iNA, его id AhjcUft3iNA
$id = 'AhjcUft3iNA';

Получим данные о видео
$info = get_video_info($id);

Теперь можно получить ссылки на скачивание:
$links = get_links($info);

Теперь в переменной $links у нас хранится массив с данными о ссылках к видео в удобном формате:
$link[формат-расширение] = array(формат, расширение, сслыка);

Массив можно использовать перебрав все значения в цикле
foreach($links as $key => $value)

В переменной $key будет хранится строка формат-расширение, а в переменной $value массив: array(формат, расширение, ссылка)
Но ссылки действительны только некоторое время, его мы можем узнать распарсив сами ссылки:
preg_match('|&expire=([0-9]+)&|', $info['fmt_url_map'], $exp);
В переменной $exp[1] хранится время в формате timestamp, до этого времени полученные ссылки можно использовать…

Ссылки мы получили, но когда Вы попробуете по ним перейти, у Вас скачется видео, но с названием videoplayback. Для того, чтобы видео загрузилось с нормальным названием, нужно к ссылке добавить &title=название видео, его мы можем получить из переменной $info:
$link[формат-расширение][2] .= '&title=' .$info['title'];

Важная деталь: ссылки будут действительны только для того устройства (ip), с какого они получались.

Еще немного о данных в переменной $info

$info['keywords'] содержит теги видео, по которым его можно найти на youtube
$info['title'] содержит название видеоролика
$info['length_seconds'] содержит длину видеоролика в секундах
$info['iurlmaxres'] содержит скриншот видео в максимальном расширении
$info['iurlsd'] содержит скриншот видео в среднем расширении
$info['status'] содержит статус видеоролика
$info['thumbnail_url'] содержит скриншот низкого расширения (предосмотр)
Количество просмотров можно получить из переменной $info['view_count'], а рейтинг $info['avg_rating']
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.