2013-03-24 332 views
56

我使用Youtube API v3來搜索youtube。Youtube API v3,如何獲得視頻持續時間?

https://developers.google.com/youtube/v3/docs/search

正如你可以看到JSON不包含視頻持續時間的響應。有沒有辦法獲得視頻的持續時間?最好不要再爲結果中的每個元素調用API(除非這是獲得持續時間的唯一方法)。

+10

典型的谷歌,採取了一些行之有效的工作,並破壞它。 – Synetech 2015-05-30 15:09:27

回答

75

在您進行搜索調用後,您將不得不撥打Youtube Data API的視頻資源。您可以在搜索中放置50個視頻ID,因此您不必爲每個元素調用它。

https://developers.google.com/youtube/v3/docs/videos/list

你要設定的部分= contentDetails,因爲時間是存在的。

例如下面的調用:

https://www.googleapis.com/youtube/v3/videos?id=9bZkp7q19f0&part=contentDetails&key={YOUR_API_KEY} 

給出了這樣的結果:

{ 
"kind": "youtube#videoListResponse", 
"etag": "\"XlbeM5oNbUofJuiuGi6IkumnZR8/ny1S4th-ku477VARrY_U4tIqcTw\"", 
"items": [ 
    { 

    "id": "9bZkp7q19f0", 
    "kind": "youtube#video", 
    "etag": "\"XlbeM5oNbUofJuiuGi6IkumnZR8/HN8ILnw-DBXyCcTsc7JG0z51BGg\"", 
    "contentDetails": { 
    "duration": "PT4M13S", 
    "dimension": "2d", 
    "definition": "hd", 
    "caption": "false", 
    "licensedContent": true, 
    "regionRestriction": { 
    "blocked": [ 
     "DE" 
    ] 
    } 
    } 
    } 
] 
} 

的時間被格式化爲ISO 8601的字符串。 PT代表時間持續時間,4M是4分鐘,13S是13秒。

+0

太棒了!謝謝! – sleepwalkerfx 2013-03-25 05:57:13

+1

這是什麼時間格式?它是Objective C支持的標準嗎? – sleepwalkerfx 2013-03-30 17:28:48

+3

最新評論,但您可能想要明星並密切關注此故障單,請求時長包含在搜索響應中:https://code.google.com/p/gdata-issues/issues/detail?id = 4294 – 2014-03-06 06:54:51

10

Got it!

$dur = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=$vId&key=dldfsd981asGhkxHxFf6JqyNrTqIeJ9sjMKFcX4"); 



$duration =json_decode($dur, true); 
    foreach ($duration['items'] as $vidTime) { 
    $vTime= $vidTime['contentDetails']['duration']; 

它在那裏返回Youtube API V3的時間。 [關鍵是由方式;] 我用$vId,我已經從渠道的視頻的返回列表中脫離我顯示的視頻從...

它的作品.. :)谷歌真的需要在片段中包含持續時間,以便您可以通過一次調用而不是兩次......嘆息.......這是在他們的'wontfix'列表中。

+0

是的,並且包括持續時間在人類可讀的格式,如秒。 – andreszs 2015-05-09 00:09:58

+0

你期望什麼?這是谷歌,他們不會以正確的方式做任何事情。 – Synetech 2015-05-30 15:14:28

+0

你有沒有找到一種方法來獲得在幾秒鐘內的持續時間,它似乎是ahrd從PT ****格式轉換爲秒。 – Loenix 2016-10-08 08:45:53

6

我編寫了以下課程,使用YouTube API v3獲取YouTube視頻時長。 (它返回縮略圖以及)

class Youtube 
{ 
    static $api_key = '<API_KEY>'; 
    static $api_base = 'https://www.googleapis.com/youtube/v3/videos'; 
    static $thumbnail_base = 'https://i.ytimg.com/vi/'; 

    // $vid - video id in youtube 
    // returns - video info 
    public static function getVideoInfo($vid) 
    { 
     $params = array(
      'part' => 'contentDetails', 
      'id' => $vid, 
      'key' => self::$api_key, 
     ); 

     $api_url = Youtube::$api_base . '?' . http_build_query($params); 
     $result = json_decode(@file_get_contents($api_url), true); 

     if(empty($result['items'][0]['contentDetails'])) 
      return null; 
     $vinfo = $result['items'][0]['contentDetails']; 

     $interval = new DateInterval($vinfo['duration']); 
     $vinfo['duration_sec'] = $interval->h * 3600 + $interval->i * 60 + $interval->s; 

     $vinfo['thumbnail']['default']  = self::$thumbnail_base . $vid . '/default.jpg'; 
     $vinfo['thumbnail']['mqDefault']  = self::$thumbnail_base . $vid . '/mqdefault.jpg'; 
     $vinfo['thumbnail']['hqDefault']  = self::$thumbnail_base . $vid . '/hqdefault.jpg'; 

     $vinfo['thumbnail']['sdDefault']  = self::$thumbnail_base . $vid . '/sddefault.jpg'; 
     $vinfo['thumbnail']['maxresDefault'] = self::$thumbnail_base . $vid . '/maxresdefault.jpg'; 

     return $vinfo; 
    } 
} 

請注意,你需要API_KEY使用YouTube API:

  1. 創建一個新的項目在這裏:https://console.developers.google.com/project
  2. 啓用 「YouTube數據API」 「驗證API &」下 - >的API
  3. 創建「的API &身份驗證」下新的服務器密鑰 - >憑證
0

持續時間在使用Python 2.7和YouTube API第3版秒:以小時,分鐘,並且使用正則表達式秒

try:   
     dur = entry['contentDetails']['duration'] 
     try: 
      minutes = int(dur[2:4]) * 60 
     except: 
      minutes = 0 
     try: 
      hours = int(dur[:2]) * 60 * 60 
     except: 
      hours = 0 

     secs = int(dur[5:7]) 
     print hours, minutes, secs 
     video.duration = hours + minutes + secs 
     print video.duration 
    except Exception as e: 
     print "Couldnt extract time: %s" % e 
     pass 
2

獲取的持續時間(在Python 3測試)

import re 
def parse_ISO8601(dur): 
    test1 = rex("PT(.+?)H", dur) 
    if test1: 
     return int(test1.group(1))*3600 
    test2 = rex("PT(.+?)H(.+?)M",dur) 
    if test2: 
     h,m = [int(x) for x in test2.groups()] 
     return 3600*h+60*m 
    test3 = rex("PT(.+?)H(.+?)S",dur) 
    if test3: 
     h,s = [int(x) for x in test3.groups()] 
     return 3600*h+s 
    test4 = rex("PT(.+?)H(.+?)M(.+?)S",dur) 
    if test4: 
     h,m,s = [int(x) for x in test4.groups()] 
     return 3600*h+60*h+s 
    test5 = rex("PT(.+?)M", dur) 
    if test5: 
     return int(test5.group(1))*60 
    test6 = rex("PT(.+?)M(.+?)S",dur) 
    if test6: 
     m,s = [int(x) for x in test6.groups()] 
     return 60*m+s 
    test7 = rex("PT(.+?)S",dur) 
    if test7: 
     return int(test7.group(1)) 
    print("CAN'T PARSE FUCKING GOOGLE FORMATTING:",dur) 
    return False #I'm out ... 
+0

你用什麼庫來做雷克斯?它是rex還是rex。我用python-rex庫試了你的代碼(假設是那個),它說你有一個正則表達式錯誤。 – Spartacus 2015-11-11 21:52:16

+0

@Spartacus我認爲我在rex()有一些lambda,做re.search或者某事。 'rex = lambda x,y:re.search(x,y).groups()' – mikroskeem 2015-11-13 07:01:36

+0

Gotcha。謝謝! – Spartacus 2015-11-20 14:45:36

2

此代碼提取的Youtube視頻持續時間使用Youtube API v3通過傳遞視頻ID,它爲我工作。

<?php 
function getDuration($videoID){ 
    $apikey = "YOUR-Youtube-API-KEY"; // Like this AIcvSyBsLA8znZn-i-aPLWFrsPOlWMkEyVaXAcv 
    $dur = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=$videoID&key=$apikey"); 
    $VidDuration =json_decode($dur, true); 
    foreach ($VidDuration['items'] as $vidTime) 
    { 
     $VidDuration= $vidTime['contentDetails']['duration']; 
    } 
    preg_match_all('/(\d+)/',$VidDuration,$parts); 
    return $parts[0][0].":".$parts[0][1].":".$parts[0][2]; // Return 1:11:46 (i.e) HH:MM:SS 
} 
echo getDuration("zyeubYQxHyY"); // Video ID 
?> 

您可以獲取域的自己的YouTube API密鑰https://console.developers.google.com並生成自己需要的憑據。

相關問題