YouTube REST API server на node.js

Презентации делать не умею, но в целом это HTTP-сервер для получения информации о видео на YouTube :man_shrugging:

Для запуска сервера, введите в консоли node main.js -port <port_number>.
После этого станет доступен эндпоинт: GET /api/get_video_info?video_id=<VIDEO_ID>, который возвращает информацию о видео, такую как: название, описание, эскизы (thumbnails), дата публикации, ссылки для скачивания. По-умолчанию в ответе содержится как полная (необработанная) информация, так и распарсенная, в которой все нужные данные удобно собраны в одном месте. Можно использовать её, либо распарсить вручную с нуля.
Если ссылки для скачивания не нужны, в query запроса можно добавить параметр requested_data со значением parsed_video_info и/или raw_video_info. Таким образом вернётся только информация о видео, без ссылок. А так же, это сокращает время обработки запроса (и даёт серверу возможность лишний раз не дёргать API, которое сейчас дёргается с большим трудом).
Если требуется скачать видео, которое недоступно просто так (например, 18+ или видео с доступом “private”), есть возможность отправить POST-запрос с куками. Куки должны быть переданы в формате массива JSON. По-быстрому получить такой массив можно при помощи плагина для хромых браузеров: https://github.com/BlackMightyRavenDark/cookie_viewer_chromium_extension. Написал его сам специально для этой цели.
У сервера есть WEB UI (веб-морда) по адресу GET /web_ui. Там же есть более подробная информация по запросам. Страница справки нуждается в доработке. Когда-нибудь я её допилю.
А также, в веб-морде можно ввести ссылку на видео и отобразить ссылки для скачивания прямо на странице:

Если на сервере не произошло никаких ошибок, то кнопки с форматами будут кликабельными. Так как браузеры умеют воспроизводить медиа-файлы, можно предварительно открыть и посмотреть/прослушать каждый формат прямо в браузере. Для скачивания видео нужно скачать требуемые форматы по полученным ссылкам (любой качалкой), дав файлам любые имена (расширение необходимо прописать то, которое указано на кнопке с форматом). Затем, нужно объединить файлы в контейнер (например, с помощью FFMPEG). Предполагается, что это всё должна делать некая программа-клиент в автоматическом режиме. Но делать это можно и вручную.

Примечания по использованию:

  • Сервер разрабатывался и тестировался в режиме обработки одного запроса за раз. Многопоточность в JavaScript я пилить не умею! Что произойдёт, если запросить несколько видео одновременно - не знаю. По-этому, рекомендую не обращаться к этому серверу в многопотоке.
  • Так как доступ к YouTube API осуществляется через протокол HTTP, если делать запросы слишком часто, можно получить ошибку 429 Too Many Requests. То же самое может произойти, если в браузере слишком часто тыкать клавишу F5. При этом ютуб выдаст вам бан по IP на пару дней и другие скачивалки тоже перестанут работать. Возможно, при заходе на ютуб из браузера, с вас попросят ввести капчу. Если ошибка 429 всё-таки произошла, то через 2-3 дня всё должно вернуться в обычный режим.
  • У ютуба сейчас усилилась защита от ботов, в следствии чего API для скачивания стало работать через пень-колоду. Один и тот же вызов может то работать, то не работать. В случае, если API меняется (а меняться оно может довольно часто), вызов старой версии запроса также может приводить к бану по IP на какое-то время. При этом, когда бан всё-таки состоялся, если попытаться посмотреть видео в браузере, вам скажут, что вы бот и попросят зайти в аккаунт. Если зайти в аккаунт - всё должно быть нормально. Такой бан обычно действует 7 дней (иногда 10 или 12). Первые 4 дня вам пишут, что вы бот. На пятый день начинают писать, что “Видео недоступно”. А в течении 7-го дня бан должны снять (до следующего неправильного вызова API). Кстати, во всех других скачивалках происходит точно такая же фигня. Единственный способ этого избежать - вовремя фиксить код вызова API. Но, однако, не любой неправильный вызов API приводит к бану. Чаще всего, сервер API ютуба просто перестаёт выдавать ссылки для скачивания, но не банит.
  • Куки. Их можно передать с помощью POST-запроса, описанного на странице справки в веб-интерфейсе (GET /web_ui). Справка написана немного сумбурно и находится в процессе доработки, но разобраться в ней можно. Куки позволяют качать видео, помеченные как 18+. А так же обойти защиту от бота, если ютуб посчитал вас ботом. ВАЖНО! Я не рекомендую использовать куки от вашего основного аккаунта. Всегда есть вероятность, что аккаунт вообще забанят! Лучше создать второй аккаунт и брать куки от него. Если вы всё-таки используете куки, рекомендую обновлять их 2-3 раза в день (так как сами они не обновляются). А ещё лучше - обновляйте их перед каждым запросом (так проблем будет меньше).
  • Учитывая всё вышесказанное, иногда при первом запросе выдаются нерабочие ссылки для скачивания. Но при последующих запросах, обычно, уже всё нормально. Если после нескольких запросов подряд рабочие ссылки для скачивания получить так и не удалось (но при этом остальная информация получена), это значит, что в API ютуба что-то изменилось и данный сервер нуждается в обновлении. Лучше не повторять попытки получить ссылки до того как сервер будет обновлён!