225 lines
10 KiB
Python
225 lines
10 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
# script.module.python.koding.aio
|
|
# Python Koding AIO (c) by TOTALREVOLUTION LTD (support@trmc.freshdesk.com)
|
|
|
|
# Python Koding AIO is licensed under a
|
|
# Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.
|
|
|
|
# You should have received a copy of the license along with this
|
|
# work. If not, see http://creativecommons.org/licenses/by-nc-nd/4.0.
|
|
|
|
# Please make sure you've read and understood the license, this code can NOT be used commercially
|
|
# and it can NOT be modified and redistributed. If you're found to be in breach of this license
|
|
# then any affected add-ons will be blacklisted and will not be able to work on the same system
|
|
# as any other add-ons which use this code. Thank you for your cooperation.
|
|
|
|
import sys
|
|
import urllib
|
|
import xbmc
|
|
import xbmcaddon
|
|
import xbmcgui
|
|
import xbmcplugin
|
|
|
|
dialog = xbmcgui.Dialog()
|
|
mode = ''
|
|
#----------------------------------------------------------------
|
|
# TUTORIAL #
|
|
def Add_Dir(name, url='', mode='', folder=False, icon='', fanart='', description='', info_labels={}, set_art={}, set_property={}, content_type='', context_items=None, context_override=False, playable=False):
|
|
"""
|
|
This allows you to create a list item/folder inside your add-on.
|
|
Please take a look at your addon default.py comments for more information
|
|
(presuming you created one at http://totalrevolution.tv)
|
|
|
|
TOP TIP: If you want to send multiple variables through to a function just
|
|
send through as a dictionary encapsulated in quotation marks. In the function
|
|
you can then use the following code to access them:
|
|
|
|
params = eval(url)
|
|
^ That will then give you a dictionary where you can just pull each variable and value from.
|
|
|
|
CODE: Add_Dir(name, url, mode, [folder, icon, fanart, description, info_labels, content_type, context_items, context_override, playable])
|
|
|
|
AVAILABLE PARAMS:
|
|
|
|
(*) name - This is the name you want to show for the list item
|
|
|
|
url - If the route (mode) you're calling requires extra paramaters
|
|
to be sent through then this is where you add them. If the function is
|
|
only expecting one item then you can send through as a simple string.
|
|
Unlike many other Add_Dir functions Python Koding does allow for multiple
|
|
params to be sent through in the form of a dictionary so let's say your
|
|
function is expecting the 2 params my_time & my_date. You would send this info
|
|
through as a dictionary like this:
|
|
url={'my_time':'10:00', 'my_date':'01.01.1970'}
|
|
|
|
If you send through a url starting with plugin:// the item will open up into
|
|
that plugin path so for example:
|
|
url='plugin://plugin.video.youtube/play/?video_id=FTI16i7APhU'
|
|
|
|
mode - The mode you want to open when this item is clicked, this is set
|
|
in your master_modes dictionary (see template add-on linked above)
|
|
|
|
folder - This is an optional boolean, by default it's set to False.
|
|
True will open into a folder rather than an executable command
|
|
|
|
icon - The path to the thumbnail you want to use for this list item
|
|
|
|
fanart - The path to the fanart you want to use for this list item
|
|
|
|
description - A description of your list item, it's skin dependant but this
|
|
usually appears below the thumbnail
|
|
|
|
info_labels - You can send through any number of info_labels via this option.
|
|
For full details on the infolabels available please check the pydocs here:
|
|
http://mirrors.kodi.tv/docs/python-docs/16.x-jarvis/xbmcgui.html#ListItem-setInfo
|
|
|
|
When passing through infolabels you need to use a dictionary in this format:
|
|
{"genre":"comedy", "title":"test video"}
|
|
|
|
set_art - Using the same format as info_labels you can set your artwork via
|
|
a dictionary here. Full details can be found here:
|
|
http://mirrors.kodi.tv/docs/python-docs/16.x-jarvis/xbmcgui.html#ListItem-setArt
|
|
|
|
set_property - Using the same format as info_labels you can set your artwork via
|
|
a dictionary here. Full details can be found here:
|
|
http://kodi.wiki/view/InfoLabels#ListItem
|
|
|
|
content_type - By default this will set the content_type for kodi to a blank string
|
|
which is what Kodi expects for generic category listings. There are plenty of different
|
|
types though and when set Kodi will perform different actions (such as access the
|
|
database looking for season/episode information for the list item).
|
|
|
|
WARNING: Setting the wrong content type for your listing can cause the system to
|
|
log thousands of error reports in your log, cause the system to lag and make
|
|
thousands of unnecessary db calls - sometimes resulting in a crash. You can find
|
|
details on the content_types available here: http://forum.kodi.tv/showthread.php?tid=299107
|
|
|
|
context_items - Add context items to your directory. The params you need to send through
|
|
need to be in a list format of [(label, action,),] look at the example code below for
|
|
more details.
|
|
|
|
context_override - By default your context items will be added to the global context
|
|
menu items but you can override this by setting this to True and then only your
|
|
context menu items will show.
|
|
|
|
playable - By default this is set to False but if set to True kodi will just try
|
|
and play this item natively with no extra fancy functions.
|
|
|
|
EXAMPLE:
|
|
my_context = [('Music','xbmc.executebuiltin("ActivateWindow(music)")'),('Programs','xbmc.executebuiltin("ActivateWindow(programs)")')]
|
|
# ^ This is our two basic context menu items (music and programs)
|
|
|
|
Add_Dir(name='TEST DIRECTORY', url='', mode='test_directory', folder=True, context_items=my_context, context_override=True)
|
|
# ^ This will add a folder AND a context menu item for when bring up the menu (when focused on this directory).
|
|
# ^^ The context_override is set to True which means it will override the default Kodi context menu items.
|
|
|
|
Add_Dir(name='TEST ITEM', url='', mode='test_item', folder=False, context_items=my_context, context_override=False)
|
|
# ^ This will add an item to the list AND a context menu item for when bring up the menu (when focused on this item).
|
|
# ^^ The context_override is set to False which means the new items will appear alongside the default Kodi context menu items.
|
|
~"""
|
|
from vartools import Convert_Special, Data_Type
|
|
|
|
module_id = 'script.module.python.koding.aio'
|
|
this_module = xbmcaddon.Addon(id=module_id)
|
|
|
|
addon_handle = int(sys.argv[1])
|
|
# Check we're in an appropriate section for the content type set
|
|
song_only_modes = ['songs','artist','album','song','music']
|
|
video_only_modes = ['sets','tvshows','seasons','actors','directors','unknown','video','set','movie','tvshow','season','episode']
|
|
if xbmc.getInfoLabel('Window.Property(xmlfile)') == 'MyVideoNav.xml' and content_type in song_only_modes:
|
|
content_type = ''
|
|
if xbmc.getInfoLabel('Window.Property(xmlfile)') == 'MyMusicNav.xml' and content_type in video_only_modes:
|
|
content_type = ''
|
|
|
|
if description == '':
|
|
description = this_module.getLocalizedString(30837)
|
|
|
|
if Data_Type(url) == 'dict':
|
|
url = repr(url)
|
|
|
|
if Data_Type(info_labels) != 'dict':
|
|
dialog.ok('WRONG INFO LABELS', 'Please check documentation, these should be sent through as a dictionary.')
|
|
|
|
if Data_Type(set_art) != 'dict':
|
|
dialog.ok('WRONG SET_ART', 'Please check documentation, these should be sent through as a dictionary.')
|
|
|
|
if Data_Type(set_property) != 'dict':
|
|
dialog.ok('WRONG SET_PROPERTY', 'Please check documentation, these should be sent through as a dictionary.')
|
|
|
|
# Set the default title, filename and plot if not sent through already via info_labels
|
|
try:
|
|
title = info_labels["Title"]
|
|
if title == '':
|
|
info_labels["Title"] = name
|
|
except:
|
|
info_labels["Title"] = name
|
|
|
|
try:
|
|
filename = info_labels["FileName"]
|
|
# if filename == '':
|
|
# info_labels["FileName"] = name
|
|
except:
|
|
info_labels["FileName"] = name
|
|
|
|
try:
|
|
plot = info_labels["plot"]
|
|
if plot == '':
|
|
info_labels["plot"] = description
|
|
except:
|
|
info_labels["plot"] = description
|
|
# Set default thumbnail image used for listing (if not sent through via set_art)
|
|
try:
|
|
set_art["icon"]
|
|
except:
|
|
set_art["icon"] = icon
|
|
|
|
# Set default Fanart if not already sent through via set_property
|
|
try:
|
|
set_property["Fanart_Image"] = fanart
|
|
except:
|
|
set_property["Fanart_Image"]
|
|
|
|
# Set the main listitem properties
|
|
liz = xbmcgui.ListItem(label=str(name), iconImage=str(icon), thumbnailImage=str(icon))
|
|
|
|
# Set the infolabels
|
|
liz.setInfo(type=content_type, infoLabels=info_labels)
|
|
|
|
# Set the artwork
|
|
liz.setArt(set_art)
|
|
|
|
# Loop through the set_property list and set each item in there
|
|
for item in set_property.items():
|
|
liz.setProperty(item[0], item[1])
|
|
|
|
# Add a context item (if details for context items are sent through)
|
|
if context_items:
|
|
liz.addContextMenuItems(context_items, context_override)
|
|
|
|
u = sys.argv[0]
|
|
u += "?mode=" +str(mode)
|
|
u += "&url=" +Convert_Special(url,string=True)
|
|
u += "&name=" +urllib.quote_plus(name)
|
|
u += "&iconimage=" +urllib.quote_plus(icon)
|
|
u += "&fanart=" +urllib.quote_plus(fanart)
|
|
u += "&description=" +urllib.quote_plus(description)
|
|
|
|
if url.startswith('plugin://'):
|
|
xbmcplugin.addDirectoryItem(handle=addon_handle,url=url,listitem=liz,isFolder=True)
|
|
|
|
elif folder:
|
|
xbmcplugin.addDirectoryItem(handle=addon_handle,url=u,listitem=liz,isFolder=True)
|
|
|
|
elif playable:
|
|
liz.setProperty('IsPlayable', 'true')
|
|
xbmcplugin.addDirectoryItem(handle=addon_handle,url=url,listitem=liz,isFolder=False)
|
|
|
|
else:
|
|
xbmcplugin.addDirectoryItem(handle=addon_handle,url=u,listitem=liz,isFolder=False)
|
|
#----------------------------------------------------------------
|
|
def Default_Mode():
|
|
""" internal command ~"""
|
|
dialog = xbmcgui.Dialog()
|
|
dialog.ok('MODE ERROR','You\'ve tried to call Add_Dir() without a valid mode, check you\'ve added the mode into the master_modes dictionary')
|
|
#---------------------------------------------------------------- |