def reset_cache(): core = RequiredFeature('core').request() confirmed = xbmcgui.Dialog().yesno(core.string('name'), core.string('reset_cache_warning')) if confirmed: scraper_chain = RequiredFeature('scraper-chain').request() scraper_chain.reset_cache() del scraper_chain del core
def reset_cache(): import xbmcgui core = RequiredFeature('core').request() confirmed = xbmcgui.Dialog().yesno( core.string('name'), core.string('reset_cache_warning') ) if confirmed: scraper_chain = RequiredFeature('scraper-chain').request() scraper_chain.reset_cache() del scraper_chain del core
def reset_cache(): import xbmcgui if plugin.get_setting('last_run', str): plugin.set_setting('last_run', '') core = RequiredFeature('core').request() confirmed = xbmcgui.Dialog().yesno(core.string('name'), core.string('reset_cache_warning')) if confirmed: scraper_chain = RequiredFeature('scraper-chain').request() scraper_chain.reset_cache() del scraper_chain del core
updater = RequiredFeature('update-service').request() core.check_script_permissions() updater.check_for_update() del updater if plugin.get_setting('host', str): config_helper = RequiredFeature('config-helper').request() config_helper.configure() game_refresh_required = False try: if plugin.get_storage('game_version')['version'] != Game.version: game_refresh_required = True except KeyError: game_refresh_required = True if game_refresh_required: game_controller = RequiredFeature('game-controller').request() game_controller.get_games() del game_controller plugin.run() del plugin del core else: core = RequiredFeature('core').request() xbmcgui.Dialog().ok(core.string('name'), core.string('configure_first')) del core
updater.check_for_update() del updater core.check_script_permissions() if plugin.get_setting('host', str): game_refresh_required = False try: from resources.lib.model.game import Game if plugin.get_storage('game_version')['version'] != Game.version: game_refresh_required = True except KeyError: game_refresh_required = True if game_refresh_required: game_controller = RequiredFeature('game-controller').request() game_controller.get_games() del game_controller plugin.run() del plugin del core else: import xbmcgui core = RequiredFeature('core').request() xbmcgui.Dialog().ok( core.string('name'), core.string('configure_first') ) del core
class TgdbScraper(AbstractScraper): def __init__(self): AbstractScraper.__init__(self) self.plugin = RequiredFeature('plugin').request() self.core = RequiredFeature('core').request() self.api_url = 'http://thegamesdb.net/api/GetGame.php?name=%s' self.cover_cache = self._set_up_path(os.path.join(self.base_path, 'art/poster/')) self.fanart_cache = self._set_up_path(os.path.join(self.base_path, 'art/fanart/')) self.api_cache = os.path.join(self.base_path, 'api_cache/') def name(self): return 'TGDB' def get_game_information(self, game_name): request_name = game_name.replace(" ", "+").replace(":", "") response = self._gather_information(request_name) response.name = game_name return response def return_paths(self): return [self.cover_cache, self.fanart_cache, self.api_cache] def is_enabled(self): return self.plugin.get_setting('enable_tgdb', bool) def _gather_information(self, game): game_cover_path = self._set_up_path(os.path.join(self.cover_cache, game)) game_fanart_path = self._set_up_path(os.path.join(self.fanart_cache, game)) xml_response_file = self._get_xml_data(game) try: xml_root = ElementTree(file=xml_response_file).getroot() except: xbmcgui.Dialog().notification( self.core.string('name'), self.core.string('scraper_failed') % (game, self.name()) ) if xml_response_file is not None and os.path.isfile(xml_response_file): os.remove(xml_response_file) return ApiResponse() dict_response = self._parse_xml_to_dict(xml_root) if dict_response: posters = dict_response['posters'] dict_response['posters'] = [] for poster in posters: dict_response['posters'].append(self._dump_image(game_cover_path, poster)) local_arts = {} for art in dict_response.get('fanarts'): art.set_thumb(self._dump_image(game_fanart_path, art.get_thumb())) local_arts[os.path.basename(art.get_thumb())] = art dict_response['fanarts'] = local_arts return ApiResponse.from_dict(**dict_response) def _get_xml_data(self, game): file_path = os.path.join(self.api_cache, game, game+'_tgdb.xml') if not os.path.isfile(file_path): curl = subprocess.Popen(['curl', '-XGET', self.api_url % game], stdout=subprocess.PIPE) with open(file_path, 'w') as response_file: response_file.write(curl.stdout.read()) return file_path @staticmethod def _parse_xml_to_dict(root): """ :rtype: dict :type root: Element """ data = {'year': 'N/A', 'plot': 'N/A', 'posters': [], 'genre': [], 'fanarts': []} similar_id = [] base_img_url = root.find('baseImgUrl').text for game in root.findall('Game'): if game.find('Platform').text == 'PC': if game.find('ReleaseDate') is not None: data['year'] = os.path.basename(game.find('ReleaseDate').text) if game.find('Overview') is not None: data['plot'] = game.find('Overview').text for img in game.find('Images'): if img.get('side') == 'front': data['posters'].append(os.path.join(base_img_url, img.text)) if img.tag == 'fanart': image = Fanart() image.set_original(os.path.join(base_img_url, img.find('original').text)) image.set_thumb(os.path.join(base_img_url, img.find('thumb').text)) data['fanarts'].append(image) del image if game.find('Genres') is not None: for genre in game.find('Genres'): data['genre'].append(str(genre.text)) if game.find('Similar') is not None: for similar in game.find('Similar'): if similar.tag == 'Game': similar_id.append(similar.find('id').text) break for game in root.findall('Game'): if game.find('id').text in similar_id: for img in game.find('Images'): if img.tag == 'fanart': image = Fanart() image.set_original(os.path.join(base_img_url, img.find('original').text)) image.set_thumb(os.path.join(base_img_url, img.find('thumb').text)) data['fanarts'].append(image) del image return data
class SelectInput(pyxbmct.AddonDialogWindow): def __init__(self, title=''): print 'Init Called' super(SelectInput, self).__init__(title) self.plugin = RequiredFeature('plugin').request() self.core = RequiredFeature('core').request() self.device_wrapper = RequiredFeature('device-wrapper').request() self.available_devices = self.device_wrapper.devices self.md5 = hashlib.md5() self.input_storage = self.plugin.get_storage('input_storage') for key, device in self.input_storage.iteritems(): print 'Devices during INIT: %s' % device.name background = None if self.core.get_active_skin() == 'skin.osmc': media_path = '/usr/share/kodi/addons/skin.osmc/media' if os.path.exists(media_path): background = os.path.join(media_path, 'dialogs/DialogBackground_old.png') if background is not None: self.background.setImage(background) self.removeControl(self.title_background) self.removeControl(self.window_close_button) self.removeControl(self.title_bar) self.controls = {} self.add_ctrl_btn = None self.setGeometry(1280, 720, 12, 6, padding=60) self.place_add_ctrl_btn() self.setFocus(self.add_ctrl_btn) self.connect(pyxbmct.ACTION_NAV_BACK, self.close_and_save) self.init_existing_controls() # initalise controls / mappings read from .storage def place_add_ctrl_btn(self): self.add_ctrl_btn = create_button() self.add_ctrl_btn.setLabel('Add Controller') self.placeControl(self.add_ctrl_btn, row=12, column=1, rowspan=1, columnspan=2) self.connect(self.add_ctrl_btn, self.add_ctrl) def add_ctrl(self, device=None): idx = len(self.controls) print 'Adding controler with index %s' % idx control = CtrlSelectionWrapper() self.md5.update(str(time.time())) ctrl_id = self.md5.hexdigest() control.id = ctrl_id control.idx = idx if not device: device = InputDevice() device.name = 'None (Disabled)' control.device = device label = create_label() label.setLabel('Controller ' + str(idx)) control.label = label input_select_btn = create_button() input_select_btn.setLabel( control.device.name, ) control.input_select_btn = input_select_btn trigger_adv_mapping_btn = create_button() trigger_adv_mapping_btn.setLabel('Add Mapping') control.trigger_adv_mapping_btn = trigger_adv_mapping_btn remove_btn = create_button() remove_btn.setLabel('Remove') control.remove_btn = remove_btn if idx == 0: row = 0 adv_row = 1 else: row = idx * 2 adv_row = row + 1 control.adv_row = adv_row self.placeControl(control.label, row=row, column=0, rowspan=1, columnspan=1) self.placeControl(control.input_select_btn, row=row, column=1, rowspan=1, columnspan=3) self.placeControl(control.trigger_adv_mapping_btn, row=row, column=4, rowspan=1, columnspan=1) self.placeControl(control.remove_btn, row=row, column=5, rowspan=1, columnspan=1) self.connect_controls(control) if control.device.is_kbd() or control.device.is_mouse() or control.device.is_none_device(): trigger_adv_mapping_btn.setEnabled(False) # Still visible for now, but disabled # trigger_adv_mapping_btn.setVisible(False) control.set_internal_navigation() self.controls[control.id] = control # TODO: Should be a dedicated method (set_navigation) self.add_ctrl_btn.controlUp(control.input_select_btn) if control.adv_on_flag: control.adv_select_mapping.controlDown(self.add_ctrl_btn) else: control.input_select_btn.controlDown(self.add_ctrl_btn) previous_control = None for _ctrl_id, _control in self.controls.iteritems(): print 'Looping controls, current index: %s' % _control.idx if _control.idx == control.idx-1: previous_control = _control if previous_control: if previous_control.adv_on_flag: control.input_select_btn.controlUp(previous_control.adv_select_mapping) previous_control.adv_select_mapping.controlDown(control.input_select_btn) else: control.input_select_btn.controlUp(previous_control.input_select_btn) previous_control.input_select_btn.controlDown(control.input_select_btn) if control.device.mapping: self.trigger_advanced(control) def connect_controls(self, control): self.connect(control.input_select_btn, lambda: self.select_input(control)) self.connect(control.remove_btn, lambda: self.remove_input(control)) self.connect(control.trigger_adv_mapping_btn, lambda: self.trigger_advanced(control)) def select_input(self, control): available_devices = self.filter_input_devices() device_names = [_dev.name for _dev in available_devices] controller = xbmcgui.Dialog().select('Select Input Device', device_names) if controller == -1: return else: print device_names[controller] device = self.device_wrapper.find_device_by_name(device_names[controller]) control.device = device control.input_select_btn.setLabel(device.name) if device.is_kbd() or device.is_mouse() or device.is_none_device(): control.trigger_adv_mapping_btn.setEnabled(False) else: control.trigger_adv_mapping_btn.setEnabled(True) self.input_storage[control.idx] = device def remove_input(self, control, dry=False): self.removeControls(control.controls_as_list()) del_key = None for key, value in self.input_storage.iteritems(): if value.name == control.device.name: del_key = key if not dry: del self.input_storage[del_key] del self.controls[control.id] del control self.init_existing_controls() self.setFocus(self.add_ctrl_btn) def trigger_advanced(self, control): control.adv_on(self) control.set_internal_navigation() next_control = None for _ctrl_id, _control in self.controls.iteritems(): print 'Looping controls, current index: %s' % _control.idx if _control.idx == control.idx+1: next_control = _control if next_control: control.adv_select_mapping.controlDown(next_control.input_select_btn) next_control.input_select_btn.controlUp(control.adv_select_mapping) else: control.adv_select_mapping.controlDown(self.add_ctrl_btn) self.add_ctrl_btn.controlUp(control.adv_select_mapping) self.setFocus(control.input_select_btn) def unset_advanced(self, control): control.adv_off(self) control.set_internal_navigation() control.unset_mapping_file() for key, device in self.input_storage.iteritems(): if device.name == control.device.name: device.mapping = None print 'Found device and saved mapping' break next_control = None for _ctrl_id, _control in self.controls.iteritems(): print 'Looping controls, current index: %s' % _control.idx if _control.idx == control.idx+1: next_control = _control if next_control: control.input_select_btn.controlDown(next_control.input_select_btn) next_control.input_select_btn.controlUp(control.input_select_btn) else: control.input_select_btn.controlDown(self.add_ctrl_btn) self.add_ctrl_btn.controlUp(control.input_select_btn) self.setFocus(control.input_select_btn) def select_mapping(self, control): browser = xbmcgui.Dialog().browse(1, 'Select Mapping File', 'files', '.map|.conf', False, False, os.path.expanduser('~')) if browser: control.set_mapping_file(browser) for key, device in self.input_storage.iteritems(): print 'Iterating devices, current IS device: %s' % device.name if device.name == control.device.name: device.mapping = browser print 'Found device and saved mapping' break def create_mapping(self, control): print 'Starting mapping' map_name = xbmcgui.Dialog().input(self.core.string('enter_filename')) progress_dialog = xbmcgui.DialogProgress() progress_dialog.create( self.core.string('name'), self.core.string('starting_mapping') ) map_file = '%s/%s.map' % (os.path.expanduser('~'), map_name) moonlight_helper = RequiredFeature('moonlight-helper').request() success = moonlight_helper.create_ctrl_map_new(progress_dialog, map_file, control.device) if success: confirmed = xbmcgui.Dialog().yesno( self.core.string('name'), self.core.string('mapping_success'), self.core.string('set_mapping_active') ) self.core.logger.info('Dialog Yes No Value: %s' % confirmed) if confirmed: control.set_mapping_file(map_file) for key, device in self.input_storage.iteritems(): print 'Iterating devices, current IS device: %s' % device.name if device.name == control.device.name: device.mapping = map_file print 'Found device and saved mapping' break else: xbmcgui.Dialog().ok( self.core.string('name'), self.core.string('mapping_failure') ) def init_existing_controls(self): if self.controls is not None: for key, value in self.controls.iteritems(): self.remove_input(value, True) self.controls = {} del_keys = [] for key, device in self.input_storage.iteritems(): print 'Iterating saved input devices in INIT: %s' % device.name if not self.device_wrapper.find_device_by_name(device.name): print 'Could not find device by name: %s' % device.name del_keys.append(key) for key in del_keys: del self.input_storage[key] for key, device in self.input_storage.iteritems(): self.add_ctrl(device) def filter_input_devices(self): device_list = [] current_ctrl_labels = [ctrl.input_select_btn.getLabel() for key, ctrl in self.controls.iteritems()] for device in self.available_devices: if device.name not in current_ctrl_labels: device_list.append(device) return device_list def close_and_save(self): self.input_storage.sync() print self.input_storage.raw_dict() print 'Save called, closing window ... ' self.close()
class SelectInput(pyxbmct.AddonDialogWindow): def __init__(self, title=''): print 'Init Called' super(SelectInput, self).__init__(title) self.plugin = RequiredFeature('plugin').request() self.core = RequiredFeature('core').request() self.device_wrapper = RequiredFeature('device-wrapper').request() self.available_devices = self.device_wrapper.devices self.md5 = hashlib.md5() self.input_storage = self.plugin.get_storage('input_storage') for key, device in self.input_storage.iteritems(): print 'Devices during INIT: %s' % device.name background = None if self.core.get_active_skin() == 'skin.osmc': media_path = '/usr/share/kodi/addons/skin.osmc/media' if os.path.exists(media_path): background = os.path.join(media_path, 'dialogs/DialogBackground_old.png') if background is not None: self.background.setImage(background) self.removeControl(self.title_background) self.removeControl(self.window_close_button) self.removeControl(self.title_bar) self.controls = {} self.add_ctrl_btn = None self.setGeometry(1280, 720, 12, 6, padding=60) self.place_add_ctrl_btn() self.setFocus(self.add_ctrl_btn) self.connect(pyxbmct.ACTION_NAV_BACK, self.close_and_save) self.init_existing_controls( ) # initalise controls / mappings read from .storage def place_add_ctrl_btn(self): self.add_ctrl_btn = create_button() self.add_ctrl_btn.setLabel('Add Controller') self.placeControl(self.add_ctrl_btn, row=12, column=1, rowspan=1, columnspan=2) self.connect(self.add_ctrl_btn, self.add_ctrl) def add_ctrl(self, device=None): idx = len(self.controls) print 'Adding controler with index %s' % idx control = CtrlSelectionWrapper() self.md5.update(str(time.time())) ctrl_id = self.md5.hexdigest() control.id = ctrl_id control.idx = idx if not device: device = InputDevice() device.name = 'None (Disabled)' control.device = device label = create_label() label.setLabel('Controller ' + str(idx)) control.label = label input_select_btn = create_button() input_select_btn.setLabel(control.device.name, ) control.input_select_btn = input_select_btn trigger_adv_mapping_btn = create_button() trigger_adv_mapping_btn.setLabel('Add Mapping') control.trigger_adv_mapping_btn = trigger_adv_mapping_btn remove_btn = create_button() remove_btn.setLabel('Remove') control.remove_btn = remove_btn if idx == 0: row = 0 adv_row = 1 else: row = idx * 2 adv_row = row + 1 control.adv_row = adv_row self.placeControl(control.label, row=row, column=0, rowspan=1, columnspan=1) self.placeControl(control.input_select_btn, row=row, column=1, rowspan=1, columnspan=3) self.placeControl(control.trigger_adv_mapping_btn, row=row, column=4, rowspan=1, columnspan=1) self.placeControl(control.remove_btn, row=row, column=5, rowspan=1, columnspan=1) self.connect_controls(control) if control.device.is_kbd() or control.device.is_mouse( ) or control.device.is_none_device(): trigger_adv_mapping_btn.setEnabled(False) # Still visible for now, but disabled # trigger_adv_mapping_btn.setVisible(False) control.set_internal_navigation() self.controls[control.id] = control # TODO: Should be a dedicated method (set_navigation) self.add_ctrl_btn.controlUp(control.input_select_btn) if control.adv_on_flag: control.adv_select_mapping.controlDown(self.add_ctrl_btn) else: control.input_select_btn.controlDown(self.add_ctrl_btn) previous_control = None for _ctrl_id, _control in self.controls.iteritems(): print 'Looping controls, current index: %s' % _control.idx if _control.idx == control.idx - 1: previous_control = _control if previous_control: if previous_control.adv_on_flag: control.input_select_btn.controlUp( previous_control.adv_select_mapping) previous_control.adv_select_mapping.controlDown( control.input_select_btn) else: control.input_select_btn.controlUp( previous_control.input_select_btn) previous_control.input_select_btn.controlDown( control.input_select_btn) if control.device.mapping: self.trigger_advanced(control) def connect_controls(self, control): self.connect(control.input_select_btn, lambda: self.select_input(control)) self.connect(control.remove_btn, lambda: self.remove_input(control)) self.connect(control.trigger_adv_mapping_btn, lambda: self.trigger_advanced(control)) def select_input(self, control): available_devices = self.filter_input_devices() device_names = [_dev.name for _dev in available_devices] controller = xbmcgui.Dialog().select('Select Input Device', device_names) if controller == -1: return else: print device_names[controller] device = self.device_wrapper.find_device_by_name( device_names[controller]) control.device = device control.input_select_btn.setLabel(device.name) if device.is_kbd() or device.is_mouse() or device.is_none_device(): control.trigger_adv_mapping_btn.setEnabled(False) else: control.trigger_adv_mapping_btn.setEnabled(True) self.input_storage[control.idx] = device def remove_input(self, control, dry=False): self.removeControls(control.controls_as_list()) del_key = None for key, value in self.input_storage.iteritems(): if value.name == control.device.name: del_key = key if not dry: del self.input_storage[del_key] del self.controls[control.id] del control self.init_existing_controls() self.setFocus(self.add_ctrl_btn) def trigger_advanced(self, control): control.adv_on(self) control.set_internal_navigation() next_control = None for _ctrl_id, _control in self.controls.iteritems(): print 'Looping controls, current index: %s' % _control.idx if _control.idx == control.idx + 1: next_control = _control if next_control: control.adv_select_mapping.controlDown( next_control.input_select_btn) next_control.input_select_btn.controlUp(control.adv_select_mapping) else: control.adv_select_mapping.controlDown(self.add_ctrl_btn) self.add_ctrl_btn.controlUp(control.adv_select_mapping) self.setFocus(control.input_select_btn) def unset_advanced(self, control): control.adv_off(self) control.set_internal_navigation() control.unset_mapping_file() for key, device in self.input_storage.iteritems(): if device.name == control.device.name: device.mapping = None print 'Found device and saved mapping' break next_control = None for _ctrl_id, _control in self.controls.iteritems(): print 'Looping controls, current index: %s' % _control.idx if _control.idx == control.idx + 1: next_control = _control if next_control: control.input_select_btn.controlDown(next_control.input_select_btn) next_control.input_select_btn.controlUp(control.input_select_btn) else: control.input_select_btn.controlDown(self.add_ctrl_btn) self.add_ctrl_btn.controlUp(control.input_select_btn) self.setFocus(control.input_select_btn) def select_mapping(self, control): browser = xbmcgui.Dialog().browse(1, 'Select Mapping File', 'files', '.map|.conf', False, False, os.path.expanduser('~')) if browser: control.set_mapping_file(browser) for key, device in self.input_storage.iteritems(): print 'Iterating devices, current IS device: %s' % device.name if device.name == control.device.name: device.mapping = browser print 'Found device and saved mapping' break def create_mapping(self, control): print 'Starting mapping' map_name = xbmcgui.Dialog().input(self.core.string('enter_filename')) progress_dialog = xbmcgui.DialogProgress() progress_dialog.create(self.core.string('name'), self.core.string('starting_mapping')) map_file = '%s/%s.map' % (os.path.expanduser('~'), map_name) moonlight_helper = RequiredFeature('moonlight-helper').request() success = moonlight_helper.create_ctrl_map_new(progress_dialog, map_file, control.device) if success: confirmed = xbmcgui.Dialog().yesno( self.core.string('name'), self.core.string('mapping_success'), self.core.string('set_mapping_active')) self.core.logger.info('Dialog Yes No Value: %s' % confirmed) if confirmed: control.set_mapping_file(map_file) for key, device in self.input_storage.iteritems(): print 'Iterating devices, current IS device: %s' % device.name if device.name == control.device.name: device.mapping = map_file print 'Found device and saved mapping' break else: xbmcgui.Dialog().ok(self.core.string('name'), self.core.string('mapping_failure')) def init_existing_controls(self): if self.controls is not None: for key, value in self.controls.iteritems(): self.remove_input(value, True) self.controls = {} del_keys = [] for key, device in self.input_storage.iteritems(): print 'Iterating saved input devices in INIT: %s' % device.name if not self.device_wrapper.find_device_by_name(device.name): print 'Could not find device by name: %s' % device.name del_keys.append(key) for key in del_keys: del self.input_storage[key] for key, device in self.input_storage.iteritems(): self.add_ctrl(device) def filter_input_devices(self): device_list = [] current_ctrl_labels = [ ctrl.input_select_btn.getLabel() for key, ctrl in self.controls.iteritems() ] for device in self.available_devices: if device.name not in current_ctrl_labels: device_list.append(device) return device_list def close_and_save(self): self.input_storage.sync() print self.input_storage.raw_dict() print 'Save called, closing window ... ' self.close()