# -*- mode: python ; coding: utf-8 -*- # # LineDancePlayer.spec # # Byg med: pyinstaller LineDancePlayer.spec # Output: dist\LineDancePlayer.exe # # Kræver: VLC installeret på byggemaskinen # (typisk C:\Program Files\VideoLAN\VLC) import os import sys from pathlib import Path # ── Find VLC-installation ───────────────────────────────────────────────────── def find_vlc_path() -> Path | None: """Find VLC på Windows — tjekker de mest almindelige installationsstier.""" candidates = [ Path(os.environ.get("PROGRAMFILES", "C:/Program Files")) / "VideoLAN" / "VLC", Path(os.environ.get("PROGRAMFILES(X86)", "C:/Program Files (x86)")) / "VideoLAN" / "VLC", Path("C:/Program Files/VideoLAN/VLC"), Path("C:/Program Files (x86)/VideoLAN/VLC"), ] # Tjek også PYTHONPATH og registry via python-vlc try: import vlc vlc_path = Path(vlc.plugin_path).parent if vlc.plugin_path else None if vlc_path and vlc_path.exists(): candidates.insert(0, vlc_path) except Exception: pass for path in candidates: if path.exists() and (path / "libvlc.dll").exists(): return path return None VLC_PATH = find_vlc_path() if VLC_PATH is None: print("=" * 60) print("ADVARSEL: VLC ikke fundet!") print("Installer VLC fra https://www.videolan.org/vlc/") print("og kør pyinstaller igen.") print("=" * 60) VLC_PATH = Path("C:/Program Files/VideoLAN/VLC") # fallback print(f"VLC fundet: {VLC_PATH}") # ── Saml VLC binære filer ───────────────────────────────────────────────────── vlc_binaries = [] vlc_datas = [] if VLC_PATH.exists(): # Hoved-DLL filer for dll in ["libvlc.dll", "libvlccore.dll", "libvlc.lib"]: dll_path = VLC_PATH / dll if dll_path.exists(): vlc_binaries.append((str(dll_path), ".")) # Plugins-mappe — indeholder codecs, demuxers osv. plugins_dir = VLC_PATH / "plugins" if plugins_dir.exists(): vlc_datas.append((str(plugins_dir), "plugins")) # Locale-filer locale_dir = VLC_PATH / "locale" if locale_dir.exists(): vlc_datas.append((str(locale_dir), "locale")) # ── PyInstaller konfiguration ───────────────────────────────────────────────── block_cipher = None a = Analysis( ["main.py"], pathex=["."], binaries=vlc_binaries, datas=[ ("ui", "ui"), ("local", "local"), ("player", "player"), ] + vlc_datas, hiddenimports=[ # PyQt6 "PyQt6.sip", "PyQt6.QtCore", "PyQt6.QtGui", "PyQt6.QtWidgets", # Lyd og tags "vlc", "mutagen", "mutagen.mp3", "mutagen.id3", "mutagen.flac", "mutagen.mp4", "mutagen.oggvorbis", "mutagen.oggopus", # Fil-overvågning "watchdog", "watchdog.observers", "watchdog.observers.polling", "watchdog.events", # Database "sqlite3", # Standard "json", "pathlib", "threading", "urllib.request", "urllib.parse", ], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[ # Ting vi ikke bruger — reducerer filstørrelse "tkinter", "matplotlib", "numpy", "pandas", "scipy", "PIL", "cv2", "pytest", ], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE( pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name="LineDancePlayer", debug=False, bootloader_ignore_signals=False, strip=False, upx=True, # komprimer med UPX hvis tilgængeligt upx_exclude=[ "libvlc.dll", # VLC må ikke komprimeres — den loader plugins dynamisk "libvlccore.dll", ], runtime_tmpdir=None, console=False, # ingen konsol-vindue disable_windowed_traceback=False, target_arch=None, codesign_identity=None, entitlements_file=None, # Ikon — kommenter ud hvis du ikke har en .ico fil endnu # icon="assets/icon.ico", )