Youtube api获取最新的上传缩略图

时间:2012-01-28 09:43:16

标签: api youtube thumbnails channel

我希望从我的频道返回最新上传视频的视频缩略图,并将其显示在我的网站上。

任何人都知道如何通过api进行最小连接并只获取缩略图?

谢谢! - 汤姆

REVISED !!

使用Cakephp,我就是这样做的(感谢dave使用zend的建议);

控制器:

App::import('Xml');
 $channel = 'Blanktv';
 $url = 'https://gdata.youtube.com/feeds/api/users/'.$channel.'/uploads?v=2&max-results=1&orderby=published';
 $parsed_xml =& new XML($url); 
 $parsed_xml = Set::reverse($parsed_xml);  
 //debug($parsed_xml);
 $this->set('parsed_xml',$parsed_xml);

查看;

$i=0;
foreach ($parsed_xml as $entry)
{           
    echo '<a href="/videokanalen" target="_self">                     
    <img width="220px" src="'.$entry['Entry']['Group']['Thumbnail'][1]['url'] .'"> 
    </a>';             
}

现在唯一剩下的就是缓存Feed调用..任何建议???

- 汤姆

1 个答案:

答案 0 :(得分:2)

这是一种快速肮脏的做法,而根本没有触及api。

我并不是说这是最佳做法或任何事情,我确信有更聪明的方法,但它肯定适用于当前的Youtube饲料服务。

我的解决方案是使用Zend Framework中的Zend_Feed_Reader组件的PHP,如果你不熟悉它就需要设置它,请告诉我。

基本上,您可以从Zend.com here下载1.11版本,然后确保可以在PHP包含路径上访问框架文件。

如果您已经在MVC模式中使用Zend Framework,则可以在所选的控制器操作中执行此操作:

$channel = 'Blanktv'; //change this to your channel name
$url = 'https://gdata.youtube.com/feeds/api/users/'.$channel.'/uploads';
$feed = Zend_Feed_Reader::import($url);
$this->view->feed = $feed;

然后您可以在视图中执行此操作:

<h1>Latest Video</h1>
<div>
<?php 
$i=0;
foreach ($this->feed as $entry)
{           
    $urlChop = explode ('http://gdata.youtube.com/feeds/api/videos/',$entry->getId());
    $videoId = end($urlChop);                           
    echo '<h3><a href="http://www.youtube.com/watch?v=' . $videoId .'" target="_blank">' . $entry->getTitle() . '</a></h3>';
    echo '<p>Uploaded on: '. $entry->getDateCreated() .'</p>';

    echo '<a href="http://www.youtube.com/watch?v=' . $videoId .'" target="_blank">                     
    <img src="http://img.youtube.com/vi/' . $videoId .'/hqdefault.jpg"> 
    </a>';                  
    $i++;
    if($i==1) break;
}
?>
</div>

否则你可以这样做:

<?php
$channel = 'Blanktv'; //change this to your channel
$url = 'https://gdata.youtube.com/feeds/api/users/'.$channel.'/uploads';
$feed = Zend_Feed_Reader::import($url);
?>
<h1>Latest Video</h1>
<div>
<?php 
$i=0;
foreach ($feed as $entry)
{           
    $urlChop = explode ('http://gdata.youtube.com/feeds/api/videos/',$entry->getId());
    $videoId = end($urlChop);                           
    echo '<h3><a href="http://www.youtube.com/watch?v=' . $videoId .'" target="_blank">' . $entry->getTitle() . '</a></h3>';
    echo '<p>Uploaded on: '. $entry->getDateCreated() .'</p>';

    echo '<a href="http://www.youtube.com/watch?v=' . $videoId .'" target="_blank">                     
    <img src="http://img.youtube.com/vi/' . $videoId .'/hqdefault.jpg"> 
    </a>';                  
    $i++;
    if($i==1) break;
}
?>
</div>

使用后一种方法,您可能需要为Zend_Feed_Reader文件等使用php require语句....

希望这会有所帮助,就像我说如果你需要一只手让我知道。

一切顺利,

戴夫

更新:回复您对缓存的评论

嗨,汤姆,这是另一个快速而肮脏的解决方案,它不使用缓存,但可能很快实现。

我没有使用缓存组件的原因是因为我认为在这种情况下简单的数据库解决方案就足够了。我还认为必须拉动饲料来比较它是否是新的,对你来说不是最经济的。

您可以自动将此过程在指定时间自动运行,但如果您不想自动执行该过程并且不介意单击链接以手动更新视频,则可以按此方式触发。

我的解决方案再次基于ZF,但是因为你可以将它破解成与cakephp有用的东西,你应该没有问题在这里做同样的事情。

首先设置一个新表(假设一个MySQL数据库):

CREATE TABLE  `yourdbname`.`latestvid` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT  'Unique identifier',
`videoId` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT  'Video id',
`videoTitle` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT  'Video title',
`uploadDate` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT  'Video upload date'
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;

INSERT INTO `yourdbname`.`latestvid` (`id`, `videoId`, `videoTitle`, `uploadDate`) VALUES (NULL, '--', '--', '--');

这会为您的模板中的最新视频信息创建一个表格,但由于显而易见的原因,我设置的默认值无法与您的模板配合使用。

然后你可以做类似的事情:

public function updateAction()
{
    $this->_helper->viewRenderer->setNoRender(); // disable view
    $this->_helper->layout()->disableLayout();   // disable layout

    $user = 'Blanktv';  // insert your channel name 
    $url  = 'https://gdata.youtube.com/feeds/api/users/'.$user.'/uploads';
    $feed = Zend_Feed_Reader::import($url);  

    if(!$feed)
    {
        die("couldn't access the feed"); // Note: the Zend component will display an error if the feed is not available so this wouldn't really be necessary for ZF
    }
    else
    {
        $i=0;
        foreach ($feed as $entry)
        {           
            $urlChop    = explode ('http://gdata.youtube.com/feeds/api/videos/',$entry->getId());
            $videoId    = end($urlChop);                            
            $videoTitle = $entry->getTitle();
            $uploadDate = $entry->getDateCreated();         

            // use your preferred method to update the db record where the id = 1               

            $i++;
            if($i==1) break;
        }
    }       
}   

也许有一个去,让我知道你是怎么过的?

您只需要调整模板,这样您就可以从数据库而不是Youtube获取变量,但缩略图除外。

我想你总是可以进一步采用这种方法并实际存储图像等,因为缩略图仍然是从Youtube中拉出来的,可能会减慢速度。

您可以设置一个脚本,将缩略图复制到您自己的服务器,并将路径存储在数据库中,或者如果您正在运行一系列需要标准品牌的视频,请使用标准缩略图 - 无论如何希望它有所帮助。 / p>

: - d

戴夫