379
edits
Changes
→Настройки транскодирования
Клиент - стороннее приложение, которое работает с движком посредством API.
== ОБЩИЙ ВИД КОМАНД Схема работы API==Каждая команда должна состоять Обмен данными с движком происходит по протоколу TCP. Общая схема работы выглядит так:* клиент устанавливает TCP-соединение с движком* клиент и движок обмениваются рукопожатиями* клиент и движок обмениваются сообщениями* одна из строки, завершающейся разделителем \r\nсторон завершает соединение
Ключ <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>
;''engine_version''
: версия движка (например, 2.0.8)
;''http_port'Примеры асинхронных команд':'''порт, на котором работает встроенный HTTP сервер движка
Формирование <tt>response_key</tt> описано [[Product_key|здесь]].
То же самое должен делаь клиент при закрытии - клиент отправляет перед закрытием отослать движку команду, например "GETPID qwerty 0 0 0" и ждет, пока от TS Engine придет ответ<tt>SHUTDOWN</tt>
===Типы сообщений===
Все сообщения условно делятся на две группы: команды и события.
События носят информационный характер. Например, событие <tt>'''HELLOBG'''STATUS</tt>информирует клиента о статусе загрузки (идет ли в данный момент пребуферизация, буферизация, какая скорость загрузки и т.д.)
Алгоритм обработки синхронных команд такой:
* клиент отправляет движку синхронную команду (например, <tt>GETCID 4c78e1cf0df23b4f5a16a106829ebed710cb52e0 0 0 0</tt>) и ждет данных от движка
* когда от движка приходят данные, клиент проверяет, начинается ли полученный ответ на ## (например, <tt>##36ae4c89ab45b4010b1461c513da38d007356195</tt>)
* если это так, то строка от символов ## до CRLF является ответом на синхронную команду (причем ответ может быть пустой, т.е. выглядеть так: <tt>##</tt>)
* если нет, значит ответ на команду не может быть получен
Мы не рекомендуем использовать синхронную команду <tt>'''READY'''LOAD</tt>, так как она подразумевает блокирование потока на стороне клиента. Эта команда является устаревшей и вместо нее следует использовать асинхронную версию <tt>LOADASYNC</tt>
===Список сообщений===
В примерах сообщения от клиента к движку отмечены >>, от движка к клиенту - <<
;Параметры* <tt>''request_id'Параметры'</tt>:'''случайное целое число - идентификатор запроса LOADASYNC; этот же идентификатор будет отослан клиенту в команде LOADRESP после того,как будет получен список файлов; данный
;Формат ответа:Ответ приходит в формате 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>'''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)
======<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.заданные пользователем на движке
Запустить в формате 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>'''torrent_data'''STOP</tt> - содержимое торрент-файла в кодировке base64
;Пример: <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><nowiki>>>GETCID infohash=bc57456ca38b365477e07fa7e912693a7adc57da checksum=888e9891f82a045ea639256b468041fb8c9ac315 developer=0 affiliate=0 zone=0
<<##68dba76ad7d0b9992581bf72f7835a0de4f84234</nowiki></tt>
=====<ttstyle="color: #009;">'''SHUTDOWN'''GETADURL</tt>=====;Версия API:>= 3
;Синтаксис
<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 style="color: #009;">USERDATA</tt>=====
;Версия API
:>= 3
;Параметры* <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>
=====<ttstyle="color: #009;">'''video_url'''SHUTDOWN</tt> - ссылка на видео, которая была отправлена клиенту после окончания пребуферизации=====;Версия API:>= 1
;Синтаксис
<tt>SETOPTIONS name1=value1 [name2=value2 ...]</tt>
====Команды от движка к клиенту====
=====<tt style="color: #009;">PLAY, PLAYAD, PLAYADI</tt>=====
;Версия API
:1
Эти команды устарели и больше не используется. Вместо них следует использовать команду <tt>START</tt>
=====<ttstyle="color: #009;">'''AUTH''' <auth_level>START</tt>=====;Версия API:>= 2
;Параметры* <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 означает, что клиент должен начать проигрывание файлов из торрента с несколькими видео-файлами)
;Примеры
<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
Начать проигрывание 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>
;Описание
:Движок начал буферизацию, клиент по возможности должен остановиться на паузу до получения команды <tt>RESUME</tt>
;Синтаксис <tt>'''PLAY''' <video_url>PAUSE</tt>
;Пример: <tt>'''PLAYADI''' <video_urlnowiki><<PAUSE</nowiki></tt>
;Синтаксис <tt>'''PLAYAD'''RESUME</tt> - проигрывание непрерываемого рекламного ролика (пользователь не может перемотать либо пропустить данный рекламный ролик)
;Пример:
<tt><nowiki><<RESUME</nowiki></tt>
=====<ttstyle="color: #009;">'''PAUSE'''STOP</tt>=====;Версия API:>= 1
;Синтаксис
<tt>STOP</tt>
=====<tt style="color: #009;">SHUTDOWN</tt>=====
;Версия API
:>= 1
;Пример: <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>DUR ''video_url'''files'duration''</tt> - список файлов; это массив, каждый элемент в котором состоит из массива из двух элементов: первый - название файла, второй - позиция файла в торренте (эта позиция должна отправляться в команде START для указания, какой именно файл необходимо загружать, если их несколько).
;Пример:
<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
;Синтаксис <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><<STATE 0</nowiki></tt>
=====<ttstyle="color: #009;">'''status_string:'''INFO</tt>=====;Версия API:>= 1
;Параметры
* <tt>''status_string''</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;
Идет загрузка контента, загружен 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<AUTH 1</nowiki>'''EVENT event_name param1_name=param1_value param2_name=param2_value ...'''</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 движка к клиенту)'''
Для загрузки содержимого торрента используется асинхронная команда 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>
<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
буферизация завершена
<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 ↵
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 ↵
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 ↵
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 ↵
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>