Come si ottengono le durate dei video con la versione 3 dell'API di YouTube?


90

Utilizzo l'API di YouTube v3 per eseguire ricerche su YouTube.

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

Come puoi vedere, la risposta JSON non contiene durate video. C'è un modo per ottenere la durata dei video?

Preferibilmente non chiamare nuovamente un'API per ogni elemento nel risultato (a meno che non sia l'unico modo per ottenere le durate).


22
Tipico di Google, prendere qualcosa che ha funzionato bene e rovinarlo.
Synetech

1
Perché questa domanda è contrassegnata sia con PHP che con Objective-C? Alcune risposte usano anche Python.
Peter Mortensen

Risposte:


125

Dovrai effettuare una chiamata alla risorsa video dell'API dei dati di YouTube dopo aver effettuato la chiamata di ricerca. Puoi inserire fino a 50 ID video in una ricerca, quindi non dovrai chiamarlo per ogni elemento.

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

Ti consigliamo di impostare part=contentDetails, perché la durata è lì.

Ad esempio, la seguente chiamata:

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

Dà questo risultato:

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

L'ora è formattata come una stringa ISO 8601. PT sta per Time Duration, 4M è 4 minuti e 13S è 13 secondi.


4
Qual è questo formato dell'ora? È uno standard supportato da Objective C?
Rukshan Marapana

3
Commento in ritardo, ma forse ti piacerebbe essere da protagonista e tenere d'occhio questo biglietto che richiede che le durate siano incluse nella risposta di ricerca: code.google.com/p/gdata-issues/issues/detail?id=4294
Andrew Nguyen

3
@Andrew - è formattato ISO 8601. Sono d'accordo che sembra piuttosto atroce, ma almeno può essere facilmente convertito in qualsiasi lingua: basta cercare il convertitore ISO 8601.
Matt Koskela

2
Per Python, un'ottima libreria per convertire la durata è aniso8601 . Restituisce un datetime.timedelta, che può essere formattato praticamente in qualsiasi cosa.
arnaudoff

4
Quali video durano settimane su YouTube?!?
Matt Koskela

14

Capito!

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

Lì restituisce l'ora per la versione 3 dell'API di YouTube (la chiave è composta tra l'altro;). ero solito$vId che ero uscito dalla lista dei video restituiti dal canale da cui sto mostrando i video ...

Funziona. Google ha DAVVERO bisogno di includere la durata nello snippet in modo che tu possa ottenere tutto con una chiamata invece di due ... è sulla loro lista "wontfix".


Sì, e includi la durata in formati leggibili dall'uomo come i secondi.
andreszs

2
Cosa ti aspetti? È Google, non fanno nulla nel modo corretto.
Synetech

Hai trovato un modo per ottenere la durata in secondi, sembra essere impossibile convertire dal formato PT **** a secondi.
Loenix

Non ti manca una chiusura }?
Peter Mortensen

7

Ho scritto la seguente classe per ottenere la durata del video di YouTube utilizzando l'API di YouTube v3 (restituisce anche le miniature):

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

Tieni presente che avrai bisogno di API_KEY per utilizzare l'API di YouTube:

  1. Crea un nuovo progetto qui: https://console.developers.google.com/project
  2. Abilita "YouTube Data API" in "API e autenticazione" -> API
  3. Crea una nuova chiave server in "API e autenticazione" -> Credenziali

2

Questo codice estrae la durata del video di YouTube utilizzando l'API di YouTube v3 passando un ID video. Ha funzionato per me.

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

Puoi ottenere la chiave API YouTube del tuo dominio su https://console.developers.google.com e generare le credenziali per le tue esigenze.



1

Durata in secondi utilizzando Python 2.7 e l'API di YouTube 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

Youtube data 3 API, stringa di durata in secondi di conversione in Python

Esempio:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.