def _verifyPluginFolder( self, folder: str) -> typing.List[typing.Type[PluginMixin]]: self._logger.info("Verify plugin in folder: %s", folder) oldClasses = [x.clazz for x in self._app.getConfig().plugins] root = Path(folder) if not (root / "__init__.py").exists(): raise RuntimeError("Plugin folder must contains __init__.py") targetPath = Path(f"IceSpringMusicPlayer/plugins/{root.name}") if targetPath.exists(): self._logger.info("Plugin already exists.") raise RuntimeError("Plugin Already Exists") self._logger.info("Copy plugin folder to plugins dir %s", targetPath) root.copytree(targetPath) try: classes = self.findPluginClassesInFolder(str(targetPath)) classes = [x for x in classes if x not in oldClasses] except Exception as e: self._logger.info("Exception occurred: %s", e, e) self._logger.info("Remove folder: %s", targetPath) targetPath.rmtree() raise e if len(classes) == 0: self._logger.info("No plugin found in folder, remove folder") targetPath.rmtree() raise RuntimeError("No plugin found") return classes
def _loadConfig(self) -> Config: self._logger.info("Load config") path = Path("config.json") if not path.exists(): self._logger.info("No config.json file, return default config") return self.getDefaultConfig() jd = json.loads(path.read_text(), object_pairs_hook=Config.fromJson) config = Config( **{ **self.getDefaultConfig().__dict__, **{k: v for k, v in jd.items() if k in Config.__annotations__} }) self._logger.info("Process plugin configs (%d plugins)", len(self._pluginService.getPluginClasses())) for plugin in config.plugins: self._logger.info("Plugin in config: %s", plugin) jd = json.loads(json.dumps( plugin.config, default=plugin.clazz.getPluginConfigClass().pythonToJson), object_pairs_hook=plugin.clazz. getPluginConfigClass().jsonToPython) plugin.config = gg(plugin.clazz.getPluginConfigClass())(**jd) self._logger.info("Process plugins not in config") loadedClasses = [x.clazz for x in config.plugins] for clazz in self._pluginService.getPluginClasses(): if clazz not in loadedClasses: self._logger.info("Plugin not in config: %s", clazz) config.plugins.append( Plugin(clazz=clazz, disabled=False, config=clazz.getPluginConfigClass(). getDefaultObject())) self._logger.info("Sort plugins") config.plugins.sort( key=lambda x: x.clazz.__module__ + "." + x.clazz.__name__) self._logger.info("Load layout config") self._loadElementConfig(config.layout) self._logger.info("Loaded config: %s", config) return config
import shutil import sys from subprocess import Popen, PIPE import PyInstaller.__main__ from IceSpringPathLib import Path from PyInstaller.utils.hooks import collect_submodules from IceSpringMusicPlayer.utils.logUtils import LogUtils name = "IceSpringMusicPlayer" vsHome = Path(r"C:\Program Files (x86)\Microsoft Visual Studio\2019").absolute() vcvarsall = vsHome / r"BuildTools\VC\Auxiliary\Build\vcvarsall.bat" ffmpegHome = Path("./ffmpeg").absolute() fftwDll = Path("libfftw3f-3.dll").absolute() assert vsHome.exists() assert vcvarsall.exists() assert ffmpegHome.exists() assert ffmpegHome.__truediv__("ffmpeg.exe").exists() assert ffmpegHome.__truediv__("ffprobe.exe").exists() assert fftwDll.exists() LogUtils.initLogging() logging.getLogger().setLevel(logging.INFO) logging.info("Removing application directory if exists...") Path(f"dist/{name}").exists() and Path(f"dist/{name}").rmtree() logging.info("Checking for backup directory...") if Path(f"dist/{name}-backup").exists(): logging.info("Backup directory exists, restoring it...") Path(f"dist/{name}-backup").copytree(Path(f"dist/{name}"))