GAPI

Формат ответа

Один объект, всегда одинаковый. Поле, которое не применимо, приходит как null, а не исчезает — поэтому вашему парсеру не нужно проверять, есть ли ключ.

Верхний уровень

ПолеТипПримечание
platformstringКакой площадке принадлежала ссылка: instagram, youtube, tiktok, facebook, vk, threads, twitter, reddit или pinterest
typestringvideo, image, album либо audio, если у YouTube просили mp3
titlestring | nullПодпись или название видео, если у поста они есть
authorstring | nullИмя аккаунта или канала, если площадка его сообщает
thumbnailstring | nullКартинка предпросмотра
durationnumber | nullДлительность в секундах, если площадка её сообщает
mediaarrayВсегда есть, всегда хотя бы один элемент

Внутри media

ПолеТипПримечание
typestringvideo, image или audio
urlstringПрямая ссылка на один файл. У видео звук уже внутри, склеивать после ничего не нужно.
qualitystring | nullВысота, в которой VK закодировал этот вариант, подписью вида 1080p, либо формат, который вы попросили у YouTube. Везде остальное null.
extstring | nullmp4 или mp3 там, где площадка это сообщает, и null там, где нет

Что заполнено всегда

platform, type и media всегда что-то содержат. Остальные четыре — нет: одна и та же площадка на одной ссылке вернёт автора, а на следующей null. Считайте все четыре необязательными, и сюрпризов не будет.

Единственный эндпоинт с другой формой

/v2/youtube/info ничего не качает, поэтому и класть в media ему нечего. Вместо этого он отвечает фактами о ролике: id, author_url, все размеры превью и массив formats, где у каждого качества указан размер в байтах. Это тело показано на странице YouTube.

Как под это писать

data = response.json()

if data["type"] == "album":
    print(len(data["media"]), "files")

for item in data["media"]:
    download(item["url"])