Làm cách nào để nhận thời lượng video với YouTube API phiên bản 3?


90

Tôi đang sử dụng YouTube API v3 để tìm kiếm trên YouTube.

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

Như bạn có thể thấy, JSON phản hồi không chứa thời lượng video. Có cách nào để lấy thời lượng video không?

Tốt hơn là không gọi lại API cho từng phần tử trong kết quả (trừ khi đó là cách duy nhất để lấy thời lượng).


22
Google điển hình, lấy thứ gì đó hoạt động tốt và phá hỏng nó.
Synetech

1
Tại sao câu hỏi này được gắn thẻ với cả PHP và Objective-C? Một số câu trả lời cũng sử dụng Python.
Peter Mortensen

Câu trả lời:


123

Bạn sẽ phải thực hiện cuộc gọi đến tài nguyên video của API dữ liệu YouTube sau khi thực hiện lệnh tìm kiếm. Bạn có thể đặt tối đa 50 ID video trong một tìm kiếm, vì vậy bạn sẽ không phải gọi nó cho mỗi phần tử.

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

Bạn sẽ muốn đặt part=contentDetails, vì thời lượng ở đó.

Ví dụ: cuộc gọi sau:

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

Cho kết quả này:

{
 "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"
     ]
    }
   }
  }
 ]
}

Thời gian được định dạng dưới dạng chuỗi ISO 8601. PT là viết tắt của Time Duration, 4M là 4 phút và 13S là 13 giây.


4
Định dạng thời gian này là gì? Nó có phải là một tiêu chuẩn mà Objective C hỗ trợ không?
Rukshan Marapana,

3
Nhận xét muộn, nhưng có thể bạn muốn gắn dấu sao và theo dõi vé này yêu cầu thời lượng được đưa vào phản hồi tìm kiếm: code.google.com/p/gdata-issues/issues/detail?id=4294
Andrew Nguyen

3
@Andrew - nó được định dạng ISO 8601. Tôi đồng ý rằng nó trông khá tàn bạo, nhưng ít nhất nó có thể dễ dàng chuyển đổi bằng bất kỳ ngôn ngữ nào - chỉ cần tra cứu bộ chuyển đổi ISO 8601.
Matt Koskela

2
Đối với Python, một thư viện tuyệt vời để chuyển đổi thời lượng là aniso8601 . Nó trả về a datetime.timedelta, có thể được định dạng thành bất kỳ thứ gì về cơ bản.
arnaudoff

4
Những video nào dài hàng tuần trên YouTube?!?
Matt Koskela

14

Tôi hiểu rồi!

$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'];
}

Ở đó, nó trả về thời gian cho YouTube API phiên bản 3 (nhân tiện, khóa được tạo thành;). Tôi đã sử dụng $vIdrằng tôi đã thoát khỏi danh sách trả về các video từ kênh mà tôi đang hiển thị các video từ ...

Nó hoạt động. Google THỰC SỰ cần bao gồm thời lượng trong đoạn mã để bạn có thể nhận được tất cả bằng một cuộc gọi thay vì hai cuộc gọi ... nó có trong danh sách 'wontfix' của họ.


Có, và bao gồm thời lượng ở các định dạng con người có thể đọc được, chẳng hạn như giây.
andreszs

2
Bạn mong chờ điều gì? Đó là Google, họ không làm bất cứ điều gì theo cách chính xác.
Synetech

Bạn đã tìm ra cách để có thời lượng tính bằng giây, có vẻ như đó là cách chuyển đổi từ định dạng PT **** sang giây.
Loenix

Không phải bạn đang bỏ lỡ một cuộc đóng cửa }?
Peter Mortensen

7

Tôi đã viết lớp sau để xem thời lượng video trên YouTube bằng API YouTube v3 (nó cũng trả về hình thu nhỏ):

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;
    }
}

Xin lưu ý rằng bạn sẽ cần API_KEY để sử dụng API YouTube:

  1. Tạo một dự án mới tại đây: https://console.developers.google.com/project
  2. Bật "API dữ liệu YouTube" trong "API và xác thực" -> API
  3. Tạo khóa máy chủ mới trong "API & auth" -> Thông tin đăng nhập

2

Mã này trích xuất thời lượng video YouTube bằng API YouTube v3 bằng cách chuyển ID video. Nó đã làm việc cho tôi.

<?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
?>

Bạn có thể nhận khóa API YouTube của riêng miền của mình trên https://console.developers.google.com và tạo thông tin xác thực cho yêu cầu của riêng bạn.


2

Bạn có thể lấy thời lượng từ trường 'contentDetails' trong phản hồi json.

nhập mô tả hình ảnh ở đây


1

Thời lượng tính bằng giây khi sử dụng Python 2.7 và YouTube API v3:

    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

0

API dữ liệu Youtube 3, chuyển đổi chuỗi thời lượng thành giây bằng Python

Thí dụ:

convert_YouTube_duration_to_seconds ('P2DT1S')
172801

convert_YouTube_duration_to_seconds ('PT2H12M51S')
7971

def convert_YouTube_duration_to_seconds(duration):
   day_time = duration.split('T')
   day_duration = day_time[0].replace('P', '')
   day_list = day_duration.split('D')
   if len(day_list) == 2:
      day = int(day_list[0]) * 60 * 60 * 24
      day_list = day_list[1]
   else:
      day = 0
      day_list = day_list[0]
   hour_list = day_time[1].split('H')
   if len(hour_list) == 2:
      hour = int(hour_list[0]) * 60 * 60
      hour_list = hour_list[1]
   else:
      hour = 0
      hour_list = hour_list[0]
   minute_list = hour_list.split('M')
   if len(minute_list) == 2:
      minute = int(minute_list[0]) * 60
      minute_list = minute_list[1]
   else:
      minute = 0
      minute_list = minute_list[0]
   second_list = minute_list.split('S')
   if len(second_list) == 2:
      second = int(second_list[0])
   else:
      second = 0
   return day + hour + minute + second
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.