Jump to content

Описание Rest Api


mariman

Recommended Posts

Все запросы к REST API формируются по специально сформированному URL и имеют вид:

 

httр://iptv.kartina.tv/api/<тип запроса>/<имя функции>?param1=value&param2=value...

 

<тип запроса> может быть: xml или json или jsonp

имена функций и описания к ним параметров описаны ниже.

 

примеры:

  httр://iptv.kartina.tv/api/xml/epg?cid=2&day=260610
  httр://iptv.kartina.tv/api/jsonp/epg?cid=2&day=260610&callback=process

 

 

COOKIE

 

Для идентификации и создании сессии было решено использовать стандартный механизм HTTP сессий с поддержкой COOKIE.

первый вход - обязательное выполнение login. при корректном входе возвращается состояние, данные по клиенту и COOKIE которую необходимо передавать всегда при запросах. В COOKIE хранится идентификатор сессии и по ней организуется сессия. Далее если запрос не будет содержать COOKIE то это вызовет ошибку. Для корректного завершения сессии необходимо вызвать метод logout.

 

Возможна передача параметров через url. имя cookie при этом необходимо брать из ответа пакета sid_name. НО!!! Подобный метод из соображений безопасности является не желательным, ровно как и передача login методом GET.

 

Введено ограничение на 4 запроса в секунду для одной сессии. Мера вынужденная для защиты системы от избыточных перегрузок. В случае возникновения ситуации возвращается стандарный ответ ошибки с кодом 31 (Query limit exceeded).

 

Все возвращаемые сообщения имеют вид ассоциативного массива.

формат пакета формат - JSON или XML, в зависимости от сформированного URL.

 

Если запрос содержит ошибку то это вызывает обязательную посылку следующего пакета:

 

<?xml version="1.0" encoding="UTF-8"?>
<response>
 <error>
   <message>An error message</message>
   <cоde>9999</cоde>
 </error>
 <servertime>1277893631</servertime>
</response>

 

где message и code собственно сообщение об ошибке и его код.

 

Формат времени. Все данные обозначающих дату и время представлены в формате unixtime .

 

/login?login=<login>&pass=<password>&device=<apple|default:all>

 

Входные параметры:

  • login - логин. идентификатор подписки выданный клиенту.
  • pass - числовой пароль.
  • device - параметр указывающий на тип устройства работающего с API. Генерируются соответствующие потоки и ссылки вещания. Влияет на списки возможных для устройств каналов, ссылки вещания и т.п. На данный момент работает с двумя параметрами: apple и all. По умолчанию установлен в all и генерирует ссылки для vlc. (поток TS)
  • service=all - Выводит значения всех текущих настроек клиента

 

Возврат пакета вида:

 

<?xml version="1.0" encoding="UTF-8"?>
<response>
 <sid>[идентификатор сессии]</sid>
 <sid_name>[имя переменной идентификатора сессии]</sid>
 <account>
   <login>[логин]</login>
   <packet_name>[название пакета]</packet_name>
   <packet_expire>[дата и время истечения пакета]</packet_expire>
 </account>
 <services>  // сервисы включенные в пакет пользователя
    <vod>1</vod> // видеотека
    <archive>1</archive> // архив
 </services>
 <servertime>[дата и время генерации ответа]</servertime>
</response>

 

Параметр идентификатора сессии передан на тот случай если клиент не может получить заголовок cookie.

 

/account

 

Возвращает информацию об аккаунте аналогичную что при /login

 

 

/logout

 

Вызов без параметров (Идентификатор сессии должен передаваться в виде cookie

 

Возврат пакета:

 

<?xml version="1.0" encoding="UTF-8"?>
<response>
 <message>M_LOGOUT_OK</message>
 <servertime>1277807573</servertime>
</response>

 

/channel_list

 

Вызов без параметров (Идентификатор сессии должен передаваться в виде cookie

 

Возврат пакета:

 

<?xml version="1.0" encoding="UTF-8"?>
<response>
 <groups>
   <item>
     <id>[идентификатор группы]</id>
     <name>[название группы]</name>
     <color>[CSS код цвета группы]</color>
     <channels>
       <item>
         <id>[идентификатор канала]</id>
         <name>[Название канала]</name>
         <stream_params> [возможные параметры потоков]
           <item>
             <rate>[битрейт] Возможный битрейт канала. Устанавливается в настройках переменной bitrate</rate>
             <ts>[таймшифт] в часах например: значение 2 - задержка вещания на 2 часа. Получить url вещания возможно установив в настройках переменную timeshift</ts>
           </item>
           ...
           <item>
             <rate>1500</rate>
             <ts>11</ts>
           </item>
         </stream_params>
         <is_video>[флаг потокового видео 0/1  1-видео, 0-радио]</is_video>
         <need_bandwidth>[рекомендуемый битрейт канала]<need_bandwidth>
         <protected>[флаг закрыт ли канал 0/1]</protected>
         <have_archive>[флаг имеет ли канал архив 0/1]</have_archive>
         <icon>[относительный путь к файлу иконки канала]</icon>
         <epg_progname>[название текущей телепередачи]</epg_progname>
         <epg_start>[дата и время начала текущей передачи]</epg_start>
         <epg_end>[дата и время окончания текущей передачи]</epg_end>
       </item>
       <item>   /* пример */
         <id>3</id>
         <name>Pоссия</name>
         <stream_params>
            <item>
               <rate>1500</rate>
               <ts>0</ts>
            </item>
            <item>
               <rate>900</rate>
               <ts>0</ts>
            </item>
            <item>
               <rate>1500</rate>
               <ts>1</ts>
            </item>
            <item>
               <rate>1500</rate>
               <ts>2</ts>
            </item>
            <item>
               <rate>1500</rate>
               <ts>3</ts>
            </item>
            <item>
               <rate>1500</rate>
               <ts>4</ts>
            </item>
            <item>
               <rate>1500</rate>
               <ts>8</ts>
            </item>
            <item>
               <rate>1500</rate>
               <ts>9</ts>
            </item>
            <item>
               <rate>1500</rate>
               <ts>10</ts>
            </item>
            <item>
               <rate>1500</rate>
               <ts>11</ts>
            </item>
         </stream_params>
         <is_video>1</is_video>
         <protected>0</protected>
         <have_archive>1</have_archive>
         <icon>/img/ico/3.gif</icon>
         <epg_progname>ВЕСТИ-МОСКВА</epg_progname>
         <epg_start>1277807400</epg_start>
         <epg_end>1277808600</epg_end>
       </item>
       ...        /* пример */
     </channels>
   </item>
   <item>
     <id>2</id>
     <name>Новости</name>
     <color>#ef0000</color>
     <channels>
       <item>
         <id>6</id>
         <name>РТР Вести</name>
         <is_video>1</is_video>
         <protected>0</protected>
         <icon>/img/ico/6.gif</icon>
         <epg_progname>"Вести. Сейчас. Главные события".</epg_progname>
         <epg_start>1277807400</epg_start>
         <epg_end>1277807700</epg_end>
       </item>
       ...
     </channels>
   </item>
 </groups>
 <servertime>1277807687</servertime>
</response>

 

/get_url?cid=<ИД канала>&gmt=<дата время позиции архива>&protect_code=<пароль для закрытых каналов>

 

Параметры

 

  • cid - идентификатор канала полученный из channel_list
  • gmt - дата время позиции архива в формате unixtime
  • protect_code - цифровой пароль для закрытых каналов. если канал закрыт а пароль не передан, либо передан неверный пароль, то в тэге <url> возвращается слово "protected".

 

Возврат пакета вида:

 

<?xml version="1.0" encoding="UTF-8"?>
<response>
 <url>http/ts://217.19.222.34:18046/?ticket=W4z3WFdoSRnMMXHgYFq...md4ZGtVyT6mjgqGZk%3D :http-caching=1500 :no-http-reconnect</url>
 <servertime>1277808472</servertime>
</response>

 

url специально сгенерирован для проигрывания через VLC с соответствующими оптимизированными параметрами

 

URL генерируется только один раз. Для повторного просмотра канала необходимо получить другой, перегенерированный url. При попытке трансляции url нескольких сгенерированных URL одновременно, будет транслироваться только url полученный последним. Таким образом возможна трансляция только одного потока для одной сессии.

 

/epg?cid=<идентификатор канала>&day=<дата формата DDMMYY>

 

Параметры

 

  • cid - идентификатор канала полученный из channel_list
  • day - дата вида DDMMYY (Пример: 29 июня 2010г = 290610)

 

<?xml version="1.0" encoding="UTF-8"?>
<response>
 <epg>
   <item>
     <ut_start>[дата и время начала передачи]</ut_start>
     <progname>[название передачи]</progname>
   </item>
   <item>
     <ut_start>1277521800</ut_start>
     <progname>"Вся Россия".</progname>
   </item>
   <item>
     <ut_start>1277522700</ut_start>
     <progname>"Диалоги о животных".</progname>
   </item>
   ...
 </epg>
 <servertime>1277809426</servertime>
</response>

 

 

 

/epg3?dtime=<Дата и время старта EPG>&period=<на сколько часов вперед>

 

Выдача программы телепередач доступных каналов с времени указанного в dtime на следующие period часов.

необходима для организации функции "что идет сейчас" как на http://tv.yahoo.com/listings

Программа генерируется с учетом timeshift переменной выставленной пользователем в настройках.

 

Параметры

 

  • dtime - дата и время (unixtime) начала EPG. По умолчанию выбирается текущий момент (по серверному времени)
  • period - на сколько часов вперед. По умолчанию выдается EPG на ближайшие 3 часа.

 

<?xml version="1.0" encoding="UTF-8"?>
<response>
<item>
 <id>2</id>
 <name>Первый</name>
 <epg>
<item>
  <ut_start>1278944400</ut_start>
  <progname>"ХОЧУ ЗНАТЬ" с Михаилом Ширвиндтом</progname>
  <t_start>17:20</t_start>
</item>
<item>
  <ut_start>1278946200</ut_start>
  <progname>"ОБРУЧАЛЬНОЕ КОЛЬЦО" - многосерийный фильм Сериал.</progname>
  <t_start>17:50</t_start>
</item>
 </epg>
</item>
<item>
 <id>3</id>
 <name>Pоссия</name>
 <epg>
<item>
  <ut_start>1278942600</ut_start>
  <progname>"ТАЙНЫ СЛЕДСТВИЯ" - детективный сериал. В главной роли Анна Ковальчук</progname>
  <t_start>16:50</t_start>
</item>
<item>
  <ut_start>1278948600</ut_start>
  <progname>"КУЛАГИН И ПАРТНЕРЫ"</progname>
  <t_start>18:30</t_start>
</item>
 </epg>
</item>
<item>
 <id>54</id>
 <name>Discovery</name>
 <epg>
<item>
  <ut_start>1278943800</ut_start>
  <progname>"СМЕРТЕЛЬНЫЙ УЛОВ: ВРЕМЯ РАСПЛАТЫ"</progname>
  <t_start>17:10</t_start>
</item>
<item>
  <ut_start>1278947100</ut_start>
  <progname>"ДЕРЗКИЕ ПРОЕКТЫ: АРИЗОНСКИЕ "КАРДИНАЛЫ"</progname>
  <t_start>18:05</t_start>
</item>
<item>
  <ut_start>1278950400</ut_start>
  <progname>"РАЗРУШИТЕЛИ ЛЕГЕНД: СПЕЦВЫПУСК "ДЖЕЙМС БОНД". 1 часть"</progname>
  <t_start>19:00</t_start>
</item>
 </epg>
</item>
<servertime>1278944765</servertime>
</response>

 

/epg_next?cid=<id канала>

 

Возвращает EPG на текущую и на 3 последующих телепередачи канала с заданным ID

 

<?xml version="1.0" encoding="UTF-8"?>
<response>
<epg>
 <item>
   <ts>1294834800</ts> 
   <progname>ХОЧУ ЗНАТЬ
- с Михаилом Ширвиндтом</progname>
 </item>
 <item>
   <ts>1294836600</ts>
   <progname>"ОБРУЧАЛЬНОЕ КОЛЬЦО"
- сериал Сериал.</progname>
 </item>
 <item>
   <ts>1294840200</ts>
   <progname>ФЕДЕРАЛЬНЫЙ СУДЬЯ</progname>
 </item>
</epg>
<servertime>1294835324</servertime>
</response>

 

 

/favorites

 

Любимые каналы. Организовано хранение 12 любимых каналов. Каждая ячейка именуется индексом place. В ней содержится идентификатор канала.

Без входных параметров.

 

<?xml version="1.0" encoding="UTF-8"?>
<response>
<favorites>
 <item>
<place>2</place>
<channel_id>2</channel_id>
 </item>
 <item>
<place>8</place>
<channel_id>3</channel_id>
 </item>
</favorites>
<servertime>1278944963</servertime>
</response>

 

/favorites_set?place=<номер ячейки для хранения>&cid=<идентификатор канала>

Устанавливает в заданную ячейку любимый канал. Если установить cid=0 то канал удалится из списка любимых.

Возврат: пакет сообщение об успешном выполнении либо пакет ошибки.

 

/settings?var=<http_caching|stream_server|timeshift|timezone|bitrate>

Получить значение переменной настройки.

 

  • http_caching - время буферизации потока в миллисекундах
  • stream_server - IP сервера трансляции. Возможные значения передются в массиве List
  • timeshift - смещение по времени. Возможные значения передются в массиве List
  • timezone - часовой пояс. Возможные значения от -12 до +12
  • bitrate - Значание bitrate каналов. Возможные значения 1500 и 900. для некоторых типов device (см /login) могут быть указаны специфичные bitrate.

 

Возврат:

 

<?xml version="1.0" encoding="UTF-8"?>
<response>
<settings>
 <name>timeshift</name>
 <value>3</value>
 <list>
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>8</item>
<item>9</item>
<item>10</item>
<item>11</item>
 </list>
</settings>
<servertime>1278946045</servertime>
</response>

 

Если у переменной есть список возможных значений, то они передаются в массиве с параметром list

 

 

/settings_set?var=<pcode|http_caching|stream_server|timeshift|timezone|bitrate>&val=<значение>

 

Установка настройки.

 

  • pcode - установка пароля для закрытых каналов. Необходима передача дополнительных параметров: old_code - старый пароль, new_code - новый парль, confirm_code - подтверждение нового пароля
  • http_caching. Дополнительный параметр val передает возможное значение для установки.
  • stream_server - установить IP сервер трансляции. val передает возможное значение для установки.
  • timeshift - val передает возможное значение для установки.
  • timezone - часовой пояс. Возможные значения от -12 до +12
  • bitrate - Значание bitrate каналов. Возможные значения 1500 и 900. для некоторых типов device (см /login) могут быть указаны специфичные bitrate.

 

Видеотека

 

Получить список фильмов из базы видеотеки. Фильмы выводятся в порядке заданном параметром type, порциями по 20 фильмов.

Параметры для формирования списка фильмов:

 

/vod_list?

  • type = best|last|text
  • page = 1
  • query = text если type==text
  • genre = id
  • nums = <фильмов на страницу>

 

  • type = best - лучшие фильмы согласно рейтинга по просмотрам. last - тот же список фильмов но отсортирован по дате добавления в обратном порядке. text - поиск в базе по названию фильма. строка для поиска в query
  • page = N - номер страницы для вывода. По умолчанию установлен 1-й номер страницы.
  • query - строка для поиска. Работает если установлен type=text
  • genre = id - фильтр по жанрам. Показывает фильмы только указанного жанра. Возможно перечисление выводимых жанров через знак `|`. Например: genre=205|206|215
  • nums = NN количество фильмов на страницу по умолчанию: 20

 

Ответ

<?xml version="1.0" encoding="UTF-8"?>
<response>
<type>best</type> [текущий тип запроса]
<total>60</total> [всего записей удовлетворяющих запросу]
<count>20</count>  [количество на текущей странице]
<page>1</page>  [номер страницы]
<rows>
 <item>
<id>119</id>  [идентификатор фильма (не файла для вещания!!!)]
<dt_modify>2010-12-24 14:35:18</dt_modify>  [дата последней модификации]
<name>Убить Шакала </name>   [название фильма]
<name_orig></name_orig>   [иригинальное название фильма (если англ.)]
<description>Ограблен ювелирный магазин. Объявлен всесоюзный розыск бандита по кличке Шакал. А тем временем в поезде, 
                           следующем из Киева в Крым, происходит загадочное убийство. Прибывший на место преступления следователь Петров обнаруживает 
                           связь между этим убийством и ограблением…</description>   [описание]
<poster>/img/vod/470616.jpg</poster>   [относительная ссылка на картинку постера. Относительно http://iptv.kartina.tv/]
<year>1991</year>	[год выпуска фильма]
<rate_imdb>0.000</rate_imdb>	[значение рейтинга IMDB]
<rate_kinopoisk>6.500</rate_kinopoisk>	[значение рейтинга кинопоиска]
<rate_mpaa></rate_mpaa>	[значение рейтинга MPAA]
<country>СССР</country>	 [страна производства]
<genre_str>детектив</genre_str>	[строка жанров (список жанров фильма собранный в строку и разделенные запятыми)]
 </item>
...
<rows>
</responce>

 

 

 

/vod_info?id=<id фильма>

 

Получить полную информацию о фильме. Параметр: id - идентификатор фильма полученный из списка фильмов.

 

 

Ответ:

<?xml version="1.0" encoding="UTF-8"?>
<response>
<film>
 <id>119</id>  [идентификатор фильма]
 <name>Убить Шакала </name>   [название фильма]
 <name_orig></name_orig>   [оригинальное название фильма]
 <description>Ограблен ювелирный магазин. Объявлен всесоюзный розыск бандита по кличке Шакал. А тем временем в поезде, 
                     следующем из Киева в Крым, происходит загадочное убийство. Прибывший на место преступления следователь Петров обнаруживает 
                     связь между этим убийством и ограблением…</description>   [описание фильма]
 <poster>/img/vod/470616.jpg</poster>   [ссылка на файл постера]
 <lenght>73</lenght>	[длина фильма в минутах]
 <genre_str>детектив</genre_str>   [жанры фильма, разделенные запятыми]
 <year>1991</year>   [год выпуска]
 <director>Григорий Кохан</director>   [режиссер]
 <scenario>Николай Оганесов, Григорий Кохан</scenario>   [сценарист]
 <actors>Евгений Жариков, Олег Масленников, Нина Колчина-Бунь, Давид Бабаев, Римас Моркунас, Евгений Смирнов, Вячеслав Езепов, 
               Бимболат Ватаев, Александр Быструшкин, Степан Олексенко</actors>	[в ролях]
 <rate_imdb>0.000</rate_imdb>   [рейтигн IMDB]
 <rate_kinopoisk>6.500</rate_kinopoisk>   [рейтинг кинопоиска]
 <rate_mpaa></rate_mpaa>   [рейтинг MPAA]
 <country>СССР</country>	[страна производства]
 <studio></studio>	[студия]
 <awards></awards>   [награды]
 <budget>0</budget>   [бюджет]
 <images></images>	[скриншоты (если есть)]
 <videos>   [файлы фильма (серии)]
<item>
  <id>161</id>   [идентификатор файла]
  <title></title>	[название серии. если фильм односерийный, поле может быть не задано]
  <format>dvd</format>   [качество. tv|dvd|hd|fullhd|etc]
  <url>KILL_JACKAL.m4v</url>   [имя файла (справочное. не используется.)]
  <size>0</size>   [размер файла]
  <lenght>0</lenght>   [длительность фильма в минутах]
  <codec>h264</codec>   [кодек]
  <width>0</width>   [ширина картинки]
  <height>0</height>   [высота картинки]
  <track1_codec>aac</track1_codec>   [тип аудио]
  <track1_lang></track1_lang>   [язык звукового трека1]
  <track2_codec></track2_codec>	[кодек звука]
  <track2_lang></track2_lang>
  <track3_codec></track3_codec>
  <track3_lang></track3_lang>
</item>
 </videos>
 <genres>   [массив жанров фильма]
<item>
  <id>209</id>	 [идентификатор жанра]
  <name>детектив</name>   [наименование жанра]
</item>
 </genres>
</film>
<servertime>1294761468</servertime>
</response>

 

Получить ссылку для вещания потока видео.

 

/vod_geturl?fileid=<ид файла>

Параметр fileid - идентификатор файла полученый из /vod_info

 

Ответ:

<?xml version="1.0" encoding="UTF-8"?>
<response>
<url>http://vod.kartina.tv/Tass_02.m4v?ticket=mkcuTmdjrxyJAOE5Nb6EZNxeNin3IDojbkF0...WQlzY4CMP%2F5%2BIr8Y%3D :http-caching=1500 :no-http-reconnect</url>
<servertime>1294826729</servertime>
</response>

 

Внимание! Ссылка вещания генерируется динамично. В зависимости от нагрузки на сервер.

 

/vod_genres

без параметров. возвращает список жанров.

не рекомендуется делать статичную копию справочника, поскольку жанры могут появляться по мере поступления новых фильмов.

 

Ответ:

<?xml version="1.0" encoding="UTF-8"?>
<response>
<genres>
 <item>
<id>205</id>
<name>биографический</name>
 </item>
 <item>
<id>206</id>
<name>боевик</name>
 </item>
 <item>
<id>208</id>
<name>военный</name>
 </item>
 <item>
<id>209</id>
<name>детектив</name>
 </item>
 <item>
<id>210</id>
<name>детский</name>
 </item>
 <item>
<id>213</id>
<name>драма</name>
 </item>
 <item>
<id>215</id>
<name>исторический</name>
 </item>
 <item>
<id>216</id>
<name>комедия</name>
 </item>
 <item>
<id>219</id>
<name>криминал</name>
 </item>
 <item>
<id>220</id>
<name>мелодрама</name>
 </item>
 <item>
<id>221</id>
<name>музыка</name>
 </item>
 <item>
<id>222</id>
<name>музыкальный</name>
 </item>
 <item>
<id>224</id>
<name>приключения</name>
 </item>
 <item>
<id>227</id>
<name>семейный</name>
 </item>
 <item>
<id>230</id>
<name>триллер</name>
 </item>
 <item>
<id>231</id>
<name>ужасы</name>
 </item>
 <item>
<id>232</id>
<name>фантастика</name>
 </item>
 <item>
<id>234</id>
<name>фэнтези</name>
 </item>
</genres>
<servertime>1294827021</servertime>
</response>

 

/vod_favlist список отобраных любимых фильмов[/size]

Формат ответа идентичен формату списка /vod_list

 

/vod_favadd?id=<ID фильма>

Добавить фильм с идентификатором id в список любимых фильмов

 

/vod_favsub?id=<ID фильма>

Удалить фильм с идентификатором id из списка любимых фильмов

 

 

 

 

 

Дополнительная информация

 

Коды и сообщения об ошибках:

define('E_UNKNOW_ERROR',        0);
define('E_INCORRECT_REQUEST',   1);
define('E_TOO_ENOUGH_DATA',     2);
define('E_ACCESS_DENIED',       3);
define('E_INCORRECT_LOGIN',     4);
define('E_CONTRACT_INACTIVE',   5);
define('E_CONTRACT_PAUSED',     6);
define('E_NOT_ALLOWED',         7);
define('E_GET_URL_INFO',        8);
define('E_NEED_DAY',            9);
define('E_NEED_CHANNEL_ID',     10);
define('E_ANOTHER_CLIENT_IN',   11);
define('E_AUTH_ERROR',          12);
define('E_PACKET_EXPIRED',      13);
define('E_INCORRECT_METHOD',    14);
define('E_ARCHIVE_NOT_AVAILABLE',    15);
define('E_NEED_PLACE',    16);
define('E_NEED_SETTING_VARIABLE',    17);
define('E_PASS_BAD_CONFIRM',    18);
define('E_CURRENT_PASS_BAD',    19);
define('E_NEW_PASS_BAD',        20);
define('E_NEED_VALUE',          21);
define('E_VALUE_NOT_ALLOWED',   22);
define('E_NEED_PARAM',              23);
define('E_NEED_PARAM_ID',           24);
define('E_NEED_PARAM_FILEID',       25);
define('E_NEED_PARAM_TYPE',         26);
define('E_NEED_PARAM_QUERY',        27);
define('E_BITRATE_NOT_AVAILABLE',   29);
define('E_SERVICE_NOT_AVAILABLE',   30);
define('E_LIMIT_EXCEEDED',          31);


define('M_FAVORITE_SETS', 2);
define('M_PASS_CHANGED', 3);
define('M_COMPLETED', 4);

E_INCORRECT_REQUEST        E_INCORRECT_REQUEST
E_TOO_ENOUGH_DATA        Wrong login or password
E_ACCESS_DENIED                 Access denied
E_INCORRECT_LOGIN        Login incorrect
E_CONTRACT_INACTIVE        You contract is inactive
E_CONTRACT_PAUSED        You contract is paused
E_NOT_ALLOWED                   Channel not found or not allowed
E_GET_URL_INFO                  Error generate URL. Bad parameters
E_NEED_DAY                      Need DAY parameter <DDMMYY>
E_NEED_CHANNEL_ID        Need ChannelID
E_ANOTHER_CLIENT_IN        Another client with you login was logged
E_AUTH_ERROR                    Authentification error
E_PACKET_EXPIRED        You packet was expired
E_UNKNOW_ERROR                  Unknown error
E_INCORRECT_METHOD        Unknown API function
E_ARCHIVE_NOT_AVAILABLE        Archive is not available
E_NEED_PLACE                    Need place to set
E_NEED_SETTING_VARIABLE        Need name of settings variable
E_PASS_BAD_CONFIRM        Incorrect confirmation code
E_CURRENT_PASS_BAD        Current code is wrond
E_NEW_PASS_BAD                  New code is wrond
E_NEED_VALUE                    Need value (val) parameter
E_VALUE_NOT_ALLOWED        This value is not allowed
E_NEED_PARAM                    Need parameter
E_NEED_PARAM_ID                    Need parameter <id>
E_NEED_PARAM_FILEID                    Need parameter <fileid>
E_NEED_PARAM_TYPE                    Need parameter <type>
E_NEED_PARAM_QUERY                    Need parameter <query>
E_SERVICE_NOT_AVAILABLE                    Service is not available
E_LIMIT_EXCEEDED                    Query limit exceeded


M_FAVORITE_SETS                 Favorite channel was set
M_PASS_CHANGED                  Password was changed
M_COMPLETED                     Operation completed successfully

Link to comment
Share on other sites

1) пожалуйста, сделайте ini_set('display_errors', 0);

ибо

<br />
<b>Notice</b>:  Use of undefined constant API - assumed 'API' in <b>/***/***/api/face.class.php</b> on line <b>15</b><br />

не то, чтобы придираюсь, просто XML не валидный получается :)

а в дальнейшем это вас избавит от ругани простых пользователей..

 

2)

Для идентификации и создании сессии было решено использовать стандартный механизм HTTP сессий с поддержкой COOKIE.

означает ли это, что вы форсировали параметр session.use_only_cookies? или же только пугаете, и можно будет спокойно передавать параметр типа MWARE_SSID=4cqi1rt010uf4bi2okmflpavs7 обычным параметром запроса (что иногда предпочтительнее)

Link to comment
Share on other sites

Исправлено. XML валидный.

session.use_only_cookies установили в 0 ;)

Ждем конструктивных замечаний.

 

http://iptv.kartina.tv/api/xml/login?login...mp;password=xxx

 

 

<response>

<error>

<message>Wrong login or password</message>

<code>2</code>

</error>

<servertime>1277893413</servertime>

</response>

 

пароль и логин вроде правильные, через online захожу без проблем

Link to comment
Share on other sites

http://iptv.kartina.tv/api/xml/login?login...mp;password=xxx

пароль и логин вроде правильные, через online захожу без проблем

 

Прошу прощения великодушно! параметр не "password" а "pass".

т.е. правильно http://iptv.kartina.tv/api/xml/login?login=xxx&pass=xxx

Link to comment
Share on other sites

нереально сделать запрос на видестрим вместе с логином и также для епг?

 

типо

 

/get_url?cid=<ИД канала>&gmt=<дата время позиции архива>&login=<login>&pass=<password>

 

чтобы можно было формировать свои плейлисты и смотреть на любом плеере/приставке с поддержкой тс потока с кодировкой x.264

Link to comment
Share on other sites

нереально сделать запрос на видестрим вместе с логином и также для епг?

 

типо

 

/get_url?cid=<ИД канала>&gmt=<дата время позиции архива>&login=<login>&pass=<password>

 

чтобы можно было формировать свои плейлисты и смотреть на любом плеере/приставке с поддержкой тс потока с кодировкой x.264

 

Нереально.

две причины как минимум

1. доп. нагрузка на сервер (потому как при логине и пароле производится масса проверок);

2. безопасность. Вообще посылать пароль в открытом виде через УРЛ пока не рекомендуется и, скорее всего, в будущем будет запрещено (если возникнут прецеденты - будем принимать подобные меры).

Настойчивые рекомендации: для процедуры /login пользоваться SSL соединением и отсылать данные через POST.

 

По первой причине могу добавить: если будет паразитическая нагрузка в виде "дергания" на каждый чих логина и пароля - мы вынуждены будем ужесточать меры на ограничения.

Link to comment
Share on other sites

  • 2 weeks later...
1. доп. нагрузка на сервер (потому как при логине и пароле производится масса проверок);

;)

расшифрую:

выборка по ид или паре логин/пароль нагружает сервер БД практически одинаково (при соответветствующих индексах). а проверять состояние аккаунта юзера, по хорошему, все равно надо, вне зависимости от того, залогинен он или нет..

 

2) безопасность. Вообще посылать пароль в открытом виде через УРЛ пока не рекомендуется и, скорее всего, в будущем будет запрещено

тут полностью поддерживаю. хотя, будем объективны, риски малы. скорее всего в ssl особого смысла нет, но шуровать пароль в виде хеша md5 из пароля + адреса подсети (пусть не в виде основного, до дополнительного варианта авторизации) было бы здорово. типо:

$subnet = implode('.', array_slice(explode('.', $_SERVER['REMOTE_ADDR']), 0, 3));
$passMD5 = md5($password . $subnet);

 

По первой причине могу добавить: если будет паразитическая нагрузка в виде "дергания" на каждый чих логина и пароля - мы вынуждены будем ужесточать меры на ограничения.

упростите (опишите более детально) требования к авторизации и все станет гораздо проще. дайте людям понять, что "не куки" будут работать. как вариант, добавьте возможность (и документируйте её) передавать ид сессии прямо в урл.

развитие API -- это большой шаг, как для развитие вашего web-интерфейса, так и для привлечения сторонних разработчиков (все-таки, вы продаете сервис, а не приставки к сервису), что принесет дополнительных клиентов.

 

<br />Как можно сделать ссылку для VLC, то есть плейлист?<br />

при помощи "паразитической нагрузки" проксировав запрос на канал через простой скриптик который авторизируется и перезапросит ссылку на канал. писать паразита можно на любом языке программирования, вплоть до shell (wget + grep + awk справятся аж бегом)

Link to comment
Share on other sites

;)

расшифрую:

выборка по ид или паре логин/пароль нагружает сервер БД практически одинаково (при соответветствующих индексах). а проверять состояние аккаунта юзера, по хорошему, все равно надо, вне зависимости от того, залогинен он или нет..

 

Может все-таки мы, как разработчики, лучше знаем где у нас нагрузка больше... Мы проводили тесты перед тем как определиться с архитектурой API и пришли к выводу что механизм сессии оптимален. Есть много нюансов в авторизации, которые просто невозможно делать каждый раз. Например биллинг...

 

... будем объективны, риски малы. скорее всего в ssl особого смысла нет,

 

Будем объективны. Риски, хоть и малые, но все-таки есть. Мы обязаны предоставить безопасное соединение. Пока сама учетная запись будет объектом купли-продажи, к ней будет интерес злоумышленников.

 

<br />Как можно сделать ссылку для VLC, то есть плейлист?<br />

при помощи "паразитической нагрузки" проксировав запрос на канал через простой скриптик который авторизируется и перезапросит ссылку на канал. писать паразита можно на любом языке программирования, вплоть до shell (wget + grep + awk справятся аж бегом)

 

не в инструментах речь. Да. только через такой проксик только и можно сделать плейлист. Многие не поймут поэтому расшифрую:

 

НИКОГДА НЕ БУДЕТ ВОЗМОЖНОСТИ НАПРЯМУЮ ПОЛУЧИТЬ ПЛЕЙЛИСТ!

 

если посмотреть на сам плейлист, то там фигурируют такие вещи как URL. т.е. величины постоянные. Суть в том, что у kartina.tv эти самые URL перегенирируются на каждый запрос. Это необходимое условие для отдачи контента только для одной учетной записи и только в конкретный промежуток времени. Если кто-то попробует воспользоваться этим URL еще раз или через некоторый промежуток времени, вещание прекратится.

В виду этого создание плейлиста с прямыми урлами невозможно.

 

НО! Если создать локально некий прокси, который будет авторизоваться и перегонять трафик снаружи (например) на http://localhost/playlist/90 ..., то с такими URL (на локальный хост) создать плейлист уже возможно.

 

Link to comment
Share on other sites

Может все-таки мы, как разработчики, лучше знаем где у нас нагрузка больше... Мы проводили тесты перед тем как определиться с архитектурой API и пришли к выводу что механизм сессии оптимален. Есть много нюансов в авторизации, которые просто невозможно делать каждый раз. Например биллинг...

то, что механизм предварительной авторизации оправдывает себя -- я с этим и не думал спорить. это доказано многочисленными практиками экономии, как на спичках, так и на серьезных расходах рессурсов. вполне можно считать это стандартом "де факто".

хотя, биллинг, в данном случае, это отчасти именно экономия на спичках. поскольку все равно срок годности абонемента надо сравнивать с текущим таймстемпом при каждом запросе API, а будет ли при этом выполнен дополнительный запрос к базе (по первичному ключу!) или нет (и значение будет извлечено из некого кеша, коим и является механизм сессий) -- это уже детали реализации.

к слову, вот скажите откровенно, храните ли вы в сессии существенно больше биллинг-рилэйтед информации, чем ID аккаунта? вопрос риторический..

 

Будем объективны. Риски, хоть и малые, но все-таки есть. Мы обязаны предоставить безопасное соединение. Пока сама учетная запись будет объектом купли-продажи, к ней будет интерес злоумышленников.<br /><br />

действительно похвально. как на счет альтернативного способа авторизации по хешу (предложенного мной выше в теме)? дешево и сердито.. в перспективе решает ряд вопросов для авторизации с убогих девайсов имеющих проблемы с ssl соединениями.

 

не в инструментах речь. Да. только через такой проксик только и можно сделать плейлист.

вопрос в том, что "будет ли такая реализация считаться паразитической"? ибо простой shell скрипт открывающий таким образом канал пишется за 3 минуты. а вот скрипт с сохранением промежуточного состояния сесси между получением списка каналов, просмотром программки и переключением тех самых каналов будет писаться дольше.

Link to comment
Share on other sites

простой shell скрипт открывающий таким образом канал пишется за 3 минуты. а вот скрипт с сохранением промежуточного состояния сесси между получением списка каналов, просмотром программки и переключением тех самых каналов будет писаться дольше.

до получения URL-а вещания канала все равно необходимо получить актуальный плейлист (мало ли, убрали/добавили пару каналов)

т.е. что-то ваш клиент все равно должен хранить

 

раз уж вы пишете полноценного клиента, то сохранить и передать куку не проблема

а для 3-минутной поделки слишком много параметров в сервисе

Link to comment
Share on other sites

к слову, вот скажите откровенно, храните ли вы в сессии существенно больше биллинг-рилэйтед информации, чем ID аккаунта? вопрос риторический..

Риторика саркастичная... Таки да. В сессии у нас хранится СУЩЕСТВЕННО больше нежели только биллинг-рилэйтед информация.

 

... как на счет альтернативного способа авторизации по хешу (предложенного мной выше в теме)? дешево и сердито.. в перспективе решает ряд вопросов для авторизации с убогих девайсов имеющих проблемы с ssl соединениями.

 

Предложенный вами вариант практически не отличается от прямого запроса с логином-паролем, т.е. поднимать паровоз на каждый запрос все равно придется. Да и потом, Вы предлагаете заменить пару логин-пароль на логин-хэш (от пароля и части IP клиента). Вопрос: каким таким образом клиент увидит свой реальный IP чтобы соорудить подобный хэш? В 95% случаев клиентский IP будет из диапазона 192.168.х.х а на сервере определиться внешний IP шлюза.

А насчет убогих девайсов без ssl могу сказать точно - они не потянут декодирование потока в 2 мегабита.

 

вопрос в том, что "будет ли такая реализация считаться паразитической"? ибо простой shell скрипт открывающий таким образом канал пишется за 3 минуты. а вот скрипт с сохранением промежуточного состояния сесси между получением списка каналов, просмотром программки и переключением тех самых каналов будет писаться дольше.

 

Лучше дольше да лучше ;)

 

Link to comment
Share on other sites

Вопрос: каким таким образом клиент увидит свой реальный IP чтобы соорудить подобный хэш?

 

dig +short myip.opendns.com @resolver1.opendns.com

или типа того (даже стянуть http://whatismyip.com и отпарсить оттуда адрес вполне сойдет)

те, кто будут думать, что локальный адрес и есть внешний, вряд ли будут способны написать что-то достойное. так что можно этот сегмент игнорировать.

ну или пусть используют ssl..

 

хотя, дело, конечно, хозяйское..

наше дело предложить ©

Edited by Eugene
Link to comment
Share on other sites

А насчет убогих девайсов без ssl могу сказать точно - они не потянут декодирование потока в 2 мегабита.

Хотелось бы заметить, что Картина в будущем может захотеть сделать отдельный поток с пониженным битрейтом для просмотра на смартфонах. Как будет отражаться использование SSL на мобильных девайсах, сказать затрудняюсь, может, у Вас есть опыт?

 

сорри за оффтоп

Link to comment
Share on other sites

Хотелось бы заметить, что Картина в будущем может захотеть сделать отдельный поток с пониженным битрейтом для просмотра на смартфонах. Как будет отражаться использование SSL на мобильных девайсах, сказать затрудняюсь, может, у Вас есть опыт?

я так понимаю, что речь идет об использовании защищенного соединения исключительно для авторизации, что нормально.

потому что гонять трафик через SSL (особенно на мобильных девайсах) -- страшный overload на обе стороны. а чахлые девайсы просто не потянут такой нагрузки (декодирование трафика, декодирование потока + проигрывание потока)

Link to comment
Share on other sites

...я так понимаю, что речь идет об использовании защищенного соединения исключительно для авторизации, что нормально...

Именно так. Урлы для вещания генерируются сервером. И они не SSL. Авторизация идет через зашифрованный ticket.

Link to comment
Share on other sites

Здравствуйте!

 

Я начинал использовать API в VLC-Record. Еще рано сказать, когда будет такой релис. Если посмотрю все информации которые есть когда исползую API и когда делаю вопрос как "ранше", мне нехватает допольнительное информация в EPG. Там теперь только имя передачи. А надо еще как ранше "program description (XML name: pdescr)".

 

Возможно ли это? Спасибо!

 

Простите, что не так хорошо по-немецки говорю - я немец.

 

Типа:

 

/epg?cid=<идентификатор канала>&day=<дата формата DDMMYY>

 

<?xml version="1.0" encoding="UTF-8"?>
<response>
  <epg>
    <item>
      <ut_start>[дата и время начала передачи]</ut_start>
      <progname>[название передачи]</progname>
      <pdescr>[допольнительные информации передачи]</pdescr>
    </item>
    <item>
      ...
    </item>
  </epg>
</response>

Edited by Jo2003
Link to comment
Share on other sites

Я видел, что все информации передачи в "<progname>". Все же было бы лучше, если там действительно только было бы называние а другие информации в "<pdescr>".

 

Я знаю, что информации есть отдельно. Например когда с COOKIE идешь на этот URL.

 

http://iptv.kartina.tv/?m=epg&act=show_day_xml&day=<ddmmyy>&cid=<channel id>

 

;)

Edited by Jo2003
Link to comment
Share on other sites

mariman, подумалось вот: неплохо бы для json запросов добавить опциональный параметр callback (или типа того)

1) google-style (http://code.google.com/intl/ru/apis/gdata/docs/json.html)

2) реально создавать "тонкие" клиенты без дополнительного серверного скрипта для проксирования запросов

Link to comment
Share on other sites

TimeShift не работает. Могу соханять - работает. Могу спрашивать - работает. Но каналы всегда идут без TimeShift.

 

Поправлено.

 

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...