Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c2599a72a1 | ||
|
|
2cc6c5e9c6 | ||
|
|
891562dc88 |
No files matched your search
@@ -87,6 +87,14 @@ jobs:
|
|||||||
- name: Build exe
|
- name: Build exe
|
||||||
run: python build_windows.py
|
run: python build_windows.py
|
||||||
|
|
||||||
|
- name: Unblock files (rimuovi MOTW pre-zip)
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
# Per ridurre l'incidenza del bug "Failed to resolve
|
||||||
|
# Python.Runtime.Loader.Initialize" causato da Mark of the Web.
|
||||||
|
Get-ChildItem -Path dist/MusicTools -Recurse -Include *.dll,*.exe,*.pyd `
|
||||||
|
| Unblock-File
|
||||||
|
|
||||||
- name: Package -> zip
|
- name: Package -> zip
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
+21
-1
@@ -106,6 +106,9 @@ def run_pyinstaller():
|
|||||||
"--windowed",
|
"--windowed",
|
||||||
"--onedir",
|
"--onedir",
|
||||||
"--noconfirm",
|
"--noconfirm",
|
||||||
|
# Forza rebuild pulita (senza, residui di build vecchi possono
|
||||||
|
# confondere il bundling di pythonnet/clr_loader).
|
||||||
|
"--clean",
|
||||||
]
|
]
|
||||||
if icon_path.exists():
|
if icon_path.exists():
|
||||||
cmd.extend(["--icon", str(icon_path)])
|
cmd.extend(["--icon", str(icon_path)])
|
||||||
@@ -115,11 +118,28 @@ def run_pyinstaller():
|
|||||||
# Hidden imports per pywebview (EdgeChromium su Windows)
|
# Hidden imports per pywebview (EdgeChromium su Windows)
|
||||||
"--hidden-import", "webview",
|
"--hidden-import", "webview",
|
||||||
"--hidden-import", "webview.platforms.edgechromium",
|
"--hidden-import", "webview.platforms.edgechromium",
|
||||||
|
"--hidden-import", "webview.platforms.winforms",
|
||||||
"--hidden-import", "clr",
|
"--hidden-import", "clr",
|
||||||
|
"--hidden-import", "clr_loader",
|
||||||
|
"--hidden-import", "clr_loader.netfx",
|
||||||
|
"--hidden-import", "clr_loader.types",
|
||||||
|
"--hidden-import", "pythonnet",
|
||||||
"--hidden-import", "requests",
|
"--hidden-import", "requests",
|
||||||
# Collegamenti completi alle DLL .NET di pywebview/pythonnet
|
# Collegamenti completi: webview, pythonnet, clr_loader (porta
|
||||||
|
# con se Python.Runtime.dll + nethost.dll + runtimeconfig.json
|
||||||
|
# altrimenti winforms.py fallisce con "Failed to resolve
|
||||||
|
# Python.Runtime.Loader.Initialize ...")
|
||||||
"--collect-all", "webview",
|
"--collect-all", "webview",
|
||||||
|
"--collect-all", "pythonnet",
|
||||||
|
"--collect-all", "clr_loader",
|
||||||
"--collect-all", "mutagen",
|
"--collect-all", "mutagen",
|
||||||
|
# collect-data prende anche i file .json/.dll non-Python che
|
||||||
|
# collect-all potrebbe saltare (Python.Runtime.runtimeconfig.json
|
||||||
|
# in particolare).
|
||||||
|
"--collect-data", "pythonnet",
|
||||||
|
"--collect-data", "clr_loader",
|
||||||
|
"--copy-metadata", "pythonnet",
|
||||||
|
"--copy-metadata", "clr_loader",
|
||||||
# Binari bundled
|
# Binari bundled
|
||||||
*add_binaries,
|
*add_binaries,
|
||||||
# Entry point
|
# Entry point
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
VERSION = "v1.7.4"
|
VERSION = "v1.7.7"
|
||||||
|
|
||||||
|
|
||||||
APP_NAME = "MusicTools"
|
APP_NAME = "MusicTools"
|
||||||
|
|||||||
@@ -4,6 +4,46 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
# Windows: forza il caricamento del runtime pythonnet PRIMA di importare
|
||||||
|
# webview. Con PyInstaller il lazy-loader fallisce con
|
||||||
|
# "Failed to resolve Python.Runtime.Loader.Initialize" perche'
|
||||||
|
# Python.Runtime.dll viene bundlata ma il loader non sa risolverla
|
||||||
|
# senza l'inizializzazione esplicita. Fix conferma:
|
||||||
|
# https://github.com/pythonnet/pythonnet/issues/2178
|
||||||
|
if sys.platform == "win32":
|
||||||
|
# ============================================================
|
||||||
|
# Fix Windows: rimuovi Mark of the Web (MOTW) dalle DLL bundled.
|
||||||
|
# Quando l'utente scarica il .zip dal browser, Windows aggiunge
|
||||||
|
# uno stream NTFS Zone.Identifier a TUTTI i file estratti.
|
||||||
|
# .NET Framework 4.x rifiuta silenziosamente di risolvere i
|
||||||
|
# symbol export degli assembly managed con MOTW -> il loader
|
||||||
|
# netfx di pythonnet fallisce con "Failed to resolve
|
||||||
|
# Python.Runtime.Loader.Initialize".
|
||||||
|
# Soluzione: cancelliamo lo stream :Zone.Identifier da ogni
|
||||||
|
# .dll/.exe del bundle al primo avvio (operazione idempotente
|
||||||
|
# e sicura: l'utente ha gia eseguito l'exe esplicitamente).
|
||||||
|
# Vedi: https://github.com/r0x0r/pywebview/issues/1215
|
||||||
|
# ============================================================
|
||||||
|
if getattr(sys, "frozen", False):
|
||||||
|
try:
|
||||||
|
import ctypes
|
||||||
|
_kernel32 = ctypes.windll.kernel32
|
||||||
|
_bundle = Path(sys._MEIPASS) # type: ignore[attr-defined]
|
||||||
|
for _f in _bundle.rglob("*"):
|
||||||
|
if _f.suffix.lower() in (".dll", ".exe", ".pyd"):
|
||||||
|
_kernel32.DeleteFileW(f"{_f}:Zone.Identifier")
|
||||||
|
except Exception as _e:
|
||||||
|
print(f"[bootstrap] MOTW cleanup failed: {_e}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
if getattr(sys, "frozen", False):
|
||||||
|
os.environ["PYTHONNET_RUNTIME"] = "netfx"
|
||||||
|
from pythonnet import load as _pythonnet_load
|
||||||
|
_pythonnet_load("netfx")
|
||||||
|
import clr # noqa: F401 - inizializza il loader
|
||||||
|
except Exception as _e:
|
||||||
|
print(f"[bootstrap] preload pythonnet failed: {_e}")
|
||||||
|
|
||||||
import webview
|
import webview
|
||||||
|
|
||||||
from api.bridge import Api
|
from api.bridge import Api
|
||||||
|
|||||||
+2
-1
@@ -5,4 +5,5 @@ mutagen>=1.47.0
|
|||||||
pyobjc-core>=10.0 ; sys_platform == "darwin"
|
pyobjc-core>=10.0 ; sys_platform == "darwin"
|
||||||
pyobjc-framework-Cocoa>=10.0 ; sys_platform == "darwin"
|
pyobjc-framework-Cocoa>=10.0 ; sys_platform == "darwin"
|
||||||
pyobjc-framework-WebKit>=10.0 ; sys_platform == "darwin"
|
pyobjc-framework-WebKit>=10.0 ; sys_platform == "darwin"
|
||||||
pythonnet>=3.0 ; sys_platform == "win32"
|
pythonnet==3.0.5 ; sys_platform == "win32"
|
||||||
|
clr-loader==0.2.7.post0 ; sys_platform == "win32"
|
||||||
Reference in new issue
Block a user