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).

Rukshan Marapana
sumber
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.

Matt Koskela
sumber
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.

John
sumber
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
Dima L.
sumber
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.

Vignesh Chinnaiyan
sumber
2

Anda bisa mendapatkan durasi dari kolom 'contentDetails' di respons json.

masukkan deskripsi gambar di sini

Maurya Allimuthu
sumber
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
andrea-f
sumber
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
Maurya Allimuthu
sumber