diff --git a/playtube/webview2_runtime.py b/playtube/webview2_runtime.py index d8874f4..9efbbec 100644 --- a/playtube/webview2_runtime.py +++ b/playtube/webview2_runtime.py @@ -18,9 +18,30 @@ class WebView2Unavailable(RuntimeError): """WebView2 konnte nicht geladen werden (DLLs oder Runtime fehlen).""" +def _app_base_dir() -> Path: + return Path(getattr(sys, "_MEIPASS", Path(__file__).resolve().parent.parent)) + + def _vendor_dir() -> Path: - base = Path(getattr(sys, "_MEIPASS", Path(__file__).resolve().parent.parent)) - return base / "vendor" / "webview2" + return _app_base_dir() / "vendor" / "webview2" + + +def _unblock_downloaded_files(folders: tuple[Path, ...]) -> None: + """Entfernt die "Mark of the Web" (Zone.Identifier) von den DLLs, die .NET laden soll. + + Wer die ZIP aus dem Internet laedt und entpackt, bekommt alle Dateien mit dieser + Markierung; .NET verweigert dann das Laden von Python.Runtime.dll ("Failed to resolve + Python.Runtime.Loader.Initialize"). Die Dateien liegen im eigenen App-Ordner - das + Entfernen der Markierung betrifft nur sie.""" + if os.name != "nt": + return + for folder in folders: + for path in folder.rglob("*"): + if path.suffix.lower() in (".dll", ".exe"): + try: + os.remove(f"{path}:Zone.Identifier") + except OSError: + pass # keine Markierung vorhanden (Normalfall) oder Dateisystem ohne Datenstroeme @lru_cache(maxsize=1) @@ -32,6 +53,9 @@ def load() -> SimpleNamespace: if not core_dll.exists() or not winforms_dll.exists(): raise WebView2Unavailable(f"WebView2-DLLs fehlen in {vendor}") + base = _app_base_dir() + _unblock_downloaded_files((vendor, base / "pythonnet", base / "clr_loader")) + # WebView2Loader.dll (nativ) wird ueber den Suchpfad bzw. runtimes/win-x64/native gefunden. os.environ["PATH"] = f"{vendor}{os.pathsep}{os.environ.get('PATH', '')}" try: