diff --git a/addon.xml b/addon.xml new file mode 100644 index 0000000..f52a4c7 --- /dev/null +++ b/addon.xml @@ -0,0 +1,17 @@ + + + + + + + video + + + Example Kodi Video Plugin + An example video plugin for Kodi mediacenter. + Free sample videos are provided by www.vidsplay.com. + + diff --git a/default.py b/default.py new file mode 100644 index 0000000..ed4568b --- /dev/null +++ b/default.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- +# Module: default +# Author: Roman V. M. +# Created on: 28.11.2014 +# License: GPL v.3 https://www.gnu.org/copyleft/gpl.html + +import sys +from urlparse import parse_qsl +import xbmcgui +import xbmcplugin + +# Get the plugin url in plugin:// notation. +__url__ = sys.argv[0] +# Get the plugin handle as an integer number. +__handle__ = int(sys.argv[1]) + +# Free sample videos are provided by www.vidsplay.com +# Here we use a fixed set of properties simply for demonstrating purposes +# In a "real life" plugin you will need to get info and links to video files/streams +# 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'}, + {'name': 'Alligator', + 'thumb': 'http://www.vidsplay.com/vids/alligator.jpg', + 'video': 'http://www.vidsplay.com/vids/alligator.mp4'}, + {'name': 'Turtle', + 'thumb': 'http://www.vidsplay.com/vids/turtle.jpg', + 'video': 'http://www.vidsplay.com/vids/turtle.mp4'} + ], + 'Cars': [{'name': 'Postal Truck', + 'thumb': 'http://www.vidsplay.com/vids/us_postal.jpg', + 'video': 'http://www.vidsplay.com/vids/us_postal.mp4'}, + {'name': 'Traffic', + 'thumb': 'http://www.vidsplay.com/vids/traffic1.jpg', + 'video': 'http://www.vidsplay.com/vids/traffic1.avi'}, + {'name': 'Traffic Arrows', + 'thumb': 'http://www.vidsplay.com/vids/traffic_arrows.jpg', + 'video': 'http://www.vidsplay.com/vids/traffic_arrows.mp4'} + ], + 'Food': [{'name': 'Chicken', + 'thumb': 'http://www.vidsplay.com/vids/chicken.jpg', + 'video': 'http://www.vidsplay.com/vids/bbqchicken.mp4'}, + {'name': 'Hamburger', + 'thumb': 'http://www.vidsplay.com/vids/hamburger.jpg', + 'video': 'http://www.vidsplay.com/vids/hamburger.mp4'}, + {'name': 'Pizza', + 'thumb': 'http://www.vidsplay.com/vids/pizza.jpg', + 'video': 'http://www.vidsplay.com/vids/pizza.mp4'} + ]} + + +def get_categories(): + """ + Get the list of video categories. + Here you can insert some parsing code that retrieves + the list of video categories (e.g. 'Movies', 'TV-shows', 'Documentaries' etc.) + from some site or server. + :return: list + """ + return VIDEOS.keys() + + +def get_videos(category): + """ + Get the list of videofiles/streams. + Here you can insert some parsing code that retrieves + the list of videostreams in a given category from some site or server. + :param category: str + :return: list + """ + return VIDEOS[category] + + +def list_categories(): + """ + Create the list of video categories in the Kodi interface. + :return: None + """ + # Get video categories + categories = get_categories() + # Iterate through categories + for category in categories: + # Create a list item with a text label and a thumbnail image. + list_item = xbmcgui.ListItem(label=category, thumbnailImage=VIDEOS[category][0]['thumb']) + # 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']) + # 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) + # 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__) + + +def list_videos(category): + """ + Create the list of playable videos in the Kodi interface. + :param category: str + :return: None + """ + # Get the list of videos in the category. + videos = get_videos(category) + # Iterate through videos. + for video in videos: + # Create a list item with a text label and a thumbnail image. + list_item = xbmcgui.ListItem(label=video['name'], thumbnailImage=video['thumb']) + # 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 'IsPlayable' property to 'true'. + # This is mandatory for playable items! + list_item.setProperty('IsPlayable', 'true') + # Create a URL for the plugin recursive callback. + # 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) + # Finish creating a virtual folder. + xbmcplugin.endOfDirectory(__handle__) + + +def play_video(path): + """ + Play a video by the provided path. + :param path: str + :return: None + """ + # Create a playable item with a path to play. + play_item = xbmcgui.ListItem(path=path) + # Pass the item to the Kodi player. + xbmcplugin.setResolvedUrl(__handle__, True, listitem=play_item) + + +def router(paramstring): + """ + Router function that calls other functions + depending on the provided paramstring + :param paramstring: + :return: + """ + # Parse a URL-encoded paramstring to the dictionary of + # {: } elements + params = dict(parse_qsl(paramstring[1:])) + # Check the parameters passed to the plugin + if params: + if params['action'] == 'listing': + # Display the list of videos in a provided category. + list_videos(params['category']) + elif params['action'] == 'play': + # Play a video from a provided URL. + play_video(params['video']) + else: + # If the plugin is called from Kodi UI without any parameters, + # display the list of video categories + list_categories() + + +if __name__ == '__main__': + # Call the router function and pass the plugin call parameters to it. + router(sys.argv[2]) diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..f3cdd9e Binary files /dev/null and b/icon.png differ