From b74a0a53eca789a33f6b356965f8a65fcf3cb726 Mon Sep 17 00:00:00 2001 From: luzadev Date: Tue, 9 Jun 2026 21:29:30 +0200 Subject: [PATCH] =?UTF-8?q?v1.7.11:=20fix=20definitivo=20BlackHole=20?= =?UTF-8?q?=E2=80=94=20ad-hoc=20codesign=20del=20bundle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Causa root: MusicTools.app ha il permesso TCC microfono, ma quando lancia ffmpeg come subprocess macOS tratta ffmpeg come binario non firmato distinto -> AVFoundation apre il device senza errore ma restituisce solo silenzio. Fix in build_macos.py: dopo PyInstaller + Info.plist, applico `codesign --force --deep --sign -` ad-hoc su tutto il bundle. La firma e' "free" (no Developer ID) ma rende l'app un singolo team coerente per TCC, quindi il permesso del main si propaga anche a ffmpeg/ffprobe/yt-dlp. --- build_macos.py | 47 +++++++++++++++++++++++++++++++++++++++++++++++ core/config.py | 2 +- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/build_macos.py b/build_macos.py index 4a2ad03..43df681 100644 --- a/build_macos.py +++ b/build_macos.py @@ -239,6 +239,7 @@ def run_pyinstaller(): if app_path.exists(): log(f"Build completata: {app_path}") patch_info_plist(app_path) + adhoc_codesign(app_path) # Mostra dimensione size = sum(f.stat().st_size for f in app_path.rglob("*") if f.is_file()) log(f"Dimensione: {size / 1024 / 1024:.0f} MB") @@ -292,6 +293,52 @@ def patch_info_plist(app_path): 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 # ========================================================================= diff --git a/core/config.py b/core/config.py index b44eb1c..e464d85 100644 --- a/core/config.py +++ b/core/config.py @@ -5,7 +5,7 @@ import os import sys from pathlib import Path -VERSION = "v1.7.10" +VERSION = "v1.7.11" APP_NAME = "MusicTools"