Changes

Jump to: navigation, search

Engine HTTP API

7,603 bytes removed, 14:18, 12 July 2017
no edit summary
==About==
==Общее описание==
Since version 3.1 we implemented API to control app engine via HTTP. To do that, you should send appropriate HTTP GET query to engine (default IP:port is 127.0.0.1:6878)
Начиная с версии 3.1 появилась возможность управлять движком по протоколу HTTP. Для передачи команды движку нужно отправить HTTP GET запрос на http-порт движка. Порт по умолчанию: 6878.
 
==Limitations==
==Ограничения==
You can't use HTTP API with AJAX queries from secured (https) pages, because HTTP API is not secured, and such behaviour (http query from https page) will be blocked by browser.
HTTP API движка нельзя использовать с помощью AJAX-запросов с HTTPS-страниц.
So you must have and serve a dedicated unsecured page on your secured site to work with engine HTTP API.
 
==Checking local engine availability==
Технически невозможно отправить AJAX-запрос движку с HTTPS-страницы, так как общение с движком осуществляется по незащищенному протоколу HTTP. Все такие запросы блокируются всеми современные браузерами.
Send JSON query to <nowiki>http://127.0.0.1:6878/webui/api/service?method=get_version&format=jsonp</nowiki>. If app engine is running, then it return version string in JSON format.
 
Some examples:
При необходимости работать с движком со своего https-сайта вебмастер должен создать для этих целей незащищенную http-страницу.
1. Query:
 
<nowiki>
==Проверка наличия движка==
При необходимости проверить наличие движка у пользователя необходимо отправить JSONP запрос на адрес <nowiki>http://127.0.0.1:6878/webui/api/service?method=get_version&format=jsonp</nowiki>. Если движок запущен, то выдаст свою версию в ответ на запрос.
 
Пример запроса:
<nowiki>Запрос:
http://127.0.0.1:6878/webui/api/service?method=get_version&format=jsonp&callback=mycallback
 
Response:
Ответ:
mycallback({"result": {"code": 3002300, "version": "3.1.0-rc2"}, "error": null});</nowiki>
 
Fields description:
Ответ состоит и таких полей:
*'''version''' - версияengine движкаversion, в виде строкиstring (например, "3.0.12")
*'''code''' - engine version, integer (30012)
*'''code''' - версия движка в виде целого числа (для удобства сравнения версий, например 30012)
 
2. Simple page with check button (JSONP-queries served by jQuery):
Пример HTML-страницы с кнопкой для проверки движка (JSONP-запросы отправляются с помощью библиотеки jQuery):
<nowiki><!DOCTYPE html>
<html>
</html></nowiki>
 
==Методы API methods==
В описаниях методовTerms: <tt>''<engine_address>''</tt> - этоapp ip-адресengine IP движкаaddress, <tt>''<engine_port>''</tt> - http-портapp engine HTTP движкаport.
Common params:
Все методы принимают такие общие параметры:
*'''sid''' - [[#player id|player id]] (optional)
*'''sid''' - [[#Идентификатор плеера|идентификатор плеера]] (необязательный параметр)
*'''id''' - идентификатор контента (content id) (условно обязательныйconditional параметрparam)
*'''infohash''' - infohashtransport транспортногоfile файлаinfohash (.acelive либоor .torrent файлаfile) (условно обязательныйconditional параметрparam)
*'''url''' - link to transport file (conditional param)
*'''url''' - ссылка на транспортный файл (условно обязательный параметр)
*'''path''' - local path to transport file (conditional param)
*'''path''' - путь к транспортному файлу в локальной файловой системе (условно обязательный параметр)
 
ВIn запросахthe наquery стартto воспроизведенияthe обязательноapp долженengine присутствоватьat одинleast изone параметровof params <tt>id</tt>, <tt>infohash</tt>, <tt>url</tt>, <tt>path</tt> must be present.
 
===How to get HLS stream===
===Получение потока в формате HLS===
Query:
<tt><nowiki>http://<engine_address>:<engine_port>/ace/manifest.m3u8</nowiki></tt>
 
As response app engine should return HLS playlist. If any error occured, then engine return HTTP error code 4хх or 5хх with brief error description.
В ответ на данную команду движок выдаст HLS плейлист для воспроизведения запрашиваемого контента. В случае ошибки будет возвращен HTTP код 4хх либо 5хх с кратким описанием ошибки.
 
Params:
Параметры:
*'''transcode_audio''' - транскодироватьtranscode всеall аудиоaudio вtracks to AAC, (параметр принимает значенияvalues: 0 либоor 1, по умолчаниюdefault 0)
*'''transcode_mp3''' - неdo транскодироватьnot transcode MP3 track(параметрs), принимает значения(values: 0 либоor 1, по умолчаниюdefault 0)
*'''transcode_ac3''' - транскодироватьtranscode толькоonly AC3 track(параметрs), принимает значения(values: 0 либоor 1, по умолчаниюdefault 0)
*'''preferred_audio_language''' - предпочитаемыйthree языкchar аудио-дорожкиcode (3-значныйof кодpreffered language, списокfull list - [http://xml.coverpages.org/nisoLang3-1994.html здесь])
 
Example:
Пример:
<nowiki>http://127.0.0.1:6878/ace/manifest.m3u8?id=dd1e67078381739d14beca697356ab76d49d1a2d</nowiki>
 
===ПолучениеHow потокаto поget HTTP stream===
Query:
<tt><nowiki>http://<engine_address>:<engine_port>/ace/getstream</nowiki></tt>
 
ВAs ответresponse наapp даннуюengine командуshould движокreturn будетstream выдаватьdata данные в видеas http progressive download. ВIf случаеany ошибкиerror будетoccured, возвращенthen engine return HTTP кодerror code 4хх либоor 5хх сwith краткимbrief описаниемerror ошибкиdescription.
 
Example:
Пример:
<nowiki>http://127.0.0.1:6878/ace/getstream?id=dd1e67078381739d14beca697356ab76d49d1a2d</nowiki>
 
===ЗапускHow to play HLS-трансляции broadcast===
Query:
<tt><nowiki>http://<engine_address>:<engine_port>/hls/manifest.m3u8</nowiki></tt>
 
You can play via app engine any HLS broadcast, just pass link to the HLS playlist to the engine (<tt>manifest_url</tt> param).
Данная команда позволяет запустить через движок любую HLS-трансляцию. Для запуска достаточно передать движку ссылку на HLS-плейлист (параметр <tt>manifest_url</tt>).
 
Params:
Параметры:
*'''manifest_url''' - URLHLS трансляцииmanifest URL (ссылкаlink наto плейлистthe HLS-трансляции playlist)
 
Example:
Пример:
<nowiki>http://127.0.0.1:6878/hls/manifest.m3u8?manifest_url=http%3A%2F%2Fwin.cdn.bonus-tv.ru%2FTVB7%2Fntv%2Fplaylist.m3u8</nowiki>
 
Simple HTML code for playing HLS broadcast in VideoJS player:
Пример HTML-страницы для запуска HLS-трансляции через движок в плеере VideoJS:
<nowiki><!DOCTYPE html>
<html>
</html></nowiki>
 
==Additional features==
==Расширенные возможности==
Engine can provide some additional features to control playback session, such as extra commands, session statistics and events polling.
Движок предоставляет некоторые дополнительные возможности по управлению сессией воспроизведения.
To access such features, you must add this param to playback session options:
Сюда входит возможность отправлять движку дополнительные команды, получать информацию про сессию воспроизведения, а также получать некоторые события.
Для получения доступа к расширенным возможностям необходимо добавить такой параметр при старте сессии воспроизведения:
<tt>format=json</tt>
 
As response app engine should return some links in JSON format:
При получении данного параметра движок выдаст в ответ не медиа-поток, а набор ссылок в формате JSON:
<tt><nowiki>{
"playback_url": playback_url,
 
;playback_url
:media stream link
:ссылка для получения медиа-потока
;stat_url
:session statistics link
:ссылка для получения информации про сессию
;command_url
:engine commands link
:ссылка для отправки команд движку
;event_url
:session events link
:ссылка для получения событий
 
<tt>event_url</tt> вwill ответеbe выдаетсяpresent толькоin вengine томresponse случае,only еслиif стратquery выполнялсяcontains с параметромparam <tt>use_api_events</tt>.
 
Via <tt>playback_url</tt> app engine will serve requested media stream. This link should be passed to media player.
По ссылке <tt>playback_url</tt> движок отдаст запрошенный медиа-поток. Эту ссылку необходимо передать плееру.
 
===Getting some stats===
===Получение статистики===
Via <tt>stat_url</tt> link app engine should return JSON-formatted structure:
*'''status''' - playback session status:
**''prebuf'' - prebuffering
**''dl'' - playback
*'''peers''' - number of connected peers
*'''speed_down''' - download speed (Kbytes per sec)
*'''speed_up''' - upload (Kbytes per sec)
*'''downloaded''' - total downloaded (bytes)
*'''uploaded''' - total uploaded (bytes)
*'''total_progress''' - download ratio in percentage to media size, valid for VOD only, for live always 0
 
Example:
По ссылке <tt>stat_url</tt> движок возвращает ответ в формате JSON с такими полями:
<nowiki>
*'''status''' - статус сессии воспроизведения:
Query:
**''prebuf'' - пребуферизация
**''dl'' - воспроизведение
*'''peers''' - кол-во подсоединенных узлов
*'''speed_down''' - скорость скачивания (Кбайт/с)
*'''speed_up''' - скорость отдачи (Кбайт/с)
*'''downloaded''' - объем скачанных данных (байт)
*'''uploaded''' - объем отданных данных (байт)
*'''total_progress''' - процент загруженных данных от суммарного объема (для VOD); для live всегда 0
 
Пример:
<nowiki>Запрос:
http://127.0.0.1:6878/ace/stat/6d12f958332ef0bd258053ba1afd833ddf9b74f9/f528764d624db129b32c21fbca0cb8d6
 
Response:
Ответ:
{
"response": {
}</nowiki>
===Sending extra commands to the app engine===
===Отправка команд движку===
Via <tt>command_url</tt> link you can control playback session.
По ссылке <tt>command_url</tt> движок принимает команды для управления сессией воспроизведения.
 
НазваниеCommand командыname передаетсяpassed вto параметреapp engine via <tt>method</tt> param.
For the moment you can use only one command: <tt>stop</tt> - stop playback session.
Its recommended to send "stop" command to the app engine when user stops playback in the media player UI/controls.
 
Example:
На данный момент доступна одна команда: <tt>stop</tt> - остановить сессию воспроизведения.
<nowiki>
 
Query:
Рекомендуется всегда останавлить сессию воспроизведения с помощью этой команды, когда воспроизведение останавливается на уровне плеера.
 
Пример:
<nowiki>Запрос:
http://127.0.0.1:6878/ace/cmd/5410b27fc567c35c8547e3b69b141215ce3a1fd7/ef0609c43e560697329d93dae4571edb?method=stop
 
Response:
Ответ:
{
"response": "ok",
}</nowiki>
===Getting events from the app engine===
===Получение событий от движка===
СсылкаVia <tt>event_url</tt> используетсяlink дляyou полученияcan событийget отevents движкаfrom методомthe app engine, using "long polling" method.
 
As response app engine should return data in the <tt>response</tt> field (JSON format):
Данные по событию возвращаются в поле <tt>response</tt> в виде JSON-объекта с такими полями:
*'''name''' - event name
;name
*'''params''' - object with actual param
:название события
;params
:объект с параметрами (значения зависят от события)
 
In the versions prior to 3003600 <tt>response</tt> field contains "JSON as string" data.
В версиях до 3003600 в поле <tt>response</tt> передается не сам JSON-объект, а его строковое представление.
 
Example:
Пример:
<nowiki>Запрос:
Query:
http://127.0.0.1:6878/ace/event/5410b27fc567c35c8547e3b69b141215ce3a1fd7/ef0609c43e560697329d93dae4571edb
 
ОтветResponse (версияengine движкаversion >= 3003600):
{
"response": {
}
 
ОтветResponse (версияengine движкаversion < 3003600):
{
"response": "{\"name\": \"got_codec_info\"}, \"params\": {\"audio_codec_id\": 86018, \"video_codec_id\": 28}",
 
 
When current playback session has stopped, <tt>event_url</tt> response looks like:
Когда текущая сессия воспроизведения будет остановлена, <tt>event_url</tt> вернет такой ответ:
<nowiki>{
"response": null,
}</nowiki>
 
And player should stop sending queries to <tt>event_url</tt>.
После получения такого ответа необходимо прекратить отсылать запросы на <tt>event_url</tt>.
 
====СписокEvents событийlist====
;missing_content
:quered fragment cannot be found (HLS playback). Player should fast-forward to keep up with "live" stream.
:движок не может найти запрашиваемый сегмент при воспроизведении HLS (плеер должен перемотать на live)
;got_codec_info
:stream codec data is ready.
:доступна информация по кодекам потока.
:;params:
:;параметры:
::video_codec_id - идентификаторvideo видеокодекаcodec id
::audio_codec_id - идентификаторaudio аудиокодекаcodec id
:Идентификаторыaudio/video кодековIDs взятыcorresponded из библиотекиto ffmpeg libavcodec, их можно найти [https://ffmpeg.org/doxygen/trunk/avcodec_8h_source.html здесьfull list here]
:this event can be useful, when player do not support such codec(s).
:Данное событие можно использовать для вывода сообщения в случае, если плеер не поддерживает данные кодеки.
;segmenter_failed
:built-in HLS-segmenter failed to process stream. Player should stop the playback.
:встроенный в движок HLS-сегментатор не смог обработать поток (плеер должен остановить воспроизведение)
;download_stopped
:engine has stopped playback
:движок остановил воспроизведение
:;params
:;параметры
::<tt>reason</tt> - причинаstop остановки;reason, возможныеpossible значенияvalues:
:::<tt>missing_option</tt> - отсутствуетcontent платнаяnot опцияfree, необходимая"paid дляoption" воспроизведенияis данного контентаmissing.
::<tt>option</tt> - идентификаторmissing отсутствующейoption опцииID (дляfor <tt>reason=missing_option</tt>)
 
====ПримерJavascript на javascriptexample====
Данный пример использует библиотекуUsing [https://jquery.com jQuery] library.
 
<nowiki>function startEventListener() {
startEventListener("http://127.0.0.1:6878/ace/event/5410b27fc567c35c8547e3b69b141215ce3a1fd7/ef0609c43e560697329d93dae4571edb");</nowiki>
 
==<div id="stop-notifications"></div>ПолучениеNotifications уведомленийabout обmissing отсутствииpaid платных опцийoption==
In some cases user must have a permit (the paid option) to playback some content. If such permit not granted, then app engine will stop the playback and send a notification to user (by showing some predefined text in the default browser).
В определенных ситуациях для воспроизведения контента может понадобится наличие у пользователя той или иной платной опции. При отсутствии опции движок остановит воспроизведение и уведомит пользователя о необходимости приобрести опцию (для этого будет открыта страница в браузере по умолчанию).
This behaviour can be overrided, and then client API will handle user notifications by itself. To do this, engine playback session should be started with <nowiki>use_stop_notifications=1</nowiki> param.
In this case at playback stop app engine will not send notification to user, but send a event to client.
 
If some permits is not granted, then engine playback can be stopped:
Клиент API может взять на себя ответственность за уведомление пользователя. Для этого сессию воспроизведения нужно запускать с таким параметром:
* at the playback start:
<nowiki>use_stop_notifications=1</nowiki>
<nowiki>Start playback:
 
http://127.0.0.1:6878/ace/manifest.m3u8?id=c894b23a65d64a0dae2076d2a01ec6bface83b01&format=json&use_stop_notifications=1
Теперь движок не будет уведомлять пользователя, а при остановке воспроизведения по причине отсутствия платной опции клиент API получит соответствующее событие и должен будет самостоятельно уведомить пользователя.
 
Остановка из-за отсутствуия опции возможна в двух случаях:
* при старте воспроизведения
* через некоторое время после начала воспроизведения
 
При старте это выглядит так:
<nowiki>http://127.0.0.1:6878/ace/manifest.m3u8?id=c894b23a65d64a0dae2076d2a01ec6bface83b01&format=json&use_stop_notifications=1
{
"extra_data": {
}</nowiki>
 
* sometime after playback was started:
Если остановка произойдет через некоторое время после начала воспроизведения, то будет отослано событие <tt>download_stopped</tt>:
If playback was stopped after some time, then engine will send a <tt>download_stopped</tt> event:
<nowiki>Старт воспроизведения:
<nowiki>Start playback:
http://127.0.0.1:6878/ace/manifest.m3u8?id=c894b23a65d64a0dae2076d2a01ec6bface83b01&format=json&use_api_events=1&use_stop_notifications=1
{
}
 
ЖдемWait событиеfor поevent ссылкеvia event_url:
http://127.0.0.1:6878/ace/event/6d12f958332ef0bd258053ba1afd833ddf9b74f9/f528764d624db129b32c21fbca0cb8d6
 
At playback stop response should look like:
При остановке получим такой ответ по event_url:
{
"response": {
}</nowiki>
 
==Player ID==
==Идентификатор плеера==
Player ID - random string, used for impersonate player during engine connect session.
Идентификатор плеера - произвольная строка, которая идентифицирует плеер при обращении к движку. В качестве идентификатора лучше всего использовать случайное число.
Player ID purpose - app engine should distinguish one player from another, as in the current engine implementation user cannot play the same live-stream with two (or more) players from one engine, and engine will stop to serve requests from one player, when got a new request from another.
 
Предназначение идентификатора плеера - дать движку возможность отличать запросы одного плеера от другого. Это связано с таким ограничением - нельзя просматривать одну и ту же live-трансляцию через движок одновременно в двух плеерах. При возникновении такой ситуации результаты непредсказуемы (трансляция может начать идти с перебоями в обоих плеерах). В связи с этим движок перестает отдавать плееру данные по трансляции, если эту же трансляцию запустили в другом плеере, но делает это только в том случае, если может отличить один плеер от другого.

Navigation menu