Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b74a0a53ec | ||
|
|
415175ec4d |
No files matched your search
@@ -239,6 +239,7 @@ def run_pyinstaller():
|
|||||||
if app_path.exists():
|
if app_path.exists():
|
||||||
log(f"Build completata: {app_path}")
|
log(f"Build completata: {app_path}")
|
||||||
patch_info_plist(app_path)
|
patch_info_plist(app_path)
|
||||||
|
adhoc_codesign(app_path)
|
||||||
# Mostra dimensione
|
# Mostra dimensione
|
||||||
size = sum(f.stat().st_size for f in app_path.rglob("*") if f.is_file())
|
size = sum(f.stat().st_size for f in app_path.rglob("*") if f.is_file())
|
||||||
log(f"Dimensione: {size / 1024 / 1024:.0f} MB")
|
log(f"Dimensione: {size / 1024 / 1024:.0f} MB")
|
||||||
@@ -292,6 +293,52 @@ def patch_info_plist(app_path):
|
|||||||
log("Info.plist aggiornato.")
|
log("Info.plist aggiornato.")
|
||||||
|
|
||||||
|
|
||||||
|
def adhoc_codesign(app_path):
|
||||||
|
"""Ad-hoc codesign dell'intero bundle .app.
|
||||||
|
|
||||||
|
Senza una firma coerente, macOS tratta ffmpeg (subprocess bundled)
|
||||||
|
come binario separato dal main MusicTools per TCC: ffmpeg apre il
|
||||||
|
dispositivo audio senza errore ma riceve solo silenzio perche' il
|
||||||
|
sistema non gli concede il permesso microfono ereditato.
|
||||||
|
|
||||||
|
`codesign --force --deep --sign -` applica una firma ad-hoc (gratis,
|
||||||
|
senza Developer ID) a tutti i binari nested. Per macOS questo rende
|
||||||
|
l'app un singolo "team" coerente, e il permesso TCC concesso al
|
||||||
|
main si propaga anche a ffmpeg/ffprobe/yt-dlp.
|
||||||
|
"""
|
||||||
|
log("Ad-hoc codesign del bundle (per TCC microfono ereditato)...")
|
||||||
|
try:
|
||||||
|
# Rimuovi vecchie firme che potrebbero confondere codesign --deep
|
||||||
|
subprocess.run(
|
||||||
|
["xattr", "-cr", str(app_path)],
|
||||||
|
capture_output=True,
|
||||||
|
)
|
||||||
|
subprocess.run(
|
||||||
|
["codesign", "--remove-signature", "--deep", str(app_path)],
|
||||||
|
capture_output=True,
|
||||||
|
)
|
||||||
|
result = subprocess.run(
|
||||||
|
["codesign", "--force", "--deep", "--sign", "-",
|
||||||
|
"--timestamp=none", str(app_path)],
|
||||||
|
capture_output=True, text=True,
|
||||||
|
)
|
||||||
|
if result.returncode != 0:
|
||||||
|
log(f"ATTENZIONE: codesign fallito: {result.stderr.strip()}")
|
||||||
|
else:
|
||||||
|
log("Codesign ad-hoc completato.")
|
||||||
|
# Verifica
|
||||||
|
verify = subprocess.run(
|
||||||
|
["codesign", "--verify", "--deep", "--strict", str(app_path)],
|
||||||
|
capture_output=True, text=True,
|
||||||
|
)
|
||||||
|
if verify.returncode == 0:
|
||||||
|
log("Verifica firma OK.")
|
||||||
|
else:
|
||||||
|
log(f"NOTA: verifica firma con warning: {verify.stderr.strip()}")
|
||||||
|
except FileNotFoundError:
|
||||||
|
log("ATTENZIONE: 'codesign' non trovato nel PATH, skip ad-hoc signing")
|
||||||
|
|
||||||
|
|
||||||
# =========================================================================
|
# =========================================================================
|
||||||
# Main
|
# Main
|
||||||
# =========================================================================
|
# =========================================================================
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
VERSION = "v1.7.9"
|
VERSION = "v1.7.11"
|
||||||
|
|
||||||
|
|
||||||
APP_NAME = "MusicTools"
|
APP_NAME = "MusicTools"
|
||||||
|
|||||||
+14
-2
@@ -73,7 +73,14 @@ def _is_virtual(name: str) -> bool:
|
|||||||
|
|
||||||
def _list_macos(ffmpeg: str) -> list[dict]:
|
def _list_macos(ffmpeg: str) -> list[dict]:
|
||||||
"""Parsa l'output di `ffmpeg -f avfoundation -list_devices true -i ""`.
|
"""Parsa l'output di `ffmpeg -f avfoundation -list_devices true -i ""`.
|
||||||
L'output va su stderr."""
|
L'output va su stderr.
|
||||||
|
|
||||||
|
IMPORTANTE: come 'id' usiamo il NOME del device (non l'index numerico).
|
||||||
|
AVFoundation rinumera silenziosamente i device quando cambia il set di
|
||||||
|
hardware collegato (es. iPhone in continuita', Multi-Output Device, ecc).
|
||||||
|
Il nome e' invece stabile; ffmpeg AVFoundation accetta sia ':<index>'
|
||||||
|
sia ':<name>' come specifica del device input.
|
||||||
|
"""
|
||||||
try:
|
try:
|
||||||
proc = subprocess.run(
|
proc = subprocess.run(
|
||||||
[ffmpeg, "-hide_banner", "-f", "avfoundation",
|
[ffmpeg, "-hide_banner", "-f", "avfoundation",
|
||||||
@@ -105,7 +112,12 @@ def _list_macos(ffmpeg: str) -> list[dict]:
|
|||||||
if not m:
|
if not m:
|
||||||
continue
|
continue
|
||||||
idx, name = m.group(1), m.group(2).strip()
|
idx, name = m.group(1), m.group(2).strip()
|
||||||
devices.append({"id": idx, "name": name, "is_virtual": _is_virtual(name)})
|
devices.append({
|
||||||
|
"id": name, # nome stabile (vedi docstring)
|
||||||
|
"index": idx, # solo informativo per debug
|
||||||
|
"name": name,
|
||||||
|
"is_virtual": _is_virtual(name),
|
||||||
|
})
|
||||||
|
|
||||||
return devices
|
return devices
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user