2012-01-28 36 views
3

我期待從我的頻道返回最新上傳視頻的視頻縮略圖,並將其顯示在我的網站上。Youtube API獲取最新上傳縮圖

任何人都知道我可以做一個最小的連接槽api,並只得到縮略圖?

謝謝! -Tom

修訂!

使用Cakephp,這是我如何做到的(謝謝戴夫使用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 feed。任何建議?

-Tom

回答

2

這裏是一個快速骯髒的做法,沒有真正觸及api。

我並不是說這是最好的做法或任何事情,我敢肯定有更聰明的方法,但它絕對適用於當前的Youtube提要服務。

我的解決方案是PHP使用Zend Framework的Zend_Feed_Reader組件,如果您不熟悉它,需要手動設置,請告訴我。

本質上,您可以從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> 

對於後一種方法,您可能需要使用php requi重申聲明Zend_Feed_Reader文件等....

希望這可以幫助,就像我說的讓我知道,如果你需要一隻手。

一切順利,

戴夫

UPDATE:在回答您的有關緩存的意見

湯姆你好,這裏是另一個快速和骯髒的解決方案,它不使用緩存,但可能要很快實施。

我沒有使用緩存組件的原因是因爲我認爲一個簡單的數據庫解決方案就足夠了。我還認爲不得不提供飼料來比較它是否是新的對你來說不是最經濟的。

你可以自動完成這一過程將在指定時間自動運行,但如果你不希望自動過程,不介意點擊一個鏈接更新視頻手動你可以觸發這種方式。

我的解決方案也是基於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中提取,並可以慢下來。

您可以設置一個腳本將縮略圖複製到您自己的服務器並將路徑存儲在數據庫中,或者如果您正在運行一系列需要標準品牌的視頻,則可以使用標準縮略圖 - 無論如何希望它有所幫助。

:-D

戴夫

+0

嘿戴夫!真的很好的建議,幫助我很多。我正在使用cakephp,並且經過一些Google搜索之後,我用你的方法提出了一個修改後的答案。現在剩下的就是將呼叫緩存到YouTube,以避免每次有人訪問網站的主頁時獲取Feed。有什麼建議麼? – Tom 2012-01-30 19:16:03

+0

嗨,湯姆,太棒了我很高興幫助:-D,至於緩存飼料,我會快速思考,並在今晚晚些時候回到你身邊。 – dkcwd 2012-01-31 03:31:29

+0

現在更新,一切順利。 – dkcwd 2012-01-31 05:06:37

相關問題