Changes

Jump to: navigation, search

Engine HTTP API

3,057 bytes added, 22:55, 19 April 2018
API methods
==Общее описаниеAbout==Начиная с версии Since version 3.1 появилась возможность управлять движком по протоколу we implemented API to control app engine via HTTP. Для передачи команды движку нужно отправить To do that, you should send appropriate HTTP GET запрос на http-порт движкаquery to the app engine (default IP:port is 127. Порт по умолчанию0.0.1: 6878.)
==Проверка наличия движкаLimitations==При необходимости проверить наличие движка у пользователя необходимо отправить JSONP запрос на адрес <nowiki>You can't use HTTP API with AJAX queries from secured (https) pages, because HTTP API is not secured, and such behaviour (http://127query from https page) will be blocked by browser.0.0.1:6878/webui/api/service?method=get_version&format=jsonp</nowiki>. Если движок запущен, то выдаст свою версию в ответ на запросSo you must have and serve a dedicated unsecured page on your secured site to work with engine HTTP API.
Пример запроса==Checking local engine availability==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: <nowiki>ЗапросQuery:
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)
Пример HTML-страницы с кнопкой для проверки движка Simple page with check button (JSONP-запросы отправляются с помощью библиотеки queries served by jQuery):
<nowiki><!DOCTYPE html>
<html>
</html></nowiki>
==Методы Using HTTP APIon Android==В описаниях методов <tt>''<engine_address>''</tt> - это ip-адрес движка, <tt>''<engine_port>''</tt> - http-порт движкаHTTP API is a preferred way to integrate engine with other applications on Android.Все методы принимают такие общие параметры:*'''sid''' - [[#Идентификатор плеера|идентификатор плеера]] (необязательный параметр)*'''id''' - идентификатор контента (content id) (условно обязательный параметр)*'''infohash''' - infohash транспортного файла (.acelive либо .torrent файла)(условно обязательный параметр)*'''url''' - ссылка на транспортный файл (условно обязательный параметр)*'''path''' - путь к транспортному файлу в локальной файловой системе (условно обязательный параметр)
В запросах на старт воспроизведения обязательно должен присутствовать один из параметров <tt>id</tt>, <tt>infohash</tt>, <tt>url</tt>, <tt>path</tt>Before sending any requests to engine you should ensure that it is running. This should be done by binding to engine service as described[[Using_Ace_Stream_as_service_on_Android|here]].
===Получение потока в формате HLS=API methods==Terms: <tt>''<nowikiengine_address>http:/''</tt> - app engine IP address, <engine_addresstt>:''<engine_port>''</acett> - app engine HTTP port.Common params:*'''id''' - content id (conditional param)*'''infohash''' - transport file infohash (.acelive or .torrent file) (conditional param)*'''url''' - link to transport file (conditional param). Can be used with URL encoded "file:/manifest.m3u8</nowiki><path/tt>" to access local file.*'''pid''' - [[#Player ID|player id]] (optional, formerly known as '''sid''', since ver. 3.1.29 is obsolete and replaced by '''pid''')
В ответ на данную команду движок выдаст HLS плейлист для воспроизведения запрашиваемого контента. В случае ошибки будет возвращен HTTP код 4хх либо 5хх с кратким описанием ошибкиIn the query to the app engine at least one of params <tt>id</tt>, <tt>infohash</tt>, <tt>url</tt> must be present.
Параметры===How to get HLS stream===Query:*'''transcode_audio''' - транскодировать аудио в AAC (параметр принимает значения 0 либо 1)*'''transcode_mp3''' - не транскодировать MP3 (параметр принимает значения 0 либо 1)*'''preferred_audio_language''' - предпочитаемый язык аудио-дорожки (3-значный код, список [<tt><nowiki>http://xml<engine_address>:<engine_port>/ace/manifest.coverpages.orgm3u8</nowiki></nisoLang3-1994.html здесь])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. 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 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 HTTPstream===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).
ПараметрыParams:*'''manifest_url''' - HLS 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 VideoJSplayer:
<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>
Для получения статистики необходимо запросить у движка URL статистики при старте воспроизведения. Для этого нужно добавить параметр As response app engine should return some links in JSON format=json в запрос на воспроизведение. При наличии данного параметра движок вернет ответ в формате JSON с двумя ссылками:*''' <tt><nowiki>{ "playback_url": playback_url''' - ссылка для воспроизведения (по этой ссылке движок отдаст HLS-манифест либо HTTP-поток),*''' "stat_url: stat_url''' - ссылка для получения статистики, "command_url": command_url, "event_url": event_url,}</nowiki></tt>
Пример;playback_url:media stream link;stat_url <nowiki>Запрос:session statistics link;command_urlhttp://127.0.0.1engine commands link;event_url:6878/ace/manifest.m3u8?id=dd1e67078381739d14beca697356ab76d49d1a2d&format=jsonsession events link
Ответ:{ "stat_url": "http:<tt>event_url</tt> will be present in engine response only if query contains param <tt>use_api_events</127tt>.0.0.1:6878/ace/stat/6d12f958332ef0bd258053ba1afd833ddf9b74f9/f528764d624db129b32c21fbca0cb8d6", "Via <tt>playback_url": "http:<//127.0.0tt> app engine will serve requested media stream.1:6878/ace/m/6d12f958332ef0bd258053ba1afd833ddf9b74f9/f528764d624db129b32c21fbca0cb8d6This link should be passed to media player.m3u8"}</nowiki>
По ссылке ===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: <nowiki>ЗапросQuery:
http://127.0.0.1:6878/ace/stat/6d12f958332ef0bd258053ba1afd833ddf9b74f9/f528764d624db129b32c21fbca0cb8d6
ОтветResponse:
{
"response": {
},
"error": null
}</nowiki>
===Sending extra commands to the app engine===
Via <tt>command_url</tt> link you can control playback session.
 
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:
<nowiki>
Query:
http://127.0.0.1:6878/ace/cmd/5410b27fc567c35c8547e3b69b141215ce3a1fd7/ef0609c43e560697329d93dae4571edb?method=stop
 
Response:
{
"response": "ok",
"error": null
}</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):
*'''name''' - event name
*'''params''' - object with actual param
 
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": {
"name": "got_codec_info",
"params: {
"audio_codec_id": 86018,
"video_codec_id": 28
}
},
"error": null
}
 
Response (engine version < 3003600):
{
"response": "{\"name\": \"got_codec_info\"}, \"params\": {\"audio_codec_id\": 86018, \"video_codec_id\": 28}",
"error": null
}</nowiki>
 
 
When current playback session has stopped, <tt>event_url</tt> response looks like:
<nowiki>{
"response": null,
"error": "download stopped"
}</nowiki>
 
And player should stop sending queries to <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.
;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.
;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 example====
Using [https://jquery.com jQuery] library.
 
<nowiki>function startEventListener() {
$.ajax({
url: url,
method: "GET",
dataType: "json",
cache: false,
success: function(response) {
if(response.error) {
console.log("event listener: got error: " + response.error);
}
else {
var event = response.response;
if(typeof event !== "object") {
event = JSON.parse(event);
}
console.log("event listener: got event: name=" + event.name + " params=" + JSON.stringify(params));
// handle event here
// ...
// listen to the next event (long polling)
startEventListener(url);
}
},
error: function(xhr, status, error) {
console.log("event listener error: status=" + status + " error=" + error);
}
});
}
 
// init event listener
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:
* at the playback start:
<nowiki>Start playback:
http://127.0.0.1:6878/ace/manifest.m3u8?id=c894b23a65d64a0dae2076d2a01ec6bface83b01&format=json&use_stop_notifications=1
{
"extra_data": {
"reason": "missing_option",
"option": "proxyServer"
},
"response": null,
"error": "You need to buy Proxy Server option to continue"
}</nowiki>
 
* sometime after playback was started:
If playback was stopped after some time, then engine will send a <tt>download_stopped</tt> event:
<nowiki>Start playback:
http://127.0.0.1:6878/ace/manifest.m3u8?id=c894b23a65d64a0dae2076d2a01ec6bface83b01&format=json&use_api_events=1&use_stop_notifications=1
{
"response": {
"stat_url": "http://127.0.0.1:6878/ace/stat/6d12f958332ef0bd258053ba1afd833ddf9b74f9/f528764d624db129b32c21fbca0cb8d6",
"command_url": "http://127.0.0.1:6878/ace/cmd/6d12f958332ef0bd258053ba1afd833ddf9b74f9/f528764d624db129b32c21fbca0cb8d6",
"event_url": "http://127.0.0.1:6878/ace/event/6d12f958332ef0bd258053ba1afd833ddf9b74f9/f528764d624db129b32c21fbca0cb8d6",
"playback_url": "http://127.0.0.1:6878/ace/m/6d12f958332ef0bd258053ba1afd833ddf9b74f9/f528764d624db129b32c21fbca0cb8d6.m3u8"
},
"error": null
}
 
Wait for event via event_url:
http://127.0.0.1:6878/ace/event/6d12f958332ef0bd258053ba1afd833ddf9b74f9/f528764d624db129b32c21fbca0cb8d6
 
At playback stop response should look like:
{
"response": {
"name": "download_stopped",
"params": {
"reason": "missing_option",
"option": "proxyServer"
}
},
"error": null
}</nowiki>
==Идентификатор плеераPlayer ID==Идентификатор плеера Player ID ('''pid''') - произвольная строкаrandom string, которая идентифицирует плеер при обращении к движку. В качестве идентификатора лучше всего использовать случайное числоused for player identification during engine connect session.
Предназначение идентификатора плеера "Player ID" purpose - дать движку возможность отличать запросы одного плеера от другого. Это связано с таким ограничением - нельзя просматривать одну и ту же app engine must distinguish one player session from another, as in the current engine implementation user cannot play the same live-трансляцию через движок одновременно в двух плеерах. При возникновении такой ситуации результаты непредсказуемы stream with two (трансляция может начать идти с перебоями в обоих плеерахor more). В связи с этим движок перестает отдавать плееру данные по трансляции, если эту же трансляцию запустили в другом плеереplayers simultaneously from one engine, но делает это только в том случаеand engine will stop to serve requests from one player, если может отличить один плеер от другогоwhen got a new request from another.

Navigation menu