Reputation: 1101
I'm trying to pull all videos from a specific youtube channel.
I'm getting this error:
Fatal error: Call to undefined function getYTid() in C:\inetpub\wwwroot\ped.php on line 71
Any suggestions?
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);
Upvotes: 1
Views: 2291
Reputation: 66
I revised this to work correctly.....
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);
Upvotes: 5
Reputation: 385144
$vidIDs = array_map(getYTid(),$vids);
Not only are you passing the result of calling getYTid()
to array_map
rather than a reference to the function, but you're not passing any object context... and getYTid
is a member function.
Read again the documentation for array_map
, then try:
$vidIDs = array_map(array($youtube, "getYTid"), $vids);
Prior to PHP 5.3, in which object passing became by-reference by default, you'll need:
$vidIDs = array_map(array(&$youtube, "getYTid"), $vids);
Upvotes: 0
Reputation: 6679
Without checking out the rest of your code, your array_map
is using a method of your class, ChannelFeed
. Per the documentation, you must use an array to tell it where the function you're wanting to apply as a callback is located.
Change the last line of your code to this:
$vidIDs = array_map(array($youtube, 'getYTid'), $vids);
Upvotes: 1