Просмотр без аккаунта
Доступное бесплатное видео запускается прямо на вашем сайте.
Встройте видео через iframe, выберите серию и озвучку, получайте события просмотра через JavaScript API.
Для подключения получите у deep идентификатор partner и согласуйте адреса сайтов, на которых будет размещён плеер. Идентификатор подключения используется в публичной ссылке на iframe.
Адрес включает схему, домен и порт. Например, https://site.example. Версии с www и без www согласуются отдельно.
Замените title-slug на slug из ссылки deep, а my-site — на свой идентификатор подключения.
Укажите сезон, серию и озвучку. Если выбор озвучки не нужен, уберите параметр audio.
<iframe
id="deep-player"
src="https://embed.deep-ent.ru/title-slug?partner=my-site&season=1&episode=1&audio=studio-slug&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.
Базовый адрес: https://embed.deep-ent.ru/title-slug. Дополнительные параметры передаются в строке запроса.
| Параметр | По умолчанию / условие | Описание |
|---|---|---|
title-slug | В пути URL | Slug произведения из ссылки deep. |
partner | Обязательно | Идентификатор подключения, полученный от deep. |
parentOrigin | Адрес сайта | Точная схема, домен и порт страницы с iframe: https://site.example. Можно не передавать, если браузер сообщает адрес родителя; при явном указании используйте URL-кодировку. |
season | 1 | Номер сезона, целое число от 1. |
episode | 1 | Номер серии, целое число от 0. |
audio | Автовыбор | Slug озвучки. Если дорожка недоступна, плеер выберет доступную и отправит warning. |
start | Начало серии | Начальная позиция в целых секундах от 0, не дальше конца видео. |
autoplay | Выключено | 1 — попытаться запустить видео автоматически. Браузер может запретить запуск. |
muted | Выключено | 1 — запустить без звука. Обычно используется вместе с autoplay=1. |
Параметр parentOrigin можно не передавать: плеер определит сайт по данным браузера или Referer. SDK также подставляет его автоматически. Если сайт скрывает сведения о родителе, передайте точный адрес через URLSearchParams или используйте SDK. Маска домена в этом параметре не подходит.
Размер iframe задаёт ваш сайт. Сохраняйте соотношение 16:9 и достаточную высоту для элементов управления. Для целочисленных параметров верхняя граница — 2 147 483 647.
Обычный iframe работает самостоятельно. Подключите SDK, если нужно управлять видео или получать события на своей странице. Создавайте один экземпляр DeepPlayer на iframe.
<!-- Добавьте после 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>player.ready подтверждает связь с iframe. Перед управлением воспроизведением дождитесь state.status === 'ready' через getState() или событие statechange.
| Метод | Действие |
|---|---|
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.
// Вызывайте из обработчика действия пользователя.
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);
}
}Подписывайтесь через 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 содержит публичное состояние. |
{
"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, а позиция и длительность равны нулю.
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() после готовности видео.
События браузера помогают интерфейсу и аналитике, но не подтверждают оплату или право доступа к видео. Состояние плеера не содержит данные аккаунта или ссылки на видеофайлы.
Доступное бесплатное видео запускается прямо на вашем сайте.
Плеер покажет предложение войти или оформить подписку. Зритель завершит действие на deep и продолжит просмотр в iframe.
Для группы поддоменов можно согласовать правило https://*.example.com. Оно включает все уровни поддоменов; сам https://example.com подключается отдельно.
Форму входа и покупку обрабатывает deep. На стороне вашего сайта достаточно оставить стандартные элементы плеера доступными и при необходимости слушать authchange и accesschange.
Вход сохраняется при обновлении страницы в той же вкладке на время сессии плеера — до 6 часов. При закрытии вкладки, истечении сессии или запрете хранения данных браузером потребуется повторное подключение. Доступ к конкретной серии всегда проверяет deep. Наличие идентификатора партнёра не открывает платное видео.
Проверьте ID partner и адрес страницы. Поддомены можно подключить маской https://*.example.com; основной домен и другой порт добавляются отдельно. Передайте нужные адреса команде deep для подключения.
Используйте autoplay=1 вместе с muted=1. Если браузер всё равно блокирует запуск, предложите нажать «Смотреть» внутри iframe.
Часть серий защищена DRM. Добавьте encrypted-media в атрибут allow у iframe и у каждого внешнего iframe. В режиме инкогнито и во встроенных браузерах приложений защищённое видео может быть недоступно.
Сохраните allow-popups и allow-popups-to-escape-sandbox в sandbox. Вход открывается по нажатию зрителя в отдельной вкладке.
Все страницы-предки должны использовать согласованные адреса. Проверьте sandbox каждого внешнего iframe.
Подождите state.status === "ready" перед управлением видео. player.ready подтверждает только подключение API.
Проверьте номера сезона и серии, диапазон громкости, позицию и slug озвучки.
Для воспроизведения нужен клик зрителя внутри самого плеера.
Проверьте сеть и загрузку iframe. При замене iframe создайте новый экземпляр DeepPlayer.
Сократите частоту команд, используйте методы SDK v1 и не обращайтесь к экземпляру после destroy().
Открытие HTML через file:// или размещение на другом поддомене меняет адрес страницы. Для тестового стенда заранее согласуйте отдельный HTTPS-адрес.