175 lines
12 KiB
Python
175 lines
12 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
# License: GPL (http://www.gnu.org/licenses/gpl-3.0.html)
|
|
# Addon: VidScraper
|
|
# Author: Oli Passey (DoubleT)
|
|
|
|
#----------------------------------------------------------------
|
|
|
|
import os # access operating system commands
|
|
import urlparse # splits up the directory path - much easier importing this than coding it up ourselves
|
|
import xbmc # the base xbmc functions, pretty much every add-on is going to need at least one function from here
|
|
import xbmcaddon # pull addon specific information such as settings, id, fanart etc.
|
|
import xbmcgui # gui based functions, contains things like creating dialog pop-up windows
|
|
import xbmcplugin # contains functions required for creating directory structure style add-ons (plugins)
|
|
|
|
# (*) = These modules require the noobsandnerds repo to be installed
|
|
import koding # (*) a framework for easy add-on development, this template is to be used in conjunction with this module.
|
|
|
|
from koding import Add_Dir # By importing something like this we don't need to use <module>.<function> to call it,
|
|
# instead you can just use the function name - in this case Add_Dir().
|
|
|
|
from koding import route, Run # These are essential imports which allow us to open directories and navigate through the add-on.
|
|
|
|
#----------------------------------------------------------------
|
|
|
|
addon_id = xbmcaddon.Addon().getAddonInfo('id') # Grab our add-on id
|
|
dialog = xbmcgui.Dialog() # A basic dialog message command
|
|
home_folder = xbmc.translatePath('special://home/')# Convert the special path of Kodi home folder to the physical path
|
|
addon_folder = os.path.join(home_folder,'addons') # Join our folder above with 'addons' so we have a link to our addons folder
|
|
art_path = os.path.join(addon_folder,addon_id) # Join addons folder with the addon_id, we'll use this as a basic art folder
|
|
debug = koding.Addon_Setting('debug') # Grab the setting of our debug mode in add-on settings
|
|
|
|
#----------------------------------------------------------------
|
|
"""
|
|
SECTION 5:
|
|
Add our custom functions in here, it's VERY important these go in this section
|
|
as the code in section 6 relies on these functions. If that code tries to run
|
|
before these functions are declared the add-on will fail.
|
|
|
|
You'll notice each function in here has a decorator above it (an @route() line of code),
|
|
this assigns a mode to the function so it can be called with Add_Dir and it also tells
|
|
the code what paramaters to send through. For example you'll notice the Main_Menu() function
|
|
we've assigned to the mode "main" - this means if we ever want to get Add_Dir to open that
|
|
function we just use the mode "main". This particular function does not require any extra
|
|
params to be sent through but if you look at the Testing() function you'll see we send through
|
|
2 different paramaters (url and description), if you look at the Add_Dir function in Main_Menu()
|
|
you'll see we've sent these through as a dictionary. Using that same format you can send through
|
|
as many different params as you wish.
|
|
"""
|
|
|
|
#-----------------------------------------------------------
|
|
# EDIT THIS MAIN_MENU() FUNCTION - THIS IS FUN TO PLAY WITH!
|
|
#-----------------------------------------------------------
|
|
@route(mode="main")
|
|
def Main_Menu():
|
|
|
|
# Only show koding tutorials if debug mode is enabled in addon settings
|
|
if debug=='true':
|
|
Add_Dir(name='KODING TUTORIALS', url='', mode='tutorials', folder=True, icon=os.path.join(art_path,'icon.png'), fanart=os.path.join(art_path,'fanart.jpg'))
|
|
|
|
Add_Dir(name='TEST DIALOG', url='{"my_text":"My First Add-on[CR]Woohooo!!!","my_desc":"test description"}', mode='testing', folder=False, icon=os.path.join(art_path,'icon.png'), fanart=os.path.join(art_path,'fanart.jpg'))
|
|
|
|
# Once you've played with the above try uncommenting each of the following lines one by one.
|
|
# After uncommenting a line re-run the add-on to see your changes take place.
|
|
|
|
# Add_Dir(name='OPEN FOLDER - TEST MODE', url='test_mode', mode='open_folder', folder=True, icon=os.path.join(art_path,'icon.png'), fanart=os.path.join(art_path,'fanart.jpg'))
|
|
# Add_Dir(name='OPEN FOLDER - NO URL', url='', mode='open_folder', folder=True, icon=os.path.join(art_path,'icon.png'), fanart=os.path.join(art_path,'fanart.jpg'))
|
|
# Add_Dir(name='VIDEO EXAMPLES', url='', mode='video_examples', folder=True, icon=os.path.join(art_path,'icon.png'), fanart=os.path.join(art_path,'fanart.jpg'), description='A couple of test videos for you to look at.', content_type='video')
|
|
# Add_Dir(name='MUSIC EXAMPLE', url='', mode='music_examples', folder=True, icon=os.path.join(art_path,'icon.png'), fanart=os.path.join(art_path,'fanart.jpg'),content_type='song')
|
|
|
|
# This is our test zone, this just calls the Test_Function mode so feel free to play with the code in that function.
|
|
# Add_Dir(name='TESTING ZONE', url='{"test1":"this is","test2":"some example","test3":"text"}', mode='test_function', folder=False, icon=os.path.join(art_path,'icon.png'), fanart=os.path.join(art_path,'fanart.jpg'))
|
|
#-----------------------------
|
|
@route(mode="test_function", args=["test1","test2","test3"])
|
|
def Test_Function(test1, test2, test3):
|
|
# Example of sending multiple variables through the Add_Dir function
|
|
xbmc.log(test1,2)
|
|
xbmc.log(test2,2)
|
|
xbmc.log(test3,2)
|
|
dialog.ok('CHECK THE LOG','Take a look at your log, you should be able to see the 3 lines of example text we sent through.')
|
|
#-----------------------------
|
|
@route(mode="open_folder", args=["url"])
|
|
def Test_Folder(url):
|
|
if url == 'test_mode':
|
|
dialog.ok('Test Mode','open_folder has been called with the url being "test_mode". When you click OK you should open into and empty folder - this is because folder=True in our Add_Dir()')
|
|
else:
|
|
dialog.ok('TRY THESE EXAMPLES','If you\'ve left the mode as the default you\'ll receive a message explaining the mode does not exist. Feel free to change this to a mode that does exist.')
|
|
Add_Dir(name='EXAMPLE FOLDER', url='', mode='changeme', folder=True, icon=os.path.join(art_path,'icon.png'), fanart=os.path.join(art_path,'fanart.jpg'))
|
|
Add_Dir(name='EXAMPLE ITEM', url='', mode='changeme', folder=False, icon=os.path.join(art_path,'icon.png'), fanart=os.path.join(art_path,'fanart.jpg'))
|
|
Add_Dir(name='EXAMPLE BAD FUNCTION', url='', mode='bad_function', folder=False, icon=os.path.join(art_path,'icon.png'), fanart=os.path.join(art_path,'fanart.jpg'))
|
|
#-----------------------------
|
|
@route(mode="bad_function")
|
|
def Bad_Function():
|
|
if debug != 'true':
|
|
dialog.ok('SET DEBUG TO TRUE','Go into your add-on settings and set debug mode to True then run this again. If debug is set to true we have proper error reporting in place to help your add-on development.')
|
|
koding.Open_Settings(focus='1.1')
|
|
xbmc.log(this_should_error)
|
|
#-----------------------------
|
|
@route(mode='testing', args=["my_text","my_desc"])
|
|
def Testing(my_text,my_desc):
|
|
dialog.ok('TEST','Here are the params we recieved in Testing() function:', 'my_text: [COLOR=dodgerblue]%s[/COLOR]' % my_text,'my_desc: [COLOR=dodgerblue]%s[/COLOR]'%my_desc)
|
|
#-----------------------------
|
|
@route(mode="video_examples")
|
|
def Video_Examples():
|
|
"""
|
|
Below are some examples showing Add_Dir() with some artwork and infolabels sent through including trailer link for a movie
|
|
You would obviously use some sort of automated loop to auto-generate this info for large lists but hopefully this example may help
|
|
"""
|
|
Add_Dir(name='[COLOR=dodgerblue][TV][/COLOR] Fraggle Rock S03E21', url='episode_dialog', mode='scrape_sites', folder=False, content_type='Video',
|
|
icon='https://images-na.ssl-images-amazon.com/images/M/MV5BNzg0MzQwODY3N15BMl5BanBnXkFtZTgwMjA2OTEwMjE@._V1_SY1000_CR0,0,789,1000_AL_.jpg',
|
|
fanart='https://images-na.ssl-images-amazon.com/images/M/MV5BMjI0MjI4NTEwNV5BMl5BanBnXkFtZTgwMzA4NTQ2MjE@._V1_.jpg',
|
|
info_labels={"season":"03", "episode":"21", "genre":"Kids", "plot":"Get your cares away, worries for another day...", "mpaa":"U"})
|
|
|
|
Add_Dir(name='[COLOR=dodgerblue][MOVIE][/COLOR] Trainspotting', url='movie_dialog', mode='scrape_sites', folder=False, content_type='Video',
|
|
icon='https://images-na.ssl-images-amazon.com/images/M/MV5BMzA5Zjc3ZTMtMmU5YS00YTMwLWI4MWUtYTU0YTVmNjVmODZhXkEyXkFqcGdeQXVyNjU0OTQ0OTY@._V1_UX182_CR0,0,182,268_AL_.jpg',
|
|
fanart='https://images-na.ssl-images-amazon.com/images/M/MV5BMTMxNjE3NzU2Nl5BMl5BanBnXkFtZTcwMzI0OTAyNg@@._V1_.jpg',
|
|
info_labels={"originaltitle":"Trainspotting","genre":"crime,british", "plot":"Trainspotting is an awesome movie!", "mpaa":"18", "trailer":"plugin://plugin.video.youtube/play/?video_id=nBKWnAdmJJ8"})
|
|
dialog.ok('CLICK INFO','Try bringing up the info for these items, you should see our artwork and other metadata has been populated.')
|
|
#-----------------------------
|
|
@route(mode="music_examples")
|
|
def Music_Examples():
|
|
"""
|
|
This is an example of adding a song, there's a good chance the scaper will find no results for this song,
|
|
it's only here as an example to show how to set things like artwork.
|
|
"""
|
|
Add_Dir(name='Sally Cinnamon - Stone Roses', url='song_dialog', mode='scrape_sites', folder=False,
|
|
icon='http://images.rapgenius.com/7929026cc89ab0c77669dee5cc323da9.530x528x1.jpg',
|
|
fanart='http://www.flickofthefinger.co.uk/wp-content/uploads/2016/03/the-stone-roses-1.jpg',
|
|
info_labels={"genre":"Rock,Inde,British", "artist":"Stone Roses", "title":"Sally Cinnamon"})
|
|
#-----------------------------
|
|
@route(mode="scrape_sites", args=["url"])
|
|
def Scrape_Sites(list_type):
|
|
"""
|
|
This is a dummy function, you would add whatever code you require in here for grabbing the content.
|
|
Please do not use this function for scraping copyright infringing content. If you need a site to test with
|
|
archive.org has a good library of public domain music and video files.
|
|
"""
|
|
content = ''
|
|
if list_type == 'movie_dialog':
|
|
dolog('Add your code to scrape for a movie')
|
|
elif list_type == 'episode_dialog':
|
|
dolog('Add your code to scrape for a tv show')
|
|
elif list_type == 'song_dialog':
|
|
dolog('Add your code to scrape for a song')
|
|
|
|
# If the item returned is a dictionary that's great we know we have a list to work with
|
|
if koding.Data_Type(content) == 'dict':
|
|
xbmc.log(repr(content),2)
|
|
playback = koding.Play_Video(video=content["url"], showbusy=True)
|
|
|
|
# It may be a plugin or direct url has been sent through, if so lets use the list_type variable
|
|
elif not list_type.endswith('_dialog'):
|
|
playback = koding.Play_Video(video=list_type, showbusy=True)
|
|
|
|
# Nothing useful has been found, lets exit back to the list
|
|
else:
|
|
return
|
|
|
|
# If the playback returned as True then it was successful but if it was False we know we need to try again for another source
|
|
if not playback:
|
|
if dialog.yesno('PLAYBACK FAILED','The video may have been removed, the web host may have altered their code or this video may not be available in your region. [COLOR=dodgerblue]Would you like to try another source?[/COLOR]'):
|
|
Scrape_Sites(list_type)
|
|
|
|
#----------------------------------------------------------------
|
|
|
|
"""
|
|
SECTION 6:
|
|
Essential if creating list items, this tells kodi we're done creating our list items.
|
|
The list will not populate without this. In the run command you need to set default to
|
|
whatever route you want to open into, in this example the 'main' route which opens the
|
|
Main_Menu() function up at the top.
|
|
"""
|
|
if __name__ == "__main__":
|
|
Run(default='main')
|
|
xbmcplugin.endOfDirectory(int(sys.argv[1])) |