Получение длины видео на YouTube (без загрузки самого видео)

Мне нужно выяснить самый простой способ захвата длины видео на YouTube программно с учетом URL-адреса указанного видео.

Является ли API YouTube лучшим методом? Это выглядит несколько сложно, и я никогда не использовал его раньше, поэтому, вероятно, мне потребуется немного времени, чтобы приспособиться, но я действительно просто хочу самое быстрое решение. Я просмотрел источник страницы с видео в надежде, что он может быть указан там, но, по-видимому, это не так (хотя он перечисляет рекомендуемое время видео в очень красивом списке, который было бы легко проанализировать). Если это лучший метод, у кого-нибудь есть фрагмент?

В идеале я мог бы сделать это на Python, и мне нужно, чтобы в конечном итоге это было в формате

00:00:00.000

но я полностью открыт для любых решений, которые могут быть у кого-то.

Я был бы признателен за любую информацию.


person src    schedule 21.06.2013    source источник
comment
не питон, но может быть полезен всем, кто сталкивается с gist.github.com/Fauntleroy/5167736   -  person cuddlemeister    schedule 01.03.2021


Ответы (5)


Все, что вам нужно сделать, это прочитать атрибут seconds в элементе yt:duration из XML, возвращаемого Youtube API 2.0. Вы получаете только секундное разрешение (пока нет миллисекунд). Вот пример:

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)

И вывод:

0:00:59
0:02:24
0:04:49
person Velimir Mlaker    schedule 21.06.2013
comment
Это прекрасно удовлетворило все мои потребности, большое спасибо за эти знания и пример. - person src; 21.06.2013
comment
этот URL больше ничего не возвращает. Вы должны использовать API Google с ключом API, как описано в ответе Джоан stackoverflow.com/a/33725265/2205372. - person Ambrose Leung; 16.06.2017

(Я не уверен, что означает «предварительная загрузка».)

Самый простой способ получить длину VIDEO_ID — сделать HTTP-запрос для

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

а затем посмотрите на возвращаемое значение элемента data->duration. Будет установлена ​​продолжительность видео в секундах.

person Jeff Posnick    schedule 21.06.2013
comment
О, теперь я вижу, как это сделать, спасибо за это понимание. Я использовал ffmpeg, чтобы получить длину видео после того, как уже скачал его, но мне нужно было другое решение. - person src; 21.06.2013
comment
Кажется, больше не работает. Я думаю, что это предложение 2013 года устарело - person CPBL; 09.05.2021


Для этого всегда можно использовать Data API v3. Просто выполните вызов videos->list.

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

В ответ получите contentDetails.duration в ISO 8601.

Или вы можете получить продолжительность в мс из fileDetails.durationMs.

person Ibrahim Ulukaya    schedule 21.06.2013
comment
Только владелец контента может получить доступ к свойствам fileDetails.durationMs. - person sirvon; 10.08.2013

Если вы используете Python 3 или новее, вы можете выполнить запрос GET к API YouTube v3 URL. Для этого вам потребуется включить API YouTube v3 в ваша консоль Google и вам потребуется создать учетные данные API после включения YouTube v3 API.

Примеры кода ниже:

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)

Или как повторно используемая функция:

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')

Примечание. Получить сведения о файле из API можно только в том случае, если вы являетесь владельцем видео, поэтому вам потребуется использовать ту же учетную запись Google для ключа API YouTube v3, что и для учетной записи YouTube.

Ответ от Google будет выглядеть примерно так:

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

Где продолжительность вашего видео: PT4M54S, что означает 4 Minutes 54 Seconds

Изменить: чтобы преобразовать продолжительность YouTube в секунды, см. этот ответ: https://stackoverflow.com/a/49976787/2074077

Как только вы конвертируете время в секунды, вы можете преобразовать секунды в свой формат с помощью timedelta.

from datetime import timedelta
time = timedelta(seconds=duration_in_seconds)
print(time)
person Kalob Taulien    schedule 14.03.2020