从特定频道中提取YouTube视频

时间:2011-06-28 16:49:21

标签: php

我正在尝试从特定的YouTube频道中提取所有视频。

我收到了这个错误:

Fatal error: Call to undefined function getYTid() in C:\inetpub\wwwroot\ped.php on line 71

有什么建议吗?

class ChannelFeed {

    function __construct($username){
        $this->username=$username;
        echo $this->username;
        $this->feedUrl=$url='http://gdata.youtube.com/feeds/api/users/'.$username.'/uploads?orderby=updated';
        $this->feed=simplexml_load_file($url);
    }

    public function getYTid() {

        $ytURL = $this->feed->entry->link['href'];

        $ytvIDlen = 11; // This is the length of YouTube's video IDs

        // The ID string starts after "v=", which is usually right after 
        // "youtube.com/watch?" in the URL
        $idStarts = strpos($ytURL, "?v=");

        // In case the "v=" is NOT right after the "?" (not likely, but I like to keep my 
        // bases covered), it will be after an "&":
        if($idStarts === FALSE)
        $idStarts = strpos($ytURL, "&v=");
        // If still FALSE, URL doesn't have a vid ID
        if($idStarts === FALSE)
        die("YouTube video ID not found. Please double-check your URL.");

        // Offset the start location to match the beginning of the ID string
        $idStarts +=3;

        // Get the ID string and return it
        $ytvID = substr($ytURL, $idStarts, $ytvIDlen);    
        return $ytvID;   
    }

public function showFullFeed(){ 
$vidarray = array();
    foreach($this->feed->entry as $video){
        $vidarray[] = $video->link['href'];
    }
    return $vidarray ;
}


 };
$youtube = new ChannelFeed('channel_name');
$vids = $youtube->showFullFeed();
$vidIDs = array_map(getYTid(),$vids);

3 个答案:

答案 0 :(得分:5)

我修改了这个以正常工作.....

    class ChannelFeed {
    function __construct($username){
        $this->username=$username;        
        //$this->feedUrl=$url='http://gdata.youtube.com/feeds/api/users/'.$username.'/uploads?orderby=published';
        $this->feedUrl=$url='http://gdata.youtube.com/feeds/api/videos?author=' . $username;
        $this->feed=simplexml_load_file($url);
    }

    public function getYTid($links) {
        $IDs = array();
        foreach ($links as $href) {
            $ytURL = $href;
        //$ytURL = $this->feed->entry->link['href'];

            $ytvIDlen = 11; // This is the length of YouTube's video IDs

            // The ID string starts after "v=", which is usually right after 
            // "youtube.com/watch?" in the URL
            $idStarts = strpos($ytURL, "?v=");

            // In case the "v=" is NOT right after the "?" (not likely, but I like to keep my 
            // bases covered), it will be after an "&":
            if($idStarts === FALSE)
            $idStarts = strpos($ytURL, "&v=");
            // If still FALSE, URL doesn't have a vid ID
            if($idStarts === FALSE)
            die("YouTube video ID not found. Please double-check your URL.");

            // Offset the start location to match the beginning of the ID string
            $idStarts +=3;

            // Get the ID string and return it
            $ytvID = substr($ytURL, $idStarts, $ytvIDlen);    
            $IDs[] = $ytvID;
        }
        return $IDs;           
    }

    public function showFullFeed(){ 
    $vidarray = array();    
        foreach($this->feed->entry as $video){
            $vidarray[] = $video->link['href'];         
        }
        return $vidarray;
    }   
};

$youtube = new ChannelFeed('channel_name');
$vids = $youtube->showFullFeed();
$vidIDs = $youtube->getYTid($vids);

答案 1 :(得分:1)

在不查看代码的其余部分的情况下,array_map正在使用您班级的方法ChannelFeed。根据{{​​3}},您必须使用数组来告诉它您希望作为回调应用的函数位于何处。

将代码的最后一行更改为:

$vidIDs = array_map(array($youtube, 'getYTid'), $vids);

答案 2 :(得分:0)

$vidIDs = array_map(getYTid(),$vids);

您不仅将调用getYTid()的结果传递给array_map而不是对函数的引用,而且您没有传递任何对象上下文...而getYTid是成员函数。

再次阅读the documentation for array_map,然后尝试:

$vidIDs = array_map(array($youtube, "getYTid"), $vids);

在PHP 5.3之前,默认情况下对象传递变为by-reference,您需要:

$vidIDs = array_map(array(&$youtube, "getYTid"), $vids);