src
src

Reputation: 115

Getting length of YouTube video (without downloading the video itself)

I need to figure out the simplest method of grabbing the length of a youtube video programmatically given the url of said video.

Is the youtube API the best method? It looks somewhat complicated and I've never used it before so it's likely to take me a bit to get accommodated, but I really just want the quickest solution. I took a glance through the source of a video page in the hopes it might list it there, but apparently it does not (though it lists recommended video times in a very nice list that would be easy to parse). If it is the best method, does anyone have a snippit?

Ideally I could get this done in Python, and I need it to ultimately be in the format of

00:00:00.000

but I'm completely open to any solutions anyone may have.

I'd appreciate any insight.

Upvotes: 0

Views: 9780

Answers (5)

Kalob Taulien
Kalob Taulien

Reputation: 1893

If you're using Python 3 or newer you can perform a GET request against the YouTube v3 API URL. For this you will need the enable the YouTube v3 API in your Google Console and you'll need to create an API credential after you enable the YouTube v3 API.

Code examples below:

import json 
import requests 

YOUTUBE_ID = 'video_id_here'
API_KEY = 'your_youtube_v3_api_key'
url = f"https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id={YOUTUBE_ID}&key={API_KEY}"

response = requests.get(url) # Perform the GET request 
data = response.json() # Read the json response and convert it to a Python dictionary 

length = data['items'][0]['contentDetails']['duration']
print(length)

Or as a reusable function:

import json 
import requests 

API_KEY = 'your_youtube_v3_api_key'
def get_youtube_video_duration(video_id):
    url = f"https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id={video_id}&key={API_KEY}"

    response = requests.get(url) # Perform the GET request 
    data = response.json() # Read the json response and convert it to a Python dictionary 

    return data['items'][0]['contentDetails']['duration']

duration = get_youtube_video_duration('your_video_id')

Note: You can only get fileDetails from the API if you own the video, so you'll need to use the same Google account for your YouTube v3 API key as your YouTube account.

The response from Google will look something like this:

{
    "kind": "youtube#videoListResponse",
    "etag": "\"SJajsdhlkashdkahdkjahdskashd4/meCiVqMhpMVdDhIB-dj93JbqLBE\"",
    "pageInfo": {
        "totalResults": 1,
        "resultsPerPage": 1
    },
    "items": [
        {
            "kind": "youtube#video",
            "etag": "\"SJZWTasdasd12389ausdkhaF94/aklshdaksdASDASddjsa12-18FQ\"",
            "id": "your_video_id",
            "contentDetails": {
                "duration": "PT4M54S",
                "dimension": "2d",
                "definition": "hd",
                "caption": "false",
                "licensedContent": false,
                "projection": "rectangular"
            }
        }
    ]
}

Where your video duration is: PT4M54S which means 4 Minutes 54 Seconds

Edit: To convert the YouTube duration to seconds, see this answer: https://stackoverflow.com/a/49976787/2074077

Once you convert to time to seconds, you can convert seconds into your format with a timedelta.

from datetime import timedelta
time = timedelta(seconds=duration_in_seconds)
print(time)

Upvotes: 0

Joan Triay
Joan Triay

Reputation: 1658

With python and V3 youtube api this is the way for every videos. You need the API key, you can get it here: https://console.developers.google.com/

# -*- coding: utf-8 -*-
import json
import urllib

video_id="6_zn4WCeX0o"
api_key="Your API KEY replace it!"
searchUrl="https://www.googleapis.com/youtube/v3/videos?id="+video_id+"&key="+api_key+"&part=contentDetails"
response = urllib.urlopen(searchUrl).read()
data = json.loads(response)
all_data=data['items']
contentDetails=all_data[0]['contentDetails']
duration=contentDetails['duration']
print duration

Console response:

>>>PT6M22S

Corresponds to 6 minutes and 22 seconds.

Upvotes: 1

Ibrahim Ulukaya
Ibrahim Ulukaya

Reputation: 12877

You can always utilize Data API v3 for this. Just do a videos->list call.

GET https://www.googleapis.com/youtube/v3/videos?part=contentDetails%2C+fileDetails&id={VIDEO_ID}&key={YOUR_API_KEY}

In response get the contentDetails.duration in ISO 8601 format.

Or you can get duration in ms from fileDetails.durationMs.

Upvotes: 0

Velimir Mlaker
Velimir Mlaker

Reputation: 10955

All you have to do is read the seconds attribute in the yt:duration element from the XML returned by Youtube API 2.0. You only end up with seconds resolution (no milliseconds yet). Here's an example:

from datetime import timedelta
from urllib2 import urlopen
from xml.dom.minidom import parseString
for vid in ('wJ4hPaNyHnY', 'dJ38nHlVE78', 'huXaL8qj2Vs'):
    url = 'https://gdata.youtube.com/feeds/api/videos/{0}?v=2'.format(vid)
    s = urlopen(url).read()
    d = parseString(s)
    e = d.getElementsByTagName('yt:duration')[0]
    a = e.attributes['seconds']
    v = int(a.value)
    t = timedelta(seconds=v)
    print(t)

And the output is:

0:00:59
0:02:24
0:04:49

Upvotes: 3

Jeff Posnick
Jeff Posnick

Reputation: 56044

(I'm not sure what "pre-download" refers to.)

The simplest way to get the length of VIDEO_ID is to make an HTTP request for

http://gdata.youtube.com/feeds/api/videos/VIDEO_ID?v=2&alt=jsonc

and then look at the value of the data->duration element that's returned. It will be set to the video's duration in seconds.

Upvotes: 1

Related Questions