获取Youtube视频标题,说明和缩略图时出错

时间:2012-05-11 12:51:52

标签: php youtube youtube-api

我收到youtube标题和youtube描述形成相同的代码,但现在它无法正常工作 我收到了以下错误:

警告:DOMDocument :: load()[domdocument.load]:在/home/colorsfo/public_html/zaroorat/admin/pages/addSongProcess.php上,allow_url_fopen = 0在服务器配置中禁用了http://包装器第16行

警告:DOMDocument :: load(http://gdata.youtube.com/feeds/api/videos/Y7G-tYRzwYY)[domdocument.load]:无法打开流:/ home中找不到合适的包装器第16行的/colorsfo/public_html/zaroorat/admin/pages/addSongProcess.php

警告:DOMDocument :: load()[domdocument.load]:I / O警告:无法加载外部实体“http://gdata.youtube.com/feeds/api/videos/Y7G-tYRzwYY”/第16行的home / colorsfo / public_html / zaroorat / admin / pages / addSongProcess.php

.................................... 以下编码用于获取Youtube视频数据:

$url = "http://gdata.youtube.com/feeds/api/videos/".$embedCodeParts2[0]; $doc = new DOMDocument; @$doc->load($url); $title = $doc->getElementsByTagName("title")->item(0)->nodeValue; $videoDescription = $doc->getElementsByTagName("description")->item(0)->nodeValue;

它之前正在工作(这个编码在本地服务器上正常工作但在互联网上工作不正常)但现在它无法正常工作。请指导我如何解决此错误。 谢谢你的时间。

3 个答案:

答案 0 :(得分:3)

您的服务器的allow_url_fopen已被禁用(我的也是如此)。我感觉到你的痛苦。这就是我所做的。

尝试使用cURL,但使用YouTube的v2 api在json中返回您的数据。您可以通过将该数据附加到网址的末尾来实现。

?v=2&alt=json

您没有发布获取YouTube ID的方式,这可能是问题的一部分(尽管您的示例网址确实有效)。所以为了以防万一,我还发布了一个简单的功能来从YouTube视频网址中检索ID。

function get_youtube_id($url) {
    $newurl = parse_url($url);
    return substr($newurl['query'],2);
}

好的,现在假设你有视频ID,你可以为你想要返回的每个字段运行以下功能。

// Grab JSON and format it into PHP arrays from YouTube.
// Options defined in the switch. No option returns entire array
// Example of what the returned JSON will look like, pretty, here:
// http://gdata.youtube.com/feeds/api/videos/dQw4w9WgXcQ?v=2&alt=json&prettyprint=true
function get_youtube_info ( $vid, $info ) {
    $youtube = "http://gdata.youtube.com/feeds/api/videos/$vid?v=2&alt=json";
    $ch = curl_init($youtube);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $output = curl_exec($ch);
    curl_close($ch);

    //If $assoc = true doesn't work, try:
    //$output = json_decode($output, true);
    $output = json_decode($output, $assoc = true);

    //Add the ['feed'] in if it exists.
    if ($output['feed']) {
        $path = &$output['feed']['entry'];
    } else {
        $path = &$output['entry'];
    }

    //set up a switch to return various data bits to return.
    switch($info) {
        case 'title':
            $output = $path['title']['$t'];
            break;
        case 'description':
            $output = $path['media$group']['media$description']['$t'];
            break;
        case 'author':
            $output = $path['author'][0]['name'];
            break;
        case 'author_uri':
            $output = $path['author'][0]['uri'];
            break;
        case 'thumbnail_small':
            $output = $path['media$group']['media$thumbnail'][0]['url'];
            break;
        case 'thumbnail_medium':
            $output = $path['media$group']['media$thumbnail'][2]['url'];
            break;
        case 'thumbnail_large':
            $output = $path['media$group']['media$thumbnail'][3]['url'];
            break;
        default:
            return $output;
            break;
    }
    return $output;
}

$url = "http://www.youtube.com/watch?v=oHg5SJYRHA0";
$id = get_youtube_id($url);

echo "<h3><a href=" . $url . ">" . get_youtube_info($id, 'title') . "</a></h3>"; //echoes the title
echo "<p><a href=" . $url . "><img style='float:left;margin-right: 5px;' src=" . get_youtube_info($id, 'thumbnail_small') . " /></a>" . get_youtube_info($id, 'description') . "</p>"; //echoes the description
echo "<br style='clear:both;' /><pre>";
echo print_r(get_youtube_info($id));
echo "</pre>";

答案 1 :(得分:0)

DOMDocuments的load()函数使用PHP的fopen包装器来检索文件。 似乎在您的Web服务器上,allow_url_fopen设置为0,从而禁用这些包装器。 尝试将以下行添加到脚本的顶部:

ini_set ('allow_url_fopen', 1);

更新:试试这个:

<?php
$url = "http://gdata.youtube.com/feeds/api/videos/" . $embedCodeParts2[0];

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$file = curl_exec($ch);

curl_close($ch);

$doc = new DOMDocument;
@$doc->loadHTML($file);
$title = $doc->getElementsByTagName("title")->item(0)->nodeValue;
$videoDescription = $doc->getElementsByTagName("description")->item(0)->nodeValue;

答案 2 :(得分:0)

我希望现在还为时不晚。我的解决方案是在你的Linux机器上编辑/etc/resolv.conf:并用下面的行替换第一行:

nameserver 8.8.8.8

然后保存文件。无需重启服务。

可能会因为安全性而意外禁用某些功能的服务器。