Addon.xml: Difference between revisions

From Official Kodi Wiki
Jump to navigation Jump to search
>Martijn
No edit summary
 
(170 intermediate revisions by 23 users not shown)
Line 1: Line 1:
{{DevsHeader|'''XBMC Add-on development'''}}<br />
{{Mininav|[[Development]]|[[Add-on development]]}}
{{frodo updated}}
<div class="noautonum toclimit-7" style="background: none; clear: right; float: right; margin-bottom: 0.5em; padding: 0.5em 0 0.8em 1.4em; width: auto;">__TOC__</div>
=Introduction=


Each skin or script/plugin in XBMC contains the addon.xml file which sets up an overview of the addon and provides credits, versioning information and dependencies.
Every skin, script, or plugin in Kodi contains an <code>addon.xml</code> file which describes the add-on, providing credits, version information and dependencies. Below, we will explain how this file is structured and which elements must be used to create an add-on for Kodi. You can also consult the examples at the end to see how this file is laid out depending on if you are developing a skin or script.
Below we will explain which elements must be used to create an addon to be used in XBMC. At the end we will show you two different layouts to be used depending if you are developing a skin or script/addon.


Every <samp>addon.xml</samp> file has the same basic structure, this example is for a video plugin:
<syntaxhighlight lang="xml">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.addon.id" name="Your Add-on" version="1.2.3" provider-name="You">
  <requires>
    <import addon="xbmc.python" version="2.25.0" />
  </requires>
  <extension point="xbmc.python.pluginsource" library="addon.py">
    <provides>video</provides>
  </extension>
  <extension point="xbmc.addon.metadata">
    <summary lang="en_GB">Your add-on's summary</summary>
    <description lang="en_GB">Your add-on's description</description>
    <disclaimer lang="en_GB"></disclaimer>
    <language>en</language> <!-- language of the content the add-on provides, omit if the add-on does not provide any content -->
    <platform>all</platform>
    <license>GPL-2.0-or-later</license>
    <forum>https://forum.kodi.tv/showthread.php?tid=xxxx</forum> <!-- may be omitted -->
    <website>http://myplugin.com</website> <!-- URL of the website that supplies the content, or the website for your plugin; may be omitted. -->
    <email>[email protected]</email> <!-- may be omitted -->
    <source>http://github.com/you/plugin.addon.id</source>
    <news>v1.2.3 (01/02/2013)
      [new] some new feature
      [fix] some fix
    </news>
    <assets>
        <icon>resources/icon.png</icon>
        <fanart>resources/fanart.jpg</fanart>
        <banner></banner> <!-- optional -->
        <clearlogo>resources/clearlogo.png</clearlogo> <!-- optional -->
        <screenshot></screenshot> <!-- optional, max. 10 -->
    </assets>
  </extension>
</addon>
</syntaxhighlight>


There are a few important things to note in the above sample:
* The <syntaxhighlight lang="xml" inline><addon></syntaxhighlight> element must be present, and be the root node. It presents data about the add-on package as a whole. Inside it should be:
** A <syntaxhighlight lang="xml" inline><requires></syntaxhighlight> element, listing all the dependencies that this add-on needs in order to function inside individual <syntaxhighlight lang="xml" inline><import></syntaxhighlight> elements for each one.
** One or more <syntaxhighlight lang="xml" inline><extension></syntaxhighlight> elements, each of which describes a part of Kodi that the add-on extends.
*** Finally, there is a specific extension element, <syntaxhighlight lang="xml" inline><extension point="xbmc.addon.metadata"></syntaxhighlight> that describes the add-on to the user.
**** Image assets such as icons, a banner and screenshots declared inside their own named elements inside of an <syntaxhighlight lang="xml" inline><assets></syntaxhighlight> tag (exclusive to Kodi v18+)


== Core elements ==
=== <addon> ===
The <syntaxhighlight lang="xml" inline><addon></syntaxhighlight> element has 4 attributes, and they are all required: <code>id</code>, <code>version</code>, <code>name</code>, and <code>provider-name</code>.


=Overview of the addon.xml items=
''Example'': <syntaxhighlight lang="xml" inline><addon id="script.hello.world" name="Hello World" version="0.0.1" provider-name="Dev1, Dev2"></syntaxhighlight>
There are a few things to notice:
* The <addon> element must be present, and is used to present the data about the addon package as a whole.
* Inside the <addon> element is a <requires> element, listing the requirements that this addon needs in order to function.
* Then there is one or more <extension> elements, each of which describes which part of XBMC the addon extends.
* Finally, there is a specific <extension> element which describes the addon for the user.


==Mandatory==
==== id attribute ====
The id attribute is the unique identifier used for this add-on.  It must be unique, and must use only lowercase characters, periods, underscores, dashes and numbers.  This identifier is also used as the name of the folder that contains the add-on, so for ease of searching, we suggest you use something like <code><var>type</var>.<var>uniquename</var></code>.
===The <addon> element===


The addon element has 4 attributes: id, version, name, and provider-name.
==== version attribute ====
* The id attribute is the unique identifier used for this add-on.  It must be unique, and must use only lowercase characters, periods, underscores, dashes and numbers.  This identifier is also used as the name of the folder that contains the add-on, so for ease of searching, we suggest you use something like <type>.<uniquename>.
The version attribute is used by Kodi to determine whether updates are available. This should be use a version scheme like <code>x.y.z</code> (major.minor.patch). For example: <code>version="0.0.1"</code>. Generally, you'll start with a version of <code>0.y.z</code> for test releases and once you feel it is ready for a full release, you'd bump the version to <code>1.0.0</code>.
* The version attribute is used by XBMC to determine whether updates are available. This should be following the  x.y.z version numbering for example: '''version="0.0.1"''' Most commenly you start with a '''0.y.z''' for testing purpose and once you feel it is ready you go to '''version="1.0.0"'''
* The name attribute is the name of the add-on as it appears in the UI. This should be in English where it makes sense for it to be so, and is not translatable.
* The provider-name attribute is used as the author field.  This could be a team of authors or a single author.
*If it's maintained by multiple people please separate them by using a pipe sign  |


Example:
===== How versioning works =====
<source lang="xml">
* <code>2.2.9</code> is newer than <code>2.2.1</code>
    <addon id="script.hello.world" name="Hello World" version="0.0.1" provider-name="Dev1|Dev2">
* <code>2.2.10</code> is newer than <code>2.2.1</code>
</source>
* <code>2.3.0</code> is newer than <code>2.2.9</code>
* <code>2.2.1</code> is newer than <code>2.2.1~alpha</code>
* <code>2.2.1</code> is newer than <code>2.2.1~beta</code>
* <code>2.2.1~beta</code> is newer than <code>2.2.1~alpha</code>
* <code>2.2.1~beta3</code> is newer than <code>2.2.1~beta2</code>
* <code>2.2.1~beta10</code> is newer than <code>2.2.1~beta1</code>


{{Tip|Text should only be added for a beta version. In other cases version number should only contain numbers.}}


'''How versioning works:'''
==== name attribute ====
*2.2.1 is newer than 2.2.9
The name attribute is the name of the add-on as it appears in the UI. This should be in English where it makes sense for it to be so, and is not translatable.
*2.3 is newer than 2.2.9
*2.3.0 is newer than 2.2
*2.2.1 is older than 2.2.1b    << only one character = newer version
*2.2.1 is newer than 2.2.1bc    << two or more = older version
*2.2.1 is newer than 2.2.1 beta
*2.2.1 is newer than 2.2.1beta</source>


===The <requires> element===
==== provider-name attribute ====
The provider-name attribute is used as the author field.  This could be a team of authors or a single author. If the add-on is maintained by multiple people please separate them with a comma (<code>,</code>).


The requires element contains one or more <import> elements which specify which other add-ons this particular add-on requires, and which version of those add-ons it requires. These add-ons may be part of XBMC itself, or may be parts of other 3rd party add-ons.
=== <requires> ===
The <syntaxhighlight lang="xml" inline><requires></syntaxhighlight> element contains one or more <syntaxhighlight lang="xml" inline><import></syntaxhighlight> elements which specify which other add-ons this particular add-on requires, and which version of those add-ons it requires. These add-ons may be part of Kodi itself, or may be parts of other third-party add-ons.


XBMC will only allow the add-on to be run if suitable versions of the non-optional add-ons on which this add-on depends are installed. When a user installs your add-on from an online repository via XBMC's add-on manager, XBMC attempts to resolve these dependencies, and install anything that your add-on relies on first. The dependency must be provided with the minimum version number your script/skin requires.
Kodi will only allow the add-on to be run if suitable versions of the (non-optional) add-ons on which this add-on depends are installed. When a user installs your add-on from an online repository via Kodi's add-on manager, Kodi attempts to resolve these dependencies, and install anything that your add-on relies on first. The dependency must be provided with the minimum version number your script/skin requires.


The requirement may be made optional by setting the optional attribute to true. This will only install the dependency when the depending addon actually needs it. If this dependency is missing the depending addon will still be able to be installed.
''Examples'':
Here is a sample <syntaxhighlight lang="xml" inline><requires></syntaxhighlight> block that imports two required modules:
<syntaxhighlight lang="xml">
<requires>
  <import addon="xbmc.python"              version="2.25.0" />
  <import addon="script.module.elementtree" version="1.2.7" />
</requires>
</syntaxhighlight>


If your module relies on third party modules, they must be installed prior to installing your
Here's another example, which will only install on LibreELEC. This occurs because the addon will depend on an addon that only exists in LibreELEC. Hence, Kodi will refuse to install the addon in other platforms due to unmet dependencies:
module, by the user. Assuming the third party module is available on an existing repository,
<syntaxhighlight lang="xml">
XBMC will install this automatically when the user installs your addon. Libraries outside of the
<requires>
xbmc domain must be loaded by your code and do not form part of the <requires> statement as
  <import addon="os.librelec.tv" version="2.0" />
XBMC doesn't know what to do with them.
</requires>
</syntaxhighlight>
 
==== <import> ====
Each <syntaxhighlight lang="xml" inline><import></syntaxhighlight> element describes one dependency for an add-on, with two required attributes: <code>addon</code> and <code>version</code>. There is also an optional attribute called, fittingly, <code>optional</code>.


* Example of <requires> element:
If your add-on relies on other third-party add-ons, Kodi will automatically install them as well, provided they are available on an existing add-on repository. If they aren't available on any existing repository, the user must install the other add-ons themselves. Note that you need to include any Python libraries you need directly in your add-on; these can't be loaded with an <syntaxhighlight lang="xml" inline><import></syntaxhighlight> element, since Kodi wouldn't know what to do with them.
<source lang="xml">
    <requires>
      <import addon="xbmc.python"                version="2.1.0"/>
      <import addon="script.module.elementtree"  version="1.2.7"/>
      <import addon="script.module.simplejson"    version="2.0.10" optional="true"/>
    </requires>
</source>


* For example this will only install on OPENELEC:
===== addon attribute =====
<source lang="xml">
The <code>addon</code> attribute specifies the id of the required add-on, e.g. <code>script.module.elementtree</code>.
    </requires>
        <import addon="os.openelec.tv" version="2.0" optional="false"/>
    </requires>
</source>


* Example of an optional <requires> element:
===== version attribute =====
<source lang="xml">
The <code>version</code> attribute specifies the minimum version of the required add-on to be installed.
    <import addon="script.module.simplejson"    version="2.0.10" optional="true"/>
</source>


Each different XBMC version might require you to use a higher version of the xbmc.* addon dependencies to control on which version of XBMC the addon can be installed.
====== Dependency versions ======
Each different Kodi version might require you to use a higher version of the <code>xbmc.*</code> add-on dependencies to control on which version of Kodi the add-on can be installed.
{| role="presentation" class="wikitable" style="border: 1px solid #000; border-collapse: collapse;"
|+ Current versions
! scope="col" | Kodi version
! scope="col" | xbmc.python
! scope="col" | xbmc.gui
! scope="col" | xbmc.json
! scope="col" | xbmc.metadata
! scope="col" | xbmc.addon
|-
! scope="row" | [[Archive:Dharma Guide|Dharma 10.1]] {{Red|Deprecated}}
| 1.0 || 2.11 || 2.0|| 1.0 || 0.1
|-
! scope="row" | [[Archive:Eden API changes|Eden 11.0]] {{Red|Deprecated}}
| 2.0 || 3.0 || 4.0 || 1.0 || 11.0
|-
! scope="row" | [[Frodo|Frodo 12.x]] {{Red|Deprecated}}
| 2.1.0 || 4.0.0 || 6.0.0 || 2.1.0 || 12.0.0
|-
! scope="row" | [[Archive:Gotham API changes|Gotham 13.x]]
| 2.14.0 (ABI 2.1.0) || 5.0.1 || 6.6.0 (ABI 6.0.0) || 2.1.0 (ABI 1.0) || 13.0.0 (ABI 12.0.0)
|-
! scope="row" | [[Archive:Helix|Helix 14.x]]
| 2.19.0 (ABI 2.1.0) || 5.3.0 || 6.20.0 (ABI 6.0.0) || 2.1.0 (ABI 1.0) || 14.0.0 (ABI 12.0.0)
|-
! scope="row" | [[Archive:Isengard|Isengard 15.x]]
| 2.20.0 (ABI 2.1.0) || 5.9.0 (ABI 5.3.0) || 6.25.1 (ABI 6.0.0) || 2.1.0 (ABI 1.0) || 15.0.0 (ABI 12.0.0)
|-
! scope="row" | [[Archive:Jarvis|Jarvis 16.x]]
| 2.24.0 (ABI 2.1.0) || 5.10.0 || 6.32.4 (ABI 6.0.0) || 2.1.0 (ABI 1.0) || 16.0.0 (ABI 12.0.0)
|-
! scope="row" | [[Archive:Krypton|Krypton 17.x]]
| 2.25.0 (ABI 2.1.0) || 5.12.0 || 7.0.0 (ABI 6.0.0) || 2.1.0 (ABI 1.0) || 17.0.0 (ABI 12.0.0)
|-
! scope="row" | [[Leia|Leia 18.x]]
| 2.26.0 (ABI 2.1.0) || 5.14.0 || 9.7.2 (ABI 6.0.0) || 2.1.0 (ABI 1.0) || 17.9.910 (ABI 12.0.0)
|-
! scope="row" | [[Matrix|Matrix 19.x]]
| 3.0.0 (ABI 3.0.0) || 5.15.0 (ABI 5.14.0) || 11.2.0 (ABI 6.0.0) || 2.1.0 (ABI 1.0) || 19.1.0 (ABI 12.0.0)
|-
! scope="row" | [[Nexus|Nexus 20.x]]
| 3.0.1 (ABI 3.0.0) || 5.16.0 (ABI 5.15.0) || 13.0.0 (ABI 6.0.0) || 2.1.0 (ABI 1.0) || 20.90.101 (ABI 12.0.0)
|}


{| class="wikitable" border="1"
Each Kodi version contain a certain backwards compatibility. For example add-ons made for Gotham 13.x can still work on Leia 18.x. Same happens for Matrix and Nexus addons. Do note that this might change in the future. The '''ABI''' version you see in the table above is the backwards compatibility version for which add-ons are still marked "working".
|+ Current versions
! XBMC version !! xbmc.python !! xbmc.gui !! xbmc.json !! xbmc.metadata !! xbmc.addon
|-
| Dharma 10.1 <font color="red">Deprecated</font>|| 1.0 || 2.11 || 2.0|| 1.0 || 0.1
|-
| Eden 11.0 || 2.0 || 3.0 || 4.0 || 1.0 || 11.0
|-
| Frodo 12.0 || 2.1.0 || 4.0.0 || 6.0.0 || 2.0.0 || 12.0.0
|-
| Gotham 13.0 || 2.1.0 || 4.0.0 || 6.0.0 || 2.0.0 || 12.0.0|}


===The <extension> elements===
===== optional attribute =====
The dependency may be made optional by setting the <code>optional</code> attribute to <code>true</code>. This will only install the dependency when the add-on actually needs it. Even if this dependency is missing, the add-on can still be installed.


The extension element describes the technical aspects of this add-on. It will have at least a point attribute which will give the part of XBMC that the add-on extends. For instance, the addon.xml file for the Confluence skin extends the "xbmc.gui.skin" part of XBMC. All available extension points are given below.
=== <extension> ===
The <syntaxhighlight lang="xml" inline><extension></syntaxhighlight> element describes the technical aspects of this add-on. It will have at least a point attribute which will give the part of Kodi that the add-on extends. For instance, the <code>addon.xml</code> file for the Confluence skin extends the <code>xbmc.gui.skin</code> part of xbmc. All available extension points are given below.


The various extension points that XBMC provides are given in the list below.
==== point attribute ====
{| class="datatable"
The various extension points that Kodi provides are given in the list below.
|- align=left
{| role="presentation" class="wikitable"
! Extension point !! Addon Category
! scope="col" | Extension point
|-
! scope="col" | Type declaration
| [[Add-ons_for_XBMC_(Development)#addon.xml|xbmc.gui.skin]] || Skin
|-
|-
! scope="row" | <code>kodi.resource.font</code>
| xbmc.gui.webinterface || Web interface
| [[Fonts|Additional fonts]]
|-
|-
| [[Add-ons_for_XBMC_(Developement)#Repository_Add-on|xbmc.addon.repository]] || <None>
! scope="row" | <code>kodi.resource.images</code>
|-
| Additional image files
| [[HOW-TO:_Automatically_start_addons_using_services|xbmc.service]] || Services
|-
|-
! scope="row" | <code>kodi.resource.language</code>
| xbmc.metadata.scraper.albums || Album information
| [[Language support|Additional languages]]
|-
|-
| xbmc.metadata.scraper.artists || Artist information
! scope="row" | <code>kodi.resource.uisounds</code>
|-
| [[UI sounds add-ons|Additional UI event sounds]]
| xbmc.metadata.scraper.movies || Movie information
|-
|-
! scope="row" | <code>[[:Category:Music add-ons|xbmc.addon.audio]]</code>
| xbmc.metadata.scraper.musicvideos || Music video information
| [[:Category:Music add-ons|Music add-ons]] <small>(audio)</small>
|-
|-
| xbmc.metadata.scraper.tvshows || TV information
! scope="row" | <code>[[:Category:Picture add-ons|xbmc.addon.image]]</code>
|-
| [[:Category:Picture add-ons|Picture add-ons]] <small>(images)</small>
| xbmc.metadata.scraper.library || <None>
|-
|-
! scope="row" | <code>[[Add-on repositories|xbmc.addon.repository]]</code>
| xbmc.ui.screensaver || Screensaver
| [[Unofficial repositories]]
|-
|-
| xbmc.player.musicviz || Visualization
! scope="row" | <code>[[:Category:Video add-ons|xbmc.addon.video]]</code>
|-
| [[:Category:Video add-ons|Video add-ons]] <small>(video)</small>
| [[Plugin_Sources#What_XBMC_requires_for_your_add-on|xbmc.python.pluginsource]] || Music Add-ons (audio) / Picture Add-ons (image) / Program Add-ons (executable) / Video Add-ons (video)
|-
|-
! scope="row" | <code>[[Skinning|xbmc.gui.skin]]</code>
| [[Script_Sources#What_XBMC_requires_for_your_add-on|xbmc.python.script]] || Music Add-ons (audio) / Picture Add-ons (image) / Program Add-ons (executable) / Video Add-ons (video)
| [[Skins]]
|-
|-
| xbmc.python.weather || Weather
! scope="row" | <code>[[:Category:Album scraper add-ons|xbmc.metadata.scraper.albums]]</code>
|-
| [[Scraping Music#Albums|Album information]]
| [[Script_Subtitles#What_XBMC_requires_for_your_add-on|xbmc.python.subtitles]] || Subtitles
|-
|-
! scope="row" | <code>[[:Category:Artist scraper add-ons|xbmc.metadata.scraper.artists]]</code>
| [[Script_Lyrics#What_XBMC_requires_for_your_add-on|xbmc.python.lyrics]] || Lyrics
| [[Scraping Music#Artists|Artist information]]
|-
|-
| [[Script_Library#What_XBMC_requires_for_your_add-on|xbmc.python.library]] || <None>
! scope="row" | <code>[[:Category:Scraper|xbmc.metadata.scraper.library]]</code>
|-
| [[Scrapers]]
| xbmc.python.module || <None>
|-
|-
! scope="row" | <code>[[:Category:Movie scraper add-ons|xbmc.metadata.scraper.movies]]</code>
| xbmc.addon.video || <None>
| Movie information
|-
|-
| xbmc.addon.audio || <None>
! scope="row" | <code>[[:Category:Music video scraper add-ons|xbmc.metadata.scraper.musicvideos]]</code>
|-
| [[Music videos|Music video information]]
| xbmc.addon.image || <None>
|-
! scope="row" | <code>[[:Category:TV scraper add-ons|xbmc.metadata.scraper.tvshows]]</code>
| [[TV Shows|TV show information]]
|-
! scope="row" | <code>[[:Category:Music visualization add-ons|xbmc.player.musicviz]]</code>
| Music visualization
|-
! scope="row" | <code>[[:Category:Add-on libraries/modules|xbmc.python.library]]</code>
| [[Python libraries]] {{Note|These don't show up in the add-on browser and are purely to satisfy dependencies.}}
|-
! scope="row" | <code>[[:Category:Lyrics add-ons|xbmc.python.lyrics]]</code>
| [[Script lyrics|Lyrics]]
|-
! scope="row" | <code>[[:Category:Add-on libraries/modules|xbmc.python.module]]</code>
| [[Python development|Additional python library]], mainly for use by script.module add-ons.
|-
! scope="row" | <code>[[Plugin sources|xbmc.python.pluginsource]]</code>
| rowspan="2" | [[:Category:Music add-ons|Music add-ons]] <small>(audio)</small> / [[:Category:Picture add-ons|Picture add-ons]] <small>(images)</small> / [[:Category:Program add-ons|Program add-ons]] <small>(executables)</small> / [[:Category:Video add-ons|Video add-ons]] <small>(video)</small>
|-
! scope="row" | <code>[[Script sources|xbmc.python.script]]</code>
|-
! scope="row" | <code>[[Weather addons|xbmc.python.weather]]</code>
| [[Weather]]
|-
! scope="row" | <code>[[Service add-ons|xbmc.service]]</code>
| [[Service add-ons|Services]]
|-
! scope="row" | <code>[[:Category:Subtitle add-ons|xbmc.subtitle.module]]</code>
| [[Subtitles|Subtitle source]]
|-
! scope="row" | <code>[[:Category:Screensaver add-ons|xbmc.ui.screensaver]]</code>
| [[HOW-TO:Screensaver addon|Screensaver]]
|-
! scope="row" | <code>[[Web interface|xbmc.webinterface]]</code>
| [[Web interface]]
|}
|}
Add-ons that don't correspond to a specific add-on category can not be installed by users. These are usually supporting or shared add-ons that are installed automatically by the add-ons that require them.
Add-ons that don't correspond to a specific add-on category can not be installed by users. These are usually supporting or shared add-ons that are installed automatically by the add-ons that require them.


====xbmc.python.pluginsource====
===== xbmc.python.pluginsource =====
{{See also|Plugin sources}}
The most common extension point that will be used by plugin addon developers is <code>xbmc.python.pluginsource</code>.


The most common extension point that will be used by plugin addon developers is
====== library attribute ======
"xbmc.python.pluginsource" .
The <syntaxhighlight lang="xml" inline><extension point="xbmc.python.pluginsource"></syntaxhighlight> element has an extra attribute: <code>library</code>. This is the name of the Python script (startup script) that will be run when the add-on is activated. This file must exist in the root of your add-on directory.


The <extension point="xbmc.python.pluginsource"> tag has an extra attribute "library". This is the name of the python script (startup script) that will be run when the plugin is activated. This file must exist in the root of your addon directory.
====== <provides> element ======
The extension has an addition sub element <provides> and is a whitespace separated list of image, video, audio, executable. This
The extension has an additional child element named <syntaxhighlight lang="xml" inline><provides></syntaxhighlight>, which contains a whitespace separated list of <code>audio</code>, <code>executable</code>, <code>image</code> and/or <code>video</code>. This determines in what area (or context) of the Kodi system your addon will make itself visible in (please note that this applies only to <kbd>pluginsource</kbd> extension points):
determines in what area (or context) of the XBMC system your addon will make itself visible in.
{| role="presentation" class="wikitable" style="padding: 0.5em 1em;"
:* image => Pictures
! scope="col" | Provides
:* video => Video
! scope="col" | Appears in
:* audio => Music
|-
:* executable => Programs
| <code>image</code>
:* <blank> => No visible presence
| Pictures
|-
| <code>audio</code>
| Music
|-
| <code>video</code>
| Video
|-
| <code>executable</code>
| Programs
|-
| ''(blank)''
| See Note below
|}
{{Note|If the <syntaxhighlight lang="xml" inline><provides></syntaxhighlight> element is not defined, behavior will depend on the structure of your add-on. If it has a single extension point (e.g. a single '''<code>xbmc.python.script</code>''' or '''<code>xbmc.python.pluginsource</code>'''), {{Kodi}} will default to <code>executable</code> (thus your add-on will be shown in Programs). If your add-on has multiple extension points and none specifies a <syntaxhighlight lang="xml" inline><provides></syntaxhighlight> element, different entries for your add-on will be shown in "Programs" (multiple fallbacks to "executable"). If your add-on has multiple extension points and only one (or some) define the <syntaxhighlight lang="xml" inline><provides></syntaxhighlight> tag it really depends on the order of the extension points. If the first extension point (your add-on's '''main extension point''') defines the <syntaxhighlight lang="xml" inline><provides></syntaxhighlight> element, {{Kodi}} will assume all the other (empty) extension points provide the same content. Otherwise, it will set the content for all the extension points that specify the <syntaxhighlight lang="xml" inline><provides></syntaxhighlight> tag and fallback all the others to "executable". '''At the moment, there is no way to hide an add-on from the interface.'''|Reminder}}


Example:
''Example'':
<source lang="xml">
<syntaxhighlight lang="xml">
    <extension point="xbmc.python.pluginsource" library="gpodderxbmc.py">
<extension point="xbmc.python.pluginsource" library="gpodderxbmc.py">
        <provides>audio video</provides>
  <provides>audio video</provides>
    </extension>
</extension>
</source>
</syntaxhighlight>


More info on [[Plugin_Sources]]
===== xbmc.addon.metadata =====
This special extension point ''must'' be provided by all add-ons, and is the way that your add-on is described to users of the Kodi add-on manager. There are several elements that this should contain. Most of these elements are required (except the deprecated tag). However, in case the elements do not apply (e.g. language, website, email) they can be omitted from the addon.xml file.


===The xbmc.addon.metadata extension===
====== Localization ======
Language specific elements must always be present in English as a minimum. Many of these elements can be translated into multiple languages and should be added once for each supported language. The <code>lang</code> attribute should contain a [[wikipedia:Locale (computer software)|locale identifier]]. If omitted, it defaults to en_GB.
{{Note|Kodi v14 and older uses ISO-639 code. See [[List of language codes (ISO-639:1988)]]}}


This special extension point must be provided by all add-ons, and is the way that your add-on is described to users of the XBMC add-on manager.
====== <summary> ======
One or more <syntaxhighlight lang="xml" inline><summary></syntaxhighlight> elements provide a short summary of what the add-on does. This should be a single sentence. It may be translated into multiple languages.


====Required information====
''Example'': <syntaxhighlight lang="xml" inline><summary lang="en_GB">Hello World script provides some basic examples on how to create your first script.</summary></syntaxhighlight>


There are several elements that this should contain and all are compulsory (except the broken tag). Each of the elements below must always be present in English as a minmum.:
====== <description> ======
* One or more summary elements provide a short summary of what the add-on does. This should be a single sentence. It may be translated into multiple languages, whereby each has a lang="ch" attribute. No lang attribute indicates English but is recommended.
One or more <syntaxhighlight lang="xml" inline><description></syntaxhighlight> elements provide a more detailed summary of what the add-on does. It may be translated into multiple languages.
<source lang="xml">
<summary lang="en">Hello World script provides some basic examples on how to create your first script.</summary>
</source>


''Example'':
<syntaxhighlight lang="xml">
<description lang="en_GB">Hello World script provides some basic examples on how to create your first script and hopefully will increase the number of Kodi users to start creating their own addons.</description>
</syntaxhighlight>


* One or more description elements provide a more detailed summary of what the add-on does.  Again, these can be translated.
====== <disclaimer> ======
<source lang="xml">
One or more <syntaxhighlight lang="xml" inline><disclaimer></syntaxhighlight> elements that indicate what (if any) things the user should know about the add-on. There is no need to have a disclaimer if you don't want one, though if something requires settings, or only works in a particular country then you may want to state this here. It may be translated into multiple languages.
<description lang="en">Hello World script provides some basic examples on how to create your first script
and hopefully will increase the number of XBMC users to start creating their own addons.</description>
</source>


''Example'': <syntaxhighlight lang="xml" inline><disclaimer lang="en_GB">Feel free to use this script. For information visit the wiki.</disclaimer></syntaxhighlight>


* One or more disclaimer elements that indicate what (if any) things the user should know about the add-on.  There is no need to have a disclaimer if you don't want one, though if something requires settings, or only works in a particular country then you may want to state this here.
====== <news> ======
<source lang="xml">
{{Note|Used in Kodi v17 Krypton and later only. Older versions are forward compatible.}}
<disclaimer lang="en">Feel free to use this script. For information visit the wiki.</disclaimer>
</source>


The <syntaxhighlight lang="xml" inline><news></syntaxhighlight> element should contains a simple description of the major changes made to the add-on (new functionality, big fixes, etc). This is displayed in the Kodi addon installation/update system. (In the author's opinion, too many add-ons skip this piece of information, making it difficult for users to determine whether a particular problem that they may have been having has been fixed or not.)
Please keep it short (it's limited to 1500 characters); you might want to only include the changes for the last version here.


* One or more license elements that indicate what license is used for this add-on.
Here is an example:
<source lang="xml">
<syntaxhighlight lang="xml">
<license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license>
<news>v0.1.2 (2014-01-15)
</source>
- Added notification for Ubuntu users checking through apt command</news>
</syntaxhighlight>


====== <platform> ======
The <syntaxhighlight lang="xml" inline><platform></syntaxhighlight> tag specifies which platforms (operating systems, hardware, architecture) this add-on runs on. Many add-ons will run on all platforms, so <code>all</code> is an option. If the platform tag is missing, we assume the add-on runs on all platforms. A space-delimited combination of these is also possible. Currently available options are:
* <code>all</code>
* <code>linux</code>
* <code>osx</code>
* <code>osx64</code>
* <code>osx-x86_64</code>
* <code>osx32</code>
* <code>osx-i686</code>
* <code>ios</code>
* <code>ios-armv7</code>
* <code>ios-aarch64</code>
* <code>windx</code>
* <code>windows</code>
* <code>windows-i686</code>
* <code>windows-x86_64</code>
* <code>windowsstore</code>
* <code>android</code>
* <code>android-armv7</code>
* <code>android-aarch64</code>
* <code>android-i686</code>


* A platform tag which specifies which platforms (operating systems, hardware) this add-on runs on. Many add-ons will run on all platforms, so "all" is an option. If the platform tag is missing, we assume the add-on runs on all platforms. A combination of these is also possible. Currently available options are:
{{Note|Kodi v19 Matrix and later.}}
::*all
::*linux
::*osx
::*osx64
::*osx32
::*ios
::*windx
::*wingl
::*android


<source lang="xml">
* <code>tvos</code>
<platform>all</platform>
* <code>tvos-aarch64</code>
</source>


''Example'': <syntaxhighlight lang="xml" inline><platform>linux osx-x86_64 windows-x86_64</platform></syntaxhighlight>


* Language tag(s). These are the language(s) of the *content* provided by your add-on. it applies to plugins, scripts, scrapers etc. This allows browsing the add-on list by language. When there is no specific language provided in your content leave it blank.
====== <language> ======
[[List_of_language_codes_(ISO-639:1988)]]
The <syntaxhighlight lang="xml" inline><language></syntaxhighlight> elements indicate the language(s) of the ''content'' provided by your add-on. It applies to plugins, scripts, scrapers, etc. This allows browsing the add-on list by language. When there is no specific language provided in your content, omit it from the addon.xml.
<source lang="xml">
    <language>en de fr</language>
    or
    <language></language>
    or
    <language/>
</source>


''Example'': <syntaxhighlight lang="xml" inline><language>en de fr</language></syntaxhighlight>


* Broken tag. This will mark the add-on as broken in the XBMC repo with providing the reason why. You don't need to do a version bump for this to work.
====== <license> ======
<source lang="xml">
The <syntaxhighlight lang="xml" inline><license></syntaxhighlight> element indicates what license is used for this add-on. In general, the [https://spdx.dev/ids/ SPDX License Expression] for the license(s) are preferable to the full license name:
    <broken>deprecated</broken>
</source>


====Optional information====
''Examples'':<br />
SPDX License Expression: <syntaxhighlight lang="xml" inline><license>GPL-2.0-or-later</license></syntaxhighlight>
<br />vs<br />
Full license name: <syntaxhighlight lang="xml" inline><license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license></syntaxhighlight>


These tags will be used to provide easy navigation on our upcoming add-on front-end where you can browse through available add-ons and directly visit the forum thread, source code or contact the add-on author.
If your add-on includes multiple licenses:
* Separate license names using <code>|</code> (the pipe or vertical bar character) when there is a choice between licenses:
** <syntaxhighlight lang="xml" inline><license>GPL-2.0-or-later | LGPL-2.0-or-later</license></syntaxhighlight>
* Separate license names using <code>&</code> (ampersand), or <code>,</code> (comma), when multiple licenses exist that cover different parts of the source.
** <syntaxhighlight lang="xml" inline><license>GPL-2.0-or-later & MIT</license></syntaxhighlight>
** <syntaxhighlight lang="xml" inline><license>GPL-2.0-or-later, MIT</license></syntaxhighlight>


* Forum tag. This this provide the forum thread URL for this specific add-on.
====== <forum> ======
<source lang="xml">
The <syntaxhighlight lang="xml" inline><forum></syntaxhighlight> element provides the forum thread URL for this specific add-on. Omit this element if there is no forum thread.
    <forum>put URL here</forum>
</source>


* Website tag. This provides the website URL for this specific add-on.
''Example'': <syntaxhighlight lang="xml" inline><forum>http://www.myaddonwebsite.com/forum.php?thread=12345</forum></syntaxhighlight>
<source lang="xml">
    <website>put URL here</website>
</source>


* Source tag. This provides the source code location URL for this specific add-on.
====== <website> ======
<pre>
The <syntaxhighlight lang="xml" inline><website></syntaxhighlight> element provides the website URL for this specific add-on.
    <source>put URL here</source>
</pre>


* E-mail tag. This provides the e-mail adress of the author if he wishes to do so for this specific add-on. Her's two examples of how you can make it look (the second one it harder for spambots to use)
''Example'': <syntaxhighlight lang="xml" inline><website>https://www.myaddonwebsite.com/</website></syntaxhighlight>
<source lang="xml">
 
    <email>[email protected]</email>
====== <nowiki><source></nowiki> ======
    <email>foo at bar dot com</email>
The <syntaxhighlight lang="xml" inline><source></syntaxhighlight> element provides the URL for the source code for this specific add-on.
</source>
 
''Example'': <syntaxhighlight lang="xml" inline><source>https://github.com/someone/myaddon</source></syntaxhighlight>
 
====== <email> ======
The <syntaxhighlight lang="xml" inline><email></syntaxhighlight> element provides the e-mail address of the author, if they wish to do so for this specific add-on. Here are two examples of how you can format it (the second one is harder for spambots to scrape). This can be left blank if you do not wish to make your e-mail address public.
 
''Examples'':
* <syntaxhighlight lang="xml" inline><email>[email protected]</email></syntaxhighlight>
* <syntaxhighlight lang="xml" inline><email>foo at bar dot com</email></syntaxhighlight>
 
====== <lifecyclestate> ======
{{Note|Kodi v19 Matrix and later.}}
 
The <syntaxhighlight lang="xml" inline><lifecyclestate></syntaxhighlight> element will mark the add-on as broken or deprecated in the Kodi repo and provide the reason why. A dialog will be presented to every user that has the add-on installed, so please try to be specific about the underlying reason for the tag. Also, the <syntaxhighlight lang="xml" inline><lifecyclestate></syntaxhighlight> tag presupposes that a version bump has been made to the add-on.
 
''Example'': <syntaxhighlight lang="xml" inline><lifecyclestate type="deprecated">Description why deprecated</lifecyclestate></syntaxhighlight>
 
At your discretion, it can also be translated into several languages.
 
<syntaxhighlight lang="xml" inline><lifecyclestate type="broken" lang="en_GB">Description why broken</lifecyclestate></syntaxhighlight>


==Skin specific elements==
=== Overview ===
{| class="wikitable"
{| class="wikitable"
'''defaultresolution'''
|+ Valid values for <code>type</code> attribute
Default resolution folder for this skin. This is the base directory that all window xml file requests will fall back to.
  ! scope="col" | Value
|-  
! scope="col" | Meaning
'''defaultresolutionwide'''
  |-
| Default widescreen resolution folder for this skin. This is the directory that all window xml file requests from widescreen resolutions (1080i, 720p, 480p 16x9, NTSC 16x9 and PAL 16x9) will fallback to. If the file isn't found in this window, then it'll fall back to the <defaultresolution> folder.
! scope="row" | <code>broken</code>
|-  
  | To mark add-on as broken and no more usable.
'''defaultthemename'''
|-
| Default theme nameCurrently set to: Default.
! scope="row" | <code>deprecated</code>
|-  
  | To mark add-on as deprecated and that it has been replaced by another add-on.
'''effectslowdown'''
  |-
| A multiplier that is applied to all <animation> effect lengths in the skin. Useful to slow down all animations globally so that you can better configure timings and see interactions between animating controls.
! scope="row" | <code>normal</code>
|-
  | (Default) To set add-on as normal. This value is not really needed, but made available to be able to declare all possible life paths.
|  '''debugging'''
|}
| When set to true, it'll display onscreen debug information (xml filename, mouse position and focused control type and name) in the skin.
 
====== <broken> ======
{{Note|Kodi v18 Leia and earlier. For Matrix and later, see [[Addon.xml#.3Clifecyclestate.3E|§ <lifecyclestate>]]}}


|-  
The <syntaxhighlight lang="xml" inline><broken></syntaxhighlight> element will mark the add-on as broken in the Kodi repo and provide the reason why. A dialog will be presented to every user that has the addon installed, so please try to be specific about the underlying reason for the tag. Also, the broken tag presupposes that a version bump has been made to the add-on.
|  '''res'''
|  Support for arbitrary skin resolutions.
|}


=== How window xml files are found ===
''Example'': <syntaxhighlight lang="xml" inline><broken>deprecated</broken></syntaxhighlight>


XBMC can run in many differing resolutions, and a skin should try and cater to all these resolutions. The easiest way is to develop for one specific resolution and make sure that all controls contain <width> and <height> tags. That way, XBMC can scale the controls to the new screen resolution.
====== <assets> ======
{{Note|Kodi v17 Krypton and later.}}


However, you may choose to develop alternative window xml files for differing resolutions (such as for HDTV resolutions, or for widescreen versus 4x3 resolutions).
The <syntaxhighlight lang="xml" inline><assets></syntaxhighlight> element is a manifest that describes the various assets the add-on provides and where they are located. Supported sub-elements (some optional) are:
* <syntaxhighlight lang="xml" inline><icon></syntaxhighlight> See [[Add-on_structure#icon_png_element|icon.png]] - if an icon.png file exists it must be listed here (mandatory since Kodi v17 Krypton)
* <syntaxhighlight lang="xml" inline><fanart></syntaxhighlight> See [[Add-on_structure#fanart_jpg_element|fanart.jpg]] - if a fanart.jpg file exists it must be listed here (mandatory since Kodi v17 Krypton)
* <syntaxhighlight lang="xml" inline><screenshot></syntaxhighlight> See [[Add-on_structure#screenshot_specifications|screenshots]] - '''(optional)'''


The order that XBMC looks for it's skin files are as follows:
{{Note|Kodi v18 Leia and later.}}
* <syntaxhighlight lang="xml" inline><banner></syntaxhighlight> See [[Add-on_structure#banner_element|banner.jpg]] - '''(optional)'''
* <syntaxhighlight lang="xml" inline><clearlogo></syntaxhighlight> See [[Add-on_structure#clearlogo_element|clearlogo.png]] - '''(optional)'''


# It first looks in the current screenmode folder (one of 1080i, 720p, NTSC16x9, NTSC, PAL16x9 or PAL)
If some elements are empty or not specified, they will be treated as non-existent/not provided. Of all the above sub-elements, only <syntaxhighlight lang="xml" inline><icon></syntaxhighlight> and <syntaxhighlight lang="xml" inline><fanart></syntaxhighlight> are mandatory for add-ons since Kodi v17 Krypton and later.
# If the current screenmode is 1080i, it then looks in the 720p folder.
# If the current screenmode is a widescreen mode (1080i, 720p, NTSC16x9, PAL16x9) then it looks in the <defaultresolutionwide> folder.
# Finally, it looks in the <defaultresolution> folder.


This allows you to just put any window files that do not require special treatment for 16x9 resolutions etc. in the <defaultresolution> folder, preventing needless repetition.
''Example'':
<syntaxhighlight lang="xml">
  <assets>
    <icon>resources/icon.png</icon>
    <fanart>resources/fanart.jpg</fanart>
    <banner>resources/banner.jpg</banner>
    <clearlogo>resources/clearlogo.png</clearlogo>
    <screenshot>resources/screenshot-01.jpg</screenshot>
    <screenshot>resources/screenshot-02.jpg</screenshot>
    <screenshot>resources/screenshot-03.jpg</screenshot>
    <screenshot>resources/screenshot-04.jpg</screenshot>
  </assets>
</syntaxhighlight>


With the above example definition, the files must be placed in the <code>resources</code> folder.


====== <reuselanguageinvoker> ======
{{Note|Kodi v18 Leia and later.}}


== Overview of the script/plugin specific items ==
The <syntaxhighlight lang="xml" inline><reuselanguageinvoker></syntaxhighlight> element is a feature introduced with Kodi 18.0 "Leia" that changes the way the Python invoker works - specifically, attempting to reuse the invoker instances as much as possible. As a result, the add-on performance should be greatly improved. However, note that for the element to work, some changes may be required in your add-on. Namely, since the invoker is reused, make sure <code>sys.argv</code> is always passed to your entrypoint and propagated throughout your codebase. Do ''not'' store it as a class variable.


INFO HERE
''Example'': <syntaxhighlight lang="xml" inline><reuselanguageinvoker>true</reuselanguageinvoker></syntaxhighlight>


Furthermore, it is advised to set this element to <code>false</code> while developing the add-on, only setting its value to <code>true</code> for the production version (after testing).


== Skin-specific elements ==
{| class="wikitable"
! scope="row" | <syntaxhighlight lang="xml" inline><effectslowdown></syntaxhighlight>
| A multiplier that is applied to all <syntaxhighlight lang="xml" inline><animation></syntaxhighlight> effects lengths in the skin; useful for globally slowing down all animations so that you can better configure timings and see interactions between animating controls.
|-
! scope="row" | <syntaxhighlight lang="xml" inline><debugging></syntaxhighlight>
| When set to <code>true</code>, it will display on-screen debugging information (XML filename, mouse position and focused control type/name) on top of the skin.
|-
! scope="row" | <syntaxhighlight lang="xml" inline><res></syntaxhighlight>
| Support for arbitrary skin resolutions.
|}


=addon.xml examples=
=== How window xml files are found ===
Kodi can run in many different resolutions, and a skin should try and cater to all of them. The easiest way is to develop for one specific resolution and make sure that all controls contain <syntaxhighlight lang="xml" inline><width></syntaxhighlight> and <syntaxhighlight lang="xml" inline><height></syntaxhighlight> tags. That way, Kodi can scale the controls to the new screen resolution.


==addon.xml for skins==
However, you may choose to develop alternative window xml files for differing resolutions (such as for HDTV resolutions, or for widescreen versus 4:3 aspect ratios).


The order that Kodi looks for it's skin files are as follows:
# It first looks in the current <code>screenmode</code> folder (one of 1080i, 720p, NTSC16x9, NTSC, PAL16x9 or PAL)
# If the current <code>screenmode</code> is 1080i and there's no 1080i folder, it then looks in the 720p folder.
# Finally, it looks in the '''<code>res</code>''' folder.
This allows you to just put any window files that do not require special treatment for 16:9 aspect ratios, etc., in the <syntaxhighlight lang="xml" inline><defaultresolution></syntaxhighlight> folder, preventing needless repetition.
== Examples ==
=== Skin add-on ===
<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml">
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<addon
<addon id="skin.estuary" version="3.0.10" name="Estuary" provider-name="phil65, Ichabod Fletchman">
  id="skin.confluence"
  version="2.1.3"
  name="Confluence"
  provider-name="Jezz_X|Team XBMC">
   <requires>
   <requires>
     <import addon="xbmc.gui" version="4.0.0"/>
     <import addon="xbmc.gui" version="5.16.0" />
   </requires>
   </requires>
   <extension
   <extension point="xbmc.gui.skin" debugging="false">
    point="xbmc.gui.skin"
    <res width="1920" height="1440" aspect="4:3" default="false" folder="xml" />
     defaultthemename="textures.xbt"
     <res width="1920" height="1280" aspect="3:2" default="false" folder="xml" />
     debugging="false"
     <res width="1920" height="1200" aspect="16:10" default="false" folder="xml" />
     effectslowdown="0.75">
     <res width="2040" height="1080" aspect="17:9" default="false" folder="xml" />
     <res width="1280" height="720" aspect="16:9" default="true" folder="720p" />
     <res width="1920" height="1080" aspect="16:9" default="true" folder="xml" />
    <res width="2560" height="1080" aspect="21:9" default="false" folder="xml" />
    <res width="2338" height="1080" aspect="19.5:9" default="false" folder="xml" />
    <res width="2160" height="1080" aspect="18:9" default="false" folder="xml" />
   </extension>
   </extension>
   <extension point="xbmc.addon.metadata">
   <extension point="xbmc.addon.metadata">
    <summary lang="en">Confluence skin by Jezz_X. (XBMC's default skin)</summary>
    <description lang="en">Confluence is the default skin for XBMC 9.11 and above. It is a combination of concepts from many popular skins, and attempts to embrace and integrate their good ideas into a skin that should be easy for first time XBMC users to understand and use.</description>
    <disclaimer lang="en">Confluence is the default skin for XBMC, removing it may cause issues</disclaimer>
     <platform>all</platform>
     <platform>all</platform>
     <license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license>
     <license>CC BY-SA 4.0, GNU GENERAL PUBLIC LICENSE Version 2.0</license>
     <forum></forum>
     <forum>https://forum.kodi.tv/</forum>
     <website></website>
     <source>https://github.com/xbmc/xbmc/tree/master/addons/skin.estuary</source>
     <email></email>
    <assets>
     <source></source>
      <icon>resources/icon.png</icon>
      <fanart>resources/fanart.jpg</fanart>
      <screenshot>resources/screenshot-01.jpg</screenshot>
      <screenshot>resources/screenshot-02.jpg</screenshot>
      <screenshot>resources/screenshot-03.jpg</screenshot>
      <screenshot>resources/screenshot-04.jpg</screenshot>
      <screenshot>resources/screenshot-05.jpg</screenshot>
      <screenshot>resources/screenshot-06.jpg</screenshot>
      <screenshot>resources/screenshot-07.jpg</screenshot>
      <screenshot>resources/screenshot-08.jpg</screenshot>
    </assets>
    <summary lang="en_GB">Estuary skin by phil65. (Kodi&apos;s default skin)</summary>
     <description lang="en_GB">Estuary is the default skin for Kodi 17.0 and above. It attempts to be easy for first time Kodi users to understand and use.</description>
     <disclaimer lang="en_GB">Estuary is the default skin for Kodi, removing it may cause issues</disclaimer>
   </extension>
   </extension>
</addon>
</addon>
</syntaxhighlight>
</syntaxhighlight>
One thing to note is that <font color="red">all tag names are lower case.</font> XML tag names are case sensitive!
One thing to note is that {{Red|all tag names are lower case}}. XML tag names are case-sensitive!


==addon.xml for scripts/plugins==
=== Script add-on ===
 
<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml" enclose="div">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon
<addon id="script.artwork.downloader" name="Artwork Downloader" version="12.0.28" provider-name="Martijn">
    id="script.artwork.downloader"
    name="Artwork Downloader"
    version="12.0.12"
    provider-name="Martijn">
   <requires>
   <requires>
     <import addon="xbmc.python"                 version="2.1.0"/>
     <import addon="xbmc.python"               version="2.1.0" />
     <import addon="xbmc.json"                   version="6.0.0"/>
     <import addon="xmbc.json"                 version="6.0.0" />
     <import addon="xbmc.addon"                 version="12.0.0"/>
     <import addon="xbmc.addon"                 version="12.0.0" />
     <import addon="script.module.elementtree"  version="1.2.7"/>
     <import addon="script.module.simplejson"  version="3.3.0" />
    <import addon="script.module.simplejson"    version="2.0.10" optional="true"/>
     <import addon="script.common.plugin.cache" version="1.3.0" />
     <import addon="script.common.plugin.cache" version="1.3.0"/>
   </requires>
   </requires>
   <extension point="xbmc.python.script"         library="default.py">
   <extension point="xbmc.python.script"       library="default.py">
     <provides>executable</provides>
     <provides>executable</provides>
   </extension>
   </extension>
  <extension point="xbmc.service" library="service.py" start="login"/>
   <extension point="xbmc.addon.metadata">
   <extension point="xbmc.addon.metadata">
     <summary lang="en">Downloads Artwork for TV shows, Movies and Musicvideos in your library</summary>
     <summary lang="en_GB">Downloads Artwork for TV shows, Movies and Musicvideos in your library</summary>
     <description lang="en">Downloads all available artwork for TV shows, Movies and Musicvideos in your library. Check the options for supported artwork[CR]Artwork sources:[CR]www.fanart.tv[CR]www.thetvdb.com[CR]www.themoviedb.org[CR]Remark:[CR]Check your skin to see what type of artwork is supported![CR]Each TV Show/Movie must have its own folder![CR]Skin integration:[CR]See readme file</description>
     <description lang="en_GB">Downloads all available artwork for TV shows, Movies and Musicvideos in your library. Check the options for supported artwork[CR]Artwork sources:[CR]www.fanart.tv[CR]www.thetvdb.com[CR]www.themoviedb.org[CR]Remark:[CR]Check your skin to see what type of artwork is supported![CR]Each TV Show/Movie must have its own folder![CR]Skin integration:[CR]See readme file</description>
     <disclaimer lang="en">For bugs, requests or general questions visit the Artwork Downloader thread on the XBMC forum.</disclaimer>
     <disclaimer lang="en_GB">For bugs, requests or general questions visit the Artwork Downloader thread on the XBMC forum.</disclaimer>
    <language></language>
     <platform>all</platform>
     <platform>all</platform>
     <license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license>
     <license>GPL-2.0-or-later</license>
     <forum></forum>
     <forum>https://forum.kodi.tv/showthread.php?tid=114633</forum>
     <website></website>
     <website>https://kodi.wiki/view/Add-on:Artwork_Downloader</website>
     <email></email>
     <email>[email protected]</email>
     <source></source>
     <source>https://github.com/XBMC-Addons/script.artwork.downloader</source>
    <news>
      v12.0.28
        - Don't set simplejson module to optional
      v12.0.27
        - Fix wrong order of listing using votes for artwork from fanart.tv
      …
    </news>
    <assets>
        <icon>resources/images/icon.png</icon>
        <fanart>resources/images/fanart.png</fanart>
        <screenshot>resources/images/screenshot.png</screenshot>
    </assets>
   </extension>
   </extension>
</addon>
</addon>
</syntaxhighlight>
</syntaxhighlight>


=XBMC source code=
== Common errors ==
If you are getting errors when installing your Kodi addon, then you may have errors in your addon.xml file, which could be any of the following:
# Invalid characters - does any of your description text, addon name, etc. have any of the following? !, ?, -, etc
# Too large description can sometimes cause issues
# You may have an opening tag but not a closing tag further in the file e.g. <description> but not later on </description>
# If you have directly updated your code and are still finding errors which you know you have fixed, it's possible your cache is still holding the previous version. Try clearing contents of the following folders (or if this fails, reboot your Kodi device):
#* .kodi/addons/temp
#* .kodi/temp/temp
#* .kodi/temp/archive_cache


addon.xml is handled in following [https://github.com/xbmc/xbmc/blob/master/addons/xbmc.addon/metadata.xsd XML Schema Definition]
== Schema Definition ==
The XML schema definition for <code>addon.xml</code> is located [https://github.com/xbmc/xbmc/blob/master/addons/xbmc.addon/metadata.xsd here].


{{Updated|20}}




[[Category:Add-ons]]
[[Category:Add-on development]]
[[Category:Addon Development]]
[[Category:Skin development]]
[[Category:Skin Development]]
[[Category:Python]]
[[Category:Development]]

Latest revision as of 16:19, 23 January 2023

Home icon grey.png   ▶ Development ▶ Add-on development ▶ Addon.xml

Every skin, script, or plugin in Kodi contains an addon.xml file which describes the add-on, providing credits, version information and dependencies. Below, we will explain how this file is structured and which elements must be used to create an add-on for Kodi. You can also consult the examples at the end to see how this file is laid out depending on if you are developing a skin or script.

Every addon.xml file has the same basic structure, this example is for a video plugin:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.addon.id" name="Your Add-on" version="1.2.3" provider-name="You">
  <requires>
    <import addon="xbmc.python" version="2.25.0" />
  </requires>
  <extension point="xbmc.python.pluginsource" library="addon.py">
    <provides>video</provides>
  </extension>
  <extension point="xbmc.addon.metadata">
    <summary lang="en_GB">Your add-on's summary</summary>
    <description lang="en_GB">Your add-on's description</description>
    <disclaimer lang="en_GB"></disclaimer>
    <language>en</language> <!-- language of the content the add-on provides, omit if the add-on does not provide any content -->
    <platform>all</platform>
    <license>GPL-2.0-or-later</license>
    <forum>https://forum.kodi.tv/showthread.php?tid=xxxx</forum> <!-- may be omitted -->
    <website>http://myplugin.com</website> <!-- URL of the website that supplies the content, or the website for your plugin; may be omitted. -->
    <email>[email protected]</email> <!-- may be omitted -->
    <source>http://github.com/you/plugin.addon.id</source>
    <news>v1.2.3 (01/02/2013)
      [new] some new feature
      [fix] some fix
    </news>
    <assets>
        <icon>resources/icon.png</icon>
        <fanart>resources/fanart.jpg</fanart>
        <banner></banner> <!-- optional -->
        <clearlogo>resources/clearlogo.png</clearlogo> <!-- optional -->
        <screenshot></screenshot> <!-- optional, max. 10 -->
    </assets>
  </extension>
</addon>

There are a few important things to note in the above sample:

  • The <addon> element must be present, and be the root node. It presents data about the add-on package as a whole. Inside it should be:
    • A <requires> element, listing all the dependencies that this add-on needs in order to function inside individual <import> elements for each one.
    • One or more <extension> elements, each of which describes a part of Kodi that the add-on extends.
      • Finally, there is a specific extension element, <extension point="xbmc.addon.metadata"> that describes the add-on to the user.
        • Image assets such as icons, a banner and screenshots declared inside their own named elements inside of an <assets> tag (exclusive to Kodi v18+)

Core elements

<addon>

The <addon> element has 4 attributes, and they are all required: id, version, name, and provider-name.

Example: <addon id="script.hello.world" name="Hello World" version="0.0.1" provider-name="Dev1, Dev2">

id attribute

The id attribute is the unique identifier used for this add-on. It must be unique, and must use only lowercase characters, periods, underscores, dashes and numbers. This identifier is also used as the name of the folder that contains the add-on, so for ease of searching, we suggest you use something like type.uniquename.

version attribute

The version attribute is used by Kodi to determine whether updates are available. This should be use a version scheme like x.y.z (major.minor.patch). For example: version="0.0.1". Generally, you'll start with a version of 0.y.z for test releases and once you feel it is ready for a full release, you'd bump the version to 1.0.0.

How versioning works
  • 2.2.9 is newer than 2.2.1
  • 2.2.10 is newer than 2.2.1
  • 2.3.0 is newer than 2.2.9
  • 2.2.1 is newer than 2.2.1~alpha
  • 2.2.1 is newer than 2.2.1~beta
  • 2.2.1~beta is newer than 2.2.1~alpha
  • 2.2.1~beta3 is newer than 2.2.1~beta2
  • 2.2.1~beta10 is newer than 2.2.1~beta1
Tip Tip: Text should only be added for a beta version. In other cases version number should only contain numbers.

name attribute

The name attribute is the name of the add-on as it appears in the UI. This should be in English where it makes sense for it to be so, and is not translatable.

provider-name attribute

The provider-name attribute is used as the author field. This could be a team of authors or a single author. If the add-on is maintained by multiple people please separate them with a comma (,).

<requires>

The <requires> element contains one or more <import> elements which specify which other add-ons this particular add-on requires, and which version of those add-ons it requires. These add-ons may be part of Kodi itself, or may be parts of other third-party add-ons.

Kodi will only allow the add-on to be run if suitable versions of the (non-optional) add-ons on which this add-on depends are installed. When a user installs your add-on from an online repository via Kodi's add-on manager, Kodi attempts to resolve these dependencies, and install anything that your add-on relies on first. The dependency must be provided with the minimum version number your script/skin requires.

Examples: Here is a sample <requires> block that imports two required modules:

<requires>
  <import addon="xbmc.python"               version="2.25.0" />
  <import addon="script.module.elementtree" version="1.2.7" />
</requires>

Here's another example, which will only install on LibreELEC. This occurs because the addon will depend on an addon that only exists in LibreELEC. Hence, Kodi will refuse to install the addon in other platforms due to unmet dependencies:

<requires>
  <import addon="os.librelec.tv" version="2.0" />
</requires>

<import>

Each <import> element describes one dependency for an add-on, with two required attributes: addon and version. There is also an optional attribute called, fittingly, optional.

If your add-on relies on other third-party add-ons, Kodi will automatically install them as well, provided they are available on an existing add-on repository. If they aren't available on any existing repository, the user must install the other add-ons themselves. Note that you need to include any Python libraries you need directly in your add-on; these can't be loaded with an <import> element, since Kodi wouldn't know what to do with them.

addon attribute

The addon attribute specifies the id of the required add-on, e.g. script.module.elementtree.

version attribute

The version attribute specifies the minimum version of the required add-on to be installed.

Dependency versions

Each different Kodi version might require you to use a higher version of the xbmc.* add-on dependencies to control on which version of Kodi the add-on can be installed.

Each Kodi version contain a certain backwards compatibility. For example add-ons made for Gotham 13.x can still work on Leia 18.x. Same happens for Matrix and Nexus addons. Do note that this might change in the future. The ABI version you see in the table above is the backwards compatibility version for which add-ons are still marked "working".

optional attribute

The dependency may be made optional by setting the optional attribute to true. This will only install the dependency when the add-on actually needs it. Even if this dependency is missing, the add-on can still be installed.

<extension>

The <extension> element describes the technical aspects of this add-on. It will have at least a point attribute which will give the part of Kodi that the add-on extends. For instance, the addon.xml file for the Confluence skin extends the xbmc.gui.skin part of xbmc. All available extension points are given below.

point attribute

The various extension points that Kodi provides are given in the list below.

Add-ons that don't correspond to a specific add-on category can not be installed by users. These are usually supporting or shared add-ons that are installed automatically by the add-ons that require them.

xbmc.python.pluginsource

The most common extension point that will be used by plugin addon developers is xbmc.python.pluginsource.

library attribute

The <extension point="xbmc.python.pluginsource"> element has an extra attribute: library. This is the name of the Python script (startup script) that will be run when the add-on is activated. This file must exist in the root of your add-on directory.

<provides> element

The extension has an additional child element named <provides>, which contains a whitespace separated list of audio, executable, image and/or video. This determines in what area (or context) of the Kodi system your addon will make itself visible in (please note that this applies only to pluginsource extension points):

Note: If the <provides> element is not defined, behavior will depend on the structure of your add-on. If it has a single extension point (e.g. a single xbmc.python.script or xbmc.python.pluginsource), Kodi will default to executable (thus your add-on will be shown in Programs). If your add-on has multiple extension points and none specifies a <provides> element, different entries for your add-on will be shown in "Programs" (multiple fallbacks to "executable"). If your add-on has multiple extension points and only one (or some) define the <provides> tag it really depends on the order of the extension points. If the first extension point (your add-on's main extension point) defines the <provides> element, Kodi will assume all the other (empty) extension points provide the same content. Otherwise, it will set the content for all the extension points that specify the <provides> tag and fallback all the others to "executable". At the moment, there is no way to hide an add-on from the interface.

Example:

<extension point="xbmc.python.pluginsource" library="gpodderxbmc.py">
  <provides>audio video</provides>
</extension>
xbmc.addon.metadata

This special extension point must be provided by all add-ons, and is the way that your add-on is described to users of the Kodi add-on manager. There are several elements that this should contain. Most of these elements are required (except the deprecated tag). However, in case the elements do not apply (e.g. language, website, email) they can be omitted from the addon.xml file.

Localization

Language specific elements must always be present in English as a minimum. Many of these elements can be translated into multiple languages and should be added once for each supported language. The lang attribute should contain a locale identifier. If omitted, it defaults to en_GB. Note: Kodi v14 and older uses ISO-639 code. See List of language codes (ISO-639:1988)

<summary>

One or more <summary> elements provide a short summary of what the add-on does. This should be a single sentence. It may be translated into multiple languages.

Example: <summary lang="en_GB">Hello World script provides some basic examples on how to create your first script.</summary>

<description>

One or more <description> elements provide a more detailed summary of what the add-on does. It may be translated into multiple languages.

Example:

<description lang="en_GB">Hello World script provides some basic examples on how to create your first script and hopefully will increase the number of Kodi users to start creating their own addons.</description>
<disclaimer>

One or more <disclaimer> elements that indicate what (if any) things the user should know about the add-on. There is no need to have a disclaimer if you don't want one, though if something requires settings, or only works in a particular country then you may want to state this here. It may be translated into multiple languages.

Example: <disclaimer lang="en_GB">Feel free to use this script. For information visit the wiki.</disclaimer>

<news>

Note: Used in Kodi v17 Krypton and later only. Older versions are forward compatible.

The <news> element should contains a simple description of the major changes made to the add-on (new functionality, big fixes, etc). This is displayed in the Kodi addon installation/update system. (In the author's opinion, too many add-ons skip this piece of information, making it difficult for users to determine whether a particular problem that they may have been having has been fixed or not.) Please keep it short (it's limited to 1500 characters); you might want to only include the changes for the last version here.

Here is an example:

<news>v0.1.2  (2014-01-15)
- Added notification for Ubuntu users checking through apt command</news>
<platform>

The <platform> tag specifies which platforms (operating systems, hardware, architecture) this add-on runs on. Many add-ons will run on all platforms, so all is an option. If the platform tag is missing, we assume the add-on runs on all platforms. A space-delimited combination of these is also possible. Currently available options are:

  • all
  • linux
  • osx
  • osx64
  • osx-x86_64
  • osx32
  • osx-i686
  • ios
  • ios-armv7
  • ios-aarch64
  • windx
  • windows
  • windows-i686
  • windows-x86_64
  • windowsstore
  • android
  • android-armv7
  • android-aarch64
  • android-i686

Note: Kodi v19 Matrix and later.

  • tvos
  • tvos-aarch64

Example: <platform>linux osx-x86_64 windows-x86_64</platform>

<language>

The <language> elements indicate the language(s) of the content provided by your add-on. It applies to plugins, scripts, scrapers, etc. This allows browsing the add-on list by language. When there is no specific language provided in your content, omit it from the addon.xml.

Example: <language>en de fr</language>

<license>

The <license> element indicates what license is used for this add-on. In general, the SPDX License Expression for the license(s) are preferable to the full license name:

Examples:
SPDX License Expression: <license>GPL-2.0-or-later</license>
vs
Full license name: <license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license>

If your add-on includes multiple licenses:

  • Separate license names using | (the pipe or vertical bar character) when there is a choice between licenses:
    • <license>GPL-2.0-or-later | LGPL-2.0-or-later</license>
  • Separate license names using & (ampersand), or , (comma), when multiple licenses exist that cover different parts of the source.
    • <license>GPL-2.0-or-later & MIT</license>
    • <license>GPL-2.0-or-later, MIT</license>
<forum>

The <forum> element provides the forum thread URL for this specific add-on. Omit this element if there is no forum thread.

Example: <forum>http://www.myaddonwebsite.com/forum.php?thread=12345</forum>

<website>

The <website> element provides the website URL for this specific add-on.

Example: <website>https://www.myaddonwebsite.com/</website>

<source>

The <source> element provides the URL for the source code for this specific add-on.

Example: <source>https://github.com/someone/myaddon</source>

<email>

The <email> element provides the e-mail address of the author, if they wish to do so for this specific add-on. Here are two examples of how you can format it (the second one is harder for spambots to scrape). This can be left blank if you do not wish to make your e-mail address public.

Examples:

<lifecyclestate>

Note: Kodi v19 Matrix and later.

The <lifecyclestate> element will mark the add-on as broken or deprecated in the Kodi repo and provide the reason why. A dialog will be presented to every user that has the add-on installed, so please try to be specific about the underlying reason for the tag. Also, the <lifecyclestate> tag presupposes that a version bump has been made to the add-on.

Example: <lifecyclestate type="deprecated">Description why deprecated</lifecyclestate>

At your discretion, it can also be translated into several languages.

<lifecyclestate type="broken" lang="en_GB">Description why broken</lifecyclestate>

Valid values for type attribute
Value Meaning
broken To mark add-on as broken and no more usable.
deprecated To mark add-on as deprecated and that it has been replaced by another add-on.
normal (Default) To set add-on as normal. This value is not really needed, but made available to be able to declare all possible life paths.
<broken>

Note: Kodi v18 Leia and earlier. For Matrix and later, see § <lifecyclestate>

The <broken> element will mark the add-on as broken in the Kodi repo and provide the reason why. A dialog will be presented to every user that has the addon installed, so please try to be specific about the underlying reason for the tag. Also, the broken tag presupposes that a version bump has been made to the add-on.

Example: <broken>deprecated</broken>

<assets>

Note: Kodi v17 Krypton and later.

The <assets> element is a manifest that describes the various assets the add-on provides and where they are located. Supported sub-elements (some optional) are:

  • <icon> See icon.png - if an icon.png file exists it must be listed here (mandatory since Kodi v17 Krypton)
  • <fanart> See fanart.jpg - if a fanart.jpg file exists it must be listed here (mandatory since Kodi v17 Krypton)
  • <screenshot> See screenshots - (optional)

Note: Kodi v18 Leia and later.

If some elements are empty or not specified, they will be treated as non-existent/not provided. Of all the above sub-elements, only <icon> and <fanart> are mandatory for add-ons since Kodi v17 Krypton and later.

Example:

  <assets>
    <icon>resources/icon.png</icon>
    <fanart>resources/fanart.jpg</fanart>
    <banner>resources/banner.jpg</banner>
    <clearlogo>resources/clearlogo.png</clearlogo>
    <screenshot>resources/screenshot-01.jpg</screenshot>
    <screenshot>resources/screenshot-02.jpg</screenshot>
    <screenshot>resources/screenshot-03.jpg</screenshot>
    <screenshot>resources/screenshot-04.jpg</screenshot>
  </assets>

With the above example definition, the files must be placed in the resources folder.

<reuselanguageinvoker>

Note: Kodi v18 Leia and later.

The <reuselanguageinvoker> element is a feature introduced with Kodi 18.0 "Leia" that changes the way the Python invoker works - specifically, attempting to reuse the invoker instances as much as possible. As a result, the add-on performance should be greatly improved. However, note that for the element to work, some changes may be required in your add-on. Namely, since the invoker is reused, make sure sys.argv is always passed to your entrypoint and propagated throughout your codebase. Do not store it as a class variable.

Example: <reuselanguageinvoker>true</reuselanguageinvoker>

Furthermore, it is advised to set this element to false while developing the add-on, only setting its value to true for the production version (after testing).

Skin-specific elements

<effectslowdown> A multiplier that is applied to all <animation> effects lengths in the skin; useful for globally slowing down all animations so that you can better configure timings and see interactions between animating controls.
<debugging> When set to true, it will display on-screen debugging information (XML filename, mouse position and focused control type/name) on top of the skin.
<res> Support for arbitrary skin resolutions.

How window xml files are found

Kodi can run in many different resolutions, and a skin should try and cater to all of them. The easiest way is to develop for one specific resolution and make sure that all controls contain <width> and <height> tags. That way, Kodi can scale the controls to the new screen resolution.

However, you may choose to develop alternative window xml files for differing resolutions (such as for HDTV resolutions, or for widescreen versus 4:3 aspect ratios).

The order that Kodi looks for it's skin files are as follows:

  1. It first looks in the current screenmode folder (one of 1080i, 720p, NTSC16x9, NTSC, PAL16x9 or PAL)
  2. If the current screenmode is 1080i and there's no 1080i folder, it then looks in the 720p folder.
  3. Finally, it looks in the res folder.

This allows you to just put any window files that do not require special treatment for 16:9 aspect ratios, etc., in the <defaultresolution> folder, preventing needless repetition.

Examples

Skin add-on

<?xml version="1.0" encoding="UTF-8"?>
<addon id="skin.estuary" version="3.0.10" name="Estuary" provider-name="phil65, Ichabod Fletchman">
  <requires>
    <import addon="xbmc.gui" version="5.16.0" />
  </requires>
  <extension point="xbmc.gui.skin" debugging="false">
    <res width="1920" height="1440" aspect="4:3" default="false" folder="xml" />
    <res width="1920" height="1280" aspect="3:2" default="false" folder="xml" />
    <res width="1920" height="1200" aspect="16:10" default="false" folder="xml" />
    <res width="2040" height="1080" aspect="17:9" default="false" folder="xml" />
    <res width="1920" height="1080" aspect="16:9" default="true" folder="xml" />
    <res width="2560" height="1080" aspect="21:9" default="false" folder="xml" />
    <res width="2338" height="1080" aspect="19.5:9" default="false" folder="xml" />
    <res width="2160" height="1080" aspect="18:9" default="false" folder="xml" />
  </extension>
  <extension point="xbmc.addon.metadata">
    <platform>all</platform>
    <license>CC BY-SA 4.0, GNU GENERAL PUBLIC LICENSE Version 2.0</license>
    <forum>https://forum.kodi.tv/</forum>
    <source>https://github.com/xbmc/xbmc/tree/master/addons/skin.estuary</source>
    <assets>
      <icon>resources/icon.png</icon>
      <fanart>resources/fanart.jpg</fanart>
      <screenshot>resources/screenshot-01.jpg</screenshot>
      <screenshot>resources/screenshot-02.jpg</screenshot>
      <screenshot>resources/screenshot-03.jpg</screenshot>
      <screenshot>resources/screenshot-04.jpg</screenshot>
      <screenshot>resources/screenshot-05.jpg</screenshot>
      <screenshot>resources/screenshot-06.jpg</screenshot>
      <screenshot>resources/screenshot-07.jpg</screenshot>
      <screenshot>resources/screenshot-08.jpg</screenshot>
    </assets>
    <summary lang="en_GB">Estuary skin by phil65. (Kodi&apos;s default skin)</summary>
    <description lang="en_GB">Estuary is the default skin for Kodi 17.0 and above. It attempts to be easy for first time Kodi users to understand and use.</description>
    <disclaimer lang="en_GB">Estuary is the default skin for Kodi, removing it may cause issues</disclaimer>
  </extension>
</addon>

One thing to note is that all tag names are lower case. XML tag names are case-sensitive!

Script add-on

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="script.artwork.downloader" name="Artwork Downloader" version="12.0.28" provider-name="Martijn">
  <requires>
    <import addon="xbmc.python"                version="2.1.0" />
    <import addon="xmbc.json"                  version="6.0.0" />
    <import addon="xbmc.addon"                 version="12.0.0" />
    <import addon="script.module.simplejson"   version="3.3.0" />
    <import addon="script.common.plugin.cache" version="1.3.0" />
  </requires>
  <extension point="xbmc.python.script"        library="default.py">
    <provides>executable</provides>
  </extension>
  <extension point="xbmc.addon.metadata">
    <summary lang="en_GB">Downloads Artwork for TV shows, Movies and Musicvideos in your library</summary>
    <description lang="en_GB">Downloads all available artwork for TV shows, Movies and Musicvideos in your library. Check the options for supported artwork[CR]Artwork sources:[CR]www.fanart.tv[CR]www.thetvdb.com[CR]www.themoviedb.org[CR]Remark:[CR]Check your skin to see what type of artwork is supported![CR]Each TV Show/Movie must have its own folder![CR]Skin integration:[CR]See readme file</description>
    <disclaimer lang="en_GB">For bugs, requests or general questions visit the Artwork Downloader thread on the XBMC forum.</disclaimer>
    <platform>all</platform>
    <license>GPL-2.0-or-later</license>
    <forum>https://forum.kodi.tv/showthread.php?tid=114633</forum>
    <website>https://kodi.wiki/view/Add-on:Artwork_Downloader</website>
    <email>[email protected]</email>
    <source>https://github.com/XBMC-Addons/script.artwork.downloader</source>
    <news>
      v12.0.28
        - Don't set simplejson module to optional
      v12.0.27
        - Fix wrong order of listing using votes for artwork from fanart.tv
      …
    </news>
    <assets>
        <icon>resources/images/icon.png</icon>
        <fanart>resources/images/fanart.png</fanart>
        <screenshot>resources/images/screenshot.png</screenshot>
    </assets>
  </extension>
</addon>

Common errors

If you are getting errors when installing your Kodi addon, then you may have errors in your addon.xml file, which could be any of the following:

  1. Invalid characters - does any of your description text, addon name, etc. have any of the following? !, ?, -, etc
  2. Too large description can sometimes cause issues
  3. You may have an opening tag but not a closing tag further in the file e.g. <description> but not later on </description>
  4. If you have directly updated your code and are still finding errors which you know you have fixed, it's possible your cache is still holding the previous version. Try clearing contents of the following folders (or if this fails, reboot your Kodi device):
    • .kodi/addons/temp
    • .kodi/temp/temp
    • .kodi/temp/archive_cache

Schema Definition

The XML schema definition for addon.xml is located here.