Changes

Jump to: navigation, search

Engine API

42,280 bytes added, 18:09, 11 April 2016
Настройки транскодирования
'''Обмен данными с TS ==Общие понятия==ACE Stream Engine происходит по протоколу TCP(далее - "движок") - приложение, которое обеспечивает весь функционал системы ACE Stream. Данное приложение работает в фоновом режиме и имеет минимальный графический интерфейс для изменения различных настроек.'''
'''По умолчанию TS ACE Stream Engine принимает входящие соединения на порт 62062API (далее - API) - программный интерфейс, позволяющий сторонним приложениям работать с движком. Под сторонними приложениями, как правило, подразумеваются медиа плееры, работающие с системой ACE Stream.'''
Клиент - стороннее приложение, которое работает с движком посредством API.
== ОБЩИЙ ВИД КОМАНД Схема работы API==Каждая команда должна состоять Обмен данными с движком происходит по протоколу TCP. Общая схема работы выглядит так:* клиент устанавливает TCP-соединение с движком* клиент и движок обмениваются рукопожатиями* клиент и движок обмениваются сообщениями* одна из строки, завершающейся разделителем \r\nсторон завершает соединение
Большинство команд имеют такой вид:===Установление соединения===Для установления соединения клиент должен знать порт, на котором работает API движка. Методы определения порта зависят от операционной системы, на которой запущен движок.
<tt>'''CMD [param1] [param2] ...'''</tt>На Linux используется фиксированный порт: 62062
гдеНа Windows используется динамический порт. Движок после запуска создает файл acestream.port в директории, в которой находится сам движок (файл tsengine.exe), и записывает в данный файл порт, на котором работает API. Для того, чтобы узнать порт, клиент должен прочитать указанный файл. Отсутствие данного файла указывает на то, что движок в не запущен. Путь к папке, в которую устанавливается движок, можно считать из реестра: <tt>HKEY_CURRENT_USER\Software\TorrentStream\EnginePath</tt>
Ключ <tt>'''CMD'''EnginePath</tt> содержит абсолютный путь к исполняемому файлу движка (tsengine.exe). По умолчанию это <tt>%APPDATA%\TorrentStream\engine\tsengine.exe</tt> - предопределенное название команды
Алгоритм установления соединения (Windows):# считать из реестра ключ <tt>'''param1, param2 ...'''HKEY_CURRENT_USER\Software\TorrentStream\EnginePath</tt> ## если ключ отсутствует - движок не установлен## запомнить путь к исполняемому файлу движка (engine_path) и директории движка (engine_dir)# считать содержимое файла engine_dir/acestream.port и запомнить порт# если данный файл отсутствует - параметры командызапустить движок, разделенные пробеломдождаться создания файла acestream.port и считать его содержимое# установить TCP-соединение на localhost на указанный порт# если не получилось установить соединение - движок не запущен и его нужно запустить# обменяться рукопожатием и начать обмен сообщениями
Алгоритм установления соединения (Linux):
# установить TCP-соединение на localhost на порт 62062
# если не получилось установить соединение - движок не запущен и его нужно запустить (<tt>/usr/bin/acestreamengine-client-gtk</tt>)
# обменяться рукопожатием и начать обмен сообщениями
== ТИПЫ КОМАНД =Рукопожатие===После установления соединения клиент и движок должны обменяться рукопожатием:* клиент отсылает сообщение <tt>HELLOBG version=''api_version''</tt>* движок отсылает в ответ <tt>HELLOTS version=''engine_version'' version_code=''version_code'' key=''request_key'' http_port=''http_port''</tt>
Все команды делятся на входящие и исходящие.Каждое сообщение должно завершаться символами перевода строки CRLF (\r\n)
Входящие команды отправляются от клиента к TS Engine. Клиентом является любое программное;''api_version''обеспечение: версия API, которое использует функционал TS Engineкоторую поддерживает клиент. Этот параметр служит для поддержки обратной совместимости новых версий движка со старыми клиентами. С помощью входящих команд Если клиентуправляет работой TS Engineне указал версию, по умолчанию используется версия 1. Для всех сообщений API в документации указано, начиная с какой версии они поддерживаются.
Исходящие команды отправляются от TS Engine к клиенту. Данный тип команд используется дляинформирования клиента о работе TS Engine. Текущая версия API - 3
;''engine_version''
: версия движка (например, 2.0.8)
== СИНХРОННЫЕ КОМАНДЫ ==;''version_code'': цифровой код версии движка (например, 3003400); клиент должен использовать этот код для сравнения версий движка; код каждой новой версии всегда больше всех кодов предыдущих версий
Большинство входящих команд выполняются асинхронно, т.е. ;''request_key'':используется для таких команд нет понятия "ответ на команду".авторизации клиента с помощью [[Product key|ключа продукта]]
;''http_port'Примеры асинхронных команд':'''порт, на котором работает встроенный HTTP сервер движка
- Если клиент отправляет LOADASYNCв течение некоторого времени после отправки рукопожатия не получил ответ, после загрузки содержимого TS Engine отправляет LOADRESP через некоторое времясоединение необходимо завершить.
- После получения команды <tt>HELLOTS</tt> от движка клиент отправляет START, после окончания пребуферизации TS Engine отправляет PLAYдолжен отослать такую команду: <tt>READY key=''response_key''</tt>
Формирование <tt>response_key</tt> описано [[Product_key|здесь]].
Но есть также команды===Обмен сообщениями===Каждое сообщение представляет собой ASCII-строку, которые выполняются синхронно, в режиме "запрос-ответ". На данный момент таких команд две: '''LOAD''' и '''GETPID'''.которая завершается символами перевода строки <tt>CRLF</tt> (<tt>\r\n</tt>)
Синхронная команда предполагает ответПримерный алгоритм приема сообщений выглядит таким образом:* клиент в цикле ждет поступления данных по TCP-соединению* при получении данных они добавляются в буфер* клиент проверяет, есть ли в буфере символы CRLF. Если есть, который то из буфера вырезается сообщение (строка от начала буфера до символов CRLF) и отправляется от TS Engine к клиенту в виде строкиобработчик сообщений* клиент должен учитывать возможность получения нескольких сообщений одновременно (т.е. повторять предыдущий шаг, начинающейся на ##.пока в буфере не будет символов CRLF)
Обработка синхронных ===Завершение соединения===Движок при завершении работы отправляет команду <tt>SHUTDOWN</tt> и закрывает сокет. При получении данной команды клиент должен прекратить обработку команд со стороны клиента должна выглядеть таким образом:и закрыть свой сокет.
То же самое должен делаь клиент при закрытии - клиент отправляет перед закрытием отослать движку команду, например "GETPID qwerty 0 0 0" и ждет, пока от TS Engine придет ответ<tt>SHUTDOWN</tt>
- если от TS Engine получено сообщение, которое начинается на ##, то данное сообщение считается ответом на синхронную команду (например, ##12345)==Сообщения==
===Типы сообщений===
Все сообщения условно делятся на две группы: команды и события.
== ВХОДЯЩИЕ КОМАНДЫ ==Команды подразумевают выполнение какого-либо действия от принимающей стороны. Например, командой <tt>START</tt> клиент просит движок начать пребуферизацию указанного контента.
События носят информационный характер. Например, событие <tt>'''HELLOBG'''STATUS</tt>информирует клиента о статусе загрузки (идет ли в данный момент пребуферизация, буферизация, какая скорость загрузки и т.д.)
Используется в рамках процедуры "рукопожатия" между клиентом и TS Engine===Синхронные команды===Практически все команды являются асинхронными, т.е. не предполагают наличие ответа от другой стороны.
Эта команда должна быть отправлена клиентом сразу после установления tcp-соединения с TS Engine.Исключением являются две команды:* <tt>LOAD</tt> (сихронная загрузка информации о потоке)* <tt>GETCID</tt> (получение Content ID для потока)
Соединение с TS Engine считается успешным после тогоДля этих команд есть понятие ответа на команду. Ответ передается в виде строки, как клиент получил от TS Engine ответ которая начинается на "рукопожатие" - команду HELLOTS##.
Алгоритм обработки синхронных команд такой:
* клиент отправляет движку синхронную команду (например, <tt>GETCID 4c78e1cf0df23b4f5a16a106829ebed710cb52e0 0 0 0</tt>) и ждет данных от движка
* когда от движка приходят данные, клиент проверяет, начинается ли полученный ответ на ## (например, <tt>##36ae4c89ab45b4010b1461c513da38d007356195</tt>)
* если это так, то строка от символов ## до CRLF является ответом на синхронную команду (причем ответ может быть пустой, т.е. выглядеть так: <tt>##</tt>)
* если нет, значит ответ на команду не может быть получен
Мы не рекомендуем использовать синхронную команду <tt>'''READY'''LOAD</tt>, так как она подразумевает блокирование потока на стороне клиента. Эта команда является устаревшей и вместо нее следует использовать асинхронную версию <tt>LOADASYNC</tt>
Информирует TS Engine о томОтвет на команду <tt>GETCID</tt> приходит практически мгновенно, что клиент готов принимать исходящие поэтому ее использование не приводит к блокированию. Однако есть одно замечание по использованию данной команды: Команду <tt>GETCID</tt> не следует отправлять, если движок находится в состоянии <tt>starting</tt>
===Список сообщений===
В примерах сообщения от клиента к движку отмечены >>, от движка к клиенту - <<
<tt>'''LOAD TORRENT''' <torrent_url> <developer_id> <affiliate_id> <zone_id>====Команды от клиента к движку====
'''LOAD INFOHASH''' =====<torrent_infohashtt style="color: #009;"> READY<developer_id/tt> <affiliate_id> <zone_id=====;Версия API:>= 1
'''LOAD PID''' <player_id>;Описание:Информирует движок о том, что клиент готов принимать команды. Это должна быть первая команда после рукопожатия.
'''LOAD RAW''' ;Синтаксис <torrent_datatt> READY<developer_id> <affiliate_id> <zone_id/tt>
'''LOADASYNC''' <request_id> '''TORRENT''' <torrent_url> <developer_id> <affiliate_id> <zone_id>;Параметры:нет
'''LOADASYNC''' ;Пример: <request_idtt> '''INFOHASH''' <torrent_infohashnowiki>> <developer_id> READY<affiliate_id/nowiki> <zone_id/tt>
'''=====<tt style="color: #009;">LOADASYNC''' <request_id/tt> '''PID''' <player_id=====;Версия API:>= 1
'''LOADASYNC''' <request_id> '''RAW''' <torrent_data> <developer_id> <affiliate_id> <zone_id></tt>;Описание:Получить описание контента по идентификатору. Идентификатором может быть content id, ссылка на транспортный файл (.torrent, .acelive), инфохеш транспортного файла и т.п. Описание представляет
Данные команды выполняют загрузку содержимого торрент-файла и используются для того, чтобы клиент мог получить собой список названийфайлов либо потоков, которые содержатся в интересующем торрент-транспортном файле. Команды LOAD выполняются синхронно, Основное назначение этой команды LOADASYNC - асинхронно (ответ приходит в исходящей команде LOADRESP)возможность сформировать и показать пользователю плейлист.
Более предпочтительным методом является асинхронная загрузка.;Синтаксис <tt>LOADASYNC ''request_id'' TORRENT ''url'' ''developer_id'' ''affiliate_id'' ''zone_id'' LOADASYNC ''request_id'' INFOHASH ''infohash'' ''developer_id'' ''affiliate_id'' ''zone_id'' LOADASYNC ''request_id'' RAW ''data'' ''developer_id'' ''affiliate_id'' ''zone_id'' LOADASYNC ''request_id'' PID ''content_id''</tt>
;Параметры* <tt>''request_id'Параметры'</tt>:'''случайное целое число - идентификатор запроса LOADASYNC; этот же идентификатор будет отослан клиенту в команде LOADRESP после того,как будет получен список файлов; данный
<tt>'''request_id'''</tt> - случайное целое число - идентификатор запроса LOADASYNC; этот же идентификатор будет отослан клиенту в команде LOADRESP после того,как будет получен список файлов; данный идентификатор служит для того, чтобы клиент в случае отправки нескольких запросов LOAD LOADASYNC точно знал, на какой из этих запросов получен ответ* <tt>''url''</tt>: ссылка на транспортный файл* <tt>''infohash''</tt>: инфохеш транспортного файла* <tt>''data''</tt>: содержимое транспортного файла в кодировке base64* <tt>''content_id''</tt>: идентификатор контента в системе ACE Stream (Content ID)* <tt>''developer_id''</tt>: код разработчика (если неизвестно, необходимо передавать 0) * <tt>''affiliate_id''</tt>: код партнера (если неизвестно, необходимо передавать 0) * <tt>''zone_id''</tt>: код зоны партнера (если неизвестно, необходимо передавать 0)
;Формат ответа:Ответ приходит в формате JSON со следующими полями:* <tt>'''torrent_url'status''</tt> :** 0 - транспортный файл не содержит аудио/видео файлов** 1 - ссылка на торрент транспортный файл (например, http:содержит один аудио/видео файл** 2 - транспортный файл содержит более одного аудио/sometracker.comвидео файла** 100 - ошибка получения данных* <tt>''files''</torrenttt>: список файлов/12345)потоков; это массив, каждый элемент в котором состоит из массива из двух элементов: первый - название файла, второй - позиция в транспортном файле (эта позиция
должна отправляться в команде <tt>START</tt> для указания, какой именно файл необходимо загружать, если их несколько)* <tt>''infohash''</tt>: инфохеш транспортного файла* <tt>'torrent_infohash'checksum''</tt> - infohash торрента: хешсумма транспортного файла
:Параметры <tt>''infohash'player_id'</tt> и <tt>''checksum''</tt> - код плеераклиенту нужны для того, чтобы в дальнейшем получить Content ID с помощью команды <tt>GETCID</tt>
<tt>'''torrent_data'''</tt> - содержимое торрент-файла :Названия файлов возвращаются в виде urlencoded строк в кодировке base64UTF-8
;Пример: <tt>'''developer_id'''</ttnowiki>Загрузить контент по Content ID:>> - код разработчика (если неизвестно, необходимо передавать 0)LOADASYNC 126500 PID 1ccf192064ee2d95e91a79f91c6097273d582827
В ответ клиент получает от движка:<tt<LOADRESP 126500 { "status": 1, "files": [["sintel-1024-surround.mp4", 0]], "infohash": "5410b27fc567c35c8547e3b69b141215ce3a1fd7", "checksum": "504275dd71a32d51c63c45ced37807751f5ccfa2"}</nowiki>'''affiliate_id'''</tt> - код партнера (если неизвестно, необходимо передавать 0)
=====<ttstyle="color: #009;">'''zone_id'''START</tt> - код зоны партнера (если неизвестно, необходимо передавать 0)=====;Версия API:>= 1
;Описание
:Начать проигрывание указанного контента
;Синтаксис <tt>START TORRENT ''url'' ''file_indexes'' ''developer_id''''affiliate_id'' ''zone_id'' ''stream_id'' START TORRENTINFOHASH ''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'''' <torrent_url> <file_indexes> <'' ''developer_id> <'' ''affiliate_id> '' ''zone_id'' START EFILE ''efile_url''<zone_id/tt>
;Параметры* <tt>''url''</tt>: ссылка на транспортный файл* <tt>''infohash''</tt>: инфохеш транспортного файла* <tt>''content_id''</tt>: идентификатор контента в системе ACE Stream (Content ID)* <tt>''data''</tt>: содержимое транспортного файла в кодировке base64* <tt>''direct_url''</tt>: прямая http-ссылка на контент (для проигрывания без транспортного файла)* <tt>'START INFOHASH'efile_url'' <torrent_infohash/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)
'''START PID''' <player_id> <file_indexes>Если необходимо в параметрах передать ссылку на файл, который находится в локальной файловой системе, следует использовать формат file:///path/to/file.
'''START RAW''' <torrent_data> ;Примеры: <file_indexestt> <developer_idnowiki> <affiliate_idНачать проигрывание по ссылке на транспортный файл:> <zone_id>START TORRENT http://rutor.org/download/67346 0 0 0 0
'''Начать проигрывание по Content ID:START URL''' <direct_url> <file_indexes> <developer_id> <affiliate_id> <zone_id>)</tt>PID 1ccf192064ee2d95e91a79f91c6097273d582827 0
Данные команды используются для начала загрузки определенного файла из торрентНачать проигрывание acemedia-файла либо для начала загрузки файла по прямой ссылке (c:\acestream\test.acemedia:START URL)EFILE file%3A%2F%2F%2Fc%3A%5Cacestream%5Ctest.acemedia</nowiki></tt>
======<span id="transcode_settings"></span>Настройки транскодирования======Начиная с версии 3.1.5 есть возможность задавать формат вывода потока и параметры транскодирования аудио. * <tt>''output_format=hls|http'Параметры'</tt>:формат вывода потока* <tt>''transcode_audio=0|1''</tt>: транскодировать все аудио в AAC* <tt>''transcode_mp3=0|1''</tt>: транскодировать MP3 (данная опция применима только если transcode_audio=1)* <tt>''transcode_ac3=0|1''</tt>: транскодировать только AC3 в AAC (данная опция применима только если transcode_audio=0)
:В версии 3.1.5 данные настройки касаются только live-потоков.:Если оригинал потока вещается в формате HLS, то формат вывода будет HLS независимо от настроек.:Настройки транскодирования аудио влияют только на выдачу в формате HLS (по HTTP всегда выдается оригинальный поток):Если настройки формата вывода или транскодирования не передаются в команде <tt>'''file_indexes'''START</tt> - список индексов файлов из торрент-файла, которые необходимо загружать. Индексы файлов клиент получает в сообщении LOADRESP разделенных запятой. Индексы начинаются с нуля и соответствуют списку файлов,который был получен в результате выполнения команды LOAD. Напримерто используются настройки, если в торрент-файле всего один видео-файл, то необходимо отправлять индекс 0.заданные пользователем на движке
Если ;Примеры: <tt><nowiki>Запустить в торренте пять видео-файлов и необходимо начать проигрывание первого, но при это загружать остальные, то отправляется формате HLS:>> START PID 1ccf192064ee2d95e91a79f91c6097273d582827 0,1,2,3,4.output_format=hls
Если нужно проиграть третий файлЗапустить в формате HLS, и не загружать другие, отправляется 2.транскодировать все аудио-кодеки в AAC:>> START PID 1ccf192064ee2d95e91a79f91c6097273d582827 0 output_format=hls transcode_audio=1 transcode_mp3=1
Запустить в формате HLS, транскодировать все аудио-кодеки, кроме MP3, в AAC:>> START PID 1ccf192064ee2d95e91a79f91c6097273d582827 0 output_format=hls transcode_audio=1 transcode_mp3=0<tt/nowiki>'''torrent_url'''</tt> - ссылка на торрент файл (например, http://sometracker.com/torrent/12345)
=====<ttstyle="color: #009;">'''torrent_infohash'''STOP</tt> - infohash торрента=====;Версия API:>= 1
<tt>'''player_id'''</tt> - код плеера;Описание:Остановить воспроизведение и загрузку
;Синтаксис <tt>'''torrent_data'''STOP</tt> - содержимое торрент-файла в кодировке base64
<tt>'''direct_url'''</tt> - прямая ссылка на файл (например, http;Параметры://somesite.com/files/video.mp4)нет
;Пример: <tt>'''developer_id'''<nowiki>>>STOP</nowiki></tt> - код разработчика (если неизвестно, необходимо передавать 0)
=====<ttstyle="color: #009;">'''affiliate_id'''GETPID</tt>=====;Версия API:1 Эта команда устарела и больше не используется. Вместо нее следует использовать команду <tt>GETCID</tt> - код партнера (если неизвестно, необходимо передавать 0)
=====<ttstyle="color: #009;">'''zone_id'''GETCID</tt> - код зоны партнера (если неизвестно, необходимо передавать 0)=====;Версия API:>= 2
;Описание
:Получение кода плеера по набору параметров. Эта команда является синхронной командой (см.ниже). В ответ отправляется код плеера, либо пустая строка, если код плеера не может быть получен
;Синтаксис <tt>GETCID checksum=''checksum'GETPID'infohash='' <infohash> <'' developer=''developer_id> <'' affiliate=''affiliate_id> <'' zone=''zone_id>''</tt>
Получение кода плеера по набору параметров. Эта команда является синхронной командой ;Параметры* <tt>''checksum''</tt>: хешсумма транспортного файла (см.нижезначение клиент из команды LOADRESP). В ответ отправляется * <tt>''infohash''</tt>: инфохеш транспортного файла (значение клиент из команды LOADRESP)* <tt>''developer_id''</tt>: код плеераразработчика (если неизвестно, необходимо передавать 0 либо пустая строкане передавать данный параметр) * <tt>''affiliate_id''</tt>: код партнера (если неизвестно, необходимо передавать 0 либо не передавать данный параметр) * <tt>''zone_id''</tt>: код зоны партнера (если код плеера неизвестно, необходимо передавать 0 либо не может быть полученпередавать данный параметр)
;Пример:
<tt><nowiki>>>GETCID infohash=bc57456ca38b365477e07fa7e912693a7adc57da checksum=888e9891f82a045ea639256b468041fb8c9ac315 developer=0 affiliate=0 zone=0
<<##68dba76ad7d0b9992581bf72f7835a0de4f84234</nowiki></tt>
=====<ttstyle="color: #009;">'''SHUTDOWN'''GETADURL</tt>=====;Версия API:>= 3
Закрыть соединение с клиентом;Описание:Запрос к движку на получение ссылки на рекламную страницу.Данную команду могут использовать клиенты, которые имеют возможность отображать встроенный браузер в плеере, для того, чтобы показывать пользователям рекламу перед началом проигрывания контента либо когда пользователь нажимает паузу. Если движок определит, что есть доступная к показу реклама, то после получения этой команды отправит клиенту событие <tt>EVENT showurl</tt>
;Синтаксис
<tt>GETADURL width=''width'' height=''height'' infohash=''infohash'' action=''action''</tt>
;Параметры* <tt>''width'STOP'</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
<tt>'''DUR''' <video_url> <duration></tt>;Описание:Данная команда используется для передачи движку информации о пользователе. Информация передается в формате JSON.
Сообщить TS Engine о длительности видео-файла, который в данный момент проигрывается клиентом.;СинтаксисДанная команда должна отправлять сразу после того <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>'''video_url'''<nowiki>мужчина, от 18 до 24 лет:>>USERDATA [{"gender": 1}, {"age": 3}]</nowiki></tt> - ссылка на видео, которая была отправлена клиенту после окончания пребуферизации
=====<ttstyle="color: #009;">'''duration'''SAVE</tt> - длительность в миллисекундах=====;Версия API:>= 2
;Описание
:Сохранить контент в указанном месте.
;Синтаксис <tt>SAVE infohash=''infohash'PLAYBACK'index=''index'' path=''path'' <video_url> <event></tt>
Сообщить TS Engine о процентном соотношении проигранного видео;Параметры* <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как TS Engine получил команду PLAYBACK 100 (т.е>>SAVE infohash=5410b27fc567c35c8547e3b69b141215ce3a1fd7 index=0 path=D%3A%2Fmedia%2Fsintel-1024-surround. после того, как клиент полность проиграл рекламный ролик)mp4</nowiki></tt>
'''Параметры=====<tt style="color:'''#009;">LIVESEEK</tt>=====Описание скоро будет
=====<ttstyle="color: #009;">'''video_url'''SHUTDOWN</tt> - ссылка на видео, которая была отправлена клиенту после окончания пребуферизации=====;Версия API:>= 1
<tt>'''event'''</tt> - одно из данных событий;Описание:Клиент завершил работу
0 - начало проигрывания;Синтаксис <tt>SHUTDOWN</tt>
25 - проиграно 25% видео;Параметры:нет
50 - проиграно 50% видео;Пример: <tt><nowiki>>>SHUTDOWN</nowiki></tt>
75 - проиграно 75% видео=====<tt style="color: #009;">SETOPTIONS</tt>=====;Версия движка:>= 3003600
100 - проиграно 100% видео;Описание:Сообщить движку о наборе опций, которые поддерживает клиент
;Синтаксис
<tt>SETOPTIONS name1=value1 [name2=value2 ...]</tt>
== ИСХОДЯЩИЕ КОМАНДЫ ==;Параметры:name - название опции:value - значение опции
<tt>'''HELLOTS'''</tt>;Список опций:use_stop_notifications - клиент хочет получать от движка событие download_stopped с причиной остановки во время проигрывания
ответная команда в рамках процедуры рукопожатия;Пример: <tt><nowiki>>>SETOPTIONS use_stop_notifications=1</nowiki></tt>
====Команды от движка к клиенту====
=====<tt style="color: #009;">PLAY, PLAYAD, PLAYADI</tt>=====
;Версия API
:1
Эти команды устарели и больше не используется. Вместо них следует использовать команду <tt>START</tt>
=====<ttstyle="color: #009;">'''AUTH''' <auth_level>START</tt>=====;Версия API:>= 2
Уровень доступа пользователя;Описание:Начать прогрывание контента. Эта команда отправляется после завершения пребуферизации. Движок отсылает плееру http-ссылку, по которой плеер может начать проигрывание контента. Данная ссылка
<tt>auth_level</tt> обрабатывается http- целое число - уровень доступасерверов, встроенным в движок.
На данный момент возможны два значения уровня доступа:;Синтаксис <tt>START ''url'' [ad=1 [interruptable=1]] [stream=1] [pos=''position'']</tt>
;Параметры* <tt>''url''</tt>: ссылка для проигрывания* <tt>''ad=1''</tt>: флаг, указывающий на то, что ссылка <tt>''url''</tt> ведет на рекламный видеоролик, который клиент должен проиграть перед началом воспроизведения основного контента* <tt>''interruptable=1''</tt>: флаг, указывающий на то, что должен проиграться прерываемый рекламный ролик* <tt>''stream=1''</tt>: флаг, указывающий на то, что проигрываемый контент является живой трансляцией (Live Stream).* <tt>''position''</tt>: целое число от 0 - пользователю не доступны расширенные функции до 100, которое указывает с какой позиции клиент должен начать проигрывание (перемотка и например, position=50 означает, что клиент должен начать проигрывание файлов из торрента с несколькими видео-файлами)
1 - пользователю доступны расширенные функциипозиции 50%, т.е. с середины контента)
;Примеры
<tt><nowiki>Начать проигрывание контента по указанной ссылке:
<<START http://127.0.0.1:6878/content/5410b27fc567c35c8547e3b69b141215ce3a1fd7/0.628180567194
Начать проигрывание непрерываемого рекламного ролика:<tt>'''STATE''' <state_id><START http://127.0.0.1:6878/content/6081f31fe7f1db2ea7183686b46ba382820df574/tt>0.456623456572 ad=1
Информация о текущем статусе TS EngineНачать проигрывание прерываемого рекламного ролика:<<START http://127.0.0.1:6878/content/6081f31fe7f1db2ea7183686b46ba382820df574/0.456623456572 ad=1 interruptable=1
Начать проигрывание live:
<<START http://127.0.0.1:6878/content/553b7d4cfec8974752d386844cb67e0ee64eae05/0.728180367195 stream=1
Начать проигрывание с середины (50%):<tt<START http://127.0.0.1:6878/content/5410b27fc567c35c8547e3b69b141215ce3a1fd7/0.828180567196 pos=50</nowiki>'''SHUTDOWN'''</tt>
TS Engine завершил работу=====<tt style="color: #009;">PAUSE</tt>=====;Версия API:>= 1
;Описание
:Движок начал буферизацию, клиент по возможности должен остановиться на паузу до получения команды <tt>RESUME</tt>
;Синтаксис <tt>'''PLAY''' <video_url>PAUSE</tt>
<tt>'''PLAYAD''' <video_url></tt>;Параметры:нет
;Пример: <tt>'''PLAYADI''' <video_urlnowiki><<PAUSE</nowiki></tt>
Начать проигрывание видео по ссылке video_url (данная ссылка ведет на http-сервер, встроенный в TS Engine).=====<tt style="color: #009;">RESUME</tt>=====;Версия API:>= 1
<tt>'''PLAY'''</tt> - проигрывание основного видео;Описание:Движок завершил буферизацию, клиент может продолжить воспроизведение.
;Синтаксис <tt>'''PLAYAD'''RESUME</tt> - проигрывание непрерываемого рекламного ролика (пользователь не может перемотать либо пропустить данный рекламный ролик)
<tt>'''PLAYADI'''</tt> - проигрывание прерываемого рекламного ролика (пользователь может перемотать либо пропустить данный рекламный ролик);Параметры:нет
;Пример:
<tt><nowiki><<RESUME</nowiki></tt>
=====<ttstyle="color: #009;">'''PAUSE'''STOP</tt>=====;Версия API:>= 1
TS Engine начал буферизацию, так как недостаточно данных для проигрывания видео без остановки;Описание:Клиент должен остановить воспроизведение контента
;Синтаксис
<tt>STOP</tt>
<tt>'''RESUME'''</tt>;Параметры:нет
TS Engine завершил буферизацию;Пример: <tt><nowiki><<STOP</nowiki></tt>
=====<tt style="color: #009;">SHUTDOWN</tt>=====
;Версия API
:>= 1
<tt>'''LOADRESP''' <request_id> <response></tt>;Описание:Движок завершил работу
Ответ на команду LOAD;Синтаксис <tt>SHUTDOWN</tt>
<tt>'''request_id'''</tt> - идентификатор запроса;Параметры:нет
;Пример: <tt>'''response'''<nowiki><<SHUTDOWN</nowiki></tt> - список файлов в формате json в такого вида: { "status": 1, "infohash": "abcd1234", "files": [ ["file1.mp4", 0], ["file2.avi", 1], ["file3.mkv", 5] ] }====События от клиента к движку====
=====<ttstyle="color: #009;">'''status'''DUR</tt> - 0=====;Версия API: в торренте нет видео файлов, >= 1 - в торренте один видео файл, 2 - в торренте более одного видео файла
<tt>'''infohash'''</tt> - infohash торрента;Описание:Сообщить движку о длительности контента, который в данный момент проигрывается клиентом. Данная команда должна отправлять сразу после того, как клиент определил длительность контента.
;Синтаксис <tt>DUR ''video_url'''files'duration''</tt> - список файлов; это массив, каждый элемент в котором состоит из массива из двух элементов: первый - название файла, второй - позиция файла в торренте (эта позиция должна отправляться в команде START для указания, какой именно файл необходимо загружать, если их несколько).
Имена файлов передаются ;Параметры* <tt>''video_url''</tt>: ссылка на видео, которая была отправлена клиенту после окончания пребуферизации в кодировке UTF-8 команде <tt>START</tt>* <tt>''duration''</tt>: длительность в urlencoded виде.миллисекундах
;Пример:
<tt><nowiki>Клиент определить длительность контента: 3780 секунд:
>>DUR http://127.0.0.1:6878/content/5b5ba8c462f4014d8b57377c97d2e13caee52cdd/0.685119063624 3780000</nowiki></tt>
=====<tt>'''INFO''' <message_id>style="color: #009;<message_text">PLAYBACK</tt>=====;Версия API:>= 1
Информационное сообщение;Описание:Сообщить движку о прогрессе проигранного контента (сколько процентов проигралось).:Данная команда особенно важна, когда идет прогрывание рекламных роликов - переход к основному контенту происходит только после того, как движок получил команду PLAYBACK 100 (т.е. после того, как
<tt>'''message_id'''</tt> - код сообщенияклиент полность проиграл рекламный ролик)
;Синтаксис <tt>PLAYBACK ''video_url'message_text'''event''</tt> - текст сообщения
;Параметры
* <tt>''video_url''</tt>: ссылка на видео, которая была отправлена клиенту после окончания пребуферизации в команде <tt>START</tt>
* <tt>''event''</tt>: одно из указанных событий:
** 0: начало проигрывания
** 25: проиграно 25% видео
** 50: проиграно 50% видео
** 75: проиграно 75% видео
** 100: проиграно 100% видео (воспроизведение завершено)
;Пример:
<tt><nowiki>>>PLAYBACK http://127.0.0.1:6878/content/5b5ba8c462f4014d8b57377c97d2e13caee52cdd/0.685119063624 0
>>PLAYBACK http://127.0.0.1:6878/content/5b5ba8c462f4014d8b57377c97d2e13caee52cdd/0.685119063624 25
>>PLAYBACK http://127.0.0.1:6878/content/5b5ba8c462f4014d8b57377c97d2e13caee52cdd/0.685119063624 50
>>PLAYBACK http://127.0.0.1:6878/content/5b5ba8c462f4014d8b57377c97d2e13caee52cdd/0.685119063624 75
>>PLAYBACK http://127.0.0.1:6878/content/5b5ba8c462f4014d8b57377c97d2e13caee52cdd/0.685119063624 100</nowiki></tt>
=====<ttstyle="color: #009;">'''STATUS''' <status_string>EVENT</tt>=====;Версия API:>= 3
Данное сообщение отправляется периодически для информирования клиента о текущем статусе загрузки ;Описание:Отправка событий движку. С помощью этого сообщения клиент может отправлять движку события, касающиеся действий пользователя относительно воспроизведения контента(поставил на паузу, перемотал и т.п.)
;Синтаксис <tt>EVENT '''status_string'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>
====События от движка к клиенту=========<ttstyle="color: #009;">STATUS main:status_stringSTATE</tt>=====;Версия API:>= 1
;Описание
:Информация о текущем статусе движка
Если идет проигрывание рекламного ролика:;Синтаксис <tt>STATE ''state_id''</tt>
;Параметры* <tt>STATUS main:status_string|ad:status_string''state_id''</tt>: состояние движка:** 0 (IDLE) - движок ничего не делает** 1 (PREBUFFERING) - началась пребуферизация** 2 (DOWNLOADING) - идет загрузка контента в обычном режиме** 3 (BUFFERING) - началась буферизация** 4 (COMPLETED) - загрузка контента завершена** 5 (CHECKING) - выполняется инициализация перед началом загрузки** 6 (ERROR) - ошибка
;Пример:
<tt><nowiki><<STATE 0</nowiki></tt>
=====<ttstyle="color: #009;">'''status_string:'''INFO</tt>=====;Версия API:>= 1
TS Engine ничего не делает - <tt>'''idle'''</tt>;Описание:Отобразить текстовое сообщение пользователю.
ошибка - ;Синтаксис <tt>INFO ''message_id''err;error_id;error_message''message_text''</tt> (код и описание)
проверка - ;Параметры* <tt>''message_id''</tt>: числовой идентификатор сообщения** 1: сообщение "На данный момент нет активных пиров" (отправляется в том случае, если в течение минуты после начала загрузки не удалось найти ни одного пира)** 2: сообщение "Рекламный блок" (отправляется после начала воспроизведения рекламного ролика).** 3: сообщение "Основной контент" (отправляется после начала воспроизведения основного контента).** 0: другое сообщение (текст сообщения берется из параметра <tt>''message_text''</tt>)* <tt>'check;progress'message_text''</tt>: текст сообщения, которое необходимо отобразить
пребуферизация - ;Пример: <tt>'''prebuf<nowiki><<INFO 1;progressCannot find active peers<<INFO 2;time'''Advertising video<<INFO 3;Main content<<INFO 0;Display some message</nowiki></tt>
закачка - =====<ttstyle="color: #009;">'''dl'''STATUS</tt>=====;Версия API:>= 1
буферизация ;Описание:Данное сообщение отправляется периодически для информирования клиента о текущем статусе загрузки контента. Основное назначение этого сообщение - <tt>'''buf;progress;time'''</tt>дать клиенту возможность отображать пользователю о том, что сейчас происходит на движке.
ожидание достаточной скорости - ;Синтаксис <tt>STATUS '''wait;time'status_string''</tt>
;Параметры
* <tt>''status_string''</tt> - строка описанного ниже формата
Ко всем Если идет проигрывание основного контента <tt>status_stringSTATUS main:''status_description''</tt> (кроме <tt>idle, err, check</tt>) добавляются общие данные:
Если идет проигрывание рекламного ролика (рекламный ролик и основной контент описываются отдельно; например, рекламный ролик уже полность загружен, а основной контент проходит стадию пребуферизации): <tt>total_progress;immediate_progress;speed_down;http_speed_down;speed_up;peers;http_peers;downloaded;http_downloaded;uploadedSTATUS main:''status_description''|ad:''status_description''</tt>
;Возможные значения <tt>''status_description:''</tt>* движок ничего не делает - <tt>'total_progress''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>'''immediate_progress'''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 байт:''' <tt><STATUS main:prebuf;4520;2723;0;0;328;30|ad:buf0;0;7;0;5505024;0;69 STATUS main:dl|ad:dl</tt>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>check - Checking Проверка xx% prebuf - Prebuffering Пребуферизация xx% buf - Buffering Буферизация xx% wait - Waiting sufficient download speedОжидание достаточной скорости
err - выводим сообщение об ошибке
loading - Загрузка...
starting - Запуск...
dl, idle - ничего не выводим</tt>
=====<tt style="color: #009;">AUTH</tt>=====
;Версия API
:>= 1
 
;Описание
:Уровень доступа пользователя
 
;Синтаксис
<tt>AUTH ''user_auth_level''</tt>
 
;Параметры
* <tt>''user_auth_level''</tt>: уровень доступа пользователя
== События ==;Пример: <tt><nowiki>Пользователь не зарегистрирован:<<AUTH 0
Пользователь зарегистрирован:<tt<AUTH 1</nowiki>'''EVENT event_name param1_name=param1_value param2_name=param2_value ...'''</tt>
Параметры не обязательны.=====<tt style="color: #009;">EVENT getuserdata</tt>=====;Версия API:>= 3
Значения параметров ;Описание:Движок запрашивает у клиента данные пользователя (пол и возрастную группу). Такой запрос приходит при попытке что- либо проиграть, если данные о пользователе не были переданы ранее (т.е. фактически при первом после установки просмотре в ответ на команду <tt>'''urlencoded utf-8'''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> - сообщения от клиента к TS Engine, движку <tt>'''<< '''</tt> - сообщения от TS Engine движка к клиенту)'''
1) ===Проигрывание торрент-файла по ссылке без рекламных роликов ===(необходимость проигрывания рекламных роликов определяет TS Engineдвижок).
Для загрузки содержимого торрента используется асинхронная команда LOADASYNC.
Торрент файл содержит один видео-файл.
 
рукопожатие
  <tt>>>HELLOBGversion=3 <<HELLOTSversion=3.1.1 version_code=3003400 key=5eb1f78f http_port=6878</tt>
клиент готов принимать сообщения
  <tt>>>READYkey=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
пребуферизация завершена, клиент получает ссылку для проигрывания контента
 
<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
буферизация завершена
 
<tt><<RESUME
<<STATE 2
клиент проиграл 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
клиент проиграл 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