Bagaimana cara mendapatkan durasi video dengan API YouTube versi 3?


93

Saya menggunakan YouTube API v3 untuk menelusuri YouTube.

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

Seperti yang Anda lihat, respons JSON tidak berisi durasi video. Adakah cara untuk mendapatkan durasi video?

Lebih disukai tidak memanggil API untuk setiap elemen dalam hasil lagi (kecuali itu satu-satunya cara untuk mendapatkan durasi).


24
Khas Google, mengambil sesuatu yang bekerja dengan baik dan merusaknya.
Synetech

1
Mengapa pertanyaan ini diberi tag dengan PHP dan Objective-C? Beberapa jawaban juga menggunakan Python.
Peter Mortensen

Jawaban:


128

Anda harus melakukan panggilan ke sumber daya video API data YouTube setelah melakukan panggilan penelusuran. Anda dapat memasukkan hingga 50 ID video dalam satu penelusuran, jadi Anda tidak perlu memanggilnya untuk setiap elemen.

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

Anda ingin mengatur part=contentDetails, karena durasinya ada.

Misalnya, panggilan berikut:

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

Memberikan hasil ini:

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

Waktu diformat sebagai string ISO 8601. PT adalah singkatan dari Time Duration, 4M adalah 4 menit, dan 13S adalah 13 detik.


4
Apa format waktu ini? Apakah ini standar yang didukung Objective C?
Rukshan Marapana

3
Komentar terlambat, tapi mungkin Anda ingin membintangi dan mengawasi durasi permintaan tiket ini untuk disertakan dalam respons penelusuran: code.google.com/p/gdata-issues/issues/detail?id=4294
Andrew Nguyen

3
@ Andrew - itu adalah ISO 8601 diformat. Saya setuju bahwa ini terlihat sangat mengerikan, tetapi setidaknya dapat dengan mudah dikonversi dalam bahasa apa pun - lihat saja konverter ISO 8601.
Matt Koskela

2
Untuk Python, pustaka yang bagus untuk mengonversi durasinya adalah aniso8601 . Ini mengembalikan a datetime.timedelta, yang pada dasarnya dapat diformat menjadi apa saja.
arnaudoff

4
Video apa yang berdurasi berminggu-minggu di YouTube?!?
Matt Koskela

14

Saya mendapatkannya!

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

Di sana ia mengembalikan waktu untuk API YouTube versi 3 (kuncinya dibuat dengan cara;). Saya menggunakan $vIdbahwa saya telah keluar dari daftar video yang dikembalikan dari saluran tempat saya menunjukkan video dari ...

Berhasil. Google BENAR-BENAR perlu memasukkan durasi dalam potongan sehingga Anda bisa mendapatkan semuanya dengan satu panggilan, bukan dua ... itu ada di daftar 'wontfix' mereka.


Ya, dan sertakan durasi dalam format yang dapat dibaca manusia seperti detik.
andreszs

2
Apa yang kamu harapkan? Ini Google, mereka tidak melakukan apa pun dengan cara yang benar.
Synetech

Apakah Anda menemukan cara untuk mendapatkan durasi dalam hitungan detik, tampaknya ahrd untuk mengkonversi dari format PT **** ke detik.
Loenix

Apakah Anda tidak melewatkan penutupnya }?
Peter Mortensen

7

Saya menulis kelas berikut untuk mendapatkan durasi video YouTube menggunakan YouTube API v3 (ia juga mengembalikan thumbnail):

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

Harap perhatikan bahwa Anda memerlukan API_KEY untuk menggunakan API YouTube:

  1. Buat proyek baru di sini: https://console.developers.google.com/project
  2. Aktifkan "API Data YouTube" di bawah "API & auth" -> API
  3. Buat kunci server baru di bawah "API & auth" -> Kredensial

2

Kode ini mengekstrak durasi video YouTube menggunakan YouTube API v3 dengan meneruskan ID video. Itu berhasil untuk saya.

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

Anda bisa mendapatkan kunci API YouTube domain Anda sendiri di https://console.developers.google.com dan membuat kredensial untuk kebutuhan Anda sendiri.



1

Durasi dalam hitungan detik menggunakan Python 2.7 dan 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

Data Youtube 3 API, konversi string durasi ke detik dengan Python

Contoh:

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.