-
Notifications
You must be signed in to change notification settings - Fork 87
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Roman Miroshnychenko (Work)
committed
Aug 31, 2015
1 parent
f9c60d2
commit cb3a19b
Showing
3 changed files
with
184 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<addon id="plugin.video.example" | ||
version="0.0.1" | ||
name="Example Kodi Video Plugin" | ||
provider-name="Roman_V_M"> | ||
<requires> | ||
<import addon="xbmc.python" version="2.14.0"/> | ||
</requires> | ||
<extension point="xbmc.python.pluginsource" library="default.py"> | ||
<provides>video</provides> | ||
</extension> | ||
<extension point="xbmc.addon.metadata"> | ||
<summary lang="en">Example Kodi Video Plugin</summary> | ||
<description lang="en">An example video plugin for Kodi mediacenter.</description> | ||
<disclaimer lang="en">Free sample videos are provided by www.vidsplay.com.</disclaimer> | ||
</extension> | ||
</addon> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
# {<parameter>: <value>} 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]) |