diff --git a/.gitignore b/.gitignore index 6b098c4..22fd345 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ dependencies/* CMakeLists.txt.user CMakeLists.txt.user.* build/* +build_deps/* +build_vs_debug/* .idea .install_pkg .openelec-unpack diff --git a/CMakeModules/CompleteBundleWin.cmake.in b/CMakeModules/CompleteBundleWin.cmake.in index 6fc75d5..9f844e4 100644 --- a/CMakeModules/CompleteBundleWin.cmake.in +++ b/CMakeModules/CompleteBundleWin.cmake.in @@ -13,9 +13,12 @@ endforeach() get_filename_component(CEC_DIR @CEC_LIBRARY@ DIRECTORY) list(APPEND SEARCHDIRS ${CEC_DIR}) -# fixup_bundle("${CMAKE_INSTALL_PREFIX}/Jellyfin Desktop.exe" "" "${SEARCHDIRS}") +# fixup_bundle("${CMAKE_INSTALL_PREFIX}/Jellyfin Desktop.exe" "" "${SEARCHDIRS}") #install(PROGRAMS ${VCREDIST_DIR}/vcredist_msvc2017_x64.exe DESTINATION .) -file(INSTALL @MPV_LIBRARY@ DESTINATION "${CMAKE_INSTALL_PREFIX}") + +# Install MPV DLL (MPV_LIBRARY points to .lib, we need the .dll) +get_filename_component(MPV_DIR "@MPV_LIBRARY@" DIRECTORY) +file(INSTALL "${MPV_DIR}/libmpv-2.dll" DESTINATION "${CMAKE_INSTALL_PREFIX}") if(@DO_ENABLE_ANGLE_DEP@) message(STATUS "Deploying separate ANGLE deps") diff --git a/CMakeModules/WindowsInstaller.cmake b/CMakeModules/WindowsInstaller.cmake index 1cd18e4..05defea 100644 --- a/CMakeModules/WindowsInstaller.cmake +++ b/CMakeModules/WindowsInstaller.cmake @@ -7,7 +7,7 @@ get_filename_component(WIX_BIN_DIR ${WIX_CANDLE} DIRECTORY) configure_file(${PROJECT_SOURCE_DIR}/bundle/win/Version.wxi.in Version.wxi) -set(WIX_VARIABLES -dDeploymentPath="${CMAKE_INSTALL_PREFIX}" -dOutputPath="${CMAKE_BINARY_DIR}") +set(WIX_VARIABLES -dDeploymentPath="${CMAKE_INSTALL_PREFIX}" -dOutputPath="${CMAKE_INSTALL_PREFIX}" -dBuildPath="${CMAKE_BINARY_DIR}") include(CMakeParseArguments) diff --git a/WINDOWS.md b/WINDOWS.md new file mode 100644 index 0000000..94a0b83 --- /dev/null +++ b/WINDOWS.md @@ -0,0 +1,93 @@ +# Building Jellyfin Desktop on Windows + +## Quick Start + +```cmd +setup_build_deps.bat # First time: download dependencies +build_windows.bat # Build +``` + +Output: `build\output\Jellyfin Desktop.exe` + +## Prerequisites + +- **Visual Studio 2022/2026** with C++ tools + - Install "MSVC v143 - VS 2022 C++ x64/x86 build tools" (required for Qt 6.10.1) +- **Qt 6.10.1** MSVC 2022 64-bit at `C:\Qt\6.10.1\msvc2022_64` +- **Build dependencies**: Ninja, libmpv, VC++ redistributable + +## Directory Structure + +- `build_deps/` - External dependencies (persisted) +- `build/` - Generated files (safe to delete) +- `build_vs_debug/` - VS debug build + +## Scripts + +- `build_windows.bat` - Release build + installer +- `build_vs.bat` - Debug build for Visual Studio +- `setup_build_deps.bat` - Download dependencies +- `rebuild.bat` - Quick rebuild + +## Clean Build + +```cmd +rmdir /s /q build +build_windows.bat +``` + +## Debugging + +```cmd +build_vs.bat +``` + +Opens VS solution at `build_vs_debug\jellyfin-desktop.sln` + +Requires Qt debug libraries (install via Qt Maintenance Tool). + +## Troubleshooting + +### Black Screen / GPU Issues + +If the app opens but shows a black screen instead of the web interface: + +1. **Try software rendering** (disables GPU acceleration): + ```cmd + launch_software_mode.bat + ``` + Or rebuild with the fix and run: + ```cmd + "build\output\Jellyfin Desktop.exe" --software-rendering + ``` + +2. **Test different GPU configurations**: + ```cmd + try_gpu_workarounds.bat + ``` + This interactive script tests various rendering modes to find what works. + +3. **Gather diagnostics**: + ```cmd + diagnose_black_screen.bat + ``` + Collects logs, GPU info, and process details to `diagnostics/` folder. + +Common causes: +- Outdated GPU drivers +- Missing DirectX components +- Hardware acceleration incompatibility +- Older/unsupported graphics cards + +### Log Files + +Application logs are located at: +``` +%LOCALAPPDATA%\Jellyfin Desktop\logs\jellyfin-desktop.log +``` + +## Notes + +- Qt 6.10.1 requires VS 2022 toolset (v143) for ABI compatibility +- QtWebEngine resources auto-copied by build scripts +- Installer created after 5-second countdown (press key to skip) diff --git a/build_vs_debug.bat b/build_vs_debug.bat new file mode 100644 index 0000000..5e95bf0 --- /dev/null +++ b/build_vs_debug.bat @@ -0,0 +1,177 @@ +@echo off +REM Build script for Visual Studio solution with full Debug configuration +REM Requires Qt debug libraries to be installed + +setlocal enabledelayedexpansion + +echo ======================================== +echo Jellyfin Desktop - Visual Studio Debug Build +echo ======================================== +echo. + +REM Set Qt root - adjust this path if needed +set QTROOT=C:\Qt\6.10.1\msvc2022_64 +set BUILD_DEPS_DIR=%~dp0build_deps +set BUILD_DIR=%~dp0build_vs_debug + +REM Verify Qt installation +if not exist "%QTROOT%" ( + echo ERROR: Qt directory not found at %QTROOT% + echo Please verify your Qt installation path + pause + exit /b 1 +) + +REM Verify Qt debug libraries are installed +if not exist "%QTROOT%\bin\Qt6Cored.dll" ( + echo ERROR: Qt debug libraries not found! + echo Please install Qt debug libraries using Qt Maintenance Tool: + echo - Run Qt Maintenance Tool + echo - Select "Add or remove components" + echo - Expand Qt -^> Qt 6.10.1 -^> MSVC 2022 64-bit + echo - Check "Qt Debug Information Files" + echo - Click Update/Install + pause + exit /b 1 +) + +REM Verify build dependencies +if not exist "%BUILD_DEPS_DIR%\ninja.exe" ( + echo ERROR: ninja.exe not found in %BUILD_DEPS_DIR% + echo Please run setup_build_deps.bat first + pause + exit /b 1 +) + +if not exist "%BUILD_DEPS_DIR%\mpv\libmpv-2.dll" ( + echo ERROR: MPV library not found in %BUILD_DEPS_DIR%\mpv + echo Please run setup_build_deps.bat first + pause + exit /b 1 +) + +REM Force VS 2022 toolset (v143) for Qt compatibility +echo Forcing VS 2022 toolset (v143) for Qt compatibility... +call "C:\Program Files\Microsoft Visual Studio\18\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 -vcvars_ver=14.44 + +echo Visual Studio tools configured with v143 toolset (14.44)! +echo. + +REM Clean and create build directory +if exist "%BUILD_DIR%" ( + echo Cleaning existing build directory... + rmdir /s /q "%BUILD_DIR%" +) +echo Creating build directory... +mkdir "%BUILD_DIR%" + +cd /d "%BUILD_DIR%" + +REM Add WiX to PATH for installer creation +set PATH=%PATH%;C:\Program Files (x86)\WiX Toolset v3.14\bin;C:\Program Files (x86)\WiX Toolset v3.11\bin + +REM Convert paths to forward slashes for CMake +set QTROOT_CMAKE=%QTROOT:\=/% +set BUILD_DEPS_CMAKE=%BUILD_DEPS_DIR:\=/% + +REM Print compiler version information +echo. +echo ======================================== +echo Compiler Version Information +echo ======================================== +cl.exe 2>&1 | findstr /C:"Version" +echo. + +REM Configure with CMake - Generate Visual Studio solution for Debug +echo Running CMake configuration for Visual Studio (Debug mode)... +cmake -G "Visual Studio 18 2026" -A x64 ^ + -DCMAKE_CONFIGURATION_TYPES="Debug;RelWithDebInfo;Release" ^ + -DCMAKE_INSTALL_PREFIX=output ^ + -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreadedDebugDLL" ^ + -DQTROOT=%QTROOT_CMAKE% ^ + -DMPV_INCLUDE_DIR="%BUILD_DEPS_CMAKE%/mpv/include" ^ + -DMPV_LIBRARY="%BUILD_DEPS_CMAKE%/mpv/libmpv-2.dll.lib" ^ + -DCHECK_FOR_UPDATES=OFF ^ + -DUSE_STATIC_MPVQT=ON ^ + .. + +if %ERRORLEVEL% NEQ 0 ( + echo. + echo ERROR: CMake configuration failed + echo. + pause + exit /b 1 +) + +echo. +echo ======================================== +echo Building Debug Configuration +echo ======================================== +echo. + +REM Build the Debug configuration +cmake --build . --config Debug + +if %ERRORLEVEL% NEQ 0 ( + echo. + echo ERROR: Build failed + echo. + pause + exit /b 1 +) + +echo. +echo ======================================== +echo Copying Dependencies to Debug Output +echo ======================================== +echo. + +REM Copy Qt debug DLLs to output directory +set DEBUG_OUTPUT=%BUILD_DIR%\src\Debug +if not exist "%DEBUG_OUTPUT%" mkdir "%DEBUG_OUTPUT%" + +echo Copying all Qt debug DLLs... +for %%f in ("%QTROOT%\bin\Qt6*d.dll") do ( + echo - %%~nxf + copy /Y "%%f" "%DEBUG_OUTPUT%\" >nul +) + +echo. +echo Copying Qt plugins... +xcopy /Y /E /I "%QTROOT%\plugins" "%DEBUG_OUTPUT%\plugins\" >nul + +echo. +echo Copying Qt QML modules... +xcopy /Y /E /I "%QTROOT%\qml" "%DEBUG_OUTPUT%\qml\" >nul + +echo. +echo Copying QtWebEngine resources (CRITICAL!)... +xcopy /Y /E /I "%QTROOT%\resources" "%DEBUG_OUTPUT%\resources\" >nul + +echo. +echo Copying QtWebEngineProcess (debug version)... +copy /Y "%QTROOT%\bin\QtWebEngineProcessd.exe" "%DEBUG_OUTPUT%\" >nul + +echo. +echo Copying MPV DLL... +copy /Y "%BUILD_DEPS_DIR%\mpv\libmpv-2.dll" "%DEBUG_OUTPUT%\" >nul +copy /Y "%BUILD_DEPS_DIR%\mpv\libmpv-2.dll.lib" "%DEBUG_OUTPUT%\" >nul + +echo. +echo ======================================== +echo Configuration Complete! +echo ======================================== +echo. +echo Visual Studio solution created at: +echo %BUILD_DIR%\jellyfin-desktop.sln +echo. +echo Debug executable at: +echo %DEBUG_OUTPUT%\Jellyfin Desktop.exe +echo. +echo To debug in Visual Studio: +echo 1. Open: %BUILD_DIR%\jellyfin-desktop.sln +echo 2. Select "Debug" configuration (top toolbar) +echo 3. Right-click "Jellyfin Desktop" project ^> Set as Startup Project +echo 4. Press F5 to start debugging +echo. +pause diff --git a/build_windows.bat b/build_windows.bat new file mode 100644 index 0000000..2973875 --- /dev/null +++ b/build_windows.bat @@ -0,0 +1,317 @@ +@echo off +REM ======================================== +REM Jellyfin Desktop - Windows Build Script +REM ======================================== +REM +REM This script uses the new build_deps/ structure +REM All external dependencies are in build_deps/ +REM All generated files are in build/ +REM + +setlocal enabledelayedexpansion + +echo. +echo ======================================== +echo Jellyfin Desktop - Windows Build Script +echo ======================================== +echo. + +REM Change to project root directory +cd /d "%~dp0" + +REM Define directories +set BUILD_DEPS_DIR=%CD%\build_deps +set BUILD_DIR=%CD%\build +set OUTPUT_DIR=%BUILD_DIR%\output + +REM Force VS 2022 toolset (v143) for Qt compatibility +echo Forcing VS 2022 toolset (v143) for Qt compatibility... +call "C:\Program Files\Microsoft Visual Studio\18\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 -vcvars_ver=14.44 + +echo Visual Studio tools configured with v143 toolset (14.44)! +echo. + +REM Step 1: Check build dependencies +echo ======================================== +echo Step 1/6: Checking Build Dependencies +echo ======================================== +echo. + +if not exist "%BUILD_DEPS_DIR%\ninja.exe" ( + echo. + echo ERROR: ninja.exe not found in build_deps\ + echo. + echo Please run: setup_build_deps.bat + echo. + pause + exit /b 1 +) + +if not exist "%BUILD_DEPS_DIR%\mpv\libmpv-2.dll" ( + echo. + echo ERROR: MPV not found in build_deps\mpv\ + echo. + echo Please run: setup_build_deps.bat + echo. + pause + exit /b 1 +) + +if not exist "%BUILD_DEPS_DIR%\mpv\include\mpv\client.h" ( + echo. + echo ERROR: MPV headers not found in build_deps\mpv\include\mpv\ + echo. + echo Please run: setup_build_deps.bat + echo. + pause + exit /b 1 +) + +echo All build dependencies found: +echo - Ninja: %BUILD_DEPS_DIR%\ninja.exe +echo - MPV DLL: %BUILD_DEPS_DIR%\mpv\libmpv-2.dll +echo - MPV Headers: %BUILD_DEPS_DIR%\mpv\include\ +echo. + +REM Step 2: Generate/verify MPV import library +echo ======================================== +echo Step 2/6: Verifying MPV Import Library +echo ======================================== +echo. + +if not exist "%BUILD_DEPS_DIR%\mpv\libmpv-2.dll.lib" ( + echo Generating MPV import library from DLL... + + if not exist "scripts\generate_mpv_def.py" ( + echo ERROR: scripts\generate_mpv_def.py not found + pause + exit /b 1 + ) + + python scripts\generate_mpv_def.py "%BUILD_DEPS_DIR%\mpv\libmpv-2.dll" "%BUILD_DEPS_DIR%\mpv\mpv.def" + if %ERRORLEVEL% NEQ 0 ( + echo ERROR: Failed to generate mpv.def + pause + exit /b 1 + ) + + lib /def:"%BUILD_DEPS_DIR%\mpv\mpv.def" /out:"%BUILD_DEPS_DIR%\mpv\libmpv-2.dll.lib" /MACHINE:X64 + if %ERRORLEVEL% NEQ 0 ( + echo ERROR: Failed to create import library + pause + exit /b 1 + ) + + echo Import library created successfully! +) else ( + echo Import library already exists: %BUILD_DEPS_DIR%\mpv\libmpv-2.dll.lib +) + +echo. + +REM Step 3: Detect Qt +echo ======================================== +echo Step 3/6: Detecting Qt Installation +echo ======================================== +echo. + +REM Try to detect Qt installation +set QTROOT= +for %%Q in ( + "C:\Qt\6.10.1\msvc2022_64" + "C:\Qt\6.10.0\msvc2022_64" + "C:\Qt\6.9.0\msvc2022_64" + "C:\Qt\6.8.0\msvc2022_64" + "C:\Qt\6.8.0\msvc2019_64" + "C:\Qt\6.7.0\msvc2019_64" +) do ( + if exist %%Q ( + set QTROOT=%%~Q + goto :qt_found + ) +) + +:qt_found +if "%QTROOT%"=="" ( + echo ERROR: Could not find Qt installation + echo. + echo Please install Qt 6.x with MSVC 2022 or set QTROOT environment variable + echo Example: C:\Qt\6.10.1\msvc2022_64 + echo. + echo Download from: https://www.qt.io/download-open-source + echo. + pause + exit /b 1 +) + +echo Found Qt at: %QTROOT% +echo. + +REM Step 4: Create build directory +echo ======================================== +echo Step 4/6: Configuring Build with CMake +echo ======================================== +echo. + +if not exist "%BUILD_DIR%" ( + echo Creating build directory... + mkdir "%BUILD_DIR%" +) + +cd /d "%BUILD_DIR%" + +REM Add WiX to PATH for installer creation +set PATH=%PATH%;C:\Program Files (x86)\WiX Toolset v3.14\bin;C:\Program Files (x86)\WiX Toolset v3.11\bin + +REM Convert paths to forward slashes for CMake +set QTROOT_CMAKE=%QTROOT:\=/% +set BUILD_DEPS_CMAKE=%BUILD_DEPS_DIR:\=/% + +REM Print compiler version information +echo. +echo ======================================== +echo Compiler Version Information +echo ======================================== +cl.exe 2>&1 | findstr /C:"Version" +echo. + +REM Configure with CMake - IMPORTANT: Use .lib file, not .dll +echo Running CMake configuration... +cmake -GNinja ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_INSTALL_PREFIX=output ^ + -DCMAKE_MAKE_PROGRAM="%BUILD_DEPS_CMAKE%/ninja.exe" ^ + -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreadedDLL" ^ + -DCMAKE_CXX_FLAGS="/MD" ^ + -DCMAKE_C_FLAGS="/MD" ^ + -DQTROOT=%QTROOT_CMAKE% ^ + -DMPV_INCLUDE_DIR="%BUILD_DEPS_CMAKE%/mpv/include" ^ + -DMPV_LIBRARY="%BUILD_DEPS_CMAKE%/mpv/libmpv-2.dll.lib" ^ + -DCHECK_FOR_UPDATES=OFF ^ + -DUSE_STATIC_MPVQT=ON ^ + .. + +if %ERRORLEVEL% NEQ 0 ( + echo. + echo ERROR: CMake configuration failed + echo. + echo Check the error messages above for details + cd /d "%~dp0" + pause + exit /b 1 +) + +echo. + +REM Step 5: Build +echo ======================================== +echo Step 5/6: Building with Ninja +echo ======================================== +echo. + +"%BUILD_DEPS_DIR%\ninja.exe" +if %ERRORLEVEL% NEQ 0 ( + echo. + echo ERROR: Build failed + echo. + echo Check the error messages above for details + cd /d "%~dp0" + pause + exit /b 1 +) + +echo. + +REM Step 6: Install +echo ======================================== +echo Step 6/6: Installing to Output Directory +echo ======================================== +echo. + +"%BUILD_DEPS_DIR%\ninja.exe" install +if %ERRORLEVEL% NEQ 0 ( + echo. + echo ERROR: Install failed + echo. + cd /d "%~dp0" + pause + exit /b 1 +) + +REM Copy VC++ redistributable (for installer packaging) +echo. +echo Copying VC++ redistributable for installer... +if exist "%BUILD_DEPS_DIR%\vc_redist.x64.exe" ( + echo - vc_redist.x64.exe + copy /Y "%BUILD_DEPS_DIR%\vc_redist.x64.exe" "%OUTPUT_DIR%\" >nul +) else ( + echo [WARNING] vc_redist.x64.exe not found - installer build will fail +) + +echo. +echo Qt dependencies copied by windeployqt (CMake install step) + +cd /d "%~dp0" + +echo. +echo ======================================== +echo BUILD COMPLETED SUCCESSFULLY! +echo ======================================== +echo. +echo Build output: %OUTPUT_DIR% +echo Executable: %OUTPUT_DIR%\Jellyfin Desktop.exe +echo. +echo. +echo Building installer in 5 seconds... +echo Press any key to skip installer build. +echo. + +REM Wait 5 seconds or until key is pressed +timeout /t 5 >nul +set TIMEOUT_RESULT=%ERRORLEVEL% + +if %TIMEOUT_RESULT% EQU 0 ( + REM Timeout expired - build installer + echo. + echo ======================================== + echo Building Installer + echo ======================================== + echo. + + cd /d "%BUILD_DIR%" + "%BUILD_DEPS_DIR%\ninja.exe" windows_package + + if %ERRORLEVEL% NEQ 0 ( + echo. + echo WARNING: Installer build failed + echo. + cd /d "%~dp0" + ) else ( + echo. + echo ======================================== + echo INSTALLER BUILD COMPLETED! + echo ======================================== + echo. + REM Find the installer file + for %%f in ("%BUILD_DIR%\*.exe") do ( + echo Installer created: %%f + ) + if not exist "%BUILD_DIR%\*.exe" ( + echo NOTE: Installer executable not found in %BUILD_DIR% + echo Check the Ninja output above for details. + ) + echo. + cd /d "%~dp0" + ) +) else ( + REM Key was pressed - skip installer + echo. + echo Skipping installer build. + echo To build installer later, run: + echo cd build + echo ..\build_deps\ninja.exe windows_package + echo. + cd /d "%~dp0" +) + +pause diff --git a/bundle/win/Bundle.wxs b/bundle/win/Bundle.wxs index 669b3c2..8fa29ab 100644 --- a/bundle/win/Bundle.wxs +++ b/bundle/win/Bundle.wxs @@ -238,7 +238,7 @@ @@ -246,7 +246,7 @@ Qt 6.10.1 ^> MSVC 2022 64-bit + echo 4. Make sure these are checked: + echo - Qt WebEngine + echo - Qt WebChannel + echo - Qt Quick + echo 5. Click Update/Install + echo. + echo After installing, rebuild Jellyfin Desktop with build_windows.bat + echo. +) else ( + echo ======================================== + echo All required Qt modules are installed! + echo ======================================== +) + +echo. +pause diff --git a/setup_build_deps.bat b/setup_build_deps.bat new file mode 100644 index 0000000..0ac288b --- /dev/null +++ b/setup_build_deps.bat @@ -0,0 +1,277 @@ +@echo off +REM ======================================== +REM Jellyfin Desktop - Build Dependencies Setup +REM ======================================== +REM +REM This script helps you set up the build dependencies +REM in the build_deps folder +REM + +setlocal enabledelayedexpansion + +echo. +echo ======================================== +echo Jellyfin Desktop Build Dependencies Setup +echo ======================================== +echo. +echo This script will help you set up the required build dependencies. +echo. +echo Build dependencies will be stored in: %CD%\build_deps +echo. + +set BUILD_DEPS_DIR=%CD%\build_deps + +if not exist "%BUILD_DEPS_DIR%" ( + echo Creating build_deps directory... + mkdir "%BUILD_DEPS_DIR%" +) + +echo. +echo ======================================== +echo Dependency 1: Ninja Build System +echo ======================================== +echo. +echo Ninja is a fast build system used for compiling Jellyfin Desktop. +echo. + +if exist "%BUILD_DEPS_DIR%\ninja.exe" ( + echo [OK] Ninja already installed: %BUILD_DEPS_DIR%\ninja.exe +) else ( + echo Ninja not found. + echo. + echo Please download ninja.exe: + echo 1. Go to: https://github.com/ninja-build/ninja/releases/latest + echo 2. Download: ninja-win.zip + echo 3. Extract ninja.exe to: %BUILD_DEPS_DIR%\ + echo. + echo After downloading, press any key to continue... + pause >nul + + if exist "%BUILD_DEPS_DIR%\ninja.exe" ( + echo [OK] Ninja installed successfully! + ) else ( + echo [WARNING] Ninja still not found. Please install manually. + ) +) + +echo. +echo ======================================== +echo Dependency 2: libmpv (Media Player) +echo ======================================== +echo. +echo libmpv is the media player library used by Jellyfin Desktop. +echo. + +if exist "%BUILD_DEPS_DIR%\mpv\libmpv-2.dll" ( + echo [OK] libmpv already installed: %BUILD_DEPS_DIR%\mpv\libmpv-2.dll +) else ( + echo libmpv not found. + echo. + echo Opening MPV download page in your browser... + timeout /t 1 >nul + start https://sourceforge.net/projects/mpv-player-windows/files/libmpv/ + echo. + echo ======================================== + echo MPV Installation Instructions + echo ======================================== + echo. + echo 1. Download mpv-dev-x86_64-YYYYMMDD.7z from the page that just opened + echo 2. Extract the .7z file (you may need 7-Zip: https://www.7-zip.org/) + echo 3. From the extracted folder, copy: + echo. + echo libmpv-2.dll ==^> %BUILD_DEPS_DIR%\mpv\libmpv-2.dll + echo. + echo 4. Copy the include folder: + echo. + echo include\mpv\ ==^> %BUILD_DEPS_DIR%\mpv\include\mpv\ + echo. + echo Final structure should be: + echo %BUILD_DEPS_DIR%\mpv\libmpv-2.dll + echo %BUILD_DEPS_DIR%\mpv\include\mpv\client.h + echo %BUILD_DEPS_DIR%\mpv\include\mpv\... (other headers) + echo. + echo After downloading and extracting, press any key to continue... + pause >nul + + if exist "%BUILD_DEPS_DIR%\mpv\libmpv-2.dll" ( + echo [OK] libmpv installed successfully! + ) else ( + echo [WARNING] libmpv still not found. Please install manually. + ) +) + +if exist "%BUILD_DEPS_DIR%\mpv\include\mpv\client.h" ( + echo [OK] libmpv headers found +) else ( + echo [WARNING] libmpv headers not found at: %BUILD_DEPS_DIR%\mpv\include\mpv\ +) + +echo. +echo ======================================== +echo Dependency 3: Visual C++ Redistributable +echo ======================================== +echo. +echo The VC++ redistributable is bundled with the installer. +echo. + +if exist "%BUILD_DEPS_DIR%\vc_redist.x64.exe" ( + echo [OK] vc_redist.x64.exe already downloaded: %BUILD_DEPS_DIR%\vc_redist.x64.exe +) else ( + echo vc_redist.x64.exe not found. + echo. + echo Opening download page in your browser... + timeout /t 1 >nul + start https://aka.ms/vs/17/release/vc_redist.x64.exe + echo. + echo ======================================== + echo VC++ Redistributable Installation Instructions + echo ======================================== + echo. + echo 1. Your browser should have started downloading vc_redist.x64.exe + echo 2. Move the downloaded file to: %BUILD_DEPS_DIR%\vc_redist.x64.exe + echo. + echo After downloading, press any key to continue... + pause >nul + + if exist "%BUILD_DEPS_DIR%\vc_redist.x64.exe" ( + echo [OK] vc_redist.x64.exe installed successfully! + ) else ( + echo [WARNING] vc_redist.x64.exe still not found. Please install manually. + ) +) + +echo. +echo ======================================== +echo Dependency 4: Qt Framework +echo ======================================== +echo. +echo Qt 6 is the GUI framework used by Jellyfin Desktop. +echo. +echo Please ensure Qt 6.x with MSVC 2022 is installed. +echo Common installation paths: +echo - C:\Qt\6.10.1\msvc2022_64 +echo - C:\Qt\6.8.0\msvc2022_64 +echo. +echo If not installed, download from: +echo https://www.qt.io/download-open-source +echo. +echo Install Qt 6.x with these components: +echo - Qt 6.x for desktop development (MSVC 2022 64-bit) +echo - Qt WebEngine +echo - Qt WebChannel +echo - Qt Quick Controls +echo. + +REM Try to detect Qt +set QT_FOUND=0 +for %%Q in ( + "C:\Qt\6.10.1\msvc2022_64" + "C:\Qt\6.10.0\msvc2022_64" + "C:\Qt\6.9.0\msvc2022_64" + "C:\Qt\6.8.0\msvc2022_64" + "C:\Qt\6.8.0\msvc2019_64" +) do ( + if exist %%Q ( + echo [OK] Found Qt at: %%~Q + set QT_FOUND=1 + goto :qt_check_done + ) +) + +:qt_check_done +if !QT_FOUND!==0 ( + echo [WARNING] Qt not found in standard locations + echo. + echo You may need to specify QTROOT manually or install Qt. +) + +echo. +echo ======================================== +echo Dependency 5: Visual Studio 2022 +echo ======================================== +echo. +echo Visual Studio 2022 with C++ tools is required for compilation. +echo. + +where cl >nul 2>&1 +if %ERRORLEVEL%==0 ( + echo [OK] Visual Studio C++ compiler found in PATH +) else ( + REM Try to find VS + set VS_FOUND=0 + if exist "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat" ( + echo [OK] Found Visual Studio 2022 Community + set VS_FOUND=1 + ) else if exist "C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Auxiliary\Build\vcvars64.bat" ( + echo [OK] Found Visual Studio 2022 Professional + set VS_FOUND=1 + ) else if exist "C:\Program Files\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvars64.bat" ( + echo [OK] Found Visual Studio 2022 Build Tools + set VS_FOUND=1 + ) else ( + echo [WARNING] Visual Studio 2022 not detected + echo. + echo Please install: + echo - Visual Studio 2022 Community (free) OR + echo - Visual Studio 2022 Build Tools + echo. + echo Download from: + echo https://visualstudio.microsoft.com/downloads/ + echo. + echo Required components: + echo - Desktop development with C++ + echo - MSVC v143 - VS 2022 C++ x64/x86 build tools + echo - Windows 10/11 SDK + set VS_FOUND=0 + ) +) + +echo. +echo ======================================== +echo Setup Summary +echo ======================================== +echo. +echo Build dependencies directory: %BUILD_DEPS_DIR% +echo. + +set ALL_READY=1 + +if exist "%BUILD_DEPS_DIR%\ninja.exe" ( + echo [OK] Ninja +) else ( + echo [MISSING] Ninja + set ALL_READY=0 +) + +if exist "%BUILD_DEPS_DIR%\mpv\libmpv-2.dll" ( + echo [OK] libmpv DLL +) else ( + echo [MISSING] libmpv DLL + set ALL_READY=0 +) + +if exist "%BUILD_DEPS_DIR%\mpv\include\mpv\client.h" ( + echo [OK] libmpv headers +) else ( + echo [MISSING] libmpv headers + set ALL_READY=0 +) + +if exist "%BUILD_DEPS_DIR%\vc_redist.x64.exe" ( + echo [OK] VC++ Redistributable +) else ( + echo [MISSING] VC++ Redistributable + set ALL_READY=0 +) + +echo. +if !ALL_READY!==1 ( + echo All build dependencies are ready! + echo. + echo You can now run: build_windows.bat +) else ( + echo Some dependencies are missing. Please install them and run this script again. +) + +echo. +pause diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 63c70ef..a389925 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -22,7 +22,10 @@ add_subdirectory(system) add_subdirectory(settings) add_subdirectory(power) add_subdirectory(taskbar) -add_subdirectory(mpris) + +if(LINUX_DBUS) + add_subdirectory(mpris) +endif() get_property(ALL_SRCS GLOBAL PROPERTY SRCS_LIST) set(MAIN_SRCS main.cpp) @@ -186,10 +189,13 @@ target_link_libraries(jmp_core Qt6::OpenGL Qt6::Xml Qt6::Gui - Qt6::DBus ${MPVQT_TARGET} ) +if(LINUX_DBUS) + target_link_libraries(jmp_core Qt6::DBus) +endif() + target_link_libraries(${MAIN_TARGET} jmp_core) install(TARGETS ${MAIN_TARGET} DESTINATION ${INSTALL_BIN_DIR}) diff --git a/src/core/ComponentManager.cpp b/src/core/ComponentManager.cpp index ca95f80..ef3708b 100644 --- a/src/core/ComponentManager.cpp +++ b/src/core/ComponentManager.cpp @@ -13,7 +13,9 @@ #include "settings/SettingsComponent.h" #include "taskbar/TaskbarComponent.h" #include "ui/WindowManager.h" +#ifdef LINUX_DBUS #include "mpris/MprisComponent.h" +#endif #include "ProfileManager.h" #ifdef KONVERGO_OPENELEC @@ -65,7 +67,9 @@ void ComponentManager::initialize() registerComponent(&PowerComponent::Get()); registerComponent(&TaskbarComponent::Get()); registerComponent(&WindowManager::Get()); +#ifdef LINUX_DBUS registerComponent(&MprisComponent::Get()); +#endif #ifdef KONVERGO_OPENELEC registerComponent(&OESystemComponent::Get()); diff --git a/src/main.cpp b/src/main.cpp index 4bea2b4..41c1e6d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -115,6 +115,7 @@ int main(int argc, char *argv[]) {"windowed", "Start in windowed mode"}, {"fullscreen", "Start in fullscreen"}, {"disable-gpu", "Disable QtWebEngine gpu accel"}, + {"software-rendering", "Use software rendering (compatibility mode)"}, {"ignore-certificate-errors", "Ignore certificate errors"}}); auto scaleOption = QCommandLineOption("scale-factor", "Set to a integer or default auto which controls" \ @@ -491,6 +492,16 @@ int main(int argc, char *argv[]) if (parser.isSet("ignore-certificate-errors")) chromiumFlags << "--ignore-certificate-errors"; + // Software rendering mode for compatibility with problematic GPUs + if (parser.isSet("software-rendering")) + { + chromiumFlags << "--disable-gpu"; + chromiumFlags << "--disable-gpu-compositing"; + chromiumFlags << "--disable-accelerated-2d-canvas"; + chromiumFlags << "--disable-accelerated-video-decode"; + qInfo() << "Software rendering mode enabled (GPU disabled)"; + } + if (!chromiumFlags.isEmpty()) qputenv("QTWEBENGINE_CHROMIUM_FLAGS", chromiumFlags.join(" ").toUtf8()); diff --git a/src/player/CodecsComponent.cpp b/src/player/CodecsComponent.cpp index ebecb49..3c814b9 100644 --- a/src/player/CodecsComponent.cpp +++ b/src/player/CodecsComponent.cpp @@ -1,5 +1,8 @@ #include "CodecsComponent.h" #include +#ifdef Q_OS_WIN +#include +#endif #include #include #include diff --git a/src/taskbar/CMakeLists.txt b/src/taskbar/CMakeLists.txt index 2a8308c..b86a795 100644 --- a/src/taskbar/CMakeLists.txt +++ b/src/taskbar/CMakeLists.txt @@ -1,5 +1,5 @@ add_sources(TaskbarComponent.h TaskbarComponent.cpp) if(WIN32) - add_sources(TaskbarComponentWin.cpp TaskbarComponentWin.h) + add_sources(TaskbarComponentWin.cpp TaskbarComponentWin.h QWinTaskbarStubs.h QWinTaskbarStubs.cpp) endif(WIN32) diff --git a/src/taskbar/QWinTaskbarStubs.cpp b/src/taskbar/QWinTaskbarStubs.cpp new file mode 100644 index 0000000..8b5f796 --- /dev/null +++ b/src/taskbar/QWinTaskbarStubs.cpp @@ -0,0 +1,9 @@ +// Qt6 compatibility stubs implementation +// These classes were removed from Qt6 - providing minimal stubs for compilation + +#include "QWinTaskbarStubs.h" + +// The implementations are all inline in the header, but we need this +// file to exist so that MOC can generate the meta-object code for the Q_OBJECT macros + +// MOC will generate the necessary meta-object implementations when this file is compiled diff --git a/src/taskbar/QWinTaskbarStubs.h b/src/taskbar/QWinTaskbarStubs.h new file mode 100644 index 0000000..0bee4f5 --- /dev/null +++ b/src/taskbar/QWinTaskbarStubs.h @@ -0,0 +1,60 @@ +#ifndef QWINTASKBARSTUBS_H +#define QWINTASKBARSTUBS_H + +// Qt6 compatibility stubs for removed QWinTaskbar classes +// These classes were removed from Qt6 and have not been replaced yet +// This provides minimal stub implementations to allow compilation + +#include +#include +#include + +class QWinTaskbarProgress : public QObject +{ + Q_OBJECT +public: + explicit QWinTaskbarProgress(QObject *parent = nullptr) : QObject(parent) {} + void setVisible(bool) {} + void setValue(int) {} + void setMinimum(int) {} + void setMaximum(int) {} + void setPaused(bool) {} +}; + +class QWinTaskbarButton : public QObject +{ + Q_OBJECT +public: + explicit QWinTaskbarButton(QObject *parent = nullptr) : QObject(parent), m_progress(new QWinTaskbarProgress(this)) {} + void setWindow(QWindow*) {} + QWinTaskbarProgress* progress() { return m_progress; } +private: + QWinTaskbarProgress* m_progress; +}; + +class QWinThumbnailToolButton : public QObject +{ + Q_OBJECT +public: + explicit QWinThumbnailToolButton(QObject *parent = nullptr) : QObject(parent) {} + void setToolTip(const QString&) {} + void setIcon(const QIcon&) {} + void setEnabled(bool) {} + void setVisible(bool) {} +Q_SIGNALS: + void clicked(); +}; + +class QWinThumbnailToolBar : public QObject +{ + Q_OBJECT +public: + explicit QWinThumbnailToolBar(QObject *parent = nullptr) : QObject(parent) {} + void setWindow(QWindow*) {} + void addButton(QWinThumbnailToolButton* button) { m_buttons.append(button); } + QList buttons() const { return m_buttons; } +private: + QList m_buttons; +}; + +#endif // QWINTASKBARSTUBS_H diff --git a/src/taskbar/TaskbarComponentWin.h b/src/taskbar/TaskbarComponentWin.h index 2a12244..add66a1 100644 --- a/src/taskbar/TaskbarComponentWin.h +++ b/src/taskbar/TaskbarComponentWin.h @@ -1,10 +1,7 @@ #ifndef TASKBARCOMPONENTWIN_H #define TASKBARCOMPONENTWIN_H -#include -#include -#include -#include +#include "QWinTaskbarStubs.h" #include #include diff --git a/src/ui/webview.qml b/src/ui/webview.qml index 00f0234..2ea52e5 100644 --- a/src/ui/webview.qml +++ b/src/ui/webview.qml @@ -1,9 +1,9 @@ import QtQuick import Konvergo 1.0 import QtWebEngine -import QtWebChannel 1.0 -import QtQuick.Window 2.2 -import QtQuick.Controls 6.0 +import QtWebChannel +import QtQuick.Window +import QtQuick.Controls Window {