From a433b569c4309b2d62aaa2f235abb6fed4f86f52 Mon Sep 17 00:00:00 2001 From: "Roman Miroshnychenko (Work)" Date: Mon, 31 Aug 2015 14:59:06 +0300 Subject: [PATCH] Updated code using best practices, added setInfo for list items --- addon.xml | 2 +- main.py | 62 ++++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/addon.xml b/addon.xml index c9f7958..6bf97d1 100644 --- a/addon.xml +++ b/addon.xml @@ -1,6 +1,6 @@ diff --git a/main.py b/main.py index ed4568b..6b6cbd8 100644 --- a/main.py +++ b/main.py @@ -20,33 +20,42 @@ __handle__ = int(sys.argv[1]) # from some web-site or online service. VIDEOS = {'Animals': [{'name': 'Crab', 'thumb': 'http://www.vidsplay.com/vids/crab.jpg', - 'video': 'http://www.vidsplay.com/vids/crab.mp4'}, + 'video': 'http://www.vidsplay.com/vids/crab.mp4', + 'genre': 'Animals'}, {'name': 'Alligator', 'thumb': 'http://www.vidsplay.com/vids/alligator.jpg', - 'video': 'http://www.vidsplay.com/vids/alligator.mp4'}, + 'video': 'http://www.vidsplay.com/vids/alligator.mp4', + 'genre': 'Animals'}, {'name': 'Turtle', 'thumb': 'http://www.vidsplay.com/vids/turtle.jpg', - 'video': 'http://www.vidsplay.com/vids/turtle.mp4'} + 'video': 'http://www.vidsplay.com/vids/turtle.mp4', + 'genre': 'Animals'} ], 'Cars': [{'name': 'Postal Truck', 'thumb': 'http://www.vidsplay.com/vids/us_postal.jpg', - 'video': 'http://www.vidsplay.com/vids/us_postal.mp4'}, + 'video': 'http://www.vidsplay.com/vids/us_postal.mp4', + 'genre': 'Cars'}, {'name': 'Traffic', 'thumb': 'http://www.vidsplay.com/vids/traffic1.jpg', - 'video': 'http://www.vidsplay.com/vids/traffic1.avi'}, + 'video': 'http://www.vidsplay.com/vids/traffic1.avi', + 'genre': 'Cars'}, {'name': 'Traffic Arrows', 'thumb': 'http://www.vidsplay.com/vids/traffic_arrows.jpg', - 'video': 'http://www.vidsplay.com/vids/traffic_arrows.mp4'} + 'video': 'http://www.vidsplay.com/vids/traffic_arrows.mp4', + 'genre': 'Cars'} ], 'Food': [{'name': 'Chicken', 'thumb': 'http://www.vidsplay.com/vids/chicken.jpg', - 'video': 'http://www.vidsplay.com/vids/bbqchicken.mp4'}, + 'video': 'http://www.vidsplay.com/vids/bbqchicken.mp4', + 'genre': 'Food'}, {'name': 'Hamburger', 'thumb': 'http://www.vidsplay.com/vids/hamburger.jpg', - 'video': 'http://www.vidsplay.com/vids/hamburger.mp4'}, + 'video': 'http://www.vidsplay.com/vids/hamburger.mp4', + 'genre': 'Food'}, {'name': 'Pizza', 'thumb': 'http://www.vidsplay.com/vids/pizza.jpg', - 'video': 'http://www.vidsplay.com/vids/pizza.mp4'} + 'video': 'http://www.vidsplay.com/vids/pizza.mp4', + 'genre': 'Food'} ]} @@ -79,6 +88,8 @@ def list_categories(): """ # Get video categories categories = get_categories() + # Create a list for our items. + listing = [] # Iterate through categories for category in categories: # Create a list item with a text label and a thumbnail image. @@ -86,12 +97,23 @@ def list_categories(): # Set a fanart image for the list item. # Here we use the same image as the thumbnail for simplicity's sake. list_item.setProperty('fanart_image', VIDEOS[category][0]['thumb']) + # Set additional info for the list item. + # Here we use a category name for both properties for for simplicity's sake. + # setInfo allows to set various information for an item. + # For available properties see the following link: + # http://mirrors.xbmc.org/docs/python-docs/15.x-isengard/xbmcgui.html#ListItem-setInfo + list_item.setInfo('video', {'title': category, 'genre': category}) # Create a URL for the plugin recursive callback. # Example: plugin://plugin.video.example/?action=listing&category=Animals url = '{0}?action=listing&category={1}'.format(__url__, category) - # Add the list item to a virtual Kodi folder. - # isFolder=True means that this item opens a sub-list of lower level items. - xbmcplugin.addDirectoryItem(__handle__, url, list_item, isFolder=True) + # is_folder = True means that this item opens a sub-list of lower level items. + is_folder = True + # Add our item to the listing as a 3-element tuple. + listing.append((url, list_item, is_folder)) + # Add our listing to Kodi. + # Large lists and/or slower systems benefit from adding all items at once via addDirectoryItems + # instead of adding one by ove via addDirectoryItem. + xbmcplugin.addDirectoryItems(__handle__, listing, len(listing)) # Add a sort method for the virtual folder items (alphabetically, ignore articles) xbmcplugin.addSortMethod(__handle__, xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE) # Finish creating a virtual folder. @@ -106,6 +128,8 @@ def list_videos(category): """ # Get the list of videos in the category. videos = get_videos(category) + # Create a list for our items. + listing = [] # Iterate through videos. for video in videos: # Create a list item with a text label and a thumbnail image. @@ -113,6 +137,8 @@ def list_videos(category): # Set a fanart image for the list item. # Here we use the same image as the thumbnail for simplicity's sake. list_item.setProperty('fanart_image', video['thumb']) + # Set additional info for the list item. + list_item.setInfo('video', {'title': video['name'], 'genre': video['genre']}) # Set 'IsPlayable' property to 'true'. # This is mandatory for playable items! list_item.setProperty('IsPlayable', 'true') @@ -120,8 +146,16 @@ def list_videos(category): # Example: plugin://plugin.video.example/?action=play&video=http://www.vidsplay.com/vids/crab.mp4 url = '{0}?action=play&video={1}'.format(__url__, video['video']) # Add the list item to a virtual Kodi folder. - # isFolder=False means that this item won't open any sub-list. - xbmcplugin.addDirectoryItem(__handle__, url, list_item, isFolder=False) + # is_folder = False means that this item won't open any sub-list. + is_folder = False + # Add our item to the listing as a 3-element tuple. + listing.append((url, list_item, is_folder)) + # Add our listing to Kodi. + # Large lists and/or slower systems benefit from adding all items at once via addDirectoryItems + # instead of adding one by ove via addDirectoryItem. + xbmcplugin.addDirectoryItems(__handle__, listing, len(listing)) + # Add a sort method for the virtual folder items (alphabetically, ignore articles) + xbmcplugin.addSortMethod(__handle__, xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE) # Finish creating a virtual folder. xbmcplugin.endOfDirectory(__handle__)