Wie erhalte ich mit der YouTube-API-Version 3 Videodauern?

90

Ich verwende YouTube API v3, um YouTube zu durchsuchen.

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

Wie Sie sehen können, enthält die Antwort JSON keine Videodauer. Gibt es eine Möglichkeit, die Videodauer zu ermitteln?

Rufen Sie vorzugsweise nicht erneut eine API für jedes Element im Ergebnis auf (es sei denn, dies ist der einzige Weg, um die Dauer zu ermitteln).

Rukshan Marapana
quelle
22
Typisches Google, das etwas nimmt, das gut funktioniert, und es ruiniert.
Synetech
1
Warum ist diese Frage sowohl mit PHP als auch mit Objective-C gekennzeichnet? Einige Antworten verwenden auch Python.
Peter Mortensen

Antworten:

123

Sie müssen die Video-Ressource der YouTube-Daten-API anrufen, nachdem Sie den Suchanruf getätigt haben. Sie können bis zu 50 Video-IDs in eine Suche einfügen, sodass Sie sie nicht für jedes Element aufrufen müssen.

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

Sie möchten einstellen part=contentDetails, weil die Dauer da ist.

Zum Beispiel der folgende Aufruf:

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

Gibt dieses Ergebnis:

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

Die Zeit ist als ISO 8601-Zeichenfolge formatiert. PT steht für Time Duration, 4M ist 4 Minuten und 13S ist 13 Sekunden.

Matt Koskela
quelle
4
Was ist dieses Zeitformat? Ist es ein Standard, den Objective C unterstützt?
Rukshan Marapana
3
Später Kommentar, aber vielleicht möchten Sie
Andrew Nguyen
3
@ Andrew - es ist ISO 8601 formatiert. Ich bin damit einverstanden, dass es ziemlich grausam aussieht, aber zumindest leicht in jede Sprache konvertiert werden kann - schauen Sie einfach nach ISO 8601 Konverter.
Matt Koskela
2
Für Python ist aniso8601 eine großartige Bibliothek zum Konvertieren der Dauer . Es gibt ein zurück datetime.timedelta, das grundsätzlich zu allem formatiert werden kann.
Arnaudoff
4
Welche Videos sind Wochen lang auf YouTube?!?
Matt Koskela
14

Ich habe es verstanden!

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

Dort wird die Zeit für die YouTube-API-Version 3 zurückgegeben (der Schlüssel besteht übrigens aus;). Ich habe verwendet, $vIddass ich von der zurückgegebenen Liste der Videos des Kanals, von dem ich die Videos zeige, ...

Es klappt. Google muss WIRKLICH die Dauer in das Snippet aufnehmen, damit Sie alles mit einem Anruf statt mit zwei erhalten können. Es steht auf der Liste "Wontfix".

John
quelle
Ja, und geben Sie die Dauer in lesbaren Formaten wie Sekunden an.
andreszs
2
Was erwartest du? Es ist Google, sie machen nichts richtig.
Synetech
Haben Sie einen Weg gefunden, die Dauer in Sekunden zu ermitteln, scheint es schwierig zu sein, vom PT **** -Format in Sekunden zu konvertieren.
Loenix
Vermissen Sie nicht einen Abschluss }?
Peter Mortensen
7

Ich habe die folgende Klasse geschrieben, um die Dauer von YouTube-Videos mithilfe der YouTube-API v3 abzurufen (es werden auch Miniaturansichten zurückgegeben):

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

Bitte beachte, dass du API_KEY benötigst, um die YouTube-API verwenden zu können:

  1. Erstellen Sie hier ein neues Projekt: https://console.developers.google.com/project
  2. Aktivieren Sie "YouTube Data API" unter "APIs & auth" -> APIs
  3. Erstellen Sie einen neuen Serverschlüssel unter "APIs & Auth" -> Anmeldeinformationen
Dima L.
quelle
2

Dieser Code extrahiert die YouTube-Videodauer mithilfe der YouTube-API v3, indem eine Video-ID übergeben wird. Es hat bei mir funktioniert.

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

Sie können den eigenen YouTube-API-Schlüssel Ihrer Domain unter https://console.developers.google.com abrufen und Anmeldeinformationen für Ihre eigenen Anforderungen generieren.

Vignesh Chinnaiyan
quelle
2

Sie können die Dauer aus dem Feld 'contentDetails' in der json-Antwort abrufen.

Geben Sie hier die Bildbeschreibung ein

Maurya Allimuthu
quelle
1

Dauer in Sekunden mit Python 2.7 und der 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
quelle
0

Youtube Data 3 API, Konvertierung von Dauerzeichenfolge in Sekunden in Python

Beispiel:

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
quelle