Como obtenho durações de vídeo com a versão 3 da API do YouTube?

90

Estou usando a API do YouTube v3 para pesquisar no YouTube.

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

Como você pode ver, a resposta JSON não contém durações de vídeo. Existe maneira de obter durações de vídeo?

De preferência, não chamar uma API para cada elemento no resultado novamente (a menos que essa seja a única maneira de obter durações).

Rukshan Marapana
fonte
22
Típico do Google, pegando algo que funcionava bem e estragando tudo.
Synetech
1
Por que esta questão está marcada com PHP e Objective-C? Algumas respostas também usam Python.
Peter Mortensen

Respostas:

125

Você terá que fazer uma chamada para o recurso de vídeo da API de dados do YouTube depois de fazer a chamada de pesquisa. Você pode colocar até 50 IDs de vídeo em uma pesquisa, então você não terá que chamá-lo para cada elemento.

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

Você vai querer definir part=contentDetails, porque a duração está lá.

Por exemplo, a seguinte chamada:

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

Dá este resultado:

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

A hora é formatada como uma string ISO 8601. PT significa Duração do Tempo, 4M é 4 minutos e 13S é 13 segundos.

Matt Koskela
fonte
4
Qual é esse formato de hora? É um padrão que o Objective C suporta?
Rukshan Marapana
3
Comentário atrasado, mas talvez você gostaria de estrelar e ficar de olho neste tíquete solicitando durações sejam incluídos na resposta da pesquisa: code.google.com/p/gdata-issues/issues/detail?id=4294
Andrew Nguyen
3
@Andrew - é formatado com ISO 8601. Eu concordo que parece muito atroz, mas pelo menos pode ser facilmente convertido em qualquer idioma - basta procurar o conversor ISO 8601.
Matt Koskela
2
Para Python, uma ótima biblioteca para converter a duração é aniso8601 . Ele retorna um datetime.timedelta, que pode ser formatado basicamente para qualquer coisa.
Arnaudoff
4
Que vídeos duram semanas no YouTube?!?
Matt Koskela
14

Deixa comigo!

$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á, ele retorna o tempo para a versão 3 da API do YouTube (a chave é composta por;). Usei $vIdque saí da lista devolvida de vídeos do canal de onde estou exibindo os vídeos ...

Funciona. O Google REALMENTE precisa incluir a duração no snippet para que você possa obter tudo com uma chamada em vez de duas ... está na lista 'wontfix' deles.

John
fonte
Sim, e inclui a duração em formatos legíveis por humanos, como segundos.
andreszs
2
O que você espera? É o Google, eles não fazem nada da maneira correta.
Synetech
Você encontrou uma maneira de obter a duração em segundos, parece que foi possível converter do formato PT **** para segundos.
Loenix,
Você não está perdendo um fechamento }?
Peter Mortensen
7

Eu escrevi a seguinte aula para obter a duração do vídeo do YouTube usando a API do YouTube v3 (ela também retorna miniaturas):

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

Observe que você precisará de API_KEY para usar a API do YouTube:

  1. Crie um novo projeto aqui: https://console.developers.google.com/project
  2. Ative a "API de dados do YouTube" em "APIs e autenticação" -> APIs
  3. Crie uma nova chave de servidor em "APIs e autenticação" -> Credenciais
Dima L.
fonte
2

Este código extrai a duração do vídeo do YouTube usando a API do YouTube v3, passando um ID de vídeo. Funcionou para mim

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

Você pode obter a chave de API do YouTube do seu domínio em https://console.developers.google.com e gerar credenciais para suas próprias necessidades.

Vignesh Chinnaiyan
fonte
2

Você pode obter a duração no campo 'contentDetails' na resposta json.

insira a descrição da imagem aqui

Maurya Allimuthu
fonte
1

Duração em segundos usando Python 2.7 e a API do 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
andrea-f
fonte
0

API de dados 3 do YouTube, string de duração para conversão de segundos em Python

Exemplo:

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
fonte