5 votes

API Youtube - Obtenir la durée des vidéos d'une liste de lecture

J'ai besoin d'obtenir la durée de toutes les vidéos d'une liste de lecture Youtube. Je sais que l'API ne me montre pas la durée de chaque vidéo lors de la recherche de toutes, mais elle la montre si la requête est faite pour une vidéo particulière.

Par le biais de PHP, j'ai essayé de collecter tous les ID de la liste de lecture et ensuite d'analyser chaque ID pour obtenir les données des vidéos, mais le script est trop lent, bien qu'il faille souligner qu'il fonctionne bien, y a-t-il un moyen de l'optimiser ?....

    function youtube_automusic($listas, $api_key, $resultados){
        $nresultados = $resultados;
        $lista_reproduccion_random = $listas;
        $lista_reproduccion = $lista_reproduccion_random[array_rand($lista_reproduccion_random)];
        $url_playlist = "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&fields=items(snippet(resourceId(videoId)))&type=video&videoCategoryId=10&maxResults=".$nresultados."&playlistId=".$lista_reproduccion."&key=".$api_key;
        $data = dlPage($url_playlist);
        $data_decode = json_decode($data, true);

        $number_song = 1;
        $respuesta = array();
        foreach ($data_decode as $items){
            foreach ($items as $item){
                $lista_ids =$item['snippet']['resourceId']['videoId'];
                $url_video = "https://www.googleapis.com/youtube/v3/videos?id=".$lista_ids."&part=snippet,contentDetails&fields=items(etag,id,snippet(publishedAt,title,thumbnails(default(url)),tags),contentDetails(duration))&key=".$api_key;
                $data_video = dlPage($url_video);
                $data_video_decode = json_decode($data_video, true);
                foreach ($data_video_decode as $items_videos){
                    foreach ($items_videos as $item_video){
                        $data_final = array(
                            'etag' => $item_video['etag'],
                            'idvideo' => $item_video['id'],
                            'titulovideo' => $item_video['snippet']['title'],
                            'thumbnail' => $item_video['snippet']['thumbnails']['default']['url'],
                            'duracion' => $item_video['contentDetails']['duration'],
                            'videoplay' => $number_song++
                        );
                        array_push($respuesta, $data_final);
                    }
                }   
            }
        }
        return json_encode($respuesta);         
    }

3voto

johnh10 Points 2548

Avec votre code sur une liste de lecture de 50 éléments, il faudrait 51 appels API.

Au lieu d'effectuer une seule demande de vidéos pour chaque vidéo de la sélection, obtenez d'abord tous les ID des vidéos de la sélection, puis effectuez des demandes de vidéos pour un maximum de 50 à la fois (le paramètre ID prend une liste de 50 éléments maximum séparés par des virgules).

Une liste de lecture de 50 éléments ne nécessiterait alors que 2 appels d'API.

Cela devrait être beaucoup plus rapide.

0voto

DaImTo Points 3712

Je viens de faire un test ici%252Ctags)%252CcontentDetails(duration))&_h=1&)

Demande :

GET https://www.googleapis.com/youtube/v3/videos?part=snippet%2CcontentDetails&id=Ks-_Mh1QhMc&fields=items(etag%2Cid%2Csnippet(publishedAt%2Ctitle%2Cthumbnails(default(url))%2Ctags)%2CcontentDetails(duration))&key=%2Ctags)%2CcontentDetails(duration))&key=) {VOTRE_API_KEY}

Résultats :

{
 "items": [
  {
   "etag": "\"RmznBCICv9YtgWaaa_nWDIH1_GM/aCBUdsaX0W34z3It8a8FCh5uteo\"",
   "id": "Ks-_Mh1QhMc",
   "snippet": {
    "publishedAt": "2012-10-01T15:27:35.000Z",
    "title": "Your body language may shape who you are | Amy Cuddy",
    "thumbnails": {
     "default": {
      "url": "https://i.ytimg.com/vi/Ks-_Mh1QhMc/default.jpg"
     }
    },
    "tags": [
     "Amy Cuddy",
     "TED",
     "TEDTalk",
     "TEDTalks",
     "TED Talk",
     "TED Talks",
     "TEDGlobal",
     "brain",
     "business",
     "psychology",
     "self",
     "success"
    ]
   },
   "contentDetails": {
    "duration": "PT21M3S"
   }
  }
 ]
}

Je vous suggère d'exécuter la même requête à l'aide de l'explorateur d'API de Google en utilisant l'identifiant de la vidéo qui vous pose problème afin de vérifier que ce n'est pas un problème d'API qui ne renvoie pas votre durée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X