From d38a02ac5e2b04243f0ad210225a09545fb7dce5 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Wed, 13 Mar 2013 16:03:36 -0400 Subject: [PATCH 01/80] modify .gitignore rules --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index ded6067..2772041 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,6 @@ var sdist develop-eggs .installed.cfg -lib lib64 __pycache__ From a508797cbfb6b6d56d0b837da081cf89f24aded9 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Wed, 13 Mar 2013 16:04:34 -0400 Subject: [PATCH 02/80] add missing lib directory --- resources/lib/__init__.py | 1 + resources/lib/emulators.py | 98 ++ resources/lib/file_item.py | 20 + resources/lib/launcher_plugin.py | 2700 ++++++++++++++++++++++++++++++ resources/lib/subprocess_hack.py | 1150 +++++++++++++ 5 files changed, 3969 insertions(+) create mode 100644 resources/lib/__init__.py create mode 100644 resources/lib/emulators.py create mode 100644 resources/lib/file_item.py create mode 100644 resources/lib/launcher_plugin.py create mode 100644 resources/lib/subprocess_hack.py diff --git a/resources/lib/__init__.py b/resources/lib/__init__.py new file mode 100644 index 0000000..ee074ac --- /dev/null +++ b/resources/lib/__init__.py @@ -0,0 +1 @@ +# Dummy file to make this directory a package. diff --git a/resources/lib/emulators.py b/resources/lib/emulators.py new file mode 100644 index 0000000..08d5bc0 --- /dev/null +++ b/resources/lib/emulators.py @@ -0,0 +1,98 @@ +# -*- coding: UTF-8 -*- + +import os +import re +import urllib + +def _get_program_arguments( app ): + # Based on the app. name, retrieve the default arguments for the app. + app = app.lower() + applications = { + 'bsnes': '"%rom%"', + 'chromium': '-kiosk "%rom%"', + 'dosbox': '"%rom%" -fullscreen', + 'epsxe': '-nogui -loadiso "%rom%"', + 'fbas': '-g %romname%', + 'fceux': '"%rom%"', + 'fusion': '"%rom%"', + 'gens': '--fs --quickexit "%rom%"', + 'lxdream': '-f "%rom%"', + 'mame': '"%rom%"', + 'mednafen': '-fs 1 "%rom%"', + 'mess': '-cart "%rom%" -skip_gameinfo -nowindow -nonewui', + 'mupen64plus': '--nogui --noask --noosd --fullscreen "%rom%"', + 'nestopia': '"%rom%"', + 'nullDC': '-config ImageReader:defaultImage="%rom%"', + 'osmose': '-fs "%rom%"', + 'project64': '%rom%', + 'vbam': '--opengl=MODE --fullscreen -f 15 --no-show-speed "%rom%"', + 'visualboyadvance': '"%rom%"', + 'x64': '-fullscreen -autostart "%rom%"', + 'xbmc': 'PlayMedia(%rom%)', + 'yabause': '-a -f -i "%rom%"', + 'zsnes': '-m -s -v 22 "%rom%"', + 'zsnesw': '-m -s -v 41 "%rom%"', + 'explorer.exe': '%rom%', + } + for application, arguments in applications.iteritems(): + if (app.find(application) >= 0): + return arguments + return '"%rom%"' + + +def _get_program_extensions( app ): + # Based on the app. name, retrieve the recognized extension of the app. + app = app.lower() + applications = { + 'bsnes': 'zip|smc|sfc', + 'chromium': 'swf', + 'dosbox': 'bat', + 'epsxe': 'iso|bin|cue', + 'fbas': 'zip', + 'fceux': 'nes|zip', + 'fusion': 'zip|bin|sms|gg', + 'gens': 'zip|bin', + 'lxdream': 'cdi|iso|bin', + 'mame': 'zip', + 'mednafen': 'zip|pce|gba|gb|gbc|lnx|ngc|ngp|wsc|ws', + 'mess': 'zip|nes|sms|gg|rom|a78|a52|a26|gb|gbc|gba|int|bin|sg|pce|smc', + 'mupen64plus': 'z64|zip|n64', + 'nestopia': 'nes|zip', + 'nullDC': 'gdi|cdi', + 'osmose': 'zip|sms|gg', + 'project64': 'z64|zip|n64', + 'vbam': 'gba|gb|gbc|zip', + 'visualboyadvance': 'gba|gb|gbc|zip', + 'x64': 'zip|d64|c64', + 'yabause': 'cue', + 'zsnes': 'zip|smc|sfc', + 'explorer.exe': 'lnk', + } + for application, extensions in applications.iteritems(): + if (app.find(application) >= 0): + return extensions + return "" + + +def _get_mame_title(filename): + try: + f = urllib.urlopen('http://www.arcadehits.net/index.php?p=roms&jeu='+filename) + page = f.read().replace('\r\n', '').replace('\n', '') + title = ''.join(re.findall('

(.*?)

', page)) + if title != '': + return title + else: + return filename + except: + return filename + + +def _test_bios_file(filename): + try: + f = urllib.urlopen('http://www.arcadehits.net/index.php?p=roms&jeu='+filename) + page = f.read().replace('\r\n', '').replace('\n', '').replace('\r', '').replace(' ', '') + game_genre = re.findall('Genre:   (.*?)>(.*?)', page) + if ( game_genre[0][1].lower() == 'bios' ): + return True + except: + return False diff --git a/resources/lib/file_item.py b/resources/lib/file_item.py new file mode 100644 index 0000000..6878240 --- /dev/null +++ b/resources/lib/file_item.py @@ -0,0 +1,20 @@ +# -*- coding: UTF-8 -*- + +import os +import xbmc + +THUMBS_CACHE_PATH = os.path.join( xbmc.translatePath( "special://profile/" ), "Thumbnails" ) + +class Thumbnails: + def get_cached_thumb( self, path1, path2, SPLIT=False ): + # get the locally cached thumb + filename = xbmc.getCacheThumbName( path1 ) + if SPLIT: + thumb = os.path.join( filename[ 0 ], filename ) + else: + thumb = filename + return os.path.join( path2, thumb ) + + def get_cached_covers_thumb( self, strPath ): + return self.get_cached_thumb( strPath, THUMBS_CACHE_PATH, True ) + diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py new file mode 100644 index 0000000..4b79b42 --- /dev/null +++ b/resources/lib/launcher_plugin.py @@ -0,0 +1,2700 @@ +# 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 +""" + +# -*- coding: UTF-8 -* +# main imports +import sys +import os +import fnmatch +import xbmc +import xbmcgui +import xbmcplugin + +import time, datetime +import math +import re +import urllib +import subprocess_hack +import xml.dom.minidom +import socket +import exceptions + +import random +from traceback import print_exc +from operator import itemgetter + +import shutil +from file_item import Thumbnails +thumbnails = Thumbnails() + +try: + # Eden & + compatible + import hashlib +except: + # Dharma compatible + import md5 + +from xbmcaddon import Addon +PLUGIN_DATA_PATH = xbmc.translatePath( os.path.join( "special://profile/addon_data", "plugin.program.advanced.launcher") ) +__settings__ = Addon( id="plugin.program.advanced.launcher" ) +__lang__ = __settings__.getLocalizedString + +def __language__(string): + return __lang__(string).encode('utf-8','ignore') + +# source path for launchers data +BASE_PATH = xbmc.translatePath( os.path.join( "special://" , "profile" ) ) +BASE_CURRENT_SOURCE_PATH = os.path.join( PLUGIN_DATA_PATH , "launchers.xml" ) +TEMP_CURRENT_SOURCE_PATH = os.path.join( PLUGIN_DATA_PATH , "launchers.tmp" ) +SHORTCUT_FILE = os.path.join( PLUGIN_DATA_PATH , "shortcut.cut" ) + +DEFAULT_THUMB_PATH = os.path.join( PLUGIN_DATA_PATH , "thumbs" ) +if not os.path.exists(DEFAULT_THUMB_PATH): os.makedirs(DEFAULT_THUMB_PATH) +DEFAULT_FANART_PATH = os.path.join( PLUGIN_DATA_PATH , "fanarts" ) +if not os.path.exists(DEFAULT_FANART_PATH): os.makedirs(DEFAULT_FANART_PATH) +DEFAULT_NFO_PATH = os.path.join( PLUGIN_DATA_PATH , "nfos" ) +if not os.path.exists(DEFAULT_NFO_PATH): os.makedirs(DEFAULT_NFO_PATH) +DEFAULT_BACKUP_PATH = os.path.join( PLUGIN_DATA_PATH , "backups" ) +if not os.path.exists(DEFAULT_BACKUP_PATH): os.makedirs(DEFAULT_BACKUP_PATH) + +REMOVE_COMMAND = "%%REMOVE%%" +FILE_MANAGER_COMMAND = "%%FILEMANAGER%%" +ADD_COMMAND = "%%ADD%%" +EDIT_COMMAND = "%%EDIT%%" +COMMAND_ARGS_SEPARATOR = "^^" +GET_INFO = "%%GET_INFO%%" +GET_THUMB = "%%GET_THUMB%%" +GET_FANART = "%%GET_FANART%%" +SEARCH_COMMAND = "%%SEARCH%%" +SEARCH_DATE_COMMAND = "%%SEARCH_DATE%%" +SEARCH_PLATFORM_COMMAND = "%%SEARCH_PLATFORM%%" +SEARCH_STUDIO_COMMAND = "%%SEARCH_STUDIO%%" +SEARCH_GENRE_COMMAND = "%%SEARCH_GENRE%%" + +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 + /%%ADD%% - add a new launcher (open wizard) + /launcher/%%GET_INFO%% - get launcher info from configured scraper + /launcher/%%GET_THUMB%% - get launcher thumb from configured scraper + /launcher/%%GET_FANART%% - get launcher fanart from configured scraper + /launcher/rom/%%GET_INFO%% - get rom info from configured scraper + /launcher/rom/%%GET_THUMB%% - get rom thumb from configured scraper + /launcher/rom/%%GET_FANART%% - get rom fanart from configured scraper + + (blank) - open a list of the available launchers. if no launcher exists - open the launcher creation wizard. + ''' + + def __init__( self, *args, **kwargs ): + # store an handle pointer + self._handle = int(sys.argv[ 1 ]) + + self._path = sys.argv[ 0 ] + + # get users preference + self._get_settings() + self._load_launchers(self.get_xml_source(BASE_CURRENT_SOURCE_PATH)) + + # get users scrapers preference + self._get_scrapers() + + # get emulators preference + exec "import resources.lib.emulators as _emulators_data" + self._get_program_arguments = _emulators_data._get_program_arguments + self._get_program_extensions = _emulators_data._get_program_extensions + self._get_mame_title = _emulators_data._get_mame_title + self._test_bios_file = _emulators_data._test_bios_file + + self._print_log(__language__( 30700 )) + + # if a commmand is passed as parameter + param = sys.argv[ 2 ] + + xbmcplugin.addSortMethod(handle=self._handle, sortMethod=xbmcplugin.SORT_METHOD_LABEL) + xbmcplugin.addSortMethod(handle=self._handle, sortMethod=xbmcplugin.SORT_METHOD_VIDEO_YEAR) + xbmcplugin.addSortMethod(handle=self._handle, sortMethod=xbmcplugin.SORT_METHOD_STUDIO) + xbmcplugin.addSortMethod(handle=self._handle, sortMethod=xbmcplugin.SORT_METHOD_GENRE) + xbmcplugin.addSortMethod(handle=self._handle, sortMethod=xbmcplugin.SORT_METHOD_UNSORTED) + + 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)) + elif (rom == EDIT_COMMAND): + # check if it is a single rom or a launcher + if (not os.path.dirname(launcher)): + self._edit_launcher(launcher) + else: + self._edit_rom(os.path.dirname(launcher), os.path.basename(launcher)) + elif (rom == GET_INFO): + # check if it is a single rom or a launcher + if (not os.path.dirname(launcher)): + self._scrap_launcher(launcher) + else: + self._scrap_rom(os.path.dirname(launcher), os.path.basename(launcher)) + elif (rom == GET_THUMB): + # check if it is a single rom or a launcher + if (not os.path.dirname(launcher)): + self._scrap_thumb_launcher(launcher) + else: + self._scrap_thumb_rom(os.path.dirname(launcher), os.path.basename(launcher)) + elif (rom == GET_FANART): + # check if it is a single rom or a launcher + if (not os.path.dirname(launcher)): + self._scrap_fanart_launcher(launcher) + else: + self._scrap_fanart_rom(os.path.dirname(launcher), os.path.basename(launcher)) + elif (rom == ADD_COMMAND): + self._add_roms(launcher) + elif (rom == SEARCH_COMMAND): + self._find_add_roms(launcher) + elif (rom == SEARCH_DATE_COMMAND): + self._find_date_add_roms(launcher) + elif (rom == SEARCH_PLATFORM_COMMAND): + self._find_platform_add_roms(launcher) + elif (rom == SEARCH_STUDIO_COMMAND): + self._find_studio_add_roms(launcher) + elif (rom == SEARCH_GENRE_COMMAND): + self._find_genre_add_roms(launcher) + else: + self._run_rom(launcher, rom) + else: + launcher = basename + + if (launcher == "backup"): + self._print_log(__language__( 30185 )) + backup_file = xbmcgui.Dialog().browse(1,__language__( 30186 ),"files",".xml", False, False, os.path.join(DEFAULT_BACKUP_PATH+"/")) + if (os.path.isfile(backup_file)): + self._load_launchers(self.get_xml_source(backup_file)) + + elif (launcher == SEARCH_COMMAND):#search + # check if we need to get user input or search the rom list + self._find_roms() + + elif (launcher == FILE_MANAGER_COMMAND):#filemanager + self._file_manager() + + # 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: + 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, launcherID, rom): + dialog = xbmcgui.Dialog() + ret = dialog.yesno(__language__( 30000 ), __language__( 30010 ) % self.launchers[launcherID]["roms"][rom]["name"]) + if (ret): + self.launchers[launcherID]["roms"].pop(rom) + self._save_launchers() + if ( len(self.launchers[launcherID]["roms"]) == 0 ): + xbmc.executebuiltin("ReplaceWindow(Programs,%s)" % (self._path)) + else: + xbmc.executebuiltin("Container.Update") + + def _empty_launcher(self, launcherID): + dialog = xbmcgui.Dialog() + ret = dialog.yesno(__language__( 30000 ), __language__( 30133 ) % self.launchers[launcherID]["name"]) + if (ret): + self.launchers[launcherID]["roms"].clear() + self._save_launchers() + xbmc.executebuiltin("Container.Update") + + def _remove_launcher(self, launcherID): + dialog = xbmcgui.Dialog() + ret = dialog.yesno(__language__( 30000 ), __language__( 30010 ) % self.launchers[launcherID]["name"]) + if (ret): + self.launchers.pop(launcherID) + self._save_launchers() + if ( len(self.launchers) == 0 ): + xbmc.executebuiltin("ReplaceWindow(Home)") + else: + xbmc.executebuiltin("Container.Update") + + def _edit_rom(self, launcher, rom): + dialog = xbmcgui.Dialog() + title=os.path.basename(self.launchers[launcher]["roms"][rom]["filename"]) + if (self.launchers[launcher]["roms"][rom]["finished"] == "false"): + finished_display = __language__( 30339 ) + else: + finished_display = __language__( 30340 ) + type = dialog.select(__language__( 30300 ) % title, [__language__( 30338 ),__language__( 30301 ),__language__( 30302 ),__language__( 30303 ),finished_display,__language__( 30323 ),__language__( 30304 )]) + + if (type == 0 ): + # Scrap item (infos and images) + self._full_scrap_rom(launcher,rom) + + if (type == 1 ): + dialog = xbmcgui.Dialog() + + type2 = dialog.select(__language__( 30305 ), [__language__( 30311 ) % self.settings[ "datas_scraper" ],__language__( 30333 ),__language__( 30306 ) % self.launchers[launcher]["roms"][rom]["name"],__language__( 30308 ) % self.launchers[launcher]["roms"][rom]["release"],__language__( 30309 ) % self.launchers[launcher]["roms"][rom]["studio"],__language__( 30310 ) % self.launchers[launcher]["roms"][rom]["genre"],__language__( 30328 ) % self.launchers[launcher]["roms"][rom]["plot"][0:20],__language__( 30316 )]) + # Scrap rom Infos + if (type2 == 0 ): + self._scrap_rom(launcher,rom) + if (type2 == 1 ): + self._import_rom_nfo(launcher,rom) + if (type2 == 2 ): + # Edition of the rom title + keyboard = xbmc.Keyboard(self.launchers[launcher]["roms"][rom]["name"], __language__( 30037 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + title = keyboard.getText() + if ( title == "" ): + title = self.launchers[launcher]["roms"][rom]["name"] + self.launchers[launcher]["roms"][rom]["name"] = title.rstrip() + self._save_launchers() + if (type2 == 3 ): + # Edition of the rom release date + keyboard = xbmc.Keyboard(self.launchers[launcher]["roms"][rom]["release"], __language__( 30038 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self.launchers[launcher]["roms"][rom]["release"] = keyboard.getText() + self._save_launchers() + if (type2 == 4 ): + # Edition of the rom studio name + keyboard = xbmc.Keyboard(self.launchers[launcher]["roms"][rom]["studio"], __language__( 30039 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self.launchers[launcher]["roms"][rom]["studio"] = keyboard.getText() + self._save_launchers() + if (type2 == 5 ): + # Edition of the rom game genre + keyboard = xbmc.Keyboard(self.launchers[launcher]["roms"][rom]["genre"], __language__( 30040 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self.launchers[launcher]["roms"][rom]["genre"] = keyboard.getText() + self._save_launchers() + if (type2 == 6 ): + # Import of the rom game plot + text_file = xbmcgui.Dialog().browse(1,__language__( 30080 ),"files",".txt|.dat", False, False) + if (os.path.isfile(text_file)): + text_plot = open(text_file) + string_plot = text_plot.read() + text_plot.close() + self.launchers[launcher]["roms"][rom]["plot"] = string_plot.replace('"','"') + self._save_launchers() + if (type2 == 7 ): + self._export_rom_nfo(launcher,rom) + + if (type == 2 ): + dialog = xbmcgui.Dialog() + thumb_diag = __language__( 30312 ) % ( self.settings[ "thumbs_scraper" ] ) + if ( self.settings[ "thumbs_scraper" ] == "GameFAQs" ) | ( self.settings[ "thumbs_scraper" ] == "MobyGames" ): + thumb_diag = __language__( 30321 ) % ( self.settings[ "thumbs_scraper" ],self.settings[ "display_game_region" ]) + if ( self.settings[ "thumbs_scraper" ] == "Google" ): + thumb_diag = __language__( 30322 ) % ( self.settings[ "thumbs_scraper" ],self.settings[ "thumb_image_size_display" ].capitalize()) + type2 = dialog.select(__language__( 30302 ), [thumb_diag,__language__( 30332 ),__language__( 30313 )]) + if (type2 == 0 ): + self._scrap_thumb_rom(launcher,rom) + if (type2 == 1 ): + # Import a rom thumbnail image + image = xbmcgui.Dialog().browse(2,__language__( 30041 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(self.launchers[launcher]["thumbpath"])) + if (image): + if (os.path.isfile(image)): + img_ext = os.path.splitext(image)[-1][0:4] + if ( img_ext != '' ): + filename = self.launchers[launcher]["roms"][rom]["filename"] + if (self.launchers[launcher]["thumbpath"] == self.launchers[launcher]["fanartpath"] ): + if (self.launchers[launcher]["thumbpath"] == self.launchers[launcher]["rompath"] ): + file_path = filename.replace("."+filename.split(".")[-1], '_thumb'+img_ext) + else: + file_path = os.path.join(os.path.dirname(self.launchers[launcher]["thumbpath"]),os.path.basename(filename.replace("."+filename.split(".")[-1], '_thumb'+img_ext))) + else: + if (self.launchers[launcher]["thumbpath"] == self.launchers[launcher]["rompath"] ): + file_path = filename.replace("."+filename.split(".")[-1], img_ext) + else: + file_path = os.path.join(os.path.dirname(self.launchers[launcher]["thumbpath"]),os.path.basename(filename.replace("."+filename.split(".")[-1], img_ext))) + if ( image != file_path ): + try: + shutil.copy2( image.decode(sys.getfilesystemencoding(),'ignore') , file_path.decode(sys.getfilesystemencoding(),'ignore') ) + self.launchers[launcher]["roms"][rom]["thumb"] = file_path + self._save_launchers() + _update_cache(file_path) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + except OSError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30063 ) % self.launchers[launcher]["roms"][rom]["name"])) + + if (type2 == 2 ): + # Link to a rom thumbnail image + if (self.launchers[launcher]["roms"][rom]["thumb"] == ""): + imagepath = self.launchers[launcher]["roms"][rom]["filename"] + else: + imagepath = self.launchers[launcher]["roms"][rom]["thumb"] + image = xbmcgui.Dialog().browse(2,__language__( 30041 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(imagepath)) + if (image): + if (os.path.isfile(image)): + self.launchers[launcher]["roms"][rom]["thumb"] = image + self._save_launchers() + _update_cache(image) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + + if (type == 3 ): + dialog = xbmcgui.Dialog() + fanart_diag = __language__( 30312 ) % ( self.settings[ "fanarts_scraper" ] ) + if ( self.settings[ "fanarts_scraper" ] == "Google" ): + fanart_diag = __language__( 30322 ) % ( self.settings[ "fanarts_scraper" ],self.settings[ "fanart_image_size_display" ].capitalize()) + type2 = dialog.select(__language__( 30303 ), [fanart_diag,__language__( 30332 ),__language__( 30313 )]) + if (type2 == 0 ): + self._scrap_fanart_rom(launcher,rom) + if (type2 == 1 ): + # Import a rom fanart image + image = xbmcgui.Dialog().browse(2,__language__( 30041 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(self.launchers[launcher]["fanartpath"])) + if (image): + if (os.path.isfile(image)): + img_ext = os.path.splitext(image)[-1][0:4] + if ( img_ext != '' ): + filename = self.launchers[launcher]["roms"][rom]["filename"] + if (self.launchers[launcher]["thumbpath"] == self.launchers[launcher]["fanartpath"] ): + if (self.launchers[launcher]["fanartpath"] == self.launchers[launcher]["rompath"] ): + file_path = filename.replace("."+filename.split(".")[-1], '_fanart'+img_ext) + else: + file_path = os.path.join(os.path.dirname(self.launchers[launcher]["fanartpath"]),os.path.basename(filename.replace("."+filename.split(".")[-1], '_fanart'+img_ext))) + else: + if (self.launchers[launcher]["fanartpath"] == self.launchers[launcher]["rompath"] ): + file_path = filename.replace("."+filename.split(".")[-1], img_ext) + else: + file_path = os.path.join(os.path.dirname(self.launchers[launcher]["fanartpath"]),os.path.basename(filename.replace("."+filename.split(".")[-1], img_ext))) + if ( image != file_path ): + try: + shutil.copy2( image.decode(sys.getfilesystemencoding(),'ignore') , file_path.decode(sys.getfilesystemencoding(),'ignore') ) + self.launchers[launcher]["roms"][rom]["fanart"] = file_path + self._save_launchers() + _update_cache(file_path) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) + except OSError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30064 ) % self.launchers[launcher]["roms"][rom]["name"])) + if (type2 == 2 ): + # Link to a rom fanart image + if (self.launchers[launcher]["roms"][rom]["fanart"] == ""): + imagepath = self.launchers[launcher]["roms"][rom]["filename"] + else: + imagepath = self.launchers[launcher]["roms"][rom]["fanart"] + image = xbmcgui.Dialog().browse(2,__language__( 30042 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(imagepath)) + if (image): + if (os.path.isfile(image)): + self.launchers[launcher]["roms"][rom]["fanart"] = image + self._save_launchers() + _update_cache(image) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) + + if (type == 4 ): + if (self.launchers[launcher]["roms"][rom]["finished"] == "false"): + self.launchers[launcher]["roms"][rom]["finished"] = "true" + else: + self.launchers[launcher]["roms"][rom]["finished"] = "false" + self._save_launchers() + + if (type == 5 ): + dialog = xbmcgui.Dialog() + type2 = dialog.select(__language__( 30323 ), [__language__( 30337 ) % self.launchers[launcher]["roms"][rom]["filename"], __language__( 30341 ) % self.launchers[launcher]["roms"][rom]["trailer"], __language__( 30331 ) % self.launchers[launcher]["roms"][rom]["custom"]]) + if (type2 == 0 ): + # Selection of the item file + item_file = xbmcgui.Dialog().browse(1,__language__( 30017 ),"files","."+self.launchers[launcher]["romext"].replace("|","|."), False, False, self.launchers[launcher]["roms"][rom]["filename"]) + self.launchers[launcher]["roms"][rom]["filename"] = item_file + self._save_launchers() + if (type2 == 1 ): + # Selection of the rom trailer file + trailer = xbmcgui.Dialog().browse(1,__language__( 30090 ),"files",".mp4|.mpg|.avi|.wmv|.mkv|.flv", False, False, self.launchers[launcher]["roms"][rom]["trailer"]) + self.launchers[launcher]["roms"][rom]["trailer"] = trailer + self._save_launchers() + if (type2 == 2 ): + # Selection of the rom customs path + custom = xbmcgui.Dialog().browse(0,__language__( 30057 ),"files","", False, False, self.launchers[launcher]["roms"][rom]["custom"]) + self.launchers[launcher]["roms"][rom]["custom"] = custom + self._save_launchers() + + if (type == 6 ): + self._remove_rom(launcher,rom) + + # Return to the launcher directory + xbmc.executebuiltin("Container.Refresh") + + def _scrap_thumb_rom_algo(self, launcher, rom, title): + xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30065 ) % (self.launchers[launcher]["roms"][rom]["name"],(self.settings[ "thumbs_scraper" ]).encode('utf-8','ignore')))) + xbmc.executebuiltin( "ActivateWindow(busydialog)" ) + covers = self._get_thumbnails_list(self.launchers[launcher]["roms"][rom]["gamesys"],title,self.settings["game_region"],self.settings[ "thumb_image_size" ]) + if covers: + nb_images = len(covers) + xbmc.executebuiltin( "Dialog.Close(busydialog)" ) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30066 ) % (nb_images,self.launchers[launcher]["roms"][rom]["name"]))) + covers.insert(0,(self.launchers[launcher]["roms"][rom]["thumb"],self.launchers[launcher]["roms"][rom]["thumb"],__language__( 30068 ))) + self.image_url = MyDialog(covers) + if ( self.image_url ): + if (not self.image_url == self.launchers[launcher]["roms"][rom]["thumb"]): + img_url = self._get_thumbnail(self.image_url) + if ( img_url != '' ): + img_ext = os.path.splitext(img_url)[-1][0:4] + if ( img_ext != '' ): + filename = self.launchers[launcher]["roms"][rom]["filename"] + if (self.launchers[launcher]["thumbpath"] == self.launchers[launcher]["fanartpath"] ): + if (self.launchers[launcher]["thumbpath"] == self.launchers[launcher]["rompath"] ): + file_path = filename.replace("."+filename.split(".")[-1], '_thumb'+img_ext) + else: + file_path = os.path.join(os.path.dirname(self.launchers[launcher]["thumbpath"]),os.path.basename(filename.replace("."+filename.split(".")[-1], '_thumb'+img_ext))) + else: + if (self.launchers[launcher]["thumbpath"] == self.launchers[launcher]["rompath"] ): + file_path = filename.replace("."+filename.split(".")[-1], img_ext) + else: + file_path = os.path.join(os.path.dirname(self.launchers[launcher]["thumbpath"]),os.path.basename(filename.replace("."+filename.split(".")[-1], img_ext))) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30069 ))) + try: + h = urllib.urlretrieve(img_url,file_path) + self.launchers[launcher]["roms"][rom]["thumb"] = file_path + self._save_launchers() + _update_cache(file_path) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + except socket.timeout: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30080 ))) + except exceptions.IOError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30063 ) % self.launchers[launcher]["roms"][rom]["name"])) + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30067 ) % (self.launchers[launcher]["roms"][rom]["name"]))) + else: + xbmc.executebuiltin( "Dialog.Close(busydialog)" ) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30067 ) % (self.launchers[launcher]["roms"][rom]["name"]))) + + def _scrap_thumb_rom(self, launcher, rom): + if ( self.launchers[launcher]["application"].lower().find('mame') > 0 ) or ( self.settings[ "thumbs_scraper" ] == 'arcadeHITS' ): + title=os.path.basename(self.launchers[launcher]["roms"][rom]["filename"]).split(".")[0] + keyboard = xbmc.Keyboard(title, __language__( 30079 )) + else: + keyboard = xbmc.Keyboard(self.launchers[launcher]["roms"][rom]["name"], __language__( 30036 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self._scrap_thumb_rom_algo(launcher, rom, keyboard.getText()) + xbmc.executebuiltin("Container.Update") + + def _scrap_thumb_launcher_algo(self, launcherID, title): + xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30065 ) % (self.launchers[launcherID]["name"],(self.settings[ "thumbs_scraper" ]).encode('utf-8','ignore')))) + covers = self._get_thumbnails_list(self.launchers[launcherID]["gamesys"],title,self.settings["game_region"],self.settings[ "thumb_image_size" ]) + if covers: + nb_images = len(covers) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30066 ) % (nb_images,self.launchers[launcherID]["name"]))) + covers.insert(0,(self.launchers[launcherID]["thumb"],self.launchers[launcherID]["thumb"],__language__( 30068 ))) + self.image_url = MyDialog(covers) + if ( self.image_url ): + if (not self.image_url == self.launchers[launcherID]["thumb"]): + img_url = self._get_thumbnail(self.image_url) + if ( img_url != '' ): + img_ext = os.path.splitext(img_url)[-1][0:4] + if ( img_ext != '' ): + filename = self.launchers[launcherID]["application"] + if ( os.path.join(self.launchers[launcherID]["thumbpath"]) != "" ): + file_path = os.path.join(self.launchers[launcherID]["thumbpath"],os.path.basename(self.launchers[launcherID]["application"])+'_thumb'+img_ext) + else: + if (self.settings[ "launcher_thumb_path" ] == "" ): + self.settings[ "launcher_thumb_path" ] = DEFAULT_THUMB_PATH + file_path = os.path.join(self.settings[ "launcher_thumb_path" ],os.path.basename(self.launchers[launcherID]["application"])+'_thumb'+img_ext) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000" % (__language__( 30000 ), __language__( 30069 ))) + try: + h = urllib.urlretrieve(img_url,file_path) + self.launchers[launcherID]["thumb"] = file_path + self._save_launchers() + _update_cache(file_path) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + except socket.timeout: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30080 ))) + except exceptions.IOError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30063 ) % self.launchers[launcherID]["name"])) + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30067 ) % (self.launchers[launcherID]["name"]))) + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30067 ) % (self.launchers[launcherID]["name"]))) + + def _scrap_thumb_launcher(self, launcherID): + keyboard = xbmc.Keyboard(self.launchers[launcherID]["name"], __language__( 30036 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self._scrap_thumb_launcher_algo(launcherID, keyboard.getText()) + xbmc.executebuiltin("Container.Update") + + def _scrap_fanart_rom_algo(self, launcher, rom, title): + xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30071 ) % (self.launchers[launcher]["roms"][rom]["name"],(self.settings[ "fanarts_scraper" ]).encode('utf-8','ignore')))) + full_fanarts = self._get_fanarts_list(self.launchers[launcher]["roms"][rom]["gamesys"],title,self.settings[ "fanart_image_size" ]) + if full_fanarts: + nb_images = len(full_fanarts) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30072 ) % (nb_images,self.launchers[launcher]["roms"][rom]["name"]))) + full_fanarts.insert(0,(self.launchers[launcher]["roms"][rom]["fanart"],self.launchers[launcher]["roms"][rom]["fanart"],__language__( 30068 ))) + self.image_url = MyDialog(full_fanarts) + if ( self.image_url ): + if (not self.image_url == self.launchers[launcher]["roms"][rom]["fanart"]): + img_url = self._get_fanart(self.image_url) + if ( img_url != '' ): + img_ext = os.path.splitext(img_url)[-1][0:4] + if ( img_ext != '' ): + filename = self.launchers[launcher]["roms"][rom]["filename"] + if (self.launchers[launcher]["fanartpath"] == self.launchers[launcher]["thumbpath"] ): + if (self.launchers[launcher]["fanartpath"] == self.launchers[launcher]["rompath"] ): + file_path = filename.replace("."+filename.split(".")[-1], '_fanart'+img_ext) + else: + file_path = os.path.join(os.path.dirname(self.launchers[launcher]["fanartpath"]),os.path.basename(filename.replace("."+filename.split(".")[-1], '_fanart'+img_ext))) + else: + if (self.launchers[launcher]["fanartpath"] == self.launchers[launcher]["rompath"] ): + file_path = filename.replace("."+filename.split(".")[-1], img_ext) + else: + file_path = os.path.join(os.path.dirname(self.launchers[launcher]["fanartpath"]),os.path.basename(filename.replace("."+filename.split(".")[-1], img_ext))) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30074 ))) + try: + h = urllib.urlretrieve(img_url,file_path) + self.launchers[launcher]["roms"][rom]["fanart"] = file_path + self._save_launchers() + _update_cache(file_path) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) + except socket.timeout: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30080 ))) + except exceptions.IOError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30064 ) % self.launchers[launcher]["roms"][rom]["name"])) + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30073 ) % (self.launchers[launcher]["roms"][rom]["name"]))) + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30073 ) % (self.launchers[launcher]["roms"][rom]["name"]))) + + def _scrap_fanart_rom(self, launcher, rom): + if ( self.launchers[launcher]["application"].lower().find('mame') > 0 ) or ( self.settings[ "fanarts_scraper" ] == 'arcadeHITS' ): + title=os.path.basename(self.launchers[launcher]["roms"][rom]["filename"]).split(".")[0] + keyboard = xbmc.Keyboard(title, __language__( 30079 )) + else: + keyboard = xbmc.Keyboard(self.launchers[launcher]["roms"][rom]["name"], __language__( 30036 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self._scrap_fanart_rom_algo(launcher, rom, keyboard.getText()) + xbmc.executebuiltin("Container.Update") + + def _scrap_fanart_launcher_algo(self, launcherID, title): + xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30071 ) % (self.launchers[launcherID]["name"],(self.settings[ "fanarts_scraper" ]).encode('utf-8','ignore')))) + xbmc.executebuiltin( "ActivateWindow(busydialog)" ) + covers = self._get_fanarts_list(self.launchers[launcherID]["gamesys"],title,self.settings[ "fanart_image_size" ]) + if covers: + nb_images = len(covers) + xbmc.executebuiltin( "Dialog.Close(busydialog)" ) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30072 ) % (nb_images,self.launchers[launcherID]["name"]))) + covers.insert(0,(self.launchers[launcherID]["fanart"],self.launchers[launcherID]["fanart"],__language__( 30068 ))) + self.image_url = MyDialog(covers) + if ( self.image_url ): + if (not self.image_url == self.launchers[launcherID]["fanart"]): + img_url = self._get_fanart(self.image_url) + if ( img_url != '' ): + img_ext = os.path.splitext(img_url)[-1][0:4] + if ( img_ext != '' ): + filename = self.launchers[launcherID]["application"] + if ( os.path.join(self.launchers[launcherID]["fanartpath"]) != "" ): + file_path = os.path.join(self.launchers[launcherID]["fanartpath"],os.path.basename(self.launchers[launcherID]["application"])+'_fanart'+img_ext) + else: + if (self.settings[ "launcher_fanart_path" ] == "" ): + self.settings[ "launcher_fanart_path" ] = DEFAULT_FANART_PATH + file_path = os.path.join(self.settings[ "launcher_fanart_path" ],os.path.basename(self.launchers[launcherID]["application"])+'_fanart'+img_ext) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30074 ))) + try: + h = urllib.urlretrieve(img_url,file_path) + self.launchers[launcherID]["fanart"] = file_path + self._save_launchers() + _update_cache(file_path) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) + except socket.timeout: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30080 ))) + except exceptions.IOError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30064 ) % self.launchers[launcherID]["name"])) + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30073 ) % (self.launchers[launcherID]["name"]))) + else: + xbmc.executebuiltin( "Dialog.Close(busydialog)" ) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30073 ) % (self.launchers[launcherID]["name"]))) + + def _scrap_fanart_launcher(self, launcherID): + keyboard = xbmc.Keyboard(self.launchers[launcherID]["name"], __language__( 30036 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self._scrap_fanart_launcher_algo(launcherID, keyboard.getText()) + xbmc.executebuiltin("Container.Update") + + def _scrap_rom_algo(self, launcher, rom, title): + # Search game title + results,display = self._get_games_list(title) + if display: + # Display corresponding game list found + dialog = xbmcgui.Dialog() + # Game selection + selectgame = dialog.select(__language__( 30078 ) % ( self.settings[ "datas_scraper" ] ), display) + if (not selectgame == -1): + if ( self.settings[ "ignore_title" ] ): + self.launchers[launcher]["roms"][rom]["name"] = title_format(self,title) + else: + self.launchers[launcher]["roms"][rom]["name"] = title_format(self,results[selectgame]["title"]) + gamedata = self._get_game_data(results[selectgame]["id"]) + self.launchers[launcher]["roms"][rom]["genre"] = gamedata["genre"] + self.launchers[launcher]["roms"][rom]["release"] = gamedata["release"] + self.launchers[launcher]["roms"][rom]["studio"] = gamedata["studio"] + self.launchers[launcher]["roms"][rom]["plot"] = gamedata["plot"] + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30076 ))) + + def _scrap_rom(self, launcher, rom): + # Edition of the rom name + title=os.path.basename(self.launchers[launcher]["roms"][rom]["filename"]).split(".")[0] + if ( self.launchers[launcher]["application"].lower().find('mame') > 0 ) or ( self.settings[ "datas_scraper" ] == 'arcadeHITS' ): + keyboard = xbmc.Keyboard(title, __language__( 30079 )) + else: + keyboard = xbmc.Keyboard(self.launchers[launcher]["roms"][rom]["name"], __language__( 30036 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self._scrap_rom_algo(launcher, rom, keyboard.getText()) + self._save_launchers() + xbmc.executebuiltin("Container.Update") + + def _full_scrap_rom(self, launcher, rom): + # Edition of the rom name + title=os.path.basename(self.launchers[launcher]["roms"][rom]["filename"]).split(".")[0] + if ( self.launchers[launcher]["application"].lower().find('mame') > 0 ) or ( self.settings[ "datas_scraper" ] == 'arcadeHITS' ): + keyboard = xbmc.Keyboard(title, __language__( 30079 )) + else: + keyboard = xbmc.Keyboard(self.launchers[launcher]["roms"][rom]["name"], __language__( 30036 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self._scrap_rom_algo(launcher, rom, keyboard.getText()) + self._scrap_thumb_rom_algo(launcher, rom, keyboard.getText()) + self._scrap_fanart_rom_algo(launcher, rom, keyboard.getText()) + self._save_launchers() + xbmc.executebuiltin("Container.Update") + + def _import_rom_nfo(self, launcher, rom): + # Edition of the rom name + nfo_file=os.path.splitext(self.launchers[launcher]["roms"][rom]["filename"])[0]+".nfo" + if (os.path.isfile(nfo_file)): + f = open(nfo_file, 'r') + item_nfo = f.read().replace('\r','').replace('\n','') + item_title = re.findall( "(.*?)", item_nfo ) + item_platform = re.findall( "(.*?)", item_nfo ) + item_year = re.findall( "(.*?)", item_nfo ) + item_publisher = re.findall( "(.*?)", item_nfo ) + item_genre = re.findall( "(.*?)", item_nfo ) + item_plot = re.findall( "(.*?)", item_nfo ) + if len(item_title) > 0 : self.launchers[launcher]["roms"][rom]["name"] = item_title[0].rstrip() + self.launchers[launcher]["roms"][rom]["gamesys"] = self.launchers[launcher]["gamesys"] + if len(item_year) > 0 : self.launchers[launcher]["roms"][rom]["release"] = item_year[0] + if len(item_publisher) > 0 : self.launchers[launcher]["roms"][rom]["studio"] = item_publisher[0] + if len(item_genre) > 0 : self.launchers[launcher]["roms"][rom]["genre"] = item_genre[0] + if len(item_plot) > 0 : self.launchers[launcher]["roms"][rom]["plot"] = item_plot[0].replace('"','"') + self._save_launchers() + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30083 ) % os.path.basename(nfo_file))) + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30082 ) % os.path.basename(nfo_file))) + + def _export_rom_nfo(self, launcher, rom): + nfo_file=os.path.splitext(self.launchers[launcher]["roms"][rom]["filename"].decode(sys.getfilesystemencoding()))[0]+".nfo" + if (os.path.isfile(nfo_file)): + shutil.move( nfo_file, nfo_file+".tmp" ) + destination= open( nfo_file, "w" ) + source= open( nfo_file+".tmp", "r" ) + first_genre=0 + for line in source: + item_title = re.findall( "(.*?)", line ) + item_platform = re.findall( "(.*?)", line ) + item_year = re.findall( "(.*?)", line ) + item_publisher = re.findall( "(.*?)", line ) + item_genre = re.findall( "(.*?)", line ) + item_plot = re.findall( "(.*?)", line ) + if len(item_title) > 0 : line = "\t"+self.launchers[launcher]["roms"][rom]["name"]+"\n" + if len(item_platform) > 0 : line = "\t"+self.launchers[launcher]["roms"][rom]["gamesys"]+"\n" + if len(item_year) > 0 : line = "\t"+self.launchers[launcher]["roms"][rom]["release"]+"\n" + if len(item_publisher) > 0 : line = "\t"+self.launchers[launcher]["roms"][rom]["studio"]+"\n" + if len(item_genre) > 0 : + if first_genre == 0 : + line = "\t"+self.launchers[launcher]["roms"][rom]["genre"]+"\n" + first_genre = 1 + if len(item_plot) > 0 : line = "\t"+self.launchers[launcher]["roms"][rom]["plot"]+"\n" + destination.write( line ) + source.close() + destination.close() + os.remove(nfo_file+".tmp") + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30087 ) % os.path.basename(nfo_file).encode('utf8','ignore'))) + else: + usock = open( nfo_file, 'w' ) + usock.write("\n") + usock.write("\t"+self.launchers[launcher]["roms"][rom]["name"]+"\n") + usock.write("\t"+self.launchers[launcher]["roms"][rom]["gamesys"]+"\n") + usock.write("\t"+self.launchers[launcher]["roms"][rom]["release"]+"\n") + usock.write("\t"+self.launchers[launcher]["roms"][rom]["studio"]+"\n") + usock.write("\t"+self.launchers[launcher]["roms"][rom]["genre"]+"\n") + usock.write("\t"+self.launchers[launcher]["roms"][rom]["plot"]+"\n") + usock.write("\n") + usock.close() + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30086 ) % os.path.basename(nfo_file).encode('utf8','ignore'))) + + def _add_roms(self, launcher): + dialog = xbmcgui.Dialog() + type = dialog.select(__language__( 30106 ), [__language__( 30105 ),__language__( 30320 )]) + if (type == 0 ): + self._import_roms(launcher) + if (type == 1 ): + self._add_new_rom(launcher) + # Return to the launcher directory + xbmc.executebuiltin("Container.Refresh") + + + def _edit_launcher(self, launcherID): + dialog = xbmcgui.Dialog() + title=os.path.basename(self.launchers[launcherID]["application"]) + if (self.launchers[launcherID]["finished"] == "false"): + finished_display = __language__( 30339 ) + else: + finished_display = __language__( 30340 ) + if ( self.launchers[launcherID]["rompath"] == "" ): + type = dialog.select(__language__( 30300 ) % title, [__language__( 30338 ),__language__( 30301 ),__language__( 30302 ),__language__( 30303 ),finished_display,__language__( 30323 ),__language__( 30304 )]) + else: + type = dialog.select(__language__( 30300 ) % title, [__language__( 30338 ),__language__( 30301 ),__language__( 30302 ),__language__( 30303 ),finished_display,__language__( 30334 ),__language__( 30323 ),__language__( 30304 )]) + type_nb = 0 + + # Scrap item (infos and images) + if (type == type_nb ): + self._full_scrap_launcher(launcherID) + + # Edition of the launcher infos + type_nb = type_nb+1 + if (type == type_nb ): + dialog = xbmcgui.Dialog() + type2 = dialog.select(__language__( 30319 ), [__language__( 30311 ) % self.settings[ "datas_scraper" ],__language__( 30306 ) % self.launchers[launcherID]["name"],__language__( 30307 ) % self.launchers[launcherID]["gamesys"],__language__( 30308 ) % self.launchers[launcherID]["release"],__language__( 30309 ) % self.launchers[launcherID]["studio"],__language__( 30310 ) % self.launchers[launcherID]["genre"],__language__( 30328 ) % self.launchers[launcherID]["plot"][0:20],__language__( 30333 ),__language__( 30316 )]) + if (type2 == 0 ): + # Edition of the launcher name + self._scrap_launcher(launcherID) + if (type2 == 1 ): + # Edition of the launcher name + keyboard = xbmc.Keyboard(self.launchers[launcherID]["name"], __language__( 30037 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + title = keyboard.getText() + if ( title == "" ): + title = self.launchers[launcherID]["name"] + self.launchers[launcherID]["name"] = title.rstrip() + self._save_launchers() + if (type2 == 2 ): + # Selection of the launcher game system + dialog = xbmcgui.Dialog() + platforms = _get_game_system_list() + gamesystem = dialog.select(__language__( 30077 ), platforms) + if (not gamesystem == -1 ): + self.launchers[launcherID]["gamesys"] = platforms[gamesystem] + self._save_launchers() + if (type2 == 3 ): + # Edition of the launcher release date + keyboard = xbmc.Keyboard(self.launchers[launcherID]["release"], __language__( 30038 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self.launchers[launcherID]["release"] = keyboard.getText() + self._save_launchers() + if (type2 == 4 ): + # Edition of the launcher studio name + keyboard = xbmc.Keyboard(self.launchers[launcherID]["studio"], __language__( 30039 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self.launchers[launcherID]["studio"] = keyboard.getText() + self._save_launchers() + if (type2 == 5 ): + # Edition of the launcher genre + keyboard = xbmc.Keyboard(self.launchers[launcherID]["genre"], __language__( 30040 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self.launchers[launcherID]["genre"] = keyboard.getText() + self._save_launchers() + if (type2 == 6 ): + # Import of the launcher plot + text_file = xbmcgui.Dialog().browse(1,__language__( 30080 ),"files",".txt|.dat", False, False, self.launchers[launcherID]["application"]) + if ( os.path.isfile(text_file) == True ): + text_plot = open(text_file, 'r') + self.launchers[launcherID]["plot"] = text_plot.read() + text_plot.close() + self._save_launchers() + if (type2 == 7 ): + # Edition of the launcher name + self._import_launcher_nfo(launcherID) + if (type2 == 8 ): + # Edition of the launcher name + self._export_launcher_nfo(launcherID) + + # Launcher Thumbnail menu option + type_nb = type_nb+1 + if (type == type_nb ): + dialog = xbmcgui.Dialog() + thumb_diag = __language__( 30312 ) % ( self.settings[ "thumbs_scraper" ] ) + if ( self.settings[ "thumbs_scraper" ] == "GameFAQs" ) | ( self.settings[ "thumbs_scraper" ] == "MobyGames" ): + thumb_diag = __language__( 30321 ) % ( self.settings[ "thumbs_scraper" ],self.settings[ "display_game_region" ]) + if ( self.settings[ "thumbs_scraper" ] == "Google" ): + thumb_diag = __language__( 30322 ) % ( self.settings[ "thumbs_scraper" ],self.settings[ "thumb_image_size_display" ]) + type2 = dialog.select(__language__( 30302 ), [thumb_diag,__language__( 30332 ),__language__( 30313 )]) + if (type2 == 0 ): + self._scrap_thumb_launcher(launcherID) + if (type2 == 1 ): + # Import a Launcher thumbnail image + image = xbmcgui.Dialog().browse(2,__language__( 30041 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(self.launchers[launcherID]["thumbpath"])) + if (image): + if (os.path.isfile(image)): + img_ext = os.path.splitext(image)[-1][0:4] + if ( img_ext != '' ): + filename = self.launchers[launcherID]["application"] + if ( os.path.join(self.launchers[launcherID]["thumbpath"]) != "" ): + file_path = os.path.join(self.launchers[launcherID]["thumbpath"],os.path.basename(self.launchers[launcherID]["application"])+'_thumb'+img_ext) + else: + if (self.settings[ "launcher_thumb_path" ] == "" ): + self.settings[ "launcher_thumb_path" ] = DEFAULT_THUMB_PATH + file_path = os.path.join(self.settings[ "launcher_thumb_path" ],os.path.basename(self.launchers[launcherID]["application"])+'_thumb'+img_ext) + if ( image != file_path ): + try: + shutil.copy2( image.decode(sys.getfilesystemencoding(),'ignore') , file_path.decode(sys.getfilesystemencoding(),'ignore') ) + self.launchers[launcherID]["thumb"] = file_path + self._save_launchers() + _update_cache(file_path) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + except OSError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30063 ) % self.launchers[launcherID]["name"])) + + if (type2 == 2 ): + # Link to a launcher thumbnail image + if (self.launchers[launcherID]["thumb"] == ""): + imagepath = self.launchers[launcherID]["thumbpath"] + else: + imagepath = self.launchers[launcherID]["thumb"] + image = xbmcgui.Dialog().browse(2,__language__( 30041 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(imagepath)) + if (image): + if (os.path.isfile(image)): + self.launchers[launcherID]["thumb"] = image + self._save_launchers() + _update_cache(image) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + + # Launcher Fanart menu option + type_nb = type_nb+1 + if (type == type_nb ): + dialog = xbmcgui.Dialog() + fanart_diag = __language__( 30312 ) % ( self.settings[ "fanarts_scraper" ] ) + if ( self.settings[ "fanarts_scraper" ] == "Google" ): + fanart_diag = __language__( 30322 ) % ( self.settings[ "fanarts_scraper" ],self.settings[ "fanart_image_size_display" ].capitalize()) + type2 = dialog.select(__language__( 30303 ), [fanart_diag,__language__( 30332 ),__language__( 30313 )]) + if (type2 == 0 ): + self._scrap_fanart_launcher(launcherID) + if (type2 == 1 ): + # Import a Launcher fanart image + image = xbmcgui.Dialog().browse(2,__language__( 30041 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(self.launchers[launcherID]["fanartpath"])) + if (image): + if (os.path.isfile(image)): + img_ext = os.path.splitext(image)[-1][0:4] + if ( img_ext != '' ): + filename = self.launchers[launcherID]["application"] + if ( os.path.join(self.launchers[launcherID]["fanartpath"]) != "" ): + file_path = os.path.join(self.launchers[launcherID]["fanartpath"],os.path.basename(self.launchers[launcherID]["application"])+'_fanart'+img_ext) + else: + if (self.settings[ "launcher_fanart_path" ] == "" ): + self.settings[ "launcher_fanart_path" ] = DEFAULT_FANART_PATH + file_path = os.path.join(self.settings[ "launcher_fanart_path" ],os.path.basename(self.launchers[launcherID]["application"])+'_fanart'+img_ext) + if ( image != file_path ): + try: + shutil.copy2( image.decode(sys.getfilesystemencoding(),'ignore') , file_path.decode(sys.getfilesystemencoding(),'ignore') ) + self.launchers[launcherID]["fanart"] = file_path + self._save_launchers() + _update_cache(file_path) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + except OSError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30064 ) % self.launchers[launcherID]["name"])) + if (type2 == 2 ): + # Link to a launcher fanart image + if (self.launchers[launcherID]["fanart"] == ""): + imagepath = self.launchers[launcherID]["fanartpath"] + else: + imagepath = self.launchers[launcherID]["fanart"] + image = xbmcgui.Dialog().browse(2,__language__( 30042 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(imagepath)) + if (image): + if (os.path.isfile(image)): + self.launchers[launcherID]["fanart"] = image + self._save_launchers() + _update_cache(image) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) + + type_nb = type_nb+1 + if (type == type_nb ): + if (self.launchers[launcherID]["finished"] == "false"): + self.launchers[launcherID]["finished"] = "true" + else: + self.launchers[launcherID]["finished"] = "false" + self._save_launchers() + + # Launcher's Items List menu option + if ( self.launchers[launcherID]["rompath"] != "" ): + type_nb = type_nb+1 + if (type == type_nb ): + dialog = xbmcgui.Dialog() + type2 = dialog.select(__language__( 30334 ), [__language__( 30335 ),__language__( 30336 ),__language__( 30318 ),]) + # Import Items list form .nfo files + if (type2 == 0 ): + self._import_items_list_nfo(launcherID) + # Export Items list to .nfo files + if (type2 == 1 ): + self._export_items_list_nfo(launcherID) + # Empty Launcher menu option + if (type2 == 2 ): + self._empty_launcher(launcherID) + + # Launcher Advanced menu option + type_nb = type_nb+1 + if (type == type_nb ): + if self.launchers[launcherID]["minimize"] == "true": + minimize_str = __language__( 30204 ) + else: + minimize_str = __language__( 30205 ) + if self.launchers[launcherID]["lnk"] == "true": + lnk_str = __language__( 30204 ) + else: + lnk_str = __language__( 30205 ) + if (os.environ.get( "OS", "xbox" ) == "xbox"): + filter = ".xbe|.cut" + else: + if (sys.platform == "win32"): + filter = ".bat|.exe|.cmd" + else: + filter = "" + if ( self.launchers[launcherID]["rompath"] != "" ): + if (sys.platform == 'win32'): + type2 = dialog.select(__language__( 30323 ), [__language__( 30327 ) % self.launchers[launcherID]["application"],__language__( 30315 ) % self.launchers[launcherID]["args"],__language__( 30324 ) % self.launchers[launcherID]["rompath"],__language__( 30317 ) % self.launchers[launcherID]["romext"],__language__( 30325 ) % self.launchers[launcherID]["thumbpath"], __language__( 30326 ) % self.launchers[launcherID]["fanartpath"], __language__( 30341 ) % self.launchers[launcherID]["trailerpath"], __language__( 30331 ) % self.launchers[launcherID]["custompath"],__language__( 30329 ) % minimize_str,__language__( 30330 ) % lnk_str]) + else: + type2 = dialog.select(__language__( 30323 ), [__language__( 30327 ) % self.launchers[launcherID]["application"],__language__( 30315 ) % self.launchers[launcherID]["args"],__language__( 30324 ) % self.launchers[launcherID]["rompath"],__language__( 30317 ) % self.launchers[launcherID]["romext"],__language__( 30325 ) % self.launchers[launcherID]["thumbpath"], __language__( 30326 ) % self.launchers[launcherID]["fanartpath"], __language__( 30341 ) % self.launchers[launcherID]["trailerpath"], __language__( 30331 ) % self.launchers[launcherID]["custompath"],__language__( 30329 ) % minimize_str]) + else: + if (sys.platform == 'win32'): + type2 = dialog.select(__language__( 30323 ), [__language__( 30327 ) % self.launchers[launcherID]["application"],__language__( 30315 ) % self.launchers[launcherID]["args"],__language__( 30325 ) % self.launchers[launcherID]["thumbpath"], __language__( 30326 ) % self.launchers[launcherID]["fanartpath"], __language__( 30341 ) % self.launchers[launcherID]["trailerpath"], __language__( 30331 ) % self.launchers[launcherID]["custompath"],__language__( 30329 ) % minimize_str,__language__( 30330 ) % lnk_str]) + else: + type2 = dialog.select(__language__( 30323 ), [__language__( 30327 ) % self.launchers[launcherID]["application"],__language__( 30315 ) % self.launchers[launcherID]["args"],__language__( 30325 ) % self.launchers[launcherID]["thumbpath"], __language__( 30326 ) % self.launchers[launcherID]["fanartpath"], __language__( 30341 ) % self.launchers[launcherID]["trailerpath"], __language__( 30331 ) % self.launchers[launcherID]["custompath"],__language__( 30329 ) % minimize_str]) + + # Launcher application path menu option + type2_nb = 0 + if (type2 == type2_nb ): + app = xbmcgui.Dialog().browse(1,__language__( 30023 ),"files",filter, False, False, self.launchers[launcherID]["application"]) + self.launchers[launcherID]["application"] = app + + # Edition of the launcher arguments + type2_nb = type2_nb +1 + if (type2 == type2_nb ): + keyboard = xbmc.Keyboard(self.launchers[launcherID]["args"], __language__( 30052 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self.launchers[launcherID]["args"] = keyboard.getText() + self._save_launchers() + + if ( self.launchers[launcherID]["rompath"] != "" ): + # Launcher roms path menu option + type2_nb = type2_nb + 1 + if (type2 == type2_nb ): + rom_path = xbmcgui.Dialog().browse(0,__language__( 30058 ),"files", "", False, False, self.launchers[launcherID]["rompath"]) + self.launchers[launcherID]["rompath"] = rom_path + + # Edition of the launcher rom extensions (only for emulator launcher) + type2_nb = type2_nb +1 + if (type2 == type2_nb ): + if (not self.launchers[launcherID]["rompath"] == ""): + keyboard = xbmc.Keyboard(self.launchers[launcherID]["romext"], __language__( 30054 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self.launchers[launcherID]["romext"] = keyboard.getText() + self._save_launchers() + + # Launcher thumbnails path menu option + type2_nb = type2_nb + 1 + if (type2 == type2_nb ): + thumb_path = xbmcgui.Dialog().browse(0,__language__( 30059 ),"files","", False, False, self.launchers[launcherID]["thumbpath"]) + self.launchers[launcherID]["thumbpath"] = thumb_path + # Launcher fanarts path menu option + type2_nb = type2_nb + 1 + if (type2 == type2_nb ): + fanart_path = xbmcgui.Dialog().browse(0,__language__( 30060 ),"files","", False, False, self.launchers[launcherID]["fanartpath"]) + self.launchers[launcherID]["fanartpath"] = fanart_path + # Launcher trailer file menu option + type2_nb = type2_nb + 1 + if (type2 == type2_nb ): + fanart_path = xbmcgui.Dialog().browse(1,__language__( 30090 ),"files",".mp4|.mpg|.avi|.wmv|.mkv|.flv", False, False, self.launchers[launcherID]["trailerpath"]) + self.launchers[launcherID]["trailerpath"] = fanart_path + # Launcher custom path menu option + type2_nb = type2_nb + 1 + if (type2 == type2_nb ): + fanart_path = xbmcgui.Dialog().browse(0,__language__( 30057 ),"files","", False, False, self.launchers[launcherID]["custompath"]) + self.launchers[launcherID]["custompath"] = fanart_path + # Launcher minimize state menu option + type2_nb = type2_nb + 1 + if (type2 == type2_nb ): + dialog = xbmcgui.Dialog() + type3 = dialog.select(__language__( 30203 ), ["%s (%s)" % (__language__( 30205 ),__language__( 30201 )), "%s" % (__language__( 30204 ))]) + if (type3 == 1 ): + self.launchers[launcherID]["minimize"] = "true" + else: + self.launchers[launcherID]["minimize"] = "false" + self._save_launchers() + # Launcher internal lnk option + if (sys.platform == 'win32'): + type2_nb = type2_nb + 1 + if (type2 == type2_nb ): + dialog = xbmcgui.Dialog() + type3 = dialog.select(__language__( 30206 ), ["%s (%s)" % (__language__( 30204 ),__language__( 30201 )), "%s (%s)" % (__language__( 30205 ),__language__( 30202 ))]) + if (type3 == 1 ): + self.launchers[launcherID]["lnk"] = "false" + else: + self.launchers[launcherID]["lnk"] = "true" + self._save_launchers() + + # Remove Launcher menu option + type_nb = type_nb+1 + if (type == type_nb ): + self._remove_launcher(launcherID) + + if (type == -1 ): + self._save_launchers() + + # Return to the launcher directory + xbmc.executebuiltin("Container.Refresh") + + def _scrap_launcher_algo(self, launcherID, title): + # Scrapping launcher name info + results,display = self._get_games_list(title) + if display: + # Display corresponding game list found + dialog = xbmcgui.Dialog() + # Game selection + selectgame = dialog.select(__language__( 30078 ) % ( self.settings[ "datas_scraper" ] ), display) + if (not selectgame == -1): + if ( self.settings[ "ignore_title" ] ): + self.launchers[launcherID]["name"] = title_format(self,self.launchers[launcherID]["name"]) + else: + self.launchers[launcherID]["name"] = title_format(self,results[selectgame]["title"]) + gamedata = self._get_game_data(results[selectgame]["id"]) + self.launchers[launcherID]["genre"] = gamedata["genre"] + self.launchers[launcherID]["release"] = gamedata["release"] + self.launchers[launcherID]["studio"] = gamedata["studio"] + self.launchers[launcherID]["plot"] = gamedata["plot"] + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30076 ))) + + def _scrap_launcher(self, launcherID): + # Edition of the launcher name + keyboard = xbmc.Keyboard(self.launchers[launcherID]["name"], __language__( 30036 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self._scrap_launcher_algo(launcherID, keyboard.getText()) + self._save_launchers() + xbmc.executebuiltin("Container.Update") + + def _full_scrap_launcher(self, launcherID): + # Edition of the launcher name + keyboard = xbmc.Keyboard(self.launchers[launcherID]["name"], __language__( 30036 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self._scrap_launcher_algo(launcherID, keyboard.getText()) + self._scrap_thumb_launcher_algo(launcherID, keyboard.getText()) + self._scrap_fanart_launcher_algo(launcherID, keyboard.getText()) + self._save_launchers() + xbmc.executebuiltin("Container.Update") + + def _import_launcher_nfo(self, launcherID): + if ( len(self.launchers[launcherID]["rompath"]) > 0 ): + nfo_file = os.path.join(self.launchers[launcherID]["rompath"],os.path.basename(os.path.splitext(self.launchers[launcherID]["application"])[0]+".nfo")) + else: + if ( len(self.settings[ "launcher_nfo_path" ]) > 0 ): + nfo_file = os.path.join(self.settings[ "launcher_nfo_path" ],os.path.basename(os.path.splitext(self.launchers[launcherID]["application"])[0]+".nfo")) + else: + nfo_file = xbmcgui.Dialog().browse(1,__language__( 30088 ),"files",".nfo", False, False) + if (os.path.isfile(nfo_file)): + f = open(nfo_file, 'r') + item_nfo = f.read().replace('\r','').replace('\n','') + item_title = re.findall( "(.*?)", item_nfo ) + item_platform = re.findall( "(.*?)", item_nfo ) + item_year = re.findall( "(.*?)", item_nfo ) + item_publisher = re.findall( "(.*?)", item_nfo ) + item_genre = re.findall( "(.*?)", item_nfo ) + item_plot = re.findall( "(.*?)", item_nfo ) + self.launchers[launcherID]["name"] = item_title[0].rstrip() + self.launchers[launcherID]["gamesys"] = item_platform[0] + self.launchers[launcherID]["release"] = item_year[0] + self.launchers[launcherID]["studio"] = item_publisher[0] + self.launchers[launcherID]["genre"] = item_genre[0] + self.launchers[launcherID]["plot"] = item_plot[0].replace('"','"') + self._save_launchers() + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30083 ) % os.path.basename(nfo_file))) + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30082 ) % os.path.basename(nfo_file))) + + def _export_items_list_nfo(self, launcherID): + for rom in self.launchers[launcherID]["roms"].iterkeys(): + self._export_rom_nfo(launcherID, rom) + + def _import_items_list_nfo(self, launcherID): + for rom in self.launchers[launcherID]["roms"].iterkeys(): + self._import_rom_nfo(launcherID, rom) + + def _export_launcher_nfo(self, launcherID): + if ( len(self.launchers[launcherID]["rompath"]) > 0 ): + nfo_file = os.path.join(self.launchers[launcherID]["rompath"],os.path.basename(os.path.splitext(self.launchers[launcherID]["application"])[0]+".nfo")) + else: + if ( len(self.settings[ "launcher_nfo_path" ]) > 0 ): + nfo_file = os.path.join(self.settings[ "launcher_nfo_path" ],os.path.basename(os.path.splitext(self.launchers[launcherID]["application"])[0]+".nfo")) + else: + nfo_path = xbmcgui.Dialog().browse(0,__language__( 30089 ),"files",".nfo", False, False) + nfo_file = os.path.join(nfo_path,os.path.basename(os.path.splitext(self.launchers[launcherID]["application"])[0]+".nfo")) + if (os.path.isfile(nfo_file)): + shutil.move( nfo_file, nfo_file+".tmp" ) + destination= open( nfo_file, "w" ) + source= open( nfo_file+".tmp", "r" ) + for line in source: + item_title = re.findall( "(.*?)", line ) + item_platform = re.findall( "(.*?)", line ) + item_year = re.findall( "(.*?)", line ) + item_publisher = re.findall( "(.*?)", line ) + item_genre = re.findall( "(.*?)", line ) + item_plot = re.findall( "(.*?)", line ) + if len(item_title) > 0 : line = "\t"+self.launchers[launcherID]["name"]+"\n" + if len(item_platform) > 0 : line = "\t"+self.launchers[launcherID]["gamesys"]+"\n" + if len(item_year) > 0 : line = "\t"+self.launchers[launcherID]["release"]+"\n" + if len(item_publisher) > 0 : line = "\t"+self.launchers[launcherID]["studio"]+"\n" + if len(item_genre) > 0 : line = "\t"+self.launchers[launcherID]["genre"]+"\n" + if len(item_plot) > 0 : line = "\t"+self.launchers[launcherID]["plot"]+"\n" + destination.write( line ) + source.close() + destination.close() + os.remove(nfo_file+".tmp") + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30087 ) % os.path.basename(nfo_file))) + else: + usock = open( nfo_file, 'w' ) + usock.write("\n") + usock.write("\t"+self.launchers[launcherID]["name"]+"\n") + usock.write("\t"+self.launchers[launcherID]["gamesys"]+"\n") + usock.write("\t"+self.launchers[launcherID]["release"]+"\n") + usock.write("\t"+self.launchers[launcherID]["studio"]+"\n") + usock.write("\t"+self.launchers[launcherID]["genre"]+"\n") + usock.write("\t"+self.launchers[launcherID]["plot"]+"\n") + usock.write("\n") + usock.close() + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30086 ) % os.path.basename(nfo_file))) + + def _run_launcher(self, launcherID): + if (self.launchers.has_key(launcherID)): + launcher = self.launchers[launcherID] + apppath = os.path.dirname(launcher["application"]) + arguments = launcher["args"].replace("%apppath%" , apppath).replace("%APPPATH%" , apppath) + if ( os.path.basename(launcher["application"]).lower().replace(".exe" , "") == "xbmc" ): + xbmc.executebuiltin('XBMC.' + launcher["args"]) + else: + if ( xbmc.Player().isPlaying() ): + if ( self.settings[ "media_state" ] == "0" ): + xbmc.executebuiltin('PlayerControl(Stop)') + if ( self.settings[ "media_state" ] == "1" ): + xbmc.executebuiltin('PlayerControl(Play)') + xbmc.sleep(2*self.settings[ "start_tempo" ]) + if (launcher["minimize"] == "true"): + _toogle_fullscreen() + if ( self.settings[ "launcher_notification" ] ): + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30034 ) % launcher["name"])) + xbmc.sleep(self.settings[ "start_tempo" ]) + if (os.environ.get( "OS", "xbox" ) == "xbox"): + xbmc.executebuiltin('XBMC.Runxbe(' + launcher["application"] + ')') + else: + if (sys.platform == 'win32'): + if ( launcher["application"].split(".")[-1] == "lnk" ): + os.system("start \"\" \"%s\"" % (launcher["application"])) + else: + if ( launcher["application"].split(".")[-1] == "bat" ): + info = subprocess_hack.STARTUPINFO() + info.dwFlags = 1 + if ( self.settings[ "show_batch" ] ): + info.wShowWindow = 5 + else: + info.wShowWindow = 0 + else: + info = None + startproc = subprocess_hack.Popen(r'%s %s' % (launcher["application"], arguments), cwd=apppath, startupinfo=info) + startproc.wait() + elif (sys.platform.startswith('linux')): + if ( self.settings[ "lirc_state" ] ): + xbmc.executebuiltin('LIRC.stop') + os.system("\"%s\" %s " % (launcher["application"], arguments)) + if ( self.settings[ "lirc_state" ] ): + xbmc.executebuiltin('LIRC.start') + elif (sys.platform.startswith('darwin')): + os.system("\"%s\" %s " % (launcher["application"], arguments)) + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30609 ))) + xbmc.sleep(self.settings[ "start_tempo" ]) + if (launcher["minimize"] == "true"): + _toogle_fullscreen() + if ( self.settings[ "media_state" ] == "1" ): + xbmc.sleep(2*self.settings[ "start_tempo" ]) + xbmc.executebuiltin('PlayerControl(Play)') + + def _get_settings( self ): + # get the users preference settings + self.settings = {} + self.settings[ "datas_method" ] = __settings__.getSetting( "datas_method" ) + self.settings[ "thumbs_method" ] = __settings__.getSetting( "thumbs_method" ) + self.settings[ "fanarts_method" ] = __settings__.getSetting( "fanarts_method" ) + self.settings[ "scrap_info" ] = __settings__.getSetting( "scrap_info" ) + self.settings[ "scrap_thumbs" ] = __settings__.getSetting( "scrap_thumbs" ) + self.settings[ "scrap_fanarts" ] = __settings__.getSetting( "scrap_fanarts" ) + self.settings[ "select_fanarts" ] = __settings__.getSetting( "select_fanarts" ) + self.settings[ "overwrite_thumbs" ] = ( __settings__.getSetting( "overwrite_thumbs" ) == "true" ) + self.settings[ "overwrite_fanarts" ] = ( __settings__.getSetting( "overwrite_fanarts" ) == "true" ) + self.settings[ "clean_title" ] = ( __settings__.getSetting( "clean_title" ) == "true" ) + self.settings[ "ignore_bios" ] = ( __settings__.getSetting( "ignore_bios" ) == "true" ) + self.settings[ "ignore_title" ] = ( __settings__.getSetting( "ignore_title" ) == "true" ) + self.settings[ "title_formating" ] = ( __settings__.getSetting( "title_formating" ) == "true" ) + self.settings[ "datas_scraper" ] = __settings__.getSetting( "datas_scraper" ) + self.settings[ "thumbs_scraper" ] = __settings__.getSetting( "thumbs_scraper" ) + self.settings[ "fanarts_scraper" ] = __settings__.getSetting( "fanarts_scraper" ) + self.settings[ "game_region" ] = ['All','EU','JP','US'][int(__settings__.getSetting('game_region'))] + self.settings[ "display_game_region" ] = [__language__( 30136 ),__language__( 30144 ),__language__( 30145 ),__language__( 30146 )][int(__settings__.getSetting('game_region'))] + self.settings[ "thumb_image_size" ] = ['','icon','small','medium','large','xlarge','xxlarge','huge'][int(__settings__.getSetting('thumb_image_size'))] + self.settings[ "thumb_image_size_display" ] = [__language__( 30136 ),__language__( 30137 ),__language__( 30138 ),__language__( 30139 ),__language__( 30140 ),__language__( 30141 ),__language__( 30142 ),__language__( 30143 )][int(__settings__.getSetting('thumb_image_size'))] + self.settings[ "fanart_image_size" ] = ['','icon','small','medium','large','xlarge','xxlarge','huge'][int(__settings__.getSetting('fanart_image_size'))] + self.settings[ "fanart_image_size_display" ] = [__language__( 30136 ),__language__( 30137 ),__language__( 30138 ),__language__( 30139 ),__language__( 30140 ),__language__( 30141 ),__language__( 30142 ),__language__( 30143 )][int(__settings__.getSetting('fanart_image_size'))] + self.settings[ "launcher_thumb_path" ] = __settings__.getSetting( "launcher_thumb_path" ) + self.settings[ "launcher_fanart_path" ] = __settings__.getSetting( "launcher_fanart_path" ) + self.settings[ "launcher_nfo_path" ] = __settings__.getSetting( "launcher_nfo_path" ) + self.settings[ "media_state" ] = __settings__.getSetting( "media_state" ) + self.settings[ "show_batch" ] = ( __settings__.getSetting( "show_batch" ) == "true" ) + self.settings[ "recursive_scan" ] = ( __settings__.getSetting( "recursive_scan" ) == "true" ) + self.settings[ "launcher_notification" ] = ( __settings__.getSetting( "launcher_notification" ) == "true" ) + self.settings[ "lirc_state" ] = ( __settings__.getSetting( "lirc_state" ) == "true" ) + self.settings[ "hide_finished" ] = ( __settings__.getSetting( "hide_finished" ) == "true" ) + self.settings[ "snap_flyer" ] = __settings__.getSetting( "snap_flyer" ) + self.settings[ "start_tempo" ] = int(round(float(__settings__.getSetting( "start_tempo" )))) + self.settings[ "auto_backup" ] = ( __settings__.getSetting( "auto_backup" ) == "true" ) + self.settings[ "nb_backup_files" ] = int(round(float(__settings__.getSetting( "nb_backup_files" )))) + self.settings[ "show_log" ] = ( __settings__.getSetting( "show_log" ) == "true" ) + + def _print_log(self,string): + if (self.settings[ "show_log" ]): + print "[ALA] "+string + + def _get_scrapers( self ): + # get the users gamedata scrapers preference + exec "import resources.scrapers.datas.%s.datas_scraper as _data_scraper" % ( self.settings[ "datas_scraper" ] ) + self._get_games_list = _data_scraper._get_games_list + self._get_game_data = _data_scraper._get_game_data + self._get_first_game = _data_scraper._get_first_game + + # get the users thumbs scrapers preference + exec "import resources.scrapers.thumbs.%s.thumbs_scraper as _thumbs_scraper" % ( self.settings[ "thumbs_scraper" ] ) + self._get_thumbnails_list = _thumbs_scraper._get_thumbnails_list + self._get_thumbnail = _thumbs_scraper._get_thumbnail + + # get the users fanarts scrapers preference + exec "import resources.scrapers.fanarts.%s.fanarts_scraper as _fanarts_scraper" % ( self.settings[ "fanarts_scraper" ] ) + self._get_fanarts_list = _fanarts_scraper._get_fanarts_list + self._get_fanart = _fanarts_scraper._get_fanart + + def _run_rom(self, launcherID, romName): + if (self.launchers.has_key(launcherID)): + launcher = self.launchers[launcherID] + if (launcher["roms"].has_key(romName)): + rom = self.launchers[launcherID]["roms"][romName] + romfile = os.path.basename(rom["filename"]) + apppath = os.path.dirname(launcher["application"]) + rompath = os.path.dirname(rom["filename"]) + romname = os.path.splitext(romfile)[0] + + files = [] + filesnames = [] + ext3s = ['.cd1', '-cd1', '_cd1', ' cd1'] + for ext3 in ext3s: + cleanromname = re.sub('(\[.*?\]|\{.*?\}|\(.*?\))', '', romname) + if ( cleanromname.lower().find(ext3) > -1 ): + temprompath = os.path.dirname(rom["filename"]) + try: + filesnames = os.listdir(temprompath) + except: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30610 ))) + namestem = cleanromname[:-len(ext3)] + + for filesname in filesnames: + altname=re.findall('\{.*?\}',filesname) + searchname = re.sub('(\[.*?\]|\{.*?\}|\(.*?\))', '', filesname) + if searchname[0:len(namestem)] == namestem and searchname[len(namestem):len(namestem)+len(ext3) - 1] == ext3[:-1]: + for romext in launcher["romext"].split("|"): + if searchname[-len(romext):].lower() == romext.lower() : + Discnum = searchname[(len(namestem)+len(ext3)-1):searchname.rfind(".")] + try: + int(Discnum) + if not altname: + files.append([Discnum, xbmc.getLocalizedString(427)+" "+Discnum, os.path.join(os.path.dirname(rom["filename"]),filesname)]) + else: + files.append([Discnum, altname[0][1:-1], os.path.join(os.path.dirname(rom["filename"]),filesname)]) + except: + pass + if len(files) > 0: + files.sort(key=lambda x: int(x[0])) + discs = [] + for file in files: + discs.append(file[1]) + dialog = xbmcgui.Dialog() + type3 = dialog.select("%s:" % __language__( 30035 ), discs) + if type3 > -1 : + myresult = files[type3] + rom["filename"] = myresult[2] + romfile = os.path.basename(rom["filename"]) + rompath = os.path.dirname(rom["filename"]) + romname = os.path.splitext(romfile)[0] + else: + return "" + + arguments = launcher["args"] + arguments = arguments.replace("%rom%" , rom["filename"]).replace("%ROM%" , rom["filename"]) + arguments = arguments.replace("%romfile%" , romfile).replace("%ROMFILE%" , romfile) + arguments = arguments.replace("%romname%" , romname).replace("%ROMNAME%" , romname) + arguments = arguments.replace("%rombasename%" , base_filename(romname)).replace("%ROMBASENAME%" , base_filename(romname)) + arguments = arguments.replace("%apppath%" , apppath).replace("%APPPATH%" , apppath) + arguments = arguments.replace("%rompath%" , rompath).replace("%ROMPATH%" , rompath) + arguments = arguments.replace("%romtitle%" , rom["name"]).replace("%ROMTITLE%" , rom["name"]) + arguments = arguments.replace("%romspath%" , launcher["rompath"]).replace("%ROMSPATH%" , launcher["rompath"]) + + if ( os.path.basename(launcher["application"]).lower().replace(".exe" , "") == "xbmc" ): + xbmc.executebuiltin('XBMC.' + arguments) + else: + if ( xbmc.Player().isPlaying() ): + if ( self.settings[ "media_state" ] == "0" ): + xbmc.executebuiltin('PlayerControl(Stop)') + if ( self.settings[ "media_state" ] == "1" ): + xbmc.executebuiltin('PlayerControl(Play)') + xbmc.sleep(2*self.settings[ "start_tempo" ]) + if (launcher["minimize"] == "true"): + _toogle_fullscreen() + if ( self.settings[ "launcher_notification" ] ): + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30034 ) % rom["name"])) + xbmc.sleep(self.settings[ "start_tempo" ]) + 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["lnk"] == "true" ) and ( launcher["romext"] == "lnk" ): + os.system("start \"\" \"%s\"" % (arguments)) + else: + if ( launcher["application"].split(".")[-1] == "bat" ): + info = subprocess_hack.STARTUPINFO() + info.dwFlags = 1 + if ( self.settings[ "show_batch" ] ): + info.wShowWindow = 5 + else: + info.wShowWindow = 0 + else: + info = None + startproc = subprocess_hack.Popen(r'%s %s' % (launcher["application"], arguments), cwd=apppath, startupinfo=info) + startproc.wait() + elif (sys.platform.startswith('linux')): + if ( self.settings[ "lirc_state" ] ): + xbmc.executebuiltin('LIRC.stop') + os.system("\"%s\" %s " % (launcher["application"], arguments)) + if ( self.settings[ "lirc_state" ] ): + xbmc.executebuiltin('LIRC.start') + elif (sys.platform.startswith('darwin')): + os.system("\"%s\" %s " % (launcher["application"], arguments)) + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30609 ))) + xbmc.sleep(self.settings[ "start_tempo" ]) + if (launcher["minimize"] == "true"): + _toogle_fullscreen() + if ( self.settings[ "media_state" ] == "1" ): + xbmc.sleep(2*self.settings[ "start_tempo" ]) + xbmc.executebuiltin('PlayerControl(Play)') + + ''' get an xml data from an xml file ''' + def get_xml_source( self, xmlpath ): + try: + usock = open( xmlpath, '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 ): + # clean, save and return the xml string + xmlSource = xmlSource.replace("&", "&") + xmlSource = xmlSource.replace("&", "&") + f = open(BASE_CURRENT_SOURCE_PATH, 'w') + f.write(xmlSource) + f.close() + return xmlSource.replace("\n","").replace("\r","") + else: + return "" + + def _save_launchers (self): + xbmc.executebuiltin( "ActivateWindow(busydialog)" ) + # make settings directory if doesn't exists + if (not os.path.isdir(os.path.dirname(TEMP_CURRENT_SOURCE_PATH))): + os.makedirs(os.path.dirname(TEMP_CURRENT_SOURCE_PATH)) + if ( self.settings[ "auto_backup" ] ): + # delete old backup files + fileData = {} + dirList=os.listdir(DEFAULT_BACKUP_PATH) + for fname in dirList: + fileData[fname] = os.stat(os.path.join( DEFAULT_BACKUP_PATH,fname)).st_mtime + sortedFiles = sorted(fileData.items(), key=itemgetter(1)) + delete = len(sortedFiles) - self.settings[ "nb_backup_files" ] + 1 + for x in range(0, delete): + os.remove(os.path.join( DEFAULT_BACKUP_PATH,sortedFiles[x][0])) + # make current launchers.xml backup + if ( os.path.isfile(BASE_CURRENT_SOURCE_PATH)): + try: + now = datetime.datetime.now() + timestamp = str(now.year)+str(now.month).rjust(2,'0')+str(now.day).rjust(2,'0')+"-"+str(now.hour).rjust(2,'0')+str(now.minute).rjust(2,'0')+str(now.second).rjust(2,'0')+"-"+str(now.microsecond)+"-" + BACKUP_CURRENT_SOURCE_PATH = os.path.join( DEFAULT_BACKUP_PATH , timestamp+"launchers.xml" ) + shutil.copy2(BASE_CURRENT_SOURCE_PATH, BACKUP_CURRENT_SOURCE_PATH) + except OSError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30600 ))) + try: + usock = open( TEMP_CURRENT_SOURCE_PATH, 'w' ) + usock.write("\n") + usock.write("\n") + for launcherIndex in sorted(self.launchers, key= lambda x : self.launchers[x]["name"]): + launcher = self.launchers[launcherIndex] + usock.write("\t\n") + usock.write("\t\t"+launcherIndex+"\n") + # replace low-9 quotation mark by comma + 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["thumbpath"]+"\n") + usock.write("\t\t"+launcher["fanartpath"]+"\n") + usock.write("\t\t"+launcher["trailerpath"]+"\n") + usock.write("\t\t"+launcher["custompath"]+"\n") + usock.write("\t\t"+launcher["romext"]+"\n") + usock.write("\t\t"+launcher["gamesys"]+"\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["studio"]+"\n") + usock.write("\t\t"+launcher["plot"]+"\n") + usock.write("\t\t"+launcher["finished"]+"\n") + usock.write("\t\t"+launcher["minimize"]+"\n") + usock.write("\t\t"+launcher["lnk"]+"\n") + usock.write("\t\t\n") + for romIndex in sorted(launcher["roms"], key= lambda x : launcher["roms"][x]["name"]): + romdata = launcher["roms"][romIndex] + usock.write("\t\t\t\n") + usock.write("\t\t\t\t"+romIndex+"\n") + # replace low-9 quotation mark by comma + 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["trailer"]+"\n") + usock.write("\t\t\t\t"+romdata["custom"]+"\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["studio"]+"\n") + usock.write("\t\t\t\t"+romdata["plot"]+"\n") + usock.write("\t\t\t\t"+romdata["finished"]+"\n") + usock.write("\t\t\t\n") + usock.write("\t\t\n") + usock.write("\t\n") + usock.write("") + usock.close() + try: + shutil.copy2(TEMP_CURRENT_SOURCE_PATH, BASE_CURRENT_SOURCE_PATH) + except OSError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30601 ))) + except OSError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30602 ))) + except IOError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30603 ))) + os.remove(TEMP_CURRENT_SOURCE_PATH) + xbmc.executebuiltin( "Dialog.Close(busydialog)" ) + + + ''' read the list of launchers and roms from launchers.xml file ''' + def _load_launchers(self, xmlSource): + need_update = 0 + # clean, save and return the xml string + xmlSource = xmlSource.replace("&", "&") + launchers = re.findall( "(.*?)", xmlSource ) + for launcher in launchers: + launcherid = re.findall( "(.*?)", launcher ) + name = re.findall( "(.*?)", launcher ) + application = re.findall( "(.*?)", launcher ) + args = re.findall( "(.*?)", launcher ) + rompath = re.findall( "(.*?)", launcher ) + thumbpath = re.findall( "(.*?)", launcher ) + fanartpath = re.findall( "(.*?)", launcher ) + trailerpath = re.findall( "(.*?)", launcher ) + custompath = re.findall( "(.*?)", launcher ) + romext = re.findall( "(.*?)", launcher ) + gamesys = re.findall( "(.*?)", launcher ) + thumb = re.findall( "(.*?)", launcher ) + fanart = re.findall( "(.*?)", launcher ) + genre = re.findall( "(.*?)", launcher ) + release = re.findall( "(.*?)", launcher ) + studio = re.findall( "(.*?)", launcher ) + plot = re.findall( "(.*?)", launcher ) + lnk = re.findall( "(.*?)", launcher ) + finished = re.findall( "(.*?)", launcher ) + minimize = re.findall( "(.*?)", launcher ) + romsxml = re.findall( "(.*?)", launcher ) + + if len(launcherid) > 0 : launcherid = launcherid[0] + else: + launcherid = _get_SID() + need_update = 1 + # replace comma by single low-9 quotation mark + 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(thumbpath) > 0 : thumbpath = thumbpath[0] + else: thumbpath = "" + if len(fanartpath) > 0 : fanartpath = fanartpath[0] + else: fanartpath = "" + if len(trailerpath) > 0 : trailerpath = trailerpath[0] + else: trailerpath = "" + if len(custompath) > 0 : custompath = custompath[0] + else: custompath = "" + if len(romext) > 0: romext = romext[0] + else: romext = "" + if len(gamesys) > 0: gamesys = gamesys[0] + else: gamesys = "" + 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(studio) > 0: studio = studio[0] + else: studio = "" + if len(plot) > 0: plot = plot[0] + else: plot = "" + if len(finished) > 0: finished = finished[0] + else: finished = "false" + if len(lnk) > 0: lnk = lnk[0] + else: + if (sys.platform == 'win32'): + lnk = "true" + else: + lnk = "" + if len(minimize) > 0: minimize = minimize[0] + else: minimize = "false" + + roms = {} + for rom in romsxml: + romid = re.findall( "(.*?)", rom ) + romname = re.findall( "(.*?)", rom ) + romfilename = re.findall( "(.*?)", rom ) + romthumb = re.findall( "(.*?)", rom ) + romfanart = re.findall( "(.*?)", rom ) + romtrailer = re.findall( "(.*?)", rom ) + romcustom = re.findall( "(.*?)", rom ) + romgenre = re.findall( "(.*?)", rom ) + romrelease = re.findall( "(.*?)", rom ) + romstudio = re.findall( "(.*?)", rom ) + romplot = re.findall( "(.*?)", rom ) + romfinished = re.findall( "(.*?)", rom ) + romgamesys = gamesys + + if len(romid) > 0 : romid = romid[0] + else: + romid = _get_SID() + need_update = 1 + 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(romtrailer) > 0 : romtrailer = romtrailer[0] + else: romtrailer = "" + if len(romcustom) > 0 : romcustom = romcustom[0] + else: romcustom = "" + if len(romgenre) > 0 : romgenre = romgenre[0] + else: romgenre = "" + if len(romrelease) > 0 : romrelease = romrelease[0] + else: romrelease = "" + if len(romstudio) > 0 : romstudio = romstudio[0] + else: romstudio = "" + if len(romplot) > 0 : romplot = romplot[0] + else: romplot = "" + if len(romfinished) > 0 : romfinished = romfinished[0] + else: romfinished = "false" + + # prepare rom object data + romdata = {} + romdata["name"] = romname + romdata["filename"] = romfilename + romdata["gamesys"] = romgamesys + romdata["thumb"] = romthumb + romdata["fanart"] = romfanart + romdata["trailer"] = romtrailer + romdata["custom"] = romcustom + romdata["genre"] = romgenre + romdata["release"] = romrelease + romdata["studio"] = romstudio + romdata["plot"] = romplot + romdata["finished"] = romfinished + + # add rom to the roms list (using id as index) + roms[romid] = romdata + + # prepare launcher object data + launcherdata = {} + launcherdata["name"] = name + launcherdata["application"] = application + launcherdata["args"] = args + launcherdata["rompath"] = rompath + launcherdata["thumbpath"] = thumbpath + launcherdata["fanartpath"] = fanartpath + launcherdata["trailerpath"] = trailerpath + launcherdata["custompath"] = custompath + launcherdata["romext"] = romext + launcherdata["gamesys"] = gamesys + launcherdata["thumb"] = thumb + launcherdata["fanart"] = fanart + launcherdata["genre"] = genre + launcherdata["release"] = release + launcherdata["studio"] = studio + launcherdata["plot"] = plot + launcherdata["finished"] = finished + launcherdata["lnk"] = lnk + launcherdata["minimize"] = minimize + launcherdata["roms"] = roms + + # add launcher to the launchers list (using id as index) + self.launchers[launcherid] = launcherdata + + if ( need_update == 1 ): + self._save_launchers() + + def _get_launchers( self ): + if (len(self.launchers) > 0): + for key in sorted(self.launchers, key= lambda x : self.launchers[x]["application"]): + self._add_launcher(self.launchers[key]["name"], self.launchers[key]["application"], self.launchers[key]["rompath"], self.launchers[key]["thumbpath"], self.launchers[key]["fanartpath"], self.launchers[key]["trailerpath"], self.launchers[key]["custompath"], self.launchers[key]["romext"], self.launchers[key]["gamesys"], self.launchers[key]["thumb"], self.launchers[key]["fanart"], self.launchers[key]["genre"], self.launchers[key]["release"], self.launchers[key]["studio"], self.launchers[key]["plot"], self.launchers[key]["finished"], self.launchers[key]["lnk"], self.launchers[key]["minimize"], self.launchers[key]["roms"], len(self.launchers), key) + xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) + return True + else: + return False + + def _get_roms( self, launcherID ): + if (self.launchers.has_key(launcherID)): + selectedLauncher = self.launchers[launcherID] + # error + roms = selectedLauncher["roms"] + if (len(roms) > 0) : + for key in sorted(roms, key= lambda x : roms[x]["filename"]): + if (roms[key]["fanart"] ==""): + defined_fanart = selectedLauncher["fanart"] + else: + defined_fanart = roms[key]["fanart"] + self._add_rom(launcherID, roms[key]["name"], roms[key]["filename"], roms[key]["gamesys"], roms[key]["thumb"], defined_fanart, roms[key]["trailer"], roms[key]["custom"], roms[key]["genre"], roms[key]["release"], roms[key]["studio"], roms[key]["plot"], roms[key]["finished"], len(roms), key) + xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) + return True + else: + return False + else: + return False + + 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 _import_roms(self, launcherID, addRoms = False): + dialog = xbmcgui.Dialog() + romsCount = 0 + filesCount = 0 + skipCount = 0 + selectedLauncher = self.launchers[launcherID] + pDialog = xbmcgui.DialogProgress() + app = selectedLauncher["application"] + path = selectedLauncher["rompath"] + exts = selectedLauncher["romext"] + roms = selectedLauncher["roms"] + self._print_log(__language__( 30701 ) % selectedLauncher["name"]) + self._print_log(__language__( 30105 )) + # Get game system, thumbnails and fanarts paths from launcher + thumb_path = selectedLauncher["thumbpath"] + fanart_path = selectedLauncher["fanartpath"] + trailer_path = selectedLauncher["trailerpath"] + custom_path = selectedLauncher["custompath"] + gamesys = selectedLauncher["gamesys"] + + #remove dead entries + if (len(roms) > 0): + self._print_log(__language__( 30717 ) % len(roms)) + self._print_log(__language__( 30718 )) + i = 0 + removedRoms = 0 + ret = pDialog.create(__language__( 30000 ), __language__( 30501 ) % (path)) + + for key in sorted(roms.iterkeys()): + self._print_log(__language__( 30719 ) % roms[key]["filename"] ) + pDialog.update(i * 100 / len(roms)) + i += 1 + if (not os.path.isfile(roms[key]["filename"])): + self._print_log(__language__( 30716 )) + self._print_log(__language__( 30720 ) % roms[key]["filename"] ) + del roms[key] + removedRoms += 1 + else: + self._print_log(__language__( 30715 )) + + pDialog.close() + if not (removedRoms == 0): + self._print_log(__language__( 30502 ) % removedRoms) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30502 ) % removedRoms)) + else: + self._print_log(__language__( 30721 )) + + else: + self._print_log(__language__( 30722 )) + + self._print_log(__language__( 30014 ) % path) + ret = pDialog.create(__language__( 30000 ), __language__( 30014 ) % path) + + files = [] + if ( self.settings[ "recursive_scan" ] ): + self._print_log(__language__( 30723 )) + for root, dirs, filess in os.walk(path): + for filename in fnmatch.filter(filess, '*.*'): + files.append(os.path.join(root, filename)) + else: + self._print_log(__language__( 30724 )) + filesname = os.listdir(path) + for filename in filesname: + files.append(os.path.join(path, filename)) + + for fullname in files: + f = os.path.basename(fullname) + thumb = "" + fanart = "" + if ( self.settings[ "datas_method" ] == "0" ): + import_text = __language__( 30062 ) % (f.replace("."+f.split(".")[-1],"")) + if ( self.settings[ "datas_method" ] == "1" ): + import_text = __language__( 30061 ) % (f.replace("."+f.split(".")[-1],""),__language__( 30167 )) + if ( self.settings[ "datas_method" ] == "2" ): + import_text = __language__( 30061 ) % (f.replace("."+f.split(".")[-1],""),self.settings[ "datas_scraper" ].encode('utf-8','ignore')) + pDialog.update(filesCount * 100 / len(files), import_text) + self._print_log(__language__( 30725 ) % fullname) + for ext in exts.split("|"): + romadded = False + if f.upper().endswith("." + ext.upper()): + self._print_log(__language__( 30726 ) % ext.upper()) + foundromfile = False + for g in roms: + if ( roms[g]["filename"] == fullname ): + self._print_log(__language__( 30727 )) + foundromfile = True + ext3s = ['.cd', '-cd', '_cd', ' cd'] + for ext3 in ext3s: + for nums in range(2, 9): + if ( f.lower().find(ext3 + str(nums)) > 0 ): + self._print_log(__language__( 30728 )) + foundromfile = True + # Ignore MAME bios roms + romname = f[:-len(ext)-1] + romname = romname.replace('.',' ') + if ( app.lower().find('mame') > 0 ) or ( self.settings[ "thumbs_scraper" ] == 'arcadeHITS' ): + if ( self.settings["ignore_bios"] ): + if ( self._test_bios_file(romname)): + self._print_log(__language__( 30729 )) + foundromfile = True + if ( foundromfile == False ): + self._print_log(__language__( 30730 )) + # prepare rom object data + romdata = {} + results = [] + # Romname conversion if MAME + if ( app.lower().find('mame') > 0 ) or ( self.settings[ "thumbs_scraper" ] == 'arcadeHITS' ): + romname = self._get_mame_title(romname) + # Clean multi-cd Title Name + ext3s = ['.cd1', '-cd1', '_cd1', ' cd1'] + for ext3 in ext3s: + if ( romname.lower().find(ext3) > 0 ): + romname = romname[:-len(ext3)] + romdata["filename"] = fullname + romdata["gamesys"] = gamesys + romdata["trailer"] = "" + romdata["custom"] = custom_path + romdata["genre"] = "" + romdata["release"] = "" + romdata["studio"] = "" + romdata["plot"] = "" + romdata["finished"] = "false" + + self._print_log(import_text) + self._print_log(__language__( 30732 ) % romname) + # Search game title from scrapers + if ( self.settings[ "datas_method" ] == "1" ): + nfo_file=os.path.splitext(romdata["filename"])[0]+".nfo" + self._print_log(__language__( 30719 ) % nfo_file) + if (os.path.isfile(nfo_file)): + self._print_log(__language__( 30715 )) + self._print_log(__language__( 30733 ) % nfo_file) + ff = open(nfo_file, 'r') + item_nfo = ff.read().replace('\r','').replace('\n','') + item_title = re.findall( "(.*?)", item_nfo ) + item_platform = re.findall( "(.*?)", item_nfo ) + item_year = re.findall( "(.*?)", item_nfo ) + item_publisher = re.findall( "(.*?)", item_nfo ) + item_genre = re.findall( "(.*?)", item_nfo ) + item_plot = re.findall( "(.*?)", item_nfo ) + if len(item_title) > 0 : romdata["name"] = item_title[0].rstrip() + romdata["gamesys"] = romdata["gamesys"] + if len(item_year) > 0 : romdata["release"] = item_year[0] + if len(item_publisher) > 0 : romdata["studio"] = item_publisher[0] + if len(item_genre) > 0 : romdata["genre"] = item_genre[0] + if len(item_plot) > 0 : romdata["plot"] = item_plot[0].replace('"','"') + ff.close() + else: + self._print_log(__language__( 30726 )) + romdata["name"] = title_format(self,romname) + self._print_log(__language__( 30734 )) + else: + if ( self.settings[ "datas_method" ] != "0" ): + romdata["name"] = clean_filename(romname) + if ( app.lower().find('mame') > 0 ) or ( self.settings[ "datas_scraper" ] == 'arcadeHITS' ): + self._print_log(__language__( 30735 )) + results = self._get_first_game(f[:-len(ext)-1],gamesys) + selectgame = 0 + else: + if ( self.settings[ "scrap_info" ] == "1" ): + self._print_log(__language__( 30736 )) + results = self._get_first_game(romdata["name"],gamesys) + selectgame = 0 + else: + self._print_log(__language__( 30737 )) + results,display = self._get_games_list(romdata["name"]) + if display: + # Display corresponding game list found + dialog = xbmcgui.Dialog() + # Game selection + selectgame = dialog.select(__language__( 30078 ) % ( self.settings[ "datas_scraper" ] ), display) + if (selectgame == -1): + results = [] + if results: + foundname = results[selectgame]["title"] + if (foundname != ""): + if ( self.settings[ "ignore_title" ] ): + romdata["name"] = title_format(self,romname) + else: + romdata["name"] = title_format(self,foundname) + + # Game other game data + gamedata = self._get_game_data(results[selectgame]["id"]) + romdata["genre"] = gamedata["genre"] + romdata["release"] = gamedata["release"] + romdata["studio"] = gamedata["studio"] + romdata["plot"] = gamedata["plot"] + progress_display = romdata["name"] + " (" + romdata["release"] + ")" + else: + progress_display = romname + ": " +__language__( 30503 ) + else: + romdata["name"] = title_format(self,romname) + progress_display = romname + ": " +__language__( 30503 ) + else: + self._print_log(__language__( 30738 )) + romdata["name"] = title_format(self,romname) + + # Search if thumbnails and fanarts already exist + self._print_log(__language__( 30704 ) % fullname ) + if ( thumb_path == fanart_path ): + self._print_log(__language__( 30705 )) + else: + self._print_log(__language__( 30706 )) + if ( thumb_path == path ): + self._print_log(__language__( 30707 )) + else: + self._print_log(__language__( 30708 )) + if ( fanart_path == path ): + self._print_log(__language__( 30709 )) + else: + self._print_log(__language__( 30710 )) + + ext2s = ['png', 'jpg', 'gif', 'jpeg', 'bmp', 'PNG', 'JPG', 'GIF', 'JPEG', 'BMP'] + for ext2 in ext2s: + if ( thumb_path == fanart_path ): + if ( thumb_path == path ): + test_thumb = fullname.replace('.'+ext, '_thumb.'+ext2) + else: + test_thumb = os.path.join(thumb_path, f.replace('.'+ext, '_thumb.'+ext2)) + if ( fanart_path == path ): + test_fanart = fullname.replace('.'+ext, '_fanart.'+ext2) + else: + test_fanart = os.path.join(fanart_path, f.replace('.'+ext, '_fanart.'+ext2)) + else: + if ( thumb_path == path ): + test_thumb = fullname.replace('.'+ext, '.'+ext2) + else: + test_thumb = os.path.join(thumb_path, f.replace('.'+ext, '.'+ext2)) + if ( fanart_path == path ): + test_fanart = fullname.replace('.'+ext, '.'+ext2) + else: + test_fanart = os.path.join(fanart_path, f.replace('.'+ext, '.'+ext2)) + self._print_log(__language__( 30711 ) % test_thumb) + if ( os.path.isfile(test_thumb) ): + thumb = test_thumb + self._print_log(__language__( 30715 )) + else: + self._print_log(__language__( 30716 )) + self._print_log(__language__( 30712 ) % test_fanart) + if ( os.path.isfile(test_fanart) ): + fanart = test_fanart + self._print_log(__language__( 30715 )) + else: + self._print_log(__language__( 30716 )) + + self._print_log(__language__( 30713 ) % thumb) + self._print_log(__language__( 30714 ) % fanart) + + title = os.path.basename(romdata["filename"]).split(".")[0] + + if ( self.settings[ "thumbs_method" ] == "2" ): + # If overwrite is activated or thumb file not exist + if ( self.settings[ "overwrite_thumbs"] ) or ( thumb == "" ): + pDialog.update(filesCount * 100 / len(files), __language__( 30065 ) % (f.replace("."+f.split(".")[-1],""),self.settings[ "thumbs_scraper" ].encode('utf-8','ignore'))) + img_url="" + if (thumb_path == fanart_path): + if (thumb_path == path): + thumb = fullname.replace("."+f.split(".")[-1], '_thumb.jpg') + else: + thumb = os.path.join(thumb_path, f.replace("."+f.split(".")[-1], '_thumb.jpg')) + else: + if (thumb_path == path): + thumb = fullname.replace("."+f.split(".")[-1], '.jpg') + else: + thumb = os.path.join(thumb_path, f.replace("."+f.split(".")[-1], '.jpg')) + if ( app.lower().find('mame') > 0 ) or ( self.settings[ "thumbs_scraper" ] == 'arcadeHITS' ): + covers = self._get_thumbnails_list(romdata["gamesys"],title,self.settings[ "game_region" ],self.settings[ "thumb_image_size" ]) + else: + covers = self._get_thumbnails_list(romdata["gamesys"],romdata["name"],self.settings[ "game_region" ],self.settings[ "thumb_image_size" ]) + if covers: + if ( self.settings[ "scrap_thumbs" ] == "1" ): + if ( self.settings[ "snap_flyer" ] == "1" ) and ( self.settings[ "thumbs_scraper" ] == 'arcadeHITS' ): + img_url = self._get_thumbnail(covers[-1][0]) + else: + img_url = self._get_thumbnail(covers[0][0]) + else: + nb_images = len(covers) + pDialog.close() + self.image_url = MyDialog(covers) + if ( self.image_url ): + img_url = self._get_thumbnail(self.image_url) + ret = pDialog.create(__language__( 30000 ), __language__( 30014 ) % (path)) + pDialog.update(filesCount * 100 / len(files), __language__( 30061 ) % (f.replace("."+f.split(".")[-1],""),self.settings[ "datas_scraper" ].encode('utf-8','ignore'))) + cached_thumb = thumbnails.get_cached_covers_thumb( thumb ).replace("tbn" , "jpg") + if ( img_url !='' ): + try: + h = urllib.urlretrieve(img_url,thumb) + shutil.copy2( thumb.decode(sys.getfilesystemencoding(),'ignore') , cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) + except socket.timeout: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30604 ))) + except exceptions.IOError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30654 ))) + else: + if ( not os.path.isfile(thumb) ) & ( os.path.isfile(cached_thumb) ): + os.remove(cached_thumb) + romdata["thumb"] = thumb + else : + if ( self.settings[ "thumbs_method" ] == "0" ): + romdata["thumb"] = "" + else: + pDialog.update(filesCount * 100 / len(files), __language__( 30065 ) % (f.replace("."+f.split(".")[-1],""),__language__( 30172 ))) + romdata["thumb"] = thumb + + if ( self.settings[ "fanarts_method" ] == "2" ): + # If overwrite activated or fanart file not exist + if ( self.settings[ "overwrite_fanarts"] ) or ( fanart == "" ): + pDialog.update(filesCount * 100 / len(files), __language__( 30071 ) % (f.replace("."+f.split(".")[-1],""),self.settings[ "fanarts_scraper" ].encode('utf-8','ignore'))) + img_url="" + if (fanart_path == thumb_path): + if (fanart_path == path): + fanart = fullname.replace("."+f.split(".")[-1], '_fanart.jpg') + else: + fanart = os.path.join(fanart_path, f.replace("."+f.split(".")[-1], '_fanart.jpg')) + else: + if (fanart_path == path): + fanart = fullname.replace("."+f.split(".")[-1], '.jpg') + else: + fanart = os.path.join(fanart_path, f.replace("."+f.split(".")[-1], '.jpg')) + if ( app.lower().find('mame') > 0 ) or ( self.settings[ "fanarts_scraper" ] == 'arcadeHITS' ): + covers = self._get_fanarts_list(romdata["gamesys"],title,self.settings[ "fanart_image_size" ]) + else: + covers = self._get_fanarts_list(romdata["gamesys"],romdata["name"],self.settings[ "fanart_image_size" ]) + if covers: + if ( self.settings[ "scrap_fanarts" ] == "1" ): + if ( self.settings[ "select_fanarts" ] == "0" ): + img_url = self._get_fanart(covers[0][0]) + if ( self.settings[ "select_fanarts" ] == "1" ): + img_url = self._get_fanart(covers[int(round(len(covers)/2))-1][0]) + if ( self.settings[ "select_fanarts" ] == "2" ): + img_url = self._get_fanart(covers[len(covers)-1][0]) + else: + nb_images = len(covers) + pDialog.close() + self.image_url = MyDialog(covers) + if ( self.image_url ): + img_url = self._get_fanart(self.image_url) + ret = pDialog.create(__language__( 30000 ), __language__( 30014 ) % (path)) + pDialog.update(filesCount * 100 / len(files), __language__( 30061 ) % (f.replace("."+f.split(".")[-1],""),self.settings[ "datas_scraper" ].encode('utf-8','ignore'))) + cached_thumb = thumbnails.get_cached_covers_thumb( fanart ).replace("tbn" , "jpg") + if ( img_url !='' ): + try: + h = urllib.urlretrieve(img_url,fanart) + shutil.copy2( fanart.decode(sys.getfilesystemencoding(),'ignore') , cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) + except socket.timeout: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30606 ))) + except exceptions.IOError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30607 ))) + else: + if ( not os.path.isfile(fanart) ) & ( os.path.isfile(cached_thumb) ): + os.remove(cached_thumb) + romdata["fanart"] = fanart + else : + if ( self.settings[ "fanarts_method" ] == "0" ): + romdata["fanart"] = "" + else: + pDialog.update(filesCount * 100 / len(files), __language__( 30071 ) % (f.replace("."+f.split(".")[-1],""),__language__( 30172 ))) + romdata["fanart"] = fanart + + # add rom to the roms list (using name as index) + romid = _get_SID() + roms[romid] = romdata + romsCount = romsCount + 1 + + if (addRoms): + self._add_rom(launcherID, romdata["name"], romdata["filename"], romdata["gamesys"], romdata["thumb"], romdata["fanart"], romdata["trailer"], romdata["custom"], romdata["genre"], romdata["release"], romdata["studio"], romdata["plot"], romdata["finished"], len(files), key) + romadded = True + if not romadded: + self._print_log(__language__( 30731 )) + skipCount = skipCount + 1 + + filesCount = filesCount + 1 + self._save_launchers() + + if ( self.settings[ "scrap_info" ] != "0" ): + pDialog.close() + + if (skipCount == 0): + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30015 ) % (romsCount) + " " + __language__( 30050 ))) + xbmc.executebuiltin("XBMC.ReloadSkin()") + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30016 ) % (romsCount, skipCount) + " " + __language__( 30050 ))) + + def _add_launcher(self, name, cmd, path, thumbpath, fanartpath, trailerpath, custompath, ext, gamesys, thumb, fanart, genre, release, studio, plot, finished, lnk, minimize, roms, total, key) : + if (int(xbmc.getInfoLabel("System.BuildVersion")[0:2]) < 12 ): + # Dharma / Eden compatible + display_date_format = "Date" + else: + # Frodo & + compatible + display_date_format = "Year" + commands = [] + commands.append((__language__( 30512 ), "XBMC.RunPlugin(%s?%s)" % (self._path, SEARCH_COMMAND) , )) + commands.append((__language__( 30051 ), "XBMC.RunPlugin(%s?%s)" % (self._path, FILE_MANAGER_COMMAND) , )) + commands.append((__language__( 30101 ), "XBMC.RunPlugin(%s?%s)" % (self._path, ADD_COMMAND) , )) + commands.append(( __language__( 30109 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, key, EDIT_COMMAND) , )) + + if (path == ""): + folder = False + icon = "DefaultProgram.png" + else: + folder = True + icon = "DefaultFolder.png" + commands.append((__language__( 30106 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, key, ADD_COMMAND) , )) + + if (thumb): + listitem = xbmcgui.ListItem( name, iconImage=icon, thumbnailImage=thumb ) + else: + listitem = xbmcgui.ListItem( name, iconImage=icon ) + + filename = os.path.splitext(cmd) + if ( finished == "false" ): + ICON_OVERLAY = 6 + else: + ICON_OVERLAY = 7 + listitem.setProperty("fanart_image", fanart) + listitem.setInfo( "video", { "Title": name, "Label": os.path.basename(cmd), "Plot" : plot , "Studio" : studio , "Genre" : genre , "Premiered" : release , display_date_format : release , "Writer" : gamesys , "Trailer" : os.path.join(trailerpath), "Director" : os.path.join(custompath), "overlay": ICON_OVERLAY } ) + listitem.addContextMenuItems( commands ) + if ( finished == "false" ) or ( self.settings[ "hide_finished" ] == False) : + if (len(roms) > 0) : + xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s" % (self._path, key), listitem=listitem, isFolder=True) + else: + xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s" % (self._path, key), listitem=listitem, isFolder=False) + + def _add_rom( self, launcherID, name, cmd , romgamesys, thumb, romfanart, romtrailer, romcustom, romgenre, romrelease, romstudio, romplot, finished, total, key): + if (int(xbmc.getInfoLabel("System.BuildVersion")[0:2]) < 12 ): + # Dharma / Eden compatible + display_date_format = "Date" + else: + # Frodo & + compatible + display_date_format = "Year" + filename = os.path.splitext(cmd) + icon = "DefaultProgram.png" + if (thumb): + listitem = xbmcgui.ListItem( name, iconImage=icon, thumbnailImage=thumb) + else: + listitem = xbmcgui.ListItem( name, iconImage=icon) + if ( finished == "false" ): + ICON_OVERLAY = 6 + else: + ICON_OVERLAY = 7 + listitem.setProperty("fanart_image", romfanart) + listitem.setInfo( "video", { "Title": name, "Label": os.path.basename(cmd), "Plot" : romplot, "Studio" : romstudio, "Genre" : romgenre, "Premiered" : romrelease , display_date_format : romrelease, "Writer" : romgamesys, "Trailer" : os.path.join(romtrailer), "Director" : os.path.join(romcustom), "overlay": ICON_OVERLAY } ) + + commands = [] + commands.append((__language__( 30512 ), "XBMC.RunPlugin(%s?%s)" % (self._path, SEARCH_COMMAND) , )) + commands.append(( __language__( 30107 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, launcherID, key, EDIT_COMMAND) , )) + listitem.addContextMenuItems( commands ) + if ( finished == "false" ) or ( self.settings[ "hide_finished" ] == False) : + xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s" % (self._path, launcherID, key), listitem=listitem, isFolder=False) + + def _add_new_rom ( self , launcherID) : + dialog = xbmcgui.Dialog() + launcher = self.launchers[launcherID] + app = launcher["application"] + ext = launcher["romext"] + roms = launcher["roms"] + rompath = launcher["rompath"] + romgamesys = launcher["gamesys"] + thumb_path = launcher["thumbpath"] + fanart_path = launcher["fanartpath"] + trailer_path = launcher["trailerpath"] + custom_path = launcher["custompath"] + + romfile = dialog.browse(1, __language__( 30017 ),"files", "."+ext.replace("|","|."), False, False, rompath) + if (romfile): + title=os.path.basename(romfile) + keyboard = xbmc.Keyboard(title.replace('.'+title.split('.')[-1],'').replace('.',' '), __language__( 30018 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + title = keyboard.getText() + if ( title == "" ): + title = os.path.basename(romfile) + title = title.replace('.'+title.split('.')[-1],'').replace('.',' ') + # prepare rom object data + romdata = {} + # Romname conversion if MAME + if ( app.lower().find('mame') > 0 ): + romname = self._get_mame_title(title) + romdata["name"] = title_format(self,romname) + else: + romdata["name"] = title_format(self,title) + romdata["filename"] = romfile + romdata["gamesys"] = romgamesys + romdata["thumb"] = "" + romdata["fanart"] = "" + # Search for default thumbnails and fanart images path + ext2s = ['png', 'jpg', 'gif', 'jpeg', 'bmp', 'PNG', 'JPG', 'GIF', 'JPEG', 'BMP'] + f = os.path.basename(romfile) + for ext2 in ext2s: + if (thumb_path == fanart_path) : + if (thumb_path == rompath) : + if (os.path.isfile(os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '_thumb.'+ext2)))): + romdata["thumb"] = os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '_thumb.'+ext2)) + else: + if (os.path.isfile(os.path.join(thumb_path, f.replace("."+f.split(".")[-1], '_thumb.'+ext2)))): + romdata["thumb"] = os.path.join(thumb_path, f.replace("."+f.split(".")[-1], '_thumb.'+ext2)) + else: + if (thumb_path == "") : + romdata["thumb"] = os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '_thumb.jpg')) + else: + if (thumb_path == rompath) : + if (os.path.isfile(os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '.'+ext2)))): + romdata["thumb"] = os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '.'+ext2)) + else: + if (os.path.isfile(os.path.join(thumb_path, f.replace("."+f.split(".")[-1], '.'+ext2)))): + romdata["thumb"] = os.path.join(thumb_path, f.replace("."+f.split(".")[-1], '.'+ext2)) + + if (fanart_path == thumb_path) : + if (fanart_path == rompath) : + if (os.path.isfile(os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '_fanart.'+ext2)))): + romdata["fanart"] = os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '_fanart.'+ext2)) + else: + if (os.path.isfile(os.path.join(fanart_path, f.replace("."+f.split(".")[-1], '_fanart.'+ext2)))): + romdata["fanart"] = os.path.join(fanart_path, f.replace("."+f.split(".")[-1], '_fanart.'+ext2)) + else: + if (fanart_path == "") : + romdata["fanart"] = os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '_fanart.jpg')) + else: + if (fanart_path == rompath) : + if (os.path.isfile(os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '.'+ext2)))): + romdata["fanart"] = os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '.'+ext2)) + else: + if (os.path.isfile(os.path.join(fanart_path, f.replace("."+f.split(".")[-1], '.'+ext2)))): + romdata["fanart"] = os.path.join(fanart_path, f.replace("."+f.split(".")[-1], '.'+ext2)) + romdata["custom"] = custom_path + romdata["trailer"] = "" + romdata["genre"] = "" + romdata["release"] = "" + romdata["studio"] = "" + romdata["plot"] = "" + romdata["finished"] = "false" + + # add rom to the roms list (using name as index) + romid = _get_SID() + roms[romid] = romdata + + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30019 ) + " " + __language__( 30050 ))) + + self._save_launchers() + + def _add_new_launcher ( self ) : + dialog = xbmcgui.Dialog() + type = dialog.select(__language__( 30101 ), [__language__( 30021 ), __language__( 30022 ),__language__( 30051 )]) + if (os.environ.get( "OS", "xbox" ) == "xbox"): + filter = ".xbe|.cut" + else: + if (sys.platform == "win32"): + filter = ".bat|.exe|.cmd|.lnk" + else: + filter = "" + + if (type == 0): + app = xbmcgui.Dialog().browse(1,__language__( 30023 ),"files",filter) + if (app): + argument = self._get_program_arguments(os.path.basename(app)) + argkeyboard = xbmc.Keyboard(argument, __language__( 30024 )) + argkeyboard.doModal() + args = argkeyboard.getText() + title = os.path.basename(app) + keyboard = xbmc.Keyboard(title.replace('.'+title.split('.')[-1],'').replace('.',' '), __language__( 30025 )) + keyboard.doModal() + title = keyboard.getText() + if ( title == "" ): + title = os.path.basename(app) + title = title.replace('.'+title.split('.')[-1],'').replace('.',' ') + # Selection of the launcher game system + dialog = xbmcgui.Dialog() + platforms = _get_game_system_list() + gamesystem = dialog.select(__language__( 30077 ), platforms) + # Selection of the thumbnails and fanarts path + if ( self.settings[ "launcher_thumb_path" ] == "" ): + thumb_path = xbmcgui.Dialog().browse(0,__language__( 30059 ),"files","", False, False) + else: + thumb_path = self.settings[ "launcher_thumb_path" ] + if ( self.settings[ "launcher_fanart_path" ] == "" ): + fanart_path = xbmcgui.Dialog().browse(0,__language__( 30060 ),"files","", False, False) + else: + fanart_path = self.settings[ "launcher_fanart_path" ] + # prepare launcher object data + launcherdata = {} + launcherdata["name"] = title + launcherdata["application"] = app + launcherdata["args"] = args + launcherdata["rompath"] = "" + if (thumb_path): + launcherdata["thumbpath"] = thumb_path + else: + launcherdata["thumbpath"] = "" + if (fanart_path): + launcherdata["fanartpath"] = fanart_path + else: + launcherdata["fanartpath"] = "" + launcherdata["custompath"] = "" + launcherdata["trailerpath"] = "" + launcherdata["romext"] = "" + if (not gamesystem == -1 ): + launcherdata["gamesys"] = platforms[gamesystem] + else: + launcherdata["gamesys"] = "" + launcherdata["thumb"] = "" + launcherdata["fanart"] = "" + launcherdata["genre"] = "" + launcherdata["release"] = "" + launcherdata["studio"] = "" + launcherdata["plot"] = "" + launcherdata["finished"] = "false" + if (sys.platform == "win32"): + launcherdata["lnk"] = "true" + else: + launcherdata["lnk"] = "" + launcherdata["minimize"] = "false" + launcherdata["roms"] = {} + + # add launcher to the launchers list (using name as index) + launcherid = _get_SID() + self.launchers[launcherid] = launcherdata + self._save_launchers() + + xbmc.executebuiltin("Container.Update") + return True + + if (type == 1): + app = xbmcgui.Dialog().browse(1,__language__( 30023 ),"files",filter) + if (app): + path = xbmcgui.Dialog().browse(0,__language__( 30058 ),"files", "", False, False) + if (path): + extensions = self._get_program_extensions(os.path.basename(app)) + extkey = xbmc.Keyboard(extensions, __language__( 30028 )) + extkey.doModal() + if (extkey.isConfirmed()): + ext = extkey.getText() + argument = self._get_program_arguments(os.path.basename(app)) + argkeyboard = xbmc.Keyboard(argument, __language__( 30024 )) + argkeyboard.doModal() + args = argkeyboard.getText() + title = os.path.basename(app) + keyboard = xbmc.Keyboard(title.replace('.'+title.split('.')[-1],'').replace('.',' '), __language__( 30025 )) + keyboard.doModal() + title = keyboard.getText() + if ( title == "" ): + title = os.path.basename(app) + title = title.replace('.'+title.split('.')[-1],'').replace('.',' ') + # Selection of the launcher game system + dialog = xbmcgui.Dialog() + platforms = _get_game_system_list() + gamesystem = dialog.select(__language__( 30077 ), platforms) + # Selection of the thumbnails and fanarts path + thumb_path = xbmcgui.Dialog().browse(0,__language__( 30059 ),"files","", False, False, os.path.join(path)) + fanart_path = xbmcgui.Dialog().browse(0,__language__( 30060 ),"files","", False, False, os.path.join(path)) + # prepare launcher object data + launcherdata = {} + launcherdata["name"] = title + launcherdata["application"] = app + launcherdata["args"] = args + launcherdata["rompath"] = path + if (thumb_path): + launcherdata["thumbpath"] = thumb_path + else: + launcherdata["thumbpath"] = "" + if (fanart_path): + launcherdata["fanartpath"] = fanart_path + else: + launcherdata["fanartpath"] = "" + launcherdata["custompath"] = "" + launcherdata["trailerpath"] = "" + launcherdata["romext"] = ext + if (not gamesystem == -1 ): + launcherdata["gamesys"] = platforms[gamesystem] + else: + launcherdata["gamesys"] = "" + launcherdata["thumb"] = "" + launcherdata["fanart"] = "" + launcherdata["genre"] = "" + launcherdata["release"] = "" + launcherdata["studio"] = "" + launcherdata["plot"] = "" + launcherdata["finished"] = "false" + if (sys.platform == "win32"): + launcherdata["lnk"] = "true" + else: + launcherdata["lnk"] = "" + launcherdata["minimize"] = "false" + launcherdata["roms"] = {} + + # add launcher to the launchers list (using name as index) + launcherid = _get_SID() + self.launchers[launcherid] = launcherdata + self._save_launchers() + xbmc.executebuiltin("Container.Update") + return True + if (type == 2): + self._file_manager() + + return False + + def _file_manager( self ): + xbmc.executebuiltin("ActivateWindow(filemanager)") + + def _find_roms( self ): + dialog = xbmcgui.Dialog() + type = dialog.select(__language__( 30400 ), [__language__( 30401 ),__language__( 30402 ),__language__( 30403 ),__language__( 30404 ),__language__( 30405 )]) + type_nb = 0 + + #Search by Title + if (type == type_nb ): + keyboard = xbmc.Keyboard("", __language__( 30036 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + search = keyboard.getText() + xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s)" % (self._path, search, SEARCH_COMMAND)) + + #Search by Release Date + type_nb = type_nb+1 + if (type == type_nb ): + search = [] + search = _search_category(self,"release") + dialog = xbmcgui.Dialog() + selected = dialog.select(__language__( 30406 ), search) + if (not selected == -1 ): + xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s)" % (self._path, search[selected], SEARCH_DATE_COMMAND)) + + #Search by System Platform + type_nb = type_nb+1 + if (type == type_nb ): + search = [] + search = _search_category(self,"gamesys") + dialog = xbmcgui.Dialog() + selected = dialog.select(__language__( 30407 ), search) + if (not selected == -1 ): + xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s)" % (self._path, search[selected], SEARCH_PLATFORM_COMMAND)) + + #Search by Studio + type_nb = type_nb+1 + if (type == type_nb ): + search = [] + search = _search_category(self,"studio") + dialog = xbmcgui.Dialog() + selected = dialog.select(__language__( 30408 ), search) + if (not selected == -1 ): + xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s)" % (self._path, search[selected], SEARCH_STUDIO_COMMAND)) + + #Search by Genre + type_nb = type_nb+1 + if (type == type_nb ): + search = [] + search = _search_category(self,"genre") + dialog = xbmcgui.Dialog() + selected = dialog.select(__language__( 30409 ), search) + if (not selected == -1 ): + xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s)" % (self._path, search[selected], SEARCH_GENRE_COMMAND)) + + def _find_add_roms( self, search ): + _find_category_roms( self, search, "name" ) + + def _find_date_add_roms( self, search ): + _find_category_roms( self, search, "release" ) + + def _find_platform_add_roms( self, search ): + _find_category_roms( self, search, "gamesys" ) + + def _find_studio_add_roms( self, search ): + _find_category_roms( self, search, "studio" ) + + def _find_genre_add_roms( self, search ): + _find_category_roms( self, search, "genre" ) + +class MainGui( xbmcgui.WindowXMLDialog ): + def __init__( self, *args, **kwargs ): + xbmcgui.WindowXMLDialog.__init__( self, *args, **kwargs ) + xbmc.executebuiltin( "Skin.Reset(AnimeWindowXMLDialogClose)" ) + xbmc.executebuiltin( "Skin.SetBool(AnimeWindowXMLDialogClose)" ) + self.listing = kwargs.get( "listing" ) + + def onInit(self): + try : + self.img_list = self.getControl(6) + self.img_list.controlLeft(self.img_list) + self.img_list.controlRight(self.img_list) + self.getControl(3).setVisible(False) + except : + print_exc() + self.img_list = self.getControl(3) + + self.getControl(5).setVisible(False) + + for index, item in enumerate(self.listing): + listitem = xbmcgui.ListItem( item[2] ) + listitem.setIconImage( item[1] ) + listitem.setLabel2( item[0] ) + + self.img_list.addItem( listitem ) + self.setFocus(self.img_list) + + def onAction(self, action): + #Close the script + if action == 10 : + self.close() + + def onClick(self, controlID): + #action sur la liste + if controlID == 6 or controlID == 3: + #Renvoie l'item selectionne + num = self.img_list.getSelectedPosition() + self.selected_url = self.img_list.getSelectedItem().getLabel2() + self.close() + + def onFocus(self, controlID): + pass + +def MyDialog(img_list): + w = MainGui( "DialogSelect.xml", BASE_PATH, listing=img_list ) + w.doModal() + try: + return w.selected_url + except: + print_exc() + return False + del w + +def _update_cache(file_path): + cached_thumb = thumbnails.get_cached_covers_thumb( file_path ).replace("tbn" , os.path.splitext(file_path)[-1][1:4]) + try: + shutil.copy2( file_path.decode(sys.getfilesystemencoding(),'ignore') , cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) + except OSError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30608 ))) + xbmc.executebuiltin("XBMC.ReloadSkin()") + +def title_format(self,title): + if ( self.settings[ "clean_title" ] ): + title = re.sub('\[.*?\]', '', title) + title = re.sub('\(.*?\)', '', title) + title = re.sub('\{.*?\}', '', title) + new_title = title.rstrip() + if ( self.settings[ "title_formating" ] ): + if (title.startswith("The ")): new_title = title.replace("The ","",1)+", The" + if (title.startswith("A ")): new_title = title.replace("A ","",1)+", A" + if (title.startswith("An ")): new_title = title.replace("An ","",1)+", An" + else: + if (title.endswith(", The")): new_title = "The "+"".join(title.rsplit(", The",1)) + if (title.endswith(", A")): new_title = "A "+"".join(title.rsplit(", A",1)) + if (title.endswith(", An")): new_title = "An "+"".join(title.rsplit(", An",1)) + return new_title + +def clean_filename(title): + title = re.sub('\[.*?\]', '', title) + title = re.sub('\(.*?\)', '', title) + title = re.sub('\{.*?\}', '', title) + title = title.replace('_',' ') + title = title.replace('-',' ') + title = title.replace(':',' ') + title = title.replace('.',' ') + title = title.rstrip() + return title + +def base_filename(filename): + filename = re.sub('(\[.*?\]|\(.*?\)|\{.*?\})', '', filename) + filename = re.sub('(\.|-| |_)cd\d+$', '', filename) + return filename.rstrip() + +def _toogle_fullscreen(): + try: + # Dharma / Eden compatible + xbmc.executehttpapi("Action(199)") + except: + # Frodo & + compatible + xbmc.executeJSONRPC('{"jsonrpc":"2.0","method":"Input.ExecuteAction","params":{"action":"togglefullscreen"},"id":"1"}') + +def _get_SID(): + t1 = time.time() + t2 = t1 + random.getrandbits(32) + try: + # Eden & + compatible + base = hashlib.md5( str(t1 +t2) ) + except: + # Dharma compatible + base = md5.new( str(t1 +t2) ) + sid = base.hexdigest() + return sid + +def _get_game_system_list(): + platforms = [] + try: + rootDir = __settings__.getAddonInfo('path') + if rootDir[-1] == ';':rootDir = rootDir[0:-1] + resDir = os.path.join(rootDir, 'resources') + scrapDir = os.path.join(resDir, 'scrapers') + csvfile = open( os.path.join(scrapDir, 'gamesys'), "rb") + for line in csvfile.readlines(): + result = line.replace('\n', '').replace('"', '').split(',') + platforms.append(result[0]) + platforms.sort() + return platforms + except: + return platforms + +def _search_category(self,category): + search = [] + if (len(self.launchers) > 0): + for key in sorted(self.launchers.iterkeys()): + if (len(self.launchers[key]["roms"]) > 0) : + for keyr in sorted(self.launchers[key]["roms"].iterkeys()): + if ( self.launchers[key]["roms"][keyr][category] == "" ): + search.append("[ %s ]" % __language__( 30410 )) + else: + search.append(self.launchers[key]["roms"][keyr][category]) + search = list(set(search)) + search.sort() + return search + +def _find_category_roms( self, search, category ): + #sorted by name + if (len(self.launchers) > 0): + rl = {} + for launcherID in sorted(self.launchers.iterkeys()): + selectedLauncher = self.launchers[launcherID] + roms = selectedLauncher["roms"] + notset = ("[ %s ]" % __language__( 30410 )) + text = search.lower() + empty = notset.lower() + if (len(roms) > 0) : + #go through rom list and search for user input + for keyr in sorted(roms.iterkeys()): + rom = roms[keyr][category].lower() + if (rom == "") and (text == empty): + rl[keyr] = roms[keyr] + rl[keyr]["launcherID"] = launcherID + if category == 'name': + if (not rom.find(text) == -1): + rl[keyr] = roms[keyr] + rl[keyr]["launcherID"] = launcherID + else: + if (rom == text): + rl[keyr] = roms[keyr] + rl[keyr]["launcherID"] = launcherID + #print the list sorted + for key in sorted(rl.iterkeys()): + self._add_rom(rl[key]["launcherID"], rl[key]["name"], rl[key]["filename"], rl[key]["gamesys"], rl[key]["thumb"], rl[key]["fanart"], rl[key]["trailer"], rl[key]["custom"], rl[key]["genre"], rl[key]["release"], rl[key]["studio"], rl[key]["plot"], rl[key]["finished"], len(rl), key) + xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) diff --git a/resources/lib/subprocess_hack.py b/resources/lib/subprocess_hack.py new file mode 100644 index 0000000..c9f3832 --- /dev/null +++ b/resources/lib/subprocess_hack.py @@ -0,0 +1,1150 @@ +# subprocess - Subprocesses with accessible I/O streams +# +# For more information about this module, see PEP 324. +# +# This module should remain compatible with Python 2.2, see PEP 291. +# +# Copyright (c) 2003-2005 by Peter Astrand +# +# Licensed to PSF under a Contributor Agreement. +# See http://www.python.org/2.4/license for licensing details. + +r"""subprocess - Subprocesses with accessible I/O streams + +This module allows you to spawn processes, connect to their +input/output/error pipes, and obtain their return codes. This module +intends to replace several other, older modules and functions, like: + +os.system +os.spawn* +os.popen* +popen2.* +commands.* + +Information about how the subprocess module can be used to replace these +modules and functions can be found below. + + + +Using the subprocess module +=========================== +This module defines one class called Popen: + +class Popen(args, bufsize=0, executable=None, + stdin=None, stdout=None, stderr=None, + preexec_fn=None, close_fds=False, shell=False, + cwd=None, env=None, universal_newlines=False, + startupinfo=None, creationflags=0): + + +Arguments are: + +args should be a string, or a sequence of program arguments. The +program to execute is normally the first item in the args sequence or +string, but can be explicitly set by using the executable argument. + +On UNIX, with shell=False (default): In this case, the Popen class +uses os.execvp() to execute the child program. args should normally +be a sequence. A string will be treated as a sequence with the string +as the only item (the program to execute). + +On UNIX, with shell=True: If args is a string, it specifies the +command string to execute through the shell. If args is a sequence, +the first item specifies the command string, and any additional items +will be treated as additional shell arguments. + +On Windows: the Popen class uses CreateProcess() to execute the child +program, which operates on strings. If args is a sequence, it will be +converted to a string using the list2cmdline method. Please note that +not all MS Windows applications interpret the command line the same +way: The list2cmdline is designed for applications using the same +rules as the MS C runtime. + +bufsize, if given, has the same meaning as the corresponding argument +to the built-in open() function: 0 means unbuffered, 1 means line +buffered, any other positive value means use a buffer of +(approximately) that size. A negative bufsize means to use the system +default, which usually means fully buffered. The default value for +bufsize is 0 (unbuffered). + +stdin, stdout and stderr specify the executed programs' standard +input, standard output and standard error file handles, respectively. +Valid values are PIPE, an existing file descriptor (a positive +integer), an existing file object, and None. PIPE indicates that a +new pipe to the child should be created. With None, no redirection +will occur; the child's file handles will be inherited from the +parent. Additionally, stderr can be STDOUT, which indicates that the +stderr data from the applications should be captured into the same +file handle as for stdout. + +If preexec_fn is set to a callable object, this object will be called +in the child process just before the child is executed. + +If close_fds is true, all file descriptors except 0, 1 and 2 will be +closed before the child process is executed. + +if shell is true, the specified command will be executed through the +shell. + +If cwd is not None, the current directory will be changed to cwd +before the child is executed. + +If env is not None, it defines the environment variables for the new +process. + +If universal_newlines is true, the file objects stdout and stderr are +opened as a text files, but lines may be terminated by any of '\n', +the Unix end-of-line convention, '\r', the Macintosh convention or +'\r\n', the Windows convention. All of these external representations +are seen as '\n' by the Python program. Note: This feature is only +available if Python is built with universal newline support (the +default). Also, the newlines attribute of the file objects stdout, +stdin and stderr are not updated by the communicate() method. + +The startupinfo and creationflags, if given, will be passed to the +underlying CreateProcess() function. They can specify things such as +appearance of the main window and priority for the new process. +(Windows only) + + +This module also defines two shortcut functions: + +call(*args, **kwargs): + Run command with arguments. Wait for command to complete, then + return the returncode attribute. + + The arguments are the same as for the Popen constructor. Example: + + retcode = call(["ls", "-l"]) + + +Exceptions +---------- +Exceptions raised in the child process, before the new program has +started to execute, will be re-raised in the parent. Additionally, +the exception object will have one extra attribute called +'child_traceback', which is a string containing traceback information +from the childs point of view. + +The most common exception raised is OSError. This occurs, for +example, when trying to execute a non-existent file. Applications +should prepare for OSErrors. + +A ValueError will be raised if Popen is called with invalid arguments. + + +Security +-------- +Unlike some other popen functions, this implementation will never call +/bin/sh implicitly. This means that all characters, including shell +metacharacters, can safely be passed to child processes. + + +Popen objects +============= +Instances of the Popen class have the following methods: + +poll() + Check if child process has terminated. Returns returncode + attribute. + +wait() + Wait for child process to terminate. Returns returncode attribute. + +communicate(input=None) + Interact with process: Send data to stdin. Read data from stdout + and stderr, until end-of-file is reached. Wait for process to + terminate. The optional stdin argument should be a string to be + sent to the child process, or None, if no data should be sent to + the child. + + communicate() returns a tuple (stdout, stderr). + + Note: The data read is buffered in memory, so do not use this + method if the data size is large or unlimited. + +The following attributes are also available: + +stdin + If the stdin argument is PIPE, this attribute is a file object + that provides input to the child process. Otherwise, it is None. + +stdout + If the stdout argument is PIPE, this attribute is a file object + that provides output from the child process. Otherwise, it is + None. + +stderr + If the stderr argument is PIPE, this attribute is file object that + provides error output from the child process. Otherwise, it is + None. + +pid + The process ID of the child process. + +returncode + The child return code. A None value indicates that the process + hasn't terminated yet. A negative value -N indicates that the + child was terminated by signal N (UNIX only). + + +Replacing older functions with the subprocess module +==================================================== +In this section, "a ==> b" means that b can be used as a replacement +for a. + +Note: All functions in this section fail (more or less) silently if +the executed program cannot be found; this module raises an OSError +exception. + +In the following examples, we assume that the subprocess module is +imported with "from subprocess import *". + + +Replacing /bin/sh shell backquote +--------------------------------- +output=`mycmd myarg` +==> +output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0] + + +Replacing shell pipe line +------------------------- +output=`dmesg | grep hda` +==> +p1 = Popen(["dmesg"], stdout=PIPE) +p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) +output = p2.communicate()[0] + + +Replacing os.system() +--------------------- +sts = os.system("mycmd" + " myarg") +==> +p = Popen("mycmd" + " myarg", shell=True) +sts = os.waitpid(p.pid, 0) + +Note: + +* Calling the program through the shell is usually not required. + +* It's easier to look at the returncode attribute than the + exitstatus. + +A more real-world example would look like this: + +try: + retcode = call("mycmd" + " myarg", shell=True) + if retcode < 0: + print >>sys.stderr, "Child was terminated by signal", -retcode + else: + print >>sys.stderr, "Child returned", retcode +except OSError, e: + print >>sys.stderr, "Execution failed:", e + + +Replacing os.spawn* +------------------- +P_NOWAIT example: + +pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg") +==> +pid = Popen(["/bin/mycmd", "myarg"]).pid + + +P_WAIT example: + +retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg") +==> +retcode = call(["/bin/mycmd", "myarg"]) + + +Vector example: + +os.spawnvp(os.P_NOWAIT, path, args) +==> +Popen([path] + args[1:]) + + +Environment example: + +os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env) +==> +Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"}) + + +Replacing os.popen* +------------------- +pipe = os.popen(cmd, mode='r', bufsize) +==> +pipe = Popen(cmd, shell=True, bufsize=bufsize, stdout=PIPE).stdout + +pipe = os.popen(cmd, mode='w', bufsize) +==> +pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin + + +(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize) +==> +p = Popen(cmd, shell=True, bufsize=bufsize, + stdin=PIPE, stdout=PIPE, close_fds=True) +(child_stdin, child_stdout) = (p.stdin, p.stdout) + + +(child_stdin, + child_stdout, + child_stderr) = os.popen3(cmd, mode, bufsize) +==> +p = Popen(cmd, shell=True, bufsize=bufsize, + stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) +(child_stdin, + child_stdout, + child_stderr) = (p.stdin, p.stdout, p.stderr) + + +(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize) +==> +p = Popen(cmd, shell=True, bufsize=bufsize, + stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True) +(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout) + + +Replacing popen2.* +------------------ +Note: If the cmd argument to popen2 functions is a string, the command +is executed through /bin/sh. If it is a list, the command is directly +executed. + +(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode) +==> +p = Popen(["somestring"], shell=True, bufsize=bufsize + stdin=PIPE, stdout=PIPE, close_fds=True) +(child_stdout, child_stdin) = (p.stdout, p.stdin) + + +(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode) +==> +p = Popen(["mycmd", "myarg"], bufsize=bufsize, + stdin=PIPE, stdout=PIPE, close_fds=True) +(child_stdout, child_stdin) = (p.stdout, p.stdin) + +The popen2.Popen3 and popen3.Popen4 basically works as subprocess.Popen, +except that: + +* subprocess.Popen raises an exception if the execution fails +* the capturestderr argument is replaced with the stderr argument. +* stdin=PIPE and stdout=PIPE must be specified. +* popen2 closes all filedescriptors by default, but you have to specify + close_fds=True with subprocess.Popen. + + +""" + +# -*- coding: UTF-8 -*- +import sys +mswindows = (sys.platform == "win32") + +import os +import types +import traceback + +if mswindows: + import threading + import msvcrt + if 0: # <-- change this to use pywin32 instead of the _subprocess driver + import pywintypes + from win32api import GetStdHandle, STD_INPUT_HANDLE, \ + STD_OUTPUT_HANDLE, STD_ERROR_HANDLE + from win32api import GetCurrentProcess, DuplicateHandle, \ + GetModuleFileName, GetVersion + from win32con import DUPLICATE_SAME_ACCESS, SW_HIDE + from win32pipe import CreatePipe + from win32process import CreateProcess, STARTUPINFO, \ + GetExitCodeProcess, STARTF_USESTDHANDLES, \ + STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE + from win32event import WaitForSingleObject, INFINITE, WAIT_OBJECT_0 + else: + from _subprocess import * + class STARTUPINFO: + dwFlags = 0 + hStdInput = None + hStdOutput = None + hStdError = None + wShowWindow = 0 + class pywintypes: + error = IOError +else: + import select + import errno + import fcntl + import pickle + +__all__ = ["Popen", "PIPE", "STDOUT", "call"] + +try: + MAXFD = os.sysconf("SC_OPEN_MAX") +except: + MAXFD = 256 + +# True/False does not exist on 2.2.0 +try: + False +except NameError: + False = 0 + True = 1 + +_active = [] + +def _cleanup(): + for inst in _active[:]: + inst.poll() + +PIPE = -1 +STDOUT = -2 + + +def call(*args, **kwargs): + """Run command with arguments. Wait for command to complete, then + return the returncode attribute. + + The arguments are the same as for the Popen constructor. Example: + + retcode = call(["ls", "-l"]) + """ + return Popen(*args, **kwargs).wait() + + +def list2cmdline(seq): + """ + Translate a sequence of arguments into a command line + string, using the same rules as the MS C runtime: + + 1) Arguments are delimited by white space, which is either a + space or a tab. + + 2) A string surrounded by double quotation marks is + interpreted as a single argument, regardless of white space + contained within. A quoted string can be embedded in an + argument. + + 3) A double quotation mark preceded by a backslash is + interpreted as a literal double quotation mark. + + 4) Backslashes are interpreted literally, unless they + immediately precede a double quotation mark. + + 5) If backslashes immediately precede a double quotation mark, + every pair of backslashes is interpreted as a literal + backslash. If the number of backslashes is odd, the last + backslash escapes the next double quotation mark as + described in rule 3. + """ + + # See + # http://msdn.microsoft.com/library/en-us/vccelng/htm/progs_12.asp + result = [] + needquote = False + for arg in seq: + bs_buf = [] + + # Add a space to separate this argument from the others + if result: + result.append(' ') + + needquote = (" " in arg) or ("\t" in arg) + if needquote: + result.append('"') + + for c in arg: + if c == '\\': + # Don't know if we need to double yet. + bs_buf.append(c) + elif c == '"': + # Double backspaces. + result.append('\\' * len(bs_buf)*2) + bs_buf = [] + result.append('\\"') + else: + # Normal char + if bs_buf: + result.extend(bs_buf) + bs_buf = [] + result.append(c) + + # Add remaining backspaces, if any. + if bs_buf: + result.extend(bs_buf) + + if needquote: + result.extend(bs_buf) + result.append('"') + + return ''.join(result) + + +class Popen(object): + def __init__(self, args, bufsize=0, executable=None, + stdin=None, stdout=None, stderr=None, + preexec_fn=None, close_fds=False, shell=False, + cwd=None, env=None, universal_newlines=False, + startupinfo=None, creationflags=0): + """Create new Popen instance.""" + _cleanup() + + if not isinstance(bufsize, (int, long)): + raise TypeError("bufsize must be an integer") + + if mswindows: + if preexec_fn is not None: + raise ValueError("preexec_fn is not supported on Windows " + "platforms") + if close_fds: + raise ValueError("close_fds is not supported on Windows " + "platforms") + else: + # POSIX + if startupinfo is not None: + raise ValueError("startupinfo is only supported on Windows " + "platforms") + if creationflags != 0: + raise ValueError("creationflags is only supported on Windows " + "platforms") + + self.stdin = None + self.stdout = None + self.stderr = None + self.pid = None + self.returncode = None + self.universal_newlines = universal_newlines + + # Input and output objects. The general principle is like + # this: + # + # Parent Child + # ------ ----- + # p2cwrite ---stdin---> p2cread + # c2pread <--stdout--- c2pwrite + # errread <--stderr--- errwrite + # + # On POSIX, the child objects are file descriptors. On + # Windows, these are Windows file handles. The parent objects + # are file descriptors on both platforms. The parent objects + # are None when not using PIPEs. The child objects are None + # when not redirecting. + + (p2cread, p2cwrite, + c2pread, c2pwrite, + errread, errwrite) = self._get_handles(stdin, stdout, stderr) + + self._execute_child(args, executable, preexec_fn, close_fds, + cwd, env, universal_newlines, + startupinfo, creationflags, shell, + p2cread, p2cwrite, + c2pread, c2pwrite, + errread, errwrite) + + if p2cwrite: + self.stdin = os.fdopen(p2cwrite, 'wb', bufsize) + if c2pread: + if universal_newlines: + self.stdout = os.fdopen(c2pread, 'rU', bufsize) + else: + self.stdout = os.fdopen(c2pread, 'rb', bufsize) + if errread: + if universal_newlines: + self.stderr = os.fdopen(errread, 'rU', bufsize) + else: + self.stderr = os.fdopen(errread, 'rb', bufsize) + + _active.append(self) + + + def _translate_newlines(self, data): + data = data.replace("\r\n", "\n") + data = data.replace("\r", "\n") + return data + + + if mswindows: + # + # Windows methods + # + def _get_handles(self, stdin, stdout, stderr): + """Construct and return tupel with IO objects: + p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite + """ + if stdin == None and stdout == None and stderr == None: + return (None, None, None, None, None, None) + + p2cread, p2cwrite = None, None + c2pread, c2pwrite = None, None + errread, errwrite = None, None + + if stdin == None: + p2cread = GetStdHandle(STD_INPUT_HANDLE) + elif stdin == PIPE: + p2cread, p2cwrite = CreatePipe(None, 0) + # Detach and turn into fd + p2cwrite = p2cwrite.Detach() + p2cwrite = msvcrt.open_osfhandle(p2cwrite, 0) + elif type(stdin) == types.IntType: + p2cread = msvcrt.get_osfhandle(stdin) + else: + # Assuming file-like object + p2cread = msvcrt.get_osfhandle(stdin.fileno()) + p2cread = self._make_inheritable(p2cread) + + if stdout == None: + c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE) + elif stdout == PIPE: + c2pread, c2pwrite = CreatePipe(None, 0) + # Detach and turn into fd + c2pread = c2pread.Detach() + c2pread = msvcrt.open_osfhandle(c2pread, 0) + elif type(stdout) == types.IntType: + c2pwrite = msvcrt.get_osfhandle(stdout) + else: + # Assuming file-like object + c2pwrite = msvcrt.get_osfhandle(stdout.fileno()) + c2pwrite = self._make_inheritable(c2pwrite) + + if stderr == None: + errwrite = GetStdHandle(STD_ERROR_HANDLE) + elif stderr == PIPE: + errread, errwrite = CreatePipe(None, 0) + # Detach and turn into fd + errread = errread.Detach() + errread = msvcrt.open_osfhandle(errread, 0) + elif stderr == STDOUT: + errwrite = c2pwrite + elif type(stderr) == types.IntType: + errwrite = msvcrt.get_osfhandle(stderr) + else: + # Assuming file-like object + errwrite = msvcrt.get_osfhandle(stderr.fileno()) + errwrite = self._make_inheritable(errwrite) + + return (p2cread, p2cwrite, + c2pread, c2pwrite, + errread, errwrite) + + + def _make_inheritable(self, handle): + """Return a duplicate of handle, which is inheritable""" + return DuplicateHandle(GetCurrentProcess(), handle, + GetCurrentProcess(), 0, 1, + DUPLICATE_SAME_ACCESS) + + + def _find_w9xpopen(self): + """Find and return absolut path to w9xpopen.exe""" + w9xpopen = os.path.join(os.path.dirname(GetModuleFileName(0)), + "w9xpopen.exe") + if not os.path.exists(w9xpopen): + # Eeek - file-not-found - possibly an embedding + # situation - see if we can locate it in sys.exec_prefix + w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix), + "w9xpopen.exe") + if not os.path.exists(w9xpopen): + raise RuntimeError("Cannot locate w9xpopen.exe, which is " + "needed for Popen to work with your " + "shell or platform.") + return w9xpopen + + + def _execute_child(self, args, executable, preexec_fn, close_fds, + cwd, env, universal_newlines, + startupinfo, creationflags, shell, + p2cread, p2cwrite, + c2pread, c2pwrite, + errread, errwrite): + """Execute program (MS Windows version)""" + + if not isinstance(args, types.StringTypes): + args = list2cmdline(args) + + # Process startup details + if startupinfo == None: + startupinfo = STARTUPINFO() + if None not in (p2cread, c2pwrite, errwrite): + startupinfo.dwFlags |= STARTF_USESTDHANDLES + startupinfo.hStdInput = p2cread + startupinfo.hStdOutput = c2pwrite + startupinfo.hStdError = errwrite + + if shell: + startupinfo.dwFlags |= STARTF_USESHOWWINDOW + startupinfo.wShowWindow = SW_HIDE + comspec = os.environ.get("COMSPEC", "cmd.exe") + args = comspec + " /c " + args + if (GetVersion() >= 0x80000000L or + os.path.basename(comspec).lower() == "command.com"): + # Win9x, or using command.com on NT. We need to + # use the w9xpopen intermediate program. For more + # information, see KB Q150956 + # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp) + w9xpopen = self._find_w9xpopen() + args = '"%s" %s' % (w9xpopen, args) + # Not passing CREATE_NEW_CONSOLE has been known to + # cause random failures on win9x. Specifically a + # dialog: "Your program accessed mem currently in + # use at xxx" and a hopeful warning about the + # stability of your system. Cost is Ctrl+C wont + # kill children. + creationflags |= CREATE_NEW_CONSOLE + + # Start the process + try: + hp, ht, pid, tid = CreateProcess(executable, args, + # no special security + None, None, + # must inherit handles to pass std + # handles + 0, + creationflags, + env, + cwd, + startupinfo) + except pywintypes.error, e: + # Translate pywintypes.error to WindowsError, which is + # a subclass of OSError. FIXME: We should really + # translate errno using _sys_errlist (or simliar), but + # how can this be done from Python? + raise WindowsError(*e.args) + + # Retain the process handle, but close the thread handle + self._handle = hp + self.pid = pid + ht.Close() + + # Child is launched. Close the parent's copy of those pipe + # handles that only the child should have open. You need + # to make sure that no handles to the write end of the + # output pipe are maintained in this process or else the + # pipe will not close when the child process exits and the + # ReadFile will hang. + if p2cread != None: + p2cread.Close() + if c2pwrite != None: + c2pwrite.Close() + if errwrite != None: + errwrite.Close() + + + def poll(self): + """Check if child process has terminated. Returns returncode + attribute.""" + if self.returncode == None: + if WaitForSingleObject(self._handle, 0) == WAIT_OBJECT_0: + self.returncode = GetExitCodeProcess(self._handle) + _active.remove(self) + return self.returncode + + + def wait(self): + """Wait for child process to terminate. Returns returncode + attribute.""" + if self.returncode == None: + obj = WaitForSingleObject(self._handle, INFINITE) + self.returncode = GetExitCodeProcess(self._handle) + _active.remove(self) + return self.returncode + + + def _readerthread(self, fh, buffer): + buffer.append(fh.read()) + + + def communicate(self, input=None): + """Interact with process: Send data to stdin. Read data from + stdout and stderr, until end-of-file is reached. Wait for + process to terminate. The optional input argument should be a + string to be sent to the child process, or None, if no data + should be sent to the child. + + communicate() returns a tuple (stdout, stderr).""" + stdout = None # Return + stderr = None # Return + + if self.stdout: + stdout = [] + stdout_thread = threading.Thread(target=self._readerthread, + args=(self.stdout, stdout)) + stdout_thread.setDaemon(True) + stdout_thread.start() + if self.stderr: + stderr = [] + stderr_thread = threading.Thread(target=self._readerthread, + args=(self.stderr, stderr)) + stderr_thread.setDaemon(True) + stderr_thread.start() + + if self.stdin: + if input != None: + self.stdin.write(input) + self.stdin.close() + + if self.stdout: + stdout_thread.join() + if self.stderr: + stderr_thread.join() + + # All data exchanged. Translate lists into strings. + if stdout != None: + stdout = stdout[0] + if stderr != None: + stderr = stderr[0] + + # Translate newlines, if requested. We cannot let the file + # object do the translation: It is based on stdio, which is + # impossible to combine with select (unless forcing no + # buffering). + if self.universal_newlines and hasattr(open, 'newlines'): + if stdout: + stdout = self._translate_newlines(stdout) + if stderr: + stderr = self._translate_newlines(stderr) + + self.wait() + return (stdout, stderr) + + else: + # + # POSIX methods + # + def _get_handles(self, stdin, stdout, stderr): + """Construct and return tupel with IO objects: + p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite + """ + p2cread, p2cwrite = None, None + c2pread, c2pwrite = None, None + errread, errwrite = None, None + + if stdin == None: + pass + elif stdin == PIPE: + p2cread, p2cwrite = os.pipe() + elif type(stdin) == types.IntType: + p2cread = stdin + else: + # Assuming file-like object + p2cread = stdin.fileno() + + if stdout == None: + pass + elif stdout == PIPE: + c2pread, c2pwrite = os.pipe() + elif type(stdout) == types.IntType: + c2pwrite = stdout + else: + # Assuming file-like object + c2pwrite = stdout.fileno() + + if stderr == None: + pass + elif stderr == PIPE: + errread, errwrite = os.pipe() + elif stderr == STDOUT: + errwrite = c2pwrite + elif type(stderr) == types.IntType: + errwrite = stderr + else: + # Assuming file-like object + errwrite = stderr.fileno() + + return (p2cread, p2cwrite, + c2pread, c2pwrite, + errread, errwrite) + + + def _set_cloexec_flag(self, fd): + try: + cloexec_flag = fcntl.FD_CLOEXEC + except AttributeError: + cloexec_flag = 1 + + old = fcntl.fcntl(fd, fcntl.F_GETFD) + fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag) + + + def _close_fds(self, but): + for i in xrange(3, MAXFD): + if i == but: + continue + try: + os.close(i) + except: + pass + + + def _execute_child(self, args, executable, preexec_fn, close_fds, + cwd, env, universal_newlines, + startupinfo, creationflags, shell, + p2cread, p2cwrite, + c2pread, c2pwrite, + errread, errwrite): + """Execute program (POSIX version)""" + + if isinstance(args, types.StringTypes): + args = [args] + + if shell: + args = ["/bin/sh", "-c"] + args + + if executable == None: + executable = args[0] + + # For transferring possible exec failure from child to parent + # The first char specifies the exception type: 0 means + # OSError, 1 means some other error. + errpipe_read, errpipe_write = os.pipe() + self._set_cloexec_flag(errpipe_write) + + self.pid = os.fork() + if self.pid == 0: + # Child + try: + # Close parent's pipe ends + if p2cwrite: + os.close(p2cwrite) + if c2pread: + os.close(c2pread) + if errread: + os.close(errread) + os.close(errpipe_read) + + # Dup fds for child + if p2cread: + os.dup2(p2cread, 0) + if c2pwrite: + os.dup2(c2pwrite, 1) + if errwrite: + os.dup2(errwrite, 2) + + # Close pipe fds. Make sure we doesn't close the same + # fd more than once. + if p2cread: + os.close(p2cread) + if c2pwrite and c2pwrite not in (p2cread,): + os.close(c2pwrite) + if errwrite and errwrite not in (p2cread, c2pwrite): + os.close(errwrite) + + # Close all other fds, if asked for + if close_fds: + self._close_fds(but=errpipe_write) + + if cwd != None: + os.chdir(cwd) + + if preexec_fn: + apply(preexec_fn) + + if env == None: + os.execvp(executable, args) + else: + os.execvpe(executable, args, env) + + except: + exc_type, exc_value, tb = sys.exc_info() + # Save the traceback and attach it to the exception object + exc_lines = traceback.format_exception(exc_type, + exc_value, + tb) + exc_value.child_traceback = ''.join(exc_lines) + os.write(errpipe_write, pickle.dumps(exc_value)) + + # This exitcode won't be reported to applications, so it + # really doesn't matter what we return. + os._exit(255) + + # Parent + os.close(errpipe_write) + if p2cread and p2cwrite: + os.close(p2cread) + if c2pwrite and c2pread: + os.close(c2pwrite) + if errwrite and errread: + os.close(errwrite) + + # Wait for exec to fail or succeed; possibly raising exception + data = os.read(errpipe_read, 1048576) # Exceptions limited to 1 MB + os.close(errpipe_read) + if data != "": + os.waitpid(self.pid, 0) + child_exception = pickle.loads(data) + raise child_exception + + + def _handle_exitstatus(self, sts): + if os.WIFSIGNALED(sts): + self.returncode = -os.WTERMSIG(sts) + elif os.WIFEXITED(sts): + self.returncode = os.WEXITSTATUS(sts) + else: + # Should never happen + raise RuntimeError("Unknown child exit status!") + + _active.remove(self) + + + def poll(self): + """Check if child process has terminated. Returns returncode + attribute.""" + if self.returncode == None: + try: + pid, sts = os.waitpid(self.pid, os.WNOHANG) + if pid == self.pid: + self._handle_exitstatus(sts) + except os.error: + pass + return self.returncode + + + def wait(self): + """Wait for child process to terminate. Returns returncode + attribute.""" + if self.returncode == None: + pid, sts = os.waitpid(self.pid, 0) + self._handle_exitstatus(sts) + return self.returncode + + + def communicate(self, input=None): + """Interact with process: Send data to stdin. Read data from + stdout and stderr, until end-of-file is reached. Wait for + process to terminate. The optional input argument should be a + string to be sent to the child process, or None, if no data + should be sent to the child. + + communicate() returns a tuple (stdout, stderr).""" + read_set = [] + write_set = [] + stdout = None # Return + stderr = None # Return + + if self.stdin: + # Flush stdio buffer. This might block, if the user has + # been writing to .stdin in an uncontrolled fashion. + self.stdin.flush() + if input: + write_set.append(self.stdin) + else: + self.stdin.close() + if self.stdout: + read_set.append(self.stdout) + stdout = [] + if self.stderr: + read_set.append(self.stderr) + stderr = [] + + while read_set or write_set: + rlist, wlist, xlist = select.select(read_set, write_set, []) + + if self.stdin in wlist: + # When select has indicated that the file is writable, + # we can write up to PIPE_BUF bytes without risk + # blocking. POSIX defines PIPE_BUF >= 512 + bytes_written = os.write(self.stdin.fileno(), input[:512]) + input = input[bytes_written:] + if not input: + self.stdin.close() + write_set.remove(self.stdin) + + if self.stdout in rlist: + data = os.read(self.stdout.fileno(), 1024) + if data == "": + self.stdout.close() + read_set.remove(self.stdout) + stdout.append(data) + + if self.stderr in rlist: + data = os.read(self.stderr.fileno(), 1024) + if data == "": + self.stderr.close() + read_set.remove(self.stderr) + stderr.append(data) + + # All data exchanged. Translate lists into strings. + if stdout != None: + stdout = ''.join(stdout) + if stderr != None: + stderr = ''.join(stderr) + + # Translate newlines, if requested. We cannot let the file + # object do the translation: It is based on stdio, which is + # impossible to combine with select (unless forcing no + # buffering). + if self.universal_newlines and hasattr(open, 'newlines'): + if stdout: + stdout = self._translate_newlines(stdout) + if stderr: + stderr = self._translate_newlines(stderr) + + self.wait() + return (stdout, stderr) + + +def _demo_posix(): + # + # Example 1: Simple redirection: Get process list + # + plist = Popen(["ps"], stdout=PIPE).communicate()[0] + print "Process list:" + print plist + + # + # Example 2: Change uid before executing child + # + if os.getuid() == 0: + p = Popen(["id"], preexec_fn=lambda: os.setuid(100)) + p.wait() + + # + # Example 3: Connecting several subprocesses + # + print "Looking for 'hda'..." + p1 = Popen(["dmesg"], stdout=PIPE) + p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) + print repr(p2.communicate()[0]) + + # + # Example 4: Catch execution error + # + print + print "Trying a weird file..." + try: + print Popen(["/this/path/does/not/exist"]).communicate() + except OSError, e: + if e.errno == errno.ENOENT: + print "The file didn't exist. I thought so..." + print "Child traceback:" + print e.child_traceback + else: + print "Error", e.errno + else: + print >>sys.stderr, "Gosh. No error." + + +def _demo_windows(): + # + # Example 1: Connecting several subprocesses + # + print "Looking for 'PROMPT' in set output..." + p1 = Popen("set", stdout=PIPE, shell=True) + p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE) + print repr(p2.communicate()[0]) + + # + # Example 2: Simple execution of program + # + print "Executing calc..." + p = Popen("calc") + p.wait() + + +if __name__ == "__main__": + if mswindows: + _demo_windows() + else: + _demo_posix() From 205c12afa9347650b6f1886d0439605adb32b119 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Sun, 24 Mar 2013 12:31:36 -0400 Subject: [PATCH 03/80] . Add alternative application parameter for each items. . Add alternative argument parameter for each items. . Change version number --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 4 ++++ resources/lib/launcher_plugin.py | 22 ++++++++++++++++++---- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/addon.py b/addon.py index 6e3693e..7814af2 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "http://sourceforge.net/projects/advlauncher/" __git_url__ = "http://sourceforge.net/p/advlauncher/git/?source=navbar" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "1.13.1" +__version__ = "1.99.0" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index f04e4fb..0e528a4 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 3f624b1..89c6be6 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,7 @@ +[B]1.99.0[/B] +. Add alternative application option for each items. +. Add alternative argument option for each items. + [B]1.13.1[/B] . Fix thumb/fanart image local import for items. . Allows to increase application start delay to 15s. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 4b79b42..73e304d 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -1543,6 +1543,8 @@ def _save_launchers (self): usock.write("\t\t\t\t"+romdata["studio"]+"\n") usock.write("\t\t\t\t"+romdata["plot"]+"\n") usock.write("\t\t\t\t"+romdata["finished"]+"\n") + usock.write("\t\t\t\t"+romdata["altapp"]+"\n") + usock.write("\t\t\t\t"+romdata["altarg"]+"\n") usock.write("\t\t\t\n") usock.write("\t\t\n") usock.write("\t\n") @@ -1651,6 +1653,8 @@ def _load_launchers(self, xmlSource): romstudio = re.findall( "(.*?)", rom ) romplot = re.findall( "(.*?)", rom ) romfinished = re.findall( "(.*?)", rom ) + romaltapp = re.findall( "(.*?)", rom ) + romaltarg = re.findall( "(.*?)", rom ) romgamesys = gamesys if len(romid) > 0 : romid = romid[0] @@ -1679,6 +1683,10 @@ def _load_launchers(self, xmlSource): else: romplot = "" if len(romfinished) > 0 : romfinished = romfinished[0] else: romfinished = "false" + if len(romaltapp) > 0 : romalapp = romaltapp[0] + else: romaltapp = "" + if len(romaltarg) > 0 : romaltarg = romaltarg[0] + else: romaltarg = "" # prepare rom object data romdata = {} @@ -1694,6 +1702,8 @@ def _load_launchers(self, xmlSource): romdata["studio"] = romstudio romdata["plot"] = romplot romdata["finished"] = romfinished + romdata["altapp"] = romaltapp + romdata["altarg"] = romaltarg # add rom to the roms list (using id as index) roms[romid] = romdata @@ -1747,7 +1757,7 @@ def _get_roms( self, launcherID ): defined_fanart = selectedLauncher["fanart"] else: defined_fanart = roms[key]["fanart"] - self._add_rom(launcherID, roms[key]["name"], roms[key]["filename"], roms[key]["gamesys"], roms[key]["thumb"], defined_fanart, roms[key]["trailer"], roms[key]["custom"], roms[key]["genre"], roms[key]["release"], roms[key]["studio"], roms[key]["plot"], roms[key]["finished"], len(roms), key) + self._add_rom(launcherID, roms[key]["name"], roms[key]["filename"], roms[key]["gamesys"], roms[key]["thumb"], defined_fanart, roms[key]["trailer"], roms[key]["custom"], roms[key]["genre"], roms[key]["release"], roms[key]["studio"], roms[key]["plot"], roms[key]["finished"], roms[key]["altapp"], roms[key]["altarg"], len(roms), key) xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) return True else: @@ -1883,6 +1893,8 @@ def _import_roms(self, launcherID, addRoms = False): romdata["studio"] = "" romdata["plot"] = "" romdata["finished"] = "false" + romdata["altapp"] = "" + romdata["altarg"] = "" self._print_log(import_text) self._print_log(__language__( 30732 ) % romname) @@ -2125,7 +2137,7 @@ def _import_roms(self, launcherID, addRoms = False): romsCount = romsCount + 1 if (addRoms): - self._add_rom(launcherID, romdata["name"], romdata["filename"], romdata["gamesys"], romdata["thumb"], romdata["fanart"], romdata["trailer"], romdata["custom"], romdata["genre"], romdata["release"], romdata["studio"], romdata["plot"], romdata["finished"], len(files), key) + self._add_rom(launcherID, romdata["name"], romdata["filename"], romdata["gamesys"], romdata["thumb"], romdata["fanart"], romdata["trailer"], romdata["custom"], romdata["genre"], romdata["release"], romdata["studio"], romdata["plot"], romdata["finished"], romdata["altapp"], romdata["altarg"], len(files), key) romadded = True if not romadded: self._print_log(__language__( 30731 )) @@ -2183,7 +2195,7 @@ def _add_launcher(self, name, cmd, path, thumbpath, fanartpath, trailerpath, cus else: xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s" % (self._path, key), listitem=listitem, isFolder=False) - def _add_rom( self, launcherID, name, cmd , romgamesys, thumb, romfanart, romtrailer, romcustom, romgenre, romrelease, romstudio, romplot, finished, total, key): + def _add_rom( self, launcherID, name, cmd , romgamesys, thumb, romfanart, romtrailer, romcustom, romgenre, romrelease, romstudio, romplot, finished, altapp, altarg, total, key): if (int(xbmc.getInfoLabel("System.BuildVersion")[0:2]) < 12 ): # Dharma / Eden compatible display_date_format = "Date" @@ -2291,6 +2303,8 @@ def _add_new_rom ( self , launcherID) : romdata["studio"] = "" romdata["plot"] = "" romdata["finished"] = "false" + romdata["altapp"] = "" + romdata["altarg"] = "" # add rom to the roms list (using name as index) romid = _get_SID() @@ -2696,5 +2710,5 @@ def _find_category_roms( self, search, category ): rl[keyr]["launcherID"] = launcherID #print the list sorted for key in sorted(rl.iterkeys()): - self._add_rom(rl[key]["launcherID"], rl[key]["name"], rl[key]["filename"], rl[key]["gamesys"], rl[key]["thumb"], rl[key]["fanart"], rl[key]["trailer"], rl[key]["custom"], rl[key]["genre"], rl[key]["release"], rl[key]["studio"], rl[key]["plot"], rl[key]["finished"], len(rl), key) + self._add_rom(rl[key]["launcherID"], rl[key]["name"], rl[key]["filename"], rl[key]["gamesys"], rl[key]["thumb"], rl[key]["fanart"], rl[key]["trailer"], rl[key]["custom"], rl[key]["genre"], rl[key]["release"], rl[key]["studio"], rl[key]["plot"], rl[key]["finished"], rl[key]["altapp"], rl[key]["altarg"], len(rl), key) xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) From 8ecd6414127781d36a14df1e099e3936ed988973 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Sun, 24 Mar 2013 12:45:24 -0400 Subject: [PATCH 04/80] Add category parameter to launchers --- resources/lib/launcher_plugin.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 73e304d..ccfe2ec 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -1508,6 +1508,7 @@ def _save_launchers (self): usock.write("\t\t"+launcherIndex+"\n") # replace low-9 quotation mark by comma usock.write("\t\t"+launcher["name"]+"\n") + usock.write("\t\t"+launcher["category"]+"\n") usock.write("\t\t"+launcher["application"]+"\n") usock.write("\t\t"+launcher["args"]+"\n") usock.write("\t\t"+launcher["rompath"]+"\n") @@ -1571,6 +1572,7 @@ def _load_launchers(self, xmlSource): for launcher in launchers: launcherid = re.findall( "(.*?)", launcher ) name = re.findall( "(.*?)", launcher ) + category = re.findall( "(.*?)", launcher ) application = re.findall( "(.*?)", launcher ) args = re.findall( "(.*?)", launcher ) rompath = re.findall( "(.*?)", launcher ) @@ -1598,6 +1600,8 @@ def _load_launchers(self, xmlSource): # replace comma by single low-9 quotation mark if len(name) > 0 : name = name[0] else: name = "unknown" + if len(category) > 0 : category = category[0] + else: category = "default" if len(application) > 0 : application = application[0] else: application = "" if len(args) > 0 : args = args[0] @@ -1683,7 +1687,7 @@ def _load_launchers(self, xmlSource): else: romplot = "" if len(romfinished) > 0 : romfinished = romfinished[0] else: romfinished = "false" - if len(romaltapp) > 0 : romalapp = romaltapp[0] + if len(romaltapp) > 0 : romaltapp = romaltapp[0] else: romaltapp = "" if len(romaltarg) > 0 : romaltarg = romaltarg[0] else: romaltarg = "" @@ -1711,6 +1715,7 @@ def _load_launchers(self, xmlSource): # prepare launcher object data launcherdata = {} launcherdata["name"] = name + launcherdata["category"] = category launcherdata["application"] = application launcherdata["args"] = args launcherdata["rompath"] = rompath @@ -1740,7 +1745,7 @@ def _load_launchers(self, xmlSource): def _get_launchers( self ): if (len(self.launchers) > 0): for key in sorted(self.launchers, key= lambda x : self.launchers[x]["application"]): - self._add_launcher(self.launchers[key]["name"], self.launchers[key]["application"], self.launchers[key]["rompath"], self.launchers[key]["thumbpath"], self.launchers[key]["fanartpath"], self.launchers[key]["trailerpath"], self.launchers[key]["custompath"], self.launchers[key]["romext"], self.launchers[key]["gamesys"], self.launchers[key]["thumb"], self.launchers[key]["fanart"], self.launchers[key]["genre"], self.launchers[key]["release"], self.launchers[key]["studio"], self.launchers[key]["plot"], self.launchers[key]["finished"], self.launchers[key]["lnk"], self.launchers[key]["minimize"], self.launchers[key]["roms"], len(self.launchers), key) + self._add_launcher(self.launchers[key]["name"], self.launchers[key]["category"], self.launchers[key]["application"], self.launchers[key]["rompath"], self.launchers[key]["thumbpath"], self.launchers[key]["fanartpath"], self.launchers[key]["trailerpath"], self.launchers[key]["custompath"], self.launchers[key]["romext"], self.launchers[key]["gamesys"], self.launchers[key]["thumb"], self.launchers[key]["fanart"], self.launchers[key]["genre"], self.launchers[key]["release"], self.launchers[key]["studio"], self.launchers[key]["plot"], self.launchers[key]["finished"], self.launchers[key]["lnk"], self.launchers[key]["minimize"], self.launchers[key]["roms"], len(self.launchers), key) xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) return True else: @@ -2155,7 +2160,7 @@ def _import_roms(self, launcherID, addRoms = False): else: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30016 ) % (romsCount, skipCount) + " " + __language__( 30050 ))) - def _add_launcher(self, name, cmd, path, thumbpath, fanartpath, trailerpath, custompath, ext, gamesys, thumb, fanart, genre, release, studio, plot, finished, lnk, minimize, roms, total, key) : + def _add_launcher(self, name, category, cmd, path, thumbpath, fanartpath, trailerpath, custompath, ext, gamesys, thumb, fanart, genre, release, studio, plot, finished, lnk, minimize, roms, total, key) : if (int(xbmc.getInfoLabel("System.BuildVersion")[0:2]) < 12 ): # Dharma / Eden compatible display_date_format = "Date" @@ -2355,6 +2360,7 @@ def _add_new_launcher ( self ) : # prepare launcher object data launcherdata = {} launcherdata["name"] = title + launcherdata["category"] = "default" launcherdata["application"] = app launcherdata["args"] = args launcherdata["rompath"] = "" @@ -2426,6 +2432,7 @@ def _add_new_launcher ( self ) : # prepare launcher object data launcherdata = {} launcherdata["name"] = title + launcherdata["category"] = "default" launcherdata["application"] = app launcherdata["args"] = args launcherdata["rompath"] = path From 7974990cff4276b9e58393fb245b3a55721907f3 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Sun, 24 Mar 2013 12:55:19 -0400 Subject: [PATCH 05/80] add default category creation --- resources/lib/launcher_plugin.py | 35 +++++++++++++++++++------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index ccfe2ec..4e79b04 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -91,20 +91,20 @@ class Main: 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 + /category/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. + /category/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 - /%%ADD%% - add a new launcher (open wizard) - /launcher/%%GET_INFO%% - get launcher info from configured scraper - /launcher/%%GET_THUMB%% - get launcher thumb from configured scraper - /launcher/%%GET_FANART%% - get launcher fanart from configured scraper - /launcher/rom/%%GET_INFO%% - get rom info from configured scraper - /launcher/rom/%%GET_THUMB%% - get rom thumb from configured scraper - /launcher/rom/%%GET_FANART%% - get rom fanart from configured scraper + /category/launcher/%%REMOVE%% - remove the launcher + /category/launcher/%%ADD%% - add a new rom (open wizard) + /category/launcher/rom/%%REMOVE%% - remove the rom + /category/%%ADD%% - add a new launcher (open wizard) + /category/launcher/%%GET_INFO%% - get launcher info from configured scraper + /category/launcher/%%GET_THUMB%% - get launcher thumb from configured scraper + /category/launcher/%%GET_FANART%% - get launcher fanart from configured scraper + /category/launcher/rom/%%GET_INFO%% - get rom info from configured scraper + /category/launcher/rom/%%GET_THUMB%% - get rom thumb from configured scraper + /category/launcher/rom/%%GET_FANART%% - get rom fanart from configured scraper (blank) - open a list of the available launchers. if no launcher exists - open the launcher creation wizard. ''' @@ -1501,12 +1501,19 @@ def _save_launchers (self): try: usock = open( TEMP_CURRENT_SOURCE_PATH, 'w' ) usock.write("\n") + # Create Categories XML list + usock.write("\n") + usock.write("\t\n") + usock.write("\t\tdefault\n") + usock.write("\t\tDefault\n") + usock.write("\t\n") + usock.write("\n") + # Create Launchers XML list usock.write("\n") for launcherIndex in sorted(self.launchers, key= lambda x : self.launchers[x]["name"]): launcher = self.launchers[launcherIndex] usock.write("\t\n") usock.write("\t\t"+launcherIndex+"\n") - # replace low-9 quotation mark by comma usock.write("\t\t"+launcher["name"]+"\n") usock.write("\t\t"+launcher["category"]+"\n") usock.write("\t\t"+launcher["application"]+"\n") @@ -1527,12 +1534,12 @@ def _save_launchers (self): usock.write("\t\t"+launcher["finished"]+"\n") usock.write("\t\t"+launcher["minimize"]+"\n") usock.write("\t\t"+launcher["lnk"]+"\n") + # Create Items XML list usock.write("\t\t\n") for romIndex in sorted(launcher["roms"], key= lambda x : launcher["roms"][x]["name"]): romdata = launcher["roms"][romIndex] usock.write("\t\t\t\n") usock.write("\t\t\t\t"+romIndex+"\n") - # replace low-9 quotation mark by comma 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") From 62b5177816a200d843537e8ea17d4a3a71330de2 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Sun, 24 Mar 2013 22:04:53 -0400 Subject: [PATCH 06/80] add categories support --- resources/language/English/strings.xml | 8 + resources/lib/launcher_plugin.py | 356 +++++++++++++++++-------- 2 files changed, 247 insertions(+), 117 deletions(-) diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 7cb94fd..f451cd4 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -69,6 +69,10 @@ Add Items Edit Item Edit Launcher + Edit Category + Create New Category + New Category Name + Category %s created Import Mode Source @@ -183,6 +187,7 @@ Status : Unfinished Status : Finished Change Trailer file : %s + Change Category : %s Search items... By Title @@ -252,4 +257,7 @@ Info automatic scraping Info semi-automatic scraping Scraping disable + Advanced Launcher root folder > Categories list + %s category folder > Launcher list + URL received : %s diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 4e79b04..7b4742e 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -85,26 +85,31 @@ def __language__(string): class Main: BASE_CACHE_PATH = xbmc.translatePath(os.path.join( "special://profile/Thumbnails", "Pictures" )) launchers = {} + categories = {} ''' 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) : - /category/launcher - open the specific launcher (if exists) and browse its roms - if the launcher is standalone - run it. - /category/launcher/rom - run the specifiec rom using it's launcher. - ignore command if doesn't exists. - /category/launcher/%%REMOVE%% - remove the launcher - /category/launcher/%%ADD%% - add a new rom (open wizard) - /category/launcher/rom/%%REMOVE%% - remove the rom + argv[2] - one of the following can be any category, launcher or rom id created with the plugin) : + + /%%ADD%% - add a new category + /category - open the specific category (if exists) and browse its launchers. + /category/%%REMOVE%% - remove the category + /category/%%ADD%% - add a new launcher (open wizard) + /category/launcher - open the specific launcher (if exists) and browse its roms. if the launcher is standalone - run it. /category/launcher/%%GET_INFO%% - get launcher info from configured scraper /category/launcher/%%GET_THUMB%% - get launcher thumb from configured scraper /category/launcher/%%GET_FANART%% - get launcher fanart from configured scraper + /category/launcher/%%REMOVE%% - remove the launcher + + /category/launcher/%%ADD%% - add a new rom (open wizard) + /category/launcher/rom - run the specifiec rom using it's launcher. ignore command if doesn't exists. /category/launcher/rom/%%GET_INFO%% - get rom info from configured scraper /category/launcher/rom/%%GET_THUMB%% - get rom thumb from configured scraper /category/launcher/rom/%%GET_FANART%% - get rom fanart from configured scraper + /category/launcher/rom/%%REMOVE%% - remove the rom (blank) - open a list of the available launchers. if no launcher exists - open the launcher creation wizard. ''' @@ -143,91 +148,115 @@ def __init__( self, *args, **kwargs ): if param: param = param[1:] command = param.split(COMMAND_ARGS_SEPARATOR) - dirname = os.path.dirname(command[0]) - basename = os.path.basename(command[0]) + command_part = command[0].replace("%2f","/").split("/") # 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)) - elif (rom == EDIT_COMMAND): - # check if it is a single rom or a launcher - if (not os.path.dirname(launcher)): - self._edit_launcher(launcher) - else: - self._edit_rom(os.path.dirname(launcher), os.path.basename(launcher)) - elif (rom == GET_INFO): - # check if it is a single rom or a launcher - if (not os.path.dirname(launcher)): - self._scrap_launcher(launcher) - else: - self._scrap_rom(os.path.dirname(launcher), os.path.basename(launcher)) - elif (rom == GET_THUMB): - # check if it is a single rom or a launcher - if (not os.path.dirname(launcher)): - self._scrap_thumb_launcher(launcher) - else: - self._scrap_thumb_rom(os.path.dirname(launcher), os.path.basename(launcher)) - elif (rom == GET_FANART): - # check if it is a single rom or a launcher - if (not os.path.dirname(launcher)): - self._scrap_fanart_launcher(launcher) - else: - self._scrap_fanart_rom(os.path.dirname(launcher), os.path.basename(launcher)) - elif (rom == ADD_COMMAND): + if ( len(command_part) == 4 ): + category = command_part[0] + launcher = command_part[1] + rom = command_part[2] + action = command_part[3] + + if (action == REMOVE_COMMAND): + self._remove_rom(launcher, rom) + elif (action == EDIT_COMMAND): + self._edit_rom(launcher, rom) + elif (action == GET_INFO): + self._scrap_rom(launcher, rom) + elif (action == GET_THUMB): + self._scrap_thumb_rom(launcher, rom) + elif (action == GET_FANART): + self._scrap_fanart_rom(launcher, rom) + elif (action == ADD_COMMAND): self._add_roms(launcher) - elif (rom == SEARCH_COMMAND): + elif (action == SEARCH_COMMAND): self._find_add_roms(launcher) - elif (rom == SEARCH_DATE_COMMAND): + elif (action == SEARCH_DATE_COMMAND): self._find_date_add_roms(launcher) - elif (rom == SEARCH_PLATFORM_COMMAND): + elif (action == SEARCH_PLATFORM_COMMAND): self._find_platform_add_roms(launcher) - elif (rom == SEARCH_STUDIO_COMMAND): + elif (action == SEARCH_STUDIO_COMMAND): self._find_studio_add_roms(launcher) - elif (rom == SEARCH_GENRE_COMMAND): + elif (action == SEARCH_GENRE_COMMAND): self._find_genre_add_roms(launcher) + + if ( len(command_part) == 3 ): + category = command_part[0] + launcher = command_part[1] + rom = command_part[2] + + if (rom == REMOVE_COMMAND): + self._remove_launcher(launcher) + elif (rom == EDIT_COMMAND): + self._edit_launcher(launcher) + elif (rom == GET_INFO): + self._scrap_launcher(launcher) + elif (rom == GET_THUMB): + self._scrap_thumb_launcher(launcher) + elif (rom == GET_FANART): + self._scrap_fanart_launcher(launcher) else: self._run_rom(launcher, rom) - else: - launcher = basename - if (launcher == "backup"): - self._print_log(__language__( 30185 )) - backup_file = xbmcgui.Dialog().browse(1,__language__( 30186 ),"files",".xml", False, False, os.path.join(DEFAULT_BACKUP_PATH+"/")) - if (os.path.isfile(backup_file)): - self._load_launchers(self.get_xml_source(backup_file)) + if ( len(command_part) == 2 ): + category = command_part[0] + launcher = command_part[1] - elif (launcher == SEARCH_COMMAND):#search - # check if we need to get user input or search the rom list + if (launcher == SEARCH_COMMAND): self._find_roms() - - elif (launcher == FILE_MANAGER_COMMAND):#filemanager + elif (launcher == FILE_MANAGER_COMMAND): self._file_manager() - - # if it's an add command + elif (launcher == EDIT_COMMAND): + self._edit_category(category) elif (launcher == ADD_COMMAND): - self._add_new_launcher() + self._add_new_launcher(category) else: - # if there is no rompath (a standalone launcher) if (self.launchers[launcher]["rompath"] == ""): - # launch it self._run_launcher(launcher) else: 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() + if ( len(command_part) == 1 ): + category = command_part[0] + self._print_log(__language__( 30740 ) % category) + + if (category == SEARCH_COMMAND): + self._find_roms() + elif (category == FILE_MANAGER_COMMAND): + self._file_manager() + elif (category == ADD_COMMAND): + self._add_new_category() + + if (category == "backup"): + self._print_log(__language__( 30185 )) + backup_file = xbmcgui.Dialog().browse(1,__language__( 30186 ),"files",".xml", False, False, os.path.join(DEFAULT_BACKUP_PATH+"/")) + if (os.path.isfile(backup_file)): + self._load_launchers(self.get_xml_source(backup_file)) + else: + if ( not self._empty_cat(category) ): + self._get_launchers(category) + else: + self._add_new_launcher(category) + + else: + self._print_log(__language__( 30739 )) + if (len(self.categories) == 0): + if (len(self.launchers) == 0): + self._add_new_launcher('default') else: - xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=False , cacheToDisc=False) + categorydata = {} + categorydata["name"] = 'Default' + self.categories['default'] = categorydata + self._save_launchers() + self._get_launchers('default') + else: + self._get_categories() + + def _empty_cat(self, categoryID): + empty_category = True + for cat in self.launchers.iterkeys(): + if ( self.launchers[cat]['category'] == categoryID ): + empty_category = False + return empty_category def _remove_rom(self, launcherID, rom): dialog = xbmcgui.Dialog() @@ -252,12 +281,21 @@ def _remove_launcher(self, launcherID): dialog = xbmcgui.Dialog() ret = dialog.yesno(__language__( 30000 ), __language__( 30010 ) % self.launchers[launcherID]["name"]) if (ret): + category = self.launchers[launcherID]["category"] self.launchers.pop(launcherID) self._save_launchers() - if ( len(self.launchers) == 0 ): - xbmc.executebuiltin("ReplaceWindow(Home)") - else: + if ( not self._empty_cat(category) ): xbmc.executebuiltin("Container.Update") + else: + xbmc.executebuiltin("ReplaceWindow(Programs,%s)" % (self._path)) + + def _remove_category(self, categoryID): + dialog = xbmcgui.Dialog() + ret = dialog.yesno(__language__( 30000 ), __language__( 30010 ) % self.categories[categoryID]["name"]) + if (ret): + self.categories.pop(categoryID) + self._save_launchers() + xbmc.executebuiltin("Container.Update") def _edit_rom(self, launcher, rom): dialog = xbmcgui.Dialog() @@ -779,6 +817,28 @@ def _add_roms(self, launcher): xbmc.executebuiltin("Container.Refresh") + def _edit_category(self, categoryID): + dialog = xbmcgui.Dialog() + type = dialog.select(__language__( 30300 ) % self.categories[categoryID]["name"], [__language__( 30306 ) % self.categories[categoryID]["name"],__language__( 30304 )]) + if (type == 0 ): + # Edition of the category name + keyboard = xbmc.Keyboard(self.categories[categoryID]["name"], __language__( 30037 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + title = keyboard.getText() + if ( title == "" ): + title = self.categories[categoryID]["name"] + self.categories[categoryID]["name"] = title.rstrip() + self._save_launchers() + if (type == 1 ): + self._remove_category(categoryID) + + if (type == -1 ): + self._save_launchers() + + # Return to the category directory + xbmc.executebuiltin("Container.Refresh") + def _edit_launcher(self, launcherID): dialog = xbmcgui.Dialog() title=os.path.basename(self.launchers[launcherID]["application"]) @@ -787,9 +847,9 @@ def _edit_launcher(self, launcherID): else: finished_display = __language__( 30340 ) if ( self.launchers[launcherID]["rompath"] == "" ): - type = dialog.select(__language__( 30300 ) % title, [__language__( 30338 ),__language__( 30301 ),__language__( 30302 ),__language__( 30303 ),finished_display,__language__( 30323 ),__language__( 30304 )]) + type = dialog.select(__language__( 30300 ) % title, [__language__( 30338 ),__language__( 30301 ),__language__( 30302 ),__language__( 30303 ),__language__( 30342 ) % self.categories[self.launchers[launcherID]["category"]]['name'],finished_display,__language__( 30323 ),__language__( 30304 )]) else: - type = dialog.select(__language__( 30300 ) % title, [__language__( 30338 ),__language__( 30301 ),__language__( 30302 ),__language__( 30303 ),finished_display,__language__( 30334 ),__language__( 30323 ),__language__( 30304 )]) + type = dialog.select(__language__( 30300 ) % title, [__language__( 30338 ),__language__( 30301 ),__language__( 30302 ),__language__( 30303 ),__language__( 30342 ) % self.categories[self.launchers[launcherID]["category"]]['name'],finished_display,__language__( 30334 ),__language__( 30323 ),__language__( 30304 )]) type_nb = 0 # Scrap item (infos and images) @@ -955,6 +1015,23 @@ def _edit_launcher(self, launcherID): _update_cache(image) xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) + # Launcher's change category + type_nb = type_nb+1 + if (type == type_nb ): + current_category = self.launchers[launcherID]["category"] + dialog = xbmcgui.Dialog() + categories_id = [] + categories_name = [] + for key in self.categories: + categories_id.append(self.categories[key]['id']) + categories_name.append(self.categories[key]['name']) + selected_cat = dialog.select(__language__( 30077 ), categories_name) + if (not selected_cat == -1 ): + self.launchers[launcherID]["category"] = categories_id[selected_cat] + self._save_launchers() + xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s)" % (self._path, categories_id[selected_cat])) + + # Launcher's Items status type_nb = type_nb+1 if (type == type_nb ): if (self.launchers[launcherID]["finished"] == "false"): @@ -1503,10 +1580,12 @@ def _save_launchers (self): usock.write("\n") # Create Categories XML list usock.write("\n") - usock.write("\t\n") - usock.write("\t\tdefault\n") - usock.write("\t\tDefault\n") - usock.write("\t\n") + for categoryIndex in sorted(self.categories, key= lambda x : self.categories[x]["name"]): + category = self.categories[categoryIndex] + usock.write("\t\n") + usock.write("\t\t"+categoryIndex+"\n") + usock.write("\t\t"+category["name"]+"\n") + usock.write("\t\n") usock.write("\n") # Create Launchers XML list usock.write("\n") @@ -1570,11 +1649,27 @@ def _save_launchers (self): xbmc.executebuiltin( "Dialog.Close(busydialog)" ) - ''' read the list of launchers and roms from launchers.xml file ''' + ''' read the list of categories, launchers and roms from launchers.xml file ''' def _load_launchers(self, xmlSource): need_update = 0 # clean, save and return the xml string xmlSource = xmlSource.replace("&", "&") + + categories = re.findall( "(.*?)", xmlSource ) + for category in categories: + categoryid = re.findall( "(.*?)", category ) + categoryname = re.findall( "(.*?)", category ) + + if len(categoryid) > 0 : categoryid = categoryid[0] + else: categoryid = "default" + if len(categoryname) > 0 : categoryname = categoryname[0] + else: categoryname = "Default" + + categorydata = {} + categorydata["id"] = categoryid + categorydata["name"] = categoryname + self.categories[categoryid] = categorydata + launchers = re.findall( "(.*?)", xmlSource ) for launcher in launchers: launcherid = re.findall( "(.*?)", launcher ) @@ -1749,33 +1844,29 @@ def _load_launchers(self, xmlSource): if ( need_update == 1 ): self._save_launchers() - def _get_launchers( self ): - if (len(self.launchers) > 0): - for key in sorted(self.launchers, key= lambda x : self.launchers[x]["application"]): + def _get_categories( self ): + for key in sorted(self.categories, key= lambda x : self.categories[x]["name"]): + self._add_category(self.categories[key]["name"], len(self.categories), key) + xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) + + def _get_launchers( self, categoryID ): + for key in sorted(self.launchers, key= lambda x : self.launchers[x]["application"]): + if ( self.launchers[key]["category"] == categoryID ) : self._add_launcher(self.launchers[key]["name"], self.launchers[key]["category"], self.launchers[key]["application"], self.launchers[key]["rompath"], self.launchers[key]["thumbpath"], self.launchers[key]["fanartpath"], self.launchers[key]["trailerpath"], self.launchers[key]["custompath"], self.launchers[key]["romext"], self.launchers[key]["gamesys"], self.launchers[key]["thumb"], self.launchers[key]["fanart"], self.launchers[key]["genre"], self.launchers[key]["release"], self.launchers[key]["studio"], self.launchers[key]["plot"], self.launchers[key]["finished"], self.launchers[key]["lnk"], self.launchers[key]["minimize"], self.launchers[key]["roms"], len(self.launchers), key) - xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) - return True - else: - return False + xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) def _get_roms( self, launcherID ): + print launcherID if (self.launchers.has_key(launcherID)): selectedLauncher = self.launchers[launcherID] - # error roms = selectedLauncher["roms"] - if (len(roms) > 0) : - for key in sorted(roms, key= lambda x : roms[x]["filename"]): - if (roms[key]["fanart"] ==""): - defined_fanart = selectedLauncher["fanart"] - else: - defined_fanart = roms[key]["fanart"] - self._add_rom(launcherID, roms[key]["name"], roms[key]["filename"], roms[key]["gamesys"], roms[key]["thumb"], defined_fanart, roms[key]["trailer"], roms[key]["custom"], roms[key]["genre"], roms[key]["release"], roms[key]["studio"], roms[key]["plot"], roms[key]["finished"], roms[key]["altapp"], roms[key]["altarg"], len(roms), key) - xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) - return True - else: - return False - else: - return False + for key in sorted(roms, key= lambda x : roms[x]["filename"]): + if (roms[key]["fanart"] ==""): + defined_fanart = selectedLauncher["fanart"] + else: + defined_fanart = roms[key]["fanart"] + self._add_rom(launcherID, roms[key]["name"], roms[key]["filename"], roms[key]["gamesys"], roms[key]["thumb"], defined_fanart, roms[key]["trailer"], roms[key]["custom"], roms[key]["genre"], roms[key]["release"], roms[key]["studio"], roms[key]["plot"], roms[key]["finished"], roms[key]["altapp"], roms[key]["altarg"], len(roms), key) + xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) def _report_hook( self, count, blocksize, totalsize ): percent = int( float( count * blocksize * 100) / totalsize ) @@ -2167,6 +2258,20 @@ def _import_roms(self, launcherID, addRoms = False): else: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30016 ) % (romsCount, skipCount) + " " + __language__( 30050 ))) + def _add_category(self, name, total, key) : + commands = [] + commands.append((__language__( 30512 ), "XBMC.RunPlugin(%s?%s)" % (self._path, SEARCH_COMMAND) , )) + commands.append((__language__( 30051 ), "XBMC.RunPlugin(%s?%s)" % (self._path, FILE_MANAGER_COMMAND) , )) + commands.append((__language__( 30111 ), "XBMC.RunPlugin(%s?%s)" % (self._path, ADD_COMMAND) , )) + if (not self.categories[key]['id'] == "default" ): + commands.append(( __language__( 30110 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, key, EDIT_COMMAND) , )) + folder = True + icon = "DefaultFolder.png" + listitem = xbmcgui.ListItem( name, iconImage=icon ) + listitem.setInfo( "video", { "Title": name } ) + listitem.addContextMenuItems( commands ) + xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s" % (self._path, key), listitem=listitem, isFolder=True) + def _add_launcher(self, name, category, cmd, path, thumbpath, fanartpath, trailerpath, custompath, ext, gamesys, thumb, fanart, genre, release, studio, plot, finished, lnk, minimize, roms, total, key) : if (int(xbmc.getInfoLabel("System.BuildVersion")[0:2]) < 12 ): # Dharma / Eden compatible @@ -2175,10 +2280,10 @@ def _add_launcher(self, name, category, cmd, path, thumbpath, fanartpath, traile # Frodo & + compatible display_date_format = "Year" commands = [] - commands.append((__language__( 30512 ), "XBMC.RunPlugin(%s?%s)" % (self._path, SEARCH_COMMAND) , )) - commands.append((__language__( 30051 ), "XBMC.RunPlugin(%s?%s)" % (self._path, FILE_MANAGER_COMMAND) , )) - commands.append((__language__( 30101 ), "XBMC.RunPlugin(%s?%s)" % (self._path, ADD_COMMAND) , )) - commands.append(( __language__( 30109 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, key, EDIT_COMMAND) , )) + commands.append((__language__( 30512 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, category, SEARCH_COMMAND) , )) + commands.append((__language__( 30051 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, category, FILE_MANAGER_COMMAND) , )) + commands.append((__language__( 30101 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, category, ADD_COMMAND) , )) + commands.append(( __language__( 30109 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, category, key, EDIT_COMMAND) , )) if (path == ""): folder = False @@ -2186,7 +2291,7 @@ def _add_launcher(self, name, category, cmd, path, thumbpath, fanartpath, traile else: folder = True icon = "DefaultFolder.png" - commands.append((__language__( 30106 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, key, ADD_COMMAND) , )) + commands.append((__language__( 30106 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, category, key, ADD_COMMAND) , )) if (thumb): listitem = xbmcgui.ListItem( name, iconImage=icon, thumbnailImage=thumb ) @@ -2203,9 +2308,9 @@ def _add_launcher(self, name, category, cmd, path, thumbpath, fanartpath, traile listitem.addContextMenuItems( commands ) if ( finished == "false" ) or ( self.settings[ "hide_finished" ] == False) : if (len(roms) > 0) : - xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s" % (self._path, key), listitem=listitem, isFolder=True) + xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s" % (self._path, category, key), listitem=listitem, isFolder=True) else: - xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s" % (self._path, key), listitem=listitem, isFolder=False) + xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s" % (self._path, category, key), listitem=listitem, isFolder=False) def _add_rom( self, launcherID, name, cmd , romgamesys, thumb, romfanart, romtrailer, romcustom, romgenre, romrelease, romstudio, romplot, finished, altapp, altarg, total, key): if (int(xbmc.getInfoLabel("System.BuildVersion")[0:2]) < 12 ): @@ -2228,11 +2333,11 @@ def _add_rom( self, launcherID, name, cmd , romgamesys, thumb, romfanart, romtra listitem.setInfo( "video", { "Title": name, "Label": os.path.basename(cmd), "Plot" : romplot, "Studio" : romstudio, "Genre" : romgenre, "Premiered" : romrelease , display_date_format : romrelease, "Writer" : romgamesys, "Trailer" : os.path.join(romtrailer), "Director" : os.path.join(romcustom), "overlay": ICON_OVERLAY } ) commands = [] - commands.append((__language__( 30512 ), "XBMC.RunPlugin(%s?%s)" % (self._path, SEARCH_COMMAND) , )) - commands.append(( __language__( 30107 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, launcherID, key, EDIT_COMMAND) , )) + commands.append((__language__( 30512 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, self.launchers[launcherID]["category"], SEARCH_COMMAND) , )) + commands.append(( __language__( 30107 ), "XBMC.RunPlugin(%s?%s/%s/%s/%s)" % (self._path, self.launchers[launcherID]["category"], launcherID, key, EDIT_COMMAND) , )) listitem.addContextMenuItems( commands ) if ( finished == "false" ) or ( self.settings[ "hide_finished" ] == False) : - xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s" % (self._path, launcherID, key), listitem=listitem, isFolder=False) + xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s/%s" % (self._path, self.launchers[launcherID]["category"], launcherID, key), listitem=listitem, isFolder=False) def _add_new_rom ( self , launcherID) : dialog = xbmcgui.Dialog() @@ -2326,7 +2431,24 @@ def _add_new_rom ( self , launcherID) : self._save_launchers() - def _add_new_launcher ( self ) : + def _add_new_category ( self ) : + dialog = xbmcgui.Dialog() + keyboard = xbmc.Keyboard("", __language__( 30112 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + categorydata = {} + categorydata["name"] = keyboard.getText() + categoryid = _get_SID() + self.categories[categoryid] = categorydata + self._save_launchers() + xbmc.executebuiltin("Container.Refresh") + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30113 ) % categorydata["name"] )) + return True + else: + return False + + + def _add_new_launcher ( self, categoryID ) : dialog = xbmcgui.Dialog() type = dialog.select(__language__( 30101 ), [__language__( 30021 ), __language__( 30022 ),__language__( 30051 )]) if (os.environ.get( "OS", "xbox" ) == "xbox"): @@ -2367,7 +2489,7 @@ def _add_new_launcher ( self ) : # prepare launcher object data launcherdata = {} launcherdata["name"] = title - launcherdata["category"] = "default" + launcherdata["category"] = categoryID launcherdata["application"] = app launcherdata["args"] = args launcherdata["rompath"] = "" @@ -2405,7 +2527,7 @@ def _add_new_launcher ( self ) : self.launchers[launcherid] = launcherdata self._save_launchers() - xbmc.executebuiltin("Container.Update") + xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s)" % (self._path,categoryID)) return True if (type == 1): @@ -2476,7 +2598,7 @@ def _add_new_launcher ( self ) : launcherid = _get_SID() self.launchers[launcherid] = launcherdata self._save_launchers() - xbmc.executebuiltin("Container.Update") + xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s)" % (self._path,categoryID)) return True if (type == 2): self._file_manager() From b6ad928cb58764d0b1ff8ef61c00c08b77d99c74 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Wed, 27 Mar 2013 20:56:34 -0400 Subject: [PATCH 07/80] Move start delay option into debug menu. --- resources/settings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/settings.xml b/resources/settings.xml index d253c8b..61e7c21 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -43,7 +43,6 @@ - @@ -61,6 +60,7 @@ + From 79d21124096a596d2c2fe120184cdbd6eadbecb4 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Wed, 27 Mar 2013 20:59:54 -0400 Subject: [PATCH 08/80] Add display submenu into Advanced options settings --- resources/language/English/strings.xml | 1 + resources/settings.xml | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index f451cd4..8db095f 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -138,6 +138,7 @@ Load a backup launchers.xml file Select the launchers.xml file to load Show logs into xbmc.log file + Display default experienced users diff --git a/resources/settings.xml b/resources/settings.xml index 61e7c21..71736f1 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -42,9 +42,10 @@ - + + From 2dd50c68325e061c1ee36d5672b39fc124d9b75e Mon Sep 17 00:00:00 2001 From: Angelscry Date: Wed, 27 Mar 2013 21:09:18 -0400 Subject: [PATCH 09/80] Add option to show"hide the default category --- resources/language/English/strings.xml | 1 + resources/lib/launcher_plugin.py | 5 ++++- resources/settings.xml | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 8db095f..9ccf3f0 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -139,6 +139,7 @@ Select the launchers.xml file to load Show logs into xbmc.log file Display + Hide the Default Category default experienced users diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 7b4742e..cd28f95 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -1384,6 +1384,7 @@ def _get_settings( self ): self.settings[ "auto_backup" ] = ( __settings__.getSetting( "auto_backup" ) == "true" ) self.settings[ "nb_backup_files" ] = int(round(float(__settings__.getSetting( "nb_backup_files" )))) self.settings[ "show_log" ] = ( __settings__.getSetting( "show_log" ) == "true" ) + self.settings[ "hide_default_cat" ] = ( __settings__.getSetting( "hide_default_cat" ) == "true" ) def _print_log(self,string): if (self.settings[ "show_log" ]): @@ -1846,7 +1847,9 @@ def _load_launchers(self, xmlSource): def _get_categories( self ): for key in sorted(self.categories, key= lambda x : self.categories[x]["name"]): - self._add_category(self.categories[key]["name"], len(self.categories), key) + print self.categories[key]['id'] + if ( not self.settings[ "hide_default_cat" ] or self.categories[key]['id'] != "default" ): + self._add_category(self.categories[key]["name"], len(self.categories), key) xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) def _get_launchers( self, categoryID ): diff --git a/resources/settings.xml b/resources/settings.xml index 71736f1..bae417f 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -46,6 +46,7 @@ + From d1f6ee86961d6173ebb6b7d896bc06f6ca1c1cc9 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Fri, 29 Mar 2013 07:20:10 -0400 Subject: [PATCH 10/80] Fix add item action into context menu --- resources/lib/launcher_plugin.py | 37 ++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index cd28f95..dedc731 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -148,6 +148,7 @@ def __init__( self, *args, **kwargs ): if param: param = param[1:] command = param.split(COMMAND_ARGS_SEPARATOR) + print command command_part = command[0].replace("%2f","/").split("/") # check the action needed if ( len(command_part) == 4 ): @@ -156,6 +157,8 @@ def __init__( self, *args, **kwargs ): rom = command_part[2] action = command_part[3] + if (action == SEARCH_COMMAND): + self._find_roms() if (action == REMOVE_COMMAND): self._remove_rom(launcher, rom) elif (action == EDIT_COMMAND): @@ -166,24 +169,14 @@ def __init__( self, *args, **kwargs ): self._scrap_thumb_rom(launcher, rom) elif (action == GET_FANART): self._scrap_fanart_rom(launcher, rom) - elif (action == ADD_COMMAND): - self._add_roms(launcher) - elif (action == SEARCH_COMMAND): - self._find_add_roms(launcher) - elif (action == SEARCH_DATE_COMMAND): - self._find_date_add_roms(launcher) - elif (action == SEARCH_PLATFORM_COMMAND): - self._find_platform_add_roms(launcher) - elif (action == SEARCH_STUDIO_COMMAND): - self._find_studio_add_roms(launcher) - elif (action == SEARCH_GENRE_COMMAND): - self._find_genre_add_roms(launcher) if ( len(command_part) == 3 ): category = command_part[0] launcher = command_part[1] rom = command_part[2] + if (rom == SEARCH_COMMAND): + self._find_roms() if (rom == REMOVE_COMMAND): self._remove_launcher(launcher) elif (rom == EDIT_COMMAND): @@ -194,6 +187,8 @@ def __init__( self, *args, **kwargs ): self._scrap_thumb_launcher(launcher) elif (rom == GET_FANART): self._scrap_fanart_launcher(launcher) + elif (rom == ADD_COMMAND): + self._add_roms(launcher) else: self._run_rom(launcher, rom) @@ -201,14 +196,22 @@ def __init__( self, *args, **kwargs ): category = command_part[0] launcher = command_part[1] - if (launcher == SEARCH_COMMAND): - self._find_roms() - elif (launcher == FILE_MANAGER_COMMAND): + if (launcher == FILE_MANAGER_COMMAND): self._file_manager() elif (launcher == EDIT_COMMAND): self._edit_category(category) elif (launcher == ADD_COMMAND): self._add_new_launcher(category) + elif (launcher == SEARCH_COMMAND): + self._find_add_roms(category) + elif (launcher == SEARCH_DATE_COMMAND): + self._find_date_add_roms(category) + elif (launcher == SEARCH_PLATFORM_COMMAND): + self._find_platform_add_roms(category) + elif (launcher == SEARCH_STUDIO_COMMAND): + self._find_studio_add_roms(category) + elif (launcher == SEARCH_GENRE_COMMAND): + self._find_genre_add_roms(category) else: if (self.launchers[launcher]["rompath"] == ""): self._run_launcher(launcher) @@ -2336,7 +2339,7 @@ def _add_rom( self, launcherID, name, cmd , romgamesys, thumb, romfanart, romtra listitem.setInfo( "video", { "Title": name, "Label": os.path.basename(cmd), "Plot" : romplot, "Studio" : romstudio, "Genre" : romgenre, "Premiered" : romrelease , display_date_format : romrelease, "Writer" : romgamesys, "Trailer" : os.path.join(romtrailer), "Director" : os.path.join(romcustom), "overlay": ICON_OVERLAY } ) commands = [] - commands.append((__language__( 30512 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, self.launchers[launcherID]["category"], SEARCH_COMMAND) , )) + commands.append((__language__( 30512 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, self.launchers[launcherID]["category"], launcherID, SEARCH_COMMAND) , )) commands.append(( __language__( 30107 ), "XBMC.RunPlugin(%s?%s/%s/%s/%s)" % (self._path, self.launchers[launcherID]["category"], launcherID, key, EDIT_COMMAND) , )) listitem.addContextMenuItems( commands ) if ( finished == "false" ) or ( self.settings[ "hide_finished" ] == False) : @@ -2677,6 +2680,8 @@ def _find_studio_add_roms( self, search ): _find_category_roms( self, search, "studio" ) def _find_genre_add_roms( self, search ): + print self + print search _find_category_roms( self, search, "genre" ) class MainGui( xbmcgui.WindowXMLDialog ): From 263966d0226cac846d071c6ccabcbcdeba7b2e63 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Fri, 29 Mar 2013 07:31:32 -0400 Subject: [PATCH 11/80] Fix category sub-menu. --- resources/lib/launcher_plugin.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index dedc731..3a78eeb 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -228,17 +228,15 @@ def __init__( self, *args, **kwargs ): self._file_manager() elif (category == ADD_COMMAND): self._add_new_category() - - if (category == "backup"): + elif (category == "backup"): self._print_log(__language__( 30185 )) backup_file = xbmcgui.Dialog().browse(1,__language__( 30186 ),"files",".xml", False, False, os.path.join(DEFAULT_BACKUP_PATH+"/")) if (os.path.isfile(backup_file)): self._load_launchers(self.get_xml_source(backup_file)) + elif ( self._empty_cat(category) ): + self._add_new_launcher(category) else: - if ( not self._empty_cat(category) ): - self._get_launchers(category) - else: - self._add_new_launcher(category) + self._get_launchers(category) else: self._print_log(__language__( 30739 )) From 5f477735dc3c4efed7592951b7d7e3f9abb6ab72 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Fri, 29 Mar 2013 07:40:11 -0400 Subject: [PATCH 12/80] Fix Launcher context-menu --- resources/lib/launcher_plugin.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 3a78eeb..369be2c 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -196,22 +196,24 @@ def __init__( self, *args, **kwargs ): category = command_part[0] launcher = command_part[1] - if (launcher == FILE_MANAGER_COMMAND): + if (launcher == SEARCH_COMMAND): + self._find_roms() + elif (launcher == FILE_MANAGER_COMMAND): self._file_manager() elif (launcher == EDIT_COMMAND): self._edit_category(category) elif (launcher == ADD_COMMAND): self._add_new_launcher(category) - elif (launcher == SEARCH_COMMAND): - self._find_add_roms(category) - elif (launcher == SEARCH_DATE_COMMAND): - self._find_date_add_roms(category) - elif (launcher == SEARCH_PLATFORM_COMMAND): - self._find_platform_add_roms(category) - elif (launcher == SEARCH_STUDIO_COMMAND): - self._find_studio_add_roms(category) - elif (launcher == SEARCH_GENRE_COMMAND): - self._find_genre_add_roms(category) + #elif (launcher == SEARCH_COMMAND): + # self._find_add_roms(category) + #elif (launcher == SEARCH_DATE_COMMAND): + # self._find_date_add_roms(category) + #elif (launcher == SEARCH_PLATFORM_COMMAND): + # self._find_platform_add_roms(category) + #elif (launcher == SEARCH_STUDIO_COMMAND): + # self._find_studio_add_roms(category) + #elif (launcher == SEARCH_GENRE_COMMAND): + # self._find_genre_add_roms(category) else: if (self.launchers[launcher]["rompath"] == ""): self._run_launcher(launcher) From 4821e92d83eeb1f8831238fe67368a0cc2b6d086 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Fri, 29 Mar 2013 07:43:32 -0400 Subject: [PATCH 13/80] Fix search commands --- resources/lib/launcher_plugin.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 369be2c..0196861 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -77,6 +77,7 @@ def __language__(string): GET_THUMB = "%%GET_THUMB%%" GET_FANART = "%%GET_FANART%%" SEARCH_COMMAND = "%%SEARCH%%" +SEARCH_ITEM_COMMAND = "%%SEARCH_ITEM%%" SEARCH_DATE_COMMAND = "%%SEARCH_DATE%%" SEARCH_PLATFORM_COMMAND = "%%SEARCH_PLATFORM%%" SEARCH_STUDIO_COMMAND = "%%SEARCH_STUDIO%%" @@ -204,16 +205,20 @@ def __init__( self, *args, **kwargs ): self._edit_category(category) elif (launcher == ADD_COMMAND): self._add_new_launcher(category) - #elif (launcher == SEARCH_COMMAND): - # self._find_add_roms(category) - #elif (launcher == SEARCH_DATE_COMMAND): - # self._find_date_add_roms(category) - #elif (launcher == SEARCH_PLATFORM_COMMAND): - # self._find_platform_add_roms(category) - #elif (launcher == SEARCH_STUDIO_COMMAND): - # self._find_studio_add_roms(category) - #elif (launcher == SEARCH_GENRE_COMMAND): - # self._find_genre_add_roms(category) + + # Search commands + + elif (launcher == SEARCH_ITEM_COMMAND): + self._find_add_roms(category) + elif (launcher == SEARCH_DATE_COMMAND): + self._find_date_add_roms(category) + elif (launcher == SEARCH_PLATFORM_COMMAND): + self._find_platform_add_roms(category) + elif (launcher == SEARCH_STUDIO_COMMAND): + self._find_studio_add_roms(category) + elif (launcher == SEARCH_GENRE_COMMAND): + self._find_genre_add_roms(category) + else: if (self.launchers[launcher]["rompath"] == ""): self._run_launcher(launcher) @@ -2625,7 +2630,7 @@ def _find_roms( self ): keyboard.doModal() if (keyboard.isConfirmed()): search = keyboard.getText() - xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s)" % (self._path, search, SEARCH_COMMAND)) + xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s)" % (self._path, search, SEARCH_ITEM_COMMAND)) #Search by Release Date type_nb = type_nb+1 From 808b8643ceb20551f2cdf3e15f761f2e1b5f4987 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Fri, 29 Mar 2013 08:36:57 -0400 Subject: [PATCH 14/80] Add append XML files option bases. --- resources/language/English/strings.xml | 12 ++++++++---- resources/lib/launcher_plugin.py | 9 ++++++++- resources/settings.xml | 4 ++-- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 9ccf3f0..dd7993f 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -78,7 +78,7 @@ Source Thumbs Fanarts - Advanced Options + Misc. Options For Thumbs images Data & Infos For Fanarts images @@ -133,13 +133,17 @@ Adjust launcher delay (ms) Backup Activate autobackup - Backup/Debug + Advanced Number of backup files to keep - Load a backup launchers.xml file - Select the launchers.xml file to load + Restore a backup (Import XML file) + Select the XML file to import Show logs into xbmc.log file Display Hide the Default Category + Merge items list (Append XML files) + Select the XML file to append + Merger + Start default experienced users diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 0196861..faa7b70 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -69,6 +69,8 @@ def __language__(string): if not os.path.exists(DEFAULT_BACKUP_PATH): os.makedirs(DEFAULT_BACKUP_PATH) REMOVE_COMMAND = "%%REMOVE%%" +BACKUP_COMMAND = "%%BACKUP%%" +APPEND_COMMAND = "%%APPEND%%" FILE_MANAGER_COMMAND = "%%FILEMANAGER%%" ADD_COMMAND = "%%ADD%%" EDIT_COMMAND = "%%EDIT%%" @@ -235,11 +237,16 @@ def __init__( self, *args, **kwargs ): self._file_manager() elif (category == ADD_COMMAND): self._add_new_category() - elif (category == "backup"): + elif (category == BACKUP_COMMAND): self._print_log(__language__( 30185 )) backup_file = xbmcgui.Dialog().browse(1,__language__( 30186 ),"files",".xml", False, False, os.path.join(DEFAULT_BACKUP_PATH+"/")) if (os.path.isfile(backup_file)): self._load_launchers(self.get_xml_source(backup_file)) + elif (category == APPEND_COMMAND): + self._print_log(__language__( 30185 )) + append_file = xbmcgui.Dialog().browse(1,__language__( 30191 ),"files",".xml", False, False, os.path.join(PLUGIN_DATA_PATH+"/")) + if (os.path.isfile(append_file)): + self._append_launchers(self.get_xml_source(append_file)) elif ( self._empty_cat(category) ): self._add_new_launcher(category) else: diff --git a/resources/settings.xml b/resources/settings.xml index bae417f..bbf2751 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -40,7 +40,7 @@ - + @@ -58,7 +58,7 @@ - + From 86f6c54fbd0d285909cef54cb5fa42e2bbba22aa Mon Sep 17 00:00:00 2001 From: Angelscry Date: Fri, 29 Mar 2013 10:06:41 -0400 Subject: [PATCH 15/80] Add launcher creation menu entry into categoty context menu --- resources/language/English/strings.xml | 1 + resources/lib/launcher_plugin.py | 1 + 2 files changed, 2 insertions(+) diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index dd7993f..020eaeb 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -144,6 +144,7 @@ Select the XML file to append Merger Start + Add New Launcher default experienced users diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index faa7b70..d678461 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -2285,6 +2285,7 @@ def _add_category(self, name, total, key) : commands.append(( __language__( 30110 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, key, EDIT_COMMAND) , )) folder = True icon = "DefaultFolder.png" + commands.append(( __language__( 30194 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, key, ADD_COMMAND) , )) listitem = xbmcgui.ListItem( name, iconImage=icon ) listitem.setInfo( "video", { "Title": name } ) listitem.addContextMenuItems( commands ) From f1b34cdb28089d4bed93aaab4deabcdd0d0f168d Mon Sep 17 00:00:00 2001 From: Angelscry Date: Tue, 23 Apr 2013 20:19:33 -0400 Subject: [PATCH 16/80] Add category title, genre, description modification option. --- resources/language/English/strings.xml | 2 + resources/lib/launcher_plugin.py | 67 ++++++++++++++++++++------ 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 020eaeb..ad5403b 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -195,6 +195,8 @@ Status : Finished Change Trailer file : %s Change Category : %s + Manage Launchers List + Modify Category Infos Search items... By Title diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index d678461..65c51f4 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -834,20 +834,37 @@ def _add_roms(self, launcher): def _edit_category(self, categoryID): dialog = xbmcgui.Dialog() - type = dialog.select(__language__( 30300 ) % self.categories[categoryID]["name"], [__language__( 30306 ) % self.categories[categoryID]["name"],__language__( 30304 )]) + type = dialog.select(__language__( 30300 ) % self.categories[categoryID]["name"], [__language__( 30301 ),__language__( 30302 ),__language__( 30303 ),__language__( 30343 ),__language__( 30304 )]) if (type == 0 ): - # Edition of the category name - keyboard = xbmc.Keyboard(self.categories[categoryID]["name"], __language__( 30037 )) - keyboard.doModal() - if (keyboard.isConfirmed()): - title = keyboard.getText() - if ( title == "" ): - title = self.categories[categoryID]["name"] - self.categories[categoryID]["name"] = title.rstrip() - self._save_launchers() - if (type == 1 ): + dialog = xbmcgui.Dialog() + type2 = dialog.select(__language__( 30344 ),[__language__( 30306 ) % self.categories[categoryID]["name"],__language__( 30310 ) % self.categories[categoryID]["genre"],__language__( 30328 ) % self.categories[categoryID]["plot"]]) + if (type2 == 0 ): + # Edition of the category name + keyboard = xbmc.Keyboard(self.categories[categoryID]["name"], __language__( 30037 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + title = keyboard.getText() + if ( title == "" ): + title = self.categories[categoryID]["name"] + self.categories[categoryID]["name"] = title.rstrip() + self._save_launchers() + if (type2 == 1 ): + # Edition of the category genre + keyboard = xbmc.Keyboard(self.categories[categoryID]["genre"], __language__( 30040 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self.categories[categoryID]["genre"] = keyboard.getText() + self._save_launchers() + if (type2 == 2 ): + # Import category description + text_file = xbmcgui.Dialog().browse(1,__language__( 30080 ),"files",".txt|.dat", False, False) + if ( os.path.isfile(text_file) == True ): + text_plot = open(text_file, 'r') + self.categories[categoryID]["plot"] = text_plot.read() + text_plot.close() + self._save_launchers() + if (type == 4 ): self._remove_category(categoryID) - if (type == -1 ): self._save_launchers() @@ -1601,6 +1618,10 @@ def _save_launchers (self): usock.write("\t\n") usock.write("\t\t"+categoryIndex+"\n") usock.write("\t\t"+category["name"]+"\n") + usock.write("\t\t"+category["thumb"]+"\n") + usock.write("\t\t"+category["fanart"]+"\n") + usock.write("\t\t"+category["genre"]+"\n") + usock.write("\t\t"+category["plot"]+"\n") usock.write("\t\n") usock.write("\n") # Create Launchers XML list @@ -1675,15 +1696,31 @@ def _load_launchers(self, xmlSource): for category in categories: categoryid = re.findall( "(.*?)", category ) categoryname = re.findall( "(.*?)", category ) + categorythumb = re.findall( "(.*?)", category ) + categoryfanart = re.findall( "(.*?)", category ) + categorygenre = re.findall( "(.*?)", category ) + categoryplot = re.findall( "(.*?)", category ) if len(categoryid) > 0 : categoryid = categoryid[0] else: categoryid = "default" if len(categoryname) > 0 : categoryname = categoryname[0] else: categoryname = "Default" + if len(categorythumb) > 0: categorythumb = categorythumb[0] + else: categorythumb = "" + if len(categoryfanart) > 0: categoryfanart = categoryfanart[0] + else: categoryfanart = "" + if len(categorygenre) > 0: categorygenre = categorygenre[0] + else: categorygenre = "" + if len(categoryplot) > 0: categoryplot = categoryplot[0] + else: categoryplot = "" categorydata = {} categorydata["id"] = categoryid categorydata["name"] = categoryname + categorydata["thumb"] = categorythumb + categorydata["fanart"] = categoryfanart + categorydata["genre"] = categorygenre + categorydata["plot"] = categoryplot self.categories[categoryid] = categorydata launchers = re.findall( "(.*?)", xmlSource ) @@ -1864,7 +1901,7 @@ def _get_categories( self ): for key in sorted(self.categories, key= lambda x : self.categories[x]["name"]): print self.categories[key]['id'] if ( not self.settings[ "hide_default_cat" ] or self.categories[key]['id'] != "default" ): - self._add_category(self.categories[key]["name"], len(self.categories), key) + self._add_category(self.categories[key]["name"], self.categories[key]["genre"], self.categories[key]["plot"], len(self.categories), key) xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) def _get_launchers( self, categoryID ): @@ -2276,7 +2313,7 @@ def _import_roms(self, launcherID, addRoms = False): else: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30016 ) % (romsCount, skipCount) + " " + __language__( 30050 ))) - def _add_category(self, name, total, key) : + def _add_category(self, name, genre, plot, total, key) : commands = [] commands.append((__language__( 30512 ), "XBMC.RunPlugin(%s?%s)" % (self._path, SEARCH_COMMAND) , )) commands.append((__language__( 30051 ), "XBMC.RunPlugin(%s?%s)" % (self._path, FILE_MANAGER_COMMAND) , )) @@ -2287,7 +2324,7 @@ def _add_category(self, name, total, key) : icon = "DefaultFolder.png" commands.append(( __language__( 30194 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, key, ADD_COMMAND) , )) listitem = xbmcgui.ListItem( name, iconImage=icon ) - listitem.setInfo( "video", { "Title": name } ) + listitem.setInfo( "video", { "Title": name, "Genre" : genre, "Plot" : plot} ) listitem.addContextMenuItems( commands ) xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s" % (self._path, key), listitem=listitem, isFolder=True) From 34846d35cbb5723faf6ecef55736e7cee313f86a Mon Sep 17 00:00:00 2001 From: Angelscry Date: Tue, 23 Apr 2013 22:12:52 -0400 Subject: [PATCH 17/80] Add category's thumb and fanart support (scrap/copy/link options). --- resources/lib/launcher_plugin.py | 181 +++++++++++++++++++++++++++++-- 1 file changed, 173 insertions(+), 8 deletions(-) diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 65c51f4..4d183fe 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -545,7 +545,7 @@ def _scrap_thumb_rom_algo(self, launcher, rom, title): _update_cache(file_path) xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) except socket.timeout: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30080 ))) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30081 ))) except exceptions.IOError: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30063 ) % self.launchers[launcher]["roms"][rom]["name"])) else: @@ -594,7 +594,7 @@ def _scrap_thumb_launcher_algo(self, launcherID, title): _update_cache(file_path) xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) except socket.timeout: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30080 ))) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30081 ))) except exceptions.IOError: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30063 ) % self.launchers[launcherID]["name"])) else: @@ -602,6 +602,38 @@ def _scrap_thumb_launcher_algo(self, launcherID, title): else: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30067 ) % (self.launchers[launcherID]["name"]))) + def _scrap_thumb_category_algo(self, categoryID, title): + xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30065 ) % (self.categories[categoryID]["name"],(self.settings[ "thumbs_scraper" ]).encode('utf-8','ignore')))) + covers = self._get_thumbnails_list("",title,"",self.settings[ "thumb_image_size" ]) + if covers: + nb_images = len(covers) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30066 ) % (nb_images,self.categories[categoryID]["name"]))) + covers.insert(0,(self.categories[categoryID]["thumb"],self.categories[categoryID]["thumb"],__language__( 30068 ))) + self.image_url = MyDialog(covers) + if ( self.image_url ): + if (not self.image_url == self.categories[categoryID]["thumb"]): + img_url = self._get_thumbnail(self.image_url) + if ( img_url != '' ): + img_ext = os.path.splitext(img_url)[-1][0:4] + if ( img_ext != '' ): + filename = self.categories[categoryID]["name"] + file_path = os.path.join(DEFAULT_THUMB_PATH,os.path.basename(self.categories[categoryID]["name"])+'_thumb'+img_ext) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000" % (__language__( 30000 ), __language__( 30069 ))) + try: + h = urllib.urlretrieve(img_url,file_path) + self.categories[categoryID]["thumb"] = file_path + self._save_launchers() + _update_cache(file_path) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + except socket.timeout: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30081 ))) + except exceptions.IOError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30063 ) % self.categories[categoryID]["name"])) + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30067 ) % (self.categories[categoryID]["name"]))) + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30067 ) % (self.categories[categoryID]["name"]))) + def _scrap_thumb_launcher(self, launcherID): keyboard = xbmc.Keyboard(self.launchers[launcherID]["name"], __language__( 30036 )) keyboard.doModal() @@ -609,6 +641,13 @@ def _scrap_thumb_launcher(self, launcherID): self._scrap_thumb_launcher_algo(launcherID, keyboard.getText()) xbmc.executebuiltin("Container.Update") + def _scrap_thumb_category(self, categoryID): + keyboard = xbmc.Keyboard(self.categories[categoryID]["name"], __language__( 30036 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self._scrap_thumb_category_algo(categoryID, keyboard.getText()) + xbmc.executebuiltin("Container.Update") + def _scrap_fanart_rom_algo(self, launcher, rom, title): xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30071 ) % (self.launchers[launcher]["roms"][rom]["name"],(self.settings[ "fanarts_scraper" ]).encode('utf-8','ignore')))) full_fanarts = self._get_fanarts_list(self.launchers[launcher]["roms"][rom]["gamesys"],title,self.settings[ "fanart_image_size" ]) @@ -642,13 +681,45 @@ def _scrap_fanart_rom_algo(self, launcher, rom, title): _update_cache(file_path) xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) except socket.timeout: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30080 ))) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30081 ))) except exceptions.IOError: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30064 ) % self.launchers[launcher]["roms"][rom]["name"])) else: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30073 ) % (self.launchers[launcher]["roms"][rom]["name"]))) else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30073 ) % (self.launchers[launcher]["roms"][rom]["name"]))) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30071 ) % (self.launchers[launcher]["roms"][rom]["name"]))) + + def _scrap_fanart_category_algo(self, categoryID, title): + xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30071 ) % (self.categories[categoryID]["name"],(self.settings[ "fanarts_scraper" ]).encode('utf-8','ignore')))) + covers = self._get_fanarts_list("",title,self.settings[ "fanart_image_size" ]) + if covers: + nb_images = len(covers) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30072 ) % (nb_images,self.categories[categoryID]["name"]))) + covers.insert(0,(self.categories[categoryID]["fanart"],self.categories[categoryID]["fanart"],__language__( 30068 ))) + self.image_url = MyDialog(covers) + if ( self.image_url ): + if (not self.image_url == self.categories[categoryID]["fanart"]): + img_url = self._get_fanart(self.image_url) + if ( img_url != '' ): + img_ext = os.path.splitext(img_url)[-1][0:4] + if ( img_ext != '' ): + filename = self.categories[categoryID]["name"] + file_path = os.path.join(DEFAULT_FANART_PATH,os.path.basename(self.categories[categoryID]["name"])+'_fanart'+img_ext) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000" % (__language__( 30000 ), __language__( 30074 ))) + try: + h = urllib.urlretrieve(img_url,file_path) + self.categories[categoryID]["fanart"] = file_path + self._save_launchers() + _update_cache(file_path) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) + except socket.timeout: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30081 ))) + except exceptions.IOError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30064 ) % self.categories[categoryID]["name"])) + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30073 ) % (self.categories[categoryID]["name"]))) + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30073 ) % (self.categories[categoryID]["name"]))) def _scrap_fanart_rom(self, launcher, rom): if ( self.launchers[launcher]["application"].lower().find('mame') > 0 ) or ( self.settings[ "fanarts_scraper" ] == 'arcadeHITS' ): @@ -692,7 +763,7 @@ def _scrap_fanart_launcher_algo(self, launcherID, title): _update_cache(file_path) xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) except socket.timeout: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30080 ))) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30081 ))) except exceptions.IOError: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30064 ) % self.launchers[launcherID]["name"])) else: @@ -708,6 +779,13 @@ def _scrap_fanart_launcher(self, launcherID): self._scrap_fanart_launcher_algo(launcherID, keyboard.getText()) xbmc.executebuiltin("Container.Update") + def _scrap_fanart_category(self, categoryID): + keyboard = xbmc.Keyboard(self.categories[categoryID]["name"], __language__( 30036 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self._scrap_fanart_category_algo(categoryID, keyboard.getText()) + xbmc.executebuiltin("Container.Update") + def _scrap_rom_algo(self, launcher, rom, title): # Search game title results,display = self._get_games_list(title) @@ -863,6 +941,89 @@ def _edit_category(self, categoryID): self.categories[categoryID]["plot"] = text_plot.read() text_plot.close() self._save_launchers() + + # Cattegory Fhumb menu option + if (type == 1 ): + dialog = xbmcgui.Dialog() + thumb_diag = __language__( 30312 ) % ( self.settings[ "thumbs_scraper" ] ) + if ( self.settings[ "thumbs_scraper" ] == "Google" ): + thumb_diag = __language__( 30322 ) % ( self.settings[ "thumbs_scraper" ],self.settings[ "thumb_image_size_display" ].capitalize()) + type2 = dialog.select(__language__( 30302 ), [thumb_diag,__language__( 30332 ),__language__( 30313 )]) + if (type2 == 0 ): + self._scrap_thumb_category(categoryID) + if (type2 == 1 ): + # Import a category thumbnail image + image = xbmcgui.Dialog().browse(2,__language__( 30041 ),"files",".jpg|.jpeg|.gif|.png", True, False, DEFAULT_THUMB_PATH) + if (image): + if (os.path.isfile(image)): + img_ext = os.path.splitext(image)[-1][0:4] + if ( img_ext != '' ): + filename = self.categories[categoryID]["name"] + file_path = os.path.join(DEFAULT_THUMB_PATH,os.path.basename(self.categories[categoryID]["name"])+'_thumb'+img_ext) + if ( image != file_path ): + try: + shutil.copy2( image.decode(sys.getfilesystemencoding(),'ignore') , file_path.decode(sys.getfilesystemencoding(),'ignore') ) + self.categories[categoryID]["thumb"] = file_path + self._save_launchers() + _update_cache(file_path) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + except OSError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30063 ) % self.categories[categoryID]["name"])) + if (type2 == 2 ): + # Link to a category thumbnail image + if (self.categories[categoryID]["thumb"] == ""): + imagepath = DEFAULT_THUMB_PATH + else: + imagepath = self.categories[categoryID]["thumb"] + image = xbmcgui.Dialog().browse(2,__language__( 30041 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(imagepath)) + if (image): + if (os.path.isfile(image)): + self.categories[categoryID]["thumb"] = image + self._save_launchers() + _update_cache(image) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + + # Launcher Fanart menu option + if (type == 2 ): + dialog = xbmcgui.Dialog() + fanart_diag = __language__( 30312 ) % ( self.settings[ "fanarts_scraper" ] ) + if ( self.settings[ "fanarts_scraper" ] == "Google" ): + fanart_diag = __language__( 30322 ) % ( self.settings[ "fanarts_scraper" ],self.settings[ "fanart_image_size_display" ].capitalize()) + type2 = dialog.select(__language__( 30303 ), [fanart_diag,__language__( 30332 ),__language__( 30313 )]) + if (type2 == 0 ): + self._scrap_fanart_category(categoryID) + if (type2 == 1 ): + # Import a Category fanart image + image = xbmcgui.Dialog().browse(2,__language__( 30042 ),"files",".jpg|.jpeg|.gif|.png", True, False, DEFAULT_FANART_PATH) + if (image): + if (os.path.isfile(image)): + img_ext = os.path.splitext(image)[-1][0:4] + if ( img_ext != '' ): + filename = self.categories[categoryID]["name"] + file_path = os.path.join(DEFAULT_FANART_PATH,os.path.basename(self.categories[categoryID]["name"])+'_fanart'+img_ext) + if ( image != file_path ): + try: + shutil.copy2( image.decode(sys.getfilesystemencoding(),'ignore') , file_path.decode(sys.getfilesystemencoding(),'ignore') ) + self.categories[categoryID]["fanart"] = file_path + self._save_launchers() + _update_cache(file_path) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) + except OSError: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30064 ) % self.categories[categoryID]["name"])) + if (type2 == 2 ): + # Link to a category fanart image + if (self.categories[categoryID]["fanart"] == ""): + imagepath = DEFAULT_FANART_PATH + else: + imagepath = self.categories[categoryID]["fanart"] + image = xbmcgui.Dialog().browse(2,__language__( 30042 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(imagepath)) + if (image): + if (os.path.isfile(image)): + self.categories[categoryID]["fanart"] = image + self._save_launchers() + _update_cache(image) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) + if (type == 4 ): self._remove_category(categoryID) if (type == -1 ): @@ -1901,7 +2062,7 @@ def _get_categories( self ): for key in sorted(self.categories, key= lambda x : self.categories[x]["name"]): print self.categories[key]['id'] if ( not self.settings[ "hide_default_cat" ] or self.categories[key]['id'] != "default" ): - self._add_category(self.categories[key]["name"], self.categories[key]["genre"], self.categories[key]["plot"], len(self.categories), key) + self._add_category(self.categories[key]["name"], self.categories[key]["thumb"], self.categories[key]["fanart"], self.categories[key]["genre"], self.categories[key]["plot"], len(self.categories), key) xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) def _get_launchers( self, categoryID ): @@ -2313,7 +2474,7 @@ def _import_roms(self, launcherID, addRoms = False): else: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30016 ) % (romsCount, skipCount) + " " + __language__( 30050 ))) - def _add_category(self, name, genre, plot, total, key) : + def _add_category(self, name, thumb, fanart, genre, plot, total, key): commands = [] commands.append((__language__( 30512 ), "XBMC.RunPlugin(%s?%s)" % (self._path, SEARCH_COMMAND) , )) commands.append((__language__( 30051 ), "XBMC.RunPlugin(%s?%s)" % (self._path, FILE_MANAGER_COMMAND) , )) @@ -2322,8 +2483,12 @@ def _add_category(self, name, genre, plot, total, key) : commands.append(( __language__( 30110 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, key, EDIT_COMMAND) , )) folder = True icon = "DefaultFolder.png" + if (thumb): + listitem = xbmcgui.ListItem( name, iconImage=icon, thumbnailImage=thumb ) + else: + listitem = xbmcgui.ListItem( name, iconImage=icon ) commands.append(( __language__( 30194 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, key, ADD_COMMAND) , )) - listitem = xbmcgui.ListItem( name, iconImage=icon ) + listitem.setProperty("fanart_image", fanart) listitem.setInfo( "video", { "Title": name, "Genre" : genre, "Plot" : plot} ) listitem.addContextMenuItems( commands ) xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s" % (self._path, key), listitem=listitem, isFolder=True) From 7d8e53f070a99621454deeee7a599b2016bd0601 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Tue, 23 Apr 2013 22:56:04 -0400 Subject: [PATCH 18/80] fix deleting category option --- resources/language/English/strings.xml | 2 ++ resources/lib/launcher_plugin.py | 23 +++++++++++++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index ad5403b..ba1c758 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -197,6 +197,8 @@ Change Category : %s Manage Launchers List Modify Category Infos + Impossible to delete the "%s" category. + Please, remove all its launchers before deleting it. Search items... By Title diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 4d183fe..9ff0b9c 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -306,11 +306,18 @@ def _remove_launcher(self, launcherID): def _remove_category(self, categoryID): dialog = xbmcgui.Dialog() - ret = dialog.yesno(__language__( 30000 ), __language__( 30010 ) % self.categories[categoryID]["name"]) - if (ret): - self.categories.pop(categoryID) - self._save_launchers() - xbmc.executebuiltin("Container.Update") + launcher_list = [] + for launcherID in sorted(self.launchers.iterkeys()): + if (self.launchers[launcherID]['category'] == categoryID): + launcher_list.append(launcherID) + if ( len(launcher_list) > 0 ): + ret = dialog.ok(__language__( 30000 ), __language__( 30345 ) % self.categories[categoryID]["name"], __language__( 30346 )) + else: + ret = dialog.yesno(__language__( 30000 ), __language__( 30010 ) % self.categories[categoryID]["name"]) + if (ret): + self.categories.pop(categoryID) + self._save_launchers() + xbmc.executebuiltin("Container.Update") def _edit_rom(self, launcher, rom): dialog = xbmcgui.Dialog() @@ -912,7 +919,7 @@ def _add_roms(self, launcher): def _edit_category(self, categoryID): dialog = xbmcgui.Dialog() - type = dialog.select(__language__( 30300 ) % self.categories[categoryID]["name"], [__language__( 30301 ),__language__( 30302 ),__language__( 30303 ),__language__( 30343 ),__language__( 30304 )]) + type = dialog.select(__language__( 30300 ) % self.categories[categoryID]["name"], [__language__( 30301 ),__language__( 30302 ),__language__( 30303 ),__language__( 30304 )]) if (type == 0 ): dialog = xbmcgui.Dialog() type2 = dialog.select(__language__( 30344 ),[__language__( 30306 ) % self.categories[categoryID]["name"],__language__( 30310 ) % self.categories[categoryID]["genre"],__language__( 30328 ) % self.categories[categoryID]["plot"]]) @@ -942,7 +949,7 @@ def _edit_category(self, categoryID): text_plot.close() self._save_launchers() - # Cattegory Fhumb menu option + # Cattegory Thumb menu option if (type == 1 ): dialog = xbmcgui.Dialog() thumb_diag = __language__( 30312 ) % ( self.settings[ "thumbs_scraper" ] ) @@ -1024,7 +1031,7 @@ def _edit_category(self, categoryID): _update_cache(image) xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) - if (type == 4 ): + if (type == 3 ): self._remove_category(categoryID) if (type == -1 ): self._save_launchers() From f4b9080b1c3d78ae57fcb70d9eb890f5d588a18e Mon Sep 17 00:00:00 2001 From: Angelscry Date: Tue, 23 Apr 2013 23:19:32 -0400 Subject: [PATCH 19/80] add GET_INFO, GET_THUMB and GET_FANART skin command support for categories --- resources/lib/launcher_plugin.py | 67 ++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 9ff0b9c..61e5f67 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -205,6 +205,13 @@ def __init__( self, *args, **kwargs ): self._file_manager() elif (launcher == EDIT_COMMAND): self._edit_category(category) + elif (launcher == GET_INFO): + self._modify_category(category) + xbmc.executebuiltin("Container.Refresh") + elif (launcher == GET_THUMB): + self._scrap_thumb_category(category) + elif (launcher == GET_FANART): + self._scrap_fanart_category(category) elif (launcher == ADD_COMMAND): self._add_new_launcher(category) @@ -917,39 +924,41 @@ def _add_roms(self, launcher): xbmc.executebuiltin("Container.Refresh") + def _modify_category(self, categoryID): + dialog = xbmcgui.Dialog() + type2 = dialog.select(__language__( 30344 ),[__language__( 30306 ) % self.categories[categoryID]["name"],__language__( 30310 ) % self.categories[categoryID]["genre"],__language__( 30328 ) % self.categories[categoryID]["plot"]]) + if (type2 == 0 ): + # Edition of the category name + keyboard = xbmc.Keyboard(self.categories[categoryID]["name"], __language__( 30037 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + title = keyboard.getText() + if ( title == "" ): + title = self.categories[categoryID]["name"] + self.categories[categoryID]["name"] = title.rstrip() + self._save_launchers() + if (type2 == 1 ): + # Edition of the category genre + keyboard = xbmc.Keyboard(self.categories[categoryID]["genre"], __language__( 30040 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self.categories[categoryID]["genre"] = keyboard.getText() + self._save_launchers() + if (type2 == 2 ): + # Import category description + text_file = xbmcgui.Dialog().browse(1,__language__( 30080 ),"files",".txt|.dat", False, False) + if ( os.path.isfile(text_file) == True ): + text_plot = open(text_file, 'r') + self.categories[categoryID]["plot"] = text_plot.read() + text_plot.close() + self._save_launchers() + def _edit_category(self, categoryID): dialog = xbmcgui.Dialog() type = dialog.select(__language__( 30300 ) % self.categories[categoryID]["name"], [__language__( 30301 ),__language__( 30302 ),__language__( 30303 ),__language__( 30304 )]) if (type == 0 ): - dialog = xbmcgui.Dialog() - type2 = dialog.select(__language__( 30344 ),[__language__( 30306 ) % self.categories[categoryID]["name"],__language__( 30310 ) % self.categories[categoryID]["genre"],__language__( 30328 ) % self.categories[categoryID]["plot"]]) - if (type2 == 0 ): - # Edition of the category name - keyboard = xbmc.Keyboard(self.categories[categoryID]["name"], __language__( 30037 )) - keyboard.doModal() - if (keyboard.isConfirmed()): - title = keyboard.getText() - if ( title == "" ): - title = self.categories[categoryID]["name"] - self.categories[categoryID]["name"] = title.rstrip() - self._save_launchers() - if (type2 == 1 ): - # Edition of the category genre - keyboard = xbmc.Keyboard(self.categories[categoryID]["genre"], __language__( 30040 )) - keyboard.doModal() - if (keyboard.isConfirmed()): - self.categories[categoryID]["genre"] = keyboard.getText() - self._save_launchers() - if (type2 == 2 ): - # Import category description - text_file = xbmcgui.Dialog().browse(1,__language__( 30080 ),"files",".txt|.dat", False, False) - if ( os.path.isfile(text_file) == True ): - text_plot = open(text_file, 'r') - self.categories[categoryID]["plot"] = text_plot.read() - text_plot.close() - self._save_launchers() - - # Cattegory Thumb menu option + self._modify_category(categoryID) + # Category Thumb menu option if (type == 1 ): dialog = xbmcgui.Dialog() thumb_diag = __language__( 30312 ) % ( self.settings[ "thumbs_scraper" ] ) From 48c780f62368b5d2211b3341bb25da36df7f9e64 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Wed, 24 Apr 2013 20:17:36 -0400 Subject: [PATCH 20/80] add launchers recursive delete for category deleting --- resources/language/English/strings.xml | 6 +++--- resources/lib/launcher_plugin.py | 7 ++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index ba1c758..151a78f 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -3,7 +3,7 @@ Advanced Launcher - Are you sure you want to remove "%s" ? + Are you sure you want to delete "%s" ? Importing files from %s %s files imported %s files imported, %s skipped @@ -197,8 +197,8 @@ Change Category : %s Manage Launchers List Modify Category Infos - Impossible to delete the "%s" category. - Please, remove all its launchers before deleting it. + "%s" contains %s launchers. + Deleting "%s" will also delete related launchers. Search items... By Title diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 61e5f67..cb5e787 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -318,7 +318,12 @@ def _remove_category(self, categoryID): if (self.launchers[launcherID]['category'] == categoryID): launcher_list.append(launcherID) if ( len(launcher_list) > 0 ): - ret = dialog.ok(__language__( 30000 ), __language__( 30345 ) % self.categories[categoryID]["name"], __language__( 30346 )) + ret = dialog.yesno(__language__( 30000 ), __language__( 30345 ) % (self.categories[categoryID]["name"],len(launcher_list)), __language__( 30346 ) % self.categories[categoryID]["name"], __language__( 30010 ) % self.categories[categoryID]["name"]) + if (ret): + for launcherID in launcher_list: + self.launchers.pop(launcherID) + self.categories.pop(categoryID) + self._save_launchers() else: ret = dialog.yesno(__language__( 30000 ), __language__( 30010 ) % self.categories[categoryID]["name"]) if (ret): From 500640ce8a8ed82c4fd1f7e1a2c183380a428a2f Mon Sep 17 00:00:00 2001 From: Angelscry Date: Wed, 24 Apr 2013 21:20:39 -0400 Subject: [PATCH 21/80] add launchers.xml files merging option --- resources/language/English/strings.xml | 4 +- resources/lib/launcher_plugin.py | 79 ++++++++++++++++---------- resources/settings.xml | 1 + 3 files changed, 53 insertions(+), 31 deletions(-) diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 151a78f..cfab819 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -135,12 +135,12 @@ Activate autobackup Advanced Number of backup files to keep - Restore a backup (Import XML file) + Restore a backup (import XML file) Select the XML file to import Show logs into xbmc.log file Display Hide the Default Category - Merge items list (Append XML files) + Merge launchers lists (append XML files) Select the XML file to append Merger Start diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index cb5e787..d4ffc79 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -57,6 +57,8 @@ def __language__(string): BASE_PATH = xbmc.translatePath( os.path.join( "special://" , "profile" ) ) BASE_CURRENT_SOURCE_PATH = os.path.join( PLUGIN_DATA_PATH , "launchers.xml" ) TEMP_CURRENT_SOURCE_PATH = os.path.join( PLUGIN_DATA_PATH , "launchers.tmp" ) +MERGED_SOURCE_PATH = os.path.join(PLUGIN_DATA_PATH , "merged-launchers.xml" ) + SHORTCUT_FILE = os.path.join( PLUGIN_DATA_PATH , "shortcut.cut" ) DEFAULT_THUMB_PATH = os.path.join( PLUGIN_DATA_PATH , "thumbs" ) @@ -253,7 +255,7 @@ def __init__( self, *args, **kwargs ): self._print_log(__language__( 30185 )) append_file = xbmcgui.Dialog().browse(1,__language__( 30191 ),"files",".xml", False, False, os.path.join(PLUGIN_DATA_PATH+"/")) if (os.path.isfile(append_file)): - self._append_launchers(self.get_xml_source(append_file)) + self._append_launchers(append_file) elif ( self._empty_cat(category) ): self._add_new_launcher(category) else: @@ -1867,6 +1869,14 @@ def _save_launchers (self): os.remove(TEMP_CURRENT_SOURCE_PATH) xbmc.executebuiltin( "Dialog.Close(busydialog)" ) + def _append_launchers(self, xmlfile): + destination = open(MERGED_SOURCE_PATH,'wb') + shutil.copyfileobj(open(xmlfile,'rb'), destination) + shutil.copyfileobj(open(BASE_CURRENT_SOURCE_PATH,'rb'), destination) + destination.close() + shutil.copy2(MERGED_SOURCE_PATH, BASE_CURRENT_SOURCE_PATH) + os.remove(MERGED_SOURCE_PATH) + xbmc.executebuiltin("Container.Refresh") ''' read the list of categories, launchers and roms from launchers.xml file ''' def _load_launchers(self, xmlSource): @@ -1875,35 +1885,46 @@ def _load_launchers(self, xmlSource): xmlSource = xmlSource.replace("&", "&") categories = re.findall( "(.*?)", xmlSource ) - for category in categories: - categoryid = re.findall( "(.*?)", category ) - categoryname = re.findall( "(.*?)", category ) - categorythumb = re.findall( "(.*?)", category ) - categoryfanart = re.findall( "(.*?)", category ) - categorygenre = re.findall( "(.*?)", category ) - categoryplot = re.findall( "(.*?)", category ) - - if len(categoryid) > 0 : categoryid = categoryid[0] - else: categoryid = "default" - if len(categoryname) > 0 : categoryname = categoryname[0] - else: categoryname = "Default" - if len(categorythumb) > 0: categorythumb = categorythumb[0] - else: categorythumb = "" - if len(categoryfanart) > 0: categoryfanart = categoryfanart[0] - else: categoryfanart = "" - if len(categorygenre) > 0: categorygenre = categorygenre[0] - else: categorygenre = "" - if len(categoryplot) > 0: categoryplot = categoryplot[0] - else: categoryplot = "" - + + if len(categories) > 0 : + for category in categories: + categoryid = re.findall( "(.*?)", category ) + categoryname = re.findall( "(.*?)", category ) + categorythumb = re.findall( "(.*?)", category ) + categoryfanart = re.findall( "(.*?)", category ) + categorygenre = re.findall( "(.*?)", category ) + categoryplot = re.findall( "(.*?)", category ) + + if len(categoryid) > 0 : categoryid = categoryid[0] + else: categoryid = "default" + if len(categoryname) > 0 : categoryname = categoryname[0] + else: categoryname = "Default" + if len(categorythumb) > 0: categorythumb = categorythumb[0] + else: categorythumb = "" + if len(categoryfanart) > 0: categoryfanart = categoryfanart[0] + else: categoryfanart = "" + if len(categorygenre) > 0: categorygenre = categorygenre[0] + else: categorygenre = "" + if len(categoryplot) > 0: categoryplot = categoryplot[0] + else: categoryplot = "" + + categorydata = {} + categorydata["id"] = categoryid + categorydata["name"] = categoryname + categorydata["thumb"] = categorythumb + categorydata["fanart"] = categoryfanart + categorydata["genre"] = categorygenre + categorydata["plot"] = categoryplot + self.categories[categoryid] = categorydata + else: categorydata = {} - categorydata["id"] = categoryid - categorydata["name"] = categoryname - categorydata["thumb"] = categorythumb - categorydata["fanart"] = categoryfanart - categorydata["genre"] = categorygenre - categorydata["plot"] = categoryplot - self.categories[categoryid] = categorydata + categorydata["id"] = "default" + categorydata["name"] = "Default" + categorydata["thumb"] = "" + categorydata["fanart"] = "" + categorydata["genre"] = "" + categorydata["plot"] = "" + self.categories["default"] = categorydata launchers = re.findall( "(.*?)", xmlSource ) for launcher in launchers: diff --git a/resources/settings.xml b/resources/settings.xml index bbf2751..f98164e 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -59,6 +59,7 @@ + From e1c514be5d58fdf5c227efa985cdd704223b2d2d Mon Sep 17 00:00:00 2001 From: Angelscry Date: Wed, 24 Apr 2013 21:42:12 -0400 Subject: [PATCH 22/80] rearranges settings menus --- resources/language/English/strings.xml | 24 ++++++++++++------------ resources/settings.xml | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index cfab819..0dd830d 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -78,7 +78,7 @@ Source Thumbs Fanarts - Misc. Options + Miscellaneous For Thumbs images Data & Infos For Fanarts images @@ -103,11 +103,11 @@ Semi-automatic Automatic Article ("The","A") at the end - Action on Playing Media + Action on XBMC playing media Stop Pause Let Play - Debug + Debug options Show batch command window Recursive scan Ignore Scraped Titles (use filenames) @@ -130,20 +130,20 @@ Prefered images Snapshots Flyers - Adjust launcher delay (ms) - Backup - Activate autobackup + Delay (ms) + Backup options + Activate auto-backup Advanced - Number of backup files to keep - Restore a backup (import XML file) + Number of backup files to store + Import XML file (restore backup) Select the XML file to import - Show logs into xbmc.log file - Display + Advanced Launcher logs into xbmc.log file + Display options Hide the Default Category - Merge launchers lists (append XML files) + Append XML files (merge launchers lists) Select the XML file to append Merger - Start + Launcher start options Add New Launcher default diff --git a/resources/settings.xml b/resources/settings.xml index f98164e..59c7042 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -5,6 +5,7 @@ + @@ -41,9 +42,9 @@ - + @@ -63,7 +64,6 @@ - From 2e275bd63462968c6cc5d17c39bceeaeae2339c8 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Fri, 26 Apr 2013 20:12:00 -0400 Subject: [PATCH 23/80] change version number and update changelog --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 7 ++++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/addon.py b/addon.py index 7814af2..d123fa7 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "http://sourceforge.net/projects/advlauncher/" __git_url__ = "http://sourceforge.net/p/advlauncher/git/?source=navbar" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "1.99.0" +__version__ = "2.0.0" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 0e528a4..0b9ef42 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 89c6be6..e986238 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,4 +1,9 @@ -[B]1.99.0[/B] +[B]2.0.0[/B] +. Add category parameter to launchers. +. Add option to show"hide the default category. +. Add category title, genre, description modification option. +. Add category's thumb and fanart support (scrap/copy/link options). +. Add launchers.xml files merging option . Add alternative application option for each items. . Add alternative argument option for each items. From 1a587c9761e80d490e215db79a140bb75e583b76 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Sat, 27 Apr 2013 08:42:36 -0400 Subject: [PATCH 24/80] fix category creation bug --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 5 +++-- resources/language/English/strings.xml | 2 ++ resources/lib/launcher_plugin.py | 29 +++++++++++++++++++++++--- 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/addon.py b/addon.py index d123fa7..9798a8e 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "http://sourceforge.net/projects/advlauncher/" __git_url__ = "http://sourceforge.net/p/advlauncher/git/?source=navbar" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.0.0" +__version__ = "2.0.1" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 0b9ef42..b657f58 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index e986238..608e174 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,11 +1,12 @@ +[B]2.0.1[/B] +. Fix caterory creation bug. + [B]2.0.0[/B] . Add category parameter to launchers. . Add option to show"hide the default category. . Add category title, genre, description modification option. . Add category's thumb and fanart support (scrap/copy/link options). . Add launchers.xml files merging option -. Add alternative application option for each items. -. Add alternative argument option for each items. [B]1.13.1[/B] . Fix thumb/fanart image local import for items. diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 0dd830d..ee2771b 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -199,6 +199,8 @@ Modify Category Infos "%s" contains %s launchers. Deleting "%s" will also delete related launchers. + Alternative application : %s + Alternative arguments : %s Search items... By Title diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index d4ffc79..965296e 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -508,18 +508,37 @@ def _edit_rom(self, launcher, rom): if (type == 5 ): dialog = xbmcgui.Dialog() - type2 = dialog.select(__language__( 30323 ), [__language__( 30337 ) % self.launchers[launcher]["roms"][rom]["filename"], __language__( 30341 ) % self.launchers[launcher]["roms"][rom]["trailer"], __language__( 30331 ) % self.launchers[launcher]["roms"][rom]["custom"]]) + type2 = dialog.select(__language__( 30323 ), [__language__( 30337 ) % self.launchers[launcher]["roms"][rom]["filename"], __language__( 30347 ) % self.launchers[launcher]["roms"][rom]["altapp"], __language__( 30348 ) % self.launchers[launcher]["roms"][rom]["altarg"], __language__( 30341 ) % self.launchers[launcher]["roms"][rom]["trailer"], __language__( 30331 ) % self.launchers[launcher]["roms"][rom]["custom"]]) if (type2 == 0 ): # Selection of the item file item_file = xbmcgui.Dialog().browse(1,__language__( 30017 ),"files","."+self.launchers[launcher]["romext"].replace("|","|."), False, False, self.launchers[launcher]["roms"][rom]["filename"]) self.launchers[launcher]["roms"][rom]["filename"] = item_file self._save_launchers() if (type2 == 1 ): + # Launcher application path menu option + if (os.environ.get( "OS", "xbox" ) == "xbox"): + filter = ".xbe|.cut" + else: + if (sys.platform == "win32"): + filter = ".bat|.exe|.cmd|.lnk" + else: + filter = "" + app = xbmcgui.Dialog().browse(1,__language__( 30023 ),"files",filter, False, False, self.launchers[launcher]["roms"][rom]["altapp"]) + self.launchers[launcher]["roms"][rom]["altapp"] = app + self._save_launchers() + # Edition of the launcher arguments + if (type2 == 2 ): + keyboard = xbmc.Keyboard(self.launchers[launcher]["roms"][rom]["altarg"], __language__( 30052 )) + keyboard.doModal() + if (keyboard.isConfirmed()): + self.launchers[launcher]["roms"][rom]["altarg"] = keyboard.getText() + self._save_launchers() + if (type2 == 3 ): # Selection of the rom trailer file trailer = xbmcgui.Dialog().browse(1,__language__( 30090 ),"files",".mp4|.mpg|.avi|.wmv|.mkv|.flv", False, False, self.launchers[launcher]["roms"][rom]["trailer"]) self.launchers[launcher]["roms"][rom]["trailer"] = trailer self._save_launchers() - if (type2 == 2 ): + if (type2 == 4 ): # Selection of the rom customs path custom = xbmcgui.Dialog().browse(0,__language__( 30057 ),"files","", False, False, self.launchers[launcher]["roms"][rom]["custom"]) self.launchers[launcher]["roms"][rom]["custom"] = custom @@ -1304,7 +1323,7 @@ def _edit_launcher(self, launcherID): # Launcher application path menu option type2_nb = 0 if (type2 == type2_nb ): - app = xbmcgui.Dialog().browse(1,__language__( 30023 ),"files",filter, False, False, self.launchers[launcherID]["application"]) + app = xbmcgui.Dialog().browse(1,__language__( 30023 ),"files","", False, False, self.launchers[launcherID]["application"]) self.launchers[launcherID]["application"] = app # Edition of the launcher arguments @@ -2701,6 +2720,10 @@ def _add_new_category ( self ) : if (keyboard.isConfirmed()): categorydata = {} categorydata["name"] = keyboard.getText() + categorydata["thumb"] = "" + categorydata["fanart"] = "" + categorydata["genre"] = "" + categorydata["plot"] = "" categoryid = _get_SID() self.categories[categoryid] = categorydata self._save_launchers() From f85213ad1cda8595a7a2ec63d4483ef9f3e59c15 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Sat, 27 Apr 2013 09:28:53 -0400 Subject: [PATCH 25/80] add alternative application option for each items. add alternative argument option for each items. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 4 ++++ resources/lib/launcher_plugin.py | 25 +++++++++++++++++-------- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/addon.py b/addon.py index 9798a8e..28c1aaa 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "http://sourceforge.net/projects/advlauncher/" __git_url__ = "http://sourceforge.net/p/advlauncher/git/?source=navbar" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.0.1" +__version__ = "2.0.2" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index b657f58..7f28778 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 608e174..fae37f7 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,7 @@ +[B]2.0.2[/B] +. Add alternative application option for each items. +. Add alternative argument option for each items. + [B]2.0.1[/B] . Fix caterory creation bug. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 965296e..2df251d 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -1648,7 +1648,11 @@ def _run_rom(self, launcherID, romName): if (launcher["roms"].has_key(romName)): rom = self.launchers[launcherID]["roms"][romName] romfile = os.path.basename(rom["filename"]) - apppath = os.path.dirname(launcher["application"]) + if ( rom["altapp"] != "" ): + application = rom["altapp"] + else: + application = launcher["application"] + apppath = os.path.dirname(application) rompath = os.path.dirname(rom["filename"]) romname = os.path.splitext(romfile)[0] @@ -1696,7 +1700,10 @@ def _run_rom(self, launcherID, romName): else: return "" - arguments = launcher["args"] + if ( rom["altarg"] != "" ): + arguments = rom["altarg"] + else: + arguments = launcher["args"] arguments = arguments.replace("%rom%" , rom["filename"]).replace("%ROM%" , rom["filename"]) arguments = arguments.replace("%romfile%" , romfile).replace("%ROMFILE%" , romfile) arguments = arguments.replace("%romname%" , romname).replace("%ROMNAME%" , romname) @@ -1706,7 +1713,9 @@ def _run_rom(self, launcherID, romName): arguments = arguments.replace("%romtitle%" , rom["name"]).replace("%ROMTITLE%" , rom["name"]) arguments = arguments.replace("%romspath%" , launcher["rompath"]).replace("%ROMSPATH%" , launcher["rompath"]) - if ( os.path.basename(launcher["application"]).lower().replace(".exe" , "") == "xbmc" ): + print "ALA : application" + application + print "ALA : arguments" + arguments + if ( os.path.basename(application).lower().replace(".exe" , "") == "xbmc" ): xbmc.executebuiltin('XBMC.' + arguments) else: if ( xbmc.Player().isPlaying() ): @@ -1723,7 +1732,7 @@ def _run_rom(self, launcherID, romName): if (os.environ.get( "OS", "xbox" ) == "xbox"): f=open(SHORTCUT_FILE, "wb") f.write("\n") - f.write(" " + launcher["application"] + "\n") + f.write(" " + application + "\n") f.write(" \n") f.write(" " + rom["filename"] + "\n") f.write(" \n") @@ -1735,7 +1744,7 @@ def _run_rom(self, launcherID, romName): if ( launcher["lnk"] == "true" ) and ( launcher["romext"] == "lnk" ): os.system("start \"\" \"%s\"" % (arguments)) else: - if ( launcher["application"].split(".")[-1] == "bat" ): + if ( application.split(".")[-1] == "bat" ): info = subprocess_hack.STARTUPINFO() info.dwFlags = 1 if ( self.settings[ "show_batch" ] ): @@ -1744,16 +1753,16 @@ def _run_rom(self, launcherID, romName): info.wShowWindow = 0 else: info = None - startproc = subprocess_hack.Popen(r'%s %s' % (launcher["application"], arguments), cwd=apppath, startupinfo=info) + startproc = subprocess_hack.Popen(r'%s %s' % (application, arguments), cwd=apppath, startupinfo=info) startproc.wait() elif (sys.platform.startswith('linux')): if ( self.settings[ "lirc_state" ] ): xbmc.executebuiltin('LIRC.stop') - os.system("\"%s\" %s " % (launcher["application"], arguments)) + os.system("\"%s\" %s " % (application, arguments)) if ( self.settings[ "lirc_state" ] ): xbmc.executebuiltin('LIRC.start') elif (sys.platform.startswith('darwin')): - os.system("\"%s\" %s " % (launcher["application"], arguments)) + os.system("\"%s\" %s " % (application, arguments)) else: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30609 ))) xbmc.sleep(self.settings[ "start_tempo" ]) From 51b7f577c0002bb068739fa0ba61c58148b23821 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Mon, 29 Apr 2013 19:51:49 -0400 Subject: [PATCH 26/80] fix category assignment for files launcher creation --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 +++ resources/lib/launcher_plugin.py | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/addon.py b/addon.py index 28c1aaa..17b8fce 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "http://sourceforge.net/projects/advlauncher/" __git_url__ = "http://sourceforge.net/p/advlauncher/git/?source=navbar" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.0.2" +__version__ = "2.0.3" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 7f28778..b880e63 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index fae37f7..29f9ffb 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.0.3[/B] +. Fix category assignment for files launcher creation. + [B]2.0.2[/B] . Add alternative application option for each items. . Add alternative argument option for each items. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 2df251d..cb8396a 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -2856,7 +2856,7 @@ def _add_new_launcher ( self, categoryID ) : # prepare launcher object data launcherdata = {} launcherdata["name"] = title - launcherdata["category"] = "default" + launcherdata["category"] = categoryID launcherdata["application"] = app launcherdata["args"] = args launcherdata["rompath"] = path From 5fb73b59ba15af5cd3f11c854aa380bfad60e69a Mon Sep 17 00:00:00 2001 From: Angelscry Date: Thu, 9 May 2013 23:35:42 -0400 Subject: [PATCH 27/80] Fix ComicVine scraper --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 + .../scrapers/datas/ComicVine/datas_scraper.py | 147 ++++++------------ .../thumbs/ComicVine/thumbs_scraper.py | 40 ++--- 5 files changed, 65 insertions(+), 129 deletions(-) diff --git a/addon.py b/addon.py index 17b8fce..ae69f6c 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "http://sourceforge.net/projects/advlauncher/" __git_url__ = "http://sourceforge.net/p/advlauncher/git/?source=navbar" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.0.3" +__version__ = "2.0.4" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index b880e63..325b96e 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 29f9ffb..6381aef 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.0.4[/B] +. Fix ComicVine scraper. + [B]2.0.3[/B] . Fix category assignment for files launcher creation. diff --git a/resources/scrapers/datas/ComicVine/datas_scraper.py b/resources/scrapers/datas/ComicVine/datas_scraper.py index 09a69f0..4567055 100644 --- a/resources/scrapers/datas/ComicVine/datas_scraper.py +++ b/resources/scrapers/datas/ComicVine/datas_scraper.py @@ -2,121 +2,74 @@ import re import os -import urllib,urllib2 +import urllib import simplejson -# Get url with Mozilla User-Agent -def get_url(url): - req_headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.A.B.C Safari/525.13','Referer': 'http://python.org'} - request = urllib2.Request(url, headers=req_headers) - opener = urllib2.build_opener() - response = opener.open(request) - contents = response.read().replace('\r\n', '').replace('\n', '') - return contents +comicvine_api_key = "a1aaa516eaf233abf29c8aefaa46dc39cc0f0873" +comicvine_api_url = "http://beta.comicvine.com/api" -# Remove HTML tags -def striphtml(data): - p = re.compile(r'<.*?>') - return p.sub('', data) - -# Return Comics search list def _get_games_list(search): - comicvine_key = "a1aaa516eaf233abf29c8aefaa46dc39cc0f0873" results = [] display = [] - search = urllib.quote(search.lower()) try: - url = get_url('http://www.google.com/cse?cx=017553361912933201960%3Ag3cbzpf3qis&q="'+search+'"&as_occt=title&nojs=1&num=100') - issues = re.findall('(.*?)', url) - for i in issues: + f = urllib.urlopen('http://www.comicvine.com/search/?indices[0]=cv_issue&q="'+urllib.quote(search.lower())+'"') + page = f.read().replace('\r\n', '').replace('\n', '').strip('\t') + issues = re.findall('/4000-(.*?)/">
(.*?)

(.*?)

(.*?) issue \((.*?)\)', page) + for issue in issues: comic = {} - comic_id = i[0].split('/') - issue_id = comic_id[-2].rsplit('-',1) - page_type = issue_id[0] - if ( issue_id[-1].isdigit()) and ( issue_id[0] == "37" ): - comic["id"] = str(issue_id[-1].encode('utf-8','ignore')) - f = urllib.urlopen('http://api.comicvine.com/issue/'+comic["id"]+'/?api_key='+comicvine_key+'&format=xml&field_list=publish_year,description,volume,name,issue_number') - page = f.read().replace('\r\n', '').replace('\n', '') - volume_name = ''.join(re.findall('', page)) - issue_number = ''.join(re.findall('(.*?)', page)) - issue_name = ''.join(re.findall('', page)) - release = ''.join(re.findall('(.*?)', page)) - comic["title"] = str(volume_name) - if ( issue_number != "" ): - comic["title"] += ' #'+'{0:.3g}'.format(float(issue_number)) - if ( issue_name != "" ): - comic["title"] += ': '+issue_name - if ( release != "" ): - comic["title"] += ' ('+release+')' - comic["gamesys"] = 'Comic' - results.append(comic) - display.append(comic["title"].encode('utf-8','ignore')) + comic["id"] = issue[0] + comic["title"] = unescape(issue[2]) + comic["studio"] = issue[4] + comic["release"] = issue[5][-4:] + comic["order"] = 1 + comic_volume = comic["title"].split(' - ') + if ( comic_volume[0].lower() == search.lower() ): + comic["order"] += 1 + if ( comic["title"].lower() == search.lower() ): + comic["order"] += 1 + if ( comic["title"].lower().find(search.lower()) != -1 ): + comic["order"] += 1 + results.append(comic) + results.sort(key=lambda result: result["order"], reverse=True) + for result in results: + display.append(result["title"].encode('utf-8','ignore')+' ('+result["studio"].encode('utf-8','ignore')+' / '+result["release"].encode('utf-8','ignore')+')') return results,display except: return results,display # Return 1st Comic search def _get_first_game(search,gamesys): - comicvine_key = "a1aaa516eaf233abf29c8aefaa46dc39cc0f0873" - results = [] - search = urllib.quote(search.lower()) - try: - url = get_url('http://www.google.com/cse?cx=017553361912933201960%3Ag3cbzpf3qis&q="'+search+'"&as_occt=title&nojs=1&num=100') - issues = re.findall('(.*?)', url) - for i in issues: - comic = {} - comic_id = i[0].split('/') - issue_id = comic_id[-2].rsplit('-',1) - page_type = issue_id[0] - if ( issue_id[-1].isdigit()) and ( issue_id[0] == "37" ): - comic["id"] = str(issue_id[-1].encode('utf-8','ignore')) - f = urllib.urlopen('http://api.comicvine.com/issue/'+comic["id"]+'/?api_key='+comicvine_key+'&format=xml&field_list=publish_year,description,volume,name,issue_number') - page = f.read().replace('\r\n', '').replace('\n', '') - volume_name = ''.join(re.findall('', page)) - issue_number = ''.join(re.findall('(.*?)', page)) - issue_name = ''.join(re.findall('', page)) - release = ''.join(re.findall('(.*?)', page)) - comic["title"] = str(volume_name) - if ( issue_number != "" ): - comic["title"] += ' #'+'{0:.3g}'.format(float(issue_number)) - if ( issue_name != "" ): - comic["title"] += ': '+issue_name - if ( release != "" ): - comic["title"] += ' ('+release+')' - comic["gamesys"] = 'Comic' - results.append(comic) - return results - except: - return results - + results,display = _get_games_list(search) + return results + # Return Comic data -def _get_game_data(game_id): - comicvine_key = "a1aaa516eaf233abf29c8aefaa46dc39cc0f0873" - gamedata = {} - gamedata["genre"] = "" - gamedata["release"] = "" - gamedata["studio"] = "" - gamedata["plot"] = "" +def _get_game_data(comic_id): + comicdata = {} + comicdata["genre"] = "Comic" + comicdata["release"] = "" + comicdata["studio"] = "" + comicdata["plot"] = "" try: - f = urllib.urlopen('http://api.comicvine.com/issue/'+game_id+'/?api_key='+comicvine_key+'&format=xml&field_list=publish_year,description,volume,name,issue_number') - page = f.read().replace('\r\n', '').replace('\n', '') - release_date = ''.join(re.findall('(.*?)', page)) - gamedata["release"] = release_date.encode('utf-8','ignore') - plot = ''.join(re.findall('', page)) - title = re.findall('', page) - p = re.compile(r'<.*?>') - gamedata["plot"] = unescape(p.sub('', title[0].encode('utf-8','ignore')+" : "+plot.encode('utf-8','ignore'))) - volume = ''.join(re.findall('', page)) - if volume: - f = urllib.urlopen(volume+'?api_key='+comicvine_key+'&format=xml&field_list=publisher') - page = f.read().replace('\r\n', '').replace('\n', '') - studio = ''.join(re.findall('', page)) - gamedata["studio"] = studio.encode('utf-8','ignore') - return gamedata + f = urllib.urlopen(comicvine_api_url+'/issue/'+comic_id+'/?api_key='+comicvine_api_key+'&format=json&field_list=cover_date,description,volume,name,issue_number') + json = simplejson.loads(f.read()) + f.close() + if ( json['results']['cover_date'] ): + comicdata["release"] = str(json['results']['cover_date'])[0:4] + if ( json['results']['description'] ): + p = re.compile(r'<.*?>') + comicdata["plot"] = p.sub('', unescape(json['results']['description'].encode('utf-8','ignore'))) + if ( json['results']['volume'] ): + f = urllib.urlopen(comicvine_api_url+'/volume/'+str(json['results']['volume']['id'])+'/?api_key='+comicvine_api_key+'&format=json&field_list=publisher') + json2 = simplejson.loads(f.read()) + f.close() + if ( json2['results']['publisher'] ): + comicdata["studio"] = str(json2['results']['publisher']['name']).encode('utf-8','ignore') + return comicdata except: - return gamedata - + return comicdata + def unescape(s): + s = s.replace('

',' ') s = s.replace('
',' ') s = s.replace("<", "<") s = s.replace(">", ">") diff --git a/resources/scrapers/thumbs/ComicVine/thumbs_scraper.py b/resources/scrapers/thumbs/ComicVine/thumbs_scraper.py index 5bffddb..0d29d96 100644 --- a/resources/scrapers/thumbs/ComicVine/thumbs_scraper.py +++ b/resources/scrapers/thumbs/ComicVine/thumbs_scraper.py @@ -6,41 +6,21 @@ import simplejson from xbmcaddon import Addon -# Get url with Mozilla User-Agent -def get_url(url): - req_headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.A.B.C Safari/525.13','Referer': 'http://python.org'} - request = urllib2.Request(url, headers=req_headers) - opener = urllib2.build_opener() - response = opener.open(request) - contents = response.read().replace('\r\n', '').replace('\n', '') - return contents - -# Remove HTML tags -def striphtml(data): - p = re.compile(r'<.*?>') - return p.sub('', data) - - # Get Comics pages def _get_game_page_url(system,search): - comicvine_key = "a1aaa516eaf233abf29c8aefaa46dc39cc0f0873" comics_results = [] - search = urllib.quote(search.lower()) try: - url = get_url('http://www.google.com/cse?cx=017553361912933201960%3Ag3cbzpf3qis&q="'+search+'"&as_occt=title&nojs=1&num=100') - issues = re.findall('(.*?)', url) - for i in issues: + f = urllib.urlopen('http://www.comicvine.com/search/?indices[0]=cv_issue&q="'+urllib.quote(search.lower())+'"') + page = f.read().replace('\r\n', '').replace('\n', '').strip('\t') + issues = re.findall('/4000-(.*?)/">
(.*?)

(.*?)

(.*?) issue \((.*?)\)', page) + for issue in issues: comic = {} - comic_id = i[0].split('/') - issue_id = comic_id[-2].rsplit('-',1) - page_type = issue_id[0] - if ( issue_id[-1].isdigit()) and ( issue_id[0] == "37" ): - comic["url"] = i[0] - comics_results.append(comic) + comic["url"] = 'http://www.comicvine.com/issue/4000-'+issue[0]+'/' + comics_results.append(comic) return comics_results except: return comics_results - + # Thumbnails list scrapper def _get_thumbnails_list(system,search,region,imgsize): covers = [] @@ -51,9 +31,9 @@ def _get_thumbnails_list(system,search,region,imgsize): game_page = urllib.urlopen(str(comic["url"].encode('utf-8','ignore'))) if game_page: for line in game_page.readlines(): - if '[/img][/url]' in line: - result = ''.join(re.findall('\[img\](.*?)\[/img\]', line)) - covers.append((result,result.replace('_large','_thumb'),"Cover "+str(cover_number))) + if 'fluid-width' in line: + result = ''.join(re.findall('', line)) + covers.append((result,result,"Cover "+str(cover_number))) cover_number = cover_number + 1 return covers except: From 0c234599a8329552c1e0e92b2fa6003f2576c1de Mon Sep 17 00:00:00 2001 From: Angelscry Date: Sat, 11 May 2013 08:29:33 -0400 Subject: [PATCH 28/80] Fix AudioEngine --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 +++ resources/lib/launcher_plugin.py | 34 +++++++++++++++++++++----------- 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/addon.py b/addon.py index ae69f6c..bcb4a0f 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "http://sourceforge.net/projects/advlauncher/" __git_url__ = "http://sourceforge.net/p/advlauncher/git/?source=navbar" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.0.4" +__version__ = "2.0.5" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 325b96e..22d7845 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 6381aef..64f8012 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.0.5[/B] +. Fix AudioEngine hog (thanks to fritsch and Nortin). + [B]2.0.4[/B] . Fix ComicVine scraper. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index cb8396a..3e141bd 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -1534,12 +1534,15 @@ def _run_launcher(self, launcherID): if ( os.path.basename(launcher["application"]).lower().replace(".exe" , "") == "xbmc" ): xbmc.executebuiltin('XBMC.' + launcher["args"]) else: - if ( xbmc.Player().isPlaying() ): - if ( self.settings[ "media_state" ] == "0" ): - xbmc.executebuiltin('PlayerControl(Stop)') - if ( self.settings[ "media_state" ] == "1" ): - xbmc.executebuiltin('PlayerControl(Play)') - xbmc.sleep(2*self.settings[ "start_tempo" ]) + if ( self.settings[ "media_state" ] != "2" ): + if ( xbmc.Player().isPlaying() ): + if ( self.settings[ "media_state" ] == "0" ): + xbmc.executebuiltin('PlayerControl(Stop)') + if ( self.settings[ "media_state" ] == "1" ): + xbmc.executebuiltin('PlayerControl(Play)') + xbmc.sleep(2*self.settings[ "start_tempo" ]) + xbmc.audioSuspend() + xbmc.enableNavSounds(False) if (launcher["minimize"] == "true"): _toogle_fullscreen() if ( self.settings[ "launcher_notification" ] ): @@ -1576,9 +1579,12 @@ def _run_launcher(self, launcherID): xbmc.sleep(self.settings[ "start_tempo" ]) if (launcher["minimize"] == "true"): _toogle_fullscreen() - if ( self.settings[ "media_state" ] == "1" ): - xbmc.sleep(2*self.settings[ "start_tempo" ]) - xbmc.executebuiltin('PlayerControl(Play)') + if ( self.settings[ "media_state" ] != "2" ): + xbmc.audioResume() + xbmc.enableNavSounds(True) + if ( self.settings[ "media_state" ] == "1" ): + xbmc.sleep(2*self.settings[ "start_tempo" ]) + xbmc.executebuiltin('PlayerControl(Play)') def _get_settings( self ): # get the users preference settings @@ -1718,12 +1724,15 @@ def _run_rom(self, launcherID, romName): if ( os.path.basename(application).lower().replace(".exe" , "") == "xbmc" ): xbmc.executebuiltin('XBMC.' + arguments) else: + if ( self.settings[ "media_state" ] != "2" ): if ( xbmc.Player().isPlaying() ): if ( self.settings[ "media_state" ] == "0" ): xbmc.executebuiltin('PlayerControl(Stop)') if ( self.settings[ "media_state" ] == "1" ): xbmc.executebuiltin('PlayerControl(Play)') xbmc.sleep(2*self.settings[ "start_tempo" ]) + xbmc.audioSuspend() + xbmc.enableNavSounds(False) if (launcher["minimize"] == "true"): _toogle_fullscreen() if ( self.settings[ "launcher_notification" ] ): @@ -1757,7 +1766,7 @@ def _run_rom(self, launcherID, romName): startproc.wait() elif (sys.platform.startswith('linux')): if ( self.settings[ "lirc_state" ] ): - xbmc.executebuiltin('LIRC.stop') + xbmc.executebuiltin('LIRC.stop')z os.system("\"%s\" %s " % (application, arguments)) if ( self.settings[ "lirc_state" ] ): xbmc.executebuiltin('LIRC.start') @@ -1766,8 +1775,9 @@ def _run_rom(self, launcherID, romName): else: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30609 ))) xbmc.sleep(self.settings[ "start_tempo" ]) - if (launcher["minimize"] == "true"): - _toogle_fullscreen() + if ( self.settings[ "media_state" ] != "2" ): + xbmc.audioResume() + xbmc.enableNavSounds(True) if ( self.settings[ "media_state" ] == "1" ): xbmc.sleep(2*self.settings[ "start_tempo" ]) xbmc.executebuiltin('PlayerControl(Play)') From f07c81f1b6bd5c41c723dc209d51e6b94c59ad4f Mon Sep 17 00:00:00 2001 From: Angelscry Date: Sat, 11 May 2013 08:42:32 -0400 Subject: [PATCH 29/80] fix coding indentation/typing mistakes --- resources/lib/launcher_plugin.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 3e141bd..950a891 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -1724,15 +1724,15 @@ def _run_rom(self, launcherID, romName): if ( os.path.basename(application).lower().replace(".exe" , "") == "xbmc" ): xbmc.executebuiltin('XBMC.' + arguments) else: - if ( self.settings[ "media_state" ] != "2" ): - if ( xbmc.Player().isPlaying() ): - if ( self.settings[ "media_state" ] == "0" ): - xbmc.executebuiltin('PlayerControl(Stop)') - if ( self.settings[ "media_state" ] == "1" ): - xbmc.executebuiltin('PlayerControl(Play)') - xbmc.sleep(2*self.settings[ "start_tempo" ]) - xbmc.audioSuspend() - xbmc.enableNavSounds(False) + if ( self.settings[ "media_state" ] != "2" ): + if ( xbmc.Player().isPlaying() ): + if ( self.settings[ "media_state" ] == "0" ): + xbmc.executebuiltin('PlayerControl(Stop)') + if ( self.settings[ "media_state" ] == "1" ): + xbmc.executebuiltin('PlayerControl(Play)') + xbmc.sleep(2*self.settings[ "start_tempo" ]) + xbmc.audioSuspend() + xbmc.enableNavSounds(False) if (launcher["minimize"] == "true"): _toogle_fullscreen() if ( self.settings[ "launcher_notification" ] ): @@ -1766,7 +1766,7 @@ def _run_rom(self, launcherID, romName): startproc.wait() elif (sys.platform.startswith('linux')): if ( self.settings[ "lirc_state" ] ): - xbmc.executebuiltin('LIRC.stop')z + xbmc.executebuiltin('LIRC.stop') os.system("\"%s\" %s " % (application, arguments)) if ( self.settings[ "lirc_state" ] ): xbmc.executebuiltin('LIRC.start') @@ -1775,12 +1775,12 @@ def _run_rom(self, launcherID, romName): else: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30609 ))) xbmc.sleep(self.settings[ "start_tempo" ]) - if ( self.settings[ "media_state" ] != "2" ): - xbmc.audioResume() - xbmc.enableNavSounds(True) - if ( self.settings[ "media_state" ] == "1" ): - xbmc.sleep(2*self.settings[ "start_tempo" ]) - xbmc.executebuiltin('PlayerControl(Play)') + if ( self.settings[ "media_state" ] != "2" ): + xbmc.audioResume() + xbmc.enableNavSounds(True) + if ( self.settings[ "media_state" ] == "1" ): + xbmc.sleep(2*self.settings[ "start_tempo" ]) + xbmc.executebuiltin('PlayerControl(Play)') ''' get an xml data from an xml file ''' def get_xml_source( self, xmlpath ): From 09b1371f72fc866287616980a00fb3248a0f2f2a Mon Sep 17 00:00:00 2001 From: Angelscry Date: Mon, 13 May 2013 06:43:37 -0400 Subject: [PATCH 30/80] Fix audio sound loop when starting an application. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 +++ resources/lib/launcher_plugin.py | 32 ++++++++++++++++---------------- 4 files changed, 21 insertions(+), 18 deletions(-) diff --git a/addon.py b/addon.py index bcb4a0f..844651f 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "http://sourceforge.net/projects/advlauncher/" __git_url__ = "http://sourceforge.net/p/advlauncher/git/?source=navbar" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.0.5" +__version__ = "2.0.6" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 22d7845..3d6272b 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 64f8012..cc4541a 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.0.6[/B] +. Fix audio sound loop when starting an application. + [B]2.0.5[/B] . Fix AudioEngine hog (thanks to fritsch and Nortin). diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 950a891..7340304 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -1537,16 +1537,16 @@ def _run_launcher(self, launcherID): if ( self.settings[ "media_state" ] != "2" ): if ( xbmc.Player().isPlaying() ): if ( self.settings[ "media_state" ] == "0" ): - xbmc.executebuiltin('PlayerControl(Stop)') + xbmc.Player().stop() if ( self.settings[ "media_state" ] == "1" ): - xbmc.executebuiltin('PlayerControl(Play)') - xbmc.sleep(2*self.settings[ "start_tempo" ]) - xbmc.audioSuspend() - xbmc.enableNavSounds(False) + xbmc.Player().pause() + xbmc.sleep(self.settings[ "start_tempo" ]+100) + xbmc.audioSuspend() if (launcher["minimize"] == "true"): _toogle_fullscreen() if ( self.settings[ "launcher_notification" ] ): xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30034 ) % launcher["name"])) + xbmc.enableNavSounds(False) xbmc.sleep(self.settings[ "start_tempo" ]) if (os.environ.get( "OS", "xbox" ) == "xbox"): xbmc.executebuiltin('XBMC.Runxbe(' + launcher["application"] + ')') @@ -1579,12 +1579,12 @@ def _run_launcher(self, launcherID): xbmc.sleep(self.settings[ "start_tempo" ]) if (launcher["minimize"] == "true"): _toogle_fullscreen() + xbmc.enableNavSounds(True) if ( self.settings[ "media_state" ] != "2" ): xbmc.audioResume() - xbmc.enableNavSounds(True) if ( self.settings[ "media_state" ] == "1" ): - xbmc.sleep(2*self.settings[ "start_tempo" ]) - xbmc.executebuiltin('PlayerControl(Play)') + xbmc.sleep(self.settings[ "start_tempo" ]+100) + xbmc.Player().play() def _get_settings( self ): # get the users preference settings @@ -1727,16 +1727,16 @@ def _run_rom(self, launcherID, romName): if ( self.settings[ "media_state" ] != "2" ): if ( xbmc.Player().isPlaying() ): if ( self.settings[ "media_state" ] == "0" ): - xbmc.executebuiltin('PlayerControl(Stop)') + xbmc.Player().stop() if ( self.settings[ "media_state" ] == "1" ): - xbmc.executebuiltin('PlayerControl(Play)') - xbmc.sleep(2*self.settings[ "start_tempo" ]) - xbmc.audioSuspend() - xbmc.enableNavSounds(False) + xbmc.Player().pause() + xbmc.sleep(self.settings[ "start_tempo" ]+100) + xbmc.audioSuspend() if (launcher["minimize"] == "true"): _toogle_fullscreen() if ( self.settings[ "launcher_notification" ] ): xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30034 ) % rom["name"])) + xbmc.enableNavSounds(False) xbmc.sleep(self.settings[ "start_tempo" ]) if (os.environ.get( "OS", "xbox" ) == "xbox"): f=open(SHORTCUT_FILE, "wb") @@ -1775,12 +1775,12 @@ def _run_rom(self, launcherID, romName): else: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30609 ))) xbmc.sleep(self.settings[ "start_tempo" ]) + xbmc.enableNavSounds(True) if ( self.settings[ "media_state" ] != "2" ): xbmc.audioResume() - xbmc.enableNavSounds(True) if ( self.settings[ "media_state" ] == "1" ): - xbmc.sleep(2*self.settings[ "start_tempo" ]) - xbmc.executebuiltin('PlayerControl(Play)') + xbmc.sleep(self.settings[ "start_tempo" ]+100) + xbmc.Player().play() ''' get an xml data from an xml file ''' def get_xml_source( self, xmlpath ): From cf502f934504bbe413625891402e2cea00c5542a Mon Sep 17 00:00:00 2001 From: Angelscry Date: Fri, 17 May 2013 20:42:41 -0400 Subject: [PATCH 31/80] Fix change category display. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 +++ resources/language/English/strings.xml | 1 + resources/lib/launcher_plugin.py | 2 +- 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/addon.py b/addon.py index 844651f..55bd633 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "http://sourceforge.net/projects/advlauncher/" __git_url__ = "http://sourceforge.net/p/advlauncher/git/?source=navbar" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.0.6" +__version__ = "2.0.7" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 3d6272b..319b0ec 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index cc4541a..9800a23 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.0.7[/B] +. Fix change category display. + [B]2.0.6[/B] . Fix audio sound loop when starting an application. diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index ee2771b..89adef1 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -73,6 +73,7 @@ Create New Category New Category Name Category %s created + Select the category Import Mode Source diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 7340304..47e5b03 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -1260,7 +1260,7 @@ def _edit_launcher(self, launcherID): for key in self.categories: categories_id.append(self.categories[key]['id']) categories_name.append(self.categories[key]['name']) - selected_cat = dialog.select(__language__( 30077 ), categories_name) + selected_cat = dialog.select(__language__( 30114 ), categories_name) if (not selected_cat == -1 ): self.launchers[launcherID]["category"] = categories_id[selected_cat] self._save_launchers() From 93380521c54363f5e2578e68597bebd68b2b0a92 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Fri, 17 May 2013 22:56:36 -0400 Subject: [PATCH 32/80] Fix No fanart message display. --- changelog.txt | 1 + resources/lib/launcher_plugin.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/changelog.txt b/changelog.txt index 9800a23..074e5ed 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,4 +1,5 @@ [B]2.0.7[/B] +. Fix No fanart message display. . Fix change category display. [B]2.0.6[/B] diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 47e5b03..72e0951 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -689,7 +689,7 @@ def _scrap_thumb_category(self, categoryID): xbmc.executebuiltin("Container.Update") def _scrap_fanart_rom_algo(self, launcher, rom, title): - xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30071 ) % (self.launchers[launcher]["roms"][rom]["name"],(self.settings[ "fanarts_scraper" ]).encode('utf-8','ignore')))) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30071 ) % (self.launchers[launcher]["roms"][rom]["name"],self.settings[ "fanarts_scraper" ].encode('utf-8','ignore')))) full_fanarts = self._get_fanarts_list(self.launchers[launcher]["roms"][rom]["gamesys"],title,self.settings[ "fanart_image_size" ]) if full_fanarts: nb_images = len(full_fanarts) @@ -727,7 +727,7 @@ def _scrap_fanart_rom_algo(self, launcher, rom, title): else: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30073 ) % (self.launchers[launcher]["roms"][rom]["name"]))) else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30071 ) % (self.launchers[launcher]["roms"][rom]["name"]))) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30073 ) % (self.launchers[launcher]["roms"][rom]["name"]))) def _scrap_fanart_category_algo(self, categoryID, title): xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30071 ) % (self.categories[categoryID]["name"],(self.settings[ "fanarts_scraper" ]).encode('utf-8','ignore')))) From caed455067e8ee1f5ca2b3050ca6d163e795e5f1 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Sun, 19 May 2013 15:57:57 -0400 Subject: [PATCH 33/80] Add empty launcher display message. Add file/directory path not exist error messages. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 4 + resources/language/English/strings.xml | 29 +- resources/lib/launcher_plugin.py | 397 +++++++++++++------------ 5 files changed, 228 insertions(+), 206 deletions(-) diff --git a/addon.py b/addon.py index 55bd633..4da3553 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "http://sourceforge.net/projects/advlauncher/" __git_url__ = "http://sourceforge.net/p/advlauncher/git/?source=navbar" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.0.7" +__version__ = "2.0.8" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 319b0ec..359543b 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 074e5ed..6306311 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,7 @@ +[B]2.0.8[/B] +. Add empty launcher display message. +. Add file/directory path not exist error messages. + [B]2.0.7[/B] . Fix No fanart message display. . Fix change category display. diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 89adef1..5231495 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -202,6 +202,7 @@ Deleting "%s" will also delete related launchers. Alternative application : %s Alternative arguments : %s + Items list is empty : Add items first. Search items... By Title @@ -220,17 +221,19 @@ not found Search - Error: cannot create backup file. - Error: cannot create launchers.xml file. - Error: cannot access launchers.xml file. - Error: cannot write launchers.xml file. - Error: cannot download thumb image. - Error: cannot save thumb image. - Error: cannot download fanart image. - Error: cannot save fanart image. - Error: cannot update cached image. - Error: cannot start application. - Error: cannot list directory items. + Cannot create backup file. + Cannot create launchers.xml file. + Cannot access launchers.xml file. + Cannot write launchers.xml file. + Cannot download thumb image. + Cannot save thumb image. + Cannot download fanart image. + Cannot save fanart image. + Cannot update cached image. + Cannot start application. + Cannot list directory items. + File %s not found. + Error Initialisation Launcher %s selected @@ -274,4 +277,8 @@ Advanced Launcher root folder > Categories list %s category folder > Launcher list URL received : %s + application : %s + arguments : %s + plugin.program.advanced.launcher + Error: %s::%s (%d) - %s diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 72e0951..6488b0e 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -153,7 +153,6 @@ def __init__( self, *args, **kwargs ): if param: param = param[1:] command = param.split(COMMAND_ARGS_SEPARATOR) - print command command_part = command[0].replace("%2f","/").split("/") # check the action needed if ( len(command_part) == 4 ): @@ -1530,61 +1529,64 @@ def _run_launcher(self, launcherID): if (self.launchers.has_key(launcherID)): launcher = self.launchers[launcherID] apppath = os.path.dirname(launcher["application"]) - arguments = launcher["args"].replace("%apppath%" , apppath).replace("%APPPATH%" , apppath) - if ( os.path.basename(launcher["application"]).lower().replace(".exe" , "") == "xbmc" ): - xbmc.executebuiltin('XBMC.' + launcher["args"]) - else: - if ( self.settings[ "media_state" ] != "2" ): - if ( xbmc.Player().isPlaying() ): - if ( self.settings[ "media_state" ] == "0" ): - xbmc.Player().stop() - if ( self.settings[ "media_state" ] == "1" ): - xbmc.Player().pause() - xbmc.sleep(self.settings[ "start_tempo" ]+100) - xbmc.audioSuspend() - if (launcher["minimize"] == "true"): - _toogle_fullscreen() - if ( self.settings[ "launcher_notification" ] ): - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30034 ) % launcher["name"])) - xbmc.enableNavSounds(False) - xbmc.sleep(self.settings[ "start_tempo" ]) - if (os.environ.get( "OS", "xbox" ) == "xbox"): - xbmc.executebuiltin('XBMC.Runxbe(' + launcher["application"] + ')') + if ( os.path.exists(apppath) ) : + arguments = launcher["args"].replace("%apppath%" , apppath).replace("%APPPATH%" , apppath) + if ( os.path.basename(launcher["application"]).lower().replace(".exe" , "") == "xbmc" ): + xbmc.executebuiltin('XBMC.' + launcher["args"]) else: - if (sys.platform == 'win32'): - if ( launcher["application"].split(".")[-1] == "lnk" ): - os.system("start \"\" \"%s\"" % (launcher["application"])) - else: - if ( launcher["application"].split(".")[-1] == "bat" ): - info = subprocess_hack.STARTUPINFO() - info.dwFlags = 1 - if ( self.settings[ "show_batch" ] ): - info.wShowWindow = 5 - else: - info.wShowWindow = 0 - else: - info = None - startproc = subprocess_hack.Popen(r'%s %s' % (launcher["application"], arguments), cwd=apppath, startupinfo=info) - startproc.wait() - elif (sys.platform.startswith('linux')): - if ( self.settings[ "lirc_state" ] ): - xbmc.executebuiltin('LIRC.stop') - os.system("\"%s\" %s " % (launcher["application"], arguments)) - if ( self.settings[ "lirc_state" ] ): - xbmc.executebuiltin('LIRC.start') - elif (sys.platform.startswith('darwin')): - os.system("\"%s\" %s " % (launcher["application"], arguments)) + if ( self.settings[ "media_state" ] != "2" ): + if ( xbmc.Player().isPlaying() ): + if ( self.settings[ "media_state" ] == "0" ): + xbmc.Player().stop() + if ( self.settings[ "media_state" ] == "1" ): + xbmc.Player().pause() + xbmc.sleep(self.settings[ "start_tempo" ]+100) + xbmc.audioSuspend() + if (launcher["minimize"] == "true"): + _toogle_fullscreen() + if ( self.settings[ "launcher_notification" ] ): + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30034 ) % launcher["name"])) + xbmc.enableNavSounds(False) + xbmc.sleep(self.settings[ "start_tempo" ]) + if (os.environ.get( "OS", "xbox" ) == "xbox"): + xbmc.executebuiltin('XBMC.Runxbe(' + launcher["application"] + ')') else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30609 ))) - xbmc.sleep(self.settings[ "start_tempo" ]) - if (launcher["minimize"] == "true"): - _toogle_fullscreen() - xbmc.enableNavSounds(True) - if ( self.settings[ "media_state" ] != "2" ): - xbmc.audioResume() - if ( self.settings[ "media_state" ] == "1" ): - xbmc.sleep(self.settings[ "start_tempo" ]+100) - xbmc.Player().play() + if (sys.platform == 'win32'): + if ( launcher["application"].split(".")[-1] == "lnk" ): + os.system("start \"\" \"%s\"" % (launcher["application"])) + else: + if ( launcher["application"].split(".")[-1] == "bat" ): + info = subprocess_hack.STARTUPINFO() + info.dwFlags = 1 + if ( self.settings[ "show_batch" ] ): + info.wShowWindow = 5 + else: + info.wShowWindow = 0 + else: + info = None + startproc = subprocess_hack.Popen(r'%s %s' % (launcher["application"], arguments), cwd=apppath, startupinfo=info) + startproc.wait() + elif (sys.platform.startswith('linux')): + if ( self.settings[ "lirc_state" ] ): + xbmc.executebuiltin('LIRC.stop') + os.system("\"%s\" %s " % (launcher["application"], arguments)) + if ( self.settings[ "lirc_state" ] ): + xbmc.executebuiltin('LIRC.start') + elif (sys.platform.startswith('darwin')): + os.system("\"%s\" %s " % (launcher["application"], arguments)) + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30609 ))) + xbmc.sleep(self.settings[ "start_tempo" ]) + if (launcher["minimize"] == "true"): + _toogle_fullscreen() + xbmc.enableNavSounds(True) + if ( self.settings[ "media_state" ] != "2" ): + xbmc.audioResume() + if ( self.settings[ "media_state" ] == "1" ): + xbmc.sleep(self.settings[ "start_tempo" ]+100) + xbmc.Player().play() + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30611 ) % os.path.basename(launcher["application"]))) def _get_settings( self ): # get the users preference settings @@ -1629,7 +1631,7 @@ def _get_settings( self ): def _print_log(self,string): if (self.settings[ "show_log" ]): - print "[ALA] "+string + print "["+__language__( 30744 )+"] "+string def _get_scrapers( self ): # get the users gamedata scrapers preference @@ -1661,126 +1663,132 @@ def _run_rom(self, launcherID, romName): apppath = os.path.dirname(application) rompath = os.path.dirname(rom["filename"]) romname = os.path.splitext(romfile)[0] + + if ( os.path.exists(apppath) ) : + if ( os.path.exists(rompath) ) : + files = [] + filesnames = [] + ext3s = ['.cd1', '-cd1', '_cd1', ' cd1'] + for ext3 in ext3s: + cleanromname = re.sub('(\[.*?\]|\{.*?\}|\(.*?\))', '', romname) + if ( cleanromname.lower().find(ext3) > -1 ): + temprompath = os.path.dirname(rom["filename"]) + try: + filesnames = os.listdir(temprompath) + except: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30610 ))) + namestem = cleanromname[:-len(ext3)] + + for filesname in filesnames: + altname=re.findall('\{.*?\}',filesname) + searchname = re.sub('(\[.*?\]|\{.*?\}|\(.*?\))', '', filesname) + if searchname[0:len(namestem)] == namestem and searchname[len(namestem):len(namestem)+len(ext3) - 1] == ext3[:-1]: + for romext in launcher["romext"].split("|"): + if searchname[-len(romext):].lower() == romext.lower() : + Discnum = searchname[(len(namestem)+len(ext3)-1):searchname.rfind(".")] + try: + int(Discnum) + if not altname: + files.append([Discnum, xbmc.getLocalizedString(427)+" "+Discnum, os.path.join(os.path.dirname(rom["filename"]),filesname)]) + else: + files.append([Discnum, altname[0][1:-1], os.path.join(os.path.dirname(rom["filename"]),filesname)]) + except: + pass + if len(files) > 0: + files.sort(key=lambda x: int(x[0])) + discs = [] + for file in files: + discs.append(file[1]) + dialog = xbmcgui.Dialog() + type3 = dialog.select("%s:" % __language__( 30035 ), discs) + if type3 > -1 : + myresult = files[type3] + rom["filename"] = myresult[2] + romfile = os.path.basename(rom["filename"]) + rompath = os.path.dirname(rom["filename"]) + romname = os.path.splitext(romfile)[0] + else: + return "" - files = [] - filesnames = [] - ext3s = ['.cd1', '-cd1', '_cd1', ' cd1'] - for ext3 in ext3s: - cleanromname = re.sub('(\[.*?\]|\{.*?\}|\(.*?\))', '', romname) - if ( cleanromname.lower().find(ext3) > -1 ): - temprompath = os.path.dirname(rom["filename"]) - try: - filesnames = os.listdir(temprompath) - except: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30610 ))) - namestem = cleanromname[:-len(ext3)] - - for filesname in filesnames: - altname=re.findall('\{.*?\}',filesname) - searchname = re.sub('(\[.*?\]|\{.*?\}|\(.*?\))', '', filesname) - if searchname[0:len(namestem)] == namestem and searchname[len(namestem):len(namestem)+len(ext3) - 1] == ext3[:-1]: - for romext in launcher["romext"].split("|"): - if searchname[-len(romext):].lower() == romext.lower() : - Discnum = searchname[(len(namestem)+len(ext3)-1):searchname.rfind(".")] - try: - int(Discnum) - if not altname: - files.append([Discnum, xbmc.getLocalizedString(427)+" "+Discnum, os.path.join(os.path.dirname(rom["filename"]),filesname)]) - else: - files.append([Discnum, altname[0][1:-1], os.path.join(os.path.dirname(rom["filename"]),filesname)]) - except: - pass - if len(files) > 0: - files.sort(key=lambda x: int(x[0])) - discs = [] - for file in files: - discs.append(file[1]) - dialog = xbmcgui.Dialog() - type3 = dialog.select("%s:" % __language__( 30035 ), discs) - if type3 > -1 : - myresult = files[type3] - rom["filename"] = myresult[2] - romfile = os.path.basename(rom["filename"]) - rompath = os.path.dirname(rom["filename"]) - romname = os.path.splitext(romfile)[0] - else: - return "" - - if ( rom["altarg"] != "" ): - arguments = rom["altarg"] - else: - arguments = launcher["args"] - arguments = arguments.replace("%rom%" , rom["filename"]).replace("%ROM%" , rom["filename"]) - arguments = arguments.replace("%romfile%" , romfile).replace("%ROMFILE%" , romfile) - arguments = arguments.replace("%romname%" , romname).replace("%ROMNAME%" , romname) - arguments = arguments.replace("%rombasename%" , base_filename(romname)).replace("%ROMBASENAME%" , base_filename(romname)) - arguments = arguments.replace("%apppath%" , apppath).replace("%APPPATH%" , apppath) - arguments = arguments.replace("%rompath%" , rompath).replace("%ROMPATH%" , rompath) - arguments = arguments.replace("%romtitle%" , rom["name"]).replace("%ROMTITLE%" , rom["name"]) - arguments = arguments.replace("%romspath%" , launcher["rompath"]).replace("%ROMSPATH%" , launcher["rompath"]) - - print "ALA : application" + application - print "ALA : arguments" + arguments - if ( os.path.basename(application).lower().replace(".exe" , "") == "xbmc" ): - xbmc.executebuiltin('XBMC.' + arguments) - else: - if ( self.settings[ "media_state" ] != "2" ): - if ( xbmc.Player().isPlaying() ): - if ( self.settings[ "media_state" ] == "0" ): - xbmc.Player().stop() - if ( self.settings[ "media_state" ] == "1" ): - xbmc.Player().pause() - xbmc.sleep(self.settings[ "start_tempo" ]+100) - xbmc.audioSuspend() - if (launcher["minimize"] == "true"): - _toogle_fullscreen() - if ( self.settings[ "launcher_notification" ] ): - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30034 ) % rom["name"])) - xbmc.enableNavSounds(False) - xbmc.sleep(self.settings[ "start_tempo" ]) - if (os.environ.get( "OS", "xbox" ) == "xbox"): - f=open(SHORTCUT_FILE, "wb") - f.write("\n") - f.write(" " + 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["lnk"] == "true" ) and ( launcher["romext"] == "lnk" ): - os.system("start \"\" \"%s\"" % (arguments)) + if ( rom["altarg"] != "" ): + arguments = rom["altarg"] + else: + arguments = launcher["args"] + arguments = arguments.replace("%rom%" , rom["filename"]).replace("%ROM%" , rom["filename"]) + arguments = arguments.replace("%romfile%" , romfile).replace("%ROMFILE%" , romfile) + arguments = arguments.replace("%romname%" , romname).replace("%ROMNAME%" , romname) + arguments = arguments.replace("%rombasename%" , base_filename(romname)).replace("%ROMBASENAME%" , base_filename(romname)) + arguments = arguments.replace("%apppath%" , apppath).replace("%APPPATH%" , apppath) + arguments = arguments.replace("%rompath%" , rompath).replace("%ROMPATH%" , rompath) + arguments = arguments.replace("%romtitle%" , rom["name"]).replace("%ROMTITLE%" , rom["name"]) + arguments = arguments.replace("%romspath%" , launcher["rompath"]).replace("%ROMSPATH%" , launcher["rompath"]) + + self._print_log(__language__( 30742 ) % application) + self._print_log(__language__( 30743 ) % arguments) + if ( os.path.basename(application).lower().replace(".exe" , "") == "xbmc" ): + xbmc.executebuiltin('XBMC.' + arguments) + else: + if ( self.settings[ "media_state" ] != "2" ): + if ( xbmc.Player().isPlaying() ): + if ( self.settings[ "media_state" ] == "0" ): + xbmc.Player().stop() + if ( self.settings[ "media_state" ] == "1" ): + xbmc.Player().pause() + xbmc.sleep(self.settings[ "start_tempo" ]+100) + xbmc.audioSuspend() + if (launcher["minimize"] == "true"): + _toogle_fullscreen() + if ( self.settings[ "launcher_notification" ] ): + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30034 ) % rom["name"])) + xbmc.enableNavSounds(False) + xbmc.sleep(self.settings[ "start_tempo" ]) + if (os.environ.get( "OS", "xbox" ) == "xbox"): + f=open(SHORTCUT_FILE, "wb") + f.write("\n") + f.write(" " + 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 ( application.split(".")[-1] == "bat" ): - info = subprocess_hack.STARTUPINFO() - info.dwFlags = 1 - if ( self.settings[ "show_batch" ] ): - info.wShowWindow = 5 + if (sys.platform == 'win32'): + if ( launcher["lnk"] == "true" ) and ( launcher["romext"] == "lnk" ): + os.system("start \"\" \"%s\"" % (arguments)) else: - info.wShowWindow = 0 + if ( application.split(".")[-1] == "bat" ): + info = subprocess_hack.STARTUPINFO() + info.dwFlags = 1 + if ( self.settings[ "show_batch" ] ): + info.wShowWindow = 5 + else: + info.wShowWindow = 0 + else: + info = None + startproc = subprocess_hack.Popen(r'%s %s' % (application, arguments), cwd=apppath, startupinfo=info) + startproc.wait() + elif (sys.platform.startswith('linux')): + if ( self.settings[ "lirc_state" ] ): + xbmc.executebuiltin('LIRC.stop') + os.system("\"%s\" %s " % (application, arguments)) + if ( self.settings[ "lirc_state" ] ): + xbmc.executebuiltin('LIRC.start') + elif (sys.platform.startswith('darwin')): + os.system("\"%s\" %s " % (application, arguments)) else: - info = None - startproc = subprocess_hack.Popen(r'%s %s' % (application, arguments), cwd=apppath, startupinfo=info) - startproc.wait() - elif (sys.platform.startswith('linux')): - if ( self.settings[ "lirc_state" ] ): - xbmc.executebuiltin('LIRC.stop') - os.system("\"%s\" %s " % (application, arguments)) - if ( self.settings[ "lirc_state" ] ): - xbmc.executebuiltin('LIRC.start') - elif (sys.platform.startswith('darwin')): - os.system("\"%s\" %s " % (application, arguments)) - else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30609 ))) - xbmc.sleep(self.settings[ "start_tempo" ]) - xbmc.enableNavSounds(True) - if ( self.settings[ "media_state" ] != "2" ): - xbmc.audioResume() - if ( self.settings[ "media_state" ] == "1" ): - xbmc.sleep(self.settings[ "start_tempo" ]+100) - xbmc.Player().play() + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30609 ))) + xbmc.sleep(self.settings[ "start_tempo" ]) + xbmc.enableNavSounds(True) + if ( self.settings[ "media_state" ] != "2" ): + xbmc.audioResume() + if ( self.settings[ "media_state" ] == "1" ): + xbmc.sleep(self.settings[ "start_tempo" ]+100) + xbmc.Player().play() + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30611 ) % os.path.basename(rom["filename"]))) + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30611 ) % os.path.basename(launcher["application"]))) ''' get an xml data from an xml file ''' def get_xml_source( self, xmlpath ): @@ -1792,8 +1800,6 @@ def get_xml_source( self, xmlpath ): 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 ): # clean, save and return the xml string @@ -1808,6 +1814,12 @@ def get_xml_source( self, xmlpath ): def _save_launchers (self): xbmc.executebuiltin( "ActivateWindow(busydialog)" ) + print len(self.categories) + print len(self.launchers) + #self.categories.pop() + #self.launchers.pop() + print len(self.categories) + print len(self.launchers) # make settings directory if doesn't exists if (not os.path.isdir(os.path.dirname(TEMP_CURRENT_SOURCE_PATH))): os.makedirs(os.path.dirname(TEMP_CURRENT_SOURCE_PATH)) @@ -1829,7 +1841,7 @@ def _save_launchers (self): BACKUP_CURRENT_SOURCE_PATH = os.path.join( DEFAULT_BACKUP_PATH , timestamp+"launchers.xml" ) shutil.copy2(BASE_CURRENT_SOURCE_PATH, BACKUP_CURRENT_SOURCE_PATH) except OSError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30600 ))) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30600 ))) try: usock = open( TEMP_CURRENT_SOURCE_PATH, 'w' ) usock.write("\n") @@ -1899,11 +1911,11 @@ def _save_launchers (self): try: shutil.copy2(TEMP_CURRENT_SOURCE_PATH, BASE_CURRENT_SOURCE_PATH) except OSError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30601 ))) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30601 ))) except OSError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30602 ))) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30602 ))) except IOError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30603 ))) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30603 ))) os.remove(TEMP_CURRENT_SOURCE_PATH) xbmc.executebuiltin( "Dialog.Close(busydialog)" ) @@ -2140,7 +2152,6 @@ def _load_launchers(self, xmlSource): def _get_categories( self ): for key in sorted(self.categories, key= lambda x : self.categories[x]["name"]): - print self.categories[key]['id'] if ( not self.settings[ "hide_default_cat" ] or self.categories[key]['id'] != "default" ): self._add_category(self.categories[key]["name"], self.categories[key]["thumb"], self.categories[key]["fanart"], self.categories[key]["genre"], self.categories[key]["plot"], len(self.categories), key) xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) @@ -2152,17 +2163,19 @@ def _get_launchers( self, categoryID ): xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) def _get_roms( self, launcherID ): - print launcherID if (self.launchers.has_key(launcherID)): selectedLauncher = self.launchers[launcherID] roms = selectedLauncher["roms"] - for key in sorted(roms, key= lambda x : roms[x]["filename"]): - if (roms[key]["fanart"] ==""): - defined_fanart = selectedLauncher["fanart"] - else: - defined_fanart = roms[key]["fanart"] - self._add_rom(launcherID, roms[key]["name"], roms[key]["filename"], roms[key]["gamesys"], roms[key]["thumb"], defined_fanart, roms[key]["trailer"], roms[key]["custom"], roms[key]["genre"], roms[key]["release"], roms[key]["studio"], roms[key]["plot"], roms[key]["finished"], roms[key]["altapp"], roms[key]["altarg"], len(roms), key) - xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) + if ( len(roms) != 0 ): + for key in sorted(roms, key= lambda x : roms[x]["filename"]): + if (roms[key]["fanart"] ==""): + defined_fanart = selectedLauncher["fanart"] + else: + defined_fanart = roms[key]["fanart"] + self._add_rom(launcherID, roms[key]["name"], roms[key]["filename"], roms[key]["gamesys"], roms[key]["thumb"], defined_fanart, roms[key]["trailer"], roms[key]["custom"], roms[key]["genre"], roms[key]["release"], roms[key]["studio"], roms[key]["plot"], roms[key]["finished"], roms[key]["altapp"], roms[key]["altarg"], len(roms), key) + xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30349 ))) def _report_hook( self, count, blocksize, totalsize ): percent = int( float( count * blocksize * 100) / totalsize ) @@ -2461,9 +2474,9 @@ def _import_roms(self, launcherID, addRoms = False): h = urllib.urlretrieve(img_url,thumb) shutil.copy2( thumb.decode(sys.getfilesystemencoding(),'ignore') , cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) except socket.timeout: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30604 ))) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30604 ))) except exceptions.IOError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30654 ))) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30605 ))) else: if ( not os.path.isfile(thumb) ) & ( os.path.isfile(cached_thumb) ): os.remove(cached_thumb) @@ -2516,9 +2529,9 @@ def _import_roms(self, launcherID, addRoms = False): h = urllib.urlretrieve(img_url,fanart) shutil.copy2( fanart.decode(sys.getfilesystemencoding(),'ignore') , cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) except socket.timeout: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30606 ))) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30606 ))) except exceptions.IOError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30607 ))) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30607 ))) else: if ( not os.path.isfile(fanart) ) & ( os.path.isfile(cached_thumb) ): os.remove(cached_thumb) @@ -2979,8 +2992,6 @@ def _find_studio_add_roms( self, search ): _find_category_roms( self, search, "studio" ) def _find_genre_add_roms( self, search ): - print self - print search _find_category_roms( self, search, "genre" ) class MainGui( xbmcgui.WindowXMLDialog ): @@ -3041,7 +3052,7 @@ def _update_cache(file_path): try: shutil.copy2( file_path.decode(sys.getfilesystemencoding(),'ignore') , cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) except OSError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30608 ))) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30608 ))) xbmc.executebuiltin("XBMC.ReloadSkin()") def title_format(self,title): From 4ac151f25e6b2d6111504b6f1572c94b60ec8482 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Wed, 22 May 2013 21:17:10 -0400 Subject: [PATCH 34/80] Fix non-existing category bug. --- changelog.txt | 1 + resources/language/English/strings.xml | 1 + resources/lib/launcher_plugin.py | 300 +++++++++++++------------ 3 files changed, 154 insertions(+), 148 deletions(-) diff --git a/changelog.txt b/changelog.txt index 6306311..4b3ef0e 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,4 +1,5 @@ [B]2.0.8[/B] +. Fix non-existing category bug. . Add empty launcher display message. . Add file/directory path not exist error messages. diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 5231495..c38afbd 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -234,6 +234,7 @@ Cannot list directory items. File %s not found. Error + Target category not found. Initialisation Launcher %s selected diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 6488b0e..b77f399 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -2767,161 +2767,165 @@ def _add_new_category ( self ) : def _add_new_launcher ( self, categoryID ) : - dialog = xbmcgui.Dialog() - type = dialog.select(__language__( 30101 ), [__language__( 30021 ), __language__( 30022 ),__language__( 30051 )]) - if (os.environ.get( "OS", "xbox" ) == "xbox"): - filter = ".xbe|.cut" - else: - if (sys.platform == "win32"): - filter = ".bat|.exe|.cmd|.lnk" + if ( self.categories.has_key(categoryID) ): + dialog = xbmcgui.Dialog() + type = dialog.select(__language__( 30101 ), [__language__( 30021 ), __language__( 30022 ),__language__( 30051 )]) + if (os.environ.get( "OS", "xbox" ) == "xbox"): + filter = ".xbe|.cut" else: - filter = "" - - if (type == 0): - app = xbmcgui.Dialog().browse(1,__language__( 30023 ),"files",filter) - if (app): - argument = self._get_program_arguments(os.path.basename(app)) - argkeyboard = xbmc.Keyboard(argument, __language__( 30024 )) - argkeyboard.doModal() - args = argkeyboard.getText() - title = os.path.basename(app) - keyboard = xbmc.Keyboard(title.replace('.'+title.split('.')[-1],'').replace('.',' '), __language__( 30025 )) - keyboard.doModal() - title = keyboard.getText() - if ( title == "" ): - title = os.path.basename(app) - title = title.replace('.'+title.split('.')[-1],'').replace('.',' ') - # Selection of the launcher game system - dialog = xbmcgui.Dialog() - platforms = _get_game_system_list() - gamesystem = dialog.select(__language__( 30077 ), platforms) - # Selection of the thumbnails and fanarts path - if ( self.settings[ "launcher_thumb_path" ] == "" ): - thumb_path = xbmcgui.Dialog().browse(0,__language__( 30059 ),"files","", False, False) - else: - thumb_path = self.settings[ "launcher_thumb_path" ] - if ( self.settings[ "launcher_fanart_path" ] == "" ): - fanart_path = xbmcgui.Dialog().browse(0,__language__( 30060 ),"files","", False, False) - else: - fanart_path = self.settings[ "launcher_fanart_path" ] - # prepare launcher object data - launcherdata = {} - launcherdata["name"] = title - launcherdata["category"] = categoryID - launcherdata["application"] = app - launcherdata["args"] = args - launcherdata["rompath"] = "" - if (thumb_path): - launcherdata["thumbpath"] = thumb_path - else: - launcherdata["thumbpath"] = "" - if (fanart_path): - launcherdata["fanartpath"] = fanart_path - else: - launcherdata["fanartpath"] = "" - launcherdata["custompath"] = "" - launcherdata["trailerpath"] = "" - launcherdata["romext"] = "" - if (not gamesystem == -1 ): - launcherdata["gamesys"] = platforms[gamesystem] - else: - launcherdata["gamesys"] = "" - launcherdata["thumb"] = "" - launcherdata["fanart"] = "" - launcherdata["genre"] = "" - launcherdata["release"] = "" - launcherdata["studio"] = "" - launcherdata["plot"] = "" - launcherdata["finished"] = "false" if (sys.platform == "win32"): - launcherdata["lnk"] = "true" + filter = ".bat|.exe|.cmd|.lnk" else: - launcherdata["lnk"] = "" - launcherdata["minimize"] = "false" - launcherdata["roms"] = {} - - # add launcher to the launchers list (using name as index) - launcherid = _get_SID() - self.launchers[launcherid] = launcherdata - self._save_launchers() + filter = "" - xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s)" % (self._path,categoryID)) - return True - - if (type == 1): - app = xbmcgui.Dialog().browse(1,__language__( 30023 ),"files",filter) - if (app): - path = xbmcgui.Dialog().browse(0,__language__( 30058 ),"files", "", False, False) - if (path): - extensions = self._get_program_extensions(os.path.basename(app)) - extkey = xbmc.Keyboard(extensions, __language__( 30028 )) - extkey.doModal() - if (extkey.isConfirmed()): - ext = extkey.getText() - argument = self._get_program_arguments(os.path.basename(app)) - argkeyboard = xbmc.Keyboard(argument, __language__( 30024 )) - argkeyboard.doModal() - args = argkeyboard.getText() + if (type == 0): + app = xbmcgui.Dialog().browse(1,__language__( 30023 ),"files",filter) + if (app): + argument = self._get_program_arguments(os.path.basename(app)) + argkeyboard = xbmc.Keyboard(argument, __language__( 30024 )) + argkeyboard.doModal() + args = argkeyboard.getText() + title = os.path.basename(app) + keyboard = xbmc.Keyboard(title.replace('.'+title.split('.')[-1],'').replace('.',' '), __language__( 30025 )) + keyboard.doModal() + title = keyboard.getText() + if ( title == "" ): title = os.path.basename(app) - keyboard = xbmc.Keyboard(title.replace('.'+title.split('.')[-1],'').replace('.',' '), __language__( 30025 )) - keyboard.doModal() - title = keyboard.getText() - if ( title == "" ): - title = os.path.basename(app) - title = title.replace('.'+title.split('.')[-1],'').replace('.',' ') - # Selection of the launcher game system - dialog = xbmcgui.Dialog() - platforms = _get_game_system_list() - gamesystem = dialog.select(__language__( 30077 ), platforms) - # Selection of the thumbnails and fanarts path - thumb_path = xbmcgui.Dialog().browse(0,__language__( 30059 ),"files","", False, False, os.path.join(path)) - fanart_path = xbmcgui.Dialog().browse(0,__language__( 30060 ),"files","", False, False, os.path.join(path)) - # prepare launcher object data - launcherdata = {} - launcherdata["name"] = title - launcherdata["category"] = categoryID - launcherdata["application"] = app - launcherdata["args"] = args - launcherdata["rompath"] = path - if (thumb_path): - launcherdata["thumbpath"] = thumb_path - else: - launcherdata["thumbpath"] = "" - if (fanart_path): - launcherdata["fanartpath"] = fanart_path - else: - launcherdata["fanartpath"] = "" - launcherdata["custompath"] = "" - launcherdata["trailerpath"] = "" - launcherdata["romext"] = ext - if (not gamesystem == -1 ): - launcherdata["gamesys"] = platforms[gamesystem] - else: - launcherdata["gamesys"] = "" - launcherdata["thumb"] = "" - launcherdata["fanart"] = "" - launcherdata["genre"] = "" - launcherdata["release"] = "" - launcherdata["studio"] = "" - launcherdata["plot"] = "" - launcherdata["finished"] = "false" - if (sys.platform == "win32"): - launcherdata["lnk"] = "true" - else: - launcherdata["lnk"] = "" - launcherdata["minimize"] = "false" - launcherdata["roms"] = {} + title = title.replace('.'+title.split('.')[-1],'').replace('.',' ') + # Selection of the launcher game system + dialog = xbmcgui.Dialog() + platforms = _get_game_system_list() + gamesystem = dialog.select(__language__( 30077 ), platforms) + # Selection of the thumbnails and fanarts path + if ( self.settings[ "launcher_thumb_path" ] == "" ): + thumb_path = xbmcgui.Dialog().browse(0,__language__( 30059 ),"files","", False, False) + else: + thumb_path = self.settings[ "launcher_thumb_path" ] + if ( self.settings[ "launcher_fanart_path" ] == "" ): + fanart_path = xbmcgui.Dialog().browse(0,__language__( 30060 ),"files","", False, False) + else: + fanart_path = self.settings[ "launcher_fanart_path" ] + # prepare launcher object data + launcherdata = {} + launcherdata["name"] = title + launcherdata["category"] = categoryID + launcherdata["application"] = app + launcherdata["args"] = args + launcherdata["rompath"] = "" + if (thumb_path): + launcherdata["thumbpath"] = thumb_path + else: + launcherdata["thumbpath"] = "" + if (fanart_path): + launcherdata["fanartpath"] = fanart_path + else: + launcherdata["fanartpath"] = "" + launcherdata["custompath"] = "" + launcherdata["trailerpath"] = "" + launcherdata["romext"] = "" + if (not gamesystem == -1 ): + launcherdata["gamesys"] = platforms[gamesystem] + else: + launcherdata["gamesys"] = "" + launcherdata["thumb"] = "" + launcherdata["fanart"] = "" + launcherdata["genre"] = "" + launcherdata["release"] = "" + launcherdata["studio"] = "" + launcherdata["plot"] = "" + launcherdata["finished"] = "false" + if (sys.platform == "win32"): + launcherdata["lnk"] = "true" + else: + launcherdata["lnk"] = "" + launcherdata["minimize"] = "false" + launcherdata["roms"] = {} - # add launcher to the launchers list (using name as index) - launcherid = _get_SID() - self.launchers[launcherid] = launcherdata - self._save_launchers() - xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s)" % (self._path,categoryID)) - return True - if (type == 2): - self._file_manager() + # add launcher to the launchers list (using name as index) + launcherid = _get_SID() + self.launchers[launcherid] = launcherdata + self._save_launchers() - return False + xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s)" % (self._path,categoryID)) + return True + + if (type == 1): + app = xbmcgui.Dialog().browse(1,__language__( 30023 ),"files",filter) + if (app): + path = xbmcgui.Dialog().browse(0,__language__( 30058 ),"files", "", False, False) + if (path): + extensions = self._get_program_extensions(os.path.basename(app)) + extkey = xbmc.Keyboard(extensions, __language__( 30028 )) + extkey.doModal() + if (extkey.isConfirmed()): + ext = extkey.getText() + argument = self._get_program_arguments(os.path.basename(app)) + argkeyboard = xbmc.Keyboard(argument, __language__( 30024 )) + argkeyboard.doModal() + args = argkeyboard.getText() + title = os.path.basename(app) + keyboard = xbmc.Keyboard(title.replace('.'+title.split('.')[-1],'').replace('.',' '), __language__( 30025 )) + keyboard.doModal() + title = keyboard.getText() + if ( title == "" ): + title = os.path.basename(app) + title = title.replace('.'+title.split('.')[-1],'').replace('.',' ') + # Selection of the launcher game system + dialog = xbmcgui.Dialog() + platforms = _get_game_system_list() + gamesystem = dialog.select(__language__( 30077 ), platforms) + # Selection of the thumbnails and fanarts path + thumb_path = xbmcgui.Dialog().browse(0,__language__( 30059 ),"files","", False, False, os.path.join(path)) + fanart_path = xbmcgui.Dialog().browse(0,__language__( 30060 ),"files","", False, False, os.path.join(path)) + # prepare launcher object data + launcherdata = {} + launcherdata["name"] = title + launcherdata["category"] = categoryID + launcherdata["application"] = app + launcherdata["args"] = args + launcherdata["rompath"] = path + if (thumb_path): + launcherdata["thumbpath"] = thumb_path + else: + launcherdata["thumbpath"] = "" + if (fanart_path): + launcherdata["fanartpath"] = fanart_path + else: + launcherdata["fanartpath"] = "" + launcherdata["custompath"] = "" + launcherdata["trailerpath"] = "" + launcherdata["romext"] = ext + if (not gamesystem == -1 ): + launcherdata["gamesys"] = platforms[gamesystem] + else: + launcherdata["gamesys"] = "" + launcherdata["thumb"] = "" + launcherdata["fanart"] = "" + launcherdata["genre"] = "" + launcherdata["release"] = "" + launcherdata["studio"] = "" + launcherdata["plot"] = "" + launcherdata["finished"] = "false" + if (sys.platform == "win32"): + launcherdata["lnk"] = "true" + else: + launcherdata["lnk"] = "" + launcherdata["minimize"] = "false" + launcherdata["roms"] = {} + + # add launcher to the launchers list (using name as index) + launcherid = _get_SID() + self.launchers[launcherid] = launcherdata + self._save_launchers() + xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s)" % (self._path,categoryID)) + return True + if (type == 2): + self._file_manager() + else: + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30613 ))) + xbmc.executebuiltin("ReplaceWindow(Programs,%s)" % (self._path)) + return False + def _file_manager( self ): xbmc.executebuiltin("ActivateWindow(filemanager)") From b8568f9796de6c138f897225e83381be48d9b5b5 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Fri, 24 May 2013 21:13:14 -0400 Subject: [PATCH 35/80] Restore post-Frodo XBMC versions compatibility. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 +++ resources/lib/launcher_plugin.py | 20 ++++++++++++++++---- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/addon.py b/addon.py index 4da3553..1249bba 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "http://sourceforge.net/projects/advlauncher/" __git_url__ = "http://sourceforge.net/p/advlauncher/git/?source=navbar" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.0.8" +__version__ = "2.0.9" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 359543b..afac57b 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 4b3ef0e..0b6c182 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.0.9[/B] +. Restore post-Frodo XBMC versions compatibility. + [B]2.0.8[/B] . Fix non-existing category bug. . Add empty launcher display message. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index b77f399..05b8f41 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -1541,7 +1541,10 @@ def _run_launcher(self, launcherID): if ( self.settings[ "media_state" ] == "1" ): xbmc.Player().pause() xbmc.sleep(self.settings[ "start_tempo" ]+100) - xbmc.audioSuspend() + try: + xbmc.audioSuspend() + except: + pass if (launcher["minimize"] == "true"): _toogle_fullscreen() if ( self.settings[ "launcher_notification" ] ): @@ -1581,7 +1584,10 @@ def _run_launcher(self, launcherID): _toogle_fullscreen() xbmc.enableNavSounds(True) if ( self.settings[ "media_state" ] != "2" ): - xbmc.audioResume() + try: + xbmc.audioResume() + except: + pass if ( self.settings[ "media_state" ] == "1" ): xbmc.sleep(self.settings[ "start_tempo" ]+100) xbmc.Player().play() @@ -1735,7 +1741,10 @@ def _run_rom(self, launcherID, romName): if ( self.settings[ "media_state" ] == "1" ): xbmc.Player().pause() xbmc.sleep(self.settings[ "start_tempo" ]+100) - xbmc.audioSuspend() + try: + xbmc.audioSuspend() + except: + pass if (launcher["minimize"] == "true"): _toogle_fullscreen() if ( self.settings[ "launcher_notification" ] ): @@ -1781,7 +1790,10 @@ def _run_rom(self, launcherID, romName): xbmc.sleep(self.settings[ "start_tempo" ]) xbmc.enableNavSounds(True) if ( self.settings[ "media_state" ] != "2" ): - xbmc.audioResume() + try: + xbmc.audioResume() + except: + pass if ( self.settings[ "media_state" ] == "1" ): xbmc.sleep(self.settings[ "start_tempo" ]+100) xbmc.Player().play() From 76ac47467ffb255d24eb7915ab522545aa82801d Mon Sep 17 00:00:00 2001 From: angelscry Date: Fri, 7 Jun 2013 20:37:15 -0400 Subject: [PATCH 36/80] . Fix GameFAQs scrapers (info, thumbs and fanarts). . Fix post-Frodo XBMC versions compatibility. . Fix toogle fullscreen option for files launchers. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 5 ++ resources/language/English/strings.xml | 1 + resources/lib/launcher_plugin.py | 52 +++++++++++++------ .../scrapers/datas/GameFAQs/datas_scraper.py | 14 +++-- .../fanarts/GameFAQs/fanarts_scraper.py | 14 +++-- .../thumbs/GameFAQs/thumbs_scraper.py | 18 ++++--- 8 files changed, 77 insertions(+), 31 deletions(-) diff --git a/addon.py b/addon.py index 1249bba..a80f060 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "http://sourceforge.net/projects/advlauncher/" __git_url__ = "http://sourceforge.net/p/advlauncher/git/?source=navbar" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.0.9" +__version__ = "2.0.10" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index afac57b..7e55446 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 0b6c182..795b80d 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,8 @@ +[B]2.0.10[/B] +. Fix GameFAQs scrapers (info, thumbs and fanarts). +. Fix post-Frodo XBMC versions compatibility. +. Fix toogle fullscreen option for files launchers. + [B]2.0.9[/B] . Restore post-Frodo XBMC versions compatibility. diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index c38afbd..83476fb 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -220,6 +220,7 @@ %s entries removed successfully not found Search + Add Results to Favourites Cannot create backup file. Cannot create launchers.xml file. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 05b8f41..2cbaeef 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -1549,7 +1549,10 @@ def _run_launcher(self, launcherID): _toogle_fullscreen() if ( self.settings[ "launcher_notification" ] ): xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30034 ) % launcher["name"])) - xbmc.enableNavSounds(False) + try: + xbmc.enableNavSounds(False) + except: + pass xbmc.sleep(self.settings[ "start_tempo" ]) if (os.environ.get( "OS", "xbox" ) == "xbox"): xbmc.executebuiltin('XBMC.Runxbe(' + launcher["application"] + ')') @@ -1582,7 +1585,10 @@ def _run_launcher(self, launcherID): xbmc.sleep(self.settings[ "start_tempo" ]) if (launcher["minimize"] == "true"): _toogle_fullscreen() - xbmc.enableNavSounds(True) + try: + xbmc.enableNavSounds(True) + except: + pass if ( self.settings[ "media_state" ] != "2" ): try: xbmc.audioResume() @@ -1749,7 +1755,10 @@ def _run_rom(self, launcherID, romName): _toogle_fullscreen() if ( self.settings[ "launcher_notification" ] ): xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30034 ) % rom["name"])) - xbmc.enableNavSounds(False) + try: + xbmc.enableNavSounds(False) + except: + pass xbmc.sleep(self.settings[ "start_tempo" ]) if (os.environ.get( "OS", "xbox" ) == "xbox"): f=open(SHORTCUT_FILE, "wb") @@ -1788,7 +1797,12 @@ def _run_rom(self, launcherID, romName): else: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30609 ))) xbmc.sleep(self.settings[ "start_tempo" ]) - xbmc.enableNavSounds(True) + try: + xbmc.enableNavSounds(True) + except: + pass + if (launcher["minimize"] == "true"): + _toogle_fullscreen() if ( self.settings[ "media_state" ] != "2" ): try: xbmc.audioResume() @@ -1826,12 +1840,6 @@ def get_xml_source( self, xmlpath ): def _save_launchers (self): xbmc.executebuiltin( "ActivateWindow(busydialog)" ) - print len(self.categories) - print len(self.launchers) - #self.categories.pop() - #self.launchers.pop() - print len(self.categories) - print len(self.launchers) # make settings directory if doesn't exists if (not os.path.isdir(os.path.dirname(TEMP_CURRENT_SOURCE_PATH))): os.makedirs(os.path.dirname(TEMP_CURRENT_SOURCE_PATH)) @@ -2184,7 +2192,7 @@ def _get_roms( self, launcherID ): defined_fanart = selectedLauncher["fanart"] else: defined_fanart = roms[key]["fanart"] - self._add_rom(launcherID, roms[key]["name"], roms[key]["filename"], roms[key]["gamesys"], roms[key]["thumb"], defined_fanart, roms[key]["trailer"], roms[key]["custom"], roms[key]["genre"], roms[key]["release"], roms[key]["studio"], roms[key]["plot"], roms[key]["finished"], roms[key]["altapp"], roms[key]["altarg"], len(roms), key) + self._add_rom(launcherID, roms[key]["name"], roms[key]["filename"], roms[key]["gamesys"], roms[key]["thumb"], defined_fanart, roms[key]["trailer"], roms[key]["custom"], roms[key]["genre"], roms[key]["release"], roms[key]["studio"], roms[key]["plot"], roms[key]["finished"], roms[key]["altapp"], roms[key]["altarg"], len(roms), key, False, "") xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) else: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30349 ))) @@ -2561,7 +2569,7 @@ def _import_roms(self, launcherID, addRoms = False): romsCount = romsCount + 1 if (addRoms): - self._add_rom(launcherID, romdata["name"], romdata["filename"], romdata["gamesys"], romdata["thumb"], romdata["fanart"], romdata["trailer"], romdata["custom"], romdata["genre"], romdata["release"], romdata["studio"], romdata["plot"], romdata["finished"], romdata["altapp"], romdata["altarg"], len(files), key) + self._add_rom(launcherID, romdata["name"], romdata["filename"], romdata["gamesys"], romdata["thumb"], romdata["fanart"], romdata["trailer"], romdata["custom"], romdata["genre"], romdata["release"], romdata["studio"], romdata["plot"], romdata["finished"], romdata["altapp"], romdata["altarg"], len(files), key, False, "") romadded = True if not romadded: self._print_log(__language__( 30731 )) @@ -2638,7 +2646,7 @@ def _add_launcher(self, name, category, cmd, path, thumbpath, fanartpath, traile else: xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s" % (self._path, category, key), listitem=listitem, isFolder=False) - def _add_rom( self, launcherID, name, cmd , romgamesys, thumb, romfanart, romtrailer, romcustom, romgenre, romrelease, romstudio, romplot, finished, altapp, altarg, total, key): + def _add_rom( self, launcherID, name, cmd , romgamesys, thumb, romfanart, romtrailer, romcustom, romgenre, romrelease, romstudio, romplot, finished, altapp, altarg, total, key, search, search_url): if (int(xbmc.getInfoLabel("System.BuildVersion")[0:2]) < 12 ): # Dharma / Eden compatible display_date_format = "Date" @@ -2659,8 +2667,11 @@ def _add_rom( self, launcherID, name, cmd , romgamesys, thumb, romfanart, romtra listitem.setInfo( "video", { "Title": name, "Label": os.path.basename(cmd), "Plot" : romplot, "Studio" : romstudio, "Genre" : romgenre, "Premiered" : romrelease , display_date_format : romrelease, "Writer" : romgamesys, "Trailer" : os.path.join(romtrailer), "Director" : os.path.join(romcustom), "overlay": ICON_OVERLAY } ) commands = [] - commands.append((__language__( 30512 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, self.launchers[launcherID]["category"], launcherID, SEARCH_COMMAND) , )) + commands.append((__language__( 30512 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, self.launchers[launcherID]["category"], launcherID, SEARCH_COMMAND) , )) commands.append(( __language__( 30107 ), "XBMC.RunPlugin(%s?%s/%s/%s/%s)" % (self._path, self.launchers[launcherID]["category"], launcherID, key, EDIT_COMMAND) , )) + if search : + print search_url + commands.append((__language__( 30513 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, self.launchers[launcherID]["category"], launcherID, SEARCH_COMMAND) , )) listitem.addContextMenuItems( commands ) if ( finished == "false" ) or ( self.settings[ "hide_finished" ] == False) : xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s/%s" % (self._path, self.launchers[launcherID]["category"], launcherID, key), listitem=listitem, isFolder=False) @@ -3155,6 +3166,17 @@ def _search_category(self,category): def _find_category_roms( self, search, category ): #sorted by name + if category == 'name' : + s_cmd = SEARCH_ITEM_COMMAND + if category == 'release' : + s_cmd = SEARCH_DATE_COMMAND + if category == 'gamesys' : + s_cmd = SEARCH_PLATFORM_COMMAND + if category == 'studio' : + s_cmd = SEARCH_STUDIO_COMMAND + if category == 'genre' : + s_cmd = SEARCH_GENRE_COMMAND + s_url = 'plugin://plugin.program.advanced.launcher/?'+search+'/'+s_cmd if (len(self.launchers) > 0): rl = {} for launcherID in sorted(self.launchers.iterkeys()): @@ -3180,5 +3202,5 @@ def _find_category_roms( self, search, category ): rl[keyr]["launcherID"] = launcherID #print the list sorted for key in sorted(rl.iterkeys()): - self._add_rom(rl[key]["launcherID"], rl[key]["name"], rl[key]["filename"], rl[key]["gamesys"], rl[key]["thumb"], rl[key]["fanart"], rl[key]["trailer"], rl[key]["custom"], rl[key]["genre"], rl[key]["release"], rl[key]["studio"], rl[key]["plot"], rl[key]["finished"], rl[key]["altapp"], rl[key]["altarg"], len(rl), key) + self._add_rom(rl[key]["launcherID"], rl[key]["name"], rl[key]["filename"], rl[key]["gamesys"], rl[key]["thumb"], rl[key]["fanart"], rl[key]["trailer"], rl[key]["custom"], rl[key]["genre"], rl[key]["release"], rl[key]["studio"], rl[key]["plot"], rl[key]["finished"], rl[key]["altapp"], rl[key]["altarg"], len(rl), key, True, s_url) xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) diff --git a/resources/scrapers/datas/GameFAQs/datas_scraper.py b/resources/scrapers/datas/GameFAQs/datas_scraper.py index 0b76523..0b5bc92 100644 --- a/resources/scrapers/datas/GameFAQs/datas_scraper.py +++ b/resources/scrapers/datas/GameFAQs/datas_scraper.py @@ -2,7 +2,7 @@ import re import os -import urllib +import urllib2 from xbmcaddon import Addon # Return Game search list @@ -10,7 +10,9 @@ def _get_games_list(search): display=[] results=[] try: - f = urllib.urlopen('http://www.gamefaqs.com/search/index.html?platform=0&game='+search.replace(' ','+')+'') + req = urllib2.Request('http://www.gamefaqs.com/search/index.html?platform=0&game='+search.replace(' ','+')+'') + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + f = urllib2.urlopen(req) gets = {} gets = re.findall(' (.*?)', f.read().replace('\r\n', '')) for get in gets: @@ -30,7 +32,9 @@ def _get_first_game(search,gamesys): platform = _system_conversion(gamesys) results = [] try: - f = urllib.urlopen('http://www.gamefaqs.com/search/index.html?platform='+platform+'&game='+search.replace(' ','+')+'') + req = urllib2.Request('http://www.gamefaqs.com/search/index.html?platform='+platform+'&game='+search.replace(' ','+')+'') + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + f = urllib2.urlopen(req) gets = {} gets = re.findall(' (.*?)', f.read().replace('\r\n', '')) for get in gets: @@ -52,7 +56,9 @@ def _get_game_data(game_url): gamedata["studio"] = "" gamedata["plot"] = "" try: - f = urllib.urlopen(game_url) + req = urllib2.Request(game_url) + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + f = urllib2.urlopen(req) page = f.read().replace('\r\n', '') game_genre = re.findall(' » (.*?) » Pics', line.replace('\r\n', ''))) @@ -25,7 +27,9 @@ def _get_fanarts_list(system,search,imgsize): full_fanarts = [] game_id_url = _get_game_page_url(system,search) try: - game_page = urllib.urlopen('http://www.gamefaqs.com'+game_id_url+'?page=0') + req = urllib2.Request('http://www.gamefaqs.com'+game_id_url+'?page=0') + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + game_page = urllib2.urlopen(req) if game_page: for line in game_page.readlines(): if 'pod game_imgs' in line: @@ -40,7 +44,9 @@ def _get_fanarts_list(system,search,imgsize): def _get_fanart(image_url): images = [] try: - search_page = urllib.urlopen('http://www.gamefaqs.com' + image_url) + req = urllib2.Request('http://www.gamefaqs.com' + image_url) + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + search_page = urllib2.urlopen(req) for line in search_page.readlines(): if 'pod game_imgs' in line: images = re.findall('g">Pics' in line: - games.append(re.findall('Pics', line.replace('\r\n', ''))) + games.append(re.findall('Pics', line.replace('\r\n', ''))) if games: - return ''.join(games[0]) + return ''.join(games[0]) except: return "" @@ -25,7 +27,9 @@ def _get_thumbnails_list(system,search,region,imgsize): covers = [] game_id_url = _get_game_page_url(system,search) try: - game_page = urllib.urlopen('http://www.gamefaqs.com'+game_id_url+'?page=0') + req = urllib2.Request('http://www.gamefaqs.com'+game_id_url) + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + game_page = urllib2.urlopen(req) if game_page: for line in game_page.readlines(): if 'pod contrib' in line: @@ -44,7 +48,9 @@ def _get_thumbnails_list(system,search,region,imgsize): def _get_thumbnail(image_url): images = [] try: - search_page = urllib.urlopen('http://www.gamefaqs.com' + image_url) + req = urllib2.Request('http://www.gamefaqs.com' + image_url) + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + search_page = urllib2.urlopen(req) for line in search_page.readlines(): if 'Game Box Shot' in line: images = re.findall('g"> Date: Tue, 10 Sep 2013 20:54:14 -0400 Subject: [PATCH 37/80] Fix TheGameDB scrapers (info, thumbs and fanarts). Change download image runtime. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 4 +++ resources/lib/launcher_plugin.py | 35 ++++++++++++++----- .../scrapers/datas/MobyGames/datas_scraper.py | 5 +-- .../datas/TheGamesDB/datas_scraper.py | 26 ++++++++------ .../fanarts/TheGamesDB/fanarts_scraper.py | 16 +++++---- .../thumbs/TheGamesDB/thumbs_scraper.py | 16 +++++---- 8 files changed, 71 insertions(+), 35 deletions(-) diff --git a/addon.py b/addon.py index a80f060..777c58e 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "http://sourceforge.net/projects/advlauncher/" __git_url__ = "http://sourceforge.net/p/advlauncher/git/?source=navbar" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.0.10" +__version__ = "2.0.11" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 7e55446..4ace26a 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 795b80d..8bddff2 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,7 @@ +[B]2.0.11[/B] +. Fix TheGameDB scrapers (info, thumbs and fanarts). +. Change download image runtime. + [B]2.0.10[/B] . Fix GameFAQs scrapers (info, thumbs and fanarts). . Fix post-Frodo XBMC versions compatibility. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 2cbaeef..647c80c 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -24,7 +24,7 @@ import time, datetime import math import re -import urllib +import urllib, urllib2 import subprocess_hack import xml.dom.minidom import socket @@ -578,7 +578,13 @@ def _scrap_thumb_rom_algo(self, launcher, rom, title): file_path = os.path.join(os.path.dirname(self.launchers[launcher]["thumbpath"]),os.path.basename(filename.replace("."+filename.split(".")[-1], img_ext))) xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30069 ))) try: - h = urllib.urlretrieve(img_url,file_path) + download_img(img_url,file_path) + req = urllib2.Request(img_url) + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + f = open(file_path,'wb') + f.write(urllib2.urlopen(req).read()) + f.close() + self.launchers[launcher]["roms"][rom]["thumb"] = file_path self._save_launchers() _update_cache(file_path) @@ -627,7 +633,7 @@ def _scrap_thumb_launcher_algo(self, launcherID, title): file_path = os.path.join(self.settings[ "launcher_thumb_path" ],os.path.basename(self.launchers[launcherID]["application"])+'_thumb'+img_ext) xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000" % (__language__( 30000 ), __language__( 30069 ))) try: - h = urllib.urlretrieve(img_url,file_path) + download_img(img_url,file_path) self.launchers[launcherID]["thumb"] = file_path self._save_launchers() _update_cache(file_path) @@ -659,7 +665,7 @@ def _scrap_thumb_category_algo(self, categoryID, title): file_path = os.path.join(DEFAULT_THUMB_PATH,os.path.basename(self.categories[categoryID]["name"])+'_thumb'+img_ext) xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000" % (__language__( 30000 ), __language__( 30069 ))) try: - h = urllib.urlretrieve(img_url,file_path) + download_img(img_url,file_path) self.categories[categoryID]["thumb"] = file_path self._save_launchers() _update_cache(file_path) @@ -714,7 +720,7 @@ def _scrap_fanart_rom_algo(self, launcher, rom, title): file_path = os.path.join(os.path.dirname(self.launchers[launcher]["fanartpath"]),os.path.basename(filename.replace("."+filename.split(".")[-1], img_ext))) xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30074 ))) try: - h = urllib.urlretrieve(img_url,file_path) + download_img(img_url,file_path) self.launchers[launcher]["roms"][rom]["fanart"] = file_path self._save_launchers() _update_cache(file_path) @@ -746,7 +752,7 @@ def _scrap_fanart_category_algo(self, categoryID, title): file_path = os.path.join(DEFAULT_FANART_PATH,os.path.basename(self.categories[categoryID]["name"])+'_fanart'+img_ext) xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000" % (__language__( 30000 ), __language__( 30074 ))) try: - h = urllib.urlretrieve(img_url,file_path) + download_img(img_url,file_path) self.categories[categoryID]["fanart"] = file_path self._save_launchers() _update_cache(file_path) @@ -796,7 +802,7 @@ def _scrap_fanart_launcher_algo(self, launcherID, title): file_path = os.path.join(self.settings[ "launcher_fanart_path" ],os.path.basename(self.launchers[launcherID]["application"])+'_fanart'+img_ext) xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30074 ))) try: - h = urllib.urlretrieve(img_url,file_path) + download_img(img_url,file_path) self.launchers[launcherID]["fanart"] = file_path self._save_launchers() _update_cache(file_path) @@ -2491,7 +2497,7 @@ def _import_roms(self, launcherID, addRoms = False): cached_thumb = thumbnails.get_cached_covers_thumb( thumb ).replace("tbn" , "jpg") if ( img_url !='' ): try: - h = urllib.urlretrieve(img_url,thumb) + download_img(img_url,file_thumb) shutil.copy2( thumb.decode(sys.getfilesystemencoding(),'ignore') , cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) except socket.timeout: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30604 ))) @@ -2546,7 +2552,11 @@ def _import_roms(self, launcherID, addRoms = False): cached_thumb = thumbnails.get_cached_covers_thumb( fanart ).replace("tbn" , "jpg") if ( img_url !='' ): try: - h = urllib.urlretrieve(img_url,fanart) + download_img(img_url,fanart) + opener = FancyURLopener({}) + opener.version = 'Mozilla/5.0' + opener.retrieve(img_url,fanart) + shutil.copy2( fanart.decode(sys.getfilesystemencoding(),'ignore') , cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) except socket.timeout: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30606 ))) @@ -3098,6 +3108,13 @@ def title_format(self,title): if (title.endswith(", An")): new_title = "An "+"".join(title.rsplit(", An",1)) return new_title +def download_img(img_url,file_path): + req = urllib2.Request(img_url) + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + f = open(file_path,'wb') + f.write(urllib2.urlopen(req).read()) + f.close() + def clean_filename(title): title = re.sub('\[.*?\]', '', title) title = re.sub('\(.*?\)', '', title) diff --git a/resources/scrapers/datas/MobyGames/datas_scraper.py b/resources/scrapers/datas/MobyGames/datas_scraper.py index e537ef9..ed6ca96 100644 --- a/resources/scrapers/datas/MobyGames/datas_scraper.py +++ b/resources/scrapers/datas/MobyGames/datas_scraper.py @@ -2,7 +2,7 @@ import re import os -import urllib +import urllib,urllib2 from xbmcaddon import Addon # Return Game search list @@ -10,7 +10,8 @@ def _get_games_list(search): results = [] display = [] try: - f = urllib.urlopen('http://www.mobygames.com/search/quick?q='+search.replace(' ','+')+'&sFilter=1&sG=on') + f = urllib2.urlopen('http://www.mobygames.com/search/quick?q='+search.replace(' ','+')+'&sFilter=1&sG=on') + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') for line in f.readlines(): if 'searchNumber' in line: split_games = re.findall('Game: (.*?)', line) diff --git a/resources/scrapers/datas/TheGamesDB/datas_scraper.py b/resources/scrapers/datas/TheGamesDB/datas_scraper.py index 55ba7ed..0902477 100644 --- a/resources/scrapers/datas/TheGamesDB/datas_scraper.py +++ b/resources/scrapers/datas/TheGamesDB/datas_scraper.py @@ -2,17 +2,19 @@ import re import os -import urllib +import urllib2 + from xbmcaddon import Addon from operator import itemgetter, attrgetter # Return Game search list def _get_games_list(search): - params = urllib.urlencode({"name": search}) results = [] display = [] try: - f = urllib.urlopen("http://thegamesdb.net/api/GetGamesList.php", params) + req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name="'+search+'"') + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + f = urllib2.urlopen(req) page = f.read().replace("\n", "") games = re.findall("(.*?)(.*?)(.*?)(.*?)", page) for item in games: @@ -26,6 +28,7 @@ def _get_games_list(search): if ( game["title"].lower().find(search.lower()) != -1 ): game["order"] += 1 results.append(game) + print game results.sort(key=lambda result: result["order"], reverse=True) for result in results: display.append(result["title"]+" / "+result["gamesys"]) @@ -36,16 +39,17 @@ def _get_games_list(search): # Return 1st Game search def _get_first_game(search,gamesys): platform = _system_conversion(gamesys) - params = urllib.urlencode({"name": search, "platform": platform}) - print params results = [] try: - f = urllib.urlopen("http://thegamesdb.net/api/GetGamesList.php", params) + req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name="'+search+'"&plateform="'+platform+'"') + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + f = urllib2.urlopen(req) page = f.read().replace("\n", "") if (platform == "Sega Genesis" ) : - params = urllib.urlencode({"name": search, "platform": "Sega Mega Drive"}) - f2 = urllib.urlopen("http://thegamesdb.net/api/GetGamesList.php", params) - page = page + f2.read().replace("\n", "") + req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name="'+search+'"&plateform="Sega Mega Drive"') + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + f2 = urllib2.urlopen(req) + page = page + f2.read().replace("\n", "") games = re.findall("(.*?)(.*?)(.*?)(.*?)", page) for item in games: game = {} @@ -71,7 +75,9 @@ def _get_game_data(game_url): gamedata["studio"] = "" gamedata["plot"] = "" try: - f = urllib.urlopen(game_url) + req = urllib2.Request(game_url) + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + f = urllib2.urlopen(req) page = f.read().replace('\n', '') game_genre = ' / '.join(re.findall('(.*?)', page)) if game_genre: diff --git a/resources/scrapers/fanarts/TheGamesDB/fanarts_scraper.py b/resources/scrapers/fanarts/TheGamesDB/fanarts_scraper.py index ae157ac..6479c16 100644 --- a/resources/scrapers/fanarts/TheGamesDB/fanarts_scraper.py +++ b/resources/scrapers/fanarts/TheGamesDB/fanarts_scraper.py @@ -2,20 +2,22 @@ import os import re -import urllib +import urllib2 from xbmcaddon import Addon # Get Game page def _get_game_page_url(system,search): platform = _system_conversion(system) - params = urllib.urlencode({"name": search, "platform": platform}) results = [] try: - f = urllib.urlopen("http://thegamesdb.net/api/GetGamesList.php", params) + req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name="'+search+'"&plateform="'+platform+'"') + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + f = urllib2.urlopen(req) page = f.read().replace("\n", "") if (platform == "Sega Genesis" ) : - params = urllib.urlencode({"name": search, "platform": "Sega Mega Drive"}) - f2 = urllib.urlopen("http://thegamesdb.net/api/GetGamesList.php", params) + req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name="'+search+'"&plateform="Sega Mega Drive"') + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + f2 = urllib2.urlopen(req) page = page + f2.read().replace("\n", "") games = re.findall("(.*?)(.*?)(.*?)(.*?)", page) for item in games: @@ -39,7 +41,9 @@ def _get_fanarts_list(system,search,imgsize): full_fanarts = [] game_id_url = _get_game_page_url(system,search) try: - f = urllib.urlopen(game_id_url) + req = urllib2.Request(game_id_url) + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + f = urllib2.urlopen(req) page = f.read().replace('\n', '') fanarts = re.findall('fanart/(.*?)', page) for indexa, fanart in enumerate(fanarts): diff --git a/resources/scrapers/thumbs/TheGamesDB/thumbs_scraper.py b/resources/scrapers/thumbs/TheGamesDB/thumbs_scraper.py index fd1cec8..44bd8a8 100644 --- a/resources/scrapers/thumbs/TheGamesDB/thumbs_scraper.py +++ b/resources/scrapers/thumbs/TheGamesDB/thumbs_scraper.py @@ -2,20 +2,22 @@ import os import re -import urllib +import urllib2 from xbmcaddon import Addon # Get Game page def _get_game_page_url(system,search): platform = _system_conversion(system) - params = urllib.urlencode({"name": search, "platform": platform}) results = [] try: - f = urllib.urlopen("http://thegamesdb.net/api/GetGamesList.php", params) + req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name="'+search+'"&plateform="'+platform+'"') + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + f = urllib2.urlopen(req) page = f.read().replace("\n", "") if (platform == "Sega Genesis" ) : - params = urllib.urlencode({"name": search, "platform": "Sega Mega Drive"}) - f2 = urllib.urlopen("http://thegamesdb.net/api/GetGamesList.php", params) + req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name="'+search+'"&plateform="Sega Mega Drive"') + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + f2 = urllib2.urlopen(req) page = page + f2.read().replace("\n", "") games = re.findall("(.*?)(.*?)(.*?)(.*?)", page) for item in games: @@ -39,7 +41,9 @@ def _get_thumbnails_list(system,search,region,imgsize): covers = [] game_id_url = _get_game_page_url(system,search) try: - f = urllib.urlopen(game_id_url) + req = urllib2.Request(game_id_url) + req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + f = urllib2.urlopen(req) page = f.read().replace('\n', '') boxarts = re.findall('(.*?)', page) for indexa, boxart in enumerate(boxarts): From 2de164dee6e841d076a6c9314081b7fbc23cd268 Mon Sep 17 00:00:00 2001 From: angelscry Date: Tue, 10 Sep 2013 22:09:23 -0400 Subject: [PATCH 38/80] Fix images download bug into automatic scan mode. Improve download image algorithm. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 4 ++++ resources/lib/launcher_plugin.py | 14 ++++++++------ 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/addon.py b/addon.py index 777c58e..ac6af74 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "http://sourceforge.net/projects/advlauncher/" __git_url__ = "http://sourceforge.net/p/advlauncher/git/?source=navbar" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.0.11" +__version__ = "2.0.12" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 4ace26a..7d2b03c 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 8bddff2..446161c 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,7 @@ +[B]2.0.12[/B] +. Fix images download bug into automatic scan mode. +. Improve download image algorithm. + [B]2.0.11[/B] . Fix TheGameDB scrapers (info, thumbs and fanarts). . Change download image runtime. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 647c80c..53cc066 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -35,6 +35,7 @@ from operator import itemgetter import shutil +from user_agent import getUserAgent from file_item import Thumbnails thumbnails = Thumbnails() @@ -2497,7 +2498,7 @@ def _import_roms(self, launcherID, addRoms = False): cached_thumb = thumbnails.get_cached_covers_thumb( thumb ).replace("tbn" , "jpg") if ( img_url !='' ): try: - download_img(img_url,file_thumb) + download_img(img_url,thumb) shutil.copy2( thumb.decode(sys.getfilesystemencoding(),'ignore') , cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) except socket.timeout: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30604 ))) @@ -2553,10 +2554,6 @@ def _import_roms(self, launcherID, addRoms = False): if ( img_url !='' ): try: download_img(img_url,fanart) - opener = FancyURLopener({}) - opener.version = 'Mozilla/5.0' - opener.retrieve(img_url,fanart) - shutil.copy2( fanart.decode(sys.getfilesystemencoding(),'ignore') , cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) except socket.timeout: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30606 ))) @@ -3110,11 +3107,16 @@ def title_format(self,title): def download_img(img_url,file_path): req = urllib2.Request(img_url) - req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') + req.add_unredirected_header('User-Agent', getUserAgent()) f = open(file_path,'wb') f.write(urllib2.urlopen(req).read()) f.close() +def download_page(url): + req = urllib2.Request(url) + req.add_unredirected_header('User-Agent', getUserAgent()) + return urllib2.urlopen(req) + def clean_filename(title): title = re.sub('\[.*?\]', '', title) title = re.sub('\(.*?\)', '', title) From 90e829f062399491af959099f77188069e418a4b Mon Sep 17 00:00:00 2001 From: angelscry Date: Tue, 10 Sep 2013 22:12:53 -0400 Subject: [PATCH 39/80] Improve download image algorithm. --- resources/lib/user_agent.py | 41 +++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 resources/lib/user_agent.py diff --git a/resources/lib/user_agent.py b/resources/lib/user_agent.py new file mode 100644 index 0000000..a71b093 --- /dev/null +++ b/resources/lib/user_agent.py @@ -0,0 +1,41 @@ +# -*- coding: UTF-8 -*- + +import random + +def getUserAgent(): + platform = random.choice(['Macintosh', 'Windows', 'X11']) + if platform == 'Macintosh': + os = random.choice(['68K', 'PPC']) + elif platform == 'Windows': + os = random.choice(['Win3.11', 'WinNT3.51', 'WinNT4.0', 'Windows NT 5.0', 'Windows NT 5.1', 'Windows NT 5.2', 'Windows NT 6.0', 'Windows NT 6.1', 'Windows NT 6.2', 'Win95', 'Win98', 'Win 9x 4.90', 'WindowsCE']) + elif platform == 'X11': + os = random.choice(['Linux i686', 'Linux x86_64']) + browser = random.choice(['chrome', 'firefox', 'ie']) + if browser == 'chrome': + webkit = str(random.randint(500, 599)) + version = str(random.randint(0, 24)) + '.0' + str(random.randint(0, 1500)) + '.' + str(random.randint(0, 999)) + return 'Mozilla/5.0 (' + os + ') AppleWebKit/' + webkit + '.0 (KHTML, live Gecko) Chrome/' + version + ' Safari/' + webkit + elif browser == 'firefox': + year = str(random.randint(2000, 2012)) + month = random.randint(1, 12) + if month < 10: + month = '0' + str(month) + else: + month = str(month) + day = random.randint(1, 30) + if day < 10: + day = '0' + str(day) + else: + day = str(day) + gecko = year + month + day + version = random.choice(['1.0', '2.0', '3.0', '4.0', '5.0', '6.0', '7.0', '8.0', '9.0', '10.0', '11.0', '12.0', '13.0', '14.0', '15.0']) + return 'Mozilla/5.0 (' + os + '; rv:' + version + ') Gecko/' + gecko + ' Firefox/' + version + elif browser == 'ie': + version = str(random.randint(1, 10)) + '.0' + engine = str(random.randint(1, 5)) + '.0' + option = random.choice([True, False]) + if option == True: + token = random.choice(['.NET CLR', 'SV1', 'Tablet PC', 'Win64; IA64', 'Win64; x64', 'WOW64']) + '; ' + elif option == False: + token = '' + return 'Mozilla/5.0 (compatible; MSIE ' + version + '; ' + os + '; ' + token + 'Trident/' + engine + ')' From e4ef199c5e8075e068c0958562de84497415de73 Mon Sep 17 00:00:00 2001 From: angelscry Date: Sun, 6 Oct 2013 09:45:35 -0400 Subject: [PATCH 40/80] Fix TheGameDB scrapers (info, thumbs and fanarts). --- addon.py | 6 +++--- addon.xml | 2 +- changelog.txt | 3 +++ resources/scrapers/datas/TheGamesDB/datas_scraper.py | 8 ++++---- resources/scrapers/fanarts/TheGamesDB/fanarts_scraper.py | 7 +++---- resources/scrapers/thumbs/TheGamesDB/thumbs_scraper.py | 6 +++--- 6 files changed, 17 insertions(+), 15 deletions(-) diff --git a/addon.py b/addon.py index ac6af74..efcd5d2 100644 --- a/addon.py +++ b/addon.py @@ -10,10 +10,10 @@ # plugin constants __plugin__ = "Advanced Launcher" __author__ = "Angelscry" -__url__ = "http://sourceforge.net/projects/advlauncher/" -__git_url__ = "http://sourceforge.net/p/advlauncher/git/?source=navbar" +__url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" +__git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.0.12" +__version__ = "2.0.13" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 7d2b03c..43f8b1a 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 446161c..62a5fac 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.0.13[/B] +. Fix TheGameDB scrapers (info, thumbs and fanarts). + [B]2.0.12[/B] . Fix images download bug into automatic scan mode. . Improve download image algorithm. diff --git a/resources/scrapers/datas/TheGamesDB/datas_scraper.py b/resources/scrapers/datas/TheGamesDB/datas_scraper.py index 0902477..b82d64e 100644 --- a/resources/scrapers/datas/TheGamesDB/datas_scraper.py +++ b/resources/scrapers/datas/TheGamesDB/datas_scraper.py @@ -2,7 +2,7 @@ import re import os -import urllib2 +import urllib, urllib2 from xbmcaddon import Addon from operator import itemgetter, attrgetter @@ -12,7 +12,7 @@ def _get_games_list(search): results = [] display = [] try: - req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name="'+search+'"') + req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name='+urllib.quote_plus(search)) req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') f = urllib2.urlopen(req) page = f.read().replace("\n", "") @@ -41,12 +41,12 @@ def _get_first_game(search,gamesys): platform = _system_conversion(gamesys) results = [] try: - req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name="'+search+'"&plateform="'+platform+'"') + req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name='+urllib.quote_plus(search)+'&platform='+urllib.quote_plus(platform)) req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') f = urllib2.urlopen(req) page = f.read().replace("\n", "") if (platform == "Sega Genesis" ) : - req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name="'+search+'"&plateform="Sega Mega Drive"') + req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name='+urllib.quote_plus(search)+'&platform='+urllib.quote_plus('Sega Mega Drive')) req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') f2 = urllib2.urlopen(req) page = page + f2.read().replace("\n", "") diff --git a/resources/scrapers/fanarts/TheGamesDB/fanarts_scraper.py b/resources/scrapers/fanarts/TheGamesDB/fanarts_scraper.py index 6479c16..5bc7bf1 100644 --- a/resources/scrapers/fanarts/TheGamesDB/fanarts_scraper.py +++ b/resources/scrapers/fanarts/TheGamesDB/fanarts_scraper.py @@ -2,7 +2,7 @@ import os import re -import urllib2 +import urllib, urllib2 from xbmcaddon import Addon # Get Game page @@ -10,12 +10,12 @@ def _get_game_page_url(system,search): platform = _system_conversion(system) results = [] try: - req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name="'+search+'"&plateform="'+platform+'"') + req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name='+urllib.quote_plus(search)+'&platform='+urllib.quote_plus(platform)) req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') f = urllib2.urlopen(req) page = f.read().replace("\n", "") if (platform == "Sega Genesis" ) : - req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name="'+search+'"&plateform="Sega Mega Drive"') + req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name='+urllib.quote_plus(search)+'&platform='+urllib.quote_plus('Sega Mega Drive')) req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') f2 = urllib2.urlopen(req) page = page + f2.read().replace("\n", "") @@ -76,4 +76,3 @@ def _system_conversion(system_id): return platform except: return '' - diff --git a/resources/scrapers/thumbs/TheGamesDB/thumbs_scraper.py b/resources/scrapers/thumbs/TheGamesDB/thumbs_scraper.py index 44bd8a8..63904b9 100644 --- a/resources/scrapers/thumbs/TheGamesDB/thumbs_scraper.py +++ b/resources/scrapers/thumbs/TheGamesDB/thumbs_scraper.py @@ -2,7 +2,7 @@ import os import re -import urllib2 +import urllib, urllib2 from xbmcaddon import Addon # Get Game page @@ -10,12 +10,12 @@ def _get_game_page_url(system,search): platform = _system_conversion(system) results = [] try: - req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name="'+search+'"&plateform="'+platform+'"') + req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name='+urllib.quote_plus(search)+'&platform='+urllib.quote_plus(platform)) req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') f = urllib2.urlopen(req) page = f.read().replace("\n", "") if (platform == "Sega Genesis" ) : - req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name="'+search+'"&plateform="Sega Mega Drive"') + req = urllib2.Request('http://thegamesdb.net/api/GetGamesList.php?name='+urllib.quote_plus(search)+'&platform='+urllib.quote_plus('Sega Mega Drive')) req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') f2 = urllib2.urlopen(req) page = page + f2.read().replace("\n", "") From 7c180955d4e26cb606787d7448d4a493ccc148b0 Mon Sep 17 00:00:00 2001 From: mbroemme Date: Fri, 18 Oct 2013 21:14:21 +0200 Subject: [PATCH 41/80] updated German translation --- resources/language/German/strings.xml | 94 +++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/resources/language/German/strings.xml b/resources/language/German/strings.xml index 59dd5a0..f058227 100644 --- a/resources/language/German/strings.xml +++ b/resources/language/German/strings.xml @@ -36,9 +36,12 @@ Verzeichnis zu den Vorschaubildern Verzeichnis zu den Fanbildern Verzeichnis zur Personalisierung + Wähle Trailer Datei %s Informationen aus %s importieren %s Datei aus Verzeichnis importieren + Vorschaubild %s kann nicht zugeordnet werden + Fanbild %s kann nicht zugeordnet werden %s Vorschaubild aus %s importieren %s Vorschaubilder für %s Kein Vorschaubild für %s @@ -54,6 +57,7 @@ Platform auswählen Einen Titel aus %s auswählen Zu suchenden MAME Dateinamen eingeben... + Dieses Bild kann nicht heruntergeladen werden %s nicht gefunden %s importiert %s erstellt @@ -65,6 +69,11 @@ Dateien verwalten Bearbeiten Programmstarter bearbeiten + Kategorie bearbeiten + Neue Kategorie erstellen + Neuer Kategoriename + Kategorie %s erstellt + Kategorie wählen Importmodus Quelle @@ -123,6 +132,20 @@ Schnappschüsse Poster Verzögerung beim Programmstart (ms) + Einstellungen für Sicherungen + Aktiviere automatische Sicherung + Erweitert + Anzahl der Sicherungen + Importiere XML Datei (Sicherung wiederherstellen) + Wähle zu importierende XML Datei + Advanced Launcher Meldungen in die xbmc.log Datei + Abzeigeoptionen + Verstecke die Standard Kategorie + Füge XML Datei an (verbinde Programmstarterlisten) + Wähle XML Datei zum anhängen + Zusammenlegung + Startoptionen für Programmstarter + Neuen Programmstarter hinzufügen standard erfahrene Anwender @@ -171,6 +194,15 @@ Informationen, Vorschau- & Fanbilder importieren Status: Unbeendet Status: Beendet + Wechsel Trailer Datei: %s + Wechsel Kategorie: %s + Verwalte Programmstarterlisten + Bearbeite Kategorieinfos + "%s" enthält %s Programmstarter. + Das Löschen vom "%s" entfernt ebenso relevanter Programmstarter. + Alternative Anwendung: %s + Alternative Parameter: %s + Keine Einträge in der Liste: Erst einen Eintrag hinzufügen. Einträge suchen... Nach Titel @@ -188,5 +220,67 @@ %s entries removed successfully not found Suche + Ergebnis zu den Favoriten hinzufügen + Die Sicherungsdatei kann nicht erstellt werden. + Die launchers.xml Datei kann nicht erstellt werden. + Die launchers.xml Datei kann nicht gelesen werden. + Die launchers.xml Datei kann nicht geschrieben werden. + Das Vorschaubild kann nicht geladen werden. + Das Vorschaubild kann nicht gespeichert werden. + Das Fanbild kann nicht geladen werden. + Das Fanbild kann nicht gespeichert werden. + Das gecachte Bild kann nicht aktualisiert werden. + Die Anwendung kann nicht gestartet werden. + Das Verzeichnis kann nicht gelesen werden. + Datei %s existiert nicht. + Fehler + Zielkategorie existiert nicht. + + Initialisierung + Programmstarter %s ausgewählt + Dateistarter ausgewählt + Einzelstarter ausgewählt + Suche %s in lokalen Bildern + Vorschau-/Fanbilder in %s + Vorschau-/Fanbilder in verschiedenen Verzeichnissen + Vorschaubilder/Einträge in %s + Vorschaubilder/Einträge in verschiedenen Verzeichnissen + Fanbilder in %s + Fanbilder/Einträge in verschiedenen Verzeichnissen + Suche %s als Vorschaubild + Suche %s als Fanbild + Setze %s als Pfad für Vorschaubilder + Setze %s als Pfad für Fanbilder + Gefunden + Nicht gefunden + Programmstarter enthält %s Einträge + Suche nach verwaisten Einträgen + Suche %s + Lösche Eintrag %s + Kein verwaister Eintrag + Programmstarter ist leer + Rekursiven scannen aktiviert + Rekursives scannen nicht aktiviert + Gefunden %s + Erwartete Erweiterung %s erkannt + Datei bereits in Programmstarter vorhanden + Datei im Multi-Disc Format + Datei ist ein MAME Bios Rom + Das ist eine neue Datei. + Datei nicht hinzugefügt + Name des Eintrags auf %s gesetzt + Importiere Inhalt %s + Nur den Namen des Eintrags aktualisieren + MAME Rom erkannt + Informationen automatisch scrapen + Informationen halbautomatisch scrapen + Deaktiviere scrapen + Advanced Launcher Stammordner > Kategorienliste + %s Kategorieverzeichnis > Programmstarterliste + URL geladen: %s + Anwendung: %s + Parameter: %s + plugin.program.advanced.launcher + Fehler: %s::%s (%d) - %s From 512b1dc85ee30dbf034dd7d62bb388ec010856b3 Mon Sep 17 00:00:00 2001 From: mbroemme Date: Tue, 22 Oct 2013 01:41:01 +0200 Subject: [PATCH 42/80] fixed typo and some bad translations --- resources/language/German/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/language/German/strings.xml b/resources/language/German/strings.xml index f058227..046b038 100644 --- a/resources/language/German/strings.xml +++ b/resources/language/German/strings.xml @@ -79,7 +79,7 @@ Quelle Vorschaubilder Fanbilder - Erweiterte Optionen + Sonstiges Für Vorschaubilder Daten & Infos Für Fanbilder @@ -134,13 +134,13 @@ Verzögerung beim Programmstart (ms) Einstellungen für Sicherungen Aktiviere automatische Sicherung - Erweitert + Erweiterte Optionen Anzahl der Sicherungen Importiere XML Datei (Sicherung wiederherstellen) Wähle zu importierende XML Datei - Advanced Launcher Meldungen in die xbmc.log Datei - Abzeigeoptionen - Verstecke die Standard Kategorie + Advanced Launcher Meldungen in die xbmc.log Datei schreiben + Anzeigeoptionen + Verstecke Standard Kategorie Füge XML Datei an (verbinde Programmstarterlisten) Wähle XML Datei zum anhängen Zusammenlegung From e81b1eb589a1082ebb8b050ca934608738337506 Mon Sep 17 00:00:00 2001 From: mbroemme Date: Tue, 22 Oct 2013 20:34:30 +0200 Subject: [PATCH 43/80] fixed another series of weird translations --- resources/language/German/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/language/German/strings.xml b/resources/language/German/strings.xml index 046b038..cce2659 100644 --- a/resources/language/German/strings.xml +++ b/resources/language/German/strings.xml @@ -70,7 +70,7 @@ Bearbeiten Programmstarter bearbeiten Kategorie bearbeiten - Neue Kategorie erstellen + Kategorie erstellen Neuer Kategoriename Kategorie %s erstellt Kategorie wählen @@ -145,7 +145,7 @@ Wähle XML Datei zum anhängen Zusammenlegung Startoptionen für Programmstarter - Neuen Programmstarter hinzufügen + Programmstarter hinzufügen standard erfahrene Anwender @@ -158,7 +158,7 @@ Informationen bearbeiten Vorschaubild wechseln Fanbild wechseln - Löschen + Kategorie löschen Eintrag bearbeiten Titel: %s Platform: %s @@ -219,7 +219,7 @@ Check for dead entries in %s... %s entries removed successfully not found - Suche + Einträge suchen Ergebnis zu den Favoriten hinzufügen Die Sicherungsdatei kann nicht erstellt werden. From af88ec216ade0fca0e6287703b63315390ead96b Mon Sep 17 00:00:00 2001 From: mbroemme Date: Tue, 22 Oct 2013 20:56:37 +0200 Subject: [PATCH 44/80] fixed another series of weird translations --- resources/language/German/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/language/German/strings.xml b/resources/language/German/strings.xml index cce2659..1c61c0a 100644 --- a/resources/language/German/strings.xml +++ b/resources/language/German/strings.xml @@ -32,10 +32,10 @@ Quellen verwalten Parameter bearbeiten Dateierweiterungen bearbeiten, benutze "|" als Trennsymbol. (z.B. lnk|cbr) - Verzeichnis zu den Dateien + Verzeichnis zu den .nfo Dateien Verzeichnis zu den Vorschaubildern Verzeichnis zu den Fanbildern - Verzeichnis zur Personalisierung + Verzeichnis zu den extra Fanbildern Wähle Trailer Datei %s Informationen aus %s importieren @@ -158,7 +158,7 @@ Informationen bearbeiten Vorschaubild wechseln Fanbild wechseln - Kategorie löschen + Eintrag löschen Eintrag bearbeiten Titel: %s Platform: %s @@ -180,12 +180,12 @@ Aus %s (%s) importieren Importiere aus %s: %s Größe Erweiterte Einstellungen - Verzeichnis zu den Dateien: %s + Verzeichnis zu den .nfo Dateien: %s Verzeichnis zu den Vorschaubildern: %s Verzeichnis zu den Fanbildern: %s Anwendung: %s Verknüpfungen (.lnk) unterstützen: %s - Verzeichnis zur Personalisierung: %s + Verzeichnis zu den extra Fanbildern: %s Lokales Bild importieren (Kopieren und Umbenennen) Dateien verwalten Daten aus .nfo Dateien importieren From 9a2b89f0eaf6104d0167a0703d0ca7dc863b93f8 Mon Sep 17 00:00:00 2001 From: mbroemme Date: Tue, 22 Oct 2013 23:58:13 +0200 Subject: [PATCH 45/80] and again another series of weird translations, looks much better now --- resources/language/German/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/language/German/strings.xml b/resources/language/German/strings.xml index 1c61c0a..200da65 100644 --- a/resources/language/German/strings.xml +++ b/resources/language/German/strings.xml @@ -32,7 +32,7 @@ Quellen verwalten Parameter bearbeiten Dateierweiterungen bearbeiten, benutze "|" als Trennsymbol. (z.B. lnk|cbr) - Verzeichnis zu den .nfo Dateien + Verzeichnis zu den Dateien Verzeichnis zu den Vorschaubildern Verzeichnis zu den Fanbildern Verzeichnis zu den extra Fanbildern @@ -180,7 +180,7 @@ Aus %s (%s) importieren Importiere aus %s: %s Größe Erweiterte Einstellungen - Verzeichnis zu den .nfo Dateien: %s + Verzeichnis zu den Dateien: %s Verzeichnis zu den Vorschaubildern: %s Verzeichnis zu den Fanbildern: %s Anwendung: %s From f79b51f7cb5f48bb7612e667a8d6c26ffbec373e Mon Sep 17 00:00:00 2001 From: angelscry Date: Sat, 9 Nov 2013 13:24:27 -0500 Subject: [PATCH 46/80] . Update German translation (thanks to mbroemme). . Fix GameFAQs scrapers (gamesystem list update). . Remove MobyGames scraper (until it will work correctly). --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 7 + .../scrapers/datas/MobyGames/__init__.py | 1 - .../scrapers/datas/MobyGames/datas_scraper.py | 129 ---------- .../scrapers/fanarts/MobyGames/__init__.py | 1 - .../fanarts/MobyGames/fanarts_scraper.py | 60 ----- resources/scrapers/gamesys | 229 +++++++++--------- .../scrapers/thumbs/MobyGames/__init__.py | 1 - .../thumbs/MobyGames/thumbs_scraper.py | 74 ------ 10 files changed, 124 insertions(+), 382 deletions(-) delete mode 100644 resources/scrapers/datas/MobyGames/__init__.py delete mode 100644 resources/scrapers/datas/MobyGames/datas_scraper.py delete mode 100644 resources/scrapers/fanarts/MobyGames/__init__.py delete mode 100644 resources/scrapers/fanarts/MobyGames/fanarts_scraper.py delete mode 100644 resources/scrapers/thumbs/MobyGames/__init__.py delete mode 100644 resources/scrapers/thumbs/MobyGames/thumbs_scraper.py diff --git a/addon.py b/addon.py index efcd5d2..d3141ec 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.0.13" +__version__ = "2.0.15" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 43f8b1a..182d9d6 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 62a5fac..5b6f42c 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,10 @@ +[B]2.0.15[/B] +. Update German translation (thanks to mbroemme). + +[B]2.0.14[/B] +. Fix GameFAQs scrapers (gamesystem list update). +. Remove MobyGames scraper (until it will work correctly). + [B]2.0.13[/B] . Fix TheGameDB scrapers (info, thumbs and fanarts). diff --git a/resources/scrapers/datas/MobyGames/__init__.py b/resources/scrapers/datas/MobyGames/__init__.py deleted file mode 100644 index ee074ac..0000000 --- a/resources/scrapers/datas/MobyGames/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# Dummy file to make this directory a package. diff --git a/resources/scrapers/datas/MobyGames/datas_scraper.py b/resources/scrapers/datas/MobyGames/datas_scraper.py deleted file mode 100644 index ed6ca96..0000000 --- a/resources/scrapers/datas/MobyGames/datas_scraper.py +++ /dev/null @@ -1,129 +0,0 @@ -# -*- coding: UTF-8 -*- - -import re -import os -import urllib,urllib2 -from xbmcaddon import Addon - -# Return Game search list -def _get_games_list(search): - results = [] - display = [] - try: - f = urllib2.urlopen('http://www.mobygames.com/search/quick?q='+search.replace(' ','+')+'&sFilter=1&sG=on') - req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') - for line in f.readlines(): - if 'searchNumber' in line: - split_games = re.findall('Game: (.*?)', line) - for games in split_games: - game_title = re.findall('(.*?)', games) - split_versions = re.findall('nowrap">(.*?) ', games) - if split_versions: - for version in split_versions: - game = {} - game["title"] = unescape(game_title[0][1]) - game["id"] = 'http://www.mobygames.com'+version[0] - game["gamesys"] = version[1] - results.append(game) - display.append(game["title"]+" / "+game["gamesys"]) - else: - game = {} - game["title"] = unescape(game_title[0][1].replace('&','&').replace(''',"'")) - one_version = re.findall('nowrap">(.*?) \(', games) - game["id"] = 'http://www.mobygames.com'+game_title[0][0] - game["gamesys"] = one_version[0] - results.append(game) - display.append(game["title"]+" / "+game["gamesys"]) - return results,display - except: - return results,display - -# Return 1st Game search -def _get_first_game(search,gamesys): - platform = _system_conversion(gamesys) - results = [] - try: - f = urllib.urlopen('http://www.mobygames.com/search/quick?q='+search.replace(' ','+')+'&p='+platform+'&sFilter=1&sG=on') - for line in f.readlines(): - if 'searchNumber' in line: - split_games = re.findall('Game: (.*?)', line) - for games in split_games: - game_title = re.findall('(.*?)', games) - split_versions = re.findall('nowrap">(.*?) ', games) - if split_versions: - for version in split_versions: - game = {} - game["title"] = unescape(game_title[0][1]) - game["id"] = 'http://www.mobygames.com'+version[0] - game["gamesys"] = gamesys - results.append(game) - else: - game = {} - game["title"] = unescape(game_title[0][1]) - one_version = re.findall('nowrap">(.*?) \(', games) - game["id"] = 'http://www.mobygames.com'+game_title[0][0] - game["gamesys"] = gamesys - results.append(game) - return results - except: - return results - -# Return Game data -def _get_game_data(game_url): - gamedata = {} - gamedata["genre"] = "" - gamedata["release"] = "" - gamedata["studio"] = "" - gamedata["plot"] = "" - try: - f = urllib.urlopen(game_url) - page = f.read().replace('\r\n', '').replace('\n', '') - game_genre = re.findall('(.*?)', page) - if game_genre: - gamedata["genre"] = unescape(game_genre[0][1]) - game_release = re.findall('/release-info">(.*?)', page) - if game_release: - gamedata["release"] = game_release[1][-4:] - game_studio = re.findall('Developed by(.*?)(.*?)', page) - if game_studio: - gamedata["studio"] = unescape(game_studio[0][2]) - game_plot = re.findall('Description(.*?)

') - gamedata["plot"] = unescape(p.sub('', game_plot[0])) - return gamedata - except: - return gamedata - -# Game systems DB identification -def _system_conversion(system_id): - try: - rootDir = Addon( id="plugin.program.advanced.launcher" ).getAddonInfo('path') - if rootDir[-1] == ';':rootDir = rootDir[0:-1] - resDir = os.path.join(rootDir, 'resources') - scrapDir = os.path.join(resDir, 'scrapers') - csvfile = open( os.path.join(scrapDir, 'gamesys'), "rb") - conversion = [] - for line in csvfile.readlines(): - result = line.replace('\n', '').replace('"', '').split(',') - if result[0].lower() == system_id.lower(): - if result[3]: - platform = result[3] - return platform - except: - return '' - -def unescape(s): - s = s.replace('
',' ') - s = s.replace("<", "<") - s = s.replace(">", ">") - s = s.replace("&", "&") - s = s.replace("'","'") - s = s.replace('
',' ') - s = s.replace('"','"') - s = s.replace(' ',' ') - s = s.replace('&','&') - s = s.replace(''',"'") - s = s.replace('°',"°") - return s - diff --git a/resources/scrapers/fanarts/MobyGames/__init__.py b/resources/scrapers/fanarts/MobyGames/__init__.py deleted file mode 100644 index ee074ac..0000000 --- a/resources/scrapers/fanarts/MobyGames/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# Dummy file to make this directory a package. diff --git a/resources/scrapers/fanarts/MobyGames/fanarts_scraper.py b/resources/scrapers/fanarts/MobyGames/fanarts_scraper.py deleted file mode 100644 index dbddf27..0000000 --- a/resources/scrapers/fanarts/MobyGames/fanarts_scraper.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: UTF-8 -*- - -import os -import re -import urllib -from xbmcaddon import Addon - -# Get Game first page -def _get_game_page_url(system,search): - platform = _system_conversion(system) - params = urllib.urlencode({'q': search.replace(' ','+'), 'p': platform, 'sFilter': '1', 'sG': 'on'}) - games = [] - try: - search_page = urllib.urlopen('http://www.mobygames.com/search/quick', params) - for line in search_page.readlines(): - if 'searchNumber' in line: - games.append(re.findall('Game: (.*?) : (.*?) (.*?)href=(.*?) Date: Thu, 5 Dec 2013 19:41:18 -0500 Subject: [PATCH 47/80] Update launchers.xml file format. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 + resources/lib/launcher_plugin.py | 116 +++++++++++++++++-------------- 4 files changed, 68 insertions(+), 55 deletions(-) diff --git a/addon.py b/addon.py index d3141ec..1b31058 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.0.15" +__version__ = "2.1.0" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 182d9d6..0434536 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 5b6f42c..60145d4 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.1.0[/B] +. Update launchers.xml file format. + [B]2.0.15[/B] . Update German translation (thanks to mbroemme). diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 53cc066..2433e95 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -87,6 +87,7 @@ def __language__(string): SEARCH_PLATFORM_COMMAND = "%%SEARCH_PLATFORM%%" SEARCH_STUDIO_COMMAND = "%%SEARCH_STUDIO%%" SEARCH_GENRE_COMMAND = "%%SEARCH_GENRE%%" +SCAN_NEW_ITEM_COMMAND = "%%SCAN_NEW_ITEM%%" class Main: BASE_CACHE_PATH = xbmc.translatePath(os.path.join( "special://profile/Thumbnails", "Pictures" )) @@ -109,6 +110,7 @@ class Main: /category/launcher/%%GET_THUMB%% - get launcher thumb from configured scraper /category/launcher/%%GET_FANART%% - get launcher fanart from configured scraper /category/launcher/%%REMOVE%% - remove the launcher + /category/launcher/%%SCAN_NEW_ITEM%% - scan launcher folder for new item /category/launcher/%%ADD%% - add a new rom (open wizard) /category/launcher/rom - run the specifiec rom using it's launcher. ignore command if doesn't exists. @@ -192,6 +194,8 @@ def __init__( self, *args, **kwargs ): self._scrap_thumb_launcher(launcher) elif (rom == GET_FANART): self._scrap_fanart_launcher(launcher) + elif (category == SCAN_NEW_ITEM_COMMAND): + self._import_roms(launcher, addRoms = False) elif (rom == ADD_COMMAND): self._add_roms(launcher) else: @@ -240,6 +244,10 @@ def __init__( self, *args, **kwargs ): category = command_part[0] self._print_log(__language__( 30740 ) % category) + if (category == SCAN_NEW_ITEM_COMMAND): + print self._path + print self._handle + self._find_roms() if (category == SEARCH_COMMAND): self._find_roms() elif (category == FILE_MANAGER_COMMAND): @@ -1872,68 +1880,70 @@ def _save_launchers (self): try: usock = open( TEMP_CURRENT_SOURCE_PATH, 'w' ) usock.write("\n") + usock.write("\n") # Create Categories XML list - usock.write("\n") + usock.write("\t\n") for categoryIndex in sorted(self.categories, key= lambda x : self.categories[x]["name"]): category = self.categories[categoryIndex] - usock.write("\t\n") - usock.write("\t\t"+categoryIndex+"\n") - usock.write("\t\t"+category["name"]+"\n") - usock.write("\t\t"+category["thumb"]+"\n") - usock.write("\t\t"+category["fanart"]+"\n") - usock.write("\t\t"+category["genre"]+"\n") - usock.write("\t\t"+category["plot"]+"\n") - usock.write("\t\n") - usock.write("\n") + usock.write("\t\t\n") + usock.write("\t\t\t"+categoryIndex+"\n") + usock.write("\t\t\t"+category["name"]+"\n") + usock.write("\t\t\t"+category["thumb"]+"\n") + usock.write("\t\t\t"+category["fanart"]+"\n") + usock.write("\t\t\t"+category["genre"]+"\n") + usock.write("\t\t\t"+category["plot"]+"\n") + usock.write("\t\t\n") + usock.write("\t\n") # Create Launchers XML list - usock.write("\n") + usock.write("\t\n") for launcherIndex in sorted(self.launchers, key= lambda x : self.launchers[x]["name"]): launcher = self.launchers[launcherIndex] - usock.write("\t\n") - usock.write("\t\t"+launcherIndex+"\n") - usock.write("\t\t"+launcher["name"]+"\n") - usock.write("\t\t"+launcher["category"]+"\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["thumbpath"]+"\n") - usock.write("\t\t"+launcher["fanartpath"]+"\n") - usock.write("\t\t"+launcher["trailerpath"]+"\n") - usock.write("\t\t"+launcher["custompath"]+"\n") - usock.write("\t\t"+launcher["romext"]+"\n") - usock.write("\t\t"+launcher["gamesys"]+"\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["studio"]+"\n") - usock.write("\t\t"+launcher["plot"]+"\n") - usock.write("\t\t"+launcher["finished"]+"\n") - usock.write("\t\t"+launcher["minimize"]+"\n") - usock.write("\t\t"+launcher["lnk"]+"\n") + usock.write("\t\t\n") + usock.write("\t\t\t"+launcherIndex+"\n") + usock.write("\t\t\t"+launcher["name"]+"\n") + usock.write("\t\t\t"+launcher["category"]+"\n") + usock.write("\t\t\t"+launcher["application"]+"\n") + usock.write("\t\t\t"+launcher["args"]+"\n") + usock.write("\t\t\t"+launcher["rompath"]+"\n") + usock.write("\t\t\t"+launcher["thumbpath"]+"\n") + usock.write("\t\t\t"+launcher["fanartpath"]+"\n") + usock.write("\t\t\t"+launcher["trailerpath"]+"\n") + usock.write("\t\t\t"+launcher["custompath"]+"\n") + usock.write("\t\t\t"+launcher["romext"]+"\n") + usock.write("\t\t\t"+launcher["gamesys"]+"\n") + usock.write("\t\t\t"+launcher["thumb"]+"\n") + usock.write("\t\t\t"+launcher["fanart"]+"\n") + usock.write("\t\t\t"+launcher["genre"]+"\n") + usock.write("\t\t\t"+launcher["release"]+"\n") + usock.write("\t\t\t"+launcher["studio"]+"\n") + usock.write("\t\t\t"+launcher["plot"]+"\n") + usock.write("\t\t\t"+launcher["finished"]+"\n") + usock.write("\t\t\t"+launcher["minimize"]+"\n") + usock.write("\t\t\t"+launcher["lnk"]+"\n") # Create Items XML list - usock.write("\t\t\n") + usock.write("\t\t\t\n") for romIndex in sorted(launcher["roms"], key= lambda x : launcher["roms"][x]["name"]): romdata = launcher["roms"][romIndex] - usock.write("\t\t\t\n") - usock.write("\t\t\t\t"+romIndex+"\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["trailer"]+"\n") - usock.write("\t\t\t\t"+romdata["custom"]+"\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["studio"]+"\n") - usock.write("\t\t\t\t"+romdata["plot"]+"\n") - usock.write("\t\t\t\t"+romdata["finished"]+"\n") - usock.write("\t\t\t\t"+romdata["altapp"]+"\n") - usock.write("\t\t\t\t"+romdata["altarg"]+"\n") - usock.write("\t\t\t\n") - usock.write("\t\t\n") - usock.write("\t\n") - usock.write("") + usock.write("\t\t\t\t\n") + usock.write("\t\t\t\t\t"+romIndex+"\n") + usock.write("\t\t\t\t\t"+romdata["name"]+"\n") + usock.write("\t\t\t\t\t"+romdata["filename"]+"\n") + usock.write("\t\t\t\t\t"+romdata["thumb"]+"\n") + usock.write("\t\t\t\t\t"+romdata["fanart"]+"\n") + usock.write("\t\t\t\t\t"+romdata["trailer"]+"\n") + usock.write("\t\t\t\t\t"+romdata["custom"]+"\n") + usock.write("\t\t\t\t\t"+romdata["genre"]+"\n") + usock.write("\t\t\t\t\t"+romdata["release"]+"\n") + usock.write("\t\t\t\t\t"+romdata["studio"]+"\n") + usock.write("\t\t\t\t\t"+romdata["plot"]+"\n") + usock.write("\t\t\t\t\t"+romdata["finished"]+"\n") + usock.write("\t\t\t\t\t"+romdata["altapp"]+"\n") + usock.write("\t\t\t\t\t"+romdata["altarg"]+"\n") + usock.write("\t\t\t\t\n") + usock.write("\t\t\t\n") + usock.write("\t\t\n") + usock.write("\t\n") + usock.write("") usock.close() try: shutil.copy2(TEMP_CURRENT_SOURCE_PATH, BASE_CURRENT_SOURCE_PATH) From c62e994d1f2ef622dfbc2fe543f3108026e7492a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Thu, 5 Dec 2013 20:13:24 -0500 Subject: [PATCH 48/80] Fix launchers.xml file creation bug into root. --- resources/lib/launcher_plugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 2433e95..0d0ba4b 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -1880,7 +1880,7 @@ def _save_launchers (self): try: usock = open( TEMP_CURRENT_SOURCE_PATH, 'w' ) usock.write("\n") - usock.write("\n") + usock.write("\n") # Create Categories XML list usock.write("\t\n") for categoryIndex in sorted(self.categories, key= lambda x : self.categories[x]["name"]): @@ -1943,7 +1943,7 @@ def _save_launchers (self): usock.write("\t\t\t\n") usock.write("\t\t\n") usock.write("\t\n") - usock.write("") + usock.write("") usock.close() try: shutil.copy2(TEMP_CURRENT_SOURCE_PATH, BASE_CURRENT_SOURCE_PATH) From cb77493aa99da01185f6b5e790d9ad8b32779f9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Mon, 16 Dec 2013 20:41:25 -0500 Subject: [PATCH 49/80] . Add an option to directly open Advanced Launcher into default category. . Update launchers.xml file format. . Update french translation --- changelog.txt | 2 ++ resources/language/English/strings.xml | 1 + resources/language/French/strings.xml | 15 +++++++++++++++ resources/lib/launcher_plugin.py | 7 +++++-- resources/settings.xml | 1 + 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/changelog.txt b/changelog.txt index 60145d4..fe301d1 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,7 @@ [B]2.1.0[/B] +. Add an option to directly open Advanced Launcher into default category. . Update launchers.xml file format. +. Update french translation. [B]2.0.15[/B] . Update German translation (thanks to mbroemme). diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 83476fb..84f872a 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -146,6 +146,7 @@ Merger Launcher start options Add New Launcher + Directly open Advanced Launcher into default category default experienced users diff --git a/resources/language/French/strings.xml b/resources/language/French/strings.xml index c9e3efe..2a7d8e8 100644 --- a/resources/language/French/strings.xml +++ b/resources/language/French/strings.xml @@ -123,6 +123,21 @@ Captures d'écran Flyers Régler le délais du lanceur (ms) + Options de sauvegarde + Activer la sauvegarde automatique + Avancé + Nombre de sauvegardes à conserver + Importer un fichier XML (restaurer une sauvegarde) + Choisir le fichier XML à importer + Afficher les logs d'Advanced Launcher dans xbmc.log + Options d'affichage + Cacher la catégorie "Default" + Fusionner un fichier XML (joindre les listes de lanceurs) + Choisir le fichier XML à fusionner + Fusionner + Option de démarrage des lanceurs + Ajouter un nouveau lanceur + Ouvrir Advanced Launcher directement dans la catégorie "Default" défaut Utilisateurs expérimentés diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 0d0ba4b..9757632 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -268,7 +268,6 @@ def __init__( self, *args, **kwargs ): self._add_new_launcher(category) else: self._get_launchers(category) - else: self._print_log(__language__( 30739 )) if (len(self.categories) == 0): @@ -281,7 +280,10 @@ def __init__( self, *args, **kwargs ): self._save_launchers() self._get_launchers('default') else: - self._get_categories() + if (self.settings[ "open_default_cat" ] ): + self._get_launchers('default') + else: + self._get_categories() def _empty_cat(self, categoryID): empty_category = True @@ -1655,6 +1657,7 @@ def _get_settings( self ): self.settings[ "nb_backup_files" ] = int(round(float(__settings__.getSetting( "nb_backup_files" )))) self.settings[ "show_log" ] = ( __settings__.getSetting( "show_log" ) == "true" ) self.settings[ "hide_default_cat" ] = ( __settings__.getSetting( "hide_default_cat" ) == "true" ) + self.settings[ "open_default_cat" ] = ( __settings__.getSetting( "open_default_cat" ) == "true" ) def _print_log(self,string): if (self.settings[ "show_log" ]): diff --git a/resources/settings.xml b/resources/settings.xml index 59c7042..0401ce8 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -48,6 +48,7 @@ + From 6f30da57d9310468dd64de79ec09557cfd3c1803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Tue, 24 Dec 2013 14:48:11 -0500 Subject: [PATCH 50/80] Rewrite launchers.xml load/save functions. --- addon.py | 2 +- addon.xml | 4 +- changelog.txt | 4 + resources/lib/launcher_plugin.py | 338 ++++++------------------------- 4 files changed, 65 insertions(+), 283 deletions(-) diff --git a/addon.py b/addon.py index 1b31058..8dfafd3 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.1.0" +__version__ = "2.2.0" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 0434536..e99bb23 100644 --- a/addon.xml +++ b/addon.xml @@ -1,7 +1,7 @@  - + - + diff --git a/changelog.txt b/changelog.txt index fe301d1..102d00c 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,7 @@ +[B]2.2.0[/B] +. Rewrite launchers.xml load/save functions. +. Change python dependence to version 2.1. + [B]2.1.0[/B] . Add an option to directly open Advanced Launcher into default category. . Update launchers.xml file format. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 9757632..3b7056a 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -26,7 +26,6 @@ import re import urllib, urllib2 import subprocess_hack -import xml.dom.minidom import socket import exceptions @@ -71,6 +70,7 @@ def __language__(string): DEFAULT_BACKUP_PATH = os.path.join( PLUGIN_DATA_PATH , "backups" ) if not os.path.exists(DEFAULT_BACKUP_PATH): os.makedirs(DEFAULT_BACKUP_PATH) + REMOVE_COMMAND = "%%REMOVE%%" BACKUP_COMMAND = "%%BACKUP%%" APPEND_COMMAND = "%%APPEND%%" @@ -1858,11 +1858,11 @@ def get_xml_source( self, xmlpath ): def _save_launchers (self): xbmc.executebuiltin( "ActivateWindow(busydialog)" ) - # make settings directory if doesn't exists - if (not os.path.isdir(os.path.dirname(TEMP_CURRENT_SOURCE_PATH))): - os.makedirs(os.path.dirname(TEMP_CURRENT_SOURCE_PATH)) + # Create add-on userdata directory if do not exist + if (not os.path.isdir(PLUGIN_DATA_PATH)): + os.makedirs(PLUGIN_DATA_PATH) if ( self.settings[ "auto_backup" ] ): - # delete old backup files + # Delete oldest backup file fileData = {} dirList=os.listdir(DEFAULT_BACKUP_PATH) for fname in dirList: @@ -1871,7 +1871,7 @@ def _save_launchers (self): delete = len(sortedFiles) - self.settings[ "nb_backup_files" ] + 1 for x in range(0, delete): os.remove(os.path.join( DEFAULT_BACKUP_PATH,sortedFiles[x][0])) - # make current launchers.xml backup + # Make a backup of current launchers.xml file if ( os.path.isfile(BASE_CURRENT_SOURCE_PATH)): try: now = datetime.datetime.now() @@ -1881,77 +1881,32 @@ def _save_launchers (self): except OSError: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30600 ))) try: - usock = open( TEMP_CURRENT_SOURCE_PATH, 'w' ) - usock.write("\n") - usock.write("\n") + xml_content = "\n\n\t\n" # Create Categories XML list - usock.write("\t\n") for categoryIndex in sorted(self.categories, key= lambda x : self.categories[x]["name"]): category = self.categories[categoryIndex] - usock.write("\t\t\n") - usock.write("\t\t\t"+categoryIndex+"\n") - usock.write("\t\t\t"+category["name"]+"\n") - usock.write("\t\t\t"+category["thumb"]+"\n") - usock.write("\t\t\t"+category["fanart"]+"\n") - usock.write("\t\t\t"+category["genre"]+"\n") - usock.write("\t\t\t"+category["plot"]+"\n") - usock.write("\t\t\n") - usock.write("\t\n") + xml_content += "\t\t\n\t\t\t"+categoryIndex+"\n\t\t\t"+category["name"]+"\n\t\t\t"+category["thumb"]+"\n\t\t\t"+category["fanart"]+"\n\t\t\t"+category["genre"]+"\n\t\t\t"+category["plot"]+"\n\t\t\n" + xml_content += "\t\n\t\n" # Create Launchers XML list - usock.write("\t\n") for launcherIndex in sorted(self.launchers, key= lambda x : self.launchers[x]["name"]): launcher = self.launchers[launcherIndex] - usock.write("\t\t\n") - usock.write("\t\t\t"+launcherIndex+"\n") - usock.write("\t\t\t"+launcher["name"]+"\n") - usock.write("\t\t\t"+launcher["category"]+"\n") - usock.write("\t\t\t"+launcher["application"]+"\n") - usock.write("\t\t\t"+launcher["args"]+"\n") - usock.write("\t\t\t"+launcher["rompath"]+"\n") - usock.write("\t\t\t"+launcher["thumbpath"]+"\n") - usock.write("\t\t\t"+launcher["fanartpath"]+"\n") - usock.write("\t\t\t"+launcher["trailerpath"]+"\n") - usock.write("\t\t\t"+launcher["custompath"]+"\n") - usock.write("\t\t\t"+launcher["romext"]+"\n") - usock.write("\t\t\t"+launcher["gamesys"]+"\n") - usock.write("\t\t\t"+launcher["thumb"]+"\n") - usock.write("\t\t\t"+launcher["fanart"]+"\n") - usock.write("\t\t\t"+launcher["genre"]+"\n") - usock.write("\t\t\t"+launcher["release"]+"\n") - usock.write("\t\t\t"+launcher["studio"]+"\n") - usock.write("\t\t\t"+launcher["plot"]+"\n") - usock.write("\t\t\t"+launcher["finished"]+"\n") - usock.write("\t\t\t"+launcher["minimize"]+"\n") - usock.write("\t\t\t"+launcher["lnk"]+"\n") + xml_content += "\t\t\n\t\t\t"+launcherIndex+"\n\t\t\t"+launcher["name"]+"\n\t\t\t"+launcher["category"]+"\n\t\t\t"+launcher["application"]+"\n\t\t\t"+launcher["args"]+"\n\t\t\t"+launcher["rompath"]+"\n\t\t\t"+launcher["thumbpath"]+"\n\t\t\t"+launcher["fanartpath"]+"\n\t\t\t"+launcher["trailerpath"]+"\n\t\t\t"+launcher["custompath"]+"\n\t\t\t"+launcher["romext"]+"\n\t\t\t"+launcher["gamesys"]+"\n\t\t\t"+launcher["thumb"]+"\n\t\t\t"+launcher["fanart"]+"\n\t\t\t"+launcher["genre"]+"\n\t\t\t"+launcher["release"]+"\n\t\t\t"+launcher["studio"]+"\n\t\t\t"+launcher["plot"]+"\n\t\t\t"+launcher["finished"]+"\n\t\t\t"+launcher["minimize"]+"\n\t\t\t"+launcher["lnk"]+"\n\t\t\t\n" # Create Items XML list - usock.write("\t\t\t\n") for romIndex in sorted(launcher["roms"], key= lambda x : launcher["roms"][x]["name"]): romdata = launcher["roms"][romIndex] - usock.write("\t\t\t\t\n") - usock.write("\t\t\t\t\t"+romIndex+"\n") - usock.write("\t\t\t\t\t"+romdata["name"]+"\n") - usock.write("\t\t\t\t\t"+romdata["filename"]+"\n") - usock.write("\t\t\t\t\t"+romdata["thumb"]+"\n") - usock.write("\t\t\t\t\t"+romdata["fanart"]+"\n") - usock.write("\t\t\t\t\t"+romdata["trailer"]+"\n") - usock.write("\t\t\t\t\t"+romdata["custom"]+"\n") - usock.write("\t\t\t\t\t"+romdata["genre"]+"\n") - usock.write("\t\t\t\t\t"+romdata["release"]+"\n") - usock.write("\t\t\t\t\t"+romdata["studio"]+"\n") - usock.write("\t\t\t\t\t"+romdata["plot"]+"\n") - usock.write("\t\t\t\t\t"+romdata["finished"]+"\n") - usock.write("\t\t\t\t\t"+romdata["altapp"]+"\n") - usock.write("\t\t\t\t\t"+romdata["altarg"]+"\n") - usock.write("\t\t\t\t\n") - usock.write("\t\t\t\n") - usock.write("\t\t\n") - usock.write("\t\n") - usock.write("") + xml_content += "\t\t\t\t\n\t\t\t\t\t"+romIndex+"\n\t\t\t\t\t"+romdata["name"]+"\n\t\t\t\t\t"+romdata["filename"]+"\n\t\t\t\t\t"+romdata["thumb"]+"\n\t\t\t\t\t"+romdata["fanart"]+"\n\t\t\t\t\t"+romdata["trailer"]+"\n\t\t\t\t\t"+romdata["custom"]+"\n\t\t\t\t\t"+romdata["genre"]+"\n\t\t\t\t\t"+romdata["release"]+"\n\t\t\t\t\t"+romdata["studio"]+"\n\t\t\t\t\t"+romdata["plot"]+"\n\t\t\t\t\t"+romdata["finished"]+"\n\t\t\t\t\t"+romdata["altapp"]+"\n\t\t\t\t\t"+romdata["altarg"]+"\n\t\t\t\t\n" + xml_content += "\t\t\t\n\t\t\n" + xml_content += "\t\n" + + # Save launchers.tmp file + usock = open( TEMP_CURRENT_SOURCE_PATH, 'w' ) + usock.write(xml_content) usock.close() try: shutil.copy2(TEMP_CURRENT_SOURCE_PATH, BASE_CURRENT_SOURCE_PATH) except OSError: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30601 ))) + except OSError: xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30602 ))) except IOError: @@ -1968,227 +1923,50 @@ def _append_launchers(self, xmlfile): os.remove(MERGED_SOURCE_PATH) xbmc.executebuiltin("Container.Refresh") - ''' read the list of categories, launchers and roms from launchers.xml file ''' def _load_launchers(self, xmlSource): - need_update = 0 # clean, save and return the xml string - xmlSource = xmlSource.replace("&", "&") - - categories = re.findall( "(.*?)", xmlSource ) - - if len(categories) > 0 : + xmlSource = xmlSource.replace("&", "&").replace('\r','').replace('\n','').replace('\t','') + # Get categories list from XML source + xml_categories = re.findall( "(.*?)", xmlSource ) + # If categories exist ()... + if len(xml_categories) > 0 : + categories = re.findall( "(.*?)", xml_categories[0] ) for category in categories: - categoryid = re.findall( "(.*?)", category ) - categoryname = re.findall( "(.*?)", category ) - categorythumb = re.findall( "(.*?)", category ) - categoryfanart = re.findall( "(.*?)", category ) - categorygenre = re.findall( "(.*?)", category ) - categoryplot = re.findall( "(.*?)", category ) - - if len(categoryid) > 0 : categoryid = categoryid[0] - else: categoryid = "default" - if len(categoryname) > 0 : categoryname = categoryname[0] - else: categoryname = "Default" - if len(categorythumb) > 0: categorythumb = categorythumb[0] - else: categorythumb = "" - if len(categoryfanart) > 0: categoryfanart = categoryfanart[0] - else: categoryfanart = "" - if len(categorygenre) > 0: categorygenre = categorygenre[0] - else: categorygenre = "" - if len(categoryplot) > 0: categoryplot = categoryplot[0] - else: categoryplot = "" - categorydata = {} - categorydata["id"] = categoryid - categorydata["name"] = categoryname - categorydata["thumb"] = categorythumb - categorydata["fanart"] = categoryfanart - categorydata["genre"] = categorygenre - categorydata["plot"] = categoryplot - self.categories[categoryid] = categorydata + category_index = ["id","name","thumb","fanart","genre","plot"] + values = re.findall( "(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)", category) + for index, n in enumerate(category_index): + categorydata[n] = values[0][index] + self.categories[categorydata["id"]] = categorydata + # Else create the default category else: - categorydata = {} - categorydata["id"] = "default" - categorydata["name"] = "Default" - categorydata["thumb"] = "" - categorydata["fanart"] = "" - categorydata["genre"] = "" - categorydata["plot"] = "" - self.categories["default"] = categorydata - - launchers = re.findall( "(.*?)", xmlSource ) - for launcher in launchers: - launcherid = re.findall( "(.*?)", launcher ) - name = re.findall( "(.*?)", launcher ) - category = re.findall( "(.*?)", launcher ) - application = re.findall( "(.*?)", launcher ) - args = re.findall( "(.*?)", launcher ) - rompath = re.findall( "(.*?)", launcher ) - thumbpath = re.findall( "(.*?)", launcher ) - fanartpath = re.findall( "(.*?)", launcher ) - trailerpath = re.findall( "(.*?)", launcher ) - custompath = re.findall( "(.*?)", launcher ) - romext = re.findall( "(.*?)", launcher ) - gamesys = re.findall( "(.*?)", launcher ) - thumb = re.findall( "(.*?)", launcher ) - fanart = re.findall( "(.*?)", launcher ) - genre = re.findall( "(.*?)", launcher ) - release = re.findall( "(.*?)", launcher ) - studio = re.findall( "(.*?)", launcher ) - plot = re.findall( "(.*?)", launcher ) - lnk = re.findall( "(.*?)", launcher ) - finished = re.findall( "(.*?)", launcher ) - minimize = re.findall( "(.*?)", launcher ) - romsxml = re.findall( "(.*?)", launcher ) - - if len(launcherid) > 0 : launcherid = launcherid[0] - else: - launcherid = _get_SID() - need_update = 1 - # replace comma by single low-9 quotation mark - if len(name) > 0 : name = name[0] - else: name = "unknown" - if len(category) > 0 : category = category[0] - else: category = "default" - 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(thumbpath) > 0 : thumbpath = thumbpath[0] - else: thumbpath = "" - if len(fanartpath) > 0 : fanartpath = fanartpath[0] - else: fanartpath = "" - if len(trailerpath) > 0 : trailerpath = trailerpath[0] - else: trailerpath = "" - if len(custompath) > 0 : custompath = custompath[0] - else: custompath = "" - if len(romext) > 0: romext = romext[0] - else: romext = "" - if len(gamesys) > 0: gamesys = gamesys[0] - else: gamesys = "" - 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(studio) > 0: studio = studio[0] - else: studio = "" - if len(plot) > 0: plot = plot[0] - else: plot = "" - if len(finished) > 0: finished = finished[0] - else: finished = "false" - if len(lnk) > 0: lnk = lnk[0] - else: - if (sys.platform == 'win32'): - lnk = "true" - else: - lnk = "" - if len(minimize) > 0: minimize = minimize[0] - else: minimize = "false" - - roms = {} - for rom in romsxml: - romid = re.findall( "(.*?)", rom ) - romname = re.findall( "(.*?)", rom ) - romfilename = re.findall( "(.*?)", rom ) - romthumb = re.findall( "(.*?)", rom ) - romfanart = re.findall( "(.*?)", rom ) - romtrailer = re.findall( "(.*?)", rom ) - romcustom = re.findall( "(.*?)", rom ) - romgenre = re.findall( "(.*?)", rom ) - romrelease = re.findall( "(.*?)", rom ) - romstudio = re.findall( "(.*?)", rom ) - romplot = re.findall( "(.*?)", rom ) - romfinished = re.findall( "(.*?)", rom ) - romaltapp = re.findall( "(.*?)", rom ) - romaltarg = re.findall( "(.*?)", rom ) - romgamesys = gamesys - - if len(romid) > 0 : romid = romid[0] - else: - romid = _get_SID() - need_update = 1 - 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(romtrailer) > 0 : romtrailer = romtrailer[0] - else: romtrailer = "" - if len(romcustom) > 0 : romcustom = romcustom[0] - else: romcustom = "" - if len(romgenre) > 0 : romgenre = romgenre[0] - else: romgenre = "" - if len(romrelease) > 0 : romrelease = romrelease[0] - else: romrelease = "" - if len(romstudio) > 0 : romstudio = romstudio[0] - else: romstudio = "" - if len(romplot) > 0 : romplot = romplot[0] - else: romplot = "" - if len(romfinished) > 0 : romfinished = romfinished[0] - else: romfinished = "false" - if len(romaltapp) > 0 : romaltapp = romaltapp[0] - else: romaltapp = "" - if len(romaltarg) > 0 : romaltarg = romaltarg[0] - else: romaltarg = "" - - # prepare rom object data - romdata = {} - romdata["name"] = romname - romdata["filename"] = romfilename - romdata["gamesys"] = romgamesys - romdata["thumb"] = romthumb - romdata["fanart"] = romfanart - romdata["trailer"] = romtrailer - romdata["custom"] = romcustom - romdata["genre"] = romgenre - romdata["release"] = romrelease - romdata["studio"] = romstudio - romdata["plot"] = romplot - romdata["finished"] = romfinished - romdata["altapp"] = romaltapp - romdata["altarg"] = romaltarg - - # add rom to the roms list (using id as index) - roms[romid] = romdata - - # prepare launcher object data - launcherdata = {} - launcherdata["name"] = name - launcherdata["category"] = category - launcherdata["application"] = application - launcherdata["args"] = args - launcherdata["rompath"] = rompath - launcherdata["thumbpath"] = thumbpath - launcherdata["fanartpath"] = fanartpath - launcherdata["trailerpath"] = trailerpath - launcherdata["custompath"] = custompath - launcherdata["romext"] = romext - launcherdata["gamesys"] = gamesys - launcherdata["thumb"] = thumb - launcherdata["fanart"] = fanart - launcherdata["genre"] = genre - launcherdata["release"] = release - launcherdata["studio"] = studio - launcherdata["plot"] = plot - launcherdata["finished"] = finished - launcherdata["lnk"] = lnk - launcherdata["minimize"] = minimize - launcherdata["roms"] = roms - - # add launcher to the launchers list (using id as index) - self.launchers[launcherid] = launcherdata - - if ( need_update == 1 ): - self._save_launchers() + self.categories["default"] = {"id":"default", "name":"Default", "thumb":"", "fanart":"", "genre":"", "plot":""} + # Get launchers list from XML source + xml_launchers = re.findall( "(.*?)", xmlSource ) + # If launchers exist ()... + if len(xml_launchers) > 0 : + launchers = re.findall( "(.*?)", xml_launchers[0] ) + for launcher in launchers: + launcherdata = {} + launcher_index = ["id","name","category","application","args","rompath","thumbpath","fanartpath","trailerpath","custompath","romext","gamesys","thumb","fanart","genre","release","studio","plot","lnk","finished","minimize","roms"] + values = re.findall( "(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)", launcher) + for index, n in enumerate(launcher_index): + launcherdata[n] = values[0][index] + # Get roms list from XML source + roms = re.findall( "(.*?)", launcherdata["roms"] ) + roms_list = {} + # If roms exist... + if len(roms) > 0 : + for rom in roms: + romdata = {} + rom_index = ["id","name","filename","thumb","fanart","trailer","custom","genre","release","studio","plot","finished","altapp","altarg"] + r_values = re.findall( "(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)", rom) + for r_index, r_n in enumerate(rom_index): + romdata[r_n] = r_values[0][r_index] + romdata["gamesys"] = launcherdata["gamesys"] + roms_list[romdata["id"]] = romdata + launcherdata["roms"] = roms_list + self.launchers[launcherdata["id"]] = launcherdata def _get_categories( self ): for key in sorted(self.categories, key= lambda x : self.categories[x]["name"]): @@ -2803,7 +2581,7 @@ def _add_new_category ( self ) : self.categories[categoryid] = categorydata self._save_launchers() xbmc.executebuiltin("Container.Refresh") - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30113 ) % categorydata["name"] )) + xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30113 ) % categorydata["name"])) return True else: return False From ec57a5521c59704d05bb98c98f00c07ab083f50c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Tue, 24 Dec 2013 15:39:13 -0500 Subject: [PATCH 51/80] Code cleaning. --- changelog.txt | 1 + resources/lib/launcher_plugin.py | 121 ++++++++----------------------- 2 files changed, 32 insertions(+), 90 deletions(-) diff --git a/changelog.txt b/changelog.txt index 102d00c..4de723c 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,6 @@ [B]2.2.0[/B] . Rewrite launchers.xml load/save functions. +. Code cleaning. . Change python dependence to version 2.1. [B]2.1.0[/B] diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 3b7056a..37db193 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -13,64 +13,44 @@ """ # -*- coding: UTF-8 -* -# main imports -import sys -import os -import fnmatch -import xbmc -import xbmcgui -import xbmcplugin - -import time, datetime -import math -import re -import urllib, urllib2 -import subprocess_hack -import socket -import exceptions - -import random +import sys, os, fnmatch, time, datetime, math, random, shutil +import re, urllib, urllib2, subprocess_hack, socket, exceptions from traceback import print_exc from operator import itemgetter -import shutil +import xbmc, xbmcgui, xbmcplugin +from xbmcaddon import Addon + +import subprocess_hack from user_agent import getUserAgent from file_item import Thumbnails -thumbnails = Thumbnails() +# Dharma compatibility (import md5) try: - # Eden & + compatible import hashlib except: - # Dharma compatible import md5 -from xbmcaddon import Addon +# Addon paths definition PLUGIN_DATA_PATH = xbmc.translatePath( os.path.join( "special://profile/addon_data", "plugin.program.advanced.launcher") ) -__settings__ = Addon( id="plugin.program.advanced.launcher" ) -__lang__ = __settings__.getLocalizedString - -def __language__(string): - return __lang__(string).encode('utf-8','ignore') - -# source path for launchers data BASE_PATH = xbmc.translatePath( os.path.join( "special://" , "profile" ) ) BASE_CURRENT_SOURCE_PATH = os.path.join( PLUGIN_DATA_PATH , "launchers.xml" ) TEMP_CURRENT_SOURCE_PATH = os.path.join( PLUGIN_DATA_PATH , "launchers.tmp" ) MERGED_SOURCE_PATH = os.path.join(PLUGIN_DATA_PATH , "merged-launchers.xml" ) - +DEFAULT_THUMB_PATH = os.path.join( PLUGIN_DATA_PATH , "thumbs" ) +DEFAULT_FANART_PATH = os.path.join( PLUGIN_DATA_PATH , "fanarts" ) +DEFAULT_NFO_PATH = os.path.join( PLUGIN_DATA_PATH , "nfos" ) +DEFAULT_BACKUP_PATH = os.path.join( PLUGIN_DATA_PATH , "backups" ) SHORTCUT_FILE = os.path.join( PLUGIN_DATA_PATH , "shortcut.cut" ) -DEFAULT_THUMB_PATH = os.path.join( PLUGIN_DATA_PATH , "thumbs" ) +# Addon paths creation if not os.path.exists(DEFAULT_THUMB_PATH): os.makedirs(DEFAULT_THUMB_PATH) -DEFAULT_FANART_PATH = os.path.join( PLUGIN_DATA_PATH , "fanarts" ) if not os.path.exists(DEFAULT_FANART_PATH): os.makedirs(DEFAULT_FANART_PATH) -DEFAULT_NFO_PATH = os.path.join( PLUGIN_DATA_PATH , "nfos" ) if not os.path.exists(DEFAULT_NFO_PATH): os.makedirs(DEFAULT_NFO_PATH) -DEFAULT_BACKUP_PATH = os.path.join( PLUGIN_DATA_PATH , "backups" ) if not os.path.exists(DEFAULT_BACKUP_PATH): os.makedirs(DEFAULT_BACKUP_PATH) +if not os.path.isdir(PLUGIN_DATA_PATH): os.makedirs(PLUGIN_DATA_PATH) - +# Addon commands REMOVE_COMMAND = "%%REMOVE%%" BACKUP_COMMAND = "%%BACKUP%%" APPEND_COMMAND = "%%APPEND%%" @@ -89,43 +69,22 @@ def __language__(string): SEARCH_GENRE_COMMAND = "%%SEARCH_GENRE%%" SCAN_NEW_ITEM_COMMAND = "%%SCAN_NEW_ITEM%%" +# Locales parameters +__settings__ = Addon( id="plugin.program.advanced.launcher" ) +__lang__ = __settings__.getLocalizedString + +def __language__(string): + return __lang__(string).encode('utf-8','ignore') + +# Main code + class Main: - BASE_CACHE_PATH = xbmc.translatePath(os.path.join( "special://profile/Thumbnails", "Pictures" )) launchers = {} categories = {} - ''' 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 can be any category, launcher or rom id created with the plugin) : - - /%%ADD%% - add a new category - /category - open the specific category (if exists) and browse its launchers. - /category/%%REMOVE%% - remove the category - - /category/%%ADD%% - add a new launcher (open wizard) - /category/launcher - open the specific launcher (if exists) and browse its roms. if the launcher is standalone - run it. - /category/launcher/%%GET_INFO%% - get launcher info from configured scraper - /category/launcher/%%GET_THUMB%% - get launcher thumb from configured scraper - /category/launcher/%%GET_FANART%% - get launcher fanart from configured scraper - /category/launcher/%%REMOVE%% - remove the launcher - /category/launcher/%%SCAN_NEW_ITEM%% - scan launcher folder for new item - - /category/launcher/%%ADD%% - add a new rom (open wizard) - /category/launcher/rom - run the specifiec rom using it's launcher. ignore command if doesn't exists. - /category/launcher/rom/%%GET_INFO%% - get rom info from configured scraper - /category/launcher/rom/%%GET_THUMB%% - get rom thumb from configured scraper - /category/launcher/rom/%%GET_FANART%% - get rom fanart from configured scraper - /category/launcher/rom/%%REMOVE%% - remove the rom - - (blank) - open a list of the available launchers. if no launcher exists - open the launcher creation wizard. - ''' - def __init__( self, *args, **kwargs ): # store an handle pointer self._handle = int(sys.argv[ 1 ]) - self._path = sys.argv[ 0 ] # get users preference @@ -245,8 +204,6 @@ def __init__( self, *args, **kwargs ): self._print_log(__language__( 30740 ) % category) if (category == SCAN_NEW_ITEM_COMMAND): - print self._path - print self._handle self._find_roms() if (category == SEARCH_COMMAND): self._find_roms() @@ -943,15 +900,9 @@ def _export_rom_nfo(self, launcher, rom): os.remove(nfo_file+".tmp") xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30087 ) % os.path.basename(nfo_file).encode('utf8','ignore'))) else: + nfo_content = "\n\t"+self.launchers[launcher]["roms"][rom]["name"]+"\n\t"+self.launchers[launcher]["roms"][rom]["gamesys"]+"\n\t"+self.launchers[launcher]["roms"][rom]["release"]+"\n\t"+self.launchers[launcher]["roms"][rom]["studio"]+"\n\t"+self.launchers[launcher]["roms"][rom]["genre"]+"\n\t"+self.launchers[launcher]["roms"][rom]["plot"]+"\n\n" usock = open( nfo_file, 'w' ) - usock.write("\n") - usock.write("\t"+self.launchers[launcher]["roms"][rom]["name"]+"\n") - usock.write("\t"+self.launchers[launcher]["roms"][rom]["gamesys"]+"\n") - usock.write("\t"+self.launchers[launcher]["roms"][rom]["release"]+"\n") - usock.write("\t"+self.launchers[launcher]["roms"][rom]["studio"]+"\n") - usock.write("\t"+self.launchers[launcher]["roms"][rom]["genre"]+"\n") - usock.write("\t"+self.launchers[launcher]["roms"][rom]["plot"]+"\n") - usock.write("\n") + usock.write(nfo_content) usock.close() xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30086 ) % os.path.basename(nfo_file).encode('utf8','ignore'))) @@ -1530,15 +1481,9 @@ def _export_launcher_nfo(self, launcherID): os.remove(nfo_file+".tmp") xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30087 ) % os.path.basename(nfo_file))) else: + nfo_content = "\n\t"+self.launchers[launcherID]["name"]+"\n\t"+self.launchers[launcherID]["gamesys"]+"\n\t"+self.launchers[launcherID]["release"]+"\n\t"+self.launchers[launcherID]["studio"]+"\n\t"+self.launchers[launcherID]["genre"]+"\n\t"+self.launchers[launcherID]["plot"]+"\n\n" usock = open( nfo_file, 'w' ) - usock.write("\n") - usock.write("\t"+self.launchers[launcherID]["name"]+"\n") - usock.write("\t"+self.launchers[launcherID]["gamesys"]+"\n") - usock.write("\t"+self.launchers[launcherID]["release"]+"\n") - usock.write("\t"+self.launchers[launcherID]["studio"]+"\n") - usock.write("\t"+self.launchers[launcherID]["genre"]+"\n") - usock.write("\t"+self.launchers[launcherID]["plot"]+"\n") - usock.write("\n") + usock.write(nfo_content) usock.close() xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30086 ) % os.path.basename(nfo_file))) @@ -1858,9 +1803,6 @@ def get_xml_source( self, xmlpath ): def _save_launchers (self): xbmc.executebuiltin( "ActivateWindow(busydialog)" ) - # Create add-on userdata directory if do not exist - if (not os.path.isdir(PLUGIN_DATA_PATH)): - os.makedirs(PLUGIN_DATA_PATH) if ( self.settings[ "auto_backup" ] ): # Delete oldest backup file fileData = {} @@ -2286,7 +2228,7 @@ def _import_roms(self, launcherID, addRoms = False): img_url = self._get_thumbnail(self.image_url) ret = pDialog.create(__language__( 30000 ), __language__( 30014 ) % (path)) pDialog.update(filesCount * 100 / len(files), __language__( 30061 ) % (f.replace("."+f.split(".")[-1],""),self.settings[ "datas_scraper" ].encode('utf-8','ignore'))) - cached_thumb = thumbnails.get_cached_covers_thumb( thumb ).replace("tbn" , "jpg") + cached_thumb = Thumbnails().get_cached_covers_thumb( thumb ).replace("tbn" , "jpg") if ( img_url !='' ): try: download_img(img_url,thumb) @@ -2341,7 +2283,7 @@ def _import_roms(self, launcherID, addRoms = False): img_url = self._get_fanart(self.image_url) ret = pDialog.create(__language__( 30000 ), __language__( 30014 ) % (path)) pDialog.update(filesCount * 100 / len(files), __language__( 30061 ) % (f.replace("."+f.split(".")[-1],""),self.settings[ "datas_scraper" ].encode('utf-8','ignore'))) - cached_thumb = thumbnails.get_cached_covers_thumb( fanart ).replace("tbn" , "jpg") + cached_thumb = Thumbnails().get_cached_covers_thumb( fanart ).replace("tbn" , "jpg") if ( img_url !='' ): try: download_img(img_url,fanart) @@ -2468,7 +2410,6 @@ def _add_rom( self, launcherID, name, cmd , romgamesys, thumb, romfanart, romtra commands.append((__language__( 30512 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, self.launchers[launcherID]["category"], launcherID, SEARCH_COMMAND) , )) commands.append(( __language__( 30107 ), "XBMC.RunPlugin(%s?%s/%s/%s/%s)" % (self._path, self.launchers[launcherID]["category"], launcherID, key, EDIT_COMMAND) , )) if search : - print search_url commands.append((__language__( 30513 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, self.launchers[launcherID]["category"], launcherID, SEARCH_COMMAND) , )) listitem.addContextMenuItems( commands ) if ( finished == "false" ) or ( self.settings[ "hide_finished" ] == False) : @@ -2873,7 +2814,7 @@ def MyDialog(img_list): del w def _update_cache(file_path): - cached_thumb = thumbnails.get_cached_covers_thumb( file_path ).replace("tbn" , os.path.splitext(file_path)[-1][1:4]) + cached_thumb = Thumbnails().get_cached_covers_thumb( file_path ).replace("tbn" , os.path.splitext(file_path)[-1][1:4]) try: shutil.copy2( file_path.decode(sys.getfilesystemencoding(),'ignore') , cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) except OSError: From 08e068d546408af6e5384b95c4d7fcd23327845b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Wed, 25 Dec 2013 14:51:20 -0500 Subject: [PATCH 52/80] Fix XBMC notification icon display. --- changelog.txt | 1 + resources/lib/launcher_plugin.py | 381 +++++++++++++------------------ 2 files changed, 161 insertions(+), 221 deletions(-) diff --git a/changelog.txt b/changelog.txt index 4de723c..c9527d9 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,4 +1,5 @@ [B]2.2.0[/B] +. Fix XBMC notification icon display. . Rewrite launchers.xml load/save functions. . Code cleaning. . Change python dependence to version 2.1. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 37db193..f49b5a4 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -32,16 +32,20 @@ import md5 # Addon paths definition -PLUGIN_DATA_PATH = xbmc.translatePath( os.path.join( "special://profile/addon_data", "plugin.program.advanced.launcher") ) -BASE_PATH = xbmc.translatePath( os.path.join( "special://" , "profile" ) ) -BASE_CURRENT_SOURCE_PATH = os.path.join( PLUGIN_DATA_PATH , "launchers.xml" ) -TEMP_CURRENT_SOURCE_PATH = os.path.join( PLUGIN_DATA_PATH , "launchers.tmp" ) -MERGED_SOURCE_PATH = os.path.join(PLUGIN_DATA_PATH , "merged-launchers.xml" ) -DEFAULT_THUMB_PATH = os.path.join( PLUGIN_DATA_PATH , "thumbs" ) -DEFAULT_FANART_PATH = os.path.join( PLUGIN_DATA_PATH , "fanarts" ) -DEFAULT_NFO_PATH = os.path.join( PLUGIN_DATA_PATH , "nfos" ) -DEFAULT_BACKUP_PATH = os.path.join( PLUGIN_DATA_PATH , "backups" ) -SHORTCUT_FILE = os.path.join( PLUGIN_DATA_PATH , "shortcut.cut" ) +PLUGIN_DATA_PATH = xbmc.translatePath(os.path.join("special://profile/addon_data","plugin.program.advanced.launcher")) +BASE_PATH = xbmc.translatePath(os.path.join("special://","profile")) +HOME_PATH = xbmc.translatePath(os.path.join("special://","home")) +ADDONS_PATH = xbmc.translatePath(os.path.join(HOME_PATH,"addons")) +CURRENT_ADDON_PATH = xbmc.translatePath(os.path.join(ADDONS_PATH,"plugin.program.advanced.launcher")) +BASE_CURRENT_SOURCE_PATH = os.path.join(PLUGIN_DATA_PATH,"launchers.xml") +TEMP_CURRENT_SOURCE_PATH = os.path.join(PLUGIN_DATA_PATH,"launchers.tmp") +MERGED_SOURCE_PATH = os.path.join(PLUGIN_DATA_PATH,"merged-launchers.xml") +DEFAULT_THUMB_PATH = os.path.join(PLUGIN_DATA_PATH,"thumbs") +DEFAULT_FANART_PATH = os.path.join(PLUGIN_DATA_PATH,"fanarts") +DEFAULT_NFO_PATH = os.path.join(PLUGIN_DATA_PATH,"nfos") +DEFAULT_BACKUP_PATH = os.path.join(PLUGIN_DATA_PATH,"backups") +SHORTCUT_FILE = os.path.join(PLUGIN_DATA_PATH,"shortcut.cut") +ICON_IMG_FILE = os.path.join(CURRENT_ADDON_PATH,"icon.png") # Addon paths creation if not os.path.exists(DEFAULT_THUMB_PATH): os.makedirs(DEFAULT_THUMB_PATH) @@ -78,6 +82,8 @@ def __language__(string): # Main code +print ICON_IMG_FILE + class Main: launchers = {} categories = {} @@ -112,10 +118,12 @@ def __init__( self, *args, **kwargs ): xbmcplugin.addSortMethod(handle=self._handle, sortMethod=xbmcplugin.SORT_METHOD_GENRE) xbmcplugin.addSortMethod(handle=self._handle, sortMethod=xbmcplugin.SORT_METHOD_UNSORTED) + # If parameters are passed... if param: param = param[1:] command = param.split(COMMAND_ARGS_SEPARATOR) command_part = command[0].replace("%2f","/").split("/") + # check the action needed if ( len(command_part) == 4 ): category = command_part[0] @@ -181,7 +189,6 @@ def __init__( self, *args, **kwargs ): self._add_new_launcher(category) # Search commands - elif (launcher == SEARCH_ITEM_COMMAND): self._find_add_roms(category) elif (launcher == SEARCH_DATE_COMMAND): @@ -225,6 +232,7 @@ def __init__( self, *args, **kwargs ): self._add_new_launcher(category) else: self._get_launchers(category) + else: self._print_log(__language__( 30739 )) if (len(self.categories) == 0): @@ -399,9 +407,9 @@ def _edit_rom(self, launcher, rom): self.launchers[launcher]["roms"][rom]["thumb"] = file_path self._save_launchers() _update_cache(file_path) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) except OSError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30063 ) % self.launchers[launcher]["roms"][rom]["name"])) + xbmc_notify(__language__( 30000 ), __language__( 30063 ) % self.launchers[launcher]["roms"][rom]["name"],3000) if (type2 == 2 ): # Link to a rom thumbnail image @@ -415,7 +423,7 @@ def _edit_rom(self, launcher, rom): self.launchers[launcher]["roms"][rom]["thumb"] = image self._save_launchers() _update_cache(image) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) if (type == 3 ): dialog = xbmcgui.Dialog() @@ -449,9 +457,9 @@ def _edit_rom(self, launcher, rom): self.launchers[launcher]["roms"][rom]["fanart"] = file_path self._save_launchers() _update_cache(file_path) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) + xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) except OSError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30064 ) % self.launchers[launcher]["roms"][rom]["name"])) + xbmc_notify(__language__( 30000 ), __language__( 30064 ) % self.launchers[launcher]["roms"][rom]["name"],3000) if (type2 == 2 ): # Link to a rom fanart image if (self.launchers[launcher]["roms"][rom]["fanart"] == ""): @@ -464,7 +472,7 @@ def _edit_rom(self, launcher, rom): self.launchers[launcher]["roms"][rom]["fanart"] = image self._save_launchers() _update_cache(image) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) + xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) if (type == 4 ): if (self.launchers[launcher]["roms"][rom]["finished"] == "false"): @@ -518,13 +526,13 @@ def _edit_rom(self, launcher, rom): xbmc.executebuiltin("Container.Refresh") def _scrap_thumb_rom_algo(self, launcher, rom, title): - xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30065 ) % (self.launchers[launcher]["roms"][rom]["name"],(self.settings[ "thumbs_scraper" ]).encode('utf-8','ignore')))) + xbmc_notify(__language__( 30000 ), __language__( 30065 ) % (self.launchers[launcher]["roms"][rom]["name"],(self.settings[ "thumbs_scraper" ]).encode('utf-8','ignore')),300000) xbmc.executebuiltin( "ActivateWindow(busydialog)" ) covers = self._get_thumbnails_list(self.launchers[launcher]["roms"][rom]["gamesys"],title,self.settings["game_region"],self.settings[ "thumb_image_size" ]) if covers: nb_images = len(covers) xbmc.executebuiltin( "Dialog.Close(busydialog)" ) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30066 ) % (nb_images,self.launchers[launcher]["roms"][rom]["name"]))) + xbmc_notify(__language__( 30000 ), __language__( 30066 ) % (nb_images,self.launchers[launcher]["roms"][rom]["name"]),3000) covers.insert(0,(self.launchers[launcher]["roms"][rom]["thumb"],self.launchers[launcher]["roms"][rom]["thumb"],__language__( 30068 ))) self.image_url = MyDialog(covers) if ( self.image_url ): @@ -544,7 +552,7 @@ def _scrap_thumb_rom_algo(self, launcher, rom, title): file_path = filename.replace("."+filename.split(".")[-1], img_ext) else: file_path = os.path.join(os.path.dirname(self.launchers[launcher]["thumbpath"]),os.path.basename(filename.replace("."+filename.split(".")[-1], img_ext))) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30069 ))) + xbmc_notify(__language__( 30000 ), __language__( 30069 ),300000) try: download_img(img_url,file_path) req = urllib2.Request(img_url) @@ -556,16 +564,16 @@ def _scrap_thumb_rom_algo(self, launcher, rom, title): self.launchers[launcher]["roms"][rom]["thumb"] = file_path self._save_launchers() _update_cache(file_path) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) except socket.timeout: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30081 ))) + xbmc_notify(__language__( 30000 ), __language__( 30081 ),3000) except exceptions.IOError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30063 ) % self.launchers[launcher]["roms"][rom]["name"])) + xbmc_notify(__language__( 30000 ), __language__( 30063 ) % self.launchers[launcher]["roms"][rom]["name"],3000) else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30067 ) % (self.launchers[launcher]["roms"][rom]["name"]))) + xbmc_notify(__language__( 30000 ), __language__( 30067 ) % (self.launchers[launcher]["roms"][rom]["name"]),3000) else: xbmc.executebuiltin( "Dialog.Close(busydialog)" ) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30067 ) % (self.launchers[launcher]["roms"][rom]["name"]))) + xbmc_notify(__language__( 30000 ), __language__( 30067 ) % (self.launchers[launcher]["roms"][rom]["name"]),3000) def _scrap_thumb_rom(self, launcher, rom): if ( self.launchers[launcher]["application"].lower().find('mame') > 0 ) or ( self.settings[ "thumbs_scraper" ] == 'arcadeHITS' ): @@ -579,11 +587,11 @@ def _scrap_thumb_rom(self, launcher, rom): xbmc.executebuiltin("Container.Update") def _scrap_thumb_launcher_algo(self, launcherID, title): - xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30065 ) % (self.launchers[launcherID]["name"],(self.settings[ "thumbs_scraper" ]).encode('utf-8','ignore')))) + xbmc_notify(__language__( 30000 ), __language__( 30065 ) % (self.launchers[launcherID]["name"],(self.settings[ "thumbs_scraper" ]).encode('utf-8','ignore')),30000) covers = self._get_thumbnails_list(self.launchers[launcherID]["gamesys"],title,self.settings["game_region"],self.settings[ "thumb_image_size" ]) if covers: nb_images = len(covers) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30066 ) % (nb_images,self.launchers[launcherID]["name"]))) + xbmc_notify(__language__( 30000 ), __language__( 30066 ) % (nb_images,self.launchers[launcherID]["name"]),3000) covers.insert(0,(self.launchers[launcherID]["thumb"],self.launchers[launcherID]["thumb"],__language__( 30068 ))) self.image_url = MyDialog(covers) if ( self.image_url ): @@ -599,28 +607,28 @@ def _scrap_thumb_launcher_algo(self, launcherID, title): if (self.settings[ "launcher_thumb_path" ] == "" ): self.settings[ "launcher_thumb_path" ] = DEFAULT_THUMB_PATH file_path = os.path.join(self.settings[ "launcher_thumb_path" ],os.path.basename(self.launchers[launcherID]["application"])+'_thumb'+img_ext) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000" % (__language__( 30000 ), __language__( 30069 ))) + xbmc_notify(__language__( 30000 ), __language__( 30069 ),300000) try: download_img(img_url,file_path) self.launchers[launcherID]["thumb"] = file_path self._save_launchers() _update_cache(file_path) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) except socket.timeout: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30081 ))) + xbmc_notify(__language__( 30000 ), __language__( 30081 ),3000) except exceptions.IOError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30063 ) % self.launchers[launcherID]["name"])) + xbmc_notify(__language__( 30000 ), __language__( 30063 ) % self.launchers[launcherID]["name"],3000) else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30067 ) % (self.launchers[launcherID]["name"]))) + xbmc_notify(__language__( 30000 ), __language__( 30067 ) % (self.launchers[launcherID]["name"]),3000) else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30067 ) % (self.launchers[launcherID]["name"]))) + xbmc_notify(__language__( 30000 ), __language__( 30067 ) % (self.launchers[launcherID]["name"]),3000) def _scrap_thumb_category_algo(self, categoryID, title): - xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30065 ) % (self.categories[categoryID]["name"],(self.settings[ "thumbs_scraper" ]).encode('utf-8','ignore')))) + xbmc_notify(__language__( 30000 ), __language__( 30065 ) % (self.categories[categoryID]["name"],(self.settings[ "thumbs_scraper" ]).encode('utf-8','ignore')),300000) covers = self._get_thumbnails_list("",title,"",self.settings[ "thumb_image_size" ]) if covers: nb_images = len(covers) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30066 ) % (nb_images,self.categories[categoryID]["name"]))) + xbmc_notify(__language__( 30000 ), __language__( 30066 ) % (nb_images,self.categories[categoryID]["name"]),3000) covers.insert(0,(self.categories[categoryID]["thumb"],self.categories[categoryID]["thumb"],__language__( 30068 ))) self.image_url = MyDialog(covers) if ( self.image_url ): @@ -631,21 +639,21 @@ def _scrap_thumb_category_algo(self, categoryID, title): if ( img_ext != '' ): filename = self.categories[categoryID]["name"] file_path = os.path.join(DEFAULT_THUMB_PATH,os.path.basename(self.categories[categoryID]["name"])+'_thumb'+img_ext) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000" % (__language__( 30000 ), __language__( 30069 ))) + xbmc_notify(__language__( 30000 ), __language__( 30069 ),300000) try: download_img(img_url,file_path) self.categories[categoryID]["thumb"] = file_path self._save_launchers() _update_cache(file_path) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) except socket.timeout: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30081 ))) + xbmc_notify(__language__( 30000 ), __language__( 30081 ),3000) except exceptions.IOError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30063 ) % self.categories[categoryID]["name"])) + xbmc_notify(__language__( 30000 ), __language__( 30063 ) % self.categories[categoryID]["name"],3000) else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30067 ) % (self.categories[categoryID]["name"]))) + xbmc_notify(__language__( 30000 ), __language__( 30067 ) % (self.categories[categoryID]["name"]),3000) else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30067 ) % (self.categories[categoryID]["name"]))) + xbmc_notify(__language__( 30000 ), __language__( 30067 ) % (self.categories[categoryID]["name"]),3000) def _scrap_thumb_launcher(self, launcherID): keyboard = xbmc.Keyboard(self.launchers[launcherID]["name"], __language__( 30036 )) @@ -662,11 +670,11 @@ def _scrap_thumb_category(self, categoryID): xbmc.executebuiltin("Container.Update") def _scrap_fanart_rom_algo(self, launcher, rom, title): - xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30071 ) % (self.launchers[launcher]["roms"][rom]["name"],self.settings[ "fanarts_scraper" ].encode('utf-8','ignore')))) + xbmc_notify(__language__( 30000 ), __language__( 30071 ) % (self.launchers[launcher]["roms"][rom]["name"],self.settings[ "fanarts_scraper" ].encode('utf-8','ignore')),300000) full_fanarts = self._get_fanarts_list(self.launchers[launcher]["roms"][rom]["gamesys"],title,self.settings[ "fanart_image_size" ]) if full_fanarts: nb_images = len(full_fanarts) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30072 ) % (nb_images,self.launchers[launcher]["roms"][rom]["name"]))) + xbmc_notify(__language__( 30000 ), __language__( 30072 ) % (nb_images,self.launchers[launcher]["roms"][rom]["name"]),3000) full_fanarts.insert(0,(self.launchers[launcher]["roms"][rom]["fanart"],self.launchers[launcher]["roms"][rom]["fanart"],__language__( 30068 ))) self.image_url = MyDialog(full_fanarts) if ( self.image_url ): @@ -686,28 +694,28 @@ def _scrap_fanart_rom_algo(self, launcher, rom, title): file_path = filename.replace("."+filename.split(".")[-1], img_ext) else: file_path = os.path.join(os.path.dirname(self.launchers[launcher]["fanartpath"]),os.path.basename(filename.replace("."+filename.split(".")[-1], img_ext))) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30074 ))) + xbmc_notify(__language__( 30000 ), __language__( 30074 ),300000) try: download_img(img_url,file_path) self.launchers[launcher]["roms"][rom]["fanart"] = file_path self._save_launchers() _update_cache(file_path) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) + xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) except socket.timeout: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30081 ))) + xbmc_notify(__language__( 30000 ), __language__( 30081 ),3000) except exceptions.IOError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30064 ) % self.launchers[launcher]["roms"][rom]["name"])) + xbmc_notify(__language__( 30000 ), __language__( 30064 ) % self.launchers[launcher]["roms"][rom]["name"],3000) else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30073 ) % (self.launchers[launcher]["roms"][rom]["name"]))) + xbmc_notify(__language__( 30000 ), __language__( 30073 ) % (self.launchers[launcher]["roms"][rom]["name"]),3000) else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30073 ) % (self.launchers[launcher]["roms"][rom]["name"]))) + xbmc_notify(__language__( 30000 ), __language__( 30073 ) % (self.launchers[launcher]["roms"][rom]["name"]),3000) def _scrap_fanart_category_algo(self, categoryID, title): - xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30071 ) % (self.categories[categoryID]["name"],(self.settings[ "fanarts_scraper" ]).encode('utf-8','ignore')))) + xbmc_notify(__language__( 30000 ), __language__( 30071 ) % (self.categories[categoryID]["name"],(self.settings[ "fanarts_scraper" ]).encode('utf-8','ignore')),300000) covers = self._get_fanarts_list("",title,self.settings[ "fanart_image_size" ]) if covers: nb_images = len(covers) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30072 ) % (nb_images,self.categories[categoryID]["name"]))) + xbmc_notify(__language__( 30000 ), __language__( 30072 ) % (nb_images,self.categories[categoryID]["name"]),3000) covers.insert(0,(self.categories[categoryID]["fanart"],self.categories[categoryID]["fanart"],__language__( 30068 ))) self.image_url = MyDialog(covers) if ( self.image_url ): @@ -718,21 +726,21 @@ def _scrap_fanart_category_algo(self, categoryID, title): if ( img_ext != '' ): filename = self.categories[categoryID]["name"] file_path = os.path.join(DEFAULT_FANART_PATH,os.path.basename(self.categories[categoryID]["name"])+'_fanart'+img_ext) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000" % (__language__( 30000 ), __language__( 30074 ))) + xbmc_notify(__language__( 30000 ), __language__( 30074 ),300000) try: download_img(img_url,file_path) self.categories[categoryID]["fanart"] = file_path self._save_launchers() _update_cache(file_path) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) + xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) except socket.timeout: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30081 ))) + xbmc_notify(__language__( 30000 ), __language__( 30081 ),3000) except exceptions.IOError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30064 ) % self.categories[categoryID]["name"])) + xbmc_notify(__language__( 30000 ), __language__( 30064 ) % self.categories[categoryID]["name"],3000) else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30073 ) % (self.categories[categoryID]["name"]))) + xbmc_notify(__language__( 30000 ), __language__( 30073 ) % (self.categories[categoryID]["name"]),3000) else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30073 ) % (self.categories[categoryID]["name"]))) + xbmc_notify(__language__( 30000 ), __language__( 30073 ) % (self.categories[categoryID]["name"]),3000) def _scrap_fanart_rom(self, launcher, rom): if ( self.launchers[launcher]["application"].lower().find('mame') > 0 ) or ( self.settings[ "fanarts_scraper" ] == 'arcadeHITS' ): @@ -746,13 +754,13 @@ def _scrap_fanart_rom(self, launcher, rom): xbmc.executebuiltin("Container.Update") def _scrap_fanart_launcher_algo(self, launcherID, title): - xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30071 ) % (self.launchers[launcherID]["name"],(self.settings[ "fanarts_scraper" ]).encode('utf-8','ignore')))) + xbmc_notify(__language__( 30000 ), __language__( 30071 ) % (self.launchers[launcherID]["name"],(self.settings[ "fanarts_scraper" ]).encode('utf-8','ignore')),300000) xbmc.executebuiltin( "ActivateWindow(busydialog)" ) covers = self._get_fanarts_list(self.launchers[launcherID]["gamesys"],title,self.settings[ "fanart_image_size" ]) if covers: nb_images = len(covers) xbmc.executebuiltin( "Dialog.Close(busydialog)" ) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30072 ) % (nb_images,self.launchers[launcherID]["name"]))) + xbmc_notify(__language__( 30000 ), __language__( 30072 ) % (nb_images,self.launchers[launcherID]["name"]),3000) covers.insert(0,(self.launchers[launcherID]["fanart"],self.launchers[launcherID]["fanart"],__language__( 30068 ))) self.image_url = MyDialog(covers) if ( self.image_url ): @@ -768,22 +776,22 @@ def _scrap_fanart_launcher_algo(self, launcherID, title): if (self.settings[ "launcher_fanart_path" ] == "" ): self.settings[ "launcher_fanart_path" ] = DEFAULT_FANART_PATH file_path = os.path.join(self.settings[ "launcher_fanart_path" ],os.path.basename(self.launchers[launcherID]["application"])+'_fanart'+img_ext) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 300000)" % (__language__( 30000 ), __language__( 30074 ))) + xbmc_notify(__language__( 30000 ), __language__( 30074 ),300000) try: download_img(img_url,file_path) self.launchers[launcherID]["fanart"] = file_path self._save_launchers() _update_cache(file_path) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) + xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) except socket.timeout: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30081 ))) + xbmc_notify(__language__( 30000 ), __language__( 30081 ),3000) except exceptions.IOError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30064 ) % self.launchers[launcherID]["name"])) + xbmc_notify(__language__( 30000 ), __language__( 30064 ) % self.launchers[launcherID]["name"],3000) else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30073 ) % (self.launchers[launcherID]["name"]))) + xbmc_notify(__language__( 30000 ), __language__( 30073 ) % (self.launchers[launcherID]["name"]),3000) else: xbmc.executebuiltin( "Dialog.Close(busydialog)" ) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30073 ) % (self.launchers[launcherID]["name"]))) + xbmc_notify(__language__( 30000 ), __language__( 30073 ) % (self.launchers[launcherID]["name"]),3000) def _scrap_fanart_launcher(self, launcherID): keyboard = xbmc.Keyboard(self.launchers[launcherID]["name"], __language__( 30036 )) @@ -818,7 +826,7 @@ def _scrap_rom_algo(self, launcher, rom, title): self.launchers[launcher]["roms"][rom]["studio"] = gamedata["studio"] self.launchers[launcher]["roms"][rom]["plot"] = gamedata["plot"] else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30076 ))) + xbmc_notify(__language__( 30000 ), __language__( 30076 ),3000) def _scrap_rom(self, launcher, rom): # Edition of the rom name @@ -867,9 +875,9 @@ def _import_rom_nfo(self, launcher, rom): if len(item_genre) > 0 : self.launchers[launcher]["roms"][rom]["genre"] = item_genre[0] if len(item_plot) > 0 : self.launchers[launcher]["roms"][rom]["plot"] = item_plot[0].replace('"','"') self._save_launchers() - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30083 ) % os.path.basename(nfo_file))) + xbmc_notify(__language__( 30000 ), __language__( 30083 ) % os.path.basename(nfo_file),3000) else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30082 ) % os.path.basename(nfo_file))) + xbmc_notify(__language__( 30000 ), __language__( 30082 ) % os.path.basename(nfo_file),3000) def _export_rom_nfo(self, launcher, rom): nfo_file=os.path.splitext(self.launchers[launcher]["roms"][rom]["filename"].decode(sys.getfilesystemencoding()))[0]+".nfo" @@ -898,13 +906,13 @@ def _export_rom_nfo(self, launcher, rom): source.close() destination.close() os.remove(nfo_file+".tmp") - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30087 ) % os.path.basename(nfo_file).encode('utf8','ignore'))) + xbmc_notify(__language__( 30000 ), __language__( 30087 ) % os.path.basename(nfo_file).encode('utf8','ignore'),3000) else: nfo_content = "\n\t"+self.launchers[launcher]["roms"][rom]["name"]+"\n\t"+self.launchers[launcher]["roms"][rom]["gamesys"]+"\n\t"+self.launchers[launcher]["roms"][rom]["release"]+"\n\t"+self.launchers[launcher]["roms"][rom]["studio"]+"\n\t"+self.launchers[launcher]["roms"][rom]["genre"]+"\n\t"+self.launchers[launcher]["roms"][rom]["plot"]+"\n\n" usock = open( nfo_file, 'w' ) usock.write(nfo_content) usock.close() - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30086 ) % os.path.basename(nfo_file).encode('utf8','ignore'))) + xbmc_notify(__language__( 30000 ), __language__( 30086 ) % os.path.basename(nfo_file).encode('utf8','ignore'),3000) def _add_roms(self, launcher): dialog = xbmcgui.Dialog() @@ -975,9 +983,9 @@ def _edit_category(self, categoryID): self.categories[categoryID]["thumb"] = file_path self._save_launchers() _update_cache(file_path) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) except OSError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30063 ) % self.categories[categoryID]["name"])) + xbmc_notify(__language__( 30000 ), __language__( 30063 ) % self.categories[categoryID]["name"],3000) if (type2 == 2 ): # Link to a category thumbnail image if (self.categories[categoryID]["thumb"] == ""): @@ -990,7 +998,7 @@ def _edit_category(self, categoryID): self.categories[categoryID]["thumb"] = image self._save_launchers() _update_cache(image) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) # Launcher Fanart menu option if (type == 2 ): @@ -1016,9 +1024,9 @@ def _edit_category(self, categoryID): self.categories[categoryID]["fanart"] = file_path self._save_launchers() _update_cache(file_path) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) + xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) except OSError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30064 ) % self.categories[categoryID]["name"])) + xbmc_notify(__language__( 30000 ), __language__( 30064 ) % self.categories[categoryID]["name"],3000) if (type2 == 2 ): # Link to a category fanart image if (self.categories[categoryID]["fanart"] == ""): @@ -1031,7 +1039,7 @@ def _edit_category(self, categoryID): self.categories[categoryID]["fanart"] = image self._save_launchers() _update_cache(image) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) + xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) if (type == 3 ): self._remove_category(categoryID) @@ -1152,9 +1160,9 @@ def _edit_launcher(self, launcherID): self.launchers[launcherID]["thumb"] = file_path self._save_launchers() _update_cache(file_path) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) except OSError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30063 ) % self.launchers[launcherID]["name"])) + xbmc_notify(__language__( 30000 ), __language__( 30063 ) % self.launchers[launcherID]["name"],3000) if (type2 == 2 ): # Link to a launcher thumbnail image @@ -1168,7 +1176,7 @@ def _edit_launcher(self, launcherID): self.launchers[launcherID]["thumb"] = image self._save_launchers() _update_cache(image) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) # Launcher Fanart menu option type_nb = type_nb+1 @@ -1200,9 +1208,9 @@ def _edit_launcher(self, launcherID): self.launchers[launcherID]["fanart"] = file_path self._save_launchers() _update_cache(file_path) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30070 ))) + xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) except OSError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30064 ) % self.launchers[launcherID]["name"])) + xbmc_notify(__language__( 30000 ), __language__( 30064 ) % self.launchers[launcherID]["name"],3000) if (type2 == 2 ): # Link to a launcher fanart image if (self.launchers[launcherID]["fanart"] == ""): @@ -1215,7 +1223,7 @@ def _edit_launcher(self, launcherID): self.launchers[launcherID]["fanart"] = image self._save_launchers() _update_cache(image) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30075 ))) + xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) # Launcher's change category type_nb = type_nb+1 @@ -1391,7 +1399,7 @@ def _scrap_launcher_algo(self, launcherID, title): self.launchers[launcherID]["studio"] = gamedata["studio"] self.launchers[launcherID]["plot"] = gamedata["plot"] else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30076 ))) + xbmc_notify(__language__( 30000 ), __language__( 30076 ),3000) def _scrap_launcher(self, launcherID): # Edition of the launcher name @@ -1437,9 +1445,9 @@ def _import_launcher_nfo(self, launcherID): self.launchers[launcherID]["genre"] = item_genre[0] self.launchers[launcherID]["plot"] = item_plot[0].replace('"','"') self._save_launchers() - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30083 ) % os.path.basename(nfo_file))) + xbmc_notify(__language__( 30000 ), __language__( 30083 ) % os.path.basename(nfo_file),3000) else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30082 ) % os.path.basename(nfo_file))) + xbmc_notify(__language__( 30000 ), __language__( 30082 ) % os.path.basename(nfo_file),3000) def _export_items_list_nfo(self, launcherID): for rom in self.launchers[launcherID]["roms"].iterkeys(): @@ -1479,13 +1487,13 @@ def _export_launcher_nfo(self, launcherID): source.close() destination.close() os.remove(nfo_file+".tmp") - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30087 ) % os.path.basename(nfo_file))) + xbmc_notify(__language__( 30000 ), __language__( 30087 ) % os.path.basename(nfo_file),3000) else: nfo_content = "\n\t"+self.launchers[launcherID]["name"]+"\n\t"+self.launchers[launcherID]["gamesys"]+"\n\t"+self.launchers[launcherID]["release"]+"\n\t"+self.launchers[launcherID]["studio"]+"\n\t"+self.launchers[launcherID]["genre"]+"\n\t"+self.launchers[launcherID]["plot"]+"\n\n" usock = open( nfo_file, 'w' ) usock.write(nfo_content) usock.close() - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30086 ) % os.path.basename(nfo_file))) + xbmc_notify(__language__( 30000 ), __language__( 30086 ) % os.path.basename(nfo_file),3000) def _run_launcher(self, launcherID): if (self.launchers.has_key(launcherID)): @@ -1510,7 +1518,7 @@ def _run_launcher(self, launcherID): if (launcher["minimize"] == "true"): _toogle_fullscreen() if ( self.settings[ "launcher_notification" ] ): - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30034 ) % launcher["name"])) + xbmc_notify(__language__( 30000 ), __language__( 30034 ) % launcher["name"],3000) try: xbmc.enableNavSounds(False) except: @@ -1543,7 +1551,7 @@ def _run_launcher(self, launcherID): elif (sys.platform.startswith('darwin')): os.system("\"%s\" %s " % (launcher["application"], arguments)) else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30609 ))) + xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30609 ),3000) xbmc.sleep(self.settings[ "start_tempo" ]) if (launcher["minimize"] == "true"): _toogle_fullscreen() @@ -1560,7 +1568,7 @@ def _run_launcher(self, launcherID): xbmc.sleep(self.settings[ "start_tempo" ]+100) xbmc.Player().play() else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30611 ) % os.path.basename(launcher["application"]))) + xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30611 ) % os.path.basename(launcher["application"]),3000) def _get_settings( self ): # get the users preference settings @@ -1651,7 +1659,7 @@ def _run_rom(self, launcherID, romName): try: filesnames = os.listdir(temprompath) except: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30610 ))) + xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30610 ),3000) namestem = cleanromname[:-len(ext3)] for filesname in filesnames: @@ -1717,7 +1725,7 @@ def _run_rom(self, launcherID, romName): if (launcher["minimize"] == "true"): _toogle_fullscreen() if ( self.settings[ "launcher_notification" ] ): - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30034 ) % rom["name"])) + xbmc_notify(__language__( 30000 ), __language__( 30034 ) % rom["name"],3000) try: xbmc.enableNavSounds(False) except: @@ -1758,7 +1766,7 @@ def _run_rom(self, launcherID, romName): elif (sys.platform.startswith('darwin')): os.system("\"%s\" %s " % (application, arguments)) else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30609 ))) + xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30609 ),3000) xbmc.sleep(self.settings[ "start_tempo" ]) try: xbmc.enableNavSounds(True) @@ -1775,11 +1783,10 @@ def _run_rom(self, launcherID, romName): xbmc.sleep(self.settings[ "start_tempo" ]+100) xbmc.Player().play() else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30611 ) % os.path.basename(rom["filename"]))) + xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30611 ) % os.path.basename(rom["filename"]),3000) else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30611 ) % os.path.basename(launcher["application"]))) + xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30611 ) % os.path.basename(launcher["application"]),3000) - ''' get an xml data from an xml file ''' def get_xml_source( self, xmlpath ): try: usock = open( xmlpath, 'r' ) @@ -1821,7 +1828,7 @@ def _save_launchers (self): BACKUP_CURRENT_SOURCE_PATH = os.path.join( DEFAULT_BACKUP_PATH , timestamp+"launchers.xml" ) shutil.copy2(BASE_CURRENT_SOURCE_PATH, BACKUP_CURRENT_SOURCE_PATH) except OSError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30600 ))) + xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30600 ),3000) try: xml_content = "\n\n\t\n" # Create Categories XML list @@ -1847,12 +1854,11 @@ def _save_launchers (self): try: shutil.copy2(TEMP_CURRENT_SOURCE_PATH, BASE_CURRENT_SOURCE_PATH) except OSError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30601 ))) - + xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30601 ),3000) except OSError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30602 ))) + xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30602 ),3000) except IOError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30603 ))) + xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30603 ),3000) os.remove(TEMP_CURRENT_SOURCE_PATH) xbmc.executebuiltin( "Dialog.Close(busydialog)" ) @@ -1935,7 +1941,7 @@ def _get_roms( self, launcherID ): self._add_rom(launcherID, roms[key]["name"], roms[key]["filename"], roms[key]["gamesys"], roms[key]["thumb"], defined_fanart, roms[key]["trailer"], roms[key]["custom"], roms[key]["genre"], roms[key]["release"], roms[key]["studio"], roms[key]["plot"], roms[key]["finished"], roms[key]["altapp"], roms[key]["altarg"], len(roms), key, False, "") xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30349 ))) + xbmc_notify(__language__( 30000 ), __language__( 30349 ),3000) def _report_hook( self, count, blocksize, totalsize ): percent = int( float( count * blocksize * 100) / totalsize ) @@ -1986,7 +1992,7 @@ def _import_roms(self, launcherID, addRoms = False): pDialog.close() if not (removedRoms == 0): self._print_log(__language__( 30502 ) % removedRoms) - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30502 ) % removedRoms)) + xbmc_notify(__language__( 30000 ), __language__( 30502 ) % removedRoms,3000) else: self._print_log(__language__( 30721 )) @@ -2234,9 +2240,9 @@ def _import_roms(self, launcherID, addRoms = False): download_img(img_url,thumb) shutil.copy2( thumb.decode(sys.getfilesystemencoding(),'ignore') , cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) except socket.timeout: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30604 ))) + xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30604 ),3000) except exceptions.IOError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30605 ))) + xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30605 ),3000) else: if ( not os.path.isfile(thumb) ) & ( os.path.isfile(cached_thumb) ): os.remove(cached_thumb) @@ -2289,9 +2295,9 @@ def _import_roms(self, launcherID, addRoms = False): download_img(img_url,fanart) shutil.copy2( fanart.decode(sys.getfilesystemencoding(),'ignore') , cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) except socket.timeout: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30606 ))) + xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30606 ),3000) except exceptions.IOError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30607 ))) + xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30607 ),3000) else: if ( not os.path.isfile(fanart) ) & ( os.path.isfile(cached_thumb) ): os.remove(cached_thumb) @@ -2322,10 +2328,10 @@ def _import_roms(self, launcherID, addRoms = False): pDialog.close() if (skipCount == 0): - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30015 ) % (romsCount) + " " + __language__( 30050 ))) + xbmc_notify(__language__( 30000 ), __language__( 30015 ) % (romsCount) + " " + __language__( 30050 ),3000) xbmc.executebuiltin("XBMC.ReloadSkin()") else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30016 ) % (romsCount, skipCount) + " " + __language__( 30050 ))) + xbmc_notify(__language__( 30000 ), __language__( 30016 ) % (romsCount, skipCount) + " " + __language__( 30050 )) def _add_category(self, name, thumb, fanart, genre, plot, total, key): commands = [] @@ -2422,12 +2428,6 @@ def _add_new_rom ( self , launcherID) : ext = launcher["romext"] roms = launcher["roms"] rompath = launcher["rompath"] - romgamesys = launcher["gamesys"] - thumb_path = launcher["thumbpath"] - fanart_path = launcher["fanartpath"] - trailer_path = launcher["trailerpath"] - custom_path = launcher["custompath"] - romfile = dialog.browse(1, __language__( 30017 ),"files", "."+ext.replace("|","|."), False, False, rompath) if (romfile): title=os.path.basename(romfile) @@ -2438,73 +2438,60 @@ def _add_new_rom ( self , launcherID) : if ( title == "" ): title = os.path.basename(romfile) title = title.replace('.'+title.split('.')[-1],'').replace('.',' ') - # prepare rom object data - romdata = {} # Romname conversion if MAME if ( app.lower().find('mame') > 0 ): romname = self._get_mame_title(title) - romdata["name"] = title_format(self,romname) + romname = title_format(self,romname) else: - romdata["name"] = title_format(self,title) - romdata["filename"] = romfile - romdata["gamesys"] = romgamesys - romdata["thumb"] = "" - romdata["fanart"] = "" + romname = title_format(self,title) # Search for default thumbnails and fanart images path ext2s = ['png', 'jpg', 'gif', 'jpeg', 'bmp', 'PNG', 'JPG', 'GIF', 'JPEG', 'BMP'] + thumb_path = launcher["thumbpath"] + fanart_path = launcher["fanartpath"] + romthumb = "" + romfanart = "" f = os.path.basename(romfile) for ext2 in ext2s: if (thumb_path == fanart_path) : if (thumb_path == rompath) : if (os.path.isfile(os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '_thumb.'+ext2)))): - romdata["thumb"] = os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '_thumb.'+ext2)) + romthumb = os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '_thumb.'+ext2)) else: if (os.path.isfile(os.path.join(thumb_path, f.replace("."+f.split(".")[-1], '_thumb.'+ext2)))): - romdata["thumb"] = os.path.join(thumb_path, f.replace("."+f.split(".")[-1], '_thumb.'+ext2)) + romthumb = os.path.join(thumb_path, f.replace("."+f.split(".")[-1], '_thumb.'+ext2)) else: if (thumb_path == "") : - romdata["thumb"] = os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '_thumb.jpg')) + romthumb = os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '_thumb.jpg')) else: if (thumb_path == rompath) : if (os.path.isfile(os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '.'+ext2)))): - romdata["thumb"] = os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '.'+ext2)) + romthumb = os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '.'+ext2)) else: if (os.path.isfile(os.path.join(thumb_path, f.replace("."+f.split(".")[-1], '.'+ext2)))): - romdata["thumb"] = os.path.join(thumb_path, f.replace("."+f.split(".")[-1], '.'+ext2)) + romthumb = os.path.join(thumb_path, f.replace("."+f.split(".")[-1], '.'+ext2)) if (fanart_path == thumb_path) : if (fanart_path == rompath) : if (os.path.isfile(os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '_fanart.'+ext2)))): - romdata["fanart"] = os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '_fanart.'+ext2)) + romfanart = os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '_fanart.'+ext2)) else: if (os.path.isfile(os.path.join(fanart_path, f.replace("."+f.split(".")[-1], '_fanart.'+ext2)))): - romdata["fanart"] = os.path.join(fanart_path, f.replace("."+f.split(".")[-1], '_fanart.'+ext2)) + romfanart = os.path.join(fanart_path, f.replace("."+f.split(".")[-1], '_fanart.'+ext2)) else: if (fanart_path == "") : - romdata["fanart"] = os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '_fanart.jpg')) + romfanart = os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '_fanart.jpg')) else: if (fanart_path == rompath) : if (os.path.isfile(os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '.'+ext2)))): - romdata["fanart"] = os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '.'+ext2)) + romfanart = os.path.join(os.path.dirname(romfile), f.replace("."+f.split(".")[-1], '.'+ext2)) else: if (os.path.isfile(os.path.join(fanart_path, f.replace("."+f.split(".")[-1], '.'+ext2)))): - romdata["fanart"] = os.path.join(fanart_path, f.replace("."+f.split(".")[-1], '.'+ext2)) - romdata["custom"] = custom_path - romdata["trailer"] = "" - romdata["genre"] = "" - romdata["release"] = "" - romdata["studio"] = "" - romdata["plot"] = "" - romdata["finished"] = "false" - romdata["altapp"] = "" - romdata["altarg"] = "" - + romfanart = os.path.join(fanart_path, f.replace("."+f.split(".")[-1], '.'+ext2)) + romdata = {"name":romname,"filename":romfile,"gamesys":launcher["gamesys"],"thumb":romthumb,"fanart":romfanart,"custom":launcher["custompath"],"trailer":"","genre":"","release":"","studio":"","plot":"","finished":"false","altapp":"","altarg":""} # add rom to the roms list (using name as index) romid = _get_SID() roms[romid] = romdata - - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30019 ) + " " + __language__( 30050 ))) - + xbmc_notify(__language__( 30000 ), __language__( 30019 ) + " " + __language__( 30050 ),3000) self._save_launchers() def _add_new_category ( self ) : @@ -2512,22 +2499,16 @@ def _add_new_category ( self ) : keyboard = xbmc.Keyboard("", __language__( 30112 )) keyboard.doModal() if (keyboard.isConfirmed()): - categorydata = {} - categorydata["name"] = keyboard.getText() - categorydata["thumb"] = "" - categorydata["fanart"] = "" - categorydata["genre"] = "" - categorydata["plot"] = "" + categorydata = {"name":keyboard.getText(),"thumb":"","fanart":"","genre":"","plot":""} categoryid = _get_SID() self.categories[categoryid] = categorydata self._save_launchers() xbmc.executebuiltin("Container.Refresh") - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 ), __language__( 30113 ) % categorydata["name"])) + xbmc_notify(__language__( 30000 ), __language__( 30113 ) % categorydata["name"],3000) return True else: return False - def _add_new_launcher ( self, categoryID ) : if ( self.categories.has_key(categoryID) ): dialog = xbmcgui.Dialog() @@ -2567,47 +2548,24 @@ def _add_new_launcher ( self, categoryID ) : fanart_path = xbmcgui.Dialog().browse(0,__language__( 30060 ),"files","", False, False) else: fanart_path = self.settings[ "launcher_fanart_path" ] - # prepare launcher object data - launcherdata = {} - launcherdata["name"] = title - launcherdata["category"] = categoryID - launcherdata["application"] = app - launcherdata["args"] = args - launcherdata["rompath"] = "" - if (thumb_path): - launcherdata["thumbpath"] = thumb_path - else: - launcherdata["thumbpath"] = "" - if (fanart_path): - launcherdata["fanartpath"] = fanart_path - else: - launcherdata["fanartpath"] = "" - launcherdata["custompath"] = "" - launcherdata["trailerpath"] = "" - launcherdata["romext"] = "" + # create launcher object data + if not (thumb_path): + thumb_path = "" + if not (fanart_path): + fanart_path = "" if (not gamesystem == -1 ): - launcherdata["gamesys"] = platforms[gamesystem] + launcher_gamesys = platforms[gamesystem] else: - launcherdata["gamesys"] = "" - launcherdata["thumb"] = "" - launcherdata["fanart"] = "" - launcherdata["genre"] = "" - launcherdata["release"] = "" - launcherdata["studio"] = "" - launcherdata["plot"] = "" - launcherdata["finished"] = "false" + launcher_gamesys = "" if (sys.platform == "win32"): - launcherdata["lnk"] = "true" + launcher_lnk = "true" else: - launcherdata["lnk"] = "" - launcherdata["minimize"] = "false" - launcherdata["roms"] = {} - + launcher_lnk = "" + launcherdata = {"name":title, "category":categoryID, "application":app, "args":args, "rompath":"", "thumbpath":thumb_path, "fanartpath":fanart_path, "custompath":"", "trailerpath":"", "romext":"", "gamesys":launcher_gamesys, "thumb":"", "fanart":"", "genre":"", "release":"", "studio":"", "plot":"", "finished":"false", "lnk":launcher_lnk, "minimize":"false", "roms":{}} # add launcher to the launchers list (using name as index) launcherid = _get_SID() self.launchers[launcherid] = launcherdata self._save_launchers() - xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s)" % (self._path,categoryID)) return True @@ -2639,42 +2597,20 @@ def _add_new_launcher ( self, categoryID ) : # Selection of the thumbnails and fanarts path thumb_path = xbmcgui.Dialog().browse(0,__language__( 30059 ),"files","", False, False, os.path.join(path)) fanart_path = xbmcgui.Dialog().browse(0,__language__( 30060 ),"files","", False, False, os.path.join(path)) - # prepare launcher object data - launcherdata = {} - launcherdata["name"] = title - launcherdata["category"] = categoryID - launcherdata["application"] = app - launcherdata["args"] = args - launcherdata["rompath"] = path - if (thumb_path): - launcherdata["thumbpath"] = thumb_path - else: - launcherdata["thumbpath"] = "" - if (fanart_path): - launcherdata["fanartpath"] = fanart_path - else: - launcherdata["fanartpath"] = "" - launcherdata["custompath"] = "" - launcherdata["trailerpath"] = "" - launcherdata["romext"] = ext + # create launcher object data + if not (thumb_path): + thumb_path = "" + if not (fanart_path): + fanart_path = "" if (not gamesystem == -1 ): - launcherdata["gamesys"] = platforms[gamesystem] + launcher_gamesys = platforms[gamesystem] else: - launcherdata["gamesys"] = "" - launcherdata["thumb"] = "" - launcherdata["fanart"] = "" - launcherdata["genre"] = "" - launcherdata["release"] = "" - launcherdata["studio"] = "" - launcherdata["plot"] = "" - launcherdata["finished"] = "false" + launcher_gamesys = "" if (sys.platform == "win32"): - launcherdata["lnk"] = "true" + launcher_lnk = "true" else: - launcherdata["lnk"] = "" - launcherdata["minimize"] = "false" - launcherdata["roms"] = {} - + launcher_lnk = "" + launcherdata = {"name":title, "category":categoryID, "application":app, "args":args, "rompath":path, "thumbpath":thumb_path, "fanartpath":fanart_path, "custompath":"", "trailerpath":"", "romext":ext, "gamesys":launcher_gamesys, "thumb":"", "fanart":"", "genre":"", "release":"", "studio":"", "plot":"", "finished":"false", "lnk":launcher_lnk, "minimize":"false", "roms":{}} # add launcher to the launchers list (using name as index) launcherid = _get_SID() self.launchers[launcherid] = launcherdata @@ -2684,7 +2620,7 @@ def _add_new_launcher ( self, categoryID ) : if (type == 2): self._file_manager() else: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30613 ))) + xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30613 ),3000) xbmc.executebuiltin("ReplaceWindow(Programs,%s)" % (self._path)) return False @@ -2812,13 +2748,16 @@ def MyDialog(img_list): print_exc() return False del w + +def xbmc_notify(title,text,time): + xbmc.executebuiltin("XBMC.Notification(%s,%s,%s,%s)" % (title,text,time,ICON_IMG_FILE)) def _update_cache(file_path): cached_thumb = Thumbnails().get_cached_covers_thumb( file_path ).replace("tbn" , os.path.splitext(file_path)[-1][1:4]) try: shutil.copy2( file_path.decode(sys.getfilesystemencoding(),'ignore') , cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) except OSError: - xbmc.executebuiltin("XBMC.Notification(%s,%s, 3000)" % (__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30608 ))) + xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30608 ),3000) xbmc.executebuiltin("XBMC.ReloadSkin()") def title_format(self,title): From 9a91aeceddd1d193b7f8383af1656764f4a4ea3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Wed, 1 Jan 2014 09:58:41 -0500 Subject: [PATCH 53/80] Fix XBMC notification display bugs --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 +++ resources/lib/launcher_plugin.py | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/addon.py b/addon.py index 8dfafd3..b4be3d7 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.2.0" +__version__ = "2.2.1" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index e99bb23..2f7483d 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index c9527d9..5e48607 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.2.1[/B] +. Fix XBMC notification display bugs. + [B]2.2.0[/B] . Fix XBMC notification icon display. . Rewrite launchers.xml load/save functions. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index f49b5a4..25f9350 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -2331,7 +2331,7 @@ def _import_roms(self, launcherID, addRoms = False): xbmc_notify(__language__( 30000 ), __language__( 30015 ) % (romsCount) + " " + __language__( 30050 ),3000) xbmc.executebuiltin("XBMC.ReloadSkin()") else: - xbmc_notify(__language__( 30000 ), __language__( 30016 ) % (romsCount, skipCount) + " " + __language__( 30050 )) + xbmc_notify(__language__( 30000 ), __language__( 30016 ) % (romsCount, skipCount) + " " + __language__( 30050 ),3000) def _add_category(self, name, thumb, fanart, genre, plot, total, key): commands = [] From bd02c50417a1880ff489ede26c0b419fef563af9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Thu, 2 Jan 2014 09:04:25 -0500 Subject: [PATCH 54/80] . Fix unclosed opened CSV and NFO files. . Fix negative handle problem. . Fix TheGameDB cached thumbs images display list --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 5 +++ resources/language/English/strings.xml | 4 +- resources/lib/launcher_plugin.py | 38 +++++++++++-------- .../thumbs/TheGamesDB/thumbs_scraper.py | 4 +- 6 files changed, 35 insertions(+), 20 deletions(-) diff --git a/addon.py b/addon.py index b4be3d7..017e1f6 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.2.1" +__version__ = "2.2.2" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 2f7483d..c5c916a 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 5e48607..54f80e4 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,8 @@ +[B]2.2.2[/B] +. Fix unclosed opened CSV and NFO files. +. Fix negative handle problem. +. Fix TheGameDB cached thumbs images display list. + [B]2.2.1[/B] . Fix XBMC notification display bugs. diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 84f872a..f765222 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -282,6 +282,8 @@ URL received : %s application : %s arguments : %s - plugin.program.advanced.launcher + AdvancedLauncher Error: %s::%s (%d) - %s + Save launchers.xml file + Load launchers.xml file diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 25f9350..6602e31 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -82,8 +82,6 @@ def __language__(string): # Main code -print ICON_IMG_FILE - class Main: launchers = {} categories = {} @@ -95,6 +93,8 @@ def __init__( self, *args, **kwargs ): # get users preference self._get_settings() + + # Load launchers self._load_launchers(self.get_xml_source(BASE_CURRENT_SOURCE_PATH)) # get users scrapers preference @@ -110,19 +110,20 @@ def __init__( self, *args, **kwargs ): self._print_log(__language__( 30700 )) # if a commmand is passed as parameter - param = sys.argv[ 2 ] + param = sys.argv[ 2 ].replace("%2f","/") - xbmcplugin.addSortMethod(handle=self._handle, sortMethod=xbmcplugin.SORT_METHOD_LABEL) - xbmcplugin.addSortMethod(handle=self._handle, sortMethod=xbmcplugin.SORT_METHOD_VIDEO_YEAR) - xbmcplugin.addSortMethod(handle=self._handle, sortMethod=xbmcplugin.SORT_METHOD_STUDIO) - xbmcplugin.addSortMethod(handle=self._handle, sortMethod=xbmcplugin.SORT_METHOD_GENRE) - xbmcplugin.addSortMethod(handle=self._handle, sortMethod=xbmcplugin.SORT_METHOD_UNSORTED) + if ( self._handle > 0 ): + xbmcplugin.addSortMethod(handle=self._handle, sortMethod=xbmcplugin.SORT_METHOD_LABEL) + xbmcplugin.addSortMethod(handle=self._handle, sortMethod=xbmcplugin.SORT_METHOD_VIDEO_YEAR) + xbmcplugin.addSortMethod(handle=self._handle, sortMethod=xbmcplugin.SORT_METHOD_STUDIO) + xbmcplugin.addSortMethod(handle=self._handle, sortMethod=xbmcplugin.SORT_METHOD_GENRE) + xbmcplugin.addSortMethod(handle=self._handle, sortMethod=xbmcplugin.SORT_METHOD_UNSORTED) # If parameters are passed... if param: param = param[1:] command = param.split(COMMAND_ARGS_SEPARATOR) - command_part = command[0].replace("%2f","/").split("/") + command_part = command[0].split("/") # check the action needed if ( len(command_part) == 4 ): @@ -862,6 +863,7 @@ def _import_rom_nfo(self, launcher, rom): if (os.path.isfile(nfo_file)): f = open(nfo_file, 'r') item_nfo = f.read().replace('\r','').replace('\n','') + f.close() item_title = re.findall( "(.*?)", item_nfo ) item_platform = re.findall( "(.*?)", item_nfo ) item_year = re.findall( "(.*?)", item_nfo ) @@ -1444,6 +1446,7 @@ def _import_launcher_nfo(self, launcherID): self.launchers[launcherID]["studio"] = item_publisher[0] self.launchers[launcherID]["genre"] = item_genre[0] self.launchers[launcherID]["plot"] = item_plot[0].replace('"','"') + f.close() self._save_launchers() xbmc_notify(__language__( 30000 ), __language__( 30083 ) % os.path.basename(nfo_file),3000) else: @@ -1614,7 +1617,7 @@ def _get_settings( self ): def _print_log(self,string): if (self.settings[ "show_log" ]): - print "["+__language__( 30744 )+"] "+string + print __language__( 30744 )+": "+string def _get_scrapers( self ): # get the users gamedata scrapers preference @@ -1809,6 +1812,7 @@ def get_xml_source( self, xmlpath ): return "" def _save_launchers (self): + self._print_log(__language__( 30746 )) xbmc.executebuiltin( "ActivateWindow(busydialog)" ) if ( self.settings[ "auto_backup" ] ): # Delete oldest backup file @@ -1872,6 +1876,7 @@ def _append_launchers(self, xmlfile): xbmc.executebuiltin("Container.Refresh") def _load_launchers(self, xmlSource): + self._print_log(__language__( 30747 )) # clean, save and return the xml string xmlSource = xmlSource.replace("&", "&").replace('\r','').replace('\n','').replace('\t','') # Get categories list from XML source @@ -2387,10 +2392,11 @@ def _add_launcher(self, name, category, cmd, path, thumbpath, fanartpath, traile listitem.setInfo( "video", { "Title": name, "Label": os.path.basename(cmd), "Plot" : plot , "Studio" : studio , "Genre" : genre , "Premiered" : release , display_date_format : release , "Writer" : gamesys , "Trailer" : os.path.join(trailerpath), "Director" : os.path.join(custompath), "overlay": ICON_OVERLAY } ) listitem.addContextMenuItems( commands ) if ( finished == "false" ) or ( self.settings[ "hide_finished" ] == False) : - if (len(roms) > 0) : - xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s" % (self._path, category, key), listitem=listitem, isFolder=True) - else: - xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s" % (self._path, category, key), listitem=listitem, isFolder=False) + xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s" % (self._path, category, key), listitem=listitem, isFolder=True) + #if (len(roms) > 0) : + # xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s" % (self._path, category, key), listitem=listitem, isFolder=True) + #else: + # xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s" % (self._path, category, key), listitem=listitem, isFolder=False) def _add_rom( self, launcherID, name, cmd , romgamesys, thumb, romfanart, romtrailer, romcustom, romgenre, romrelease, romstudio, romplot, finished, altapp, altarg, total, key, search, search_url): if (int(xbmc.getInfoLabel("System.BuildVersion")[0:2]) < 12 ): @@ -2419,7 +2425,8 @@ def _add_rom( self, launcherID, name, cmd , romgamesys, thumb, romfanart, romtra commands.append((__language__( 30513 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, self.launchers[launcherID]["category"], launcherID, SEARCH_COMMAND) , )) listitem.addContextMenuItems( commands ) if ( finished == "false" ) or ( self.settings[ "hide_finished" ] == False) : - xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s/%s" % (self._path, self.launchers[launcherID]["category"], launcherID, key), listitem=listitem, isFolder=False) + xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s/%s" % (self._path, self.launchers[launcherID]["category"], launcherID, key), listitem=listitem, isFolder=True) + #xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s/%s" % (self._path, self.launchers[launcherID]["category"], launcherID, key), listitem=listitem, isFolder=False) def _add_new_rom ( self , launcherID) : dialog = xbmcgui.Dialog() @@ -2836,6 +2843,7 @@ def _get_game_system_list(): result = line.replace('\n', '').replace('"', '').split(',') platforms.append(result[0]) platforms.sort() + csvfile.close() return platforms except: return platforms diff --git a/resources/scrapers/thumbs/TheGamesDB/thumbs_scraper.py b/resources/scrapers/thumbs/TheGamesDB/thumbs_scraper.py index 63904b9..12a6755 100644 --- a/resources/scrapers/thumbs/TheGamesDB/thumbs_scraper.py +++ b/resources/scrapers/thumbs/TheGamesDB/thumbs_scraper.py @@ -47,10 +47,10 @@ def _get_thumbnails_list(system,search,region,imgsize): page = f.read().replace('\n', '') boxarts = re.findall('(.*?)', page) for indexa, boxart in enumerate(boxarts): - covers.append(("http://thegamesdb.net/banners/"+boxarts[indexa][1],"http://thegamesdb.net/banners/_cache/"+boxarts[indexa][1],"Cover "+str(indexa+1))) + covers.append(("http://thegamesdb.net/banners/"+boxarts[indexa][1],"http://thegamesdb.net/banners/"+boxarts[indexa][1],"Cover "+str(indexa+1))) banners = re.findall('(.*?)', page) for indexb, banner in enumerate(banners): - covers.append(("http://thegamesdb.net/banners/"+banners[indexb][1],"http://thegamesdb.net/banners/_cache/"+banners[indexb][1],"Banner "+str(indexb+1))) + covers.append(("http://thegamesdb.net/banners/"+banners[indexb][1],"http://thegamesdb.net/banners/"+banners[indexb][1],"Banner "+str(indexb+1))) return covers except: return covers From 825ce3b49cc70e1f923e8d6b9cab4c19af2ddc1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Wed, 15 Jan 2014 20:59:51 -0500 Subject: [PATCH 55/80] Fix Sega Genesis 32X scrapers references --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 +++ resources/lib/launcher_plugin.py | 2 +- resources/scrapers/gamesys | 4 ++-- 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/addon.py b/addon.py index 017e1f6..946d1d3 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.2.2" +__version__ = "2.2.3" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index c5c916a..26fdc32 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 54f80e4..f154251 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.2.3[/B] +. Fix Sega Genesis 32X scrapers references + [B]2.2.2[/B] . Fix unclosed opened CSV and NFO files. . Fix negative handle problem. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 6602e31..93506ad 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -2762,7 +2762,7 @@ def xbmc_notify(title,text,time): def _update_cache(file_path): cached_thumb = Thumbnails().get_cached_covers_thumb( file_path ).replace("tbn" , os.path.splitext(file_path)[-1][1:4]) try: - shutil.copy2( file_path.decode(sys.getfilesystemencoding(),'ignore') , cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) + shutil.copy2( file_path.decode(sys.getfilesystemencoding(),'ignore'), cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) except OSError: xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30608 ),3000) xbmc.executebuiltin("XBMC.ReloadSkin()") diff --git a/resources/scrapers/gamesys b/resources/scrapers/gamesys index 4c5700f..38db830 100644 --- a/resources/scrapers/gamesys +++ b/resources/scrapers/gamesys @@ -120,8 +120,8 @@ "Sega CD",36,65,20,"Sega CD" "Sega Game Gear",25,62,25,"Sega Game Gear" "Sega Genesis",24,54,16,"Sega Genesis" -"Sega Genesis 32",35,,, -"Sega Genesis 32X CD",43,74,21,"Sega 32X" +"Sega Genesis 32X",35,74,21,"Sega 32X" +"Sega Genesis 32X CD",43,,, "Sega Genesis CDX",17675,,, "Sega Genesis Nomad",17671,,, "Sega Master System",23,49,26,"Sega Master System" From 03d96fc4fe5c0f9d5af20d5294d8403b9f264530 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Wed, 22 Jan 2014 06:31:49 -0500 Subject: [PATCH 56/80] . Fix Minimize option save. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 +++ resources/lib/launcher_plugin.py | 5 ++--- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/addon.py b/addon.py index 946d1d3..15297c3 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.2.3" +__version__ = "2.2.4" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 26fdc32..38b8a56 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index f154251..78c5cbc 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.2.4[/B] +. Fix Minimize option save. + [B]2.2.3[/B] . Fix Sega Genesis 32X scrapers references diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 93506ad..2f77145 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -561,7 +561,6 @@ def _scrap_thumb_rom_algo(self, launcher, rom, title): f = open(file_path,'wb') f.write(urllib2.urlopen(req).read()) f.close() - self.launchers[launcher]["roms"][rom]["thumb"] = file_path self._save_launchers() _update_cache(file_path) @@ -1901,7 +1900,7 @@ def _load_launchers(self, xmlSource): launchers = re.findall( "(.*?)", xml_launchers[0] ) for launcher in launchers: launcherdata = {} - launcher_index = ["id","name","category","application","args","rompath","thumbpath","fanartpath","trailerpath","custompath","romext","gamesys","thumb","fanart","genre","release","studio","plot","lnk","finished","minimize","roms"] + launcher_index = ["id","name","category","application","args","rompath","thumbpath","fanartpath","trailerpath","custompath","romext","gamesys","thumb","fanart","genre","release","studio","plot","finished","minimize","lnk","roms"] values = re.findall( "(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)", launcher) for index, n in enumerate(launcher_index): launcherdata[n] = values[0][index] @@ -2389,7 +2388,7 @@ def _add_launcher(self, name, category, cmd, path, thumbpath, fanartpath, traile else: ICON_OVERLAY = 7 listitem.setProperty("fanart_image", fanart) - listitem.setInfo( "video", { "Title": name, "Label": os.path.basename(cmd), "Plot" : plot , "Studio" : studio , "Genre" : genre , "Premiered" : release , display_date_format : release , "Writer" : gamesys , "Trailer" : os.path.join(trailerpath), "Director" : os.path.join(custompath), "overlay": ICON_OVERLAY } ) + listitem.setInfo( "videoz", { "Title": name, "Label": os.path.basename(cmd), "Plot" : plot , "Studio" : studio , "Genre" : genre , "Premiered" : release , display_date_format : release , "Writer" : gamesys , "Trailer" : os.path.join(trailerpath), "Director" : os.path.join(custompath), "overlay": ICON_OVERLAY } ) listitem.addContextMenuItems( commands ) if ( finished == "false" ) or ( self.settings[ "hide_finished" ] == False) : xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s" % (self._path, category, key), listitem=listitem, isFolder=True) From 3ff1c0bbb314c06152864395fef6d316d34db4c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Tue, 28 Jan 2014 21:18:43 -0500 Subject: [PATCH 57/80] Fix launchers information display. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 +++ resources/lib/launcher_plugin.py | 4 ++-- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/addon.py b/addon.py index 15297c3..3041b61 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.2.4" +__version__ = "2.2.5" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 38b8a56..0a91f65 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 78c5cbc..e32bfda 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.2.5[/B] +. Fix launcher information display + [B]2.2.4[/B] . Fix Minimize option save. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 2f77145..d4fd4fb 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -1901,7 +1901,7 @@ def _load_launchers(self, xmlSource): for launcher in launchers: launcherdata = {} launcher_index = ["id","name","category","application","args","rompath","thumbpath","fanartpath","trailerpath","custompath","romext","gamesys","thumb","fanart","genre","release","studio","plot","finished","minimize","lnk","roms"] - values = re.findall( "(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)", launcher) + values = re.findall("(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)", launcher) for index, n in enumerate(launcher_index): launcherdata[n] = values[0][index] # Get roms list from XML source @@ -2388,7 +2388,7 @@ def _add_launcher(self, name, category, cmd, path, thumbpath, fanartpath, traile else: ICON_OVERLAY = 7 listitem.setProperty("fanart_image", fanart) - listitem.setInfo( "videoz", { "Title": name, "Label": os.path.basename(cmd), "Plot" : plot , "Studio" : studio , "Genre" : genre , "Premiered" : release , display_date_format : release , "Writer" : gamesys , "Trailer" : os.path.join(trailerpath), "Director" : os.path.join(custompath), "overlay": ICON_OVERLAY } ) + listitem.setInfo( "video", { "Title": name, "Label": os.path.basename(cmd), "Plot" : plot , "Studio" : studio , "Genre" : genre , "Premiered" : release , display_date_format : release , "Writer" : gamesys , "Trailer" : os.path.join(trailerpath), "Director" : os.path.join(custompath), "overlay": ICON_OVERLAY } ) listitem.addContextMenuItems( commands ) if ( finished == "false" ) or ( self.settings[ "hide_finished" ] == False) : xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s" % (self._path, category, key), listitem=listitem, isFolder=True) From 73d4866cefa55100fcbff9629254ad52f177852b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Fri, 7 Feb 2014 22:44:13 -0500 Subject: [PATCH 58/80] Fix platform ID change for GameFAQs scrapers. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 +++ resources/scrapers/gamesys | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/addon.py b/addon.py index 3041b61..4846720 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.2.5" +__version__ = "2.2.6" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 0a91f65..4570fa3 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index e32bfda..991aee0 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.2.6[/B] +. Fix platform ID change for GameFAQs scrapers. + [B]2.2.5[/B] . Fix launcher information display diff --git a/resources/scrapers/gamesys b/resources/scrapers/gamesys index 38db830..9f35498 100644 --- a/resources/scrapers/gamesys +++ b/resources/scrapers/gamesys @@ -108,7 +108,7 @@ "Pinball",,1,, "Pioneer LaserActive",17669,71,, "Playdia",,77,, -"Playstation 2",47,7,7,"Sony Playstation 2" +"Playstation 2",47,94,7,"Sony Playstation 2" "Playstation",27,78,6,"Sony Playstation" "Playstation 3",45561,113,81,"Sony Playstation 3" "Playstation 4",,120,, From d0e413dc45ebd6101fb2b1005f780c281b166649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Sat, 15 Feb 2014 09:45:50 -0500 Subject: [PATCH 59/80] Fix ComicVine search item function. --- addon.xml | 2 +- .../scrapers/datas/ComicVine/datas_scraper.py | 47 ++++++++++--------- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/addon.xml b/addon.xml index 4570fa3..d6903aa 100644 --- a/addon.xml +++ b/addon.xml @@ -1,7 +1,7 @@  - + diff --git a/resources/scrapers/datas/ComicVine/datas_scraper.py b/resources/scrapers/datas/ComicVine/datas_scraper.py index 4567055..9046407 100644 --- a/resources/scrapers/datas/ComicVine/datas_scraper.py +++ b/resources/scrapers/datas/ComicVine/datas_scraper.py @@ -12,27 +12,30 @@ def _get_games_list(search): results = [] display = [] try: - f = urllib.urlopen('http://www.comicvine.com/search/?indices[0]=cv_issue&q="'+urllib.quote(search.lower())+'"') - page = f.read().replace('\r\n', '').replace('\n', '').strip('\t') - issues = re.findall('/4000-(.*?)/">
(.*?)

(.*?)

(.*?) issue \((.*?)\)', page) - for issue in issues: - comic = {} - comic["id"] = issue[0] - comic["title"] = unescape(issue[2]) - comic["studio"] = issue[4] - comic["release"] = issue[5][-4:] - comic["order"] = 1 - comic_volume = comic["title"].split(' - ') - if ( comic_volume[0].lower() == search.lower() ): - comic["order"] += 1 - if ( comic["title"].lower() == search.lower() ): - comic["order"] += 1 - if ( comic["title"].lower().find(search.lower()) != -1 ): - comic["order"] += 1 - results.append(comic) + for num in range(1,3): + f = urllib.urlopen('http://www.comicvine.com/jsonsearch/?indices[0]=issue&page='+str(num)+'&q="'+urllib.quote(search.lower())+'"') + json = simplejson.loads(f.read()) + for issue in json['results']: + comic = {} + comic["id"] = issue["id"] + comic["title"] = issue["title"].encode('utf-8','ignore') + comic["studio"] = issue["company"].encode('utf-8','ignore') + try: + comic["release"] = " / "+issue["cover_date"][0:4].encode('utf-8','ignore') + except: + comic["release"] = "" + comic["order"] = 1 + comic_volume = comic["title"].split(' - ') + if ( comic_volume[0].lower() == search.lower() ): + comic["order"] += 1 + if ( comic["title"].lower() == search.lower() ): + comic["order"] += 1 + if ( comic["title"].lower().find(search.lower()) != -1 ): + comic["order"] += 1 + results.append(comic) results.sort(key=lambda result: result["order"], reverse=True) for result in results: - display.append(result["title"].encode('utf-8','ignore')+' ('+result["studio"].encode('utf-8','ignore')+' / '+result["release"].encode('utf-8','ignore')+')') + display.append(result["title"]+' ('+result["studio"]+result["release"]+')') return results,display except: return results,display @@ -50,7 +53,7 @@ def _get_game_data(comic_id): comicdata["studio"] = "" comicdata["plot"] = "" try: - f = urllib.urlopen(comicvine_api_url+'/issue/'+comic_id+'/?api_key='+comicvine_api_key+'&format=json&field_list=cover_date,description,volume,name,issue_number') + f = urllib.urlopen(comicvine_api_url+'/issue/4000-'+comic_id+'/?api_key='+comicvine_api_key+'&format=json&field_list=cover_date,description,volume,name,issue_number') json = simplejson.loads(f.read()) f.close() if ( json['results']['cover_date'] ): @@ -59,10 +62,10 @@ def _get_game_data(comic_id): p = re.compile(r'<.*?>') comicdata["plot"] = p.sub('', unescape(json['results']['description'].encode('utf-8','ignore'))) if ( json['results']['volume'] ): - f = urllib.urlopen(comicvine_api_url+'/volume/'+str(json['results']['volume']['id'])+'/?api_key='+comicvine_api_key+'&format=json&field_list=publisher') + f = urllib.urlopen(str(json['results']['volume']['api_detail_url'])+'?api_key='+comicvine_api_key+'&format=json&field_list=publisher') json2 = simplejson.loads(f.read()) f.close() - if ( json2['results']['publisher'] ): + if (json2['results']['publisher']['name']): comicdata["studio"] = str(json2['results']['publisher']['name']).encode('utf-8','ignore') return comicdata except: From 6734fba8580d04c3d3a7a09135be9e9353a0966a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Sat, 15 Feb 2014 09:59:30 -0500 Subject: [PATCH 60/80] Fix ComicVine data scraper --- resources/scrapers/datas/ComicVine/datas_scraper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/scrapers/datas/ComicVine/datas_scraper.py b/resources/scrapers/datas/ComicVine/datas_scraper.py index 9046407..239dbbe 100644 --- a/resources/scrapers/datas/ComicVine/datas_scraper.py +++ b/resources/scrapers/datas/ComicVine/datas_scraper.py @@ -53,7 +53,7 @@ def _get_game_data(comic_id): comicdata["studio"] = "" comicdata["plot"] = "" try: - f = urllib.urlopen(comicvine_api_url+'/issue/4000-'+comic_id+'/?api_key='+comicvine_api_key+'&format=json&field_list=cover_date,description,volume,name,issue_number') + f = urllib.urlopen(comicvine_api_url+'/issue/4000-'+str(comic_id)+'/?api_key='+comicvine_api_key+'&format=json&field_list=cover_date,description,volume,name,issue_number') json = simplejson.loads(f.read()) f.close() if ( json['results']['cover_date'] ): From e6aa208414834ed6c8d674e132902d4a92175ede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Sat, 15 Feb 2014 10:11:51 -0500 Subject: [PATCH 61/80] New version number --- addon.py | 2 +- addon.xml | 4 ++-- changelog.txt | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/addon.py b/addon.py index 4846720..0fd98a4 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.2.6" +__version__ = "2.2.7" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index d6903aa..219414d 100644 --- a/addon.xml +++ b/addon.xml @@ -1,7 +1,7 @@  - + - + diff --git a/changelog.txt b/changelog.txt index 991aee0..ce5ab9a 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.2.7[/B] +. Fix ComicVine data scrapers. + [B]2.2.6[/B] . Fix platform ID change for GameFAQs scrapers. From 1238c8a87597be859fda22e2d42ac46642e3b3d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Fri, 28 Feb 2014 23:23:45 -0500 Subject: [PATCH 62/80] Fix "Remote Share" Could not connect to network server message display under Windows. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 +++ resources/lib/launcher_plugin.py | 9 ++------- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/addon.py b/addon.py index 0fd98a4..8254292 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.2.7" +__version__ = "2.2.8" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 219414d..e839663 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index ce5ab9a..eb7c6ba 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.2.8[/B] +. Fix "Remote Share" Could not connect to network server message display under Windows. + [B]2.2.7[/B] . Fix ComicVine data scrapers. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index d4fd4fb..cb72560 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -2391,11 +2391,7 @@ def _add_launcher(self, name, category, cmd, path, thumbpath, fanartpath, traile listitem.setInfo( "video", { "Title": name, "Label": os.path.basename(cmd), "Plot" : plot , "Studio" : studio , "Genre" : genre , "Premiered" : release , display_date_format : release , "Writer" : gamesys , "Trailer" : os.path.join(trailerpath), "Director" : os.path.join(custompath), "overlay": ICON_OVERLAY } ) listitem.addContextMenuItems( commands ) if ( finished == "false" ) or ( self.settings[ "hide_finished" ] == False) : - xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s" % (self._path, category, key), listitem=listitem, isFolder=True) - #if (len(roms) > 0) : - # xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s" % (self._path, category, key), listitem=listitem, isFolder=True) - #else: - # xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s" % (self._path, category, key), listitem=listitem, isFolder=False) + xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s" % (self._path, category, key), listitem=listitem, isFolder=folder) def _add_rom( self, launcherID, name, cmd , romgamesys, thumb, romfanart, romtrailer, romcustom, romgenre, romrelease, romstudio, romplot, finished, altapp, altarg, total, key, search, search_url): if (int(xbmc.getInfoLabel("System.BuildVersion")[0:2]) < 12 ): @@ -2424,8 +2420,7 @@ def _add_rom( self, launcherID, name, cmd , romgamesys, thumb, romfanart, romtra commands.append((__language__( 30513 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, self.launchers[launcherID]["category"], launcherID, SEARCH_COMMAND) , )) listitem.addContextMenuItems( commands ) if ( finished == "false" ) or ( self.settings[ "hide_finished" ] == False) : - xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s/%s" % (self._path, self.launchers[launcherID]["category"], launcherID, key), listitem=listitem, isFolder=True) - #xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s/%s" % (self._path, self.launchers[launcherID]["category"], launcherID, key), listitem=listitem, isFolder=False) + xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s/%s" % (self._path, self.launchers[launcherID]["category"], launcherID, key), listitem=listitem, isFolder=False) def _add_new_rom ( self , launcherID) : dialog = xbmcgui.Dialog() From c71bc6d37431b87bb2c65ca7b9a5931794ddd1cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Fri, 7 Mar 2014 23:29:05 -0500 Subject: [PATCH 63/80] . Add a queries launcher creation. . Fix message display for launchers fanart image change. . Fix message display for items fanart image change. --- addon.py | 2 +- addon.xml | 4 +- changelog.txt | 5 + resources/language/English/strings.xml | 1 + resources/lib/launcher_plugin.py | 152 ++++++++++++++++++------- 5 files changed, 121 insertions(+), 43 deletions(-) diff --git a/addon.py b/addon.py index 8254292..cacff0a 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.2.8" +__version__ = "2.3.0" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index e839663..37dad19 100644 --- a/addon.xml +++ b/addon.xml @@ -1,7 +1,7 @@  - + - + diff --git a/changelog.txt b/changelog.txt index eb7c6ba..537f7d3 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,8 @@ +[B]2.3.0[/B] +. Add a queries launcher creation. +. Fix message display for launchers fanart image change. +. Fix message display for items fanart image change. + [B]2.2.8[/B] . Fix "Remote Share" Could not connect to network server message display under Windows. diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index f765222..93fde84 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -15,6 +15,7 @@ Select the launcher application Application arguments Set the title of the launcher + Query launcher (search engine) Set files extensions, use "|" as separator. (e.g lnk|cbr) Downloading: %s Launching %s. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index cb72560..3d16ebb 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -133,7 +133,7 @@ def __init__( self, *args, **kwargs ): action = command_part[3] if (action == SEARCH_COMMAND): - self._find_roms() + self._find_roms(False) if (action == REMOVE_COMMAND): self._remove_rom(launcher, rom) elif (action == EDIT_COMMAND): @@ -151,7 +151,7 @@ def __init__( self, *args, **kwargs ): rom = command_part[2] if (rom == SEARCH_COMMAND): - self._find_roms() + self._find_roms(False) if (rom == REMOVE_COMMAND): self._remove_launcher(launcher) elif (rom == EDIT_COMMAND): @@ -174,7 +174,7 @@ def __init__( self, *args, **kwargs ): launcher = command_part[1] if (launcher == SEARCH_COMMAND): - self._find_roms() + self._find_roms(False) elif (launcher == FILE_MANAGER_COMMAND): self._file_manager() elif (launcher == EDIT_COMMAND): @@ -212,9 +212,9 @@ def __init__( self, *args, **kwargs ): self._print_log(__language__( 30740 ) % category) if (category == SCAN_NEW_ITEM_COMMAND): - self._find_roms() + self._find_roms(False) if (category == SEARCH_COMMAND): - self._find_roms() + self._find_roms(False) elif (category == FILE_MANAGER_COMMAND): self._file_manager() elif (category == ADD_COMMAND): @@ -405,9 +405,10 @@ def _edit_rom(self, launcher, rom): if ( image != file_path ): try: shutil.copy2( image.decode(sys.getfilesystemencoding(),'ignore') , file_path.decode(sys.getfilesystemencoding(),'ignore') ) + if ( self.launchers[launcher]["roms"][rom]["thumb"] != "" ): + _update_cache(file_path) self.launchers[launcher]["roms"][rom]["thumb"] = file_path self._save_launchers() - _update_cache(file_path) xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) except OSError: xbmc_notify(__language__( 30000 ), __language__( 30063 ) % self.launchers[launcher]["roms"][rom]["name"],3000) @@ -421,9 +422,10 @@ def _edit_rom(self, launcher, rom): image = xbmcgui.Dialog().browse(2,__language__( 30041 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(imagepath)) if (image): if (os.path.isfile(image)): + if ( self.launchers[launcher]["roms"][rom]["thumb"] != "" ): + _update_cache(file_path) self.launchers[launcher]["roms"][rom]["thumb"] = image self._save_launchers() - _update_cache(image) xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) if (type == 3 ): @@ -436,7 +438,7 @@ def _edit_rom(self, launcher, rom): self._scrap_fanart_rom(launcher,rom) if (type2 == 1 ): # Import a rom fanart image - image = xbmcgui.Dialog().browse(2,__language__( 30041 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(self.launchers[launcher]["fanartpath"])) + image = xbmcgui.Dialog().browse(2,__language__( 30042 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(self.launchers[launcher]["fanartpath"])) if (image): if (os.path.isfile(image)): img_ext = os.path.splitext(image)[-1][0:4] @@ -455,9 +457,10 @@ def _edit_rom(self, launcher, rom): if ( image != file_path ): try: shutil.copy2( image.decode(sys.getfilesystemencoding(),'ignore') , file_path.decode(sys.getfilesystemencoding(),'ignore') ) + if ( self.launchers[launcher]["roms"][rom]["fanart"] != "" ): + _update_cache(file_path) self.launchers[launcher]["roms"][rom]["fanart"] = file_path self._save_launchers() - _update_cache(file_path) xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) except OSError: xbmc_notify(__language__( 30000 ), __language__( 30064 ) % self.launchers[launcher]["roms"][rom]["name"],3000) @@ -470,9 +473,10 @@ def _edit_rom(self, launcher, rom): image = xbmcgui.Dialog().browse(2,__language__( 30042 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(imagepath)) if (image): if (os.path.isfile(image)): + if ( self.launchers[launcher]["roms"][rom]["fanart"] != "" ): + _update_cache(file_path) self.launchers[launcher]["roms"][rom]["fanart"] = image self._save_launchers() - _update_cache(image) xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) if (type == 4 ): @@ -561,9 +565,10 @@ def _scrap_thumb_rom_algo(self, launcher, rom, title): f = open(file_path,'wb') f.write(urllib2.urlopen(req).read()) f.close() + if ( self.launchers[launcher]["roms"][rom]["thumb"] != "" ): + _update_cache(file_path) self.launchers[launcher]["roms"][rom]["thumb"] = file_path self._save_launchers() - _update_cache(file_path) xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) except socket.timeout: xbmc_notify(__language__( 30000 ), __language__( 30081 ),3000) @@ -610,9 +615,10 @@ def _scrap_thumb_launcher_algo(self, launcherID, title): xbmc_notify(__language__( 30000 ), __language__( 30069 ),300000) try: download_img(img_url,file_path) + if ( self.launchers[launcherID]["thumb"] != "" ): + _update_cache(file_path) self.launchers[launcherID]["thumb"] = file_path self._save_launchers() - _update_cache(file_path) xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) except socket.timeout: xbmc_notify(__language__( 30000 ), __language__( 30081 ),3000) @@ -642,9 +648,10 @@ def _scrap_thumb_category_algo(self, categoryID, title): xbmc_notify(__language__( 30000 ), __language__( 30069 ),300000) try: download_img(img_url,file_path) + if ( self.categories[categoryID]["thumb"] != "" ): + _update_cache(file_path) self.categories[categoryID]["thumb"] = file_path self._save_launchers() - _update_cache(file_path) xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) except socket.timeout: xbmc_notify(__language__( 30000 ), __language__( 30081 ),3000) @@ -697,9 +704,10 @@ def _scrap_fanart_rom_algo(self, launcher, rom, title): xbmc_notify(__language__( 30000 ), __language__( 30074 ),300000) try: download_img(img_url,file_path) + if ( self.launchers[launcher]["roms"][rom]["fanart"] != "" ): + _update_cache(file_path) self.launchers[launcher]["roms"][rom]["fanart"] = file_path self._save_launchers() - _update_cache(file_path) xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) except socket.timeout: xbmc_notify(__language__( 30000 ), __language__( 30081 ),3000) @@ -729,9 +737,10 @@ def _scrap_fanart_category_algo(self, categoryID, title): xbmc_notify(__language__( 30000 ), __language__( 30074 ),300000) try: download_img(img_url,file_path) + if ( self.categories[categoryID]["fanart"] != "" ): + _update_cache(file_path) self.categories[categoryID]["fanart"] = file_path self._save_launchers() - _update_cache(file_path) xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) except socket.timeout: xbmc_notify(__language__( 30000 ), __language__( 30081 ),3000) @@ -779,9 +788,10 @@ def _scrap_fanart_launcher_algo(self, launcherID, title): xbmc_notify(__language__( 30000 ), __language__( 30074 ),300000) try: download_img(img_url,file_path) + if ( self.launchers[launcherID]["fanart"] != "" ): + _update_cache(file_path) self.launchers[launcherID]["fanart"] = file_path self._save_launchers() - _update_cache(file_path) xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) except socket.timeout: xbmc_notify(__language__( 30000 ), __language__( 30081 ),3000) @@ -981,9 +991,10 @@ def _edit_category(self, categoryID): if ( image != file_path ): try: shutil.copy2( image.decode(sys.getfilesystemencoding(),'ignore') , file_path.decode(sys.getfilesystemencoding(),'ignore') ) + if ( self.categories[categoryID]["thumb"] != "" ): + _update_cache(file_path) self.categories[categoryID]["thumb"] = file_path self._save_launchers() - _update_cache(file_path) xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) except OSError: xbmc_notify(__language__( 30000 ), __language__( 30063 ) % self.categories[categoryID]["name"],3000) @@ -996,9 +1007,10 @@ def _edit_category(self, categoryID): image = xbmcgui.Dialog().browse(2,__language__( 30041 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(imagepath)) if (image): if (os.path.isfile(image)): + if ( self.categories[categoryID]["thumb"] != "" ): + _update_cache(file_path) self.categories[categoryID]["thumb"] = image self._save_launchers() - _update_cache(image) xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) # Launcher Fanart menu option @@ -1022,9 +1034,10 @@ def _edit_category(self, categoryID): if ( image != file_path ): try: shutil.copy2( image.decode(sys.getfilesystemencoding(),'ignore') , file_path.decode(sys.getfilesystemencoding(),'ignore') ) + if ( self.categories[categoryID]["fanart"] != "" ): + _update_cache(file_path) self.categories[categoryID]["fanart"] = file_path self._save_launchers() - _update_cache(file_path) xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) except OSError: xbmc_notify(__language__( 30000 ), __language__( 30064 ) % self.categories[categoryID]["name"],3000) @@ -1037,11 +1050,11 @@ def _edit_category(self, categoryID): image = xbmcgui.Dialog().browse(2,__language__( 30042 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(imagepath)) if (image): if (os.path.isfile(image)): + if ( self.categories[categoryID]["fanart"] != "" ): + _update_cache(file_path) self.categories[categoryID]["fanart"] = image self._save_launchers() - _update_cache(image) xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) - if (type == 3 ): self._remove_category(categoryID) if (type == -1 ): @@ -1158,9 +1171,10 @@ def _edit_launcher(self, launcherID): if ( image != file_path ): try: shutil.copy2( image.decode(sys.getfilesystemencoding(),'ignore') , file_path.decode(sys.getfilesystemencoding(),'ignore') ) + if ( self.launchers[launcherID]["thumb"] != "" ): + _update_cache(file_path) self.launchers[launcherID]["thumb"] = file_path self._save_launchers() - _update_cache(file_path) xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) except OSError: xbmc_notify(__language__( 30000 ), __language__( 30063 ) % self.launchers[launcherID]["name"],3000) @@ -1174,9 +1188,10 @@ def _edit_launcher(self, launcherID): image = xbmcgui.Dialog().browse(2,__language__( 30041 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(imagepath)) if (image): if (os.path.isfile(image)): + if ( self.launchers[launcherID]["thumb"] != "" ): + _update_cache(file_path) self.launchers[launcherID]["thumb"] = image self._save_launchers() - _update_cache(image) xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) # Launcher Fanart menu option @@ -1191,7 +1206,7 @@ def _edit_launcher(self, launcherID): self._scrap_fanart_launcher(launcherID) if (type2 == 1 ): # Import a Launcher fanart image - image = xbmcgui.Dialog().browse(2,__language__( 30041 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(self.launchers[launcherID]["fanartpath"])) + image = xbmcgui.Dialog().browse(2,__language__( 30042 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(self.launchers[launcherID]["fanartpath"])) if (image): if (os.path.isfile(image)): img_ext = os.path.splitext(image)[-1][0:4] @@ -1206,9 +1221,10 @@ def _edit_launcher(self, launcherID): if ( image != file_path ): try: shutil.copy2( image.decode(sys.getfilesystemencoding(),'ignore') , file_path.decode(sys.getfilesystemencoding(),'ignore') ) + if ( self.launchers[launcherID]["fanart"] != "" ): + _update_cache(file_path) self.launchers[launcherID]["fanart"] = file_path self._save_launchers() - _update_cache(file_path) xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) except OSError: xbmc_notify(__language__( 30000 ), __language__( 30064 ) % self.launchers[launcherID]["name"],3000) @@ -1221,9 +1237,10 @@ def _edit_launcher(self, launcherID): image = xbmcgui.Dialog().browse(2,__language__( 30042 ),"files",".jpg|.jpeg|.gif|.png", True, False, os.path.join(imagepath)) if (image): if (os.path.isfile(image)): + if ( self.launchers[launcherID]["fanart"] != "" ): + _update_cache(file_path) self.launchers[launcherID]["fanart"] = image self._save_launchers() - _update_cache(image) xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) # Launcher's change category @@ -1501,11 +1518,12 @@ def _run_launcher(self, launcherID): if (self.launchers.has_key(launcherID)): launcher = self.launchers[launcherID] apppath = os.path.dirname(launcher["application"]) - if ( os.path.exists(apppath) ) : - arguments = launcher["args"].replace("%apppath%" , apppath).replace("%APPPATH%" , apppath) - if ( os.path.basename(launcher["application"]).lower().replace(".exe" , "") == "xbmc" ): - xbmc.executebuiltin('XBMC.' + launcher["args"]) - else: + if ( os.path.basename(launcher["application"]).lower().replace(".exe" , "") == "xbmc" ): + print launcher["args"] + xbmc.executebuiltin('XBMC.%s' % launcher["args"]) + else: + if ( os.path.exists(apppath) ) : + arguments = launcher["args"].replace("%apppath%" , apppath).replace("%APPPATH%" , apppath) if ( self.settings[ "media_state" ] != "2" ): if ( xbmc.Player().isPlaying() ): if ( self.settings[ "media_state" ] == "0" ): @@ -1569,8 +1587,8 @@ def _run_launcher(self, launcherID): if ( self.settings[ "media_state" ] == "1" ): xbmc.sleep(self.settings[ "start_tempo" ]+100) xbmc.Player().play() - else: - xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30611 ) % os.path.basename(launcher["application"]),3000) + else: + xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30611 ) % os.path.basename(launcher["application"]),3000) def _get_settings( self ): # get the users preference settings @@ -2513,7 +2531,7 @@ def _add_new_category ( self ) : def _add_new_launcher ( self, categoryID ) : if ( self.categories.has_key(categoryID) ): dialog = xbmcgui.Dialog() - type = dialog.select(__language__( 30101 ), [__language__( 30021 ), __language__( 30022 ),__language__( 30051 )]) + type = dialog.select(__language__( 30101 ), [__language__( 30021 ), __language__( 30022 ), __language__( 30026 ),__language__( 30051 )]) if (os.environ.get( "OS", "xbox" ) == "xbox"): filter = ".xbe|.cut" else: @@ -2619,6 +2637,45 @@ def _add_new_launcher ( self, categoryID ) : xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s)" % (self._path,categoryID)) return True if (type == 2): + launcher_query, query = self._find_roms(True) + if (launcher_query): + app = "xbmc" + args = 'ActivateWindow(10001,"%s")' % launcher_query + title = os.path.basename(query) + keyboard = xbmc.Keyboard(title.replace('.'+title.split('.')[-1],'').replace('.',' '), __language__( 30025 )) + keyboard.doModal() + title = keyboard.getText() + if ( title == "" ): + title = os.path.basename(launcher_query) + # Selection of the thumbnails and fanarts path + if ( self.settings[ "launcher_thumb_path" ] == "" ): + thumb_path = xbmcgui.Dialog().browse(0,__language__( 30059 ),"files","", False, False) + else: + thumb_path = self.settings[ "launcher_thumb_path" ] + if ( self.settings[ "launcher_fanart_path" ] == "" ): + fanart_path = xbmcgui.Dialog().browse(0,__language__( 30060 ),"files","", False, False) + else: + fanart_path = self.settings[ "launcher_fanart_path" ] + # create launcher object data + if not (thumb_path): + thumb_path = "" + if not (fanart_path): + fanart_path = "" + if (sys.platform == "win32"): + launcher_lnk = "true" + else: + launcher_lnk = "" + launcherdata = {"name":title, "category":categoryID, "application":app, "args":args, "rompath":"", "thumbpath":thumb_path, "fanartpath":fanart_path, "custompath":"", "trailerpath":"", "romext":"", "gamesys":"xbmc", "thumb":"", "fanart":"", "genre":"", "release":"", "studio":"", "plot":"", "finished":"false", "lnk":launcher_lnk, "minimize":"false", "roms":{}} + # add launcher to the launchers list (using name as index) + launcherid = _get_SID() + self.launchers[launcherid] = launcherdata + self._save_launchers() + xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s)" % (self._path,categoryID)) + return True + + print launcher_query + + if (type == 3): self._file_manager() else: xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30613 ),3000) @@ -2629,7 +2686,7 @@ def _add_new_launcher ( self, categoryID ) : def _file_manager( self ): xbmc.executebuiltin("ActivateWindow(filemanager)") - def _find_roms( self ): + def _find_roms( self, is_launcher ): dialog = xbmcgui.Dialog() type = dialog.select(__language__( 30400 ), [__language__( 30401 ),__language__( 30402 ),__language__( 30403 ),__language__( 30404 ),__language__( 30405 )]) type_nb = 0 @@ -2640,7 +2697,10 @@ def _find_roms( self ): keyboard.doModal() if (keyboard.isConfirmed()): search = keyboard.getText() - xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s)" % (self._path, search, SEARCH_ITEM_COMMAND)) + if (is_launcher): + return "%s?%s/%s" % (self._path, search, SEARCH_ITEM_COMMAND), search + else: + xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s)" % (self._path, search, SEARCH_ITEM_COMMAND)) #Search by Release Date type_nb = type_nb+1 @@ -2650,7 +2710,10 @@ def _find_roms( self ): dialog = xbmcgui.Dialog() selected = dialog.select(__language__( 30406 ), search) if (not selected == -1 ): - xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s)" % (self._path, search[selected], SEARCH_DATE_COMMAND)) + if (is_launcher): + return "%s?%s/%s" % (self._path, search[selected], SEARCH_DATE_COMMAND), search[selected] + else: + xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s)" % (self._path, search[selected], SEARCH_DATE_COMMAND)) #Search by System Platform type_nb = type_nb+1 @@ -2660,7 +2723,10 @@ def _find_roms( self ): dialog = xbmcgui.Dialog() selected = dialog.select(__language__( 30407 ), search) if (not selected == -1 ): - xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s)" % (self._path, search[selected], SEARCH_PLATFORM_COMMAND)) + if (is_launcher): + return "%s?%s/%s" % (self._path, search[selected], SEARCH_PLATFORM_COMMAND), search[selected] + else: + xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s)" % (self._path, search[selected], SEARCH_PLATFORM_COMMAND)) #Search by Studio type_nb = type_nb+1 @@ -2670,7 +2736,10 @@ def _find_roms( self ): dialog = xbmcgui.Dialog() selected = dialog.select(__language__( 30408 ), search) if (not selected == -1 ): - xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s)" % (self._path, search[selected], SEARCH_STUDIO_COMMAND)) + if (is_launcher): + return "%s?%s/%s" % (self._path, search[selected], SEARCH_STUDIO_COMMAND), search[selected] + else: + xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s)" % (self._path, search[selected], SEARCH_STUDIO_COMMAND)) #Search by Genre type_nb = type_nb+1 @@ -2680,7 +2749,10 @@ def _find_roms( self ): dialog = xbmcgui.Dialog() selected = dialog.select(__language__( 30409 ), search) if (not selected == -1 ): - xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s)" % (self._path, search[selected], SEARCH_GENRE_COMMAND)) + if (is_launcher): + return "%s?%s/%s" % (self._path, search[selected], SEARCH_GENRE_COMMAND), search[selected] + else: + xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s/%s)" % (self._path, search[selected], SEARCH_GENRE_COMMAND)) def _find_add_roms( self, search ): _find_category_roms( self, search, "name" ) From 814db83881c0fb67cd4b2428b35228340f68f866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Sat, 8 Mar 2014 08:50:00 -0500 Subject: [PATCH 64/80] Fix thumb and fanart link creation for categories, launchers and items. Fix GameFAQs thumbs and fanarts scrapers. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 6 ++++++ resources/language/English/strings.xml | 3 ++- resources/lib/launcher_plugin.py | 15 +++++++-------- .../scrapers/fanarts/GameFAQs/fanarts_scraper.py | 4 ++-- .../scrapers/thumbs/GameFAQs/thumbs_scraper.py | 4 ++-- 7 files changed, 21 insertions(+), 15 deletions(-) diff --git a/addon.py b/addon.py index cacff0a..16eec1f 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.3.0" +__version__ = "2.3.2" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 37dad19..3a75b29 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 537f7d3..6dc01b5 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,9 @@ +[B]2.3.2[/B] +. Fix thumb and fanart link creation for categories, launchers and items. + +[B]2.3.1[/B] +. Fix GameFAQs thumbs and fanarts scrapers. + [B]2.3.0[/B] . Add a queries launcher creation. . Fix message display for launchers fanart image change. diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 93fde84..9a06453 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -15,7 +15,8 @@ Select the launcher application Application arguments Set the title of the launcher - Query launcher (search engine) + Query launcher (Adv.L search engine) + Favourite launcher (XBMC favourites) Set files extensions, use "|" as separator. (e.g lnk|cbr) Downloading: %s Launching %s. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 3d16ebb..56d61ec 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -423,7 +423,7 @@ def _edit_rom(self, launcher, rom): if (image): if (os.path.isfile(image)): if ( self.launchers[launcher]["roms"][rom]["thumb"] != "" ): - _update_cache(file_path) + _update_cache(image) self.launchers[launcher]["roms"][rom]["thumb"] = image self._save_launchers() xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) @@ -474,7 +474,7 @@ def _edit_rom(self, launcher, rom): if (image): if (os.path.isfile(image)): if ( self.launchers[launcher]["roms"][rom]["fanart"] != "" ): - _update_cache(file_path) + _update_cache(image) self.launchers[launcher]["roms"][rom]["fanart"] = image self._save_launchers() xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) @@ -1008,7 +1008,7 @@ def _edit_category(self, categoryID): if (image): if (os.path.isfile(image)): if ( self.categories[categoryID]["thumb"] != "" ): - _update_cache(file_path) + _update_cache(image) self.categories[categoryID]["thumb"] = image self._save_launchers() xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) @@ -1051,7 +1051,7 @@ def _edit_category(self, categoryID): if (image): if (os.path.isfile(image)): if ( self.categories[categoryID]["fanart"] != "" ): - _update_cache(file_path) + _update_cache(image) self.categories[categoryID]["fanart"] = image self._save_launchers() xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) @@ -1189,7 +1189,7 @@ def _edit_launcher(self, launcherID): if (image): if (os.path.isfile(image)): if ( self.launchers[launcherID]["thumb"] != "" ): - _update_cache(file_path) + _update_cache(image) self.launchers[launcherID]["thumb"] = image self._save_launchers() xbmc_notify(__language__( 30000 ), __language__( 30070 ),3000) @@ -1238,7 +1238,7 @@ def _edit_launcher(self, launcherID): if (image): if (os.path.isfile(image)): if ( self.launchers[launcherID]["fanart"] != "" ): - _update_cache(file_path) + _update_cache(image) self.launchers[launcherID]["fanart"] = image self._save_launchers() xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) @@ -2673,10 +2673,9 @@ def _add_new_launcher ( self, categoryID ) : xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s)" % (self._path,categoryID)) return True - print launcher_query - if (type == 3): self._file_manager() + else: xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30613 ),3000) xbmc.executebuiltin("ReplaceWindow(Programs,%s)" % (self._path)) diff --git a/resources/scrapers/fanarts/GameFAQs/fanarts_scraper.py b/resources/scrapers/fanarts/GameFAQs/fanarts_scraper.py index 65a4c14..fe6bd2a 100644 --- a/resources/scrapers/fanarts/GameFAQs/fanarts_scraper.py +++ b/resources/scrapers/fanarts/GameFAQs/fanarts_scraper.py @@ -15,8 +15,8 @@ def _get_game_page_url(system,search): req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') search_page = urllib2.urlopen(req) for line in search_page.readlines(): - if '>Pics' in line: - games.append(re.findall('Pics', line.replace('\r\n', ''))) + if '>Images' in line: + games.append(re.findall('Images', line.replace('\r\n', ''))) if games: return ''.join(games[0]) except: diff --git a/resources/scrapers/thumbs/GameFAQs/thumbs_scraper.py b/resources/scrapers/thumbs/GameFAQs/thumbs_scraper.py index 2b6cf91..539c3e0 100644 --- a/resources/scrapers/thumbs/GameFAQs/thumbs_scraper.py +++ b/resources/scrapers/thumbs/GameFAQs/thumbs_scraper.py @@ -15,8 +15,8 @@ def _get_game_page_url(system,search): req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') search_page = urllib2.urlopen(req) for line in search_page.readlines(): - if '>Pics' in line: - games.append(re.findall('Pics', line.replace('\r\n', ''))) + if '>Images' in line: + games.append(re.findall('Images', line.replace('\r\n', ''))) if games: return ''.join(games[0]) except: From 9e18580080b07e958cec8dc9a6da11f1b2b2f34f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Sat, 8 Mar 2014 12:47:38 -0500 Subject: [PATCH 65/80] Add favourite launchers creation. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 ++ resources/language/English/strings.xml | 1 + resources/lib/launcher_plugin.py | 74 +++++++++++++++++--------- 5 files changed, 55 insertions(+), 27 deletions(-) diff --git a/addon.py b/addon.py index 16eec1f..745882d 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.3.2" +__version__ = "2.4.0" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 3a75b29..309bc5a 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 6dc01b5..a7b7cb2 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.4.0[/B] +. Add favourite launchers creation. + [B]2.3.2[/B] . Fix thumb and fanart link creation for categories, launchers and items. diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 9a06453..5b92973 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -76,6 +76,7 @@ New Category Name Category %s created Select the category + Select the favourite Import Mode Source diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 56d61ec..cbaff66 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -24,6 +24,7 @@ import subprocess_hack from user_agent import getUserAgent from file_item import Thumbnails +from xml.dom.minidom import parse # Dharma compatibility (import md5) try: @@ -35,6 +36,7 @@ PLUGIN_DATA_PATH = xbmc.translatePath(os.path.join("special://profile/addon_data","plugin.program.advanced.launcher")) BASE_PATH = xbmc.translatePath(os.path.join("special://","profile")) HOME_PATH = xbmc.translatePath(os.path.join("special://","home")) +FAVOURITES_PATH = xbmc.translatePath( 'special://profile/favourites.xml' ) ADDONS_PATH = xbmc.translatePath(os.path.join(HOME_PATH,"addons")) CURRENT_ADDON_PATH = xbmc.translatePath(os.path.join(ADDONS_PATH,"plugin.program.advanced.launcher")) BASE_CURRENT_SOURCE_PATH = os.path.join(PLUGIN_DATA_PATH,"launchers.xml") @@ -311,7 +313,7 @@ def _remove_category(self, categoryID): def _edit_rom(self, launcher, rom): dialog = xbmcgui.Dialog() - title=os.path.basename(self.launchers[launcher]["roms"][rom]["filename"]) + title=os.path.basename(self.launchers[launcher]["roms"][rom]["name"]) if (self.launchers[launcher]["roms"][rom]["finished"] == "false"): finished_display = __language__( 30339 ) else: @@ -1065,7 +1067,7 @@ def _edit_category(self, categoryID): def _edit_launcher(self, launcherID): dialog = xbmcgui.Dialog() - title=os.path.basename(self.launchers[launcherID]["application"]) + title=os.path.basename(self.launchers[launcherID]["name"]) if (self.launchers[launcherID]["finished"] == "false"): finished_display = __language__( 30339 ) else: @@ -1518,8 +1520,7 @@ def _run_launcher(self, launcherID): if (self.launchers.has_key(launcherID)): launcher = self.launchers[launcherID] apppath = os.path.dirname(launcher["application"]) - if ( os.path.basename(launcher["application"]).lower().replace(".exe" , "") == "xbmc" ): - print launcher["args"] + if ( os.path.basename(launcher["application"]).lower().replace(".exe" , "") == "xbmc" ) or ("xbmc-fav-" in launcher["application"]) or ("xbmc-sea-" in launcher["application"]): xbmc.executebuiltin('XBMC.%s' % launcher["args"]) else: if ( os.path.exists(apppath) ) : @@ -2531,7 +2532,7 @@ def _add_new_category ( self ) : def _add_new_launcher ( self, categoryID ) : if ( self.categories.has_key(categoryID) ): dialog = xbmcgui.Dialog() - type = dialog.select(__language__( 30101 ), [__language__( 30021 ), __language__( 30022 ), __language__( 30026 ),__language__( 30051 )]) + type = dialog.select(__language__( 30101 ), [__language__( 30021 ), __language__( 30022 ), __language__( 30026 ), __language__( 30027 ),__language__( 30051 )]) if (os.environ.get( "OS", "xbox" ) == "xbox"): filter = ".xbe|.cut" else: @@ -2639,7 +2640,8 @@ def _add_new_launcher ( self, categoryID ) : if (type == 2): launcher_query, query = self._find_roms(True) if (launcher_query): - app = "xbmc" + launcherid = _get_SID() + app = "xbmc-sea-%s" % launcherid args = 'ActivateWindow(10001,"%s")' % launcher_query title = os.path.basename(query) keyboard = xbmc.Keyboard(title.replace('.'+title.split('.')[-1],'').replace('.',' '), __language__( 30025 )) @@ -2647,25 +2649,7 @@ def _add_new_launcher ( self, categoryID ) : title = keyboard.getText() if ( title == "" ): title = os.path.basename(launcher_query) - # Selection of the thumbnails and fanarts path - if ( self.settings[ "launcher_thumb_path" ] == "" ): - thumb_path = xbmcgui.Dialog().browse(0,__language__( 30059 ),"files","", False, False) - else: - thumb_path = self.settings[ "launcher_thumb_path" ] - if ( self.settings[ "launcher_fanart_path" ] == "" ): - fanart_path = xbmcgui.Dialog().browse(0,__language__( 30060 ),"files","", False, False) - else: - fanart_path = self.settings[ "launcher_fanart_path" ] - # create launcher object data - if not (thumb_path): - thumb_path = "" - if not (fanart_path): - fanart_path = "" - if (sys.platform == "win32"): - launcher_lnk = "true" - else: - launcher_lnk = "" - launcherdata = {"name":title, "category":categoryID, "application":app, "args":args, "rompath":"", "thumbpath":thumb_path, "fanartpath":fanart_path, "custompath":"", "trailerpath":"", "romext":"", "gamesys":"xbmc", "thumb":"", "fanart":"", "genre":"", "release":"", "studio":"", "plot":"", "finished":"false", "lnk":launcher_lnk, "minimize":"false", "roms":{}} + launcherdata = {"name":title, "category":categoryID, "application":app, "args":args, "rompath":"", "thumbpath":"", "fanartpath":"", "custompath":"", "trailerpath":"", "romext":"", "gamesys":"xbmc", "thumb":"", "fanart":"", "genre":"", "release":"", "studio":"", "plot":"", "finished":"false", "lnk":"", "minimize":"false", "roms":{}} # add launcher to the launchers list (using name as index) launcherid = _get_SID() self.launchers[launcherid] = launcherdata @@ -2674,6 +2658,31 @@ def _add_new_launcher ( self, categoryID ) : return True if (type == 3): + favourites, fav_nanes = _get_favourites_list() + favourite_url = dialog.select(__language__( 30115 ), fav_nanes) + if ( favourite_url ): + launcherid = _get_SID() + app = "xbmc-fav-%s" % launcherid + args = favourites[favourite_url][0] + title = os.path.basename(favourites[favourite_url][2]) + keyboard = xbmc.Keyboard(title.replace('.'+title.split('.')[-1],'').replace('.',' '), __language__( 30025 )) + keyboard.doModal() + title = keyboard.getText() + if ( title == "" ): + title = os.path.basename(favourites[favourite_url][2]) + if (favourites[favourite_url][1] != ""): + thumb = favourites[favourite_url][1] + else: + thumb = "" + launcherdata = {"name":title, "category":categoryID, "application":app, "args":args, "rompath":"", "thumbpath":"", "fanartpath":"", "custompath":"", "trailerpath":"", "romext":"", "gamesys":"xbmc", "thumb":thumb, "fanart":"", "genre":"", "release":"", "studio":"", "plot":"", "finished":"false", "lnk":"", "minimize":"false", "roms":{}} + # add launcher to the launchers list (using name as index) + launcherid = _get_SID() + self.launchers[launcherid] = launcherdata + self._save_launchers() + xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s)" % (self._path,categoryID)) + return True + + if (type == 4): self._file_manager() else: @@ -2913,6 +2922,21 @@ def _get_game_system_list(): except: return platforms +def _get_favourites_list(): + favourites = [] + fav_names = [] + if os.path.isfile( FAVOURITES_PATH ): + fav_xml = parse( FAVOURITES_PATH ) + fav_doc = fav_xml.documentElement.getElementsByTagName( 'favourite' ) + for count, favourite in enumerate(fav_doc): + try: + fav_icon = favourite.attributes[ 'thumb' ].nodeValue + except: + fav_icon = "DefaultProgram.png" + favourites.append((favourite.childNodes[ 0 ].nodeValue.encode('utf8','ignore'), fav_icon.encode('utf8','ignore'), favourite.attributes[ 'name' ].nodeValue.encode('utf8','ignore'))) + fav_names.append(favourite.attributes[ 'name' ].nodeValue.encode('utf8','ignore')) + return favourites, fav_names + def _search_category(self,category): search = [] if (len(self.launchers) > 0): From 171600e0f60a169bb00b2b948261c391f5560c06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Sat, 8 Mar 2014 14:14:10 -0500 Subject: [PATCH 66/80] Fix ComicVine thumbs scraper. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 +++ resources/scrapers/thumbs/ComicVine/thumbs_scraper.py | 4 ++-- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/addon.py b/addon.py index 745882d..946e98d 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.4.0" +__version__ = "2.4.1" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 309bc5a..5c4f6a0 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index a7b7cb2..f43abe6 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.4.1[/B] +. Fix ComicVine thumbs scraper. + [B]2.4.0[/B] . Add favourite launchers creation. diff --git a/resources/scrapers/thumbs/ComicVine/thumbs_scraper.py b/resources/scrapers/thumbs/ComicVine/thumbs_scraper.py index 0d29d96..d8c4b42 100644 --- a/resources/scrapers/thumbs/ComicVine/thumbs_scraper.py +++ b/resources/scrapers/thumbs/ComicVine/thumbs_scraper.py @@ -12,7 +12,7 @@ def _get_game_page_url(system,search): try: f = urllib.urlopen('http://www.comicvine.com/search/?indices[0]=cv_issue&q="'+urllib.quote(search.lower())+'"') page = f.read().replace('\r\n', '').replace('\n', '').strip('\t') - issues = re.findall('/4000-(.*?)/">

(.*?)

(.*?)

(.*?) issue \((.*?)\)', page) + issues = re.findall('/4000-(.*?)/">

(.*?)', page) for issue in issues: comic = {} comic["url"] = 'http://www.comicvine.com/issue/4000-'+issue[0]+'/' @@ -20,7 +20,7 @@ def _get_game_page_url(system,search): return comics_results except: return comics_results - + # Thumbnails list scrapper def _get_thumbnails_list(system,search,region,imgsize): covers = [] From 63513d59766d0fc23a739339cf7794052d3c68a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Sat, 8 Mar 2014 16:36:38 -0500 Subject: [PATCH 67/80] . Fix GameFAQs info scraper. . Fix GameFAQs gamesystem reference list. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 4 ++++ resources/scrapers/datas/GameFAQs/datas_scraper.py | 8 ++++---- resources/scrapers/gamesys | 2 +- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/addon.py b/addon.py index 946e98d..e7c1aaa 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.4.1" +__version__ = "2.4.2" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 5c4f6a0..a7808c4 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index f43abe6..b2e9f6d 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,7 @@ +[B]2.4.2[/B] +. Fix GameFAQs info scraper. +. Fix GameFAQs gamesystem reference list. + [B]2.4.1[/B] . Fix ComicVine thumbs scraper. diff --git a/resources/scrapers/datas/GameFAQs/datas_scraper.py b/resources/scrapers/datas/GameFAQs/datas_scraper.py index 0b5bc92..1aa7e42 100644 --- a/resources/scrapers/datas/GameFAQs/datas_scraper.py +++ b/resources/scrapers/datas/GameFAQs/datas_scraper.py @@ -60,17 +60,17 @@ def _get_game_data(game_url): req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') f = urllib2.urlopen(req) page = f.read().replace('\r\n', '') - game_genre = re.findall(' » (.*?) » (.*?)
  • (.*?)
  • ', page) if game_genre: - gamedata["genre"] = game_genre[0][1] + gamedata["genre"] = game_genre[0][4] game_release = re.findall('Release: (.*?) »', page) if game_release: gamedata["release"] = game_release[0][1][-4:] - game_studio = re.findall('
    • (.*?)
    • ', page) + game_studio = re.findall('
    • (.*?)', page) if game_studio: p = re.compile(r'<.*?>') gamedata["studio"] = p.sub('', game_studio[0][1]) - game_plot = re.findall('Description
    (.*?)
    ', page) + game_plot = re.findall('Description
    (.*?)
    ', page) if game_plot: gamedata["plot"] = unescape(game_plot[0]) return gamedata diff --git a/resources/scrapers/gamesys b/resources/scrapers/gamesys index 9f35498..a420e7c 100644 --- a/resources/scrapers/gamesys +++ b/resources/scrapers/gamesys @@ -112,7 +112,7 @@ "Playstation",27,78,6,"Sony Playstation" "Playstation 3",45561,113,81,"Sony Playstation 3" "Playstation 4",,120,, -"Playstation Portable",,1024,109,"Sony PSP" +"Playstation Portable",,109,109,"Sony PSP" "Plug and Play",31822,,, "Pokemon Mini",41008,,, "RCA Studio II",17670,5,, From 9c5d71929b99e6dfc0b637c8ce523991a0057d61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Sat, 8 Mar 2014 22:50:00 -0500 Subject: [PATCH 68/80] Add a new info collecting method : NFO+scraper. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 + resources/language/English/strings.xml | 2 + resources/lib/launcher_plugin.py | 89 ++++++++++++++------------ resources/settings.xml | 4 +- 6 files changed, 58 insertions(+), 44 deletions(-) diff --git a/addon.py b/addon.py index e7c1aaa..e461e81 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.4.2" +__version__ = "2.4.3" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index a7808c4..479a0fe 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index b2e9f6d..ba1bef8 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.4.3[/B] +. Add a new info collecting method : NFO+scraper + [B]2.4.2[/B] . Fix GameFAQs info scraper. . Fix GameFAQs gamesystem reference list. diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 5b92973..6e6e767 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -42,6 +42,7 @@ Importing %s info from %s Importing %s file from path + Importing %s info from NFO File or %s Impossible to assign thumb for %s Impossible to assign fanart for %s Importing %s thumb from %s @@ -124,6 +125,7 @@ Collecting Method NFO Files Scrapers + NFO Files + Scrapers Launchers Default Paths Title Formatting Local Images diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index cbaff66..971cbbc 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -2047,6 +2047,8 @@ def _import_roms(self, launcherID, addRoms = False): import_text = __language__( 30061 ) % (f.replace("."+f.split(".")[-1],""),__language__( 30167 )) if ( self.settings[ "datas_method" ] == "2" ): import_text = __language__( 30061 ) % (f.replace("."+f.split(".")[-1],""),self.settings[ "datas_scraper" ].encode('utf-8','ignore')) + if ( self.settings[ "datas_method" ] == "3" ): + import_text = __language__( 30084 ) % (f.replace("."+f.split(".")[-1],""),self.settings[ "datas_scraper" ].encode('utf-8','ignore')) pDialog.update(filesCount * 100 / len(files), import_text) self._print_log(__language__( 30725 ) % fullname) for ext in exts.split("|"): @@ -2100,10 +2102,13 @@ def _import_roms(self, launcherID, addRoms = False): self._print_log(import_text) self._print_log(__language__( 30732 ) % romname) # Search game title from scrapers - if ( self.settings[ "datas_method" ] == "1" ): + + # Scrap from NFO files + if ( self.settings[ "datas_method" ] == "1" ) or ( self.settings[ "datas_method" ] == "3" ) : nfo_file=os.path.splitext(romdata["filename"])[0]+".nfo" self._print_log(__language__( 30719 ) % nfo_file) if (os.path.isfile(nfo_file)): + found_nfo = 1 self._print_log(__language__( 30715 )) self._print_log(__language__( 30733 ) % nfo_file) ff = open(nfo_file, 'r') @@ -2122,54 +2127,58 @@ def _import_roms(self, launcherID, addRoms = False): if len(item_plot) > 0 : romdata["plot"] = item_plot[0].replace('"','"') ff.close() else: + found_nfo = 0 self._print_log(__language__( 30726 )) romdata["name"] = title_format(self,romname) - self._print_log(__language__( 30734 )) - else: - if ( self.settings[ "datas_method" ] != "0" ): - romdata["name"] = clean_filename(romname) - if ( app.lower().find('mame') > 0 ) or ( self.settings[ "datas_scraper" ] == 'arcadeHITS' ): - self._print_log(__language__( 30735 )) - results = self._get_first_game(f[:-len(ext)-1],gamesys) + self._print_log(__language__( 30734 )) + + # Scrap from www database + if ( self.settings[ "datas_method" ] == "2" ) or ((self.settings[ "datas_method" ] == "3") and (found_nfo == 0)) : + romdata["name"] = clean_filename(romname) + if ( app.lower().find('mame') > 0 ) or ( self.settings[ "datas_scraper" ] == 'arcadeHITS' ): + self._print_log(__language__( 30735 )) + results = self._get_first_game(f[:-len(ext)-1],gamesys) + selectgame = 0 + else: + if ( self.settings[ "scrap_info" ] == "1" ): + self._print_log(__language__( 30736 )) + results = self._get_first_game(romdata["name"],gamesys) selectgame = 0 else: - if ( self.settings[ "scrap_info" ] == "1" ): - self._print_log(__language__( 30736 )) - results = self._get_first_game(romdata["name"],gamesys) - selectgame = 0 + self._print_log(__language__( 30737 )) + results,display = self._get_games_list(romdata["name"]) + if display: + # Display corresponding game list found + dialog = xbmcgui.Dialog() + # Game selection + selectgame = dialog.select(__language__( 30078 ) % ( self.settings[ "datas_scraper" ] ), display) + if (selectgame == -1): + results = [] + if results: + foundname = results[selectgame]["title"] + if (foundname != ""): + if ( self.settings[ "ignore_title" ] ): + romdata["name"] = title_format(self,romname) else: - self._print_log(__language__( 30737 )) - results,display = self._get_games_list(romdata["name"]) - if display: - # Display corresponding game list found - dialog = xbmcgui.Dialog() - # Game selection - selectgame = dialog.select(__language__( 30078 ) % ( self.settings[ "datas_scraper" ] ), display) - if (selectgame == -1): - results = [] - if results: - foundname = results[selectgame]["title"] - if (foundname != ""): - if ( self.settings[ "ignore_title" ] ): - romdata["name"] = title_format(self,romname) - else: - romdata["name"] = title_format(self,foundname) - - # Game other game data - gamedata = self._get_game_data(results[selectgame]["id"]) - romdata["genre"] = gamedata["genre"] - romdata["release"] = gamedata["release"] - romdata["studio"] = gamedata["studio"] - romdata["plot"] = gamedata["plot"] - progress_display = romdata["name"] + " (" + romdata["release"] + ")" - else: - progress_display = romname + ": " +__language__( 30503 ) + romdata["name"] = title_format(self,foundname) + + # Game other game data + gamedata = self._get_game_data(results[selectgame]["id"]) + romdata["genre"] = gamedata["genre"] + romdata["release"] = gamedata["release"] + romdata["studio"] = gamedata["studio"] + romdata["plot"] = gamedata["plot"] + progress_display = romdata["name"] + " (" + romdata["release"] + ")" else: - romdata["name"] = title_format(self,romname) progress_display = romname + ": " +__language__( 30503 ) else: - self._print_log(__language__( 30738 )) romdata["name"] = title_format(self,romname) + progress_display = romname + ": " +__language__( 30503 ) + + # No scrap + if ( self.settings[ "datas_method" ] == "0" ): + self._print_log(__language__( 30738 )) + romdata["name"] = title_format(self,romname) # Search if thumbnails and fanarts already exist self._print_log(__language__( 30704 ) % fullname ) diff --git a/resources/settings.xml b/resources/settings.xml index 0401ce8..38b9982 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -6,8 +6,8 @@ - - + + From 24fcf504863933a5b9e1442a80df119e591fcfc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Sun, 9 Mar 2014 09:06:35 -0400 Subject: [PATCH 69/80] Fix first favourite item list launcher creation bug. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 +++ resources/lib/launcher_plugin.py | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/addon.py b/addon.py index e461e81..67cf6a5 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.4.3" +__version__ = "2.4.4" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 479a0fe..5f26d03 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index ba1bef8..39fa84d 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.4.4[/B] +. Fix first favourite item list launcher creation bug. + [B]2.4.3[/B] . Add a new info collecting method : NFO+scraper diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 971cbbc..10437e8 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -2669,7 +2669,7 @@ def _add_new_launcher ( self, categoryID ) : if (type == 3): favourites, fav_nanes = _get_favourites_list() favourite_url = dialog.select(__language__( 30115 ), fav_nanes) - if ( favourite_url ): + if ( favourite_url != -1): launcherid = _get_SID() app = "xbmc-fav-%s" % launcherid args = favourites[favourite_url][0] From d2fc7bacb081e346ef3717fa5915d5c7330285ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Sun, 9 Mar 2014 14:43:37 -0400 Subject: [PATCH 70/80] Fix default thumbs and fanarts paths for query and favourite launchers. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 +++ resources/lib/launcher_plugin.py | 4 ++-- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/addon.py b/addon.py index 67cf6a5..1920d70 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.4.4" +__version__ = "2.4.5" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 5f26d03..6fe5854 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 39fa84d..8df63d9 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.4.5[/B] +. Fix default thumbs and fanarts paths for query and favourite launchers. + [B]2.4.4[/B] . Fix first favourite item list launcher creation bug. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 10437e8..032bb99 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -2658,7 +2658,7 @@ def _add_new_launcher ( self, categoryID ) : title = keyboard.getText() if ( title == "" ): title = os.path.basename(launcher_query) - launcherdata = {"name":title, "category":categoryID, "application":app, "args":args, "rompath":"", "thumbpath":"", "fanartpath":"", "custompath":"", "trailerpath":"", "romext":"", "gamesys":"xbmc", "thumb":"", "fanart":"", "genre":"", "release":"", "studio":"", "plot":"", "finished":"false", "lnk":"", "minimize":"false", "roms":{}} + launcherdata = {"name":title, "category":categoryID, "application":app, "args":args, "rompath":"", "thumbpath":DEFAULT_THUMB_PATH, "fanartpath":DEFAULT_FANART_PATH, "custompath":"", "trailerpath":"", "romext":"", "gamesys":"xbmc", "thumb":"", "fanart":"", "genre":"", "release":"", "studio":"", "plot":"", "finished":"false", "lnk":"", "minimize":"false", "roms":{}} # add launcher to the launchers list (using name as index) launcherid = _get_SID() self.launchers[launcherid] = launcherdata @@ -2683,7 +2683,7 @@ def _add_new_launcher ( self, categoryID ) : thumb = favourites[favourite_url][1] else: thumb = "" - launcherdata = {"name":title, "category":categoryID, "application":app, "args":args, "rompath":"", "thumbpath":"", "fanartpath":"", "custompath":"", "trailerpath":"", "romext":"", "gamesys":"xbmc", "thumb":thumb, "fanart":"", "genre":"", "release":"", "studio":"", "plot":"", "finished":"false", "lnk":"", "minimize":"false", "roms":{}} + launcherdata = {"name":title, "category":categoryID, "application":app, "args":args, "rompath":"", "thumbpath":DEFAULT_THUMB_PATH, "fanartpath":DEFAULT_FANART_PATH, "custompath":"", "trailerpath":"", "romext":"", "gamesys":"xbmc", "thumb":thumb, "fanart":"", "genre":"", "release":"", "studio":"", "plot":"", "finished":"false", "lnk":"", "minimize":"false", "roms":{}} # add launcher to the launchers list (using name as index) launcherid = _get_SID() self.launchers[launcherid] = launcherdata From 115c3f4fdae74a7058c7b776067c8afc12d10281 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Sat, 15 Mar 2014 10:42:36 -0400 Subject: [PATCH 71/80] Add feature to mark categories as finished/unfinished. Modify settings to show/hide finished categories/launcher/items. Improve launchers.xml file parsing. Fix compatibility with launchers.xml files created from 2.0.0 prior versions. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 6 ++ resources/language/English/strings.xml | 2 +- resources/lib/launcher_plugin.py | 79 ++++++++++++++++++-------- 5 files changed, 64 insertions(+), 27 deletions(-) diff --git a/addon.py b/addon.py index 1920d70..f51caad 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.4.5" +__version__ = "2.5.0" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 6fe5854..3a948cd 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 8df63d9..556b612 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,9 @@ +[B]2.5.0[/B] +. Add feature to mark categories as finished/unfinished. +. Modify settings to show/hide finished categories/launcher/items. +. Improve launchers.xml file parsing. +. Fix compatibility with launchers.xml files created from 2.0.0 prior versions. + [B]2.4.5[/B] . Fix default thumbs and fanarts paths for query and favourite launchers. diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 6e6e767..d1065b0 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -132,7 +132,7 @@ Scraper settings Scan settings Disable LIRC (Linux) - Hide launchers and items marked as finished + Hide categories/launchers/items marked as finished Prefered images Snapshots Flyers diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 032bb99..1a6ed70 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -314,7 +314,7 @@ def _remove_category(self, categoryID): def _edit_rom(self, launcher, rom): dialog = xbmcgui.Dialog() title=os.path.basename(self.launchers[launcher]["roms"][rom]["name"]) - if (self.launchers[launcher]["roms"][rom]["finished"] == "false"): + if (self.launchers[launcher]["roms"][rom]["finished"] != "true"): finished_display = __language__( 30339 ) else: finished_display = __language__( 30340 ) @@ -482,7 +482,7 @@ def _edit_rom(self, launcher, rom): xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) if (type == 4 ): - if (self.launchers[launcher]["roms"][rom]["finished"] == "false"): + if (self.launchers[launcher]["roms"][rom]["finished"] != "true"): self.launchers[launcher]["roms"][rom]["finished"] = "true" else: self.launchers[launcher]["roms"][rom]["finished"] = "false" @@ -969,7 +969,11 @@ def _modify_category(self, categoryID): def _edit_category(self, categoryID): dialog = xbmcgui.Dialog() - type = dialog.select(__language__( 30300 ) % self.categories[categoryID]["name"], [__language__( 30301 ),__language__( 30302 ),__language__( 30303 ),__language__( 30304 )]) + if (self.categories[categoryID]["finished"] != "true"): + finished_display = __language__( 30339 ) + else: + finished_display = __language__( 30340 ) + type = dialog.select(__language__( 30300 ) % self.categories[categoryID]["name"], [__language__( 30301 ),__language__( 30302 ),__language__( 30303 ),finished_display,__language__( 30304 )]) if (type == 0 ): self._modify_category(categoryID) # Category Thumb menu option @@ -1057,7 +1061,16 @@ def _edit_category(self, categoryID): self.categories[categoryID]["fanart"] = image self._save_launchers() xbmc_notify(__language__( 30000 ), __language__( 30075 ),3000) + + # Category status if (type == 3 ): + if (self.categories[categoryID]["finished"] != "true"): + self.categories[categoryID]["finished"] = "true" + else: + self.categories[categoryID]["finished"] = "false" + self._save_launchers() + + if (type == 4 ): self._remove_category(categoryID) if (type == -1 ): self._save_launchers() @@ -1068,7 +1081,7 @@ def _edit_category(self, categoryID): def _edit_launcher(self, launcherID): dialog = xbmcgui.Dialog() title=os.path.basename(self.launchers[launcherID]["name"]) - if (self.launchers[launcherID]["finished"] == "false"): + if (self.launchers[launcherID]["finished"] != "true"): finished_display = __language__( 30339 ) else: finished_display = __language__( 30340 ) @@ -1261,10 +1274,10 @@ def _edit_launcher(self, launcherID): self._save_launchers() xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s)" % (self._path, categories_id[selected_cat])) - # Launcher's Items status + # Launcher status type_nb = type_nb+1 if (type == type_nb ): - if (self.launchers[launcherID]["finished"] == "false"): + if (self.launchers[launcherID]["finished"] != "true"): self.launchers[launcherID]["finished"] = "true" else: self.launchers[launcherID]["finished"] = "false" @@ -1856,7 +1869,7 @@ def _save_launchers (self): # Create Categories XML list for categoryIndex in sorted(self.categories, key= lambda x : self.categories[x]["name"]): category = self.categories[categoryIndex] - xml_content += "\t\t\n\t\t\t"+categoryIndex+"\n\t\t\t"+category["name"]+"\n\t\t\t"+category["thumb"]+"\n\t\t\t"+category["fanart"]+"\n\t\t\t"+category["genre"]+"\n\t\t\t"+category["plot"]+"\n\t\t\n" + xml_content += "\t\t\n\t\t\t"+categoryIndex+"\n\t\t\t"+category["name"]+"\n\t\t\t"+category["thumb"]+"\n\t\t\t"+category["fanart"]+"\n\t\t\t"+category["genre"]+"\n\t\t\t"+category["plot"]+"\n\t\t\t"+category["finished"]+"\n\t\t\n" xml_content += "\t\n\t\n" # Create Launchers XML list for launcherIndex in sorted(self.launchers, key= lambda x : self.launchers[x]["name"]): @@ -1904,14 +1917,18 @@ def _load_launchers(self, xmlSource): categories = re.findall( "(.*?)", xml_categories[0] ) for category in categories: categorydata = {} - category_index = ["id","name","thumb","fanart","genre","plot"] - values = re.findall( "(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)", category) + category_index = ["id","name","thumb","fanart","genre","plot","finished"] + values = [re.findall("(.*?)",category), re.findall("(.*?)",category), re.findall("(.*?)",category), re.findall("(.*?)",category), re.findall("(.*?)",category), re.findall("(.*?)",category), re.findall("(.*?)",category)] + print values for index, n in enumerate(category_index): - categorydata[n] = values[0][index] + try: + categorydata[n] = values[index][0] + except: + categorydata[n] = "" self.categories[categorydata["id"]] = categorydata # Else create the default category else: - self.categories["default"] = {"id":"default", "name":"Default", "thumb":"", "fanart":"", "genre":"", "plot":""} + self.categories["default"] = {"id":"default", "name":"Default", "thumb":"", "fanart":"", "genre":"", "plot":"", "finished":"false"} # Get launchers list from XML source xml_launchers = re.findall( "(.*?)", xmlSource ) # If launchers exist ()... @@ -1920,9 +1937,15 @@ def _load_launchers(self, xmlSource): for launcher in launchers: launcherdata = {} launcher_index = ["id","name","category","application","args","rompath","thumbpath","fanartpath","trailerpath","custompath","romext","gamesys","thumb","fanart","genre","release","studio","plot","finished","minimize","lnk","roms"] - values = re.findall("(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)", launcher) + values = [re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher), re.findall("(.*?)",launcher)] for index, n in enumerate(launcher_index): - launcherdata[n] = values[0][index] + try: + launcherdata[n] = values[index][0] + except: + launcherdata[n] = "" + # Fix category to unassigned launcher + if (launcherdata["category"] == ""): + launcherdata["category"] = "default" # Get roms list from XML source roms = re.findall( "(.*?)", launcherdata["roms"] ) roms_list = {} @@ -1931,9 +1954,12 @@ def _load_launchers(self, xmlSource): for rom in roms: romdata = {} rom_index = ["id","name","filename","thumb","fanart","trailer","custom","genre","release","studio","plot","finished","altapp","altarg"] - r_values = re.findall( "(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)(.*?)", rom) + r_values = [re.findall("(.*?)",rom), re.findall("(.*?)",rom), re.findall("(.*?)",rom), re.findall("(.*?)",rom), re.findall("(.*?)",rom), re.findall("(.*?)",rom), re.findall("(.*?)",rom), re.findall("(.*?)",rom), re.findall("(.*?)",rom), re.findall("(.*?)",rom), re.findall("(.*?)",rom), re.findall("(.*?)",rom), re.findall("(.*?)",rom), re.findall("(.*?)",rom)] for r_index, r_n in enumerate(rom_index): - romdata[r_n] = r_values[0][r_index] + try: + romdata[r_n] = r_values[r_index][0] + except : + romdata[r_n] = "" romdata["gamesys"] = launcherdata["gamesys"] roms_list[romdata["id"]] = romdata launcherdata["roms"] = roms_list @@ -1942,7 +1968,7 @@ def _load_launchers(self, xmlSource): def _get_categories( self ): for key in sorted(self.categories, key= lambda x : self.categories[x]["name"]): if ( not self.settings[ "hide_default_cat" ] or self.categories[key]['id'] != "default" ): - self._add_category(self.categories[key]["name"], self.categories[key]["thumb"], self.categories[key]["fanart"], self.categories[key]["genre"], self.categories[key]["plot"], len(self.categories), key) + self._add_category(self.categories[key]["name"], self.categories[key]["thumb"], self.categories[key]["fanart"], self.categories[key]["genre"], self.categories[key]["plot"], self.categories[key]["finished"], len(self.categories), key) xbmcplugin.endOfDirectory( handle=int( self._handle ), succeeded=True, cacheToDisc=False ) def _get_launchers( self, categoryID ): @@ -2365,7 +2391,7 @@ def _import_roms(self, launcherID, addRoms = False): else: xbmc_notify(__language__( 30000 ), __language__( 30016 ) % (romsCount, skipCount) + " " + __language__( 30050 ),3000) - def _add_category(self, name, thumb, fanart, genre, plot, total, key): + def _add_category(self, name, thumb, fanart, genre, plot, finished, total, key): commands = [] commands.append((__language__( 30512 ), "XBMC.RunPlugin(%s?%s)" % (self._path, SEARCH_COMMAND) , )) commands.append((__language__( 30051 ), "XBMC.RunPlugin(%s?%s)" % (self._path, FILE_MANAGER_COMMAND) , )) @@ -2379,10 +2405,15 @@ def _add_category(self, name, thumb, fanart, genre, plot, total, key): else: listitem = xbmcgui.ListItem( name, iconImage=icon ) commands.append(( __language__( 30194 ), "XBMC.RunPlugin(%s?%s/%s)" % (self._path, key, ADD_COMMAND) , )) + if ( finished != "true" ): + ICON_OVERLAY = 6 + else: + ICON_OVERLAY = 7 listitem.setProperty("fanart_image", fanart) - listitem.setInfo( "video", { "Title": name, "Genre" : genre, "Plot" : plot} ) + listitem.setInfo( "video", { "Title": name, "Genre" : genre, "Plot" : plot, "overlay": ICON_OVERLAY } ) listitem.addContextMenuItems( commands ) - xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s" % (self._path, key), listitem=listitem, isFolder=True) + if ( finished != "true" ) or ( self.settings[ "hide_finished" ] == False) : + xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s" % (self._path, key), listitem=listitem, isFolder=True) def _add_launcher(self, name, category, cmd, path, thumbpath, fanartpath, trailerpath, custompath, ext, gamesys, thumb, fanart, genre, release, studio, plot, finished, lnk, minimize, roms, total, key) : if (int(xbmc.getInfoLabel("System.BuildVersion")[0:2]) < 12 ): @@ -2411,14 +2442,14 @@ def _add_launcher(self, name, category, cmd, path, thumbpath, fanartpath, traile listitem = xbmcgui.ListItem( name, iconImage=icon ) filename = os.path.splitext(cmd) - if ( finished == "false" ): + if ( finished != "true" ): ICON_OVERLAY = 6 else: ICON_OVERLAY = 7 listitem.setProperty("fanart_image", fanart) listitem.setInfo( "video", { "Title": name, "Label": os.path.basename(cmd), "Plot" : plot , "Studio" : studio , "Genre" : genre , "Premiered" : release , display_date_format : release , "Writer" : gamesys , "Trailer" : os.path.join(trailerpath), "Director" : os.path.join(custompath), "overlay": ICON_OVERLAY } ) listitem.addContextMenuItems( commands ) - if ( finished == "false" ) or ( self.settings[ "hide_finished" ] == False) : + if ( finished != "true" ) or ( self.settings[ "hide_finished" ] == False) : xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s" % (self._path, category, key), listitem=listitem, isFolder=folder) def _add_rom( self, launcherID, name, cmd , romgamesys, thumb, romfanart, romtrailer, romcustom, romgenre, romrelease, romstudio, romplot, finished, altapp, altarg, total, key, search, search_url): @@ -2434,7 +2465,7 @@ def _add_rom( self, launcherID, name, cmd , romgamesys, thumb, romfanart, romtra listitem = xbmcgui.ListItem( name, iconImage=icon, thumbnailImage=thumb) else: listitem = xbmcgui.ListItem( name, iconImage=icon) - if ( finished == "false" ): + if ( finished != "true" ): ICON_OVERLAY = 6 else: ICON_OVERLAY = 7 @@ -2447,7 +2478,7 @@ def _add_rom( self, launcherID, name, cmd , romgamesys, thumb, romfanart, romtra if search : commands.append((__language__( 30513 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, self.launchers[launcherID]["category"], launcherID, SEARCH_COMMAND) , )) listitem.addContextMenuItems( commands ) - if ( finished == "false" ) or ( self.settings[ "hide_finished" ] == False) : + if ( finished != "true" ) or ( self.settings[ "hide_finished" ] == False) : xbmcplugin.addDirectoryItem( handle=int( self._handle ), url="%s?%s/%s/%s" % (self._path, self.launchers[launcherID]["category"], launcherID, key), listitem=listitem, isFolder=False) def _add_new_rom ( self , launcherID) : @@ -2528,7 +2559,7 @@ def _add_new_category ( self ) : keyboard = xbmc.Keyboard("", __language__( 30112 )) keyboard.doModal() if (keyboard.isConfirmed()): - categorydata = {"name":keyboard.getText(),"thumb":"","fanart":"","genre":"","plot":""} + categorydata = {"name":keyboard.getText(),"thumb":"","fanart":"","genre":"","plot":"","finished":"false"} categoryid = _get_SID() self.categories[categoryid] = categorydata self._save_launchers() From 4f21c440524db6510a16e8ba838f4bf152237910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwena=C3=ABl?= Date: Tue, 8 Apr 2014 21:37:05 -0400 Subject: [PATCH 72/80] . Fix GameFAQs scrapers. . Fix empty query launcher bug. . Code cleaning. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 5 +++++ resources/lib/launcher_plugin.py | 6 ++++-- resources/scrapers/datas/GameFAQs/datas_scraper.py | 14 +++++++------- .../scrapers/fanarts/GameFAQs/fanarts_scraper.py | 4 ++-- .../scrapers/thumbs/GameFAQs/thumbs_scraper.py | 13 +++++-------- 7 files changed, 25 insertions(+), 21 deletions(-) diff --git a/addon.py b/addon.py index f51caad..f4eb285 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.5.0" +__version__ = "2.5.1" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 3a948cd..af05ed4 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 556b612..cf09da9 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,8 @@ +[B]2.5.1[/B] +. Fix GameFAQs scrapers. +. Fix empty query launcher bug. +. Code cleaning. + [B]2.5.0[/B] . Add feature to mark categories as finished/unfinished. . Modify settings to show/hide finished categories/launcher/items. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 1a6ed70..8ea2a0b 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -1919,7 +1919,6 @@ def _load_launchers(self, xmlSource): categorydata = {} category_index = ["id","name","thumb","fanart","genre","plot","finished"] values = [re.findall("(.*?)",category), re.findall("(.*?)",category), re.findall("(.*?)",category), re.findall("(.*?)",category), re.findall("(.*?)",category), re.findall("(.*?)",category), re.findall("(.*?)",category)] - print values for index, n in enumerate(category_index): try: categorydata[n] = values[index][0] @@ -2678,7 +2677,10 @@ def _add_new_launcher ( self, categoryID ) : xbmc.executebuiltin("ReplaceWindow(Programs,%s?%s)" % (self._path,categoryID)) return True if (type == 2): - launcher_query, query = self._find_roms(True) + try: + launcher_query, query = self._find_roms(True) + except: + return False if (launcher_query): launcherid = _get_SID() app = "xbmc-sea-%s" % launcherid diff --git a/resources/scrapers/datas/GameFAQs/datas_scraper.py b/resources/scrapers/datas/GameFAQs/datas_scraper.py index 1aa7e42..9dfaae7 100644 --- a/resources/scrapers/datas/GameFAQs/datas_scraper.py +++ b/resources/scrapers/datas/GameFAQs/datas_scraper.py @@ -14,12 +14,12 @@ def _get_games_list(search): req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') f = urllib2.urlopen(req) gets = {} - gets = re.findall(' (.*?)', f.read().replace('\r\n', '')) + gets = re.findall('(.*?)(.*?)', f.read().replace('\r\n', '')) for get in gets: game = {} - gamesystem = get[0].split('/') - game["id"] = 'http://www.gamefaqs.com'+get[0] - game["title"] = unescape(get[1]) + gamesystem = get[1].split('/') + game["id"] = 'http://www.gamefaqs.com'+get[1] + game["title"] = unescape(get[4]) game["gamesys"] = gamesystem[1].capitalize() results.append(game) display.append(game["title"]+" / "+game["gamesys"]) @@ -36,11 +36,11 @@ def _get_first_game(search,gamesys): req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') f = urllib2.urlopen(req) gets = {} - gets = re.findall(' (.*?)', f.read().replace('\r\n', '')) + gets = re.findall('(.*?)(.*?)', f.read().replace('\r\n', '')) for get in gets: game = {} - game["id"] = 'http://www.gamefaqs.com'+get[0] - game["title"] = unescape(get[1]) + game["id"] = 'http://www.gamefaqs.com'+get[1] + game["title"] = unescape(get[4]) game["gamesys"] = gamesys results.append(game) return results diff --git a/resources/scrapers/fanarts/GameFAQs/fanarts_scraper.py b/resources/scrapers/fanarts/GameFAQs/fanarts_scraper.py index fe6bd2a..e0f6d5a 100644 --- a/resources/scrapers/fanarts/GameFAQs/fanarts_scraper.py +++ b/resources/scrapers/fanarts/GameFAQs/fanarts_scraper.py @@ -16,9 +16,9 @@ def _get_game_page_url(system,search): search_page = urllib2.urlopen(req) for line in search_page.readlines(): if '>Images' in line: - games.append(re.findall('Images', line.replace('\r\n', ''))) + games.append(re.findall('Images', line.replace('\r\n', ''))) if games: - return ''.join(games[0]) + return ''.join(games[0][0][1]) except: return "" diff --git a/resources/scrapers/thumbs/GameFAQs/thumbs_scraper.py b/resources/scrapers/thumbs/GameFAQs/thumbs_scraper.py index 539c3e0..fe0056b 100644 --- a/resources/scrapers/thumbs/GameFAQs/thumbs_scraper.py +++ b/resources/scrapers/thumbs/GameFAQs/thumbs_scraper.py @@ -16,24 +16,22 @@ def _get_game_page_url(system,search): search_page = urllib2.urlopen(req) for line in search_page.readlines(): if '>Images' in line: - games.append(re.findall('Images', line.replace('\r\n', ''))) + games.append(re.findall('Images', line.replace('\r\n', ''))) if games: - return ''.join(games[0]) + return ''.join(games[0][0][1]) except: return "" # Thumbnails list scrapper def _get_thumbnails_list(system,search,region,imgsize): covers = [] - game_id_url = _get_game_page_url(system,search) + results = [] try: + game_id_url = _get_game_page_url(system,search) req = urllib2.Request('http://www.gamefaqs.com'+game_id_url) req.add_unredirected_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31') game_page = urllib2.urlopen(req) - if game_page: - for line in game_page.readlines(): - if 'pod contrib' in line: - results = re.findall('
    (.*?)', line) + results = re.findall('
    (.*?)', game_page.read().replace('\r\n', '')) if (region == "All" ): return results else: @@ -54,7 +52,6 @@ def _get_thumbnail(image_url): for line in search_page.readlines(): if 'Game Box Shot' in line: images = re.findall('g"> Date: Thu, 26 Jun 2014 21:54:33 -0400 Subject: [PATCH 73/80] . Disable "%rom%" default argument for stand alone launcher. --- addon.py | 2 +- addon.xml | 4 ++-- changelog.txt | 6 ++++++ resources/lib/launcher_plugin.py | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/addon.py b/addon.py index f4eb285..6318a59 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.5.1" +__version__ = "2.5.3" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index af05ed4..69774da 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + @@ -9,7 +9,7 @@ all - For XBMC Frodo / Eden / Dharma + For XBMC Gotham/Frodo/Eden/Dharma Beliebige Anwendungen aus XBMC starten. Start any applications from XBMC. Lancer n'importer quelle application depuis XBMC. diff --git a/changelog.txt b/changelog.txt index cf09da9..f33f6cf 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,9 @@ +[B]2.5.3[/B] +. Disable "%rom%" default argument for stand alone launcher. + +[B]2.5.2[/B] +. Fix XBMC Gotham compatibility + [B]2.5.1[/B] . Fix GameFAQs scrapers. . Fix empty query launcher bug. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 8ea2a0b..64e61bf 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -2583,7 +2583,7 @@ def _add_new_launcher ( self, categoryID ) : if (type == 0): app = xbmcgui.Dialog().browse(1,__language__( 30023 ),"files",filter) if (app): - argument = self._get_program_arguments(os.path.basename(app)) + argument = "" argkeyboard = xbmc.Keyboard(argument, __language__( 30024 )) argkeyboard.doModal() args = argkeyboard.getText() From 2014186c2caeef3253ae2cde04a5463459738cfa Mon Sep 17 00:00:00 2001 From: Frank Razenberg Date: Fri, 22 Aug 2014 00:38:02 +0200 Subject: [PATCH 74/80] Suspend audio regardless of mediastate --- resources/lib/launcher_plugin.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 64e61bf..e857587 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -1545,10 +1545,10 @@ def _run_launcher(self, launcherID): if ( self.settings[ "media_state" ] == "1" ): xbmc.Player().pause() xbmc.sleep(self.settings[ "start_tempo" ]+100) - try: - xbmc.audioSuspend() - except: - pass + try: + xbmc.audioSuspend() + except: + pass if (launcher["minimize"] == "true"): _toogle_fullscreen() if ( self.settings[ "launcher_notification" ] ): @@ -1593,11 +1593,11 @@ def _run_launcher(self, launcherID): xbmc.enableNavSounds(True) except: pass + try: + xbmc.audioResume() + except: + pass if ( self.settings[ "media_state" ] != "2" ): - try: - xbmc.audioResume() - except: - pass if ( self.settings[ "media_state" ] == "1" ): xbmc.sleep(self.settings[ "start_tempo" ]+100) xbmc.Player().play() @@ -1752,10 +1752,10 @@ def _run_rom(self, launcherID, romName): if ( self.settings[ "media_state" ] == "1" ): xbmc.Player().pause() xbmc.sleep(self.settings[ "start_tempo" ]+100) - try: - xbmc.audioSuspend() - except: - pass + try: + xbmc.audioSuspend() + except: + pass if (launcher["minimize"] == "true"): _toogle_fullscreen() if ( self.settings[ "launcher_notification" ] ): From 228de478965476396f14197c0835d9cc4fb9c85b Mon Sep 17 00:00:00 2001 From: Angelscry Date: Thu, 21 Aug 2014 21:42:25 -0400 Subject: [PATCH 75/80] Suspend audio regardless of mediastate. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/addon.py b/addon.py index 6318a59..650a94f 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.5.3" +__version__ = "2.5.4" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 69774da..2e1ca3d 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index f33f6cf..aa902df 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.5.4[/B] +. Suspend audio regardless of mediastate. Thanks to zzattack. + [B]2.5.3[/B] . Disable "%rom%" default argument for stand alone launcher. From 31b8c10a4d82c1d7de3760d96a8424a23fd1cb25 Mon Sep 17 00:00:00 2001 From: Angelscry Date: Thu, 4 Sep 2014 22:21:19 -0400 Subject: [PATCH 76/80] . Fix encoding detection error on Android based systems. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 3 +++ resources/lib/launcher_plugin.py | 26 ++++++++++++++++---------- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/addon.py b/addon.py index 650a94f..ed68e45 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.5.4" +__version__ = "2.5.5" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 2e1ca3d..8a388f4 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index aa902df..db6253b 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.5.5[/B] +. Fix encoding detection error on Android based systems. + [B]2.5.4[/B] . Suspend audio regardless of mediastate. Thanks to zzattack. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index e857587..b66c364 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -406,7 +406,7 @@ def _edit_rom(self, launcher, rom): file_path = os.path.join(os.path.dirname(self.launchers[launcher]["thumbpath"]),os.path.basename(filename.replace("."+filename.split(".")[-1], img_ext))) if ( image != file_path ): try: - shutil.copy2( image.decode(sys.getfilesystemencoding(),'ignore') , file_path.decode(sys.getfilesystemencoding(),'ignore') ) + shutil.copy2( image.decode(sys.get_encoding(),'ignore') , file_path.decode(sys.get_encoding(),'ignore') ) if ( self.launchers[launcher]["roms"][rom]["thumb"] != "" ): _update_cache(file_path) self.launchers[launcher]["roms"][rom]["thumb"] = file_path @@ -458,7 +458,7 @@ def _edit_rom(self, launcher, rom): file_path = os.path.join(os.path.dirname(self.launchers[launcher]["fanartpath"]),os.path.basename(filename.replace("."+filename.split(".")[-1], img_ext))) if ( image != file_path ): try: - shutil.copy2( image.decode(sys.getfilesystemencoding(),'ignore') , file_path.decode(sys.getfilesystemencoding(),'ignore') ) + shutil.copy2( image.decode(sys.get_encoding(),'ignore') , file_path.decode(get_encoding(),'ignore') ) if ( self.launchers[launcher]["roms"][rom]["fanart"] != "" ): _update_cache(file_path) self.launchers[launcher]["roms"][rom]["fanart"] = file_path @@ -893,7 +893,7 @@ def _import_rom_nfo(self, launcher, rom): xbmc_notify(__language__( 30000 ), __language__( 30082 ) % os.path.basename(nfo_file),3000) def _export_rom_nfo(self, launcher, rom): - nfo_file=os.path.splitext(self.launchers[launcher]["roms"][rom]["filename"].decode(sys.getfilesystemencoding()))[0]+".nfo" + nfo_file=os.path.splitext(self.launchers[launcher]["roms"][rom]["filename"].decode(sys.get_encoding()))[0]+".nfo" if (os.path.isfile(nfo_file)): shutil.move( nfo_file, nfo_file+".tmp" ) destination= open( nfo_file, "w" ) @@ -996,7 +996,7 @@ def _edit_category(self, categoryID): file_path = os.path.join(DEFAULT_THUMB_PATH,os.path.basename(self.categories[categoryID]["name"])+'_thumb'+img_ext) if ( image != file_path ): try: - shutil.copy2( image.decode(sys.getfilesystemencoding(),'ignore') , file_path.decode(sys.getfilesystemencoding(),'ignore') ) + shutil.copy2( image.decode(sys.get_encoding(),'ignore') , file_path.decode(sys.get_encoding(),'ignore') ) if ( self.categories[categoryID]["thumb"] != "" ): _update_cache(file_path) self.categories[categoryID]["thumb"] = file_path @@ -1039,7 +1039,7 @@ def _edit_category(self, categoryID): file_path = os.path.join(DEFAULT_FANART_PATH,os.path.basename(self.categories[categoryID]["name"])+'_fanart'+img_ext) if ( image != file_path ): try: - shutil.copy2( image.decode(sys.getfilesystemencoding(),'ignore') , file_path.decode(sys.getfilesystemencoding(),'ignore') ) + shutil.copy2( image.decode(sys.get_encoding(),'ignore') , file_path.decode(sys.get_encoding(),'ignore') ) if ( self.categories[categoryID]["fanart"] != "" ): _update_cache(file_path) self.categories[categoryID]["fanart"] = file_path @@ -1185,7 +1185,7 @@ def _edit_launcher(self, launcherID): file_path = os.path.join(self.settings[ "launcher_thumb_path" ],os.path.basename(self.launchers[launcherID]["application"])+'_thumb'+img_ext) if ( image != file_path ): try: - shutil.copy2( image.decode(sys.getfilesystemencoding(),'ignore') , file_path.decode(sys.getfilesystemencoding(),'ignore') ) + shutil.copy2( image.decode(sys.get_encoding(),'ignore') , file_path.decode(sys.get_encoding(),'ignore') ) if ( self.launchers[launcherID]["thumb"] != "" ): _update_cache(file_path) self.launchers[launcherID]["thumb"] = file_path @@ -1235,7 +1235,7 @@ def _edit_launcher(self, launcherID): file_path = os.path.join(self.settings[ "launcher_fanart_path" ],os.path.basename(self.launchers[launcherID]["application"])+'_fanart'+img_ext) if ( image != file_path ): try: - shutil.copy2( image.decode(sys.getfilesystemencoding(),'ignore') , file_path.decode(sys.getfilesystemencoding(),'ignore') ) + shutil.copy2( image.decode(sys.get_encoding(),'ignore') , file_path.decode(sys.get_encoding(),'ignore') ) if ( self.launchers[launcherID]["fanart"] != "" ): _update_cache(file_path) self.launchers[launcherID]["fanart"] = file_path @@ -2295,7 +2295,7 @@ def _import_roms(self, launcherID, addRoms = False): if ( img_url !='' ): try: download_img(img_url,thumb) - shutil.copy2( thumb.decode(sys.getfilesystemencoding(),'ignore') , cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) + shutil.copy2( thumb.decode(sys.get_encoding(),'ignore') , cached_thumb.decode(sys.get_encoding(),'ignore') ) except socket.timeout: xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30604 ),3000) except exceptions.IOError: @@ -2350,7 +2350,7 @@ def _import_roms(self, launcherID, addRoms = False): if ( img_url !='' ): try: download_img(img_url,fanart) - shutil.copy2( fanart.decode(sys.getfilesystemencoding(),'ignore') , cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) + shutil.copy2( fanart.decode(sys.get_encoding(),'ignore') , cached_thumb.decode(sys.get_encoding(),'ignore') ) except socket.timeout: xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30606 ),3000) except exceptions.IOError: @@ -2875,10 +2875,16 @@ def MyDialog(img_list): def xbmc_notify(title,text,time): xbmc.executebuiltin("XBMC.Notification(%s,%s,%s,%s)" % (title,text,time,ICON_IMG_FILE)) +def get_encoding(): + try: + return sys.getfilesystemencoding() + except (UnicodeEncodeError, UnicodeDecodeError): + return "utf-8" + def _update_cache(file_path): cached_thumb = Thumbnails().get_cached_covers_thumb( file_path ).replace("tbn" , os.path.splitext(file_path)[-1][1:4]) try: - shutil.copy2( file_path.decode(sys.getfilesystemencoding(),'ignore'), cached_thumb.decode(sys.getfilesystemencoding(),'ignore') ) + shutil.copy2( file_path.decode(sys.get_encoding(),'ignore'), cached_thumb.decode(sys.get_encoding(),'ignore') ) except OSError: xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30608 ),3000) xbmc.executebuiltin("XBMC.ReloadSkin()") From f6f7980dc66d041e1635bb012d79aa8b3a8790ba Mon Sep 17 00:00:00 2001 From: Angelscry Date: Sun, 14 Sep 2014 10:26:29 -0400 Subject: [PATCH 77/80] Rollback suspend audio feature bring by version 2.5.4. --- addon.py | 2 +- addon.xml | 2 +- changelog.txt | 6 +++++ resources/lib/launcher_plugin.py | 44 ++++++++++++++++---------------- 4 files changed, 30 insertions(+), 24 deletions(-) diff --git a/addon.py b/addon.py index ed68e45..459b13f 100644 --- a/addon.py +++ b/addon.py @@ -13,7 +13,7 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.5.5" +__version__ = "2.5.7" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin diff --git a/addon.xml b/addon.xml index 8a388f4..673a2f3 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index db6253b..0adc0d7 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,9 @@ +[B]2.5.7[/B] +. Rollback suspend audio feature bring by version 2.5.4. + +[B]2.5.6[/B] +. Fix encoding detection error bug. + [B]2.5.5[/B] . Fix encoding detection error on Android based systems. diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index b66c364..6f33434 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -406,7 +406,7 @@ def _edit_rom(self, launcher, rom): file_path = os.path.join(os.path.dirname(self.launchers[launcher]["thumbpath"]),os.path.basename(filename.replace("."+filename.split(".")[-1], img_ext))) if ( image != file_path ): try: - shutil.copy2( image.decode(sys.get_encoding(),'ignore') , file_path.decode(sys.get_encoding(),'ignore') ) + shutil.copy2( image.decode(get_encoding(),'ignore') , file_path.decode(get_encoding(),'ignore') ) if ( self.launchers[launcher]["roms"][rom]["thumb"] != "" ): _update_cache(file_path) self.launchers[launcher]["roms"][rom]["thumb"] = file_path @@ -458,7 +458,7 @@ def _edit_rom(self, launcher, rom): file_path = os.path.join(os.path.dirname(self.launchers[launcher]["fanartpath"]),os.path.basename(filename.replace("."+filename.split(".")[-1], img_ext))) if ( image != file_path ): try: - shutil.copy2( image.decode(sys.get_encoding(),'ignore') , file_path.decode(get_encoding(),'ignore') ) + shutil.copy2( image.decode(get_encoding(),'ignore') , file_path.decode(get_encoding(),'ignore') ) if ( self.launchers[launcher]["roms"][rom]["fanart"] != "" ): _update_cache(file_path) self.launchers[launcher]["roms"][rom]["fanart"] = file_path @@ -893,7 +893,7 @@ def _import_rom_nfo(self, launcher, rom): xbmc_notify(__language__( 30000 ), __language__( 30082 ) % os.path.basename(nfo_file),3000) def _export_rom_nfo(self, launcher, rom): - nfo_file=os.path.splitext(self.launchers[launcher]["roms"][rom]["filename"].decode(sys.get_encoding()))[0]+".nfo" + nfo_file=os.path.splitext(self.launchers[launcher]["roms"][rom]["filename"].decode(get_encoding()))[0]+".nfo" if (os.path.isfile(nfo_file)): shutil.move( nfo_file, nfo_file+".tmp" ) destination= open( nfo_file, "w" ) @@ -996,7 +996,7 @@ def _edit_category(self, categoryID): file_path = os.path.join(DEFAULT_THUMB_PATH,os.path.basename(self.categories[categoryID]["name"])+'_thumb'+img_ext) if ( image != file_path ): try: - shutil.copy2( image.decode(sys.get_encoding(),'ignore') , file_path.decode(sys.get_encoding(),'ignore') ) + shutil.copy2( image.decode(get_encoding(),'ignore') , file_path.decode(get_encoding(),'ignore') ) if ( self.categories[categoryID]["thumb"] != "" ): _update_cache(file_path) self.categories[categoryID]["thumb"] = file_path @@ -1039,7 +1039,7 @@ def _edit_category(self, categoryID): file_path = os.path.join(DEFAULT_FANART_PATH,os.path.basename(self.categories[categoryID]["name"])+'_fanart'+img_ext) if ( image != file_path ): try: - shutil.copy2( image.decode(sys.get_encoding(),'ignore') , file_path.decode(sys.get_encoding(),'ignore') ) + shutil.copy2( image.decode(get_encoding(),'ignore') , file_path.decode(get_encoding(),'ignore') ) if ( self.categories[categoryID]["fanart"] != "" ): _update_cache(file_path) self.categories[categoryID]["fanart"] = file_path @@ -1185,7 +1185,7 @@ def _edit_launcher(self, launcherID): file_path = os.path.join(self.settings[ "launcher_thumb_path" ],os.path.basename(self.launchers[launcherID]["application"])+'_thumb'+img_ext) if ( image != file_path ): try: - shutil.copy2( image.decode(sys.get_encoding(),'ignore') , file_path.decode(sys.get_encoding(),'ignore') ) + shutil.copy2( image.decode(get_encoding(),'ignore') , file_path.decode(get_encoding(),'ignore') ) if ( self.launchers[launcherID]["thumb"] != "" ): _update_cache(file_path) self.launchers[launcherID]["thumb"] = file_path @@ -1235,7 +1235,7 @@ def _edit_launcher(self, launcherID): file_path = os.path.join(self.settings[ "launcher_fanart_path" ],os.path.basename(self.launchers[launcherID]["application"])+'_fanart'+img_ext) if ( image != file_path ): try: - shutil.copy2( image.decode(sys.get_encoding(),'ignore') , file_path.decode(sys.get_encoding(),'ignore') ) + shutil.copy2( image.decode(get_encoding(),'ignore') , file_path.decode(get_encoding(),'ignore') ) if ( self.launchers[launcherID]["fanart"] != "" ): _update_cache(file_path) self.launchers[launcherID]["fanart"] = file_path @@ -1545,10 +1545,10 @@ def _run_launcher(self, launcherID): if ( self.settings[ "media_state" ] == "1" ): xbmc.Player().pause() xbmc.sleep(self.settings[ "start_tempo" ]+100) - try: - xbmc.audioSuspend() - except: - pass + try: + xbmc.audioSuspend() + except: + pass if (launcher["minimize"] == "true"): _toogle_fullscreen() if ( self.settings[ "launcher_notification" ] ): @@ -1593,11 +1593,11 @@ def _run_launcher(self, launcherID): xbmc.enableNavSounds(True) except: pass - try: - xbmc.audioResume() - except: - pass if ( self.settings[ "media_state" ] != "2" ): + try: + xbmc.audioResume() + except: + pass if ( self.settings[ "media_state" ] == "1" ): xbmc.sleep(self.settings[ "start_tempo" ]+100) xbmc.Player().play() @@ -1752,10 +1752,10 @@ def _run_rom(self, launcherID, romName): if ( self.settings[ "media_state" ] == "1" ): xbmc.Player().pause() xbmc.sleep(self.settings[ "start_tempo" ]+100) - try: - xbmc.audioSuspend() - except: - pass + try: + xbmc.audioSuspend() + except: + pass if (launcher["minimize"] == "true"): _toogle_fullscreen() if ( self.settings[ "launcher_notification" ] ): @@ -2295,7 +2295,7 @@ def _import_roms(self, launcherID, addRoms = False): if ( img_url !='' ): try: download_img(img_url,thumb) - shutil.copy2( thumb.decode(sys.get_encoding(),'ignore') , cached_thumb.decode(sys.get_encoding(),'ignore') ) + shutil.copy2( thumb.decode(get_encoding(),'ignore') , cached_thumb.decode(get_encoding(),'ignore') ) except socket.timeout: xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30604 ),3000) except exceptions.IOError: @@ -2350,7 +2350,7 @@ def _import_roms(self, launcherID, addRoms = False): if ( img_url !='' ): try: download_img(img_url,fanart) - shutil.copy2( fanart.decode(sys.get_encoding(),'ignore') , cached_thumb.decode(sys.get_encoding(),'ignore') ) + shutil.copy2( fanart.decode(get_encoding(),'ignore') , cached_thumb.decode(get_encoding(),'ignore') ) except socket.timeout: xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30606 ),3000) except exceptions.IOError: @@ -2884,7 +2884,7 @@ def get_encoding(): def _update_cache(file_path): cached_thumb = Thumbnails().get_cached_covers_thumb( file_path ).replace("tbn" , os.path.splitext(file_path)[-1][1:4]) try: - shutil.copy2( file_path.decode(sys.get_encoding(),'ignore'), cached_thumb.decode(sys.get_encoding(),'ignore') ) + shutil.copy2( file_path.decode(get_encoding(),'ignore'), cached_thumb.decode(get_encoding(),'ignore') ) except OSError: xbmc_notify(__language__( 30000 )+" - "+__language__( 30612 ), __language__( 30608 ),3000) xbmc.executebuiltin("XBMC.ReloadSkin()") From bb380b6e8b664246a791f553ddc856cbc60dae1f Mon Sep 17 00:00:00 2001 From: Angelscry Date: Tue, 30 Dec 2014 23:11:16 -0500 Subject: [PATCH 78/80] Esthetic update related to Kodi/Helix version. --- addon.py | 3 +-- addon.xml | 20 ++++++++++---------- changelog.txt | 3 +++ resources/language/English/strings.xml | 10 +++++----- resources/language/Finnish/strings.xml | 4 ++-- resources/language/French/strings.xml | 6 +++--- resources/language/German/strings.xml | 6 +++--- 7 files changed, 27 insertions(+), 25 deletions(-) diff --git a/addon.py b/addon.py index 459b13f..626cfda 100644 --- a/addon.py +++ b/addon.py @@ -13,9 +13,8 @@ __url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __git_url__ = "https://github.com/Angelscry/plugin.program.advanced.launcher" __credits__ = "Leo212 CinPoU, JustSomeUser, Zerqent, Zosky, Atsumori" -__version__ = "2.5.7" +__version__ = "2.5.8" if ( __name__ == "__main__" ): import resources.lib.launcher_plugin as plugin plugin.Main() - diff --git a/addon.xml b/addon.xml index 673a2f3..7b213f9 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + @@ -9,14 +9,14 @@ all - For XBMC Gotham/Frodo/Eden/Dharma - Beliebige Anwendungen aus XBMC starten. - Start any applications from XBMC. - Lancer n'importer quelle application depuis XBMC. - Käynnistää sovelluksia XBMC:stä - Advanced Launcher erlaubt das Starten beliebiger Linux, Windows und OS X Anwendungen (mit oder ohne Kommandozeile) direkt aus der XBMC Oberfläche. Advanced Launcher erlaubt weiterhin das Editieren, Herunterladen und Verwalten der Metadaten (Informationen und Bilder) für diese Anwendungen aus dem Internet. - Advanced Launcher allows you to start any Linux, Windows and OS X applications (with command line support or not) directly from the XBMC GUI. Advanced Launcher also give you the possibility to edit, download (from Internet resources) and manage all the meta-data (informations and images) related to these applications. - Advanced Launcher permet de lancer toutes les applications Linux, Windows and OS X (avec support des lignes de commandes ou non) directement depuis l'interface d'XBMC. Advanced Launcher offre également la possibilité de modifier, télécharger (depuis les ressoures web) et de gérer toues les meta-donées (informations et images) relatives à ces applications. - Advanced Launcherilla voit käynnistää XBMC:n käyttöliittymästä mitä tahansa sovelluksia. Käynnistettävistä sovelluksista voi hakea tietoja ja kuvia Internet-tietokannoista. + For Kodi Helix/Gotham/Frodo/Eden/Dharma + Beliebige Anwendungen aus Kodi starten. + Start any applications from Kodi. + Lancer n'importer quelle application depuis Kodi. + Käynnistää sovelluksia Kodi:stä + Advanced Launcher erlaubt das Starten beliebiger Linux, Windows und OS X Anwendungen (mit oder ohne Kommandozeile) direkt aus der Kodi Oberfläche. Advanced Launcher erlaubt weiterhin das Editieren, Herunterladen und Verwalten der Metadaten (Informationen und Bilder) für diese Anwendungen aus dem Internet. + Advanced Launcher allows you to start any Linux, Windows and OS X applications (with command line support or not) directly from the Kodi GUI. Advanced Launcher also give you the possibility to edit, download (from Internet resources) and manage all the meta-data (informations and images) related to these applications. + Advanced Launcher permet de lancer toutes les applications Linux, Windows and OS X (avec support des lignes de commandes ou non) directement depuis l'interface de Kodi. Advanced Launcher offre également la possibilité de modifier, télécharger (depuis les ressoures web) et de gérer toues les meta-donées (informations et images) relatives à ces applications. + Advanced Launcherilla voit käynnistää Kodi:n käyttöliittymästä mitä tahansa sovelluksia. Käynnistettävistä sovelluksista voi hakea tietoja ja kuvia Internet-tietokannoista. diff --git a/changelog.txt b/changelog.txt index 0adc0d7..2533bf7 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +[B]2.5.8[/B] +. Esthetic update related to Kodi/Helix version. + [B]2.5.7[/B] . Rollback suspend audio feature bring by version 2.5.4. diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index d1065b0..bd85ac7 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -16,7 +16,7 @@ Application arguments Set the title of the launcher Query launcher (Adv.L search engine) - Favourite launcher (XBMC favourites) + Favourite launcher (Kodi favourites) Set files extensions, use "|" as separator. (e.g lnk|cbr) Downloading: %s Launching %s. @@ -108,7 +108,7 @@ Semi-automatic Automatic Article ("The","A") at the end - Action on XBMC playing media + Action on Kodi playing media Stop Pause Let Play @@ -143,7 +143,7 @@ Number of backup files to store Import XML file (restore backup) Select the XML file to import - Advanced Launcher logs into xbmc.log file + Advanced Launcher logs into kodi.log file Display options Hide the Default Category Append XML files (merge launchers lists) @@ -155,7 +155,7 @@ default experienced users - Toggle XBMC Fullscreen + Toggle Kodi Fullscreen On Off Shortcuts (.lnk) support @@ -178,7 +178,7 @@ Select Local Image (Link) Modify Arguments : %s Save to .nfo file - Toggle XBMC into Windowed mode : %s + Toggle Kodi into Windowed mode : %s Modify Items Extensions : %s Clear Items List Modify Launcher Infos diff --git a/resources/language/Finnish/strings.xml b/resources/language/Finnish/strings.xml index 4af8d2f..8ccd093 100644 --- a/resources/language/Finnish/strings.xml +++ b/resources/language/Finnish/strings.xml @@ -120,7 +120,7 @@ oletus edistyneet käyttäjät - Vaihda XBMC:n kokoruudun tila + Vaihda Kodi:n kokoruudun tila Päällä Pois Pikakuvake-tuki (.lnk) @@ -143,7 +143,7 @@ Valitse paikallinen kuva (linkitä) Muokkaa parametreja : %s Talleta tiedot NFO-tiedostoon - Vaihda XBMC kokoruudun tilaa : %s + Vaihda Kodi kokoruudun tilaa : %s Muokkaa kohteiden tiedostopäätteitä : %s Tyhjennä kohteiden lista Muokkaa käynnistimen kuvauksia diff --git a/resources/language/French/strings.xml b/resources/language/French/strings.xml index 2a7d8e8..bdb871c 100644 --- a/resources/language/French/strings.xml +++ b/resources/language/French/strings.xml @@ -129,7 +129,7 @@ Nombre de sauvegardes à conserver Importer un fichier XML (restaurer une sauvegarde) Choisir le fichier XML à importer - Afficher les logs d'Advanced Launcher dans xbmc.log + Afficher les logs d'Advanced Launcher dans kodi.log Options d'affichage Cacher la catégorie "Default" Fusionner un fichier XML (joindre les listes de lanceurs) @@ -141,7 +141,7 @@ défaut Utilisateurs expérimentés - Basculer XBMC en plein écran + Basculer Kodi en plein écran Activé Désactivé Support des raccourcis (.lnk) @@ -164,7 +164,7 @@ Choisir une image locale (créer un lien) Modifier les arguments : %s Sauver dans un fichier .nfo - Basculer XBMC en mode fenétré : %s + Basculer Kodi en mode fenétré : %s Modifier les extensions des objets : %s Vider la liste des objets Modifier les informations du lanceur diff --git a/resources/language/German/strings.xml b/resources/language/German/strings.xml index 200da65..236a7c9 100644 --- a/resources/language/German/strings.xml +++ b/resources/language/German/strings.xml @@ -138,7 +138,7 @@ Anzahl der Sicherungen Importiere XML Datei (Sicherung wiederherstellen) Wähle zu importierende XML Datei - Advanced Launcher Meldungen in die xbmc.log Datei schreiben + Advanced Launcher Meldungen in die kodi.log Datei schreiben Anzeigeoptionen Verstecke Standard Kategorie Füge XML Datei an (verbinde Programmstarterlisten) @@ -149,7 +149,7 @@ standard erfahrene Anwender - XBMC Fenstermodus einschalten + Kodi Fenstermodus einschalten Ein Aus Verknüpfungen (.lnk) unterstützen @@ -172,7 +172,7 @@ Lokales Bild benutzen (Verknüpfung) Parameter: %s In .nfo Datei speichern - XBMC in den Fenstermodus umschalten: %s + Kodiin den Fenstermodus umschalten: %s Dateierweiterungen: %s Daten löschen Programmstarter bearbeiten From ae6f35ec8cbbe19840d2cbadc3e96cadb77f0f57 Mon Sep 17 00:00:00 2001 From: Rafael Vieira Santos Date: Thu, 27 Aug 2015 00:28:45 -0300 Subject: [PATCH 79/80] Update README.md --- README.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index beed2cf..90ff68f 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,28 @@ Advanced Launcher ================= -Advanced Launcher allows you to start any Linux, Windows and OS X external applications (with command line support or not) directly from the XBMC GUI. Advanced Launcher also give you the possibility to edit, download (from Internet resources) and manage all the meta-data (informations and images) related to these applications. +Advanced Launcher allows you to start any Linux, Windows and OS X external applications (with command line support or not) directly from the KODI GUI. Advanced Launcher also give you the possibility to edit, download (from Internet resources) and manage all the meta-data (informations and images) related to these applications. Features: -. Run Windows, Metro, Linux and OSX applications with auto-suggested arguments. -. Start any file from specified directory using selected application. -. Collect informations of applications and images and using internal module scrapers -. Folder recursive scan option for new added items (with images and data collect options). -. 3 collect options : manual, semi-automatic and automatic. -. Add, remove and edit options of applications directly from XBMC GUI -. Thumbnails and Fanarts images support. -. Search applications and items by name, genre, studio, platform and release date. -. XBMC built in functions support for launchers. -. Multi-disc selection support. -. Automatic and Manual data Import/export with .nfo files (compatible with RCB addon) +- Run Windows, Metro, Linux and OSX applications with auto-suggested arguments. +- Start any file from specified directory using selected application. +- Collect informations of applications and images and using internal module scrapers +- Folder recursive scan option for new added items (with images and data collect options). +- 3 collect options : manual, semi-automatic and automatic. +- Add, remove and edit options of applications directly from KODI GUI +- Thumbnails and Fanarts images support. +- Search applications and items by name, genre, studio, platform and release date. +- XBMC built in functions support for launchers. +- Multi-disc selection support. +- Automatic and Manual data Import/export with .nfo files (compatible with RCB addon) Included scrapers: -. Games: AllGame, GameFAQs, MobyGames, arcadeHITS and TheGamesDB databases. -. Comics: ComicVine database. -. Images: Google Images and HTBackdrops search engine. +- Games: AllGame, GameFAQs, MobyGames, arcadeHITS and TheGamesDB databases. +- Comics: ComicVine database. +- Images: Google Images and HTBackdrops search engine. Additional scrapers: -. Games: GameFAQs (back covers) database. +- Games: GameFAQs (back covers) database. From fa6c79fd11d00e0c0e265d9af8ffa57b02100b35 Mon Sep 17 00:00:00 2001 From: Ryan Saunders Date: Sun, 1 May 2016 01:36:01 -0700 Subject: [PATCH 80/80] Added "scan" and "add" context menu items for a ROM, allowing ROMs to be added from within the corresponding ROM list (i.e., similarly to "Update library" for videos). --- resources/lib/launcher_plugin.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/resources/lib/launcher_plugin.py b/resources/lib/launcher_plugin.py index 6f33434..3ae1809 100644 --- a/resources/lib/launcher_plugin.py +++ b/resources/lib/launcher_plugin.py @@ -73,7 +73,8 @@ SEARCH_PLATFORM_COMMAND = "%%SEARCH_PLATFORM%%" SEARCH_STUDIO_COMMAND = "%%SEARCH_STUDIO%%" SEARCH_GENRE_COMMAND = "%%SEARCH_GENRE%%" -SCAN_NEW_ITEM_COMMAND = "%%SCAN_NEW_ITEM%%" +SCAN_NEW_ITEMS_COMMAND = "%%SCAN_NEW_ITEM%%" +ADD_ITEM_COMMAND = "%%ADD_ITEM%%" # Locales parameters __settings__ = Addon( id="plugin.program.advanced.launcher" ) @@ -164,8 +165,10 @@ def __init__( self, *args, **kwargs ): self._scrap_thumb_launcher(launcher) elif (rom == GET_FANART): self._scrap_fanart_launcher(launcher) - elif (category == SCAN_NEW_ITEM_COMMAND): + elif (category == SCAN_NEW_ITEMS_COMMAND): self._import_roms(launcher, addRoms = False) + elif (category == ADD_ITEM_COMMAND): + self._add_new_rom(launcher) elif (rom == ADD_COMMAND): self._add_roms(launcher) else: @@ -213,7 +216,7 @@ def __init__( self, *args, **kwargs ): category = command_part[0] self._print_log(__language__( 30740 ) % category) - if (category == SCAN_NEW_ITEM_COMMAND): + if (category == SCAN_NEW_ITEMS_COMMAND): self._find_roms(False) if (category == SEARCH_COMMAND): self._find_roms(False) @@ -2474,6 +2477,8 @@ def _add_rom( self, launcherID, name, cmd , romgamesys, thumb, romfanart, romtra commands = [] commands.append((__language__( 30512 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, self.launchers[launcherID]["category"], launcherID, SEARCH_COMMAND) , )) commands.append(( __language__( 30107 ), "XBMC.RunPlugin(%s?%s/%s/%s/%s)" % (self._path, self.launchers[launcherID]["category"], launcherID, key, EDIT_COMMAND) , )) + commands.append((__language__( 30105 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, SCAN_NEW_ITEMS_COMMAND, launcherID, "" ) , )) + commands.append((__language__( 30320 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, ADD_ITEM_COMMAND, launcherID, "" ) , )) if search : commands.append((__language__( 30513 ), "XBMC.RunPlugin(%s?%s/%s/%s)" % (self._path, self.launchers[launcherID]["category"], launcherID, SEARCH_COMMAND) , )) listitem.addContextMenuItems( commands )