2012-03-12 4 views
2

В одном из моих приложений я сохраняю идентификатор видео youtube ... Как «A4fR3sDprOE» .. Мне нужно отобразить его название в приложении. У меня есть следующий код для получения его названия, а также его работы.Получить название видеоролика youtube в PHP

Теперь проблема в том, произошла ли какая-либо ошибка (в случае удаления видео) php с ошибкой. Я добавил условие. Но все же его показная ошибка.

foreach($videos as $video) { 

    $video_id = $video->videos; 
    if($content=file_get_contents("http://youtube.com/get_video_info?video_id=".$video_id)) { 
     parse_str($content, $ytarr); 

     $myvideos[$i]['video_title']=$ytarr['title']; 

    } 
    else 
     $myvideos[$i]['video_title']="No title"; 

    $i++; 


} 

return $myvideos; 

В случае ошибки ее умирает с folllowing

Серьезность: Предупреждение

Сообщение: file_get_contents (http://youtube.com/get_video_info?video_id=A4fR3sDprOE) [function.file- get-contents]: не удалось открыть поток: HTTP-запрос не удался! HTTP/1.0 402 Оплата Требуемое

Имя файла: модели/webs.php

Порядковый номер: 128

Пожалуйста, помогите

ответ

2

это работает, чтобы использовать @ (php-manual) перед file_get_contents?

что-то вроде:

if($content = @file_get_contents("http://youtube.com/get_video_info?video_id=".$video_id)) 

следует устранить ошибку и использовать его, чтобы вернуть ложь в вашей, если заявление

иначе вы можете просто использовать попытаться/поймать заявление (php-manual)

try{ 
    // code 
}catch (Exception $e){ 
    // else code 
} 
+0

, который сработал ... спасибо .. – ramesh

1

Я считаю, что ваш хостинг-провайдер отключил файл_get_contents в целях безопасности. Вы должны использовать CURL.

<?php 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://youtube.com/get_video_info?video_id=".$video_id); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$response = curl_exec($ch); 
curl_close($ch); 
/* PARSE YOUTUBE'S RESPONSE AS YOU LIKE BELOW */ 
?> 
1

Try:

 

//use @ to supress warnings 
[email protected]_get_contents("http://youtube.com/get_video_info?video_id=".$video_id); 
if($content===FALSE) { 
    ..handle error here 
} 
else{ 
    ..rest of your code 
} 
 
11

Это не безопасно использовать file_get_contents() с удаленными URL. Использование Curl вместо с Youtube API 2.0:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://gdata.youtube.com/feeds/api/videos/'.$video_id); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

$response = curl_exec($ch); 
curl_close($ch); 

if ($response) { 
    $xml = new SimpleXMLElement($response); 
    $title = (string) $xml->title; 
} else { 
    // Error handling. 
} 
+1

Отличное решение, спасибо вам за это! – SeinopSys

1

Я хотел бы добавить к этому, что конкретная ошибка увидеть здесь (HTTP 402 - Требуется оплата, которая в противном случае HTTP код статуса, который сервер обычно не реализовали) - это то, что YouTube возвращает, когда выяснилось, что «чрезмерный» объем трафика поступает с вашего IP-адреса (или диапазона IP-адресов - они предпочитают часто блокировать диапазоны IP-адресов OVH [1][2]).

Таким образом, если вы используете программный код youtube.com (а не API) (используя PHP или иным образом), вы можете в конечном итоге обнаружить ошибку. YouTube обычно начинается с подачи CAPTCHA на запросы с IP-адресов с избыточным трафиком, но если вы их не завершаете (чего не будет у вашего PHP-скрипта), они будут переключаться на эти бесполезные 402-ответы, по сути, без регресса - YouTube не работает У вас точно есть служба поддержки клиентов, и если вы не можете фактически получить доступ к любому из своих сайтов из-за блокировки IP-адресов, у вас будет еще меньше шансов связаться с ними.

Другие ссылки:
http://productforums.google.com/forum/#!topic/youtube/tR4WkNBPnUo http://productforums.google.com/forum/?fromgroups=#!topic/youtube/179aboankVg

6

Это мое решение. Это очень коротко.

$id = "VIDEO ID"; 
$videoTitle = file_get_contents("http://gdata.youtube.com/feeds/api/videos/${id}?v=2&fields=title"); 

preg_match("/<title>(.+?)<\/title>/is", $videoTitle, $titleOfVideo); 
$videoTitle = $titleOfVideo[1]; 
0

Мое решение:

$xmlInfoVideo = simplexml_load_file("http://gdata.youtube.com/feeds/api/videos/".$videoId."?v=2&fields=title"); 

foreach($xmlInfoVideo->children() as $title) { $videoTitle = strtoupper((string) $title); } 

Это получить название видео.

Смежные вопросы