mirror of
https://github.com/jellyfin/jellyfin-desktop.git
synced 2026-10-26 16:45:24 +00:00
Rename to Jellyfin Desktop
This commit is contained in:
1 parent
020505abb9
commit
8281ee713d
45 files changed
+232
-223
No files matched your search
@@ -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.
|
||||
|
||||
+24
-24
@@ -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
|
||||
+2
-2
@@ -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/
|
||||
|
||||
+3
-3
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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}")
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
+2
-2
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||

|
||||

|
||||
|
||||
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 <QT_DIR> 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=<QT_DIR> -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.
|
||||
|
||||
|
||||
@@ -38,16 +38,16 @@
|
||||
Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\Package_for_KB2919355~31bf3856ad364e35~x86~~6.3.1.14"
|
||||
Value="CurrentState"
|
||||
/>
|
||||
<bal:Condition Message="Jellyfin Media Player can only be installed on Windows 7 or newer.">
|
||||
<bal:Condition Message="Jellyfin can only be installed on Windows 7 or newer.">
|
||||
<![CDATA[VersionNT >= v6.1]]>
|
||||
</bal:Condition>
|
||||
<!-- Checking for prerequisites for windows versions where they are required -->
|
||||
<!-- We need to check for when ServicePackLevel is not defined as well, with (NOT ServicePackLevel) -->
|
||||
<bal:Condition Message="Jellyfin Media Player on Windows 7 or Windows Server 2008 R2 requires Service Pack 1.">
|
||||
<bal:Condition Message="Jellyfin on Windows 7 or Windows Server 2008 R2 requires Service Pack 1.">
|
||||
<![CDATA[NOT ((VersionNT = v6.1) AND ((NOT ServicePackLevel) OR (ServicePackLevel < 1)))]]>
|
||||
</bal:Condition>
|
||||
<!-- Windows 8 and 2012 have no prerequisites -->
|
||||
<bal:Condition Message="Jellyfin Media Player on Windows 8.1 or Windows Server 2012 R2 requires KB2919355 installed.">
|
||||
<bal:Condition Message="Jellyfin on Windows 8.1 or Windows Server 2012 R2 requires KB2919355 installed.">
|
||||
<![CDATA[NOT ((VersionNT = v6.3) AND (KB2919355_x86 <> 112 AND KB2919355_amd64 <> 112))]]>
|
||||
</bal:Condition>
|
||||
|
||||
@@ -74,15 +74,15 @@
|
||||
|
||||
<Variable Name="autolaunch" bal:Overridable="yes" Type="numeric" Value="0" />
|
||||
|
||||
<Variable Name="InstallFolder" Type="string" Value="[ProgramFiles64Folder]Jellyfin\Jellyfin Media Player" />
|
||||
<Variable Name="InstallFolder" Type="string" Value="[ProgramFiles64Folder]Jellyfin\Jellyfin Desktop" />
|
||||
<!-- Search for InstallFolder in registry and set it to the PreviousInstallFolder -->
|
||||
<util:RegistrySearch
|
||||
Id="PreviousInstallFolderSearch" Root='HKCU' Key='Software\Jellyfin\Jellyfin Media Player' Value='InstallFolder' Variable='PreviousInstallFolder' />
|
||||
Id="PreviousInstallFolderSearch" Root='HKCU' Key='Software\Jellyfin\Jellyfin Desktop' Value='InstallFolder' Variable='PreviousInstallFolder' />
|
||||
<!-- Checks if PreviousInstallFolder exists event if it is defined in the Registry, sets it to InstallFolder if so -->
|
||||
<util:DirectorySearch
|
||||
Path='[PreviousInstallFolder]' Variable='InstallFolder' After='PreviousInstallFolderSearch' Condition='PreviousInstallFolder' />
|
||||
|
||||
<Variable Name="LaunchTarget" Value="[InstallFolder]\JellyfinMediaPlayer.exe"/>
|
||||
<Variable Name="LaunchTarget" Value="[InstallFolder]\Jellyfin Desktop.exe"/>
|
||||
<Variable Name="AddDesktopShortcut" Value="1" />
|
||||
|
||||
<!-- Is Media Feature Pack present? (This should be enough for detecting if we are running on Windows N or not) -->
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Include>
|
||||
<Property Id="ARPCOMMENTS" Value="Jellyfin Media Player for Windows" />
|
||||
<Property Id="ARPCOMMENTS" Value="Jellyfin for Windows" />
|
||||
<Property Id="ARPCONTACT" Value="Jellyfin" />
|
||||
<Property Id="ARPPRODUCTICON" Value="JellyfinMediaPlayerIcon" />
|
||||
<Property Id="ARPPRODUCTICON" Value="JellyfinDesktopIcon" />
|
||||
<Property Id="ARPURLINFOABOUT" Value="$(var.JellyfinWebsiteUrl)" />
|
||||
<Property Id="ARPURLUPDATEINFO" Value="$(var.JellyfinWebsiteUrl)" />
|
||||
<Property Id="ARPHELPLINK" Value="$(var.JellyfinWebsiteUrl)" />
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Include>
|
||||
<?define ProductName=Jellyfin Media Player ?>
|
||||
<?define ProductDesc=Jellyfin Media Player for Windows ?>
|
||||
<?define ProductName=Jellyfin ?>
|
||||
<?define ProductDesc=Jellyfin for Windows ?>
|
||||
<?define ProductUUID=abea6faf-13ea-465f-b2bd-a24b5524e98b ?>
|
||||
<?define JellyfinWebsiteUrl=https://jellyfin.org ?>
|
||||
<?define LanguageCode=1033 ?>
|
||||
<?define LaunchCondition_PerUser=Jellyfin Media Player does not allow per-user installations. Setup will now exit ?>
|
||||
<?define OldWindowsError=Jellyfin Media Player requires at least Windows 7 ?>
|
||||
<?define NewerVersionError=A newer version of Jellyfin Media Server is already installed ?>
|
||||
<?define LaunchCondition_PerUser=Jellyfin does not allow per-user installations. Setup will now exit ?>
|
||||
<?define OldWindowsError=Jellyfin requires at least Windows 7 ?>
|
||||
<?define NewerVersionError=A newer version of Jellyfin is already installed ?>
|
||||
</Include>
|
||||
+15
-15
@@ -10,7 +10,7 @@
|
||||
<!-- https://michielsioen.be/2017-12-02-wix-bootstrapper-customization/ -->
|
||||
|
||||
<?define FirstProductVersion=0.0.0 ?>
|
||||
<?define JellyfinMediaPlayerRegistryKey=Software\Jellyfin\Jellyfin Media Player?>
|
||||
<?define JellyfinDesktopRegistryKey=Software\Jellyfin\Jellyfin Desktop?>
|
||||
|
||||
<!-- To keep things simple, the installer considers each new release
|
||||
a major upgrade, in which everything is uninstalled, then reinstalled
|
||||
@@ -34,7 +34,7 @@
|
||||
</Condition>
|
||||
|
||||
<!-- Icon used in the control panel -->
|
||||
<Icon Id="JellyfinMediaPlayerIcon" SourceFile="jellyfin.ico" />
|
||||
<Icon Id="JellyfinDesktopIcon" SourceFile="jellyfin.ico" />
|
||||
|
||||
<!-- Useful control panel fields -->
|
||||
<?include ControlPanel.wxi ?>
|
||||
@@ -55,7 +55,7 @@
|
||||
</Upgrade>
|
||||
|
||||
<!-- Running program termination -->
|
||||
<util:CloseApplication Id="JellyfinMediaPlayer" CloseMessage="yes" Target="JellyfinMediaPlayer.exe" ElevatedCloseMessage="yes" RebootPrompt="yes" />
|
||||
<util:CloseApplication Id="JellyfinDesktop" CloseMessage="yes" Target="Jellyfin Desktop.exe" ElevatedCloseMessage="yes" RebootPrompt="yes" />
|
||||
|
||||
<!-- Custom action to Install MediaFoundation on Windows Server -->
|
||||
<Property Id="WINDOWSTYPE" Value="Client"/>
|
||||
@@ -63,7 +63,7 @@
|
||||
<CustomAction Id="EnableMediaFoundation" BinaryKey="WixCA" DllEntry="WixQuietExec64" Execute="immediate" Return="ignore" Impersonate="no"/>
|
||||
|
||||
<Property Id="AUTOLAUNCH" Value="0"/>
|
||||
<Property Id="WixShellExecTarget" Value="[INSTALLLOCATION]JellyfinMediaPlayer.exe" />
|
||||
<Property Id="WixShellExecTarget" Value="[INSTALLLOCATION]Jellyfin Desktop.exe" />
|
||||
<CustomAction Id="LaunchPMP" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" Return="ignore"/>
|
||||
|
||||
<InstallExecuteSequence>
|
||||
@@ -87,20 +87,20 @@
|
||||
</Directory>
|
||||
</Directory>
|
||||
<Directory Id="ProgramMenuFolder">
|
||||
<Directory Id="JellyfinStartMenuFolder" Name="Jellyfin Media Player"/>
|
||||
<Directory Id="JellyfinStartMenuFolder" Name="Jellyfin"/>
|
||||
</Directory>
|
||||
<Directory Id="DesktopFolder" Name="Desktop">
|
||||
<Component Id="ApplicationShortcutDesktop" Guid="{b2a1316d-917f-433f-bd87-02ec717c2648}">
|
||||
<Condition>ADDDESKTOPSHORTCUT=1</Condition>
|
||||
<Shortcut Id="ApplicationDesktopShortcut"
|
||||
Name="Jellyfin Media Player"
|
||||
Name="Jellyfin"
|
||||
Description="Desktop client for Jellyfin"
|
||||
Target="[INSTALLLOCATION]JellyfinMediaPlayer.exe"
|
||||
Target="[INSTALLLOCATION]Jellyfin Desktop.exe"
|
||||
WorkingDirectory="INSTALLLOCATION"/>
|
||||
<RemoveFolder Id="DesktopFolder" On="uninstall"/>
|
||||
<RegistryValue
|
||||
Root="HKCU"
|
||||
Key="Software\Jellyfin\Jellyfin Media Player"
|
||||
Key="Software\Jellyfin\Jellyfin Desktop"
|
||||
Name="installed"
|
||||
Type="integer"
|
||||
Value="1"
|
||||
@@ -111,15 +111,15 @@
|
||||
|
||||
<!-- Start Menu shortcut -->
|
||||
<DirectoryRef Id="JellyfinStartMenuFolder">
|
||||
<Component Id="JellyfinMediaPlayerShortcuts" Guid="*">
|
||||
<Component Id="JellyfinDesktopShortcuts" Guid="*">
|
||||
|
||||
<Shortcut Id="JellyfinMediaPlayerExeShortcut"
|
||||
Name="Jellyfin Media Player"
|
||||
Description="Jellyfin Media Player for Windows"
|
||||
Target="[INSTALLLOCATION]JellyfinMediaPlayer.exe"
|
||||
<Shortcut Id="JellyfinDesktopExeShortcut"
|
||||
Name="Jellyfin"
|
||||
Description="Jellyfin for Windows"
|
||||
Target="[INSTALLLOCATION]Jellyfin Desktop.exe"
|
||||
WorkingDirectory="INSTALLLOCATION" />
|
||||
|
||||
<RegistryKey Root="HKCU" Key="Software\Jellyfin\Jellyfin Media Player">
|
||||
<RegistryKey Root="HKCU" Key="Software\Jellyfin\Jellyfin Desktop">
|
||||
<RegistryValue Name="InstallFolder" Type="string" Value="[INSTALLLOCATION]" Action="write" KeyPath="no" />
|
||||
</RegistryKey>
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
<!-- Product Feature -->
|
||||
<Feature Id="ProductFeature" Title="Jellyfin" Level="1">
|
||||
<ComponentGroupRef Id="ProgramFilesComponentGroup" />
|
||||
<ComponentRef Id="JellyfinMediaPlayerShortcuts" />
|
||||
<ComponentRef Id="JellyfinDesktopShortcuts" />
|
||||
<ComponentRef Id="ApplicationShortcutDesktop" />
|
||||
</Feature>
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
start "" "Jellyfin Desktop.exe" "--disable-gpu"
|
||||
@@ -1 +0,0 @@
|
||||
start "" "JellyfinMediaPlayer.exe" "--disable-gpu"
|
||||
Vendored
+4
-4
@@ -1,4 +1,4 @@
|
||||
Source: jellyfin-media-player
|
||||
Source: jellyfin-desktop
|
||||
Section: video
|
||||
Priority: optional
|
||||
Maintainer: Izzie Walton <izzie@iwalton.com>, Joshua Boniface <joshua@boniface.me>
|
||||
@@ -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,
|
||||
|
||||
Vendored
+1
-1
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
+24
-24
@@ -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
|
||||
For a (slightly outdated) list of functions, you can look here: https://github.com/jellyfin/jellyfin-desktop/blob/master/client-api.md
|
||||
@@ -2,7 +2,7 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Jellyfin Media Player</title>
|
||||
<title>Jellyfin</title>
|
||||
<link rel="stylesheet" href="find-webclient.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -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;
|
||||
})();
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
})();
|
||||
+7
-7
@@ -1,21 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<component type="desktop-application">
|
||||
<id>com.github.iwalton3.jellyfin-media-player</id>
|
||||
<name>Jellyfin Media Player</name>
|
||||
<id>org.jellyfin.JellyfinDesktop</id>
|
||||
<name>Jellyfin</name>
|
||||
<summary>Desktop client for Jellyfin media server</summary>
|
||||
<developer id="com.github.iwalton3">
|
||||
<name>Izzie Walton</name>
|
||||
</developer>
|
||||
<project_license>GPL-2.0</project_license>
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<url type="homepage">https://github.com/iwalton3/jellyfin-media-player</url>
|
||||
<url type="help">https://github.com/iwalton3/jellyfin-media-player/blob/master/README.md</url>
|
||||
<url type="bugtracker">https://github.com/iwalton3/jellyfin-media-player/issues</url>
|
||||
<url type="homepage">https://github.com/jellyfin/jellyfin-desktop</url>
|
||||
<url type="help">https://github.com/jellyfin/jellyfin-desktop/blob/master/README.md</url>
|
||||
<url type="bugtracker">https://github.com/jellyfin/jellyfin-desktop/issues</url>
|
||||
|
||||
<provides>
|
||||
<binary>jellyfinmediaplayer</binary>
|
||||
<binary>jellyfin-desktop</binary>
|
||||
</provides>
|
||||
<launchable type="desktop-id">com.github.iwalton3.jellyfin-media-player.desktop</launchable>
|
||||
<launchable type="desktop-id">org.jellyfin.JellyfinDesktop.desktop</launchable>
|
||||
|
||||
<screenshots>
|
||||
<screenshot type="default">
|
||||
+8
-8
@@ -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
|
||||
@@ -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": ""
|
||||
}
|
||||
|
||||
+2
-2
@@ -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)
|
||||
|
||||
+5
-5
@@ -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)
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#include <QUrlQuery>
|
||||
#include <QMimeDatabase>
|
||||
|
||||
#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);
|
||||
|
||||
@@ -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(); }
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ void PowerComponentDBus::doDisableScreensaver()
|
||||
DBUS_SCREENSAVER_INTERFACE, QDBusConnection::sessionBus());
|
||||
if (iface.isValid())
|
||||
{
|
||||
QDBusReply<unsigned int> reply = iface.call("Inhibit", "jellyfinmediaplayer", "playing");
|
||||
QDBusReply<unsigned int> reply = iface.call("Inhibit", "jellyfin-desktop", "playing");
|
||||
|
||||
if (reply.isValid())
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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@");
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
namespace Names
|
||||
{
|
||||
QString MainName();
|
||||
QString DataName();
|
||||
QString HelperName();
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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." \
|
||||
|
||||
+2
-2
@@ -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:
|
||||
{
|
||||
|
||||
+4
-4
@@ -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
|
||||
|
||||
Reference in new issue
Block a user