Перейти к документации
developers
deep player · для разработчиков

Плеер deep.
На вашем сайте.

Встройте видео через iframe, выберите серию и озвучку, получайте события просмотра через JavaScript API.

Один iframeСобытия прогрессаВход через deep
01

Быстрый старт

Для подключения получите у deep идентификатор partner и согласуйте адреса сайтов, на которых будет размещён плеер. Идентификатор подключения используется в публичной ссылке на iframe.

  1. Укажите ваш сайт

    Адрес включает схему, домен и порт. Например, https://site.example. Версии с www и без www согласуются отдельно.

  2. Выберите произведение

    Замените title-slug на slug из ссылки deep, а my-site — на свой идентификатор подключения.

  3. Добавьте iframe

    Укажите сезон, серию и озвучку. Если выбор озвучки не нужен, уберите параметр audio.

Встраивание плеера HTML
<iframe
  id="deep-player"
  src="https://embed.deep-ent.ru/title-slug?partner=my-site&amp;season=1&amp;episode=1&amp;audio=studio-slug&amp;parentOrigin=https%3A%2F%2Fsite.example"
  title="Плеер deep"
  allow="autoplay; fullscreen; picture-in-picture; encrypted-media"
  allowfullscreen
  sandbox="allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox"
  style="width:100%;aspect-ratio:16/9;border:0"
></iframe>

Все ID, slug и домены в примерах вымышленные. Замените их значениями своего подключения.

Вход должен открываться в отдельной вкладке

Сохраните атрибуты allow и sandbox из примера. Они нужны для воспроизведения, полноэкранного режима и входа через deep, в том числе в Safari.

02

Параметры URL

Базовый адрес: https://embed.deep-ent.ru/title-slug. Дополнительные параметры передаются в строке запроса.

Параметры URL плеера
ПараметрПо умолчанию / условиеОписание
title-slugВ пути URLSlug произведения из ссылки deep.
partnerОбязательноИдентификатор подключения, полученный от deep.
parentOriginАдрес сайтаТочная схема, домен и порт страницы с iframe: https://site.example. Можно не передавать, если браузер сообщает адрес родителя; при явном указании используйте URL-кодировку.
season1Номер сезона, целое число от 1.
episode1Номер серии, целое число от 0.
audioАвтовыборSlug озвучки. Если дорожка недоступна, плеер выберет доступную и отправит warning.
startНачало серииНачальная позиция в целых секундах от 0, не дальше конца видео.
autoplayВыключено1 — попытаться запустить видео автоматически. Браузер может запретить запуск.
mutedВыключено1 — запустить без звука. Обычно используется вместе с autoplay=1.

Параметр parentOrigin можно не передавать: плеер определит сайт по данным браузера или Referer. SDK также подставляет его автоматически. Если сайт скрывает сведения о родителе, передайте точный адрес через URLSearchParams или используйте SDK. Маска домена в этом параметре не подходит.

Размер iframe задаёт ваш сайт. Сохраняйте соотношение 16:9 и достаточную высоту для элементов управления. Для целочисленных параметров верхняя граница — 2 147 483 647.

03

JavaScript SDK

Обычный iframe работает самостоятельно. Подключите SDK, если нужно управлять видео или получать события на своей странице. Создавайте один экземпляр DeepPlayer на iframe.

Подключение SDK HTML + JavaScript
<!-- Добавьте после iframe -->
<script src="https://embed.deep-ent.ru/sdk/v1.js"></script>
<script>
  const player = new DeepPlayer(
    document.getElementById('deep-player'),
    { timeout: 15000 }
  );

  player.on('statechange', (state) => {
    // ready означает, что видео готово к управлению.
    console.log(state.status);
  });

  // Подключение канала API, а не начало воспроизведения.
  player.ready
    .then(() => player.getState())
    .then((state) => console.log(state))
    .catch((error) => console.error(error.code));
</script>
API подключён ≠ видео готово

player.ready подтверждает связь с iframe. Перед управлением воспроизведением дождитесь state.status === 'ready' через getState() или событие statechange.

Методы JavaScript SDK
МетодДействие
play()Запустить воспроизведение. Браузер может потребовать клик внутри плеера.
pause()Поставить видео на паузу.
seek(seconds)Перейти к позиции в секундах, от 0 до длительности видео.
setEpisode(season, episode)Запросить другую серию. Promise подтверждает приём команды; результат загрузки приходит событием.
setAudio(slug)Выбрать озвучку по slug доступной дорожки.
setVolume(value)Установить громкость числом от 0 до 1.
setMuted(boolean)Включить или выключить звук.
getState()Получить текущие параметры и состояние плеера.
on(event, handler)Подписаться на событие; возвращает экземпляр плеера.
off(event, handler)Удалить обработчик события; передайте ту же функцию.
destroy()Удалить обработчики SDK и отклонить ожидающие команды. Сам iframe удалите отдельно.

Команды управления и getState() возвращают Promise. Обрабатывайте ошибки через catch; их машинный код доступен в error.code.

Управление просмотром JavaScript
// Вызывайте из обработчика действия пользователя.
async function selectEpisode(season, episode) {
  try {
    await player.setEpisode(season, episode);
    // Загрузка завершится событием episodechange/statechange.
  } catch (error) {
    console.error(error.code);
  }
}

async function playFrom(seconds) {
  try {
    await player.seek(seconds);
    await player.play();
  } catch (error) {
    // Браузер может потребовать клик внутри самого iframe.
    console.error(error.code);
  }
}
04

События и прогресс

Подписывайтесь через player.on(event, handler). События воспроизведения содержат публичное состояние текущей серии.

События плеера
СобытиеКогда приходит / данные
readyКанал API подключён. Готовность самого видео проверяйте по state.status.
statechangeОбновилось состояние: loading, ready, locked или error.
timeupdateПрогресс воспроизведения, не чаще одного события в секунду.
play / pause / endedВоспроизведение началось, приостановлено или достигло конца.
seeked / volumechangeИзменилась позиция, громкость или состояние звука.
episodechange / audiochangeЗагружена серия или выбрана озвучка.
authchange{ authenticated: true | false } — изменилось подключение аккаунта.
accesschange{ status: "available" | "locked" } — изменился доступ к серии.
warningНекритичная проблема, например недоступная запрошенная озвучка.
error{ code, state } — ошибка плеера; state содержит публичное состояние.
Состояние плеера JSON
{
  "title": "title-slug",
  "season": 1,
  "episode": 2,
  "episodeId": "00000000-0000-4000-8000-000000000001",
  "audio": "studio-slug",
  "positionSec": 120.4,
  "durationSec": 1440,
  "paused": false,
  "muted": false,
  "volume": 0.8,
  "status": "ready"
}

Статусы: loading — загрузка, ready — готов к просмотру, locked — нужен доступ, error — ошибка. Пока новая серия загружается, её episodeId может быть null, а позиция и длительность равны нулю.

Получение прогресса JavaScript
let lastReported = 0;
function onProgress(state) {
  if (state.status !== 'ready' || !state.episodeId) return;
  if (Date.now() - lastReported < 10000) return;
  lastReported = Date.now();

  // Передайте эти поля в систему прогресса вашего сайта.
  console.log({
    title: state.title,
    season: state.season,
    episode: state.episode,
    audio: state.audio,
    positionSec: state.positionSec,
    durationSec: state.durationSec
  });
}

player.on('timeupdate', onProgress);
player.on('pause', (state) => console.log('Пауза', state));
player.on('ended', (state) => console.log('Серия завершена', state));

// При удалении плеера со страницы (например, в SPA):
function disposePlayer() {
  player.off('timeupdate', onProgress);
  player.destroy();
  document.getElementById('deep-player')?.remove();
}

Решение о сохранении прогресса на вашем сайте принимает ваша интеграция. Для продолжения после перезагрузки передайте сохранённую позицию в start или вызовите seek() после готовности видео.

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

05

Вход и подписка

Бесплатные серии

Просмотр без аккаунта

Доступное бесплатное видео запускается прямо на вашем сайте.

Серии по подписке

Вход на deep

Плеер покажет предложение войти или оформить подписку. Зритель завершит действие на deep и продолжит просмотр в iframe.

Для группы поддоменов можно согласовать правило https://*.example.com. Оно включает все уровни поддоменов; сам https://example.com подключается отдельно.

Форму входа и покупку обрабатывает deep. На стороне вашего сайта достаточно оставить стандартные элементы плеера доступными и при необходимости слушать authchange и accesschange.

Вход сохраняется при обновлении страницы в той же вкладке на время сессии плеера — до 6 часов. При закрытии вкладки, истечении сессии или запрете хранения данных браузером потребуется повторное подключение. Доступ к конкретной серии всегда проверяет deep. Наличие идентификатора партнёра не открывает платное видео.

06

Если что-то не работает

Плеер недоступен для этого сайта

Проверьте ID partner и адрес страницы. Поддомены можно подключить маской https://*.example.com; основной домен и другой порт добавляются отдельно. Передайте нужные адреса команде deep для подключения.

Видео не запускается автоматически

Используйте autoplay=1 вместе с muted=1. Если браузер всё равно блокирует запуск, предложите нажать «Смотреть» внутри iframe.

«Сайт не разрешил плееру защищённое воспроизведение»

Часть серий защищена DRM. Добавьте encrypted-media в атрибут allow у iframe и у каждого внешнего iframe. В режиме инкогнито и во встроенных браузерах приложений защищённое видео может быть недоступно.

В Safari не открывается вход

Сохраните allow-popups и allow-popups-to-escape-sandbox в sandbox. Вход открывается по нажатию зрителя в отдельной вкладке.

Плеер вложен в несколько iframe

Все страницы-предки должны использовать согласованные адреса. Проверьте sandbox каждого внешнего iframe.

not_ready

Подождите state.status === "ready" перед управлением видео. player.ready подтверждает только подключение API.

invalid_argument / audio_unavailable

Проверьте номера сезона и серии, диапазон громкости, позицию и slug озвучки.

play_blocked

Для воспроизведения нужен клик зрителя внутри самого плеера.

timeout / reloaded

Проверьте сеть и загрузку iframe. При замене iframe создайте новый экземпляр DeepPlayer.

rate_limited / unsupported_command / destroyed

Сократите частоту команд, используйте методы SDK v1 и не обращайтесь к экземпляру после destroy().

Проверяйте подключение на согласованном домене

Открытие HTML через file:// или размещение на другом поддомене меняет адрес страницы. Для тестового стенда заранее согласуйте отдельный HTTPS-адрес.