====== Executing a script from a Kodi plugin add-on ======
In trying to present my collection of images with a custom slideshow from Koid, I have tried different approaches. The first was to define an **[[kodi_external_player|external player]]**, the second was to create a **specific plugin that would launch an external program** and finally I created **a plugin that launches a Kodi add-on script**.
The first two methods failed because [[kodi_addon#cannot_execute_a_graphical_external_program|it is not possible to run a graphics program while Kodi is running]].
===== Executing something from a plugin add-on =====
As explained into the article **[[kodi_addon]]** it is possible to create **script add-ons** or **plugin add-ons** using Python. A **plugin add-on** is simply a container of media elements generally organized as a directory, **without specific playing capabilities**. The play of a content is generally delegated to the **native Kodi players** (video, audio or pictures).
Starting with Kodi 19 Matrix it is possible tu use the embedded Python 3 as the programming language for plugins and scripts.
When a plugin add-on is invoked, it produces a **directory listing** where **some elements are sub-folders** and others are **playable items**. If the user selects a sub-folder, the plugin is called again and it produces another listing. If instead the user selects a playable item, the appropriate Kodi player is called.
It is possibile to customize the action associated to a playable **ListItem** (the playable media element shown into the plugin directory), overriding the default player; so it is possible to launch a generic external Python program or run a Kodi script add-on. To obtain this you must tag the ListItem as ''IsPlayable = false'' and define its **url** as pointing to the plugin add-on itself. When the user select that item, the plugin is called again (call-bak) and you can execute the custom action on it.
==== Executing an external Python program ====
This statement executes a **Python script** (it must be Python) that resides on the filesystem. The **%%special://home%%** prefix actually refers to the home directory of the Kodi program. In my case it means the **/home/kodi/.kodi/** directory.
xbmc.executescript('special://home/bin/my-script.py')
The following example adds a **context menu item** to a **ListItem** contained into a plugin directory. Selecting that menu item will will launch the script passing it an argument. Also in this case the script **must be a Python script**:
li = xbmcgui.ListItem(label='Item title')
li.addContextMenuItems([('Run myScript', 'RunScript(special://home/bin/my-script.py,arg1)')])
==== Executing a Kodi script add-on ====
Because an external program cannot use the graphic display, I had to rely on a Kodi script add-on to execute the slideshow.
The Python 3 code that I used into the plugin add-on is the following:
from urllib.parse import urlencode
query = urlencode({'context': '/path/to/playlist.m3u'})
run_addon = 'RunAddon(script.picture.my-slideshow,?%s)' % (query,)
xbmc.executebuiltin(run_addon)
===== Web References =====
* [[https://kodi.wiki/view/Audio-video_add-on_tutorial]]
* [[https://kodi.wiki/view/Add-on_settings]]
* [[https://kodi.wiki/view/External_players]]
* [[https://codedocs.xyz/w3tech/xodi/index.html]]