contentDetails or duration not coming using Youtube v3 api
Asked Answered
C

3

6

Look at this link , there is an example given

https://www.googleapis.com/youtube/v3/videos?id=7lCDEYXw3mM&key=YOUR_API_KEY
 &part=snippet,contentDetails,statistics,status

Part of the response is

"contentDetails": {
    "duration": "PT15M51S",
    "aspectRatio": "RATIO_16_9"
   },

Now I want to retrieve contentDetails or mainly duration. So I called using

https://www.googleapis.com/youtube/v3/search?part=snippet,contentDetails&key=[API_KEY]&q=something&maxResults=15&&fields=items,nextPageToken,prevPageToken,tokenPagination

It shows

{
error: {
errors: [
{
domain: "youtube.part",
reason: "unknownPart",
message: "contentDetails",
locationType: "parameter",
location: "part"
}
],
code: 400,
message: "contentDetails"
}
}

Why? What am I missing? How to retrieve the duration for videos?

Canst answered 10/12, 2014 at 5:24 Comment(0)
A
30

As you've already found out, the Search:list call does not support contentDetails for the part parameter.

The part names that you can include in the parameter value for Search:list are id and snippet, and those return very little data. We're supposed to use that very little data from a search if we want to get more specific data on a video or videos.

So, to get a video duration when doing a search, you'll have to make a call like

GET https://www.googleapis.com/youtube/v3/search?part=id&q=anything&key={YOUR_API_KEY}

and extract the videoId from the response items

"id": {
"kind": "youtube#video",
"videoId": "5hzgS9s-tE8"
}

and use that to make the Videos:list call to get more specific data

https://www.googleapis.com/youtube/v3/videos?id=5hzgS9s-tE8&key=YOUR_API_KEY&part=snippet,contentDetails,statistics,status

and extract the duration from the response data

 "contentDetails": {
 "duration": "PT15M51S",
 "aspectRatio": "RATIO_16_9"
 },
Ague answered 11/12, 2014 at 4:7 Comment(3)
Really!! So for 100 videos' list I need to send 100 requests to youtube api !!!! Now that's sooooooo silly......Canst
No, you can actually make a batch call of up to 50 videos at once.Ague
I'm still struggling with getting values for contentDetails and statistics. I created a stack overflow question on for this here: #36315374Haircloth
A
7

Step 1: You have a list video id by using Search: list
For example you receive 3 youtube video id like:
{ zOYW7FO9rzA, zOYW7FO9rzA, -vH2eZAM30s}
Step 2: You have to put the list of youtube video id for the second call.

https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=zOYW7FO9rzA,zOYW7FO9rzA,-vH2eZAM30s&key={Your API KEY} 

Therefore, you won't have to make a call for each video
The result will be:

{
 "kind": "youtube#videoListResponse",
 "etag": "\"iDqJ1j7zKs4x3o3ZsFlBOwgWAHU/p3KyUGr7ZRowLgKTqVFixrx7-mQ\"",
 "pageInfo": {
  "totalResults": 3,
  "resultsPerPage": 3
 },
 "items": [
  {
   "kind": "youtube#video",
   "etag": "\"iDqJ1j7zKs4x3o3ZsFlBOwgWAHU/psAhg0bxv1n1IfKwXhrPMV223YE\"",
   "id": "zOYW7FO9rzA",
   "contentDetails": {
    "duration": "PT1M21S",
    "dimension": "2d",
    "definition": "hd",
    "caption": "false",
    "licensedContent": false
   }
  },
  {
   "kind": "youtube#video",
   "etag": "\"iDqJ1j7zKs4x3o3ZsFlBOwgWAHU/YCi772AbPZizPuAFci702rE55tU\"",
   "id": "T3Ysb9O3EWI",
   "contentDetails": {
    "duration": "PT1H28M47S",
    "dimension": "2d",
    "definition": "hd",
    "caption": "false",
    "licensedContent": false
   }
  },
  {
   "kind": "youtube#video",
   "etag": "\"iDqJ1j7zKs4x3o3ZsFlBOwgWAHU/2BnWErqkysQERsaRNyd1ffGgJes\"",
   "id": "-vH2eZAM30s",
   "contentDetails": {
    "duration": "PT12M57S",
    "dimension": "2d",
    "definition": "hd",
    "caption": "false",
    "licensedContent": false
   }
  }
 ]
}

The format duration: 1H1M1S = 1 hour & 1 minute & 1 second

Autrey answered 23/7, 2015 at 4:44 Comment(0)
P
3

Using your links above, here is a quick php example on how to make only those two calls for a maximum of 50 results per call

$JSON = file_get_contents('https://www.googleapis.com/youtube/v3/search?part=snippet&q=cats&fields=items%2CnextPageToken%2CprevPageToken%2CtokenPagination&maxResults=50&key={YOUR_API_KEY});

The above link will search for cats (q=cats) and will fetch maxResults=50.

Onwards, we store each id in a string divided by commas

$get_duration="";

foreach ($JSON_Data->items as $ids) {

        $get_duration .=$ids->id->videoId.",";
}

$get_duration = rtrim($get_duration, ",");

Finally, we make the second call using the batch ids contained in $get_duration and display the title and duration of each video

$JSON= file_get_contents('https://www.googleapis.com/youtube/v3/videos?part=snippet%2CcontentDetails%2Cstatistics%2Cstatus&id='.$get_duration.'&key={YOUR_API_KEY}');

$JSON_Data = json_decode($JSON);

foreach ($JSON_Data->items as $ids) {

        $date = new DateTime('1970-01-01');
        $date->add(new DateInterval($ids->contentDetails->duration));
        echo "Title: ".$ids->snippet->title."\nDuration: {$date->format('H:i:s')}\n\n";
}

The result will be something like this

> Title: Cats Being Jerks Video Compilation || FailArmy 
> Duration: 00:08:33
> 
> Title: Ultimate cat vines compilation - Best cat vines 2014 / 2015
> Duration: 00:14:58
> 
> Title: Funny cats annoying owners - Cute cat compilation 
> Duration: 00:05:58
> 
> Title: Funny Cats Compilation 60 min - NEW in HD 2014 
> Duration: 00:57:51
Propertius answered 17/5, 2015 at 1:19 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.