<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://kodi.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fbacher</id>
	<title>Official Kodi Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://kodi.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fbacher"/>
	<link rel="alternate" type="text/html" href="https://kodi.wiki/view/Special:Contributions/Fbacher"/>
	<updated>2026-06-16T19:30:02Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://kodi.wiki/index.php?title=HOW-TO:Debug_Python_Scripts_with_Web-PDB&amp;diff=241242</id>
		<title>HOW-TO:Debug Python Scripts with Web-PDB</title>
		<link rel="alternate" type="text/html" href="https://kodi.wiki/index.php?title=HOW-TO:Debug_Python_Scripts_with_Web-PDB&amp;diff=241242"/>
		<updated>2022-01-12T00:40:30Z</updated>

		<summary type="html">&lt;p&gt;Fbacher: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{mininav|[[Development]]|[[Add-on development]]|[[Python development]]}}&lt;br /&gt;
&lt;br /&gt;
[https://github.com/romanvm/kodi.web-pdb Web-PDB] is a remote web-interface to Python&#039;s built-in [https://docs.python.org/3/library/pdb.html PDB] debugger with additional convenience features. It is not tied to any IDE or other software, all you need is a common web-browser, e.g. Chrome or Firefox. Web-PDB is compatible with both Python 2 and 3, so you can use it to debug your Python 3 compatible addons.&lt;br /&gt;
&lt;br /&gt;
[[File:web-pdb.png]]&lt;br /&gt;
&lt;br /&gt;
Web-PDB for Kodi is available as an addon in the official Kodi addons repo.&lt;br /&gt;
&lt;br /&gt;
== How To Use Web-PDB for Kodi ==&lt;br /&gt;
&lt;br /&gt;
1. Install Web-PDB addon: &#039;&#039;&#039;Kodi Add-on repository &amp;gt; Program add-ons &amp;gt; Web-PDB&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
2. Add &amp;lt;code&amp;gt;script.module.web-pdb&amp;lt;/code&amp;gt; to [[addon.xml]] as a dependency:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;requires&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
   &amp;lt;import addon=&amp;quot;script.module.web-pdb&amp;quot; version=&amp;quot;1.5.6&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;requires&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Restart Kodi so that it re-reads addon dependencies.&lt;br /&gt;
&lt;br /&gt;
4. Insert the following line into your addon code at the point where you want to start debugging:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
import web_pdb; web_pdb.set_trace()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;set_trace()&amp;lt;/code&amp;gt; call will suspend your addon and open a web-UI at the default port 5555 (port value can be changed). At the same time a notification will be displayed in Kodi, indicating that a debug session is active. The notification also shows web-UI host/port.&lt;br /&gt;
&lt;br /&gt;
5. Enter in your the address bar of your browser: &amp;lt;code&amp;gt;http://&amp;lt;your Kodi machine hostname or IP&amp;gt;:5555&amp;lt;/code&amp;gt;, for example &amp;lt;code&amp;gt;http://monty-python:5555&amp;lt;/code&amp;gt;. Use &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt; as a hostname if you are connecting from the same machine that runs Kodi. If everything is OK, you should see the Web-PDB UI. Now you can use all PDB commands and features. Additional &#039;&#039;&#039;Current file&#039;&#039;&#039;, &#039;&#039;&#039;Globals&#039;&#039;&#039; and &#039;&#039;&#039;Locals&#039;&#039;&#039; information boxes help you better track your program runtime state.&lt;br /&gt;
&lt;br /&gt;
== More Information ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/romanvm/kodi.web-pdb Web-PDB for Kodi on GitHub].&lt;br /&gt;
* [https://docs.python.org/2/library/pdb.html PDB debugger documentation].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Python]]&lt;/div&gt;</summary>
		<author><name>Fbacher</name></author>
	</entry>
	<entry>
		<id>https://kodi.wiki/index.php?title=Python_Problems&amp;diff=241239</id>
		<title>Python Problems</title>
		<link rel="alternate" type="text/html" href="https://kodi.wiki/index.php?title=Python_Problems&amp;diff=241239"/>
		<updated>2022-01-11T18:18:29Z</updated>

		<summary type="html">&lt;p&gt;Fbacher: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is meant to document Python issues of general interest to Kodi addon developers.&lt;br /&gt;
== datetime.strptime ==&lt;br /&gt;
There is an old Python bug (https://bugs.python.org/issue27400) which ONLY impacts embedded python applications, such as the Kodi Python environment. The issue is that datetime.strptime  is only initialized once per process and not every time the embedded environment is reinitialized. This causes datetime.strptime to return None and perhaps other strange behavior.&lt;br /&gt;
&lt;br /&gt;
One option is for you to replace every reference to datetime.strptime to use a strptime_patch attached to this page. This is less voodoo, but there is always the possibility that some library code uses strptime and there will still be potential for incorrect results or a Kodi crash (script.module.youtube.dl crashed Kodi for a while).&lt;br /&gt;
&lt;br /&gt;
The other option is to monkey-patch datetime.strptime so that any user of the python runtime will use it. It is voodoo like, but that is why Python supports Monkey patching. See Python documentation on datetime.strptime (https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior). It discusses some of the differences between datetime.strptime and time.strptime.&lt;br /&gt;
&lt;br /&gt;
This patch simply replaces datetime.strptime with time.strptime. They are nearly identical in function. For more information, see: https://github.com/fbacher/script.module.kutils/blob/master/lib/kutils/strptime_patch.py. Essentially the patch is:&lt;br /&gt;
&lt;br /&gt;
   @staticmethod&lt;br /&gt;
    def monkey_patch_strptime():&lt;br /&gt;
        # Check if problem exists (don&#039;t want to stomp on patch applied earlier)&lt;br /&gt;
        try:&lt;br /&gt;
            datetime.datetime.strptime(&#039;0&#039;, &#039;%H&#039;)&lt;br /&gt;
        except TypeError:&lt;br /&gt;
            # Globally replace Python&#039;s datetime.datetime.strptime with&lt;br /&gt;
            # the version here.&lt;br /&gt;
            datetime.datetime = StripTimePatch.strptime&lt;br /&gt;
    @staticmethod&lt;br /&gt;
    def strptime(date_string: str, date_format: str) -&amp;gt; datetime.datetime:&lt;br /&gt;
        result: datetime.datetime&lt;br /&gt;
        result = datetime.datetime(*(time.strptime(date_string, date_format)[0:6]))&lt;br /&gt;
        return result&lt;/div&gt;</summary>
		<author><name>Fbacher</name></author>
	</entry>
	<entry>
		<id>https://kodi.wiki/index.php?title=Python_Problems&amp;diff=241238</id>
		<title>Python Problems</title>
		<link rel="alternate" type="text/html" href="https://kodi.wiki/index.php?title=Python_Problems&amp;diff=241238"/>
		<updated>2022-01-11T18:14:58Z</updated>

		<summary type="html">&lt;p&gt;Fbacher: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is meant to document Python issues of general interest to Kodi addon developers.&lt;br /&gt;
== datetime.strptime ==&lt;br /&gt;
There is an old Python bug (https://bugs.python.org/issue27400) which ONLY impacts embedded python applications, such as the Kodi Python environment. The issue is that datetime.strptime  is only initialized once per process and not every time the embedded environment is reinitialized. This causes datetime.strptime to return None and perhaps other strange behavior.&lt;br /&gt;
&lt;br /&gt;
One option is for you to replace every reference to datetime.strptime to use a strptime_patch attached to this page. This is less voodoo, but there is always the possibility that some library code uses strptime and there will still be potential for incorrect results or a Kodi crash (script.module.youtube.dl crashed Kodi for a while).&lt;br /&gt;
&lt;br /&gt;
The other option is to monkey-patch datetime.strptime so that any user of the python runtime will use it. It is voodoo like, but that is why Python supports Monkey patching. See Python documentation on datetime.strptime (https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior). It discusses some of the differences between datetime.strptime and time.strptime.&lt;br /&gt;
&lt;br /&gt;
This patch simply replaces datetime.strptime with time.strptime. They are nearly identical in function. For more information, see: https://github.com/fbacher/script.module.kutils/blob/master/lib/kutils/strptime_patch.py. Essentially the patch is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt; @staticmethod&lt;br /&gt;
    def monkey_patch_strptime():&lt;br /&gt;
        # Check if problem exists (don&#039;t want to stomp on patch applied earlier)&lt;br /&gt;
        try:&lt;br /&gt;
            datetime.datetime.strptime(&#039;0&#039;, &#039;%H&#039;)&lt;br /&gt;
        except TypeError:&lt;br /&gt;
            # Globally replace Python&#039;s datetime.datetime.strptime with&lt;br /&gt;
            # the version here.&lt;br /&gt;
&lt;br /&gt;
            datetime.datetime = StripTimePatch.strptime&lt;br /&gt;
&lt;br /&gt;
   @staticmethod&lt;br /&gt;
    def strptime(date_string: str, date_format: str) -&amp;gt; datetime.datetime:&lt;br /&gt;
        result: datetime.datetime&lt;br /&gt;
        result = datetime.datetime(*(time.strptime(date_string, date_format)[0:6]))&lt;br /&gt;
        return result&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fbacher</name></author>
	</entry>
	<entry>
		<id>https://kodi.wiki/index.php?title=Python_Problems&amp;diff=241232</id>
		<title>Python Problems</title>
		<link rel="alternate" type="text/html" href="https://kodi.wiki/index.php?title=Python_Problems&amp;diff=241232"/>
		<updated>2022-01-11T15:22:41Z</updated>

		<summary type="html">&lt;p&gt;Fbacher: Created page with &amp;quot;This page is meant to document Python issues of general interest to Kodi addon developers. == datetime.strptime == There is an old Python bug (https://bugs.python.org/issue274...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is meant to document Python issues of general interest to Kodi addon developers.&lt;br /&gt;
== datetime.strptime ==&lt;br /&gt;
There is an old Python bug (https://bugs.python.org/issue27400) which ONLY impacts embedded python applications, such as the Kodi Python environment. The issue is that datetime.strptime  is only initialized once per process and not every time the embedded environment is reinitialized. This causes datetime.strptime to return None and perhaps other strange behavior.&lt;br /&gt;
&lt;br /&gt;
One option is for you to replace every reference to datetime.strptime to use a strptime_patch attached to this page. This is less voodoo, but there is always the possibility that some library code uses strptime and there will still be potential for incorrect results or a Kodi crash (script.module.youtube.dl crashed Kodi for a while).&lt;br /&gt;
&lt;br /&gt;
The other option is to monkey-patch datetime.strptime so that any user of the python runtime will use it. It is voodoo like, but that is why Python supports Monkey patching.&lt;br /&gt;
&lt;br /&gt;
This patch simply replaces datetime.strptime with time.strptime. They are nearly identical in function. For more information, see the attached patch.&lt;/div&gt;</summary>
		<author><name>Fbacher</name></author>
	</entry>
	<entry>
		<id>https://kodi.wiki/index.php?title=Unicode_Concerns&amp;diff=241227</id>
		<title>Unicode Concerns</title>
		<link rel="alternate" type="text/html" href="https://kodi.wiki/index.php?title=Unicode_Concerns&amp;diff=241227"/>
		<updated>2022-01-09T16:40:19Z</updated>

		<summary type="html">&lt;p&gt;Fbacher: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page highlights some of the Unicode Issues beyond simply enabling your addon or Kodi runtime for basic Unicode support. Here are a few:&lt;br /&gt;
&lt;br /&gt;
* The good news is that for the bulk of your work, it is fairly simple to read and display translated messages. The basic plumbing is in place. &lt;br /&gt;
* Side effects of Kodi issue 19883: Turkish locale set via LANG / LC_CTYPE / LC_ALL or by SetGlobalLocale breaks skin loading on any Linux. (github.com/xbmc/xbmc/issues/19883)&lt;br /&gt;
* Handling text from multiple locales (i.e complications with foreign movies or actors)&lt;br /&gt;
* How to handle internal programming keywords along with other text&lt;br /&gt;
* Quirks of some languages&lt;br /&gt;
* Searching multilingual text&lt;br /&gt;
* Unicode file names&lt;br /&gt;
* Unicode in XML&lt;br /&gt;
* Unicode file names in a zip file&lt;br /&gt;
* Json or XML processing of Unicode with keywords&lt;br /&gt;
* Lower/Upper case does not take you very far&lt;br /&gt;
* String length != number of Unicode &#039;letters&#039;&lt;br /&gt;
* The same character (both visually and logically) can sometimes be represented by more than one sequence of Unicode &#039;letters&#039;&lt;br /&gt;
* Minimal support in Python and C++&lt;br /&gt;
* Other Unicode libs exist, but non-trivial to use&lt;br /&gt;
&lt;br /&gt;
A good source of information can be found at: [https://www.unicode.org/versions/Unicode14.0.0/ch05.pdf Unicode.org]. This same organization provides a good (but not the easiest to learn) and free library that performs advanced Unicode processing. &lt;br /&gt;
&lt;br /&gt;
== Details: ==&lt;br /&gt;
&lt;br /&gt;
=== Side effects of Kodi issue 19883 ===&lt;br /&gt;
Kodi was unusable with Locale = tr_TR (Turkish). A quick fix was made, but it has some undesirable side-effects on the Python addons:&lt;br /&gt;
* The default locale cannot be read, making it impossible to determine the country code (&#039;US&#039;)&lt;br /&gt;
* The encoding for filenames is ASCII instead of UTF-8. Trying to open a file with a non-ASCII name throws exceptions. You have to explicitly encode the filename (ex: io.open(self.path.encode(&#039;utf-8&#039;))).&lt;br /&gt;
&lt;br /&gt;
On closer inspection, the Kodi C++ application has multiple problems:&lt;br /&gt;
As is common with many programs, keywords are caseless and the code normalized all keywords to lower case. However, there are multiple problems with this:&lt;br /&gt;
* ToLower works with most, but not all locales/character sets since in almost all languages ToUpper(ToLower(char)) == char. However Turkish (and others) have several characters that do not obey this rule. In addition, several of these characters are in common with English. The letter &#039;i&#039; is one of the characters. &lt;br /&gt;
* Kodi uses the same locale for processing external text as well as internal keywords. This caused any keyword containing an &#039;I&#039; to be unrecognized because ToLower would change the &#039;I&#039; to a Turkish, &#039;dotless lower case i&#039;&lt;br /&gt;
&lt;br /&gt;
In addition, ToLower and ToUpper modifies the passed string in-place. However, there is no guarantee in Unicode that the number of bytes, or Unicode characters will be the same. This means that junk can be left at the end of the string array, or memory could be clobbered at the end of the array.&lt;br /&gt;
&lt;br /&gt;
The proper solution is to create methods which handle the different ways that characters are used. Instead of using in-line calls to toLower, etc. you need methods which:&lt;br /&gt;
* Creates a setting keyword from a string&lt;br /&gt;
** Frequently keywords are looked up in a &#039;caseless&#039; manner. But with the possibility of text being in any language things get more complicated.&lt;br /&gt;
** One approach is to restrict the keyword characters in some way and then to use a specific locale just when handling the keywords. You run into trouble if you process some English characters using Turkish locale (the infamous &#039;i&#039; problem). &lt;br /&gt;
** Another approach is to &amp;quot;case fold&amp;quot; the characters. In simplistic terms the string is stripped of all accents, etc. and made lower-case. It is not meant for human consumption but generally works well for matching keywords. It has the advantage of being locale agnostic.&lt;br /&gt;
* Creates a filename from a string&lt;br /&gt;
** Some Operating Systems (Windows) internally identify the files with a caseless filename. Generally you want to compare filenames in a caseless manner (not sure if it should be done in a folded manner or not).&lt;br /&gt;
* Compares strings to see if string matches one of a list of keywords. You may need different methods for different keyword types&lt;br /&gt;
* Search and sort methods customized for the purpose and volume of searching&lt;br /&gt;
&lt;br /&gt;
In C++ you have to worry about allocating and freeing memory for toLower, normalized, caseless or other forms of the original strings. More correctly, they are transformations on the string which can change the number of bytes that the strings take up, requiring a copy. Your method signatures frequently need to pass a pointer to this temporary string around until it is finally freed.&lt;br /&gt;
&lt;br /&gt;
=== Setting names in Settings.xml ===&lt;br /&gt;
Although not widely documented, setting names are considered caseless, and are all mapped to lower case, as keywords are, above. The same problems exist. Addon programmers may be unaware of this. This means that in addition to the Kodi back-end treating setting names as keywords, Python addonss must do the same thing when comparing or manipulating these setting names.&lt;br /&gt;
=== Searching Text ===&lt;br /&gt;
Kodi provides the ability to search for movie title within the current playlist by simply (quickly) typing the first few characters [in upper case] of the title to search for. &lt;br /&gt;
This won&#039;t work properly for several reasons:&lt;br /&gt;
# The above ToLower/ToUpper problem&lt;br /&gt;
# Character collation rules vary for different locales. If the user is searching for a foreign language movie title, it may not be processed/sorted as expected. Some common way of searching/sorting needs to converged on. &lt;br /&gt;
&lt;br /&gt;
There are several approaches to solving the second problem. One is to do a caseless, accentless comparison. It looks like SQLLite and MySQL both support these. Extra columns or tables (for caseless, accentless copies of the search data) may be needed to improve performance. For some discussion on the topic see: https://www.unicode.org/versions/Unicode14.0.0/ch05.pdf&lt;/div&gt;</summary>
		<author><name>Fbacher</name></author>
	</entry>
	<entry>
		<id>https://kodi.wiki/index.php?title=Python_libraries&amp;diff=241224</id>
		<title>Python libraries</title>
		<link rel="alternate" type="text/html" href="https://kodi.wiki/index.php?title=Python_libraries&amp;diff=241224"/>
		<updated>2022-01-09T13:23:14Z</updated>

		<summary type="html">&lt;p&gt;Fbacher: URL changed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Kodi Python comes with all the standard modules from Python 3.8 or later. See https://docs.python.org/3.8/library/ for reference.&lt;br /&gt;
&lt;br /&gt;
== Built-in modules ==&lt;br /&gt;
In addition to the standard libraries, Kodi Python uses a handful of custom modules to expose Kodi functionality to Python.&lt;br /&gt;
&lt;br /&gt;
Up to date documentation about these modules can be found at https://xbmc.github.io/docs.kodi.tv/master/kodi-dev-kit/&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=5&lt;br /&gt;
| &#039;&#039;&#039;Module&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
| xbmc&lt;br /&gt;
| Offers classes and functions that provide information about the media currently playing and that allow manipulation of the media player (such as starting a new song). You can also find system information using the functions available in this library. &lt;br /&gt;
|- &lt;br /&gt;
| xbmcgui&lt;br /&gt;
| Offers classes and functions that manipulate the Graphical User Interface through windows, dialogs, and various control widgets. &lt;br /&gt;
|- &lt;br /&gt;
| xbmcplugin&lt;br /&gt;
| Offers classes and functions that allow a developer to present information through XBMC&#039;s standard menu structure. While plugins don&#039;t have the same flexibility as scripts, they boast significantly quicker development time and a more consistent user experience.&lt;br /&gt;
|- &lt;br /&gt;
| xbmcaddon&lt;br /&gt;
| Offers classes and functions that manipulate the add-on settings, information and localization.&lt;br /&gt;
|- &lt;br /&gt;
| xbmcvfs&lt;br /&gt;
| Offers classes and functions offers acces to the Virtual File Server (VFS) which you can use to manipulate files and folders.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Third-party modules ==&lt;br /&gt;
Numerous python modules are already packages as add-ons that can be imported by other add-on. See [[:Category:Add-on_libraries/modules]] for a list of available modules. To use any of these modules with your add-on, add the relevant line to [[Addon.xml#.3Crequires.3E|Addon.xml]]&lt;br /&gt;
&lt;br /&gt;
== Installing additional modules ==&lt;br /&gt;
Additional modules may be installed by simply adding the module to the root folder of your add-on.&lt;br /&gt;
&lt;br /&gt;
A common way to organized third-party modules that are not part of add-on source code itself, is to add a &amp;lt;code&amp;gt;lib&amp;lt;/code&amp;gt; directory and place an &amp;lt;code&amp;gt;__init__.py&amp;lt;/code&amp;gt; file and other third-party modules inside it. These modules may then normally be imported using &amp;lt;code&amp;gt;from lib import somemodule&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Category:Add-on development]]&lt;/div&gt;</summary>
		<author><name>Fbacher</name></author>
	</entry>
	<entry>
		<id>https://kodi.wiki/index.php?title=Unicode_Concerns&amp;diff=241143</id>
		<title>Unicode Concerns</title>
		<link rel="alternate" type="text/html" href="https://kodi.wiki/index.php?title=Unicode_Concerns&amp;diff=241143"/>
		<updated>2022-01-04T02:54:45Z</updated>

		<summary type="html">&lt;p&gt;Fbacher: Created page with &amp;quot;This page addresses Unicode Issues beyond simply enabling your addon or Kodi runtime for basic Unicode support.Some of the issues are:  Side effects of Kodi issue 19883: Turki...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page addresses Unicode Issues beyond simply enabling your addon or Kodi runtime for basic Unicode support.Some of the issues are:&lt;br /&gt;
&lt;br /&gt;
Side effects of Kodi issue 19883: Turkish locale set via LANG / LC_CTYPE / LC_ALL or by SetGlobalLocale breaks skin loading on any Linux. (github.com/xbmc/xbmc/issues/19883)&lt;br /&gt;
&lt;br /&gt;
Handling text from multiple locales (i.e complications with foreign movies or actors)&lt;br /&gt;
&lt;br /&gt;
How to handle internal programming keywords along with other text.&lt;br /&gt;
&lt;br /&gt;
Quirks of some languages&lt;br /&gt;
&lt;br /&gt;
Searching multilingual text&lt;br /&gt;
&lt;br /&gt;
Unicode file names&lt;br /&gt;
&lt;br /&gt;
Unicode in XML&lt;br /&gt;
&lt;br /&gt;
Unicode file names in a zip file&lt;br /&gt;
&lt;br /&gt;
Json or XML processing of Unicode with keywords &lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
&lt;br /&gt;
Side effects of Kodi issue 19883&lt;br /&gt;
Kodi is unusable with Locale = tr_TR (Turkish). A quick fix was made, but it has some undesirable side-effects on the Python addons:&lt;br /&gt;
The default locale cannot be read, making it impossible to determine the country code (&#039;US&#039;).&lt;br /&gt;
The encoding for filenames is ASCII instead of UTF-8. Trying to open a file with a non-ASCII name throws exceptions.&lt;br /&gt;
&lt;br /&gt;
On closer inspection, the Kodi C++ application has multiple problems:&lt;br /&gt;
As is common with many programs, keywords are caseless and the code normalized all keywords to lower case. however, there are multiple problems with this:&lt;br /&gt;
ToLower works with most, but not all locales/character sets since in almost all languages ToUpper(ToLower(char)) == char. However Turkish has several characters that do not obey this rule. In addition, several of these characters are in common with English. The letter &#039;i&#039; is one of the characters. &lt;br /&gt;
Kodi used the same locale for processing external text as well as internal keywords. This caused any keyword containing an &#039;I&#039; to be unrecognized because ToLower would change the &#039;I&#039; to a Turkish, &#039;dotless lower case i&#039;&lt;br /&gt;
&lt;br /&gt;
In addition, ToLower and ToUpper modifies the passed string in-place. However, there is no guarantee in Unicode that the number of bytes, or Unicode characters will be the same. This means that junk can be left at the end of the string array, or memory could be clobbered at the end of the array.&lt;br /&gt;
&lt;br /&gt;
The proper solution is to pass the locale to the ToLower/ToUpper methods and for the caller to use a locale which is known to be stable for all of the keywords (such as en_GB or en_US, since the code was originally developed using those locales). Callers processing just normal [Turkish] text, should pass the Turkish locale.&lt;br /&gt;
&lt;br /&gt;
Setting names in Settings.xml&lt;br /&gt;
Although not widely documented, setting names are considered caseless, and are all mapped to lower case, as keywords are, above. The same problems exist. Addon programmers may be unaware of this. This means that in addition to the Kodi back-end treating setting names as keywords, Addon Python (or other) code must do the same thing when comparing or manipulating these setting names: the addon must do any manipulation (lower/upper) using a safe locale (i.e. en_GB).&lt;br /&gt;
&lt;br /&gt;
Searching Text&lt;br /&gt;
Kodi provides the ability to search for movie title within the current playlist by simply (quickly) typing the first few characters [in upper case] of the title to search for. &lt;br /&gt;
This won&#039;t work properly for several reasons:&lt;br /&gt;
1- The above ToLower/ToUpper problem&lt;br /&gt;
2- Character collation rules vary for different locales. If the user is searching for a foreign language movie title, it may not be processed/sorted as expected. [This problem may not exist]&lt;br /&gt;
&lt;br /&gt;
There are several approaches to solving the second problem. One is to do a caseless, accentless comparison. It looks like SQLLite and MySQL both support these. Extra columns or tables (for caseless, accentless copies of the search data) may be needed to improve performance.&lt;/div&gt;</summary>
		<author><name>Fbacher</name></author>
	</entry>
	<entry>
		<id>https://kodi.wiki/index.php?title=Python_libraries&amp;diff=229408</id>
		<title>Python libraries</title>
		<link rel="alternate" type="text/html" href="https://kodi.wiki/index.php?title=Python_libraries&amp;diff=229408"/>
		<updated>2021-07-02T12:42:22Z</updated>

		<summary type="html">&lt;p&gt;Fbacher: Update link to python 3.8&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Kodi Python comes with all the standard modules from Python 3.8 or later. See https://docs.python.org/3.8/library/ for reference.&lt;br /&gt;
&lt;br /&gt;
== Built-in modules ==&lt;br /&gt;
In addition to the standard libraries, Kodi Python uses a handful of custom modules to expose Kodi functionality to Python.&lt;br /&gt;
&lt;br /&gt;
Up to date documentation about these modules can be found at https://codedocs.xyz/xbmc/xbmc/group__python.html&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=5&lt;br /&gt;
| &#039;&#039;&#039;Module&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|- &lt;br /&gt;
| xbmc&lt;br /&gt;
| Offers classes and functions that provide information about the media currently playing and that allow manipulation of the media player (such as starting a new song). You can also find system information using the functions available in this library. &lt;br /&gt;
|- &lt;br /&gt;
| xbmcgui&lt;br /&gt;
| Offers classes and functions that manipulate the Graphical User Interface through windows, dialogs, and various control widgets. &lt;br /&gt;
|- &lt;br /&gt;
| xbmcplugin&lt;br /&gt;
| Offers classes and functions that allow a developer to present information through XBMC&#039;s standard menu structure. While plugins don&#039;t have the same flexibility as scripts, they boast significantly quicker development time and a more consistent user experience.&lt;br /&gt;
|- &lt;br /&gt;
| xbmcaddon&lt;br /&gt;
| Offers classes and functions that manipulate the add-on settings, information and localization.&lt;br /&gt;
|- &lt;br /&gt;
| xbmcvfs&lt;br /&gt;
| Offers classes and functions offers acces to the Virtual File Server (VFS) which you can use to manipulate files and folders.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Third-party modules ==&lt;br /&gt;
Numerous python modules are already packages as add-ons that can be imported by other add-on. See [[:Category:Add-on_libraries/modules]] for a list of available modules. To use any of these modules with your add-on, add the relevant line to [[Addon.xml#.3Crequires.3E|Addon.xml]]&lt;br /&gt;
&lt;br /&gt;
== Installing additional modules ==&lt;br /&gt;
Additional modules may be installed by simply adding the module to the root folder of your add-on.&lt;br /&gt;
&lt;br /&gt;
A common way to organized third-party modules that are not part of add-on source code itself, is to add a &amp;lt;code&amp;gt;lib&amp;lt;/code&amp;gt; directory and place an &amp;lt;code&amp;gt;__init__.py&amp;lt;/code&amp;gt; file and other third-party modules inside it. These modules may then normally be imported using &amp;lt;code&amp;gt;from lib import somemodule&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Category:Add-on development]]&lt;/div&gt;</summary>
		<author><name>Fbacher</name></author>
	</entry>
	<entry>
		<id>https://kodi.wiki/index.php?title=JSON-RPC_API&amp;diff=178963</id>
		<title>JSON-RPC API</title>
		<link rel="alternate" type="text/html" href="https://kodi.wiki/index.php?title=JSON-RPC_API&amp;diff=178963"/>
		<updated>2019-08-23T18:50:16Z</updated>

		<summary type="html">&lt;p&gt;Fbacher: Need to find correct information about JSON-RPC for Leia, since prior note says that it is v10.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{mininav|[[Development]]}}&lt;br /&gt;
&lt;br /&gt;
{{JSON-RPC API nav}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{cleanup}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSON-RPC is a HTTP- and/or raw TCP socket-based interface for communicating with Kodi. It replaces the deprecated [[HTTP API]], and offers a more secure and robust mechanism in the same format. It is based upon the [http://jsonrpc.org/spec.html JSON-RPC 2.0 specification].&lt;br /&gt;
&lt;br /&gt;
Each method in the interface can have different security needs which means one client may be allowed to only control playback while another can only read and manipulate the library. In version 2 (first stable) and 4 all clients are granted full authority but will later be forced to ask for privileges and the user of Kodi will have to grant said client access. The design of JSON-RPC is that most methods should behave roughly the same and maintain consistency while hiding the mechanics of Kodi from the client creator.&lt;br /&gt;
&lt;br /&gt;
In Kodi JSON-RPC can be accessed over a variety of transports and has been designed from the ground up to be flexible to allow control over new transports easily. Some of the transports have different limitations which will be enforced upon the interaction over that transport. As an example HTTP transports allow response and downloading of files while the raw TCP transport allows response and notifications (events and information Kodi sends to its clients). Depending on the client&#039;s needs it will choose one (or many) of the available transports.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Enabling JSON-RPC ==&lt;br /&gt;
Since the interface is available on many transports enabling it depends on the transport.&lt;br /&gt;
* Python: Always enabled&lt;br /&gt;
* HTTP: In System/Settings/Network/Services activate &#039;&#039;Allow control of Kodi via HTTP&#039;&#039; (see [[Webserver#Enabling the webserver|Enabling the webserver]])&lt;br /&gt;
* TCP: In System/Settings/Network/Services activate &#039;&#039;Allow programs on this system to control Kodi&#039;&#039; for localhost access only and &#039;&#039;Allow programs on other systems to control Kodi&#039;&#039; for access from other computers as well&lt;br /&gt;
&lt;br /&gt;
Note: The [[EventServer]] is a different interface for sending remote keypresses to Kodi, and must be enabled separately, some programs may use both interfaces.&lt;br /&gt;
&lt;br /&gt;
== Transports &amp;amp; Functionalities ==&lt;br /&gt;
=== Transports ===&lt;br /&gt;
==== Python ====&lt;br /&gt;
The &#039;&#039;Python&#039;&#039; transport can only be used by Kodi addons through the &#039;&#039;&#039;executeJSONRPC&#039;&#039;&#039; method provided by the &#039;&#039;&#039;xbmc&#039;&#039;&#039; python library. As it must be available to every addon in an Kodi installation it must not be enabled or disabled by the user.&lt;br /&gt;
&lt;br /&gt;
==== HTTP ====&lt;br /&gt;
The &#039;&#039;HTTP&#039;&#039; transport can be used by third-party applications running on the same machine as Kodi or on a different machine which can access the machine running Kodi using the [http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP] protocol. Because this transport allows applications outside Kodi to control Kodi, it has to be manually enabled (see [[#Enabling JSON-RPC|Enabling JSON-RPC]]) by the user.&lt;br /&gt;
&lt;br /&gt;
===== POST =====&lt;br /&gt;
Third-party applications can access Kodi&#039;s JSON-RPC API by sending JSON-RPC requests embedded in HTTP [http://en.wikipedia.org/wiki/POST_(HTTP) POST] requests to the following URL&lt;br /&gt;
&amp;lt;pre&amp;gt;http://&amp;lt;your-ip&amp;gt;:&amp;lt;your-port&amp;gt;/jsonrpc&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Starting with Frodo nightly builds it is mandatory to set the HTTP header field &#039;&#039;&#039;Content-Type: application/json&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== GET =====&lt;br /&gt;
Third-party application can access Kodi&#039;s JSON-RPC API by sending JSON-RPC requests embedded in a HTTP GET parameter called &#039;&#039;request&#039;&#039;. The JSON-RPC request must be URL encoded and sent to the following URL&lt;br /&gt;
&amp;lt;pre&amp;gt;http://&amp;lt;your-ip&amp;gt;:&amp;lt;your-port&amp;gt;/jsonrpc?request=&amp;lt;url-encoded-request&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== TCP ====&lt;br /&gt;
The &#039;&#039;TCP&#039;&#039; transport can be used by third-party applications running on the same machine as Kodi or on a different machine which can access the machine running Kodi using the [http://en.wikipedia.org/wiki/Transmission_Control_Protocol TCP] protocol. Because this transport allows applications outside Kodi to control Kodi it has to be manually enabled (see [[#Enabling JSON-RPC|Enabling JSON-RPC]]) by the user. Once enabled, third-party applications can access Kodi&#039;s JSON-RPC API by opening a TCP [http://en.wikipedia.org/wiki/Internet_socket socket] on port 9090 (this port can be configured in the [[Advancedsettings.xml#&amp;lt;jsonrpc&amp;gt;|advanced settings]] file) and sending raw JSON-RPC requests over that socket. Please note that no delimiters are provided in between notifications and/or responses. As such, your client needs to be able to deal with this, eg. by counting and matching curly braces ({}).&lt;br /&gt;
&lt;br /&gt;
==== WebSocket ====&lt;br /&gt;
The &#039;&#039;WebSocket&#039;&#039; transport has been added since Version 5 and can be used by third-party applications running on the same machine as Kodi or on a different machine which can access the machine running Kodi using the [http://en.wikipedia.org/wiki/WebSocket Websocket] protocol. The supported versions are 8 (draft [http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10 hybi-10]) and 13 ([http://tools.ietf.org/html/rfc6455 RFC 6455]). Because this transport allows applications outside Kodi to control Kodi it has to be manually enabled (see [[#Enabling JSON-RPC|Enabling JSON-RPC]]) by the user. Once enabled, third-party applications can access Kodi&#039;s JSON-RPC API by sending a WebSocket protocol handshake to the following URI&lt;br /&gt;
&amp;lt;pre&amp;gt;ws://&amp;lt;your-ip&amp;gt;:&amp;lt;configured tcp port&amp;gt;/jsonrpc&amp;lt;/pre&amp;gt;&lt;br /&gt;
It is important to send the handshake on the port of Kodi&#039;s TCP server (by default 9090, but this port can be configured in the [[Advancedsettings.xml#&amp;lt;jsonrpc&amp;gt;|advanced settings]] file). After having successfully finished the handshake third-party applications can send WebSocket protocl messages over that connection.&lt;br /&gt;
&lt;br /&gt;
=== Functionalities ===&lt;br /&gt;
==== Response ====&lt;br /&gt;
The &#039;&#039;Response&#039;&#039; functionality is the only functionality that should be present in every transport available as it describes the functionality to respond to a JSON-RPC request with a valid JSON-RPC response (be it an error message or an actual response).&lt;br /&gt;
&lt;br /&gt;
==== Notifications ====&lt;br /&gt;
The &#039;&#039;Notifications&#039;&#039; functionality includes both server-side (from the server to clients) and client-side (from clients to the server) notifications. A JSON-RPC notification is a valid JSON-RPC request with no &#039;&#039;id&#039;&#039; property. Following the JSON-RPC 2.0 specification any JSON-RPC request with no &#039;&#039;id&#039;&#039; must be considered as a notification and the receiver must not send a response upon a notification. &lt;br /&gt;
&lt;br /&gt;
In the specific case of Kodi, server-side notifications are used to inform clients about certain events to relieve clients of the need to periodically poll for certain events. Furthermore there are two ways of client-side notifications. Using [[/#JSONRPC.NotifyAll|JSONRPC.NotifyAll]] it is possible to ask Kodi to relay the message in the JSON-RPC request to all other connected clients. The second way is to send JSON-RPC requests without an &#039;&#039;id&#039;&#039; property in case the client does not care about the response (e.g. the method [[/#Player.Stop|Player.Stop]] does not return any useful information to the client).&lt;br /&gt;
&lt;br /&gt;
==== Direct file download ====&lt;br /&gt;
The &#039;&#039;Direct file download&#039;&#039; functionality is the ability to directly download files from Kodi by calling [[/#Files.Download|Files.Download]]. In this case the term &#039;&#039;direct&#039;&#039; means that the download happens within the JSON-RPC response of the [[/#Files.Download|Files.Download]] request.&lt;br /&gt;
&lt;br /&gt;
==== Redirected file download ====&lt;br /&gt;
The &#039;&#039;Redirected file download&#039;&#039; functionality is the ability to indirectly download files from Kodi by calling [[/#Files.PrepareDownload|Files.PrepareDownload]] and using the data received in the response to download the file over a different protocol (like HTTP, FTP ...) or another socket. As the &#039;&#039;Redirected file download&#039;&#039; is very transport specific, it must be handled separately for every transport supporting it.&lt;br /&gt;
&lt;br /&gt;
=== Comparison ===&lt;br /&gt;
The following table shows all the available transports and what functionalities they support&lt;br /&gt;
{| class=&amp;quot;prettytable&amp;quot; style=&amp;quot;margin-right: 0;&amp;quot;&lt;br /&gt;
!style=&amp;quot;padding-left: 5px; padding-right: 10px;&amp;quot; colspan=&amp;quot;2&amp;quot;|Transport&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Response&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Notifications&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Direct file&amp;lt;br /&amp;gt;download&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Redirected file&amp;lt;br /&amp;gt;download&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px;&amp;quot; colspan=&amp;quot;2&amp;quot;|[[Python Development|Python]]&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px;&amp;quot; colspan=&amp;quot;2&amp;quot;|[http://en.wikipedia.org/wiki/Transmission_Control_Protocol TCP]&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right:5px;&amp;quot; rowspan=&amp;quot;2&amp;quot;|[http://en.wikipedia.org/wiki/HTTP HTTP]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right:5px;&amp;quot;|POST&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right:5px;&amp;quot;|GET&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px;&amp;quot; colspan=&amp;quot;2&amp;quot;|[http://en.wikipedia.org/wiki/WebSocket WebSocket]&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Added in Version 5&lt;br /&gt;
&lt;br /&gt;
== API versions ==&lt;br /&gt;
The JSON-RPC API exposed by Kodi is constantly extended to provide better and more functionality to third party applications. For that reason Kodi provides a version information through the &#039;&#039;&#039;JSONRPC.Version&#039;&#039;&#039; method. The rule is that odd version numbers describe an API state, that is not stable and under heavy development whereas even version numbers describe a stable API. Therefore the version number can be used by third-party clients to check if their application might not be fully compatible with the JSON-RPC API exposed by a user&#039;s Kodi installation.&lt;br /&gt;
&lt;br /&gt;
Starting with XBMC v12 (Frodo) we started using a new versioning system (&amp;lt;major&amp;gt;.&amp;lt;minor&amp;gt;.&amp;lt;patch&amp;gt;) for the JSON-RPC API. Frodo stable is version 6.0.0 and from now on with every bugfix the &amp;lt;patch&amp;gt; part of the version is increased, with every feature addition to the API, the &amp;lt;minor&amp;gt; version is increased (and the &amp;lt;patch&amp;gt; version reset to 0) and with every backwards incompatible change, the &amp;lt;major&amp;gt; version is increased.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;prettytable&amp;quot; style=&amp;quot;margin-right: 0;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Release&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|JSON-RPC 2.0 specification&lt;br /&gt;
!colspan=&amp;quot;5&amp;quot;|Transports&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;padding-left: 5px; padding-right: 5px; width: 6em; text-align: left;&amp;quot;|API Version&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px; width: 5em;&amp;quot;|Version&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px; width: 4em;&amp;quot;|Name&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Method calls&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Notifications&amp;lt;br /&amp;gt;(server-side)&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Notifications&amp;lt;br /&amp;gt;(client-side)&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Parameters&amp;lt;br /&amp;gt;by-name&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Parameters&amp;lt;br /&amp;gt;by-position&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Batch requests&lt;br /&gt;
&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Python&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|TCP&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|HTTP POST&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|HTTP GET&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|WebSocket&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v2|Version 2]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|10.0&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Dharma&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v3|Version 3]] / [[/v4|4]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|pre-11 / 11.0&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Eden&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v5|Version 5]] / [[/v6|6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|pre-12 / 12.0&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Frodo&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|13.0&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Gotham&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|13.1&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Gotham&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|13.2&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Gotham&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|14.0&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Helix&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|14.1&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Helix&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|14.2&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Helix&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|15.0&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Isengard&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|15.1&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Isengard&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|15.2&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Isengard&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|16.0&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Jarvis&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|16.1&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Jarvis&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v8|Version 8]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|17.0&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Krypton&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;For information requests only, actions require POST&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;prettytable&amp;quot; style=&amp;quot;margin-right: 0;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Release&lt;br /&gt;
!|JSONRPC.Version&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Date&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Version&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Codename&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|[&amp;quot;version&amp;quot;]&lt;br /&gt;
|-&lt;br /&gt;
|18 December 2010&lt;br /&gt;
|10.0&lt;br /&gt;
|Dharma&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|10 March 2011&lt;br /&gt;
|10.1&lt;br /&gt;
|Dharma&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; |24 March 2012 &lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; |11.0&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; |Eden&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; |4&lt;br /&gt;
|-&lt;br /&gt;
|29 January 2013&lt;br /&gt;
|12.0&lt;br /&gt;
|Frodo&lt;br /&gt;
|{&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|12.1&lt;br /&gt;
|Frodo&lt;br /&gt;
|{&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:3}&lt;br /&gt;
|-&lt;br /&gt;
|03 May 2013&lt;br /&gt;
|12.2&lt;br /&gt;
|Frodo&lt;br /&gt;
|{&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:3}&lt;br /&gt;
|-&lt;br /&gt;
|24 December 2013&lt;br /&gt;
|12.3&lt;br /&gt;
|Frodo&lt;br /&gt;
|{&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:3}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 04 May 2014&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 13.0&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Gotham&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:14,&amp;quot;patch&amp;quot;:3}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 05 June 2014&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 13.1&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Gotham&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:14,&amp;quot;patch&amp;quot;:3}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 17 August 2014&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 13.2&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Gotham&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:14,&amp;quot;patch&amp;quot;:3}&lt;br /&gt;
|-&lt;br /&gt;
|23 December 2014&lt;br /&gt;
|14.0&lt;br /&gt;
|Helix&lt;br /&gt;
|{&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:21,&amp;quot;patch&amp;quot;:2}&lt;br /&gt;
|-&lt;br /&gt;
|30 January 2014&lt;br /&gt;
|14.1&lt;br /&gt;
|Helix&lt;br /&gt;
|{&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:21,&amp;quot;patch&amp;quot;:2}&lt;br /&gt;
|-&lt;br /&gt;
|26 March 2014&lt;br /&gt;
|14.2&lt;br /&gt;
|Helix&lt;br /&gt;
|{&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:21,&amp;quot;patch&amp;quot;:2}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 21 July 2015&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 15.0&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Isengard&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:25,&amp;quot;patch&amp;quot;:2}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 16 August 2015&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 15.1&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Isengard&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:25,&amp;quot;patch&amp;quot;:2}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 19 October 2015&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 15.2&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Isengard&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:25,&amp;quot;patch&amp;quot;:2}&lt;br /&gt;
|-&lt;br /&gt;
|21 February 2016&lt;br /&gt;
|16.0&lt;br /&gt;
|Jarvis&lt;br /&gt;
|{&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:32,&amp;quot;patch&amp;quot;:4}&lt;br /&gt;
|-&lt;br /&gt;
|24 April 2016&lt;br /&gt;
|16.1&lt;br /&gt;
|Jarvis&lt;br /&gt;
|{&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:32,&amp;quot;patch&amp;quot;:5}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 5 February 2017&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 17.0&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Krypton&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:8,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 20 March 2017&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 17.1&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Krypton&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:8,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 23 May 2017&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 17.2&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Krypton&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:8,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 24 May 2017&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 17.3&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Krypton&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:8,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 22 August 2017&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 17.4&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Krypton&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:8,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 23 October 2017&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 17.5&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Krypton&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:8,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 14 November 2017&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 17.6&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Krypton&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:8,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
Kodi&#039;s JSON-RPC API has been designed to be self-documented i.e. a call to [[/#JSONRPC.Introspect|JSONRPC.Introspect]] results in a JSON-RPC response containing a documentation for all the available methods and data types. While this documentation is very incomplete and partly wrong for [[/v2|version 2]] it is provided as a full [http://tools.ietf.org/html/draft-zyp-json-schema-03 JSON schema] starting with [[/v3|version 3]]. As the documentation retrieved in that way is always specific to the used version of Kodi, it is (especially for development versions) the best documentation available and should be preferred over the wiki documentation as the latter always documents the API of the latest development.&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
=== Output format ===&lt;br /&gt;
To be able to support easier debugging of (third-party) development using the JSON-RPC API, the JSON output generated by Kodi can be pretty-printed by setting&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;jsonrpc&amp;gt;&lt;br /&gt;
    &amp;lt;compactoutput&amp;gt;false&amp;lt;/compactoutput&amp;gt;&lt;br /&gt;
&amp;lt;/jsonrpc&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
in the [[Advancedsettings.xml#.3Cjsonrpc.3E|advancedsettings.xml]]. Default JSON output will be in compact format to minimize sent data (especially useful for mobile devices).&lt;br /&gt;
&lt;br /&gt;
=== Direct interaction ===&lt;br /&gt;
To be able to test some methods of Kodi&#039;s JSON-RPC API, it can be of great help to be able to send a single hand-written JSON-RPC request to Kodi to see its effect and the generated response. Depending on the transport protocol used there are different possibilities to do that:&lt;br /&gt;
&lt;br /&gt;
==== TCP ====&lt;br /&gt;
With a [http://en.wikipedia.org/wiki/Telnet telnet] connection (using [http://en.wikipedia.org/wiki/PuTTY PuTTY] on Windows or telnet on Linux) to port 9090 of the machine running Kodi it is possible to send and receive raw json data to/from Kodi. {{see also|SSH}}&lt;br /&gt;
&lt;br /&gt;
==== HTTP ====&lt;br /&gt;
A simple way of manually sending HTTP requests containing a JSON-RPC request to Kodi is using the [http://chrome.google.com/extensions/detail/fhjcajmcbmldlhcimfajhfbgofnpcjmb Simple REST Client] extension for Google&#039;s Chrome/Chromium browser. It allows defining a URL and the HTTP request type (&#039;&#039;&#039;POST&#039;&#039;&#039; is what we need). The actual JSON-RPC request can be defined in the &#039;&#039;&#039;Data&#039;&#039;&#039; field and then sent to Kodi.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[/v2|JSON-RPC API v2 (Dharma)]]&lt;br /&gt;
* [[/v4|JSON-RPC API v4 (Eden)]]&lt;br /&gt;
* [[/v6|JSON-RPC API v6 (Frodo - Jarvis)]]&lt;br /&gt;
* [[/v8|JSON-RPC API v8 (Krypton)]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://jsonrpc.org/spec.html JSON-RPC 2.0 specification]&lt;br /&gt;
* [http://tools.ietf.org/html/draft-zyp-json-schema-03 A JSON Media Type for Describing the Structure and Meaning of JSON Documents (Draft 03)]&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These examples take their base from v4. Any that require a higher version will be marked.&lt;br /&gt;
&lt;br /&gt;
[[JSON-RPC API/Examples]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Fbacher</name></author>
	</entry>
	<entry>
		<id>https://kodi.wiki/index.php?title=JSON-RPC_API&amp;diff=178962</id>
		<title>JSON-RPC API</title>
		<link rel="alternate" type="text/html" href="https://kodi.wiki/index.php?title=JSON-RPC_API&amp;diff=178962"/>
		<updated>2019-08-23T18:44:04Z</updated>

		<summary type="html">&lt;p&gt;Fbacher: Added basic info and link to JSON-RPC 18&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{mininav|[[Development]]}}&lt;br /&gt;
&lt;br /&gt;
{{JSON-RPC API nav}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{cleanup}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSON-RPC is a HTTP- and/or raw TCP socket-based interface for communicating with Kodi. It replaces the deprecated [[HTTP API]], and offers a more secure and robust mechanism in the same format. It is based upon the [http://jsonrpc.org/spec.html JSON-RPC 2.0 specification].&lt;br /&gt;
&lt;br /&gt;
Each method in the interface can have different security needs which means one client may be allowed to only control playback while another can only read and manipulate the library. In version 2 (first stable) and 4 all clients are granted full authority but will later be forced to ask for privileges and the user of Kodi will have to grant said client access. The design of JSON-RPC is that most methods should behave roughly the same and maintain consistency while hiding the mechanics of Kodi from the client creator.&lt;br /&gt;
&lt;br /&gt;
In Kodi JSON-RPC can be accessed over a variety of transports and has been designed from the ground up to be flexible to allow control over new transports easily. Some of the transports have different limitations which will be enforced upon the interaction over that transport. As an example HTTP transports allow response and downloading of files while the raw TCP transport allows response and notifications (events and information Kodi sends to its clients). Depending on the client&#039;s needs it will choose one (or many) of the available transports.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Enabling JSON-RPC ==&lt;br /&gt;
Since the interface is available on many transports enabling it depends on the transport.&lt;br /&gt;
* Python: Always enabled&lt;br /&gt;
* HTTP: In System/Settings/Network/Services activate &#039;&#039;Allow control of Kodi via HTTP&#039;&#039; (see [[Webserver#Enabling the webserver|Enabling the webserver]])&lt;br /&gt;
* TCP: In System/Settings/Network/Services activate &#039;&#039;Allow programs on this system to control Kodi&#039;&#039; for localhost access only and &#039;&#039;Allow programs on other systems to control Kodi&#039;&#039; for access from other computers as well&lt;br /&gt;
&lt;br /&gt;
Note: The [[EventServer]] is a different interface for sending remote keypresses to Kodi, and must be enabled separately, some programs may use both interfaces.&lt;br /&gt;
&lt;br /&gt;
== Transports &amp;amp; Functionalities ==&lt;br /&gt;
=== Transports ===&lt;br /&gt;
==== Python ====&lt;br /&gt;
The &#039;&#039;Python&#039;&#039; transport can only be used by Kodi addons through the &#039;&#039;&#039;executeJSONRPC&#039;&#039;&#039; method provided by the &#039;&#039;&#039;xbmc&#039;&#039;&#039; python library. As it must be available to every addon in an Kodi installation it must not be enabled or disabled by the user.&lt;br /&gt;
&lt;br /&gt;
==== HTTP ====&lt;br /&gt;
The &#039;&#039;HTTP&#039;&#039; transport can be used by third-party applications running on the same machine as Kodi or on a different machine which can access the machine running Kodi using the [http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP] protocol. Because this transport allows applications outside Kodi to control Kodi, it has to be manually enabled (see [[#Enabling JSON-RPC|Enabling JSON-RPC]]) by the user.&lt;br /&gt;
&lt;br /&gt;
===== POST =====&lt;br /&gt;
Third-party applications can access Kodi&#039;s JSON-RPC API by sending JSON-RPC requests embedded in HTTP [http://en.wikipedia.org/wiki/POST_(HTTP) POST] requests to the following URL&lt;br /&gt;
&amp;lt;pre&amp;gt;http://&amp;lt;your-ip&amp;gt;:&amp;lt;your-port&amp;gt;/jsonrpc&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Starting with Frodo nightly builds it is mandatory to set the HTTP header field &#039;&#039;&#039;Content-Type: application/json&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== GET =====&lt;br /&gt;
Third-party application can access Kodi&#039;s JSON-RPC API by sending JSON-RPC requests embedded in a HTTP GET parameter called &#039;&#039;request&#039;&#039;. The JSON-RPC request must be URL encoded and sent to the following URL&lt;br /&gt;
&amp;lt;pre&amp;gt;http://&amp;lt;your-ip&amp;gt;:&amp;lt;your-port&amp;gt;/jsonrpc?request=&amp;lt;url-encoded-request&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== TCP ====&lt;br /&gt;
The &#039;&#039;TCP&#039;&#039; transport can be used by third-party applications running on the same machine as Kodi or on a different machine which can access the machine running Kodi using the [http://en.wikipedia.org/wiki/Transmission_Control_Protocol TCP] protocol. Because this transport allows applications outside Kodi to control Kodi it has to be manually enabled (see [[#Enabling JSON-RPC|Enabling JSON-RPC]]) by the user. Once enabled, third-party applications can access Kodi&#039;s JSON-RPC API by opening a TCP [http://en.wikipedia.org/wiki/Internet_socket socket] on port 9090 (this port can be configured in the [[Advancedsettings.xml#&amp;lt;jsonrpc&amp;gt;|advanced settings]] file) and sending raw JSON-RPC requests over that socket. Please note that no delimiters are provided in between notifications and/or responses. As such, your client needs to be able to deal with this, eg. by counting and matching curly braces ({}).&lt;br /&gt;
&lt;br /&gt;
==== WebSocket ====&lt;br /&gt;
The &#039;&#039;WebSocket&#039;&#039; transport has been added since Version 5 and can be used by third-party applications running on the same machine as Kodi or on a different machine which can access the machine running Kodi using the [http://en.wikipedia.org/wiki/WebSocket Websocket] protocol. The supported versions are 8 (draft [http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10 hybi-10]) and 13 ([http://tools.ietf.org/html/rfc6455 RFC 6455]). Because this transport allows applications outside Kodi to control Kodi it has to be manually enabled (see [[#Enabling JSON-RPC|Enabling JSON-RPC]]) by the user. Once enabled, third-party applications can access Kodi&#039;s JSON-RPC API by sending a WebSocket protocol handshake to the following URI&lt;br /&gt;
&amp;lt;pre&amp;gt;ws://&amp;lt;your-ip&amp;gt;:&amp;lt;configured tcp port&amp;gt;/jsonrpc&amp;lt;/pre&amp;gt;&lt;br /&gt;
It is important to send the handshake on the port of Kodi&#039;s TCP server (by default 9090, but this port can be configured in the [[Advancedsettings.xml#&amp;lt;jsonrpc&amp;gt;|advanced settings]] file). After having successfully finished the handshake third-party applications can send WebSocket protocl messages over that connection.&lt;br /&gt;
&lt;br /&gt;
=== Functionalities ===&lt;br /&gt;
==== Response ====&lt;br /&gt;
The &#039;&#039;Response&#039;&#039; functionality is the only functionality that should be present in every transport available as it describes the functionality to respond to a JSON-RPC request with a valid JSON-RPC response (be it an error message or an actual response).&lt;br /&gt;
&lt;br /&gt;
==== Notifications ====&lt;br /&gt;
The &#039;&#039;Notifications&#039;&#039; functionality includes both server-side (from the server to clients) and client-side (from clients to the server) notifications. A JSON-RPC notification is a valid JSON-RPC request with no &#039;&#039;id&#039;&#039; property. Following the JSON-RPC 2.0 specification any JSON-RPC request with no &#039;&#039;id&#039;&#039; must be considered as a notification and the receiver must not send a response upon a notification. &lt;br /&gt;
&lt;br /&gt;
In the specific case of Kodi, server-side notifications are used to inform clients about certain events to relieve clients of the need to periodically poll for certain events. Furthermore there are two ways of client-side notifications. Using [[/#JSONRPC.NotifyAll|JSONRPC.NotifyAll]] it is possible to ask Kodi to relay the message in the JSON-RPC request to all other connected clients. The second way is to send JSON-RPC requests without an &#039;&#039;id&#039;&#039; property in case the client does not care about the response (e.g. the method [[/#Player.Stop|Player.Stop]] does not return any useful information to the client).&lt;br /&gt;
&lt;br /&gt;
==== Direct file download ====&lt;br /&gt;
The &#039;&#039;Direct file download&#039;&#039; functionality is the ability to directly download files from Kodi by calling [[/#Files.Download|Files.Download]]. In this case the term &#039;&#039;direct&#039;&#039; means that the download happens within the JSON-RPC response of the [[/#Files.Download|Files.Download]] request.&lt;br /&gt;
&lt;br /&gt;
==== Redirected file download ====&lt;br /&gt;
The &#039;&#039;Redirected file download&#039;&#039; functionality is the ability to indirectly download files from Kodi by calling [[/#Files.PrepareDownload|Files.PrepareDownload]] and using the data received in the response to download the file over a different protocol (like HTTP, FTP ...) or another socket. As the &#039;&#039;Redirected file download&#039;&#039; is very transport specific, it must be handled separately for every transport supporting it.&lt;br /&gt;
&lt;br /&gt;
=== Comparison ===&lt;br /&gt;
The following table shows all the available transports and what functionalities they support&lt;br /&gt;
{| class=&amp;quot;prettytable&amp;quot; style=&amp;quot;margin-right: 0;&amp;quot;&lt;br /&gt;
!style=&amp;quot;padding-left: 5px; padding-right: 10px;&amp;quot; colspan=&amp;quot;2&amp;quot;|Transport&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Response&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Notifications&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Direct file&amp;lt;br /&amp;gt;download&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Redirected file&amp;lt;br /&amp;gt;download&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px;&amp;quot; colspan=&amp;quot;2&amp;quot;|[[Python Development|Python]]&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px;&amp;quot; colspan=&amp;quot;2&amp;quot;|[http://en.wikipedia.org/wiki/Transmission_Control_Protocol TCP]&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right:5px;&amp;quot; rowspan=&amp;quot;2&amp;quot;|[http://en.wikipedia.org/wiki/HTTP HTTP]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right:5px;&amp;quot;|POST&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right:5px;&amp;quot;|GET&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px;&amp;quot; colspan=&amp;quot;2&amp;quot;|[http://en.wikipedia.org/wiki/WebSocket WebSocket]&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Added in Version 5&lt;br /&gt;
&lt;br /&gt;
== API versions ==&lt;br /&gt;
The JSON-RPC API exposed by Kodi is constantly extended to provide better and more functionality to third party applications. For that reason Kodi provides a version information through the &#039;&#039;&#039;JSONRPC.Version&#039;&#039;&#039; method. The rule is that odd version numbers describe an API state, that is not stable and under heavy development whereas even version numbers describe a stable API. Therefore the version number can be used by third-party clients to check if their application might not be fully compatible with the JSON-RPC API exposed by a user&#039;s Kodi installation.&lt;br /&gt;
&lt;br /&gt;
Starting with XBMC v12 (Frodo) we started using a new versioning system (&amp;lt;major&amp;gt;.&amp;lt;minor&amp;gt;.&amp;lt;patch&amp;gt;) for the JSON-RPC API. Frodo stable is version 6.0.0 and from now on with every bugfix the &amp;lt;patch&amp;gt; part of the version is increased, with every feature addition to the API, the &amp;lt;minor&amp;gt; version is increased (and the &amp;lt;patch&amp;gt; version reset to 0) and with every backwards incompatible change, the &amp;lt;major&amp;gt; version is increased.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;prettytable&amp;quot; style=&amp;quot;margin-right: 0;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Release&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|JSON-RPC 2.0 specification&lt;br /&gt;
!colspan=&amp;quot;5&amp;quot;|Transports&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;padding-left: 5px; padding-right: 5px; width: 6em; text-align: left;&amp;quot;|API Version&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px; width: 5em;&amp;quot;|Version&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px; width: 4em;&amp;quot;|Name&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Method calls&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Notifications&amp;lt;br /&amp;gt;(server-side)&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Notifications&amp;lt;br /&amp;gt;(client-side)&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Parameters&amp;lt;br /&amp;gt;by-name&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Parameters&amp;lt;br /&amp;gt;by-position&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Batch requests&lt;br /&gt;
&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Python&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|TCP&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|HTTP POST&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|HTTP GET&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|WebSocket&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v2|Version 2]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|10.0&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Dharma&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v3|Version 3]] / [[/v4|4]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|pre-11 / 11.0&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Eden&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|{{no}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v5|Version 5]] / [[/v6|6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|pre-12 / 12.0&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Frodo&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|13.0&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Gotham&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|13.1&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Gotham&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|13.2&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Gotham&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|14.0&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Helix&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|14.1&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Helix&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|14.2&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Helix&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|15.0&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Isengard&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|15.1&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Isengard&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|15.2&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Isengard&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|16.0&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Jarvis&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v6|Version 6]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|16.1&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Jarvis&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v8|Version 8]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|17.0&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Krypton&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|[[/v9|Version 9]]&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|18.0&lt;br /&gt;
|style=&amp;quot;padding-left: 5px; padding-right: 5px;&amp;quot;|Leia&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|{{yes}}&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|{{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;For information requests only, actions require POST&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;prettytable&amp;quot; style=&amp;quot;margin-right: 0;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Release&lt;br /&gt;
!|JSONRPC.Version&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Date&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Version&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|Codename&lt;br /&gt;
!style=&amp;quot;padding-left: 10px; padding-right: 10px;&amp;quot;|[&amp;quot;version&amp;quot;]&lt;br /&gt;
|-&lt;br /&gt;
|18 December 2010&lt;br /&gt;
|10.0&lt;br /&gt;
|Dharma&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|10 March 2011&lt;br /&gt;
|10.1&lt;br /&gt;
|Dharma&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; |24 March 2012 &lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; |11.0&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; |Eden&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; |4&lt;br /&gt;
|-&lt;br /&gt;
|29 January 2013&lt;br /&gt;
|12.0&lt;br /&gt;
|Frodo&lt;br /&gt;
|{&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
|18 March 2013&lt;br /&gt;
|12.1&lt;br /&gt;
|Frodo&lt;br /&gt;
|{&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:3}&lt;br /&gt;
|-&lt;br /&gt;
|03 May 2013&lt;br /&gt;
|12.2&lt;br /&gt;
|Frodo&lt;br /&gt;
|{&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:3}&lt;br /&gt;
|-&lt;br /&gt;
|24 December 2013&lt;br /&gt;
|12.3&lt;br /&gt;
|Frodo&lt;br /&gt;
|{&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:3}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 04 May 2014&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 13.0&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Gotham&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:14,&amp;quot;patch&amp;quot;:3}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 05 June 2014&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 13.1&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Gotham&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:14,&amp;quot;patch&amp;quot;:3}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 17 August 2014&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 13.2&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Gotham&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:14,&amp;quot;patch&amp;quot;:3}&lt;br /&gt;
|-&lt;br /&gt;
|23 December 2014&lt;br /&gt;
|14.0&lt;br /&gt;
|Helix&lt;br /&gt;
|{&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:21,&amp;quot;patch&amp;quot;:2}&lt;br /&gt;
|-&lt;br /&gt;
|30 January 2014&lt;br /&gt;
|14.1&lt;br /&gt;
|Helix&lt;br /&gt;
|{&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:21,&amp;quot;patch&amp;quot;:2}&lt;br /&gt;
|-&lt;br /&gt;
|26 March 2014&lt;br /&gt;
|14.2&lt;br /&gt;
|Helix&lt;br /&gt;
|{&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:21,&amp;quot;patch&amp;quot;:2}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 21 July 2015&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 15.0&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Isengard&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:25,&amp;quot;patch&amp;quot;:2}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 16 August 2015&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 15.1&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Isengard&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:25,&amp;quot;patch&amp;quot;:2}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 19 October 2015&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 15.2&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Isengard&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:25,&amp;quot;patch&amp;quot;:2}&lt;br /&gt;
|-&lt;br /&gt;
|21 February 2016&lt;br /&gt;
|16.0&lt;br /&gt;
|Jarvis&lt;br /&gt;
|{&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:32,&amp;quot;patch&amp;quot;:4}&lt;br /&gt;
|-&lt;br /&gt;
|24 April 2016&lt;br /&gt;
|16.1&lt;br /&gt;
|Jarvis&lt;br /&gt;
|{&amp;quot;major&amp;quot;:6,&amp;quot;minor&amp;quot;:32,&amp;quot;patch&amp;quot;:5}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 5 February 2017&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 17.0&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Krypton&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:8,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 20 March 2017&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 17.1&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Krypton&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:8,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 23 May 2017&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 17.2&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Krypton&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:8,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 24 May 2017&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 17.3&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Krypton&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:8,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 22 August 2017&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 17.4&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Krypton&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:8,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 23 October 2017&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 17.5&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Krypton&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:8,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 14 November 2017&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 17.6&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Krypton&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:8,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 28 January 2018&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 18.0&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Leia&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:9,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 11 February 2018&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 18.1&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Leia&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:9,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 22 April 2018&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 18.2&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Leia&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:9,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 28 June 2018&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | 18.3&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | Leia&lt;br /&gt;
| style=&amp;quot;background:#eee;&amp;quot; | {&amp;quot;major&amp;quot;:9,&amp;quot;minor&amp;quot;:0,&amp;quot;patch&amp;quot;:0}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
Kodi&#039;s JSON-RPC API has been designed to be self-documented i.e. a call to [[/#JSONRPC.Introspect|JSONRPC.Introspect]] results in a JSON-RPC response containing a documentation for all the available methods and data types. While this documentation is very incomplete and partly wrong for [[/v2|version 2]] it is provided as a full [http://tools.ietf.org/html/draft-zyp-json-schema-03 JSON schema] starting with [[/v3|version 3]]. As the documentation retrieved in that way is always specific to the used version of Kodi, it is (especially for development versions) the best documentation available and should be preferred over the wiki documentation as the latter always documents the API of the latest development.&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
=== Output format ===&lt;br /&gt;
To be able to support easier debugging of (third-party) development using the JSON-RPC API, the JSON output generated by Kodi can be pretty-printed by setting&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;jsonrpc&amp;gt;&lt;br /&gt;
    &amp;lt;compactoutput&amp;gt;false&amp;lt;/compactoutput&amp;gt;&lt;br /&gt;
&amp;lt;/jsonrpc&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
in the [[Advancedsettings.xml#.3Cjsonrpc.3E|advancedsettings.xml]]. Default JSON output will be in compact format to minimize sent data (especially useful for mobile devices).&lt;br /&gt;
&lt;br /&gt;
=== Direct interaction ===&lt;br /&gt;
To be able to test some methods of Kodi&#039;s JSON-RPC API, it can be of great help to be able to send a single hand-written JSON-RPC request to Kodi to see its effect and the generated response. Depending on the transport protocol used there are different possibilities to do that:&lt;br /&gt;
&lt;br /&gt;
==== TCP ====&lt;br /&gt;
With a [http://en.wikipedia.org/wiki/Telnet telnet] connection (using [http://en.wikipedia.org/wiki/PuTTY PuTTY] on Windows or telnet on Linux) to port 9090 of the machine running Kodi it is possible to send and receive raw json data to/from Kodi. {{see also|SSH}}&lt;br /&gt;
&lt;br /&gt;
==== HTTP ====&lt;br /&gt;
A simple way of manually sending HTTP requests containing a JSON-RPC request to Kodi is using the [http://chrome.google.com/extensions/detail/fhjcajmcbmldlhcimfajhfbgofnpcjmb Simple REST Client] extension for Google&#039;s Chrome/Chromium browser. It allows defining a URL and the HTTP request type (&#039;&#039;&#039;POST&#039;&#039;&#039; is what we need). The actual JSON-RPC request can be defined in the &#039;&#039;&#039;Data&#039;&#039;&#039; field and then sent to Kodi.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[/v2|JSON-RPC API v2 (Dharma)]]&lt;br /&gt;
* [[/v4|JSON-RPC API v4 (Eden)]]&lt;br /&gt;
* [[/v6|JSON-RPC API v6 (Frodo - Jarvis)]]&lt;br /&gt;
* [[/v8|JSON-RPC API v8 (Krypton)]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://jsonrpc.org/spec.html JSON-RPC 2.0 specification]&lt;br /&gt;
* [http://tools.ietf.org/html/draft-zyp-json-schema-03 A JSON Media Type for Describing the Structure and Meaning of JSON Documents (Draft 03)]&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These examples take their base from v4. Any that require a higher version will be marked.&lt;br /&gt;
&lt;br /&gt;
[[JSON-RPC API/Examples]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Fbacher</name></author>
	</entry>
	<entry>
		<id>https://kodi.wiki/index.php?title=JSON-RPC_API/Examples&amp;diff=160712</id>
		<title>JSON-RPC API/Examples</title>
		<link rel="alternate" type="text/html" href="https://kodi.wiki/index.php?title=JSON-RPC_API/Examples&amp;diff=160712"/>
		<updated>2019-03-07T21:35:41Z</updated>

		<summary type="html">&lt;p&gt;Fbacher: Add complex query that took me a long time to figure out&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{mininav|[[Development]]|[[JSON-RPC API]]}}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These examples take their base from v4. Any that require a higher version will be marked.&lt;br /&gt;
&lt;br /&gt;
=== Introspect ===&lt;br /&gt;
If you require more detailed information about an API method use:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
{ &amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;JSONRPC.Introspect&amp;quot;, &amp;quot;params&amp;quot;: { &amp;quot;filter&amp;quot;: { &amp;quot;id&amp;quot;: &amp;quot;AudioLibrary.GetAlbums&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;method&amp;quot; } }, &amp;quot;id&amp;quot;: 1 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;quot;AudioLibrary.GetAlbums&amp;quot; being the method in this example.&lt;br /&gt;
=== What is playing? ===&lt;br /&gt;
Commands to control the players in Kodi will only work if that player is currently in use.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;Player.GetActivePlayers&amp;quot;, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;id&amp;quot;: 1, &amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;result&amp;quot;: [ { &amp;quot;playerid&amp;quot;: 0, &amp;quot;type&amp;quot;: &amp;quot;audio&amp;quot; } ]}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In the above we can see that the audio player is active. It is possible for more than one player to be active: picture and audio.&lt;br /&gt;
&lt;br /&gt;
Now we know which player is active we can query the current item with:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;Player.GetItem&amp;quot;, &amp;quot;params&amp;quot;: { &amp;quot;properties&amp;quot;: [&amp;quot;title&amp;quot;, &amp;quot;album&amp;quot;, &amp;quot;artist&amp;quot;, &amp;quot;duration&amp;quot;, &amp;quot;thumbnail&amp;quot;, &amp;quot;file&amp;quot;, &amp;quot;fanart&amp;quot;, &amp;quot;streamdetails&amp;quot;], &amp;quot;playerid&amp;quot;: 0 }, &amp;quot;id&amp;quot;: &amp;quot;AudioGetItem&amp;quot;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;Player.GetItem&amp;quot;, &amp;quot;params&amp;quot;: { &amp;quot;properties&amp;quot;: [&amp;quot;title&amp;quot;, &amp;quot;album&amp;quot;, &amp;quot;artist&amp;quot;, &amp;quot;season&amp;quot;, &amp;quot;episode&amp;quot;, &amp;quot;duration&amp;quot;, &amp;quot;showtitle&amp;quot;, &amp;quot;tvshowid&amp;quot;, &amp;quot;thumbnail&amp;quot;, &amp;quot;file&amp;quot;, &amp;quot;fanart&amp;quot;, &amp;quot;streamdetails&amp;quot;], &amp;quot;playerid&amp;quot;: 1 }, &amp;quot;id&amp;quot;: &amp;quot;VideoGetItem&amp;quot;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GetItem will ignore any properties that don&#039;t make sense for the specific player.&lt;br /&gt;
&lt;br /&gt;
=== Player play/pause ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;Player.PlayPause&amp;quot;, &amp;quot;params&amp;quot;: { &amp;quot;playerid&amp;quot;: 0 }, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get Properties ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;Application.GetProperties&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;properties&amp;quot;: [&amp;quot;volume&amp;quot;]}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Query the libraries ===&lt;br /&gt;
Artists&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;AudioLibrary.GetArtists&amp;quot;, &amp;quot;params&amp;quot;: { &amp;quot;limits&amp;quot;: { &amp;quot;start&amp;quot; : 0, &amp;quot;end&amp;quot;: 75 }, &amp;quot;properties&amp;quot;: [ &amp;quot;thumbnail&amp;quot;, &amp;quot;fanart&amp;quot;, &amp;quot;born&amp;quot;, &amp;quot;formed&amp;quot;, &amp;quot;died&amp;quot;, &amp;quot;disbanded&amp;quot;, &amp;quot;yearsactive&amp;quot;, &amp;quot;mood&amp;quot;, &amp;quot;style&amp;quot;, &amp;quot;genre&amp;quot; ], &amp;quot;sort&amp;quot;: { &amp;quot;order&amp;quot;: &amp;quot;ascending&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;artist&amp;quot;, &amp;quot;ignorearticle&amp;quot;: true } }, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Albums&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;AudioLibrary.GetAlbums&amp;quot;, &amp;quot;params&amp;quot;: { &amp;quot;limits&amp;quot;: { &amp;quot;start&amp;quot; : 0, &amp;quot;end&amp;quot;: 50 }, &amp;quot;properties&amp;quot;: [&amp;quot;playcount&amp;quot;, &amp;quot;artist&amp;quot;, &amp;quot;genre&amp;quot;, &amp;quot;rating&amp;quot;, &amp;quot;thumbnail&amp;quot;, &amp;quot;year&amp;quot;, &amp;quot;mood&amp;quot;, &amp;quot;style&amp;quot;], &amp;quot;sort&amp;quot;: { &amp;quot;order&amp;quot;: &amp;quot;ascending&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;album&amp;quot;, &amp;quot;ignorearticle&amp;quot;: true } }, &amp;quot;id&amp;quot;: &amp;quot;libAlbums&amp;quot;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Songs&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;AudioLibrary.GetSongs&amp;quot;, &amp;quot;params&amp;quot;: { &amp;quot;limits&amp;quot;: { &amp;quot;start&amp;quot; : 0, &amp;quot;end&amp;quot;: 25 }, &amp;quot;properties&amp;quot;: [ &amp;quot;artist&amp;quot;, &amp;quot;duration&amp;quot;, &amp;quot;album&amp;quot;, &amp;quot;track&amp;quot; ], &amp;quot;sort&amp;quot;: { &amp;quot;order&amp;quot;: &amp;quot;ascending&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;track&amp;quot;, &amp;quot;ignorearticle&amp;quot;: true } }, &amp;quot;id&amp;quot;: &amp;quot;libSongs&amp;quot;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Movies&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;VideoLibrary.GetMovies&amp;quot;, &amp;quot;params&amp;quot;: { &amp;quot;filter&amp;quot;: {&amp;quot;field&amp;quot;: &amp;quot;playcount&amp;quot;, &amp;quot;operator&amp;quot;: &amp;quot;is&amp;quot;, &amp;quot;value&amp;quot;: &amp;quot;0&amp;quot;}, &amp;quot;limits&amp;quot;: { &amp;quot;start&amp;quot; : 0, &amp;quot;end&amp;quot;: 75 }, &amp;quot;properties&amp;quot; : [&amp;quot;art&amp;quot;, &amp;quot;rating&amp;quot;, &amp;quot;thumbnail&amp;quot;, &amp;quot;playcount&amp;quot;, &amp;quot;file&amp;quot;], &amp;quot;sort&amp;quot;: { &amp;quot;order&amp;quot;: &amp;quot;ascending&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;label&amp;quot;, &amp;quot;ignorearticle&amp;quot;: true } }, &amp;quot;id&amp;quot;: &amp;quot;libMovies&amp;quot;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Movie With Multiple Filters&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;VideoLibrary.GetMovies&amp;quot;, &amp;quot;params&amp;quot;: { &amp;quot;properties&amp;quot;: [ &amp;quot;title&amp;quot;, &amp;quot;lastplayed&amp;quot;, &amp;quot;studio&amp;quot;, &amp;quot;cast&amp;quot;, &amp;quot;plot&amp;quot;, &amp;quot;writer&amp;quot;, &amp;quot;director&amp;quot;, &amp;quot;fanart&amp;quot;, &amp;quot;runtime&amp;quot;, &amp;quot;mpaa&amp;quot;, &amp;quot;thumbnail&amp;quot;, &amp;quot;file&amp;quot;,&amp;quot;year&amp;quot;, &amp;quot;genre&amp;quot;, &amp;quot;tag&amp;quot;, &amp;quot;trailer&amp;quot; ], &amp;quot;filter&amp;quot;: { &amp;quot;or&amp;quot;: [ { &amp;quot;field&amp;quot;: &amp;quot;genre&amp;quot;, &amp;quot;operator&amp;quot;: &amp;quot;contains&amp;quot;, &amp;quot;value&amp;quot;: [ &amp;quot;Film-Noir&amp;quot; ] }, { &amp;quot;field&amp;quot;: &amp;quot;tag&amp;quot;, &amp;quot;operator&amp;quot;: &amp;quot;contains&amp;quot;, &amp;quot;value&amp;quot;: [ &amp;quot;classic noir&amp;quot;, &amp;quot;film noir&amp;quot;, &amp;quot;french noir&amp;quot;, &amp;quot;brit noir&amp;quot; ] } ] } }, &amp;quot;id&amp;quot;: 1 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TV Shows&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;VideoLibrary.GetTVShows&amp;quot;, &amp;quot;params&amp;quot;: { &amp;quot;filter&amp;quot;: {&amp;quot;field&amp;quot;: &amp;quot;playcount&amp;quot;, &amp;quot;operator&amp;quot;: &amp;quot;is&amp;quot;, &amp;quot;value&amp;quot;: &amp;quot;0&amp;quot;}, &amp;quot;limits&amp;quot;: { &amp;quot;start&amp;quot; : 0, &amp;quot;end&amp;quot;: 75 }, &amp;quot;properties&amp;quot;: [&amp;quot;art&amp;quot;, &amp;quot;genre&amp;quot;, &amp;quot;plot&amp;quot;, &amp;quot;title&amp;quot;, &amp;quot;originaltitle&amp;quot;, &amp;quot;year&amp;quot;, &amp;quot;rating&amp;quot;, &amp;quot;thumbnail&amp;quot;, &amp;quot;playcount&amp;quot;, &amp;quot;file&amp;quot;, &amp;quot;fanart&amp;quot;], &amp;quot;sort&amp;quot;: { &amp;quot;order&amp;quot;: &amp;quot;ascending&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;label&amp;quot; } }, &amp;quot;id&amp;quot;: &amp;quot;libTvShows&amp;quot;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Music Videos&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;VideoLibrary.GetMusicVideos&amp;quot;, &amp;quot;params&amp;quot;: { &amp;quot;properties&amp;quot;: [ &amp;quot;title&amp;quot;, &amp;quot;thumbnail&amp;quot;, &amp;quot;artist&amp;quot;, &amp;quot;album&amp;quot;, &amp;quot;genre&amp;quot;, &amp;quot;lastplayed&amp;quot;, &amp;quot;year&amp;quot;, &amp;quot;runtime&amp;quot;, &amp;quot;fanart&amp;quot;, &amp;quot;file&amp;quot;, &amp;quot;streamdetails&amp;quot; ], &amp;quot;sort&amp;quot;: { &amp;quot;order&amp;quot;: &amp;quot;ascending&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;artist&amp;quot;, &amp;quot;ignorearticle&amp;quot;: true } }, &amp;quot;id&amp;quot;: &amp;quot;libMusicVideos&amp;quot;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Audio Playlist&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;Playlist.GetItems&amp;quot;, &amp;quot;params&amp;quot;: { &amp;quot;properties&amp;quot;: [&amp;quot;title&amp;quot;, &amp;quot;album&amp;quot;, &amp;quot;artist&amp;quot;, &amp;quot;duration&amp;quot;], &amp;quot;playlistid&amp;quot;: 0 }, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Video Playlist&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;Playlist.GetItems&amp;quot;, &amp;quot;params&amp;quot;: { &amp;quot;properties&amp;quot;: [ &amp;quot;runtime&amp;quot;, &amp;quot;showtitle&amp;quot;, &amp;quot;season&amp;quot;, &amp;quot;title&amp;quot;, &amp;quot;artist&amp;quot; ], &amp;quot;playlistid&amp;quot;: 1}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Fbacher</name></author>
	</entry>
	<entry>
		<id>https://kodi.wiki/index.php?title=Keymap&amp;diff=140098</id>
		<title>Keymap</title>
		<link rel="alternate" type="text/html" href="https://kodi.wiki/index.php?title=Keymap&amp;diff=140098"/>
		<updated>2018-09-13T13:19:17Z</updated>

		<summary type="html">&lt;p&gt;Fbacher: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{mininav| [[Remote controls]] }}&lt;br /&gt;
&amp;lt;section begin=&amp;quot;intro&amp;quot; /&amp;gt;Keymaps are XML base files that define the mappings of keys (keyboard keys, mouse/remote/joysticks buttons and more) to Kodi actions.&amp;lt;section end=&amp;quot;intro&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Customizing keymaps through the GUI ==&lt;br /&gt;
{{main|Add-on:Keymap Editor}}&lt;br /&gt;
Users can customize keymaps for remotes in GUI by using the community [[Add-on:Keymap Editor|Keymap Editor]] add-on.&lt;br /&gt;
&lt;br /&gt;
== Location of keymaps ==&lt;br /&gt;
User modified keymap files must be stored in the &amp;quot;&#039;&#039;&#039;keymaps&#039;&#039;&#039;&amp;quot; folder in the [[userdata]] folder:&lt;br /&gt;
{{#lsth:userdata|Location of the UserData folder}}&lt;br /&gt;
&lt;br /&gt;
=== Defaults ===&lt;br /&gt;
Default keymaps are included when Kodi is installed, but users should not edit those install files directly. Instead, place user modified keymaps in the [[userdata]]/keymaps/ directory.&lt;br /&gt;
&lt;br /&gt;
Kodi can process multiple keymap files and does so like this:&lt;br /&gt;
&lt;br /&gt;
* All *.xml files from the default install settings and userdata/kemaps/ folders are applied as keymaps.&lt;br /&gt;
* All *.xml files are processed in alphabetical order.&lt;br /&gt;
* Keymaps defined in an .xml file add to or override mappings in previous .xml file.&lt;br /&gt;
* Keymaps defined in the userdata folder add to or override mappings in the global keymap.&lt;br /&gt;
&lt;br /&gt;
By default there will be no files in these locations, so grab one from the link below to make a new one/over-ride:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039; https://github.com/xbmc/xbmc/tree/master/system/keymaps &#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039; https://github.com/kodi-game/peripheral.joystick/tree/master/peripheral.joystick/resources/buttonmaps/xml &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Structure ==&lt;br /&gt;
&lt;br /&gt;
There is one &#039;&#039;&#039;global&#039;&#039;&#039; keymap and several &#039;&#039;&#039;window&#039;&#039;&#039;-specific keymaps.&amp;lt;br /&amp;gt;&lt;br /&gt;
Kodi falls back to the global map when the window-specific map hasn&#039;t bound the key being pressed.&lt;br /&gt;
&lt;br /&gt;
The format of keymapping files is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;keymap&amp;gt;&lt;br /&gt;
  &amp;lt;global&amp;gt;&lt;br /&gt;
    &amp;lt;gamepad&amp;gt;&lt;br /&gt;
      &amp;lt;A&amp;gt;Select&amp;lt;/A&amp;gt;&lt;br /&gt;
      [...]&lt;br /&gt;
    &amp;lt;/gamepad&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;remote&amp;gt;&lt;br /&gt;
      &amp;lt;select&amp;gt;Select&amp;lt;/select&amp;gt;&lt;br /&gt;
      [...]&lt;br /&gt;
    &amp;lt;/remote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;keyboard&amp;gt;&lt;br /&gt;
      &amp;lt;enter&amp;gt;Select&amp;lt;/enter&amp;gt;&lt;br /&gt;
      [...]&lt;br /&gt;
    &amp;lt;/keyboard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;mouse&amp;gt;&lt;br /&gt;
      &amp;lt;leftclick&amp;gt;Select&amp;lt;/leftclick&amp;gt;&lt;br /&gt;
      [...]&lt;br /&gt;
    &amp;lt;/mouse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;universalremote&amp;gt;&lt;br /&gt;
      &amp;lt;obc25&amp;gt;XBMC.ActivateWindow(MyMusic)&amp;lt;/obc25&amp;gt;&lt;br /&gt;
      [...]&lt;br /&gt;
    &amp;lt;/universalremote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;joystick name=&amp;quot;PLAYSTATION(R)3 Controller (00:1B:FB:F6:E0:F2)&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;button id=&amp;quot;15&amp;quot;&amp;gt;Select&amp;lt;/button&amp;gt;&lt;br /&gt;
      [...]&lt;br /&gt;
    &amp;lt;/joystick&amp;gt;&lt;br /&gt;
  &amp;lt;/global&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Home&amp;gt;&lt;br /&gt;
    [...]&lt;br /&gt;
  &amp;lt;/Home&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [...]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/keymap&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, it&#039;s divided into a &amp;lt;global&amp;gt; section, and a number of window sections (such as &amp;lt;Home&amp;gt;).&amp;lt;br /&amp;gt;&lt;br /&gt;
A list of the available window names can be seen [[Window IDs|here]]. The WINDOW can also be a custom window formatted as &amp;lt;windowId#&amp;gt; (e. g. &amp;lt;window1113&amp;gt;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Each of these sections can contain Gamepad, Remote, Keyboard, Universal Remote, and custom Joystick sections.&lt;br /&gt;
&lt;br /&gt;
The format for mapping a particular key under one of these device types is as follows:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;keyname&amp;gt;action&amp;lt;/keyname&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Keynames ==&lt;br /&gt;
Depending on your device you will need to use a specific &amp;quot;keyname&amp;quot;.&lt;br /&gt;
=== Gamepads ===&lt;br /&gt;
An up to date list of the available actions can be found in the source code of Kodi in [https://github.com/xbmc/xbmc/blob/master/xbmc/input/ButtonTranslator.cpp ButtonTranslator.cpp] where the &#039;&#039;TranslateGamepadString()&#039;&#039; function does the work.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gamepad&amp;gt;&lt;br /&gt;
  &amp;lt;A&amp;gt;Select&amp;lt;/A&amp;gt;&lt;br /&gt;
&amp;lt;/gamepad&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Remotes ===&lt;br /&gt;
An up to  date list of IR-remote button names can be found in the source code of Kodi [https://github.com/xbmc/xbmc/blob/master/xbmc/input/IRTranslator.cpp IRTranslator.cpp]. See the method TranslateString().&lt;br /&gt;
&lt;br /&gt;
The available actions are discussed in section [[Keymap#Actions|Actions]].&lt;br /&gt;
&lt;br /&gt;
{{Note|Some remotes (e.g. FLIRC) are actually seen as &amp;quot;keyboards&amp;quot;. Those will need to use the &amp;lt;keyboard&amp;gt; tag instead.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;remote&amp;gt; &lt;br /&gt;
  &amp;lt;play&amp;gt;Play&amp;lt;/play&amp;gt;&lt;br /&gt;
&amp;lt;/remote&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Universal Remotes ===&lt;br /&gt;
To map Universal Remote buttons using the RCA infrared protocol, you may add &#039;&#039;&#039;&amp;lt;universalremote&amp;gt;&#039;&#039;&#039; sections to keymap.xml.&amp;lt;br /&amp;gt;&lt;br /&gt;
In this case, the tags used are &amp;lt;obc#&amp;gt; where # is the original button code (OBC) of the button.&amp;lt;br /&amp;gt;&lt;br /&gt;
You would put it inside a &amp;lt;universalremote&amp;gt; section in the &amp;lt;window&amp;gt; or &amp;lt;global&amp;gt; sections.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;universalremote&amp;gt; &lt;br /&gt;
  &amp;lt;obc148&amp;gt;Stop&amp;lt;/obc148&amp;gt;&lt;br /&gt;
&amp;lt;/universalremote&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Will map &#039;&#039;Stop Playback&#039;&#039; to the RCA DVD repeat button &amp;lt;obc148&amp;gt;, which is not used by Kodi by default. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Note:&#039;&#039;&#039; ensure that the &amp;lt;universalremote&amp;gt; section is &#039;&#039;&#039;NOT&#039;&#039;&#039; added &#039;within&#039; the &amp;lt;remote&amp;gt; section - it can appear before or after. Otherwise it will not be recognised and produces errors in the logfile.&lt;br /&gt;
&lt;br /&gt;
Remote keys can be observed in the kodi.log file (&#039;&#039;&#039;~/.kodi/temp/kodi.log&#039;&#039;&#039; on Linux) when debugging is enabled in the GUI (Settings -&amp;gt; debugging ). The list of pre-defined OBC codes can be found at [https://github.com/xbmc/xbmc/blob/master/xbmc/input/XBIRRemote.h XBIRRemote.h].&lt;br /&gt;
&lt;br /&gt;
=== Keyboards ===&lt;br /&gt;
Valid keyboard keymap syntax includes &amp;lt;keyname&amp;gt;, &amp;lt;key id=&amp;quot;&amp;quot;&amp;gt;, and &amp;lt;keyname mod=&amp;quot;&amp;quot;&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mapping for arbitrary key codes can be configured using the following syntax: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;key id=&amp;quot;123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where &amp;quot;123&amp;quot; is replaced by the key code.&lt;br /&gt;
&lt;br /&gt;
A full list of valid keynames can be found in &lt;br /&gt;
* the &#039;&#039;TranslateKeyboardString()&#039;&#039; method in [https://github.com/xbmc/xbmc/blob/master/xbmc/input/ButtonTranslator.cpp ButtonTranslator.cpp] &lt;br /&gt;
* or in [[List of Kodi keynames]].&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;keyboard&amp;gt;&lt;br /&gt;
  &amp;lt;key id=&amp;quot;123&amp;quot;&amp;gt;action&amp;lt;/key&amp;gt; -- id is the keys keycode. &amp;gt;&lt;br /&gt;
  &amp;lt;a mod=&amp;quot;shift,alt&amp;quot;&amp;gt;action&amp;lt;/a&amp;gt; -- corresponds to shift-alt-a, the mod=&amp;quot;&amp;quot; syntax is enabled since build 26407. &amp;gt;&lt;br /&gt;
  &amp;lt;space&amp;gt;action&amp;lt;/space&amp;gt; -- for a complete list of valid keynames, see ButtonTranslator.cpp or List of Kodi keynames above. &amp;gt;&lt;br /&gt;
&amp;lt;/keyboard&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Modifiers&lt;br /&gt;
* shift&lt;br /&gt;
* alt&lt;br /&gt;
* ctrl&lt;br /&gt;
&lt;br /&gt;
=== Mouse ===&lt;br /&gt;
&lt;br /&gt;
As this highly depends on the mouse you are using and which kind of buttons are available, we only mention the most common buttons on a mouse:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;keymap&amp;gt;&lt;br /&gt;
  &amp;lt;mouse&amp;gt;&lt;br /&gt;
    &amp;lt;global&amp;gt;&lt;br /&gt;
      &amp;lt;leftclick&amp;gt;...&amp;lt;/leftclick&amp;gt;&lt;br /&gt;
      &amp;lt;middleclick&amp;gt;...&amp;lt;/middleclick&amp;gt;&lt;br /&gt;
      &amp;lt;rightclick&amp;gt;...&amp;lt;/rightclick&amp;gt;&lt;br /&gt;
      &amp;lt;wheelup&amp;gt;...&amp;lt;/wheelup&amp;gt;&lt;br /&gt;
      &amp;lt;wheeldown&amp;gt;...&amp;lt;/wheeldown&amp;gt;&lt;br /&gt;
    &amp;lt;/global&amp;gt;&lt;br /&gt;
  &amp;lt;/mouse&amp;gt;&lt;br /&gt;
&amp;lt;/keymap&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Example for changing the volume while on MusicOSD window using the mouse wheel&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;keymap&amp;gt;&lt;br /&gt;
  &amp;lt;MusicOSD&amp;gt;&lt;br /&gt;
    &amp;lt;mouse&amp;gt;&lt;br /&gt;
      &amp;lt;wheeldown&amp;gt;VolumeDown&amp;lt;/wheeldown&amp;gt;&lt;br /&gt;
      &amp;lt;wheelup&amp;gt;VolumeUp&amp;lt;/wheelup&amp;gt;&lt;br /&gt;
    &amp;lt;/mouse&amp;gt;&lt;br /&gt;
  &amp;lt;/MusicOSD&amp;gt;&lt;br /&gt;
&amp;lt;/keymap&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Custom Joystick Configuration ===&lt;br /&gt;
Custom joysticks are defined using the following syntax:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joystick name=&amp;quot;JOYSTICK NAME&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;button id=&amp;quot;BUTTON ID&amp;quot;&amp;gt;action&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/joystick&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Getting the joystick name:&lt;br /&gt;
* On linux: &#039;cat /proc/bus/input/devices&#039;&lt;br /&gt;
* or see your Kodi log file&lt;br /&gt;
&lt;br /&gt;
Getting the button ids:&lt;br /&gt;
* &#039;id&#039; is the button ID used by SDL. Joystick button ids of connected joysticks appear in kodi.log when they are pressed. Use your log to map custom buttons to actions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joystick name=&amp;quot;PLAYSTATION(R)3 Controller (00:1B:FB:F6:E0:F2)&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;button id=&amp;quot;15&amp;quot;&amp;gt;Select&amp;lt;/button&amp;gt;&lt;br /&gt;
  &amp;lt;button id=&amp;quot;14&amp;quot;&amp;gt;PreviousMenu&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/joystick&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Long-press ==&lt;br /&gt;
{{note| Longpress seems to only be working on keyboard keymaps at the moment }}&lt;br /&gt;
Depending on the device, many remotes, keyboards, and gamepads can use the long-press modifier. This allows a button to do a separate action when held for a short period of time. The syntax for this is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;button mod=&amp;quot;longpress&amp;quot;&amp;gt;action&amp;lt;/button&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not all devices will correctly work with the longpress action, but most should. &lt;br /&gt;
&lt;br /&gt;
{{Note|Long-press will disable keyrepeat for that key/window.}}&lt;br /&gt;
&lt;br /&gt;
=== Removing a long-press action from a default keymap ===&lt;br /&gt;
If you want to simply remove a long-press action, rather than override it, you can place an empty long-press tag in a keymap. This also has the effect of re-enabling keyrepeat for the short-press action.&lt;br /&gt;
&lt;br /&gt;
For example, this will remove the context menu action from the default keyboard.xml keymap:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;keymap&amp;gt;&lt;br /&gt;
  &amp;lt;global&amp;gt;&lt;br /&gt;
    &amp;lt;keyboard&amp;gt;&lt;br /&gt;
      &amp;lt;return mod=&amp;quot;longpress&amp;quot;&amp;gt;&amp;lt;/return&amp;gt;&lt;br /&gt;
      &amp;lt;enter mod=&amp;quot;longpress&amp;quot;&amp;gt;&amp;lt;/enter&amp;gt;&lt;br /&gt;
    &amp;lt;/keyboard&amp;gt;&lt;br /&gt;
  &amp;lt;/global&amp;gt;&lt;br /&gt;
&amp;lt;/keymap&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
The most recent available actions can be found in [https://github.com/xbmc/xbmc/blob/master/xbmc/input/ActionTranslator.cpp ActionTranslator.cpp].&lt;br /&gt;
&lt;br /&gt;
For those debugging integer action codes from the debug log, the mapping of action codes to constants is in [https://github.com/xbmc/xbmc/blob/master/xbmc/input/Key.h Key.h]&lt;br /&gt;
&lt;br /&gt;
In addition to the following actions, you can also use &#039;&#039;&#039;[[Built-in scripting]]&#039;&#039;&#039; in Kodi.&lt;br /&gt;
&lt;br /&gt;
=== Actions ===&lt;br /&gt;
{{Main|Action IDs}}&lt;br /&gt;
{{#lst:Action IDs|Action IDs}}&lt;br /&gt;
&lt;br /&gt;
=== Functions ===&lt;br /&gt;
{{main|List of built-in functions|Built-in scripting}}&lt;br /&gt;
{{#lst:List of built-in functions|functions}}&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
{{main|Window IDs}}&lt;br /&gt;
{{#lst:Window IDs|main content}}&lt;br /&gt;
&lt;br /&gt;
== Additional keys ==&lt;br /&gt;
Other keys that can be mapped to actions.&lt;br /&gt;
&lt;br /&gt;
=== Media keyboards/remotes ===&lt;br /&gt;
* browser_back&lt;br /&gt;
* browser_forward&lt;br /&gt;
* browser_refresh&lt;br /&gt;
* browser_stop&lt;br /&gt;
* browser_search&lt;br /&gt;
* browser_favorites&lt;br /&gt;
* browser_home&lt;br /&gt;
* volume_mute&lt;br /&gt;
* volume_down&lt;br /&gt;
* volume_up&lt;br /&gt;
* next_track&lt;br /&gt;
* prev_track&lt;br /&gt;
* stop&lt;br /&gt;
* play_pause&lt;br /&gt;
* launch_mail&lt;br /&gt;
* launch_media_select&lt;br /&gt;
* launch_app1&lt;br /&gt;
* launch_app2&lt;br /&gt;
* play&lt;br /&gt;
* pause&lt;br /&gt;
* fastforward&lt;br /&gt;
* rewind&lt;br /&gt;
* channelup&lt;br /&gt;
* channeldown&lt;br /&gt;
&lt;br /&gt;
=== Mouse actions ===&lt;br /&gt;
* leftclick&lt;br /&gt;
* rightclick &lt;br /&gt;
* middleclick&lt;br /&gt;
* doubleclick&lt;br /&gt;
* wheelup&lt;br /&gt;
* wheeldown&lt;br /&gt;
* mousemove&lt;br /&gt;
* mousedrag&lt;br /&gt;
* mousedragstart&lt;br /&gt;
* mousedragend&lt;br /&gt;
* mouserdrag - right button drag&lt;br /&gt;
* mouserdragstart - start of right button drag&lt;br /&gt;
* mouserdragend - end of right button drag&lt;br /&gt;
&lt;br /&gt;
== Examples and pre-made keymaps ==&lt;br /&gt;
{{see|:Category:Custom keymaps}}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Remote controls]]&lt;br /&gt;
* [[Keyboard controls]]&lt;br /&gt;
&#039;&#039;&#039;Development:&#039;&#039;&#039;&lt;br /&gt;
* [[Add-on development]]&lt;br /&gt;
* [[Python development]]&lt;br /&gt;
* [[Skinning]]&lt;br /&gt;
&lt;br /&gt;
{{Updated|16}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Remotes]]&lt;br /&gt;
[[Category:Settings]]&lt;br /&gt;
[[Category:Controls]]&lt;/div&gt;</summary>
		<author><name>Fbacher</name></author>
	</entry>
	<entry>
		<id>https://kodi.wiki/index.php?title=Keymap&amp;diff=140097</id>
		<title>Keymap</title>
		<link rel="alternate" type="text/html" href="https://kodi.wiki/index.php?title=Keymap&amp;diff=140097"/>
		<updated>2018-09-13T12:48:43Z</updated>

		<summary type="html">&lt;p&gt;Fbacher: Updated reference to up-to-date list of available Actions.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{mininav| [[Remote controls]] }}&lt;br /&gt;
&amp;lt;section begin=&amp;quot;intro&amp;quot; /&amp;gt;Keymaps are XML base files that define the mappings of keys (keyboard keys, mouse/remote/joysticks buttons and more) to Kodi actions.&amp;lt;section end=&amp;quot;intro&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Customizing keymaps through the GUI ==&lt;br /&gt;
{{main|Add-on:Keymap Editor}}&lt;br /&gt;
Users can customize keymaps for remotes in GUI by using the community [[Add-on:Keymap Editor|Keymap Editor]] add-on.&lt;br /&gt;
&lt;br /&gt;
== Location of keymaps ==&lt;br /&gt;
User modified keymap files must be stored in the &amp;quot;&#039;&#039;&#039;keymaps&#039;&#039;&#039;&amp;quot; folder in the [[userdata]] folder:&lt;br /&gt;
{{#lsth:userdata|Location of the UserData folder}}&lt;br /&gt;
&lt;br /&gt;
=== Defaults ===&lt;br /&gt;
Default keymaps are included when Kodi is installed, but users should not edit those install files directly. Instead, place user modified keymaps in the [[userdata]]/keymaps/ directory.&lt;br /&gt;
&lt;br /&gt;
Kodi can process multiple keymap files and does so like this:&lt;br /&gt;
&lt;br /&gt;
* All *.xml files from the default install settings and userdata/kemaps/ folders are applied as keymaps.&lt;br /&gt;
* All *.xml files are processed in alphabetical order.&lt;br /&gt;
* Keymaps defined in an .xml file add to or override mappings in previous .xml file.&lt;br /&gt;
* Keymaps defined in the userdata folder add to or override mappings in the global keymap.&lt;br /&gt;
&lt;br /&gt;
By default there will be no files in these locations, so grab one from the link below to make a new one/over-ride:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039; https://github.com/xbmc/xbmc/tree/master/system/keymaps &#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039; https://github.com/kodi-game/peripheral.joystick/tree/master/peripheral.joystick/resources/buttonmaps/xml &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Structure ==&lt;br /&gt;
&lt;br /&gt;
There is one &#039;&#039;&#039;global&#039;&#039;&#039; keymap and several &#039;&#039;&#039;window&#039;&#039;&#039;-specific keymaps.&amp;lt;br /&amp;gt;&lt;br /&gt;
Kodi falls back to the global map when the window-specific map hasn&#039;t bound the key being pressed.&lt;br /&gt;
&lt;br /&gt;
The format of keymapping files is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;keymap&amp;gt;&lt;br /&gt;
  &amp;lt;global&amp;gt;&lt;br /&gt;
    &amp;lt;gamepad&amp;gt;&lt;br /&gt;
      &amp;lt;A&amp;gt;Select&amp;lt;/A&amp;gt;&lt;br /&gt;
      [...]&lt;br /&gt;
    &amp;lt;/gamepad&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;remote&amp;gt;&lt;br /&gt;
      &amp;lt;select&amp;gt;Select&amp;lt;/select&amp;gt;&lt;br /&gt;
      [...]&lt;br /&gt;
    &amp;lt;/remote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;keyboard&amp;gt;&lt;br /&gt;
      &amp;lt;enter&amp;gt;Select&amp;lt;/enter&amp;gt;&lt;br /&gt;
      [...]&lt;br /&gt;
    &amp;lt;/keyboard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;mouse&amp;gt;&lt;br /&gt;
      &amp;lt;leftclick&amp;gt;Select&amp;lt;/leftclick&amp;gt;&lt;br /&gt;
      [...]&lt;br /&gt;
    &amp;lt;/mouse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;universalremote&amp;gt;&lt;br /&gt;
      &amp;lt;obc25&amp;gt;XBMC.ActivateWindow(MyMusic)&amp;lt;/obc25&amp;gt;&lt;br /&gt;
      [...]&lt;br /&gt;
    &amp;lt;/universalremote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;joystick name=&amp;quot;PLAYSTATION(R)3 Controller (00:1B:FB:F6:E0:F2)&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;button id=&amp;quot;15&amp;quot;&amp;gt;Select&amp;lt;/button&amp;gt;&lt;br /&gt;
      [...]&lt;br /&gt;
    &amp;lt;/joystick&amp;gt;&lt;br /&gt;
  &amp;lt;/global&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Home&amp;gt;&lt;br /&gt;
    [...]&lt;br /&gt;
  &amp;lt;/Home&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [...]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/keymap&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, it&#039;s divided into a &amp;lt;global&amp;gt; section, and a number of window sections (such as &amp;lt;Home&amp;gt;).&amp;lt;br /&amp;gt;&lt;br /&gt;
A list of the available window names can be seen [[Window IDs|here]]. The WINDOW can also be a custom window formatted as &amp;lt;windowId#&amp;gt; (e. g. &amp;lt;window1113&amp;gt;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Each of these sections can contain Gamepad, Remote, Keyboard, Universal Remote, and custom Joystick sections.&lt;br /&gt;
&lt;br /&gt;
The format for mapping a particular key under one of these device types is as follows:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;keyname&amp;gt;action&amp;lt;/keyname&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Keynames ==&lt;br /&gt;
Depending on your device you will need to use a specific &amp;quot;keyname&amp;quot;.&lt;br /&gt;
=== Gamepads ===&lt;br /&gt;
An up to date list of the available actions can be found in the source code of Kodi in [https://github.com/xbmc/xbmc/blob/master/xbmc/input/ButtonTranslator.cpp ButtonTranslator.cpp] where the &#039;&#039;TranslateGamepadString()&#039;&#039; function does the work.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gamepad&amp;gt;&lt;br /&gt;
  &amp;lt;A&amp;gt;Select&amp;lt;/A&amp;gt;&lt;br /&gt;
&amp;lt;/gamepad&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Remotes ===&lt;br /&gt;
An up to  date list of  button names can be found in the source code of Kodi [https://github.com/xbmc/xbmc/blob/master/xbmc/input/IRTranslator.cpp IRTranslator.cpp]. See the method TranslateString().&lt;br /&gt;
&lt;br /&gt;
An up to date list of the available actions can be found in the source code of Kodi in [https://github.com/xbmc/xbmc/blob/master/xbmc/input/ActionTranslator.cpp ActionTranslator.cpp]. See the definition of ActionMappings.&lt;br /&gt;
&lt;br /&gt;
{{Note|Some remotes (e.g. FLIRC) are actually seen as &amp;quot;keyboards&amp;quot;. Those will need to use the &amp;lt;keyboard&amp;gt; tag instead.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;remote&amp;gt; &lt;br /&gt;
  &amp;lt;play&amp;gt;Play&amp;lt;/play&amp;gt;&lt;br /&gt;
&amp;lt;/remote&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Universal Remotes ===&lt;br /&gt;
To map Universal Remote buttons using the RCA infrared protocol, you may add &#039;&#039;&#039;&amp;lt;universalremote&amp;gt;&#039;&#039;&#039; sections to keymap.xml.&amp;lt;br /&amp;gt;&lt;br /&gt;
In this case, the tags used are &amp;lt;obc#&amp;gt; where # is the original button code (OBC) of the button.&amp;lt;br /&amp;gt;&lt;br /&gt;
You would put it inside a &amp;lt;universalremote&amp;gt; section in the &amp;lt;window&amp;gt; or &amp;lt;global&amp;gt; sections.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;universalremote&amp;gt; &lt;br /&gt;
  &amp;lt;obc148&amp;gt;Stop&amp;lt;/obc148&amp;gt;&lt;br /&gt;
&amp;lt;/universalremote&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Will map &#039;&#039;Stop Playback&#039;&#039; to the RCA DVD repeat button &amp;lt;obc148&amp;gt;, which is not used by Kodi by default. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Note:&#039;&#039;&#039; ensure that the &amp;lt;universalremote&amp;gt; section is &#039;&#039;&#039;NOT&#039;&#039;&#039; added &#039;within&#039; the &amp;lt;remote&amp;gt; section - it can appear before or after. Otherwise it will not be recognised and produces errors in the logfile.&lt;br /&gt;
&lt;br /&gt;
Remote keys can be observed in the kodi.log file (&#039;&#039;&#039;~/.kodi/temp/kodi.log&#039;&#039;&#039; on Linux) when debugging is enabled in the GUI (Settings -&amp;gt; debugging ). The list of pre-defined OBC codes can be found at [https://github.com/xbmc/xbmc/blob/master/xbmc/input/XBIRRemote.h XBIRRemote.h].&lt;br /&gt;
&lt;br /&gt;
=== Keyboards ===&lt;br /&gt;
Valid keyboard keymap syntax includes &amp;lt;keyname&amp;gt;, &amp;lt;key id=&amp;quot;&amp;quot;&amp;gt;, and &amp;lt;keyname mod=&amp;quot;&amp;quot;&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mapping for arbitrary key codes can be configured using the following syntax: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;key id=&amp;quot;123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where &amp;quot;123&amp;quot; is replaced by the key code.&lt;br /&gt;
&lt;br /&gt;
A full list of valid keynames can be found in &lt;br /&gt;
* the &#039;&#039;TranslateKeyboardString()&#039;&#039; method in [https://github.com/xbmc/xbmc/blob/master/xbmc/input/ButtonTranslator.cpp ButtonTranslator.cpp] &lt;br /&gt;
* or in [[List of Kodi keynames]].&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;keyboard&amp;gt;&lt;br /&gt;
  &amp;lt;key id=&amp;quot;123&amp;quot;&amp;gt;action&amp;lt;/key&amp;gt; -- id is the keys keycode. &amp;gt;&lt;br /&gt;
  &amp;lt;a mod=&amp;quot;shift,alt&amp;quot;&amp;gt;action&amp;lt;/a&amp;gt; -- corresponds to shift-alt-a, the mod=&amp;quot;&amp;quot; syntax is enabled since build 26407. &amp;gt;&lt;br /&gt;
  &amp;lt;space&amp;gt;action&amp;lt;/space&amp;gt; -- for a complete list of valid keynames, see ButtonTranslator.cpp or List of Kodi keynames above. &amp;gt;&lt;br /&gt;
&amp;lt;/keyboard&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Modifiers&lt;br /&gt;
* shift&lt;br /&gt;
* alt&lt;br /&gt;
* ctrl&lt;br /&gt;
&lt;br /&gt;
=== Mouse ===&lt;br /&gt;
&lt;br /&gt;
As this highly depends on the mouse you are using and which kind of buttons are available, we only mention the most common buttons on a mouse:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;keymap&amp;gt;&lt;br /&gt;
  &amp;lt;mouse&amp;gt;&lt;br /&gt;
    &amp;lt;global&amp;gt;&lt;br /&gt;
      &amp;lt;leftclick&amp;gt;...&amp;lt;/leftclick&amp;gt;&lt;br /&gt;
      &amp;lt;middleclick&amp;gt;...&amp;lt;/middleclick&amp;gt;&lt;br /&gt;
      &amp;lt;rightclick&amp;gt;...&amp;lt;/rightclick&amp;gt;&lt;br /&gt;
      &amp;lt;wheelup&amp;gt;...&amp;lt;/wheelup&amp;gt;&lt;br /&gt;
      &amp;lt;wheeldown&amp;gt;...&amp;lt;/wheeldown&amp;gt;&lt;br /&gt;
    &amp;lt;/global&amp;gt;&lt;br /&gt;
  &amp;lt;/mouse&amp;gt;&lt;br /&gt;
&amp;lt;/keymap&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Example for changing the volume while on MusicOSD window using the mouse wheel&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;keymap&amp;gt;&lt;br /&gt;
  &amp;lt;MusicOSD&amp;gt;&lt;br /&gt;
    &amp;lt;mouse&amp;gt;&lt;br /&gt;
      &amp;lt;wheeldown&amp;gt;VolumeDown&amp;lt;/wheeldown&amp;gt;&lt;br /&gt;
      &amp;lt;wheelup&amp;gt;VolumeUp&amp;lt;/wheelup&amp;gt;&lt;br /&gt;
    &amp;lt;/mouse&amp;gt;&lt;br /&gt;
  &amp;lt;/MusicOSD&amp;gt;&lt;br /&gt;
&amp;lt;/keymap&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Custom Joystick Configuration ===&lt;br /&gt;
Custom joysticks are defined using the following syntax:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joystick name=&amp;quot;JOYSTICK NAME&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;button id=&amp;quot;BUTTON ID&amp;quot;&amp;gt;action&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/joystick&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Getting the joystick name:&lt;br /&gt;
* On linux: &#039;cat /proc/bus/input/devices&#039;&lt;br /&gt;
* or see your Kodi log file&lt;br /&gt;
&lt;br /&gt;
Getting the button ids:&lt;br /&gt;
* &#039;id&#039; is the button ID used by SDL. Joystick button ids of connected joysticks appear in kodi.log when they are pressed. Use your log to map custom buttons to actions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joystick name=&amp;quot;PLAYSTATION(R)3 Controller (00:1B:FB:F6:E0:F2)&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;button id=&amp;quot;15&amp;quot;&amp;gt;Select&amp;lt;/button&amp;gt;&lt;br /&gt;
  &amp;lt;button id=&amp;quot;14&amp;quot;&amp;gt;PreviousMenu&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/joystick&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Long-press ==&lt;br /&gt;
{{note| Longpress seems to only be working on keyboard keymaps at the moment }}&lt;br /&gt;
Depending on the device, many remotes, keyboards, and gamepads can use the long-press modifier. This allows a button to do a separate action when held for a short period of time. The syntax for this is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;button mod=&amp;quot;longpress&amp;quot;&amp;gt;action&amp;lt;/button&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not all devices will correctly work with the longpress action, but most should. &lt;br /&gt;
&lt;br /&gt;
{{Note|Long-press will disable keyrepeat for that key/window.}}&lt;br /&gt;
&lt;br /&gt;
=== Removing a long-press action from a default keymap ===&lt;br /&gt;
If you want to simply remove a long-press action, rather than override it, you can place an empty long-press tag in a keymap. This also has the effect of re-enabling keyrepeat for the short-press action.&lt;br /&gt;
&lt;br /&gt;
For example, this will remove the context menu action from the default keyboard.xml keymap:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;keymap&amp;gt;&lt;br /&gt;
  &amp;lt;global&amp;gt;&lt;br /&gt;
    &amp;lt;keyboard&amp;gt;&lt;br /&gt;
      &amp;lt;return mod=&amp;quot;longpress&amp;quot;&amp;gt;&amp;lt;/return&amp;gt;&lt;br /&gt;
      &amp;lt;enter mod=&amp;quot;longpress&amp;quot;&amp;gt;&amp;lt;/enter&amp;gt;&lt;br /&gt;
    &amp;lt;/keyboard&amp;gt;&lt;br /&gt;
  &amp;lt;/global&amp;gt;&lt;br /&gt;
&amp;lt;/keymap&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
The most recent available actions can be found in [https://github.com/xbmc/xbmc/blob/master/xbmc/input/ActionTranslator.cpp ActionTranslator.cpp].&lt;br /&gt;
&lt;br /&gt;
For those debugging integer action codes from the debug log, the mapping of action codes to constants is in [https://github.com/xbmc/xbmc/blob/master/xbmc/input/Key.h Key.h]&lt;br /&gt;
&lt;br /&gt;
In addition to the following actions, you can also use &#039;&#039;&#039;[[Built-in scripting]]&#039;&#039;&#039; in Kodi.&lt;br /&gt;
&lt;br /&gt;
=== Actions ===&lt;br /&gt;
{{Main|Action IDs}}&lt;br /&gt;
{{#lst:Action IDs|Action IDs}}&lt;br /&gt;
&lt;br /&gt;
=== Functions ===&lt;br /&gt;
{{main|List of built-in functions|Built-in scripting}}&lt;br /&gt;
{{#lst:List of built-in functions|functions}}&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
{{main|Window IDs}}&lt;br /&gt;
{{#lst:Window IDs|main content}}&lt;br /&gt;
&lt;br /&gt;
== Additional keys ==&lt;br /&gt;
Other keys that can be mapped to actions.&lt;br /&gt;
&lt;br /&gt;
=== Media keyboards/remotes ===&lt;br /&gt;
* browser_back&lt;br /&gt;
* browser_forward&lt;br /&gt;
* browser_refresh&lt;br /&gt;
* browser_stop&lt;br /&gt;
* browser_search&lt;br /&gt;
* browser_favorites&lt;br /&gt;
* browser_home&lt;br /&gt;
* volume_mute&lt;br /&gt;
* volume_down&lt;br /&gt;
* volume_up&lt;br /&gt;
* next_track&lt;br /&gt;
* prev_track&lt;br /&gt;
* stop&lt;br /&gt;
* play_pause&lt;br /&gt;
* launch_mail&lt;br /&gt;
* launch_media_select&lt;br /&gt;
* launch_app1&lt;br /&gt;
* launch_app2&lt;br /&gt;
* play&lt;br /&gt;
* pause&lt;br /&gt;
* fastforward&lt;br /&gt;
* rewind&lt;br /&gt;
* channelup&lt;br /&gt;
* channeldown&lt;br /&gt;
&lt;br /&gt;
=== Mouse actions ===&lt;br /&gt;
* leftclick&lt;br /&gt;
* rightclick &lt;br /&gt;
* middleclick&lt;br /&gt;
* doubleclick&lt;br /&gt;
* wheelup&lt;br /&gt;
* wheeldown&lt;br /&gt;
* mousemove&lt;br /&gt;
* mousedrag&lt;br /&gt;
* mousedragstart&lt;br /&gt;
* mousedragend&lt;br /&gt;
* mouserdrag - right button drag&lt;br /&gt;
* mouserdragstart - start of right button drag&lt;br /&gt;
* mouserdragend - end of right button drag&lt;br /&gt;
&lt;br /&gt;
== Examples and pre-made keymaps ==&lt;br /&gt;
{{see|:Category:Custom keymaps}}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Remote controls]]&lt;br /&gt;
* [[Keyboard controls]]&lt;br /&gt;
&#039;&#039;&#039;Development:&#039;&#039;&#039;&lt;br /&gt;
* [[Add-on development]]&lt;br /&gt;
* [[Python development]]&lt;br /&gt;
* [[Skinning]]&lt;br /&gt;
&lt;br /&gt;
{{Updated|16}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Remotes]]&lt;br /&gt;
[[Category:Settings]]&lt;br /&gt;
[[Category:Controls]]&lt;/div&gt;</summary>
		<author><name>Fbacher</name></author>
	</entry>
	<entry>
		<id>https://kodi.wiki/index.php?title=Keymap&amp;diff=140096</id>
		<title>Keymap</title>
		<link rel="alternate" type="text/html" href="https://kodi.wiki/index.php?title=Keymap&amp;diff=140096"/>
		<updated>2018-09-13T12:44:21Z</updated>

		<summary type="html">&lt;p&gt;Fbacher: Add reference to master list of  remote button names&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{mininav| [[Remote controls]] }}&lt;br /&gt;
&amp;lt;section begin=&amp;quot;intro&amp;quot; /&amp;gt;Keymaps are XML base files that define the mappings of keys (keyboard keys, mouse/remote/joysticks buttons and more) to Kodi actions.&amp;lt;section end=&amp;quot;intro&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Customizing keymaps through the GUI ==&lt;br /&gt;
{{main|Add-on:Keymap Editor}}&lt;br /&gt;
Users can customize keymaps for remotes in GUI by using the community [[Add-on:Keymap Editor|Keymap Editor]] add-on.&lt;br /&gt;
&lt;br /&gt;
== Location of keymaps ==&lt;br /&gt;
User modified keymap files must be stored in the &amp;quot;&#039;&#039;&#039;keymaps&#039;&#039;&#039;&amp;quot; folder in the [[userdata]] folder:&lt;br /&gt;
{{#lsth:userdata|Location of the UserData folder}}&lt;br /&gt;
&lt;br /&gt;
=== Defaults ===&lt;br /&gt;
Default keymaps are included when Kodi is installed, but users should not edit those install files directly. Instead, place user modified keymaps in the [[userdata]]/keymaps/ directory.&lt;br /&gt;
&lt;br /&gt;
Kodi can process multiple keymap files and does so like this:&lt;br /&gt;
&lt;br /&gt;
* All *.xml files from the default install settings and userdata/kemaps/ folders are applied as keymaps.&lt;br /&gt;
* All *.xml files are processed in alphabetical order.&lt;br /&gt;
* Keymaps defined in an .xml file add to or override mappings in previous .xml file.&lt;br /&gt;
* Keymaps defined in the userdata folder add to or override mappings in the global keymap.&lt;br /&gt;
&lt;br /&gt;
By default there will be no files in these locations, so grab one from the link below to make a new one/over-ride:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039; https://github.com/xbmc/xbmc/tree/master/system/keymaps &#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039; https://github.com/kodi-game/peripheral.joystick/tree/master/peripheral.joystick/resources/buttonmaps/xml &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Structure ==&lt;br /&gt;
&lt;br /&gt;
There is one &#039;&#039;&#039;global&#039;&#039;&#039; keymap and several &#039;&#039;&#039;window&#039;&#039;&#039;-specific keymaps.&amp;lt;br /&amp;gt;&lt;br /&gt;
Kodi falls back to the global map when the window-specific map hasn&#039;t bound the key being pressed.&lt;br /&gt;
&lt;br /&gt;
The format of keymapping files is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;keymap&amp;gt;&lt;br /&gt;
  &amp;lt;global&amp;gt;&lt;br /&gt;
    &amp;lt;gamepad&amp;gt;&lt;br /&gt;
      &amp;lt;A&amp;gt;Select&amp;lt;/A&amp;gt;&lt;br /&gt;
      [...]&lt;br /&gt;
    &amp;lt;/gamepad&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;remote&amp;gt;&lt;br /&gt;
      &amp;lt;select&amp;gt;Select&amp;lt;/select&amp;gt;&lt;br /&gt;
      [...]&lt;br /&gt;
    &amp;lt;/remote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;keyboard&amp;gt;&lt;br /&gt;
      &amp;lt;enter&amp;gt;Select&amp;lt;/enter&amp;gt;&lt;br /&gt;
      [...]&lt;br /&gt;
    &amp;lt;/keyboard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;mouse&amp;gt;&lt;br /&gt;
      &amp;lt;leftclick&amp;gt;Select&amp;lt;/leftclick&amp;gt;&lt;br /&gt;
      [...]&lt;br /&gt;
    &amp;lt;/mouse&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;universalremote&amp;gt;&lt;br /&gt;
      &amp;lt;obc25&amp;gt;XBMC.ActivateWindow(MyMusic)&amp;lt;/obc25&amp;gt;&lt;br /&gt;
      [...]&lt;br /&gt;
    &amp;lt;/universalremote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;joystick name=&amp;quot;PLAYSTATION(R)3 Controller (00:1B:FB:F6:E0:F2)&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;button id=&amp;quot;15&amp;quot;&amp;gt;Select&amp;lt;/button&amp;gt;&lt;br /&gt;
      [...]&lt;br /&gt;
    &amp;lt;/joystick&amp;gt;&lt;br /&gt;
  &amp;lt;/global&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Home&amp;gt;&lt;br /&gt;
    [...]&lt;br /&gt;
  &amp;lt;/Home&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [...]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/keymap&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, it&#039;s divided into a &amp;lt;global&amp;gt; section, and a number of window sections (such as &amp;lt;Home&amp;gt;).&amp;lt;br /&amp;gt;&lt;br /&gt;
A list of the available window names can be seen [[Window IDs|here]]. The WINDOW can also be a custom window formatted as &amp;lt;windowId#&amp;gt; (e. g. &amp;lt;window1113&amp;gt;). &amp;lt;br /&amp;gt;&lt;br /&gt;
Each of these sections can contain Gamepad, Remote, Keyboard, Universal Remote, and custom Joystick sections.&lt;br /&gt;
&lt;br /&gt;
The format for mapping a particular key under one of these device types is as follows:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;keyname&amp;gt;action&amp;lt;/keyname&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Keynames ==&lt;br /&gt;
Depending on your device you will need to use a specific &amp;quot;keyname&amp;quot;.&lt;br /&gt;
=== Gamepads ===&lt;br /&gt;
An up to date list of the available actions can be found in the source code of Kodi in [https://github.com/xbmc/xbmc/blob/master/xbmc/input/ButtonTranslator.cpp ButtonTranslator.cpp] where the &#039;&#039;TranslateGamepadString()&#039;&#039; function does the work.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gamepad&amp;gt;&lt;br /&gt;
  &amp;lt;A&amp;gt;Select&amp;lt;/A&amp;gt;&lt;br /&gt;
&amp;lt;/gamepad&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Remotes ===&lt;br /&gt;
An up to  date list of  button names can be found in the source code of Kodi [https://github.com/xbmc/xbmc/blob/master/xbmc/input/IRTranslator.cpp IRTranslator.cpp]. See the method TranslateString().&lt;br /&gt;
&lt;br /&gt;
An up to date list of the available actions can be found in the source code of Kodi in [https://github.com/xbmc/xbmc/blob/master/xbmc/input/ButtonTranslator.cpp ButtonTranslator.cpp] where the &#039;&#039;TranslateRemoteString()&#039;&#039; (NOTE: not existing anymore) function does the work.&lt;br /&gt;
&lt;br /&gt;
{{Note|Some remotes (e.g. FLIRC) are actually seen as &amp;quot;keyboards&amp;quot;. Those will need to use the &amp;lt;keyboard&amp;gt; tag instead.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;remote&amp;gt; &lt;br /&gt;
  &amp;lt;play&amp;gt;Play&amp;lt;/play&amp;gt;&lt;br /&gt;
&amp;lt;/remote&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Universal Remotes ===&lt;br /&gt;
To map Universal Remote buttons using the RCA infrared protocol, you may add &#039;&#039;&#039;&amp;lt;universalremote&amp;gt;&#039;&#039;&#039; sections to keymap.xml.&amp;lt;br /&amp;gt;&lt;br /&gt;
In this case, the tags used are &amp;lt;obc#&amp;gt; where # is the original button code (OBC) of the button.&amp;lt;br /&amp;gt;&lt;br /&gt;
You would put it inside a &amp;lt;universalremote&amp;gt; section in the &amp;lt;window&amp;gt; or &amp;lt;global&amp;gt; sections.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;universalremote&amp;gt; &lt;br /&gt;
  &amp;lt;obc148&amp;gt;Stop&amp;lt;/obc148&amp;gt;&lt;br /&gt;
&amp;lt;/universalremote&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Will map &#039;&#039;Stop Playback&#039;&#039; to the RCA DVD repeat button &amp;lt;obc148&amp;gt;, which is not used by Kodi by default. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Note:&#039;&#039;&#039; ensure that the &amp;lt;universalremote&amp;gt; section is &#039;&#039;&#039;NOT&#039;&#039;&#039; added &#039;within&#039; the &amp;lt;remote&amp;gt; section - it can appear before or after. Otherwise it will not be recognised and produces errors in the logfile.&lt;br /&gt;
&lt;br /&gt;
Remote keys can be observed in the kodi.log file (&#039;&#039;&#039;~/.kodi/temp/kodi.log&#039;&#039;&#039; on Linux) when debugging is enabled in the GUI (Settings -&amp;gt; debugging ). The list of pre-defined OBC codes can be found at [https://github.com/xbmc/xbmc/blob/master/xbmc/input/XBIRRemote.h XBIRRemote.h].&lt;br /&gt;
&lt;br /&gt;
=== Keyboards ===&lt;br /&gt;
Valid keyboard keymap syntax includes &amp;lt;keyname&amp;gt;, &amp;lt;key id=&amp;quot;&amp;quot;&amp;gt;, and &amp;lt;keyname mod=&amp;quot;&amp;quot;&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mapping for arbitrary key codes can be configured using the following syntax: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;key id=&amp;quot;123&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where &amp;quot;123&amp;quot; is replaced by the key code.&lt;br /&gt;
&lt;br /&gt;
A full list of valid keynames can be found in &lt;br /&gt;
* the &#039;&#039;TranslateKeyboardString()&#039;&#039; method in [https://github.com/xbmc/xbmc/blob/master/xbmc/input/ButtonTranslator.cpp ButtonTranslator.cpp] &lt;br /&gt;
* or in [[List of Kodi keynames]].&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;keyboard&amp;gt;&lt;br /&gt;
  &amp;lt;key id=&amp;quot;123&amp;quot;&amp;gt;action&amp;lt;/key&amp;gt; -- id is the keys keycode. &amp;gt;&lt;br /&gt;
  &amp;lt;a mod=&amp;quot;shift,alt&amp;quot;&amp;gt;action&amp;lt;/a&amp;gt; -- corresponds to shift-alt-a, the mod=&amp;quot;&amp;quot; syntax is enabled since build 26407. &amp;gt;&lt;br /&gt;
  &amp;lt;space&amp;gt;action&amp;lt;/space&amp;gt; -- for a complete list of valid keynames, see ButtonTranslator.cpp or List of Kodi keynames above. &amp;gt;&lt;br /&gt;
&amp;lt;/keyboard&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Modifiers&lt;br /&gt;
* shift&lt;br /&gt;
* alt&lt;br /&gt;
* ctrl&lt;br /&gt;
&lt;br /&gt;
=== Mouse ===&lt;br /&gt;
&lt;br /&gt;
As this highly depends on the mouse you are using and which kind of buttons are available, we only mention the most common buttons on a mouse:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;keymap&amp;gt;&lt;br /&gt;
  &amp;lt;mouse&amp;gt;&lt;br /&gt;
    &amp;lt;global&amp;gt;&lt;br /&gt;
      &amp;lt;leftclick&amp;gt;...&amp;lt;/leftclick&amp;gt;&lt;br /&gt;
      &amp;lt;middleclick&amp;gt;...&amp;lt;/middleclick&amp;gt;&lt;br /&gt;
      &amp;lt;rightclick&amp;gt;...&amp;lt;/rightclick&amp;gt;&lt;br /&gt;
      &amp;lt;wheelup&amp;gt;...&amp;lt;/wheelup&amp;gt;&lt;br /&gt;
      &amp;lt;wheeldown&amp;gt;...&amp;lt;/wheeldown&amp;gt;&lt;br /&gt;
    &amp;lt;/global&amp;gt;&lt;br /&gt;
  &amp;lt;/mouse&amp;gt;&lt;br /&gt;
&amp;lt;/keymap&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Example for changing the volume while on MusicOSD window using the mouse wheel&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;keymap&amp;gt;&lt;br /&gt;
  &amp;lt;MusicOSD&amp;gt;&lt;br /&gt;
    &amp;lt;mouse&amp;gt;&lt;br /&gt;
      &amp;lt;wheeldown&amp;gt;VolumeDown&amp;lt;/wheeldown&amp;gt;&lt;br /&gt;
      &amp;lt;wheelup&amp;gt;VolumeUp&amp;lt;/wheelup&amp;gt;&lt;br /&gt;
    &amp;lt;/mouse&amp;gt;&lt;br /&gt;
  &amp;lt;/MusicOSD&amp;gt;&lt;br /&gt;
&amp;lt;/keymap&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Custom Joystick Configuration ===&lt;br /&gt;
Custom joysticks are defined using the following syntax:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joystick name=&amp;quot;JOYSTICK NAME&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;button id=&amp;quot;BUTTON ID&amp;quot;&amp;gt;action&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/joystick&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Getting the joystick name:&lt;br /&gt;
* On linux: &#039;cat /proc/bus/input/devices&#039;&lt;br /&gt;
* or see your Kodi log file&lt;br /&gt;
&lt;br /&gt;
Getting the button ids:&lt;br /&gt;
* &#039;id&#039; is the button ID used by SDL. Joystick button ids of connected joysticks appear in kodi.log when they are pressed. Use your log to map custom buttons to actions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;joystick name=&amp;quot;PLAYSTATION(R)3 Controller (00:1B:FB:F6:E0:F2)&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;button id=&amp;quot;15&amp;quot;&amp;gt;Select&amp;lt;/button&amp;gt;&lt;br /&gt;
  &amp;lt;button id=&amp;quot;14&amp;quot;&amp;gt;PreviousMenu&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/joystick&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Long-press ==&lt;br /&gt;
{{note| Longpress seems to only be working on keyboard keymaps at the moment }}&lt;br /&gt;
Depending on the device, many remotes, keyboards, and gamepads can use the long-press modifier. This allows a button to do a separate action when held for a short period of time. The syntax for this is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;button mod=&amp;quot;longpress&amp;quot;&amp;gt;action&amp;lt;/button&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not all devices will correctly work with the longpress action, but most should. &lt;br /&gt;
&lt;br /&gt;
{{Note|Long-press will disable keyrepeat for that key/window.}}&lt;br /&gt;
&lt;br /&gt;
=== Removing a long-press action from a default keymap ===&lt;br /&gt;
If you want to simply remove a long-press action, rather than override it, you can place an empty long-press tag in a keymap. This also has the effect of re-enabling keyrepeat for the short-press action.&lt;br /&gt;
&lt;br /&gt;
For example, this will remove the context menu action from the default keyboard.xml keymap:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;keymap&amp;gt;&lt;br /&gt;
  &amp;lt;global&amp;gt;&lt;br /&gt;
    &amp;lt;keyboard&amp;gt;&lt;br /&gt;
      &amp;lt;return mod=&amp;quot;longpress&amp;quot;&amp;gt;&amp;lt;/return&amp;gt;&lt;br /&gt;
      &amp;lt;enter mod=&amp;quot;longpress&amp;quot;&amp;gt;&amp;lt;/enter&amp;gt;&lt;br /&gt;
    &amp;lt;/keyboard&amp;gt;&lt;br /&gt;
  &amp;lt;/global&amp;gt;&lt;br /&gt;
&amp;lt;/keymap&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
The most recent available actions can be found in [https://github.com/xbmc/xbmc/blob/master/xbmc/input/ActionTranslator.cpp ActionTranslator.cpp].&lt;br /&gt;
&lt;br /&gt;
For those debugging integer action codes from the debug log, the mapping of action codes to constants is in [https://github.com/xbmc/xbmc/blob/master/xbmc/input/Key.h Key.h]&lt;br /&gt;
&lt;br /&gt;
In addition to the following actions, you can also use &#039;&#039;&#039;[[Built-in scripting]]&#039;&#039;&#039; in Kodi.&lt;br /&gt;
&lt;br /&gt;
=== Actions ===&lt;br /&gt;
{{Main|Action IDs}}&lt;br /&gt;
{{#lst:Action IDs|Action IDs}}&lt;br /&gt;
&lt;br /&gt;
=== Functions ===&lt;br /&gt;
{{main|List of built-in functions|Built-in scripting}}&lt;br /&gt;
{{#lst:List of built-in functions|functions}}&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
{{main|Window IDs}}&lt;br /&gt;
{{#lst:Window IDs|main content}}&lt;br /&gt;
&lt;br /&gt;
== Additional keys ==&lt;br /&gt;
Other keys that can be mapped to actions.&lt;br /&gt;
&lt;br /&gt;
=== Media keyboards/remotes ===&lt;br /&gt;
* browser_back&lt;br /&gt;
* browser_forward&lt;br /&gt;
* browser_refresh&lt;br /&gt;
* browser_stop&lt;br /&gt;
* browser_search&lt;br /&gt;
* browser_favorites&lt;br /&gt;
* browser_home&lt;br /&gt;
* volume_mute&lt;br /&gt;
* volume_down&lt;br /&gt;
* volume_up&lt;br /&gt;
* next_track&lt;br /&gt;
* prev_track&lt;br /&gt;
* stop&lt;br /&gt;
* play_pause&lt;br /&gt;
* launch_mail&lt;br /&gt;
* launch_media_select&lt;br /&gt;
* launch_app1&lt;br /&gt;
* launch_app2&lt;br /&gt;
* play&lt;br /&gt;
* pause&lt;br /&gt;
* fastforward&lt;br /&gt;
* rewind&lt;br /&gt;
* channelup&lt;br /&gt;
* channeldown&lt;br /&gt;
&lt;br /&gt;
=== Mouse actions ===&lt;br /&gt;
* leftclick&lt;br /&gt;
* rightclick &lt;br /&gt;
* middleclick&lt;br /&gt;
* doubleclick&lt;br /&gt;
* wheelup&lt;br /&gt;
* wheeldown&lt;br /&gt;
* mousemove&lt;br /&gt;
* mousedrag&lt;br /&gt;
* mousedragstart&lt;br /&gt;
* mousedragend&lt;br /&gt;
* mouserdrag - right button drag&lt;br /&gt;
* mouserdragstart - start of right button drag&lt;br /&gt;
* mouserdragend - end of right button drag&lt;br /&gt;
&lt;br /&gt;
== Examples and pre-made keymaps ==&lt;br /&gt;
{{see|:Category:Custom keymaps}}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Remote controls]]&lt;br /&gt;
* [[Keyboard controls]]&lt;br /&gt;
&#039;&#039;&#039;Development:&#039;&#039;&#039;&lt;br /&gt;
* [[Add-on development]]&lt;br /&gt;
* [[Python development]]&lt;br /&gt;
* [[Skinning]]&lt;br /&gt;
&lt;br /&gt;
{{Updated|16}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Remotes]]&lt;br /&gt;
[[Category:Settings]]&lt;br /&gt;
[[Category:Controls]]&lt;/div&gt;</summary>
		<author><name>Fbacher</name></author>
	</entry>
	<entry>
		<id>https://kodi.wiki/index.php?title=HOW-TO:Set_up_an_MCE_remote_control_in_Linux&amp;diff=139941</id>
		<title>HOW-TO:Set up an MCE remote control in Linux</title>
		<link rel="alternate" type="text/html" href="https://kodi.wiki/index.php?title=HOW-TO:Set_up_an_MCE_remote_control_in_Linux&amp;diff=139941"/>
		<updated>2018-08-21T20:33:36Z</updated>

		<summary type="html">&lt;p&gt;Fbacher: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This guide will help to configure an MCE Remote on a linux HTPC, even if all the commands are specific to Ubuntu, the main steps are the same on any modern linux distribution.&lt;br /&gt;
&lt;br /&gt;
MCE remotes are IR remotes that split into two main categories:&lt;br /&gt;
* MCE remotes that send keystrokes&lt;br /&gt;
* Windows remotes also known as RC6 or eHome remotes&lt;br /&gt;
&lt;br /&gt;
Most remotes work out of the box through the kernel input event subsystem. However they are often unusable in this state due to laggy/buggy behavior. &lt;br /&gt;
On Linux it is often easier to use the [http://www.wikipedia.org Lirc] package.&lt;br /&gt;
&lt;br /&gt;
== Install the remote ==&lt;br /&gt;
=== Simple Installation method with Lircd ===&lt;br /&gt;
&lt;br /&gt;
The easiest way is to use the lircd daemon shipped with lirc package.&lt;br /&gt;
Most likely you will also want lirc-compat-remotes which are put in /usr/share/lirc/remotes.&lt;br /&gt;
&lt;br /&gt;
In terminal, use the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y lirc lirc-compat-remotes&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After the installation a configuration dialog will appear on Ubuntu.&lt;br /&gt;
Choose the correct values corresponding to your receiver (and eventually transmitter)&lt;br /&gt;
&lt;br /&gt;
you can now test if the correct value are send by the remote buttons by using the &amp;lt;code&amp;gt;irw&amp;lt;/code&amp;gt; command tool and then launch XBMC and check if the main button are responding correctly.&lt;br /&gt;
&lt;br /&gt;
You can always reconfigure the lirc package with the dpkg-reconfigure command:&lt;br /&gt;
 &amp;lt;pre&amp;gt;dpkg-reconfigure lirc&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the remote don&#039;t work it is always a good idea to reconfigure lirc package by choosing one of those 2 generic value for the receiver option :&lt;br /&gt;
* Windows Media Center Transceivers/Remotes (all)&lt;br /&gt;
* Linux input layer (/dev/input/eventX)&lt;br /&gt;
&lt;br /&gt;
a more complete guide is available here : [[HOW-TO:Setup_Lirc|HOW-TO: Setup Lirc]]&lt;br /&gt;
&lt;br /&gt;
=== Alternative Installation method using InputLirc ===&lt;br /&gt;
&lt;br /&gt;
In some cases the simple method will work in a buggy way (keys pressed twice, key burst, laggy key, ... ).&lt;br /&gt;
If this is the case or you want deeper control over the configuration then use inputlirc.&lt;br /&gt;
Inputlirc is a small LIRC-compatible daemon that reads from /dev/input/eventX devices and sends the received keycodes to connecting LIRC clients.&lt;br /&gt;
&lt;br /&gt;
* It is important to disable lircd daemon from lirc package, On ubuntu launch the lirc reconfiguration process with :&lt;br /&gt;
&amp;lt;pre&amp;gt;dpkg-reconfigure lirc&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then choose twice none for receiver and transmitter.&lt;br /&gt;
&lt;br /&gt;
Make sure that lircd is not running. The START_LIRCD parameter should be now set to false in /etc/lirc/hardware.conf configuration file.&lt;br /&gt;
&lt;br /&gt;
* Install now inputlirc :&lt;br /&gt;
 sudo apt-get install inputlirc&lt;br /&gt;
&lt;br /&gt;
* Before proceeding we need to know the eventX number corresponding to our remote :&lt;br /&gt;
&amp;lt;pre&amp;gt;cat /proc/bus/input/devices&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For instance on my xtreamer ultra V1, the nuvoton receiver remote correspond to event4&lt;br /&gt;
&amp;lt;pre&amp;gt;cI: Bus=0019 Vendor=1050 Product=00c3 Version=0033&lt;br /&gt;
N: Name=&amp;quot;Nuvoton w836x7hg Infrared Remote Transceiver&amp;quot;&lt;br /&gt;
P: Phys=nuvoton/cir0&lt;br /&gt;
S: Sysfs=/devices/pnp0/00:09/rc/rc0/input4&lt;br /&gt;
U: Uniq=&lt;br /&gt;
H: Handlers=kbd event4&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* As the eventX number may sometimes varry upon reboot, one need to know a unique id value corresponding to our remote to further create a udev rule :&lt;br /&gt;
&amp;lt;pre&amp;gt;udevadm info -a -p $(udevadm info -q path -n /dev/input/event4)&amp;lt;/pre&amp;gt; &lt;br /&gt;
For the nuvoton, the ATTRS(id) will be used from the following output&lt;br /&gt;
&amp;lt;pre&amp;gt;looking at device &#039;/devices/pnp0/00:09/rc/rc0/input4/event4&#039;:&lt;br /&gt;
KERNEL==&amp;quot;event4&amp;quot;&lt;br /&gt;
SUBSYSTEM==&amp;quot;input&amp;quot;&lt;br /&gt;
DRIVER==&amp;quot;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
looking at parent device &#039;/devices/pnp0/00:09/rc/rc0/input4&#039;:&lt;br /&gt;
KERNELS==&amp;quot;input4&amp;quot;&lt;br /&gt;
SUBSYSTEMS==&amp;quot;input&amp;quot;&lt;br /&gt;
DRIVERS==&amp;quot;&amp;quot;&lt;br /&gt;
ATTRS{name}==&amp;quot;Nuvoton w836x7hg Infrared Remote Transceiver&amp;quot;&lt;br /&gt;
ATTRS{phys}==&amp;quot;nuvoton/cir0&amp;quot;&lt;br /&gt;
ATTRS{uniq}==&amp;quot;&amp;quot;&lt;br /&gt;
ATTRS{properties}==&amp;quot;0&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
looking at parent device &#039;/devices/pnp0/00:09/rc/rc0&#039;:&lt;br /&gt;
KERNELS==&amp;quot;rc0&amp;quot;&lt;br /&gt;
SUBSYSTEMS==&amp;quot;rc&amp;quot;&lt;br /&gt;
DRIVERS==&amp;quot;&amp;quot;&lt;br /&gt;
ATTRS{protocols}==&amp;quot;rc-5 nec [rc-6] jvc sony mce_kbd lirc&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
looking at parent device &#039;/devices/pnp0/00:09&#039;:&lt;br /&gt;
KERNELS==&amp;quot;00:09&amp;quot;&lt;br /&gt;
SUBSYSTEMS==&amp;quot;pnp&amp;quot;&lt;br /&gt;
DRIVERS==&amp;quot;nuvoton-cir&amp;quot;&lt;br /&gt;
ATTRS{options}==&amp;quot;&lt;br /&gt;
ATTRS{id}==&amp;quot;NTN0530&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
looking at parent device &#039;/devices/pnp0&#039;:&lt;br /&gt;
KERNELS==&amp;quot;pnp0&amp;quot;&lt;br /&gt;
SUBSYSTEMS==&amp;quot;&lt;br /&gt;
DRIVERS==&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* One can now create a permanent symbolic link to our eventX device by creating a custom udev rule :&lt;br /&gt;
&amp;lt;pre&amp;gt;echo &#039;KERNEL==&amp;quot;event*&amp;quot;,ATTRS{id}==&amp;quot;NTN0530&amp;quot;,SYMLINK=&amp;quot;input/myremote&amp;quot;&#039; &amp;gt; /etc/udev/rules.d/10-persistent-ir.rules&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Reload the udev configuration and trigger these changes :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/init.d/udev reload&lt;br /&gt;
udevadm trigger&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aternatively, reboot in order to apply the udev changes.&lt;br /&gt;
&lt;br /&gt;
There should now be a symbolic link in /dev/input/myremote&lt;br /&gt;
&lt;br /&gt;
* Configure inputlirc by editing /etc/default/inputlirc like this :&lt;br /&gt;
&amp;lt;pre&amp;gt;EVENTS=&amp;quot;/dev/input/myremote&amp;quot;&lt;br /&gt;
OPTIONS=&amp;quot;-g -m 0 -c&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Restart inputlirc&lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/init.d/inputlirc stop&lt;br /&gt;
/etc/init.d/inputlirc start&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Copy the LircMap configuration file into the personal directory&lt;br /&gt;
&amp;lt;pre&amp;gt;cp /usr/share/xbmc/system/Lircmap.xml ~/.xbmc/userdata/Lircmap.xml&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Edit the linux-input-layer remote section to add the remote link name, one should have something like this :&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;remote device=&amp;quot;linux-input-layer&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;altname&amp;gt;cx23885_remote&amp;lt;/altname&amp;gt;&lt;br /&gt;
&amp;lt;altname&amp;gt;devinput&amp;lt;/altname&amp;gt;&lt;br /&gt;
&amp;lt;altname&amp;gt;/dev/input/myremote&amp;lt;/altname&amp;gt;&lt;br /&gt;
   &amp;lt;left&amp;gt;KEY_LEFT&amp;lt;/left&amp;gt;&lt;br /&gt;
   ...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Launch xbmc and test the working remote&lt;br /&gt;
&lt;br /&gt;
Based on : [http://www.mobidyc.net/2012/09/xtreamer-ultra-ubuntu-12-04/]&lt;br /&gt;
&lt;br /&gt;
== Configure the remote buttons ==&lt;br /&gt;
=== Edit the driver table ===&lt;br /&gt;
&lt;br /&gt;
If you are using inputlirc or lircd with the &amp;lt;code&amp;gt;Linux input layer (/dev/input/eventX)&amp;lt;/code&amp;gt; value for the receiver parameter, you can tweak the driver keycode/scancode table with the ir-keytable command line tool.&lt;br /&gt;
In the following example one will make some changes on the driver table used by the nuvoton remote shipped with the Xtreamer Ultra V1. This example can be adapted to any remote.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By default, after using the inputlirc method on ubuntu 13.04, the subtitle, tilte and enter button are mapped like this for this remote on this HTPC :&lt;br /&gt;
&amp;lt;pre&amp;gt;subtitle =&amp;gt; KEY_TITLE&lt;br /&gt;
title =&amp;gt; no key code sent&lt;br /&gt;
enter =&amp;gt; no key code sent&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One will change the driver table to map those 3 buttons like this :&lt;br /&gt;
&amp;lt;pre&amp;gt;subtitle =&amp;gt; KEY_SUBTITLE&lt;br /&gt;
title =&amp;gt; KEY_TITLE&lt;br /&gt;
enter =&amp;gt; KEY_SELECT&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* First install the ir-keytable package&lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install ir-keytable&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Stop or kill any lirc daemon (inputlircd or lircd)&lt;br /&gt;
&amp;lt;pre&amp;gt;pkill lirc&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Launch ir-keytable in test mode for the remote and read the scancode sent by pressing the buttons :&lt;br /&gt;
&amp;lt;pre&amp;gt;ir-keytable  -t --device=/dev/input/myremote&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The output looks like this :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Testing events. Please, press CTRL-C to abort.&lt;br /&gt;
1378830829.479887: event MSC: scancode = 800f044d&lt;br /&gt;
1378830829.479887: event sync&lt;br /&gt;
1378830829.728814: event key up: KEY_TITLE (0x0171)&lt;br /&gt;
1378830829.728814: event sync&lt;br /&gt;
1378830833.290068: event MSC: scancode = 800f0451&lt;br /&gt;
...&lt;br /&gt;
1379288588.428518: event MSC: scancode = 800f0437&lt;br /&gt;
1379288588.428518: event sync&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By analyzing the ouput, one can determine the the button/scancode association :&lt;br /&gt;
&amp;lt;pre&amp;gt;subtitle =&amp;gt; 800f044d&lt;br /&gt;
title =&amp;gt; 800f0451&lt;br /&gt;
enter =&amp;gt;800f0437&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dump the driver table into /etc/lirc/myirtable.cfg&lt;br /&gt;
&amp;lt;pre&amp;gt;ir-keytable -r --device=/dev/input/myremote  &amp;gt; /etc/lirc/myirtable.cfg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Analyse the table file and grep the line corresponding to KEY_TITLE, KEY_SUBTITLE and KEY_SELECT&lt;br /&gt;
&amp;lt;pre&amp;gt;scancode 0x800f044d = KEY_TITLE (0x171)&lt;br /&gt;
scancode 0x800f045a = KEY_SUBTITLE (0x172)&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
As you can see, KEY_SELECT is not associated to any scancode, KEY_TITLE is associated to the subtitle button scancode and KEY_SUBTITLE is associate to a non existent scancode.&lt;br /&gt;
&lt;br /&gt;
* Before procedding, it is necessary to know the key hex value associated to KEY_SELECT&lt;br /&gt;
&lt;br /&gt;
Those are located in the kernel source code in include/uapi/linux/input.h file.&lt;br /&gt;
One can browse the source code here : [https://github.com/torvalds/linux/blob/master/include/uapi/linux/input.h]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#define KEY_SELECT		0x161&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Edit the table file dumped before to have this button key association :&lt;br /&gt;
&amp;lt;pre&amp;gt;subtitle =&amp;gt; 800f044d =&amp;gt; KEY_SUBTITLE (0x172)&lt;br /&gt;
title =&amp;gt; 800f0451 =&amp;gt; KEY_TITLE (0x171)&lt;br /&gt;
enter =&amp;gt;800f0437 =&amp;gt; KEY_SELECT (0x161)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
after modifying the KEY_TITLE,KEY_SUBTITLE lines and adding the KEY_SELECT line the edited part should look like this : &lt;br /&gt;
&amp;lt;pre&amp;gt;scancode 0x800f044d = KEY_SUBTITLE (0x172)&lt;br /&gt;
scancode 0x800f0451 = KEY_TITLE (0x171)&lt;br /&gt;
scancode 0x800f0437 = KEY_SELECT (0x161)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Make sure with your favorite tool that there isn&#039;t two lines with the same scancode fot those buttons in the file and save it.&lt;br /&gt;
&lt;br /&gt;
* Clear the driver table and update it with the table file :&lt;br /&gt;
&amp;lt;pre&amp;gt;ir-keytable -c --device=/dev/input/myremote&lt;br /&gt;
ir-keytable  --device=/dev/input/myremote --write=/etc/lirc/myirtable.cfg &lt;br /&gt;
Wrote 63 keycode(s) to driver&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* To make the changes persistent upon reboot add those 2 last command above to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
* One can now test if everything works correctly with ir-keytable test mode, then restart inputlirc or lircd and launch xbmc&lt;br /&gt;
&lt;br /&gt;
=== Edit LircMap.xml and Keyboard.xml ===&lt;br /&gt;
&lt;br /&gt;
First thing to do is to check the LircMap.xml located in ~/.xbmc/userdata/Lircmap.xml.&lt;br /&gt;
&lt;br /&gt;
One can acquire the button key values with the help of irw and then edit this file to better suits our needs.&lt;br /&gt;
This can even be mandatory sometimes. &lt;br /&gt;
&lt;br /&gt;
For instance some remotes will send KEY_NUMERIC_1 instead of KEY_1 for the numeric pad. It is then necessary to edit the file at the correponding remote section from &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;one&amp;gt;KEY_1&amp;lt;/one&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
to&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;one&amp;gt;KEY_NUMERIC_1&amp;lt;/one&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A complete guide is available here : [[Userdata/lircmap.xml]]&lt;br /&gt;
&lt;br /&gt;
For further tweaking it is necessary to edit the Keyboard.xml file.&lt;br /&gt;
A complete guide is available here : [[Keymap]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Remotes]]&lt;br /&gt;
[[Category:Manual]]&lt;/div&gt;</summary>
		<author><name>Fbacher</name></author>
	</entry>
	<entry>
		<id>https://kodi.wiki/index.php?title=Archive:HP_Pavilion_HDX_Remote&amp;diff=82686</id>
		<title>Archive:HP Pavilion HDX Remote</title>
		<link rel="alternate" type="text/html" href="https://kodi.wiki/index.php?title=Archive:HP_Pavilion_HDX_Remote&amp;diff=82686"/>
		<updated>2014-12-26T17:04:22Z</updated>

		<summary type="html">&lt;p&gt;Fbacher: /* HP Pavilion HDX Remote */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;section begin=&amp;quot;summary&amp;quot; /&amp;gt;&lt;br /&gt;
== HP Pavilion HDX Remote ==&lt;br /&gt;
[[File:HPPavilionHDXRemote.jpg|thumb]]&lt;br /&gt;
&lt;br /&gt;
This is a newer version of the HP remote. An important difference from the older HP remotes is that it has a unified Play/Pause button instead of separate Play and Pause buttons. Like the older remotes it uses the Microsoft eHome drive so the buttons can be configured by modifying the registry. The Play/Pause button is number 6E. To configure this to send a VK_MEDIA_PLAY_PAUSE multimedia keypress use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;6e,00,00,00,01,cd,00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is also a version of this newer HP remote with red / green / yellow / blue buttons as the top row of four. On that (and I assume the one pictured) the button numbers for the replay button (top-middle) and the TV button (top-right) are 80 and 39 respectively. Hope that helps&lt;br /&gt;
&lt;br /&gt;
If using this one or the newer HP remote such as:&lt;br /&gt;
&lt;br /&gt;
* RC2234302/01B&lt;br /&gt;
* 3139 228 54651&lt;br /&gt;
* HP PN: 464961-001&lt;br /&gt;
* HP SPS: 465541-001&lt;br /&gt;
* HP RMN: HSTNN-PR18&lt;br /&gt;
&lt;br /&gt;
in combination with OVU400102/71 HP usb IR receiver on a Ubuntu system, then the Play/Pause button will need a special code 0x00007b91 in the /usr/share/lirc/remotes/mceusb/lircd.conf.mceusb&lt;br /&gt;
&lt;br /&gt;
Note that the HP IR USB receiver OVU400102/71 uses a Fintek chipset. There have been various problems reported with using this device on XP. In some cases, it is recognized as an eHome device, but then does not send keys as an HID device, (however it worked with the EventGhost MCE Remote plugin). In other cases, it was not recognized as a Microsoft eHome device (a patch from HP may be required), but as a FinTek eHome device (after getting the (hacked) Fintek driver). The FinTek driver does not work on some XP configurations (cause unknown).&lt;br /&gt;
&lt;br /&gt;
HP IR Receiver TSGI-IR01 apparantly has several implementations. The TopSeed (vendor id 1784 Product 0006) implementation does NOT support USB3. Plug into a USB2 port, otherwise, you will get &#039;random&#039; data whenever a keys is pressed, or worse (hangs, etc.). Note that on some systems even the USB2 port will not work. This may be due to newer chipsets or firmware (z97, ASRock).&lt;br /&gt;
{{-}}&lt;br /&gt;
&amp;lt;section end=&amp;quot;summary&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remotes]]&lt;/div&gt;</summary>
		<author><name>Fbacher</name></author>
	</entry>
	<entry>
		<id>https://kodi.wiki/index.php?title=Archive:HP_MCE_Remote&amp;diff=82685</id>
		<title>Archive:HP MCE Remote</title>
		<link rel="alternate" type="text/html" href="https://kodi.wiki/index.php?title=Archive:HP_MCE_Remote&amp;diff=82685"/>
		<updated>2014-12-26T16:58:42Z</updated>

		<summary type="html">&lt;p&gt;Fbacher: /* HP MCE Remote */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;section begin=&amp;quot;summary&amp;quot; /&amp;gt;&lt;br /&gt;
== HP MCE Remote ==&lt;br /&gt;
[[File:HPRemotenewer.jpg{{!}}newer version|thumb]]&lt;br /&gt;
&lt;br /&gt;
[[File:hpremote.jpg|thumb|older version]]&lt;br /&gt;
Both versions are compatible with the Microsoft remote, and the .reg files used to reconfigure the MS remote will also work with the HP remote.&lt;br /&gt;
&lt;br /&gt;
With the Remote-XBMC.reg config all the buttons work in XBMC except for the &amp;quot;T&amp;quot; and &amp;quot;Print&amp;quot; buttons. To configure these buttons add the following to the .reg file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;  4E,00,00,00,04,01,22,\ ; Print button on HP remote - sends ctrl-5&lt;br /&gt;
  5A,00,00,00,04,01,23,\ ; T button on HP remote     - sends ctrl-6&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
&amp;lt;section end=&amp;quot;summary&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Remotes]]&lt;/div&gt;</summary>
		<author><name>Fbacher</name></author>
	</entry>
	<entry>
		<id>https://kodi.wiki/index.php?title=Archive:HP_Pavilion_HDX_Remote&amp;diff=67575</id>
		<title>Archive:HP Pavilion HDX Remote</title>
		<link rel="alternate" type="text/html" href="https://kodi.wiki/index.php?title=Archive:HP_Pavilion_HDX_Remote&amp;diff=67575"/>
		<updated>2014-01-08T01:23:59Z</updated>

		<summary type="html">&lt;p&gt;Fbacher: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Remote&lt;br /&gt;
|Name= HP Pavilion HDX Remote&lt;br /&gt;
|Image= HPPavilionHDXRemote.jpg&lt;br /&gt;
|Description= This is a newer version of the HP remote. An important difference from the older HP remotes is that it has a unified Play/Pause button instead of separate Play and Pause buttons. Like the older remotes it uses the Microsoft eHome drive so the buttons can be configured by modifying the registry. The Play/Pause button is number 6E. To configure this to send a VK_MEDIA_PLAY_PAUSE multimedia keypress use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;6e,00,00,00,01,cd,00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is also a version of this newer HP remote with red / green / yellow / blue buttons as the top row of four. On that (and I assume the one pictured) the button numbers for the replay button (top-middle) and the TV button (top-right) are 80 and 39 respectively. Hope that helps&lt;br /&gt;
&lt;br /&gt;
If using this one or the newer HP remote such as:&lt;br /&gt;
&lt;br /&gt;
* RC2234302/01B&lt;br /&gt;
* 3139 228 54651&lt;br /&gt;
* HP PN: 464961-001&lt;br /&gt;
* HP SPS: 465541-001&lt;br /&gt;
* HP RMN: HSTNN-PR18&lt;br /&gt;
&lt;br /&gt;
in combination with OVU400102/71 HP usb IR receiver on a Ubuntu system, then the Play/Pause button will need a special code 0x00007b91 in the /usr/share/lirc/remotes/mceusb/lircd.conf.mceusb&lt;br /&gt;
&lt;br /&gt;
Note that the HP IR USB receiver OVU400102/71 uses a Fintek chipset. There have been various problems reported with using this device on XP. In some cases, it is recognized as an eHome device, but then does not send keys as an HID device, (however it worked with the EventGhost MCE Remote plugin). In other cases, it was not recognized as a Microsoft eHome device (a patch from HP may be required), but as a FinTek eHome device (after getting the (hacked) Fintek driver). The FinTek driver does not work on some XP configurations (cause unknown).&lt;br /&gt;
&lt;br /&gt;
HP IR Receiver TSGI-IR01 apparantly has several implementations. The TopSeed (vendor id 1784 Product 0006) implementation does NOT support USB3. Plug into a USB2 port, otherwise, you will get &#039;random&#039; data whenever a keys is pressed, or worse (hangs, etc.).&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Fbacher</name></author>
	</entry>
</feed>