Example #1
0
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
Example #2
0
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
Example #3
0
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
Example #4
0
    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
Example #5
0
        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
Example #6
0
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
Example #7
0
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()
Example #8
0
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()