September 2018 Update
Added - Koding AIO to repo as addons depend on it Updated - DefCon now has 2018 talks in
This commit is contained in:
225
script.module.python.koding.aio/lib/koding/directory.py
Normal file
225
script.module.python.koding.aio/lib/koding/directory.py
Normal file
@@ -0,0 +1,225 @@
|
||||
# -*- 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')
|
||||
#----------------------------------------------------------------
|
||||
Reference in New Issue
Block a user