potyk.io
🔒

Разбор YouTube-ссылки

По ссылке на ролик YouTube получить краткие данные о видео — сейчас используется в Находках при добавлении.

Зачем

Не вводить название ролика руками: достаточно вставить ссылку.

Как получается название

Разбор идёт в браузере, до сохранения формы (сервер YouTube сам не дергает).

  1. Ссылка проверяется: это YouTube (youtube.com, youtu.be, мобильный или music.youtube) или нет.
  2. Если да — страница запрашивает у YouTube публичный oEmbed по этой ссылке (короткий JSON о ролике).
  3. Сначала запрос идёт напрямую из браузера. Если не вышло (часто из‑за CORS) — тот же oEmbed повторяется через публичный CORS-прокси.
  4. Из ответа берётся поле title — это и есть название ролика.
  5. Пока запрос идёт, кнопка отправки на короткое время недоступна; после ответа форма уходит дальше уже с названием (или без него — см. сценарии).

Сервер приложения название с YouTube не подтягивает: он только сохраняет то, что пришло из формы.

Обложка ролика

Да, тем же способом можно. В том же ответе oEmbed есть URL превью (thumbnail_url) — обложка ролика.

Сейчас обложка не используется: берётся только title. Если понадобится превью в находках или другой фиче — его можно взять из того же ответа, без отдельного API YouTube.

В oEmbed также есть автор и другие поля; они тоже сейчас не используются.

Пример

Ролик: https://www.youtube.com/watch?v=_-4OT56LQUw

oEmbed-ссылка собирается так:

https://www.youtube.com/oembed?url=<URL ролика>&format=json

Для этого ролика:

https://www.youtube.com/oembed?url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D_-4OT56LQUw&format=json

Ответ — JSON, например:

{
  "title": "The Garden - Live at HLPtv",
  "author_name": "HLPtv",
  "author_url": "https://www.youtube.com/@highlandparktv",
  "type": "video",
  "height": 150,
  "width": 200,
  "version": "1.0",
  "provider_name": "YouTube",
  "provider_url": "https://www.youtube.com/",
  "thumbnail_height": 360,
  "thumbnail_width": 480,
  "thumbnail_url": "https://i.ytimg.com/vi/_-4OT56LQUw/hqdefault.jpg",
  "html": "<iframe … src=\"https://www.youtube.com/embed/_-4OT56LQUw?feature=oembed\" …></iframe>"
}

Сейчас из ответа берётся только title. Обложка — thumbnail_url (сейчас не используется).

Сценарии

Получить название ролика

Что делает пользователь: вставляет ссылку на YouTube и отправляет форму, где нужен разбор.

Ожидаемый результат:

  1. Название берётся из oEmbed, как выше.
  2. Если название получить удалось — дальше в фиче используется оно.
  3. Если нет — вместо названия подставляется сама ссылка.

Ссылка не на YouTube

Ожидаемый результат: разбор не запускается; дальше в фиче используется сама ссылка (или то, что фича задаёт без YouTube).