Code Monkey home page Code Monkey logo

pylips's Introduction

Pylips

Pylips is a Python tool to control Philips TVs (2015+) through their reverse-engineered API.

  1. Supports both Android and non-Android TVs
  2. 80+ built-in commands + support for custom "GET" and "POST" requests to the API
  3. All commands work on TVs with API version 6, most of them also work for API version 5
  4. Full control of Ambilight including color, brightness, mode and 'Ambilight + Hue'
  5. Allows sending TV status updates and receiving commands over MQTT

The current version of the API does not allow switching input sources anymore. For Android TVs with Google Assistant, Pylips can switch between any input sources that your TV has. For Android TVs without Google Assistant, see some options here.

Table of contents

  1. Prerequisites
  2. Setting up Pylips
    1. New users
    2. Migrating from older versions
  3. Controlling the TV (manual mode)
    1. Built-in commands
    2. Custom commands
  4. Controlling the TV (MQTT mode)
  5. Switching input sources
  6. API reference
  7. Change log
  8. TO-DO
  9. Acknowledgements
  10. Contact details

Prerequisites

Provided that you have python (version 3+) on your system, install all the dependencies first:

pip3 install -r requirements.txt

You may have to use pip and python instead of pip3 and python3 depending on how these tools are installed on your system.

Setting up Pylips

New users

To begin using Pylips you first need to add the ip adress of your TV to the [TV] section in the settings.ini file. If you want to use MQTT, you will also need to fill in the [MQTT] section and set the required flags in the [DEFAULT] section:

[DEFAULT]
verbose = True          # show various debug output
MQTT_listen = False     # listen for MQTT commands. Requires correct [MQTT] settings
MQTT_update = False     # publish status updates over MQTT. Requires correct [MQTT] settings
num_retries = 3         # number of retries when sending requests. No need to change it unless your network sucks.
update_interval = 3     # interval between updates in seconds (used if MQTT_update = True). Your TV might not appreciate lower values.
[TV]
host =                  # TV's ip address
port =                  # will be discovered automatically, but you can override it here
apiv =                  # will be discovered automatically, but you can override it here
user =                  # will be discovered automatically (if required for your TV model), but you can override it here
pass =                  # will be discovered automatically (if required for your TV model), but you can override it here
protocol =              # will be discovered automatically, but you can override it here
ambihue_node =          # will be discovered automatically, but you can override it here
[MQTT]
host =                  # your MQTT broker's ip address
port =                  # your MQTT broker's port
user =                  # your MQTT username
pass =                  # your MQTT password
TLS = False             # use TLS  
cert_path =             # full path to your custom certificate if you are using one, otherwise leave it blank            
topic_pylips =          # Pylips will listen for commands to this topic
topic_status =          # Pylips will send status updates to this topic

Now turn your TV on and run Pylips without any arguments to complete setting it up (it will discover your TV's API version, port and protocol, and will also pair and save the credentials if required):

python3 pylips.py

Once it's done, you are ready to use Pylips!

Security note:

To pair with the Android TVs we need to create a HMAC signature using an 88-character (?) key. As far as I can tell the key is used for pairing only. With that in mind and to make this tool as user-friendly as possible, the key is hardcoded. I see no security issues with this but if you are extremely paranoid you can change it: look for a secret_key in the beginning of the code.

Custom config path:

You can load a custom config by specifying its absolute path with a --config parameter:

python pylips.py --config '/home/eslavnov/repos/Pylips/some_settings.ini'

Controlling the TV (manual mode)

You can take advantage of some of the built-in commands or send your own custom commands.

Built-in commands

python3 pylips.py --host %TV's_ip_address% --user %username% --pass %password% --command %command%

Any passed arguments will override the settings in settings.ini without overwriting them. If you have already run the discovery for new users, you don't have to specify --host, --user and -pass parameters. Also skip the --user and --pass parameters if your TV does not have Android. Add --verbose False to any command if you don't want to see the feedback in your terminal (useful for command line sensors).

Available built-in commands:

        TV status:

  1. powerstate - Returns current power state of the TV ('On' or 'Off')

  2. volume - Returns current volume and mute status

  3. current_channel - Returns current channel (if in TV mode)

  4. current_app - Returns current app (Android TVs only)

    TV input (only for TVs with Google Assistant):

  5. input_hdmi_1 - Switches TV's input to HDMI 1

  6. input_hdmi_2 - Switches TV's input to HDMI 2

  7. input_hdmi_3 - Switches TV's input to HDMI 3

  8. input_hdmi_4 - Switches TV's input to HDMI 4

    TV remote keys:

  9. standby - Sends Standby key

  10. mute - Sends Mute key

  11. volume_up - Sends VolumeUp key

  12. volume_down - Sends VolumeDown key

  13. channel_up - Sends ChannelStepUp key

  14. channel_down - Sends ChannelStepDown key

  15. play - Sends Play key

  16. pause - Sends Pause key

  17. play_pause - Sends PlayPause key

  18. stop - Sends Stop key

  19. fast_forward - Sends FastForward key

  20. rewind - Sends Rewind key

  21. next - Sends Next key

  22. previous - Sends Previous key

  23. cursor_up - Sends CursorUp key

  24. cursor_down - Sends CursorDown key

  25. cursor_left - Sends CursorLeft key

  26. cursor_right - Sends CursorRight key

  27. confirm - Sends Confirm key

  28. back - Sends Back key

  29. home - Sends Home key

  30. options - Sends Options key

  31. info - Sends Info key

  32. find - Sends Find key

  33. adjust - Sends Adjust key

  34. watch_tv - Sends WatchTV key

  35. viewmode - Sends Viewmode key

  36. teletext - Sends Teletext key

  37. subtitle - Sends Subtitle key

  38. record - Sends Record key

  39. online - Sends Online key

  40. source - Sends Source key

  41. ambilight_onoff - Sends AmbilightOnOff key

  42. red - Sends RedColour key

  43. green - Sends GreenColour key

  44. yellow - Sends YellowColour key

  45. blue - Sends BlueColour key

  46. dot - Sends Dot key

  47. digit_0 - Sends Digit0 key

  48. digit_1 - Sends Digit1 key

  49. digit_2 - Sends Digit2 key

  50. digit_3 - Sends Digit3 key

  51. digit_4 - Sends Digit4 key

  52. digit_5 - Sends Digit5 key

  53. digit_6 - Sends Digit6 key

  54. digit_7 - Sends Digit7 key

  55. digit_8 - Sends Digit8 key

  56. digit_9 - Sends Digit9 key

    TV channels:

  57. set_channel - Turns a specified channel on. Requires a valid --body argument, see the API reference to get it.

  58. list_channels - Returns channel list

  59. list_favorite - Returns favorite list

    Ambilight:

  60. ambilight_on - Turns ambilight on

  61. ambilight_off - Turns ambilight off

  62. ambihue_status - Returns the current status of 'Ambilight + Hue'

  63. ambihue_on - Turns 'Ambilight + Hue' on

  64. ambihue_off - Turns 'Ambilight + Hue' off

  65. ambilight_color - Sets ambilight color (in HSB format). Requires a valid --body argument: {"hue": 360, "saturation": 100, "brightness": 255}

  66. ambilight_brightness - Sets ambilight brightness. Requires a valid --body argument: {"value": 10}

  67. ambilight_video_immersive - Sets Ambilight to 'Follow video' (Immersive)

  68. ambilight_video_standard - Sets Ambilight to 'Follow video' (Standard)

  69. ambilight_video_natural - Sets Ambilight to 'Follow video' (Natural)

  70. ambilight_video_vivid - Sets Ambilight to 'Follow video' (Vivid)

  71. ambilight_video_game - Sets Ambilight to 'Follow video' (Game)

  72. ambilight_video_comfort - Sets Ambilight to 'Follow video' (Comfort)

  73. ambilight_video_relax - Sets Ambilight to 'Follow video' (Relax)

  74. ambilight_color_hot_lava - Sets Ambilight to 'Follow color' (Hot lava)

  75. ambilight_color_warm_white - Sets Ambilight to 'Follow color' (Warm white)

  76. ambilight_color_cool_white - Sets Ambilight to 'Follow color' (Cool white)

  77. ambilight_color_fresh_nature - Sets Ambilight to 'Follow color' (Fresh nature)

  78. ambilight_deep_water - Sets Ambilight to 'Follow color' (Deep water)

  79. ambilight_audio_adapt_brightness - Sets Ambilight to 'Follow audio' (Energy Adaptive Brightness)

  80. ambilight_audio_adapt_colors - Sets Ambilight to 'Follow audio' (Energy Adaptive Colors)

  81. ambilight_audio_vu_meter - Sets Ambilight to 'Follow audio' (VU Meter)

  82. ambilight_audio_spectrum - Sets Ambilight to 'Follow audio' (Spectrum Analyzer)

  83. ambilight_audio_knight_rider_1 - Sets Ambilight to 'Follow audio' (Knight Rider Clockwise)

  84. ambilight_audio_knight_rider_2 - Sets Ambilight to 'Follow audio' (Knight Rider Alternating)

  85. ambilight_audio_flash - Sets Ambilight to 'Follow audio' (Random Pixel Flash)

  86. ambilight_audio_strobo - Sets Ambilight to 'Follow audio' (Stroboscope)

  87. ambilight_audio_party - Sets Ambilight to 'Follow audio' (Party)

  88. ambilight_audio_random - Sets Ambilight to 'Follow audio' (Random Mode)

    Other:

  89. launch_app - Launches an app (Android TVs only). Requires a valid --body argument. See the API reference to get a list of installed apps, find your app in this list and use it as a --body argument.

  90. power_on - Turns on the TV even if it's in a deep sleep mode. You might need to run allow_power_on first, although it was not needed for me.

  91. allow_power_on - Allows to remotely power on the TV via chromecast requests.

  92. google_assistant - Allows to pass requests to Google Assistant if your model supports it. Requires a --body argument containing a query with the command that you want to pass to Google Assistant. See example below.

Examples of using the built-in commands:

Send Stop key:

python3 pylips.py --host %TV's_ip_address% --user %username% --pass %password% --command stop

Turn Ambilight on:

python3 pylips.py --host %TV's_ip_address% --user %username% --pass %password% --command ambilight_on

Launch YouTube:

python3 pylips.py --host %TV's_ip_address% --user %username% --pass %password% --command launch_app --body '{"id":"com.google.android.apps.youtube.tv.activity.ShellActivity-com.google.android.youtube.tv","order":0,"intent":{"action":"Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 pkg=com.google.android.youtube.tv cmp=com.google.android.youtube.tv/com.google.android.apps.youtube.tv.activity.ShellActivity }","component":{"packageName":"com.google.android.youtube.tv","className":"com.google.android.apps.youtube.tv.activity.ShellActivity"}},"label":"YouTube"}'

Launch Netflix:

python3 pylips.py --host %TV's_ip_address% --user %username% --pass %password% --command launch_app --body '{"label":"Netflix","intent":{"component":{"packageName":"com.netflix.ninja","className":"com.netflix.ninja.MainActivity"},"action":"Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 pkg=com.netflix.ninja cmp=com.netflix.ninja/.MainActivity }"},"order":0,"id":"com.netflix.ninja.MainActivity-com.netflix.ninja","type":"app"}'

Launch Amazon Prime Video:

python3 pylips.py --host %TV's_ip_address% --user %username% --pass %password% --command launch_app --body '{"id":"com.amazon.amazonvideo.livingroom","order":0,"intent":{"action":"Intent{act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 pkg=com.amazon.amazonvideo.livingroom }","component":{"packageName":"com.amazon.amazonvideo.livingroom","className":"com.amazon.ignition.IgnitionActivity"}},"label":"Prime Video"}'

Launch Kodi:

python3 pylips.py --host %TV's_ip_address% --user %username% --pass %password% --command launch_app --body '{"id":"org.xbmc.kodi","order":0,"intent":{"action":"Intent{act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 pkg=org.xbmc.kodi }","component":{"packageName":"org.xbmc.kodi","className":"org.xbmc.kodi.Splash"}},"label":"Kodi"}'

Switch input to HDMI 1 using a built-in command (requires Google Assistant):

python3 pylips.py --host %TV's_ip_address% --user %username% --pass %password% --command input_hdmi_1

Switch input to any source (for example, SCART) using Google Assistant directly:

python3 pylips.py --host %TV's_ip_address% --user %username% --pass %password% --command google_assistant --body '{"query":"SCART"}'

Control connected lights in your house using Google Assistant:

python3 pylips.py --host %TV's_ip_address% --user %username% --pass %password% --command google_assistant --body '{"query":"Turn on lights"}'

Custom commands

The tools exposes two general commands to talk to the TV's API: get (sends GET request and gets back some data like ambilight mode) and post (sends POST request that posts some data and changes something in the TV - like turning the ambilight off). You can also add custom commands to available_commands.json.

Read the API reference first to understand available endpoints and how to use them. There are some unexpected things like:

  • Pairing process returns objects like '{"error_id":"SUCCESS"}' (why, Philips?!)
  • Using strings like 'On'/'Off' for boolean variables (really, Philips?!)
  • API returns 'Nodeid' for some GET requests, while expecting 'nodeid' for POST requests (come on, Philips has to do it all on purpose, right? Right?)

Get method:

To use the get method you need to provide a path to the required endpoint with a --path argument. For example, this will send a get request to the system endpoint (https://yourIP:1926/6/system):

python3 pylips.py --host %TV's_ip_address% --user %username% --pass %password% --command get --path system

Post method:

To use the post method you need to provide a path to the required endpoint with a --path argument and the body of your POST request with a --body argument. For example, this will send a post request to the menuitems/settings/current endpoint with a body that will get back the status of 'Ambilight + Hue' (notice that the --body argument needs to come inside the quotes for UNIX systems):

python3 pylips.py --host %TV's_ip_address% --user %username% --pass %password% --command post --path menuitems/settings/current --body '{"nodes":[{"nodeid":2131230774}]}'

For Windows systems:

python3 pylips.py --host %TV's_ip_address% --user %username% --pass %password% --command post --path menuitems/settings/current --body ^"{^"^"nodes^"^":[{^"^"nodeid^"^":2131230774}]}^"

Controlling the TV (MQTT mode)

Pylips can connect to your MQTT broker to listen for commands and to publish TV status updates.

Edit the settings.ini according to your config and simply run python3 pylips.py without any arguments to run in MQTT mode.

Enabling MQTT_listen in settings.ini will allow you to send commands to a topic specified in topic_pylips by posting a JSON message. This works pretty much the same as sending manual commands: your arguments become keys and their values - values of these keys. You can send any commands (POST, GET and built-in), but you won't get anything in return since you are just publishing a message over MQTT. Useful for POST commands that change the state of your TV, but for general GET requests you are better off using the manual mode.

See examples:

# Let's say we want to change the brightness of ambilight to max (10):

# BUILT-IN COMMANDS

# Manual mode: 
python3 pylips.py --command ambilight_brightness --body '{"value":10}'

# MQTT mode: 
{"command":"ambilight_brightness", "body":{"value":10}} 


# POST REQUESTS

# Manual mode: 
python3 pylips.py --command post --path 'menuitems/settings/update' --body '{"values":[{"value":{"Nodeid":2131230769,"Controllable":"true", "Available":"true", "string_id":"Brightness", "data":{"value":10}}}]}'

# MQTT mode: 
{"command":"post", "path": "menuitems/settings/update", "body": {"values":[{"value":{"Nodeid":2131230769,"Controllable":"true", "Available":"true","string_id":"Brightness", "data":{"value":10}}}]}}
 

Enabling MQTT_update in settings.ini will publish status updates to topic_status like these:

{"powerstate": "On", "volume": 28, "muted": false, "cur_app": "org.droidtv.settings", "ambilight": {"styleName": "FOLLOW_VIDEO", "isExpert": false, "menuSetting": "IMMERSIVE"}, "ambihue": false}
{"powerstate": "On", "volume": 28, "muted": false, "cur_app": {"app": "TV", "channel": {"channel": {"ccid": 644, "preset": "15", "name": "Comedy Central HD"}, "channelList": {"id": "allcab", "version": "19"}}}, "ambilight": {"styleName": "OFF", "isExpert": false}, "ambihue": false}

API reference

The TV's API is roughly based on JointSpace with a current version of 6.2. The only available official documentation that I was able to find is for JointSpace version 1, which is incredibly outdated.

Since no official API documentation is available, I've decided to collect and document to the best of my knowledge all endpoints that are working in API version 6+ (Philips TVs 2016-2018). Most of them should also work for API version 5 (2015 TVs). This API reference is based on:

  • Official JointSpace documentation
  • Community endpoints (various endpoints discovered by the community over the years)
  • Endpoints discovered by using a man-in-the-middle attack on an iPhone running an official Philips TV remote app (this finally allowed to discover an endpoint responsible for toggling 'Ambilight + Hue' mode among other things)

All endpoints in API reference are tested and fully working unless explicitly marked otherwise. Any comments, new endpoints and fixes to the API reference are incredibly welcome.

The API reference.

Switching input sources

The current version of the API does not allow switching input sources anymore. If your TV has Android, you have several options to switch sources:

  1. If your TV supports Google Assistant, you can either use built-in commands in Pylips (input_hdmi_x) or use google_assistant. In both cases Pylips will send a local request to the Google Assistant running on the TV, which in turn will handle switching the input.
  2. For some models sending keys like F1, F2, etc. allow to switch sources. You can use adb to send these key events to your TV or use this wrapper.
  3. Using adb you can also switch the sources directly. See the example below, the last digit in HdmiService%2FHW9 indicates an input source (for me HdmiService%2FHW9 is HDMI 2 and HdmiService%2FHW10 is HDMI 1).
adb shell am start -a android.intent.action.VIEW -d content://android.media.tv/passthrough/org.droidtv.hdmiService%2F.HdmiService%2FHW9 -n org.droidtv.zapster/.playtv.activity.PlayTvActivity -f 0x10000000

Change log

1.3.2 - 2021-01-30

Fixed

  • Pylips now won't crash on older models (API version 1; most of the commands will work but not all)

1.3.1 - 2021-01-17

Changed

  • API documention moved from the wiki to the repo. Please feel free to send PRs with improvements!

Fixed

  • Malformed JSON in MQTT commands is now properly handled
  • Improved error handling in API version discovery process

1.3.0 - 2020-12-13

Added

  • google_assistant command to send queries to Google Assistant running on the TV. Check updated examples to see how you can use it.
  • input_hdmi_1, input_hdmi_2, input_hdmi_3, input_hdmi_4 commands to switch input sources (requires Google Assistant).

Fixed

  • Improved handling of Ambilight + Hue feature, hopefully it should now work correctly for all models. Thank you all for the provided feedback and especially @Mr-Groch.
  • Verbose option is now properly respected in all modes.

1.2.0 - 2020-02-28

Added

  • ambilight_color_hot_lava, ambilight_color_warm_white, ambilight_color_cool_white, ambilight_color_fresh_nature, ambilight_color_deep_water commands

1.1.1 - 2020-02-20

Fixed

  • MQTT payload encoded with utf8 is now correctly decoded. Thx @popy2k14!

1.1.0 - 2020-01-12

Added

  • Remote power_on command that works even from sleep mode. Should work for all Android TVs, not sure about other models. Thx @neophob!

Fixed

  • Paths issue when running outside Pylips folder on Windows systems

Changed

  • SSL session is now being reused to help with API stoping to respond
  • Pycryptodome instead of the outdated pycrypto dependency

1.0.11 - 2019-11-27

Added

  • Custom settings file support

1.0.10 - 2019-10-27

Changed

  • Improved response handling in MQTT

1.0.9 - 2019-07-30

Fixed

  • Fixed a bug in MQTT loop

1.0.8 - 2019-06-11

Fixed

  • Fixed an edge case when a combination of certain parameters broke the tool (MQTT_listen = True + MQTT_update = False)

Added

  • Add support for custom certificates (MQTT mode)

1.0.7 - 2019-05-22

Fixed

  • Got my hands on some non-android TVs, fixed some small bugs in pairing/sending commands

1.0.6 - 2019-05-12

Fixed

  • Fixed ambilight_brightness command (manual mode)

1.0.5 - 2019-05-05

Fixed

  • Fixed launch_app command

1.0.4 - 2019-04-29

Fixed

  • Fixed a broken check for path and body arguments in MQTT mode

1.0.3 - 2019-04-28

Fixed

  • Fixed a bug that broke some POST requests

1.0.2 - 2019-04-27

Changed

  • Relative paths => absolute paths so it plays nice with tools like crontab

1.0.1 - 2019-04-25

Changed

  • Fixed a bug in pairing (Android TVs)
  • Changed power_on to powerstate in TV status, so now we support "Standby" and possibly other modes (MQTT-only)

1.0.0 - 2019-04-21

Changed

  • Most of the app was rewritten, but it's backward-compatible with previous versions.
  • Pylips is now a Python class so you can potentially integrate it with your other projects

Added

  • Config file so you don't have to pass the same parameters every time
  • Automatic discovery of your TV's API version, port and protocol
  • Automatic pairing for Android TVs
  • Support for API version 5 + any newer versions should also work (unless Philips breaks something in the future versions of the API)
  • MQTT listener: send commands to Pylips over MQTT
  • MQTT updater: Pylips can listen for TV status updates and send them over MQTT
  • Extend built-in commands (set ambilight color, set ambilight brightness, get current volume, get current app)
  • Move built-in commands to a separate JSON file

0.4 - 2019-01-28

Added

  • Expand built-in commands (set/get TV channel and launch apps)
  • Add --verbose option

0.3 - 2018-12-31

Added

  • Non-Android Philips TVs are now also supported

0.2 - 2018-12-30

Added

  • All TV remote key commands are now built-in
  • Add change log to README

0.1 - 2018-12-26

Initial release

TO-DO

1. Finish documenting and testing all available API endpoints (January 2019) DONE

2. Increase number of built-in commands DONE

3. Improve error handling when sending requests DONE

4. User-friendly way of changing Ambilight colors DONE

5. Move settings to a config file DONE

6. MQTT server support DONE

7. Home assistant integration CANCELLED: not needed since you can now integrate it with MQTT sensors/switches.

At this point I consider the tool to be completed. No new functionality is planned, but I will fix any reported bugs and add any missing API endpoints/commands. Open an issue with your problem/suggestions.

Acknowledgements

  1. TV pairing mechanism as well as the inspiration for this tool come from @suborb's brilliant repo.
  2. This tool was also inspired by @arzzen's CLI tool.
  3. @jomwells did a pretty good job of collecting various ambilight endpoints.
  4. Some good info from @marcelrv.

Contact details

Email: [email protected]; LinkedIn: https://www.linkedin.com/in/evgeny-slavnov/

pylips's People

Contributors

elupus avatar eslavnov avatar fezvrasta avatar popy2k14 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pylips's Issues

[FEAT]Additional API calls

I have been investigating controlling the TV and have discovered some extra API calls that are not in the list.
On later models the tv uses API 6 so most calls are proceeded by this. i.e.
http://:1925/6/[API call]
http://:1925/6/system

It seems the /system call will return valid data when called with either /1/ or /6/ - presumably so the actual API can be determined from the returned JSON.

Here are the GET calls I have found.
Get the channel logo for a channel from its ccid number. Returns a png image if there is one or a 404 not found if no logo is available.
/6/channeldb/tv/channelLists/allcab//logo

Get the list of favorite channels took a while to resolve as it is different to the description in the api
/6/channeldb/tv/favoriteLists/favcab
Returns a json with the ccid number and preset number. Preset number is the channels position in the favorites list. For some reason it starts from 2 and not 1. favcab is the id from the favoriteLists entry from the /6/channeldb/tv call.

There are various calls that return xml files for dmr (Media Rendering?) There are not prefixed with the API version and are on http port 2870.
/dmr.xml
/dmr_avts.xml
/dmr_cms.xml

Some POST calls
/control/ConnectionManager
/control/AVTransport
These are SOAP calls and needs a SOAP payload.

ambilight_color - SAPHI OS - Wrong body parameters

ambilight_color - Sets ambilight color. Requires a valid --body argument: {"hue": 360, "saturation": 100,

Can you check what is the body parameters for Saphi OS? This is one of the commands that don't work, because it have the wrong body. The method ambilight_color exists.

[FEAT] Support non-Android models

Is your feature request related to a problem? Please describe.
The tool does not support non-Android Philips TVs.

Describe the solution you'd like
It seems that non-Android Philips TVs use a slightly different API:

  • Pairing does not need a PIN - confirmed
  • Endpoints and requests work somewhat differently - testing in progress
  • API version seems to be 6.1 as opposed to 6.2 (Android) (?) - debunked, look for a pairing_type in system instead. Both 6.1 and 6.2 can require pairing

I don't own such a TV so I rely on other people to help me with mapping this version of the API. Once the traffic is captured and analyzed, the tool needs to be updated to support non-Android Philips TVs.

If you have a non-Android Philips TV (2016+) please reply to this issue to help me with testing it!

[BUG] It is Philips 49PUS7150 (2015) supported?

Hi ,
It is supported Philips 49PUS7150 (late 2015) Android TV 5.1?
Because python not running.

ntb@ntb:~/Plocha/pylips-master$ python pylips.py
  File "pylips.py", line 42
    return print("Config file", ini_file, "not found")
               ^
SyntaxError: invalid syntax

[BUG] Exits immediately although mqtt is configured

Describe the bug
Pylips does not listen to MQTT packages because it exits right after the user invoked the script.

To Reproduce
Configure MQTT support:

[DEFAULT]
mqtt_listen = True
mqtt_update = False
[...]
[MQTT]
topic_pylips = pylips
topic_status = pylibs_status
  1. Launch pylips with python3.7 pylips.py
  2. Process starts and immediately exits again, no listening for mqtt is happening.

Expected behavior
Have pylips running in the foreground (or even better background) listening to mqtt packages and running the commands.

Screenshots
n/a

Additional context
n/a

[BUG] MQTT never goes to "update" loop

Describe the bug
When running in mqtt mode, the program never goes to the update loop, eventhough mqtt_update is set to true

To Reproduce
Steps to reproduce the behavior:

  1. set mqtt_update = true
  2. python ./pylips.py
  3. "Started MQTT status updater" message never appears

Expected behavior
To update the mqtt broker and display verbose info regarding this

Screenshots

Additional context

It seems like

self.mqtt.loop_forever()

will do a blocking loop, meaning that i will never start the updater, instead i propose to use:
self.mqtt.loop_start(), since it will run in its own thread, and allow for the updater to run, this function also handles reconnects.

Unknown API on 50PUS7394

"IP 192.168.0.223 is online, but no known API is found. Exiting..."

If its something you're interested in sorting and I can help let me know

[BUG] pylips with set apiv is slow compared to curl

Describe the bug
pylips with correct set apiv (6) is slow compared to bare metal curl.
See results meassured with time:

time curl -X POST --digest --insecure -v -u USER:PW -d '{"key":"VolumeUp"}' https://192.168.0.XXX:1926/6/input/key

Result:


real    0m0.278s
user    0m0.132s
sys     0m0.030s

and here pylips witzh teh same request:

time python3 pylips.py --command volume_up
Sending POST request to https://192.168.0.7:1926/6/input/key
Request sent!
{"response": "OK"}

real    0m1.082s
user    0m0.903s
sys     0m0.056s

To Reproduce
see above

Expected behavior
pylips is as fast as curl

Additional context
Maybe pathon3 is the overhead here?
Is there anything i can try to debug the issue?

[FEAT] Screen off (not Power off)

I want to toggle "Screen off" but can't figure it out.

Using GET on http://ip-address:1926/6/menuitems/settings/structure gave me:

{"node":{"node_id":2131230753,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_VB_SETUP","context":"Setup_Menu","data":{"nodes":[{"node_id":2131230841,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_PICTURE","context":"picture","data":{"nodes":[{"node_id":2131230842,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PICTURE_STYLE","context":"picture_style","data":{"enums":[{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PERSONAL"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_VIVID"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_NATURAL"},{"enum_id":4,"string_id":"org.droidtv.ui.strings.R.string.MAIN_STANDARD","icon":"org.droidtv.ui.tvwidget2k15.R.drawable.eco_16x12_146"},{"enum_id":5,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MOVIE"},{"enum_id":6,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GAME"},{"enum_id":14,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MONITOR"},{"enum_id":13,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HDR_PERSONAL"},{"enum_id":9,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HDR_VIVID"},{"enum_id":20,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HDR_DOLBY_VISION_BRIGHT"},{"enum_id":21,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HDR_DOLBY_VISION_DARK"},{"enum_id":10,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HDR_NATURAL"},{"enum_id":11,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HDR_MOVIE"},{"enum_id":12,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HDR_GAME"},{"enum_id":7,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ISF_DAY","icon":"org.droidtv.ui.tvwidget2k15.R.drawable.isf_16x12_250"},{"enum_id":8,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ISF_NIGHT","icon":"org.droidtv.ui.tvwidget2k15.R.drawable.isf_16x12_250"}]},"type":"LIST_NODE"},{"node_id":2131230843,"string_id":"org.droidtv.ui.strings.R.string.MAIN_COLOUR","context":"colour","data":{"slider_data":{"min":0,"max":100,"step_size":1}},"type":"SLIDER_NODE"},{"node_id":2131230844,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CONTRAST","context":"contrast","data":{"slider_data":{"min":0,"max":100,"step_size":1}},"type":"SLIDER_NODE"},{"node_id":2131230845,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SHARPNESS","context":"sharpness","data":{"slider_data":{"min":0,"max":10,"step_size":1}},"type":"SLIDER_NODE"},{"node_id":2131230846,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BRIGHTNESS","context":"brightness","data":{"slider_data":{"min":0,"max":100,"step_size":1}},"type":"SLIDER_NODE"},{"node_id":2131230908,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MISC_3D","context":"3d","data":{"nodes":[{"node_id":2131230909,"string_id":"org.droidtv.ui.strings.R.string.MAIN_VB_3D_FORMAT","context":"3d_format","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MISC_2D"},{"enum_id":17,"string_id":"org.droidtv.ui.strings.R.string.MISC_3D"},{"enum_id":9,"string_id":"org.droidtv.ui.strings.R.string.MAIN_3D_2D_TO_3D_CONVERSION"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_3D_SIDE_BY_SIDE"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_3D_TOP_BOTTOM"},{"enum_id":7,"string_id":"org.droidtv.ui.strings.R.string.MAIN_3D_SIDE_BY_SIDE_INVERTED"},{"enum_id":8,"string_id":"org.droidtv.ui.strings.R.string.MAIN_3D_TOP_BOTTOM_INVERTED"}]},"type":"LIST_NODE"},{"node_id":2131230910,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GAMING","context":"gaming","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GAMING_MODE"},{"enum_id":101,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SIDE_BY_SIDE_GAMING"},{"enum_id":102,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TOP_BOTTOM_GAMING"}]},"type":"LIST_NODE"},{"node_id":2131230911,"string_id":"org.droidtv.ui.strings.R.string.MAIN_3D_EXPERIENCE","context":"3d_experience","data":{"enums":[{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FLICKER_FREE"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MAXIMUM_CLARITY"}]},"type":"LIST_NODE"},{"node_id":2131230912,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AUTO_3D","context":"switch_to_3d","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AUTO_3D_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AUTO_3D_NOTIFICATION_ONLY"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AUTO_3D_ON"}]},"type":"LIST_NODE"}]}},{"node_id":2131230847,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_ADVANCED_PICTURE","context":"advanced_picture","data":{"nodes":[{"node_id":2131230848,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_COLOUR","context":"colour_menu","data":{"nodes":[{"node_id":2131230849,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TINT_HUE","context":"tint","data":{"slider_data":{"min":-50,"max":50,"step_size":1}},"type":"SLIDER_NODE"},{"node_id":2131230850,"string_id":"org.droidtv.ui.strings.R.string.MAIN_COLOUR_ENHANCEMENT","context":"colour_enhancement","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MINIMUM"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MEDIUM"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MAXIMUM"}]},"type":"LIST_NODE"},{"node_id":2131230851,"string_id":"org.droidtv.ui.strings.R.string.MAIN_COLOUR_GAMUT","context":"colour_gamut","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_NORMAL"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_WIDE"}]},"type":"LIST_NODE"},{"node_id":2131230852,"string_id":"org.droidtv.ui.strings.R.string.MAIN_COLOUR_TEMPERATURE","context":"colour_temperature","data":{"enums":[{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_NORMAL"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_WARM"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_COOL"},{"enum_id":4,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CUSTOM"}]},"type":"LIST_NODE"},{"node_id":2131230853,"string_id":"org.droidtv.ui.strings.R.string.MAIN_WHITEPOINT_ALIGNMENT","context":"whitepoint_alignment_item","data":{"sliders":[{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_MS_RED_WP","slider_data":{"min":0,"max":127,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_MS_GREEN_WP","slider_data":{"min":0,"max":127,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_MS_BLUE_WP","slider_data":{"min":0,"max":127,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_MS_RED_BL","slider_data":{"min":-7,"max":8,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_MS_GREEN_BL","slider_data":{"min":-7,"max":8,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_MS_BLUE_BL","slider_data":{"min":-7,"max":8,"step_size":1}}]},"type":"MULTIPLE_SLIDER"},{"node_id":2131230854,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_WHITEPOINT_ALIGNMENT","context":"whitepoint_alignment_menu","data":{"nodes":[{"node_id":2131230855,"string_id":"org.droidtv.ui.strings.R.string.MAIN_WHITEPOINT_ALIGNMENT_2POINT","context":"whitepoint_alignment","data":{"sliders":[{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_MS_RED_WP","slider_data":{"min":0,"max":127,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_MS_GREEN_WP","slider_data":{"min":0,"max":127,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_MS_BLUE_WP","slider_data":{"min":0,"max":127,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_MS_RED_BL","slider_data":{"min":-7,"max":8,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_MS_GREEN_BL","slider_data":{"min":-7,"max":8,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_MS_BLUE_BL","slider_data":{"min":-7,"max":8,"step_size":1}}]},"type":"MULTIPLE_SLIDER"},{"node_id":2131230856,"string_id":"org.droidtv.ui.strings.R.string.MAIN_WHITEPOINT_ALIGNMENT_20POINT","context":"whitepoint_alignment","data":{"sliders":[{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_LEVEL","slider_data":{"min":1,"max":20,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_MS_RED_OFFSET","slider_data":{"min":-15,"max":15,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_MS_GREEN_OFFSET","slider_data":{"min":-15,"max":15,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_MS_BLUE_OFFSET","slider_data":{"min":-15,"max":15,"step_size":1}}]},"type":"MULTIPLE_SLIDER"}]}},{"node_id":2131230857,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_COLOUR_CONTROL","context":"colour_control","data":{"nodes":[{"node_id":2131230858,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MS_RED","context":"colour_control","data":{"sliders":[{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_HUE","slider_data":{"min":-15,"max":15,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_SATURATION","slider_data":{"min":-15,"max":15,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_INTENSITY","slider_data":{"min":-15,"max":15,"step_size":1}}]},"type":"MULTIPLE_SLIDER"},{"node_id":2131230859,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MS_YELLOW","context":"colour_control","data":{"sliders":[{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_HUE","slider_data":{"min":-15,"max":15,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_SATURATION","slider_data":{"min":-15,"max":15,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_INTENSITY","slider_data":{"min":-15,"max":15,"step_size":1}}]},"type":"MULTIPLE_SLIDER"},{"node_id":2131230860,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MS_GREEN","context":"colour_control","data":{"sliders":[{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_HUE","slider_data":{"min":-15,"max":15,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_SATURATION","slider_data":{"min":-15,"max":15,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_INTENSITY","slider_data":{"min":-15,"max":15,"step_size":1}}]},"type":"MULTIPLE_SLIDER"},{"node_id":2131230861,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MS_CYAN","context":"colour_control","data":{"sliders":[{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_HUE","slider_data":{"min":-15,"max":15,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_SATURATION","slider_data":{"min":-15,"max":15,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_INTENSITY","slider_data":{"min":-15,"max":15,"step_size":1}}]},"type":"MULTIPLE_SLIDER"},{"node_id":2131230862,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MS_BLUE","context":"colour_control","data":{"sliders":[{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_HUE","slider_data":{"min":-15,"max":15,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_SATURATION","slider_data":{"min":-15,"max":15,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_INTENSITY","slider_data":{"min":-15,"max":15,"step_size":1}}]},"type":"MULTIPLE_SLIDER"},{"node_id":2131230863,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MS_MAGENTA","context":"colour_control","data":{"sliders":[{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_HUE","slider_data":{"min":-15,"max":15,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_SATURATION","slider_data":{"min":-15,"max":15,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_INTENSITY","slider_data":{"min":-15,"max":15,"step_size":1}}]},"type":"MULTIPLE_SLIDER"},{"node_id":2131230864,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_RESET_ALL","context":"reset_all","data":{}}]}},{"node_id":2131230865,"string_id":"org.droidtv.ui.strings.R.string.MAIN_RGB_ONLY_MODE","context":"rgb_only_mode","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_RED"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GREEN"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BLUE"}]},"type":"LIST_NODE"}]}},{"node_id":2131230866,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_CONTRAST_MENU","context":"contrast_menu","data":{"nodes":[{"node_id":2131230867,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CONTRAST_MODE","context":"contrast_modes","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_NORMAL"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OPTMIZED_FOR_PICTURE"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OPTMIZED_FOR_ENERGY_SAVING"}]},"type":"LIST_NODE"},{"node_id":2131230868,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HDR_UPSCALING","context":"hdr_upscaling","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230869,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PNR","context":"perfect_natural_reality","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MINIMUM"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MEDIUM"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MAXIMUM"}]},"type":"LIST_NODE"},{"node_id":2131230870,"context":"hd_ultra_hdr","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MINIMUM"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MEDIUM"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MAXIMUM"},{"enum_id":4,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AUTO_3D_ON"}]},"type":"LIST_NODE"},{"node_id":2131230871,"context":"perfect_contrast","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MINIMUM"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MEDIUM"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MAXIMUM"}]},"type":"LIST_NODE"},{"node_id":2131230872,"context":"video_contrast","data":{"slider_data":{"min":0,"max":100,"step_size":1}},"type":"SLIDER_NODE"},{"node_id":2131230873,"string_id":"org.droidtv.ui.strings.R.string.MAIN_LIGHT_SENSOR","context":"light_sensor","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230874,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GAMMA","context":"gamma","data":{"slider_data":{"min":-4,"max":4,"step_size":1}},"type":"SLIDER_NODE"}]}},{"node_id":2131230875,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_SHARPNESS","context":"sharpness_menu","data":{"nodes":[{"node_id":2131230876,"context":"super_resolution","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"}]}},{"node_id":2131230877,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_PICTURE_CLEAN","context":"picture_clean_menu","data":{"nodes":[{"node_id":2131230878,"string_id":"org.droidtv.ui.strings.R.string.MAIN_NOISE_REDUCTION","context":"noise_reduction","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MINIMUM"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MEDIUM"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MAXIMUM"}]},"type":"LIST_NODE"},{"node_id":2131230879,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MPEG_ARTEFACT_REDUCTION","context":"mpeg_artefact_reduction","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MINIMUM"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MEDIUM"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MAXIMUM"}]},"type":"LIST_NODE"}]}},{"node_id":2131230880,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_MOTION_MENU","context":"motion_menu","data":{"nodes":[{"node_id":2131230881,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MOTION_STYLE","context":"motion_style","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MOVIE"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SPORTS"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_STANDARD"},{"enum_id":4,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SMOOTH"},{"enum_id":5,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PERSONAL"}]},"type":"LIST_NODE"},{"node_id":2131230882,"context":"hd_natural_motion","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MINIMUM"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MEDIUM"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MAXIMUM"}]},"type":"LIST_NODE"},{"node_id":2131230883,"string_id":"org.droidtv.ui.strings.R.string.MISC_PERFECT_CLEAN_MOTION","context":"clear_lcd","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MINIMUM"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MEDIUM"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MAXIMUM"}]},"type":"LIST_NODE"}]}},{"node_id":2131230884,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_CLEAR_IMAGE_RESIDUAL","context":"clear_image_residual","data":{}}]}},{"node_id":2131230885,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_PICTURE_FORMAT","context":"picture_format","data":{}},{"node_id":2131230886,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DOLBY_VISION_NOTIFICATION","context":"dolby_vision_notification","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230887,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_QUICK_PICTURE_SETTINGS","context":"quick_picture_settings","data":{}}]}},{"node_id":2131230888,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_SOUND","context":"sound","data":{"nodes":[{"node_id":2131230889,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SOUND_STYLE","context":"sound_style","data":{"enums":[]},"type":"LIST_NODE"},{"node_id":2131230890,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SOUND_STYLE","context":"sound_style","data":{"enums":[]},"type":"LIST_NODE"},{"node_id":2131230891,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HEADPHONE_VOLUME","context":"headphones_volume","data":{"slider_data":{"min":0,"max":60,"step_size":1}},"type":"SLIDER_NODE"},{"node_id":2131230892,"type":"PARENT_NODE","context":"sound_expert_mode","data":{"nodes":[{"node_id":2131230893,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SPEAKER_VIRTUALIZER","context":"personal_dolby_atmos","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DOLBY_ATMOS_AUTO"}]},"type":"LIST_NODE"},{"node_id":2131230894,"string_id":"org.droidtv.ui.strings.R.string.MISC_CLEAR_DIALOGUE","context":"clear_dialogue","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230895,"string_id":"org.droidtv.ui.strings.R.string.MAIN_EQUALIZER","context":"expert_equalizer","data":{"sliders":[{"slider_id":"org.droidtv.ui.strings.R.string.MISC_100_HZ","slider_data":{"min":-8,"max":8,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MISC_300_HZ","slider_data":{"min":-8,"max":8,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MISC_1_KHZ","slider_data":{"min":-8,"max":8,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MISC_3_KHZ","slider_data":{"min":-8,"max":8,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MISC_10_KHZ","slider_data":{"min":-8,"max":8,"step_size":1}}]},"type":"MULTIPLE_SLIDER"}]}},{"node_id":2131230896,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TV_POSITION","context":"tv_placement","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_WALL_MOUNTED"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON_TV_STAND"}]},"type":"LIST_NODE"},{"node_id":2131230897,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_ADVANCED_SOUND","context":"advanced_sound","data":{"nodes":[{"node_id":2131230898,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AUTO_VOLUME","context":"auto_volume_leveling","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_NIGHT_MODE"}]},"type":"LIST_NODE"},{"node_id":2131230899,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DELTA_VOLUME","context":"DeltaVolume","data":{"slider_data":{"min":-12,"max":12,"step_size":1}},"type":"SLIDER_NODE"},{"node_id":2131230900,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AUDIO_OUT","context":"tv_speakers","data":{"enums":[]},"type":"LIST_NODE"},{"node_id":2131230901,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DIGITAL_OUTPUT_FORMAT","context":"digital_output_format","data":{"enums":[{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MULTICHANNEL"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.SPDIF_OUTPUT_3"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PCM"}]},"type":"LIST_NODE"},{"node_id":2131230902,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DIGITAL_OUTPUT_LEVEL","context":"digital_output_level","data":{"enums":[{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SPDIF_MORE"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SPDIF_MEDIUM"},{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SPDIF_LESS"}]},"type":"LIST_NODE"},{"node_id":2131230903,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AUDIO_OUT_DELAY","context":"audio_out_delay","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_NO_LATENCY"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_IN_LIPSYNC"}]},"type":"LIST_NODE"},{"node_id":2131230904,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AUDIO_OUT_OFFSET","context":"audio_out_offset","data":{"slider_data":{"min":0,"max":60,"step_size":5}},"type":"SLIDER_NODE"},{"node_id":2131230905,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SUBWOOFER_OUT","context":"subwoofer_out","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230906,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CENTRE_SPEAKER_VOLUME","context":"centre_speaker_volume","data":{"slider_data":{"min":-3,"max":3,"step_size":1}},"type":"SLIDER_NODE"},{"node_id":2131230907,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HEIGHT_SPEAKER_VOLUME","context":"height_speaker_volume","data":{"slider_data":{"min":-3,"max":3,"step_size":1}},"type":"SLIDER_NODE"}]}}]}},{"node_id":2131230765,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MISC_AMBILIGHT","context":"ambilight","data":{"nodes":[{"node_id":2131230766,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_AMBILIGHT_STYLE","context":"ambilight_style","data":{"nodes":[{"node_id":2131230767,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_AMBILIGHT_STYLE_OFF","context":"ambilight_off","data":{}},{"node_id":2131230768,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FOLLOW_VIDEO","context":"ambilight_follow_video","data":{"enums":[{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AMBILIGHT_STANDARD"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AMBILIGHT_NATURAL"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AMBILIGHT_FOOTBALL"},{"enum_id":4,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AMBILIGHT_VIVID"},{"enum_id":8,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AMBILIGHT_VIVID"},{"enum_id":5,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AMBILIGHT_GAME"},{"enum_id":6,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AMBILIGHT_COMFORT"},{"enum_id":7,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AMBILIGHT_RELAX"}]},"type":"LIST_NODE"},{"node_id":2131230769,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FOLLOW_AUDIO","context":"ambilight_follow_audio","data":{"enums":[{"enum_id":101,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FOLLOW_AUDIO_STYLE_1"},{"enum_id":102,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FOLLOW_AUDIO_STYLE_2"},{"enum_id":103,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FOLLOW_AUDIO_STYLE_3"},{"enum_id":104,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FOLLOW_AUDIO_STYLE_4"},{"enum_id":106,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FOLLOW_AUDIO_STYLE_5"},{"enum_id":107,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FOLLOW_AUDIO_STYLE_6"},{"enum_id":110,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FOLLOW_AUDIO_STYLE_7"}]},"type":"LIST_NODE"},{"node_id":2131230770,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FOLLOW_COLOUR","context":"ambilight_follow_color","data":{"enums":[{"enum_id":201,"string_id":"org.droidtv.ui.strings.R.string.MAIN_LOUNGE_LIGHT_MODE_2"},{"enum_id":202,"string_id":"org.droidtv.ui.strings.R.string.MAIN_LOUNGE_LIGHT_MODE_3"},{"enum_id":203,"string_id":"org.droidtv.ui.strings.R.string.MAIN_LOUNGE_LIGHT_MODE_1"},{"enum_id":207,"string_id":"org.droidtv.ui.strings.R.string.MAIN_WARM_WHITE"},{"enum_id":204,"string_id":"org.droidtv.ui.strings.R.string.MAIN_COOL_WHITE"}]},"type":"LIST_NODE"},{"node_id":2131230771,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_FOLLOW_FLAG","context":"ambilight_follow_flag","data":{}},{"node_id":2131230772,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_FOLLOW_APP","context":"ambilight_follow_app","data":{}}]}},{"node_id":2131230773,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AMBILIGHT_BRIGHTNESS","context":"ambilight_brightness","data":{"slider_data":{"min":0,"max":10,"step_size":1}},"type":"SLIDER_NODE"},{"node_id":2131230774,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BRIGHTNESS_BOTTOM_SIDE","context":"ambilight_brightness_bottom_side","data":{"slider_data":{"min":0,"max":10,"step_size":1}},"type":"SLIDER_NODE"},{"node_id":2131230775,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AMBILIGHT_SATURATION","context":"ambilight_saturation","data":{"slider_data":{"min":-2,"max":2,"step_size":1}},"type":"SLIDER_NODE"},{"node_id":2131230776,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_AMBILIGHT_PLUS_HUE","context":"ambilight_hue_menu","data":{"nodes":[{"node_id":2131230777,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_AMBILIGHT_HUE_CONFIGURE","context":"ambilight_hue_wizard","data":{}},{"node_id":2131230778,"context":"ambilight_hue_off","data":{},"type":"TOGGLE_NODE"},{"node_id":2131230779,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AMBILIGHT_HUE_FOLLOW_AMBILIGHT","context":"ambilight_hue_follow_ambilight","data":{"slider_data":{"min":0,"max":10,"step_size":1}},"type":"SLIDER_NODE"},{"node_id":2131230780,"string_id":"org.droidtv.ui.strings.R.string.MAIN_LOUNGE_LIGHT_HUE","context":"ambilight_lounge_light_hue","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230781,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_AMBILIGHT_HUE_STATUS","context":"ambilight_hue_status","data":{}},{"node_id":2131230782,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_AMBILIGHT_HUE_RESET","context":"ambilight_hue_reset_configuration","data":{}}]}},{"node_id":2131230783,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_ADVANCED_AMBILIGHT","context":"ambilight_advanced","data":{"nodes":[{"node_id":2131230784,"string_id":"org.droidtv.ui.strings.R.string.MAIN_WALL_COLOUR","context":"ambilight_wall_colour","data":{"colors":[-1,-1651276,-3342439,-3347201,-3355393,-13108,-6451,-103,-12566464,-3693173,-6565376,-10053121,-2982751,-33664,-81560,-256,-15724528,-7508135,-10452480,-15513423,-5293203,-1888983,-5682169,-26368]},"type":"WALL_COLOR_NODE"},{"node_id":2131230785,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TV_SWITCH_OFF","context":"ambilight_tv_switch_off","data":{"enums":[{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FADE_OUT"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_IMMEDIATE_SWITCH_OFF"}]},"type":"LIST_NODE"},{"node_id":2131230786,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ISF_TUNING","context":"ambilight_isf_tuning","data":{"sliders":[{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_MS_RED","slider_data":{"min":0,"max":100,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_MS_GREEN","slider_data":{"min":0,"max":100,"step_size":1}},{"slider_id":"org.droidtv.ui.strings.R.string.MAIN_MS_BLUE","slider_data":{"min":0,"max":100,"step_size":1}}]},"type":"MULTIPLE_SLIDER"}]}}]}},{"node_id":2131230814,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_ECO_SETTINGS","context":"eco_settings","data":{"nodes":[{"node_id":2131230815,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ENERGY_SAVING","context":"energy_saving","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MINIMUM"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MEDIUM"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MAXIMUM"}]},"type":"LIST_NODE"},{"node_id":2131230816,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_MUTE_SCREEN","context":"screen_off","data":{}},{"node_id":2131230817,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_LIGHT_SENSOR","context":"eco_settings_light_sensor","data":{}},{"node_id":2131230818,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AUTOMATIC_SWITCH_OFF","context":"switch_off_timer","data":{"slider_data":{"min":0,"max":240,"step_size":30}},"type":"SLIDER_NODE"}]}},{"node_id":2131230913,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_GENERAL_SETTINGS","context":"general_settings","data":{"nodes":[{"node_id":2131230914,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_USB_STORAGE","context":"usb_storage","data":{}},{"node_id":2131230915,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_USB_KEYBOARD_SETTINGS","context":"usb_keyboard_settings","data":{}},{"node_id":2131230916,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PHILIPS_WORDMARK","context":"philips_wordmark","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MINIMUM"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MEDIUM"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MAXIMUM"}]},"type":"LIST_NODE"},{"node_id":2131230917,"string_id":"org.droidtv.ui.strings.R.string.MAIN_LOCATION","context":"location","data":{"enums":[{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HOME"},{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SHOP"}]},"type":"LIST_NODE"},{"node_id":2131230918,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_VB_SHOP_CONFIGURATION","context":"shop_setup","data":{}},{"node_id":2131230919,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MISC_EASYLINK","context":"easylink_menu","data":{"nodes":[{"node_id":2131230920,"string_id":"org.droidtv.ui.strings.R.string.MISC_EASYLINK","context":"easylink","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230921,"string_id":"org.droidtv.ui.strings.R.string.MAIN_EASYLINK_REMOTE_CONTROL","context":"easylink_remote_control","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"}]}},{"node_id":2131230922,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MISC_HDMI_ULTRA_HD","context":"hdmi_ultra_hd","data":{"nodes":[{"node_id":2131230923,"string_id":"org.droidtv.ui.strings.R.string.MISC_HDMI1","context":"hdmi_ultra_hd","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_UHD_STANDARD_2K18"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_UHD_OPTIMAL_2K18"}]},"type":"LIST_NODE"},{"node_id":2131230924,"string_id":"org.droidtv.ui.strings.R.string.MISC_HDMI2","context":"hdmi_ultra_hd","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_UHD_STANDARD_2K18"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_UHD_OPTIMAL_2K18"}]},"type":"LIST_NODE"},{"node_id":2131230925,"string_id":"org.droidtv.ui.strings.R.string.MISC_HDMI3","context":"hdmi_ultra_hd","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_UHD_STANDARD_2K18"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_UHD_OPTIMAL_2K18"}]},"type":"LIST_NODE"},{"node_id":2131230926,"string_id":"org.droidtv.ui.strings.R.string.MISC_HDMI4","context":"hdmi_ultra_hd","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_UHD_STANDARD_2K18"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_UHD_OPTIMAL_2K18"}]},"type":"LIST_NODE"}]}},{"node_id":2131230927,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_HDMI_AUTO_GAME_MODE","context":"hdmi_auto_game_mode","data":{"nodes":[{"node_id":2131230928,"string_id":"org.droidtv.ui.strings.R.string.MISC_HDMI1","context":"hdmi_auto_game_mode","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230929,"string_id":"org.droidtv.ui.strings.R.string.MISC_HDMI2","context":"hdmi_auto_game_mode","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230930,"string_id":"org.droidtv.ui.strings.R.string.MISC_HDMI3","context":"hdmi_auto_game_mode","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230931,"string_id":"org.droidtv.ui.strings.R.string.MISC_HDMI4","context":"hdmi_auto_game_mode","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"}]}},{"node_id":2131230932,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_VIEWING_DATA","context":"viewing_data","data":{"nodes":[{"node_id":2131230933,"string_id":"org.droidtv.ui.strings.R.string.MAIN_VIEWING_DATA_SETTINGS","context":"viewing_data_settings","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230934,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_PRIVACY_POLICY","context":"privacy_policy","data":{}}]}},{"node_id":2131230935,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_ADVANCED_PICTURE","context":"advanced_general_settings","data":{"nodes":[{"node_id":2131230936,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AUTOMATIC_RECORDING","context":"auto_recording","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230937,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_HBBTV_SETTINGS","context":"hbbtv_settings","data":{"nodes":[{"node_id":2131230938,"string_id":"org.droidtv.ui.strings.R.string.MISC_HBB_TV","context":"hbbtv","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230939,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HBBTV_TRACK_USAGE","context":"hbbtv_track_usage","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230940,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HBBTV_COOKIES","context":"hbbtv_cookies","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230941,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_CLEAR_APPROVED_APP_LISTING","context":"hbbtv_clear_listing","data":{}}]}}]}},{"node_id":2131230942,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_FACTORY_SETTINGS","context":"factory_settings","data":{}},{"node_id":2131230943,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_REINSTALL_TV","context":"reinstall_tv","data":{}},{"node_id":2131230944,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.CAM_PROFILE_NAME","context":"CAM_profile_name","data":{}}]}},{"node_id":2131230819,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_REGION_AND_LANGUAGE","context":"region_languages","data":{"nodes":[{"node_id":2131230820,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_LANGUAGES","context":"languages","data":{"nodes":[{"node_id":2131230821,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MENU_LANGUAGE","context":"menu_language","data":{"enums":[{"enum_id":83,"string_id":"org.droidtv.ui.strings.R.string.MISC_AZERBAIJANI"},{"enum_id":48,"string_id":"org.droidtv.ui.strings.R.string.MISC_BAHASA_MELAYU"},{"enum_id":50,"string_id":"org.droidtv.ui.strings.R.string.MISC_INDONESIAN"},{"enum_id":37,"string_id":"org.droidtv.ui.strings.R.string.MISC_BULGARIAN"},{"enum_id":6,"string_id":"org.droidtv.ui.strings.R.string.MISC_CZECH"},{"enum_id":14,"string_id":"org.droidtv.ui.strings.R.string.MISC_DANISH"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MISC_GERMAN"},{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MISC_ENGLISH"},{"enum_id":5,"string_id":"org.droidtv.ui.strings.R.string.MISC_SPANISH"},{"enum_id":26,"string_id":"org.droidtv.ui.strings.R.string.MISC_ESTONIAN"},{"enum_id":10,"string_id":"org.droidtv.ui.strings.R.string.MISC_GREEK"},{"enum_id":4,"string_id":"org.droidtv.ui.strings.R.string.MISC_FRENCH"},{"enum_id":43,"string_id":"org.droidtv.ui.strings.R.string.MISC_IRISH"},{"enum_id":13,"string_id":"org.droidtv.ui.strings.R.string.MISC_CROATIAN"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MISC_ITALIAN"},{"enum_id":41,"string_id":"org.droidtv.ui.strings.R.string.MISC_KAZAKH"},{"enum_id":40,"string_id":"org.droidtv.ui.strings.R.string.MISC_LATVIAN"},{"enum_id":39,"string_id":"org.droidtv.ui.strings.R.string.MISC_LITHUANIAN"},{"enum_id":52,"string_id":"org.droidtv.ui.strings.R.string.MISC_MACEDONIAN"},{"enum_id":30,"string_id":"org.droidtv.ui.strings.R.string.MISC_HUNGARIAN"},{"enum_id":78,"string_id":"org.droidtv.ui.strings.R.string.MISC_MONGOLIAN"},{"enum_id":15,"string_id":"org.droidtv.ui.strings.R.string.MISC_DUTCH"},{"enum_id":19,"string_id":"org.droidtv.ui.strings.R.string.MISC_NORWEGIAN"},{"enum_id":7,"string_id":"org.droidtv.ui.strings.R.string.MISC_POLISH"},{"enum_id":20,"string_id":"org.droidtv.ui.strings.R.string.MISC_PORTUGUESE"},{"enum_id":36,"string_id":"org.droidtv.ui.strings.R.string.MISC_PORTUGUESE_BRAZILIAN"},{"enum_id":9,"string_id":"org.droidtv.ui.strings.R.string.MISC_RUSSIAN"},{"enum_id":25,"string_id":"org.droidtv.ui.strings.R.string.MISC_ROMANIAN"},{"enum_id":74,"string_id":"org.droidtv.ui.strings.R.string.MISC_ALBANIAN"},{"enum_id":21,"string_id":"org.droidtv.ui.strings.R.string.MISC_SERBIAN"},{"enum_id":22,"string_id":"org.droidtv.ui.strings.R.string.MISC_SLOVAK"},{"enum_id":23,"string_id":"org.droidtv.ui.strings.R.string.MISC_SLOVENIAN"},{"enum_id":16,"string_id":"org.droidtv.ui.strings.R.string.MISC_FINNISH"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MISC_SWEDISH"},{"enum_id":8,"string_id":"org.droidtv.ui.strings.R.string.MISC_TURKISH"},{"enum_id":51,"string_id":"org.droidtv.ui.strings.R.string.MISC_VIETNAMESE"},{"enum_id":27,"string_id":"org.droidtv.ui.strings.R.string.MISC_UKRAINIAN"},{"enum_id":49,"string_id":"org.droidtv.ui.strings.R.string.MISC_TRADITIONAL_CHINESE"},{"enum_id":34,"string_id":"org.droidtv.ui.strings.R.string.MISC_CHINESE"},{"enum_id":28,"string_id":"org.droidtv.ui.strings.R.string.MISC_ARABIC"},{"enum_id":29,"string_id":"org.droidtv.ui.strings.R.string.MISC_HEBREW"},{"enum_id":45,"string_id":"org.droidtv.ui.strings.R.string.MISC_THAI"},{"enum_id":58,"string_id":"org.droidtv.ui.strings.R.string.MISC_HINDI"},{"enum_id":79,"string_id":"org.droidtv.ui.strings.R.string.MISC_BENGALI"},{"enum_id":80,"string_id":"org.droidtv.ui.strings.R.string.MISC_TELUGU"},{"enum_id":81,"string_id":"org.droidtv.ui.strings.R.string.MISC_MARATHI"},{"enum_id":53,"string_id":"org.droidtv.ui.strings.R.string.MISC_TAMIL"},{"enum_id":82,"string_id":"org.droidtv.ui.strings.R.string.MISC_ARMENIAN"},{"enum_id":84,"string_id":"org.droidtv.ui.strings.R.string.MISC_GEORGIAN"}]},"type":"LIST_NODE"},{"node_id":2131230822,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PRIMARY_AUDIO","context":"primary_audio","data":{"enums":[{"enum_id":44,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ORIGINAL_LANGUAGE"},{"enum_id":74,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ALBANIAN_TRANSLATED"},{"enum_id":28,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ARABIC_TRANSLATED"},{"enum_id":48,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BAHASA_MELAYU_TRANSLATED"},{"enum_id":11,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BASQUE_TRANSLATED"},{"enum_id":37,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BULGARIAN_TRANSLATED"},{"enum_id":12,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CATALAN_TRANSLATED"},{"enum_id":34,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SIMPLIFIED_CHINESE_TRANSLATED"},{"enum_id":49,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CHINESE_TRANSLATED"},{"enum_id":61,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MANDARIN_TRANSLATED"},{"enum_id":76,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CANTONESE_TRANSLATED"},{"enum_id":13,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CROATIAN_TRANSLATED"},{"enum_id":6,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CZECH_TRANSLATED"},{"enum_id":14,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DANISH_TRANSLATED"},{"enum_id":15,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DUTCH_TRANSLATED"},{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ENGLISH_TRANSLATED"},{"enum_id":26,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ESTONIAN_TRANSLATED"},{"enum_id":16,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FINNISH_TRANSLATED"},{"enum_id":4,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FRENCH_TRANSLATED"},{"enum_id":17,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GAELIC_TRANSLATED"},{"enum_id":58,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HINDI_TRANSLATED"},{"enum_id":50,"string_id":"org.droidtv.ui.strings.R.string.MAIN_INDONESIAN_TRANSLATED"},{"enum_id":43,"string_id":"org.droidtv.ui.strings.R.string.MAIN_IRISH_TRANSLATED"},{"enum_id":18,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GALLEGAN_TRANSLATED"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GERMAN_TRANSLATED"},{"enum_id":10,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GREEK_TRANSLATED"},{"enum_id":29,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HEBREW_TRANSLATED"},{"enum_id":30,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HUNGARIAN_TRANSLATED"},{"enum_id":46,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ORIGINAL_AUDIO"},{"enum_id":59,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SECOND_AUDIO"},{"enum_id":60,"string_id":"org.droidtv.ui.strings.R.string.MAIN_THIRD_AUDIO"},{"enum_id":47,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MULTIPLE_LANGUAGES"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ITALIAN_TRANSLATED"},{"enum_id":57,"string_id":"org.droidtv.ui.strings.R.string.MAIN_JAPANESE_TRANSLATED"},{"enum_id":41,"string_id":"org.droidtv.ui.strings.R.string.MAIN_KAZAKH_TRANSLATED"},{"enum_id":55,"string_id":"org.droidtv.ui.strings.R.string.MAIN_KOREAN_TRANSLATED"},{"enum_id":40,"string_id":"org.droidtv.ui.strings.R.string.MAIN_LATVIAN_TRANSLATED"},{"enum_id":39,"string_id":"org.droidtv.ui.strings.R.string.MAIN_LITHUANIAN_TRANSLATED"},{"enum_id":52,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MACEDONIAN_TRANSLATED"},{"enum_id":54,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MAORI_TRANSLATED"},{"enum_id":19,"string_id":"org.droidtv.ui.strings.R.string.MAIN_NORWEGIAN_TRANSLATED"},{"enum_id":7,"string_id":"org.droidtv.ui.strings.R.string.MAIN_POLISH_TRANSLATED"},{"enum_id":20,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PORTUGUESE_TRANSLATED"},{"enum_id":25,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ROMANIAN_TRANSLATED"},{"enum_id":9,"string_id":"org.droidtv.ui.strings.R.string.MAIN_RUSSIAN_TRANSLATED"},{"enum_id":72,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SAMI_TRANSLATED"},{"enum_id":22,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SLOVAK_TRANSLATED"},{"enum_id":23,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SLOVENIAN_TRANSLATED"},{"enum_id":21,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SERBIAN_TRANSLATED"},{"enum_id":5,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SPANISH_TRANSLATED"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SWEDISH_TRANSLATED"},{"enum_id":53,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TAMIL_TRANSLATED"},{"enum_id":51,"string_id":"org.droidtv.ui.strings.R.string.MAIN_VIETNAMESE_TRANSLATED"},{"enum_id":8,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TURKISH_TRANSLATED"},{"enum_id":27,"string_id":"org.droidtv.ui.strings.R.string.MAIN_UKRAINIAN_TRANSLATED"},{"enum_id":45,"string_id":"org.droidtv.ui.strings.R.string.MAIN_THAI_TRANSLATED"},{"enum_id":24,"string_id":"org.droidtv.ui.strings.R.string.MAIN_WELSH_TRANSLATED"}]},"type":"LIST_NODE"},{"node_id":2131230823,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SECONDARY_AUDIO","context":"secondary_audio","data":{"enums":[{"enum_id":44,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ORIGINAL_LANGUAGE"},{"enum_id":74,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ALBANIAN_TRANSLATED"},{"enum_id":28,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ARABIC_TRANSLATED"},{"enum_id":48,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BAHASA_MELAYU_TRANSLATED"},{"enum_id":11,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BASQUE_TRANSLATED"},{"enum_id":37,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BULGARIAN_TRANSLATED"},{"enum_id":12,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CATALAN_TRANSLATED"},{"enum_id":34,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SIMPLIFIED_CHINESE_TRANSLATED"},{"enum_id":49,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CHINESE_TRANSLATED"},{"enum_id":61,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MANDARIN_TRANSLATED"},{"enum_id":76,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CANTONESE_TRANSLATED"},{"enum_id":13,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CROATIAN_TRANSLATED"},{"enum_id":6,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CZECH_TRANSLATED"},{"enum_id":14,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DANISH_TRANSLATED"},{"enum_id":15,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DUTCH_TRANSLATED"},{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ENGLISH_TRANSLATED"},{"enum_id":26,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ESTONIAN_TRANSLATED"},{"enum_id":16,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FINNISH_TRANSLATED"},{"enum_id":4,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FRENCH_TRANSLATED"},{"enum_id":17,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GAELIC_TRANSLATED"},{"enum_id":58,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HINDI_TRANSLATED"},{"enum_id":50,"string_id":"org.droidtv.ui.strings.R.string.MAIN_INDONESIAN_TRANSLATED"},{"enum_id":43,"string_id":"org.droidtv.ui.strings.R.string.MAIN_IRISH_TRANSLATED"},{"enum_id":18,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GALLEGAN_TRANSLATED"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GERMAN_TRANSLATED"},{"enum_id":10,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GREEK_TRANSLATED"},{"enum_id":29,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HEBREW_TRANSLATED"},{"enum_id":30,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HUNGARIAN_TRANSLATED"},{"enum_id":46,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ORIGINAL_AUDIO"},{"enum_id":59,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SECOND_AUDIO"},{"enum_id":60,"string_id":"org.droidtv.ui.strings.R.string.MAIN_THIRD_AUDIO"},{"enum_id":47,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MULTIPLE_LANGUAGES"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ITALIAN_TRANSLATED"},{"enum_id":57,"string_id":"org.droidtv.ui.strings.R.string.MAIN_JAPANESE_TRANSLATED"},{"enum_id":41,"string_id":"org.droidtv.ui.strings.R.string.MAIN_KAZAKH_TRANSLATED"},{"enum_id":55,"string_id":"org.droidtv.ui.strings.R.string.MAIN_KOREAN_TRANSLATED"},{"enum_id":40,"string_id":"org.droidtv.ui.strings.R.string.MAIN_LATVIAN_TRANSLATED"},{"enum_id":39,"string_id":"org.droidtv.ui.strings.R.string.MAIN_LITHUANIAN_TRANSLATED"},{"enum_id":52,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MACEDONIAN_TRANSLATED"},{"enum_id":54,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MAORI_TRANSLATED"},{"enum_id":19,"string_id":"org.droidtv.ui.strings.R.string.MAIN_NORWEGIAN_TRANSLATED"},{"enum_id":7,"string_id":"org.droidtv.ui.strings.R.string.MAIN_POLISH_TRANSLATED"},{"enum_id":20,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PORTUGUESE_TRANSLATED"},{"enum_id":25,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ROMANIAN_TRANSLATED"},{"enum_id":9,"string_id":"org.droidtv.ui.strings.R.string.MAIN_RUSSIAN_TRANSLATED"},{"enum_id":72,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SAMI_TRANSLATED"},{"enum_id":22,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SLOVAK_TRANSLATED"},{"enum_id":23,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SLOVENIAN_TRANSLATED"},{"enum_id":21,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SERBIAN_TRANSLATED"},{"enum_id":5,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SPANISH_TRANSLATED"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SWEDISH_TRANSLATED"},{"enum_id":53,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TAMIL_TRANSLATED"},{"enum_id":51,"string_id":"org.droidtv.ui.strings.R.string.MAIN_VIETNAMESE_TRANSLATED"},{"enum_id":8,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TURKISH_TRANSLATED"},{"enum_id":27,"string_id":"org.droidtv.ui.strings.R.string.MAIN_UKRAINIAN_TRANSLATED"},{"enum_id":45,"string_id":"org.droidtv.ui.strings.R.string.MAIN_THAI_TRANSLATED"},{"enum_id":24,"string_id":"org.droidtv.ui.strings.R.string.MAIN_WELSH_TRANSLATED"}]},"type":"LIST_NODE"},{"node_id":2131230824,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PRIMARY_SUBTITLES","context":"primary_subtitles","data":{"enums":[{"enum_id":44,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ORIGINAL_LANGUAGE"},{"enum_id":74,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ALBANIAN_TRANSLATED"},{"enum_id":28,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ARABIC_TRANSLATED"},{"enum_id":48,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BAHASA_MELAYU_TRANSLATED"},{"enum_id":11,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BASQUE_TRANSLATED"},{"enum_id":37,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BULGARIAN_TRANSLATED"},{"enum_id":12,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CATALAN_TRANSLATED"},{"enum_id":34,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SIMPLIFIED_CHINESE_TRANSLATED"},{"enum_id":49,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CHINESE_TRANSLATED"},{"enum_id":61,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MANDARIN_TRANSLATED"},{"enum_id":76,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CANTONESE_TRANSLATED"},{"enum_id":13,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CROATIAN_TRANSLATED"},{"enum_id":6,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CZECH_TRANSLATED"},{"enum_id":14,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DANISH_TRANSLATED"},{"enum_id":15,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DUTCH_TRANSLATED"},{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ENGLISH_TRANSLATED"},{"enum_id":26,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ESTONIAN_TRANSLATED"},{"enum_id":16,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FINNISH_TRANSLATED"},{"enum_id":4,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FRENCH_TRANSLATED"},{"enum_id":17,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GAELIC_TRANSLATED"},{"enum_id":58,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HINDI_TRANSLATED"},{"enum_id":50,"string_id":"org.droidtv.ui.strings.R.string.MAIN_INDONESIAN_TRANSLATED"},{"enum_id":43,"string_id":"org.droidtv.ui.strings.R.string.MAIN_IRISH_TRANSLATED"},{"enum_id":18,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GALLEGAN_TRANSLATED"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GERMAN_TRANSLATED"},{"enum_id":10,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GREEK_TRANSLATED"},{"enum_id":29,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HEBREW_TRANSLATED"},{"enum_id":30,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HUNGARIAN_TRANSLATED"},{"enum_id":46,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ORIGINAL_AUDIO"},{"enum_id":59,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SECOND_AUDIO"},{"enum_id":60,"string_id":"org.droidtv.ui.strings.R.string.MAIN_THIRD_AUDIO"},{"enum_id":47,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MULTIPLE_LANGUAGES"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ITALIAN_TRANSLATED"},{"enum_id":57,"string_id":"org.droidtv.ui.strings.R.string.MAIN_JAPANESE_TRANSLATED"},{"enum_id":41,"string_id":"org.droidtv.ui.strings.R.string.MAIN_KAZAKH_TRANSLATED"},{"enum_id":55,"string_id":"org.droidtv.ui.strings.R.string.MAIN_KOREAN_TRANSLATED"},{"enum_id":40,"string_id":"org.droidtv.ui.strings.R.string.MAIN_LATVIAN_TRANSLATED"},{"enum_id":39,"string_id":"org.droidtv.ui.strings.R.string.MAIN_LITHUANIAN_TRANSLATED"},{"enum_id":52,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MACEDONIAN_TRANSLATED"},{"enum_id":54,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MAORI_TRANSLATED"},{"enum_id":19,"string_id":"org.droidtv.ui.strings.R.string.MAIN_NORWEGIAN_TRANSLATED"},{"enum_id":7,"string_id":"org.droidtv.ui.strings.R.string.MAIN_POLISH_TRANSLATED"},{"enum_id":20,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PORTUGUESE_TRANSLATED"},{"enum_id":25,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ROMANIAN_TRANSLATED"},{"enum_id":9,"string_id":"org.droidtv.ui.strings.R.string.MAIN_RUSSIAN_TRANSLATED"},{"enum_id":72,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SAMI_TRANSLATED"},{"enum_id":22,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SLOVAK_TRANSLATED"},{"enum_id":23,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SLOVENIAN_TRANSLATED"},{"enum_id":21,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SERBIAN_TRANSLATED"},{"enum_id":5,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SPANISH_TRANSLATED"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SWEDISH_TRANSLATED"},{"enum_id":53,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TAMIL_TRANSLATED"},{"enum_id":51,"string_id":"org.droidtv.ui.strings.R.string.MAIN_VIETNAMESE_TRANSLATED"},{"enum_id":8,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TURKISH_TRANSLATED"},{"enum_id":27,"string_id":"org.droidtv.ui.strings.R.string.MAIN_UKRAINIAN_TRANSLATED"},{"enum_id":45,"string_id":"org.droidtv.ui.strings.R.string.MAIN_THAI_TRANSLATED"},{"enum_id":24,"string_id":"org.droidtv.ui.strings.R.string.MAIN_WELSH_TRANSLATED"}]},"type":"LIST_NODE"},{"node_id":2131230825,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SECONDARY_SUBTITLES","context":"secondary_subtitles","data":{"enums":[{"enum_id":44,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ORIGINAL_LANGUAGE"},{"enum_id":74,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ALBANIAN_TRANSLATED"},{"enum_id":28,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ARABIC_TRANSLATED"},{"enum_id":48,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BAHASA_MELAYU_TRANSLATED"},{"enum_id":11,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BASQUE_TRANSLATED"},{"enum_id":37,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BULGARIAN_TRANSLATED"},{"enum_id":12,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CATALAN_TRANSLATED"},{"enum_id":34,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SIMPLIFIED_CHINESE_TRANSLATED"},{"enum_id":49,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CHINESE_TRANSLATED"},{"enum_id":61,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MANDARIN_TRANSLATED"},{"enum_id":76,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CANTONESE_TRANSLATED"},{"enum_id":13,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CROATIAN_TRANSLATED"},{"enum_id":6,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CZECH_TRANSLATED"},{"enum_id":14,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DANISH_TRANSLATED"},{"enum_id":15,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DUTCH_TRANSLATED"},{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ENGLISH_TRANSLATED"},{"enum_id":26,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ESTONIAN_TRANSLATED"},{"enum_id":16,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FINNISH_TRANSLATED"},{"enum_id":4,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FRENCH_TRANSLATED"},{"enum_id":17,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GAELIC_TRANSLATED"},{"enum_id":58,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HINDI_TRANSLATED"},{"enum_id":50,"string_id":"org.droidtv.ui.strings.R.string.MAIN_INDONESIAN_TRANSLATED"},{"enum_id":43,"string_id":"org.droidtv.ui.strings.R.string.MAIN_IRISH_TRANSLATED"},{"enum_id":18,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GALLEGAN_TRANSLATED"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GERMAN_TRANSLATED"},{"enum_id":10,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GREEK_TRANSLATED"},{"enum_id":29,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HEBREW_TRANSLATED"},{"enum_id":30,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HUNGARIAN_TRANSLATED"},{"enum_id":46,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ORIGINAL_AUDIO"},{"enum_id":59,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SECOND_AUDIO"},{"enum_id":60,"string_id":"org.droidtv.ui.strings.R.string.MAIN_THIRD_AUDIO"},{"enum_id":47,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MULTIPLE_LANGUAGES"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ITALIAN_TRANSLATED"},{"enum_id":57,"string_id":"org.droidtv.ui.strings.R.string.MAIN_JAPANESE_TRANSLATED"},{"enum_id":41,"string_id":"org.droidtv.ui.strings.R.string.MAIN_KAZAKH_TRANSLATED"},{"enum_id":55,"string_id":"org.droidtv.ui.strings.R.string.MAIN_KOREAN_TRANSLATED"},{"enum_id":40,"string_id":"org.droidtv.ui.strings.R.string.MAIN_LATVIAN_TRANSLATED"},{"enum_id":39,"string_id":"org.droidtv.ui.strings.R.string.MAIN_LITHUANIAN_TRANSLATED"},{"enum_id":52,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MACEDONIAN_TRANSLATED"},{"enum_id":54,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MAORI_TRANSLATED"},{"enum_id":19,"string_id":"org.droidtv.ui.strings.R.string.MAIN_NORWEGIAN_TRANSLATED"},{"enum_id":7,"string_id":"org.droidtv.ui.strings.R.string.MAIN_POLISH_TRANSLATED"},{"enum_id":20,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PORTUGUESE_TRANSLATED"},{"enum_id":25,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ROMANIAN_TRANSLATED"},{"enum_id":9,"string_id":"org.droidtv.ui.strings.R.string.MAIN_RUSSIAN_TRANSLATED"},{"enum_id":72,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SAMI_TRANSLATED"},{"enum_id":22,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SLOVAK_TRANSLATED"},{"enum_id":23,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SLOVENIAN_TRANSLATED"},{"enum_id":21,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SERBIAN_TRANSLATED"},{"enum_id":5,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SPANISH_TRANSLATED"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SWEDISH_TRANSLATED"},{"enum_id":53,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TAMIL_TRANSLATED"},{"enum_id":51,"string_id":"org.droidtv.ui.strings.R.string.MAIN_VIETNAMESE_TRANSLATED"},{"enum_id":8,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TURKISH_TRANSLATED"},{"enum_id":27,"string_id":"org.droidtv.ui.strings.R.string.MAIN_UKRAINIAN_TRANSLATED"},{"enum_id":45,"string_id":"org.droidtv.ui.strings.R.string.MAIN_THAI_TRANSLATED"},{"enum_id":24,"string_id":"org.droidtv.ui.strings.R.string.MAIN_WELSH_TRANSLATED"}]},"type":"LIST_NODE"},{"node_id":2131230826,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PRIMARY_TELETEXT","context":"primary_text","data":{"enums":[{"enum_id":44,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ORIGINAL_LANGUAGE"},{"enum_id":74,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ALBANIAN_TRANSLATED"},{"enum_id":28,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ARABIC_TRANSLATED"},{"enum_id":48,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BAHASA_MELAYU_TRANSLATED"},{"enum_id":11,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BASQUE_TRANSLATED"},{"enum_id":37,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BULGARIAN_TRANSLATED"},{"enum_id":12,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CATALAN_TRANSLATED"},{"enum_id":34,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SIMPLIFIED_CHINESE_TRANSLATED"},{"enum_id":49,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CHINESE_TRANSLATED"},{"enum_id":61,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MANDARIN_TRANSLATED"},{"enum_id":76,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CANTONESE_TRANSLATED"},{"enum_id":13,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CROATIAN_TRANSLATED"},{"enum_id":6,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CZECH_TRANSLATED"},{"enum_id":14,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DANISH_TRANSLATED"},{"enum_id":15,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DUTCH_TRANSLATED"},{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ENGLISH_TRANSLATED"},{"enum_id":26,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ESTONIAN_TRANSLATED"},{"enum_id":16,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FINNISH_TRANSLATED"},{"enum_id":4,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FRENCH_TRANSLATED"},{"enum_id":17,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GAELIC_TRANSLATED"},{"enum_id":58,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HINDI_TRANSLATED"},{"enum_id":50,"string_id":"org.droidtv.ui.strings.R.string.MAIN_INDONESIAN_TRANSLATED"},{"enum_id":43,"string_id":"org.droidtv.ui.strings.R.string.MAIN_IRISH_TRANSLATED"},{"enum_id":18,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GALLEGAN_TRANSLATED"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GERMAN_TRANSLATED"},{"enum_id":10,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GREEK_TRANSLATED"},{"enum_id":29,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HEBREW_TRANSLATED"},{"enum_id":30,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HUNGARIAN_TRANSLATED"},{"enum_id":46,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ORIGINAL_AUDIO"},{"enum_id":59,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SECOND_AUDIO"},{"enum_id":60,"string_id":"org.droidtv.ui.strings.R.string.MAIN_THIRD_AUDIO"},{"enum_id":47,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MULTIPLE_LANGUAGES"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ITALIAN_TRANSLATED"},{"enum_id":57,"string_id":"org.droidtv.ui.strings.R.string.MAIN_JAPANESE_TRANSLATED"},{"enum_id":41,"string_id":"org.droidtv.ui.strings.R.string.MAIN_KAZAKH_TRANSLATED"},{"enum_id":55,"string_id":"org.droidtv.ui.strings.R.string.MAIN_KOREAN_TRANSLATED"},{"enum_id":40,"string_id":"org.droidtv.ui.strings.R.string.MAIN_LATVIAN_TRANSLATED"},{"enum_id":39,"string_id":"org.droidtv.ui.strings.R.string.MAIN_LITHUANIAN_TRANSLATED"},{"enum_id":52,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MACEDONIAN_TRANSLATED"},{"enum_id":54,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MAORI_TRANSLATED"},{"enum_id":19,"string_id":"org.droidtv.ui.strings.R.string.MAIN_NORWEGIAN_TRANSLATED"},{"enum_id":7,"string_id":"org.droidtv.ui.strings.R.string.MAIN_POLISH_TRANSLATED"},{"enum_id":20,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PORTUGUESE_TRANSLATED"},{"enum_id":25,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ROMANIAN_TRANSLATED"},{"enum_id":9,"string_id":"org.droidtv.ui.strings.R.string.MAIN_RUSSIAN_TRANSLATED"},{"enum_id":72,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SAMI_TRANSLATED"},{"enum_id":22,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SLOVAK_TRANSLATED"},{"enum_id":23,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SLOVENIAN_TRANSLATED"},{"enum_id":21,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SERBIAN_TRANSLATED"},{"enum_id":5,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SPANISH_TRANSLATED"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SWEDISH_TRANSLATED"},{"enum_id":53,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TAMIL_TRANSLATED"},{"enum_id":51,"string_id":"org.droidtv.ui.strings.R.string.MAIN_VIETNAMESE_TRANSLATED"},{"enum_id":8,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TURKISH_TRANSLATED"},{"enum_id":27,"string_id":"org.droidtv.ui.strings.R.string.MAIN_UKRAINIAN_TRANSLATED"},{"enum_id":45,"string_id":"org.droidtv.ui.strings.R.string.MAIN_THAI_TRANSLATED"},{"enum_id":24,"string_id":"org.droidtv.ui.strings.R.string.MAIN_WELSH_TRANSLATED"}]},"type":"LIST_NODE"},{"node_id":2131230827,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SECONDARY_TELETEXT","context":"secondary_text","data":{"enums":[{"enum_id":44,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ORIGINAL_LANGUAGE"},{"enum_id":74,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ALBANIAN_TRANSLATED"},{"enum_id":28,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ARABIC_TRANSLATED"},{"enum_id":48,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BAHASA_MELAYU_TRANSLATED"},{"enum_id":11,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BASQUE_TRANSLATED"},{"enum_id":37,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BULGARIAN_TRANSLATED"},{"enum_id":12,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CATALAN_TRANSLATED"},{"enum_id":34,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SIMPLIFIED_CHINESE_TRANSLATED"},{"enum_id":49,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CHINESE_TRANSLATED"},{"enum_id":61,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MANDARIN_TRANSLATED"},{"enum_id":76,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CANTONESE_TRANSLATED"},{"enum_id":13,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CROATIAN_TRANSLATED"},{"enum_id":6,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CZECH_TRANSLATED"},{"enum_id":14,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DANISH_TRANSLATED"},{"enum_id":15,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DUTCH_TRANSLATED"},{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ENGLISH_TRANSLATED"},{"enum_id":26,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ESTONIAN_TRANSLATED"},{"enum_id":16,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FINNISH_TRANSLATED"},{"enum_id":4,"string_id":"org.droidtv.ui.strings.R.string.MAIN_FRENCH_TRANSLATED"},{"enum_id":17,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GAELIC_TRANSLATED"},{"enum_id":58,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HINDI_TRANSLATED"},{"enum_id":50,"string_id":"org.droidtv.ui.strings.R.string.MAIN_INDONESIAN_TRANSLATED"},{"enum_id":43,"string_id":"org.droidtv.ui.strings.R.string.MAIN_IRISH_TRANSLATED"},{"enum_id":18,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GALLEGAN_TRANSLATED"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GERMAN_TRANSLATED"},{"enum_id":10,"string_id":"org.droidtv.ui.strings.R.string.MAIN_GREEK_TRANSLATED"},{"enum_id":29,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HEBREW_TRANSLATED"},{"enum_id":30,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HUNGARIAN_TRANSLATED"},{"enum_id":46,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ORIGINAL_AUDIO"},{"enum_id":59,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SECOND_AUDIO"},{"enum_id":60,"string_id":"org.droidtv.ui.strings.R.string.MAIN_THIRD_AUDIO"},{"enum_id":47,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MULTIPLE_LANGUAGES"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ITALIAN_TRANSLATED"},{"enum_id":57,"string_id":"org.droidtv.ui.strings.R.string.MAIN_JAPANESE_TRANSLATED"},{"enum_id":41,"string_id":"org.droidtv.ui.strings.R.string.MAIN_KAZAKH_TRANSLATED"},{"enum_id":55,"string_id":"org.droidtv.ui.strings.R.string.MAIN_KOREAN_TRANSLATED"},{"enum_id":40,"string_id":"org.droidtv.ui.strings.R.string.MAIN_LATVIAN_TRANSLATED"},{"enum_id":39,"string_id":"org.droidtv.ui.strings.R.string.MAIN_LITHUANIAN_TRANSLATED"},{"enum_id":52,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MACEDONIAN_TRANSLATED"},{"enum_id":54,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MAORI_TRANSLATED"},{"enum_id":19,"string_id":"org.droidtv.ui.strings.R.string.MAIN_NORWEGIAN_TRANSLATED"},{"enum_id":7,"string_id":"org.droidtv.ui.strings.R.string.MAIN_POLISH_TRANSLATED"},{"enum_id":20,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PORTUGUESE_TRANSLATED"},{"enum_id":25,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ROMANIAN_TRANSLATED"},{"enum_id":9,"string_id":"org.droidtv.ui.strings.R.string.MAIN_RUSSIAN_TRANSLATED"},{"enum_id":72,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SAMI_TRANSLATED"},{"enum_id":22,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SLOVAK_TRANSLATED"},{"enum_id":23,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SLOVENIAN_TRANSLATED"},{"enum_id":21,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SERBIAN_TRANSLATED"},{"enum_id":5,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SPANISH_TRANSLATED"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SWEDISH_TRANSLATED"},{"enum_id":53,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TAMIL_TRANSLATED"},{"enum_id":51,"string_id":"org.droidtv.ui.strings.R.string.MAIN_VIETNAMESE_TRANSLATED"},{"enum_id":8,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TURKISH_TRANSLATED"},{"enum_id":27,"string_id":"org.droidtv.ui.strings.R.string.MAIN_UKRAINIAN_TRANSLATED"},{"enum_id":45,"string_id":"org.droidtv.ui.strings.R.string.MAIN_THAI_TRANSLATED"},{"enum_id":24,"string_id":"org.droidtv.ui.strings.R.string.MAIN_WELSH_TRANSLATED"}]},"type":"LIST_NODE"}]}},{"node_id":2131230828,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_CLOCK","context":"clock","data":{"nodes":[{"node_id":2131230829,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AUTO_CLOCK_MODE","context":"auto_clock_mode","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AUTOMATIC"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_COUNTRY_DEPENDENT"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MANUAL"}]},"type":"LIST_NODE"},{"node_id":2131230830,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TIME_ZONE","context":"time_zone","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_KAZAKH_WESTERN"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_KAZAKH_EASTERN"}]},"type":"LIST_NODE"},{"node_id":2131230831,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TIME_ZONE","context":"time_zone","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PORTUGAL_MADEIRA"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AZORES"}]},"type":"LIST_NODE"},{"node_id":2131230832,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TIME_ZONE","context":"time_zone","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_KALINGRAD"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MOSCOW"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SAMARA"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_YEKATERINBURG"},{"enum_id":4,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OMSK"},{"enum_id":5,"string_id":"org.droidtv.ui.strings.R.string.MAIN_KRASNOYARSK"},{"enum_id":6,"string_id":"org.droidtv.ui.strings.R.string.MAIN_IRKUTSK"},{"enum_id":7,"string_id":"org.droidtv.ui.strings.R.string.MAIN_YAKUTSK"},{"enum_id":8,"string_id":"org.droidtv.ui.strings.R.string.MAIN_VLADIVOSTOK"},{"enum_id":9,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SREDNEKOLYMSK"},{"enum_id":10,"string_id":"org.droidtv.ui.strings.R.string.MAIN_KAMCHATKA"}]},"type":"LIST_NODE"},{"node_id":2131230833,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TIME_ZONE","context":"time_zone","data":{"enums":[{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SPAIN_BALEARES"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CANARY_ISLANDS"}]},"type":"LIST_NODE"},{"node_id":2131230834,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TIME_ZONE","context":"time_zone","data":{"enums":[{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_QUEENSLAND"},{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_NEW_SOUTH_WALES"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_VICTORIA"},{"enum_id":5,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TASMANIA"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SOUTH_AUSTRALIA"},{"enum_id":6,"string_id":"org.droidtv.ui.strings.R.string.MAIN_NORTHERN_TERRITORY"},{"enum_id":4,"string_id":"org.droidtv.ui.strings.R.string.MAIN_WESTERN_AUSTRALIA"}]},"type":"LIST_NODE"},{"node_id":2131230835,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TIME_ZONE","context":"time_zone","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_INDONESIA_WESTERN_TIME_ZONE"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_INDONESIA_CENTRAL_TIME_ZONE"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_INDONESIA_EASTERN_TIME_ZONE"}]},"type":"LIST_NODE"},{"node_id":2131230836,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TIME_ZONE","context":"time_zone","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_NZ_EXCEPT_CHATHAM_TIME_ZONE"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_CHATHAM_ISLANDS"}]},"type":"LIST_NODE"},{"node_id":2131230837,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DATE","context":"date","data":{},"type":"DATE_PICKER"},{"node_id":2131230838,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TIME","context":"time","data":{},"type":"TIME_PICKER"},{"node_id":2131230839,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SLEEPTIMER","context":"sleeptimer","data":{"slider_data":{"min":0,"max":180,"step_size":5}},"type":"SLIDER_NODE"}]}},{"node_id":2131230840,"string_id":"org.droidtv.ui.strings.R.string.MAIN_RC_KEYBOARD","context":"rc_keyboard","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MISC_QWERTY"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MISC_AZERTY"}]},"type":"LIST_NODE"}]}},{"node_id":2131230754,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_GOOGLE_SETTINGS","context":"android_settings","data":{}},{"node_id":2131230755,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_UNIVERSAL_ACCESS","context":"accessibility","data":{"nodes":[{"node_id":2131230756,"string_id":"org.droidtv.ui.strings.R.string.MAIN_UNIVERSAL_ACCESS","context":"universal_access","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230757,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HEARING_IMPAIRED","context":"hearing_impaired","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230758,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_AUDIO_DESCRIPTION","context":"audio_description_menu","data":{"nodes":[{"node_id":2131230759,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AUDIO_DESCRIPTION","context":"audio_description","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230760,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SPEAKERS_OR_HEADPHONES","context":"speakers_headphones","data":{"enums":[{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SPEAKERS"},{"enum_id":2,"string_id":"org.droidtv.ui.strings.R.string.MAIN_HEADPHONE"},{"enum_id":3,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SPEAKERS_HEADPHONE"}]},"type":"LIST_NODE"},{"node_id":2131230761,"string_id":"org.droidtv.ui.strings.R.string.MAIN_MIXED_VOLUME","context":"mixed_volume","data":{"slider_data":{"min":-32,"max":32,"step_size":1}},"type":"SLIDER_NODE"},{"node_id":2131230762,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SEAMLESS_MIXING","context":"audio_effects","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230763,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SPEECH_PREFERENCE","context":"speech","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PREFERENCE_DESCRIPTIVE"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PREFERENCE_SUBTITLES"}]},"type":"LIST_NODE"}]}},{"node_id":2131230764,"string_id":"org.droidtv.ui.strings.R.string.MAIN_DIALOGUE_ENHANCEMENT","context":"dialogue_enhancement","data":{"slider_data":{"min":0,"max":9,"step_size":1}},"type":"SLIDER_NODE"}]}},{"node_id":2131230808,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_CHILD_LOCK","context":"child_lock","data":{"nodes":[{"node_id":2131230809,"string_id":"org.droidtv.ui.strings.R.string.MAIN_PARENTAL_RATING","context":"parental_rating","data":{"enums":[]},"type":"LIST_NODE"},{"node_id":2131230810,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_PARENTAL_RATING_STREAMING_CHANNELS","context":"parental_rating","data":{}},{"node_id":2131230811,"string_id":"org.droidtv.ui.strings.R.string.MAIN_APP_LOCKING","context":"app_locking","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230812,"type":"PARENT_NODE","context":"change_code","data":{}},{"node_id":2131230813,"type":"PARENT_NODE","context":"CAM_change_code","data":{}}]}},{"node_id":2131230724,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_WIRELESS_AND_NETWORKS","context":"wireless_networks","data":{"nodes":[{"node_id":2131230725,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_WIRED_OR_WIFI","context":"network","data":{"nodes":[{"node_id":2131230726,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_CONNECT_TO_NETWORK","context":"connect_to_network","data":{}},{"node_id":2131230727,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_VIEW_NETWORK_SETTINGS","context":"view_network_settings","data":{}},{"node_id":2131230728,"string_id":"org.droidtv.ui.strings.R.string.MAIN_NETWORK_MODE","context":"network_configuration","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MISC_DHCP"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_STATIC_IP"}]},"type":"LIST_NODE"},{"node_id":2131230729,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_IP_CONFIGURATION","context":"ip_configuration","data":{"nodes":[{"node_id":2131230730,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_PANEL_IP_ADDRESS","context":"ip_address","data":{}},{"node_id":2131230731,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_PANEL_NETMASK","context":"netmask","data":{}},{"node_id":2131230732,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_PANEL_GATEWAY","context":"gateway","data":{}},{"node_id":2131230733,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_PANEL_DNS_1","context":"dns_1","data":{}},{"node_id":2131230734,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_PANEL_DNS_2","context":"dns_2","data":{}}]}},{"node_id":2131230735,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SWITCH_ON_WITH_WIFI_WOWLAN","context":"switch_on_with_network","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230736,"string_id":"org.droidtv.ui.strings.R.string.MAIN_SWITCH_ON_WITH_CHROMECAST","context":"switch_on_with_network","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230737,"string_id":"org.droidtv.ui.strings.R.string.MAIN_RENDERER_ACCESS","context":"digital_media_renderer","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230738,"string_id":"org.droidtv.ui.strings.R.string.MAIN_WIFI_ON_OFF","context":"wifi_on_off","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230739,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_RECORDING_ON_THE_GO","context":"myremote_recording","data":{}},{"node_id":2131230740,"string_id":"org.droidtv.ui.strings.R.string.MAIN_TV_NAME","context":"tv_network_name","data":{},"type":"TEXT_ENTRY"},{"node_id":2131230741,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_CLEAR_APPS_MEMORY","context":"clear_internet_memory","data":{}}]}},{"node_id":2131230742,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_BLUETOOTH","context":"bluetooth","data":{"nodes":[{"node_id":2131230743,"string_id":"org.droidtv.ui.strings.R.string.MAIN_BT_ON_OFF","context":"bluetooth_on_off","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230744,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_SEARCH_BT_DEVICE","context":"search_for_bt_devices","data":{}},{"node_id":2131230745,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_REMOVE_BT_DEVICE","context":"remove_bt_device","data":{}}]}},{"node_id":2131230746,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_REMOTE_CONTROL","context":"bt_remote_control","data":{"nodes":[{"node_id":2131230747,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_PAIR_RC","context":"pair_remote_control","data":{}},{"node_id":2131230748,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_CURRENT_SOFTWARE_INFO","context":"check_software_version","data":{}},{"node_id":2131230749,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_CH_UPDATE_RC_SOFTWARE","context":"update_rc_software","data":{}}]}},{"node_id":2131230750,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_CUBE_NAME","context":"cube_name","data":{"nodes":[{"node_id":2131230751,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_PAIR_CUBE_NAME","context":"pair_voice_cube","data":{}},{"node_id":2131230748,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_CURRENT_SOFTWARE_INFO","context":"check_software_version","data":{}},{"node_id":2131230752,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_UPDATE_CUBE_NAME_SOFTWARE","context":"update_rc_software","data":{}}]}}]}},{"node_id":2131230801,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_CHANNELS","context":"channels","data":{"nodes":[{"node_id":2131230802,"type":"PARENT_NODE","context":"channel_installation","data":{}},{"node_id":2131230803,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_SATELLITE_INSTALLATION","context":"satellite_installation","data":{}},{"node_id":2131230804,"type":"PARENT_NODE","context":"channel_list_copy","data":{"nodes":[{"node_id":2131230805,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_COPY_TO_USB","context":"channels_copy_to_usb","data":{}},{"node_id":2131230806,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_COPY_TO_TV","context":"channels_copy_to_tv","data":{}},{"node_id":2131230807,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_CURRENT_VERSION","context":"channels_current_version","data":{}}]}}]}},{"node_id":2131230945,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_UPDATE_SOFTWARE","context":"update_software","data":{"nodes":[{"node_id":2131230946,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_SEARCH_FOR_UPDATES","context":"search_for_update","data":{"nodes":[{"node_id":2131230947,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_INTERNET_RECOMMENDED","context":"internet_updates","data":{}},{"node_id":2131230948,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_USB","context":"local_updates","data":{"nodes":[{"node_id":2131230949,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_LOCAL_UPDATES","context":"local_updates","data":{}},{"node_id":2131230950,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_IDENTIFY_TV","context":"local_updates","data":{}}]}},{"node_id":2131230951,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_LOOK_FOR_OAD_UPDATES","context":"look_for_oad_updates","data":{}}]}},{"node_id":2131230952,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_CURRENT_SOFTWARE_INFO","context":"current_software_info","data":{}},{"node_id":2131230953,"string_id":"org.droidtv.ui.strings.R.string.MAIN_AUTOMATIC_SOFTWARE_UPDATE","context":"automatic_update","data":{"enums":[{"enum_id":0,"string_id":"org.droidtv.ui.strings.R.string.MAIN_OFF"},{"enum_id":1,"string_id":"org.droidtv.ui.strings.R.string.MAIN_ON"}]},"type":"LIST_NODE"},{"node_id":2131230954,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_ANNOUNCEMENT","context":"announcement","data":{}},{"node_id":2131230955,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_VIEW_SOFTWARE_UPDATE_HISTORY","context":"view_software_update_history","data":{}}]}}]}}}

I figured

{"node_id":2131230816,"type":"PARENT_NODE","string_id":"org.droidtv.ui.strings.R.string.MAIN_MUTE_SCREEN","context":"screen_off","data":{}}

is what I was looking for.

A POST of {"nodes":[{"nodeid":2131230774}]} on https://ipaddress:1926/6/menuitems/settings/current returned:
{"values":[{"value":{"Nodeid":2131230816,"Controllable":"true","Available":"true","string_id":"Bild ausgeschaltet"}}]}

I tried I. E.
python pylips.py --command post --path menuitems/settings/update --body '{"values":[{"value":{"Nodeid":2131230816,"Controllable":"true","Available":"true","string_id":"Bild ausgeschaltet"}}]}'

and added

	"screen_off": {
		"path": "menuitems/settings/update",
		"body": {
			"values": [{
				"value": {
					"Nodeid": 2131230816,
					"Controllable": "true",
					"Available": "false",
					"string_id": "Bild ausgeschaltet",
					"data": {

					}
				}

			}]
		}
	},

to the settings in order to try it that way. Everytime the TV returns {"response": "OK"} but nothing happens.

I must be missing something.

[BUG] pairing 55PUS7394/12 (2019) fails

Describe the bug
Try to pair a Philips 55PUS7394-12 android-tv fails.

To Reproduce
Steps to reproduce the behavior:

  1. edit settings.ini and set ´host = ip.of.my.tv´
  2. using command ´python3 pylibs.py´as given in the readme

paring faills with
´´´
Checking API version and port...
Trying http://ip.of.my.tv:1925/6/system
{'nettvversion': '8.2.0', 'serialnumber_encrypted': 'FF/uIq2oG7QNf1+D0dHzh4daNuM/nA7xfA9ACehFV4E=\n', 'name': '55PUS7394-12', 'country': 'Germany', 'menulanguage': 'German', 'featuring': {'jsonfeatures': {'applications': ['TV_Apps', 'TV_Games', 'TV_Settings'], 'mappings': ['server_mapping'], 'activities': ['intent'], 'ambilight': ['LoungeLight', 'Hue', 'Ambilight', 'HueStreaming'], 'recordings': ['List', 'Schedule', 'Manage'], 'inputkey': ['key'], 'editfavorites': ['TVChannels', 'SatChannels'], 'pointer': ['not_available'], 'menuitems': ['Setup_Menu'], 'channels': ['preset_string'], 'textentry': ['not_available']}, 'systemfeatures': {'tvsearch': 'intent', 'secured_transport': 'true', 'companion_screen': 'true', 'pairing_type': 'digest_auth_pairing', 'content': ['dmr', 'pvr'], 'tvtype': 'consumer'}}, 'epgsource': 'no_epg', 'softwareversion_encrypted': 'LgzCE7mnhZ//JRJPgUJIZaD3Y4/yKMxa8/dD/XnWAD74niOiUJUk8uK2/4K/ope6\n', 'notifyChange': 'http', 'os_type': 'MSAF_2019_P', 'api_version': {'Minor': 1, 'Major': 6, 'Patch': 0}, 'model_encrypted': 'E8Syb2W6Wwf9SIXSAJv6QNP7S7KRzTEYuNaUxz/5xkY=\n', 'deviceid_encrypted': '1+X/37SGxu+oXD+k5fy6jSncMGK65aAkWs/SOss/ExY=\n'}
No valid credentials found, starting pairing process...
Sending pairing request
{'scope': ['read', 'write', 'control'], 'device': {'type': 'native', 'device_os': 'Android', 'device_name': 'heliotrope', 'id': 'xMIp8wZyp7hkmirx', 'app_name': 'Pylips', 'app_id': 'app.id'}}
https://ip.of.my.tv:1926/6/pair/request
...
Traceback (most recent call last): File "pylips.py", line 453, in pylips = Pylips(os.path.dirname(os.path.realpath(file))+"/settings.ini") File "pylips.py", line 76, in init self.pair() File "pylips.py", line 186, in pair self.pair_request(data) File "pylips.py", line 193, in pair_request r = requests.post("https://" + str(self.config["TV"]["host"]) + ":1926/"+str(self.config["TV"]["apiv"]�)+"/pair/request", json=data, verify=False, timeout=2) File "/home/pi/.local/lib/python3.5/site-packages/requests/api.py", line 110, in post return request('post', url, data=data, json=json, **kwargs) File "/home/pi/.local/lib/python3.5/site-packages/requests/api.py", line 56, in request return session.request(method=method, url=url, **kwargs) File "/home/pi/.local/lib/python3.5/site-packages/requests/sessions.py", line 488, in request resp = self.send(prep, **send_kwargs) File "/home/pi/.local/lib/python3.5/site-packages/requests/sessions.py", line 609, in send r = adapter.send(request, **kwargs) File "/home/pi/.local/lib/python3.5/site-packages/requests/adapters.py", line 499, in send raise ReadTimeout(e, request=request)requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='ip.of.my.tv', port=1926): Read timed out. (�read timeout=2)
´´´

Remote power on TV

We can control the TV, we can power off the TV but afaik no option today to power the TV on.

Goal here is to find out a way to power on the TV from the network. Here's my summary:

  • when you power off the TV, the WLAN adapter is not reachable anymore after a certain gracetime
  • sending a WOL package powers up the TV, however the main interfaces (port 1925 and 1926) are not open yet, here's whats open at the moment:
Discovered open port 49153/tcp on 192.168.178.94  << Linux2.6/0.0 UPnP/1.0 PhilipsIntelSDK/1.4 DLNADOC/1.50
Discovered open port 8443/tcp on 192.168.178.94   << HTTPS service, curl request returns empty reply, cert: issuer: C=US; ST=Washington; L=Kirkland; O=Google Inc; OU=Widevine; CN=TPVision TV PH9M_EA_5599 Mediatek MT5599 Cast ICA
Discovered open port 9000/tcp on 192.168.178.94   << unknown
Discovered open port 8009/tcp on 192.168.178.94   << HTTPS service (self signed certificate)
Discovered open port 8008/tcp on 192.168.178.94   << HTTP service, returns 404

so we have different options here to power the TV on:

  • fake a Upnp session, so the TV turns on
  • explore the other ports of the TV and find an API there

someone knows more about those ports?

[FEAT] define ini file path

Is your feature request related to a problem? Please describe.
i have two Philips Android TVs and want to monitor them from my Docker Container
https://github.com/b2un0/pylips/blob/master/Dockerfile

but i can't define a absolute path of the settings.ini, so i must mount them from outside.

Describe the solution you'd like
an new argument to define a path of the settings.ini

Describe alternatives you've considered
mount the settings.ini file absolute like the following is not an option for me:

docker run -d \
    --name pylips-70PUS7304 \
    --restart=unless-stopped \
    -v ~/pylips_70PUS7304.ini:/opt/pylips/settings.ini \
     b2un0/pylips:latest

Additional context

i wish i could something like this where pylips_data is an named docker volume which contained the following files:

$ pwd 
/var/lib/docker/volumes/pylips_data
$ tree
└── _data
    ├── 55PUS6551.ini
    └── 70PUS7304.ini

1 directory, 2 files

and i can run both container with the same volume:

docker run -d \
    --name pylips-70PUS7304 \
    --restart=unless-stopped \
    -v pylips_data:/mnt/pylips_data/ \
     --entrypoint "python /opt/pylips/pylips.py --ini /mnt/pylips_data/70PUS7304.ini" \
     b2un0/pylips:latest
docker run -d \
    --name pylips-55PUS6551 \
    --restart=unless-stopped \
    -v pylips_data:/mnt/pylips_data/ \
     --entrypoint "python /opt/pylips/pylips.py --ini /mnt/pylips_data/55PUS6551.ini" \
     b2un0/pylips:latest

launch_app (Netflix) does'nt work

I am trying to start netflix, youtube, kodi with pylips.
Sadly without luck.
Your examples doesnt also work for me.
I have tried to get the needed informations from this endpoint https://github.com/eslavnov/pylips/wiki/Applications-(GET)
but without luck on using it.

My TV has android pie on it, maybe thats the reason?

Here is the output of my applications:

{"version":2,"applications":[{"label":"Wie Sie...","intent":{"component":{"packageName":"org.droidtv.eum","className":"org.droidtv.eum.onehelp.HowToTutorials.HowToVideosActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"org.droidtv.eum.onehelp.HowToTutorials.HowToVideosActivity-org.droidtv.eum","type":"app"},{"label":"Play Store","intent":{"component":{"packageName":"com.android.vending","className":"com.google.android.finsky.tvmainactivity.TvMainActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"com.google.android.finsky.tvmainactivity.TvMainActivity-com.android.vending","type":"app"},{"label":"YouTube","intent":{"component":{"packageName":"com.google.android.youtube.tv","className":"com.google.android.apps.youtube.tv.activity.ShellActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"com.google.android.apps.youtube.tv.activity.ShellActivity-com.google.android.youtube.tv","type":"app"},{"label":"Prime Video","intent":{"component":{"packageName":"com.amazon.amazonvideo.livingroom","className":"com.amazon.ignition.IgnitionActivity"},"action":"empty"},"order":0,"id":"com.amazon.ignition.IgnitionActivity-com.amazon.amazonvideo.livingroom","type":"app"},{"label":"Play Musik","intent":{"component":{"packageName":"com.google.android.music","className":"com.google.android.music.tv.HomeActivity"},"action":"empty"},"order":0,"id":"com.google.android.music.tv.HomeActivity-com.google.android.music","type":"app"},{"label":"Play Spiele","intent":{"component":{"packageName":"com.google.android.play.games","className":"com.google.android.apps.play.games.app.atv.features.home.HomeActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"com.google.android.apps.play.games.app.atv.features.home.HomeActivity-com.google.android.play.games","type":"app"},{"label":"Play Filme & Serien","intent":{"component":{"packageName":"com.google.android.videos","className":"com.google.android.videos.tv.presenter.activity.TvLauncherActivity"},"action":"empty"},"order":0,"id":"com.google.android.videos.tv.presenter.activity.TvLauncherActivity-com.google.android.videos","type":"app"},{"label":"Netflix","intent":{"component":{"packageName":"com.netflix.ninja","className":"com.netflix.ninja.MainActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"com.netflix.ninja.MainActivity-com.netflix.ninja","type":"app"},{"label":"Internet Browser","intent":{"component":{"packageName":"com.opera.sdk.example","className":"com.opera.sdk.example.OperaBrowserUiActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"com.opera.sdk.example.OperaBrowserUiActivity-com.opera.sdk.example","type":"app"},{"label":"Amazon Alexa","intent":{"component":{"packageName":"org.droidtv.amazonalexa","className":"org.droidtv.amazonalexa.wizard.AlexaWizardActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"org.droidtv.amazonalexa.wizard.AlexaWizardActivity-org.droidtv.amazonalexa","type":"app"},{"label":"TV-Guide","intent":{"component":{"packageName":"org.droidtv.channels","className":"org.droidtv.channels.ChannelsActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"org.droidtv.channels.ChannelsActivity-org.droidtv.channels","type":"app"},{"label":"Medien","intent":{"component":{"packageName":"org.droidtv.contentexplorer","className":"org.droidtv.contentexplorer.MainActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"org.droidtv.contentexplorer.MainActivity-org.droidtv.contentexplorer","type":"app"},{"label":"Demo-Menü","intent":{"component":{"packageName":"org.droidtv.demome","className":"org.droidtv.demome.DemoMeOptionsActivity"},"action":"empty"},"order":0,"id":"org.droidtv.demome.DemoMeOptionsActivity-org.droidtv.demome","type":"app"},{"label":"Sammlung von Philips TV","intent":{"component":{"packageName":"org.droidtv.nettv.market","className":"org.droidtv.nettv.market.MarketMainActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"org.droidtv.nettv.market.MarketMainActivity-org.droidtv.nettv.market","type":"app"},{"label":"Top Auswahl","intent":{"component":{"packageName":"org.droidtv.nettvrecommender","className":"org.droidtv.nettvrecommender.NetTvRecommenderMainActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"org.droidtv.nettvrecommender.NetTvRecommenderMainActivity-org.droidtv.nettvrecommender","type":"app"},{"label":"Fernsehen","intent":{"component":{"packageName":"org.droidtv.playtv","className":"org.droidtv.playtv.PlayTvActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"org.droidtv.playtv.PlayTvActivity-org.droidtv.playtv","type":"app"},{"label":"Asphalt Nitro","intent":{"component":{"packageName":"com.gameloft.android.HEP.GloftANHP","className":"com.gameloft.android.HEP.GloftANHP.MainActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"com.gameloft.android.HEP.GloftANHP.MainActivity-com.gameloft.android.HEP.GloftANHP","type":"game"},{"label":"ORF TVthek","intent":{"component":{"packageName":"com.nousguide.android.orftvthek","className":"com.nousguide.android.tvthek.fire.MainActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"com.nousguide.android.tvthek.fire.MainActivity-com.nousguide.android.orftvthek","type":"app"},{"label":"ZDFmediathek","intent":{"component":{"packageName":"com.zdf.android.mediathek","className":"com.zdf.android.mediathek.ui.splash.SplashActivity"},"action":"empty"},"order":0,"id":"com.zdf.android.mediathek.ui.splash.SplashActivity-com.zdf.android.mediathek","type":"app"},{"label":"kabel eins Doku","intent":{"component":{"packageName":"de.prosiebensat1digital.kabeleinsdoku","className":"de.prosiebensat1digital.seventv.view.SplashScreenActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"de.prosiebensat1digital.seventv.view.SplashScreenActivity-de.prosiebensat1digital.kabeleinsdoku","type":"app"},{"label":"ProSieben MAXX","intent":{"component":{"packageName":"de.prosiebensat1digital.prosiebenmaxx","className":"de.prosiebensat1digital.seventv.view.SplashScreenActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"de.prosiebensat1digital.seventv.view.SplashScreenActivity-de.prosiebensat1digital.prosiebenmaxx","type":"app"},{"label":"ARTE","intent":{"component":{"packageName":"org.droidtv.nettvapp1814","className":"com.zeasn.app.linux.MainActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"com.zeasn.app.linux.MainActivity-org.droidtv.nettvapp1814","type":"app"},{"label":"ARD Mediathek","intent":{"component":{"packageName":"org.droidtv.nettvapp3093","className":"com.zeasn.app.linux.MainActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"com.zeasn.app.linux.MainActivity-org.droidtv.nettvapp3093","type":"app"},{"label":"Flimmit","intent":{"component":{"packageName":"org.droidtv.nettvapp4470","className":"com.zeasn.app.linux.MainActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"com.zeasn.app.linux.MainActivity-org.droidtv.nettvapp4470","type":"app"},{"label":"Flimmit","intent":{"component":{"packageName":"org.droidtv.nettvapp5194","className":"org.droidtv.nettvapplication.NetTVActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"org.droidtv.nettvapplication.NetTVActivity-org.droidtv.nettvapp5194","type":"app"},{"label":"Kodi","intent":{"component":{"packageName":"org.xbmc.kodi","className":"org.xbmc.kodi.Splash"},"action":"android.intent.action.MAIN"},"order":0,"id":"org.xbmc.kodi.Splash-org.xbmc.kodi","type":"app"},{"label":"Solid Explorer","intent":{"component":{"packageName":"pl.solidexplorer2","className":"pl.solidexplorer.SolidExplorer"},"action":"android.intent.action.MAIN"},"order":0,"id":"pl.solidexplorer.SolidExplorer-pl.solidexplorer2","type":"app"},{"label":"Emby","intent":{"component":{"packageName":"tv.emby.embyatv","className":"tv.emby.embyatv.startup.StartupActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"tv.emby.embyatv.startup.StartupActivity-tv.emby.embyatv","type":"app"},{"label":"Einstellungen","intent":{"component":{"packageName":"org.droidtv.settings","className":"org.droidtv.settings.setupmenu.SetupMenuActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"org.droidtv.settings.setupmenu.SetupMenuActivity-org.droidtv.settings","type":"app"},{"label":"Sender installieren","intent":{"component":{"packageName":"org.droidtv.settings","className":"org.droidtv.settings.setupmenu.ChannelSettingActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"org.droidtv.settings.setupmenu.ChannelSettingActivity-org.droidtv.settings","type":"app"},{"label":"Wie Sie...","intent":{"component":{"packageName":"org.droidtv.eum","className":"org.droidtv.eum.onehelp.menu.HowToLauncherActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"org.droidtv.eum.onehelp.menu.HowToLauncherActivity-org.droidtv.eum","type":"app"},{"label":"Kabellos und Netzwerke","intent":{"component":{"packageName":"org.droidtv.settings","className":"org.droidtv.settings.setupmenu.WirelessAndNetworkSettingsActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"org.droidtv.settings.setupmenu.WirelessAndNetworkSettingsActivity-org.droidtv.settings","type":"app"},{"label":"Apps verwalten","intent":{"component":{"packageName":"com.android.tv.settings","className":"com.android.tv.settings.device.apps.AppsActivity"},"action":"empty"},"order":0,"id":"com.android.tv.settings.device.apps.AppsActivity-com.android.tv.settings","type":"app"},{"label":"Hilfe","intent":{"component":{"packageName":"org.droidtv.eum","className":"org.droidtv.eum.onehelp.menu.OneHelpActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"org.droidtv.eum.onehelp.menu.OneHelpActivity-org.droidtv.eum","type":"app"},{"label":"Software aktualisieren","intent":{"component":{"packageName":"org.droidtv.settings","className":"org.droidtv.settings.setupmenu.UpdateSWSettingsActivity"},"action":"android.intent.action.MAIN"},"order":0,"id":"org.droidtv.settings.setupmenu.UpdateSWSettingsActivity-org.droidtv.settings","type":"app"}]}

Thank you

MQTT volume command

I can't get the volume command to work over mqtt by using {{"command":"volume","body":{"value":10}}
Am I doing something wrong.

[BUG] Android TV 32PFS6402 : SSL handshake time out

Hello

I have a SSL handshake time out that occurs very often. The only way I found to bypass is to restart the Android OS of the TV, but after a while it appears again, here is the log:

https://192.168.1.27:1926/6/pair/request
Traceback (most recent call last):
File "C:\Python35\lib\site-packages\urllib3\connectionpool.py", line 344, in _make_request
self._validate_conn(conn)
File "C:\Python35\lib\site-packages\urllib3\connectionpool.py", line 843, in validate_conn
conn.connect()
File "C:\Python35\lib\site-packages\urllib3\connection.py", line 370, in connect
ssl_context=context)
File "C:\Python35\lib\site-packages\urllib3\util\ssl
.py", line 368, in ssl_wrap_socket
return context.wrap_socket(sock)
File "C:\Python35\lib\ssl.py", line 376, in wrap_socket
_context=self)
File "C:\Python35\lib\ssl.py", line 747, in init
self.do_handshake()
File "C:\Python35\lib\ssl.py", line 983, in do_handshake
self._sslobj.do_handshake()
File "C:\Python35\lib\ssl.py", line 628, in do_handshake
self._sslobj.do_handshake()
socket.timeout: _ssl.c:629: The handshake operation timed out

Do you know why and how to correct it ?
PS: I have the last firmware on the TV

[BUG] MQTT not working with utf8 encoded payload (ex.: from fhem)

Describe the bug
mqtt publish from fhem is not working with the following command:

set myBroker publish /smarthome/sz/tv/cmd {"command":"volume_down"}

I have debugged it, and it seems the payload is utf8 encoded!
So after changing line 338 from:

message = json.loads(msg.payload)

to:

message = json.loads(msg.payload.decode('utf-8'))

fixed the issue for me!
I think that change makes no problem with no utf8 encoded strings, but that has to be tried.
Sadly i dont have any other mqtt device to test.

Can you please test this on your side and add this fix?

To Reproduce
see above

Expected behavior
fhem mqtt publish should work with pylips

Timer set up

Hello,

Nice job with the documentation and everything else. I’m trying to set up the timer. I can get info with :
"menuitems/settings/current -d {"nodes":[{"nodeid":2131230835}]}"

It returns :
"values":[{"value":{"Nodeid":2131230835,"Controllable":true,"Available":true,"string_id":"Arrêt programmé","data":{"value":0}}}],"version":0}

So I have the good nodeid for the timer and it is controllable.
If I change with the remote the timer to power off the value changes with the previous command again. But if I send the following command, I got no error but the timer is not set up !!

menuitems/settings/update -d {"values":[{"value":{"Nodeid":2131230835,"Controllable":true,"Available":true,"data":{"value":40}}}]}"

Value=40 for 40 minutes before shutting down the TV...

How can I fix this ?

Thanks.

[FEAT] Add textentry to documentation

Some Android TVs appear to support text input via the Jointspace api.

I'm not a 100% sure about this but the system response seems to suggest it:

{
  "featuring": {
    "jsonfeatures": {
      "textentry": [
        "context_based",
        "initial_string_available",
        "editor_info_available"
      ]
    }
  }
}

If you look at for example how the recordings feature is returned in the jsonfeatures object:

{
  "featuring": {
    "jsonfeatures": {
      "recordings": [
        "List",
        "Schedule",
        "Manage"
      ]
    }
  }
}

This references that the recordings feature has a List endpoint. And the recordings feature does indeed have a /recordings/list endpoint.

If the textentry feature follows the same logic this should be available at /textentry or something like /textentry/context_based or /textentry/editor_info_available. However I haven't been able to figure out which endpoints this feature uses or when its available, most likely only when an input field is selected.

As far as I know the Philips Remote App doesn't offer any text input options, even though my tv appears to support it, so its a tricky one to reverse engineer.

Any thoughts?

Help Launch Netflix

Hi eslavnov,

I am trying to use your code to include in my home automation.

I have all the basic commands working, however, I can't seem to follow your instruction for launching apps.

In particular, I am trying Netflix to start with. Your example code for YouTube works perfectly, however, I can't seem to replicate it when I substitute the package and class name for Netflix that I retrieved using the API call.
{"component":{"packageName":"com.netflix.ninja","className":"com.netflix.ninja.MainActivity"}}

Are you able to explain this further for me?

[BUG] Can't launch Netflix (Philips TV POS9002)

Describe the bug
Might be a new user error, when I try the example code to launch netflix, amazon prime etc I can't.

This is the message I get back when using it.

Traceback (most recent call last):
File "pylips.py", line 453, in
pylips = Pylips(os.path.dirname(os.path.realpath(file))+"/settings.ini")
File "pylips.py", line 109, in init
self.run_command(args.command,body, self.verbose)
File "pylips.py", line 311, in run_command
return self.post(self.available_commands["post"][command]["path"], body,verbose, callback)
File "pylips.py", line 265, in post
body = json.loads(body)
File "C:\Python34\lib\json_init_.py", line 318, in loads
return _default_decoder.decode(s)
File "C:\Python34\lib\json\decoder.py", line 343, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Python34\lib\json\decoder.py", line 361, in raw_decode
raise ValueError(errmsg("Expecting value", s, err.value)) from None
ValueError: Expecting value: line 1 column 1 (char 0)

To Reproduce
Use this in CMD:

python pylips.py --command launch_app --body '{"id":"com.amazon.amazonvideo.livingroom","order":0,"intent":{"action":"Intent{act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 pkg=com.amazon.amazonvideo.livingroom }","component":{"packageName":"com.amazon.amazonvideo.livingroom","className":"com.amazon.ignition.IgnitionActivity"}},"label":"Prime Video"}'

Expected behavior
Opens Amazon Prime

Screenshots
If applicable, add screenshots to help explain your problem.

Additional context
Probably a new user error.

[FEAT] Switch TV On (WOL)?

First, thanks for this beautiful python script!
Back half a year i was struggling to control my new "65PUS8102" (android tv) from windows and eventghost. This was solved by an modified older philips script which was no so mighty as this :-)
Currently did'nt tried it, but it looks very promissing and i will try it soon.

So here is my question/feature request:
Back half a year i have solved it with an usb -> ir transmitter and sent "on" (or 1) to switch it on.
I realized that the JS api to turn it on does'nt work when the tv was off for an amount off time.
WOL did'nt work, regardless of its power state.
I'll think it enters some sort of deep standby and switches off network.
Yeah, there is an option to deactivate it, but sadly this has'nt solved the issue.
I could not power it on over network.

I have read your very detailed readme (thanks for this) but could not find any word of this "issue" i had. In the meantime i have received the Pie update but did not tried JS or WOL again.

How do you power on the philips android tv over network without the use of the philips app?
Does WOL work for you, all the time?
Which settings do i have to change that it maybe work?
Any chance to get a WOL feature, or is it already implemented?

Thank a lot and keep up the good work

[FEAT] send text to TV

Hello, I would like to send notifications on the TV screen. It is possible because there is a command to send text but it doesn’t work for me.

I have an Echo device and if I use the Alexa app in the TV to pair both devices (Alexa and TV) I can see notifications on the screen when I turn the TV off for example, the TV writes something like Goodbye on the screen. It could be very useful for those who do home automation (alarm for example...).

Does somebody know how this command works ?

I don’t know how to use a sniffer to catch the trafic but I think it is possible. If someone could help for that... Thanks

[FEAT] Allow self signed SSL certificates

Is your feature request related to a problem? Please describe.
While mqtt over TLS is supported, it's missing the possibility to configure a custom SSL/TLS certificate.

Describe the solution you'd like
I'd like to have a config option where I can configure my broker SSL cert.

Describe alternatives you've considered
n/a

Additional context
paho-mqtt supports these options in the tls_set() function. See https://pypi.org/project/paho-mqtt/#option-functions

(my example setup with self.mqtt.tls_set("/opt/pylips/mosquitto.crt") works)

Standard Lounge Light Scenes

Hello and many thanks for the tool.

I have discovered that it is also possible to call up the standard Lounge Light scenes via :
192.168.XXX.XX:1925/6/ambilight/currentconfiguration

Maybe you would like to record them as well?

Here are the bodies for it:

{
"styleName": "FOLLOW_COLOR",
"isExpert": false,
"menuSetting": "HOT_LAVA",
"stringValue": "Hot Lava"
}


{
"styleName": "FOLLOW_COLOR",
"isExpert": false,
"menuSetting": "ISF",
"stringValue": "Warm White"
}


{
"styleName": "FOLLOW_COLOR",
"isExpert": false,
"menuSetting": "PTA_LOUNGE",
"stringValue": "Cool White"
}


{
"styleName": "FOLLOW_COLOR",
"isExpert": false,
"menuSetting": "FRESH_NATURE",
"stringValue": "Fresh Nature"
}


{
"styleName": "FOLLOW_COLOR",
"isExpert": false,
"menuSetting": "DEEP_WATER",
"stringValue": "Deep Water"
}

Best Regards
Nastras

[QUESTION] MQTT Power Status during Night

Describe the bug
Before i'll used pylips my smarthome ping'ed the ethernet interface of my TV's (65PUS8102 & 55PUS9104).
If they where offline/online this was a trigger todo certain things (switching lights, ...).
Sadly the philips tv has woke up in the night on ~04:00 AM everyday made this useless as a trigger.
After activating alexa on the tv, the "deep standby" was deactivated and the power state worked reliable.

After some time i switched to pylips with mqtt for power state (3sec intervall), which also works good (alexa is activated).

So my question is, does the power state also works when alexa is deactivated?
So DONT send "on" state @ ~04:00 AM when the TV is doing its magic (channel scanning!?)?

I want to deactivate alexa because i think, since i have activated it, the tv is more unstable (because of long runtime).
Also i have some audio dropout's on my HDMI ARC connected audio system. After reboot -> everything is in good shape.

To Reproduce
Steps to reproduce the behavior:

  1. deactivate alexa on the tv
  2. setup pylips with mqtt to your smarthome
  3. set an trigger in your smarthome to switch on ligths or do some logging when tv goes on

Expected behavior
I'll hope that this works, so i can deactivate alexa and use deep standby again.
Also i would throw les energy without alexa.

Hope anyone of you is using this in such way and can give me some hints 👍

thx

[FEAT] Installation failed - Dependency pycrypto - Change in requirements.txt

Installing requirements from "requirements.txt" was not possible.
The package "pycrypto" failed to install.
Installing Visual Studio C++ Build Tools does not change anything.

At long last i installed the package "pycryptodome":
$pip install pycryptodome
This package worked for me and the TV "Philips 65PUS6704/12" is working (Not fully tested yet).

[FEAT] Available for testing

First, I'd like to thank you for this! Beautiful! 👍

I have a 49PUS8303 and I'm available for testing any new feature 😄
Looking forward to MQTT integration also - definitely big progress for home automation...

[FEAT]Make a pip package

Is your feature request related to a problem? Please describe.
I use Home Assitant, and I would really like to add your work in this eco system. It will allow a lot of user to easily control the Ambilight light as a classic connected light and some other great feature.

Describe the solution you'd like
I have some basics skills in Python and I can work on the integration in Home Assistant but the software require a pip library to make it easy. (Maybe I can use directly this github repository but I have to look further to see if it possible).

Describe alternatives you've considered
I can make another repo from scratch and make the library from scratch based on your work. But it could be difficult for me to reflect any update made by you.

Additional context
I'm open to any idea that could lead to integrate TV in Home Assistant. I can provide some help if it's not beyond my skills in Python.

[FEAT] Screen off but keep audio

On my philips I have an option to turn off the screen but keep the sound.
Used with audio applications like chromecast or spotify ...
Can this command be added? I did not find it in the api joint sapce: '(

[BUG]/[FEAT] Reuse SSL session to fix unresponsive API

40PFT6550/12 stops responding to commands from pylips after a certain point. If the MQTT_update setting is on, it stops fairly quickly and on its own with no input necessary, but if it's disabled, it stops after a number of commands has been sent out and successfully received. The TV starts listening to commands again after it has been put on standby then woken up again.

As the official remote app works fine with any number of commands sent out and any length of time, this seems to be an issue in how the two connect and interact. I initially suspected that there was a missing protocol feature, like a reauthentification, rehandshaking or re-something after a number of commands, but it looks like Home Assistant users are on to something:

https://community.home-assistant.io/t/philips-android-tv-component/17749/14

h0bb3
I got this working on my 55pus727212, i.e. got the pairing code and could then use the component in home assistant (change volume worked fine).

However, after maybe 5-10 volume adjustment tests, it suddenly stopped working and I have not been able to pair it any more (i.e. nothing happens when doing this). Tried restarting the TV etc, but nothing. Any ideas?

https://community.home-assistant.io/t/philips-android-tv-component/17749/15

martijnv
I experienced the same problem, after a minute or 10 the component stopped working because the television stopped responding to the requests. I ran some tests and found that after exactly 100 requests the REST API stopped working. I dug a little deeper with Wireshark and discovered that the problem was caused by the SSL-handshake. At request 101 the client send its SSL “client hello”, but the server did not give a “server hello” back anymore. My guess is that the webserver in the television caches SSL connections in an array of max 100 items.

I’m creating a new version that reuses the SSL connection. The test version that I’m running now appears to be stable this way. I’ve also added channel information, a volume slider en rewind/pause/forward functions. It’s almost done and I will share it very soon.

Sure enough, the following lines of the Home Assistant Philips TV component code say the following:

https://github.com/nstrelow/ha_philips_android_tv/blob/e786331c349937618e12c8b371ebde4d80339fbb/custom_components/philips_android_tv/media_player.py#L299

The XTV app appears to have a bug that limits the nummber of SSL session to 100
The code below forces the control to keep re-using a single connection

After martijnv's post, the issue no longer seems to crop up in the HA component thread so it's safe to assume that the issue is fixed by the solution.

Is this feasible to implement in pylips for us stubborn MQTT and Node-RED users? Thanks in advance!

Launching Apps - adding to documentation

Many thanks for your work! I am currently using it for the IOT system ioBroker since there is a plugin which needs some enhancements and I guess your Python code is awesome and should be adopted.
See https://forum.iobroker.net/topic/8791/aufruf-philips-tv-v0-1-0-testen (in German).

I would wish to add some more examples for launching apps to the documentation. Finally, all does follow the same syntax and we just need to use "Activities current (GET)" to get the current application data and then change the template accordingly.

`Amazon Prime Video:
{"id":"com.amazon.amazonvideo.livingroom","order":0,"intent":{"action":"Intent{act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 pkg=com.amazon.amazonvideo.livingroom }","component":{"packageName":"com.amazon.amazonvideo.livingroom","className":"com.amazon.ignition.IgnitionActivity"}},"label":"Prime Video"}

Kodi
{"id":"org.xbmc.kodi","order":0,"intent":{"action":"Intent{act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 pkg=org.xbmc.kodi }","component":{"packageName":"org.xbmc.kodi","className":"org.xbmc.kodi.Splash"}},"label":"Kodi"}

Netflix
{"id":"com.netflix.ninja","order":0,"intent":{"action":"Intent{act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 pkg=com.netflix.ninja }","component":{"packageName":"com.netflix.ninja","className":"com.netflix.ninja.MainActivity"}},"label":"Netflix"}

YouTube
{"id":"com.google.android.apps.youtube.tv.activity.ShellActivity-com.google.android.youtube.tv","order":0,"intent":{"action":"Intent{act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 pkg=com.google.android.youtube.tv cmp=com.google.android.youtube.tv/com.google.android.apps.youtube.tv.activity.ShellActivity }","component":{"packageName":"com.google.android.youtube.tv","className":"com.google.android.apps.youtube.tv.activity.ShellActivity"}},"label":"YouTube"}`

[FEAT] Add Support for Saphi OS TVs

Is your feature request related to a problem? Please describe.
Couldn't find anywhere saying that this code supports Saphi OS TVs and this would be nice to have.

Describe the solution you'd like
I would like to be able to control Saphi OS TVs with the same commands that you have for other philips TVs

Describe alternatives you've considered
I don't think there is anywhere some alternatives for this type of TVs.

Additional context
No

[BUG]

Hi,

Initial communication has completed and has populated settings.ini however attempting to issue a command fails returning back a message that ‘The request requires authentication’.

I’ve also tried issuing the command while also adding the user and pass variables but with the same response back.

python3 ./pylips.py --command volume
Sending GET request to https://192.168.1.71:1926/6/audio/volume
Request sent!

<title>Status page</title>

Unauthorized

The request requires user authentication

You can get technical details here.
Please continue your visit at our home page.

[FEAT]List of supported models in wiki.

Is your feature request related to a problem? Please describe.
I plan to buy a Philips TV very soon (like today) with the Saphi OS. I would like to know if this library can handle this model.

Describe the solution you'd like
Generally, it could be great to have a list of all supported TV in the wiki for example. This list could be filled with the community that use this library.

Additional context
This is the model that I plan to buy PHILIPS 65OLED754.

Determining TV port

Hi,

I've been using your wiki as a reference for creating an app that allows a Homey to control Philips TV's. It's been a great help and I might be able to shed some light on a few more features, but that's not what this is about.

In your readme you state that the main difference between regular Philips TV's and Philips Android TV's is the different port which they use. That seemed pretty clear and straightforward, but I've ran into some issues with the Jointspace api since.

Current situation

Currently I've got a user of my app who has a 2016 Philips Android TV which doesn't listen on port 1926 at all. It does however require digest authentication and the use of https for private endpoints via port 1925.

My own Philips Android TV is from 2018 and listens on both port 1925 and 1926. But in my case only the public endpoints such as /6/system and /6/notifychange are accessible via de 1925 port (both http and https work on this port which feels a bit strange). Sending a pair request to my TV requires the use of port 1926 and confirming the pair request also needs to done on port 1926.

Determining the port

My question; do you know of a way to determine which of these ports should be used to fetch the public /6/system endpoint and which port should be used for confirming the pairing process and accessing private endpoints?

[FEAT] Silent Reboot

Using pylips in mqtt mode now on an 65pus8102 and 55pus9104, it works really good!!
Since activating alexa on the TV sets it doesn't deactivate the network interfaces in standby (I think it just don't go in any sleep mode) and I am able to wake it with pylips sending standby key.

Sadly in my case, after a few days the sound over my avr (connected with ARC) is choppy. A manual restart of the TV set, solves the issue.

So my feature request! / question is a silent, scheduled reboot with pylips.

PS. : adb reboot is working but not silent

Is this possible?

Thx

[FEAT] Add input switch commands

Is your feature request related to a problem? Please describe.
I'd like to have a way to switch between HDMI inputs

Describe the solution you'd like
I'd be surprised if such API was not available, but I don't have enough experience to tell.

[BUG] Power on won't work on 55PUS7304/12

Hello.

In the last version, I see that there is a power_on command, which I was very happy to see implemented.. but it doesn't seem to work on my 55PUS7304/12.

I did multiple tests:

  • before running allow_power_on
  • after running allow_power_on
  • with the TV in standby
  • with the TV in deep sleep
  • with the TV in deep sleep after sending WoL packet
    Every time it's the same result, power_on command doesn't seem to do anything.

Is there any way to fix this? Or at least start the API after sending a WoL package? (if the API starts up, I can use standby to power on the TV)

[BUG] pairing 55PUS7394/12 (2019) fails (part 2)

(...follow up to #41 as I couldn't reopen the issue...)

I updated the TVs Android software and successfully paired it with the iOS remote app, but the app doesn't do too much (ratings in the app store complain about missing/broken functionality with the latest app version).

After rebooting the TV now I get following:

python3 pylips.py 
Checking API version and port...
Trying http://IP.OF.MY.TV:1925/6/system
Connection refused
Trying http://IP.OF.MY.TV:1925/5/system
Connection refused
Trying http://IP.OF.MY.TV:1925/1/system
Connection refused
PING IP.OF.MY.TV (IP.OF.MY.TV) 56(84) bytes of data.
64 bytes from IP.OF.MY.TV: icmp_seq=1 ttl=64 time=0.597 ms

--- IP.OF.MY.TV ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.597/0.597/0.597/0.000 ms
IP IP.OF.MY.TV is online, but no known API is found. Exiting...

When I open the URL http://IP.OF.MY.TV:1925/6/system in my browser the result is

{"notifyChange":"http","menulanguage":"German","name":"55PUS7394-12","country":"Germany","serialnumber_encrypted":"H0HR6EHZSqqWtybuK40VCrnDxto62F89nqinyiuKo8A=\n","softwareversion_encrypted":"HUUPMg2cTvN\/QxSl+S+1x3LDy\/rpbDcYCScz\/pD42bjcp9kbObXMYLF7gEfGNXYK\n","model_encrypted":"x378brSX+8m4vCn29qtoG6a7g4l1YG3eX8XDWCDesZ4=\n","deviceid_encrypted":"hzu0wwK8b2wml0HUPWJz3tkNCxAuEqgRji79EOR\/yKI=\n","nettvversion":"8.2.0","epgsource":"no_epg","api_version":{"Major":6,"Minor":1,"Patch":0},"featuring":{"jsonfeatures":{"editfavorites":["TVChannels","SatChannels"],"recordings":["List","Schedule","Manage"],"ambilight":["LoungeLight","Hue","Ambilight","HueStreaming"],"menuitems":["Setup_Menu"],"textentry":["not_available"],"applications":["TV_Apps","TV_Games","TV_Settings"],"pointer":["not_available"],"inputkey":["key"],"activities":["intent"],"channels":["preset_string"],"mappings":["server_mapping"]},"systemfeatures":{"tvtype":"consumer","content":["dmr","pvr"],"tvsearch":"intent","pairing_type":"digest_auth_pairing","secured_transport":"true","companion_screen":"true"}},"os_type":"MSAF_2019_P"}

The other URLs do not return anything.

[BUG] pylips dies on 55OLED754/12 (apiversion 6.1.0) because http://x.x.x.x:1925/6/activities/current does not exist

Describe the bug
The new Philips 55OLED754/12 reports as apiversion it's 6.1.0 but it does not support the /6/activites/current endpoint. This makes the use of pylips mostly impossible especially in MQTT mode which I wanted to use because it just dies because it tries to query activities as soon as the tv is in mode Powerstate "on"

To Reproduce
1.) configure mqtt settings in settings.ini
2.) start pylips in MQTT mode (so without any parameters)
3.) pylips dies as soon as it tries ti query activities

Expected behavior
there ahould at least be a possibility to skip this query or not do a fatal call Probably script should go on on every "Not Found" answer.

[FEAT] Launch shutdown/restart menu

Hey @eslavnov,

hope you and your family are doing well these days?

I have an idea regarding launching the shutdown/restart menu on the android TV over pylips.

In the toengel blog there is an interesting entry which allows to map the shutdown/restart menu to any button (except standby). Also starting apps, activities can be launched this way!

Here it is: https://toengel.net/philipsblog/2020/04/02/philips-android-tv-fernbedienung-neu-belegen-neustart-restart-dialog-anzeigen/

Launching apps is already supported by pylips and using activities (as i understand, sorry not so deep in android).

So would it be possible to send the "show shutdown/restart" activity over pylips to the tv?

thanks a lot
Tobias

[BUG] return print('Error', r.json())

Describe the bug
I am seeing the error below when I try to run a pylips command

File "pylips.py", line 48 return print('Error', r.json())

I notice that that in line 44 there is a request to an ip address (172.168.201.11) that is not responding. Shouldn't this be the ip address of your TV instead?

To Reproduce
Steps to reproduce the behavior:
run the following command:
python pylips.py --host <ip address> --user <user code> --pass <pass code> --command powerstate

Expected behavior
JSON reflecting the result of the powerstate command

[BUG] Ambilight+Hue commands not work (Philips 55PUS7304)

Hello!
First congratulate you for this great script. The second I apologize for my English, I must use Google Translate.
I am trying to generate a switch by mqtt to be able to turn the Ambilight + Hue on and off on the 55PUS7304 and be able to integrate this feature into my home automation center.
The Philips Remote application connects relatively well with the TV (it has disconnection failures and the ambilight bridge settings do not synchronize with the TV) but the turning on and off of both Ambilight and Ambilight-Hue, once configured on the TV, work well .

This is the value returned by mqtt:
{"powerstate": "On", "volume": 20, "muted": false, "cur_app": "uk.co.freeview.onnow", "ambilight": {"styleName": "FOLLOW_VIDEO", "isExpert ": false," menuSetting ":" NATURAL "," stringValue ":" Natural "}," ambihue ": 5}

I don't understand that value 5 in Ambihue. If I turn off the ambihue with the app or from the TV, it does not change.

I deactivate the mqtt in settings.ini and now I do tests with the readme commands:

For status

pi@DiyHuePi:/pylips $ sudo python3 pylips.py --host 172.16.10.11 --user qqjKm8W9ub5RCrW3 --pass 73ad38878df23d1689b9fc0cfaec9c1f5067f30b0fbf56ce1e609b76c0e47884 --command ambihue_status
Sending POST request to https://172.16.10.11:1926/6/menuitems/settings/current
Request sent!
{"values":[{"value":{"Nodeid":2131230774,"Controllable":true,"Available":false,"string_id":"Brillo de la parte inferior","data":{"value":5}}}],"version":1581773617053}

For Ambi+Hue on

pi@DiyHuePi:/pylips $ sudo python3 pylips.py --host 172.16.10.11 --user qqjKm8W9ub5RCrW3 --pass 73ad38878df23d1689b9fc0cfaec9c1f5067f30b0fbf56ce1e609b76c0e47884 --command ambihue_on
Sending POST request to https://172.16.10.11:1926/6/menuitems/settings/update
Request sent!
{"response": "OK"}

For Ambi+Hue off

pi@DiyHuePi:/pylips $ sudo python3 pylips.py --host 172.16.10.11 --user qqjKm8W9ub5RCrW3 --pass 73ad38878df23d1689b9fc0cfaec9c1f5067f30b0fbf56ce1e609b76c0e47884 --command ambihue_off
Sending POST request to https://172.16.10.11:1926/6/menuitems/settings/update
Request sent!
{"response": "OK"}

Nothing happens. Only change in status, the value
"version": 1581773617053
that its number is increasing (54, 55, 56 ...)

These are the values offered in the browser https://172.16.10.11:1926/6/system
{"notifyChange":"http","menulanguage":"Spanish","name":"55PUS7304\/12","country":"Spain","serialnumber_encrypted":"s53vNo\/gABVJXbfA4wAP0w3Rsy6YcS6g5dtYQLWw76E=\n","softwareversion_encrypted":"wuIstBMd8\/WsNDlcly9T4EeYPOI+GJrK08kDdVFC3b7a17YUuVYF7Er6ZBA2Unom\n","model_encrypted":"IHrF2HY3A1IcuZYPrd02ozA9ilATGZQR\/H6ictzWVcI=\n","deviceid_encrypted":"vxw2iJBhiCSM5Ig5H9\/jCwnAbzSbE\/Twt5cRWtEwasI=\n","nettvversion":"8.2.0","epgsource":"no_epg","api_version":{"Major":6,"Minor":1,"Patch":0},"featuring":{"jsonfeatures":{"editfavorites":["TVChannels","SatChannels"],"recordings":["List","Schedule","Manage"],"ambilight":["LoungeLight","Hue","Ambilight","HueStreaming"],"menuitems":["Setup_Menu"],"textentry":["not_available"],"applications":["TV_Apps","TV_Games","TV_Settings"],"pointer":["not_available"],"inputkey":["key"],"activities":["intent"],"channels":["preset_string"],"mappings":["server_mapping"]},"systemfeatures":{"tvtype":"consumer","content":["dmr","pvr"],"tvsearch":"intent","pairing_type":"digest_auth_pairing","secured_transport":"true","companion_screen":"true"}},"os_type":"MSAF_2019_P"}

Any ideas or help? Any test I can do, I offer my model to test
Thx

[FEAT] "Follow Sound" Ambilight with a custom color

Official Phillips app has the ability to set ambilight to "Follow Sound" and then pick a specific color to avoid the "rainbow effect".

I tried replicating this with custom commands without success, not even with CURL. Seems like the app does something different...

This is what I GET with this mode active:

GET /6/ambilight/currentconfiguration:

"styleName":"FOLLOW_AUDIO",
"isExpert":true,
"audioSettings":{

"color":{"hue":165,"saturation":251,"brightness":140},
"colorDelta":{"hue":0,"saturation":0,"brightness":140},
"tuning":2,"
algorithm":"ENERGY_ADAPTIVE_COLORS"}

Findings:

"algorithm": will show the name of the next algorithm on the list, and not the one currently active (weird). Trying to POST different algorithms will overlap the defined color for some reason

"color delta": seems to be an additional color you can pick and mix with the first color. Some algorithms will bounce back and forth between these 2, but it usually overlaps them together and creates a new color

"tuning": No matter what I POST here, it remains at 2 when I do a GET

I tried doing a MITM Proxy to understand what the app is POSTING to make the color stay put, but I'm stuck at app pairing. If I pair the app without the proxy, then it won't reach the TV once connected to the proxy again.

Having pylips include this command would be great, as I'm not really a fan of the "rainbow" approach.

[FEAT] Volume Response & Changing when connected to Headphone Output

First, thanks for the great script and API documentation, has really helped me out build some home automation stuff between the TV, Node-Red and Homekit!

I am using a 50PUS6703/12 TV operating a Linux OS, I am however using the headphone output of the TV to output audio to external speakers. When running the command python3 pylips.py volume it returns the same values regardless of the mute status or volume level of the TV at the time. I have since discovered that this is returning the settings for the volume of the internal speakers; when unplugging the 3.5mm jack from the headphone output and adjusting the volume/mute status with the remote, this then is reflected in the response from the API and subsequently the pylips script. It is therefore clear that the data for the internal speakers and headphone output are stored separately, and could be accessible from alternative endpoints?

It would be great if an API endpoint was documented (if it exists) and a command added to the pylips script to return the volume of the headphone output instead of the internal output. Subsequently it may also become prudent to document the API endpoint (if it exists) and have a command that returns which output is currently active so that the appropriate request can then be made to find the current TV volume (headphones or internal)

Note, when making post requests to the http://ip-address:1925/6/audio/volume endpoint, sending {"muted": false} or {"muted": true} DOES change the muted status for the active output (headphones or internal speakers), but sending {"current": 18} ONLY changes the volume of the internal TV speakers so in the case headphones are connected makes no audible change. Of course using the https://ip-address:1926/6/input/key endpoint, and sending {"key": "VolumeUp"}, {"key": "VolumeDown"}, or {"key": "Mute"} does reflect changes to whichever output is currently active (headphones or internal speakers) as it is just the same as if the TV remote was to be used directly. It is therefore requested that consideration be made for documentation of the API endpoint (again if it exists) that will work to set the volume of the headphone output as in the http://ip-address:1925/6/audio/volume endpoint, which as above only works for the internal speakers.

Note there also appears to be an option in the settings to output audio over HDMI, this may prove a similar issue to the above, so may require further API endpoints for access to that data?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.