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() # Set up the backend #self._load_launchers(self.get_xml_source()) # TODO: Make this a user setting if we get more backends, sqlite etc? self.storage_backend = XMLStorageBackend(PLUGIN_DATA_PATH) self.launchers = self.storage_backend.get_launchers() # 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)
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() # Set up the backend #self._load_launchers(self.get_xml_source()) # TODO: Make this a user setting if we get more backends, sqlite etc? self.storage_backend = XMLStorageBackend(PLUGIN_DATA_PATH) self.launchers = self.storage_backend.get_launchers() # 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.storage_backend.save_launchers(self.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.storage_backend.save_launchers(self.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.storage_backend.save_launchers(self.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.storage_backend._save_launchers(self.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("<shortcut>\n") f.write(" <path>" + launcher["application"] + "</path>\n") f.write(" <custom>\n") f.write(" <game>" + rom["filename"] + "</game>\n") f.write(" </custom>\n") f.write("</shortcut>\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("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n") # usock.write("<launchers>\n") # for launcherIndex in self.launchers: # launcher = self.launchers[launcherIndex] # usock.write("\t<launcher>\n") # usock.write("\t\t<name>"+launcher["name"]+"</name>\n") # usock.write("\t\t<application>"+launcher["application"]+"</application>\n") # usock.write("\t\t<args>"+launcher["args"]+"</args>\n") # usock.write("\t\t<rompath>"+launcher["rompath"]+"</rompath>\n") # usock.write("\t\t<romext>"+launcher["romext"]+"</romext>\n") # usock.write("\t\t<thumb>"+launcher["thumb"]+"</thumb>\n") # usock.write("\t\t<wait>"+launcher["wait"]+"</wait>\n") # usock.write("\t\t<roms>\n") # for romIndex in launcher["roms"]: # romdata = launcher["roms"][romIndex] # usock.write("\t\t\t<rom>\n") # usock.write("\t\t\t\t<name>"+romdata["name"]+"</name>\n") # usock.write("\t\t\t\t<filename>"+romdata["filename"]+"</filename>\n") # usock.write("\t\t\t\t<thumb>"+romdata["thumb"]+"</thumb>\n") # usock.write("\t\t\t</rom>\n") # usock.write("\t\t</roms>\n") # usock.write("\t</launcher>\n") # usock.write("</launchers>") # usock.close() # # ''' read the list of launchers and roms from launchers.xml file ''' # def _load_launchers( self , xmlSource): # launchers = re.findall( "<launcher>(.*?)</launcher>", xmlSource ) # print "Launcher: found %d launchers" % ( len(launchers) ) # for launcher in launchers: # name = re.findall( "<name>(.*?)</name>", launcher ) # application = re.findall( "<application>(.*?)</application>", launcher ) # args = re.findall( "<args>(.*?)</args>", launcher ) # rompath = re.findall( "<rompath>(.*?)</rompath>", launcher ) # romext = re.findall( "<romext>(.*?)</romext>", launcher ) # thumb = re.findall( "<thumb>(.*?)</thumb>", launcher ) # wait = re.findall( "<wait>(.*?)</wait>", launcher ) # romsxml = re.findall( "<rom>(.*?)</rom>", 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(wait) > 0: wait = wait[0] # else: wait = "" # # roms = {} # for rom in romsxml: # romname = re.findall( "<name>(.*?)</name>", rom ) # romfilename = re.findall( "<filename>(.*?)</filename>", rom ) # romthumb = re.findall( "<thumb>(.*?)</thumb>", 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 = "" # # # prepare rom object data # romdata = {} # romdata["name"] = romname # romdata["filename"] = romfilename # romdata["thumb"] = romthumb # # # 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["wait"] = wait # launcherdata["roms"] = roms # # # add launcher to the launchers list (using name as index) # self.launchers[name] = launcherdata def _get_launchers( self ): if self.launchers: 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]["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"], 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.storage_backend._save_launchers(self.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.storage_backend.save_launchers(self.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"] = "" # 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"], len(files)) romadded = True if not romadded: skipCount = skipCount + 1 filesCount = filesCount + 1 #pDialog.close() self.storage_backend.save_launchers(self.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, 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.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, 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 ) 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.storage_backend.save_launchers(self.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["wait"] = "true" launcherdata["roms"] = {} # add launcher to the launchers list (using name as index) self.launchers[title] = launcherdata self.storage_backend.save_launchers(self.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["wait"] = "true" launcherdata["roms"] = {} # add launcher to the launchers list (using name as index) if not self.launchers: self.launchers = {} self.launchers[title] = launcherdata self.storage_backend.save_launchers(self.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.storage_backend.save_launchers(self.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"], 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"], len(roms)) if (lastone): xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) return True else: return False