Exemple #1
0
 def update_known_packages(self):
     for root, _, filenames in os.walk(self.meta_path):
         for filename in filenames:
             if filename.endswith('.json'):
                 with open(os.path.join(root, filename)) as file:
                     try:
                         meta = json.loads(file.read())
                         database.add_provider_package(
                             meta['name'], meta['author'],
                             meta['remote_meta'], meta['version'])
                     except:
                         pass
     self.poll_database()
Exemple #2
0
    def install_zip(self, zip_file, silent=False):
        file_list = zip_file.namelist()

        for i in file_list:
            if i.startswith('/') or '..' in i:
                raise Exception

        meta_file = None
        for i in file_list:
            if i.startswith('meta.json'):
                meta_file = i

        if meta_file is not None:
            meta = zip_file.open(meta_file)
            meta = meta.readlines()
            meta = ''.join(meta)
            meta = meta.replace(' ', '').replace('\r', '').replace('\n', '')
            meta = json.loads(meta)
            requirements = ['author', 'name', 'version']
            for i in requirements:
                if i not in meta:
                    if not silent:
                        self.failed_prompt()
                    tools.log(
                        'Source pack is malformed, please check and correct issue in the meta file'
                    )
                    return
            author = meta['author']
            version = meta['version']
            pack_name = meta['name']
            remote_meta = meta.get('remote_meta', '')
        else:
            if not silent:
                self.failed_prompt()
            tools.log(
                'Source pack is malformed, please check and correct issue in the meta file'
            )
            import traceback
            traceback.print_exc()
            raise Exception

        if remote_meta == '':
            tools.showDialog.ok(tools.addonName,
                                tools.lang(33016).encode('utf-8'))

        line1 = tools.colorString(tools.lang(33001).encode(
            'utf-8')) + " %s - v%s" % (pack_name, version)
        line2 = tools.colorString(
            tools.lang(33002).encode('utf-8')) + "%s" % author
        line3 = tools.lang(33003).encode('utf-8')

        if not silent:
            accept = tools.showDialog.yesno(
                tools.addonName + " - %s" % tools.lang(33004).encode('utf-8'),
                line1, line2, line3,
                tools.lang(33005).encode('utf-8'),
                tools.lang(33006).encode('utf-8'))
            if accept == 0:
                return

        self.pre_update_collection = [
            i for i in database.get_providers() if i['package'] == pack_name
        ]

        database.remove_package_providers(pack_name)

        folders = ['providerModules/', 'providers/']
        meta_output_location = os.path.join(tools.dataPath, 'providerMeta',
                                            '%s.json' % pack_name)

        if os.path.isfile(meta_output_location):
            try:
                os.rename(meta_output_location,
                          '%s.temp' % meta_output_location)
            except Exception as e:
                self.failure_cleanup(meta_output_location, pack_name, folders)
                tools.log('Failed to create temporary meta file')
                if not silent:
                    tools.showDialog.ok(tools.addonName,
                                        tools.lang(33007).encode('utf-8'))
                return

            try:
                self.output_meta(meta)
            except:
                self.failure_cleanup(meta_output_location, pack_name, folders)
                tools.log('Failed to create new meta file')
                if not silent:
                    self.failed_prompt()
                return

        else:
            self.output_meta(meta)

        if not silent:
            install_progress = tools.progressDialog
            install_progress.create(
                tools.addonName,
                '%s - %s' % (pack_name, tools.lang(33008).encode('utf-8')),
                tools.lang(33009).encode('utf-8'))
            install_progress.update(-1)

        try:
            for folder in folders:
                try:
                    folder_path = os.path.join(tools.dataPath,
                                               folder.strip('/'), pack_name)
                    if os.path.exists(folder_path):
                        os.rename(folder_path, '%s.temp' % folder_path)
                    for file in file_list:
                        if file.startswith(folder):
                            zip_file.extract(file, tools.dataPath)

                except:
                    tools.log('Failed to extract to folder - %s' % folder)
                    import traceback
                    traceback.print_exc()
                    self.failure_cleanup(meta_output_location, pack_name,
                                         folders)
                    if not silent:
                        self.failed_prompt()
                    return
            try:
                zip_file.close()
            except:
                pass

            if not silent:
                install_progress.close()
            if not silent:
                tools.showDialog.ok(
                    tools.addonName,
                    '%s - %s' % (tools.lang(33010).encode('utf-8'), pack_name))
        except:
            import traceback
            traceback.print_exc()
            if not silent:
                install_progress.close()
                tools.showDialog.ok(
                    tools.addonName,
                    '%s - %s' % (tools.lang(33012).encode('utf-8'), pack_name),
                    tools.lang(33011).encode('utf-8'))
            return

        if os.path.exists('%s.temp' % meta_output_location):
            os.remove('%s.temp' % meta_output_location)
        for folder in folders:
            folder_path = os.path.join(tools.dataPath, folder.strip('/'),
                                       pack_name)
            if os.path.exists('%s.temp' % folder_path):
                shutil.rmtree('%s.temp' % folder_path)

        tools.log('Refreshing provider database ')
        database.add_provider_package(pack_name, author, remote_meta, version)

        self.update_known_providers()
        return True
Exemple #3
0
    def install_zip(self, zip_file, silent=False):
        file_list = zip_file.namelist()

        for i in file_list:
            if i.startswith('/') or '..' in i:
                raise Exception

        zip_root_dir = ''
        if file_list[0].endswith('/'):
            zip_root_dir = file_list[0]
            for i, v in enumerate(file_list):
                file_list[i] = file_list[i].replace(zip_root_dir, '')
            file_list = file_list[1:]

        meta_file = None
        for i in file_list:
            if i.startswith('meta.json'):
                meta_file = i
                break

        if meta_file is not None:
            meta = zip_file.open(zip_root_dir + meta_file)
            meta = meta.readlines()
            meta = ''.join([
                i if not isinstance(value, bytes) else value.decode('utf-8')
                for value in meta
            ])
            meta = meta.replace(' ', '').replace('\r', '').replace('\n', '')
            meta = json.loads(meta)
            requirements = ['author', 'name', 'version']
            for i in requirements:
                if i not in meta:
                    if not silent:
                        self.failed_prompt()
                    tools.log(
                        'Source pack is malformed, please check and correct issue in the meta file'
                    )
                    return
            author = meta['author']
            version = meta['version']
            pack_name = meta['name']
            remote_meta = meta.get('remote_meta', '')
        else:
            if not silent:
                self.failed_prompt()
            tools.log(
                'Source pack is malformed, please check and correct issue in the meta file'
            )
            import traceback
            traceback.print_exc()
            raise Exception

        if remote_meta == '':
            tools.showDialog.ok(tools.addonName, tools.lang(33016))

        line1 = tools.colorString(
            tools.lang(33001)) + " %s - v%s" % (pack_name, version)
        line2 = tools.colorString(tools.lang(33002)) + "%s" % author
        line3 = tools.lang(33003)

        if not silent:
            accept = tools.showDialog.yesno(
                tools.addonName + " - %s" % tools.lang(33004), line1, line2,
                line3, tools.lang(33005), tools.lang(33006))
            if accept == 0:
                return

        self.pre_update_collection = [
            i for i in database.get_providers() if i['package'] == pack_name
        ]

        folders = ['providerModules/', 'providers/']
        meta_output_location = os.path.join(tools.dataPath, 'providerMeta',
                                            '%s.json' % pack_name)

        if os.path.isfile(meta_output_location):
            if os.path.isfile(meta_output_location + '.temp'):
                os.remove(meta_output_location + '.temp')
            try:
                os.rename(meta_output_location,
                          '%s.temp' % meta_output_location)
            except Exception as e:
                self.failure_cleanup(meta_output_location, pack_name, folders)
                tools.log('Failed to create temporary meta file')
                if not silent:
                    tools.showDialog.ok(tools.addonName, tools.lang(33007))
                return

            try:
                self.output_meta(meta)
            except:
                self.failure_cleanup(meta_output_location, pack_name, folders)
                tools.log('Failed to create new meta file')
                if not silent:
                    self.failed_prompt()
                return

        else:
            self.output_meta(meta)

        if not silent:
            install_progress = tools.progressDialog
            install_progress.create(tools.addonName,
                                    '%s - %s' % (pack_name, tools.lang(33008)),
                                    tools.lang(33009))
            install_progress.update(-1)
        try:
            for folder in folders:
                try:
                    folder_path = os.path.join(tools.dataPath,
                                               folder.strip('/'), pack_name)
                    if os.path.exists(folder_path):
                        if os.path.exists('%s.temp' % folder_path):
                            shutil.rmtree('%s.temp' % folder_path)
                        os.rename(folder_path, '%s.temp' % folder_path)
                    for file in file_list:
                        if file == 'providers/__init__.py':
                            continue
                        if file.startswith(folder):
                            memberpath = os.path.join(zip_root_dir, file)
                            targetpath = os.path.join(tools.dataPath, file)

                            upperdirs = os.path.dirname(targetpath)
                            if upperdirs and not os.path.exists(upperdirs):
                                os.makedirs(upperdirs)

                            if memberpath[-1] == '/':
                                if not os.path.isdir(targetpath):
                                    os.mkdir(targetpath)
                                continue

                            with zip_file.open(memberpath) as source, \
                                    open(targetpath, "wb") as target:
                                shutil.copyfileobj(source, target)

                except:
                    tools.log('Failed to extract to folder - %s' % folder)
                    import traceback
                    traceback.print_exc()
                    self.failure_cleanup(meta_output_location, pack_name,
                                         folders)
                    if not silent:
                        self.failed_prompt()
                    return
            try:
                zip_file.close()
            except:
                pass

            if not silent:
                try:
                    install_progress.close()
                except:
                    pass
            if not silent:
                tools.showDialog.ok(tools.addonName,
                                    '%s - %s' % (tools.lang(33010), pack_name))
        except:
            import traceback
            traceback.print_exc()
            if not silent:
                try:
                    install_progress.close()
                    tools.showDialog.ok(
                        tools.addonName,
                        '%s - %s' % (tools.lang(33012), pack_name),
                        tools.lang(33011))
                except:
                    pass
            return

        if os.path.exists('%s.temp' % meta_output_location):
            os.remove('%s.temp' % meta_output_location)
        for folder in folders:
            folder_path = os.path.join(tools.dataPath, folder.strip('/'),
                                       pack_name)
            if os.path.exists('%s.temp' % folder_path):
                shutil.rmtree('%s.temp' % folder_path)

        tools.log('Refreshing provider database ')
        database.add_provider_package(pack_name, author, remote_meta, version)

        tools.execute(
            'RunPlugin("plugin://plugin.video.%s/?action=refreshProviders")' %
            tools.addonName.lower())
        return True