diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index fe030af..d13e796 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -9,15 +9,15 @@ assignees: '' Four considerations: - Please do not open bug reports to ask questions. Use the Discussions feature instead. - - Please make sure the issue only pertains to Jellyfin Media Player. If it also occurs in the web client, send the issue to jellyfin-web instead. + - Please make sure the issue only pertains to Jellyfin Desktop. If it also occurs in the web client, send the issue to jellyfin-web instead. - Please make sure that your issue is not being caused by errors in custom CSS or note that you are using custom CSS. - Notably, there have been instances of custom CSS breaking TV mode. - You can disable custom CSS under Display in the user settings. - Please provide logs. You can drag the log file into the issue to attach it. - - Windows: `%LOCALAPPDATA%\JellyfinMediaPlayer\logs` - - Linux: `~/.local/share/jellyfinmediaplayer/logs/` - - Linux (Flatpak): `~/.var/app/com.github.iwalton3.jellyfin-media-player/data/jellyfinmediaplayer/logs/` - - macOS: `~/Library/Logs/Jellyfin Media Player/` + - Windows: `%LOCALAPPDATA%\Jellyfin Desktop\logs` + - Linux: `~/.local/share/jellyfin-desktop/logs/` + - Linux (Flatpak): `~/.var/app/org.jellyfin.JellyfinDesktop/data/jellyfin-desktop/logs/` + - macOS: `~/Library/Logs/Jellyfin Desktop/` **Describe the bug** A clear and concise description of what the bug is. diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a35a28f..0ae9fa9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -26,18 +26,18 @@ jobs: ninja install - name: Fix library paths and create dmg run: | - python3 ./scripts/fix-install-names.py ./build/output/Jellyfin\ Media\ Player.app - python3 ./scripts/fix-webengine.py ./build/output/Jellyfin\ Media\ Player.app - codesign --force --deep -s - ./build/output/Jellyfin\ Media\ Player.app/ + python3 ./scripts/fix-install-names.py "./build/output/Jellyfin Desktop.app" + python3 ./scripts/fix-webengine.py "./build/output/Jellyfin Desktop.app" + codesign --force --deep -s - "./build/output/Jellyfin Desktop.app/" brew install create-dmg attempts=0 while [[ "$attempts" -lt 10 ]] do attempts=$((attempts+1)) - create-dmg --volname "Jellyfin Media Player" --no-internet-enable "JellyfinMediaPlayer.dmg" "./build/output/Jellyfin Media Player.app" && break || echo "dmg create failed, retrying..." + create-dmg --volname "Jellyfin Desktop" --no-internet-enable "Jellyfin Desktop.dmg" "./build/output/Jellyfin Desktop.app" && break || echo "dmg create failed, retrying..." sleep 5 done - if ! [[ -e JellyfinMediaPlayer.dmg ]] + if ! [[ -e "Jellyfin Desktop.dmg" ]] then echo "Failed to create dmg after 10 attempts" exit 1 @@ -46,7 +46,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: macos - path: ${{ github.workspace }}/JellyfinMediaPlayer.dmg + path: ${{ github.workspace }}/Jellyfin Desktop.dmg build-macarm64: runs-on: macos-14 @@ -67,16 +67,16 @@ jobs: ninja install - name: Fix library paths and create dmg run: | - python3 ./scripts/fix-install-names.py ./build/output/Jellyfin\ Media\ Player.app - python3 ./scripts/fix-webengine.py ./build/output/Jellyfin\ Media\ Player.app - codesign --force --deep -s - ./build/output/Jellyfin\ Media\ Player.app/ + python3 ./scripts/fix-install-names.py "./build/output/Jellyfin Desktop.app" + python3 ./scripts/fix-webengine.py "./build/output/Jellyfin Desktop.app" + codesign --force --deep -s - "./build/output/Jellyfin Desktop.app/" brew install create-dmg - create-dmg --volname "Jellyfin Media Player" --no-internet-enable "JellyfinMediaPlayer.dmg" "./build/output/Jellyfin Media Player.app" + create-dmg --volname "Jellyfin Desktop" --no-internet-enable "Jellyfin Desktop.dmg" "./build/output/Jellyfin Desktop.app" - name: Archive production artifacts uses: actions/upload-artifact@v4 with: name: macos-arm64 - path: ${{ github.workspace }}/JellyfinMediaPlayer.dmg + path: ${{ github.workspace }}/Jellyfin Desktop.dmg build-win64-legacy: runs-on: windows-latest @@ -122,7 +122,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: windows-legacy64 - path: ${{ github.workspace }}/build/JellyfinMediaPlayer-*.exe + path: ${{ github.workspace }}/build/JellyfinDesktop-*.exe build-win64: runs-on: windows-latest @@ -168,7 +168,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: windows - path: ${{ github.workspace }}/build/JellyfinMediaPlayer-*.exe + path: ${{ github.workspace }}/build/JellyfinDesktop-*.exe build-win32: runs-on: windows-latest @@ -214,7 +214,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: windows-legacy32 - path: ${{ github.workspace }}/build/JellyfinMediaPlayer-*.exe + path: ${{ github.workspace }}/build/JellyfinDesktop-*.exe build-ubuntu: strategy: @@ -260,7 +260,7 @@ jobs: key: "${{ secrets.REPO_KEY }}" source: deployment/dist/* strip_components: 2 - target: "/srv/incoming/client/jellyfin-media-player/ubuntu/${{ matrix.tag }}" + target: "/srv/incoming/client/jellyfin-desktop/ubuntu/${{ matrix.tag }}" - name: Import artifactsinto reprepro uses: appleboy/ssh-action@029f5b4aeeeb58fdfe1410a5d17f967dacf36262 # v1.0.3 with: @@ -272,8 +272,8 @@ jobs: script: | set -o xtrace COMPONENT="main" - sudo reprepro --waitforlock 30 --basedir /srv/ubuntu --component ${COMPONENT} includedeb ${{ matrix.tag }} /srv/incoming/client/jellyfin-media-player/ubuntu/${{ matrix.tag }}/*.deb || exit 1 - sudo reprepro --waitforlock 30 --basedir /srv/ubuntu --component ${COMPONENT} includedsc ${{ matrix.tag }} /srv/incoming/client/jellyfin-media-player/ubuntu/${{ matrix.tag }}/*.dsc || exit 1 + sudo reprepro --waitforlock 30 --basedir /srv/ubuntu --component ${COMPONENT} includedeb ${{ matrix.tag }} /srv/incoming/client/jellyfin-desktop/ubuntu/${{ matrix.tag }}/*.deb || exit 1 + sudo reprepro --waitforlock 30 --basedir /srv/ubuntu --component ${COMPONENT} includedsc ${{ matrix.tag }} /srv/incoming/client/jellyfin-desktop/ubuntu/${{ matrix.tag }}/*.dsc || exit 1 - name: Move artifacts into repository uses: appleboy/ssh-action@029f5b4aeeeb58fdfe1410a5d17f967dacf36262 # v1.0.3 with: @@ -283,9 +283,9 @@ jobs: debug: false script_stop: false script: | - export BASEDIR="/srv/repository/main/client/jellyfin-media-player/ubuntu" + export BASEDIR="/srv/repository/main/client/jellyfin-desktop/ubuntu" sudo mkdir -p ${BASEDIR}/stable/${{ github.ref_name }} || exit 1 - sudo mv -t ${BASEDIR}/stable/${{ github.ref_name }} /srv/incoming/client/jellyfin-media-player/ubuntu/${{ matrix.tag }}/* || exit 1 + sudo mv -t ${BASEDIR}/stable/${{ github.ref_name }} /srv/incoming/client/jellyfin-desktop/ubuntu/${{ matrix.tag }}/* || exit 1 sudo rm ${BASEDIR}/latest || true sudo ln -sf ${BASEDIR}/stable/${{ github.ref_name }} ${BASEDIR}/latest || exit 1 @@ -333,7 +333,7 @@ jobs: key: "${{ secrets.REPO_KEY }}" source: deployment/dist/* strip_components: 2 - target: "/srv/incoming/client/jellyfin-media-player/debian/${{ matrix.tag }}" + target: "/srv/incoming/client/jellyfin-desktop/debian/${{ matrix.tag }}" - name: Import artifactsinto reprepro uses: appleboy/ssh-action@029f5b4aeeeb58fdfe1410a5d17f967dacf36262 # v1.0.3 with: @@ -345,8 +345,8 @@ jobs: script: | set -o xtrace COMPONENT="main" - sudo reprepro --waitforlock 30 --basedir /srv/debian --component ${COMPONENT} includedeb ${{ matrix.tag }} /srv/incoming/client/jellyfin-media-player/debian/${{ matrix.tag }}/*.deb || exit 1 - sudo reprepro --waitforlock 30 --basedir /srv/debian --component ${COMPONENT} includedsc ${{ matrix.tag }} /srv/incoming/client/jellyfin-media-player/debian/${{ matrix.tag }}/*.dsc || exit 1 + sudo reprepro --waitforlock 30 --basedir /srv/debian --component ${COMPONENT} includedeb ${{ matrix.tag }} /srv/incoming/client/jellyfin-desktop/debian/${{ matrix.tag }}/*.deb || exit 1 + sudo reprepro --waitforlock 30 --basedir /srv/debian --component ${COMPONENT} includedsc ${{ matrix.tag }} /srv/incoming/client/jellyfin-desktop/debian/${{ matrix.tag }}/*.dsc || exit 1 - name: Move artifacts into repository uses: appleboy/ssh-action@029f5b4aeeeb58fdfe1410a5d17f967dacf36262 # v1.0.3 with: @@ -356,8 +356,8 @@ jobs: debug: false script_stop: false script: | - export BASEDIR="/srv/repository/main/client/jellyfin-media-player/debian" + export BASEDIR="/srv/repository/main/client/jellyfin-desktop/debian" sudo mkdir -p ${BASEDIR}/stable/${{ github.ref_name }} || exit 1 - sudo mv -t ${BASEDIR}/stable/${{ github.ref_name }} /srv/incoming/client/jellyfin-media-player/debian/${{ matrix.tag }}/* || exit 1 + sudo mv -t ${BASEDIR}/stable/${{ github.ref_name }} /srv/incoming/client/jellyfin-desktop/debian/${{ matrix.tag }}/* || exit 1 sudo rm ${BASEDIR}/latest || true sudo ln -sf ${BASEDIR}/stable/${{ github.ref_name }} ${BASEDIR}/latest || exit 1 diff --git a/.gitignore b/.gitignore index 79134a4..6b098c4 100644 --- a/.gitignore +++ b/.gitignore @@ -22,9 +22,9 @@ toolchain.cmake .last_wc_version debian/*.debhelper.log debian/.debhelper/ -debian/jellyfin-media-player/ +debian/jellyfin-desktop/ debian/files -debian/jellyfin-media-player.substvars +debian/jellyfin-desktop.substvars debian/debhelper-build-stamp dist.zip obj-x86_64-linux-gnu/ diff --git a/CMakeLists.txt b/CMakeLists.txt index b622530..8c0b01f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,12 +5,12 @@ if (EXISTS "${CMAKE_SOURCE_DIR}/toolchain.cmake") set(CMAKE_TOOLCHAIN_FILE "${CMAKE_SOURCE_DIR}/toolchain.cmake") endif() -project(JellyfinMediaPlayer CXX C) +project(JellyfinDesktop CXX C) # we want this to be able to run clang-tidy set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE BOOL "" FORCE) -option(CHECK_FOR_UPDATES "Enable checking for new versions of Jellyfin Media Player" ON) +option(CHECK_FOR_UPDATES "Enable checking for new versions of Jellyfin" ON) option(OPENELEC "Make an OpenELEC build" OFF) option(LINUX_X11POWER "Enable non D-Bus screensaver management" OFF) option(USE_STATIC_MPVQT "Build MpvQt from bundled submodule instead of using system library" ON) @@ -83,4 +83,4 @@ add_subdirectory(tests) include(CPackConfiguration) -add_custom_target(install_app_bundle COMMAND ${CMAKE_COMMAND} -P cmake_install.cmake DEPENDS JellyfinMediaPlayer) +add_custom_target(install_app_bundle COMMAND ${CMAKE_COMMAND} -P cmake_install.cmake DEPENDS JellyfinDesktop) diff --git a/CMakeModules/CPackConfiguration.cmake b/CMakeModules/CPackConfiguration.cmake index 7fc1019..95585f4 100644 --- a/CMakeModules/CPackConfiguration.cmake +++ b/CMakeModules/CPackConfiguration.cmake @@ -1,6 +1,6 @@ -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Jellyfin Media Player") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Jellyfin") set(CPACK_PACKAGE_VENDOR "Jellyfin") -set(CPACK_PACKAGE_NAME "Jellyfin Media Player") +set(CPACK_PACKAGE_NAME "Jellyfin") set(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR}) set(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR}) set(CPACK_PACKAGE_VERSION_PATCH ${VERSION_NANO}) @@ -13,10 +13,10 @@ elseif(WIN32) else() set(CPACK_SYSTEM_NAME linux-${CMAKE_HOST_SYSTEM_PROCESSOR}) endif() -set(CPACK_PACKAGE_FILE_NAME "JellyfinMediaPlayer-${VERSION_STRING}-${CPACK_SYSTEM_NAME}") -set(CPACK_SOURCE_PACKAGE_FILE_NAME "JellyfinMediaPlayer-${VERSION_STRING}-src") +set(CPACK_PACKAGE_FILE_NAME "Jellyfin-${VERSION_STRING}-${CPACK_SYSTEM_NAME}") +set(CPACK_SOURCE_PACKAGE_FILE_NAME "Jellyfin-${VERSION_STRING}-src") -set(CPACK_PACKAGE_INSTALL_DIRECTORY "JellyfinMediaPlayer") +set(CPACK_PACKAGE_INSTALL_DIRECTORY "Jellyfin") set(CPACK_STRIP_FILES 1) @@ -32,5 +32,5 @@ else(WIN32) set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_BINARY_DIR}/CPackGeneratedConfig.cmake) include(CPack) - cpack_add_component(Core DISPLAY_NAME "Jellyfin Media Player" DESCRIPTION "Jellyfin Media Player (Core Application)" REQUIRED) + cpack_add_component(Core DISPLAY_NAME "Jellyfin" DESCRIPTION "Jellyfin (Core Application)" REQUIRED) endif(WIN32) \ No newline at end of file diff --git a/CMakeModules/CompleteBundleWin.cmake.in b/CMakeModules/CompleteBundleWin.cmake.in index eb7d7f5..6fc75d5 100644 --- a/CMakeModules/CompleteBundleWin.cmake.in +++ b/CMakeModules/CompleteBundleWin.cmake.in @@ -1,6 +1,6 @@ set(PROJECT_SOURCE_DIR @PROJECT_SOURCE_DIR@) -execute_process(COMMAND @QTROOT@/bin/windeployqt.exe --verbose 9 --qmldir @SOURCE_ROOT@/src/ui ${CMAKE_INSTALL_PREFIX}/JellyfinMediaPlayer.exe) +execute_process(COMMAND @QTROOT@/bin/windeployqt.exe --verbose 9 --qmldir @SOURCE_ROOT@/src/ui "${CMAKE_INSTALL_PREFIX}/Jellyfin Desktop.exe") # on windows windeployqt doesnt install non qt libraries, let cmake do that # include(BundleUtilities) @@ -13,7 +13,7 @@ endforeach() get_filename_component(CEC_DIR @CEC_LIBRARY@ DIRECTORY) list(APPEND SEARCHDIRS ${CEC_DIR}) -# fixup_bundle("${CMAKE_INSTALL_PREFIX}/JellyfinMediaPlayer.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}") diff --git a/CMakeModules/InstallLinuxDesktopFile.cmake b/CMakeModules/InstallLinuxDesktopFile.cmake index b8337dc..5b89542 100644 --- a/CMakeModules/InstallLinuxDesktopFile.cmake +++ b/CMakeModules/InstallLinuxDesktopFile.cmake @@ -1,3 +1,3 @@ -install (FILES ${CMAKE_SOURCE_DIR}/resources/meta/com.github.iwalton3.jellyfin-media-player.desktop DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/applications) -install (FILES ${CMAKE_SOURCE_DIR}/resources/meta/com.github.iwalton3.jellyfin-media-player.appdata.xml DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/metainfo) -install (FILES ${CMAKE_SOURCE_DIR}/resources/images/icon.svg DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/icons/hicolor/scalable/apps RENAME com.github.iwalton3.jellyfin-media-player.svg) +install (FILES ${CMAKE_SOURCE_DIR}/resources/meta/org.jellyfin.JellyfinDesktop.desktop DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/applications) +install (FILES ${CMAKE_SOURCE_DIR}/resources/meta/org.jellyfin.JellyfinDesktop.appdata.xml DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/metainfo) +install (FILES ${CMAKE_SOURCE_DIR}/resources/images/icon.svg DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/icons/hicolor/scalable/apps RENAME org.jellyfin.JellyfinDesktop.svg) diff --git a/CMakeModules/LinuxConfiguration.cmake b/CMakeModules/LinuxConfiguration.cmake index 22b5545..d594dcf 100644 --- a/CMakeModules/LinuxConfiguration.cmake +++ b/CMakeModules/LinuxConfiguration.cmake @@ -19,7 +19,7 @@ else() endif() set(INSTALL_BIN_DIR ${CMAKE_INSTALL_BINDIR}) -set(INSTALL_RESOURCE_DIR ${CMAKE_INSTALL_DATADIR}/jellyfinmediaplayer) +set(INSTALL_RESOURCE_DIR ${CMAKE_INSTALL_DATADIR}/jellyfin-desktop) if(NOT OPENELEC) include(InstallLinuxDesktopFile) diff --git a/CMakeModules/NameConfiguration.cmake b/CMakeModules/NameConfiguration.cmake index ca3228a..b611fa2 100644 --- a/CMakeModules/NameConfiguration.cmake +++ b/CMakeModules/NameConfiguration.cmake @@ -1,12 +1,15 @@ -set(MAIN_TARGET JellyfinMediaPlayer) +set(MAIN_TARGET JellyfinDesktop) -# Name of the output binary, defaults are only used on Linux -set(MAIN_NAME jellyfinmediaplayer) +# Name of the output binary and data directories +set(MAIN_NAME jellyfin-desktop) +set(DATA_NAME jellyfin-desktop) if(APPLE) - set(MAIN_NAME "Jellyfin Media Player") + set(MAIN_NAME "Jellyfin Desktop") + set(DATA_NAME "Jellyfin Desktop") elseif(WIN32) - set(MAIN_NAME "JellyfinMediaPlayer") + set(MAIN_NAME "Jellyfin Desktop") + set(DATA_NAME "Jellyfin Desktop") endif(APPLE) configure_file(src/shared/Names.cpp.in src/shared/Names.cpp @ONLY) \ No newline at end of file diff --git a/CMakeModules/WindowsInstaller.cmake b/CMakeModules/WindowsInstaller.cmake index 7185655..53049c5 100644 --- a/CMakeModules/WindowsInstaller.cmake +++ b/CMakeModules/WindowsInstaller.cmake @@ -133,7 +133,7 @@ endfunction() add_custom_target(wix_install COMMAND ${CMAKE_COMMAND} -P cmake_install.cmake COMMENT "Copying files..." - DEPENDS JellyfinMediaPlayer) + DEPENDS JellyfinDesktop) wix_harvest_directory("${CMAKE_INSTALL_PREFIX}" files.wxs CGROUP ProgramFilesComponentGroup DEPENDS wix_install) @@ -149,12 +149,12 @@ else() set(INSTALLER_ARCH_STR windows-x86) endif() -wix_create_installer(JellyfinMediaPlayer-${VERSION_STRING}-${INSTALLER_ARCH_STR}.exe - TARGET JellyfinMediaPlayerInstaller +wix_create_installer(JellyfinDesktop-${VERSION_STRING}-${INSTALLER_ARCH_STR}.exe + TARGET JellyfinDesktopInstaller WXS_FILES "${PROJECT_SOURCE_DIR}/bundle/win/Bundle.wxs" EXTENSIONS WixUtilExtension WixBalExtension DEPENDS wix_PMP.msi BASEDIR "${PROJECT_SOURCE_DIR}/bundle/win" ) -add_custom_target(windows_package DEPENDS JellyfinMediaPlayerInstaller) +add_custom_target(windows_package DEPENDS JellyfinDesktopInstaller) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d540e71..c358786 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,8 +1,8 @@ -# Contributing to Jellyfin Media Player +# Contributing to Jellyfin Desktop ## Running Tests -Jellyfin Media Player uses Qt Test for unit testing. +Jellyfin Desktop uses Qt Test for unit testing. ### Building Tests diff --git a/README.md b/README.md index d8fa04f..bffb325 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,29 @@ -# Jellyfin Media Player +# Jellyfin Desktop Desktop client using jellyfin-web with embedded MPV player. Supports Windows, Mac OS, and Linux. Media plays within the same window using the jellyfin-web interface unlike Jellyfin Desktop. Supports audio passthrough. -![Screenshot of Jellyfin Media Player](https://raw.githubusercontent.com/iwalton3/mpv-shim-misc-docs/master/images/jmp-player-win.png) +![Screenshot of Jellyfin Desktop](https://raw.githubusercontent.com/iwalton3/mpv-shim-misc-docs/master/images/jmp-player-win.png) Downloads: - - [Windows, Mac, and Linux Releases](https://github.com/jellyfin/jellyfin-media-player/releases) + - [Windows, Mac, and Linux Releases](https://github.com/jellyfin/jellyfin-desktop/releases) - Note for Mac users: builds for Intel require macOS 12+ and Apple Silicon builds requires macOS 14+ - - [Flathub (Linux)](https://flathub.org/apps/details/com.github.iwalton3.jellyfin-media-player) + - [Flathub (Linux)](https://flathub.org/apps/details/org.jellyfin.JellyfinDesktop) Related Documents: - Web client: Application uses server-provided web client. - - Web client integration documentation: [for-web-developers.md](https://github.com/jellyfin/jellyfin-media-player/blob/master/for-web-developers.md) - - API Docs in [client-api.md](https://github.com/jellyfin/jellyfin-media-player/blob/master/client-api.md) + - Web client integration documentation: [for-web-developers.md](https://github.com/jellyfin/jellyfin-desktop/blob/master/for-web-developers.md) + - API Docs in [client-api.md](https://github.com/jellyfin/jellyfin-desktop/blob/master/client-api.md) - Tip: For help building, look at the GitHub Actions file! ## Building at a glance (Linux) -To download the latest stable release, get the latest version tag from the [latest releases page](https://github.com/jellyfin/jellyfin-media-player/releases/latest) and append the following to your pull command during the build phase for JMP "--branch $VERSIONTAG --single-branch" +To download the latest stable release, get the latest version tag from the [latest releases page](https://github.com/jellyfin/jellyfin-desktop/releases/latest) and append the following to your pull command during the build phase for JMP "--branch $VERSIONTAG --single-branch" Example: ```bash -git clone --recursive https://github.com/jellyfin/jellyfin-media-player.git --branch v1.9.1 --single-branch +git clone --recursive https://github.com/jellyfin/jellyfin-desktop.git --branch v1.9.1 --single-branch ``` @@ -44,8 +44,8 @@ sudo ln -s /usr/local/lib/x86_64-linux-gnu/libmpv.so /usr/local/lib/x86_64-linux sudo ln -sf /usr/local/lib/x86_64-linux-gnu/libmpv.so /usr/local/lib/libmpv.so.2 sudo ldconfig cd ~/jmp/ -git clone --recursive https://github.com/jellyfin/jellyfin-media-player.git -cd jellyfin-media-player +git clone --recursive https://github.com/jellyfin/jellyfin-desktop.git +cd jellyfin-desktop mkdir build cd build cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr/local/ -G Ninja .. @@ -77,8 +77,8 @@ sudo ln -s /usr/local/lib64/libmpv.so /usr/local/lib/x86_64-linux-gnu/libmpv.so. sudo ln -s /usr/local/lib64/libmpv.so /usr/local/lib/x86_64-linux-gnu/libmpv.so sudo ldconfig cd ~/jmp/ -git clone --recursive https://github.com/jellyfin/jellyfin-media-player.git -cd jellyfin-media-player/ +git clone --recursive https://github.com/jellyfin/jellyfin-desktop.git +cd jellyfin-desktop/ mkdir build cd build/ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr/local/ .. @@ -107,8 +107,8 @@ Please install: You need to run these commands in git bash. ```bash -git clone --recursive https://github.com/jellyfin/jellyfin-media-player -cd jellyfin-media-player +git clone --recursive https://github.com/jellyfin/jellyfin-desktop +cd jellyfin-desktop mkdir build cd build ``` @@ -132,8 +132,8 @@ Then run the following commands (replace with your QT installation loca ```bash brew install mpv ninja -git clone --recursive https://github.com/jellyfin/jellyfin-media-player.git -cd jellyfin-media-player +git clone --recursive https://github.com/jellyfin/jellyfin-desktop.git +cd jellyfin-desktop mkdir build cd build cmake -GNinja -DQTROOT= -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=output .. @@ -143,24 +143,24 @@ ninja install To create redistributable bundle, some library paths need to be fixed. At the project root directory, run: ```bash -python3 ./scripts/fix-install-names.py ./build/output/Jellyfin\ Media\ Player.app +python3 ./scripts/fix-install-names.py "./build/output/Jellyfin Desktop.app" ``` ## Log File Location - - Windows: `%LOCALAPPDATA%\JellyfinMediaPlayer\logs` - - Linux: `~/.local/share/jellyfinmediaplayer/logs/` - - Linux (Flatpak): `~/.var/app/com.github.iwalton3.jellyfin-media-player/data/jellyfinmediaplayer/logs/` - - macOS: `~/Library/Logs/Jellyfin Media Player/` + - Windows: `%LOCALAPPDATA%\Jellyfin Desktop\logs` + - Linux: `~/.local/share/jellyfin-desktop/logs/` + - Linux (Flatpak): `~/.var/app/org.jellyfin.JellyfinDesktop/data/jellyfin-desktop/logs/` + - macOS: `~/Library/Logs/Jellyfin Desktop/` ## Config File Location -The main configuration file is called `jellyfinmediaplayer.conf`. You can also add a `mpv.conf` to configure MPV directly. +The main configuration file is called `jellyfin-desktop.conf`. You can also add a `mpv.conf` to configure MPV directly. - - Windows: `%LOCALAPPDATA%\JellyfinMediaPlayer\` - - Linux: `~/.local/share/jellyfinmediaplayer/` - - Linux (Flatpak): `~/.var/app/com.github.iwalton3.jellyfin-media-player/data/jellyfinmediaplayer/` - - macOS: `~/Library/Application Support/Jellyfin Media Player/` + - Windows: `%LOCALAPPDATA%\Jellyfin Desktop\` + - Linux: `~/.local/share/jellyfin-desktop/` + - Linux (Flatpak): `~/.var/app/org.jellyfin.JellyfinDesktop/data/jellyfin-desktop/` + - macOS: `~/Library/Application Support/Jellyfin Desktop/` ## Web Debugger @@ -179,7 +179,7 @@ If you have problems: ## License -Jellyfin Media Player is licensed under GPL v2. See the ``LICENSE`` file. +Jellyfin Desktop is licensed under GPL v2. See the ``LICENSE`` file. Licenses of dependencies are summarized under ``resources/misc/licenses.txt``. This file can also be printed at runtime when using the ``--licenses`` option. diff --git a/bundle/win/Bundle.wxs b/bundle/win/Bundle.wxs index 80f8827..87ec36c 100644 --- a/bundle/win/Bundle.wxs +++ b/bundle/win/Bundle.wxs @@ -38,16 +38,16 @@ Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\Package_for_KB2919355~31bf3856ad364e35~x86~~6.3.1.14" Value="CurrentState" /> - + = v6.1]]> - + - + 112 AND KB2919355_amd64 <> 112))]]> @@ -74,15 +74,15 @@ - + + Id="PreviousInstallFolderSearch" Root='HKCU' Key='Software\Jellyfin\Jellyfin Desktop' Value='InstallFolder' Variable='PreviousInstallFolder' /> - + diff --git a/bundle/win/ControlPanel.wxi b/bundle/win/ControlPanel.wxi index 9fbbe9f..c61f77e 100644 --- a/bundle/win/ControlPanel.wxi +++ b/bundle/win/ControlPanel.wxi @@ -1,8 +1,8 @@ - + - + diff --git a/bundle/win/Global.wxi b/bundle/win/Global.wxi index cc0ef3a..ab39c91 100644 --- a/bundle/win/Global.wxi +++ b/bundle/win/Global.wxi @@ -1,11 +1,11 @@ - - + + - - - + + + diff --git a/bundle/win/JMP.wxs b/bundle/win/JMP.wxs index c6830fd..64763ef 100644 --- a/bundle/win/JMP.wxs +++ b/bundle/win/JMP.wxs @@ -10,7 +10,7 @@ - + - + @@ -55,7 +55,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -87,20 +87,20 @@ - + ADDDESKTOPSHORTCUT=1 - + - - + @@ -131,7 +131,7 @@ - + diff --git a/bundle/win/Jellyfin-NoChromiumGPU.bat b/bundle/win/Jellyfin-NoChromiumGPU.bat new file mode 100644 index 0000000..148faed --- /dev/null +++ b/bundle/win/Jellyfin-NoChromiumGPU.bat @@ -0,0 +1 @@ +start "" "Jellyfin Desktop.exe" "--disable-gpu" \ No newline at end of file diff --git a/bundle/win/JellyfinMediaPlayer-NoChromiumGPU.bat b/bundle/win/JellyfinMediaPlayer-NoChromiumGPU.bat deleted file mode 100644 index ed6841b..0000000 --- a/bundle/win/JellyfinMediaPlayer-NoChromiumGPU.bat +++ /dev/null @@ -1 +0,0 @@ -start "" "JellyfinMediaPlayer.exe" "--disable-gpu" \ No newline at end of file diff --git a/debian/control b/debian/control index 85fd348..7f5ce6a 100644 --- a/debian/control +++ b/debian/control @@ -1,4 +1,4 @@ -Source: jellyfin-media-player +Source: jellyfin-desktop Section: video Priority: optional Maintainer: Izzie Walton , Joshua Boniface @@ -40,10 +40,10 @@ Build-Depends: debhelper (>= 10), qt6-base-private-dev Standards-Version: 3.9.4 Homepage: https://jellyfin.org/ -Vcs-Git: https://github.org/jellyfin/jellyfin-media-player.git -Vcs-Browser: https://github.org/jellyfin/jellyfin-media-player +Vcs-Git: https://github.org/jellyfin/jellyfin-desktop.git +Vcs-Browser: https://github.org/jellyfin/jellyfin-desktop -Package: jellyfin-media-player +Package: jellyfin-desktop Architecture: any Depends: ${shlibs:Depends}, qml6-module-qtwebengine, diff --git a/debian/copyright b/debian/copyright index 9bd64ba..3711e73 100644 --- a/debian/copyright +++ b/debian/copyright @@ -1,6 +1,6 @@ Format: http://dep.debian.net/deps/dep5 Upstream-Name: jellyfin -Source: https://github.com/jellyfin/jellyfin-media-player +Source: https://github.com/jellyfin/jellyfin-desktop Files: * Copyright: 2018 Izzie Walton diff --git a/deployment/build.debian b/deployment/build.debian index 27b1be5..4f6065c 100755 --- a/deployment/build.debian +++ b/deployment/build.debian @@ -16,7 +16,7 @@ sed -i "1 s/-1)/+${DEBVER})/" debian/changelog # install deps echo y | mk-build-deps -i -rm jellyfin-media-player-build-deps_* +rm jellyfin-desktop-build-deps_* # build deb dpkg-buildpackage -us -uc --pre-clean --post-clean diff --git a/for-web-developers.md b/for-web-developers.md index 00b5730..aa0de83 100644 --- a/for-web-developers.md +++ b/for-web-developers.md @@ -1,4 +1,4 @@ -# Jellyfin Media Player Implementation +# Jellyfin Desktop Implementation ## Detection @@ -6,7 +6,7 @@ You can detect JMP by looking for the object `window.jmpInfo`, which is defined ## Device Profile -You can query a device profile for Jellyfin Media Player with: +You can query a device profile for Jellyfin Desktop with: ```js window.NativeShell.AppHost.getDeviceProfile() @@ -32,7 +32,7 @@ The following functions are available after less than a second: ## Media Playback -See [mpvVideoPlayer.js](https://github.com/jellyfin/jellyfin-media-player/blob/master/native/mpvVideoPlayer.js) for a complete example of how to connect and control the player. +See [mpvVideoPlayer.js](https://github.com/jellyfin/jellyfin-desktop/blob/master/native/mpvVideoPlayer.js) for a complete example of how to connect and control the player. Notable API methods: @@ -82,7 +82,7 @@ Note: The callback does NOT mean the video actually finished loading. You need t { type: 'video', // use 'music' to disable video rendering headers: { - 'User-Agent': 'JellyfinMediaPlayer' + 'User-Agent': 'JellyfinDesktop' }, metadata: { // Only used for system UI integration, eg. taskbar/windows media. @@ -119,7 +119,7 @@ You can recieve input from remote controls and gamepads via the input component. "TV" mode which can be set in the config. It disables keyboard into the webapp and redirects it through this as well. -See [jmpInputPlugin.js](https://github.com/jellyfin/jellyfin-media-player/blob/master/native/jmpInputPlugin.js) for an example which picks up events and translates them to ones that `jellyfin-web` understands. +See [inputPlugin.js](https://github.com/jellyfin/jellyfin-desktop/blob/master/native/inputPlugin.js) for an example which picks up events and translates them to ones that `jellyfin-web` understands. ```js api.input.hostInput.connect((actions) => { @@ -132,14 +132,14 @@ api.system.hello("jmpInputPlugin"); // signals to start sending user input ``` The inputs which are actually processed by `jellyfin-web` are fairly limited, but there are many more possible events. -See the [inputmaps](https://github.com/jellyfin/jellyfin-media-player/tree/master/resources/inputmaps) folder for event names for various input devices. +See the [inputmaps](https://github.com/jellyfin/jellyfin-desktop/tree/master/resources/inputmaps) folder for event names for various input devices. ## Settings The application retains some user settings that control advanced functions, such as audio passthrough. -There is already [a modal](https://github.com/jellyfin/jellyfin-media-player/blob/7d5943becc1ca672d599887cac9107836c38d337/native/nativeshell.js#L189-L308) you can invoke display of which allows basic configuration changes. +There is already [a modal](https://github.com/jellyfin/jellyfin-desktop/blob/7d5943becc1ca672d599887cac9107836c38d337/native/nativeshell.js#L189-L308) you can invoke display of which allows basic configuration changes. -The configuration options are defined here: [settings_description.json](https://github.com/jellyfin/jellyfin-media-player/blob/master/resources/settings/settings_description.json) +The configuration options are defined here: [settings_description.json](https://github.com/jellyfin/jellyfin-desktop/blob/master/resources/settings/settings_description.json) Current Settings: @@ -194,23 +194,23 @@ Current Settings: - Subtitle Section (`subtitles`): - `ass_scale_border_and_shadow`: Controls whether or not ASS subtitles scale their border and shadow with the video resolution. Default `true` - `ass_style_override: string enum`: Controls whether user style override should be applied to ASS subtitles. Default: `` - - Provided options: [see enum](https://github.com/jellyfin/jellyfin-media-player/blob/7d5943becc1ca672d599887cac9107836c38d337/resources/settings/settings_description.json#L412-L419) + - Provided options: [see enum](https://github.com/jellyfin/jellyfin-desktop/blob/7d5943becc1ca672d599887cac9107836c38d337/resources/settings/settings_description.json#L412-L419) - `placement: string enum`: Controls where subtitles are displayed on the screen. Default: `` - - Provided options: [see enum](https://github.com/jellyfin/jellyfin-media-player/blob/7d5943becc1ca672d599887cac9107836c38d337/resources/settings/settings_description.json#L424-L432) + - Provided options: [see enum](https://github.com/jellyfin/jellyfin-desktop/blob/7d5943becc1ca672d599887cac9107836c38d337/resources/settings/settings_description.json#L424-L432) - `color: string enum`: Controls colors of subtitles. Default: `` - - Provided options: [see enum](https://github.com/jellyfin/jellyfin-media-player/blob/master/resources/settings/settings_description.json#L437-L446) + - Provided options: [see enum](https://github.com/jellyfin/jellyfin-desktop/blob/master/resources/settings/settings_description.json#L437-L446) - `border_color: string enum`: Controls font border colors of subtitles. Default: `` - - Provided options: [see enum](https://github.com/jellyfin/jellyfin-media-player/blob/master/resources/settings/settings_description.json#L451-L460) + - Provided options: [see enum](https://github.com/jellyfin/jellyfin-desktop/blob/master/resources/settings/settings_description.json#L451-L460) - `border_size: int`: Controls subtitle border size. Default is `-1`. - - Provided options: [see enum](https://github.com/jellyfin/jellyfin-media-player/blob/7d5943becc1ca672d599887cac9107836c38d337/resources/settings/settings_description.json#L465-L473) + - Provided options: [see enum](https://github.com/jellyfin/jellyfin-desktop/blob/7d5943becc1ca672d599887cac9107836c38d337/resources/settings/settings_description.json#L465-L473) - `background_color: string enum`: Controls backgroud colors of subtitles. Default: `` - - Provided options: [see enum](https://github.com/jellyfin/jellyfin-media-player/blob/master/resources/settings/settings_description.json#L478-L487) + - Provided options: [see enum](https://github.com/jellyfin/jellyfin-desktop/blob/master/resources/settings/settings_description.json#L478-L487) - `background_transparency: string enum`: Controls backgroud transparency (in hex) of subtitles. Default: `` - - Provided options: [see enum](https://github.com/jellyfin/jellyfin-media-player/blob/master/resources/settings/settings_description.json#L492-L499) + - Provided options: [see enum](https://github.com/jellyfin/jellyfin-desktop/blob/master/resources/settings/settings_description.json#L492-L499) - `size: int`: Controls subtitle size. Default is `-1`. - - Provided options: [see enum](https://github.com/jellyfin/jellyfin-media-player/blob/7d5943becc1ca672d599887cac9107836c38d337/resources/settings/settings_description.json#L504-L511) + - Provided options: [see enum](https://github.com/jellyfin/jellyfin-desktop/blob/7d5943becc1ca672d599887cac9107836c38d337/resources/settings/settings_description.json#L504-L511) - `font: string enum`: Specify font to use for subtitles that do not themselves specify a particular font. Default: `` - - Provided options: [see enum](https://github.com/jellyfin/jellyfin-media-player/blob/master/resources/settings/settings_description.json#L515-L525) + - Provided options: [see enum](https://github.com/jellyfin/jellyfin-desktop/blob/master/resources/settings/settings_description.json#L515-L525) The global `window.jmpInfo` object contains settings for the application in the form of `window.jmpInfo.settings.[section][key] = value`. Settings descriptions are stored in the form `window.jmpInfo.settingsDescriptions.[section] = [{ key, options }]` @@ -295,12 +295,12 @@ api.system.updateInfoEmitted.disconnect(myEventListener); The client API corresponds to the methods in the application with `Q_INVOKABLE`. - - `api.display` - [DisplayComponent.h](https://github.com/jellyfin/jellyfin-media-player/blob/master/src/display/DisplayComponent.h) [DisplayComponent.cpp](https://github.com/jellyfin/jellyfin-media-player/blob/master/src/display/DisplayComponent.cpp) - - `api.input` - [InputComponent.h](https://github.com/jellyfin/jellyfin-media-player/blob/master/src/input/InputComponent.h) [InputComponent.cpp](https://github.com/jellyfin/jellyfin-media-player/blob/master/src/input/InputComponent.cpp) - - `api.player` - [PlayerComponent.h](https://github.com/jellyfin/jellyfin-media-player/blob/master/src/player/PlayerComponent.h) [PlayerComponent.cpp](https://github.com/jellyfin/jellyfin-media-player/blob/master/src/player/PlayerComponent.cpp) - - `api.power` - [PowerComponent.h](https://github.com/jellyfin/jellyfin-media-player/blob/master/src/power/PowerComponent.h) [PowerComponent.cpp](https://github.com/jellyfin/jellyfin-media-player/blob/master/src/power/PowerComponent.cpp) - - `api.settings` - [SettingsComponent.h](https://github.com/jellyfin/jellyfin-media-player/blob/master/src/settings/SettingsComponent.h) - - `api.system` - [SystemComponent.h](https://github.com/jellyfin/jellyfin-media-player/blob/master/src/system/SystemComponent.h) [SystemComponent.cpp](https://github.com/jellyfin/jellyfin-media-player/blob/master/src/system/SystemComponent.cpp) + - `api.display` - [DisplayComponent.h](https://github.com/jellyfin/jellyfin-desktop/blob/master/src/display/DisplayComponent.h) [DisplayComponent.cpp](https://github.com/jellyfin/jellyfin-desktop/blob/master/src/display/DisplayComponent.cpp) + - `api.input` - [InputComponent.h](https://github.com/jellyfin/jellyfin-desktop/blob/master/src/input/InputComponent.h) [InputComponent.cpp](https://github.com/jellyfin/jellyfin-desktop/blob/master/src/input/InputComponent.cpp) + - `api.player` - [PlayerComponent.h](https://github.com/jellyfin/jellyfin-desktop/blob/master/src/player/PlayerComponent.h) [PlayerComponent.cpp](https://github.com/jellyfin/jellyfin-desktop/blob/master/src/player/PlayerComponent.cpp) + - `api.power` - [PowerComponent.h](https://github.com/jellyfin/jellyfin-desktop/blob/master/src/power/PowerComponent.h) [PowerComponent.cpp](https://github.com/jellyfin/jellyfin-desktop/blob/master/src/power/PowerComponent.cpp) + - `api.settings` - [SettingsComponent.h](https://github.com/jellyfin/jellyfin-desktop/blob/master/src/settings/SettingsComponent.h) + - `api.system` - [SystemComponent.h](https://github.com/jellyfin/jellyfin-desktop/blob/master/src/system/SystemComponent.h) [SystemComponent.cpp](https://github.com/jellyfin/jellyfin-desktop/blob/master/src/system/SystemComponent.cpp) - `api.taskbar` - (this is empty) -For a (slightly outdated) list of functions, you can look here: https://github.com/jellyfin/jellyfin-media-player/blob/master/client-api.md \ No newline at end of file +For a (slightly outdated) list of functions, you can look here: https://github.com/jellyfin/jellyfin-desktop/blob/master/client-api.md \ No newline at end of file diff --git a/native/find-webclient.html b/native/find-webclient.html index e4aeece..5c4f0ab 100644 --- a/native/find-webclient.html +++ b/native/find-webclient.html @@ -2,7 +2,7 @@ - Jellyfin Media Player + Jellyfin diff --git a/native/jmpInputPlugin.js b/native/inputPlugin.js similarity index 98% rename from native/jmpInputPlugin.js rename to native/inputPlugin.js index 883660e..1117e0a 100644 --- a/native/jmpInputPlugin.js +++ b/native/inputPlugin.js @@ -13,11 +13,11 @@ const remap = { "enter": "select", } -class jmpInputPlugin { +class inputPlugin { constructor({ inputManager, playbackManager }) { - this.name = 'JMP Input Plugin'; + this.name = 'Input Plugin'; this.type = 'input'; - this.id = 'jmpInputPlugin'; + this.id = 'inputPlugin'; this.durationCheckInterval = null; this.positionUpdateInterval = null; @@ -356,9 +356,9 @@ class jmpInputPlugin { window.Events.off(window.playbackManager, 'playbackstop'); } - console.log('SystemMedia: jmpInputPlugin destroyed and cleaned up'); + console.log('SystemMedia: inputPlugin destroyed and cleaned up'); } } -window._jmpInputPlugin = jmpInputPlugin; +window._inputPlugin = inputPlugin; })(); diff --git a/native/mpvAudioPlayer.js b/native/mpvAudioPlayer.js index a7f15fc..401b633 100644 --- a/native/mpvAudioPlayer.js +++ b/native/mpvAudioPlayer.js @@ -83,7 +83,7 @@ class mpvAudioPlayer { window.api.player.load(val, { startMilliseconds: ms, autoplay: true }, - {type: 'music', headers: {'User-Agent': 'JellyfinMediaPlayer'}, metadata: options.item, media: {}}, + {type: 'music', headers: {'User-Agent': 'JellyfinDesktop'}, metadata: options.item, media: {}}, '#1', '', resolve); diff --git a/native/mpvVideoPlayer.js b/native/mpvVideoPlayer.js index dbf768d..a346751 100644 --- a/native/mpvVideoPlayer.js +++ b/native/mpvVideoPlayer.js @@ -305,7 +305,7 @@ console.log('[MPV] Audio track index:', this._audioTrackIndexToSetOnPlaying); console.log('[MPV] Subtitle track index:', this._subtitleTrackIndexToSetOnPlaying); - const streamdata = {type: 'video', headers: {'User-Agent': 'JellyfinMediaPlayer'}, metadata: options.item, media: {}}; + const streamdata = {type: 'video', headers: {'User-Agent': 'JellyfinDesktop'}, metadata: options.item, media: {}}; const fps = this.tryGetFramerate(options); if (fps) { streamdata.frameRate = fps; diff --git a/native/nativeshell.js b/native/nativeshell.js index dbad436..24ee735 100644 --- a/native/nativeshell.js +++ b/native/nativeshell.js @@ -18,8 +18,8 @@ const features = [ const getPlugins = () => { const basePlugins = [ - 'jmpInputPlugin', - 'jmpUpdatePlugin' + 'inputPlugin', + 'updatePlugin' ]; const mpvEnabled = jmpInfo.settings?.main?.enableMPV !== false; @@ -167,7 +167,7 @@ function getDeviceProfile() { } return { - 'Name': 'Jellyfin Media Player', + 'Name': 'Jellyfin', 'MaxStaticBitrate': 1000000000, 'MusicStreamingTranscodingBitrate': 1280000, 'TimelineOffsetSeconds': 5, @@ -323,7 +323,7 @@ window.NativeShell.AppHost = { getDeviceProfile, getSyncProfile: getDeviceProfile, appName() { - return "Jellyfin Media Player"; + return "Jellyfin"; }, appVersion() { return navigator.userAgent.split(" ")[1]; @@ -393,7 +393,7 @@ async function showSettingsModal() { const title = document.createElement("h3"); title.className = "formDialogHeaderTitle"; - title.textContent = "Jellyfin Media Player Settings"; + title.textContent = "Client Settings"; modalHeader.appendChild(title); const modalContents = document.createElement("div"); @@ -535,7 +535,7 @@ async function showSettingsModal() { const legendSubHeader = document.createElement("h4"); legendSubHeader.textContent = ( "The server you first connected to is your saved server. " + - "It provides the web client for Jellyfin Media Player in the absence of a bundled one. " + + "It provides the web client for Jellyfin in the absence of a bundled one. " + "You can use this option to change it to another one. This does NOT log you off." ); legend.appendChild(legendSubHeader); diff --git a/native/jmpUpdatePlugin.js b/native/updatePlugin.js similarity index 85% rename from native/jmpUpdatePlugin.js rename to native/updatePlugin.js index 8a6e3d2..21b61fe 100644 --- a/native/jmpUpdatePlugin.js +++ b/native/updatePlugin.js @@ -1,9 +1,9 @@ (function() { -class jmpUpdatePlugin { +class updatePlugin { constructor({ confirm }) { - this.name = 'JMP Update Plugin'; + this.name = 'Update Plugin'; this.type = 'input'; - this.id = 'jmpUpdatePlugin'; + this.id = 'updatePlugin'; (async () => { const api = await window.apiPromise; @@ -12,7 +12,7 @@ class jmpUpdatePlugin { if (url == "SSL_UNAVAILABLE") { // Windows (and possibly macOS) don't ship with SSL in QT...... // So we get to do a full request to GitHub here :( - const checkUrl = "https://github.com/jellyfin/jellyfin-media-player/releases/latest"; + const checkUrl = "https://github.com/jellyfin/jellyfin-desktop/releases/latest"; url = (await fetch(checkUrl)).url; } @@ -30,7 +30,7 @@ class jmpUpdatePlugin { await confirm({ title: "Update Available", - text: `Jellyfin Media Player version ${version} is available.`, + text: `Jellyfin version ${version} is available.`, cancelText: "Ignore", confirmText: "Download" }); @@ -47,5 +47,5 @@ class jmpUpdatePlugin { } } -window._jmpUpdatePlugin = jmpUpdatePlugin; +window._updatePlugin = updatePlugin; })(); diff --git a/resources/meta/com.github.iwalton3.jellyfin-media-player.appdata.xml b/resources/meta/org.jellyfin.JellyfinDesktop.appdata.xml similarity index 96% rename from resources/meta/com.github.iwalton3.jellyfin-media-player.appdata.xml rename to resources/meta/org.jellyfin.JellyfinDesktop.appdata.xml index a2d3ff7..4a08ef3 100644 --- a/resources/meta/com.github.iwalton3.jellyfin-media-player.appdata.xml +++ b/resources/meta/org.jellyfin.JellyfinDesktop.appdata.xml @@ -1,21 +1,21 @@ - com.github.iwalton3.jellyfin-media-player - Jellyfin Media Player + org.jellyfin.JellyfinDesktop + Jellyfin Desktop client for Jellyfin media server Izzie Walton GPL-2.0 CC0-1.0 - https://github.com/iwalton3/jellyfin-media-player - https://github.com/iwalton3/jellyfin-media-player/blob/master/README.md - https://github.com/iwalton3/jellyfin-media-player/issues + https://github.com/jellyfin/jellyfin-desktop + https://github.com/jellyfin/jellyfin-desktop/blob/master/README.md + https://github.com/jellyfin/jellyfin-desktop/issues - jellyfinmediaplayer + jellyfin-desktop - com.github.iwalton3.jellyfin-media-player.desktop + org.jellyfin.JellyfinDesktop.desktop diff --git a/resources/meta/com.github.iwalton3.jellyfin-media-player.desktop b/resources/meta/org.jellyfin.JellyfinDesktop.desktop similarity index 51% rename from resources/meta/com.github.iwalton3.jellyfin-media-player.desktop rename to resources/meta/org.jellyfin.JellyfinDesktop.desktop index b85c8b8..9573d4a 100644 --- a/resources/meta/com.github.iwalton3.jellyfin-media-player.desktop +++ b/resources/meta/org.jellyfin.JellyfinDesktop.desktop @@ -1,28 +1,28 @@ [Desktop Entry] Version=1.0 -Name=Jellyfin Media Player +Name=Jellyfin Comment=Desktop client for Jellyfin -Exec=jellyfinmediaplayer -Icon=com.github.iwalton3.jellyfin-media-player +Exec=jellyfin-desktop +Icon=org.jellyfin.JellyfinDesktop Terminal=false Type=Application -StartupWMClass=com.github.iwalton3.jellyfin-media-player +StartupWMClass=org.jellyfin.JellyfinDesktop Categories=AudioVideo;Video;Player;TV; Actions=DesktopF;DesktopW;TVF;TVW [Desktop Action DesktopF] Name=Desktop [Fullscreen] -Exec=jellyfinmediaplayer --fullscreen --desktop +Exec=jellyfin-desktop --fullscreen --desktop [Desktop Action DesktopW] Name=Desktop [Windowed] -Exec=jellyfinmediaplayer --windowed --desktop +Exec=jellyfin-desktop --windowed --desktop [Desktop Action TVF] Name=TV [Fullscreen] -Exec=jellyfinmediaplayer --fullscreen --tv +Exec=jellyfin-desktop --fullscreen --tv [Desktop Action TVW] Name=TV [Windowed] -Exec=jellyfinmediaplayer --windowed --tv +Exec=jellyfin-desktop --windowed --tv diff --git a/resources/settings/settings_description.json b/resources/settings/settings_description.json index f488511..644fb01 100644 --- a/resources/settings/settings_description.json +++ b/resources/settings/settings_description.json @@ -53,7 +53,7 @@ { "value": "alwaysOnTop", "display_name": "Always on Top", - "help": "Keeps Jellyfin Media Player on top of other windows.", + "help": "Keeps Jellyfin on top of other windows.", "default": false }, { @@ -166,7 +166,7 @@ { "value": "enableMPV", "display_name": "Enable MPV Player", - "help": "Enables MPV player for video and audio playback. When disabled, Jellyfin Media Player will fall back to the browser's built-in HTML5 player. This setting requires an application restart to take effect.\n\nNote: Disabling MPV will lose advanced features like audio passthrough, hardware decoding options, and codec-specific settings.", + "help": "Enables MPV player for video and audio playback. When disabled, Jellyfin will fall back to the browser's built-in HTML5 player. This setting requires an application restart to take effect.\n\nNote: Disabling MPV will lose advanced features like audio passthrough, hardware decoding options, and codec-specific settings.", "default": true }, { @@ -661,7 +661,7 @@ "values": [ { "value": "systemname", - "default": "JellyfinMediaPlayer", + "default": "JellyfinDesktop", "hidden": true, "platforms": [ "oe" ] }, @@ -689,7 +689,7 @@ { "value": "other_conf", "display_name": "Manual MPV Configuration", - "help": "Configuration must be supplied in the same format as mpv.conf, with each configuration on a new line. i.e. \"sub-border-size=5\". Removing all set values of a configuration, from both here and the settings above, will only restore it to default once Jellyfin Media Player has restarted.", + "help": "Configuration must be supplied in the same format as mpv.conf, with each configuration on a new line. i.e. \"sub-border-size=5\". Removing all set values of a configuration, from both here and the settings above, will only restore it to default once Jellyfin has restarted.", "input_type": "textarea", "default": "" } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f1a5524..93782e5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -80,9 +80,9 @@ list(APPEND RESOURCE_FILES qrc_resources.cpp) set(MACOSX_BUNDLE_ICON_FILE jellyfin.icns) set(MACOSX_BUNDLE_SHORT_VERSION_STRING ${VERSION_STRING}) -set(MACOSX_BUNDLE_BUNDLE_NAME "Jellyfin Media Player") +set(MACOSX_BUNDLE_BUNDLE_NAME "Jellyfin") set(MACOSX_BUNDLE_BUNDLE_VERSION ${VERSION_STRING}) -set(MACOSX_BUNDLE_GUI_IDENTIFIER tv.jellyfin.player) +set(MACOSX_BUNDLE_GUI_IDENTIFIER org.jellyfin.JellyfinDesktop) if(APPLE) if(HAVE_UPDATER) diff --git a/src/main.cpp b/src/main.cpp index d584f66..6375c38 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -100,7 +100,7 @@ int main(int argc, char *argv[]) try { QCommandLineParser parser; - parser.setApplicationDescription("Jellyfin Media Player"); + parser.setApplicationDescription("Jellyfin Desktop"); parser.addHelpOption(); parser.addVersionOption(); parser.addOptions({{{"l", "licenses"}, "Show license information"}, @@ -225,8 +225,8 @@ int main(int argc, char *argv[]) { // Use Paths::dataDir() equivalent inline to avoid double nesting QDir d(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)); - d.mkpath(d.absolutePath() + "/" + Names::MainName()); - d.cd(Names::MainName()); + d.mkpath(d.absolutePath() + "/" + Names::DataName()); + d.cd(Names::DataName()); webEngineDataDir = d.absolutePath() + "/QtWebEngine"; } @@ -256,9 +256,9 @@ int main(int argc, char *argv[]) #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) // Set window icon on Linux using system icon theme - app.setWindowIcon(QIcon::fromTheme("com.github.iwalton3.jellyfin-media-player", QIcon(":/images/icon.png"))); + app.setWindowIcon(QIcon::fromTheme("org.jellyfin.JellyfinDesktop", QIcon(":/images/icon.png"))); // Set app id for Wayland compositor window icon - app.setDesktopFileName("com.github.iwalton3.jellyfin-media-player"); + app.setDesktopFileName("org.jellyfin.JellyfinDesktop"); #endif #if defined(Q_OS_MAC) && defined(NDEBUG) diff --git a/src/mpris/MprisComponent.cpp b/src/mpris/MprisComponent.cpp index d6abfe7..6770b99 100644 --- a/src/mpris/MprisComponent.cpp +++ b/src/mpris/MprisComponent.cpp @@ -22,7 +22,7 @@ #include #include -#define MPRIS_SERVICE_NAME "org.mpris.MediaPlayer2.jellyfinmediaplayer" +#define MPRIS_SERVICE_NAME "org.mpris.MediaPlayer2.jellyfin-desktop" #define MPRIS_OBJECT_PATH "/org/mpris/MediaPlayer2" MprisComponent::MprisComponent(QObject* parent) @@ -1017,7 +1017,7 @@ QString MprisComponent::handleAlbumArt(const QString& artUrl) QNetworkRequest request; request.setUrl(QUrl(artUrl)); - request.setRawHeader("User-Agent", "JellyfinMediaPlayer/1.0"); + request.setRawHeader("User-Agent", "JellyfinDesktop/1.0"); m_pendingArtReply = m_albumArtManager->get(request); connect(m_pendingArtReply, &QNetworkReply::finished, this, &MprisComponent::onAlbumArtDownloaded); diff --git a/src/mpris/MprisComponent.h b/src/mpris/MprisComponent.h index 1acc759..48a7160 100644 --- a/src/mpris/MprisComponent.h +++ b/src/mpris/MprisComponent.h @@ -37,8 +37,8 @@ public: bool fullscreen() const; void setFullscreen(bool value); bool hasTrackList() const { return false; } - QString identity() const { return "Jellyfin Media Player"; } - QString desktopEntry() const { return "jellyfinmediaplayer"; } + QString identity() const { return "Jellyfin"; } + QString desktopEntry() const { return "org.jellyfin.JellyfinDesktop"; } QStringList supportedUriSchemes() const { return QStringList(); } QStringList supportedMimeTypes() const { return QStringList(); } diff --git a/src/power/PowerComponentDBus.cpp b/src/power/PowerComponentDBus.cpp index d875e82..fad6f52 100644 --- a/src/power/PowerComponentDBus.cpp +++ b/src/power/PowerComponentDBus.cpp @@ -109,7 +109,7 @@ void PowerComponentDBus::doDisableScreensaver() DBUS_SCREENSAVER_INTERFACE, QDBusConnection::sessionBus()); if (iface.isValid()) { - QDBusReply reply = iface.call("Inhibit", "jellyfinmediaplayer", "playing"); + QDBusReply reply = iface.call("Inhibit", "jellyfin-desktop", "playing"); if (reply.isValid()) { diff --git a/src/power/PowerComponentMac.cpp b/src/power/PowerComponentMac.cpp index 56d3e16..35c2f3c 100644 --- a/src/power/PowerComponentMac.cpp +++ b/src/power/PowerComponentMac.cpp @@ -5,7 +5,7 @@ void PowerComponentMac::doDisableScreensaver() { if (m_assertion == 0) { - CFStringRef why = CFSTR("tv.jellyfin.player"); + CFStringRef why = CFSTR("org.jellyfin.JellyfinDesktop"); IOPMAssertionCreateWithName(kIOPMAssertionTypePreventUserIdleDisplaySleep, kIOPMAssertionLevelOn, why, diff --git a/src/settings/SettingsComponent.cpp b/src/settings/SettingsComponent.cpp index e2a817b..985a0f4 100644 --- a/src/settings/SettingsComponent.cpp +++ b/src/settings/SettingsComponent.cpp @@ -217,14 +217,14 @@ static void writeJson(const QString& filename, const QJsonObject& data, bool pre ///////////////////////////////////////////////////////////////////////////////////////// QVariant SettingsComponent::readPreinitValue(const QString& sectionID, const QString& key) { - QJsonObject json = loadJson(Paths::dataDir("jellyfinmediaplayer.conf")); + QJsonObject json = loadJson(Paths::dataDir("jellyfin-desktop.conf")); return json["sections"].toObject()[sectionID].toObject()[key].toVariant(); } ///////////////////////////////////////////////////////////////////////////////////////// void SettingsComponent::load() { - loadConf(Paths::dataDir("jellyfinmediaplayer.conf"), false); + loadConf(Paths::dataDir("jellyfin-desktop.conf"), false); loadConf(Paths::dataDir("storage.json"), true); } @@ -327,7 +327,7 @@ void SettingsComponent::saveSettings() QJsonObject json; json.insert("sections", QJsonValue::fromVariant(sections)); json.insert("version", m_settingsVersion); - writeJson(Paths::dataDir("jellyfinmediaplayer.conf"), json); + writeJson(Paths::dataDir("jellyfin-desktop.conf"), json); } /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -723,8 +723,8 @@ bool SettingsComponent::componentInitialize() ///////////////////////////////////////////////////////////////////////////////////////// bool SettingsComponent::resetAndSaveOldConfiguration() { - QFile settingsFile(Paths::dataDir("jellyfinmediaplayer.conf")); - return settingsFile.rename(Paths::dataDir("jellyfinmediaplayer.conf.old")); + QFile settingsFile(Paths::dataDir("jellyfin-desktop.conf")); + return settingsFile.rename(Paths::dataDir("jellyfin-desktop.conf.old")); } ///////////////////////////////////////////////////////////////////////////////////////// @@ -768,7 +768,7 @@ QString SettingsComponent::getClientName() QString name; name = SettingsComponent::Get().value(SETTINGS_SECTION_SYSTEM, "systemname").toString(); - if (name.compare("JellyfinMediaPlayer") == 0) { + if (name.compare("JellyfinDesktop") == 0) { name = Utils::ComputerName(); } diff --git a/src/shared/Names.cpp.in b/src/shared/Names.cpp.in index e9fefb2..4cd09ca 100644 --- a/src/shared/Names.cpp.in +++ b/src/shared/Names.cpp.in @@ -9,6 +9,11 @@ QString Names::MainName() return QString("@MAIN_NAME@"); } +QString Names::DataName() +{ + return QString("@DATA_NAME@"); +} + QString Names::HelperName() { return QString("@HELPER_NAME@"); diff --git a/src/shared/Names.h b/src/shared/Names.h index b67eec6..096c2ee 100644 --- a/src/shared/Names.h +++ b/src/shared/Names.h @@ -10,6 +10,7 @@ namespace Names { QString MainName(); + QString DataName(); QString HelperName(); }; diff --git a/src/shared/Paths.cpp b/src/shared/Paths.cpp index a4a0463..a20f7ff 100644 --- a/src/shared/Paths.cpp +++ b/src/shared/Paths.cpp @@ -26,13 +26,13 @@ void Paths::setConfigDir(const QString& path) static QDir writableLocation(QStandardPaths::StandardLocation loc) { QDir d(QStandardPaths::writableLocation(loc)); - if (!d.mkpath(d.absolutePath() + "/" + Names::MainName())) + if (!d.mkpath(d.absolutePath() + "/" + Names::DataName())) { qWarning() << "Failed to create directory:" << d.absolutePath(); return QDir(); } - d.cd(Names::MainName()); + d.cd(Names::DataName()); return d; } @@ -41,8 +41,8 @@ static QDir writableLocation(QStandardPaths::StandardLocation loc) // Try a couple of different strategies to find the file we are looking for. // 1) By looking next to the application binary // 2) By looking in binary/../Resources -// 3) By looking in PREFIX/share/jellyfinmediaplayer -// 4) By looking in PREFIX/jellyfinmediaplayer +// 3) By looking in PREFIX/share/jellyfin-desktop +// 4) By looking in PREFIX/jellyfin-desktop // QString Paths::resourceDir(const QString& file) { @@ -52,8 +52,8 @@ QString Paths::resourceDir(const QString& file) QStringList possibleResourceDirs = { appResourceDir, appResourceDir + "../Resources/", - prefixDir + "/share/jellyfinmediaplayer/", - prefixDir + "/jellyfinmediaplayer/" + prefixDir + "/share/jellyfin-desktop/", + prefixDir + "/jellyfin-desktop/" }; for (const auto& fileStr : possibleResourceDirs) @@ -103,8 +103,8 @@ QString Paths::logDir(const QString& file) { #ifdef Q_OS_MAC QDir ldir = QDir(QStandardPaths::locate(QStandardPaths::HomeLocation, "", QStandardPaths::LocateDirectory)); - ldir.mkpath(ldir.absolutePath() + "/Library/Logs/" + Names::MainName()); - ldir.cd("Library/Logs/" + Names::MainName()); + ldir.mkpath(ldir.absolutePath() + "/Library/Logs/" + Names::DataName()); + ldir.cd("Library/Logs/" + Names::DataName()); return ldir.filePath(file); #else QDir ldir; diff --git a/src/system/SystemComponent.cpp b/src/system/SystemComponent.cpp index 5ab800b..4e4e970 100644 --- a/src/system/SystemComponent.cpp +++ b/src/system/SystemComponent.cpp @@ -424,7 +424,7 @@ void SystemComponent::cancelServerConnectivity() QString SystemComponent::getUserAgent() { QString osVersion = QSysInfo::productVersion(); - QString userAgent = QString("JellyfinMediaPlayer %1 (%2-%3 %4)").arg(Version::GetVersionString()).arg(getPlatformTypeString()).arg(getPlatformArchString()).arg(osVersion); + QString userAgent = QString("JellyfinDesktop %1 (%2-%3 %4)").arg(Version::GetVersionString()).arg(getPlatformTypeString()).arg(getPlatformArchString()).arg(osVersion); return userAgent; } @@ -434,7 +434,7 @@ QString SystemComponent::debugInformation() QString debugInfo; QTextStream stream(&debugInfo); - stream << "Jellyfin Media Player\n"; + stream << "Jellyfin\n"; stream << " Version: " << Version::GetVersionString() << " built: " << Version::GetBuildDate() << "\n"; stream << " Web Client Version: " << Version::GetWebVersion() << "\n"; stream << " Web Client URL: " << SettingsComponent::Get().value(SETTINGS_SECTION_PATH, "startupurl").toString() << "\n"; @@ -445,8 +445,8 @@ QString SystemComponent::debugInformation() stream << "\n"; stream << "Files\n"; - stream << " Log file: " << Paths::logDir(Names::MainName() + ".log") << "\n"; - stream << " Config file: " << Paths::dataDir(Names::MainName() + ".conf") << "\n"; + stream << " Log file: " << Paths::logDir(Names::DataName() + ".log") << "\n"; + stream << " Config file: " << Paths::dataDir(Names::DataName() + ".conf") << "\n"; stream << "\n"; stream << "Network Addresses\n"; @@ -581,8 +581,8 @@ QString SystemComponent::getNativeShellScript() ":/qtwebchannel/qwebchannel.js", ":/web-client/extension/mpvVideoPlayer.js", ":/web-client/extension/mpvAudioPlayer.js", - ":/web-client/extension/jmpInputPlugin.js", - ":/web-client/extension/jmpUpdatePlugin.js", + ":/web-client/extension/inputPlugin.js", + ":/web-client/extension/updatePlugin.js", ":/web-client/extension/connectivityHelper.js", ":/web-client/extension/nativeshell.js" }; @@ -663,7 +663,7 @@ void SystemComponent::checkForUpdates() if (SettingsComponent::Get().value(SETTINGS_SECTION_MAIN, "checkForUpdates").toBool()) { #if !defined(Q_OS_WIN) && !defined(Q_OS_MAC) QNetworkAccessManager *manager = new QNetworkAccessManager(this); - QString checkUrl = "https://github.com/jellyfin/jellyfin-media-player/releases/latest"; + QString checkUrl = "https://github.com/jellyfin/jellyfin-desktop/releases/latest"; QUrl qCheckUrl = QUrl(checkUrl); qDebug() << QString("Checking URL for updates: %1").arg(checkUrl); QNetworkRequest req(qCheckUrl); diff --git a/src/ui/ErrorMessage.cpp b/src/ui/ErrorMessage.cpp index fe29857..09331de 100644 --- a/src/ui/ErrorMessage.cpp +++ b/src/ui/ErrorMessage.cpp @@ -15,7 +15,7 @@ ErrorMessage::ErrorMessage(const QString& errorMessage, bool allowResetConfig) : QMessageBox(nullptr) { setIcon(Critical); - setText("Jellyfin Media Player encountered a fatal error and must exit"); + setText("Jellyfin encountered a fatal error and must exit"); setDetailedText(errorMessage); setInformativeText("Press help below to be redirected to our friendly support forums." \ "Press reset to reset configuration to the default and try again." \ diff --git a/src/ui/webview.qml b/src/ui/webview.qml index a8747c4..9b2a50e 100644 --- a/src/ui/webview.qml +++ b/src/ui/webview.qml @@ -8,7 +8,7 @@ import QtQuick.Controls 6.0 Window { id: mainWindow - title: "Jellyfin Media Player" + title: "Jellyfin" objectName: "mainWindow" width: 1280 height: 720 @@ -234,7 +234,7 @@ Window } profile.persistentCookiesPolicy: WebEngineProfile.AllowPersistentCookies profile.offTheRecord: false - profile.storageName: "JellyfinMediaPlayerStorage" + profile.storageName: "JellyfinDesktopStorage" Component.onCompleted: { diff --git a/src/utils/Log.cpp b/src/utils/Log.cpp index 206153f..3d12706 100644 --- a/src/utils/Log.cpp +++ b/src/utils/Log.cpp @@ -92,7 +92,7 @@ void Log::Init() // Create unique log file for this instance QString logDir = Paths::logDir(""); - QTemporaryFile tempFile(logDir + "/jellyfinmediaplayer-XXXXXX.log"); + QTemporaryFile tempFile(logDir + "/jellyfin-desktop-XXXXXX.log"); tempFile.setAutoRemove(false); if (!tempFile.open()) { @@ -104,11 +104,11 @@ void Log::Init() logFile = new QFile(tempLogPath); logFile->open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate); - qInfo() << "Starting Jellyfin Media Player version:" << qPrintable(Version::GetVersionString()) << "build date:" << qPrintable(Version::GetBuildDate()); + qInfo() << "Starting Jellyfin version:" << qPrintable(Version::GetVersionString()) << "build date:" << qPrintable(Version::GetBuildDate()); qInfo() << qPrintable(QString(" Running on: %1 [%2] arch %3").arg(QSysInfo::prettyProductName()).arg(QSysInfo::kernelVersion()).arg(QSysInfo::currentCpuArchitecture())); qInfo() << " Qt Version:" << QT_VERSION_STR << qPrintable(QString("[%1]").arg(QSysInfo::buildAbi())); - qDebug() << "Logging to " << qPrintable(Paths::logDir(Names::MainName() + ".log")); + qDebug() << "Logging to " << qPrintable(Paths::logDir(Names::DataName() + ".log")); } ///////////////////////////////////////////////////////////////////////////////////////// @@ -123,7 +123,7 @@ void Log::RotateLog() logFile->close(); } - QString baseName = Names::MainName() + ".log"; + QString baseName = Names::DataName() + ".log"; QString mainLog = Paths::logDir(baseName); // Rotate existing logs: .log.2 -> .log.3, .log.1 -> .log.2, .log -> .log.1