6.3 YouTube API

•第零項

Youtube API主要用於影片的處理

裡面有許多的功能可以使用,這個範例是運用javascript API做簡單的應用

http://code.google.com/apis/youtube/js_example_1.html 版主以這個為藍本

摸了一下之後.. 又加了一些功能,做成簡單的範例網頁

http://www.csie.fju.edu.tw/~ie955141/youtubeTest.html

裡面定義了許多function,那些function主要都是呼叫Player的APImethod來使用,使用上    

其實不會很複雜。可以開啟原始碼來看它的code。

範例中,值得注意的是,裡面有定義一個updateytplayerInfo()的function,這個使用在    onYouTubePlayerReady(playerId)這個function裡面,而這個function定義影片播放時所該做的事情。整段的語法是這樣

function onYouTubePlayerReady(playerId) {
ytplayer = document.getElementById("myytplayer");
setInterval(updateytplayerInfo, 250);
updateytplayerInfo();
ytplayer.addEventListener("onStateChange", "onytplayerStateChange");
ytplayer.addEventListener("onError", "onPlayerError");
}

剛剛提到的updateytplayerInfo()就是做更新內容的功能。 它會在影片播放過程中 不斷更新資料。

目前還在摸索階段,所以深入功能還沒摸清楚,有待強者繼續補充其他方面的資訊。

=================歡迎繼續向下補充================================

以上面那位同學的說法,javascript的api似乎著重於player的控制

那如果要取得youtube的data時要怎麼做呢?

其實google code上面有其他語言的api可以達到上述的要求

以下就以PHP為例

Zend Framework提供了許多google api的php framework

這邊只著重於youtube api

基本上的用法是使用者提供feed url給method

method就會去抓取feed並轉成物件return

那使用者怎麼知道feed url長甚麼樣子?

有兩個方法

第一個方法

可以上google code找範例

但其實不用這麼麻煩

第二個方法

Zend Framework裡面也有許多method或物件可以幫你轉成feed url

以下就以搜尋關鍵字為範例

 

function searchAndPrint($searchTerms)
{
$yt = new Zend_Gdata_YouTube($httpClient, $applicationId, $clientId, $developeKey);
$query = $yt->newVideoQuery();        //建立一個query的物件
$query->setAuthor("wecolab");     //設定要找哪個使用者
$query->setMaxResults(50);            //設定最大回傳幾個結果
$query->setOrderBy('viewCount');      //設定排序的方法
$query->setRacy('include');
$query->setVideoQuery($searchTerms);  //設定關鍵字
$videoFeed = $yt->getVideoFeed($query);
printVideoFeed($videoFeed, 'Search results for: ' . $searchTerms); //這method google code有,就不詳細寫出來了
}


code $query其實就是幫你轉成feed url的物件

 

上面其實就是簡單的把feeds印出來

這時將feed url丟進getVideoFeed()

就可以取得wecolab的前50個有$searchTerms關鍵字的影片feeds

並且以viewCount觀看次數排序

這時候可能有使用者在想可不可以把setMaxResults()設定成回傳所有results?

答案是不可以

因為youtube api最多只能回傳50個results

而設預是回傳25個results

如果想要全部的results呢?

有兩個方法

第一個
query物件可以設定result開始的位置

$query->setStartIndex(51);

這樣就可以從第51的result開始回傳

再搭配$videoFeed->getTotalResults() 可以取得總共有幾個results

然後使用loop迴圈就可以取得所有result

第二個方法我沒有使用過

http://framework.zend.com/manual/en/zend.gdata.html#zend.gdata.introduction.paging

如果result沒有全部回傳的話

feed本身就會包含下一段要回傳的feed url

只要利用$feed->getLink('next')就可以取得下一段回傳的feed url

比如說總共有100筆result

他回傳1-50筆result

但是發現後面還有

就會再加一個回傳51-100筆result的feed url

而當你去要51-100筆result時

由於已經全部回傳了

所以就不會在加上下一段的feed url

同樣使用loop迴圈就可以取得所有資料

詳情請看Zend framework

範例:http://140.136.150.74/youtubeSearch.php

function searchAndPrintVideosByKeywords($searchTermsArray)
{
  $yt
= new Zend_Gdata_YouTube();
  $query
= $yt->newVideoQuery();
  $query
->setOrderBy('viewCount');
  $query
->setRacy('include');
  $keywordQuery
= '';
 
foreach ($searchTermsArray as $searchTerm) {
    $keywordQuery
.= strtolower($searchTerm) . '/';
 
}
  $query
->setCategory($keywordQuery);
  $videoFeed
= $yt->getVideoFeed($query);
  printVideoFeed
($videoFeed, 'Search results for keyword search:');
}

 以上是限制你找到的東西,只顯示符合分類跟關鍵字的影片

而youtube api不只包含video的data

也有像是profile,playlist...的data可以抓取

甚至也可以新增,刪除影片,playlist

這些部分就請其他有興趣的人繼續補完

=====================================================================

我來提供一下關鍵字的搜尋以及熱門影片等等的一些資訊好了

因為都是使用JSON來編輯

其實JSON也就跟Javascript是差不多的東西

只是更為便利,

我在我的部落格有稍微介紹

我來講一下關鍵字等等的搜尋 

當今天你若是要搜尋一個關鍵字,

然後要秀出有幾筆資料,

可以用下面這行程式碼

<script
type="text/javascript"
src="http://gdata.youtube.com/feeds/api/videos?q=關鍵字&alt=json-in-script&callback=showMyVideos2&max-results=搜尋的影片數量&format=5">
</script>

也就是說,在關鍵字的地方放入你所想搜尋的

然後再搜尋的影片數量那邊打入你想要的影片數量

出來就是你所要的結果,不過當然上面要有callback fuction來顯示他所蒐尋到的data 

下面這個則是本週被觀看過最多次的影片

<script
type="text/javascript"
src="http://gdata.youtube.com/feeds/api/standardfeeds/most_viewed?time=this_week&alt=json-in-script&callback=showMyVideos2&max-results=搜尋的影片數量&format=5">
</script>

以上都是在Script裡面編輯 

===================================================

這是youtube 提供的 vedio 可以直接放進你網頁裡 有search 功能和播放功能

簡單來說是一個陽春版youtube

<div align="left">
  <!-- Ajax Search Api and Stylesheet
  // Note: If you are already using the AJAX Search API, then do not include it
  //       or its stylesheet again
  -->
  <script src="http://www.google.com/uds/api?file=uds.js&v=1.0&source=uds-vbw"
    type="text/javascript"></script>
  <style type="text/css">
    @import url("http://www.google.com/uds/css/gsearch.css");
    </style>
   
  <!-- Video Bar Code and Stylesheet -->
  <script type="text/javascript">
    window._uds_vbw_donotrepair = true;
    </script>
  <script src="http://www.google.com/uds/solutions/videobar/gsvideobar.js?mode=new"
    type="text/javascript"></script>
  <style type="text/css">
    @import url("http://www.google.com/uds/solutions/videobar/gsvideobar.css");
    </style>
  <style type="text/css">
    .playerInnerBox_gsvb .player_gsvb {
      width : 480px;
      height : 295px;
    }
    </style>
  <script type="text/javascript">
    function LoadVideoBar(ab) {
    var videoBar;
    var options = {
        largeResultSet : true,
        horizontal : true,
        autoExecuteList : {
          cycleTime : GSvideoBar.CYCLE_TIME_MEDIUM,
          cycleMode : GSvideoBar.CYCLE_MODE_LINEAR,
          executeList : [ab]
        }
      }
    videoBar = new GSvideoBar(document.getElementById("videoBar-bar"),
                              GSvideoBar.PLAYER_ROOT_FLOATING,
                              options);
    }
    // arrange for this function to be called during body.onload
    // event processing
    GSearch.setOnLoadCallback(LoadVideoBar);
    </script>
</div>

還有更多可以參考↓

http://code.google.com/intl/zh-TW/apis/youtube/1.0/developers_guide_php.html