Ejemplo n.º 1
0
class MediathekViewService(KodiService):
    """ The main service class """
    def __init__(self):
        super(MediathekViewService, self).__init__()
        self.set_topic('Service')
        self.settings = Settings()
        self.notifier = Notifier()
        self.monitor = MediathekViewMonitor(self, 'instanceid')
        self.updater = MediathekViewUpdater(self.get_new_logger('Updater'),
                                            self.notifier, self.settings,
                                            self.monitor)

    def init(self):
        """ Initialisation of the service """
        self.info('Init (instance id: {})', self.monitor.instance_id)
        self.monitor.register_instance()
        self.updater.init(convert=True)
        self.settings.reset_user_activity()

    def run(self):
        """ Execution of the service """
        self.info('Starting up... (instance id: {})', self.monitor.instance_id)
        while not self.monitor.abort_requested():
            if self.settings.reload() is True:
                # database configuration changed
                self.info(
                    '===== Database Configuration has changed - Reloading the updater ====='
                )
                self.updater.reload()

            updateop = self.updater.get_current_update_operation()
            if updateop == 1:
                # full update
                self.info('Initiating full update...')
                self.settings.save_update_instance(self.monitor.instance_id)
                self.updater.update(True)
            elif updateop == 2:
                # differential update
                self.info('Initiating differential update...')
                self.settings.save_update_instance(self.monitor.instance_id)
                self.updater.update(False)
            # Sleep/wait for abort for 60 seconds
            if self.monitor.wait_for_abort(15):
                # Abort was requested while waiting. We should exit
                break
        self.info('Shutting down... (instance id: {})',
                  self.monitor.instance_id)

    def exit(self):
        """ Shutdown of the service """
        self.info('Exit (instance id: {})', self.monitor.instance_id)
        self.updater.exit()
        self.monitor.unregister_instance()

    def reload_settings(self):
        """ Reload settings and reconfigure service behaviour """
        # self.info("===== RELOAD SETTINGS =====")
        # TODO: support online reconfiguration
        #       currently there is a bug in Kodi: this event is only
        #       triggered if the reconfiguration happen inside the
        #       addon (via setSetting). If teh user changes something
        #       via the settings page, NOTHING WILL HAPPEN!
        pass
Ejemplo n.º 2
0
class UpdateApp(AppLogger):
    """ The standalone updater application class """
    def __init__(self):
        scriptpath, scriptname = os.path.split(sys.argv[0])
        storederr = None
        version = '0.0'
        try:
            tree = ET.parse(os.path.join(scriptpath, 'addon.xml'))
            version = tree.getroot().attrib['version']
        # pylint: disable=broad-except
        except Exception:
            # cannot self.warn before super.__init__, so store for later
            storederr = sys.exc_info()
        AppLogger.__init__(self, scriptname, version)
        self.args = None
        self.verbosity = 0
        self.notifier = None
        self.monitor = None
        self.updater = None
        self.settings = None
        if storederr is not None:
            self.warn("Unable to find version information: {} {}",
                      storederr[0].__name__, storederr[1])
        self.info('Python Version' + sys.version)

    def init(self):
        """ Startup of the application """
        # pylint: disable=line-too-long
        parser = argparse.ArgumentParser(
            formatter_class=argparse.ArgumentDefaultsHelpFormatter,
            description=
            'This is the standalone database updater. It downloads the current database update from mediathekview.de and integrates it in a local database'
        )
        parser.add_argument('-v',
                            '--verbose',
                            default=0,
                            action='count',
                            help='show progress messages')
        subparsers = parser.add_subparsers(dest='dbtype',
                                           help='target database')
        sqliteopts = subparsers.add_parser(
            'sqlite', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
        sqliteopts.add_argument('-v',
                                '--verbose',
                                default=0,
                                action='count',
                                help='show progress messages')
        sqliteforce = sqliteopts.add_mutually_exclusive_group()
        sqliteforce.add_argument('-f',
                                 '--force',
                                 default=False,
                                 action='store_true',
                                 help='ignore the minimum interval')
        sqliteforce.add_argument(
            '-F',
            '--full',
            default=False,
            action='store_true',
            help='ignore the minimum interval and force a full update')
        sqliteopts.add_argument('-i',
                                '--intervall',
                                default=3600,
                                type=int,
                                action='store',
                                help='minimum interval between updates')
        sqliteopts.add_argument(
            '-p',
            '--path',
            dest='path',
            help='alternative path for the sqlite database',
            default='./')
        sqliteopts.add_argument('-n',
                                '--native',
                                default=False,
                                action='store_true',
                                help='allow native update')
        mysqlopts = subparsers.add_parser(
            'mysql', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
        mysqlopts.add_argument('-v',
                               '--verbose',
                               default=0,
                               action='count',
                               help='show progress messages')
        mysqlforce = mysqlopts.add_mutually_exclusive_group()
        mysqlforce.add_argument('-f',
                                '--force',
                                default=False,
                                action='store_true',
                                help='ignore the minimum interval')
        mysqlforce.add_argument(
            '-F',
            '--full',
            default=False,
            action='store_true',
            help='ignore the minimum interval and force a full update')
        mysqlopts.add_argument('-i',
                               '--intervall',
                               default=3600,
                               type=int,
                               action='store',
                               help='minimum interval between updates')
        mysqlopts.add_argument('-H',
                               '--host',
                               dest='host',
                               help='hostname or ip address',
                               default='localhost')
        mysqlopts.add_argument('-P',
                               '--port',
                               dest='port',
                               help='connection port',
                               default='3306')
        mysqlopts.add_argument('-u',
                               '--user',
                               dest='user',
                               help='connection username',
                               default='mediathekview')
        mysqlopts.add_argument('-p',
                               '--password',
                               dest='password',
                               help='connection password',
                               default=None)
        mysqlopts.add_argument('-d',
                               '--database',
                               dest='database',
                               default='mediathekview',
                               help='database name')
        self.args = parser.parse_args()
        self.verbosity = self.args.verbose

        self.info('Startup')
        self.settings = Settings(self.args)
        self.notifier = Notifier()
        self.monitor = MediathekViewMonitor()
        self.updater = MediathekViewUpdater(
            self.get_new_logger('MediathekViewUpdater'), self.notifier,
            self.settings, self.monitor)
        return self.updater.init(convert=True)

    def run(self):
        """ Execution of the application """
        self.info('Starting up...')
        updateop = self.updater.get_current_update_operation(
            self.args.force, self.args.full)
        if updateop == 1:
            # full update
            self.info('Initiating full update...')
            self.updater.update(True)
        elif updateop == 2:
            # differential update
            self.info('Initiating differential update...')
            self.updater.update(False)
        self.info('Exiting...')

    def exit(self):
        """ Shutdown of the application """
        self.updater.exit()