162 lines
4.5 KiB
Python
162 lines
4.5 KiB
Python
# -*- 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",
|
|
)
|