# This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. """ Plugin for Launching an applications """ # main imports import sys import os import xbmc import xbmcgui import xbmcplugin import time import re import urllib BASE_PATH = os.getcwd() print BASE_PATH try: from xbmcaddon import Addon # source path for launchers data PLUGIN_DATA_PATH = xbmc.translatePath( os.path.join( "special://profile/addon_data", "plugin.program.launcher") ) __settings__ = Addon( id="plugin.program.launcher" ) __language__ = __settings__.getLocalizedString print "Mode AddOn ON" print PLUGIN_DATA_PATH except : # source path for launchers data PLUGIN_DATA_PATH = xbmc.translatePath( os.path.join( "special://profile/plugin_data", "programs", sys.modules[ "__main__" ].__plugin__) ) __settings__ = xbmcplugin __language__ = __language__ print "Mode plugin ON" print PLUGIN_DATA_PATH # source path for launchers data BASE_CURRENT_SOURCE_PATH = os.path.join( PLUGIN_DATA_PATH , "launchers.xml" ) SHORTCUT_FILE = os.path.join( PLUGIN_DATA_PATH , "shortcut.cut" ) THUMBS_PATH = os.path.join( PLUGIN_DATA_PATH , "thumbs" ) REMOVE_COMMAND = "%%REMOVE%%" ADD_COMMAND = "%%ADD%%" IMPORT_COMMAND = "%%IMPORT%%" SCAN_COMMAND = "%%SCAN%%" RENAME_COMMAND = "%%RENAME%%" SET_THUMB_COMMAND = "%%SETTHUMB%%" WAIT_TOGGLE_COMMAND = "%%WAIT_TOGGLE%%" COMMAND_ARGS_SEPARATOR = "^^" SEARCH_COMMAND = "%%SEARCH%%"#search SEARCH_ALL_COMMAND = "%%SEARCH_ALL%%"#search all # breaks the plugin partly # when using # xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s/%s)" % (self._path, launcherName, search, SEARCH_COMMAND)) # for example #pDialog = xbmcgui.DialogProgress() #pDialog.create( sys.modules[ "__main__" ].__plugin__ ) class Main: BASE_CACHE_PATH = xbmc.translatePath(os.path.join( "special://profile/Thumbnails", "Pictures" )) launchers = {} ''' initializes plugin and run the requiered action arguments: argv[0] - the path of the plugin (supplied by XBMC) argv[1] - the handle of the plugin (supplied by XBMC) argv[2] - one of the following (__language__( 30000 ) and 'rom' can be any launcher name or rom name created with the plugin) : /launcher - open the specific launcher (if exists) and browse its roms if the launcher is standalone - run it. /launcher/rom - run the specifiec rom using it's launcher. ignore command if doesn't exists. /launcher/%%REMOVE%% - remove the launcher /launcher/%%ADD%% - add a new rom (open wizard) /launcher/rom/%%REMOVE%% - remove the rom /launcher/%%IMPORT%% - import roms from rom path into launcher /launcher/%%SCAN%% - scan for launcher & roms data from the internet /launcher/rom/%%SCAN%% - scan for rom data from the internet /launcher/%%WAIT_TOGGLE%% - toggle wait state /%%ADD%% - add a new launcher (open wizard) (blank) - open a list of the available launchers. if no launcher exists - open the launcher creation wizard. ''' def __init__( self ): # store an handle pointer self._handle = int(sys.argv[ 1 ]) print self._handle self._path = sys.argv[ 0 ] # get users preference self._get_settings() self._load_launchers(self.get_xml_source()) # if a commmand is passed as parameter param = sys.argv[ 2 ] if param: param = param[1:] command = param.split(COMMAND_ARGS_SEPARATOR) dirname = os.path.dirname(command[0]) basename = os.path.basename(command[0]) # check the action needed if (dirname): launcher = dirname rom = basename if (rom == REMOVE_COMMAND): # check if it is a single rom or a launcher if (not os.path.dirname(launcher)): self._remove_launcher(launcher) else: self._remove_rom(os.path.dirname(launcher), os.path.basename(launcher)) if (rom == RENAME_COMMAND): # check if it is a single rom or a launcher if (not os.path.dirname(launcher)): self._rename_launcher(launcher) else: self._rename_rom(os.path.dirname(launcher), os.path.basename(launcher)) elif (rom == SCAN_COMMAND): # check if it is a single rom scan or a launcher scan if (not os.path.dirname(launcher)): self._scan_launcher(launcher) else: romname = os.path.basename(launcher) launcher = os.path.dirname(launcher) self._search_thumb(launcher, romname) elif (rom == SET_THUMB_COMMAND): thumb = command[1] # check if it is a single rom or a launcher if (not os.path.dirname(launcher)): self._set_thumb(launcher, "", thumb) else: romname = os.path.basename(launcher) launcher = os.path.dirname(launcher) self._set_thumb(launcher, romname, thumb) elif (rom == ADD_COMMAND): self._add_new_rom(launcher) elif (rom == IMPORT_COMMAND): self._import_roms(launcher) elif (rom == WAIT_TOGGLE_COMMAND): self._toggle_wait(launcher) elif (rom == SEARCH_COMMAND):#search # check if we need to get user input or search the rom list if (not os.path.dirname(launcher)): self._find_roms(launcher) else: romname = os.path.basename(launcher) launcher = os.path.dirname(launcher) self._find_add_roms(launcher, romname) elif (rom == SEARCH_ALL_COMMAND):#search all # check if we need to get user input or search the rom list self._find_add_all_roms(launcher) else: self._run_rom(launcher, rom) else: launcher = basename if (launcher == SEARCH_ALL_COMMAND):#search all # check if we need to get user input or search the rom list self._find_all_roms() # if it's an add command elif (launcher == ADD_COMMAND): self._add_new_launcher() else: # if there is no rompath (a standalone launcher) if (self.launchers[launcher]["rompath"] == ""): # launch it self._run_launcher(launcher) else: # otherwise, list the roms self._get_roms(launcher) else: # otherwise get the list of the programs in the current folder if (not self._get_launchers()): # if no launcher found - attempt to add a new one if (self._add_new_launcher()): self._get_launchers() else: xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=False , cacheToDisc=False) def _remove_rom(self, launcher, rom): dialog = xbmcgui.Dialog() ret = dialog.yesno(__language__( 30000 ), __language__( 30010 ) % rom) if (ret): self.launchers[launcher]["roms"].pop(rom) self._save_launchers() xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s)" % (self._path, launcher)) def _remove_launcher(self, launcherName): dialog = xbmcgui.Dialog() ret = dialog.yesno(__language__( 30000 ), __language__( 30010 ) % launcherName) if (ret): self.launchers.pop(launcherName) self._save_launchers() xbmc.executebuiltin("ReplaceWindow(Programs,%s)" % (self._path)) def _rename_rom(self, launcher, rom): keyboard = xbmc.Keyboard(self.launchers[launcher]["roms"][rom]["name"], __language__( 30018 )) keyboard.doModal() if (keyboard.isConfirmed()): self.launchers[launcher]["roms"][rom]["name"] = keyboard.getText() self._save_launchers() xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s)" % (self._path, launcher)) def _rename_launcher(self, launcherName): keyboard = xbmc.Keyboard(self.launchers[launcherName]["name"], __language__( 30025 )) keyboard.doModal() if (keyboard.isConfirmed()): self.launchers[launcherName]["name"] = keyboard.getText() self._save_launchers() xbmc.executebuiltin("ReplaceWindow(Programs,%s)" % (self._path)) def _run_launcher(self, launcherName): if (self.launchers.has_key(launcherName)): launcher = self.launchers[launcherName] if (os.environ.get( "OS", "xbox" ) == "xbox"): xbmc.executebuiltin('XBMC.Runxbe(' + launcher["application"] + ')') else: if (sys.platform == 'win32'): if (launcher["wait"] == "true"): cmd = "System.ExecWait" else: cmd = "System.Exec" #this minimizes xbmc some apps seems to need it xbmc.executehttpapi("Action(199)") xbmc.executebuiltin("%s(\\\"%s\\\" \\\"%s\\\")" % (cmd, launcher["application"], launcher["args"])) #this brings xbmc back xbmc.executehttpapi("Action(199)") elif (sys.platform.startswith('linux')): #this minimizes xbmc some apps seems to need it xbmc.executehttpapi("Action(199)") os.system("%s %s" % (launcher["application"], launcher["args"])) #this brings xbmc back xbmc.executehttpapi("Action(199)") elif (sys.platform.startswith('darwin')): #this minimizes xbmc some apps seems to need it xbmc.executehttpapi("Action(199)") os.system("\"%s\" %s" % (launcher["application"], launcher["args"])) #this brings xbmc back xbmc.executehttpapi("Action(199)") else: pass; # unsupported platform def _run_rom(self, launcherName, romName): if (self.launchers.has_key(launcherName)): launcher = self.launchers[launcherName] if (launcher["roms"].has_key(romName)): rom = self.launchers[launcherName]["roms"][romName] if (os.environ.get( "OS", "xbox" ) == "xbox"): f=open(SHORTCUT_FILE, "wb") f.write("\n") f.write(" " + launcher["application"] + "\n") f.write(" \n") f.write(" " + rom["filename"] + "\n") f.write(" \n") f.write("\n") f.close() xbmc.executebuiltin('XBMC.Runxbe(' + SHORTCUT_FILE + ')') else: if (sys.platform == 'win32'): if (launcher["wait"] == "true"): cmd = "System.ExecWait" else: cmd = "System.Exec" xbmc.executebuiltin("%s(\\\"%s\\\" %s \\\"%s\\\")" % (cmd, launcher["application"], launcher["args"], rom["filename"])) elif (sys.platform.startswith('linux')): #this minimizes xbmc some apps seems to need it xbmc.executehttpapi("Action(199)") os.system("\"%s\" %s \"%s\"" % (launcher["application"], launcher["args"], rom["filename"])) #this brings xbmc back xbmc.executehttpapi("Action(199)") elif (sys.platform.startswith('darwin')): os.system("\"%s\" %s \"%s\"" % (launcher["application"], launcher["args"], rom["filename"])) else: pass; # unsupported platform ''' get an xml data from an xml file ''' def get_xml_source( self ): try: usock = open( BASE_CURRENT_SOURCE_PATH, 'r' ) # read source xmlSource = usock.read() # close socket usock.close() ok = True except: # oops print error message print "ERROR: %s::%s (%d) - %s" % ( self.__class__.__name__, sys.exc_info()[ 2 ].tb_frame.f_code.co_name, sys.exc_info()[ 2 ].tb_lineno, sys.exc_info()[ 1 ], ) ok = False if ( ok ): # return the xml string without \n\r (newline) return xmlSource.replace("\n","").replace("\r","") else: return "" def _save_launchers (self): # make settings directory if doesn't exists if (not os.path.isdir(os.path.dirname(BASE_CURRENT_SOURCE_PATH))): os.makedirs(os.path.dirname(BASE_CURRENT_SOURCE_PATH)); usock = open( BASE_CURRENT_SOURCE_PATH, 'w' ) usock.write("\n") usock.write("\n") for launcherIndex in self.launchers: launcher = self.launchers[launcherIndex] usock.write("\t\n") usock.write("\t\t"+launcher["name"]+"\n") usock.write("\t\t"+launcher["application"]+"\n") usock.write("\t\t"+launcher["args"]+"\n") usock.write("\t\t"+launcher["rompath"]+"\n") usock.write("\t\t"+launcher["romext"]+"\n") usock.write("\t\t"+launcher["thumb"]+"\n") usock.write("\t\t"+launcher["fanart"]+"\n") usock.write("\t\t"+launcher["genre"]+"\n") usock.write("\t\t"+launcher["release"]+"\n") usock.write("\t\t"+launcher["company"]+"\n") usock.write("\t\t"+launcher["plot"]+"\n") usock.write("\t\t"+launcher["wait"]+"\n") usock.write("\t\t\n") for romIndex in launcher["roms"]: romdata = launcher["roms"][romIndex] usock.write("\t\t\t\n") usock.write("\t\t\t\t"+romdata["name"]+"\n") usock.write("\t\t\t\t"+romdata["filename"]+"\n") usock.write("\t\t\t\t"+romdata["thumb"]+"\n") usock.write("\t\t\t\t"+romdata["fanart"]+"\n") usock.write("\t\t\t\t"+romdata["genre"]+"\n") usock.write("\t\t\t\t"+romdata["release"]+"\n") usock.write("\t\t\t\t"+romdata["company"]+"\n") usock.write("\t\t\t\t"+romdata["plot"]+"\n") usock.write("\t\t\t\n") usock.write("\t\t\n") usock.write("\t\n") usock.write("") usock.close() ''' read the list of launchers and roms from launchers.xml file ''' def _load_launchers( self , xmlSource): launchers = re.findall( "(.*?)", xmlSource ) print "Launcher: found %d launchers" % ( len(launchers) ) for launcher in launchers: name = re.findall( "(.*?)", launcher ) application = re.findall( "(.*?)", launcher ) args = re.findall( "(.*?)", launcher ) rompath = re.findall( "(.*?)", launcher ) romext = re.findall( "(.*?)", launcher ) thumb = re.findall( "(.*?)", launcher ) fanart = re.findall( "(.*?)", launcher ) genre = re.findall( "(.*?)", launcher ) release = re.findall( "(.*?)", launcher ) company = re.findall( "(.*?)", launcher ) plot = re.findall( "(.*?)", launcher ) wait = re.findall( "(.*?)", launcher ) romsxml = re.findall( "(.*?)", launcher ) if len(name) > 0 : name = name[0] else: name = "unknown" if len(application) > 0 : application = application[0] else: application = "" if len(args) > 0 : args = args[0] else: args = "" if len(rompath) > 0 : rompath = rompath[0] else: rompath = "" if len(romext) > 0: romext = romext[0] else: romext = "" if len(thumb) > 0: thumb = thumb[0] else: thumb = "" if len(fanart) > 0: fanart = fanart[0] else: fanart = "" if len(genre) > 0: genre = genre[0] else: genre = "" if len(release) > 0: release = release[0] else: release = "" if len(company) > 0: company = company[0] else: company = "" if len(plot) > 0: plot = plot[0] else: plot = "" if len(wait) > 0: wait = wait[0] else: wait = "" roms = {} for rom in romsxml: romname = re.findall( "(.*?)", rom ) romfilename = re.findall( "(.*?)", rom ) romthumb = re.findall( "(.*?)", rom ) romfanart = re.findall( "(.*?)", rom ) romgenre = re.findall( "(.*?)", rom ) romrelease = re.findall( "(.*?)", rom ) romcompany = re.findall( "(.*?)", rom ) romplot = re.findall( "(.*?)", rom ) if len(romname) > 0 : romname = romname[0] else: romname = "unknown" if len(romfilename) > 0 : romfilename = romfilename[0] else: romfilename = "" if len(romthumb) > 0 : romthumb = romthumb[0] else: romthumb = "" if len(romfanart) > 0 : romfanart = romfanart[0] else: romfanart = "" if len(romgenre) > 0 : romgenre = romgenre[0] else: romgenre = "" if len(romrelease) > 0 : romrelease = romrelease[0] else: romrelease = "" if len(romcompany) > 0 : romcompany = romcompany[0] else: romcompany = "" if len(romplot) > 0 : romplot = romplot[0] else: romplot = "" # prepare rom object data romdata = {} romdata["name"] = romname romdata["filename"] = romfilename romdata["thumb"] = romthumb romdata["fanart"] = romfanart romdata["genre"] = romgenre romdata["release"] = romrelease romdata["company"] = romcompany romdata["plot"] = romplot # add rom to the roms list (using name as index) roms[romname] = romdata # prepare launcher object data launcherdata = {} launcherdata["name"] = name launcherdata["application"] = application launcherdata["args"] = args launcherdata["rompath"] = rompath launcherdata["romext"] = romext launcherdata["thumb"] = thumb launcherdata["fanart"] = fanart launcherdata["genre"] = genre launcherdata["release"] = release launcherdata["company"] = company launcherdata["plot"] = plot launcherdata["wait"] = wait launcherdata["roms"] = roms # add launcher to the launchers list (using name as index) self.launchers[name] = launcherdata def _get_launchers( self ): if (len(self.launchers) > 0): for key in sorted(self.launchers.iterkeys()): self._add_launcher(self.launchers[key]["name"], self.launchers[key]["application"], self.launchers[key]["rompath"], self.launchers[key]["romext"], self.launchers[key]["thumb"], self.launchers[key]["fanart"], self.launchers[key]["genre"], self.launchers[key]["release"], self.launchers[key]["company"], self.launchers[key]["plot"], self.launchers[key]["wait"], self.launchers[key]["roms"], len(self.launchers)) xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) return True else: return False def _get_roms( self, launcherName ): if (self.launchers.has_key(launcherName)): selectedLauncher = self.launchers[launcherName] roms = selectedLauncher["roms"] print "Launcher: %s : found %d roms " % (launcherName, len(roms)) if (len(roms) > 0) : for key in sorted(roms.iterkeys()): self._add_rom(launcherName, roms[key]["name"], roms[key]["filename"], roms[key]["thumb"], roms[key]["fanart"], roms[key]["genre"], roms[key]["release"], roms[key]["company"], roms[key]["plot"], len(roms)) else: dialog = xbmcgui.Dialog() ret = dialog.yesno(__language__( 30000 ), __language__( 30013 )) if (ret): self._import_roms(launcherName, addRoms = True) xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) return True else: return False def _search_thumb(self, launcherName, romname): search_engine = self._get_search_engine() pDialog.update( 0, __language__( 30031 ) % (launcherName, romname, self.settings[ "search_engine" ]) ) if (romname) : search_string = "%s %s" % (romname, launcherName) else: search_string = "%s" % (launcherName) results = search_engine.search(search_string) stopSearch = False while (len(results)==0 and not stopSearch): keyboard = xbmc.Keyboard(search_string, __language__( 30034 )) keyboard.doModal() if (keyboard.isConfirmed()): search_string = keyboard.getText() results = search_engine.search(search_string) else: stopSearch = True if (len(results)>0): dialog = xbmcgui.Dialog() thumbs = [] total = len(results) for result in results: thumbnail = self._get_thumbnail(result["thumb"]) listitem = xbmcgui.ListItem( "%s (%s)" % (result["title"], result["url"]), iconImage="DefaultProgram.png", thumbnailImage=thumbnail ) xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s/%s%s%s" % (self._path, launcherName, romname, SET_THUMB_COMMAND, COMMAND_ARGS_SEPARATOR, result["url"]), listitem=listitem, isFolder=False, totalItems=total) xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) def _set_thumb(self, launcherName, romname, url): self.url = url # download thumb urllib.urlretrieve( url, None, self._report_hook ) # copy it into thumbs path path = self.settings[ "thumbs_path" ] filepath = os.path.join(path, os.path.basename(url)) pDialog.update( 100, __language__( 30032 )) xbmc.sleep( 50 ) xbmc.executehttpapi( "FileCopy(%s,%s)" % (url, filepath, ) ) launcher = self.launchers[launcherName] if (romname): rom = launcher["roms"][romname] rom["thumb"] = filepath else: launcher["thumb"] = filepath self._save_launchers() # returning back to the previous window if (romname): xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s)" % (self._path, launcherName)) else: xbmc.executebuiltin("ReplaceWindow(Programs,%s)" % (self._path)) def _report_hook( self, count, blocksize, totalsize ): percent = int( float( count * blocksize * 100) / totalsize ) msg1 = __language__( 30033 ) % ( os.path.split( self.url )[ 1 ], ) pDialog.update( percent, msg1 ) if ( pDialog.iscanceled() ): raise def _scan_launcher(self, launchername): self._search_thumb(launchername, "") self._save_launchers() def _import_roms(self, launcherName, addRoms = False): dialog = xbmcgui.Dialog() romsCount = 0 filesCount = 0 skipCount = 0 selectedLauncher = self.launchers[launcherName] pDialog = xbmcgui.DialogProgress() path = selectedLauncher["rompath"] exts = selectedLauncher["romext"] roms = selectedLauncher["roms"] #remove dead entries if (len(roms) > 0): i = 0 removedRoms = 0 ret = pDialog.create(__language__( 30000 ), __language__( 30501 ) % (path)); for key in sorted(roms.iterkeys()): pDialog.update(i * 100 / len(roms)) i += 1 if (not os.path.isfile(roms[key]["filename"])): del roms[key] removedRoms += 1 pDialog.close() if not (removedRoms == 0): xbmc.executebuiltin("XBMC.Notification(%s,%s, 6000)" % (__language__( 30000 ), __language__( 30502 ) % (removedRoms))) ret = pDialog.create(__language__( 30000 ), __language__( 30014 ) % (path)); files = os.listdir(path) for f in files: pDialog.update(filesCount * 100 / len(files)) fullname = os.path.join(path, f) for ext in exts.split("|"): romadded = False if f.upper().endswith("." + ext.upper()): romname = f[:-len(ext)-1].capitalize() if (not roms.has_key(romname)): # prepare rom object data romdata = {} romname = f[:-len(ext)-1].capitalize() romdata["name"] = romname romdata["filename"] = fullname #try the filename of the rom with different extension to get a valid thumbnail thumb = self._get_local_thumb(fullname) if thumb: romdata["thumb"] = thumb else: romdata["thumb"] = "" romdata["fanart"] = "" romdata["genre"] = "" romdata["release"] = "" romdata["company"] = "" romdata["plot"] = "" # add rom to the roms list (using name as index) roms[romname] = romdata romsCount = romsCount + 1 if (addRoms): self._add_rom(launcherName, romdata["name"], romdata["filename"], romdata["thumb"], romdata["fanart"], romdata["genre"], romdata["release"], romdata["company"], romdata["plot"], len(files)) romadded = True if not romadded: skipCount = skipCount + 1 filesCount = filesCount + 1 pDialog.close() self._save_launchers() if (skipCount == 0): xbmc.executebuiltin("XBMC.Notification(%s,%s, 6000)" % (__language__( 30000 ), __language__( 30015 ) % (romsCount) + " " + __language__( 30050 ))) #dialog.ok(__language__( 30000 ), (__language__( 30015 )+ "\n" + __language__( 30050 )) % (romsCount)) else: xbmc.executebuiltin("XBMC.Notification(%s,%s, 12000)" % (__language__( 30000 ), __language__( 30016 ) % (romsCount, skipCount) + " " + __language__( 30050 ))) #dialog.ok(__language__( 30000 ), (__language__( 30016 )+ "\n" + __language__( 30050 )) % (romsCount, skipCount)) def _get_thumbnail( self, thumbnail_url ): # make the proper cache filename and path so duplicate caching is unnecessary if ( not thumbnail_url.startswith( "http://" ) ): return thumbnail_url try: filename = xbmc.getCacheThumbName( thumbnail_url ) filepath = xbmc.translatePath( os.path.join( self.BASE_CACHE_PATH, filename[ 0 ], filename ) ) # if the cached thumbnail does not exist fetch the thumbnail if ( not os.path.isfile( filepath ) ): # fetch thumbnail and save to filepath info = urllib.urlretrieve( thumbnail_url, filepath ) # cleanup any remaining urllib cache urllib.urlcleanup() return filepath except: # return empty string if retrieval failed print "ERROR: %s::%s (%d) - %s" % ( self.__class__.__name__, sys.exc_info()[ 2 ].tb_frame.f_code.co_name, sys.exc_info()[ 2 ].tb_lineno, sys.exc_info()[ 1 ], ) return "" def _get_thumb(self, displayName, fileName): exts = ['png', 'jpg', 'gif', 'bmp'] for ext in exts: thumbfilename = os.path.join(self.settings[ "thumbs_path" ], "%s.%s" % (displayName, ext)) if (os.path.isfile(thumbfilename)): return thumbfilename thumbfilename = os.path.join(self.settings[ "thumbs_path" ], "%s.%s" % (os.path.basename(fileName).split(".")[0], ext)) if (os.path.isfile(thumbfilename)): return thumbfilename def _add_launcher(self, name, cmd, path, ext, thumb, fanart, genre, release, company, plot, wait, roms, total) : commands = [] commands.append((__language__( 30512 ), "XBMC.RunPlugin(%s?%s)" % (self._path, SEARCH_ALL_COMMAND) , ))#search all commands.append((__language__( 30511 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, name, SEARCH_COMMAND) , ))#search if (path == ""): folder = False icon = "DefaultProgram.png" else: folder = True icon = "DefaultFolder.png" commands.append((__language__( 30105 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, name, IMPORT_COMMAND) , )) commands.append((__language__( 30106 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, name, ADD_COMMAND) , )) #not working anymore #commands.append((__language__( 30102 ), "ReplaceWindow(Programs,%s?%s/%s)" % (self._path, name, SCAN_COMMAND) , )) commands.append((__language__( 30107 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, name, RENAME_COMMAND) , )) if (sys.platform == "win32"): commands.append((__language__( 30103 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, name, WAIT_TOGGLE_COMMAND) , )) commands.append((__language__( 30101 ), "XBMC.RunPlugin(%s?%s)" % (self._path, ADD_COMMAND) , )) commands.append((__language__( 30104 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, name, REMOVE_COMMAND) , )) if (thumb): thumbnail = thumb else: thumbnail = self._get_thumb(name, cmd) if (thumbnail): listitem = xbmcgui.ListItem( name, iconImage=icon, thumbnailImage=thumbnail) else: listitem = xbmcgui.ListItem( name, iconImage=icon ) listitem.setProperty("fanart_image", fanart) listitem.setProperty( "releasedate", release ) listitem.setInfo( "video", { "Title": name, "Plot" : plot , "Studio" : company , "Genre" : genre } ) listitem.addContextMenuItems( commands ) xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s" % (self._path, name), listitem=listitem, isFolder=folder, totalItems=total) def _add_rom( self, launcher, name, cmd , thumb, romfanart, romgenre, romrelease, romcompany, romplot, total): if (thumb): thumbnail = thumb else: thumbnail = self._get_thumb(name, cmd) icon = "DefaultProgram.png" if (thumbnail): listitem = xbmcgui.ListItem( name, iconImage=icon, thumbnailImage=thumbnail) else: listitem = xbmcgui.ListItem( name, iconImage=icon ) listitem.setProperty("fanart_image", romfanart) listitem.setProperty( "releasedate", romrelease ) listitem.setInfo( "video", { "Title": name, "Plot" : romplot , "Studio" : romcompany , "Genre" : romgenre } ) commands = [] commands.append(( __language__( 30511 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, launcher, SEARCH_COMMAND) , ))#search #not working anymore #commands.append(( __language__( 30102 ), "ReplaceWindow(Programs,%s?%s/%s/%s)" % (self._path, launcher, name, SCAN_COMMAND) , )) commands.append(( __language__( 30107 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, launcher, name, RENAME_COMMAND) , )) commands.append(( __language__( 30104 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, launcher, name, REMOVE_COMMAND) , )) listitem.addContextMenuItems( commands ) xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s" % (self._path, launcher, name), listitem=listitem, isFolder=False, totalItems=total) def _add_new_rom ( self , launcherName) : dialog = xbmcgui.Dialog() launcher = self.launchers[launcherName] ext = launcher["romext"] roms = launcher["roms"] rompath = launcher["rompath"] romfile = dialog.browse(1, __language__( 30017 ),"files", "."+ext, False, False, rompath) if (romfile): title=os.path.basename(romfile).split(".")[0].capitalize() keyboard = xbmc.Keyboard(title, __language__( 30018 )) keyboard.doModal() if (keyboard.isConfirmed()): title = keyboard.getText() # prepare rom object data romdata = {} romdata["name"] = title romdata["filename"] = romfile romdata["thumb"] = "" # add rom to the roms list (using name as index) roms[title] = romdata xbmc.executebuiltin("XBMC.Notification(%s,%s, 6000)" % (__language__( 30000 ), __language__( 30019 ) + " " + __language__( 30050 ))) #xbmcgui.Dialog().ok(__language__( 30000 ), __language__( 30019 )+ "\n" + __language__( 30050 )) self._save_launchers() def _add_new_launcher ( self ) : dialog = xbmcgui.Dialog() type = dialog.select(__language__( 30020 ), [__language__( 30021 ), __language__( 30022 )]) if (os.environ.get( "OS", "xbox" ) == "xbox"): filter = ".xbe|.cut" else: if (sys.platform == "win32"): filter = ".bat|.exe|.cmd" else: filter = "" if (type == 0): app = xbmcgui.Dialog().browse(1,__language__( 30023 ),"files",filter) if (app): argkeyboard = xbmc.Keyboard("", __language__( 30024 )) argkeyboard.doModal() if (argkeyboard.isConfirmed()): args = argkeyboard.getText(); title = os.path.basename(app).split(".")[0].capitalize() keyboard = xbmc.Keyboard(title, __language__( 30025 )) keyboard.doModal() if (keyboard.isConfirmed()): title = keyboard.getText() # prepare launcher object data launcherdata = {} launcherdata["name"] = title launcherdata["application"] = app launcherdata["args"] = args launcherdata["rompath"] = "" launcherdata["romext"] = "" #try the filename with different extension to get a valid thumbnail thumb = self._get_local_thumb(app) if thumb: launcherdata["thumb"] = thumb else: launcherdata["thumb"] = "" launcherdata["fanart"] = "" launcherdata["genre"] = "" launcherdata["release"] = "" launcherdata["company"] = "" launcherdata["plot"] = "" launcherdata["wait"] = "true" launcherdata["roms"] = {} # add launcher to the launchers list (using name as index) self.launchers[title] = launcherdata self._save_launchers() xbmc.executebuiltin("ReplaceWindow(Programs,%s)" % (self._path)) return True elif (type == 1): app = xbmcgui.Dialog().browse(1,__language__( 30023 ),"files",filter) if (app): argkeyboard = xbmc.Keyboard("", __language__( 30024 )) argkeyboard.doModal() if (argkeyboard.isConfirmed()): args = argkeyboard.getText(); path = xbmcgui.Dialog().browse(0,__language__( 30027 ),"files", "", False, False, os.path.dirname(app)) if (path): extkey = xbmc.Keyboard("", __language__( 30028 )) extkey.doModal() if (extkey.isConfirmed()): ext = extkey.getText() title = os.path.basename(app).split(".")[0].capitalize() keyboard = xbmc.Keyboard(title, __language__( 30025 )) keyboard.doModal() if (keyboard.isConfirmed()): title = keyboard.getText() # prepare launcher object data launcherdata = {} launcherdata["name"] = title launcherdata["application"] = app launcherdata["args"] = args launcherdata["rompath"] = path launcherdata["romext"] = ext #try the filename and path with different extension to get a valid thumbnail thumb = self._get_local_thumb(path[:-1] + ".dir") print "thumbs_path: " + path print "thumbs_app: " + app if thumb: launcherdata["thumb"] = thumb else: thumb = self._get_local_thumb(app) if thumb: launcherdata["thumb"] = thumb else: launcherdata["thumb"] = "" launcherdata["fanart"] = "" launcherdata["genre"] = "" launcherdata["release"] = "" launcherdata["company"] = "" launcherdata["plot"] = "" launcherdata["wait"] = "true" launcherdata["roms"] = {} # add launcher to the launchers list (using name as index) self.launchers[title] = launcherdata self._save_launchers() xbmc.executebuiltin("ReplaceWindow(Programs,%s)" % (self._path)) return True return False def _toggle_wait( self, launcher ): # toggle wait state if (self.launchers[launcher]["wait"] == "true"): self.launchers[launcher]["wait"] = "false" xbmc.executebuiltin("XBMC.Notification(%s,%s, 6000)" % (__language__( 30000 ), __language__( 30029 ) )) #xbmcgui.Dialog().ok(__language__( 30000 ), __language__( 30029 )) else: self.launchers[launcher]["wait"] = "true" xbmc.executebuiltin("XBMC.Notification(%s,%s, 6000)" % (__language__( 30000 ), __language__( 30030 ) )) #xbmcgui.Dialog().ok(__language__( 30000 ), __language__( 30030 )) self._save_launchers() def _get_search_engine( self ): exec "import resources.search_engines.%s.search_engine as search_engine" % ( self.settings[ "search_engine" ], ) return search_engine.SearchEngine() def _get_settings( self ): self.settings = {} self.settings[ "thumbs_path" ] = THUMBS_PATH try: self.settings[ "search_engine" ] = __settings__.getSetting( int(sys.argv[1]),"search_engine" ) except: self.settings[ "search_engine" ] = __settings__.getSetting( "search_engine" ) if (not os.path.isdir(os.path.dirname(self.settings[ "thumbs_path" ]))): os.makedirs(os.path.dirname(self.settings[ "thumbs_path" ])); def _get_local_thumb( self, filename ): exts = ['png', 'jpg', 'gif', 'bmp'] for ext in exts: #try with chnaged extension thumb = filename[:-len(os.path.splitext(filename)[-1])] + "." + ext if (os.path.isfile(thumb)): return thumb #also try with original extension thumb = filename + "." + ext if (os.path.isfile(thumb)): return thumb def _find_all_roms( self ): #get user input to search for keyboard = xbmc.Keyboard("", __language__( 30024 )) keyboard.doModal() if (keyboard.isConfirmed()): search = keyboard.getText() xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s)" % (self._path, search, SEARCH_ALL_COMMAND)) def _find_add_all_roms( self, search ): #sorted by name if (len(self.launchers) > 0): rl = {} for key in sorted(self.launchers.iterkeys()): launcherName = self.launchers[key]["name"] selectedLauncher = self.launchers[launcherName] roms = selectedLauncher["roms"] text = search.lower(); print "Launcher: %s : searching for %s " % (launcherName, text) if (len(roms) > 0) : #go through rom list and search for user input for keyr in sorted(roms.iterkeys()): romname = roms[keyr]["name"].lower() if (not romname.find(text) == -1): rl[keyr] = roms[keyr] rl[keyr]["launcherName"] = launcherName print roms[keyr]["filename"] #print the list sorted print "Launcher: (ALL) : search found %d roms" % (len(rl)) for key in sorted(rl.iterkeys()): self._add_rom(rl[key]["launcherName"], rl[key]["name"], rl[key]["filename"], rl[key]["thumb"], rl[key]["fanart"], rl[key]["genre"], rl[key]["release"], rl[key]["company"], rl[key]["plot"], len(rl)) print "Launcher: %s : add %s" % (rl[key]["launcherName"], rl[key]["name"]) xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) # #sorted by launcher # if (len(self.launchers) > 0): # i = 0 # for key in sorted(self.launchers.iterkeys()): # i += 1 # self._find_add_roms(self.launchers[key]["name"], search, (len(self.launchers) == i)) def _find_roms( self, launcherName ): #get user input to search for keyboard = xbmc.Keyboard("", __language__( 30024 )) keyboard.doModal() if (keyboard.isConfirmed()): search = keyboard.getText() xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s/%s)" % (self._path, launcherName, search, SEARCH_COMMAND)) def _find_add_roms ( self, launcherName, search, lastone=True ): if (self.launchers.has_key(launcherName)): selectedLauncher = self.launchers[launcherName] roms = selectedLauncher["roms"] text = search.lower(); print "Launcher: %s : searching for %s " % (launcherName, text) if (len(roms) > 0) : #go through rom list and search for user input for key in sorted(roms.iterkeys()): romname = roms[key]["name"].lower() if (not romname.find(text) == -1): self._add_rom(launcherName, roms[key]["name"], roms[key]["filename"], roms[key]["thumb"], roms[key]["fanart"], roms[key]["genre"], roms[key]["release"], roms[key]["company"], roms[key]["plot"], len(roms)) if (lastone): xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) return True else: return False