#!/usr/bin/env python3 """ Build script to create an executable using PyInstaller. Optimized for faster builds by excluding heavy dependencies. """ import os import sys import subprocess from pathlib import Path def build_exe(): """Build the executable using PyInstaller.""" # Get the project root project_root = Path(__file__).parent # Check if PyInstaller is installed try: import PyInstaller except ImportError: print("❌ PyInstaller not found. Installing...") subprocess.check_call([sys.executable, "-m", "pip", "install", "pyinstaller"]) # Get the main entry point main_file = project_root / "main.py" if not main_file.exists(): print(f"❌ main.py not found at {main_file}") sys.exit(1) # Build command - optimized for faster builds cmd = [ sys.executable, "-m", "PyInstaller", "--name=MusicDownloader", "--onefile", "--windowed", "--icon=music.png", "--add-data=ffmpeg/bin:ffmpeg/bin", "--add-data=Resources:Resources", "--add-data=music.png:.", "--collect-all=PyQt6", "--collect-all=yt_dlp", "--collect-all=mutagen", "--collect-all=musicbrainzngs", "--collect-all=thefuzz", "--hidden-import=PyQt6.QtCore", "--hidden-import=PyQt6.QtGui", "--hidden-import=PyQt6.QtWidgets", "--hidden-import=yt_dlp", "--hidden-import=mutagen", "--hidden-import=musicbrainzngs", "--hidden-import=thefuzz", "--exclude-module=sentence_transformers", "--exclude-module=sklearn", "--exclude-module=torch", "--exclude-module=tensorflow", "--distpath=dist", "--workpath=build", "--specpath=.", str(main_file), ] print("🔨 Building executable...") print(f"Command: {' '.join(cmd)}") try: result = subprocess.run(cmd, check=True) print("✅ Build successful!") print(f"📦 Executable created at: {project_root / 'dist' / 'MusicDownloader.exe'}") return 0 except subprocess.CalledProcessError as e: print(f"❌ Build failed with error code {e.returncode}") return 1 except Exception as e: print(f"❌ Build failed: {e}") return 1 if __name__ == "__main__": sys.exit(build_exe())