The wonderful world of Stalker IPTV

To start with an attack, one first has to gain some knowledge!

My first starting point was a very long time ago at the moment that the m3u-stream references came into picture on several websites.

NOTE: Still not know if it would be a good idea to post the information of this adventure. But one day we’ll get a big change in these platforms for IPTV, because of big and big mis-use these days already and also in the future. Some protections already have been added, by using ‘changing passwords’ and adding a ‘play-token’ to the portals. But, as long as these type of IPTV-boxes are sold and not become obsolete, many of these portals will remain alive and still can be hacked.

These m3u-stream references worked quite well, but not always. Sometimes there was no picture available as these streams can only be used by one person at a time. Unless the streams account has multiple users. Good to know that these accounts have high values.

Wireshark

Wireshark is ‘the’ tool to gather information about what kind of communication there lives between devices, in this case for the communication between the IPTV-box and the portal. Following chapters describe the steps that are required to come to the goal of playing an IPTV-stream. If you do not have an IPTV-box (as I also do not have one) you can also use BlueStacks and install Stbemu.

Information

Following values are used in the explanations below as example, note that these are fictional addresses!

portal-address = http://ip.tv:25461
mac-address    = 00:1A:79:18:05:75
username       = dNzSh5And2

Step 1 – [STB] Handshake

All communications with the portal is done based on Oauth 2.0, with the Bearer token RFC6750.

GET http://ip.tv:25461/portal.php?type=stb&action=handshake&JsHttpRequest=1-xml

Important is that we have to include the following headers into the GET-request:

User-Agent: Mozilla/5.0 (QtEmbedded; U; Linux; C)
Cookie: mac=00:1A:79:18:05:75; stb_lang=en; timezone=Europe/Amsterdam;

This Authorization Request will result in an Access Token in JSON format, returned from the portal.

{
  "js":
    {
      "token":"C00F7332ED272F00D5FD3E82F567A282"
    }
}

Step 2 – [STB] Get Profile

Profile information are settings used by the IPTV-box. Note that from now on we need to include the access-token to the GET-headers!

GET http://ip.tv:25461/portal.php?type=stb&action=get_profile&JsHttpRequest=1-xml

User-Agent: Mozilla/5.0 (QtEmbedded; U; Linux; C)
Cookie: mac=00:1A:79:18:05:75; stb_lang=en; timezone=Europe/Amsterdam;
Authorization: Bearer C00F7332ED272F00D5FD3E82F567A282

This Request will result in profile information in JSON format, returned from the portal.

{
  "js":
  {
    "id":"692",
    "name":"109",
    "sname":"",
    "pass":"",
    "parent_password":"0000",
    "bright":"200",
    "contrast":"127",
    "saturation":"127",
    "video_out":"rca",
    "volume":"65",
    "playback_buffer_bytes":"0",
    "playback_buffer_size":"0",
    "audio_out":"1",
    "mac":"MDA6MUE6Nzk6MTg6MDU6NzU=",
    "ip":"109.129.183.25",
    "ls":null,
    "version":"",
    "lang":null,
    "locale":"en_GB.utf8",
    "city_id":"0",
    "hd":"1",
    "main_notify":"1",
    "fav_itv_on":"0",
    "now_playing_start":null,
    "now_playing_type":"0",
    "now_playing_content":null,
    "additional_services_on":"1",
    "time_last_play_tv":null,
    "time_last_play_video":null,
    "operator_id":"0",
    "storage_name":"",
    "hd_content":"1",
    "image_version":"218",
    "last_change_status":null,
    "last_start":null,
    "last_active":null,
    "keep_alive":null,
    "screensaver_delay":"10",
    "phone":"",
    "fname":"",
    "login":"",
    "password":"dNzSh5And2",
    "stb_type":"MAG254",
    "num_banks":"0",
    "tariff_plan_id":"0",
    "comment":null,
    "now_playing_link_id":null,
    "now_playing_streamer_id":null,
    "just_started":"1",
    "last_watchdog":"1582481300",
    "created":"1491317586",
    "plasma_saving":"0",
    "ts_enabled":"0",
    "ts_enable_icon":"1",
    "ts_path":null,
    "ts_max_length":"3600",
    "ts_buffer_use":"cyclic",
    "ts_action_on_exit":"no_save",
    "ts_delay":"on_pause",
    "video_clock":"Off",
    "verified":"0",
    "hdmi_event_reaction":"1",
    "pri_audio_lang":"",
    "sec_audio_lang":"",
    "pri_subtitle_lang":"",
    "sec_subtitle_lang":"",
    "subtitle_color":"16777215",
    "subtitle_size":"20",
    "show_after_loading":"main_menu",
    "play_in_preview_by_ok":"1",
    "hw_version":"2.5-IB-00",
    "openweathermap_city_id":"0",
    "theme":"",
    "settings_password":"0000",
    "expire_billing_date":"0000-00-00 00:00:00",
    "reseller_id":null,
    "account_balance":"",
    "client_type":"STB",
    "hw_version_2":"62",
    "blocked":"0",
    "units":"metric",
    "tariff_expired_date":null,
    "tariff_id_instead_expired":null,
    "activation_code_auto_issue":"1",
    "last_itv_id":"7139",
    "updated":{
      "id":"1",
      "uid":"1",
      "anec":"0",
      "vclub":"0"
    },
    "rtsp_type":"4",
    "rtsp_flags":"0",
    "stb_lang":"en",
    "display_menu_after_loading":"1",
    "record_max_length":"180",
    "web_proxy_host":"",
    "web_proxy_port":"",
    "web_proxy_user":"",
    "web_proxy_pass":"",
    "web_proxy_exclude_list":"",
    "demo_video_url":"",
    "tv_quality_filter":"",
    "is_moderator":false,
    "timeslot_ratio":0.33333333333333,
    "timeslot":40,
    "kinopoisk_rating":"1",
    "enable_tariff_plans":"",
    "strict_stb_type_check":"",
    "cas_type":0,
    "cas_params":null,
    "cas_web_params":null,
    "cas_additional_params":[],
    "cas_hw_descrambling":0,
    "cas_ini_file":"",
    "logarithm_volume_control":"",
    "allow_subscription_from_stb":"1",
    "deny_720p_gmode_on_mag200":"1",
    "enable_arrow_keys_setpos":"1",
    "show_purchased_filter":"",
    "timezone_diff":0,
    "enable_connection_problem_indication":true,
    "invert_channel_switch_direction":"",
    "play_in_preview_only_by_ok":"true",
    "enable_stream_error_logging":"",
    "always_enabled_subtitles":"1",
    "enable_service_button":"",
    "enable_setting_access_by_pass":"",
    "tv_archive_continued":"",
    "plasma_saving_timeout":"600",
    "show_tv_only_hd_filter_option":"",
    "tv_playback_retry_limit":"0",
    "fading_tv_retry_timeout":"1",
    "epg_update_time_range":0.6,
    "store_auth_data_on_stb":false,
    "account_page_by_password":"",
    "tester":false,
    "enable_stream_losses_logging":"",
    "external_payment_page_url":"",
    "max_local_recordings":"10",
    "tv_channel_default_aspect":"fit",
    "default_led_level":"10",
    "standby_led_level":"90",
    "show_version_in_main_menu":"1",
    "disable_youtube_for_mag200":"1",
    "auth_access":false,
    "epg_data_block_period_for_stb":"5",
    "standby_on_hdmi_off":"1",
    "force_ch_link_check":"",
    "stb_ntp_server":"pool.ntp.org",
    "overwrite_stb_ntp_server":"",
    "hide_tv_genres_in_fullscreen":null,
    "advert":null,
    "aspect":"",
    "playback_limit":3,
    "country":null,
    "watchdog_timeout":88,
    "play_token":"e7f7uKdyF8:1582481370:1349",
    "status":0,
    "update_url":"",
    "test_download_url":"",
    "default_timezone":"Europe\/Brussels",
    "default_locale":"en_GB.utf8",
    "allowed_stb_types":
      ["aurahd",
      "aurahd8",
      "aurahd9",
      .
      .
      .
      "mag349",
      "mag350",
      "mag351",
      "mag352",
      "mag420",
      "wr320"],
    "allowed_stb_types_for_local_recording":
      ["aurahd",
      "aurahd8",
      "aurahd9",
      .
      .
      .
      "mag349",
      "mag350",
      "mag351",
      "mag352",
      "mag420",
      "wr320"],
    "storages":[],
    "show_tv_channel_logo":true,
    "show_channel_logo_in_preview":true,
    "hls_fast_start":"1",
    "check_ssl_certificate":0,
    "enable_buffering_indication":1}}

Already good to know that this request also resulted into a password, which we can use later!

"login":"","password":"dNzSh5And2","stb_type":"MAG254"

Step 3 – [ITV] Get Genres

Genres are categories where TV-channels are stored. To get the genre-list we need to do the following request. Note that we now use type=itv instead of type=stb!

GET portal.php?type=itv&action=get_genres&JsHttpRequest=1-xml

User-Agent: Mozilla/5.0 (QtEmbedded; U; Linux; C)
Cookie: mac=00:1A:79:18:05:75; stb_lang=en; timezone=Europe/Amsterdam;
Authorization: Bearer C00F7332ED272F00D5FD3E82F567A282

This Request will result in a list in JSON format, returned from the portal.

{
  "js":
    [
      {
        "id":"*",
        "title":"All",
        "alias":"All",
        "active_sub":true,
        "censored":0
      },
      {
        "id":"173",
        "title":"TR | TURKIYE",
        "modified":"",
        "number":1,
        "alias":"tr | turkiye",
        "censored":0
      },
      {
        "id":"179",
        "title":"NL | NEDERLAND",
        "modified":"",
        "number":11,
        "alias":"nl | nederland",
        "censored":0
      },
      {
        "id":"167",
        "title":"NL | FILM ZENDERS",
        "modified":"",
        "number":15,
        "alias":"nl | film zenders",
        "censored":0
      },
      .
      .
      .
      {
        "id":"109",
        "title":"IR | IRAN",
        "modified":"",
        "number":74,
        "alias":"ir | iran",
        "censored":0
      },
      {
        "id":"128",
        "title":"US | USA",
        "modified":"",
        "number":75,
        "alias":"us | usa",
        "censored":0}
    ]
}

The genres are identified with an id: “number”, which we need to get the TV-channels within this genre.

One genre extracted on which we will work further on:

{
    "id":"179",
    "title":"NL | NEDERLAND",
    "modified":"",
    "number":11,
    "alias":"nl | nederland",
    "censored":0
},

Step 4 – [ITV] Get Ordered List

To get all TV-channels from this genre (id=179), we need to use the action Get_Ordered_List with the following request:

GET portal.php?type=itv&action=get_ordered_list&genre=179&force_ch_link_check=&fav=0&sortby=number&hd=0&p=1&JsHttpRequest=1-xml

User-Agent: Mozilla/5.0 (QtEmbedded; U; Linux; C)
Cookie: mac=00:1A:79:18:05:75; stb_lang=en; timezone=Europe/Amsterdam;
Authorization: Bearer C00F7332ED272F00D5FD3E82F567A282

This Request will result in a list in JSON format, returned from the portal.

Note that we need to do several Get_Ordered_List to get all channels within this genre, because data-exchange is done with pages. Next page can be gotten by changing p=1 into p=2 in the GET-request.

{
  "js":{
    "total_items":24,
    "max_page_items":14,
    "selected_item":0,
    "cur_page":0,
    "data":[
      {
        "id":"3031",
        "name":"## | NEDERLAND 4K+ | ##",
        "number":"462",
        "censored":"",
        "cmd":"ffmpeg http://localhost/ch/3031_",
        "cost":"0",
        "count":"0",
        "status":1,
        "hd":"0",
        "tv_genre_id":"179",
        "base_ch":"1",
        "xmltv_id":"",
        "service_id":"",
        "bonus_ch":"0",
        "volume_correction":"0",
        "mc_cmd":"",
        "enable_tv_archive":0,
        "wowza_tmp_link":"0",
        "wowza_dvr":"0",
        "use_http_tmp_link":"1",
        "monitoring_status":"1",
        "enable_monitoring":"0",
        "enable_wowza_load_balancing":"0",
        "cmd_1":"",
        "cmd_2":"",
        "cmd_3":"",
        "logo":"",
        "correct_time":"0",
        "nimble_dvr":"0",
        "allow_pvr":0,
        "allow_local_pvr":0,
        "allow_remote_pvr":0,
        "modified":"",
        "allow_local_timeshift":"1",
        "nginx_secure_link":"1",
        "tv_archive_duration":0,
        "locked":0,
        "lock":0,
        "fav":0,
        "archive":0,
        "genres_str":"",
        "cur_playing":"[No channel info]",
        "epg":[
        ],
        "open":1,
        "cmds":[
          {
            "id":"3031",
            "ch_id":"3031",
            "priority":"0",
            "url":"ffmpeg http://localhost/ch/3031_",
            "status":"1",
            "use_http_tmp_link":"1",
            "wowza_tmp_link":"0",
            "user_agent_filter":"",
            "use_load_balancing":"0",
            "changed":"",
            "enable_monitoring":"0",
            "enable_balancer_monitoring":"0",
            "nginx_secure_link":"1",
            "flussonic_tmp_link":"0"
          }
        ],
        "use_load_balancing":0,
        "pvr":0
      },
      {
        "id":"31917",
        "name":"NL | NPO 1 4K+",
        "number":"463",
        "censored":"",
        "cmd":"ffmpeg http://localhost/ch/31917_",
        "cost":"0",
        "count":"0",
        "status":1,
        "hd":"0",
        "tv_genre_id":"179",
        "base_ch":"1",
        "xmltv_id":"NPO1.nl",
        "service_id":"",
        "bonus_ch":"0",
        "volume_correction":"0",
        "mc_cmd":"",
        "enable_tv_archive":1,
        "wowza_tmp_link":"0",
        "wowza_dvr":"0",
        "use_http_tmp_link":"1",
        "monitoring_status":"1",
        "enable_monitoring":"0",
        "enable_wowza_load_balancing":"0",
        "cmd_1":"",
        "cmd_2":"",
        "cmd_3":"",
        "logo":"http://ip.tv:8000/nl/npo1.png",
        "correct_time":"0",
        "nimble_dvr":"0",
        "allow_pvr":0,
        "allow_local_pvr":0,
        "allow_remote_pvr":0,
        "modified":"",
        "allow_local_timeshift":"1",
        "nginx_secure_link":"1",
        "tv_archive_duration":24,
        "locked":0,
        "lock":0,
        "fav":0,
        "archive":1,
        "genres_str":"",
        "cur_playing":"[No channel info]",
        "epg":[
        ],
        "open":1,
        "cmds":[
          {
            "id":"31917",
            "ch_id":"31917",
            "priority":"0",
            "url":"ffmpeg http://localhost/ch/31917_",
            "status":"1",
            "use_http_tmp_link":"1",
            "wowza_tmp_link":"0",
            "user_agent_filter":"",
            "use_load_balancing":"0",
            "changed":"",
            "enable_monitoring":"0",
            "enable_balancer_monitoring":"0",
            "nginx_secure_link":"1",
            "flussonic_tmp_link":"0"
          }
        ],
        "use_load_balancing":0,
        "pvr":0
      },
      {
        "id":"31916",
        "name":"NL | NPO 2 4K+",
        "number":"464",
        "censored":"",
        "cmd":"ffmpeg http://localhost/ch/31916_",
        "cost":"0",
        "count":"0",
        "status":1,
        "hd":"0",
        "tv_genre_id":"179",
        "base_ch":"1",
        "xmltv_id":"NPO2.nl",
        "service_id":"",
        "bonus_ch":"0",
        "volume_correction":"0",
        "mc_cmd":"",
        "enable_tv_archive":1,
        "wowza_tmp_link":"0",
        "wowza_dvr":"0",
        "use_http_tmp_link":"1",
        "monitoring_status":"1",
        "enable_monitoring":"0",
        "enable_wowza_load_balancing":"0",
        "cmd_1":"",
        "cmd_2":"",
        "cmd_3":"",
        "logo":"http://ip.tv:8000/nl/npo2.png",
        "correct_time":"0",
        "nimble_dvr":"0",
        "allow_pvr":0,
        "allow_local_pvr":0,
        "allow_remote_pvr":0,
        "modified":"",
        "allow_local_timeshift":"1",
        "nginx_secure_link":"1",
        "tv_archive_duration":24,
        "locked":0,
        "lock":0,
        "fav":0,
        "archive":1,
        "genres_str":"",
        "cur_playing":"[No channel info]",
        "epg":[
        ],
        "open":1,
        "cmds":[
          {
            "id":"31916",
            "ch_id":"31916",
            "priority":"0",
            "url":"ffmpeg http://localhost/ch/31916_",
            "status":"1",
            "use_http_tmp_link":"1",
            "wowza_tmp_link":"0",
            "user_agent_filter":"",
            "use_load_balancing":"0",
            "changed":"",
            "enable_monitoring":"0",
            "enable_balancer_monitoring":"0",
            "nginx_secure_link":"1",
            "flussonic_tmp_link":"0"
          }
        ],
        "use_load_balancing":0,
        "pvr":0
      },
      {
        "id":"31915",
        "name":"NL | NPO 3 4K+",
        "number":"465",
        "censored":"",
        "cmd":"ffmpeg http://localhost/ch/31915_",
        "cost":"0",
        "count":"0",
        "status":1,
        "hd":"0",
        "tv_genre_id":"179",
        "base_ch":"1",
        "xmltv_id":"NPO3.nl",
        "service_id":"",
        "bonus_ch":"0",
        "volume_correction":"0",
        "mc_cmd":"",
        "enable_tv_archive":1,
        "wowza_tmp_link":"0",
        "wowza_dvr":"0",
        "use_http_tmp_link":"1",
        "monitoring_status":"1",
        "enable_monitoring":"0",
        "enable_wowza_load_balancing":"0",
        "cmd_1":"",
        "cmd_2":"",
        "cmd_3":"",
        "logo":"http://ip.tv:8000/nl/npo3.png",
        "correct_time":"0",
        "nimble_dvr":"0",
        "allow_pvr":0,
        "allow_local_pvr":0,
        "allow_remote_pvr":0,
        "modified":"",
        "allow_local_timeshift":"1",
        "nginx_secure_link":"1",
        "tv_archive_duration":24,
        "locked":0,
        "lock":0,
        "fav":0,
        "archive":1,
        "genres_str":"",
        "cur_playing":"[No channel info]",
        "epg":[
        ],
        "open":1,
        "cmds":[
          {
            "id":"31915",
            "ch_id":"31915",
            "priority":"0",
            "url":"ffmpeg http://localhost/ch/31915_",
            "status":"1",
            "use_http_tmp_link":"1",
            "wowza_tmp_link":"0",
            "user_agent_filter":"",
            "use_load_balancing":"0",
            "changed":"",
            "enable_monitoring":"0",
            "enable_balancer_monitoring":"0",
            "nginx_secure_link":"1",
            "flussonic_tmp_link":"0"
          }
        ],
        "use_load_balancing":0,
        "pvr":0
      },
      .
      .
      .
      {
        "id":"31908",
        "name":"NL | SBS 9 4K+",
        "number":"472",
        "censored":"",
        "cmd":"ffmpeg http://localhost/ch/31908_",
        "cost":"0",
        "count":"0",
        "status":1,
        "hd":"0",
        "tv_genre_id":"179",
        "base_ch":"1",
        "xmltv_id":"SBS9.nl",
        "service_id":"",
        "bonus_ch":"0",
        "volume_correction":"0",
        "mc_cmd":"",
        "enable_tv_archive":1,
        "wowza_tmp_link":"0",
        "wowza_dvr":"0",
        "use_http_tmp_link":"1",
        "monitoring_status":"1",
        "enable_monitoring":"0",
        "enable_wowza_load_balancing":"0",
        "cmd_1":"",
        "cmd_2":"",
        "cmd_3":"",
        "logo":"http://ip.tv:8000/nl/sbs9.png",
        "correct_time":"0",
        "nimble_dvr":"0",
        "allow_pvr":0,
        "allow_local_pvr":0,
        "allow_remote_pvr":0,
        "modified":"",
        "allow_local_timeshift":"1",
        "nginx_secure_link":"1",
        "tv_archive_duration":24,
        "locked":0,
        "lock":0,
        "fav":0,
        "archive":1,
        "genres_str":"",
        "cur_playing":"[No channel info]",
        "epg":[

        ],
        "open":1,
        "cmds":[
          {
            "id":"31908",
            "ch_id":"31908",
            "priority":"0",
            "url":"ffmpeg http://localhost/ch/31908_",
            "status":"1",
            "use_http_tmp_link":"1",
            "wowza_tmp_link":"0",
            "user_agent_filter":"",
            "use_load_balancing":"0",
            "changed":"",
            "enable_monitoring":"0",
            "enable_balancer_monitoring":"0",
            "nginx_secure_link":"1",
            "flussonic_tmp_link":"0"
          }
        ],
        "use_load_balancing":0,
        "pvr":0
      },
    ]
  }
}

One channel extracted:

{
   "id":"31915",
   "name":"NL | NPO 3 4K+",
   "number":"465",
   "censored":"",
   "cmd":"ffmpeg http://localhost/ch/31915_",
   "cost":"0",
   "count":"0",
   "status":1,
   "hd":"0",
   "tv_genre_id":"179",
   "base_ch":"1",
   "xmltv_id":"NPO3.nl",
   "service_id":"",
   "bonus_ch":"0",
   "volume_correction":"0",
   "mc_cmd":"",
   "enable_tv_archive":1,
   "wowza_tmp_link":"0",
   "wowza_dvr":"0",
   "use_http_tmp_link":"1",
   "monitoring_status":"1",
   "enable_monitoring":"0",
   "enable_wowza_load_balancing":"0",
   "cmd_1":"",
   "cmd_2":"",
   "cmd_3":"",
   "logo":"http://ip.tv:8000/nl/npo3.png",
   "correct_time":"0",
   "nimble_dvr":"0",
   "allow_pvr":0,
   "allow_local_pvr":0,
   "allow_remote_pvr":0,
   "modified":"",
   "allow_local_timeshift":"1",
   "nginx_secure_link":"1",
   "tv_archive_duration":24,
   "locked":0,
   "lock":0,
   "fav":0,
   "archive":1,
   "genres_str":"",
   "cur_playing":"[No channel info]",
   "epg":[
   ],
   "open":1,
   "cmds":[
      {
         "id":"31915",
         "ch_id":"31915",
         "priority":"0",
         "url":"ffmpeg http : //localhost/ch/31915_",
         "status":"1",
         "use_http_tmp_link":"1",
         "wowza_tmp_link":"0",
         "user_agent_filter":"",
         "use_load_balancing":"0",
         "changed":"",
         "enable_monitoring":"0",
         "enable_balancer_monitoring":"0",
         "nginx_secure_link":"1",
         "flussonic_tmp_link":"0"
      }
   ],
   "use_load_balancing":0,
   "pvr":0
},

But still we cannot play the stream for this channel, we still do not have enough information, only thing we need is the following step and the data from parameter cmd:

"http://localhost/ch/31915_"

Step 5 – [ITV] Create Link

To get the URL-stream of the TV-channel, we need to use the action Create_Link with the following request where cmd is gotten from the previous step:

GET portal.php?type=itv&action=create_link&cmd=http://localhost/ch/31915_&series=&forced_storage=undefined&disable_ad=0&download=0&JsHttpRequest=1-xml

User-Agent: Mozilla/5.0 (QtEmbedded; U; Linux; C)
Cookie: mac=00:1A:79:18:05:75; stb_lang=en; timezone=Europe/Amsterdam;
Authorization: Bearer C00F7332ED272F00D5FD3E82F567A282

This Request will result in a list in JSON format, returned from the portal.

{
   "js":{
      "id":"47534",
      "cmd":"ffmpeg http://ip.tv:8000:80/dNzSh5And2/MoCmEzytdO/47534?play_token=Hsv87nbU99"
   },
   "streamer_id":0,
   "link_id":0,
   "load":0,
   "error":""
}

Step 6 – Play the TV-stream

Only thing we need to do now is to open this cmd-stream in VLC Player or, in my case, Stalker Player for Windows.

http://ip.tv:8000:80/dNzSh5And2/MoCmEzytdO/47534?play_token=Hsv87nbU99
Stalker Player NPO3

Note that the stream format is as following:

http : / / { stalker_portal_address : port } / { username } / { password } / {stream_id } ? { play_token }

What’s next

So for now on we used actions on the functions stb and itv. The same should be done for the vod function to play Video On Demand. Below the functions of the available types are listed. The not yet described functions which are also available are indicated in italic.

STB

  • handshake
  • get_profile
  • get_localization
  • get_preload_images
  • get_modules
  • get_tv_aspects
  • log
  • get_ad

ITV

  • get_genres
  • get_ordered_list
  • create_link
  • get_epg_info
  • get_short_epg
  • get_all_channels
  • set_fav_status
  • get_fav_ids
  • get_all_channels
  • get_all_fav_channels

VOD

  • get_categories
  • get_ordered_list
  • create_link

TO BE CONTINUED…

XtreamCodesExtendAPI – Player API

player_api

Actions:

panel.api

http://ip.tv:25461/panel_api.php?username=fRjLIq8ybj&password=vNlCUc55Ut
  • ‘none’ (GetCategories)
  • get_epg

xmltv_api

http://ip.tv:25461/xmltv.php?username=fRjLIq8ybj&password=vNlCUc55Ut

TO BE CONTINUED…