├── .clang-format ├── .clang-tidy ├── .github └── issue_template.md ├── .gitignore ├── CMakeLists.txt ├── CMakeModules ├── AppleConfiguration.cmake ├── BreakpadSymbols.cmake ├── CPackConfiguration.cmake ├── CPackGeneratedConfig.cmake.in ├── ClangTidy.cmake ├── CompilerFlags.cmake ├── CompleteBundle.cmake ├── CompleteBundleOSX.cmake.in ├── CompleteBundleWin.cmake.in ├── DependencyConfiguration.cmake ├── FetchDependencies.cmake ├── FindBreakpad.cmake ├── FindCEC.cmake ├── FindDL.cmake ├── FindGLES2.cmake ├── FindICU.cmake ├── FindIconv.cmake ├── FindMPV.cmake ├── FindSDL2.cmake ├── GetGitRevisionDescription.cmake ├── GetGitRevisionDescription.cmake.in ├── InputConfiguration.cmake ├── InstallLinuxDesktopFile.cmake ├── LinuxConfiguration.cmake ├── NameConfiguration.cmake ├── PlayerConfiguration.cmake ├── QtConfiguration.cmake ├── VersionConfiguration.cmake ├── WebClient.cmake ├── Win32Configuration.cmake ├── WindowsInstaller.cmake └── utils.cmake ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── bundle ├── osx │ ├── Info.plist.in │ ├── Konvergo.entitlements │ ├── Plex.icns │ └── WebEngine.entitlements └── win │ ├── Bundle.wxs │ ├── ControlPanel.wxi │ ├── Global.wxi │ ├── HyperlinkTheme.wxl │ ├── PMP.wxs │ ├── Plex.ico │ ├── PlexExitDialog.wxs │ ├── PlexMediaPlayer-NoChromiumGPU.bat │ ├── Version.wxi.in │ ├── iconres.rc │ ├── plex-chevron-85.png │ ├── pms64x64.png │ ├── pmstheme.xml │ ├── progress-bar.png │ └── qt.conf ├── external ├── CMakeLists.txt ├── HIDRemote │ ├── CMakeLists.txt │ ├── HIDRemote.h │ ├── HIDRemote.m │ ├── LICENSE.txt │ └── README.txt ├── SPMediaKeyTap │ ├── CMakeLists.txt │ ├── LICENSE │ ├── README.md │ ├── SPInvocationGrabbing │ │ ├── NSObject+SPInvocationGrabbing.h │ │ └── NSObject+SPInvocationGrabbing.m │ ├── SPMediaKeyTap.h │ └── SPMediaKeyTap.m ├── letsmove │ ├── CMakeLists.txt │ ├── PFMoveApplication.h │ └── PFMoveApplication.m ├── plistparser │ ├── CMakeLists.txt │ ├── LICENSE │ ├── plistparser.cpp │ ├── plistparser.h │ ├── plistserializer.cpp │ └── plistserializer.h ├── qhttp │ ├── 3rdparty │ │ └── http-parser │ │ │ ├── .mailmap │ │ │ ├── .travis.yml │ │ │ ├── AUTHORS │ │ │ ├── LICENSE-MIT │ │ │ ├── README.md │ │ │ ├── bench.c │ │ │ ├── contrib │ │ │ ├── parsertrace.c │ │ │ └── url_parser.c │ │ │ ├── http_parser.c │ │ │ ├── http_parser.gyp │ │ │ ├── http_parser.h │ │ │ └── test.c │ ├── CMakeLists.txt │ ├── LICENSE │ ├── README.md │ └── src │ │ ├── private │ │ ├── qhttpbase.hpp │ │ ├── qhttpclient_private.hpp │ │ ├── qhttpclientrequest_private.hpp │ │ ├── qhttpclientresponse_private.hpp │ │ ├── qhttpserver_private.hpp │ │ ├── qhttpserverconnection_private.hpp │ │ ├── qhttpserverrequest_private.hpp │ │ └── qhttpserverresponse_private.hpp │ │ ├── qhttpabstracts.cpp │ │ ├── qhttpabstracts.hpp │ │ ├── qhttpclient.cpp │ │ ├── qhttpclient.hpp │ │ ├── qhttpclientrequest.cpp │ │ ├── qhttpclientrequest.hpp │ │ ├── qhttpclientresponse.cpp │ │ ├── qhttpclientresponse.hpp │ │ ├── qhttpfwd.hpp │ │ ├── qhttpserver.cpp │ │ ├── qhttpserver.hpp │ │ ├── qhttpserverconnection.cpp │ │ ├── qhttpserverconnection.hpp │ │ ├── qhttpserverrequest.cpp │ │ ├── qhttpserverrequest.hpp │ │ ├── qhttpserverresponse.cpp │ │ └── qhttpserverresponse.hpp └── qslog │ ├── CMakeLists.txt │ ├── LICENSE.txt │ ├── QsLog.cpp │ ├── QsLog.h │ ├── QsLogDest.cpp │ ├── QsLogDest.h │ ├── QsLogDestConsole.cpp │ ├── QsLogDestConsole.h │ ├── QsLogDestFile.cpp │ ├── QsLogDestFile.h │ ├── QsLogDestFunctor.cpp │ ├── QsLogDestFunctor.h │ ├── QsLogDisableForThisFile.h │ ├── QsLogLevel.h │ └── QsLogReadme.txt ├── qt-patches ├── qt5-5.7.0.patch ├── qt5-5.9.0.patch └── qt5-5.9.5.patch ├── release-notes ├── 1.0.0.txt ├── 1.0.1.txt ├── 1.0.2.txt ├── 1.0.3.txt ├── 1.0.4.txt ├── 1.0.5.txt ├── 1.0.6.txt ├── 1.1.0.txt ├── 1.1.2.txt ├── 1.1.3.txt ├── 1.1.4.txt ├── 1.1.5.txt ├── 1.1.6.txt ├── 1.1.7.txt ├── 1.2.0.txt ├── 1.2.1.txt ├── 1.2.2.txt ├── 1.2.3.txt ├── 1.2.4.txt ├── 1.2.5.txt ├── 1.3.0.txt ├── 1.3.1.txt ├── 1.3.10.txt ├── 1.3.11.txt ├── 1.3.12.txt ├── 1.3.2.txt ├── 1.3.3.txt ├── 1.3.4.txt ├── 1.3.5.txt ├── 1.3.6.txt ├── 1.3.7.txt ├── 1.3.9.txt ├── 2.0.0.txt ├── 2.0.1.txt ├── 2.0.2.txt ├── 2.0.3.txt ├── 2.0.4.txt ├── 2.0.5.txt ├── 2.0.6.txt ├── 2.0.7.txt ├── 2.0.8.txt ├── 2.0.9.txt ├── 2.1.0.txt ├── 2.1.1.txt ├── 2.10.0.txt ├── 2.11.0.txt ├── 2.11.1.txt ├── 2.12.0.txt ├── 2.12.1.txt ├── 2.13.0.txt ├── 2.14.0.txt ├── 2.15.0.txt ├── 2.16.0.txt ├── 2.17.0.txt ├── 2.18.0.txt ├── 2.19.0.txt ├── 2.19.1.txt ├── 2.2.0.txt ├── 2.2.1.txt ├── 2.20.0.txt ├── 2.20.1.txt ├── 2.21.0.txt ├── 2.22.0.txt ├── 2.22.1.txt ├── 2.23.0.txt ├── 2.24.0.txt ├── 2.25.0.txt ├── 2.26.0.txt ├── 2.27.0.txt ├── 2.28.0.txt ├── 2.29.0.txt ├── 2.29.1.txt ├── 2.3.0.txt ├── 2.30.0.txt ├── 2.30.1.txt ├── 2.31.0.txt ├── 2.32.0.txt ├── 2.33.0.txt ├── 2.34.0.txt ├── 2.35.0.txt ├── 2.35.1.txt ├── 2.36.0.txt ├── 2.37.0.txt ├── 2.38.0.txt ├── 2.39.0.txt ├── 2.4.0.txt ├── 2.4.1.txt ├── 2.40.0.txt ├── 2.41.0.txt ├── 2.42.0.txt ├── 2.43.0.txt ├── 2.44.0.txt ├── 2.45.0.txt ├── 2.46.0.txt ├── 2.47.0.txt ├── 2.48.0.txt ├── 2.49.0.txt ├── 2.5.0.txt ├── 2.50.0.txt ├── 2.51.0.txt ├── 2.52.0.txt ├── 2.52.1.txt ├── 2.52.2.txt ├── 2.53.0.txt ├── 2.54.0.txt ├── 2.55.0.txt ├── 2.56.0.txt ├── 2.57.0.txt ├── 2.58.0.txt ├── 2.6.0.txt ├── 2.7.0.txt ├── 2.8.0.txt ├── 2.9.0.txt └── next │ ├── 789.txt │ └── example.txt ├── resources ├── desktop │ └── plexmediaplayer.desktop ├── images │ ├── icon.png │ ├── icon.svg │ ├── splash.png │ └── splash.svg ├── inputmaps │ ├── LIRC.json │ ├── apple-media-keys.json │ ├── apple-remote.json │ ├── cec.json │ ├── dualshock4-xbox-emulate.json │ ├── dualshock4.json │ ├── keyboard.json │ ├── roku.json │ ├── wiimote.json │ ├── xbox-controller-mac.json │ └── xbox-controller-windows.json ├── misc │ └── licenses.txt ├── settings │ └── settings_description.json ├── sounds │ ├── Back.wav │ ├── Click.wav │ ├── Cursor.wav │ ├── Notify.wav │ ├── Out.wav │ └── Shutter.wav └── testmedia │ ├── README.txt │ ├── high_1920x1080.h264 │ ├── high_4096x2160.h264 │ └── high_4096x2304.h264 ├── scripts ├── WindowsSign.cmd ├── build-konvergo-qt.sh ├── build-qt-resources.py ├── build-windows.bat ├── compress.py ├── dump-syms.sh ├── dump_qt_symbols_osx.sh ├── fetch-binaries.py ├── fix-install-names.py ├── install-dylibs.py └── make_mpv_lib.bat └── src ├── CMakeLists.txt ├── KonvergoPCH.h ├── breakpad ├── BreakPad.h ├── BreakPadDummy.cpp ├── BreakPadLinux.cpp ├── BreakPadOSX.cpp ├── BreakPadWin32.cpp ├── CMakeLists.txt └── CrashDumps.h ├── core ├── CMakeLists.txt ├── ComponentManager.cpp ├── ComponentManager.h ├── Globals.cpp ├── Globals.h ├── SignalManager.cpp ├── SignalManager.h ├── Version.cpp.in └── Version.h ├── display ├── CMakeLists.txt ├── DisplayComponent.cpp ├── DisplayComponent.h ├── DisplayManager.cpp ├── DisplayManager.h ├── dummy │ ├── CMakeLists.txt │ ├── DisplayManagerDummy.cpp │ └── DisplayManagerDummy.h ├── osx │ ├── CMakeLists.txt │ ├── DisplayManagerOSX.cpp │ └── DisplayManagerOSX.h ├── rpi │ ├── CMakeLists.txt │ ├── DisplayManagerRPI.cpp │ └── DisplayManagerRPI.h ├── win │ ├── CMakeLists.txt │ ├── DisplayManagerWin.cpp │ └── DisplayManagerWin.h └── x11 │ ├── CMakeLists.txt │ ├── DisplayManagerX11.cpp │ └── DisplayManagerX11.h ├── input ├── CMakeLists.txt ├── InputCEC.cpp ├── InputCEC.h ├── InputComponent.cpp ├── InputComponent.h ├── InputKeyboard.h ├── InputLIRC.cpp ├── InputLIRC.h ├── InputMapping.cpp ├── InputMapping.h ├── InputRoku.cpp ├── InputRoku.h ├── InputSDL.cpp ├── InputSDL.h ├── InputSocket.cpp ├── InputSocket.h └── apple │ ├── AppleRemoteDelegate.h │ ├── AppleRemoteDelegate.mm │ ├── CMakeLists.txt │ ├── InputAppleMediaKeys.h │ ├── InputAppleMediaKeys.mm │ ├── InputAppleRemote.h │ └── InputAppleRemote.mm ├── main.cpp ├── player ├── CMakeLists.txt ├── CodecsComponent.cpp ├── CodecsComponent.h ├── OpenGLDetect.cpp ├── OpenGLDetect.h ├── PlayerComponent.cpp ├── PlayerComponent.h ├── PlayerQuickItem.cpp ├── PlayerQuickItem.h └── QtHelper.h ├── plugins └── RPI_jpeg │ ├── QRPIJpegHandler.cpp │ ├── QRPIJpegHandler.h │ ├── QRPIJpegPlugin.cpp │ ├── QRPIJpegPlugin.h │ ├── RPI_jpeg.pro │ ├── brcmjpeg.cpp │ ├── brcmjpeg.h │ └── jpeg.json ├── power ├── CMakeLists.txt ├── PowerComponent.cpp ├── PowerComponent.h ├── PowerComponentDBus.cpp ├── PowerComponentDBus.h ├── PowerComponentMac.cpp ├── PowerComponentMac.h ├── PowerComponentWin.cpp ├── PowerComponentWin.h ├── PowerComponentX11.cpp └── PowerComponentX11.h ├── remote ├── CMakeLists.txt ├── GDMManager.cpp ├── GDMManager.h ├── RemoteComponent.cpp ├── RemoteComponent.h ├── RemoteSubscriber.cpp └── RemoteSubscriber.h ├── server ├── CMakeLists.txt ├── HTTPServer.cpp └── HTTPServer.h ├── settings ├── AudioSettingsController.cpp ├── AudioSettingsController.h ├── CMakeLists.txt ├── SettingsComponent.cpp ├── SettingsComponent.h ├── SettingsSection.cpp ├── SettingsSection.h └── SettingsValue.h ├── shared ├── CMakeLists.txt ├── LocalJsonClient.cpp ├── LocalJsonClient.h ├── LocalJsonServer.cpp ├── LocalJsonServer.h ├── Names.cpp.in ├── Names.h ├── Paths.cpp ├── Paths.h └── UniqueApplication.h ├── system ├── CMakeLists.txt ├── OEUpdateManager.cpp ├── OEUpdateManager.h ├── SystemComponent.cpp ├── SystemComponent.h ├── UpdateManager.cpp ├── UpdateManager.h ├── UpdateManagerWin32.cpp ├── UpdateManagerWin32.h ├── UpdaterComponent.cpp ├── UpdaterComponent.h └── openelec │ ├── CMakeLists.txt │ ├── OESystemComponent.cpp │ ├── OESystemComponent.h │ ├── SystemdManager.cpp │ └── SystemdManager.h ├── tools ├── CMakeLists.txt ├── helper │ ├── CMakeLists.txt │ ├── CrashUploader.cpp │ ├── CrashUploader.h │ ├── HelperMain.cpp │ ├── HelperSettings.h │ ├── HelperSocket.cpp │ └── HelperSocket.h └── socket-client │ ├── CMakeLists.txt │ └── SocketClient.cpp ├── ui ├── CMakeLists.txt ├── ErrorMessage.cpp ├── ErrorMessage.h ├── EventFilter.cpp ├── EventFilter.h ├── KonvergoWindow.cpp ├── KonvergoWindow.h └── webview.qml └── utils ├── CMakeLists.txt ├── CachedRegexMatcher.cpp ├── CachedRegexMatcher.h ├── HelperLaunchd.cpp ├── HelperLaunchd.h ├── HelperLauncher.cpp ├── HelperLauncher.h ├── Log.cpp ├── Log.h ├── PlatformUtils.cpp ├── PlatformUtils.h ├── Utils.cpp ├── Utils.h ├── osx ├── CMakeLists.txt ├── OSXUtils.h └── OSXUtils.mm └── win ├── CMakeLists.txt ├── WinUtils.cpp └── WinUtils.h /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | # BasedOnStyle: LLVM 3 | AccessModifierOffset: -2 4 | ConstructorInitializerIndentWidth: 2 5 | AlignEscapedNewlinesLeft: false 6 | AlignTrailingComments: true 7 | AllowAllParametersOfDeclarationOnNextLine: true 8 | AllowShortIfStatementsOnASingleLine: false 9 | AllowShortLoopsOnASingleLine: false 10 | AlwaysBreakTemplateDeclarations: false 11 | AlwaysBreakBeforeMultilineStrings: false 12 | BreakBeforeBinaryOperators: false 13 | BreakBeforeTernaryOperators: false 14 | BreakConstructorInitializersBeforeComma: false 15 | BinPackParameters: true 16 | ColumnLimit: 100 17 | ConstructorInitializerAllOnOneLineOrOnePerLine: true 18 | DerivePointerBinding: false 19 | ExperimentalAutoDetectBinPacking: false 20 | IndentCaseLabels: true 21 | MaxEmptyLinesToKeep: 1 22 | NamespaceIndentation: All 23 | ObjCSpaceBeforeProtocolList: true 24 | PenaltyBreakBeforeFirstCallParameter: 19 25 | PenaltyBreakComment: 60 26 | PenaltyBreakString: 1000 27 | PenaltyBreakFirstLessLess: 120 28 | PenaltyExcessCharacter: 1000000 29 | PenaltyReturnTypeOnItsOwnLine: 1000 30 | PointerBindsToType: true 31 | SpacesBeforeTrailingComments: 1 32 | Cpp11BracedListStyle: false 33 | Standard: Cpp03 34 | IndentWidth: 2 35 | TabWidth: 2 36 | UseTab: Never 37 | BreakBeforeBraces: Allman 38 | IndentFunctionDeclarationAfterType: false 39 | SpacesInParentheses: false 40 | SpacesInAngles: false 41 | SpaceInEmptyParentheses: false 42 | SpacesInCStyleCastParentheses: false 43 | SpaceAfterControlStatementKeyword: true 44 | SpaceBeforeAssignmentOperators: true 45 | ContinuationIndentWidth: 0 46 | ... 47 | 48 | -------------------------------------------------------------------------------- /.clang-tidy: -------------------------------------------------------------------------------- 1 | # Don't use the C++ new,delete check since it doesn't work with Qt. 2 | # Enable a bunch of modernization checks 3 | Checks: 'clang-analyzer-alpha.*,-clang-analyzer-alpha.deadcode.UnreachableCode,-clang-analyzer-core.CallAndMessage,-clang-analyzer-cplusplus.NewDeleteLeaks,misc-forward-declaration-namespace,modernize-use-auto,modernize-use-nullptr,modernize-redudant-void-arg,readability-inconsistent-declaration-parameter-name,readability-simplify-boolean-expr,readability-container-size-empty,performance-for-range-copy,readability-identifier-naming,modernize-use-override,google-explicit-constructor' 4 | CheckOptions: 5 | - key: readability-identifier-naming.ClassCase 6 | value: CamelCase 7 | - key: readability-identifier-naming.EnumCase 8 | value: CamelCase 9 | - key: readability-identifier-naming.FunctionCase 10 | value: lowerCase 11 | - key: readability-identifier-naming.GlobalFunction 12 | value: CamelCase 13 | - key: readability-identifier-naming.GlobalVarableCase 14 | value: camelBack 15 | - key: readability-identifier-naming.GlobalVariablePrefix 16 | value: g_ 17 | - key: readability-identifier-naming.VariableCase 18 | value: camelBack 19 | - key: readability-identifier-naming.PrivateMemberPrefix 20 | value: m_ 21 | - key: readability-identifier-naming.ProtectedMemberPrefix 22 | value: m_ 23 | - key: readability-identifier-naming.MemberCase 24 | value: camelBack 25 | - key: readability-identifier-naming.Method 26 | value: camelBack 27 | - key: readability-identifier-naming.ClassMethod 28 | value: CamelCase 29 | -------------------------------------------------------------------------------- /.github/issue_template.md: -------------------------------------------------------------------------------- 1 | 18 | 19 | ### Test environment 20 | 21 | **PMS Version:** 22 | **PMP Version:** 23 | **Platform (Windows/macOS/Embedded RPi/Embedded Intel):** 24 | 25 | ### Steps to reproduce 26 | 1. 27 | 28 | ### Current behavior 29 | 1. 30 | 31 | ### Expected behavior 32 | 1. 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pro.user* 2 | dependencies/* 3 | CMakeLists.txt.user 4 | CMakeLists.txt.user.* 5 | build/* 6 | .idea 7 | .install_pkg 8 | .openelec-unpack 9 | QtCreatorDeployment.txt 10 | vagrant/ubuntu-x86_64/.vagrant 11 | vagrant/windows-x86_64/.vagrant 12 | build-* 13 | cmake-build-* 14 | *.pyc 15 | conaninfo.txt 16 | conanbuildinfo.* 17 | web-client 18 | .DS_Store 19 | .*libreelec* 20 | toolchain.cmake 21 | .sublime-settings 22 | -------------------------------------------------------------------------------- /CMakeModules/AppleConfiguration.cmake: -------------------------------------------------------------------------------- 1 | find_library(FOUNDATION Foundation) 2 | find_library(APPKIT AppKit) 3 | find_library(IOKIT IOKit) 4 | find_library(COCOA Cocoa) 5 | find_Library(CARBON Carbon) 6 | find_library(SECURITY Security) 7 | find_library(MEDIAPLAYER MediaPlayer) 8 | 9 | set(OS_LIBS ${FOUNDATION} ${APPKIT} ${IOKIT} ${COCOA} ${SECURITY} ${CARBON} spmediakeytap hidremote plistparser letsmove) 10 | set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -weak_framework MediaPlayer") 11 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 12 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mmacosx-version-min=10.9 -fno-omit-frame-pointer") 13 | set(WARNINGS "-Wall") 14 | 15 | set(HAVE_UPDATER 1) 16 | find_program(UPDATER_PATH updater HINTS ${CMAKE_FIND_ROOT_PATH}/update_installer/ NO_DEFAULT_PATH) 17 | if(${UPDATER_PATH} MATCHES "UPDATER_PATH-NOTFOUND") 18 | set(HAVE_UPDATER 0) 19 | message(STATUS "will build without the updater") 20 | endif(${UPDATER_PATH} MATCHES "UPDATER_PATH-NOTFOUND") 21 | 22 | set(INSTALL_BIN_DIR .) 23 | set(INSTALL_RESOURCE_DIR Resources) 24 | -------------------------------------------------------------------------------- /CMakeModules/CPackConfiguration.cmake: -------------------------------------------------------------------------------- 1 | set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Plex Media Player") 2 | set(CPACK_PACKAGE_VENDOR "Plex") 3 | set(CPACK_PACKAGE_NAME "Plex Media Player") 4 | set(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR}) 5 | set(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR}) 6 | set(CPACK_PACKAGE_VERSION_PATCH ${VERSION_NANO}) 7 | 8 | if(APPLE) 9 | set(CPACK_SYSTEM_NAME "macosx-x86_64") 10 | elseif(WIN32) 11 | include(FetchDependencies) 12 | set(CPACK_SYSTEM_NAME ${ARCHSTR}) 13 | else() 14 | set(CPACK_SYSTEM_NAME linux-${CMAKE_HOST_SYSTEM_PROCESSOR}) 15 | endif() 16 | set(CPACK_PACKAGE_FILE_NAME "PlexMediaPlayer-${VERSION_STRING}-${CPACK_SYSTEM_NAME}") 17 | set(CPACK_SOURCE_PACKAGE_FILE_NAME "PlexMediaPlayer-${VERSION_STRING}-src") 18 | 19 | set(CPACK_PACKAGE_INSTALL_DIRECTORY "PlexMediaPlayer") 20 | set(CPACK_STRIP_FILES 1) 21 | 22 | 23 | if(WIN32) 24 | include(WindowsInstaller) 25 | install(FILES ${CMAKE_SOURCE_DIR}/bundle/win/qt.conf DESTINATION .) 26 | else(WIN32) 27 | set(CPACK_GENERATOR "ZIP") 28 | if(APPLE) 29 | set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0) 30 | endif(APPLE) 31 | configure_file(${CMAKE_SOURCE_DIR}/CMakeModules/CPackGeneratedConfig.cmake.in ${CMAKE_BINARY_DIR}/CPackGeneratedConfig.cmake) 32 | set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_BINARY_DIR}/CPackGeneratedConfig.cmake) 33 | 34 | include(CPack) 35 | cpack_add_component(Core DISPLAY_NAME "Plex Media Player" DESCRIPTION "Plex Media Player (Core Application)" REQUIRED) 36 | endif(WIN32) -------------------------------------------------------------------------------- /CMakeModules/CPackGeneratedConfig.cmake.in: -------------------------------------------------------------------------------- 1 | if(CPACK_GENERATOR MATCHES "IFW") 2 | set(CMAKE_EXECUTABLE_SUFFIX ".exe") 3 | endif() 4 | -------------------------------------------------------------------------------- /CMakeModules/CompilerFlags.cmake: -------------------------------------------------------------------------------- 1 | # MSVC goes totally bananas if we pass it -Wall 2 | if(NOT MSVC) 3 | enable_if_supported(COMPILER_FLAGS "-Wall") 4 | endif() 5 | 6 | enable_if_supported(COMPILER_FLAGS "-Wshorten-64-to-32") 7 | enable_if_supported(COMPILER_FLAGS "-fno-omit-frame-pointer") 8 | enable_if_supported(COMPILER_FLAGS "-mmacosx-version-min=10.9") 9 | enable_if_supported(COMPILER_FLAGS "/Oy-") 10 | enable_if_supported(COMPILER_FLAGS "-fvisibility-inlines-hidden") 11 | 12 | # Flags only for external libs 13 | enable_if_supported(COMPILER_FLAGS_THIRD_PARTY "-Wno-shorten-64-to-32") 14 | enable_if_supported(COMPILER_FLAGS_THIRD_PARTY "/wd4244") 15 | enable_if_supported(COMPILER_FLAGS_THIRD_PARTY "/wd4267") 16 | 17 | enable_if_links(LINK_FLAGS_RELEASE "-flto") 18 | enable_if_links(LINK_FLAGS "-fuse-ld=gold") 19 | 20 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILER_FLAGS}") 21 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMPILER_FLAGS}") 22 | set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LINK_FLAGS}") 23 | 24 | # release link flags 25 | set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${LINK_FLAGS_RELEASE}") 26 | set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} ${LINK_FLAGS_RELEASE}") 27 | -------------------------------------------------------------------------------- /CMakeModules/CompleteBundle.cmake: -------------------------------------------------------------------------------- 1 | if(APPLE) 2 | set(SCRIPT CompleteBundleOSX) 3 | elseif(WIN32) 4 | set(SCRIPT CompleteBundleWin) 5 | endif(APPLE) 6 | 7 | option(CODE_SIGN "code sign the app" OFF) 8 | if(CODE_SIGN) 9 | set(DO_SIGN 1) 10 | else(CODE_SIGN) 11 | set(DO_SIGN 0) 12 | endif(CODE_SIGN) 13 | 14 | if(ENABLE_ANGLE_DEP) 15 | set(DO_ENABLE_ANGLE_DEP 1) 16 | else() 17 | set(DO_ENABLE_ANGLE_DEP 0) 18 | endif() 19 | 20 | if(SCRIPT) 21 | configure_file(${CMAKE_SOURCE_DIR}/CMakeModules/${SCRIPT}.cmake.in ${SCRIPT}.cmake @ONLY) 22 | install(SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT}.cmake) 23 | endif(SCRIPT) 24 | -------------------------------------------------------------------------------- /CMakeModules/CompleteBundleWin.cmake.in: -------------------------------------------------------------------------------- 1 | set(PROJECT_SOURCE_DIR @PROJECT_SOURCE_DIR@) 2 | 3 | execute_process(COMMAND @QTROOT@/bin/windeployqt.exe --verbose 9 --qmldir @SOURCE_ROOT@/src/ui ${CMAKE_INSTALL_PREFIX}/PlexMediaPlayer.exe) 4 | 5 | # on windows windeployqt doesnt install non qt libraries, let cmake do that 6 | include(BundleUtilities) 7 | 8 | foreach(d @CMAKE_FIND_ROOT_PATH@) 9 | list(APPEND SEARCHDIRS ${d}/bin) 10 | list(APPEND SEARCHDIRS ${d}/lib) 11 | endforeach() 12 | 13 | get_filename_component(CEC_DIR @CEC_LIBRARY@ DIRECTORY) 14 | list(APPEND SEARCHDIRS ${CEC_DIR}) 15 | 16 | fixup_bundle("${CMAKE_INSTALL_PREFIX}/PlexMediaPlayer.exe" "" "${SEARCHDIRS}") 17 | #install(PROGRAMS ${VCREDIST_DIR}/vc_redist_2015_x64.exe DESTINATION .) 18 | 19 | if(@DO_ENABLE_ANGLE_DEP@) 20 | message(STATUS "Deploying separate ANGLE deps") 21 | file(INSTALL @DEPENDENCY_CACHE_DIR@/libEGL.dll @DEPENDENCY_CACHE_DIR@/libGLESv2.dll @DEPENDENCY_CACHE_DIR@/d3dcompiler_47.dll DESTINATION ${CMAKE_INSTALL_PREFIX}) 22 | else() 23 | message(STATUS "Not using separate ANGLE deps") 24 | endif() 25 | 26 | if(@DO_SIGN@) 27 | file(GLOB_RECURSE EXES ${CMAKE_INSTALL_PREFIX}/*.exe ${CMAKE_INSTALL_PREFIX}/*.dll) 28 | set(ENV{errorlevel} 1) 29 | foreach(e ${EXES}) 30 | message("-- Signing: ${PROJECT_SOURCE_DIR}/scripts/WindowsSign.cmd ${e}") 31 | execute_process(COMMAND ${PROJECT_SOURCE_DIR}/scripts/WindowsSign.cmd "${e}" RESULT_VARIABLE RES) 32 | endforeach() 33 | endif() 34 | -------------------------------------------------------------------------------- /CMakeModules/FindCEC.cmake: -------------------------------------------------------------------------------- 1 | if(CEC_INCLUDE_DIR) 2 | # Already in cache, be silent 3 | set(CEC_FIND_QUIETLY TRUE) 4 | endif(CEC_INCLUDE_DIR) 5 | 6 | if (PKG_CONFIG_FOUND) 7 | pkg_check_modules(_CEC QUIET libcec>=2.0) 8 | endif (PKG_CONFIG_FOUND) 9 | 10 | Find_Path(CEC_INCLUDE_DIR 11 | NAMES cec/cec.h libcec/cec.h 12 | PATHS /usr/include usr/local/include 13 | PATH_SUFFIXES cec cec/cec libcec cec/include 14 | HINTS ${_CEC_INCLUDEDIR} 15 | ) 16 | 17 | Find_Library(CEC_LIBRARY 18 | NAMES cec 19 | PATHS /usr/lib usr/local/lib 20 | PATH_SUFFIXES cec libcec cec/lib libcec/lib 21 | HINTS ${_CEC_LIBDIR} 22 | ) 23 | 24 | include(FindPackageHandleStandardArgs) 25 | find_package_handle_standard_args(CEC DEFAULT_MSG CEC_LIBRARY CEC_INCLUDE_DIR) 26 | 27 | 28 | -------------------------------------------------------------------------------- /CMakeModules/FindDL.cmake: -------------------------------------------------------------------------------- 1 | # - find where dlopen and friends are located. 2 | # DL_FOUND - system has dynamic linking interface available 3 | # DL_INCLUDE_DIR - where dlfcn.h is located. 4 | # DL_LIBRARIES - libraries needed to use dlopen 5 | 6 | include(CheckFunctionExists) 7 | 8 | find_path(DL_INCLUDE_DIR NAMES dlfcn.h) 9 | find_library(DL_LIBRARIES NAMES dl) 10 | if(DL_LIBRARIES) 11 | set(DL_FOUND TRUE) 12 | else(DL_LIBRARIES) 13 | check_function_exists(dlopen DL_FOUND) 14 | # If dlopen can be found without linking in dl then dlopen is part 15 | # of libc, so don't need to link extra libs. 16 | set(DL_LIBRARIES "") 17 | endif(DL_LIBRARIES) 18 | -------------------------------------------------------------------------------- /CMakeModules/FindIconv.cmake: -------------------------------------------------------------------------------- 1 | # - Try to find Iconv 2 | # Once done this will define 3 | # 4 | # ICONV_FOUND - system has Iconv 5 | # ICONV_INCLUDE_DIR - the Iconv include directory 6 | # ICONV_LIBRARIES - Link these to use Iconv 7 | # ICONV_SECOND_ARGUMENT_IS_CONST - the second argument for iconv() is const 8 | # 9 | include(CheckCXXSourceCompiles) 10 | 11 | IF (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) 12 | # Already in cache, be silent 13 | SET(ICONV_FIND_QUIETLY TRUE) 14 | ENDIF (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) 15 | 16 | FIND_PATH(ICONV_INCLUDE_DIR iconv.h) 17 | 18 | FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2 c) 19 | 20 | IF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) 21 | SET(ICONV_FOUND TRUE) 22 | ENDIF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) 23 | 24 | set(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR}) 25 | set(CMAKE_REQUIRED_LIBRARIES ${ICONV_LIBRARIES}) 26 | IF(ICONV_FOUND) 27 | check_cxx_source_compiles(" 28 | #include 29 | int main(){ 30 | iconv_t conv = 0; 31 | const char* in = 0; 32 | size_t ilen = 0; 33 | char* out = 0; 34 | size_t olen = 0; 35 | iconv(conv, &in, &ilen, &out, &olen); 36 | return 0; 37 | } 38 | " ICONV_SECOND_ARGUMENT_IS_CONST ) 39 | ENDIF(ICONV_FOUND) 40 | set(CMAKE_REQUIRED_INCLUDES) 41 | set(CMAKE_REQUIRED_LIBRARIES) 42 | 43 | IF(ICONV_FOUND) 44 | IF(NOT ICONV_FIND_QUIETLY) 45 | MESSAGE(STATUS "Found Iconv: ${ICONV_LIBRARIES}") 46 | ENDIF(NOT ICONV_FIND_QUIETLY) 47 | ELSE(ICONV_FOUND) 48 | IF(Iconv_FIND_REQUIRED) 49 | MESSAGE(FATAL_ERROR "Could not find Iconv") 50 | ENDIF(Iconv_FIND_REQUIRED) 51 | ENDIF(ICONV_FOUND) 52 | 53 | MARK_AS_ADVANCED( 54 | ICONV_INCLUDE_DIR 55 | ICONV_LIBRARIES 56 | ICONV_SECOND_ARGUMENT_IS_CONST 57 | ) 58 | -------------------------------------------------------------------------------- /CMakeModules/GetGitRevisionDescription.cmake.in: -------------------------------------------------------------------------------- 1 | # 2 | # Internal file for GetGitRevisionDescription.cmake 3 | # 4 | # Requires CMake 2.6 or newer (uses the 'function' command) 5 | # 6 | # Original Author: 7 | # 2009-2010 Ryan Pavlik 8 | # http://academic.cleardefinition.com 9 | # Iowa State University HCI Graduate Program/VRAC 10 | # 11 | # Copyright Iowa State University 2009-2010. 12 | # Distributed under the Boost Software License, Version 1.0. 13 | # (See accompanying file LICENSE_1_0.txt or copy at 14 | # http://www.boost.org/LICENSE_1_0.txt) 15 | 16 | set(HEAD_HASH) 17 | 18 | file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) 19 | 20 | string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) 21 | if(HEAD_CONTENTS MATCHES "ref") 22 | # named branch 23 | string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") 24 | if(EXISTS "@GIT_DIR@/${HEAD_REF}") 25 | configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) 26 | elseif(EXISTS "@GIT_DIR@/logs/${HEAD_REF}") 27 | configure_file("@GIT_DIR@/logs/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) 28 | set(HEAD_HASH "${HEAD_REF}") 29 | endif() 30 | else() 31 | # detached HEAD 32 | configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) 33 | endif() 34 | 35 | if(NOT HEAD_HASH) 36 | file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) 37 | string(STRIP "${HEAD_HASH}" HEAD_HASH) 38 | endif() 39 | -------------------------------------------------------------------------------- /CMakeModules/InstallLinuxDesktopFile.cmake: -------------------------------------------------------------------------------- 1 | install (FILES ${CMAKE_SOURCE_DIR}/resources/desktop/plexmediaplayer.desktop DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/applications) 2 | install (FILES ${CMAKE_SOURCE_DIR}/resources/images/icon.svg DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/icons/hicolor/scalable/apps RENAME plexmediaplayer.svg) 3 | -------------------------------------------------------------------------------- /CMakeModules/LinuxConfiguration.cmake: -------------------------------------------------------------------------------- 1 | include(GNUInstallDirs) 2 | 3 | find_package(X11) 4 | if(X11_FOUND AND X11_Xrandr_FOUND) 5 | include_directories(X11_X11_INCLUDE_PATH X11_Xrandr_INCLUDE_PATH) 6 | set(X11XRANDR_FOUND 1) 7 | add_definitions(-DUSE_X11XRANDR) 8 | else() 9 | set(X11_LIBRARIES "") 10 | set(X11_Xrandr_LIB "") 11 | endif() 12 | 13 | if(LINUX_X11POWER) 14 | add_definitions(-DUSE_X11POWER) 15 | Message(STATUS "Enabling X11/XDG screensaver management") 16 | else() 17 | add_definitions(-DLINUX_DBUS=1) 18 | Message(STATUS "Enabling D-Bus power management") 19 | endif() 20 | 21 | set(INSTALL_BIN_DIR ${CMAKE_INSTALL_BINDIR}) 22 | set(INSTALL_RESOURCE_DIR ${CMAKE_INSTALL_DATADIR}/plexmediaplayer) 23 | 24 | if(NOT OPENELEC) 25 | include(InstallLinuxDesktopFile) 26 | endif() 27 | -------------------------------------------------------------------------------- /CMakeModules/NameConfiguration.cmake: -------------------------------------------------------------------------------- 1 | set(HELPER_TARGET PMPHelper) 2 | set(MAIN_TARGET PlexMediaPlayer) 3 | 4 | # Name of the output binary, defaults are only used on Linux 5 | set(HELPER_NAME pmphelper) 6 | set(MAIN_NAME plexmediaplayer) 7 | 8 | if(APPLE) 9 | set(HELPER_NAME "PMP Helper") 10 | set(MAIN_NAME "Plex Media Player") 11 | elseif(WIN32) 12 | set(HELPER_NAME "PMPHelper") 13 | set(MAIN_NAME "PlexMediaPlayer") 14 | endif(APPLE) 15 | 16 | configure_file(src/shared/Names.cpp.in src/shared/Names.cpp @ONLY) -------------------------------------------------------------------------------- /CMakeModules/PlayerConfiguration.cmake: -------------------------------------------------------------------------------- 1 | # We want OpenGL or OpenGLES2 2 | find_package(OpenGL) 3 | if(NOT OPENGL_FOUND) 4 | find_package(GLES2) 5 | if(NOT GLES2_FOUND) 6 | message(FATAL_ERROR "OpenGL or GLES2 is required") 7 | else(NOT GLES2_FOUND) 8 | set(OPENGL_LIBS ${GLES2_LIBRARY}) 9 | endif(NOT GLES2_FOUND) 10 | else(NOT OPENGL_FOUND) 11 | set(OPENGL_LIBS ${OPENGL_gl_LIBRARY}) 12 | endif(NOT OPENGL_FOUND) 13 | 14 | find_package(MPV REQUIRED) 15 | include_directories(${MPV_INCLUDE_DIR}) 16 | -------------------------------------------------------------------------------- /CMakeModules/VersionConfiguration.cmake: -------------------------------------------------------------------------------- 1 | # Get the current date. 2 | # include(WebClientVariables) 3 | string(TIMESTAMP CURRENT_DATE "%Y-%m-%d") 4 | 5 | # Get git revision version 6 | include(GetGitRevisionDescription) 7 | get_git_head_revision(REFSPEC FULL_GIT_REVISION) 8 | if(FULL_GIT_REVISION STREQUAL "GITDIR-NOTFOUND") 9 | set(GIT_REVISION "git") 10 | else(FULL_GIT_REVISION STREQUAL "GITDIR-NOTFOUND") 11 | string(SUBSTRING ${FULL_GIT_REVISION} 0 8 GIT_REVISION) 12 | endif(FULL_GIT_REVISION STREQUAL "GITDIR-NOTFOUND") 13 | 14 | # Get the build number if available 15 | if(DEFINED ENV{BUILD_NUMBER}) 16 | set(VERSION_BUILD "$ENV{BUILD_NUMBER}") 17 | set(VERSION_BUILD_NR "$ENV{BUILD_NUMBER}") 18 | else() 19 | set(VERSION_BUILD "dev") 20 | set(VERSION_BUILD_NR "0") 21 | endif() 22 | 23 | set(VERSION_MAJOR 2) 24 | set(VERSION_MINOR 58) 25 | set(VERSION_NANO 0) 26 | 27 | option(UPGRADE_DEBUG "" OFF) 28 | 29 | if(UPGRADE_DEBUG) 30 | set(VERSION_STRING "1.0.4.177-195ef65f") 31 | set(VERSION_STRING_SHORT "1.0.4") 32 | set(CANONICAL_VERSION_STRING "1.0.4-195ef65f") 33 | else() 34 | set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_NANO}.${VERSION_BUILD}-${GIT_REVISION}") 35 | set(VERSION_STRING_SHORT "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_NANO}") 36 | set(CANONICAL_VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_NANO}-${GIT_REVISION}") 37 | endif() 38 | 39 | configure_file(src/core/Version.cpp.in src/core/Version.cpp) 40 | -------------------------------------------------------------------------------- /CMakeModules/WebClient.cmake: -------------------------------------------------------------------------------- 1 | include(FetchDependencies) 2 | 3 | option(WEB_CLIENT_TV_OLD "" OFF) 4 | option(WEB_CLIENT_DISABLE_DESKTOP "" OFF) 5 | 6 | # This is the line to edit when you bump the web-client. 7 | set(WEB_CLIENT_BUILD_ID 183-045db5be50e175) 8 | 9 | get_content_of_url( 10 | URL "https://artifacts.plex.tv/web-client-pmp/${WEB_CLIENT_BUILD_ID}/buildid.cmake" 11 | CONTENT_VAR BUILDIDS 12 | FILENAME "buildid-${WEB_CLIENT_BUILD_ID}.cmake" 13 | ) 14 | 15 | if(WEB_CLIENT_TV_OLD) 16 | set(TV_VERSION ${TVOLD_VERSION}) 17 | endif() 18 | 19 | message(STATUS ${BUILDIDS}) 20 | 21 | include("${DEPENDENCY_CACHE_DIR}/buildid-${WEB_CLIENT_BUILD_ID}.cmake") 22 | 23 | if(NOT WEB_CLIENT_DISABLE_DESKTOP) 24 | download_deps("web-client-desktop" 25 | BUILD_NUMBER ${WEB_CLIENT_BUILD_ID} 26 | VARIANT ${DESKTOP_VERSION} 27 | NO_HASH_FILE 28 | ARCHSTR "universal" 29 | BASE_URL "https://artifacts.plex.tv/web-client-pmp/${WEB_CLIENT_BUILD_ID}" 30 | DIRECTORY WEB_DESKTOP_DIR 31 | ) 32 | endif() 33 | 34 | download_deps("web-client-tv" 35 | BUILD_NUMBER ${WEB_CLIENT_BUILD_ID} 36 | VARIANT ${TV_VERSION} 37 | NO_HASH_FILE 38 | ARCHSTR "universal" 39 | BASE_URL "https://artifacts.plex.tv/web-client-pmp/${WEB_CLIENT_BUILD_ID}" 40 | DIRECTORY WEB_TV_DIR 41 | ) 42 | -------------------------------------------------------------------------------- /CMakeModules/Win32Configuration.cmake: -------------------------------------------------------------------------------- 1 | set(INSTALL_BIN_DIR .) 2 | set(INSTALL_RESOURCE_DIR .) 3 | set(HAVE_UPDATER 1) 4 | 5 | find_library(WINMM winmm) 6 | find_library(IMMLIB imm32) 7 | find_library(VERLIB version) 8 | find_library(DWMLIB dwmapi) 9 | find_library(AVRTLIB avrt) 10 | find_library(POWRPROFLIB PowrProf) 11 | set(OS_LIBS ${WINMM} ${IMMLIB} ${VERLIB} ${DWMLIB} ${AVRTLIB} ${POWRPROFLIB}) 12 | -------------------------------------------------------------------------------- /bundle/osx/Info.plist.in: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${MACOSX_BUNDLE_EXECUTABLE_NAME} 9 | CFBundleGetInfoString 10 | ${MACOSX_BUNDLE_INFO_STRING} 11 | CFBundleIconFile 12 | ${MACOSX_BUNDLE_ICON_FILE} 13 | CFBundleIdentifier 14 | ${MACOSX_BUNDLE_GUI_IDENTIFIER} 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleLongVersionString 18 | ${MACOSX_BUNDLE_LONG_VERSION_STRING} 19 | CFBundleName 20 | ${MACOSX_BUNDLE_BUNDLE_NAME} 21 | CFBundlePackageType 22 | APPL 23 | CFBundleShortVersionString 24 | ${MACOSX_BUNDLE_SHORT_VERSION_STRING} 25 | CFBundleSignature 26 | ???? 27 | CFBundleVersion 28 | ${MACOSX_BUNDLE_BUNDLE_VERSION} 29 | CSResourcesFileMapped 30 | 31 | NSHumanReadableCopyright 32 | ${MACOSX_BUNDLE_COPYRIGHT} 33 | NSPrincipalClass 34 | NSApplication 35 | NSHighResolutionCapable 36 | True 37 | NSRequiresAquaSystemAppearance 38 | False 39 | LSMinimumSystemVersion 40 | 10.9 41 | NSSupportsAutomaticGraphicsSwitching 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /bundle/osx/Konvergo.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.network.client 8 | 9 | com.apple.security.network.server 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /bundle/osx/Plex.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plexinc/plex-media-player/d9685b274934855a707a37613cae09108ee9db6c/bundle/osx/Plex.icns -------------------------------------------------------------------------------- /bundle/osx/WebEngine.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.inherit 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /bundle/win/ControlPanel.wxi: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /bundle/win/Global.wxi: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /bundle/win/Plex.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plexinc/plex-media-player/d9685b274934855a707a37613cae09108ee9db6c/bundle/win/Plex.ico -------------------------------------------------------------------------------- /bundle/win/PlexMediaPlayer-NoChromiumGPU.bat: -------------------------------------------------------------------------------- 1 | start "" "PlexMediaPlayer.exe" "--disable-gpu" -------------------------------------------------------------------------------- /bundle/win/Version.wxi.in: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /bundle/win/iconres.rc: -------------------------------------------------------------------------------- 1 | IDI_ICON ICON Plex.ico -------------------------------------------------------------------------------- /bundle/win/plex-chevron-85.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plexinc/plex-media-player/d9685b274934855a707a37613cae09108ee9db6c/bundle/win/plex-chevron-85.png -------------------------------------------------------------------------------- /bundle/win/pms64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plexinc/plex-media-player/d9685b274934855a707a37613cae09108ee9db6c/bundle/win/pms64x64.png -------------------------------------------------------------------------------- /bundle/win/progress-bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plexinc/plex-media-player/d9685b274934855a707a37613cae09108ee9db6c/bundle/win/progress-bar.png -------------------------------------------------------------------------------- /bundle/win/qt.conf: -------------------------------------------------------------------------------- 1 | [Paths] 2 | Prefix = . 3 | Plugins = . 4 | Binaries = . 5 | Imports = . 6 | Qml2Imports = . 7 | LibraryExecutables = . 8 | -------------------------------------------------------------------------------- /external/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILER_FLAGS_THIRD_PARTY}") 2 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMPILER_FLAGS_THIRD_PARTY}") 3 | 4 | add_subdirectory(qslog) 5 | add_subdirectory(qhttp) 6 | 7 | if(APPLE) 8 | add_subdirectory(plistparser) 9 | add_subdirectory(SPMediaKeyTap) 10 | add_subdirectory(HIDRemote) 11 | add_subdirectory(letsmove) 12 | endif(APPLE) 13 | -------------------------------------------------------------------------------- /external/HIDRemote/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set_source_files_properties(HIDRemote.m PROPERTIES COMPILE_FLAGS -fno-objc-arc) 2 | add_library(hidremote STATIC HIDRemote.m HIDRemote.h) 3 | -------------------------------------------------------------------------------- /external/HIDRemote/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2007-2011 IOSPIRIT GmbH (http://www.iospirit.com/) 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, 5 | are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright notice, this list 8 | of conditions and the following disclaimer. 9 | 10 | * Redistributions in binary form must reproduce the above copyright notice, this 11 | list of conditions and the following disclaimer in the documentation and/or other 12 | materials provided with the distribution. 13 | 14 | * Neither the name of IOSPIRIT GmbH nor the names of its contributors may be used to 15 | endorse or promote products derived from this software without specific prior 16 | written permission. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 19 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 21 | SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 22 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 23 | TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 | BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 26 | ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 27 | DAMAGE. -------------------------------------------------------------------------------- /external/HIDRemote/README.txt: -------------------------------------------------------------------------------- 1 | README FOR HIDREMOTE SDK 2 | ======================== 3 | 4 | HIDRemote 5 | --------- 6 | Contains the HIDRemote class. For the latest version of this class and 7 | documentation, please visit http://www.iospirit.com/developers/hidremote/ 8 | 9 | 10 | Example 11 | ------- 12 | Contains a sample application showing the use of HIDRemote class. 13 | 14 | 15 | Documentation 16 | ------------- 17 | Please visit http://www.iospirit.com/developers/hidremote/ for a guide 18 | and documentation. 19 | -------------------------------------------------------------------------------- /external/SPMediaKeyTap/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | 2 | # SPMediaKeyTap uses some deprecated methods, no need to fix that right now, so let's supress the warnings. 3 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations") 4 | 5 | add_library(spmediakeytap STATIC 6 | SPMediaKeyTap.h SPMediaKeyTap.m 7 | SPInvocationGrabbing/NSObject+SPInvocationGrabbing.m 8 | SPInvocationGrabbing/NSObject+SPInvocationGrabbing.h 9 | ) -------------------------------------------------------------------------------- /external/SPMediaKeyTap/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2011, Joachim Bengtsson 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 5 | 6 | * Neither the name of the organization nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 7 | 8 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 9 | -------------------------------------------------------------------------------- /external/SPMediaKeyTap/SPInvocationGrabbing/NSObject+SPInvocationGrabbing.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface SPInvocationGrabber : NSObject { 4 | id _object; 5 | NSInvocation *_invocation; 6 | int frameCount; 7 | char **frameStrings; 8 | BOOL backgroundAfterForward; 9 | BOOL onMainAfterForward; 10 | BOOL waitUntilDone; 11 | } 12 | -(id)initWithObject:(id)obj; 13 | -(id)initWithObject:(id)obj stacktraceSaving:(BOOL)saveStack; 14 | @property (readonly, retain, nonatomic) id object; 15 | @property (readonly, retain, nonatomic) NSInvocation *invocation; 16 | @property BOOL backgroundAfterForward; 17 | @property BOOL onMainAfterForward; 18 | @property BOOL waitUntilDone; 19 | -(void)invoke; // will release object and invocation 20 | -(void)printBacktrace; 21 | -(void)saveBacktrace; 22 | @end 23 | 24 | @interface NSObject (SPInvocationGrabbing) 25 | -(id)grab; 26 | -(id)invokeAfter:(NSTimeInterval)delta; 27 | -(id)nextRunloop; 28 | -(id)inBackground; 29 | -(id)onMainAsync:(BOOL)async; 30 | @end 31 | -------------------------------------------------------------------------------- /external/SPMediaKeyTap/SPMediaKeyTap.h: -------------------------------------------------------------------------------- 1 | #include 2 | #import 3 | #import 4 | 5 | // http://overooped.com/post/2593597587/mediakeys 6 | 7 | #define SPSystemDefinedEventMediaKeys 8 8 | 9 | @interface SPMediaKeyTap : NSObject { 10 | EventHandlerRef _app_switching_ref; 11 | EventHandlerRef _app_terminating_ref; 12 | CFMachPortRef _eventPort; 13 | CFRunLoopSourceRef _eventPortSource; 14 | CFRunLoopRef _tapThreadRL; 15 | BOOL _shouldInterceptMediaKeyEvents; 16 | id _delegate; 17 | // The app that is frontmost in this list owns media keys 18 | NSMutableArray *_mediaKeyAppList; 19 | } 20 | + (NSArray*)defaultMediaKeyUserBundleIdentifiers; 21 | 22 | -(id)initWithDelegate:(id)delegate; 23 | 24 | +(BOOL)usesGlobalMediaKeyTap; 25 | -(void)startWatchingMediaKeys; 26 | -(void)stopWatchingMediaKeys; 27 | -(void)handleAndReleaseMediaKeyEvent:(NSEvent *)event; 28 | @end 29 | 30 | @interface NSObject (SPMediaKeyTapDelegate) 31 | -(void)mediaKeyTap:(SPMediaKeyTap*)keyTap receivedMediaKeyEvent:(NSEvent*)event; 32 | @end 33 | 34 | #ifdef __cplusplus 35 | extern "C" { 36 | #endif 37 | 38 | extern NSString *kMediaKeyUsingBundleIdentifiersDefaultsKey; 39 | extern NSString *kIgnoreMediaKeysDefaultsKey; 40 | 41 | #ifdef __cplusplus 42 | } 43 | #endif -------------------------------------------------------------------------------- /external/letsmove/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set_source_files_properties(PFMoveApplication.m PROPERTIES COMPILE_FLAGS -fno-objc-arc) 2 | add_library(letsmove PFMoveApplication.m PFMoveApplication.h) 3 | -------------------------------------------------------------------------------- /external/letsmove/PFMoveApplication.h: -------------------------------------------------------------------------------- 1 | // 2 | // PFMoveApplication.h, version 1.22 3 | // LetsMove 4 | // 5 | // Created by Andy Kim at Potion Factory LLC on 9/17/09 6 | // 7 | // The contents of this file are dedicated to the public domain. 8 | 9 | #ifdef __cplusplus 10 | extern "C" { 11 | #endif 12 | 13 | void PFMoveToApplicationsFolderIfNecessary(void); 14 | 15 | #ifdef __cplusplus 16 | } 17 | #endif 18 | -------------------------------------------------------------------------------- /external/plistparser/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | include_directories(.) 2 | 3 | add_library(plistparser STATIC 4 | plistparser.cpp 5 | plistparser.h 6 | plistserializer.cpp 7 | plistserializer.h 8 | ) 9 | std_target_properties(plistparser) 10 | -------------------------------------------------------------------------------- /external/plistparser/LICENSE: -------------------------------------------------------------------------------- 1 | Gist: this is an MIT license. Act accordingly (basically, do whatever you want). 2 | It would be nice to get an email from you if you use this, but if not that's also cool. 3 | 4 | Copyright (c) 2010 Reilly Watson 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in 14 | all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /external/plistparser/plistparser.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | // Qt includes 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | class PListParser { 11 | public: 12 | static QVariant parsePList(QIODevice *device); 13 | private: 14 | static QVariant parseElement(const QDomElement &e); 15 | static QVariantList parseArrayElement(const QDomElement& node); 16 | static QVariantMap parseDictElement(const QDomElement& element); 17 | }; 18 | 19 | -------------------------------------------------------------------------------- /external/plistparser/plistserializer.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | // Qt includes 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | class PListSerializer { 13 | public: 14 | static QString toPList(const QVariant &variant); 15 | private: 16 | static QDomElement serializeElement(QDomDocument &doc, const QVariant &variant); 17 | static QDomElement serializeMap(QDomDocument &doc, const QVariantMap &map); 18 | static QDomElement serializeList(QDomDocument &doc, const QVariantList &list); 19 | }; 20 | 21 | -------------------------------------------------------------------------------- /external/qhttp/3rdparty/http-parser/.mailmap: -------------------------------------------------------------------------------- 1 | # update AUTHORS with: 2 | # git log --all --reverse --format='%aN <%aE>' | perl -ne 'BEGIN{print "# Authors ordered by first contribution.\n"} print unless $h{$_}; $h{$_} = 1' > AUTHORS 3 | Ryan Dahl 4 | Salman Haq 5 | Simon Zimmermann 6 | Thomas LE ROUX LE ROUX Thomas 7 | Thomas LE ROUX Thomas LE ROUX 8 | Fedor Indutny 9 | -------------------------------------------------------------------------------- /external/qhttp/3rdparty/http-parser/.travis.yml: -------------------------------------------------------------------------------- 1 | language: c 2 | 3 | compiler: 4 | - clang 5 | - gcc 6 | 7 | script: 8 | - "make" 9 | 10 | notifications: 11 | email: false 12 | irc: 13 | - "irc.freenode.net#node-ci" 14 | -------------------------------------------------------------------------------- /external/qhttp/3rdparty/http-parser/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | http_parser.c is based on src/http/ngx_http_parse.c from NGINX copyright 2 | Igor Sysoev. 3 | 4 | Additional changes are licensed under the same terms as NGINX and 5 | copyright Joyent, Inc. and other Node contributors. All rights reserved. 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to 9 | deal in the Software without restriction, including without limitation the 10 | rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 11 | sell copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in 15 | all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 23 | IN THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /external/qhttp/3rdparty/http-parser/contrib/url_parser.c: -------------------------------------------------------------------------------- 1 | #include "http_parser.h" 2 | #include 3 | #include 4 | 5 | void 6 | dump_url (const char *url, const struct http_parser_url *u) 7 | { 8 | unsigned int i; 9 | 10 | printf("\tfield_set: 0x%x, port: %u\n", u->field_set, u->port); 11 | for (i = 0; i < UF_MAX; i++) { 12 | if ((u->field_set & (1 << i)) == 0) { 13 | printf("\tfield_data[%u]: unset\n", i); 14 | continue; 15 | } 16 | 17 | printf("\tfield_data[%u]: off: %u, len: %u, part: %.*s\n", 18 | i, 19 | u->field_data[i].off, 20 | u->field_data[i].len, 21 | u->field_data[i].len, 22 | url + u->field_data[i].off); 23 | } 24 | } 25 | 26 | int main(int argc, char ** argv) { 27 | struct http_parser_url u; 28 | int len, connect, result; 29 | 30 | if (argc != 3) { 31 | printf("Syntax : %s connect|get url\n", argv[0]); 32 | return 1; 33 | } 34 | len = strlen(argv[2]); 35 | connect = strcmp("connect", argv[1]) == 0 ? 1 : 0; 36 | printf("Parsing %s, connect %d\n", argv[2], connect); 37 | 38 | http_parser_url_init(&u); 39 | result = http_parser_parse_url(argv[2], len, connect, &u); 40 | if (result != 0) { 41 | printf("Parse error : %d\n", result); 42 | return result; 43 | } 44 | printf("Parse ok, result : \n"); 45 | dump_url(argv[2], &u); 46 | return 0; 47 | } 48 | -------------------------------------------------------------------------------- /external/qhttp/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | aux_source_directory(src HTTP_SRC) 2 | 3 | include_directories(src 3rdparty) 4 | 5 | add_definitions(-DQHTTP_EXPORT) 6 | 7 | set(CMAKE_AUTOMOC ON) 8 | add_library(qhttp STATIC ${HTTP_SRC} 3rdparty/http-parser/http_parser.c) 9 | target_link_libraries(qhttp) 10 | std_target_properties(qhttp) 11 | -------------------------------------------------------------------------------- /external/qhttp/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Amir Zamani 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | 22 | 23 | -------------------------------------------------------------------------------- /external/qhttp/src/private/qhttpclientrequest_private.hpp: -------------------------------------------------------------------------------- 1 | /** private imeplementation. 2 | * https://github.com/azadkuh/qhttp 3 | * 4 | * @author amir zamani 5 | * @version 2.0.0 6 | * @date 2014-07-11 7 | */ 8 | 9 | #ifndef QHTTPCLIENT_REQUEST_PRIVATE_HPP 10 | #define QHTTPCLIENT_REQUEST_PRIVATE_HPP 11 | /////////////////////////////////////////////////////////////////////////////// 12 | #include "qhttpbase.hpp" 13 | #include "qhttpclient.hpp" 14 | #include "qhttpclientrequest.hpp" 15 | 16 | #include 17 | 18 | /////////////////////////////////////////////////////////////////////////////// 19 | namespace qhttp { 20 | namespace client { 21 | /////////////////////////////////////////////////////////////////////////////// 22 | class QHttpRequestPrivate : public HttpWriter 23 | { 24 | Q_DECLARE_PUBLIC(QHttpRequest) 25 | 26 | public: 27 | explicit QHttpRequestPrivate(QHttpClient* cli, QHttpRequest* q) : q_ptr(q), iclient(cli) { 28 | QHTTP_LINE_DEEPLOG 29 | } 30 | 31 | virtual ~QHttpRequestPrivate() { 32 | QHTTP_LINE_DEEPLOG 33 | } 34 | 35 | void initialize() { 36 | iversion = "1.1"; 37 | 38 | isocket.ibackendType = iclient->backendType(); 39 | isocket.itcpSocket = iclient->tcpSocket(); 40 | isocket.ilocalSocket = iclient->localSocket(); 41 | } 42 | 43 | QByteArray makeTitle(); 44 | 45 | void prepareHeadersToWrite(); 46 | 47 | protected: 48 | QHttpRequest* const q_ptr; 49 | QHttpClient* const iclient; 50 | }; 51 | 52 | /////////////////////////////////////////////////////////////////////////////// 53 | } // namespace client 54 | } // namespace qhttp 55 | /////////////////////////////////////////////////////////////////////////////// 56 | #endif // QHTTPCLIENT_REQUEST_PRIVATE_HPP 57 | -------------------------------------------------------------------------------- /external/qhttp/src/private/qhttpclientresponse_private.hpp: -------------------------------------------------------------------------------- 1 | /** private imeplementation. 2 | * https://github.com/azadkuh/qhttp 3 | * 4 | * @author amir zamani 5 | * @version 2.0.0 6 | * @date 2014-07-11 7 | */ 8 | 9 | #ifndef QHTTPCLIENT_RESPONSE_PRIVATE_HPP 10 | #define QHTTPCLIENT_RESPONSE_PRIVATE_HPP 11 | /////////////////////////////////////////////////////////////////////////////// 12 | 13 | #include "qhttpbase.hpp" 14 | #include "qhttpclient.hpp" 15 | #include "qhttpclientresponse.hpp" 16 | 17 | /////////////////////////////////////////////////////////////////////////////// 18 | namespace qhttp { 19 | namespace client { 20 | /////////////////////////////////////////////////////////////////////////////// 21 | class QHttpResponsePrivate : public HttpReader 22 | { 23 | Q_DECLARE_PUBLIC(QHttpResponse) 24 | QHttpResponse* const q_ptr; 25 | 26 | public: 27 | explicit QHttpResponsePrivate(QHttpClient* cli, QHttpResponse* q) 28 | : q_ptr(q), iclient(cli) { 29 | QHTTP_LINE_DEEPLOG 30 | } 31 | 32 | virtual ~QHttpResponsePrivate() { 33 | QHTTP_LINE_DEEPLOG 34 | } 35 | 36 | void initialize() { 37 | } 38 | 39 | public: 40 | QString icustomStatusMessage; 41 | 42 | protected: 43 | QHttpClient* const iclient; 44 | }; 45 | 46 | /////////////////////////////////////////////////////////////////////////////// 47 | } // namespace client 48 | } // namespace qhttp 49 | /////////////////////////////////////////////////////////////////////////////// 50 | #endif // QHTTPCLIENT_RESPONSE_PRIVATE_HPP 51 | -------------------------------------------------------------------------------- /external/qhttp/src/private/qhttpserverrequest_private.hpp: -------------------------------------------------------------------------------- 1 | /** private imeplementation. 2 | * https://github.com/azadkuh/qhttp 3 | * 4 | * @author amir zamani 5 | * @version 2.0.0 6 | * @date 2014-07-11 7 | */ 8 | 9 | #ifndef QHTTPSERVER_REQUEST_PRIVATE_HPP 10 | #define QHTTPSERVER_REQUEST_PRIVATE_HPP 11 | /////////////////////////////////////////////////////////////////////////////// 12 | 13 | #include "qhttpbase.hpp" 14 | #include "qhttpserverrequest.hpp" 15 | #include "qhttpserverconnection.hpp" 16 | 17 | /////////////////////////////////////////////////////////////////////////////// 18 | namespace qhttp { 19 | namespace server { 20 | /////////////////////////////////////////////////////////////////////////////// 21 | class QHttpRequestPrivate : public HttpReader 22 | { 23 | protected: 24 | Q_DECLARE_PUBLIC(QHttpRequest) 25 | QHttpRequest* const q_ptr; 26 | 27 | public: 28 | explicit QHttpRequestPrivate(QHttpConnection* conn, QHttpRequest* q) : q_ptr(q), iconnection(conn) { 29 | QHTTP_LINE_DEEPLOG 30 | } 31 | 32 | virtual ~QHttpRequestPrivate() { 33 | QHTTP_LINE_DEEPLOG 34 | } 35 | 36 | void initialize() { 37 | } 38 | 39 | public: 40 | QString iremoteAddress; 41 | quint16 iremotePort = 0; 42 | 43 | QHttpConnection* const iconnection = nullptr; 44 | }; 45 | 46 | /////////////////////////////////////////////////////////////////////////////// 47 | } // namespace server 48 | } // namespace qhttp 49 | /////////////////////////////////////////////////////////////////////////////// 50 | #endif // QHTTPSERVER_REQUEST_PRIVATE_HPP 51 | -------------------------------------------------------------------------------- /external/qslog/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(CMAKE_AUTOMOC ON) 2 | aux_source_directory(. QSLOG_SRC) 3 | add_library(qslog STATIC ${QSLOG_SRC}) 4 | std_target_properties(qslog) 5 | -------------------------------------------------------------------------------- /external/qslog/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014, Razvan Petru 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, 5 | are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | * Redistributions in binary form must reproduce the above copyright notice, this 10 | list of conditions and the following disclaimer in the documentation and/or other 11 | materials provided with the distribution. 12 | * The name of the contributors may not be used to endorse or promote products 13 | derived from this software without specific prior written permission. 14 | 15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 16 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 | IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 19 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 20 | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 22 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 23 | OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 24 | OF THE POSSIBILITY OF SUCH DAMAGE. 25 | -------------------------------------------------------------------------------- /external/qslog/QsLogDisableForThisFile.h: -------------------------------------------------------------------------------- 1 | #ifndef QSLOGDISABLEFORTHISFILE_H 2 | #define QSLOGDISABLEFORTHISFILE_H 3 | 4 | #include 5 | // When included AFTER QsLog.h, this file will disable logging in that C++ file. When included 6 | // before, it will lead to compiler warnings or errors about macro redefinitions. 7 | 8 | #undef QLOG_TRACE 9 | #undef QLOG_DEBUG 10 | #undef QLOG_INFO 11 | #undef QLOG_WARN 12 | #undef QLOG_ERROR 13 | #undef QLOG_FATAL 14 | 15 | #define QLOG_TRACE() if (1) {} else qDebug() 16 | #define QLOG_DEBUG() if (1) {} else qDebug() 17 | #define QLOG_INFO() if (1) {} else qDebug() 18 | #define QLOG_WARN() if (1) {} else qDebug() 19 | #define QLOG_ERROR() if (1) {} else qDebug() 20 | #define QLOG_FATAL() if (1) {} else qDebug() 21 | 22 | #endif // QSLOGDISABLEFORTHISFILE_H 23 | -------------------------------------------------------------------------------- /release-notes/1.0.0.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Inital release of Plex Media Player -------------------------------------------------------------------------------- /release-notes/1.0.1.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - New setting to completely disable mouse input 3 | - PageUp / PageDown is now bound to actions that let you advance to the next epsiode in the pre-play screen 4 | - Linux build instructions thanks to Chris Lee 5 | - New Library icons and style 6 | - Xbox Controller support on Windows thanks to Cory Parsons 7 | - InputSDL (controllers) now react on button down instead of button up, 8 | which makes them more responsive thanks to Cory Parsons 9 | 10 | FIXES: 11 | - Windows binary rename to x86_64 to reflect reality 12 | - Windows installer now installs to C:\Program Files by default 13 | - Windows installer will warn when trying to install on Windows versions older than windows 7. 14 | - Debug overlay now have safe overscan margins 15 | - Failed to start web server is no longer treated as a fatal error 16 | - Remove misleading channel count from passthrough audio on debug overlay 17 | - Remove channel selection from "Optical" device type (it's limited to stereo or AC3/DTS passthrough) 18 | - Fix freeze with optical audio out 19 | - Disable hardware decoding by default (creates problems on some GPUs) 20 | - Use exclusive audio setting on OSX by default (related to the USB audio problem, if you want multichannel 21 | PCM on any device on OSX, you need to reset settings or enable exclusive mode under advanced). 22 | - Experimental better alt+tab handling on windows. 23 | - Fixed issue where the remote controllers might not find PMP 24 | - Fixed issue with playback on some channels 25 | - Raspberry fixes for 10bit and high h264 level video content -------------------------------------------------------------------------------- /release-notes/1.0.2.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Allow window sizes smaller than 720p 3 | - Audio drop/duplicate display sync mode. 4 | - Support for manual IP addresses of Plex Media Servers 5 | - Adding setting to disable minimize-on-defocus on Windows. 6 | - Added additions to keyboard mapping to better suite MCE remotes. 7 | - Updated web-client to version 2.4.36 8 | - Windows installer is now 64-bit 9 | - Embedded image support for Legacy NVIDIA systems 10 | 11 | FIXES: 12 | - Fix redrawing errors on high resolution displays 13 | - Fix crash in DisplayManager when connected to multiple displays on multiple GPUs 14 | - Fix 7.1 audio output on Linux 15 | - Windows installer should now work even if you have OpenSSL installed on your 16 | system 17 | - Refresh rate switching fixes on Windows 18 | - Wrap long lines on the left part of the debug overlay. 19 | - Fix infinite loop in InputSDL [Cory Parsons] 20 | - Properly remove AC3 transcoding filter when it is to be disabled. 21 | - Improve InputCEC to not block the main thread. 22 | - Make CEC handle properly longpress 23 | - Improve CEC ability to recover to connection loss. 24 | 25 | KNOWN BUGS: 26 | - Refresh rate auto switching is disabled on the RPI for now due to reliability 27 | problems 28 | -------------------------------------------------------------------------------- /release-notes/1.0.3.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Updated Qt to version 5.6.0 beta. This replaces the Alpha version we had before. Many stability and preformance improvements. 3 | - Windows - Added setting to disable native OpenGL. If you are having display problems or crashes on windows, please try our DirectX mode. 4 | - Added a lot of information to the debug overlay vsync-ratio, audio passthrough, OpenGL version, display status etc. 5 | - List IPv6 host addresses on debug overlay. 6 | - Windows - PMP doesn't minimize when it loses focus anymore. We have reverted back to the old behaviour, that means that if you are 7 | in native OpenGL mode you can't alt-tab out of the window. We are going to try to improve this in the future. 8 | - Added support for host command script that can execute a script. Put a script in the scripts datadir and call 9 | host script script.py from the inputmap. 10 | - Updated seek and step keyboard mapping. 11 | - Added a command to switch display modes. 12 | - Added host commands for suspend, reboot and power off. 13 | - Added setting to disable logging. 14 | 15 | FIXES: 16 | - DisplayManager don't consider 24 and 25 FPS "close" 17 | - DisplayManager better logging and many small fixes on Windows. 18 | - Make sure that directory LaunchAgents is created before writing to it. Prevents stutters on certain OSX setups. 19 | - Exit Helper after 3 minutes if nothing has reconnected. 20 | - Move local sockets to default path. This fixes a startup error on OSX. 21 | - Remove escaped access tokens from logs too. 22 | - Always enable AC3 transcoding if AC3 and stereo channels are selected. 23 | - Crash fixes -------------------------------------------------------------------------------- /release-notes/1.0.4.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Updated web client to 2.5.1 3 | - Request Multimedia Class Schedule Service on Windows 4 | - Windows installer now calls the vcredist installer automatically. 5 | For 1.0.4 this means that you need to re-run the installer and can not 6 | auto-update on windows. 7 | - Windows version is now built with Visual Studio 2015 8 | - We now default to DirectX/ANGLE on Windows, this will hopefully reduce 9 | the number of issues we see with bad / buggy OpenGL drivers. 10 | 11 | FIXES: 12 | - mpv's internal OSD is now switched off, we are replacing this with something 13 | native to PMP in an upcoming version. 14 | - Fixed refresh rate switching on RPI2 15 | - Correctly signal NTSC (23.976hz) refresh rates on RPI2 16 | - Fixed refresh rate switching bugs on Windows (Thanks niko34!) 17 | - Stability fixes to refresh rate switching on OSX 18 | - Always force transcoding if "Optical" device type is selected 19 | - Fix the host:switch command 20 | - Don't switch refresh rate when seeking in transcoding video 21 | - Fix inputs via SDL on OSX 22 | - Fix 7.1 audio setups on OSX -------------------------------------------------------------------------------- /release-notes/1.0.5.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Updated web-client to 2.5.5. 3 | See https://forums.plex.tv/discussion/132141/plex-for-smart-tvs-tivo#latest for details 4 | - Volume control: +/- is now mapped to volume control. 5 | Change your mapping to do increase/decrease_volume 6 | - New Windows installer. We struggled to get the old installer to work fine with 7 | auto-updates. We have now switched to a new framework for generating the installer 8 | and it should work much better with auto-updates. You will need to manually 9 | uninstall and install the latest version to get auto-updates in the future. 10 | 11 | FIXES: 12 | - Filter out the use of Num+ in the keymaps. 13 | - Remove old update packages lying around on disk 14 | - Fix crash if we could not init Direct3D 15 | - Playback fixes on RPI2 16 | - The 7.1 OSX fixes described in 1.0.4 was not actually shipped. Now they are. 17 | - Workaround for a crash related to hardware acceleration on OSX. 18 | - Much improved transcoding decisions on RPI2. 19 | -------------------------------------------------------------------------------- /release-notes/1.0.6.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Search! There is now global search in PMP. It's early days and doesn't work well with keyboards yet. 3 | - Manual check for new version in Main settings (no need to restart to check for new version). 4 | - Embedded version now based on OpenELEC 6.0.3 which supports newer NUC's and the Raspberry PI3 5 | 6 | FIXED: 7 | - The "three dots" indicating buffering could stick around for a very long time. We fixed that. 8 | - MPEG-2 video direct playback is now working correctly 9 | - Switching servers from the dashboard is no longer slow 10 | - A variety of smaller fixes in the web-client 11 | - PMP will now open on the same physcial screen it was on last 12 | - Various resizing issues has been fixed where PMP could be stuck at very small size -------------------------------------------------------------------------------- /release-notes/1.1.0.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Search window now handle keyboard input 3 | - Emulated Roku 3 HTTP Input 4 | - All inputs now handle accelerated auto-repeat 5 | - Support for Plex Home Theater harmony mode 6 | - Clock in both navigation and Player UI 7 | - Cycle zoom options with the Z key 8 | - Support for Power actions on OSX and Windows 9 | - Support for hiding power options by editing the configuration file 10 | - Some keymappings changed, fullscreen is now Ctrl/Cmd+Shift+F since we 11 | we mapped Cmd/Ctrl+F to search 12 | - Toggle for hardware acceleration mode on OS X. If you have older mac mini 13 | hardware you need to select that in the hardware acceleration settings. In 14 | addition the hardware acceleration setting was reset for platforms, so you 15 | will need to re-enable it. 16 | - [Source] PMP now requires a C++14 compatible compiler to build 17 | 18 | FIXED: 19 | - Fixed a issue where the video rendering could be held up by activity on the 20 | main thread. Should remove some of the stuttering under certain cirumstances 21 | - Re-center the UI in the window on non 16:9 aspects 22 | - Fixed an issue where the playback could start paused 23 | -------------------------------------------------------------------------------- /release-notes/1.1.2.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - (Embedded) The embedded distribution is now based on LibreELEC instead of OpenELEC. 3 | Embedded users will have to do a clean install because of this change. AutoUpdate is 4 | disabled. 5 | - (Embedded) Moved to a EFI bootloader - Some BIOS's may need enabling of EFI to find the install media 6 | - (Embedded) Skylake support 7 | - (Embedded) NVIDIA legacy build is deprecated and incorporated into the Generic build 8 | - Improved hardware decoding on Windows and x86 Embedded. 9 | - Qt bumped to version 5.6.1 10 | - There has been some changes how PMP is built on Windows and OSX. We no longer bundle 11 | ffmpeg and mpv with the build system and you need to download and install them yourself. 12 | This only applies to people that build PMP by themself 13 | 14 | FIXED: 15 | - There was an issue where the web-client and the playback engine could get out of state 16 | and cause screensaver to show up during movies or not let you press play/pause. This is 17 | now fixed. 18 | - Non US locales could create problems with playback on Linux 19 | - CEC keyhandling is now back to the default (no auto-repeat) beacuse of many incompatiblities. 20 | If you have a CEC device that gives you press and release events you can enable autorepeat 21 | by editing the configuration file. 22 | - PMP should now install correctly on Windows 10N 23 | - PMP can now be built with Qt 5.7 24 | - PMP should no longer prevent sleeping on OSX / Windows 25 | - Screensaver should be smooth again -------------------------------------------------------------------------------- /release-notes/1.1.3.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Qt bumped to version 5.7.0 3 | - Minor graphics performance improvements on Windows. 4 | - (Embedded) core OS upgraded to LE 7.0.2. 5 | - Change how web-client is bundled. 6 | 7 | FIXED: 8 | - Fix playback failures with 7.1 AAC audio tracks on Windows. 9 | - (Embedded) fix installation on nVidia legacy hardware. 10 | Affected users should do a clean reinstall. 11 | - (Embedded) screen saver was broken after first playback -------------------------------------------------------------------------------- /release-notes/1.1.4.txt: -------------------------------------------------------------------------------- 1 | FIXED: 2 | - changing aspect ratio during playback could halt playback 3 | - fix volume up with "+" on some keyboards (fix as suggested by wayned42 on the forums) 4 | - playback sometimes did not end (for example playing mp3 music on OSX) 5 | - issues with msmpeg and wmv1 codecs on some platforms 6 | - (OSX) Restore app icon 7 | - (Embedded) Fix multichannel PCM output on RPI 8 | - (Embedded) Update to LibreELEC 7.0.2 -------------------------------------------------------------------------------- /release-notes/1.1.5.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Updated web-client to 2.10.0 which includes fixes for Streaming Brain 3 | - Updated LibreELEC to version 7.90.006 4 | - Added always on top setting (thanks to Lukas Pitschl) 5 | - Enabled power options on Embedded x86 (thanks to Jonathan Leroy) 6 | - PMP now selects multi-channel audio over stereo if your system is 7 | configured for more channels than 2 in settings. 8 | - Add audio_delay.25hz setting for tweaking audio delay for 25hz mode 9 | - Add new mode to force 16:9 aspect ratio for 4:3 video 10 | - Audio now does not always force upmixing, e.g. playing stereo even if 7.1 is configured. 11 | To enable this you need to go and reselect the number of channels in audio configuration. 12 | 13 | FIXED: 14 | - (Embedded) Linux kernel updated to 4.7.5 for RPi and x86_64 15 | - (Embedded) Samba fixes 16 | - (Embedded) NVIDIA driver update (legacy to 340.98 and regular to 367.44) 17 | - (Embedded) Update to audio drivers 18 | - Fixed respawning helper process 19 | - Fixed a bug where going into fullscreen could end up in a bad loop 20 | - Subtitle selection for vobsubs should now work 21 | - Crash fixes 22 | 23 | -------------------------------------------------------------------------------- /release-notes/1.1.6.txt: -------------------------------------------------------------------------------- 1 | FIXED: 2 | - (Embedded) Fix video playback crashing on Raspberry PI 3 | - Fix that PMP did not remember the fullscreen state on Windows 4 | -------------------------------------------------------------------------------- /release-notes/1.1.7.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Some audio setting defaults were changed for OSX. Exclusive audio mode is disabled by 3 | default, and the "Channels" option is now set to "auto" by default. 4 | This does not affect existing installations, unless you delete or reset your 5 | PMP config file. 6 | - Removed the "Advanced" checkbox in the audio settings. PMP now behaves the same as if 7 | "Advanced" was always enabled in previous versions. 8 | - Added a new "copy-back" hardware decoding setting. Useful only in specific situations. 9 | 10 | FIXED: 11 | - Fix screensaver behavior. In particular, the screensaver should now also start before 12 | any videos were played. 13 | - (Embedded) Fix performance regression on RPI 14 | - Subtitle selection for vobsubs with multiple stream should now finally work 15 | - Fix rate display mode auto switching with imprecise media FPS values values like 24.999 16 | (and the same for imprecise display refresh rates) 17 | - Fix subtitle/audio stream selection failure under certain circumstances. Requires at least server 18 | version 1.2.1. 19 | - Fixed remote control compatibility with latest version of Plex for iOS 20 | - Progress when playing back mp3's didn't always update 21 | - (Embedded) Remove the version string in the top left corner 22 | -------------------------------------------------------------------------------- /release-notes/1.2.0.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Add a desktop UI mode. 3 | 4 | FIXED: 5 | - Fix mp2-in-mkv decoding on Windows 6 | - Fix enabling audio passthrough on new installations 7 | - Fix music playback failures in some corner cases 8 | - Allow automatic GPU switching on OSX 9 | -------------------------------------------------------------------------------- /release-notes/1.2.1.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Desktop web-client updated to 2.12.5 3 | - TV web-client updated to 2.10.8-9a2e1fb 4 | - Multimedia keys (play, next, prev) now work in desktop mode 5 | - Changes to mode switching. There is now a new setting called "layout" 6 | which can be set to "tv" or "auto". Auto will behave as 1.2.0 and 7 | switch to TV mode when in fullscreen. Set this to TV to "lock" the 8 | tv layout and not automatically switch to desktop mode. This can 9 | also be set by adding --tv to the command line. 10 | - Added new command line switch to control the scale factor of the UI --scale-factor=X 11 | - New subtitle color added 12 | - Automatic subtitle encoding detection on MacOS and Linux 13 | 14 | FIXES: 15 | - (Desktop) Prevent screensaver during video/photo playback 16 | - (Desktop) Respect video quality setting 17 | - Support for HiDPI mode on Linux and Windows. Note that windows 18 | currently only work on integer values. I.e. 1/2/3 not 1.25 or 1.5. 19 | If you want something more granular use the --scale-factor=1.25 command 20 | line switch. 21 | - Various playback related fixes 22 | 23 | -------------------------------------------------------------------------------- /release-notes/1.2.2.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Desktop web-client updated to 2.12.6 3 | - TV web-client updated to 2.10.8-fd540f9 4 | 5 | FIXES: 6 | - (Desktop) Fixed the player fullscreen button in Windows 7 | - (Desktop/TV) Added better companion support for certain devices 8 | - Fixed respect automatically update setting 9 | -------------------------------------------------------------------------------- /release-notes/1.2.3.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Desktop web-client updated to 3.0.1 3 | - TV web-client updated to 2.13.1 4 | - Add an experimental setting to force what screen PMP should be shown on in fullscreen 5 | - Add experimental refreshrate.avoid_25hz_30hz and audio_delay.50hz hidden settings 6 | - (Desktop) Media key support 7 | 8 | FIXES: 9 | - (Desktop) Mark as watched/unwatched on recently played items 10 | - (Desktop) Added exit fullscreen button for Windows users 11 | - (Desktop) Fixed translations 12 | - (OSX) Improvements to cursor hiding 13 | - (OSX) Fix display mode switching and display mode determination not working (by FrostedMint) 14 | - (Windows) Disable HIDPI scaling to avoid certain problems 15 | - Fixes to autorepeat handling (includes fixing accidental pausing when starting playback) 16 | -------------------------------------------------------------------------------- /release-notes/1.2.4.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Updated dependencies 3 | 4 | FIXES: 5 | - HLS issue 6 | - Fullscreen in OpenGL mode on Windows 7 -------------------------------------------------------------------------------- /release-notes/1.2.5.txt: -------------------------------------------------------------------------------- 1 | FIXES: 2 | - (TV) Interface not using full window size -------------------------------------------------------------------------------- /release-notes/1.3.0.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Desktop web-client updated to 3.5.0 3 | - TV web-client updated to 3.3.0 4 | - Updated QT to 5.8 5 | - Updated Dependencies 6 | 7 | FIXES: 8 | - LIRC keyup detection 9 | -------------------------------------------------------------------------------- /release-notes/1.3.1.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Desktop web-client updated to 3.6.0 3 | 4 | FIXES: 5 | - Reverted QT to 5.7 6 | - Crashing on macOS 7 | - AC3/DTS on RPi 8 | -------------------------------------------------------------------------------- /release-notes/1.3.10.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Desktop web-client updated to 3.21.2 3 | - Bumped deps 4 | FIXES: 5 | - Ghosting effect with some files 6 | - (Desktop) Library scanning alerts appearing over video -------------------------------------------------------------------------------- /release-notes/1.3.11.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Desktop web-client updated to 3.26.2 3 | - Bumped deps 4 | FIXES: 5 | - (Desktop) Seeking while transcoding 6 | - (macOS) Fullscreen UI corruption -------------------------------------------------------------------------------- /release-notes/1.3.12.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Desktop web-client updated to 3.29.7 3 | -------------------------------------------------------------------------------- /release-notes/1.3.2.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Desktop web-client updated to 3.7.0 3 | 4 | FIXES: 5 | - Casting to PMP (Desktop) 6 | -------------------------------------------------------------------------------- /release-notes/1.3.3.txt: -------------------------------------------------------------------------------- 1 | FIXES: 2 | - Fix plaxback with optical device type and AC3 enabled 3 | - Fix direct play with some DVR recordings (LATM) 4 | -------------------------------------------------------------------------------- /release-notes/1.3.4.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Desktop web-client updated to 3.9.1 3 | -------------------------------------------------------------------------------- /release-notes/1.3.5.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Desktop web-client updated to 3.14.1 3 | - Updated dependencies (Windows/macOS) 4 | 5 | FIXES: 6 | - Update ANGLE on Windows. This should improve video performance in some cases. 7 | - Errors when opening the player (Desktop) 8 | -------------------------------------------------------------------------------- /release-notes/1.3.6.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Desktop web-client updated to 3.20.6 3 | -------------------------------------------------------------------------------- /release-notes/1.3.7.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - TV web-client updated to 3.13.1 3 | -------------------------------------------------------------------------------- /release-notes/1.3.9.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - TV web-client updated to 3.13.3 3 | -------------------------------------------------------------------------------- /release-notes/2.0.0.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - First alpha build of the PMP v2 media type first UI. 3 | -------------------------------------------------------------------------------- /release-notes/2.0.1.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - UI: Page, modal, and actions metrics events. 3 | 4 | FIXES: 5 | - UI: Pressing UP from a hub in the dashboard focuses matching dashboard type button. 6 | - UI: Hide Go To Show action for shows with hidden seasons. 7 | - UI: Show episode stream information on season/episode preplays. 8 | - UI: Episode posters in On Deck and Continue Watching include S# E# title. 9 | - UI: Avoid phantom mouse clicks on dashboard type page header buttons when the buttons are hidden. 10 | - UI: PrePlay pages should scroll back to the top more dependably. 11 | - UI: Pressing Play All or Shuffle from an Artist PrePlay now plays tracks instead of music videos. 12 | - UI: PrePlay pages correctly show trail action button to play the primary extra. 13 | - UI: Libraries in the dashboard header are sorted. Most recently used are first, followed by own servers, followed by shared. 14 | - UI: Focusing page header dashboard type buttons no longer waits before changing the icon color. 15 | - UI: Navigating UP to the dashboard libraries now causes the header and content to slide down faster. 16 | - UI: Navigating UP into the page header no longer focuses Search by default on interior pages. 17 | - UI: Dashboard library list in the page header now shows all libraries to the left of the selected library. 18 | - UI: Dashboard library list always positions the selected library above the dashboard type button. 19 | - UI: Action icons in PrePlay and browse screens were updated. 20 | - UI: Navigation sound feedback restored for v2 screens. 21 | - UI: Filter, sort and type selections correctly restored in browse screens. 22 | -------------------------------------------------------------------------------- /release-notes/2.0.2.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | 3 | - UI: Home Video libraries are now listed in a Videos list in the header. 4 | - UI: List and grid browsing improvements: 5 | - Fetch metadata ahead of the currently rendered region. 6 | - Images display immediately, no more waiting until scrolling stops. 7 | 8 | FIXED: 9 | 10 | - UI: The Play button is consistently focused when initially rendering preplay pages. 11 | - UI: Navigating down to the descendant list (albums, seasons, episodes) in preplay pages no longer centers the list. 12 | - UI: Playing video in mixed photo and video libraries works correctly. 13 | - UI: Screensaver doesn't display during photo playback. 14 | - UI: Display all of an artist's albums. 15 | - UI: Fixed incorrect ordering of items in the header in our legacy pages. 16 | - UI: Extras display above cast list in preplay pages. 17 | - UI: The header fades out when navigating vertically through a library grid view. You can re-enter the header by going up from the first letter jump bar. 18 | - UI: Many small functionality and UX fixes. 19 | -------------------------------------------------------------------------------- /release-notes/2.0.3.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | 3 | - UI: Increased minimum supported PMS version to 1.5.1. 4 | - UI: Add keyboard shortcut support for: 'h' for home, 'p' for play, and 'w' to mark an item watched an unwatched. 5 | - UI: Add support for Plex Companion mirroring and media playback. 6 | - UI: Some tweaks to the timing of automatically loading the hubs for the selected library or dashboard type. 7 | - UI: The video player OSD will show momentarily when episodes play back-to-back. 8 | 9 | FIXED: 10 | 11 | - Correct QT 5.9 signing issue leading to installations and upgrades leading to operating system warnings. 12 | - Restore synthetic key repeat support and adjust repeat interval. 13 | - UI: Users in a Plex Home no longer run into application behavior preventing user switching. 14 | - UI: Include show/season/episode, artist/album information to episode and music track list items in the correct order. 15 | - UI: Reselecting a dashboard type only requests transient hubs when possible. This will improve dashboard loading performance. 16 | - UI: The first letter jump bar in the grid view is correctly positioned. 17 | - UI: Fixed an issue preventing playlist pages from rendering correctly. 18 | - UI: Display better error message when user has no servers. Previously the application would show an unsightly error screen. 19 | - UI: Fix library sorts not being correctly applied in certain situations. 20 | - UI: Overall dashboard refactor to improve error handling and stability. 21 | - UI: Use episode thumbs in list views. 22 | - UI: Avoid truncation of titles in list views. 23 | -------------------------------------------------------------------------------- /release-notes/2.0.4.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | 3 | - Re-enabled hidpi support on Windows. 4 | - Removed all host scaling responsibilities. The UI handles scaling now. 5 | - UI: Prioritize selection of non-Personal Cloud servers over Personal Cloud server at startup. 6 | - UI: Add `Media Servers` user header menu item. Opens an overlay displaying status for each server and debugging messages when applicable. Allows manually retrying all server connections. 7 | - UI: Avoid continuous play when playing a single episode. 8 | - UI: Initially focus the header when rendering the Home dashboard. 9 | - UI: Removed season count title for show posters in the library. 10 | - UI: Show only two titles for all items in mixed type hub lists. 11 | 12 | FIXED: 13 | 14 | - UI: Avoid an application error encountered when navigating between discovery hubs and prePlay screens in certain patterns. This resulted in infinite loading feedback. 15 | - UI: Fixes `play_pause` key not triggering playback. This improves support for keyboard users pressing `p` or Apple TV remote users. 16 | - UI: Focus on the page header when entering an empty library. 17 | - UI: Several minor UX improvements. 18 | -------------------------------------------------------------------------------- /release-notes/2.0.5.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | 3 | - UI: Adds a first run experience introducing type first navigation. 4 | 5 | FIXED: 6 | 7 | - UI: Add small gear icon badge to smart playlist posters. 8 | - UI: Scrolling settings and Plex Home users works again. 9 | - UI: Better scroll positioning of Channel and Search lists. 10 | - UI: Music player in the header shows a progress bar again. 11 | -------------------------------------------------------------------------------- /release-notes/2.0.6.txt: -------------------------------------------------------------------------------- 1 | FIXED: 2 | 3 | - UI: First run experience should display only on the first run. 4 | -------------------------------------------------------------------------------- /release-notes/2.0.7.txt: -------------------------------------------------------------------------------- 1 | FIXED: 2 | 3 | - UI: Navigation within the Settings view, at all aspect ratios, correctly navigates to each setting group and option. 4 | -------------------------------------------------------------------------------- /release-notes/2.0.8.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | 3 | - UI: Navigating back to library list and grid view restores the last focused position. 4 | - UI: Return to the Home dashboard when using the Home icon or navigate home keyboard shortcut. 5 | - UI: Pressing the play key on playback resume modals will now immediately resume playback 6 | 7 | FIXED: 8 | 9 | - The application should display without visual artifacts on high DPI screens. 10 | - Videos should no longer render with a red shift. 11 | - UI: The equalizer icon shown when music is playing is back to animating during playback. 12 | - UI: Correct trouble saving settings introduced in the first PMP preview release. 13 | - UI: Fix the background sometimes not being restored after exiting the photo player. 14 | - UI: Change screensaver behavior to reduce load on underlying system. 15 | -------------------------------------------------------------------------------- /release-notes/2.0.9.txt: -------------------------------------------------------------------------------- 1 | FIXED: 2 | 3 | - The update channel labels have been renamed to align with product lifecycle. 4 | - UI: Sound feedback during navigation has been restored. 5 | -------------------------------------------------------------------------------- /release-notes/2.1.0.txt: -------------------------------------------------------------------------------- 1 | FIXED: 2 | 3 | - Avoid partially resolving secure PMS host names. An upcoming release will reintroduce secure PMS host name resolution to improve PMS connectivity when offline or on networks which prevents DNS rebinding. 4 | - UI: Pressing on the Home button in the header no longer reloads the application. 5 | - UI: Selecting Go To Artist from a track in the music player no longer navigates to the version 1 view. 6 | -------------------------------------------------------------------------------- /release-notes/2.1.1.txt: -------------------------------------------------------------------------------- 1 | NEW: 2 | - Desktop web-client updated to 3.20.6 -------------------------------------------------------------------------------- /release-notes/2.10.0.txt: -------------------------------------------------------------------------------- 1 | 2018-05-01 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.47.1 6 | - Added Privacy Policy and Terms of Service viewing in settings 7 | - Added quick links action buttons for type discovery pages 8 | - Updated translations 9 | 10 | FIXED: 11 | 12 | - Fixed an issue that would cause back button presses on certain remotes to be registered twice 13 | - Fixed the app not loading if plex.tv is unavailable 14 | - Fixed the version badge not updating after deleting a version 15 | - Fixed missing videos in a photo library failing silently 16 | - Fixed the OSD not hiding when resuming playback after the screensaver was shown 17 | - Fixed high CPU usage during music playback 18 | -------------------------------------------------------------------------------- /release-notes/2.11.0.txt: -------------------------------------------------------------------------------- 1 | 2018-05-29 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.52.2 6 | - Qt updated to 5.9.5 7 | - Updated "(Un)Watched" text to "(Un)Played" 8 | 9 | FIXED: 10 | 11 | - Restored ability to Watch Later/Recommended items 12 | - Fixed several possible situations where focus could disappear 13 | - Fixed the shuffle for a TV season selecting episodes from outside of that season 14 | - Fixed the focus order on a show preplay page (with extras only) being incorrect 15 | - Make sure quality setting is respected for autoplaying next episode 16 | - Fixed HLS videos in Watch Later not playing in some cases 17 | - Fixed some occurrences of "Repeat All" not repeating single video play queues 18 | - Fixed Live TV type buttons cutoff in list view 19 | - Fixed inconsistent queue behavior when playing season with no unwatched episodes 20 | - Fixed music play queues not correctly restoring on app start 21 | - Fixed an issue that prevented playing content from a Controller while the app is in the PIN entry screen 22 | -------------------------------------------------------------------------------- /release-notes/2.11.1.txt: -------------------------------------------------------------------------------- 1 | 2018-06-05 2 | 3 | NEW: 4 | 5 | - TV web-client updated to 3.54.2 6 | 7 | FIXED: 8 | 9 | - Removed non-functional Channel provider 10 | -------------------------------------------------------------------------------- /release-notes/2.12.0.txt: -------------------------------------------------------------------------------- 1 | 2018-06-12 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.53.6 6 | 7 | FIXED: 8 | 9 | - Restored ability to delete Watch Later/Recommended items 10 | - Fixed Browse by Folder showing unwatched flags on folders 11 | - Fixed cursor getting lost when navigating up to menu on Live TV Watch Now 12 | - Fixed metadata being displayed behind episode thumbnail in some cases 13 | - Fixed smooth scroll behaviour on some dashboard pages 14 | - Fixed audio & subtitle preference changes not being reflected immediately on the preplay page 15 | - Removed Discover and Watch Now buttons from Live TV Browse All 16 | -------------------------------------------------------------------------------- /release-notes/2.12.1.txt: -------------------------------------------------------------------------------- 1 | 2018-06-15 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.55.3 6 | -------------------------------------------------------------------------------- /release-notes/2.13.0.txt: -------------------------------------------------------------------------------- 1 | 2018-06-26 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.57.1 6 | 7 | FIXED: 8 | 9 | - Fixed focus disappearing after selecting a different news clip from the play queue 10 | - Fixed missing jump bars when viewing Artists and Albums from Quick Links 11 | - Don't show 'Browse by Folder' option when not applicable 12 | - Fixed missing shuffle button from Collections PrePlay 13 | -------------------------------------------------------------------------------- /release-notes/2.14.0.txt: -------------------------------------------------------------------------------- 1 | 2018-07-10 2 | 3 | 4 | FIXED: 5 | 6 | - Fixed error showing when recording is post processing 7 | - Fixed troubles selecting embedded subtitle streams in videos without audio streams 8 | - Fixed grid view programs getting duplicated when refreshing EPG with grid view open 9 | 10 | -------------------------------------------------------------------------------- /release-notes/2.15.0.txt: -------------------------------------------------------------------------------- 1 | 2018-07-24 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.61.1 6 | - Added soft subtitles with direct play (requires PMS 1.13.4 or above) 7 | 8 | FIXED: 9 | 10 | - Added missing unwatched triangles to Watch Later/Recommended 11 | - Fixed sometimes only the background showing when going back to the pre-play page 12 | - Fixed items in On Right Now starting playback immediately after going to Watch Now 13 | - Fixed icon for server and source lists 14 | - Fixed an issue where pressing left or right while video is paused causes you to go to previous/next video instead of seeking 15 | -------------------------------------------------------------------------------- /release-notes/2.16.0.txt: -------------------------------------------------------------------------------- 1 | 2018-08-07 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.63.1 6 | - Add Chapter Selection to video playback 7 | - Updated app settings to match new UI 8 | 9 | FIXED: 10 | 11 | - Fixed subtitles being burned unnecessarily when transcoding 12 | - Fixed skipping instead of seeking with remote 13 | - Fixed cut off text on preplay pages with long synopses 14 | - Fixed photo thumbnails not showing a background when scrolling 15 | - Fixed an issue that could cause selected settings sections to reset when changing selected options 16 | - Fixed formatting of no recordings page on some devices 17 | - Fixed long translations getting cut off in the user menu 18 | - Fixed source list order changes not saving in some rare circumstances 19 | - Improved Audio Passthrough settings labels 20 | -------------------------------------------------------------------------------- /release-notes/2.17.0.txt: -------------------------------------------------------------------------------- 1 | 2018-08-21 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.65.1 6 | - Added menu in settings to reorder and show/hide media types 7 | - Added AdChoices link to Privacy settings 8 | - Automatically sort dashboard buttons based on which types the user has access to 9 | 10 | FIXED: 11 | 12 | - Fixed an issue that could cause the UI to become unresponsive when browsing News settings 13 | - Fixed album preplay sometimes wrapping titles off screen 14 | - Fixed video direct play setting incorrectly affecting music playback 15 | - Fixed Cloud Sync server library names not showing up in source modal 16 | - Fixed lost focus when opening User Menu while offline 17 | - Fixed inconsistency with Mark as Played string naming 18 | - Removed errant app settings section 19 | - Fixed an issue that could cause dashboard pages to fail to load while the app is offline 20 | - Fixed update check in settings 21 | -------------------------------------------------------------------------------- /release-notes/2.18.0.txt: -------------------------------------------------------------------------------- 1 | 2018-09-04 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.67.1 6 | - Automatically refresh the dashboard when playback ends 7 | 8 | FIXED: 9 | 10 | - Fixed pressing play on post play next item leaving OSD open 11 | - Fixed indirect connection being chosen prematurely in some cases 12 | - Fixed inability to change audio stream when being controlled as companion player 13 | - Fixed being unable to remove manual server settings 14 | - Fixed alignment of checkboxes for Live TV advanced recording settings 15 | - Fixed timed lyrics not scrolling as track progresses 16 | - Fixed pathological resume behavior in edge cases, #736 17 | -------------------------------------------------------------------------------- /release-notes/2.19.0.txt: -------------------------------------------------------------------------------- 1 | 2018-09-18 2 | 3 | NEW: 4 | 5 | - Added chapter titles to the chapter selection 6 | - Added the ability to focus the progress bar and move the playhead to seek more accurately 7 | - Added preview thumbnails while seeking (when available) 8 | - Adjusted rewind and fast-foward behavior to move the playhead automatically at 1x, 2x or 3x speed 9 | - Added new music mini player 10 | - Added new user button design in the application header 11 | - Added split fullscreen and layout switching controls 12 | 13 | FIXED: 14 | 15 | - Fixed shuffle commands received from companion apps not being recognized 16 | - Fixed dashboard hubs sometimes failing to load when switching between Home users 17 | - Fixed advancing to the same item as the one currently playing putting the player in a broken state 18 | - Fixed focus not being restored when returning to playlists list page 19 | - Fixed missing placeholder for chapter selection preview thumbnails 20 | - Fixed broken focus behaviour when pressing right twice quickly on settings 21 | - Fixed missing 'Collections' and 'Albums' links from dashboards 22 | -------------------------------------------------------------------------------- /release-notes/2.19.1.txt: -------------------------------------------------------------------------------- 1 | 2018-09-20 2 | 3 | FIXED: 4 | 5 | - Fixed an issue connecting to Plex Cloud servers 6 | -------------------------------------------------------------------------------- /release-notes/2.2.1.txt: -------------------------------------------------------------------------------- 1 | 2017-12-15 2 | 3 | FIXED: 4 | 5 | - (macOS, pre-10.12) Fixed crash on launch 6 | -------------------------------------------------------------------------------- /release-notes/2.20.0.txt: -------------------------------------------------------------------------------- 1 | 2018-10-02 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.71.1 6 | - Improved stream titles (requires PMS 1.13.8 or higher) 7 | 8 | FIXED: 9 | 10 | - Block app key shortcuts when entering subtitles search title 11 | - Sped up initial loading dashboard 12 | - Fixed blinking thumbnails when moving between items in photo player 13 | - Fixed missing empty dashboard message for managed/shared users with restrictions 14 | - Fixed background being lost when navigating away from news player 15 | - Fixed some edge cases around deleting media that could cause the app to become unresponsive 16 | - Fixed Chapter Selection focus box not showing sometimes 17 | - Fixed occasional unexpected focused element in app settings modal after closing via pointer click 18 | - Fixed some navigation bugs in home screen media types settings 19 | - Fixed settings changes not being immediately visible in the UI 20 | - Fixed pressing seek buttons during music playback making it impossible to bring up player controls afterwards 21 | - Fixed subtitles search modal title button width changing when focused 22 | - Fixed news ads playback putting the app in a broken state 23 | - Fixed progress bar being focusable during ads playback 24 | - Fixed news tags and news feed being visible during ads playback 25 | - Fixed news feed being slightly cut off at the bottom 26 | - Fixed issue preventing companion commands 27 | - Fixed display issues with long stream titles on preplay pages 28 | -------------------------------------------------------------------------------- /release-notes/2.20.1.txt: -------------------------------------------------------------------------------- 1 | 2018-10-10 2 | 3 | FIXED: 4 | 5 | - Fixed settings failing to open in some circumstances 6 | -------------------------------------------------------------------------------- /release-notes/2.21.0.txt: -------------------------------------------------------------------------------- 1 | 2018-10-30 2 | 3 | NEW: 4 | 5 | - Improvements to subtitles search results titles 6 | - Added new music player UI for podcasts 7 | - Added Related Episodes hub underneath the Podcasts player 8 | - Watch Later and Recommended support has been removed. Please see: https://www.plex.tv/blog/subtitles-and-sunsets-big-improvements-little-housekeeping/ 9 | 10 | FIXED: 11 | 12 | - Fixed occasional loss of focus on library page when applying "unplayed" filter 13 | - Fixed settings failing to open in some circumstances 14 | - Fixed zip code not disappearing in News settings after selecting a country that doesn't have zip codes 15 | - Fixed selecting a play queue item occasionally not starting playback 16 | -------------------------------------------------------------------------------- /release-notes/2.22.0.txt: -------------------------------------------------------------------------------- 1 | 2018-11-06 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.73.2 6 | - Added recording progress to recording schedule 7 | - Subtitles search modal UI changes 8 | 9 | FIXED: 10 | 11 | - Fixed player control state when playback starts or pauses without application control 12 | - Fixed case where focus was lost when navigating back after changing list styles 13 | - Fixed play queue starting playback automatically when app is reopened 14 | - Fixed non-functional action buttons on preplay pages in some circumstances 15 | - Fixed case where focus could be lost when navigating into the dashboard types header 16 | - Fixed unavailable indicator on preplay pages when media item file is unavailable 17 | -------------------------------------------------------------------------------- /release-notes/2.22.1.txt: -------------------------------------------------------------------------------- 1 | 2018-11-14 2 | 3 | NEW: 4 | 5 | - Reverted Desktop web-client updated to 3.73.2 6 | 7 | FIXED: 8 | 9 | - Fixed play queue starting playback automatically when app is unlocked 10 | -------------------------------------------------------------------------------- /release-notes/2.23.0.txt: -------------------------------------------------------------------------------- 1 | 2018-11-29 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.77.2 6 | - Updated look of playlist/collection posters 7 | 8 | FIXED: 9 | 10 | - Managed users can no longer change the `Automatically Sign In` setting 11 | - Improved image upscale quality for episode posters 12 | - Fixed sorting/filtering being reset when deleting item 13 | -------------------------------------------------------------------------------- /release-notes/2.24.0.txt: -------------------------------------------------------------------------------- 1 | 2018-12-11 2 | 3 | FIXED: 4 | 5 | - Fixed an issue where signing out or switching users could cause the app to freeze 6 | - Fixed an issue where the app could crash when loading a type view 7 | - Fixed an issue where focus would be lost after removing the last item from a list 8 | - Fixed as issue where enabling recording all episodes for certain shows could return in nothing getting added to the priority list 9 | - Fixed an issue that could cause a blank screen to appear after playback 10 | - Fixed loss of focus on episode preplay in some cases 11 | -------------------------------------------------------------------------------- /release-notes/2.25.0.txt: -------------------------------------------------------------------------------- 1 | 2019-01-02 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.77.4 6 | - Added extended artist biography on artist preplay 7 | 8 | FIXED: 9 | 10 | - Fixed podcast/web show episodes being marked as played as soon as playback is initiated 11 | - Fixed app settings sometimes wrongly showing an item as selected 12 | - Fixed media provider hubs occasionaly not loading 13 | - Fixed an issue where the application could show a blank screen when all servers are unavailable 14 | -------------------------------------------------------------------------------- /release-notes/2.26.0.txt: -------------------------------------------------------------------------------- 1 | 2019-01-15 2 | 3 | NEW: 4 | 5 | - Added actions menu to Web Shows and Podcasts show preplay pages 6 | - Added Chapter Selection title to chapter selection menu 7 | - Don't show 'More...' botton when there is only one more item 8 | 9 | FIXED: 10 | 11 | - Fixed possible error on user switcher screen 12 | - Fixed chapter selection sometimes losing focus at the end of the list 13 | - Fixed Live TV restarting from another position when enabling or disabling Closed Captioning 14 | - Fixed some issues with video transcoding when it can direct stream 15 | -------------------------------------------------------------------------------- /release-notes/2.27.0.txt: -------------------------------------------------------------------------------- 1 | 2019-02-05 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.83.1 6 | - Support translation of relative time strings 7 | - Adjusted library page jump bar so more characters can be shown 8 | - Changed user menu from dropdown to full screen modal 9 | 10 | FIXED: 11 | 12 | - Fixed playback controls not showing the correct duration when lightweight seeking 13 | - Fixed possible endless spinner when downloading subtitles 14 | - Fixed player controls sometimes not closing when playing from companion app 15 | -------------------------------------------------------------------------------- /release-notes/2.28.0.txt: -------------------------------------------------------------------------------- 1 | 2019-02-19 2 | 3 | NEW: 4 | 5 | - Added subtitle color and position options 6 | - We've updated our tooling to provide an improved user experience 7 | - AAC audio streams are no longer automatically converted to AC3, EAC3, or DTS during Direct Stream or Transcode when the related Settings > Audio setting is enabled. Instead they will play without conversion 8 | 9 | FIXED: 10 | 11 | - Fixed loss of focus when going to an empty web shows page 12 | - Fixed navigation order after switching to the admin user 13 | - Fixed News and Podcasts directories so they don't touch navigation bar 14 | - Fixed extended info poster not positioned properly 15 | -------------------------------------------------------------------------------- /release-notes/2.29.0.txt: -------------------------------------------------------------------------------- 1 | 2019-03-05 2 | 3 | NEW: 4 | 5 | - Added deletion of external subtitle files from Plex Media Server 6 | - Renamed 'More...' subtitles option to 'Search...' 7 | 8 | FIXED: 9 | 10 | - Fixed image not loading in actions modal during playback 11 | - Fixed an issue where the wrong images could be displayed for items played from other shared or own servers 12 | - Fixed an issue where focus could be lost after reordering types or changing types visibility 13 | - Fixed loss of focus on My Webshows/Podcasts when one or more is removed 14 | - Fixed companion pre-play being lost after companion playback 15 | - Fixed an issue where focus could be lost on back navigation 16 | - Fixed regression that caused videos with AC3 audio tracks to direct play and result in no sound 17 | -------------------------------------------------------------------------------- /release-notes/2.29.1.txt: -------------------------------------------------------------------------------- 1 | 2019-03-08 2 | 3 | FIXED: 4 | 5 | - Fixed an issue where search results would come from local machine's server instead of specified server 6 | - Fixed an issue where selecting a search result would open a blank page 7 | -------------------------------------------------------------------------------- /release-notes/2.30.0.txt: -------------------------------------------------------------------------------- 1 | 2019-03-14 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.83.2 6 | - Fixed playing media when controlled by remote player 7 | - Fixed positioning of poster/text in Live TV conflict items 8 | 9 | FIXED: 10 | 11 | - Fixed regression with search shortcut 12 | - Fixed issue changing audio or subtitles during playback of multi-part files 13 | - Fixed focus order issue on photo tag page 14 | - Fixed missing Playlists link for Other Videos 15 | - Fixed audio tracks being transcoded to AC3 or EAC3 instead of AAC 16 | - Fixed an issue that prevented playing tracks on playlists with items of different sources 17 | -------------------------------------------------------------------------------- /release-notes/2.30.1.txt: -------------------------------------------------------------------------------- 1 | 2019-03-26 2 | 3 | FIXED: 4 | 5 | - Fixed dashboard not loading when one or more Online Media Sources is disabled 6 | -------------------------------------------------------------------------------- /release-notes/2.31.0.txt: -------------------------------------------------------------------------------- 1 | 2019-04-02 2 | 3 | NEW: 4 | 5 | - Added subtitles offset controls for external subtitle files 6 | 7 | FIXED: 8 | 9 | - Fixed podcasts related episodes getting cut off 10 | - Fixed user ratings showing the wrong value on the extended info screen 11 | -------------------------------------------------------------------------------- /release-notes/2.32.0.txt: -------------------------------------------------------------------------------- 1 | 2019-04-16 2 | 3 | FIXED: 4 | 5 | - Fixed user icon in settings modal displaying square instead of round initially 6 | -------------------------------------------------------------------------------- /release-notes/2.33.0.txt: -------------------------------------------------------------------------------- 1 | 2019-04-30 2 | 3 | FIXED: 4 | 5 | - Fixed blurry letter avatar in user menu 6 | - Fixed text getting cut off in related hubs 7 | - Fixed user avatar not appearing in playlists with shared content 8 | - Fixed quick links hubs not correctly positioned with line borders 9 | - Fixed On Right Now hub for Live TV not showing "More..." button 10 | - Fixed loss of focus when only server goes offline 11 | -------------------------------------------------------------------------------- /release-notes/2.34.0.txt: -------------------------------------------------------------------------------- 1 | 2019-05-21 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.100.0 6 | - Added a new base background image 7 | 8 | FIXED: 9 | 10 | - Fixed missing news hubs 11 | - Fixed titles missing for music videos in playlist 12 | -------------------------------------------------------------------------------- /release-notes/2.35.0.txt: -------------------------------------------------------------------------------- 1 | 2019-06-04 2 | 3 | NEW: 4 | 5 | - TV web-client updated to 3.103.0 6 | - Added error pages for empty home screen, empty libraries and unavailable servers 7 | - Added missing fullcreen and layout toggle buttons to UNO experience preview page headers 8 | 9 | FIXED: 10 | 11 | - Fixed bandwidth estimate handling when playing multiple videos in the same app session 12 | - Fixed manage and refresh buttons overlap in errored home hubs 13 | - Fixed DVR options appearing for managed users with only Live TV permissions 14 | - Fixed an edge case that could lead to missing focus after selecting preferred server and sources 15 | - Fixed focus being lost when UNO page header is empty 16 | - Fixed initial missing focus after selecting "Watch Now" in Live TV 17 | - Fixed some "Go to..." buttons redirecting to non-UNO pages 18 | - Fixed showing play and shuffle buttons in UNO preview Collections tabs 19 | - Fixed being unable to get back to library content after leaving a page with no content 20 | - Fixed an issue in UNO that prevented browsing folders in list mode 21 | - Fixed issues around focus being lost or incorrect in sidebar when navigating between sources 22 | - Fixed occasional empty details when browsing libraries in list view in UNO preview 23 | -------------------------------------------------------------------------------- /release-notes/2.35.1.txt: -------------------------------------------------------------------------------- 1 | 2019-06-12 2 | 3 | FIXED: 4 | 5 | - Fixed an issue in UNO where users are unable to select initial pinned sources if they only have one server 6 | - Fixed an issue in UNO where going back to a Recommended tab could sometimes result in focus being lost 7 | - Fixed an issue in UNO where switching between sources chould sometimes result in loss of focus 8 | -------------------------------------------------------------------------------- /release-notes/2.36.0.txt: -------------------------------------------------------------------------------- 1 | 2019-06-25 2 | 3 | NEW: 4 | 5 | - Added Artist TV Radio 6 | - Added News personalize settings link to News sources in UNO sidebar 7 | - Added loading default tab and saving last viewed tab for Playlists sources in UNO sidebar 8 | - Automatically remove pinned sources from deleted libraries in UNO sidebar 9 | - Improved video quality for News, Web Shows, and TIDAL Music Videos during beginning of playback 10 | 11 | FIXED: 12 | 13 | - Fixed showing "home screen media types" setting when UNO preview is enabled 14 | - Fixed an issue with video playback where attempting to hold down left/right would result in constant buffering indicator interrupting seeking 15 | - Fixed an issue in search where the type would reset to "All" after pressing search button from more results 16 | - Fixed related photos in photo player showing limited results 17 | - Fixed an issue in UNO where users are unable to select initial pinned sources if they only have one server 18 | - Fixed pinned sources in UNO sidebar showing error icons after switching users 19 | - Fixed an issue in UNO where server unavailable icon won't update 20 | - Fixed an issue where the More poster was too big for some hubs 21 | - Fixed an issue in UNO where going back to a Recommended tab could sometimes result in focus being lost 22 | - Fixed an issue in UNO where switching between sources chould sometimes result in loss of focus 23 | - Fixed missing focus in TIDAL playlist pages when UNO preview is enabled 24 | - Fixed an issue with reordering UNO sidebar pinned sources where the wrong item would be moved 25 | - Fixed search in UNO not correctly restricting results per type by default 26 | -------------------------------------------------------------------------------- /release-notes/2.37.0.txt: -------------------------------------------------------------------------------- 1 | 2019-07-09 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.104.1 6 | - Disabled List View and Browse By Folder for Photo libraries 7 | - Replaced "Browse by Folder" option available in PMS libraries with "Folders" option in types menu 8 | - UNO preview: Added "Remember Selected Tab" app setting 9 | - UNO preview: Removed "Go to " metadata item action 10 | 11 | FIXED: 12 | 13 | - UNO preview: Fixed Live TV hubs missing airing information 14 | - UNO preview: Fixed an issue that could cause the sidebar to become inaccessible after ending playback 15 | - UNO preview: Fixed an issue that made it possible to navigate from the jump bar to the page header 16 | - UNO preview: Fixed an issue that could result in managed users not seeing the onboarding screens 17 | - UNO preview: Fixed an edge case that allowed a pre-UNO page header to be visible while browsing sources 18 | - UNO preview: Don't show Search button in Home screen when no preferred server was selected 19 | -------------------------------------------------------------------------------- /release-notes/2.38.0.txt: -------------------------------------------------------------------------------- 1 | 2019-07-23 2 | 3 | NEW: 4 | 5 | - Added "Reset Customization" button in user menu to reset sidebar and home screen 6 | - Added automatic refresh when library is rescanned 7 | - Don't show "More" button when user has no servers and has disabled all online media providers 8 | 9 | FIXED: 10 | 11 | - Fixed an issue that could cause the app to become unresponsive after deleting a hub from the Home screen 12 | - Fixed an issue that caused the Home page to display an infinite spinner after finishing the onboarding 13 | - Fixed an issue that could result in managed users not seeing the onboarding screens 14 | - Fixed home hub labels not updating after changing the language 15 | - Fixed an issue where a scrollbar sometimes appears up on the source edit screen 16 | - Fixed long song names not marqueeing when focused on album view 17 | - Fixed empty library message being shown for Live TV 18 | - Fixed an issue that could cause home page hubs to display a `Content Unavailable` error 19 | - Fixed showing the more actions menu in the video player while playing movies 20 | - Fixed app losing focus after reconnecting to server 21 | - Fixed non-functional search button in Home screen 22 | -------------------------------------------------------------------------------- /release-notes/2.39.0.txt: -------------------------------------------------------------------------------- 1 | 2019-08-06 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.104.2 6 | - Added an item count to collections 7 | 8 | FIXED: 9 | 10 | - Fixed delay when skipping forward or back using arrow keys 11 | - Fixed scrollbar sometimes showing up in toolbar 12 | - Fixed seeking sometimes not updating progress bar and elapsed/remaining times 13 | - Fixed an issue that could cause home page hubs to display a `Content Unavailable` error 14 | - Fixed showing the more actions menu in the video player while playing movies 15 | - Fixed app losing focus after reconnecting to server 16 | - Fixed non-functional search button in Home screen 17 | - Fixed play/pause not working while changing subtitle offset 18 | - Fixed occasional unexpected behavior when attempting to use lyrics as a non-Plex Pass user 19 | - Fixed cast members linking to pre-UNO view 20 | - Fixed an error loading `Manage Hubs` modal in TIDAL 21 | - Fixed an issue that could cause albums and seasons lists to fail to load in artist and tv show pages 22 | - Fixed sidebar customization being skipped for users with only one server and no enabled online media sources 23 | -------------------------------------------------------------------------------- /release-notes/2.4.0.txt: -------------------------------------------------------------------------------- 1 | 2018-02-06 2 | 3 | NEW: 4 | 5 | - Updated the sources selector UI 6 | - Added sources modal 7 | - Added ability to reorder sources from sources modal 8 | - Added ability to hide sources from sources list 9 | - Added support for inline collections 10 | - Added automatic fallback to transcode if direct stream audio fails 11 | - Playing an item from the play queue will automatically close the play queue 12 | 13 | FIXED: 14 | 15 | - Fixed the app sometimes showing incomplete lists when returning from the player 16 | - Fixed the error message displayed for unavailable videos 17 | - Fixed play/pause keys in player while the player controls are hidden 18 | - Fixed the first `enter` press when the player controls are hidden showing the controls and executing the active button action immediately 19 | - Fixed empty play queue when playing watch later/recommended videos 20 | - Fixed a rare bug where the app could become unresponsive when selecting a user 21 | - Fixed the PIN entry in user switching screen still being displayed after user presses `back` to close it 22 | - Fixed the exit confirmation dialog not being visible when user attempts to exit from user switching screen 23 | -------------------------------------------------------------------------------- /release-notes/2.4.1.txt: -------------------------------------------------------------------------------- 1 | 2018-02-07 2 | 3 | FIXED: 4 | 5 | - Fixed a rare bug where the app could lose focus in user switching screen 6 | - Fixed missing focus in photo player after selecting a related photo 7 | - Fixed button alignment on subtitle selection modal 8 | - Fixed missing focus after replaying the same video from post-play 9 | - Fixed missing post-play after returning from screensaver 10 | - Selecting the dashboard type button will navigate to the active library 11 | -------------------------------------------------------------------------------- /release-notes/2.40.0.txt: -------------------------------------------------------------------------------- 1 | 2019-08-20 2 | 3 | NEW: 4 | 5 | - Improved sidebar pointer support 6 | - Renamed "Online Content" group to "Plex" in sidebar "More" menu and moved it after user servers 7 | 8 | FIXED: 9 | 10 | - Fixed size of related photos thumbnails in photo player 11 | - Fixed wrong playback titles being shown sometimes for video clips 12 | - Fixed hidden focus when going back from preplay 13 | - Fixed an issue that could cause albums and seasons lists to fail to load in artist and tv show pages 14 | - Fixed lyrics fetching error message flashing 15 | - Fixed wrong thumbnail image for photos in album list view 16 | - Fixed Preplay buttons too close to summary on preplay screen 17 | - Fixed sidebar customization being skipped for users with only one server and no enabled online media sources 18 | -------------------------------------------------------------------------------- /release-notes/2.41.0.txt: -------------------------------------------------------------------------------- 1 | 2019-09-03 2 | 3 | NEW: 4 | 5 | - Moved source page settings ("Manage Hubs") to sidebar and header menus 6 | - Moved home page settings ("Manage Hubs" and "Restore to defaults") to sidebar and header menus 7 | 8 | FIXED: 9 | 10 | - More readable support.plex.tv URLs in app 11 | - Fixed various layout issues on sidebar 12 | - Fixed video playlist thumbnails size 13 | - Fixed Live TV/DVR hub titles overlapping line borders 14 | - Fixed tab titles not being translated when changing app language in settings 15 | - Fixed an issue that prevented resetting customization from certain pages 16 | - Fixed pause not working while seeking 17 | - Fixed home button in sidebar not being selected when returning home from search page 18 | -------------------------------------------------------------------------------- /release-notes/2.42.0.txt: -------------------------------------------------------------------------------- 1 | 2019-09-17 2 | 3 | NEW: 4 | 5 | - Adjusted message displayed in empty "My Podcasts", "My Webshows" and "My TIDAL" screens 6 | - Ensured search via controller/keyboard shortcut uses preferred server selected during first run 7 | 8 | FIXED: 9 | 10 | - Fixed an issue that could cause the app to crash when navigating to Playlists in sidebar after switching users 11 | - Fixed an issue that could cause some filters to not work correctly 12 | - Fixed focus not being correctly restored when going back to Categories/Channels pages 13 | - Fixed margin below artist on album preplay 14 | - Fixed an issue that could cause navigating the sidebar to fail on certain pages 15 | - Fixed missing current position time during Live TV playback 16 | - Fixed an issue where removing content from "My TIDAL" did not always update "My TIDAL" page properly 17 | -------------------------------------------------------------------------------- /release-notes/2.43.0.txt: -------------------------------------------------------------------------------- 1 | 2019-10-01 2 | 3 | NEW: 4 | 5 | - Added Russian language selection 6 | 7 | FIXED: 8 | 9 | - Fixed the sidebar and preplay page content not loading correctly after starting playback quickly 10 | - Fixed an issue where restoring the home screen to its default state twice in quick sucession could cause the app to crash 11 | -------------------------------------------------------------------------------- /release-notes/2.44.0.txt: -------------------------------------------------------------------------------- 1 | 2019-10-15 2 | 3 | NEW: 4 | 5 | - Mobile servers no longer appear in sidebar 6 | 7 | FIXED: 8 | 9 | - Fixed an issue that could cause the jump bar to not be displayed in library pages 10 | -------------------------------------------------------------------------------- /release-notes/2.45.0.txt: -------------------------------------------------------------------------------- 1 | 2019-11-05 2 | 3 | NEW: 4 | 5 | - Added better sorting for shared servers. We now sort by the username, and use the username as the primary title 6 | 7 | FIXED: 8 | 9 | - Fixed subtitles not showing up when advancing to the next episode 10 | - Fixed an issue that could result in broken sidebar functionality on poor network conditions 11 | - Fixed being unable to return to other views after selecting a Collections tab for a library without collections 12 | -------------------------------------------------------------------------------- /release-notes/2.46.0.txt: -------------------------------------------------------------------------------- 1 | 2019-11-20 2 | 3 | FIXED: 4 | 5 | - No notable fixes 6 | -------------------------------------------------------------------------------- /release-notes/2.47.0.txt: -------------------------------------------------------------------------------- 1 | 2019-12-10 2 | 3 | NEW: 4 | 5 | - Improved home screen customization reset behavior 6 | 7 | FIXED: 8 | 9 | - Fixed hubs sometimes not loading in `Manage Hubs` modal in source settings 10 | - Fixed an issue with toggling subtitles on videos with multiple versions 11 | - Fixed an issue that caused the app to show an infinite loading indicator after backing away from a folder while in list view 12 | -------------------------------------------------------------------------------- /release-notes/2.48.0.txt: -------------------------------------------------------------------------------- 1 | 2020-01-07 2 | 3 | FIXED: 4 | 5 | - Fixed genres being too close to title on Web Shows and Podcast show pre plays 6 | - Fixed letter inputs not working when keyboard is set to uppercase 7 | - Fixed an issue where a no longer existing server could prevent you from sharing other servers 8 | - Fixed an issue where some hubs on the Home Screen overlap the separator 9 | - Fixed back key going back to user switcher when editing a managed user's name 10 | - Fixed pinned sources occasionally not influencing home screen content when switching between Auto and Custom modes 11 | - Disabled the option to add hubs to home screen when `Automatic Home` is enabled 12 | -------------------------------------------------------------------------------- /release-notes/2.49.0.txt: -------------------------------------------------------------------------------- 1 | 2020-01-21 2 | 3 | NEW: 4 | 5 | - Disabled the option to add hubs to home screen when `Automatic Home` is enabled 6 | 7 | FIXED: 8 | 9 | - Fixed metadata line height issue on some preplay pages 10 | - Fixed an issue where some manually added hubs never loaded properly (requires re-adding those hubs to the home screen) 11 | - Fixed an issue that could cause loss of focus when switching between custom and auto home 12 | - Fixed an issue that sometimes made it impossible to reorder home hubs 13 | -------------------------------------------------------------------------------- /release-notes/2.5.0.txt: -------------------------------------------------------------------------------- 1 | 2018-02-20 2 | 3 | NEW: 4 | 5 | - Updated translations 6 | 7 | FIXED: 8 | 9 | - Fixed the titles for recently added TV shows 10 | - Fixed the player sometimes not being able to play watch later/recommended videos 11 | - Fixed bug that could cause app to fail to load 12 | - Fixed cases where playback would error or fallback to a transcode near the end of a video 13 | - Fixed issues with Apple IR remotes on High Sierra 14 | -------------------------------------------------------------------------------- /release-notes/2.50.0.txt: -------------------------------------------------------------------------------- 1 | 2020-02-04 2 | 3 | NEW: 4 | 5 | - New Search page with updated design and functionality: 6 | - Search VOD, News, Podcasts, Web Shows and TIDAL as well as PMS libraries 7 | - Keeps a history of recent searches 8 | - Change search target to search all media, pinned sources, specific source types or providers 9 | - Results are grouped by owned libraries, shared libraries and providers 10 | - Contextual results promoted based on where search was started from (i.e. if search is made from a library, results from that library will be promoted to the top) 11 | - Avoid transcoding of 4K video when another version is playable 12 | - Added server name to `Log to Media Server` app setting 13 | -------------------------------------------------------------------------------- /release-notes/2.51.0.txt: -------------------------------------------------------------------------------- 1 | 2020-02-18 2 | 3 | NEW: 4 | 5 | - Updated Desktop to 4.24.1 6 | 7 | FIXED: 8 | 9 | - Fixed display of non UTF-8 sidecar subtitles 10 | - Fixed long press of backspace causing loss of focus when closing modals 11 | - Fixed an issue that caused search to never be performed when using the pointer 12 | - Fixed an issue that could cause the sidebar to become inaccessible after stopping playback from a controller app 13 | - Fixed loss of progress when VOD is stopped during initial ad after resuming 14 | - Fixed missing focus in `Plex is not reachable` page 15 | - Fixed an issue that caused sidebar items to display an infinite spinner when the app is offline 16 | - Fixed possible error on user switcher when plex.tv authentication is unavailable 17 | -------------------------------------------------------------------------------- /release-notes/2.52.0.txt: -------------------------------------------------------------------------------- 1 | 2020-03-03 2 | 3 | FIXED: 4 | 5 | - Fixed an issue that could cause the app to crash when changing search targets 6 | - Fixed an issue that could cause incomplete search results 7 | - Fixed search shortcut key leading to error page 8 | - Fixed an issue that could cause TIDAL tracks to fail to play 9 | -------------------------------------------------------------------------------- /release-notes/2.52.1.txt: -------------------------------------------------------------------------------- 1 | 2020-03-04 2 | 3 | FIXED: 4 | 5 | - Fixed toggling subtitles using keyboard shortcut 6 | - Fixed unselected subtitles displaying during playback 7 | -------------------------------------------------------------------------------- /release-notes/2.52.2.txt: -------------------------------------------------------------------------------- 1 | 2020-03-05 2 | 3 | FIXED: 4 | 5 | - Fixed unselected subtitles displaying during playback in desktop layout 6 | -------------------------------------------------------------------------------- /release-notes/2.53.0.txt: -------------------------------------------------------------------------------- 1 | 2020-03-17 2 | 3 | FIXED: 4 | 5 | - Fixed an issue playing videos in photo libraries where progress wouldn't reset after switching between videos 6 | -------------------------------------------------------------------------------- /release-notes/2.54.0.txt: -------------------------------------------------------------------------------- 1 | 2020-03-31 2 | 3 | NEW: 4 | 5 | - TV layout is now default 6 | 7 | FIXED: 8 | 9 | - Fixed extended info details missing line breaks 10 | - Fixed focus sometimes being lost in preplay pages 11 | - Fixed an issue that could cause incorrect translations in stream title selection menu items 12 | - Bumped Desktop layout revision to correct ad playback issues 13 | -------------------------------------------------------------------------------- /release-notes/2.55.0.txt: -------------------------------------------------------------------------------- 1 | 2020-04-14 2 | 3 | NEW: 4 | 5 | - Added support for subtitles in Movies on Plex content 6 | 7 | FIXED: 8 | 9 | - Fixed possible display errors for TV shows in Movies on Plex 10 | - Fixed Windows-style line endings in extended info screen 11 | - Fixed an issue when searching for items in pinned sources that could cause results from other sources to be displayed 12 | -------------------------------------------------------------------------------- /release-notes/2.56.0.txt: -------------------------------------------------------------------------------- 1 | 2020-04-28 2 | 3 | FIXED: 4 | 5 | - Fixed an issue that could cause managed users to record Live TV content to libraries they don't have access to 6 | - Fixed an issue where searching for Other Videos doesn't return proper results, or in some cases causes a blank screen 7 | -------------------------------------------------------------------------------- /release-notes/2.57.0.txt: -------------------------------------------------------------------------------- 1 | 2020-05-05 2 | 3 | FIXED: 4 | 5 | - Fixed seek bar missing for videos in photo library when casting from another Plex client 6 | -------------------------------------------------------------------------------- /release-notes/2.58.0.txt: -------------------------------------------------------------------------------- 1 | 2020-05-19 2 | 3 | FIXED: 4 | 5 | - Show correct source title for search result items 6 | - Fixed first character jump bar inaccuracy in some cases 7 | -------------------------------------------------------------------------------- /release-notes/2.6.0.txt: -------------------------------------------------------------------------------- 1 | 2018-03-06 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.37.2 6 | - Added subtitle support for videos in the photo player 7 | - Remember last active library when switching between dashboard types 8 | 9 | FIXED: 10 | 11 | - Fixed the type dropdown showing collections for Live TV 12 | - Fixed missing separator line for Online Content in libraries 13 | - Fixed an issue with the player controls sometimes unexpectedly disappearing after changing playing item 14 | - Fixed video restarting from offset when changing the audio or subtitle streams 15 | - Fixed movie filters dropdown getting cut off on certain screen sizes 16 | - Fixed an issue where it wasn't possible to close the player until the content finished loading 17 | - Fixed the player remaining paused after changing an item in the play queue 18 | - Fixed title getting cut off on Live TV preplay pages 19 | - Fixed the player controls briefly appearing when closing the player 20 | - Fixed seeking in Live TV playback in desktop mode 21 | - Fixed a rare bug that could cause the app to become unresponsive to key input after signing in 22 | - Fixed some issues with item actions for some older servers 23 | - Fixed an issue that prevented using keyboard shortcuts to mark an item as unwatched 24 | -------------------------------------------------------------------------------- /release-notes/2.7.0.txt: -------------------------------------------------------------------------------- 1 | 2018-03-20 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.41.2 6 | - Added scrolling to dashboard header type buttons when more than 5 buttons are visible 7 | - Swapped the Record and Play buttons on Live TV item screens 8 | 9 | FIXED: 10 | 11 | - Fixed possible endless buffering at start of playback 12 | - Fixed short movie/episode summary alignment 13 | - Fixed version count not showing up on poster lists 14 | - Fixed the recording schedule not displaying an empty message when no events are displayed 15 | - Fixed the next airing wrapping to two lines on the recording priority page 16 | - Selecting "Sign Out" after selecting "Switch User" from the app's home screen no longer shows homescreen content below the confirmation modal 17 | -------------------------------------------------------------------------------- /release-notes/2.8.0.txt: -------------------------------------------------------------------------------- 1 | 2018-04-03 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.44.1 6 | - Added new flat Rotten Tomatoes icons 7 | - Added link to view all hub list items 8 | - Updated translations 9 | 10 | FIXED: 11 | 12 | - Avoid showing icon or text placeholders in poster lists until item metadata has loaded 13 | - Show track artist, if available, instead of album artist for play queue tracks 14 | - Fixed Companion connectivity issues in certain situations 15 | - Fixed soft subtitles positioning while player controls are visible 16 | - Fixed posters for other episodes not showing on Live TV episode details 17 | - Fixed an issue that would cause the Home page to be displayed for media types without libraries 18 | - Fixed issues around playing music with Plex Companion 19 | - Fixed an issue that could cause the delete version action to delete all versions 20 | - Fixed an issue that made some News clips dates innacurate until the poster was focused 21 | - Fixed casting camera roll from iOS 22 | - Clarified error codes in modal when playback fails 23 | -------------------------------------------------------------------------------- /release-notes/2.9.0.txt: -------------------------------------------------------------------------------- 1 | 2018-04-17 2 | 3 | NEW: 4 | 5 | - Desktop web-client updated to 3.47.1 6 | - Added automatic fallback to transcode if direct playing music fails 7 | - Updated translations 8 | 9 | FIXED: 10 | 11 | - Fixed an issue that prevented toggling between timed and untimed lyrics 12 | - Fixed library lists sometimes not scrolling to the end correctly 13 | - Fixed the dashboard type list sometimes not scrolling to the end correctly 14 | - Don't show the library list if there are no libraries available 15 | - Fixed a rare bug that could cause pointer-only UI elements to appear while not controlling the app with a pointer 16 | - Fixed an issue with news tags sometimes appearing offscreen 17 | - Fixed an issue where going to an empty recording schedule page would make the application unresponsive to input 18 | - Fixed UI sounds 19 | -------------------------------------------------------------------------------- /release-notes/next/789.txt: -------------------------------------------------------------------------------- 1 | Type: Fix 2 | Public: Yes 3 | GHI: https://github.com/plexinc/plex-media-player/pull/789 4 | Release Notes: Fix window icon on Linux -------------------------------------------------------------------------------- /release-notes/next/example.txt: -------------------------------------------------------------------------------- 1 | Type: Feature | Fix | Refactor 2 | Public: Yes | No 3 | GHI: https://github.com/plexinc/plex-media-player/issues/0000 4 | Release Notes: Fixed the thing | Added the thing 5 | 6 | Glossary: 7 | - Feature: Something was added that was not there before 8 | - Fix: Something was broken and is now fixed 9 | - Refactor: Nothing was added, removed, or changed, but code was refactored 10 | - GHI: The backing GitHub Issue or Pull Request if a GHI does not exist 11 | - Release Notes: The one line description describing the change 12 | -------------------------------------------------------------------------------- /resources/desktop/plexmediaplayer.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Version=1.0 3 | Name=Plex Media Player 4 | GenericName=Media Player 5 | Comment=View your media 6 | Exec=plexmediaplayer 7 | Icon=plexmediaplayer 8 | Terminal=false 9 | Type=Application 10 | Categories=AudioVideo;Video;Player;TV; 11 | 12 | Actions=TVF;TVW;DesktopF;DesktopW; 13 | 14 | [Desktop Action TVF] 15 | Name=TV [Fullscreen] 16 | Exec=plexmediaplayer --fullscreen --tv 17 | 18 | [Desktop Action TVW] 19 | Name=TV [Windowed] 20 | Exec=plexmediaplayer --windowed --tv 21 | 22 | [Desktop Action DesktopF] 23 | Name=Desktop [Fullscreen] 24 | Exec=plexmediaplayer --fullscreen --desktop 25 | 26 | [Desktop Action DesktopW] 27 | Name=Desktop [Windowed] 28 | Exec=plexmediaplayer --windowed --desktop 29 | -------------------------------------------------------------------------------- /resources/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plexinc/plex-media-player/d9685b274934855a707a37613cae09108ee9db6c/resources/images/icon.png -------------------------------------------------------------------------------- /resources/images/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /resources/images/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plexinc/plex-media-player/d9685b274934855a707a37613cae09108ee9db6c/resources/images/splash.png -------------------------------------------------------------------------------- /resources/inputmaps/LIRC.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "LIRC IR", 3 | "idmatcher": "LIRC*", 4 | "mapping": 5 | { 6 | "KEY_LEFT": "left", 7 | "KEY_RIGHT": "right", 8 | "KEY_UP": "up", 9 | "KEY_DOWN": "down", 10 | "KEY_MENU": "home", 11 | "KEY_SELECT": "enter", 12 | "KEY_OK": "enter", 13 | "KEY_BACK": "back", 14 | "KEY_EXIT": "back", 15 | "KEY_RED": "red", 16 | "KEY_GREEN": "green", 17 | "KEY_YELLOW": "yellow", 18 | "KEY_BLUE": "blue", 19 | "KEY_PLAY": "play", 20 | "KEY_STOP": "stop", 21 | "KEY_PAUSE": "pause", 22 | "KEY_SEEKFWD": "seek_forward", 23 | "KEY_FASTFORWARD" : "seek_forward", 24 | "KEY_SEEKBCK": "seek_backward", 25 | "KEY_REWIND": "seek_backward", 26 | "KEY_SUBTITLES": "cycle_subtitles", 27 | "KEY_INFO": "host:toggleDebug", 28 | "KEY_NEXT": "step_forward", 29 | "KEY_PREV": "step_backward", 30 | "KEY_HOME": "home", 31 | "KEY_NUMERIC_([0-9])": "%1", 32 | "KEY_DVD": "home", 33 | "KEY_EPG": "home" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /resources/inputmaps/apple-media-keys.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Apple Media Keys", 3 | "idmatcher": "AppleMediaKeys.*", 4 | "mapping": 5 | { 6 | "KEY_PLAY": "play", 7 | "KEY_PAUSE": "pause", 8 | "KEY_PLAY_PAUSE": "play_pause", 9 | "KEY_NEXT": "step_forward", 10 | "KEY_PREV": "step_backward", 11 | "KEY_FAST": "step_forward", 12 | "KEY_REWIND": "step_backward" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /resources/inputmaps/cec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "HDMI CEC", 3 | "idmatcher": "CEC.*", 4 | "mapping": 5 | { 6 | "KEY_LEFT": "left", 7 | "KEY_RIGHT": "right", 8 | "KEY_UP": "up", 9 | "KEY_DOWN": "down", 10 | "KEY_MENU": "unknown", 11 | "KEY_SELECT": "enter", 12 | "KEY_BACK": "back", 13 | "KEY_RED": "red", 14 | "KEY_GREEN": "green", 15 | "KEY_YELLOW": "yellow", 16 | "KEY_BLUE": "blue", 17 | "KEY_PLAY": "play", 18 | "KEY_STOP": "stop", 19 | "KEY_PAUSE": "pause", 20 | "KEY_SEEKFWD": "seek_forward", 21 | "KEY_SEEKBCK": "seek_backward", 22 | "KEY_SUBTITLES": "cycle_subtitles", 23 | "KEY_INFO": "unknown", 24 | "KEY_NEXT": "step_forward", 25 | "KEY_PREV": "step_backward", 26 | "KEY_HOME": "home", 27 | "KEY_NUMERIC_([0-9])": "%1", 28 | "KEY_GUIDE": "guide" 29 | } 30 | } -------------------------------------------------------------------------------- /resources/inputmaps/dualshock4.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Playstation Dual Shock 4", 3 | "idmatcher": "Wireless Controller", 4 | "mapping": { 5 | // D-Pad 6 | "KEY_HAT_DOWN": "down", 7 | "KEY_HAT_UP": "up", 8 | "KEY_HAT_RIGHT": "right", 9 | "KEY_HAT_LEFT": "left", 10 | 11 | // Square 12 | "KEY_BUTTON_0": "cycle_audio", 13 | 14 | // X 15 | "KEY_BUTTON_1": "enter", 16 | 17 | // Circle 18 | "KEY_BUTTON_2": { 19 | "short": "back", 20 | "long": "home" 21 | }, 22 | 23 | // Triangle 24 | "KEY_BUTTON_3": "cycle_subtitles", 25 | 26 | // L1 27 | "KEY_BUTTON_4": "seek_backward", 28 | 29 | // L2 30 | "KEY_BUTTON_5": "seek_forward", 31 | 32 | // option 33 | "KEY_BUTTON_8": "host:toggleDebug", 34 | 35 | // start 36 | "KEY_BUTTON_9": "host:fullscreen", 37 | 38 | // press left thumbstick 39 | "KEY_BUTTON_10": "", 40 | 41 | // press right thumbstick 42 | "KEY_BUTTON_11": "", 43 | 44 | // Playstation button 45 | "KEY_BUTTON_12": { 46 | "short": "home", 47 | "long": "exit" 48 | }, 49 | 50 | // Trackpad press 51 | "KEY_BUTTON_13": "search", 52 | 53 | // left thumbstick axis 54 | "KEY_AXIS_0_UP": "left", 55 | "KEY_AXIS_0_DOWN": "right", 56 | "KEY_AXIS_1_UP": "up", 57 | "KEY_AXIS_1_DOWN": "down", 58 | 59 | // right thumbstick axis 60 | "KEY_AXIS_5_UP": "increase_volume", 61 | "KEY_AXIS_5_DOWN": "decrease_volume", 62 | "KEY_AXIS_2_UP": "decrease_audio_delay", 63 | "KEY_AXIS_2_DOWN": "increase_audio_delay" 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /resources/inputmaps/roku.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Roku HTTP input", 3 | "idmatcher": "roku", 4 | "mapping": { 5 | "Up": "up", 6 | "Down": "down", 7 | "Left": "left", 8 | "Right": "right", 9 | "Select": "enter", 10 | "Play": "play_pause", 11 | "Home": "home", 12 | "Back": "back", 13 | "Fwd": "seek_forward", 14 | "Rev": "seek_backward", 15 | "Info": "host:toggleDebug", 16 | "Backspace": "back", 17 | "Enter": "enter", 18 | "Lit_([0-9])": "%1", 19 | "Lit_([A-Za-z])": "jump+%1" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /resources/inputmaps/wiimote.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Wiimote", 3 | "idmatcher": "Wiimote.*", 4 | "mapping": 5 | { 6 | "KEY_BUTTON_1": "up", 7 | "KEY_BUTTON_3": "right", 8 | "KEY_BUTTON_0": "down", 9 | "KEY_BUTTON_2": "left", 10 | "KEY_BUTTON_10": "enter", 11 | "KEY_BUTTON_9": "back" 12 | } 13 | } -------------------------------------------------------------------------------- /resources/inputmaps/xbox-controller-mac.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Xbox Controller", 3 | "idmatcher": "XBOX360.*|.*360.*Controller", 4 | "mapping": 5 | { 6 | // A 7 | "KEY_BUTTON_0": "enter", 8 | 9 | // B 10 | "KEY_BUTTON_1": { 11 | "short": "back", 12 | "long": "home" 13 | }, 14 | 15 | // X 16 | "KEY_BUTTON_2": "cycle_audio", 17 | 18 | // Y 19 | "KEY_BUTTON_3": "cycle_subtitle", 20 | 21 | // LB 22 | "KEY_BUTTON_4": "seek_backward", 23 | 24 | // RB 25 | "KEY_BUTTON_5": "seek_forward", 26 | 27 | // left thumbstick press 28 | "KEY_BUTTON_6": "", 29 | 30 | // right thumbstick press 31 | "KEY_BUTTON_7": "", 32 | 33 | // start 34 | "KEY_BUTTON_8": "host:fullscreen", 35 | 36 | // back 37 | "KEY_BUTTON_9": "host:toggleDebug", 38 | 39 | // Windows button 40 | "KEY_BUTTON_10": { 41 | "short": "home", 42 | "long": "exit" 43 | }, 44 | 45 | // D-PAD 46 | "KEY_BUTTON_11": "up", 47 | "KEY_BUTTON_12": "down", 48 | "KEY_BUTTON_13": "left", 49 | "KEY_BUTTON_14": "right", 50 | 51 | // left thumbstick axis 52 | "KEY_AXIS_0_UP": "left", 53 | "KEY_AXIS_0_DOWN": "right", 54 | "KEY_AXIS_1_UP": "up", 55 | "KEY_AXIS_1_DOWN": "down", 56 | 57 | // right thumbstick axis 58 | "KEY_AXIS_4_UP": "increase_volume", 59 | "KEY_AXIS_4_DOWN": "decrease_volume", 60 | "KEY_AXIS_3_UP": "decrease_audio_delay", 61 | "KEY_AXIS_3_DOWN": "increase_audio_delay", 62 | 63 | // left trigger 64 | "KEY_AXIS_2_UP": "", 65 | 66 | // right trigger 67 | "KEY_AXIS_5_UP": "", 68 | 69 | // D-Pad with JoyHat events 70 | "KEY_HAT_DOWN": "down", 71 | "KEY_HAT_UP": "up", 72 | "KEY_HAT_RIGHT": "right", 73 | "KEY_HAT_LEFT": "left" 74 | } 75 | } -------------------------------------------------------------------------------- /resources/sounds/Back.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plexinc/plex-media-player/d9685b274934855a707a37613cae09108ee9db6c/resources/sounds/Back.wav -------------------------------------------------------------------------------- /resources/sounds/Click.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plexinc/plex-media-player/d9685b274934855a707a37613cae09108ee9db6c/resources/sounds/Click.wav -------------------------------------------------------------------------------- /resources/sounds/Cursor.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plexinc/plex-media-player/d9685b274934855a707a37613cae09108ee9db6c/resources/sounds/Cursor.wav -------------------------------------------------------------------------------- /resources/sounds/Notify.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plexinc/plex-media-player/d9685b274934855a707a37613cae09108ee9db6c/resources/sounds/Notify.wav -------------------------------------------------------------------------------- /resources/sounds/Out.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plexinc/plex-media-player/d9685b274934855a707a37613cae09108ee9db6c/resources/sounds/Out.wav -------------------------------------------------------------------------------- /resources/sounds/Shutter.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plexinc/plex-media-player/d9685b274934855a707a37613cae09108ee9db6c/resources/sounds/Shutter.wav -------------------------------------------------------------------------------- /resources/testmedia/README.txt: -------------------------------------------------------------------------------- 1 | Produced with: 2 | 3 | x264 input.png --profile=high --tune=stillimage --level=5.1 -o out.h264 4 | 5 | where input.png was a black image with the appropriate resolution. 6 | 7 | x264 was patched to remove the SEI message (because it doubled the size). 8 | -------------------------------------------------------------------------------- /resources/testmedia/high_1920x1080.h264: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plexinc/plex-media-player/d9685b274934855a707a37613cae09108ee9db6c/resources/testmedia/high_1920x1080.h264 -------------------------------------------------------------------------------- /resources/testmedia/high_4096x2160.h264: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plexinc/plex-media-player/d9685b274934855a707a37613cae09108ee9db6c/resources/testmedia/high_4096x2160.h264 -------------------------------------------------------------------------------- /resources/testmedia/high_4096x2304.h264: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/plexinc/plex-media-player/d9685b274934855a707a37613cae09108ee9db6c/resources/testmedia/high_4096x2304.h264 -------------------------------------------------------------------------------- /scripts/build-konvergo-qt.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ./configure \ 4 | -prefix $HOME/Qt/Qt5.6.0-alpha-konvergo \ 5 | -opensource \ 6 | -confirm-license \ 7 | -nomake tests \ 8 | -nomake examples \ 9 | -optimized-qmake \ 10 | -opengl desktop \ 11 | -no-feature-bearermanagement \ 12 | -no-gif \ 13 | -qt-libpng \ 14 | -qt-libjpeg \ 15 | -no-openssl \ 16 | -securetransport \ 17 | -qt-pcre \ 18 | -no-glib \ 19 | -no-cups \ 20 | -pch \ 21 | -no-eglfs \ 22 | -framework \ 23 | -release \ 24 | -force-debug-info \ 25 | -no-dbus \ 26 | -skip qtconnectivity \ 27 | -skip qtdoc \ 28 | -skip qtgraphicaleffects \ 29 | -skip qtmultimedia \ 30 | -skip qtsensors \ 31 | -skip qtserialport \ 32 | -skip qt3d 33 | -------------------------------------------------------------------------------- /scripts/build-windows.bat: -------------------------------------------------------------------------------- 1 | cd %BUILD_DIR% || exit /b 2 | 3 | %CMAKE_DIR%\cmake -DDEPENDENCY_TOKEN=%DEP_SECRET% -DCRASHDUMP_SECRET=%CD_SECRET% -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=output -DDEPENDENCY_UNTAR_DIR=c:\jenkins\pmp-deps .. -G Ninja -DCODE_SIGN=ON -DENABLE_CODECS=on || exit /b 4 | 5 | ninja || exit /b 6 | ninja windows_package || exit /b 7 | -------------------------------------------------------------------------------- /scripts/compress.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python -u 2 | 3 | # simple script that takes data on stdin and outputs bz2 compressed data 4 | # just to avoid having to install bzip2.exe on windows platforms 5 | 6 | import bz2, os, sys 7 | 8 | bufsize=4096 9 | 10 | if __name__ == "__main__": 11 | compress = bz2.BZ2Compressor() 12 | data = sys.stdin.read(bufsize) 13 | while data: 14 | cdata = compress.compress(data) 15 | if cdata: 16 | sys.stdout.write(cdata) 17 | data = sys.stdin.read(bufsize) 18 | 19 | cdata = compress.flush() 20 | if cdata: 21 | sys.stdout.write(cdata) 22 | -------------------------------------------------------------------------------- /scripts/dump-syms.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | DUMP_SYMS=$1 4 | COMPRESS=$2 5 | SOURCE=$3 6 | TARGET=$4 7 | 8 | echo $SOURCE 9 | 10 | DSYM_ARG="" 11 | DSYM_FILE="" 12 | BASESOURCE=$(basename "$SOURCE") 13 | if [ -e "$BASESOURCE.dSYM" ]; then 14 | DSYM_ARG="-g" 15 | DSYM_FILE="$BASESOURCE.dSYM" 16 | fi 17 | 18 | echo $DUMP_SYMS $DSYM_ARG $DSYM_FILE $SOURCE | $COMPRESS > $TARGET 19 | $DUMP_SYMS $DSYM_ARG "$DSYM_FILE" "$SOURCE" | $COMPRESS > "$TARGET" 20 | -------------------------------------------------------------------------------- /scripts/dump_qt_symbols_osx.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | rm -rf symbols 6 | mkdir symbols 7 | 8 | dylibs=$(find lib plugins -type f -name *.dylib) 9 | frameworks=$(find lib -type d -name *.framework) 10 | 11 | echo "Dumping symbols for dylibs..." 12 | for lib in $dylibs; do 13 | libname=$(basename $lib) 14 | echo $libname 15 | dsymutil -o symbols/$libname.dSYM $lib &>/dev/null 16 | ~/dump_syms -g symbols/$libname.dSYM $lib 2> /dev/null | xz -9 -e - 1> symbols/$libname.symbols.xz 17 | done 18 | 19 | for f in $frameworks; do 20 | frameworkname=$(basename $f) 21 | frameworkfname="${frameworkname%.*}" 22 | ffname="$f/$frameworkfname" 23 | if [ -e $ffname ]; then 24 | echo $frameworkname 25 | dsymutil -o symbols/$frameworkname.dSYM $ffname 26 | ~/dump_syms -g symbols/$frameworkname.dSYM $ffname 2>/dev/null | xz -9 -e - > symbols/$frameworkname.symbols.xz 27 | fi 28 | done 29 | -------------------------------------------------------------------------------- /scripts/make_mpv_lib.bat: -------------------------------------------------------------------------------- 1 | call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %PMP_VC_ARCH% 2 | c:\msys32\mingw64\bin\gendef.exe - bin\mpv*.dll > bin\mpv-1.def 3 | lib /def:bin\mpv-1.def /out:lib\mpv.lib /MACHINE:%PMP_LIB_ARCH% 4 | -------------------------------------------------------------------------------- /src/KonvergoPCH.h: -------------------------------------------------------------------------------- 1 | 2 | #if defined(__cplusplus) 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #endif 10 | -------------------------------------------------------------------------------- /src/breakpad/BreakPad.h: -------------------------------------------------------------------------------- 1 | #ifndef BREAKPAD_H 2 | #define BREAKPAD_H 3 | 4 | #include 5 | 6 | void installBreakPadHandler(const QString& name, const QString& destPath); 7 | 8 | #endif 9 | -------------------------------------------------------------------------------- /src/breakpad/BreakPadDummy.cpp: -------------------------------------------------------------------------------- 1 | #include "QsLog.h" 2 | #include "BreakPad.h" 3 | 4 | void installBreakPadHandler(const QString& name, const QString& destPath) 5 | { 6 | QLOG_WARN() << "No crash reporting compiled."; 7 | } 8 | -------------------------------------------------------------------------------- /src/breakpad/BreakPadLinux.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "BreakPad.h" 4 | 5 | void installBreakPadHandler(const QString& name, const QString& destPath) 6 | { 7 | google_breakpad::MinidumpDescriptor desc(destPath.toStdString()); 8 | new google_breakpad::ExceptionHandler(desc, 0, 0, 0, true, -1); 9 | } 10 | -------------------------------------------------------------------------------- /src/breakpad/BreakPadOSX.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "BreakPad.h" 4 | 5 | ///////////////////////////////////////////////////////////////////////////////////////// 6 | static inline bool BreakPad_MinidumpCallback(const char *dump_dir, const char *minidump_id, void *context, bool succeeded) 7 | { 8 | fprintf(stderr, "****** Plex Media Player CRASHED, CRASH REPORT WRITTEN: %s\n", dump_dir); 9 | return succeeded; 10 | } 11 | 12 | ///////////////////////////////////////////////////////////////////////////////////////// 13 | void installBreakPadHandler(const QString& name, const QString& destPath) 14 | { 15 | Q_UNUSED(name); 16 | new google_breakpad::ExceptionHandler(destPath.toStdString(), nullptr, BreakPad_MinidumpCallback, nullptr, true, nullptr); 17 | } 18 | -------------------------------------------------------------------------------- /src/breakpad/BreakPadWin32.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "BreakPad.h" 4 | 5 | ///////////////////////////////////////////////////////////////////////////////////////// 6 | bool BreakPad_MinidumpCallback(const wchar_t* dump_path, 7 | const wchar_t* minidump_id, 8 | void* context, 9 | EXCEPTION_POINTERS* exinfo, 10 | MDRawAssertionInfo* assertion, 11 | bool succeeded) 12 | { 13 | return succeeded; 14 | } 15 | 16 | ///////////////////////////////////////////////////////////////////////////////////////// 17 | void installBreakPadHandler(const QString& name, const QString& destPath) 18 | { 19 | new google_breakpad::ExceptionHandler(destPath.toStdWString().c_str(), NULL, BreakPad_MinidumpCallback, NULL, 20 | google_breakpad::ExceptionHandler::HANDLER_EXCEPTION | 21 | google_breakpad::ExceptionHandler::HANDLER_PURECALL); 22 | } 23 | -------------------------------------------------------------------------------- /src/breakpad/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_sources(BreakPad.h) 2 | 3 | if(BREAKPAD_FOUND) 4 | if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") 5 | # requires Linux kernel and glibc 6 | add_sources(BreakPadLinux.cpp) 7 | elseif(APPLE) 8 | add_sources(BreakPadOSX.cpp) 9 | elseif(WIN32) 10 | add_sources(BreakPadWin32.cpp) 11 | else() 12 | add_sources(BreakPadDummy.cpp) 13 | endif() 14 | else() 15 | add_sources(BreakPadDummy.cpp) 16 | endif() 17 | -------------------------------------------------------------------------------- /src/breakpad/CrashDumps.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 26/08/15. 3 | // 4 | 5 | #ifndef KONVERGO_CRASHDUMPS_H 6 | #define KONVERGO_CRASHDUMPS_H 7 | 8 | #include "BreakPad.h" 9 | #include "Paths.h" 10 | #include "Version.h" 11 | 12 | static void setupCrashDumper() 13 | { 14 | QDir dir(Paths::cacheDir("crashdumps/incoming/" + Version::GetCanonicalVersionString())); 15 | dir.mkpath(dir.absolutePath()); 16 | 17 | #ifdef NDEBUG 18 | installBreakPadHandler("Plex Media Player", dir.path()); 19 | #else 20 | QLOG_INFO() << "This is a debug build. Not installing crash handler."; 21 | #endif 22 | } 23 | 24 | #endif //KONVERGO_CRASHDUMPS_H 25 | -------------------------------------------------------------------------------- /src/core/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_sources( 2 | ComponentManager.cpp ComponentManager.h 3 | Globals.cpp Globals.h 4 | Version.h 5 | ) 6 | 7 | if(UNIX) 8 | add_sources(SignalManager.cpp SignalManager.h) 9 | endif() 10 | -------------------------------------------------------------------------------- /src/core/ComponentManager.h: -------------------------------------------------------------------------------- 1 | #ifndef __COMPONENT_MANAGER_H__ 2 | #define __COMPONENT_MANAGER_H__ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #include "utils/Utils.h" 11 | 12 | class ComponentBase : public QObject 13 | { 14 | public: 15 | explicit ComponentBase(QObject* parent = nullptr) : QObject(parent) { } 16 | 17 | virtual bool componentInitialize() = 0; 18 | virtual const char* componentName() = 0; 19 | virtual bool componentExport() = 0; 20 | 21 | // executed after ALL components are initialized 22 | virtual void componentPostInitialize() { } 23 | }; 24 | 25 | class ComponentManager : public QObject 26 | { 27 | Q_OBJECT 28 | DEFINE_SINGLETON(ComponentManager); 29 | 30 | public: 31 | void initialize(); 32 | inline QQmlPropertyMap &getQmlPropertyMap() { return m_qmlProperyMap; } 33 | void setWebChannel(QWebChannel* webChannel); 34 | 35 | private: 36 | ComponentManager(); 37 | void registerComponent(ComponentBase* comp); 38 | 39 | QMap m_components; 40 | QQmlPropertyMap m_qmlProperyMap; 41 | }; 42 | 43 | #endif 44 | -------------------------------------------------------------------------------- /src/core/Globals.h: -------------------------------------------------------------------------------- 1 | #ifndef KONVERGOENGINE_H 2 | #define KONVERGOENGINE_H 3 | 4 | #include 5 | 6 | class KonvergoWindow; 7 | 8 | ///////////////////////////////////////////////////////////////////////////////////////// 9 | namespace Globals 10 | { 11 | QQmlApplicationEngine* Engine(); 12 | QVariant ContextProperty(const QString& property); 13 | void SetContextProperty(const QString& property, QObject* object); 14 | void SetContextProperty(const QString& property, const QVariant& value); 15 | void EngineDestroy(); 16 | KonvergoWindow* MainWindow(); 17 | }; 18 | 19 | #endif // KONVERGOENGINE_H 20 | -------------------------------------------------------------------------------- /src/core/SignalManager.h: -------------------------------------------------------------------------------- 1 | #ifndef SIGNALMANAGER_H 2 | #define SIGNALMANAGER_H 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | class SignalManager : public QObject 9 | { 10 | Q_OBJECT 11 | 12 | public: 13 | explicit SignalManager(QGuiApplication* app); 14 | ~SignalManager() override {} 15 | 16 | // Unix signal handlers. 17 | static void signalHandler(int signal_num); 18 | 19 | int setupHandlers(); 20 | void closeApplication(); 21 | 22 | public slots: 23 | // Qt signal handlers. 24 | void handleSignal(); 25 | 26 | private: 27 | static int g_sigtermFd[2]; 28 | 29 | QSocketNotifier* m_snTerm; 30 | QGuiApplication* m_app; 31 | }; 32 | 33 | #endif // SIGNALMANAGER_H 34 | -------------------------------------------------------------------------------- /src/core/Version.cpp.in: -------------------------------------------------------------------------------- 1 | // Autogenerated CPP file 2 | 3 | #include 4 | #include "Version.h" 5 | 6 | QString Version::GetVersionString() 7 | { 8 | return QString("@VERSION_STRING@"); 9 | } 10 | 11 | QString Version::GetCanonicalVersionString() 12 | { 13 | return QString("@CANONICAL_VERSION_STRING@"); 14 | } 15 | 16 | QString Version::GetBuildDate() 17 | { 18 | return QString("@CURRENT_DATE@"); 19 | } 20 | 21 | QString Version::GetWebVersion() 22 | { 23 | return QString("@WEB_CLIENT_VERSTR@"); 24 | } 25 | 26 | QString Version::GetDependenciesVersion() 27 | { 28 | return QString("@DEPS_HASH@"); 29 | } 30 | 31 | QString Version::GetQtDepsVersion() 32 | { 33 | return QString("@QT_DEPS_HASH@"); 34 | } 35 | -------------------------------------------------------------------------------- /src/core/Version.h: -------------------------------------------------------------------------------- 1 | #ifndef VERSION_H 2 | #define VERSION_H 3 | 4 | namespace Version 5 | { 6 | QString GetVersionString(); 7 | QString GetCanonicalVersionString(); 8 | QString GetBuildDate(); 9 | QString GetWebVersion(); 10 | QString GetQtDepsVersion(); 11 | QString GetDependenciesVersion(); 12 | }; 13 | 14 | #endif // VERSION_H 15 | 16 | -------------------------------------------------------------------------------- /src/display/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | if(APPLE) 2 | add_subdirectory(osx) 3 | elseif(BUILD_TARGET STREQUAL "RPI") 4 | add_subdirectory(rpi) 5 | elseif(X11XRANDR_FOUND) 6 | add_subdirectory(x11) 7 | elseif(WIN32) 8 | add_subdirectory(win) 9 | endif() 10 | 11 | add_subdirectory(dummy) 12 | 13 | find_all_sources(. SRC) 14 | add_sources(${SRC}) -------------------------------------------------------------------------------- /src/display/dummy/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_sources(DisplayManagerDummy.cpp DisplayManagerDummy.h) -------------------------------------------------------------------------------- /src/display/dummy/DisplayManagerDummy.h: -------------------------------------------------------------------------------- 1 | #ifndef DISPLAYMANAGERDUMMY_H_ 2 | #define DISPLAYMANAGERDUMMY_H_ 3 | 4 | #include "display/DisplayManager.h" 5 | 6 | class DisplayManagerDummy : public DisplayManager 7 | { 8 | Q_OBJECT 9 | private: 10 | 11 | void addMode(float rate); 12 | 13 | int m_currentMode; 14 | 15 | public: 16 | explicit DisplayManagerDummy(QObject* parent) : DisplayManager(parent), m_currentMode(0) {}; 17 | 18 | bool initialize() override; 19 | bool setDisplayMode(int display, int mode) override; 20 | int getCurrentDisplayMode(int display) override; 21 | int getMainDisplay() override; 22 | int getDisplayFromPoint(int x, int y) override; 23 | }; 24 | 25 | #endif /* DISPLAYMANAGERX11_H_ */ 26 | -------------------------------------------------------------------------------- /src/display/osx/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_sources(DisplayManagerOSX.cpp DisplayManagerOSX.h) 2 | -------------------------------------------------------------------------------- /src/display/osx/DisplayManagerOSX.h: -------------------------------------------------------------------------------- 1 | // 2 | // DisplayManagerOSX.h 3 | // konvergo 4 | // 5 | // Created by Lionel CHAZALLON on 28/09/2014. 6 | // 7 | // 8 | 9 | #ifndef _DISPLAYMANAGEROSX_H_ 10 | #define _DISPLAYMANAGEROSX_H_ 11 | 12 | #include "ApplicationServices/ApplicationServices.h" 13 | #include 14 | #include 15 | 16 | #include "display/DisplayManager.h" 17 | 18 | #define MAX_DISPLAYS 32 19 | 20 | typedef std::map OSXDisplayModeMap; 21 | 22 | class DisplayManagerOSX : public DisplayManager 23 | { 24 | Q_OBJECT 25 | private: 26 | // OSX Display/ VideoMode handling structs 27 | uint32_t m_osxnumDisplays; 28 | CGDirectDisplayID m_osxDisplays[MAX_DISPLAYS]; 29 | OSXDisplayModeMap m_osxDisplayModes; 30 | 31 | public: 32 | explicit DisplayManagerOSX(QObject* parent) : DisplayManager(parent) {}; 33 | ~DisplayManagerOSX() override; 34 | 35 | bool initialize() override; 36 | bool setDisplayMode(int display, int mode) override; 37 | int getCurrentDisplayMode(int display) override; 38 | int getMainDisplay() override; 39 | int getDisplayFromPoint(int x, int y) override; 40 | }; 41 | 42 | #endif /* _DISPLAYMANAGEROSX_H_ */ 43 | -------------------------------------------------------------------------------- /src/display/rpi/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_sources(DisplayManagerRPI.cpp DisplayManagerRPI.h) 2 | -------------------------------------------------------------------------------- /src/display/rpi/DisplayManagerRPI.h: -------------------------------------------------------------------------------- 1 | #ifndef DISPLAYMANAGERRPI_H 2 | #define DISPLAYMANAGERRPI_H 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | #include "display/DisplayManager.h" 9 | 10 | class DisplayManagerRPI : public DisplayManager 11 | { 12 | Q_OBJECT 13 | private: 14 | std::vector m_modes; 15 | 16 | private Q_SLOTS: 17 | void handleTvChange(uint32_t reason); 18 | 19 | static void tv_callback(void *callback_data, uint32_t reason, uint32_t param1, uint32_t param2); 20 | 21 | Q_SIGNALS: 22 | void onTvChange(uint32_t reason); 23 | 24 | public: 25 | DisplayManagerRPI(QObject* parent); 26 | virtual ~DisplayManagerRPI(); 27 | 28 | virtual bool initialize(); 29 | virtual void resetRendering(); 30 | virtual bool setDisplayMode(int display, int mode); 31 | virtual int getCurrentDisplayMode(int display); 32 | virtual int getMainDisplay() { return 0; } 33 | virtual int getDisplayFromPoint(int x, int y) { return 0; } 34 | }; 35 | 36 | #endif 37 | -------------------------------------------------------------------------------- /src/display/win/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_sources(DisplayManagerWin.cpp DisplayManagerWin.h) 2 | -------------------------------------------------------------------------------- /src/display/win/DisplayManagerWin.h: -------------------------------------------------------------------------------- 1 | #ifndef DISPLAYMANAGERWIN_H 2 | #define DISPLAYMANAGERWIN_H 3 | 4 | #include 5 | #include "display/DisplayManager.h" 6 | /////////////////////////////////////////////////////////////////////////////////////////////////// 7 | // Displays 8 | 9 | class DisplayManagerWin : public DisplayManager 10 | { 11 | Q_OBJECT 12 | private: 13 | bool getDisplayInfo(int display, DISPLAY_DEVICEW& info); 14 | bool getModeInfo(int display, int mode, DEVMODEW& info); 15 | 16 | QMap m_displayAdapters; 17 | 18 | public: 19 | DisplayManagerWin(QObject* parent) : DisplayManager(parent) {} 20 | virtual ~DisplayManagerWin(); 21 | 22 | virtual bool initialize(); 23 | virtual bool setDisplayMode(int display, int mode); 24 | virtual int getCurrentDisplayMode(int display); 25 | virtual int getMainDisplay(); 26 | virtual int getDisplayFromPoint(int x, int y); 27 | }; 28 | 29 | #endif // DISPLAYMANAGERWIN_H 30 | -------------------------------------------------------------------------------- /src/display/x11/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_sources(DisplayManagerX11.cpp DisplayManagerX11.h) 2 | -------------------------------------------------------------------------------- /src/display/x11/DisplayManagerX11.h: -------------------------------------------------------------------------------- 1 | #ifndef DISPLAYMANAGERX11_H_ 2 | #define DISPLAYMANAGERX11_H_ 3 | 4 | #include 5 | 6 | #include 7 | 8 | // X11 headers are messing up things for us 9 | #undef CursorShape 10 | #undef Bool 11 | #undef Status 12 | #undef None 13 | #undef KeyPress 14 | #undef KeyRelease 15 | #undef FocusIn 16 | #undef FocusOut 17 | #undef FontChange 18 | #undef Expose 19 | 20 | #include "display/DisplayManager.h" 21 | 22 | class DisplayManagerX11 : public DisplayManager 23 | { 24 | Q_OBJECT 25 | private: 26 | Display* xdisplay; 27 | XRRScreenResources* resources; 28 | 29 | public: 30 | DisplayManagerX11(QObject* parent) : DisplayManager(parent), xdisplay(0), resources(0) {}; 31 | virtual ~DisplayManagerX11(); 32 | 33 | virtual bool initialize(); 34 | virtual bool setDisplayMode(int display, int mode); 35 | virtual int getCurrentDisplayMode(int display); 36 | virtual int getMainDisplay(); 37 | virtual int getDisplayFromPoint(int x, int y); 38 | }; 39 | 40 | #endif /* DISPLAYMANAGERX11_H_ */ 41 | -------------------------------------------------------------------------------- /src/input/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(INPUT_SRCS 2 | InputComponent.cpp 3 | InputComponent.h 4 | InputMapping.cpp 5 | InputMapping.h 6 | InputKeyboard.h 7 | InputSocket.h 8 | InputSocket.cpp 9 | InputRoku.cpp 10 | InputRoku.h 11 | ) 12 | 13 | if(APPLE) 14 | add_subdirectory(apple) 15 | endif(APPLE) 16 | 17 | if(SDL2_FOUND) 18 | list(APPEND INPUT_SRCS InputSDL.cpp InputSDL.h) 19 | endif(SDL2_FOUND) 20 | 21 | if(ENABLE_LIRC) 22 | list(APPEND INPUT_SRCS InputLIRC.cpp InputLIRC.h) 23 | endif(ENABLE_LIRC) 24 | 25 | if(CEC_FOUND) 26 | list(APPEND INPUT_SRCS InputCEC.cpp InputCEC.h) 27 | endif(CEC_FOUND) 28 | 29 | add_sources(${INPUT_SRCS}) 30 | 31 | -------------------------------------------------------------------------------- /src/input/InputKeyboard.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 09/06/15. 3 | // 4 | 5 | #ifndef KONVERGO_INPUTKEYBOARD_H 6 | #define KONVERGO_INPUTKEYBOARD_H 7 | 8 | #include 9 | #include "InputComponent.h" 10 | #include "QsLog.h" 11 | 12 | class InputKeyboard : public InputBase 13 | { 14 | Q_OBJECT 15 | DEFINE_SINGLETON(InputKeyboard); 16 | 17 | public: 18 | bool initInput() override { return true; } 19 | const char* inputName() override { return "Keyboard"; } 20 | 21 | void keyPress(const QString& keys, InputkeyState keyState) 22 | { 23 | emit receivedInput("Keyboard", keys, keyState); 24 | } 25 | 26 | private: 27 | explicit InputKeyboard(QObject* parent = nullptr) : InputBase(parent) {} 28 | }; 29 | 30 | #endif //KONVERGO_INPUTKEYBOARD_H 31 | -------------------------------------------------------------------------------- /src/input/InputLIRC.h: -------------------------------------------------------------------------------- 1 | #ifndef INPUTLIRC_H 2 | #define INPUTLIRC_H 3 | 4 | #include 5 | #include 6 | #include "input/InputComponent.h" 7 | 8 | class InputLIRC : public InputBase 9 | { 10 | Q_OBJECT 11 | private: 12 | QLocalSocket* socket; 13 | QSocketNotifier* socketNotifier; 14 | 15 | bool connectToLIRC(); 16 | void disconnectFromLIRC(); 17 | bool isConnected(); 18 | 19 | public: 20 | InputLIRC(QObject* parent); 21 | ~InputLIRC(); 22 | 23 | virtual const char* inputName() { return "LIRC"; } 24 | virtual bool initInput(); 25 | 26 | private Q_SLOTS: 27 | void connected(); 28 | void disconnected(); 29 | void socketerror(QLocalSocket::LocalSocketError socketError); 30 | void read(int handle); 31 | }; 32 | 33 | #endif // INPUTLIRC_H 34 | -------------------------------------------------------------------------------- /src/input/InputMapping.h: -------------------------------------------------------------------------------- 1 | #ifndef INPUTMAPPING_H 2 | #define INPUTMAPPING_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | class InputMapping : public QObject 13 | { 14 | Q_OBJECT 15 | 16 | public: 17 | explicit InputMapping(QObject *parent = nullptr); 18 | bool loadMappings(); 19 | QVariantList mapToAction(const QString& source, const QString& keycode); 20 | 21 | private Q_SLOTS: 22 | void dirChange(); 23 | 24 | signals: 25 | void mappingChanged(); 26 | 27 | private: 28 | bool loadMappingFile(const QString &path, QPair &mappingPair); 29 | bool loadMappingDirectory(const QString& path, bool copy); 30 | 31 | QFileSystemWatcher* m_watcher; 32 | 33 | QHash m_inputMatcher; 34 | CachedRegexMatcher m_sourceMatcher; 35 | }; 36 | 37 | #endif // INPUTMAPPING_H 38 | -------------------------------------------------------------------------------- /src/input/InputRoku.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 02/02/16. 3 | // 4 | 5 | #ifndef PLEXMEDIAPLAYER_ROKUREMOTECOMPONENT_H 6 | #define PLEXMEDIAPLAYER_ROKUREMOTECOMPONENT_H 7 | 8 | #include "input/InputComponent.h" 9 | #include "qhttpserver.hpp" 10 | #include 11 | 12 | class InputRoku : public InputBase 13 | { 14 | Q_OBJECT 15 | 16 | public: 17 | explicit InputRoku(QObject* parent = nullptr) : InputBase(parent) { } 18 | bool initInput() override; 19 | const char* inputName() override { return "roku"; }; 20 | 21 | private: 22 | void handleRequest(qhttp::server::QHttpRequest* request, qhttp::server::QHttpResponse* response); 23 | void handleQueryApps(qhttp::server::QHttpRequest* request, qhttp::server::QHttpResponse* response); 24 | void handleKeyPress(qhttp::server::QHttpRequest* request, qhttp::server::QHttpResponse* response); 25 | void handleQueryDeviceInfo(qhttp::server::QHttpRequest* request, qhttp::server::QHttpResponse* response); 26 | 27 | qhttp::server::QHttpServer* m_server; 28 | QUdpSocket* m_ssdpSocket; 29 | 30 | void ssdpRead(); 31 | void parseSSDPData(const QByteArray& data, const QHostAddress& sender, quint16 port); 32 | QByteArray getSSDPPacket(const QHostAddress& sender); 33 | void handleRootInfo(qhttp::server::QHttpRequest* request, qhttp::server::QHttpResponse* response); 34 | }; 35 | 36 | #endif //PLEXMEDIAPLAYER_ROKUREMOTECOMPONENT_H 37 | -------------------------------------------------------------------------------- /src/input/InputSocket.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 24/08/15. 3 | // 4 | 5 | #include "InputSocket.h" 6 | #include "QsLog.h" 7 | #include "Version.h" 8 | 9 | #include 10 | 11 | ///////////////////////////////////////////////////////////////////////////////////////// 12 | bool InputSocket::initInput() 13 | { 14 | return m_server->listen(); 15 | } 16 | 17 | ///////////////////////////////////////////////////////////////////////////////////////// 18 | void InputSocket::clientConnected(QLocalSocket* socket) 19 | { 20 | QVariantMap welcome; 21 | welcome.insert("version", Version::GetVersionString()); 22 | welcome.insert("builddate", Version::GetBuildDate()); 23 | 24 | m_server->sendMessage(welcome, socket); 25 | } 26 | 27 | ///////////////////////////////////////////////////////////////////////////////////////// 28 | void InputSocket::messageReceived(const QVariant& message) 29 | { 30 | QVariantMap map = message.toMap(); 31 | 32 | if (!map.contains("client") || !map.contains("source") || !map.contains("keycode")) 33 | { 34 | QLOG_WARN() << "Got packet from client but it was missing the important fields"; 35 | return; 36 | } 37 | 38 | QLOG_DEBUG() << "Input from client:" << map.value("client").toString() << " - " << 39 | map.value("source").toString() << map.value("keycode").toString(); 40 | 41 | emit receivedInput(map.value("source").toString(), map.value("keycode").toString(), KeyPressed); 42 | } 43 | -------------------------------------------------------------------------------- /src/input/InputSocket.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 24/08/15. 3 | // 4 | 5 | #ifndef KONVERGO_INPUTSOCKET_H 6 | #define KONVERGO_INPUTSOCKET_H 7 | 8 | #include "LocalJsonServer.h" 9 | #include "InputComponent.h" 10 | 11 | class InputSocket : public InputBase 12 | { 13 | Q_OBJECT 14 | public: 15 | explicit InputSocket(QObject* parent = nullptr) : InputBase(parent) 16 | { 17 | m_server = new LocalJsonServer("inputSocket"); 18 | connect(m_server, &LocalJsonServer::clientConnected, this, &InputSocket::clientConnected); 19 | connect(m_server, &LocalJsonServer::messageReceived, this, &InputSocket::messageReceived); 20 | } 21 | 22 | bool initInput() override; 23 | const char* inputName() override { return "socket"; }; 24 | 25 | private Q_SLOTS: 26 | void clientConnected(QLocalSocket* socket); 27 | void messageReceived(const QVariant& message); 28 | 29 | private: 30 | LocalJsonServer* m_server; 31 | }; 32 | 33 | #endif //KONVERGO_INPUTSOCKET_H 34 | -------------------------------------------------------------------------------- /src/input/apple/AppleRemoteDelegate.h: -------------------------------------------------------------------------------- 1 | #ifndef __APPLE_REMOTE_DELEGATE_H__ 2 | #define __APPLE_REMOTE_DELEGATE_H__ 3 | 4 | #import 5 | #import "HIDRemote.h" 6 | 7 | class InputAppleRemote; 8 | 9 | @interface AppleRemoteDelegate : NSObject 10 | { 11 | InputAppleRemote* m_remoteHandler; 12 | } 13 | 14 | - (instancetype)initWithRemoteHandler:(InputAppleRemote*)remoteHandler; 15 | 16 | - (void)hidRemote:(HIDRemote *)hidRemote 17 | eventWithButton:(HIDRemoteButtonCode)buttonCode 18 | isPressed:(BOOL)isPressed 19 | fromHardwareWithAttributes:(NSMutableDictionary *)attributes; 20 | 21 | - (void)hidRemote:(HIDRemote *)hidRemote failedNewHardwareWithError:(NSError *)error; 22 | - (void)hidRemote:(HIDRemote *)hidRemote foundNewHardwareWithAttributes:(NSMutableDictionary *)attributes; 23 | - (void)hidRemote:(HIDRemote *)hidRemote releasedHardwareWithAttributes:(NSMutableDictionary *)attributes; 24 | 25 | - (bool)setupRemote; 26 | 27 | @end 28 | 29 | #endif 30 | -------------------------------------------------------------------------------- /src/input/apple/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(APPLE_SRC 2 | InputAppleRemote.h InputAppleRemote.mm 3 | AppleRemoteDelegate.mm AppleRemoteDelegate.h 4 | InputAppleMediaKeys.h InputAppleMediaKeys.mm 5 | ) 6 | add_sources(${APPLE_SRC}) 7 | -------------------------------------------------------------------------------- /src/input/apple/InputAppleMediaKeys.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 21/08/15. 3 | // 4 | 5 | #ifndef KONVERGO_INPUTAPPLEMEDIAKEYS_H 6 | #define KONVERGO_INPUTAPPLEMEDIAKEYS_H 7 | 8 | #include "input/InputComponent.h" 9 | #include "player/PlayerComponent.h" 10 | 11 | class InputAppleMediaKeys : public InputBase 12 | { 13 | Q_OBJECT 14 | public: 15 | explicit InputAppleMediaKeys(QObject* parent = nullptr) : InputBase(parent) { } 16 | bool initInput() override; 17 | const char* inputName() override { return "AppleMediaKeys"; } 18 | 19 | private: 20 | void* m_delegate; 21 | void handleStateChanged(PlayerComponent::State newState, PlayerComponent::State oldState); 22 | void handlePositionUpdate(quint64 position); 23 | void handleUpdateDuration(qint64 duration); 24 | 25 | typedef void (*SetNowPlayingVisibilityFunc)(void* origin, int visibility); 26 | typedef void* (*GetLocalOriginFunc)(void); 27 | typedef void (*SetCanBeNowPlayingApplicationFunc)(int); 28 | SetNowPlayingVisibilityFunc SetNowPlayingVisibility; 29 | GetLocalOriginFunc GetLocalOrigin; 30 | SetCanBeNowPlayingApplicationFunc SetCanBeNowPlayingApplication; 31 | 32 | bool m_pendingUpdate; 33 | quint64 m_currentTime; 34 | }; 35 | 36 | #endif //KONVERGO_INPUTAPPLEMEDIAKEYS_H 37 | -------------------------------------------------------------------------------- /src/input/apple/InputAppleRemote.h: -------------------------------------------------------------------------------- 1 | #ifndef __INPUT_APPLE_REMOTE_H__ 2 | #define __INPUT_APPLE_REMOTE_H__ 3 | 4 | #include 5 | #include 6 | #include "input/InputComponent.h" 7 | 8 | 9 | #ifdef __OBJC__ 10 | @class AppleRemoteDelegate; 11 | typedef AppleRemoteDelegate delegate; 12 | #else 13 | typedef void delegate; 14 | #endif 15 | 16 | class InputAppleRemote : public InputBase 17 | { 18 | public: 19 | explicit InputAppleRemote(QObject* parent = nullptr) : InputBase(parent), m_remoteID(0) { } 20 | const char* inputName() override { return "AppleRemote"; } 21 | bool initInput() override; 22 | 23 | void remoteButtonEvent(quint8 code, bool pressed, const QString& name); 24 | 25 | void addRemote(const QString& name); 26 | void removeRemote(const QString& name); 27 | void addRemoteFailed(const QString& error); 28 | void changeRemoteID(quint32 newID); 29 | 30 | private: 31 | delegate* m_delegate; 32 | QStringList m_remotes; 33 | quint32 m_remoteID; 34 | }; 35 | 36 | #endif 37 | -------------------------------------------------------------------------------- /src/player/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_sources(PlayerComponent.cpp PlayerComponent.h) 2 | add_sources(PlayerQuickItem.cpp PlayerQuickItem.h) 3 | add_sources(CodecsComponent.cpp CodecsComponent.h) 4 | add_sources(OpenGLDetect.cpp OpenGLDetect.h) 5 | add_sources(QtHelper.h) 6 | -------------------------------------------------------------------------------- /src/player/OpenGLDetect.h: -------------------------------------------------------------------------------- 1 | #ifndef OPENGLDETECT_H 2 | #define OPENGLDETECT_H 3 | 4 | void detectOpenGLEarly(); 5 | void detectOpenGLLate(); 6 | 7 | #endif // OPENGLDETECT_H 8 | -------------------------------------------------------------------------------- /src/player/PlayerQuickItem.h: -------------------------------------------------------------------------------- 1 | #ifndef PLAYERQUICKITEM_H 2 | #define PLAYERQUICKITEM_H 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | #include 9 | #include 10 | 11 | #ifdef Q_OS_WIN32 12 | #include 13 | #else 14 | typedef void* HANDLE; 15 | #endif 16 | 17 | #include "PlayerComponent.h" 18 | #include "QtHelper.h" 19 | 20 | class PlayerRenderer : public QObject 21 | { 22 | Q_OBJECT 23 | friend class PlayerQuickItem; 24 | 25 | PlayerRenderer(mpv::qt::Handle mpv, QQuickWindow* window); 26 | bool init(); 27 | ~PlayerRenderer() override; 28 | void render(); 29 | void swap(); 30 | 31 | public slots: 32 | void onVideoPlaybackActive(bool active); 33 | 34 | private: 35 | static void on_update(void *ctx); 36 | mpv::qt::Handle m_mpv; 37 | mpv_render_context* m_mpvGL; 38 | QQuickWindow* m_window; 39 | QSize m_size; 40 | HANDLE m_hAvrtHandle; 41 | QRect m_videoRectangle; 42 | QOpenGLFramebufferObject* m_fbo; 43 | }; 44 | 45 | class PlayerQuickItem : public QQuickItem 46 | { 47 | Q_OBJECT 48 | friend class PlayerRenderer; 49 | 50 | public: 51 | explicit PlayerQuickItem(QQuickItem* parent = nullptr); 52 | ~PlayerQuickItem() override; 53 | void initMpv(PlayerComponent* player); 54 | QString debugInfo() { return m_debugInfo; } 55 | 56 | signals: 57 | void onFatalError(QString message); 58 | 59 | private slots: 60 | void onWindowChanged(QQuickWindow* win); 61 | void onSynchronize(); 62 | void onInvalidate(); 63 | void onHandleFatalError(QString message); 64 | 65 | private: 66 | mpv::qt::Handle m_mpv; 67 | mpv_render_context* m_mpvGL; 68 | PlayerRenderer* m_renderer; 69 | QString m_debugInfo; 70 | }; 71 | 72 | #endif 73 | -------------------------------------------------------------------------------- /src/plugins/RPI_jpeg/QRPIJpegPlugin.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "QRPIJpegPlugin.h" 3 | #include "QRPIJpegHandler.h" 4 | 5 | 6 | QT_BEGIN_NAMESPACE 7 | 8 | /////////////////////////////////////////////////////////////////////////////////////////////////// 9 | QImageIOPlugin::Capabilities QRPIJpegPlugin::capabilities(QIODevice *device, const QByteArray &format) const 10 | { 11 | if (format == "jpeg" || format == "jpg") 12 | return Capabilities(CanRead); 13 | if (!format.isEmpty()) 14 | return 0; 15 | if (!device->isOpen()) 16 | return 0; 17 | 18 | Capabilities cap; 19 | if (device->isReadable() && QRPIJpegHandler::canRead(device)) 20 | cap |= CanRead; 21 | if (device->isWritable()) 22 | cap |= CanWrite; 23 | 24 | return cap; 25 | } 26 | 27 | /////////////////////////////////////////////////////////////////////////////////////////////////// 28 | QImageIOHandler *QRPIJpegPlugin::create(QIODevice *device, const QByteArray &format) const 29 | { 30 | QImageIOHandler *handler = new QRPIJpegHandler(); 31 | handler->setDevice(device); 32 | handler->setFormat(format); 33 | return handler; 34 | } 35 | 36 | QT_END_NAMESPACE 37 | -------------------------------------------------------------------------------- /src/plugins/RPI_jpeg/QRPIJpegPlugin.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | QT_BEGIN_NAMESPACE 5 | 6 | class QRPIJpegPlugin : public QImageIOPlugin 7 | { 8 | Q_OBJECT 9 | Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QImageIOHandlerFactoryInterface" FILE "jpeg.json") 10 | public: 11 | Capabilities capabilities(QIODevice *device, const QByteArray &format) const Q_DECL_OVERRIDE; 12 | QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const Q_DECL_OVERRIDE; 13 | }; 14 | 15 | QT_END_NAMESPACE 16 | -------------------------------------------------------------------------------- /src/plugins/RPI_jpeg/RPI_jpeg.pro: -------------------------------------------------------------------------------- 1 | #------------------------------------------------- 2 | # 3 | # Project created by QtCreator 2015-05-29T20:58:57 4 | # 5 | #------------------------------------------------- 6 | 7 | TARGET = RPI_jpeg 8 | 9 | 10 | QT += core 11 | 12 | TEMPLATE = lib 13 | 14 | LIBS += -lmmal_core -lmmal_util -lmmal_vc_client 15 | 16 | DEFINES += RPI_JPEG_LIBRARY 17 | 18 | SOURCES += \ 19 | QRPIJpegPlugin.cpp \ 20 | QRPIJpegHandler.cpp \ 21 | brcmjpeg.cpp 22 | 23 | target.path = $$[QT_INSTALL_PLUGINS]/imageformats 24 | INSTALLS += target 25 | 26 | 27 | HEADERS += \ 28 | QRPIJpegPlugin.h \ 29 | QRPIJpegHandler.h \ 30 | brcmjpeg.h 31 | -------------------------------------------------------------------------------- /src/plugins/RPI_jpeg/jpeg.json: -------------------------------------------------------------------------------- 1 | { 2 | "Keys": [ "jpg", "jpeg" ], 3 | "MimeTypes": [ "image/jpeg", "image/jpeg" ] 4 | } -------------------------------------------------------------------------------- /src/power/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_sources(PowerComponent.h PowerComponent.cpp) 2 | 3 | if(APPLE) 4 | add_sources(PowerComponentMac.cpp PowerComponentMac.h) 5 | endif(APPLE) 6 | 7 | if(LINUX_X11POWER) 8 | add_sources(PowerComponentX11.cpp PowerComponentX11.h) 9 | endif(LINUX_X11POWER) 10 | 11 | if(LINUX_DBUS) 12 | add_sources(PowerComponentDBus.cpp PowerComponentDBus.h) 13 | endif(LINUX_DBUS) 14 | 15 | if(WIN32) 16 | add_sources(PowerComponentWin.cpp PowerComponentWin.h) 17 | endif(WIN32) 18 | -------------------------------------------------------------------------------- /src/power/PowerComponent.h: -------------------------------------------------------------------------------- 1 | #ifndef POWERMANAGER 2 | #define POWERMANAGER 3 | 4 | #include 5 | #include "ComponentManager.h" 6 | 7 | class PowerComponent : public ComponentBase 8 | { 9 | Q_OBJECT 10 | public: 11 | 12 | enum PowerCapabilities 13 | { 14 | CAP_POWER_OFF = 0x01, 15 | CAP_REBOOT = 0x02, 16 | CAP_SUSPEND = 0x04, 17 | CAP_RELAUNCH = 0x08 18 | }; 19 | 20 | static PowerComponent& Get(); 21 | 22 | explicit PowerComponent(QObject* parent = nullptr) 23 | : ComponentBase(parent) 24 | { } 25 | 26 | bool componentInitialize() override; 27 | bool componentExport() override { return true; } 28 | const char* componentName() override { return "power"; } 29 | void componentPostInitialize() override; 30 | 31 | public Q_SLOTS: 32 | bool checkCap(PowerCapabilities capability); 33 | 34 | bool canPowerOff() { return checkCap(CAP_POWER_OFF); } 35 | bool canReboot() { return checkCap(CAP_REBOOT); } 36 | bool canSuspend() { return checkCap(CAP_SUSPEND); } 37 | bool canRelaunch() 38 | { 39 | #if OPENELEC 40 | return true; 41 | #else 42 | return false; 43 | #endif 44 | } 45 | 46 | virtual int getPowerCapabilities() { return 0; } 47 | 48 | virtual bool PowerOff() { return false; } 49 | virtual bool Reboot() { return false; } 50 | virtual bool Suspend() { return false; } 51 | 52 | void setScreensaverEnabled(bool enabled); 53 | 54 | Q_SIGNALS: 55 | // Short-term compatibility with old web-client. Does nothing. 56 | void screenSaverEnabled(); 57 | void screenSaverDisabled(); 58 | 59 | protected: 60 | virtual void doDisableScreensaver() {}; 61 | virtual void doEnableScreensaver() {}; 62 | }; 63 | 64 | 65 | #endif // POWERMANAGER 66 | 67 | -------------------------------------------------------------------------------- /src/power/PowerComponentDBus.h: -------------------------------------------------------------------------------- 1 | #ifndef POWERCOMPONENTDBUS_H 2 | #define POWERCOMPONENTDBUS_H 3 | 4 | #include "PowerComponent.h" 5 | 6 | class PowerComponentDBus : public PowerComponent 7 | { 8 | public: 9 | PowerComponentDBus() : PowerComponent(0) {}; 10 | ~PowerComponentDBus() {}; 11 | 12 | public Q_SLOTS: 13 | 14 | virtual int getPowerCapabilities() override 15 | { 16 | int flags = 0; 17 | if (isPowerMethodAvailable("CanPowerOff")) 18 | flags |= CAP_POWER_OFF; 19 | if (isPowerMethodAvailable("CanReboot")) 20 | flags |= CAP_REBOOT; 21 | if (isPowerMethodAvailable("CanSuspend")) 22 | flags |= CAP_SUSPEND; 23 | return flags; 24 | } 25 | 26 | virtual bool PowerOff(); 27 | virtual bool Reboot(); 28 | virtual bool Suspend() { return callPowerMethod("Suspend"); } 29 | 30 | private: 31 | bool callPowerMethod(QString method); 32 | bool isPowerMethodAvailable(QString method); 33 | 34 | unsigned int screensaver_inhibit_cookie = 0; 35 | 36 | protected: 37 | virtual void doDisableScreensaver(); 38 | virtual void doEnableScreensaver(); 39 | }; 40 | 41 | #endif // POWERCOMPONENTDBUS_H 42 | -------------------------------------------------------------------------------- /src/power/PowerComponentMac.h: -------------------------------------------------------------------------------- 1 | #ifndef POWERCOMPONENTMAC_H 2 | #define POWERCOMPONENTMAC_H 3 | 4 | #include "PowerComponent.h" 5 | #include 6 | 7 | class PowerComponentMac : public PowerComponent 8 | { 9 | public: 10 | PowerComponentMac() : PowerComponent(nullptr), m_assertion(0) { } 11 | void doDisableScreensaver() override; 12 | void doEnableScreensaver() override; 13 | 14 | virtual int getPowerCapabilities() override 15 | { 16 | int flags = IOPMSleepEnabled() ? CAP_SUSPEND : 0; 17 | return flags | CAP_POWER_OFF | CAP_REBOOT; 18 | } 19 | 20 | virtual bool PowerOff() override; 21 | virtual bool Reboot() override; 22 | virtual bool Suspend() override; 23 | 24 | private: 25 | IOPMAssertionID m_assertion = 0; 26 | }; 27 | 28 | #endif // POWERCOMPONENTMAC_H 29 | -------------------------------------------------------------------------------- /src/power/PowerComponentWin.h: -------------------------------------------------------------------------------- 1 | #ifndef POWERCOMPONENTWIN_H 2 | #define POWERCOMPONENTWIN_H 3 | 4 | #include "PowerComponent.h" 5 | 6 | 7 | class PowerComponentWin : public PowerComponent 8 | { 9 | public: 10 | PowerComponentWin(); 11 | virtual void doDisableScreensaver(); 12 | virtual void doEnableScreensaver(); 13 | 14 | virtual int getPowerCapabilities() override 15 | { 16 | int flags = CAP_SUSPEND; 17 | if (m_hasPrivileges) 18 | flags |= CAP_POWER_OFF | CAP_REBOOT; 19 | return flags; 20 | } 21 | 22 | virtual bool PowerOff() override; 23 | virtual bool Reboot() override; 24 | virtual bool Suspend() override; 25 | 26 | private: 27 | bool m_hasPrivileges; 28 | 29 | }; 30 | 31 | #endif // POWERCOMPONENTWIN_H 32 | -------------------------------------------------------------------------------- /src/power/PowerComponentX11.h: -------------------------------------------------------------------------------- 1 | #ifndef POWERCOMPONENTX11_H 2 | #define POWERCOMPONENTX11_H 3 | 4 | #include 5 | #include 6 | 7 | #include "PowerComponent.h" 8 | 9 | class PowerComponentX11 : public PowerComponent 10 | { 11 | Q_OBJECT 12 | 13 | public: 14 | PowerComponentX11(); 15 | 16 | protected: 17 | virtual void doDisableScreensaver(); 18 | virtual void doEnableScreensaver(); 19 | 20 | private slots: 21 | void onTimer(); 22 | void onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus); 23 | void onProcessError(QProcess::ProcessError error); 24 | 25 | private: 26 | bool m_broken = false; 27 | QTimer* m_timer = 0; 28 | QProcess* m_process = 0; 29 | }; 30 | 31 | #endif // POWERCOMPONENTX11_H 32 | -------------------------------------------------------------------------------- /src/remote/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | find_all_sources(. REMOTE_SRCS) 2 | add_sources(${REMOTE_SRCS}) 3 | 4 | -------------------------------------------------------------------------------- /src/remote/GDMManager.h: -------------------------------------------------------------------------------- 1 | #ifndef GDMANNOUNCER_H 2 | #define GDMANNOUNCER_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | class GDMManager : public QObject 11 | { 12 | Q_OBJECT 13 | public: 14 | explicit GDMManager(QObject *parent = nullptr); 15 | ~GDMManager() override { stopAnnouncing(); } 16 | void startAnnouncing(); 17 | void stopAnnouncing(); 18 | 19 | private: 20 | void startListener(); 21 | void parseData(const QByteArray& data, const QHostAddress& sender, quint16 port); 22 | void readData(); 23 | 24 | QByteArray getPacket(); 25 | 26 | QUdpSocket m_socket; 27 | qint32 m_port; 28 | }; 29 | 30 | #endif // GDMANNOUNCER_H 31 | -------------------------------------------------------------------------------- /src/server/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_sources( 2 | HTTPServer.cpp HTTPServer.h 3 | ) -------------------------------------------------------------------------------- /src/server/HTTPServer.h: -------------------------------------------------------------------------------- 1 | #ifndef HTTPSERVER_H 2 | #define HTTPSERVER_H 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | #include "qhttpserverrequest.hpp" 9 | #include "qhttpserver.hpp" 10 | #include "qhttpserverresponse.hpp" 11 | 12 | using namespace qhttp::server; 13 | 14 | class HttpServer : public QObject 15 | { 16 | Q_OBJECT 17 | public: 18 | explicit HttpServer(QObject* parent); 19 | bool start(); 20 | 21 | private slots: 22 | void handleRequest(QHttpRequest* request, QHttpResponse* response); 23 | void handleWebClientRequest(QHttpRequest* request, QHttpResponse* response); 24 | void handleResource(QHttpRequest* request, QHttpResponse* response); 25 | void handleRemoteController(QHttpRequest* request, QHttpResponse* response); 26 | void handleFilesRequest(QHttpRequest* request, QHttpResponse* response); 27 | void writeError(QHttpResponse* response, qhttp::TStatusCode errorCode); 28 | 29 | private: 30 | bool writeFile(const QString& file, QHttpResponse* response); 31 | void handleSoundsRequest(QHttpRequest* request, QHttpResponse* response); 32 | 33 | QHttpServer* m_server; 34 | QString m_baseUrl; 35 | quint16 m_port; 36 | QMimeDatabase m_mime; 37 | }; 38 | 39 | #endif // HTTPSERVER_H 40 | -------------------------------------------------------------------------------- /src/settings/AudioSettingsController.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 21/08/15. 3 | // 4 | 5 | #ifndef KONVERGO_AUDIOSETTINGSCONTROLLER_H 6 | #define KONVERGO_AUDIOSETTINGSCONTROLLER_H 7 | 8 | #include 9 | 10 | class AudioSettingsController : public QObject 11 | { 12 | Q_OBJECT 13 | public: 14 | explicit AudioSettingsController(QObject* parent = nullptr); 15 | Q_SLOT void valuesUpdated(const QVariantMap& values); 16 | Q_SIGNAL void settingsUpdated(const QString& section, const QVariant& description); 17 | 18 | private: 19 | void setHiddenPassthrough(const QStringList& codecs, bool hidden); 20 | }; 21 | 22 | #endif //KONVERGO_AUDIOSETTINGSCONTROLLER_H 23 | -------------------------------------------------------------------------------- /src/settings/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_sources( 2 | AudioSettingsController.cpp AudioSettingsController.h 3 | SettingsComponent.cpp SettingsComponent.h 4 | SettingsSection.cpp SettingsSection.h 5 | SettingsValue.h 6 | ) -------------------------------------------------------------------------------- /src/shared/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | include_directories(${PROJECT_SOURCE_DIR}/src) 2 | 3 | add_library(shared STATIC 4 | Paths.cpp Paths.h 5 | LocalJsonClient.cpp LocalJsonClient.h 6 | LocalJsonServer.cpp LocalJsonServer.h 7 | UniqueApplication.h 8 | ${CMAKE_BINARY_DIR}/src/core/Version.cpp 9 | ${CMAKE_CURRENT_BINARY_DIR}/Names.cpp Names.h 10 | ) 11 | 12 | std_target_properties(shared) 13 | 14 | clang_tidy(shared) 15 | -------------------------------------------------------------------------------- /src/shared/LocalJsonClient.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 30/08/15. 3 | // 4 | 5 | #include "Paths.h" 6 | #include "LocalJsonClient.h" 7 | #include "LocalJsonServer.h" 8 | 9 | ///////////////////////////////////////////////////////////////////////////////////////// 10 | LocalJsonClient::LocalJsonClient(const QString serverPath, QObject* parent) : QLocalSocket(parent) 11 | { 12 | m_serverPath = Paths::socketName(serverPath); 13 | connect(this, &QLocalSocket::readyRead, this, &LocalJsonClient::readyRead); 14 | } 15 | 16 | ///////////////////////////////////////////////////////////////////////////////////////// 17 | void LocalJsonClient::connectToServer() 18 | { 19 | QLocalSocket::connectToServer(m_serverPath, QIODevice::ReadWrite); 20 | } 21 | 22 | ///////////////////////////////////////////////////////////////////////////////////////// 23 | bool LocalJsonClient::sendMessage(const QVariantMap& message) 24 | { 25 | return LocalJsonServer::sendMessage(message, this); 26 | } 27 | 28 | ///////////////////////////////////////////////////////////////////////////////////////// 29 | void LocalJsonClient::readyRead() 30 | { 31 | QVariantList list = LocalJsonServer::readFromSocket(this); 32 | for(const QVariant& msg : list) 33 | emit messageReceived(msg.toMap()); 34 | } 35 | -------------------------------------------------------------------------------- /src/shared/LocalJsonClient.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 30/08/15. 3 | // 4 | 5 | #ifndef KONVERGO_LOCALJSONCLIENT_H 6 | #define KONVERGO_LOCALJSONCLIENT_H 7 | 8 | #include 9 | 10 | class LocalJsonClient : public QLocalSocket 11 | { 12 | Q_OBJECT 13 | public: 14 | explicit LocalJsonClient(const QString serverPath, QObject* parent = nullptr); 15 | void connectToServer(); 16 | bool sendMessage(const QVariantMap& message); 17 | 18 | Q_SIGNALS: 19 | void messageReceived(const QVariantMap& message); 20 | 21 | private: 22 | Q_SLOT void readyRead(); 23 | QString m_serverPath; 24 | }; 25 | 26 | #endif //KONVERGO_LOCALJSONCLIENT_H 27 | -------------------------------------------------------------------------------- /src/shared/LocalJsonServer.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 30/08/15. 3 | // 4 | 5 | #ifndef KONVERGO_LOCALJSONSEVER_H 6 | #define KONVERGO_LOCALJSONSEVER_H 7 | 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | class LocalJsonServer : public QObject 14 | { 15 | Q_OBJECT 16 | public: 17 | explicit LocalJsonServer(const QString& serverName, QObject* parent = nullptr); 18 | 19 | bool listen(); 20 | static bool sendMessage(const QVariantMap& message, QLocalSocket* socket); 21 | static QVariantList readFromSocket(QLocalSocket* socket); 22 | QString errorString() const { return m_server->errorString(); } 23 | 24 | Q_SIGNALS: 25 | void clientConnected(QLocalSocket* socket); 26 | void messageReceived(const QVariant& message); 27 | 28 | private Q_SLOTS: 29 | void serverClientConnected(); 30 | void clientReadyRead(); 31 | 32 | private: 33 | QString m_serverName; 34 | QLocalServer* m_server; 35 | QList m_clientSockets; 36 | }; 37 | 38 | #endif //KONVERGO_LOCALJSONSEVER_H 39 | -------------------------------------------------------------------------------- /src/shared/Names.cpp.in: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 11/09/15. 3 | // 4 | 5 | #include "Names.h" 6 | 7 | QString Names::MainName() 8 | { 9 | return QString("@MAIN_NAME@"); 10 | } 11 | 12 | QString Names::HelperName() 13 | { 14 | return QString("@HELPER_NAME@"); 15 | } -------------------------------------------------------------------------------- /src/shared/Names.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 11/09/15. 3 | // 4 | 5 | #ifndef NAMES_H 6 | #define NAMES_H 7 | 8 | #include 9 | 10 | namespace Names 11 | { 12 | QString MainName(); 13 | QString HelperName(); 14 | }; 15 | 16 | #endif //NAMES_H 17 | -------------------------------------------------------------------------------- /src/shared/Paths.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 01/09/15. 3 | // 4 | 5 | #ifndef KONVERGO_PATHS_H 6 | #define KONVERGO_PATHS_H 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | namespace Paths 13 | { 14 | QString resourceDir(const QString& file = QString()); 15 | QString dataDir(const QString& file = QString()); 16 | QString cacheDir(const QString& file = QString()); 17 | QString logDir(const QString& file = QString()); 18 | QString socketName(const QString& serverName); 19 | QString soundsPath(const QString& sound); 20 | QString webClientPath(const QString& mode = "tv"); 21 | }; 22 | 23 | #endif //KONVERGO_PATHS_H 24 | -------------------------------------------------------------------------------- /src/system/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | if (OPENELEC) 2 | add_subdirectory(openelec) 3 | endif(OPENELEC) 4 | 5 | find_all_sources(. SRC) 6 | add_sources(${SRC}) -------------------------------------------------------------------------------- /src/system/OEUpdateManager.h: -------------------------------------------------------------------------------- 1 | #ifndef OEUPDATEMANAGER_H 2 | #define OEUPDATEMANAGER_H 3 | 4 | #include "UpdateManager.h" 5 | 6 | class OEUpdateManager : public UpdateManager 7 | { 8 | public: 9 | explicit OEUpdateManager(QObject *parent = nullptr) {}; 10 | ~OEUpdateManager() override {}; 11 | 12 | QString HaveUpdate() override; 13 | bool applyUpdate(const QString &version) override; 14 | void doUpdate(const QString& version) override; 15 | 16 | private: 17 | bool isMiniUpdateArchive(QString archivePath); 18 | }; 19 | 20 | #endif // OEUPDATEMANAGER_H 21 | -------------------------------------------------------------------------------- /src/system/UpdateManager.h: -------------------------------------------------------------------------------- 1 | #ifndef UPDATEMANAGER_H 2 | #define UPDATEMANAGER_H 3 | 4 | #include 5 | 6 | class UpdateManager : public QObject 7 | { 8 | Q_OBJECT 9 | public: 10 | static bool CheckForUpdates(); 11 | 12 | explicit UpdateManager(QObject *parent = nullptr) {}; 13 | ~UpdateManager() override {}; 14 | 15 | static UpdateManager* Get(); 16 | 17 | virtual QString HaveUpdate(); 18 | virtual bool applyUpdate(const QString &version); 19 | virtual void doUpdate(const QString& version); 20 | 21 | static QString GetPath(const QString &file, const QString& version, bool package); 22 | }; 23 | 24 | #endif // UPDATEMANAGER_H 25 | -------------------------------------------------------------------------------- /src/system/UpdateManagerWin32.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // Created by msn on 2016-02-16. 3 | // 4 | 5 | #include "UpdateManagerWin32.h" 6 | #include "Paths.h" 7 | 8 | #include "QsLog.h" 9 | 10 | #include 11 | #include 12 | #include 13 | 14 | ///////////////////////////////////////////////////////////////////////////////////////// 15 | bool UpdateManagerWin32::applyUpdate(const QString& version) 16 | { 17 | QString updateExe = GetPath("PlexMediaPlayer-" + version + "-windows-x64.exe", version, true); 18 | if(QFile::exists(updateExe)) 19 | { 20 | QStringList args; 21 | args << "/passive" << "/norestart" << "/log" << Paths::logDir("Plex Media Player Installer.log"); 22 | args << "autolaunch=1"; 23 | 24 | QFile::remove(GetPath("_readyToApply", version, false)); 25 | if (QProcess::startDetached(updateExe, args, QDir::temp().absolutePath())) 26 | { 27 | QLOG_DEBUG() << "Running update..."; 28 | return true; 29 | } 30 | } 31 | else 32 | { 33 | QLOG_WARN() << "Failed to find update file:" << updateExe; 34 | } 35 | 36 | return false; 37 | } 38 | -------------------------------------------------------------------------------- /src/system/UpdateManagerWin32.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 2016-02-16. 3 | // 4 | 5 | #ifndef PLEXMEDIAPLAYER_UPDATEMANAGERWIN32_H 6 | #define PLEXMEDIAPLAYER_UPDATEMANAGERWIN32_H 7 | 8 | #include "UpdateManager.h" 9 | 10 | class UpdateManagerWin32 : public UpdateManager 11 | { 12 | public: 13 | explicit UpdateManagerWin32(QObject *parent = nullptr) {}; 14 | ~UpdateManagerWin32() override {}; 15 | 16 | bool applyUpdate(const QString& version) override; 17 | }; 18 | 19 | #endif //PLEXMEDIAPLAYER_UPDATEMANAGERWIN32_H 20 | -------------------------------------------------------------------------------- /src/system/openelec/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | find_all_sources(. SRC) 2 | add_sources(${SRC}) 3 | -------------------------------------------------------------------------------- /src/system/openelec/OESystemComponent.h: -------------------------------------------------------------------------------- 1 | #ifndef OESYSTEMCOMPONENT_H 2 | #define OESYSTEMCOMPONENT_H 3 | 4 | #include 5 | 6 | #include "ComponentManager.h" 7 | 8 | class OESystemComponent : public ComponentBase 9 | { 10 | Q_OBJECT 11 | DEFINE_SINGLETON(OESystemComponent) 12 | 13 | public: 14 | OESystemComponent(QObject *parent = 0); 15 | 16 | virtual bool componentExport() { return true; } 17 | virtual const char* componentName() { return "oesystem"; } 18 | virtual bool componentInitialize(); 19 | 20 | void updateSectionSettings(const QVariantMap& values); 21 | bool setHostName(QString name); 22 | }; 23 | 24 | #endif // OESYSTEMCOMPONENT_H 25 | -------------------------------------------------------------------------------- /src/system/openelec/SystemdManager.h: -------------------------------------------------------------------------------- 1 | #ifndef SYSTEMDMANAGER_H 2 | #define SYSTEMDMANAGER_H 3 | #include 4 | 5 | class SystemdService 6 | { 7 | public: 8 | SystemdService() {}; 9 | SystemdService(QString name, QString configfile) : Name(name), ConfigFile(configfile) {}; 10 | QString Name; 11 | QString ConfigFile; 12 | 13 | }; 14 | 15 | class SystemdManager : public QObject 16 | { 17 | Q_OBJECT 18 | public: 19 | explicit SystemdManager(QObject *parent = nullptr) {}; 20 | ~SystemdManager() override {}; 21 | 22 | static bool isEnabled(SystemdService &Service); 23 | static bool enable(SystemdService &Service, bool enable); 24 | 25 | }; 26 | #endif // SYSTEMDMANAGER_H 27 | -------------------------------------------------------------------------------- /src/tools/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | #add_subdirectory(socket-client) 2 | add_subdirectory(helper) -------------------------------------------------------------------------------- /src/tools/helper/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | include_directories(${PROJECT_SOURCE_DIR}/src) 2 | 3 | if(ENABLE_CRASHDUMP) 4 | set(CRASHDUMP_SRCS CrashUploader.cpp CrashUploader.h) 5 | add_definitions(-DENABLE_CRASHDUMP -DCRASHDUMP_SECRET="${CRASHDUMP_SECRET}") 6 | endif(ENABLE_CRASHDUMP) 7 | 8 | add_executable(${HELPER_TARGET} WIN32 9 | ${CRASHDUMP_SRCS} 10 | HelperMain.cpp 11 | HelperSocket.cpp 12 | HelperSocket.h 13 | ) 14 | 15 | target_link_libraries(${HELPER_TARGET} ${Qt5Core_LIBRARIES} ${Qt5Network_LIBRARIES} qslog shared) 16 | std_target_properties(${HELPER_TARGET}) 17 | set_target_properties(${HELPER_TARGET} PROPERTIES 18 | INSTALL_RPATH "${QTROOT}/lib" 19 | OUTPUT_NAME ${HELPER_NAME} 20 | ) 21 | 22 | if(APPLE) 23 | set(PLATFORM_RESOURCE_SUFFIX /../Resources) 24 | endif(APPLE) 25 | 26 | add_custom_command( 27 | TARGET ${HELPER_TARGET} 28 | POST_BUILD 29 | COMMAND ${CMAKE_COMMAND} -E copy $ $${PLATFORM_RESOURCE_SUFFIX} 30 | ) 31 | 32 | if(NOT APPLE) 33 | install(TARGETS ${HELPER_TARGET} DESTINATION ${INSTALL_BIN_DIR}) 34 | endif(NOT APPLE) 35 | 36 | clang_tidy(${HELPER_TARGET}) 37 | -------------------------------------------------------------------------------- /src/tools/helper/CrashUploader.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 26/08/15. 3 | // 4 | 5 | #ifndef KONVERGO_CRASHUPLOADER_H 6 | #define KONVERGO_CRASHUPLOADER_H 7 | 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "Version.h" 15 | 16 | class CrashUploader : public QObject 17 | { 18 | Q_OBJECT 19 | public: 20 | CrashUploader(QObject* parent = 0); 21 | bool startUploader(); 22 | 23 | private: 24 | Q_SLOT void uploadCrashDump(const QString& version, const QString& path); 25 | 26 | QString incomingCurrentVersion() { return m_incoming + "/" + Version::GetCanonicalVersionString(); } 27 | void deleteOldCrashDumps(); 28 | void addFormField(QHttpMultiPart* multipart, const QString& name, const QString& value); 29 | void uploadAndDeleteCrashDumps(); 30 | void moveFileBackToIncoming(const QString& version, const QString& filename); 31 | void watchCrashDir(bool watch); 32 | 33 | QNetworkAccessManager* m_manager; 34 | QFileSystemWatcher* m_watcher; 35 | QHash m_urlToFileMap; 36 | QString m_old, m_incoming, m_processing; 37 | QTimer* m_scanTimer; 38 | QMutex m_scanLock; 39 | }; 40 | 41 | #endif //KONVERGO_CRASHUPLOADER_H 42 | -------------------------------------------------------------------------------- /src/tools/helper/HelperSettings.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 01/09/15. 3 | // 4 | 5 | #ifndef KONVERGO_HELPERSETTINGS_H 6 | #define KONVERGO_HELPERSETTINGS_H 7 | 8 | #include 9 | #include "Paths.h" 10 | 11 | class HelperSettings : public QSettings 12 | { 13 | public: 14 | HelperSettings() : QSettings(Paths::dataDir("helper.conf"), QSettings::IniFormat) 15 | { 16 | } 17 | }; 18 | 19 | #endif //KONVERGO_HELPERSETTINGS_H 20 | -------------------------------------------------------------------------------- /src/tools/helper/HelperSocket.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 28/08/15. 3 | // 4 | 5 | #ifndef KONVERGO_HELPERSOCKET_H 6 | #define KONVERGO_HELPERSOCKET_H 7 | 8 | #include "Paths.h" 9 | #include "LocalJsonServer.h" 10 | 11 | #include 12 | 13 | class HelperSocket : public QObject 14 | { 15 | Q_OBJECT 16 | public: 17 | explicit HelperSocket(QObject* parent = nullptr); 18 | 19 | private: 20 | Q_SLOT void clientConnected(QLocalSocket* socket); 21 | Q_SLOT void message(const QVariant& message); 22 | LocalJsonServer* m_server; 23 | QTimer* m_quitTimer; 24 | }; 25 | 26 | #endif //KONVERGO_HELPERSOCKET_H 27 | -------------------------------------------------------------------------------- /src/tools/socket-client/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | include_directories(${PROJECT_SOURCE_DIR}/src) 2 | 3 | add_executable(socket-client 4 | SocketClient.cpp 5 | $ 6 | ) 7 | std_target_properties(socket-client) 8 | target_link_libraries(socket-client ${Qt5Network_LIBRARIES} ${Qt5Core_LIBRARIES} qslog) 9 | -------------------------------------------------------------------------------- /src/tools/socket-client/SocketClient.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 26/08/15. 3 | // 4 | 5 | #include 6 | #include 7 | #include 8 | #include "LocalJsonClient.h" 9 | 10 | class SocketClient : public QObject 11 | { 12 | Q_OBJECT 13 | public: 14 | SocketClient() : QObject(NULL) 15 | { 16 | m_socket = new LocalJsonClient("inputSocket", this); 17 | m_socket->connectToServer(); 18 | 19 | connect(m_socket, &LocalJsonClient::messageReceived, this, &SocketClient::gotMessage); 20 | } 21 | 22 | void sendCommand(const QString& command) 23 | { 24 | m_commands.enqueue(command); 25 | } 26 | 27 | Q_SLOT void gotMessage(const QVariantMap& message) 28 | { 29 | qDebug() << message; 30 | doSendCommand(); 31 | } 32 | 33 | void doSendCommand() 34 | { 35 | while (!m_commands.isEmpty()) 36 | { 37 | QString cmd = m_commands.dequeue(); 38 | 39 | QVariantMap obj; 40 | obj.insert("client", "socket-client"); 41 | obj.insert("source", "direct"); 42 | obj.insert("keycode", cmd); 43 | 44 | m_socket->sendMessage(obj); 45 | 46 | qDebug() << "Sending:" << cmd; 47 | } 48 | 49 | m_socket->waitForBytesWritten(60 * 1000); 50 | m_socket->close(); 51 | exit(EXIT_SUCCESS); 52 | } 53 | 54 | private: 55 | LocalJsonClient* m_socket; 56 | QQueue m_commands; 57 | }; 58 | 59 | int main(int argc, char** argv) 60 | { 61 | QCoreApplication app(argc, argv); 62 | 63 | SocketClient* client = new SocketClient(); 64 | 65 | for (int i = 1; i < argc; i ++) 66 | client->sendCommand(QString::fromUtf8(argv[i])); 67 | 68 | return app.exec(); 69 | } 70 | 71 | 72 | #include "SocketClient.moc" -------------------------------------------------------------------------------- /src/ui/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | find_all_sources(. UI_SRCS) 2 | add_sources(${UI_SRCS} webview.qml) 3 | -------------------------------------------------------------------------------- /src/ui/ErrorMessage.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 18/03/16. 3 | // 4 | 5 | #include 6 | #include 7 | #include 8 | 9 | #include "system/SystemComponent.h" 10 | #include "settings/SettingsComponent.h" 11 | #include "ErrorMessage.h" 12 | 13 | ///////////////////////////////////////////////////////////////////////////////////////// 14 | ErrorMessage::ErrorMessage(const QString& errorMessage, bool allowResetConfig) 15 | : QMessageBox(nullptr) 16 | { 17 | setIcon(Critical); 18 | setText("Plex Media Player encountered a fatal error and must exit"); 19 | setDetailedText(errorMessage); 20 | setInformativeText("Press help below to be redirected to our friendly support forums." \ 21 | "Press reset to reset configuration to the default and try again." \ 22 | "Press abort to exit."); 23 | setWindowTitle("PMP Fatal Error!"); 24 | 25 | auto exitButton = addButton(Abort); 26 | auto helpButton = addButton(Help); 27 | 28 | QPushButton* resetButton = nullptr; 29 | if (allowResetConfig) 30 | resetButton = addButton(Reset); 31 | 32 | connect(this, &QMessageBox::buttonClicked, [=](QAbstractButton* button) 33 | { 34 | if (button == exitButton) 35 | { 36 | qApp->quit(); 37 | } 38 | else if (button == resetButton) 39 | { 40 | SettingsComponent::resetAndSaveOldConfiguration(); 41 | SystemComponent::restart(); 42 | } 43 | else if (button == helpButton) 44 | { 45 | QDesktopServices::openUrl(QUrl("https://forums.plex.tv/categories/plex-media-player")); 46 | } 47 | }); 48 | } 49 | 50 | 51 | -------------------------------------------------------------------------------- /src/ui/ErrorMessage.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 18/03/16. 3 | // 4 | 5 | #ifndef PLEXMEDIAPLAYER_ERRORMESSAGE_H 6 | #define PLEXMEDIAPLAYER_ERRORMESSAGE_H 7 | 8 | #include 9 | 10 | class ErrorMessage : public QMessageBox 11 | { 12 | Q_OBJECT 13 | public: 14 | explicit ErrorMessage(const QString& errorMessage, bool allowResetConfig = false); 15 | }; 16 | 17 | #endif //PLEXMEDIAPLAYER_ERRORMESSAGE_H 18 | -------------------------------------------------------------------------------- /src/ui/EventFilter.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 07/03/16. 3 | // 4 | 5 | #ifndef PLEXMEDIAPLAYER_EVENTFILTER_H 6 | #define PLEXMEDIAPLAYER_EVENTFILTER_H 7 | 8 | #include 9 | #include 10 | 11 | class EventFilter : public QObject 12 | { 13 | Q_OBJECT 14 | public: 15 | explicit EventFilter(QObject* parent = nullptr) : QObject(parent), m_currentKeyDown(false) {} 16 | 17 | protected: 18 | bool eventFilter(QObject* watched, QEvent* event) override; 19 | 20 | private: 21 | bool m_currentKeyDown; 22 | }; 23 | 24 | #endif //PLEXMEDIAPLAYER_EVENTFILTER_H 25 | -------------------------------------------------------------------------------- /src/utils/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | 2 | add_sources( 3 | CachedRegexMatcher.cpp CachedRegexMatcher.h 4 | PlatformUtils.cpp PlatformUtils.h 5 | HelperLauncher.h HelperLauncher.cpp 6 | Utils.cpp Utils.h 7 | Log.cpp Log.h 8 | ) 9 | 10 | if(APPLE) 11 | add_sources(HelperLaunchd.cpp HelperLaunchd.cpp) 12 | add_subdirectory(osx) 13 | endif(APPLE) 14 | 15 | if(WIN32) 16 | add_subdirectory(win) 17 | endif() 18 | -------------------------------------------------------------------------------- /src/utils/CachedRegexMatcher.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 20/08/15. 3 | // 4 | 5 | #ifndef KONVERGO_CACHEDREGEXMATCHER_H 6 | #define KONVERGO_CACHEDREGEXMATCHER_H 7 | 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | typedef QPair MatcherValuePair; 14 | typedef QList MatcherValueList; 15 | 16 | class CachedRegexMatcher : public QObject 17 | { 18 | public: 19 | explicit CachedRegexMatcher(bool allowMultiplePatterns = true, QObject* parent = nullptr) 20 | : QObject(parent), m_allowMultiplePatterns(allowMultiplePatterns) {} 21 | 22 | bool addMatcher(const QString& pattern, const QVariant& result); 23 | QVariantList match(const QString& input); 24 | void clear(); 25 | 26 | private: 27 | MatcherValueList m_matcherList; 28 | QHash m_matcherCache; 29 | bool m_allowMultiplePatterns; 30 | }; 31 | 32 | #endif //KONVERGO_CACHEDREGEXMATCHER_H 33 | -------------------------------------------------------------------------------- /src/utils/HelperLaunchd.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 18/09/15. 3 | // 4 | 5 | #ifndef PLEXTHEATER_HELPERLAUNCHD_H 6 | #define PLEXTHEATER_HELPERLAUNCHD_H 7 | 8 | #include 9 | #include 10 | 11 | class HelperLaunchd : public QObject 12 | { 13 | Q_OBJECT 14 | public: 15 | explicit HelperLaunchd(QObject* parent = nullptr); 16 | 17 | void start(); 18 | void stop(); 19 | 20 | private: 21 | bool checkHelperPath(); 22 | bool writePlist(); 23 | bool loadHelper(); 24 | bool unloadHelper(); 25 | QString launchPlistPath(); 26 | 27 | QProcess* m_launchctl; 28 | }; 29 | 30 | #endif //PLEXTHEATER_HELPERLAUNCHD_H 31 | -------------------------------------------------------------------------------- /src/utils/HelperLauncher.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 28/08/15. 3 | // 4 | 5 | #ifndef KONVERGO_HELPERLAUNCHER_H 6 | #define KONVERGO_HELPERLAUNCHER_H 7 | 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | #include "LocalJsonClient.h" 14 | #include "tools/helper/HelperSocket.h" 15 | #include "Version.h" 16 | #include "utils/Utils.h" 17 | 18 | #ifdef Q_OS_MAC 19 | #include "HelperLaunchd.h" 20 | #endif 21 | 22 | class HelperLauncher : public QObject 23 | { 24 | Q_OBJECT 25 | DEFINE_SINGLETON(HelperLauncher) 26 | public: 27 | bool connectToHelper(); 28 | static QString HelperPath(); 29 | void stop(); 30 | void start(); 31 | 32 | private Q_SLOTS: 33 | void gotMessage(const QVariantMap& message); 34 | void socketError(QLocalSocket::LocalSocketError error); 35 | void didConnect(); 36 | void launch(); 37 | void socketDisconnect(); 38 | bool killHelper(); 39 | 40 | private: 41 | explicit HelperLauncher(QObject* parent = nullptr); 42 | 43 | QProcess* m_helperProcess; 44 | LocalJsonClient* m_jsonClient; 45 | 46 | void updateClientId(); 47 | bool helperEnabled(); 48 | 49 | #ifdef Q_OS_MAC 50 | HelperLaunchd* m_launchd; 51 | #endif 52 | }; 53 | 54 | #endif //KONVERGO_HELPERLAUNCHER_H 55 | -------------------------------------------------------------------------------- /src/utils/Log.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 07/03/16. 3 | // 4 | 5 | #ifndef PLEXMEDIAPLAYER_LOG_H 6 | #define PLEXMEDIAPLAYER_LOG_H 7 | 8 | #include 9 | 10 | namespace Log 11 | { 12 | void Init(); 13 | void Uninit(); 14 | void UpdateLogLevel(); 15 | void CensorAuthTokens(QString& msg); 16 | void EnableTerminalOutput(); 17 | } 18 | 19 | #endif //PLEXMEDIAPLAYER_LOG_H 20 | -------------------------------------------------------------------------------- /src/utils/PlatformUtils.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 15/05/15. 3 | // 4 | 5 | #include "PlatformUtils.h" 6 | 7 | #ifdef Q_OS_UNIX 8 | #include 9 | #endif 10 | 11 | bool PlatformUtils::isProcessAlive(Q_PID pid) 12 | { 13 | #ifdef Q_OS_UNIX 14 | int ret = kill((pid_t)pid, 0); 15 | return ret == 0; 16 | #endif 17 | 18 | return false; 19 | } 20 | -------------------------------------------------------------------------------- /src/utils/PlatformUtils.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Tobias Hieta on 15/05/15. 3 | // 4 | 5 | #ifndef KONVERGO_PLATFORMUTILS_H 6 | #define KONVERGO_PLATFORMUTILS_H 7 | 8 | #include 9 | 10 | class PlatformUtils 11 | { 12 | public: 13 | PlatformUtils() { } 14 | static bool isProcessAlive(Q_PID pid); 15 | }; 16 | 17 | 18 | #endif //KONVERGO_PLATFORMUTILS_H 19 | -------------------------------------------------------------------------------- /src/utils/Utils.h: -------------------------------------------------------------------------------- 1 | #ifndef UTILS_H 2 | #define UTILS_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | #ifdef Q_OS_MAC 12 | #include "osx/OSXUtils.h" 13 | #elif defined(Q_OS_WIN) 14 | #include "win/WinUtils.h" 15 | #endif 16 | 17 | #define DEFINE_SINGLETON(cls) \ 18 | public: \ 19 | static cls& Get() \ 20 | { \ 21 | static cls __instance; \ 22 | return __instance; \ 23 | } \ 24 | 25 | 26 | class FatalException : public QException 27 | { 28 | public: 29 | explicit FatalException(const QString& message) : m_message(message) {} 30 | const QString& message() const { return m_message; } 31 | 32 | ~FatalException() throw() override { } 33 | 34 | private: 35 | QString m_message; 36 | }; 37 | 38 | enum Platform 39 | { 40 | PLATFORM_UNKNOWN = 0, 41 | PLATFORM_OSX = (1 << 0), 42 | PLATFORM_LINUX = (1 << 1), 43 | PLATFORM_OE_X86 = (1 << 2), 44 | PLATFORM_OE_RPI = (1 << 3), 45 | PLATFORM_WINDOWS = (1 << 4), 46 | PLATFORM_OE = (PLATFORM_OE_RPI | PLATFORM_OE_X86), 47 | PLATFORM_ANY = (PLATFORM_OSX | PLATFORM_WINDOWS | PLATFORM_LINUX | PLATFORM_OE) 48 | }; 49 | 50 | #define PLATFORM_ANY_EXCEPT(x) (PLATFORM_ANY & (~(x))) 51 | 52 | namespace Utils 53 | { 54 | Platform CurrentPlatform(); 55 | QJsonDocument OpenJsonDocument(const QString& path, QJsonParseError* err); 56 | QString CurrentUserId(); 57 | QString ComputerName(); 58 | QString PrimaryIPv4Address(); 59 | QString ClientUUID(); 60 | bool safelyWriteFile(const QString& filename, const QByteArray& data); 61 | QString sanitizeForHttpSeparators(const QString& input); 62 | } 63 | 64 | #endif // UTILS_H 65 | -------------------------------------------------------------------------------- /src/utils/osx/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(OSXUTILS_SRC OSXUtils.h OSXUtils.mm) 2 | add_sources(${OSXUTILS_SRC}) 3 | 4 | -------------------------------------------------------------------------------- /src/utils/osx/OSXUtils.h: -------------------------------------------------------------------------------- 1 | #ifndef OSXUTILS_H 2 | #define OSXUTILS_H 3 | 4 | #include 5 | #include 6 | 7 | namespace OSXUtils 8 | { 9 | QString ComputerName(); 10 | OSStatus SendAppleEventToSystemProcess(AEEventID eventToSendID); 11 | 12 | void SetCursorVisible(bool visible); 13 | }; 14 | 15 | #endif /* OSXUTILS_H */ 16 | -------------------------------------------------------------------------------- /src/utils/osx/OSXUtils.mm: -------------------------------------------------------------------------------- 1 | #include "OSXUtils.h" 2 | #include "QsLog.h" 3 | #import 4 | 5 | ///////////////////////////////////////////////////////////////////////////////////////// 6 | QString OSXUtils::ComputerName() 7 | { 8 | return QString::fromNSString([[NSHost currentHost] localizedName]); 9 | } 10 | 11 | ///////////////////////////////////////////////////////////////////////////////////////// 12 | OSStatus OSXUtils::SendAppleEventToSystemProcess(AEEventID eventToSendID) 13 | { 14 | AEAddressDesc targetDesc; 15 | static const ProcessSerialNumber kPSNOfSystemProcess = {0, kSystemProcess }; 16 | AppleEvent eventReply = {typeNull, nullptr}; 17 | AppleEvent eventToSend = {typeNull, nullptr}; 18 | 19 | OSStatus status = AECreateDesc(typeProcessSerialNumber, 20 | &kPSNOfSystemProcess, sizeof(kPSNOfSystemProcess), &targetDesc); 21 | 22 | if (status != noErr) 23 | return status; 24 | 25 | status = AECreateAppleEvent(kCoreEventClass, eventToSendID, 26 | &targetDesc, kAutoGenerateReturnID, kAnyTransactionID, &eventToSend); 27 | AEDisposeDesc(&targetDesc); 28 | 29 | if (status != noErr) 30 | return status; 31 | 32 | status = AESendMessage(&eventToSend, &eventReply, kAENormalPriority, kAEDefaultTimeout); 33 | AEDisposeDesc(&eventToSend); 34 | 35 | if (status != noErr) 36 | return status; 37 | 38 | AEDisposeDesc(&eventReply); 39 | 40 | return status; 41 | } 42 | 43 | ///////////////////////////////////////////////////////////////////////////////////////// 44 | void OSXUtils::SetCursorVisible(bool visible) 45 | { 46 | if (visible) 47 | [NSCursor unhide]; 48 | else 49 | [NSCursor hide]; 50 | } 51 | -------------------------------------------------------------------------------- /src/utils/win/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(WINUTILS_SRC WinUtils.h WinUtils.cpp) 2 | add_sources(${WINUTILS_SRC}) -------------------------------------------------------------------------------- /src/utils/win/WinUtils.cpp: -------------------------------------------------------------------------------- 1 | #include "WinUtils.h" 2 | #include "windows.h" 3 | 4 | ///////////////////////////////////////////////////////////////////////////////////////// 5 | bool WinUtils::getPowerManagementPrivileges() 6 | { 7 | HANDLE hToken = nullptr; 8 | // Get a token for this process. 9 | if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 10 | { 11 | // Get the LUID for the shutdown privilege. 12 | TOKEN_PRIVILEGES tkp = {}; 13 | if (LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid)) 14 | { 15 | tkp.PrivilegeCount = 1; // one privilege to set 16 | tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 17 | 18 | // Get the shutdown privilege for this process. 19 | if (AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0)) 20 | { 21 | CloseHandle(hToken); 22 | return true; 23 | } 24 | } 25 | } 26 | 27 | if (hToken) 28 | CloseHandle(hToken); 29 | return false; 30 | } 31 | -------------------------------------------------------------------------------- /src/utils/win/WinUtils.h: -------------------------------------------------------------------------------- 1 | #ifndef WINUTILS_H 2 | #define WINUTILS_H 3 | 4 | 5 | namespace WinUtils 6 | { 7 | bool getPowerManagementPrivileges(); 8 | } 9 | 10 | #endif // WINUTILS_H 11 | --------------------------------------------------------------------------------