2012-03-16 95 views
1

我使用Zend框架访问YouTube数据API。下面的功能循环播放我帐户中特定播放列表中的所有视频,并统计视图计数。现在我只有一个视频。

当查看计数达到一定数量(用于测试目的,5视图),我想将视频设置为私人。

我正在使用此代码示例:https://developers.google.com/youtube/2.0/developers_guide_php#Updating_Video_Information

$yt = new Zend_Gdata_YouTube($httpClient, $applicationId, null, $developerKey); 

$playlistVideoFeed = $yt->getPlaylistVideoFeed('http://gdata.youtube.com/feeds/api/playlists/XXXXXX'); 

function playCount($playlistVideoFeed, $yt) { 
     $count = 1; 
     $totalViews = 0; 
     foreach ($playlistVideoFeed as $videoEntry) { 

     // ensure the video entry is not private 
     if(!$videoEntry->isVideoPrivate()) {   

      // add this episode's play count to the total view count 
      $totalViews = $totalViews + $videoEntry->getVideoViewCount(); 

      // if views are X and I can edit this video, set it to private 
      if($totalViews >= 5) { 
      $vidID = $videoEntry->getVideoId(); 
      $videoEntryToEdit = $yt->getFullVideoEntry($vidID); 
       if($videoEntryToEdit->getEditLink() !== null) { 
        $putUrl = $videoEntryToEdit->getEditLink()->getHref(); 
        $videoEntryToEdit->setVideoPublic(); 
        $yt->updateEntry($videoEntryToEdit, $putUrl); 
       } 
      } 

      $count++; 
     } 
     } 
    return $totalViews; 
} 

* 编辑 **

我的问题的第一部分已经被包括global $yt解决。以上代码不再返回以下错误:Fatal error: Call to a member function updateEntry() on a non-object

现在,剩下的问题: 这不会使视频不公开。使用示例的setVideoDescription进行测试也不会做任何事情......没有错误,没有任何更改。另外,是的,我超过5个观点:)。

任何想法?

* 编辑V2 **

解决我自己的问题。我更新了上述代码以反映我的解决方案,以防其他人遇到此问题。

回答

2

$yt不在范围内的函数。如果你需要内部访问,使用global关键字:

function playCount($playlistVideoFeed) { 
    // Access the global $yt 
    global $yt; 

    $count = 1; 
     $totalViews = 0; 
     foreach ($playlistVideoFeed as $videoEntry) { 

     // ensure the video entry is not private 
     if(!$videoEntry->isVideoPrivate()) {   

      // add this episode's play count to the total view count 
      $totalViews = $totalViews + $videoEntry->getVideoViewCount(); 

      // if views are X and I can edit this video, set it to private 
      if($totalViews >= 5 && $videoEntry->getEditLink() !== null) { 
      $putUrl = $videoEntry->getEditLink()->getHref(); 
      $videoEntry->setVideoPrivate(); 
      $yt->updateEntry($videoEntry, $putUrl); 
      } 

      $count++; 
     } 
     } 
    return $totalViews; 
} 

或者使用$GLOBALS阵列:

$GLOBALS['yt']->updateEntry($videoEntry, $putUrl); 

还是最重要的是,它传递给函数:

function playCount($playlistVideoFeed, $yt) { 
    // function body 
    // etc... 
    $yt->updateEntry($videoEntry, $putUrl); 
} 

由于您通过$yt,因此您无需单独通过$playlistVideoFeed。相反,您可以在功能内创建它:

function playCount($yt) { 
    // get the feed inside, since $yt is inside... 
    $playlistVideoFeed = $yt->getPlaylistVideoFeed('http://gdata.youtube.com/feeds/api/playlists/XXXXXX'); 
    // function body 
    // etc... 
    $yt->updateEntry($videoEntry, $putUrl); 
} 
+0

呃!我已经把全球$ yt;功能之外。谢谢! 但是,虽然这使得错误消失,但$ yt-> updateEntry不起作用。我用setVideoPrivate和上面的链接的setVideoDescription尝试了它,两者都没有改变。 – Kate 2012-03-16 02:34:01

+0

感谢您的第二部分...我在一些函数中使用$ playlistVideoFeed,所以将外面的部分保留在外面似乎是最简单的方法? – Kate 2012-03-16 02:47:57

+0

@Kate这是一个单独的问题,应作为单独的问题输入。但是'$ videoEntry-> getEditLink()'可能没有返回你期望的结果。 – 2012-03-16 03:06:06