PHP

Проблемы с toobplayer или пишем парсер для youtube

28 марта, если тут имеются посетители моего сайта видео-концертов, то они (или вы:wink:) заметили, что большая часть видео перестала показываться. Вместо обычной буфферизации, за которые следовало воспроизведение видео, пользователи получали сообщение о пыпытке соедениться, а затем ужасную красную надпись «Не влезай, убьёт!» «error». Я написал разработчику плеера, он пообещал разобраться, но после двух суток проблема так и не была решена. К тому-же, общение с разработчиком было усложнено тем, что он иностранец и оно происходило на ломаном английском.

В итоге, я решил разбираться сам по двум причинам.

  1. Время шло, а большая часть видео не работало. Ппосетители пришедшие на сайт хотят смотреть видео прямо сейчас, а не ждать неопределённое время, следовательно я терял посетителей с каждым часом. К тому-же, как на зло, на вчера пришёлся рекорд посещаемости.
  2. Со временем всё сильнее и сильнее мне надоедало моё бессилие, к тому-же на сайте разработчика можно было скачать исходник данного скрипта. Да и php,можно сказать, родной мне язык т.к. многое я на нём сотворил, хотя на звание профи не претендую.

Скачав данный скрипт я начал разбиратся, но далеко я не ущёл т.к. увидел, что скрипт берёт данные из какого-то youtube‘овского url и проследовал по нему. Как оказалось, скрипт «высасывал» из данного url ключ сессии и путь к картинке-превью, а затем выводил их в удобном для флэш —  xml виде. Я проверил работу скрипта — ключ он выводит и картинку тоже, но т.к. этот ключ главная задача скрипта, то я стал разбираться почему видео не показываются. Я отправился на videosaver.ru и вставив туда адрес ролика получил ссылку на скачивание, которую я сравнил со ссылкой, в которую подставил данные «высосанные» скриптом. В результате ссылка полученная скриптом — не работает, а с помощью videosaver.ru — работает. Но тут мне стало жутко лень разбираться почему скрипт не работает и я решил написать свой скрипт, который берёт данные немного из другого источника, а затем выводит их в том-же, более понятном для флэша, xml виде. Суть скрипта очень проста. Скрипту передаётся id видео ролика. Например, страница с видео имеет адрес

http://www.youtube.com/watch?v=zrKO7ftQZm8

, а id данного видео будет

zrKO7ftQZm8

Используя этот id скрипт парсит (ранее «высасывает»http://www.zhitenev.ru/wp-includes/images/smilies/icon_mrgreen.gif) со страницы правильный, работающий ключ и возвращает его. Единственный минус моего скрипта в том, что он не возвращает адрес картинки-превьюшки, но это не критично, имхо. К тому-же, через 3 дня, когда сдам все зачёты, будет больше свободного времени и я доработаю свой скрипт. Тогда он не будет уступать своему со-брату, а именно: сделаю возможным выдачу адреса для картинки-превьюшки и возможность передачи ему, как id страницы, так и обычной ссылки на видео.

Вот сам скрипт.
Скрипт требует подключенную библиотеку curl.

<?php
header("Cache-Control: no-cache, must-revalidate");
header("Content-type: text/xml");
$cUrl = curl_init();
$ur=$_GET['id'];
$urlAddress = "http://www.youtube.com/watch?v=".$ur."";
if (($html = urlGetContents($cUrl, $urlAddress)) === false) {
    print "Адрес <b>".$urlAddress."</b> в данный момент недоступен";
} else {
    print $html;
}
curl_close($cUrl);
function urlGetContents(& $cUrl, $url, $port = 80, $timeout = 5, $errCount = 1)
{
    curl_setopt($cUrl, CURLOPT_URL, $url);
    curl_setopt($cUrl, CURLOPT_PORT, $port);
    curl_setopt($cUrl,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($cUrl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)");
    curl_setopt($cUrl, CURLOPT_TIMEOUT, $timeout);
    $content = curl_exec($cUrl);
    if (curl_getinfo($cUrl,CURLINFO_HTTP_CODE) != 200) {
        return (($errCount < 2) ? urlGetContents($cUrl, $url, $port, $timeout, ++$errCount) : false);
    } else {
        //return $content;
if(eregi("\"t\": \"(.*)\"", $content, $out)) {
$t=substr($out[1],0,44);
$iurl="";
$ur=$_GET['id'];
return '<xml><video video_id="'.$ur.'" iurl="'.$iurl.'" t="'.$t.'" /></xml>';
} else {
return '<xml><message error="Bad URL." /></xml>';
}
    }
}
?>

Если вы используете toobplayer, то в исходнике плеера, в параметрах компонента, укажите в поле youTubeProxy адрес к данному скрипту.