For most requests HTTP GET is used:
GET ${TVIPAPI_BASE_URL}/tvipapi/json/<command>.json
For some requests HTTP POST is used:
POST ${TVIPAPI_BASE_URL}/tvipapi/json/<command>.json
tvipapi/json subfolder allows implementing API inside of existing web site (not dedicated domain).
Here:
${TVIPAPI_BASE_URL} is HTTP/HTTPS base URL of Middleware server. For example, http://server.com/iptv/.
<command> is an API command.
All responses have general form:
{ "method" : "methodname", "status" : 0, "text" : "Status text", "response" : { } }
Client should first check that method name equals original requested method.
Then client should check status integer value for error code.
If status==0 || status==200 (no error), client can parse response object for the requested data.
If status>0, error text could be provided.
Code | Commands | Description |
---|---|---|
0/200 | All | Request success. No errors |
400 | All | Wrong request syntax. |
404 | All | Method is not supported or data not available (for EPG). |
403 | All, ex serverinfo,auth,register | Authentication required. Client should call auth command to require authentication. |
401 | auth | Registration required. Client should call register with appropriate credential information. |
402 | auth | This device is blocked. Client can periodically call auth, to wait until blocking is over. |
401 | register | Incorrect credentials. User supplied wrong login/password, MAC address or other information. |
403 | register | Can not register this STB. User message is provided. |
500 | All | Other server-side errors |
To simplify “static” server implementations, content requests can response with HTTP error codes, instead of JSON errors.
server_info command should not response with HTTP error codes as it will be treated as protocol error.
HTTP code | Commands |
---|---|
403 | All, except serverinfo,auth,register |
404 | All |
All other API requests should respond HTTP/200, even on error. Error code should be provided in “status” field of JSON responce object!
Header | Description |
---|---|
User-Agent | Standard web client identifier. |
Mac-Address | Unique MAC address of client. |
Accept-Language | Language code of client's user interface (for ex. “en”). |
Device-Type | Client device type (model) name. |
Device-Firmware | Device specific firmware version. |
Device-Os | Device specific Operating system name. |
Udpxy-Address | Address of UDP-proxy if any. |
Device-Use-Nat | If device can detect NAT state, this header has value “yes” or “no”. Otherwise, header is not present. |
Server information request. This request is peformed by client on protocol initializtion.
If a server fails to provide Server Info data, client will not access any server features.
Request:
GET ${TVIPAPI_BASE_URL}/tvipapi/json/server_info.json
Response:
{ "method" : "server_info", "status" : 0, "response" : { "proto_version": 2, "server": "middleware_server", "service_provider":"MegaGiga", "server_time": 1234567946, "remote_addr": "192.168.10.5", "tz_offset": 10800, "auth":true, "channel_list_update_interval":3600, "poll": { "interval": 300, "timeslot": 0.1, }, "cas_configs": [ { "id": 1, "type": "tvipcas", "options" : { "key": "value", } } ] } }
Option | Type | Req. | Description | Def.val |
---|---|---|---|---|
proto_version | Integer | Yes | Protocol version, implemented by the server. Client should check that protocol version is not higher then supported. | |
server | String | No | Identification string of middleware server. | undef. |
service_provider | String | No | Name of Service provider to display to user. | undef. |
server_time | Integer | No | Server's current time. STB could sync with it. | undef. |
remote_addr | String | No | Client's IP address as seen by the server. Used to detect NAT. | undef. |
tz_offset | Integer | No | Server's current time offset from GMT in seconds. | 0 |
auth | Bool | No | Whether “auth.json” call is required before accessing middleware. | false |
cas_configs | Array | No | CAS/DRM protocols, that should be initialized for this middleware with specific options options. | undef. |
channel_list_update_interval | Integer | No | Interval in seconds to check server for channel list (or EPG) updates. If not set, client default value is used. | 86400 |
poll/interval | Integer | No | Interval in seconds to poll server for incoming messages. If not set, message system is disabled. | undef. |
poll/timeslot | Float | No | Timeslot inside poll interval (see messages). | undef. |
If authentication is enabled by server info, client should authenticate on the server. It should provide any tokens/cookies, that it currently has in this request.
Request:
GET ${TVIPAPI_BASE_URL}/tvipapi/json/auth.json
Response:
{ "method" : "auth", "status" : 0, "response" : { "registered" : true, "register_type": "login", "session_type": "token", "token": "AAAAAAAA", "header": "Auth-Data", "param": "session" } }
Server should not response with HTTP 403, even if auth failed.
Server should always have response block with register_type option.
registered reports current register status of client. If true - client device was already registered on the server; false - device can be registered, if register_type is defined.
register_type defines type of user authentication logic, implemented by the server. Possible values are:
mac - server uses only MAC address of the device to authenticate it. No Login/Password is used.
login - user should provide login and password to register the device.
session_type defines which kind of session information server will provide to client in order to keep it's registered session. Each successful auth request should correctly update session information (i.e. provide the same or different token). Possible values are:
mac - no token is used. Client just sends it's MAC address in *Mac-Address* HTTP header.
token - a simple string token is provided in the token field of the response. Client Should use HTTP Header “Auth-Token” in each content request too keep session.
cookie - client will keep cookies provided in the current response and apply them to any content request.
header - client will keep the value of token and provide it as custom HTTP-header header.
param - client will keep the value of token attribute and will provide it as GET param on each content request.
If authentication was failed, STB should call Register command, providing credentials according to the register_type (see auth command). Also, all session data, that client may have, should be provided to the call.
If register type is mac, client can immidiately call register command after failed auth.
If register type is login, client should display a message to user with login and password fields. Then call register method.
{ "login": "login_name", "password": "passssss" }
Request:
GET/POST ${TVIPAPI_BASE_URL}/tvipapi/json/register.json
Response:
{ "method" : "register", "status" : 0, "response" : { "token": "xxxxxxxxxxxxxxxxxx" } }
If registration is OK, no additional data is provided. Client can repeat auth command.
User can try to unregister device. Session information should be provided.
Request:
GET ${TVIPAPI_BASE_URL}/tvipapi/json/unregister.json
Response:
{ "method" : "unregister", "status" : 0, "response" : null }
If unregister is OK (or user is not registered), no additional data is provided. Client can repeat auth command.
Get information about registred user.
Request:
GET ${TVIPAPI_BASE_URL}/tvipapi/json/user_info.json
Response:
{ "method" : "user_info", "status" : 0, "response" : { "fullname":"Ivan Smith", "enabled":true, "contract":"13279 от: 23.06.2014" } }
User structure:
Field: | Type | Req. | Description |
---|---|---|---|
fullname | String | Yes | User fullname. |
enabled | Boolean | Yes | True if subscribrictions are active. |
contract | String | No | Contract information |
The following commands should only be called by client after successfull authentication.
This command loads channel list from the server. Channel list is always loaded full (all channels).
Request:
GET ${TVIPAPI_BASE_URL}/tvipapi/json/channels.json
Response:
{ "method": "channels", "status": 0, "response": { "channels_version" : 1, "channels_hash": "d41d8cd98f00b204e9800998ecf8427e", "epg_version": 1, "channels": [{ "id": 1, "title": "ОРТ", "number": 666, "logo": "http://megaprov.ru/images/logos/ort1.png", "url": "udp://@1.1.1.1:1234", "age_group_id": 1, "tshift_proto":"flussonic", "tshift_depth": 3586954, "tshift_base_url": "http://2.2.2.2:4321", "tshift_cas_config_id": null, "media": { "aspect": "4:3", }, "cas_config_id": null }], "groups": [ { "id": 1, "title": "ProPutina", "items": [1, 2, 3, 4] } ], "age_groups":[ { "id":1, "age":18, "caption":"18+" } ] } }
channels_version defines version or timestamp of current channel list. If this value is the same as on previous request, playlist will not be updated on the device.
channels_hash unique hash of available channels, used in short epg
epg_version defines version or timestamp or current EPG data. If this value is the same as on previous request, EPG will be considered the same.
Channel structure:
Field: | Type | Req. | Description |
---|---|---|---|
id | Integer | Yes | Unique id of the channel in the middleware. |
title | String | Yes | Name of the channel to be displayed to the end user. Should be localized. |
number | Integer | Yes | Unique channel number, that is displayed to user and used to switch channels. |
logo | String | No | URL of an image file (PNG), that represents channel logo.If path contains ${h} and ${w} variables client can replace these variables with required height and width in pixels. |
url | String | Yes | URL of the Live stream. |
age_group_id | Int | Yes | Age group ID, may be null |
tshift_proto | String | No | Timeshift server type. Auto detect by default. |
tshift_base_url | String | No | Base URL of timeshifted stream. Syntax depends on timeshift type. |
tshift_depth | Integer | No | Enables server achive/timeshift for the channel and sets number of seconds back from live. |
tshift_cas_config_id | String | No | CAS/DRM config id, that should be used to play timeshifted stream. |
cas_config_id | Integer or null | No | CAS/DRM config id, that should be used to play this stream. |
media | Object | No | Various media options for the stream (aspect, def. audio track, def. subtitle, etc. |
Age group structure:
Field: | Type | Req. | Description |
---|---|---|---|
id | Integer | Yes | Id |
age | Integer | Yes | Age rating |
caption | String | Yes | Age rating caption |
Media structure:
Field: | Type | Req. | Description |
---|---|---|---|
aspect | String | No | Override aspect ratio (allowed values: “4:3”, “16:9”, “16:10”, may be null (no override) |
TODO: Some MWs support dynamic links. So, real URL should be async requested by the Player at the moment that user changes channel.
EPG is supposed to be segmented as one file per one day per channel. Day is supposed to be an inteval from 00:00 to 23:59:59 UTC time (*not* local time). The *start* time of event is used.
GET ${TVIPAPI_BASE_URL}/tvipapi/json/epg/<channel_id>/YYYY-MM-DD.json
Here, channel_id is supposed to be the id of channel from the playlist.
YYYY-MM-DD is the date of the requested day (like 2015-01-25). Day borders (begin-end) are defined by server's timezone specified by tz_offset in server info.
Response:
{ "method" : "epg", "status" : 0, "response" : { "version": 2, "channel_id" : 1, "date" : "2015-01-25", "events" : [ { "start": 1447285765, "end" : 1447256765, "title" : "News", "description:" "Today's news program.", "age_group_id": 1, } ], "age_groups":[ { "id":1, "age":18, "caption":"18+" } ] } }
Event structure:
Field: | Type | Req. | Description |
---|---|---|---|
version | Integer | Yes | Version of EPG. Should be changed each time EPG database is updated on server. |
channel_id | Integer | Yes | Id of the channel for which EPG is provided. |
date | String | Yes | Date of the current EPG block 2015-01-25. Borders (00:00:00 - 23:59:59 should be in UTC timezone). |
start | Integer | Yes | Unix timestamp of program start. It should be within borders of the date. |
end | Integer | Yes | Unix timestamp of the program end. it should be equal or later then start. And no later, then start of the next program. |
title | String | Yes | Title of the programm. |
description | String | No | Description of the program. |
age_group_id | Integer | Yes | Override channel age_group option, must be null if override not needed |
GET ${TVIPAPI_BASE_URL}/tvipapi/json/short_epg/<hash>.json
Here, hash is channel hash.
Filter short EPG by channel:
GET ${TVIPAPI_BASE_URL}/tvipapi/json/short_epg/<channel>/epg.json
Here, channel is supposed to be the id of channel from the playlist.
Response:
{ "method":"short_epg", "status":200, "text":null, "response":{ "version":"70", "channels":[ { "channel_id":3, "events":[ { "start":1463131800, "end":1463134800, "title":"News", "description":"", "age_group_id":1 }, { "start":1463134800, "end":1463138100, "title":"Politics", "description":"", "age_group_id":1 }, { "start":1463138100, "end":1463143500, "title":"Just another soap", "description":"", "age_group_id":null } ] } ], "age_groups":[ { "id":1, "age":18, "caption":"18+" } ] } }
version - EPG version
channels structure
Field: | Type | Req. | Description |
---|---|---|---|
channel_id | Integer | Yes | Channel id |
events | Array | Yes | EPG event objects |
Client polls server periodically according to poll settings for incoming messages.
Each client uses its own timeslot to poll server for messages. Each day (starting from UTC 00:00) is splitted into poll intervals.
ceil( ( current_unixtime - (floor(current_unixtime / 86400) * 86400) - floor(poll_timeslot * poll_interval) ) / poll_interval ) * poll_interval + (floor(current_unixtime / 86400) * 86400) + floor(poll_timeslot * poll_interval)
Request:
GET/POST ${TVIPAPI_BASE_URL}/tvipapi/json/messages.json
GET is for message polling (receiving).
POST is pushing message (sending).\\
POST request example:
{ "messages": [ { "id": 1, "command": "channel_view_stat", "args": { "channel_id": 1, "content_begin": 111111111, "content_end": 22222222, "session_begin": 111110000, "session_end": 222220000 } } ] }
POST server response example:
{ "method" : "messages", "status" : 0, }
GET server response example:
{ "method" : "messages", "status" : 0, "response" : { "poll": { "interval": 300, "timeslot": 0.1, }, "messages": [ { "id" : 1, "command": "command_name", "ttl": 1447285765, "args": { "arg1": "test1", "arg2": "test2" } }, ] } }
Field: | Type | Req. | Description | Default |
---|---|---|---|---|
id | Int64 | Yes | Unique message ID on the server | |
command | String | Yes | Command code name, see table of supported commands below. | |
ttl | Integer | No | Unix timestamp of time, until which this message is valid. If 0, then valid forever. | |
confirm | Boolean | No | True if message needs confirmation over message_confirm command. | |
args | Object | No | Arguments, depending on executed command. | |
poll/interval | Integer | No | Interval in seconds to poll server for incoming messages. If not set, message system is disabled. | undef. |
poll/timeslot | Float | No | Timeslot inside poll interval (see messages). | undef. |
Supported message types:
Message Type | Source | Description |
---|---|---|
user_message | server | Display text messages to user screen, available types: notify, confirm. |
reinit | server | Ask client to refresh server_info. |
refresh_channel_list | server | Telling device to update channel list. |
restart | server | Depending on the platform restarts app or OS. |
open_url | server | Display data from given url to user screen. |
force_update | server | Telling device to update app/firmware. |
send_crash_report | server | Telling device to send crash reports to provider. |
channel_view_stat | client | Send channel view statistics to server. |
channel_quality_stat | client | Send stream view statistics to server. |
Alert type | Description |
---|---|
confirm | Text window with confirm button. Device freezes waiting for user response |
notify | Simple text notification. No user reaction expected. Time of presentation controls with “ttl” argument |
ticker | Ticker string that rolling over the screen |
Field | Type | Req. | Description |
---|---|---|---|
type | Enum | Yes | Available types: confirm, notify, ticker |
title | String | No | Title for confirm type |
text | String | Yes | Message text |
delay | Integer | No | Message exposure time |
Channel view statistics:
Field | Type | Req. | Description |
---|---|---|---|
channel_id | Integer | Yes | Viewed channel id. |
content_begin | Integer | Yes | Timestamp, when content was started. |
content_end | Integer | Yes | Timestamp, when content was ended. |
session_begin | Integer | Yes | Timestamp, when playback session was started. |
session_end | Integer | Yes | Timestamp, when playback session was ended. |
Tag list usually used for filling main screen layout
This command loads vod tags for requested places. Now boxies load only 'primary' tag list.
Request:
GET ${TVIPAPI_BASE_URL}/tvipapi/json/vod/tag_list/{name}.json
Response:
{ "method":"tag_list", "status":200, "text":null, "response":{ "name":"primary", "tags":[ { "id":34, "title":"Комедия" }, { "id":31, "title":"Криминал" }, { "id":30, "title":"Драма" }, { "id":32, "title":"Фэнтези" }, { "id":33, "title":"Детектив" }, { "id":35, "title":"Биография" }, { "id":36, "title":"История" }, { "id":37, "title":"Фантастика" }, { "id":38, "title":"Боевик" }, { "id":39, "title":"Триллер" }, { "id":40, "title":"Мультфильм" }, { "id":41, "title":"Мюзикл" }, { "id":42, "title":"Приключения" }, { "id":43, "title":"Семейный" } ] } }
Category list usually used for filling main screen layout
This command loads vod сategories for requested places. Now boxies load only 'primary' list.
Request:
GET ${TVIPAPI_BASE_URL}/tvipapi/json/vod/category_list/{name}.json
Response:
{ "method":"category_list", "status":200, "text":null, "response":{ "categories":[ { "id": 1, "name": "Fantasy", "logo": "http://localhost/tvipapi/png/141766/logo.jpg/%24%7Bw%7D/%24%7Bh%7D/%24%7Bmode%7D", "tags": [1,2,3,4,10,12] }, { "id": 2, "name": "Cartoons", "logo": "http://localhost/tvipapi/png/57612/logo.jpg/%24%7Bw%7D/%24%7Bh%7D/%24%7Bmode%7D", "tags": [1,2,3] } ] } }
Field | Type | Req. | Description |
---|---|---|---|
tags | Int[] | No | Array of tags id's, must be presended by comma delimited list, like a &tags=1,2,3 |
categories | Int[] | No | Array of categories id's, must be presended by comma delimited list, like a &categories=1,2,3 |
search | String | No | Search by title or original title |
start | Int | No | Start from record (default value: 0) |
limit | Int | No | Limits records on output (default value: 10) |
Request:
GET ${TVIPAPI_BASE_URL}/tvipapi/json/vod/content_list.json?tags={tags_array}&categories={categories_array}&search={text}&start={start}&limit={limit}
Response:
{ "method":"content_list", "status":200, "text":null, "response":{ "start":0, "limit":10, "count":11, "search":null, "search_tags":[ ], "tags":[ { "id":35, "title":"Биография" }, { "id":36, "title":"История" }, { "id":37, "title":"Фантастика" }, { "id":38, "title":"Боевик" }, { "id":39, "title":"Триллер" }, { "id":40, "title":"Мультфильм" }, { "id":41, "title":"Мюзикл" }, { "id":42, "title":"Приключения" }, { "id":43, "title":"Семейный" }, { "id":33, "title":"Детектив" }, { "id":32, "title":"Фэнтези" }, { "id":34, "title":"Комедия" }, { "id":31, "title":"Криминал" }, { "id":30, "title":"Драма" } ], "categories":[ { "id": 1, "name": "Fantasy", "logo": "http://localhost/tvipapi/png/141766/logo.jpg/%24%7Bw%7D/%24%7Bh%7D/%24%7Bmode%7D", "tags": [1,2,3,4,10,12] }, { "id": 2, "name": "Cartoons", "logo": "http://localhost/tvipapi/png/57612/logo.jpg/%24%7Bw%7D/%24%7Bh%7D/%24%7Bmode%7D", "tags": [1,2,3] } ], "age_groups":[ { "id":1, "age":18, "caption":"18+" }, { "id":2, "age":16, "caption":"16+" }, { "id":3, "age":12, "caption":"12+" }, { "id":4, "age":6, "caption":"6+" }, { "id":5, "age":3, "caption":"3+" }, { "id":6, "age":0, "caption":"0+" }, { "id":7, "age":21, "caption":"21+" } ], "content":[ { "id":102, "title":"Побег из Шоушенка", "poster_path":"http://10.170.253.207/tvipapi/jpg/429/poster.jpg/236/340/match", "view_mode": 1 }, { "id":103, "title":"Зеленая миля", "poster_path":"http://10.170.253.207/tvipapi/jpg/430/poster.jpg/236/340/match", "view_mode": 1 }, { "id":105, "title":"Список Шиндлера", "poster_path":"http://10.170.253.207/tvipapi/jpg/432/poster.jpg/236/340/match", "view_mode": 1 }, { "id":106, "title":"1+1", "poster_path":"http://10.170.253.207/tvipapi/jpg/433/poster.jpg/236/340/match", "view_mode": 1 }, { "id":107, "title":"Начало", "poster_path":"http://10.170.253.207/tvipapi/jpg/434/poster.jpg/236/340/match", "view_mode": 1 }, { "id":108, "title":"Король Лев", "poster_path":"http://10.170.253.207/tvipapi/jpg/435/poster.jpg/236/340/match", "view_mode": 1 }, { "id":109, "title":"Леон", "poster_path":"http://10.170.253.207/tvipapi/jpg/436/poster.jpg/236/340/match", "view_mode": 1 }, { "id":110, "title":"Бойцовский клуб", "poster_path":"http://10.170.253.207/tvipapi/jpg/437/poster.jpg/236/340/match", "view_mode": 1 }, { "id":111, "title":"Автостопом по галактике", "poster_path":"http://10.170.253.207/tvipapi/jpg/438/poster.jpg/236/340/match", "view_mode": 1 }, { "id":112, "title":"Теория большого взрыва (сериал 2007 – ...)", "poster_path":"http://10.170.253.207/tvipapi/jpg/439/poster.jpg/236/340/match", "view_mode": 1 } ] } }
Field | Type | Req. | Description |
---|---|---|---|
id | int | yes | Content id |
title | String | yes | Content title |
poster_path | String | No | Path pattern to poster as described here. |
view_mode | int | yes | Option render content: 1 - with a poster and 2 without a poster. Only for series |
Request:
GET ${TVIPAPI_BASE_URL}/tvipapi/json/vod/content/{id}.json
Response:
{ "method":"content", "status":200, "text":null, "response":{ "content":{ "id":112, "title":"Теория большого взрыва", "poster_path":"http://localhost/tvipapi/jpg/439/poster.jpg/236/340/match", "view_mode": 1, "original_title":"The Big Bang Theory", "year":2007, "description":"Два блестящих физика, Леонард и Шелдон, «великие умы», которые понимают, как «работает Вселенная». Но их гениальность ничуть не помогает им общаться с людьми, особенно с женщинами. Всё начинает меняться, когда напротив них поселяется красавица Пенни. Когда Леонард и Шелдон встречают Пенни, Леонард сразу же начинает интересоваться ею. Он видит в общении с Пенни огромную перспективу, вплоть до любви, однако Шелдон понимает, что мечтам его друга не суждено сбыться. Стоит также отметить пару странных друзей этих физиков: Воловиц, который любит употреблять фразы на разных языках, включая русский, и Раджеш Кутрапали, теряющий дар речи при виде женщин.", "duration_min":22, "age_group_id":2, "categories":[ 1 ], "tags_id":[ 34 ], "items":[ { "id":16, "title":"Трейлер (HD)", "url":"https://kp.cdn.yandex.net/306084/kinopoisk.ru-Big-Bang-Theory-The-144199.mp4", "type_id":1 }, { "id":17, "title":"Трейлер (SD)", "url":"https://kp.cdn.yandex.net/306084/kinopoisk.ru-Big-Bang-Theory-The-144198.flv", "type_id":2 } ], "team":[ { "person_id":20, "fullname":"Джим Парсонс", "title":"Actor" }, { "person_id":21, "fullname":"Джонни Галэки", "title":"Actor" }, { "person_id":22, "fullname":"Кейли Куоко", "title":"Actor" }, { "person_id":23, "fullname":"Саймон Хелберг", "title":"Actor" }, { "person_id":24, "fullname":"Кунал Нэйэр", "title":"Actor" }, { "person_id":25, "fullname":"Мелисса Рауш", "title":"Actor" }, { "person_id":26, "fullname":"Майем Биалик", "title":"Actor" }, { "person_id":27, "fullname":"Кевин Сасмэн", "title":"Actor" }, { "person_id":28, "fullname":"Кэрол Энн Сьюзи", "title":"Actor" }, { "person_id":29, "fullname":"Джон Росс Боуи", "title":"Actor" }, { "person_id":17, "fullname":"Марк Сендроуски", "title":"Director" }, { "person_id":18, "fullname":"Энтони Джозеф Рич", "title":"Director" }, { "person_id":19, "fullname":"Питер Чакос", "title":"Director" }, { "person_id":32, "fullname":"Чак Лорри", "title":"Producer" }, { "person_id":33, "fullname":"Билл Прэди", "title":"Producer" }, { "person_id":34, "fullname":"Стивен Моларо", "title":"Producer" }, { "person_id":32, "fullname":"Чак Лорри", "title":"Script" }, { "person_id":33, "fullname":"Билл Прэди", "title":"Script" }, { "person_id":34, "fullname":"Стивен Моларо", "title":"Script" } ], "children":[ { "id":6, "title":"8 сезон", "items":[ ], "children":[ { "id":9, "title":"24 серия", "items":[ { "id":15, "title":"Смотреть (SD)", "url":"http://ov.tvip.ru:8080/films/sd/Big%20Bang%208/The.Big.Bang.Theory.S08E24.Kuraj-Bambey.%5bqqss44%5d.avi", "type_id":2 } ], "children":[ ] }, { "id":8, "title":"23 серия", "items":[ { "id":14, "title":"Смотреть (SD)", "url":"http://ov.tvip.ru:8080/films/sd/Big%20Bang%208/The.Big.Bang.Theory.S08E23.Kuraj-Bambey.%5bqqss44%5d.avi", "type_id":2 } ], "children":[ ] }, { "id":7, "title":"21 серия", "items":[ { "id":13, "title":"Смотреть (SD)", "url":"http://ov.tvip.ru:8080/films/sd/Big%20Bang%208/The.Big.Bang.Theory.S08E21.Kuraj-Bambey.%5bqqss44%5d.avi", "type_id":2 } ], "children":[ ] } ] }, { "id":7, "title":"21 серия", "items":[ { "id":13, "title":"Смотреть (SD)", "url":"http://ov.tvip.ru:8080/films/sd/Big%20Bang%208/The.Big.Bang.Theory.S08E21.Kuraj-Bambey.%5bqqss44%5d.avi", "type_id":2 } ], "children":[ ] }, { "id":8, "title":"23 серия", "items":[ { "id":14, "title":"Смотреть (SD)", "url":"http://ov.tvip.ru:8080/films/sd/Big%20Bang%208/The.Big.Bang.Theory.S08E23.Kuraj-Bambey.%5bqqss44%5d.avi", "type_id":2 } ], "children":[ ] }, { "id":9, "title":"24 серия", "items":[ { "id":15, "title":"Смотреть (SD)", "url":"http://ov.tvip.ru:8080/films/sd/Big%20Bang%208/The.Big.Bang.Theory.S08E24.Kuraj-Bambey.%5bqqss44%5d.avi", "type_id":2 } ], "children":[ ] } ] }, "age_groups":[ { "id":1, "age":18, "caption":"18+" }, { "id":2, "age":16, "caption":"16+" }, { "id":3, "age":12, "caption":"12+" }, { "id":4, "age":6, "caption":"6+" }, { "id":5, "age":3, "caption":"3+" }, { "id":6, "age":0, "caption":"0+" }, { "id":7, "age":21, "caption":"21+" } ] } }
Field | Type | Req. | Description |
---|---|---|---|
id | int | yes | Content id |
title | String | yes | Content title |
poster_path | String | No | Path pattern to poster as described here. |
description | String | No | Content description |
original_title | String | No | Title at native language |
duration_min | int | No | Duration in minutes |
year | int | No | Year of release |
age_group_id | int | No | Link to age group object |
category_id | int | No | Link to age category object |
children | Object[] | No | Array of Child Object |
tags_id | array | No | Array of links to tag object |
items | Object[] | No | Array of Item Object |
team | Object[] | No | Array of person object |
view_mode | int | Yes | Option render content: 1 - with a poster and 2 without a poster. Only for series |
Field | Type | Req. | Description |
---|---|---|---|
id | int | yes | Child id |
title | String | yes | Child title |
items | Object[] | No | Array of Item Object |
children | Object[] | No | Array of Child Object |
Field | Type | Req. | Description |
---|---|---|---|
id | int | yes | Child id |
title | String | yes | Item title |
url | String | yes | Url to media |
type_id | int | yes | Type of media (HD,SD,…) |
Field | Type | Req. | Description |
---|---|---|---|
person_id | Int | yes | Person id |
fullname | String | yes | Person fullname |
title | String | yes | Person title (like “Actor”, “Director”) |
This loads the image processed with parameters specified by unique id.
The URL pattern will be received from the another request.
URL pattern contains some templates that may be replaced with appropriate values. These values may be found from the table below.
GET ${TVIPAPI_BASE_URL}/tvipapi/{fileType}/{id}/{fileName}/{w}/{h}/{mode}
Template | Type | Description |
---|---|---|
{fileType} | String | Defines the mime type of image required. Now supported values are “png”, “jpeg”, “jpg”. This parameter is optional and may be considered if the image type conversion specified makes sense. If not replaced, “png” value is used as default. |
{id} | Integer | Defines unique id of image. It's defined by the server, so no need to worry about it. |
{fileName} | String | Defines the desired file name. It's defined by the server depending upon what is image required for. Actual file descriptor of the image file depends on the client requested the image. |
{w} | Integer | Positive integer value of the width desired. If not replaced or invalid, the original width dimension will be used. |
{h} | Integer | Positive integer value of the height desired. If not replaced or invalid, the original height dimension will be used. |
{mode} | String | Optional parameter. Specifies what resize mode will be used, if desired dimensions are not matched with original ones. Possible values may be found from the table below. If not replaced, “crop” mode will be used as default, “match” - for VOD posters, “padding” - for channel logo. If unknown mode specified, default mode “keep” will be used. |
Name | Maintaining aspect ratio | Must match the dimensions requested | Description |
---|---|---|---|
match | No | Yes | Default mode. Returns the entire image, but may be looking not so good, if the desired dimensions do not provide the same aspect ratio as original image ones. |
crop | Yes | Yes | Performs zoom operation on the image. Returns as much of original image as possible, but some areas may be cropped, if the aspect ratio does not match. |
padding | Yes | Yes | Returns the entire image, but may contain some background padding around in order to match the dimensions requested, if the aspect ratio does not match. |
keep | Yes | No | Returns the entire image, but its dimensions may differ from the requested ones in order to maintain the aspect ratio if not matched. |
top | Yes | Yes | Performs aligning the image on the top edge, matching the original image width. If necessary, the image will be cropped or padded to match the dimensions requested. |
http://10.170.253.203:8080/tvipapi/png/289/logo.png/64/64/padding
200 OK | returns image as byte array. |
404 Not Found | image not found. |
500 Internal Server Error | image processing error. |