""" cx_Freeze setup script for YTSage with FFmpeg bundle Supports building executables, MSI installers, and ZIP distributions with FFmpeg """ import sys from pathlib import Path from cx_Freeze import setup, Executable import os # Get FFmpeg path from environment variable or use default FFMPEG_PATH = os.environ.get('FFMPEG_PATH', r'C:\Users\atela\AppData\Local\ffmpeg\ffmpeg-7.1.1-full_build\bin') # Build options for executable build_exe_options = { # Packages to include "packages": [ "PySide6.QtCore", "PySide6.QtGui", "PySide6.QtWidgets", "src.gui.ytsage_gui_main", "src.core.ytsage_utils", "src.core.ytsage_downloader", "src.core.ytsage_ffmpeg", "src.core.ytsage_yt_dlp", "src.core.ytsage_style", "src.core.ytsage_logging", "src.gui.ytsage_gui_format_table", "src.gui.ytsage_gui_video_info", "src.gui.ytsage_gui_dialogs", "src.gui.ytsage_gui_dialogs.ytsage_dialogs_base", "src.gui.ytsage_gui_dialogs.ytsage_dialogs_custom", "src.gui.ytsage_gui_dialogs.ytsage_dialogs_ffmpeg", "src.gui.ytsage_gui_dialogs.ytsage_dialogs_selection", "src.gui.ytsage_gui_dialogs.ytsage_dialogs_settings", "src.gui.ytsage_gui_dialogs.ytsage_dialogs_update", "src.utils.ytsage_constants", # Additional packages that might be needed "requests", "PIL", # Pillow is imported as PIL "packaging", "markdown", "playsound3", "loguru", "setuptools" ], # Packages to exclude (to reduce size) "excludes": [ "PySide6.QtBluetooth", "PySide6.QtNetwork", "PySide6.QtOpenGL", "PySide6.QtPrintSupport", "PySide6.QtSvg", "PySide6.QtTest", "PySide6.QtXml", "PySide6.QtSql", "PySide6.QtHelp", "PySide6.QtMultimedia", "PySide6.QtQml", "PySide6.QtQuick", "PySide6.QtWebEngineCore", "PIL.ImageDraw", "PIL.ImageFont", "numpy", "scipy", "wx", "pandas", "tkinter", "yt_dlp", # Excluded - downloaded dynamically at runtime (all imports are conditional) "unittest", "test", "tests" ], # Include files (assets + FFmpeg binaries) "include_files": [ ("assets/Icon/icon.png", "assets/Icon/icon.png"), ("assets/sound/notification.mp3", "assets/sound/notification.mp3"), ("assets/branding/icons/YTSage.ico", "YTSage.ico"), # FFmpeg binaries (os.path.join(FFMPEG_PATH, "ffmpeg.exe"), "ffmpeg.exe"), (os.path.join(FFMPEG_PATH, "ffprobe.exe"), "ffprobe.exe"), (os.path.join(FFMPEG_PATH, "ffplay.exe"), "ffplay.exe"), ], # Zip includes (can help reduce file count) "zip_include_packages": "*", "zip_exclude_packages": [], # Other options "optimize": 2, # Optimize bytecode "build_exe": "dist/YTSage-FFmpeg", # Output directory for executable } # MSI build options bdist_msi_options = { "upgrade_code": "{87654321-4321-8765-CBA9-987654321CBA}", # Different GUID for FFmpeg version "add_to_path": False, "initial_target_dir": r"[ProgramFilesFolder]\YTSage", "install_icon": "assets/branding/icons/YTSage.ico", "summary_data": { "author": "oop7", "comments": "YouTube Video Downloader with FFmpeg - Complete video processing solution", "keywords": "youtube, downloader, video, audio, converter, ffmpeg" } } # Base configuration for Windows GUI application base = None if sys.platform == "win32": base = "Win32GUI" # This prevents console window from appearing # Executable configuration executable = Executable( "main.py", base=base, icon="assets/branding/icons/YTSage.ico", target_name="YTSage-v4.8.0-ffmpeg.exe", copyright="Copyright (c) 2024-2025 YTSage", trademarks="YTSage" ) # Setup configuration setup( name="YTSage-FFmpeg", version="4.8.0", description="YouTube Video Downloader with FFmpeg", author="oop7", author_email="oop7_support@proton.me", url="https://github.com/oop7/ytsage", license="MIT", options={ "build_exe": build_exe_options, "bdist_msi": bdist_msi_options }, executables=[executable] )