Changes

Jump to: navigation, search

Engine API

13,774 bytes added, 18:09, 11 April 2016
Настройки транскодирования
'''Обмен данными с TS Engine происходит по протоколу TCP.'''
 
'''По умолчанию TS Engine принимает входящие соединения на порт 62062.'''
 
 
== Общий вид команд ==
Каждая команда должна состоять из строки, завершающейся разделителем \r\n
 
Большинство команд имеют такой вид:
 
<tt>'''CMD [param1] [param2] ...'''</tt>
 
где
 
<tt>'''CMD'''</tt> - предопределенное название команды
 
<tt>'''param1, param2 ...'''</tt> - параметры команды, разделенные пробелом
 
== Типы команд ==
 
Все команды делятся на входящие и исходящие.
 
Входящие команды отправляются от клиента к TS Engine. Клиентом является любое программное
обеспечение, которое использует функционал TS Engine. С помощью входящих команд клиент
управляет работой TS Engine.
 
Исходящие команды отправляются от TS Engine к клиенту. Данный тип команд используется для
информирования клиента о работе TS Engine.
 
== Синхронные команды ==
 
Большинство входящих команд выполняются асинхронно, т.е. для таких команд нет понятия "ответ на команду".
 
'''Примеры асинхронных команд:'''
 
- клиент отправляет LOADASYNC, после загрузки содержимого TS Engine отправляет LOADRESP через некоторое время
 
- клиент отправляет START, после окончания пребуферизации TS Engine отправляет PLAY
 
 
Но есть также команды, которые выполняются синхронно, в режиме "запрос-ответ". На данный момент таких команд две: '''LOAD''' и '''GETPID'''.
 
Синхронная команда предполагает ответ, который отправляется от TS Engine к клиенту в виде строки, начинающейся на ##.
 
Обработка синхронных команд со стороны клиента должна выглядеть таким образом:
 
- клиент отправляет команду, например "GETPID qwerty 0 0 0" и ждет, пока от TS Engine придет ответ
 
- если от TS Engine получено сообщение, которое начинается на ##, то данное сообщение считается ответом на синхронную команду (например, ##12345)
 
== Входящие команды ==
 
<tt>'''HELLOBG'''</tt>
 
Используется в рамках процедуры "рукопожатия" между клиентом и TS Engine.
 
Эта команда должна быть отправлена клиентом сразу после установления tcp-соединения с TS Engine.
 
Соединение с TS Engine считается успешным после того, как клиент получил от TS Engine ответ на "рукопожатие" - команду HELLOTS
 
 
<tt>'''READY'''</tt>
 
Информирует TS Engine о том, что клиент готов принимать исходящие команды
 
 
<tt>'''LOAD TORRENT''' <torrent_url> <developer_id> <affiliate_id> <zone_id>
 
'''LOAD INFOHASH''' <torrent_infohash> <developer_id> <affiliate_id> <zone_id>
 
'''LOAD PID''' <player_id>
 
'''LOAD RAW''' <torrent_data> <developer_id> <affiliate_id> <zone_id>
 
'''LOADASYNC''' <request_id> '''TORRENT''' <torrent_url> <developer_id> <affiliate_id> <zone_id>
 
'''LOADASYNC''' <request_id> '''INFOHASH''' <torrent_infohash> <developer_id> <affiliate_id> <zone_id>
 
'''LOADASYNC''' <request_id> '''PID''' <player_id>
 
'''LOADASYNC''' <request_id> '''RAW''' <torrent_data> <developer_id> <affiliate_id> <zone_id></tt>
 
Данные команды выполняют загрузку содержимого торрент-файла и используются для того, чтобы клиент мог получить список названий
файлов в интересующем торрент-файле. Команды LOAD выполняются синхронно, команды LOADASYNC - асинхронно (ответ приходит в исходящей команде LOADRESP).
 
Более предпочтительным методом является асинхронная загрузка.
 
'''Параметры:'''
 
<tt>'''request_id'''</tt> - случайное целое число - идентификатор запроса LOADASYNC; этот же идентификатор будет отослан клиенту в команде LOADRESP после того,как будет получен список файлов; данный идентификатор служит для того, чтобы клиент в случае отправки нескольких запросов LOAD точно знал, на какой из этих запросов получен ответ
 
<tt>'''torrent_url'''</tt> - ссылка на торрент файл (например, http://sometracker.com/torrent/12345)
 
<tt>'''torrent_infohash'''</tt> - infohash торрента
 
<tt>'''player_id'''</tt> - код плеера
 
<tt>'''torrent_data'''</tt> - содержимое торрент-файла в кодировке base64
 
<tt>'''developer_id'''</tt> - код разработчика (если неизвестно, необходимо передавать 0)
 
<tt>'''affiliate_id'''</tt> - код партнера (если неизвестно, необходимо передавать 0)
 
<tt>'''zone_id'''</tt> - код зоны партнера (если неизвестно, необходимо передавать 0)
 
 
<tt>'''START TORRENT''' <torrent_url> <file_indexes> <developer_id> <affiliate_id> <zone_id>
 
'''START INFOHASH''' <torrent_infohash> <file_indexes> <developer_id> <affiliate_id> <zone_id>
 
'''START PID''' <player_id> <file_indexes>
 
'''START RAW''' <torrent_data> <file_indexes> <developer_id> <affiliate_id> <zone_id>
 
'''START URL''' <direct_url> <file_indexes> <developer_id> <affiliate_id> <zone_id>)</tt>
 
Данные команды используются для начала загрузки определенного файла из торрент-файла либо для начала загрузки файла по прямой ссылке (START URL)
 
'''Параметры:'''
 
<tt>'''file_indexes'''</tt> - список индексов файлов из торрент-файла, которые необходимо загружать. Индексы файлов клиент получает в сообщении LOADRESP разделенных запятой. Индексы начинаются с нуля и соответствуют списку файлов,
который был получен в результате выполнения команды LOAD. Например, если в торрент-файле всего один видео-файл, то необходимо отправлять индекс 0.
 
Если в торренте пять видео-файлов и необходимо начать проигрывание первого, но при это загружать остальные, то отправляется 0,1,2,3,4.
 
Если нужно проиграть третий файл, и не загружать другие, отправляется 2.
 
<tt>'''torrent_url'''</tt> - ссылка на торрент файл (например, http://sometracker.com/torrent/12345)
 
<tt>'''torrent_infohash'''</tt> - infohash торрента
 
<tt>'''player_id'''</tt> - код плеера
 
<tt>'''torrent_data'''</tt> - содержимое торрент-файла в кодировке base64
 
<tt>'''direct_url'''</tt> - прямая ссылка на файл (например, http://somesite.com/files/video.mp4)
 
<tt>'''developer_id'''</tt> - код разработчика (если неизвестно, необходимо передавать 0)
 
<tt>'''affiliate_id'''</tt> - код партнера (если неизвестно, необходимо передавать 0)
 
<tt>'''zone_id'''</tt> - код зоны партнера (если неизвестно, необходимо передавать 0)
 
 
<tt>'''GETPID''' <infohash> <developer_id> <affiliate_id> <zone_id></tt>
 
Получение кода плеера по набору параметров. Эта команда является синхронной командой (см.ниже). В ответ отправляется код плеера, либо пустая строка, если код плеера не может быть получен
 
 
<tt>'''SHUTDOWN'''</tt>
 
Закрыть соединение с клиентом.
 
 
<tt>'''STOP'''</tt>
 
Остановить загрузку файла, который загружается в данный момент.
 
 
<tt>'''DUR''' <video_url> <duration></tt>
 
Сообщить TS Engine о длительности видео-файла, который в данный момент проигрывается клиентом.
Данная команда должна отправлять сразу после того, как клиент определил длительность контента.
 
'''Параметры:'''
 
<tt>'''video_url'''</tt> - ссылка на видео, которая была отправлена клиенту после окончания пребуферизации
 
<tt>'''duration'''</tt> - длительность в миллисекундах
 
 
<tt>'''PLAYBACK''' <video_url> <event></tt>
 
Сообщить TS Engine о процентном соотношении проигранного видео
 
Данная команда особенно важна, когда идет прогрывание рекламных роликов - переход к основному видео происходит только после того,
как TS Engine получил команду PLAYBACK 100 (т.е. после того, как клиент полность проиграл рекламный ролик)
 
'''Параметры:'''
 
<tt>'''video_url'''</tt> - ссылка на видео, которая была отправлена клиенту после окончания пребуферизации
 
<tt>'''event'''</tt> - одно из данных событий:
 
0 - начало проигрывания
 
25 - проиграно 25% видео
 
50 - проиграно 50% видео
 
75 - проиграно 75% видео
 
100 - проиграно 100% видео
 
== Исходящие команды ==
 
<tt>'''HELLOTS'''</tt>
 
ответная команда в рамках процедуры рукопожатия
 
 
<tt>'''AUTH''' <auth_level></tt>
 
Уровень доступа пользователя
 
<tt>auth_level</tt> - целое число - уровень доступа
 
На данный момент возможны два значения уровня доступа:
 
0 - пользователю не доступны расширенные функции (перемотка и проигрывание файлов из торрента с несколькими видео-файлами)
 
1 - пользователю доступны расширенные функции
 
 
<tt>'''STATE''' <state_id></tt>
 
Информация о текущем статусе TS Engine
 
 
<tt>'''SHUTDOWN'''</tt>
 
TS Engine завершил работу
 
 
<tt>'''PLAY''' <video_url></tt>
 
<tt>'''PLAYAD''' <video_url></tt>
 
<tt>'''PLAYADI''' <video_url></tt>
 
Начать проигрывание видео по ссылке video_url (данная ссылка ведет на http-сервер, встроенный в TS Engine).
 
<tt>'''PLAY'''</tt> - проигрывание основного видео
 
<tt>'''PLAYAD'''</tt> - проигрывание непрерываемого рекламного ролика (пользователь не может перемотать либо пропустить данный рекламный ролик)
 
<tt>'''PLAYADI'''</tt> - проигрывание прерываемого рекламного ролика (пользователь может перемотать либо пропустить данный рекламный ролик)
 
 
<tt>'''PAUSE'''</tt>
 
TS Engine начал буферизацию, так как недостаточно данных для проигрывания видео без остановки
 
 
<tt>'''RESUME'''</tt>
 
TS Engine завершил буферизацию
 
 
<tt>'''LOADRESP''' <request_id> <response></tt>
 
Ответ на команду LOAD
 
<tt>'''request_id'''</tt> - идентификатор запроса
 
<tt>'''response'''</tt> - список файлов в формате json в такого вида:
{
"status": 1,
"infohash": "abcd1234",
"files": [
["file1.mp4", 0],
["file2.avi", 1],
["file3.mkv", 5]
]
}
 
<tt>'''status'''</tt> - 0: в торренте нет видео файлов, 1 - в торренте один видео файл, 2 - в торренте более одного видео файла
 
<tt>'''infohash'''</tt> - infohash торрента
 
<tt>'''files'''</tt> - список файлов; это массив, каждый элемент в котором состоит из массива из двух элементов: первый - название файла, второй - позиция файла в торренте (эта позиция должна отправляться в команде START для указания, какой именно файл необходимо загружать, если их несколько).
 
Имена файлов передаются в кодировке UTF-8 в urlencoded виде.
 
 
<tt>'''INFO''' <message_id>;<message_text></tt>
 
Информационное сообщение
 
<tt>'''message_id'''</tt> - код сообщения
 
<tt>'''message_text'''</tt> - текст сообщения
 
 
 
<tt>'''STATUS''' <status_string></tt>
 
Данное сообщение отправляется периодически для информирования клиента о текущем статусе загрузки контента
 
<tt>'''status_string'''</tt> - строка описанного ниже формата
 
 
Если идет проигрывание основного контента
 
<tt>STATUS main:status_string</tt>
 
 
Если идет проигрывание рекламного ролика:
 
<tt>STATUS main:status_string|ad:status_string</tt>
 
 
<tt>'''status_string:'''</tt>
 
TS Engine ничего не делает - <tt>'''idle'''</tt>
 
ошибка - <tt>'''err;error_id;error_message'''</tt> (код и описание)
 
проверка - <tt>'''check;progress'''</tt>
 
пребуферизация - <tt>'''prebuf;progress;time'''</tt>
 
закачка - <tt>'''dl'''</tt>
 
буферизация - <tt>'''buf;progress;time'''</tt>
 
ожидание достаточной скорости - <tt>'''wait;time'''</tt>
 
 
Ко всем <tt>status_string</tt> (кроме <tt>idle, err, check</tt>) добавляются общие данные:
 
<tt>total_progress;immediate_progress;speed_down;http_speed_down;speed_up;peers;http_peers;downloaded;http_downloaded;uploaded</tt>
 
<tt>'''total_progress'''</tt> - сколько всего закачано по данному файлу
 
<tt>'''immediate_progress'''</tt> - сколько непрерывных данных закачано начиная с текущей позиции (для отображения кол-ва закачанного в бегунке)
 
 
Все числа передаются как integer.
 
Все progress принимают значение от 0 до 100.
 
 
'''Примеры:'''
<tt>STATUS main:prebuf;45;30|ad:buf;69
STATUS main:dl|ad:dl</tt>
 
'''Пример трансформация статусов в текстовые сообщения, понятные пользователю:'''
 
<tt>check - Checking xx%
prebuf - Prebuffering xx%
buf - Buffering xx%
wait - Waiting sufficient download speed
err - выводим сообщение об ошибке
dl, idle - ничего не выводим</tt>
 
== События ==
 
<tt>'''EVENT event_name param1_name=param1_value param2_name=param2_value ...'''</tt>
 
Параметры не обязательны.
 
Значения параметров - <tt>'''urlencoded utf-8'''</tt>
 
 
 
== Примеры ==
 
<tt>'''>>'''</tt> - сообщения от клиента к TS Engine
<tt>'''<<'''</tt> - сообщения от TS Engine к клиенту
 
 
1) Проигрывание торрент-файла по ссылке без рекламных роликов (необходимость проигрывания рекламных роликов определяет TS Engine).
 
Для загрузки содержимого торрента используется асинхронная команда LOADASYNC.
 
Торрент файл содержит один видео-файл.
 
 
рукопожатие
 
<tt>>>HELLOBG
<<HELLOTS</tt>
 
клиент готов принимать сообщения
 
<tt>>>READY</tt>
 
пользователю доступны расширенные функции
 
<tt><<AUTH 1</tt>
 
загрузить торрент по ссылке
 
<tt>>>LOADASYNC 467763 TORRENT http://rutor.org/download/67346 0 0 0
<<LOADRESP 467763 {"status": 1, "files": <nowiki>[["Prey%202_%20E3%202011%20Official%20Trailer_2.mp4", 0]]</nowiki>, "infohash":
"4c78e1cf0df23b4f5a16a106829ebed710cb52e0"}</tt>
 
узнать код плеера (например, чтобы показать его пользователю)
 
<tt>>>GETPID 4c78e1cf0df23b4f5a16a106829ebed710cb52e0 0 0 0
<<##36ae4c89ab45b4010b1461c513da38d007356195</tt>
 
начать пребуферизацию видео
 
<tt>>>START TORRENT http://rutor.org/download/67346 0 0 0 0</tt>
 
идет процесс пребуферизации
 
<tt><<STATE 1
<<STATUS main:prebuf;0;2147483447;0;0;0;0;0;0;0;0;0;0
<<STATUS main:prebuf;0;2132;0;0;29;0;0;8;0;131072;0;0
<<STATUS main:prebuf;8;942;0;0;60;0;0;9;0;393216;0;0
<<STATUS main:prebuf;50;591;0;0;87;0;0;8;0;835584;0;0
<<STATUS main:prebuf;75;497;0;0;98;0;0;8;0;1146880;0;0
<<STATUS main:prebuf;91;448;0;0;105;0;0;8;0;1441792;0;0</tt>
 
пребуферизация завершена, клиент получает ссылку для проигрывания контента
 
<tt><<PLAY http://127.0.0.1:6878/content/4c78e1cf0df23b4f5a16a106829ebed710cb52e0/0.673752283974
<<STATE 2</tt>
 
клиент отправляет длительность контента (~201 секунда)
 
<tt>>>DUR http://127.0.0.1:6878/content/4c78e1cf0df23b4f5a16a106829ebed710cb52e0/0.673752283974 201964</tt>
 
клиент информирует о том, что началось проигрывание
 
<tt>>>PLAYBACK http://127.0.0.1:6878/content/4c78e1cf0df23b4f5a16a106829ebed710cb52e0/0.673752283974 0</tt>
 
TS Engine загружает контент
 
<tt><<STATUS main:dl;0;0;110;0;0;8;0;1622016;0;0
<<STATUS main:dl;0;0;128;0;0;8;0;2965504;0;0
<<STATUS main:dl;0;0;130;0;0;8;0;3129344;0;0</tt>
 
TS Engine недостаточно данных для проигрывания, начинает буферизация
 
<tt><<PAUSE
<<STATE 3
<<STATUS main:buf;0;315;0;0;130;0;0;8;0;3260416;0;0
<<STATUS main:buf;90;299;0;0;133;0;0;8;0;3866624;0;0
<<STATUS main:buf;90;278;0;0;138;0;0;8;0;4390912;0;0</tt>
 
буферизация завершена
 
<tt><<RESUME
<<STATE 2
<<STATUS main:dl;0;0;141;0;0;8;0;4898816;0;0</tt>
 
клиент проиграл 25% контента
 
<tt>>>PLAYBACK http://127.0.0.1:6878/content/4c78e1cf0df23b4f5a16a106829ebed710cb52e0/0.673752283974 25
<<STATUS main:dl;0;0;141;0;0;8;0;4898816;0;0
<<STATUS main:dl;0;0;146;0;0;7;0;8388608;0;0</tt>
 
клиент проиграл 50% контента
 
<tt>>>PLAYBACK http://127.0.0.1:6878/content/4c78e1cf0df23b4f5a16a106829ebed710cb52e0/0.673752283974 50
<<STATUS main:dl;0;0;145;0;0;7;0;9404416;0;0</tt>
 
клиент проиграл 75% контента
 
<tt>>>PLAYBACK http://127.0.0.1:6878/content/4c78e1cf0df23b4f5a16a106829ebed710cb52e0/0.673752283974 75
<<STATUS main:dl;0;0;146;0;0;7;0;9568256;0;0</tt>
 
остановить загрузку контента
 
<tt>>>STOP
<<STATE 0</tt>
 
разорвать соединение
 
<tt>>>SHUTDOWN
<<SHUTDOWN</tt>
 
----
----
----
==Общие понятия==
ACE Stream Engine (далее - "движок") - приложение, которое обеспечивает весь функционал системы ACE Stream. Данное приложение работает в фоновом режиме и имеет минимальный графический интерфейс для  изменения различных настроек. ACE Stream Engine API (далее - API) - программный интерфейс, позволяющий сторонним приложениям работать с движком. Под сторонними приложениями, как правило, подразумеваются медиа плееры, работающе
ACE Stream Engine API (далее - API) - программный интерфейс, позволяющий сторонним приложениям работать с движком. Под сторонними приложениями, как правило, подразумеваются медиа плееры, работающие с системой ACE Stream.
Клиент - стороннее приложение, которое работает с движком посредством API.
На Linux используется фиксированный порт: 62062
На Windows используется динамический порт. Движок после запуска создает файл acestream.port в директории, в которой находится сам движок (файл tsengine.exe), и записывает в данный файл порт, на  котором работает API. Для того, чтобы узнать порт, клиент должен прочитать указанный файл. Отсутствие данного файла указывает на то, что движок в не запущен. Путь к папке, в которую устанавливается движок, можно считать из реестра: <tt>HKEY_CURRENT_USER\Software\TorrentStream\EnginePath</tt>
движок, можно считать из реестра: HKEY_CURRENT_USER\Software\TorrentStream\EnginePathКлюч <tt>EnginePath </tt> содержит абсолютный путь к исполняемому файлу движка (tsengine.exe). По умолчанию это <tt>%APPDATA%\TorrentStream\engine\tsengine.exe</tt>
Алгоритм установления соединения (Windows):
После установления соединения клиент и движок должны обменяться рукопожатием:
* клиент отсылает сообщение
<tt>HELLOBG version=''api_version''<api_version/tt>
* движок отсылает в ответ
<tt>HELLOTS version=''engine_version'' version_code=''version_code'' key=''request_key'' http_port=''http_port''<engine_version/tt>
Каждое сообщение должна должно завершаться символами перевода строки CRLF (\r\n)
;<''api_version>'': версия API, которую поддерживает клиент. Этот параметр служит для поддержки обратной совместимости новых версий движка со старыми клиентами. Текущая версия API - 3. Если клиент не указал версию, по умолчанию используется версия 1. Для всех сообщений API в документации указано, начиная с какой версии они поддерживаются.
по умолчанию используется Текущая версия 1. Для всех сообщений API в документации указано, начиная с какой версии они поддерживаются.- 3 ;<''engine_version>''
: версия движка (например, 2.0.8)
 
;''version_code''
: цифровой код версии движка (например, 3003400); клиент должен использовать этот код для сравнения версий движка; код каждой новой версии всегда больше всех кодов предыдущих версий
 
;''request_key''
:используется для авторизации клиента с помощью [[Product key|ключа продукта]]
 
;''http_port''
:порт, на котором работает встроенный HTTP сервер движка
Если клиент в течение некоторого времени после отправки рукопожатия не получил ответ, соединение необходимо завершить.
 
После получения команды <tt>HELLOTS</tt> от движка клиент должен отослать такую команду:
<tt>READY key=''response_key''</tt>
 
Формирование <tt>response_key</tt> описано [[Product_key|здесь]].
===Обмен сообщениями===
Каждое сообщение представляет собой ASCII-строку, которая завершается символами перевода строки <tt>CRLF </tt> (<tt>\r\n</tt>)
Примерный алгоритм приема сообщений выглядит таким образом:
* клиент должен учитывать возможность получения нескольких сообщений одновременно (т.е. повторять предыдущий шаг, пока в буфере не будет символов CRLF)
===Завершение соединения===
Движок при завершении работы отправляет команду <tt>SHUTDOWN</tt> и закрывает сокет. При получении данной команды клиент должен прекратить обработку команд и закрыть свой сокет.
* если нет, значит ответ на команду не может быть получен
Мы не рекомендуем использовать синхронную команду <tt>LOAD</tt>, так как она подразумевает блокирование потока на стороне клиента. Эта команда является устаревшей и вместо нее следует использовать  асинхронную версию <tt>LOADASYNC</tt>
Ответ на команду <tt>GETCID</tt> приходит практически мгновенно, поэтому ее использование не приводит к блокированию. Однако есть одно замечание по использованию данной команды:
;Пример:
<tt><nowiki>Загрузить контент по Content ID:>>LOADASYNC 12345 TORRENT http126500 PID 1ccf192064ee2d95e91a79f91c6097273d582827 В ответ клиент получает от движка://rutor.org/download/67346 0 0 0<<LOADRESP 12345 126500 { "status": 1, "files": [["Prey%202_%20E3%202011%20Official%20Trailer_2sintel-1024-surround.mp4", 0]], "infohash": "4c78e1cf0df23b4f5a16a106829ebed710cb52e05410b27fc567c35c8547e3b69b141215ce3a1fd7", "checksum": "504275dd71a32d51c63c45ced37807751f5ccfa2"}</nowiki></tt>
=====<tt style="color: #009;">START</tt>=====
;Синтаксис
<tt>START TORRENT ''url'' ''file_indexes'' ''developer_id'' ''affiliate_id'' ''zone_id'' ''stream_id''
START INFOHASH <''infohash> <'' ''file_indexes> <'' ''developer_id> <'' ''affiliate_id> <'' ''zone_id>'' START PID <''content_id> <'' ''file_indexes>'' START RAW <''data> <'' ''file_indexes> <'' ''developer_id> <'' ''affiliate_id> <'' ''zone_id>'' START URL ''direct_url'' <''file_indexes> <'' ''developer_id> <'' ''affiliate_id> <'' ''zone_id>''
START EFILE ''efile_url''</tt>
* <tt>''data''</tt>: содержимое транспортного файла в кодировке base64
* <tt>''direct_url''</tt>: прямая http-ссылка на контент (для проигрывания без транспортного файла)
* <tt>''efile_url''</tt>: ссылка на .acemedia -файл(зашифрованный медиа-файл, который можно воспроизвести с помощью ПО ACE Stream)* <tt>''file_indexes''</tt>: список индексов файлов из торрент-файла, которые необходимо загружать. Индексы файлов клиент получает в сообщении LOADRESP разделенных запятой. Индексы начинаются с нуля и соответствуют списку файлов, который был получен в результате выполнения команды LOAD. Например, если в торрент-файле всего один видео-файл, то необходимо отправлять индекс 0. * <tt>''developer_id''</tt>: код разработчика (если неизвестно, необходимо передавать 0)* <tt>''affiliate_id''</tt>: код партнера (если неизвестно, необходимо передавать 0)* <tt>''zone_id''</tt>: код зоны партнера (если неизвестно, необходимо передавать 0) * <tt>''stream_id''</tt>: номер потока для multi-stream файлов (значение клиент получает из сообщения LOADRESP) Если необходимо в параметрах передать ссылку на файл, который находится в локальной файловой системе, следует использовать формат file:///path/to/file. ;Примеры: <tt><nowiki>Начать проигрывание по ссылке на транспортный файл:>>START TORRENT http://rutor.org/download/67346 0 0 0 0 Начать проигрывание по Content ID:START PID 1ccf192064ee2d95e91a79f91c6097273d582827 0 Начать проигрывание acemedia-файла c:\acestream\test.acemedia:START EFILE file%3A%2F%2F%2Fc%3A%5Cacestream%5Ctest.acemedia</nowiki></tt>
нуля ======<span id="transcode_settings"></span>Настройки транскодирования======Начиная с версии 3.1.5 есть возможность задавать формат вывода потока и соответствуют списку файлов, который был получен в результате выполнения команды LOAD. Например, если в торрент-файле всего один видео-файл, то необходимо отправлять индекс 0параметры транскодирования аудио. * <tt>''developer_idoutput_format=hls|http''</tt>: формат вывода потока* <tt>''affiliate_idtranscode_audio=0|1''</tt>: транскодировать все аудио в AAC* <tt>''zone_idtranscode_mp3=0|1''</tt>: транскодировать MP3 (данная опция применима только если transcode_audio=1)* <tt>''stream_idtranscode_ac3=0|1''</tt>: транскодировать только AC3 в AAC (данная опция применима только если transcode_audio=0)
:В версии 3.1.5 данные настройки касаются только live-потоков.:Если необходимо оригинал потока вещается в параметрах передать ссылку формате HLS, то формат вывода будет HLS независимо от настроек.:Настройки транскодирования аудио влияют только на файл, который находится выдачу в локальной файловой системе, следует использовать формат fileформате HLS (по HTTP всегда выдается оригинальный поток):Если настройки формата вывода или транскодирования не передаются в команде <tt>START<///path/to/file.tt>, то используются настройки, заданные пользователем на движке
;Примеры:
<tt><nowiki>Запустить в формате HLS:>>START TORRENT httpPID 1ccf192064ee2d95e91a79f91c6097273d582827 0 output_format=hls Запустить в формате HLS, транскодировать все аудио-кодеки в AAC://rutor.org/download/67346 0 0 0 0>> START PID xxxxxx 1ccf192064ee2d95e91a79f91c6097273d582827 0output_format=hls transcode_audio=1 transcode_mp3=1 Запустить в формате HLS, транскодировать все аудио-кодеки, кроме MP3, в AAC:>> START EFILE file:///c:\acestream\test.acemediaPID 1ccf192064ee2d95e91a79f91c6097273d582827 0 output_format=hls transcode_audio=1 transcode_mp3=0
</nowiki></tt>
;Пример:
<tt><nowiki>>>GETCID infohash=bc57456ca38b365477e07fa7e912693a7adc57da checksum=xxxxx infohash888e9891f82a045ea639256b468041fb8c9ac315 developer=0 affiliate=0 zone=xxxxx0<<##xxxxxxxxx68dba76ad7d0b9992581bf72f7835a0de4f84234</nowiki></tt>
=====<tt style="color: #009;">GETADURL</tt>=====
;Версия API:>= 3 ;Описание скоро будет:Запрос к движку на получение ссылки на рекламную страницу. Данную команду могут использовать клиенты, которые имеют возможность отображать встроенный браузер в плеере, для того, чтобы показывать пользователям рекламу перед началом проигрывания контента либо когда пользователь нажимает паузу. Если движок определит, что есть доступная к показу реклама, то после получения этой команды отправит клиенту событие <tt>EVENT showurl</tt> ;Синтаксис <tt>GETADURL width=''width'' height=''height'' infohash=''infohash'' action=''action''</tt> ;Параметры* <tt>''width''</tt>: ширина видео окна клиента (в пикселях)* <tt>''height''</tt>: высота видео окна клиента (в пикселях)* <tt>''infohash''</tt>: infohash текущего контента (значение клиент получает из сообщения LOADRESP)* <tt>''action''</tt>: описание события, возможные значения:** <tt>load</tt> - загрузка (клиент загрузился, готов к проигрыванию, но пользователь еще не начала проигрывание)** <tt>pause</tt> - пользователь нажал паузу ;Примеры <tt><nowiki>>>GETADURL width=1328 height=474 infohash=5410b27fc567c35c8547e3b69b141215ce3a1fd7 action=load>>GETADURL width=1328 height=474 infohash=5410b27fc567c35c8547e3b69b141215ce3a1fd7 action=pause</nowiki></tt>
=====<tt style="color: #009;">USERDATA</tt>=====
;Версия API:>= 3 ;Описание скоро будет:Данная команда используется для передачи движку информации о пользователе. Информация передается в формате JSON. ;Синтаксис <tt>USERDATA [{"gender": ''gender_id''}, {"age": ''age_id''}]</tt> ;Параметры* <tt>''gender_id''</tt>: пол пользователя. Возможные значения:** 1 - мужчина** 2 - женщина* <tt>''age_id''</tt>: возрастная группа пользователя. Возможные значения:** 1 - младше 13 лет** 2 - 13-17** 3 - 18-24** 4 - 25-34** 5 - 35-44** 6 - 45-54** 7 - 55-64** 8 - старше 64 ;Пример: <tt><nowiki>мужчина, от 18 до 24 лет:>>USERDATA [{"gender": 1}, {"age": 3}]</nowiki></tt>
=====<tt style="color: #009;">SAVE</tt>=====
;Версия API:>= 2 ;Описание скоро :Сохранить контент в указанном месте. ;Синтаксис <tt>SAVE infohash=''infohash'' index=''index'' path=''path''</tt> ;Параметры* <tt>''infohash''</tt> - infohash контента, который неободимо сохранить (значение клиент получает из сообщения <tt>EVENT cansave</tt>)* <tt>''index''</tt> - индекс файла, который необходимо сохранить (значение клиент получает из сообщения <tt>EVENT cansave</tt>)* <tt>''path''</tt> - абсолютный путь к файлу, в который необходимо сохранить контент. Если указанный файл не существует, он будетсоздан. Если существует, файл будет перезаписан. Путь должен передаваться в виде urlencoded строки в кодировке UTF-8. ;Пример: <tt><nowiki>Сохранить файл с индексом 0 в папку d:\media под названием sintel-1024-surround.mp4>>SAVE infohash=5410b27fc567c35c8547e3b69b141215ce3a1fd7 index=0 path=D%3A%2Fmedia%2Fsintel-1024-surround.mp4</nowiki></tt>
=====<tt style="color: #009;">LIVESEEK</tt>=====
;Пример:
<tt><nowiki>>>SHUTDOWN</nowiki></tt>
 
=====<tt style="color: #009;">SETOPTIONS</tt>=====
;Версия движка
:>= 3003600
 
;Описание
:Сообщить движку о наборе опций, которые поддерживает клиент
 
;Синтаксис
<tt>SETOPTIONS name1=value1 [name2=value2 ...]</tt>
 
;Параметры
:name - название опции
:value - значение опции
 
;Список опций
:use_stop_notifications - клиент хочет получать от движка событие download_stopped с причиной остановки во время проигрывания
 
;Пример:
<tt><nowiki>>>SETOPTIONS use_stop_notifications=1</nowiki></tt>
====Команды от движка к клиенту====
;Версия API
:1
Эти команды устарела устарели и больше не используется. Вместо них следует использовать команду <tt>START</tt>
=====<tt style="color: #009;">START</tt>=====
;Синтаксис
<tt>START ''url'' [ad=1 [interruptibleinterruptable=1]] [stream=1] [pos=''position'']</tt>
;Параметры
* <tt>''url''</tt>: ссылка для проигрывания
* <tt>''ad=1''</tt>: флаг, указывающий на то, что ссылка <tt>''url''</tt> ведет на рекламный видеоролик, который клиент должен проиграть перед началом воспроизведения основного контента
* <tt>''interruptibleinterruptable=1''</tt>: флаг, указывающий на то, что должен проиграться прерываемый рекламный ролик* <tt>''stream=1''</tt>: флаг, указывающий на то, что проигрываемый контент является живой трансляцией (Live Stream).
* <tt>''position''</tt>: целое число от 0 до 100, которое указывает с какой позиции клиент должен начать проигрывание (например, position=50 означает, что клиент должен начать проигрывание с
позиции 50%, т.е. с середины контента)
;Пример:Примеры <tt><nowiki>Начать проигрывание контента по указанной ссылке:<<START http://127.0.0.1:6878/content/xxxx5410b27fc567c35c8547e3b69b141215ce3a1fd7/0.628180567194 Начать проигрывание непрерываемого рекламного ролика:<<START http://127.0.0.1:6878/content/xxxx 6081f31fe7f1db2ea7183686b46ba382820df574/0.456623456572 ad=1 Начать проигрывание прерываемого рекламного ролика:<<START http://127.0.0.1:6878/content/xxxx 6081f31fe7f1db2ea7183686b46ba382820df574/0.456623456572 ad=1 interruptibleinterruptable=1 Начать проигрывание live:<<START http://127.0.0.1:6878/content/xxxx 553b7d4cfec8974752d386844cb67e0ee64eae05/0.728180367195 stream=1 Начать проигрывание с середины (50%):<<START http://127.0.0.1:6878/content/5410b27fc567c35c8547e3b69b141215ce3a1fd7/0.828180567196 pos=050</nowiki></tt>
=====<tt style="color: #009;">PAUSE</tt>=====
=====<tt style="color: #009;">STOP</tt>=====
;Версия API
:>= 1
 
;Описание
:Клиент должен остановить воспроизведение контента
 
;Синтаксис
<tt>STOP</tt>
 
;Параметры
:нет
 
;Пример:
<tt><nowiki><<STOP</nowiki></tt>
 
=====<tt style="color: #009;">SHUTDOWN</tt>=====
;Версия API
=====<tt style="color: #009;">EVENT</tt>=====
;Версия API
:>= 3
 
;Описание
:Отправка событий движку. С помощью этого сообщения клиент может отправлять движку события, касающиеся действий пользователя относительно воспроизведения контента (поставил на паузу, перемотал и т.п.)
 
;Синтаксис
<tt>EVENT ''event_name'' [param1=value1 [param2=value2] ...]</tt>
 
;Параметры
* <tt>''event_name''</tt>: название события. Возможные значения:
** <tt>play</tt> - начало воспроизведения либо продолжение после паузы
** <tt>pause</tt> - пользователь поставил воспроизведение на паузу
** <tt>stop</tt> - остановка воспроизведения
** <tt>seek</tt> - пользователь осуществил перемотку. Для этого события необходимо отправлять параметр <tt>position</tt>, в котором указывается позиция в секундах
 
;Примеры
<tt><nowiki>>>EVENT play
>>EVENT pause
>>EVENT seek position=1487
>>EVENT stop</nowiki></tt>
====События от движка к клиенту====
;Описание
:Информация о текущем статусе TS Engine движка
;Синтаксис
<tt>STATE ''state_id''</tt>
;Параметры
* <tt>''state_id''</tt>: состояние движка:
** 0(IDLE) - движок ничего не делает** 1(PREBUFFERING) - началась пребуферизация** 2(DOWNLOADING) - идет загрузка контента в обычном режиме** 3 (BUFFERING) - началась буферизация** 4 (COMPLETED) - загрузка контента завершена** 5 (CHECKING) - выполняется инициализация перед началом загрузки** 6 (ERROR) - ошибка
;Пример:
<tt><nowiki><<STATE 0</nowiki></tt>
 
=====<tt style="color: #009;">INFO</tt>=====
;Версия API
:>= 1
 
;Описание
:Отобразить текстовое сообщение пользователю.
 
;Синтаксис
<tt>INFO ''message_id'';''message_text''</tt>
 
;Параметры
* <tt>''message_id''</tt>: числовой идентификатор сообщения
** 1: сообщение "На данный момент нет активных пиров" (отправляется в том случае, если в течение минуты после начала загрузки не удалось найти ни одного пира)
** 2: сообщение "Рекламный блок" (отправляется после начала воспроизведения рекламного ролика).
** 3: сообщение "Основной контент" (отправляется после начала воспроизведения основного контента).
** 0: другое сообщение (текст сообщения берется из параметра <tt>''message_text''</tt>)
* <tt>''message_text''</tt>: текст сообщения, которое необходимо отобразить
 
;Пример:
<tt><nowiki><<INFO 1;Cannot find active peers
<<INFO 2;Advertising video
<<INFO 3;Main content
<<INFO 0;Display some message</nowiki></tt>
=====<tt style="color: #009;">STATUS</tt>=====
;Описание
:Данное сообщение отправляется периодически для информирования клиента о текущем статусе загрузки контента . Основное назначение этого сообщение - дать клиенту возможность отображать пользователю о том, что сейчас происходит на движке.
;Синтаксис
<tt>STATUS main:status_string STATUS main:status_string|ad:''status_string''</tt>
;Параметры
* <tt>''status_string''</tt> - строка описанного ниже формата Если идет проигрывание основного контента <tt>STATUS main:''status_description''</tt> Если идет проигрывание рекламного ролика (рекламный ролик и основной контент описываются отдельно; например, рекламный ролик уже полность загружен, а основной контент проходит стадию пребуферизации): <tt>STATUS main:''status_description''|ad:''status_description''</tt> ;Возможные значения <tt>''status_description:''</tt>* движок ничего не делает - <tt>'''idle'''</tt>* движок загружает транспортный файл (обрабатывает команду <tt>LOADASYNC</tt>) - <tt>'''loading'''</tt>* движок выполняет предварительную инициализацию воспроизведения (движок переходит в это состояние после получения команды <tt>START</tt> от клиента) - <tt>'''starting'''</tt>* ошибка - <tt>'''err;error_id;error_message'''</tt> (код и описание)* проверка - <tt>'''check;progress'''</tt>* пребуферизация - <tt>'''prebuf;progress;time'''</tt>* контент загружается либо уже полностью загружен - <tt>'''dl'''</tt>* буферизация - <tt>'''buf;progress;time'''</tt>* ожидание достаточной скорости - <tt>'''wait;time'''</tt> Ко всем <tt>status_string</tt> (кроме <tt>idle, loading, starting, err, check</tt>) добавляются общие данные: <tt>total_progress;immediate_progress;speed_down;http_speed_down;speed_up;peers;http_peers;downloaded;http_downloaded;uploaded</tt> * <tt>''total_progress''</tt> - сколько всего закачано по данному файлу* <tt>''immediate_progress''</tt> - сколько непрерывных данных закачано начиная с текущей позиции (для отображения кол-ва закачанного в бегунке)* <tt>''speed_down''</tt> - скорость загрузки (Кбайт/с)* <tt>''http_speed_down''</tt> - скорость загрузки от прямых http-источников (Кбайт/с)* <tt>''speed_up''</tt> - скороть отдачи (Кбайт/с)* <tt>''peers''</tt> - количество подсоединенных пиров* <tt>''http_peers''</tt> - количество подсоединенных прямых http-источников* <tt>''downloaded''</tt> - объем загруженных данных (байт)* <tt>''http_downloaded''</tt> - объем загруженных по http данных (байт)* <tt>''uploaded''</tt> - объем отданных данных (байт) Все числа передаются как integer. Все progress принимают значение от 0 до 100. ;Примеры <tt><nowiki>Движок ничего не делает:<<STATUS main:idle Загружается транспортный файл:<<STATUS main:loading Инициализация воспроизведения:<<STATUS main:starting Пребуферизация 0%, еще нетподсоединенных пиров:<<STATUS main:prebuf;0;2147483648;0;0;0;0;0;0;0;0;0;0; Пребуферизация 20%, скорость загрузки 328 Кбайт/с, подсоединено 7 пиров, загружено 5505024 байт:<<STATUS main:prebuf;20;2723;0;0;328;0;0;7;0;5505024;0;0 Пребуферизация 90%, скорость загрузки 420 Кбайт/с, подсоединено 9 пиров, загружено 11659264байт:<<STATUS main:prebuf;90;3299;1;0;420;0;0;9;0;11659264;0;0 Идет загрузка контента, загружен 1%, скорость загрузки 442 Кбайт/с, подсоединено 10 пиров, загружено 13920256:<<STATUS main:dl;1;0;442;0;0;10;0;13920256;0;0 Рекламный ролик полность загружен и воспроизводится, основной контент пребуферизируется (20%):<<STATUS main:prebuf;20;2723;0;0;328;0;0;7;0;5505024;0;0|ad:dl;100;0;0;0;0;0;0;13920256;0;0</nowiki></tt>
;Пример:трансформации статусов в текстовые сообщения, понятные пользователю <tt><nowiki><<STATUS main:check - Проверка xx% prebuf;45;30|ad:- Пребуферизация xx% buf;69- Буферизация xx% wait - Ожидание достаточной скорости err - выводим сообщение об ошибке loading - Загрузка... starting - Запуск...<<STATUS main: dl|ad:dl</nowiki>, idle - ничего не выводим</tt>
=====<tt style="color: #009;">AUTH</tt>=====
<<AUTH 1</nowiki></tt>
=====<tt style="color: #009;">EVENTgetuserdata</tt>=====;Версия API:>= 3 ;Описание:Движок запрашивает у клиента данные пользователя (пол и возрастную группу). Такой запрос приходит при попытке что-либо проиграть, если данные о пользователе не были переданы ранее (т.е. фактически при первом после установки просмотре в ответ на команду <tt>START</tt>).:При получении этого события клиент должен запросить данные у пользователя, затем отправить их движку командой <tt>USERDATA</tt> и начать воспроизведение командой <tt>START</tt> ;Синтаксис <tt>EVENT getuserdata</tt> ;Параметры:нет ;Пример: <tt><nowiki><<EVENT getuserdata</nowiki></tt> =====<tt style="color: #009;">EVENT cansave</tt>=====;Версия API:>= 2 ;Описание:Данное событие информирует клиента о том, что контент может быть сохранен на диске в указанном пользователем месте. Например, при получении данного события клиент может отобразить кнопку "Сохранить" в пользовательском интерфейсе. При нажатии на кнопку пользователь должен будет выбрать, куда сохранять контент, после чего клиент отправит движку команду <tt>SAVE</tt> ;Синтаксис <tt>EVENT cansave infohash=''infohash'' index=''index'' format=''format''</tt> ;Параметры* <tt>''infohash''</tt> - infohash контента* <tt>''index''</tt> - номер файла, который можно сохранить* <tt>''format''</tt> - формат файла, в котором будет сохранен контент. Возможные значения:** <tt>plain</tt> - файл будет сохранен в незашифрованном виде** <tt>encrypted</tt> - файл будет сохранен в зашифрованном виде (файл должен иметь расширение .acemedia). Зашифрованные файлы могут быть воспроизведены только с помощью программного обеспечение ACE Stream (с помощью команды <tt>START EFILE</tt>). Параметры <tt>''infohash''</tt> и <tt>''index''</tt> клиент может использовать в команде <tt>SAVE</tt>, если пользователь решит сохранить контент. ;Пример: <tt><nowiki>Доступен для сохранения файл под номером 0, файл может быть сохранен в открытом виде:<<EVENT cansave infohash=5410b27fc567c35c8547e3b69b141215ce3a1fd7 index=0 format=plain Файл может быть сохранен только в зашифрованном виде:<<EVENT cansave infohash=5410b27fc567c35c8547e3b69b141215ce3a1fd7 index=0 format=encrypted</nowiki></tt> =====<tt style="color: #009;">EVENT showurl</tt>=====;Версия API:>= 3 ;Описание:Клиент должен отобразить встроенный браузер и загрузить указанную ссылку. В случае, если клиент не имеет встроенного браузера, это событие можно проигнорировать. ;Синтаксис <tt>EVENT showurl type=''type'' url=''url'' [width=''width''] [height=''height'']</tt> ;Параметры* <tt>''type''</tt> - тип запроса (причина, по которой движок просит отобразить браузер). Возможные значения:** <tt>ad</tt>: отобразить рекламу (такой запрос приходит в ответ на команду <tt>GETADURL</tt>)** <tt>notification</tt>: отобразить пользователю страницу-уведомление. Такой запрос используется в том случае, если пользователя необходимо уведомить о чем-то и уведомление потребует от пользователя каких-либо действий (например, если доступ к контенту открыт только для зарегистрированных пользователей, то клиенту будет отослана ссылка на страницу, на которой пользователь сможет зарегистрироваться). Такие запросы дублируются событием <tt>INFO</tt> для того, чтобы клиенты без встроенного браузера могли отобразить пользователю текстовое уведомление.* <tt>''url''</tt> - ссылка на страницу, которую необходимо отобразить* <tt>''width''</tt> - ширина страницы (в пикселях)* <tt>''height''</tt> - высота страницы (в пикселях) Если размеры окна браузера, передаваемые в параметрах <tt>width</tt> и <tt>height</tt>, больше размера окна клиента, то клиент должен отобразить браузер на все окно. Если параметры <tt>width</tt> и <tt>height</tt> отсутствуют либо равны нулю, клиент должен отобразить браузер на все окно. ;Пример: <tt><nowiki>Показать рекламную страницу с адресом http://ad.example.com в браузере с размером окна 400x250 пикселей:<<EVENT showurl type=ad url=http://ad.example.com width=400 height=250 Отобразить на все окно браузер со страницой http://www.example.com/notification:<<EVENT showurl type=notification url=http://www.example.com/notification</nowiki></tt> =====<tt style="color: #009;">EVENT livepos</tt>=====
Описание скоро будет
 
=====<tt style="color: #009;">EVENT download_stopped</tt>=====
;Версия движка
:>= 3003600
 
;Описание
:Данное событие информирует клиента о причине остановки воспроизведения контента
 
;Синтаксис
<tt>EVENT download_stopped reason=''reason'' option=''option''</tt>
 
;Параметры
* <tt>''reason''</tt> - причина остановки; возможные значения:
** <tt>missing_option</tt>: не активирована платная опция, необходимая для воспроизведения данного контента
* <tt>''option''</tt> - идентификатор платной опции
 
;Пример:
<tt><nowiki>Воспроизведение остановлено, так как у пользователя отсутствует активированная платная опция proxyServer:
<<EVENT download_stopped reason=missing_option option=proxyServer</nowiki></tt>
 
== Примеры ==
 
<tt>'''>>'''</tt> - сообщения от клиента к движку
<tt>'''<<'''</tt> - сообщения от движка к клиенту
 
 
===Проигрывание торрент-файла по ссылке без рекламных роликов===
(необходимость проигрывания рекламных роликов определяет движок).
 
Для загрузки содержимого торрента используется асинхронная команда LOADASYNC.
 
Торрент файл содержит один видео-файл.
 
рукопожатие
<tt>>>HELLOBG version=3
<<HELLOTS version=3.1.1 version_code=3003400 key=5eb1f78f http_port=6878</tt>
 
клиент готов принимать сообщения
<tt>>>READY key=123456-fd2a247d83adffed56d82cca150d5fab225f1408</tt>
 
пользователю доступны расширенные функции
<tt><<AUTH 1</tt>
 
загрузить торрент по ссылке
<tt>>>LOADASYNC 467763 TORRENT http://rutor.org/download/67346 0 0 0
<<LOADRESP 467763 {"status": 1, "files": <nowiki>[["Prey%202_%20E3%202011%20Official%20Trailer_2.mp4", 0]]</nowiki>, "infohash":
"4c78e1cf0df23b4f5a16a106829ebed710cb52e0"}</tt>
 
узнать код плеера (например, чтобы показать его пользователю)
<tt>>>GETPID 4c78e1cf0df23b4f5a16a106829ebed710cb52e0 0 0 0
<<##36ae4c89ab45b4010b1461c513da38d007356195</tt>
 
начать пребуферизацию видео
<tt>>>START TORRENT http://rutor.org/download/67346 0 0 0 0</tt>
 
идет процесс пребуферизации
<tt><<STATE 1
<<STATUS main:prebuf;0;2147483447;0;0;0;0;0;0;0;0;0;0
<<STATUS main:prebuf;0;2132;0;0;29;0;0;8;0;131072;0;0
<<STATUS main:prebuf;8;942;0;0;60;0;0;9;0;393216;0;0
<<STATUS main:prebuf;50;591;0;0;87;0;0;8;0;835584;0;0
<<STATUS main:prebuf;75;497;0;0;98;0;0;8;0;1146880;0;0
<<STATUS main:prebuf;91;448;0;0;105;0;0;8;0;1441792;0;0</tt>
 
пребуферизация завершена, клиент получает ссылку для проигрывания контента
<tt><<PLAY http://127.0.0.1:6878/content/4c78e1cf0df23b4f5a16a106829ebed710cb52e0/0.673752283974
<<STATE 2</tt>
 
клиент отправляет длительность контента (~201 секунда)
<tt>>>DUR http://127.0.0.1:6878/content/4c78e1cf0df23b4f5a16a106829ebed710cb52e0/0.673752283974 201964</tt>
 
клиент информирует о том, что началось проигрывание
<tt>>>PLAYBACK http://127.0.0.1:6878/content/4c78e1cf0df23b4f5a16a106829ebed710cb52e0/0.673752283974 0</tt>
 
движок загружает контент
<tt><<STATUS main:dl;0;0;110;0;0;8;0;1622016;0;0
<<STATUS main:dl;0;0;128;0;0;8;0;2965504;0;0
<<STATUS main:dl;0;0;130;0;0;8;0;3129344;0;0</tt>
 
движку недостаточно данных для проигрывания, начинает буферизация
<tt><<PAUSE
<<STATE 3
<<STATUS main:buf;0;315;0;0;130;0;0;8;0;3260416;0;0
<<STATUS main:buf;90;299;0;0;133;0;0;8;0;3866624;0;0
<<STATUS main:buf;90;278;0;0;138;0;0;8;0;4390912;0;0</tt>
 
буферизация завершена
<tt><<RESUME
<<STATE 2
<<STATUS main:dl;0;0;141;0;0;8;0;4898816;0;0</tt>
 
клиент проиграл 25% контента
<tt>>>PLAYBACK http://127.0.0.1:6878/content/4c78e1cf0df23b4f5a16a106829ebed710cb52e0/0.673752283974 25
<<STATUS main:dl;0;0;141;0;0;8;0;4898816;0;0
<<STATUS main:dl;0;0;146;0;0;7;0;8388608;0;0</tt>
 
клиент проиграл 50% контента
<tt>>>PLAYBACK http://127.0.0.1:6878/content/4c78e1cf0df23b4f5a16a106829ebed710cb52e0/0.673752283974 50
<<STATUS main:dl;0;0;145;0;0;7;0;9404416;0;0</tt>
 
клиент проиграл 75% контента
<tt>>>PLAYBACK http://127.0.0.1:6878/content/4c78e1cf0df23b4f5a16a106829ebed710cb52e0/0.673752283974 75
<<STATUS main:dl;0;0;146;0;0;7;0;9568256;0;0</tt>
 
остановить загрузку контента
<tt>>>STOP
<<STATE 0</tt>
 
разорвать соединение
<tt>>>SHUTDOWN
<<SHUTDOWN</tt>
 
===Ошибка запуска воспроизведения, отсутствует необходимая платная опция proxyServer===
<div id="example-missing-option-on-start"></div>
В этом примере описана ситуация, когда движок не может начать воспроизведение, так как для этого требуется наличие у пользователя активированной платной опции.
 
В случае отсутствия платной опции необходимо уведомить пользователя о необходимости приобрести данную опцию. Это может сделать либо клиент, либо движок. Если клиент хочет самостоятельно уведомить пользователя, он должен сообщить движку о готовности получать событие <tt>download_stopped</tt> с помощью команды <tt>SETOPTIONS</tt>. Если клиент этого не сделал, то движок самостоятельно уведомит пользователя (открыв окно либо страницу в браузере).
 
Первый пример описывает ситуацию, когда клиент не хочет уведомлять пользователя (в этом сценарии уведомление пользователю выдаст движок):
 
рукопожатие
<tt>>>HELLOBG version=3
<<HELLOTS version=3.1.1 version_code=3003400 key=5eb1f78f http_port=6878
>>READY key=123456-fd2a247d83adffed56d82cca150d5fab225f1408
<<AUTH 5</tt>
 
старт воспроизведения
<tt>>>START PID c894b23a65d64a0dae2076d2a01ec6bface83b01 0
<<STATE 1
<<STATUS main:starting</tt>
 
ошибка старта
<tt><<STATE 0
<<STATUS main:idle
<<STATUS main:err;0;You need to buy Proxy Server option to continue</tt>
 
Второй пример описывает ситуацию, когда клиент хочет уведомлять пользователя:
 
рукопожатие
<tt>>>HELLOBG version=3
<<HELLOTS version=3.1.1 version_code=3003400 key=5eb1f78f http_port=6878
>>READY key=123456-fd2a247d83adffed56d82cca150d5fab225f1408
<<AUTH 5
>>SETOPTIONS use_stop_notifications=1</tt>
 
старт воспроизведения
<tt>>>START PID c894b23a65d64a0dae2076d2a01ec6bface83b01 0
<<STATE 1
<<STATUS main:starting</tt>
 
ошибка старта
<tt><<EVENT download_stopped reason=missing_option option=proxyServer
<<STATE 0
<<STATUS main:idle</tt>
 
===Воспроизведение прервано, так как отсутствует необходимая платная опция proxyServer===
 
Этот сценарий отличается от предыдущего тем, что воспроизведение начинается, но через некоторое время после старта останавливается по причине отсутствия платной опции.
 
рукопожатие
<tt>>>HELLOBG version=3
<<HELLOTS version=3.1.1 version_code=3003400 key=5eb1f78f http_port=6878
>>READY key=123456-fd2a247d83adffed56d82cca150d5fab225f1408
<<AUTH 5
>>SETOPTIONS use_stop_notifications=1</tt>
 
старт воспроизведения
<tt>>>START PID c894b23a65d64a0dae2076d2a01ec6bface83b01 0
<<STATE 1
<<STATUS main:starting
<<STATUS main:prebuf;0;0;0;0;8;0;0;1;0;16384;0;0
<<START http://127.0.0.1:6878/content/6d12f958332ef0bd258053ba1afd833ddf9b74f9/0.289607197304 stream=1
<<STATE 2</tt>
 
некоторое время воспроизведения идет без остановки
<tt><<STATUS main:dl;0;0;832;0;0;1;0;2392064;0;0
<<EVENT livepos last=1448977939 live_first=1448976139 pos=1448977939 &crarr;
first_ts=1448976139 last_ts=1448977939 is_live=1 live_last=1448977939 buffer_pieces=15
<<STATUS main:dl;0;0;1339;0;8;3;0;5242880;0;65536
<<EVENT livepos last=1448977939 live_first=1448976139 pos=1448977939 &crarr;
first_ts=1448976139 last_ts=1448977939 is_live=1 live_last=1448977939 buffer_pieces=15
<<STATUS main:dl;0;0;1165;0;18;3;0;5767168;0;163840
<<EVENT livepos last=1448977941 live_first=1448976141 pos=1448977941 &crarr;
first_ts=1448976141 last_ts=1448977941 is_live=1 live_last=1448977941 buffer_pieces=15
<<STATUS main:dl;0;0;396;0;175;4;0;35127296;0;10534912
<<EVENT livepos last=1448978010 live_first=1448976210 pos=1448978010 &crarr;
first_ts=1448976210 last_ts=1448978010 is_live=1 live_last=1448978010 buffer_pieces=15</tt>
 
остановка воспроизведения
<tt><<EVENT download_stopped reason=missing_option option=proxyServer
<<STOP
<<STATE 0
<<STATUS main:idle
<<STATUS main:err;0;Download stopped</tt>

Navigation menu