├── .ci └── azure-pipelines.yml ├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── .prettierignore ├── .prettierrc ├── CONTRIBUTERS.md ├── LICENSE.md ├── README.md ├── electron-builder.yml ├── icons ├── 1024x1024.png ├── 128x128.png ├── 16x16.png ├── 24x24.png ├── 256x256.png ├── 32x32.png ├── 48x48.png ├── 512x512.png ├── 64x64.png ├── 96x96.png ├── icon.icns ├── icon.ico └── vector.svg ├── package.json ├── res ├── firstrun │ ├── Jellyfin.html │ ├── logowhite.svg │ └── style.css └── plugins │ └── mpvplayer │ ├── audio.html │ ├── strings │ ├── cs.json │ ├── de.json │ ├── en-GB.json │ ├── en-US.json │ ├── es-419.json │ ├── fr.json │ ├── hr.json │ ├── it.json │ ├── lt-LT.json │ ├── nl.json │ ├── pl.json │ ├── pt-BR.json │ ├── pt-PT.json │ ├── ru.json │ ├── sv.json │ └── zh-CN.json │ └── video.html ├── screenshots ├── Home.PNG ├── In Movies Screenshot.PNG ├── Login.PNG ├── Movies.PNG ├── Music.png └── TV_Shows.PNG ├── src ├── common │ ├── tsconfig.json │ └── types.ts ├── main │ ├── cec │ │ ├── command-map.ts │ │ └── index.ts │ ├── main.ts │ ├── playbackhandler.ts │ ├── serverdiscovery.ts │ ├── tsconfig.json │ └── wakeonlan.ts └── shell │ ├── amd.ts │ ├── apphost.ts │ ├── filesystem.ts │ ├── fullscreenmanager.ts │ ├── globals.d.ts │ ├── plugins │ ├── mpvplayer.css │ ├── mpvplayer.ts │ └── mpvplayer │ │ ├── audio.ts │ │ └── video.ts │ ├── scripts │ ├── appclose.ts │ └── videohandler.ts │ ├── serverdiscovery.ts │ ├── shell.ts │ ├── tsconfig.json │ └── wakeonlan.ts └── yarn.lock /.ci/azure-pipelines.yml: -------------------------------------------------------------------------------- 1 | trigger: 2 | batch: true 3 | branches: 4 | include: 5 | - "*" 6 | tags: 7 | include: 8 | - "*" 9 | pr: 10 | branches: 11 | include: 12 | - "*" 13 | 14 | stages: 15 | - stage: build 16 | displayName: "Build" 17 | jobs: 18 | - job: linux 19 | displayName: "Linux" 20 | 21 | variables: 22 | ELECTRON_CACHE: "$(Pipeline.Workspace)/.cache/electron" 23 | ELECTRON_BUILDER_CACHE: "$(Pipeline.Workspace)/.cache/electron-builder" 24 | YARN_CACHE_FOLDER: "$(Pipeline.Workspace)/.yarn" 25 | 26 | pool: 27 | vmImage: "ubuntu-latest" 28 | 29 | steps: 30 | - task: NodeTool@0 31 | displayName: "Install Node" 32 | inputs: 33 | versionSpec: "12.x" 34 | 35 | - task: Cache@2 36 | displayName: "Yarn Cache" 37 | inputs: 38 | key: 'yarn | "$(Agent.OS)" | yarn.lock' 39 | path: "$(YARN_CACHE_FOLDER)" 40 | 41 | - task: Cache@2 42 | displayName: "Cache" 43 | inputs: 44 | key: 'cache | "$(Agent.OS)"' 45 | path: "$(Pipeline.Workspace)/.cache" 46 | 47 | - script: "yarn install --frozen-lockfile --non-interactive" 48 | displayName: "Install Node Dependencies" 49 | 50 | - script: "yarn build:ts" 51 | displayName: "Build TypeScript Project" 52 | 53 | - script: "yarn package:linux dir" 54 | displayName: "Pack for Linux" 55 | 56 | - task: ArchiveFiles@2 57 | displayName: "Archive Directory" 58 | inputs: 59 | rootFolderOrFile: "dist/linux-unpacked" 60 | includeRootFolder: false 61 | archiveType: tar 62 | tarCompression: gz 63 | archiveFile: "jellyfin-desktop.tar.gz" 64 | 65 | - task: PublishPipelineArtifact@1 66 | displayName: "Publish Artifacts" 67 | inputs: 68 | targetPath: "$(Build.SourcesDirectory)/jellyfin-desktop.tar.gz" 69 | artifactName: "linux" 70 | 71 | - job: mac 72 | displayName: "Mac" 73 | 74 | variables: 75 | ELECTRON_CACHE: "$(Pipeline.Workspace)/.cache/electron" 76 | ELECTRON_BUILDER_CACHE: "$(Pipeline.Workspace)/.cache/electron-builder" 77 | YARN_CACHE_FOLDER: "$(Pipeline.Workspace)/.yarn" 78 | 79 | pool: 80 | vmImage: "macos-10.14" 81 | 82 | steps: 83 | - task: NodeTool@0 84 | displayName: "Install Node" 85 | inputs: 86 | versionSpec: "12.x" 87 | 88 | - task: Cache@2 89 | displayName: "Yarn Cache" 90 | inputs: 91 | key: 'yarn | "$(Agent.OS)" | yarn.lock' 92 | path: "$(YARN_CACHE_FOLDER)" 93 | 94 | - task: Cache@2 95 | displayName: "Cache" 96 | inputs: 97 | key: 'cache | "$(Agent.OS)"' 98 | path: "$(Pipeline.Workspace)/.cache" 99 | 100 | - script: "yarn install --frozen-lockfile --non-interactive" 101 | displayName: "Install Node Dependencies" 102 | 103 | - script: "yarn build:ts" 104 | displayName: "Build TypeScript Project" 105 | 106 | - script: "yarn package:mac dmg" 107 | displayName: "Pack for Mac" 108 | 109 | - script: "mv dist/*.dmg $(Build.SourcesDirectory)/jellyfin-desktop.dmg" 110 | displayName: "Move dmg" 111 | 112 | - task: PublishPipelineArtifact@1 113 | displayName: "Publish Artifacts" 114 | inputs: 115 | targetPath: "$(Build.SourcesDirectory)/jellyfin-desktop.dmg" 116 | artifactName: "mac" 117 | 118 | - job: windows 119 | displayName: "Windows" 120 | 121 | variables: 122 | ELECTRON_CACHE: "$(Pipeline.Workspace)/.cache/electron" 123 | ELECTRON_BUILDER_CACHE: "$(Pipeline.Workspace)/.cache/electron-builder" 124 | YARN_CACHE_FOLDER: "$(Pipeline.Workspace)/.yarn" 125 | 126 | pool: 127 | vmImage: "vs2017-win2016" 128 | 129 | steps: 130 | - task: NodeTool@0 131 | displayName: "Install Node" 132 | inputs: 133 | versionSpec: "12.x" 134 | 135 | - task: Cache@2 136 | displayName: "Yarn Cache" 137 | inputs: 138 | key: 'yarn | "$(Agent.OS)" | yarn.lock' 139 | path: "$(YARN_CACHE_FOLDER)" 140 | 141 | - task: Cache@2 142 | displayName: "Cache" 143 | inputs: 144 | key: 'cache | "$(Agent.OS)"' 145 | path: "$(Pipeline.Workspace)/.cache" 146 | 147 | - script: "yarn install --frozen-lockfile --non-interactive" 148 | displayName: "Install Node Dependencies" 149 | 150 | - script: "yarn build:ts" 151 | displayName: "Build TypeScript Project" 152 | 153 | - script: "yarn package:win dir" 154 | displayName: "Pack for Windows" 155 | 156 | - task: ArchiveFiles@2 157 | displayName: "Archive Directory" 158 | inputs: 159 | rootFolderOrFile: "dist/win-unpacked" 160 | includeRootFolder: false 161 | archiveType: zip 162 | archiveFile: "jellyfin-desktop.zip" 163 | 164 | - task: PublishPipelineArtifact@1 165 | displayName: "Publish Artifacts" 166 | inputs: 167 | targetPath: "$(Build.SourcesDirectory)/jellyfin-desktop.zip" 168 | artifactName: "win" 169 | 170 | - stage: test 171 | displayName: "Test" 172 | dependsOn: [] 173 | jobs: 174 | - job: lint 175 | displayName: "Lint" 176 | 177 | variables: 178 | YARN_CACHE_FOLDER: "$(Pipeline.Workspace)/.yarn" 179 | 180 | pool: 181 | vmImage: "ubuntu-latest" 182 | 183 | steps: 184 | - task: NodeTool@0 185 | displayName: "Install Node" 186 | inputs: 187 | versionSpec: "12.x" 188 | 189 | - task: Cache@2 190 | displayName: "Yarn Cache" 191 | inputs: 192 | key: 'yarn | "$(Agent.OS)" | yarn.lock' 193 | path: "$(YARN_CACHE_FOLDER)" 194 | 195 | - script: "yarn install --frozen-lockfile --non-interactive" 196 | displayName: "Install Dependencies" 197 | 198 | - script: "yarn lint" 199 | displayName: "Run ESLint" 200 | 201 | - stage: publish 202 | displayName: "Publish" 203 | dependsOn: 204 | - build 205 | - test 206 | condition: startsWith(variables['Build.SourceBranch'], 'refs/tags') 207 | jobs: 208 | - job: publish_linux 209 | displayName: "Publish Linux" 210 | 211 | variables: 212 | ELECTRON_CACHE: "$(Pipeline.Workspace)/.cache/electron" 213 | ELECTRON_BUILDER_CACHE: "$(Pipeline.Workspace)/.cache/electron-builder" 214 | YARN_CACHE_FOLDER: "$(Pipeline.Workspace)/.yarn" 215 | 216 | pool: 217 | vmImage: "ubuntu-latest" 218 | 219 | steps: 220 | - script: 'echo "##vso[task.setvariable variable=TAG]$(git describe --tags)"' 221 | displayName: "Set Tag Variable" 222 | 223 | - task: NodeTool@0 224 | displayName: "Install Node" 225 | inputs: 226 | versionSpec: "12.x" 227 | 228 | - task: Cache@2 229 | displayName: "Yarn Cache" 230 | inputs: 231 | key: 'yarn | "$(Agent.OS)" | yarn.lock' 232 | path: "$(YARN_CACHE_FOLDER)" 233 | 234 | - task: Cache@2 235 | displayName: "Cache" 236 | inputs: 237 | key: 'cache | "$(Agent.OS)"' 238 | path: "$(Pipeline.Workspace)/.cache" 239 | 240 | - script: "apt-get install -y rpmbuild" 241 | displayName: "Install Apt Dependencies" 242 | 243 | - script: "yarn install --frozen-lockfile --non-interactive" 244 | displayName: "Install Node Dependencies" 245 | 246 | - script: "yarn build:linux" 247 | displayName: "Build Linux Packages" 248 | 249 | - script: "mkdir jellyfin-desktop" 250 | displayName: "Make Output Directory" 251 | 252 | - script: "cp dist/*.{AppImage,tar.xz,snap,deb,rpm} jellyfin-desktop" 253 | displayName: "Move Binaries to Output" 254 | 255 | - task: PublishPipelineArtifact@1 256 | displayName: "Publish Artifacts" 257 | inputs: 258 | targetPath: "jellyfin-desktop" 259 | artifactName: "linux-release" 260 | 261 | - task: GithubRelease@0 262 | displayName: "GitHub Upload" 263 | inputs: 264 | gitHubConnection: Jellyfin Release Download 265 | assets: "jellyfin-desktop" 266 | action: "edit" 267 | assetUploadMode: "replace" 268 | tag: "$(TAG)" 269 | 270 | - job: publish_mac 271 | displayName: "Publish Mac" 272 | 273 | variables: 274 | ELECTRON_CACHE: "$(Pipeline.Workspace)/.cache/electron" 275 | ELECTRON_BUILDER_CACHE: "$(Pipeline.Workspace)/.cache/electron-builder" 276 | YARN_CACHE_FOLDER: "$(Pipeline.Workspace)/.yarn" 277 | 278 | pool: 279 | vmImage: "macos-10.14" 280 | 281 | steps: 282 | - script: 'echo "##vso[task.setvariable variable=TAG]$(git describe --tags)"' 283 | displayName: "Set Tag Variable" 284 | 285 | - task: NodeTool@0 286 | displayName: "Install Node" 287 | inputs: 288 | versionSpec: "12.x" 289 | 290 | - task: Cache@2 291 | displayName: "Yarn Cache" 292 | inputs: 293 | key: 'yarn | "$(Agent.OS)" | yarn.lock' 294 | path: "$(YARN_CACHE_FOLDER)" 295 | 296 | - task: Cache@2 297 | displayName: "Cache" 298 | inputs: 299 | key: 'cache | "$(Agent.OS)"' 300 | path: "$(Pipeline.Workspace)/.cache" 301 | 302 | - script: "yarn install --frozen-lockfile --non-interactive" 303 | displayName: "Install Node Dependencies" 304 | 305 | - script: "yarn build:mac" 306 | displayName: "Build Mac Packages" 307 | 308 | - script: "mkdir jellyfin-desktop" 309 | displayName: "Make Output Directory" 310 | 311 | - script: "cp dist/*.{dmg,mas,pkg,tar.gz} jellyfin-desktop" 312 | displayName: "Move Binaries to Output" 313 | 314 | - task: PublishPipelineArtifact@1 315 | displayName: "Publish Artifacts" 316 | inputs: 317 | targetPath: "jellyfin-desktop" 318 | artifactName: "mac-release" 319 | 320 | - task: GithubRelease@0 321 | displayName: "GitHub Upload" 322 | inputs: 323 | gitHubConnection: Jellyfin Release Download 324 | assets: "jellyfin-desktop" 325 | action: "edit" 326 | assetUploadMode: "replace" 327 | tag: "$(TAG)" 328 | 329 | - job: publish_win 330 | displayName: "Publish Windows" 331 | 332 | variables: 333 | ELECTRON_CACHE: "$(Pipeline.Workspace)/.cache/electron" 334 | ELECTRON_BUILDER_CACHE: "$(Pipeline.Workspace)/.cache/electron-builder" 335 | YARN_CACHE_FOLDER: "$(Pipeline.Workspace)/.yarn" 336 | 337 | pool: 338 | vmImage: "vs2017-win2016" 339 | 340 | steps: 341 | - script: 'echo "##vso[task.setvariable variable=TAG]$(git describe --tags)"' 342 | displayName: "Set Tag Variable" 343 | 344 | - task: NodeTool@0 345 | displayName: "Install Node" 346 | inputs: 347 | versionSpec: "12.x" 348 | 349 | - task: Cache@2 350 | displayName: "Yarn Cache" 351 | inputs: 352 | key: 'yarn | "$(Agent.OS)" | yarn.lock' 353 | path: "$(YARN_CACHE_FOLDER)" 354 | 355 | - task: Cache@2 356 | displayName: "Cache" 357 | inputs: 358 | key: 'cache | "$(Agent.OS)"' 359 | path: "$(Pipeline.Workspace)/.cache" 360 | 361 | - script: "yarn install --frozen-lockfile --non-interactive" 362 | displayName: "Install Node Dependencies" 363 | 364 | - script: "yarn build:win" 365 | displayName: "Build Windows Packages" 366 | 367 | - script: "mkdir jellyfin-desktop" 368 | displayName: "Make Output Directory" 369 | 370 | - script: "cp dist/*.{exe,msi,zip} jellyfin-desktop" 371 | displayName: "Move Binaries to Output" 372 | 373 | - task: PublishPipelineArtifact@1 374 | displayName: "Publish Artifacts" 375 | inputs: 376 | targetPath: "jellyfin-desktop" 377 | artifactName: "jellyfin-desktop" 378 | 379 | - task: GithubRelease@0 380 | displayName: "GitHub Upload" 381 | inputs: 382 | gitHubConnection: Jellyfin Release Download 383 | assets: "jellyfin-desktop" 384 | action: "edit" 385 | assetUploadMode: "replace" 386 | tag: "$(TAG)" 387 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 4 7 | indent_style = space 8 | insert_final_newline = true 9 | max_line_length = 120 10 | tab_width = 4 11 | 12 | [{package.json, *.yml, *.yaml}] 13 | indent_size = 2 14 | tab_width = 2 15 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parser: "@typescript-eslint/parser", 4 | plugins: [ 5 | "@typescript-eslint", 6 | "prettier" 7 | ], 8 | extends: [ 9 | "eslint:recommended", 10 | "plugin:@typescript-eslint/eslint-recommended", 11 | "plugin:@typescript-eslint/recommended", 12 | "plugin:prettier/recommended", 13 | "prettier" 14 | ], 15 | rules: { 16 | "prettier/prettier": "off", 17 | "@typescript-eslint/no-use-before-define": "off", 18 | "@typescript-eslint/no-explicit-any": "off", 19 | "@typescript-eslint/explicit-function-return-type": "off", 20 | "@typescript-eslint/no-var-requires": "off", 21 | "@typescript-eslint/no-unused-vars": "off", 22 | "@typescript-eslint/no-empty-function": "off", 23 | "@typescript-eslint/array-type": ["error", { default: "array-simple" }], 24 | "prefer-template": "error", 25 | "no-var": "off", 26 | "no-dupe-keys": "off", 27 | "no-redeclare": "off", 28 | "no-undef": "off", 29 | "@typescript-eslint/no-empty-function": "off", 30 | "@typescript-eslint/explicit-module-boundary-types": "error", 31 | }, 32 | }; 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | .env.test 60 | 61 | # parcel-bundler cache (https://parceljs.org/) 62 | .cache 63 | 64 | # next.js build output 65 | .next 66 | 67 | # nuxt.js build output 68 | .nuxt 69 | 70 | # vuepress build output 71 | .vuepress/dist 72 | 73 | # Serverless directories 74 | .serverless/ 75 | 76 | # FuseBox cache 77 | .fusebox/ 78 | 79 | # DynamoDB Local files 80 | .dynamodb/ 81 | 82 | cec/logs/ 83 | cec/test-exec-files/ 84 | 85 | *.iml 86 | .idea/ 87 | /.vs 88 | 89 | /dist 90 | /build 91 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | /build 2 | package.json 3 | /dist 4 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 4, 3 | "overrides": [ 4 | { 5 | "files": ["**/*.{json,yaml,yml}", ".prettierrc"], 6 | "options": { 7 | "tabWidth": 2 8 | } 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /CONTRIBUTERS.md: -------------------------------------------------------------------------------- 1 | # Jellyfin Contributors 2 | - [winters-brown](https://github.com/winters-brown) 3 | - [gravypod](https://github.com/gravypod) 4 | - [lachlan](https://github.com/lachlan-00) 5 | 6 | # Emby Contributors 7 | - [LukePulverenti](https://github.com/LukePulverenti) 8 | - [randomevents](https://github.com/randomevents) 9 | - [hatharry](https://github.com/hatharry) 10 | - [KeyserSoze1](https://github.com/KeyserSoze1) 11 | - [heksesang](https://github.com/heksesang) -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | {{description}} 294 | Copyright (C) {{year}} {{fullname}} 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | {signature of Ty Coon}, 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ARCHIVE NOTICE 2 | 3 | This project has been archived for the following reasons: 4 | 5 | 1. Lack of developer attention/interest. 6 | 2. The planned elimination of Electron plugins and the general state of its ecosystem. 7 | 8 | If you would like to resume maintainership of this repository, please open an issue describing your plan to contribute and the repository may be unarchived. 9 | 10 | # Jellyfin Desktop 11 | 12 | Jellyfin Desktop is a desktop client that connects to a Jellyfin server. 13 | 14 | ![image](screenshots/Home.PNG) 15 | 16 | ## Installing 17 | You can download jellyfin desktop for your operating system from the 18 | [releases page](https://github.com/jellyfin/jellyfin-desktop/releases). 19 | 20 | ### Nightly Versions 21 | You can download the latest, shiniest (and probably buggiest) version built straight from master 22 | [from the build system](https://dev.azure.com/jellyfin-project/jellyfin/_build?definitionId=22&_a=summary&repositoryFilter=13&branchFilter=1835) 23 | 24 | ## FAQ 25 | ### Jellyfin Desktop Settings Location 26 | 27 | Q: Where can I find the settings of Jellyfin Desktop? 28 | 29 | A: The settings for Jellyfin Desktop, including the server URL, are 30 | stored in the following folders: 31 | 32 | - ~~%APPDATA%/Jellyfin Theater on Windows~~ (outdated) 33 | - ~/.config/jellyfin-desktop on Linux 34 | - ~~\~/Library/Application Support/Jellyfin Theater on macOS~~ (outdated) 35 | 36 | ## Contributing 37 | ### Prerequisites 38 | This application is implemented as an Electron app and is built off of 39 | a NodeJS code base. Because of this you will need the NodeJS runtime and 40 | the `yarn` package manager. The following versions have been tested: 41 | 42 | | Software Name | Version | 43 | | ------------- | ---------------- | 44 | | Node JS | 12 | 45 | | yarn | 1.22 | 46 | 47 | To contribute you will need to set up a fork. To learn more about how to use forks, you can read 48 | "[Fork a repo](https://help.github.com/en/github/getting-started-with-github/fork-a-repo)" and 49 | "[Working with forks](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/working-with-forks)". 50 | 51 | ### Building Jellyfin Desktop 52 | After setting up you fork, you will need to install the dependencies for the project. You can do so by 53 | typing the following into your commandline: 54 | ``` 55 | $ yarn install 56 | ``` 57 | 58 | Once the installation has been finished you can start a test version of the application by using this 59 | command: 60 | ``` 61 | $ yarn start 62 | ``` 63 | 64 | #### Building Packages for Windows 65 | 66 | ```$ yarn run build:win``` 67 | 68 | #### Building Packages for Linux 69 | _Ubuntu: You need to install `rpmbuild` to build all linux packages_ 70 | 71 | ```$ yarn run build:linux``` 72 | 73 | #### Building Packages for Macintosh 74 | 75 | ```$ yarn run build:mac``` 76 | 77 | ## Screenshots 78 | 79 | ![image](screenshots/Login.PNG) 80 | ![image](screenshots/Movies.PNG) 81 | ![image](screenshots/TV_Shows.PNG) 82 | ![image](screenshots/Music.png) 83 | -------------------------------------------------------------------------------- /electron-builder.yml: -------------------------------------------------------------------------------- 1 | appId: "org.jellyfin.desktop" 2 | productName: "Jellyfin Desktop" 3 | files: 4 | - "build/**/*.js" 5 | - "res/**/*" 6 | - "icons/64x64.png" 7 | mac: 8 | target: 9 | - "dmg" 10 | - "mas" 11 | - "pkg" 12 | - "tar.gz" 13 | category: "public.app-category.video" 14 | icon: "icons/icon.icns" 15 | win: 16 | target: 17 | - "nsis" 18 | - "portable" 19 | - "msi" 20 | - "zip" 21 | icon: "icons/icon.ico" 22 | linux: 23 | target: 24 | - "AppImage" 25 | - "snap" 26 | - target: "deb" 27 | arch: 28 | - "x64" 29 | - "arm64" 30 | - "armv7l" 31 | - "rpm" 32 | - target: "tar.xz" 33 | arch: 34 | - "x64" 35 | - "ia32" 36 | - "arm64" 37 | - "armv7l" 38 | category: "AudioVideo" 39 | icon: "icons" 40 | maintainer: "Jellyfin Packaging " 41 | publish: null 42 | -------------------------------------------------------------------------------- /icons/1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/icons/1024x1024.png -------------------------------------------------------------------------------- /icons/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/icons/128x128.png -------------------------------------------------------------------------------- /icons/16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/icons/16x16.png -------------------------------------------------------------------------------- /icons/24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/icons/24x24.png -------------------------------------------------------------------------------- /icons/256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/icons/256x256.png -------------------------------------------------------------------------------- /icons/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/icons/32x32.png -------------------------------------------------------------------------------- /icons/48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/icons/48x48.png -------------------------------------------------------------------------------- /icons/512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/icons/512x512.png -------------------------------------------------------------------------------- /icons/64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/icons/64x64.png -------------------------------------------------------------------------------- /icons/96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/icons/96x96.png -------------------------------------------------------------------------------- /icons/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/icons/icon.icns -------------------------------------------------------------------------------- /icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/icons/icon.ico -------------------------------------------------------------------------------- /icons/vector.svg: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 29 | 31 | 32 | 34 | image/svg+xml 35 | 37 | icon-transparent 38 | 39 | 40 | 41 | 61 | 63 | 70 | 74 | 78 | 79 | 89 | 98 | 99 | icon-transparent 101 | 109 | 112 | 117 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jellyfin-desktop", 3 | "version": "1.0.0", 4 | "description": "Jellyfin Desktop made with Electron", 5 | "main": "build/main/main.js", 6 | "scripts": { 7 | "start": "run-s build:ts start:electron", 8 | "build:mac": "run-s build:ts package:mac", 9 | "build:win": "run-s build:ts package:win", 10 | "build:linux": "run-s build:ts package:linux", 11 | "build:ts": "tsc -b src/main src/shell", 12 | "lint": "run-p --aggregate-output -c lint:check:*", 13 | "lint:check:eslint": "eslint src/**/*.ts", 14 | "lint:check:prettier": "prettier --check **/*.{json,yaml,yml} .prettierrc", 15 | "lint:fix": "run-p --aggregate-output -c lint:fix:*", 16 | "lint:fix:eslint": "eslint --fix src/**/*.ts", 17 | "lint:fix:prettier": "prettier --write **/*.{json,yaml,yml} .prettierrc", 18 | "start:electron": "electron build/main/main.js", 19 | "package:mac": "electron-builder -m", 20 | "package:win": "electron-builder -w", 21 | "package:linux": "electron-builder -l" 22 | }, 23 | "repository": { 24 | "type": "git", 25 | "url": "git+https://github.com/jellyfin/jellyfin-desktop.git" 26 | }, 27 | "keywords": [ 28 | "Electron", 29 | "Jellyfin", 30 | "Theater", 31 | "Media Client" 32 | ], 33 | "author": { 34 | "name": "Jellyfin Team", 35 | "email": "team@jellyfin.org" 36 | }, 37 | "license": "GPL-2.0-only", 38 | "bugs": { 39 | "url": "https://github.com/jellyfin/jellyfin-desktop/issues" 40 | }, 41 | "homepage": "https://github.com/jellyfin/jellyfin-desktop#readme", 42 | "dependencies": { 43 | "detect-rpi": "^1.4.0", 44 | "electron-settings": "^3.2.0", 45 | "is-windows": "^1.0.2", 46 | "long": "^4.0.0", 47 | "node-mpv": "^1.5.0", 48 | "power-off": "^1.1.2", 49 | "sleep-mode": "^1.1.0", 50 | "tslib": "^1.11.1" 51 | }, 52 | "devDependencies": { 53 | "@chbrown/bind": "^1.0.0", 54 | "@types/electron-settings": "^3.1.1", 55 | "@types/long": "^4.0.1", 56 | "@types/node": "^12.12.37", 57 | "@typescript-eslint/eslint-plugin": "^2.29.0", 58 | "@typescript-eslint/parser": "^2.29.0", 59 | "electron": "^8.5.2", 60 | "electron-builder": "^22.5.1", 61 | "eslint": "^6.8.0", 62 | "eslint-config-prettier": "^6.11.0", 63 | "eslint-plugin-prettier": "^3.1.3", 64 | "npm-run-all": "^4.1.5", 65 | "prettier": "^2.0.5", 66 | "typescript": "^3.8.3" 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /res/firstrun/Jellyfin.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Jellyfin Theater 5 | 6 | 7 | 8 | 9 |
10 |
11 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | 23 |

Connect to Server

24 | 25 |
26 | 27 | 28 |
Server Address (ex. 192.168.1.100 or https://myserver.com
29 |
30 | 31 |
32 | 33 | 34 |
35 | 36 | 39 |
40 |
41 |
42 |
43 |
44 |
45 | 56 | 57 | -------------------------------------------------------------------------------- /res/firstrun/logowhite.svg: -------------------------------------------------------------------------------- 1 | 2 | 22 | -------------------------------------------------------------------------------- /res/firstrun/style.css: -------------------------------------------------------------------------------- 1 | body, 2 | html { 3 | margin: 0; 4 | padding: 0; 5 | height: 100% 6 | } 7 | 8 | html { 9 | line-height: 1.35 10 | } 11 | 12 | body { 13 | overflow-y: scroll!important; 14 | overflow-x: hidden; 15 | background-color: transparent!important; 16 | -webkit-font-smoothing: antialiased 17 | } 18 | 19 | .mainAnimatedPage { 20 | contain: style size!important 21 | } 22 | 23 | div[data-role=page] { 24 | outline: 0 25 | } 26 | 27 | .pageTitle { 28 | margin-top: 0; 29 | font-family: inherit 30 | } 31 | 32 | .fieldDescription { 33 | padding-left: .15em; 34 | font-weight: 400; 35 | white-space: normal!important 36 | } 37 | 38 | .fieldDescription+.fieldDescription { 39 | margin-top: .3em 40 | } 41 | 42 | .padded-bottom-page, 43 | .page { 44 | padding-bottom: 5em!important 45 | } 46 | 47 | @media all and (min-width:50em) { 48 | form { 49 | max-width: 54em 50 | } 51 | } 52 | 53 | html { 54 | font-family: -apple-system, Helvetica, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", 'Open Sans', sans-serif 55 | } 56 | 57 | html { 58 | font-size: 93%; 59 | -webkit-text-size-adjust: 100%; 60 | text-size-adjust: 100% 61 | } 62 | 63 | h1, 64 | h2, 65 | h3 { 66 | font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", 'Open Sans', sans-serif 67 | } 68 | 69 | h1 { 70 | font-weight: 500; 71 | font-size: 1.8em 72 | } 73 | 74 | h2 { 75 | font-weight: 500; 76 | font-size: 1.5em 77 | } 78 | 79 | h3 { 80 | font-weight: 500; 81 | font-size: 1.17em 82 | } 83 | 84 | .pageTitle { 85 | vertical-align: middle 86 | } 87 | 88 | .sectionTabs { 89 | text-align: center 90 | } 91 | 92 | .standalonePage { 93 | padding-top: 4.5em!important 94 | } 95 | 96 | .headerButton { 97 | -webkit-flex-shrink: 0; 98 | flex-shrink: 0 99 | } 100 | 101 | .pageTitle { 102 | display: -webkit-inline-box; 103 | display: -webkit-inline-flex; 104 | display: inline-flex; 105 | margin: 0 0 0 .5em; 106 | height: 1.7em; 107 | -webkit-box-align: center; 108 | -webkit-align-items: center; 109 | align-items: center; 110 | -webkit-flex-shrink: 1; 111 | flex-shrink: 1 112 | } 113 | 114 | .headerLeft, 115 | .skinHeader { 116 | display: -webkit-box; 117 | display: -webkit-flex 118 | } 119 | 120 | .skinHeader { 121 | -webkit-flex-direction: column; 122 | -webkit-box-orient: vertical; 123 | -webkit-box-direction: normal 124 | } 125 | 126 | .pageTitleWithLogo { 127 | background-position: left center; 128 | -webkit-background-size: contain; 129 | background-size: contain; 130 | background-repeat: no-repeat; 131 | width: 13.2em 132 | } 133 | 134 | .skinHeader { 135 | position: fixed; 136 | right: 0; 137 | left: 0; 138 | z-index: 999; 139 | top: 0; 140 | border: 0; 141 | display: flex; 142 | flex-direction: column; 143 | contain: layout style paint 144 | } 145 | 146 | .headerLeft { 147 | -webkit-box-align: center 148 | } 149 | 150 | .headerTop { 151 | padding: .54em 0 152 | } 153 | 154 | .headerLeft { 155 | display: flex; 156 | -webkit-align-items: center; 157 | align-items: center; 158 | -webkit-box-flex: 1; 159 | -webkit-flex-grow: 1; 160 | flex-grow: 1; 161 | overflow: hidden 162 | } 163 | 164 | .sectionTabs { 165 | width: 100% 166 | } 167 | 168 | @media all and (max-width:84em) { 169 | .sectionTabs { 170 | font-size: 83.5% 171 | } 172 | } 173 | 174 | @media all and (min-width:84em) { 175 | .headerTop { 176 | padding: 1.489em 0 177 | } 178 | .headerTabs { 179 | -webkit-align-self: center; 180 | align-self: center; 181 | width: auto; 182 | -webkit-box-align: center; 183 | -webkit-align-items: center; 184 | align-items: center; 185 | -webkit-box-pack: center; 186 | -webkit-justify-content: center; 187 | justify-content: center; 188 | margin-top: -3.34em; 189 | position: relative; 190 | top: -1.05em 191 | } 192 | } 193 | 194 | .padded-left { 195 | padding-left: 2% 196 | } 197 | 198 | .padded-right { 199 | padding-right: 2% 200 | } 201 | 202 | .padded-bottom { 203 | padding-bottom: 1em 204 | } 205 | 206 | @media all and (min-width:31.25em) { 207 | .padded-left { 208 | padding-left: 6% 209 | } 210 | .padded-right { 211 | padding-right: 6% 212 | } 213 | } 214 | 215 | @media all and (min-width:37.5em) { 216 | .padded-left { 217 | padding-left: 4% 218 | } 219 | .padded-right { 220 | padding-right: 4% 221 | } 222 | } 223 | 224 | @media all and (min-width:50em) { 225 | .padded-left { 226 | padding-left: 3.2% 227 | } 228 | .padded-right { 229 | padding-right: 3.2% 230 | } 231 | } 232 | 233 | @media all and (min-width:64em) { 234 | .padded-left { 235 | padding-left: 3.3% 236 | } 237 | .padded-right { 238 | padding-right: 3.3% 239 | } 240 | } 241 | 242 | @font-face { 243 | font-family: 'Material Icons'; 244 | font-style: normal; 245 | font-weight: 400; 246 | src: local('Material Icons'), local('MaterialIcons-Regular'), url(flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2) format('woff2'), url(flUhRq6tzZclQEJ-Vdg-IuiaDsNa.woff) format('woff') 247 | } 248 | 249 | @keyframes backdrop-fadein { 250 | from { 251 | opacity: 0 252 | } 253 | to { 254 | opacity: 1 255 | } 256 | } 257 | 258 | @-webkit-keyframes mdl-spinner__container-rotate { 259 | to { 260 | -webkit-transform: rotate(360deg); 261 | transform: rotate(360deg) 262 | } 263 | } 264 | 265 | @keyframes mdl-spinner__container-rotate { 266 | to { 267 | -webkit-transform: rotate(360deg); 268 | transform: rotate(360deg) 269 | } 270 | } 271 | 272 | @-webkit-keyframes mdl-spinner__fill-unfill-rotate { 273 | 12.5% { 274 | -webkit-transform: rotate(135deg); 275 | transform: rotate(135deg) 276 | } 277 | 25% { 278 | -webkit-transform: rotate(270deg); 279 | transform: rotate(270deg) 280 | } 281 | 37.5% { 282 | -webkit-transform: rotate(405deg); 283 | transform: rotate(405deg) 284 | } 285 | 50% { 286 | -webkit-transform: rotate(540deg); 287 | transform: rotate(540deg) 288 | } 289 | 62.5% { 290 | -webkit-transform: rotate(675deg); 291 | transform: rotate(675deg) 292 | } 293 | 75% { 294 | -webkit-transform: rotate(810deg); 295 | transform: rotate(810deg) 296 | } 297 | 87.5% { 298 | -webkit-transform: rotate(945deg); 299 | transform: rotate(945deg) 300 | } 301 | to { 302 | -webkit-transform: rotate(1080deg); 303 | transform: rotate(1080deg) 304 | } 305 | } 306 | 307 | @keyframes mdl-spinner__fill-unfill-rotate { 308 | 12.5% { 309 | -webkit-transform: rotate(135deg); 310 | transform: rotate(135deg) 311 | } 312 | 25% { 313 | -webkit-transform: rotate(270deg); 314 | transform: rotate(270deg) 315 | } 316 | 37.5% { 317 | -webkit-transform: rotate(405deg); 318 | transform: rotate(405deg) 319 | } 320 | 50% { 321 | -webkit-transform: rotate(540deg); 322 | transform: rotate(540deg) 323 | } 324 | 62.5% { 325 | -webkit-transform: rotate(675deg); 326 | transform: rotate(675deg) 327 | } 328 | 75% { 329 | -webkit-transform: rotate(810deg); 330 | transform: rotate(810deg) 331 | } 332 | 87.5% { 333 | -webkit-transform: rotate(945deg); 334 | transform: rotate(945deg) 335 | } 336 | to { 337 | -webkit-transform: rotate(1080deg); 338 | transform: rotate(1080deg) 339 | } 340 | } 341 | 342 | @-webkit-keyframes mdl-spinner__layer-1-fade-in-out { 343 | from { 344 | opacity: .99 345 | } 346 | 25% { 347 | opacity: .99 348 | } 349 | 26% { 350 | opacity: 0 351 | } 352 | 89% { 353 | opacity: 0 354 | } 355 | 90% { 356 | opacity: .99 357 | } 358 | 100% { 359 | opacity: .99 360 | } 361 | } 362 | 363 | @keyframes mdl-spinner__layer-1-fade-in-out { 364 | from { 365 | opacity: .99 366 | } 367 | 25% { 368 | opacity: .99 369 | } 370 | 26% { 371 | opacity: 0 372 | } 373 | 89% { 374 | opacity: 0 375 | } 376 | 90% { 377 | opacity: .99 378 | } 379 | 100% { 380 | opacity: .99 381 | } 382 | } 383 | 384 | @-webkit-keyframes mdl-spinner__layer-2-fade-in-out { 385 | from { 386 | opacity: 0 387 | } 388 | 15% { 389 | opacity: 0 390 | } 391 | 25% { 392 | opacity: .99 393 | } 394 | 50% { 395 | opacity: .99 396 | } 397 | 51% { 398 | opacity: 0 399 | } 400 | } 401 | 402 | @keyframes mdl-spinner__layer-2-fade-in-out { 403 | from { 404 | opacity: 0 405 | } 406 | 15% { 407 | opacity: 0 408 | } 409 | 25% { 410 | opacity: .99 411 | } 412 | 50% { 413 | opacity: .99 414 | } 415 | 51% { 416 | opacity: 0 417 | } 418 | } 419 | 420 | @-webkit-keyframes mdl-spinner__layer-3-fade-in-out { 421 | from { 422 | opacity: 0 423 | } 424 | 40% { 425 | opacity: 0 426 | } 427 | 50% { 428 | opacity: .99 429 | } 430 | 75% { 431 | opacity: .99 432 | } 433 | 76% { 434 | opacity: 0 435 | } 436 | } 437 | 438 | @keyframes mdl-spinner__layer-3-fade-in-out { 439 | from { 440 | opacity: 0 441 | } 442 | 40% { 443 | opacity: 0 444 | } 445 | 50% { 446 | opacity: .99 447 | } 448 | 75% { 449 | opacity: .99 450 | } 451 | 76% { 452 | opacity: 0 453 | } 454 | } 455 | 456 | @-webkit-keyframes mdl-spinner__layer-4-fade-in-out { 457 | from { 458 | opacity: 0 459 | } 460 | 65% { 461 | opacity: 0 462 | } 463 | 75% { 464 | opacity: .99 465 | } 466 | 90% { 467 | opacity: .99 468 | } 469 | 100% { 470 | opacity: 0 471 | } 472 | } 473 | 474 | @keyframes mdl-spinner__layer-4-fade-in-out { 475 | from { 476 | opacity: 0 477 | } 478 | 65% { 479 | opacity: 0 480 | } 481 | 75% { 482 | opacity: .99 483 | } 484 | 90% { 485 | opacity: .99 486 | } 487 | 100% { 488 | opacity: 0 489 | } 490 | } 491 | 492 | @-webkit-keyframes mdl-spinner__left-spin { 493 | from { 494 | -webkit-transform: rotate(130deg); 495 | transform: rotate(130deg) 496 | } 497 | 50% { 498 | -webkit-transform: rotate(-5deg); 499 | transform: rotate(-5deg) 500 | } 501 | to { 502 | -webkit-transform: rotate(130deg); 503 | transform: rotate(130deg) 504 | } 505 | } 506 | 507 | @keyframes mdl-spinner__left-spin { 508 | from { 509 | -webkit-transform: rotate(130deg); 510 | transform: rotate(130deg) 511 | } 512 | 50% { 513 | -webkit-transform: rotate(-5deg); 514 | transform: rotate(-5deg) 515 | } 516 | to { 517 | -webkit-transform: rotate(130deg); 518 | transform: rotate(130deg) 519 | } 520 | } 521 | 522 | @-webkit-keyframes mdl-spinner__right-spin { 523 | from { 524 | -webkit-transform: rotate(-130deg); 525 | transform: rotate(-130deg) 526 | } 527 | 50% { 528 | -webkit-transform: rotate(5deg); 529 | transform: rotate(5deg) 530 | } 531 | to { 532 | -webkit-transform: rotate(-130deg); 533 | transform: rotate(-130deg) 534 | } 535 | } 536 | 537 | @keyframes mdl-spinner__right-spin { 538 | from { 539 | -webkit-transform: rotate(-130deg); 540 | transform: rotate(-130deg) 541 | } 542 | 50% { 543 | -webkit-transform: rotate(5deg); 544 | transform: rotate(5deg) 545 | } 546 | to { 547 | -webkit-transform: rotate(-130deg); 548 | transform: rotate(-130deg) 549 | } 550 | } 551 | 552 | .mainAnimatedPage { 553 | position: absolute; 554 | top: 0; 555 | left: 0; 556 | right: 0; 557 | bottom: 0; 558 | contain: layout style size 559 | } 560 | 561 | @keyframes view-fadeout { 562 | from { 563 | opacity: 1 564 | } 565 | to { 566 | opacity: 0 567 | } 568 | } 569 | 570 | @keyframes view-fadein { 571 | from { 572 | opacity: 0 573 | } 574 | to { 575 | opacity: 1 576 | } 577 | } 578 | 579 | @keyframes view-slideleft { 580 | from { 581 | transform: translate3d(100%, 0, 0) 582 | } 583 | to { 584 | transform: none 585 | } 586 | } 587 | 588 | @keyframes view-slideleft-r { 589 | from { 590 | transform: none 591 | } 592 | to { 593 | transform: translate3d(-100%, 0, 0) 594 | } 595 | } 596 | 597 | @keyframes view-slideright { 598 | from { 599 | transform: translate3d(-100%, 0, 0) 600 | } 601 | to { 602 | transform: none 603 | } 604 | } 605 | 606 | @keyframes view-slideright-r { 607 | from { 608 | transform: none 609 | } 610 | to { 611 | transform: translate3d(100%, 0, 0) 612 | } 613 | } 614 | 615 | .flex { 616 | display: flex 617 | } 618 | 619 | .inline-flex { 620 | display: inline-flex 621 | } 622 | 623 | .flex-grow { 624 | flex-grow: 1 625 | } 626 | 627 | .align-items-center { 628 | align-items: center 629 | } 630 | 631 | .emby-button { 632 | position: relative; 633 | display: inline-flex; 634 | align-items: center; 635 | box-sizing: border-box; 636 | margin: 0 .29em; 637 | text-align: center; 638 | font-size: inherit; 639 | font-family: inherit; 640 | color: inherit; 641 | outline-width: 0; 642 | -moz-user-select: none; 643 | -ms-user-select: none; 644 | -webkit-user-select: none; 645 | user-select: none; 646 | cursor: pointer; 647 | z-index: 0; 648 | padding: .86em 1em; 649 | vertical-align: middle; 650 | border: 0; 651 | vertical-align: middle; 652 | border-radius: .2em; 653 | outline: 0!important; 654 | position: relative; 655 | font-weight: 600; 656 | -webkit-tap-highlight-color: transparent; 657 | text-decoration: none; 658 | line-height: 1.35 659 | } 660 | 661 | .emby-button::-moz-focus-inner { 662 | border: 0 663 | } 664 | 665 | .button-link { 666 | background: 0 0; 667 | margin: 0; 668 | padding: 0; 669 | vertical-align: initial 670 | } 671 | 672 | .button-link-inline { 673 | display: inline 674 | } 675 | 676 | .button-link:hover { 677 | text-decoration: underline 678 | } 679 | 680 | .emby-button.block { 681 | display: block; 682 | align-items: center; 683 | justify-content: center; 684 | margin: .25em 0; 685 | width: 100% 686 | } 687 | 688 | .paper-icon-button-light { 689 | position: relative; 690 | display: inline-flex; 691 | align-items: center; 692 | box-sizing: border-box; 693 | margin: 0 .29em; 694 | background: 0 0; 695 | text-align: center; 696 | font-size: inherit; 697 | font-family: inherit; 698 | color: inherit; 699 | -moz-user-select: none; 700 | -ms-user-select: none; 701 | -webkit-user-select: none; 702 | user-select: none; 703 | cursor: pointer; 704 | z-index: 0; 705 | min-width: initial; 706 | min-height: initial; 707 | width: auto; 708 | height: auto; 709 | padding: .556em; 710 | vertical-align: middle; 711 | border: 0; 712 | vertical-align: middle; 713 | outline: 0!important; 714 | position: relative; 715 | overflow: hidden; 716 | border-radius: 50%; 717 | -webkit-tap-highlight-color: transparent; 718 | justify-content: center 719 | } 720 | 721 | .paper-icon-button-light::-moz-focus-inner { 722 | border: 0 723 | } 724 | 725 | .paper-icon-button-light[disabled] { 726 | opacity: .3 727 | } 728 | 729 | .emby-input { 730 | display: block; 731 | margin: 0; 732 | margin-bottom: 0!important; 733 | font-size: 110%; 734 | font-family: inherit; 735 | font-weight: inherit; 736 | padding: .4em .25em; 737 | -webkit-box-sizing: border-box; 738 | box-sizing: border-box; 739 | outline: 0!important; 740 | -webkit-tap-highlight-color: transparent; 741 | width: 100% 742 | } 743 | 744 | .emby-input::-moz-focus-inner { 745 | border: 0 746 | } 747 | 748 | .inputContainer { 749 | margin-bottom: 1.8em 750 | } 751 | 752 | .inputLabel { 753 | display: inline-block; 754 | margin-bottom: .25em 755 | } 756 | 757 | .emby-input+.fieldDescription { 758 | margin-top: .25em 759 | } 760 | 761 | @keyframes lazy-image-fadein { 762 | from { 763 | opacity: 0 764 | } 765 | to { 766 | opacity: 1 767 | } 768 | } 769 | 770 | @keyframes popInAnimation { 771 | 0% { 772 | opacity: 0 773 | } 774 | 100% { 775 | opacity: 1 776 | } 777 | } 778 | 779 | .skinHeader, 780 | html { 781 | color: #ddd; 782 | color: rgba(255, 255, 255, .8) 783 | } 784 | 785 | .skinHeader-withBackground { 786 | background-color: #101010 787 | } 788 | 789 | .pageTitleWithDefaultLogo { 790 | background-image: url(logowhite.svg) 791 | } 792 | 793 | html { 794 | background-color: #101010 795 | } 796 | 797 | .paper-icon-button-light:focus { 798 | color: #00a4dc; 799 | background-color: rgba(0, 164, 220, .2) 800 | } 801 | 802 | .raised { 803 | background: #303030; 804 | color: rgba(255, 255, 255, .87) 805 | } 806 | 807 | .raised:focus { 808 | background: #383838 809 | } 810 | 811 | .button-submit { 812 | background: #00a4dc; 813 | color: #fff 814 | } 815 | 816 | .button-submit:focus { 817 | background: #0cb0e8; 818 | color: #fff 819 | } 820 | 821 | .inputLabel, 822 | .inputLabelUnfocused { 823 | color: #bbb; 824 | color: rgba(255, 255, 255, .7) 825 | } 826 | 827 | .fieldDescription { 828 | color: #999; 829 | color: rgba(255, 255, 255, .5) 830 | } 831 | 832 | @supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)) { 833 | .appfooter-blurred { 834 | background: rgba(24, 24, 24, .7); 835 | -webkit-backdrop-filter: blur(20px); 836 | backdrop-filter: blur(20px) 837 | } 838 | } 839 | 840 | .button-link { 841 | color: #00a4dc 842 | } 843 | 844 | .emby-input { 845 | color: inherit; 846 | background: #292929; 847 | border: .07em solid #292929; 848 | -webkit-border-radius: .15em; 849 | border-radius: .15em 850 | } 851 | 852 | .emby-input:focus { 853 | border-color: #00a4dc 854 | } 855 | 856 | ::-webkit-scrollbar-track { 857 | -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .3) 858 | } 859 | 860 | ::-webkit-scrollbar-track-piece { 861 | background-color: #3b3b3b 862 | } 863 | 864 | ::-webkit-scrollbar-thumb:horizontal, 865 | ::-webkit-scrollbar-thumb:vertical { 866 | -webkit-border-radius: 2px; 867 | background: center no-repeat #888 868 | } 869 | 870 | .manualLoginForm { 871 | margin: 0 auto 872 | } 873 | 874 | .manualLoginForm>h1 { 875 | margin-top: 1em; 876 | text-align: left 877 | } 878 | -------------------------------------------------------------------------------- /res/plugins/mpvplayer/audio.html: -------------------------------------------------------------------------------- 1 | 
2 |
3 |
4 | 5 |
6 | 7 |
8 | 14 |
15 | 16 |
17 | 18 |
19 | 23 | 27 | 31 | 35 | 39 |
40 |
41 | 42 |
43 | 56 |
57 | 58 |
59 | 63 |
${EnableExclusiveAudioModeHelp}
64 |
65 | 66 |
67 | 68 |
69 | 73 |
74 |
${LabelUpmixAudioForHelp}
75 |
76 |
77 | 78 |
79 |
80 |
-------------------------------------------------------------------------------- /res/plugins/mpvplayer/strings/cs.json: -------------------------------------------------------------------------------- 1 | { 2 | "UserRefreshRate": "Preferovan\u00e1 rychlost obnovy", 3 | "UserRefreshRateHelp": "Zadejte preferovan\u00e9 rychlosti se\u0159azen\u00e9 podle preferenc\u00ed, odd\u011blen\u00e9 st\u0159edn\u00edkem (nap\u0159. 50;60;23)", 4 | "EnableVideoDisplaySyncingHelp": "Znovu p\u0159evzorkovat zvuk, aby odpov\u00eddal videu. Tento re\u017eim se tak\u00e9 pokus\u00ed upravit rychlost zvuku, aby kompenzoval posun. (To znamen\u00e1, \u017ee p\u0159ehr\u00e1v\u00e1 zvuk s r\u016fznou rychlost\u00ed, aby se sn\u00ed\u017eil rozd\u00edl mezi A/V.)", 5 | "LabelOutputRange": "V\u00fdstupn\u00ed rozsah:", 6 | "LabelHardwareAccelerationMode": "Re\u017eim hardwarov\u00e9 akcelerace:", 7 | "Auto": "Auto", 8 | "None": "\u017d\u00e1dn\u00fd", 9 | "ChangeRefreshRate": "Zm\u011bnit obnovovac\u00ed frekvenci displeje, aby odpov\u00eddalo videu", 10 | "ChangeRefreshRateHelp": "Zm\u011bn\u00ed obnovovac\u00ed frekvenci prim\u00e1rn\u00edho displeje tak, aby se p\u0159ibl\u00ed\u017eila aktu\u00e1ln\u011b p\u0159ehr\u00e1van\u00e9mu video streamu. \u00dadajn\u011b funguje l\u00e9pe, kdy\u017e je tak\u00e9 povolena funkce Video Display Sync.", 11 | "LabelSpeakerLayout": "Rozlo\u017een\u00ed reproduktor\u016f:", 12 | "Stereo": "Stereo", 13 | "Quadraphonic": "Kvadratick\u00e9", 14 | "Surround": "Surround", 15 | "LabelDynamicRangeCompression": "Komprese dynamick\u00e9ho rozsahu:", 16 | "LabelEnableAudioPassthroughFor": "Povolit zvukov\u00fd pr\u016fchod pro:", 17 | "LabelUpmixAudioFor": "Mixovat audio kan\u00e1ly pro:", 18 | "LabelUpmixAudioForHelp": "Mixovat audio pro vyu\u017eit\u00ed v\u0161ech kan\u00e1l\u016f reproduktor\u016f.", 19 | "EnableDeinterlacing": "Povolit deinterlaci", 20 | "EnableOpenGlHq": "Povolit profil OpenGL vysok\u00e9 kvality", 21 | "EnableVideoDisplaySyncing": "Povolit synchronizaci video displeje", 22 | "EnableInterpolation": "Povolit interpolaci", 23 | "EnableInterpolationHelp": "Zmen\u0161it kokt\u00e1n\u00ed zp\u016fsoben\u00e9 nesouladem video fps s obnovovac\u00ed frekvenc\u00ed displeje (zn\u00e1m\u00e9 tak\u00e9 jako rozru\u0161en\u00ed).", 24 | "EnableExclusiveAudioMode": "Povolit exkluzivn\u00ed audio re\u017eim", 25 | "SettingRequiresHighEnd": "Toto nastaven\u00ed vy\u017eaduje high-endov\u00fd audio syst\u00e9m.", 26 | "DefaultScalingMethod": "V\u00fdchoz\u00ed metoda \u0161k\u00e1lov\u00e1n\u00ed:", 27 | "ChromaScalingMethod": "Chroma metoda \u0161k\u00e1lov\u00e1n\u00ed:", 28 | "DownScalingMethod": "Metoda downscalingu:", 29 | "TScalingMethod": "Metoda \u0161k\u00e1lov\u00e1n\u00ed \u010dasov\u00e9 osy:", 30 | "ForceCorrectDownscaling": "Vynutit spr\u00e1vn\u00fd downscaling", 31 | "ForceCorrectDownscalingHelp": "P\u0159i pou\u017eit\u00ed filtr\u016f zalo\u017een\u00fdch na konvoluci zv\u011bt\u0161\u00ed velikost filtru p\u0159i sn\u00ed\u017een\u00ed rozsahu. Zvy\u0161uje kvalitu, ale sni\u017euje v\u00fdkon p\u0159i downscalingu.", 32 | "EnableDeband": "Povolit debandovac\u00ed algoritmus", 33 | "EnableDebandHelp": "Toto zna\u010dn\u011b sni\u017euje mno\u017estv\u00ed viditeln\u00fdch p\u00e1sov\u00fdch, blokovac\u00edch a dal\u0161\u00edch kvantiza\u010dn\u00edch artefakt\u016f na \u00fakor v\u00fdkonu a velmi mal\u00e9ho rozmaz\u00e1n\u00ed n\u011bkter\u00fdch nejjemn\u011bj\u0161\u00edch detail\u016f.", 34 | "EnableSigmoid": "Aktivovat sigmoid\u00e1ln\u00ed transformaci barev", 35 | "EnableSigmoidHelp": "P\u0159i upscalingu pou\u017e\u00edt sigmoid\u00e1ln\u00ed transformaci barev, abyste se vyhnuli zv\u00fdrazn\u011bn\u00ed vyzv\u00e1n\u011bc\u00edch artefakt\u016f.", 36 | "LabelOutputRangeHelp": "Doporu\u010duje se m\u00edsto toho pou\u017e\u00edt volbu barevn\u00e9ho rozsahu grafick\u00e9ho ovlada\u010de, pokud je k dispozici.", 37 | "LabelDitherDepth": "Rozsah hloubky:", 38 | "LabelDitherDepthHelp": "M\u011bjte na pam\u011bti, \u017ee hloubku p\u0159ipojen\u00e9ho za\u0159\u00edzen\u00ed pro video zobrazen\u00ed nelze zjistit. \u010casto si LCD panely d\u011blaj\u00ed dithering samy o sob\u011b, co\u017e je v rozporu s touto volbou a vede k o\u0161kliv\u00e9mu v\u00fdstupu.", 39 | "Dither8": "Dot\u00e1hnout na 8-bitov\u00fd v\u00fdstup", 40 | "DefaultAudioDelay": "V\u00fdchoz\u00ed zpo\u017ed\u011bn\u00ed zvuku:", 41 | "DefaultAudioDelayHelp": "Zpo\u017ed\u011bn\u00ed zvuku v milisekund\u00e1ch.", 42 | "AudioDelay2325": "Zpo\u017ed\u011bn\u00ed zvuku (23 - 25 fps):", 43 | "AudioDelay2325Help": "Zpo\u017ed\u011bn\u00ed zvuku v milisekund\u00e1ch pro videa se sn\u00edmkovou frekvenc\u00ed 23-25 \u200b\u200bfps.", 44 | "EnableExclusiveAudioModeHelp": "Povolit re\u017eim exkluzivn\u00edho v\u00fdstupu. V tomto re\u017eimu je syst\u00e9m obvykle uzam\u010den a pouze Emby bude schopen generovat v\u00fdstup zvuku.", 45 | "ThreeDMode": "Re\u017eim 3D konverze:", 46 | "MonoConvertTo2D": "Mono (konverze do 2D)" 47 | } 48 | -------------------------------------------------------------------------------- /res/plugins/mpvplayer/strings/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "UserRefreshRate": "Bevorzugte Bildwiederholraten", 3 | "UserRefreshRateHelp": "F\u00fcge Bildwiederholraten in der bevorzugten Reihenfolge getrennt mit einem Semikolon ein. (z.B. 50;60;23) ", 4 | "EnableVideoDisplaySyncingHelp": "Resamplen der Audiospur um sie an das Video anzupassen. Dieser Modus versucht zudem die Audio Geschwindigkeit anzupassen. (Das bedeutet, die Audiospur wird ab und an mit einer anderen Geschwindigkeit abgespielt um die Differenz zum Video auszugleichen.)", 5 | "LabelOutputRange": "Ausgabebereich:", 6 | "LabelHardwareAccelerationMode": "Hardwarebeschleunigung:", 7 | "Auto": "Auto", 8 | "None": "Keine", 9 | "ChangeRefreshRate": "\u00c4ndere Bildwiederholfrequenz des Displays passend zum Video", 10 | "ChangeRefreshRateHelp": "Ver\u00e4ndert die Bildwiederholrate des Hauptbildschirms, um ihn besser an die des laufenden Video-Streams anzupassen. Erfahrungsgem\u00e4\u00df klappt das am besten wenn die \"Video Display Synchronisierung\" ebenso eingeschaltet ist.", 11 | "LabelSpeakerLayout": "Lautsprecheranordnung:", 12 | "Stereo": "Stereo", 13 | "Quadraphonic": "Quadrophonisch", 14 | "Surround": "Surround", 15 | "LabelDynamicRangeCompression": "Dynamische Kompression:", 16 | "LabelEnableAudioPassthroughFor": "Aktiviere Audio-Passthrough f\u00fcr:", 17 | "LabelUpmixAudioFor": "Audio Upmix f\u00fcr:", 18 | "LabelUpmixAudioForHelp": "Upmix der Audiospur zur Verwendung aller Lautsprecherkan\u00e4le.", 19 | "EnableDeinterlacing": "Aktiviere Deinterlacing", 20 | "EnableOpenGlHq": "Aktiviere OpenGL High Quality Profil", 21 | "EnableVideoDisplaySyncing": "Aktiviere Video Display Synchronisierung", 22 | "EnableInterpolation": "Aktiviere Interpolation", 23 | "EnableInterpolationHelp": "Reduziert Mikroruckeln verursacht durch unterschiedliche Bildwiederholfrequenzen des Videos und des Displays (auch bekannt als Judder).", 24 | "EnableExclusiveAudioMode": "Aktiviere exklusiven Audiomodus", 25 | "SettingRequiresHighEnd": "Diese Einstellung ben\u00f6tigt ein High-End System.", 26 | "DefaultScalingMethod": "Standard Skalierungsmethode:", 27 | "ChromaScalingMethod": "Chroma Skalierungsmethode:", 28 | "DownScalingMethod": "Methode zum Herunterskalieren:", 29 | "TScalingMethod": "Methode zur Skalierung in der Zeitachse:", 30 | "ForceCorrectDownscaling": "Erzwinge korrektes Herunterskalieren", 31 | "ForceCorrectDownscalingHelp": "Wenn faltungsbasierte Filter verwendet werden, erweitere die Filtergr\u00f6\u00dfe beim Herunterskalieren. Erh\u00f6ht die Qualit\u00e4t, aber reduziert die Leistung beim herunterskalieren.", 32 | "EnableDeband": "Aktiviere Debanding Algorithmus", 33 | "EnableDebandHelp": "Dies reduziert in hohem Ma\u00dfe sichtbares Banding, Blocking und andere Quantisierungsartefakte, zu Lasten der Leistung und einer sehr geringen Weichzeichnung von einigen der feinsten Details.", 34 | "EnableSigmoid": "Aktiviere sigmoidale Farbtransformation", 35 | "EnableSigmoidHelp": "Im Falle einer Hochskalierung, benutze eine sigmoidale Farbtransformation um Ringing Artefakte zu vermeiden.", 36 | "LabelOutputRangeHelp": "Es wird dazu geraten, die Einstellung zum Ausgabebereich im Grafikkartentreiber zu verwenden, falls verf\u00fcgbar.", 37 | "LabelDitherDepth": "Dither Tiefe:", 38 | "LabelDitherDepthHelp": "Es ist zu beachten, dass die Tiefe des verbundenem Displays nciht erkannt werden kann. H\u00e4ufig erledigen LCD Displays das Dithering selbst, was zu Konflikten mit dieser Option f\u00fchrt und die Ausgabe verschlechtert.", 39 | "Dither8": "Dither auf 8 bit Ausgabe", 40 | "DefaultAudioDelay": "Standard Audioverz\u00f6gerung:", 41 | "DefaultAudioDelayHelp": "Audioverz\u00f6gerung in Millisekunden:", 42 | "AudioDelay2325": "Audioverz\u00f6gerung (23-25 Bilder/Sekunde)", 43 | "AudioDelay2325Help": "Audioverz\u00f6gerung f\u00fcr Videos mit Bildraten von 23-25 Bilder/Sekunde.", 44 | "EnableExclusiveAudioModeHelp": "Verwende Exklusiven Audio Ausgabe Modus. In diesem Modus ist das System f\u00fcr weitere Audioausgaben gesperrt und nur Emby kann Audio wiedergeben.", 45 | "ThreeDMode": "3D Konversion Modus", 46 | "MonoConvertTo2D": "Mono (Konvertiere zu 2D)" 47 | } 48 | -------------------------------------------------------------------------------- /res/plugins/mpvplayer/strings/en-GB.json: -------------------------------------------------------------------------------- 1 | { 2 | "UserRefreshRate": "Preferred Refresh Rates", 3 | "UserRefreshRateHelp": "Add Refresh Rates in the order of preference and separate with semicolon (e.g. 50;60;23)", 4 | "EnableVideoDisplaySyncingHelp": "Resample audio to match the video. This mode will also try to adjust audio speed to compensate for other drift. (This means it will play the audio at a different speed every once in a while to reduce the A/V difference.)", 5 | "LabelOutputRange": "Output range:", 6 | "LabelHardwareAccelerationMode": "Hardware acceleration mode:", 7 | "Auto": "Auto", 8 | "None": "None", 9 | "ChangeRefreshRate": "Change display refresh rate to match video", 10 | "ChangeRefreshRateHelp": "Changes the primary display refresh rate to closer align with the currently playing video stream. Reportedly works better when Video Display Sync is enabled as well.", 11 | "LabelSpeakerLayout": "Speaker layout:", 12 | "Stereo": "Stereo", 13 | "Quadraphonic": "Quadraphonic", 14 | "Surround": "Surround", 15 | "LabelDynamicRangeCompression": "Dynamic range compression:", 16 | "LabelEnableAudioPassthroughFor": "Enable audio passthrough for:", 17 | "LabelUpmixAudioFor": "Upmix audio channels for:", 18 | "LabelUpmixAudioForHelp": "Up-mix audio to utilise all speaker channels.", 19 | "EnableDeinterlacing": "Enable deinterlacing", 20 | "EnableOpenGlHq": "Enable OpenGL high quality profile", 21 | "EnableVideoDisplaySyncing": "Enable video display syncing", 22 | "EnableInterpolation": "Enable interpolation", 23 | "EnableInterpolationHelp": "Reduce stuttering caused by mismatches in the video FPS and display refresh rate (also known as judder).", 24 | "EnableExclusiveAudioMode": "Enable exclusive audio mode", 25 | "SettingRequiresHighEnd": "This setting requires a high end system.", 26 | "DefaultScalingMethod": "Default scaling method:", 27 | "ChromaScalingMethod": "Chroma scaling method:", 28 | "DownScalingMethod": "Downscaling method:", 29 | "TScalingMethod": "Temporal axis scaling method:", 30 | "ForceCorrectDownscaling": "Force correct downscaling", 31 | "ForceCorrectDownscalingHelp": "When using convolution based filters, extend the filter size when downscaling. Increases quality, but reduces performance while downscaling.", 32 | "EnableDeband": "Enable the debanding algorithm", 33 | "EnableDebandHelp": "This greatly reduces the amount of visible banding, blocking and other quantisation artifacts, at the expense of performance and very slight blurring of some of the finest details.", 34 | "EnableSigmoid": "Enable sigmoidal colour transform", 35 | "EnableSigmoidHelp": "When upscaling, use a sigmoidal colour transform to avoid emphasising ringing artifacts.", 36 | "LabelOutputRangeHelp": "It is advisable to use your graphics driver's colour range option instead, if available.", 37 | "LabelDitherDepth": "Dither depth:", 38 | "LabelDitherDepthHelp": "Note that the depth of the connected video display device cannot be detected. Often, LCD panels will do dithering on their own, which conflicts with this option and leads to ugly output.", 39 | "Dither8": "Dither to 8 bit output", 40 | "DefaultAudioDelay": "Default audio delay:", 41 | "DefaultAudioDelayHelp": "Audio delay in milliseconds.", 42 | "AudioDelay2325": "Audio delay (23-25 fps):", 43 | "AudioDelay2325Help": "Audio delay in milliseconds for videos with framerates from 23-25 fps.", 44 | "EnableExclusiveAudioModeHelp": "Enable exclusive output mode. In this mode, the system is usually locked out and only Emby will be able to output audio.", 45 | "ThreeDMode": "3D conversion mode:", 46 | "MonoConvertTo2D": "mono (convert to 2D)" 47 | } 48 | -------------------------------------------------------------------------------- /res/plugins/mpvplayer/strings/en-US.json: -------------------------------------------------------------------------------- 1 | { 2 | "LabelOutputRange": "Output range:", 3 | "LabelHardwareAccelerationMode": "Hardware acceleration mode:", 4 | "Auto": "Auto", 5 | "None": "None", 6 | "ChangeRefreshRate": "Change display refresh rate to match video", 7 | "ChangeRefreshRateHelp": "Changes the primary display refresh rate to closer align with the currently playing video stream. Reportedly works better when Video Display Sync is enabled as well.", 8 | "UserRefreshRate": "Preferred Refresh Rates", 9 | "UserRefreshRateHelp": "Add Refresh Rates in the order of preference and separate with semicolon (ex. 50;60;23)", 10 | "LabelSpeakerLayout": "Speaker layout:", 11 | "Stereo": "Stereo", 12 | "Quadraphonic": "Quadraphonic", 13 | "Surround": "Surround", 14 | "LabelDynamicRangeCompression": "Dynamic range compression:", 15 | "LabelEnableAudioPassthroughFor": "Enable audio passthrough for:", 16 | "LabelUpmixAudioFor": "Upmix audio channels for:", 17 | "LabelUpmixAudioForHelp": "Upmix audio to utilize all speaker channels.", 18 | "EnableDeinterlacing": "Enable deinterlacing", 19 | "EnableOpenGlHq": "Enable OpenGL high quality profile", 20 | "EnableVideoDisplaySyncing": "Enable video display syncing", 21 | "EnableVideoDisplaySyncingHelp": "Resample audio to match the video. This mode will also try to adjust audio speed to compensate for other drift. (This means it will play the audio at a different speed every once in a while to reduce the A/V difference.)", 22 | "EnableInterpolation": "Enable interpolation", 23 | "EnableInterpolationHelp": "Reduce stuttering caused by mismatches in the video fps and display refresh rate (also known as judder).", 24 | "EnableExclusiveAudioMode": "Enable exclusive audio mode", 25 | "SettingRequiresHighEnd": "This setting requires a high end system.", 26 | "DefaultScalingMethod": "Default scaling method:", 27 | "ChromaScalingMethod": "Chroma scaling method:", 28 | "DownScalingMethod": "Downscaling method:", 29 | "TScalingMethod": "Temporal axis scaling method:", 30 | "ForceCorrectDownscaling": "Force correct downscaling", 31 | "ForceCorrectDownscalingHelp": "When using convolution based filters, extend the filter size when downscaling. Increases quality, but reduces performance while downscaling.", 32 | "EnableDeband": "Enable the debanding algorithm", 33 | "EnableDebandHelp": "This greatly reduces the amount of visible banding, blocking and other quantization artifacts, at the expense of performance and very slight blurring of some of the finest details.", 34 | "EnableSigmoid": "Enable sigmoidal color transform", 35 | "EnableSigmoidHelp": "When upscaling, use a sigmoidal color transform to avoid emphasizing ringing artifacts.", 36 | "LabelOutputRangeHelp": "It is advisable to use your graphics driver's color range option instead, if available.", 37 | "LabelDitherDepth": "Dither depth:", 38 | "LabelDitherDepthHelp": "Note that the depth of the connected video display device cannot be detected. Often, LCD panels will do dithering on their own, which conflicts with this option and leads to ugly output.", 39 | "Dither8": "Dither to 8 bit output", 40 | "DefaultAudioDelay": "Default audio delay:", 41 | "DefaultAudioDelayHelp": "Audio delay in milliseconds.", 42 | "AudioDelay2325": "Audio delay (23-25 fps):", 43 | "AudioDelay2325Help": "Audio delay in milliseconds for videos with framerates from 23-25 fps.", 44 | "EnableExclusiveAudioModeHelp": "Enable exclusive output mode. In this mode, the system is usually locked out, and only Emby will be able to output audio.", 45 | "ThreeDMode": "3D conversion mode:", 46 | "MonoConvertTo2D": "mono (convert to 2D)" 47 | } 48 | -------------------------------------------------------------------------------- /res/plugins/mpvplayer/strings/es-419.json: -------------------------------------------------------------------------------- 1 | { 2 | "UserRefreshRate": "Tazas de Actualizaci\u00f3n Preferidas", 3 | "UserRefreshRateHelp": "Agregue Tazas de Actualizaci\u00f3n en el orden de preferencia y separarlos con punto y coma (ejem. 50;60;23)", 4 | "EnableVideoDisplaySyncingHelp": "Volver a muestrear el audio para que concuerde con el video. Este modo intentara tambi\u00e9n ajustar la velocidad del audio para compensar otros problemas. (Esto quiere decir que reproducir\u00e1 el audio a diferentes velocidades de cuando en cuando para reducir la diferencia de A/V.)", 5 | "LabelOutputRange": "Rango de salida:", 6 | "LabelHardwareAccelerationMode": "Modo de aceleraci\u00f3n por hardware:", 7 | "Auto": "Autom\u00e1tico", 8 | "None": "Ninguno", 9 | "ChangeRefreshRate": "Cambiar la taza de actualizaci\u00f3n de la pantalla para que coincida con la del video.", 10 | "ChangeRefreshRateHelp": "Cambia la taza de actualizaci\u00f3n de la pantalla principal para que concuerde con la del video reproduci\u00e9ndose actualmente. Supuestamente funciona mejor cuando la Sincronizaci\u00f3n de Video y Pantalla esta activada.", 11 | "LabelSpeakerLayout": "Configuraci\u00f3n de Altavoces:", 12 | "Stereo": "Est\u00e9reo", 13 | "Quadraphonic": "Cuadraf\u00f3nico", 14 | "Surround": "Envolvente", 15 | "LabelDynamicRangeCompression": "Compresi\u00f3n de rango din\u00e1mico:", 16 | "LabelEnableAudioPassthroughFor": "Habilitar traspasar audio para:", 17 | "LabelUpmixAudioFor": "Volver a mezclar canales de audio a:", 18 | "LabelUpmixAudioForHelp": "Volver a mezclar audio para usar todas las bocinas.", 19 | "EnableDeinterlacing": "Habilitar des-entrelazado", 20 | "EnableOpenGlHq": "Habilitar perfil de alta calidad de OpenGL", 21 | "EnableVideoDisplaySyncing": "Habilitar sincronizacion de video y pantalla", 22 | "EnableInterpolation": "Habilitar Interpolaci\u00f3n", 23 | "EnableInterpolationHelp": "Reducir el entrecortado causado por discordancia entre los fps (cuadros por segundo) del video y la frecuencia de actualizaci\u00f3n.", 24 | "EnableExclusiveAudioMode": "Habilitar modo de audio exclusivo", 25 | "SettingRequiresHighEnd": "Esta configuraci\u00f3n requiere un sistema de gama alta.", 26 | "DefaultScalingMethod": "M\u00e9todo de escalado por defecto:", 27 | "ChromaScalingMethod": "M\u00e9todo de escalado de Chroma:", 28 | "DownScalingMethod": "M\u00e9todo de reducci\u00f3n de imagen:", 29 | "TScalingMethod": "M\u00e9todo de escalado temporal del eje:", 30 | "ForceCorrectDownscaling": "Forzar reducci\u00f3n de imagen correcta", 31 | "ForceCorrectDownscalingHelp": "Al usar filtros basados en circunvoluci\u00f3n, entender el tama\u00f1o del filtro al reducir la imagen. Incrementa la calidad, pero reduce el rendimiento al reducir la imagen.", 32 | "EnableDeband": "Habilitar algoritmo de suavizado de bandas", 33 | "EnableDebandHelp": "Esto reduce en gran medida la cantidad de bandas visibles (banding), cuadriculado (blocking) y otros artefactos de cuantizaci\u00f3n, a costa de rendimiento y un ligero emborronamiento de peque\u00f1os detalles.", 34 | "EnableSigmoid": "Habilitar transformaci\u00f3n de color sigmoidal", 35 | "EnableSigmoidHelp": "Al escalar, usar una transformaci\u00f3n de color sigmoidal para evadir el \u00e9nfasis en artefactos circulares.", 36 | "LabelOutputRangeHelp": "Es recomendable usar el rango de color usado por el driver de video, si esta disponible.", 37 | "LabelDitherDepth": "Profundidad de interpolado:", 38 | "LabelDitherDepthHelp": "Note que la profundidad de la pantalla conectada no puede ser detectada. Frecuentemente, los paneles LCD har\u00e1n interpolado por si mismos, lo cual entra en conflicto con esta opci\u00f3n llevando a una mala calidad de imagen.", 39 | "Dither8": "Interpolar a salida de 8 bit", 40 | "DefaultAudioDelay": "Retraso de audio por defecto:", 41 | "DefaultAudioDelayHelp": "Retraso de audio en milisegundos.", 42 | "AudioDelay2325": "Retraso de audio (23-25 fps):", 43 | "AudioDelay2325Help": "Retraso de audio en milisegundos para videos de 23-25 fps (cuadros por segundo).", 44 | "EnableExclusiveAudioModeHelp": "Habilita el modo de salida exclusivo. En este modo, el sistema esta usualmente bloqueado, y solo Emby podr\u00e1 reproducir audio.", 45 | "ThreeDMode": "Modo de conversi\u00f3n 3D:", 46 | "MonoConvertTo2D": "mono (convertir a 2D)" 47 | } 48 | -------------------------------------------------------------------------------- /res/plugins/mpvplayer/strings/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "UserRefreshRate": "Fr\u00e9quences de rafra\u00eechissement pr\u00e9f\u00e9r\u00e9es", 3 | "UserRefreshRateHelp": "Ajoutez les fr\u00e9quences de rafra\u00eechissement par ordre de pr\u00e9f\u00e9rence en les s\u00e9parant par un point-virgule (p. ex. 50;60;23)", 4 | "EnableVideoDisplaySyncingHelp": "R\u00e9-\u00e9chantillonner l'audio pour s'aligner sur la vid\u00e9o. Ce mode essayera \u00e9galement d'ajuster la vitesse de l'audio pour compenser les d\u00e9calages. (Cela signifie que l'audio sera lu a une vitesse diff\u00e9rente de temps en temps pour r\u00e9duire l'\u00e9cart entre l'audio et la vid\u00e9o.)", 5 | "LabelOutputRange": "Plage de sortie\u00a0:", 6 | "LabelHardwareAccelerationMode": "Mode d'acc\u00e9l\u00e9ration mat\u00e9rielle\u00a0:", 7 | "Auto": "Auto", 8 | "None": "Aucun", 9 | "ChangeRefreshRate": "Changer la fr\u00e9quence de rafra\u00eechissement de l'\u00e9cran pour correspondre \u00e0 la vid\u00e9o", 10 | "ChangeRefreshRateHelp": "Change la fr\u00e9quence de rafra\u00eechissement de l'\u00e9cran principal pour s'harmoniser avec le flux vid\u00e9o en cours de lecture. Semble mieux fonctionner quand la synchronisation de l'affichage vid\u00e9o est \u00e9galement activ\u00e9e.", 11 | "LabelSpeakerLayout": "Disposition des hauts-parleurs\u00a0:", 12 | "Stereo": "St\u00e9r\u00e9o", 13 | "Quadraphonic": "Quadraphonic", 14 | "Surround": "Surround", 15 | "LabelDynamicRangeCompression": "Compression dynamique\u00a0:", 16 | "LabelEnableAudioPassthroughFor": "Activer le passthrough audio pour :", 17 | "LabelUpmixAudioFor": "Activer l'upmix des canaux audio pour\u00a0:", 18 | "LabelUpmixAudioForHelp": "Activer l'upmix sur l'audio pour utiliser tous les canaux des hauts-parleurs.", 19 | "EnableDeinterlacing": "Activer le d\u00e9s-entrelacement", 20 | "EnableOpenGlHq": "Activer le profil haute qualit\u00e9 d'OpenGL", 21 | "EnableVideoDisplaySyncing": "Activer la synchronisation de l'affichage vid\u00e9o", 22 | "EnableInterpolation": "Activer l'interpolation", 23 | "EnableInterpolationHelp": "R\u00e9duit les saccades dues aux \u00e9carts entre le d\u00e9bit d'images de la vid\u00e9o et le taux de rafra\u00eechissement de l'\u00e9cran.", 24 | "EnableExclusiveAudioMode": "Activer le mode audio exclusif", 25 | "SettingRequiresHighEnd": "Ce param\u00e8tre n\u00e9cessite un syst\u00e8me haut de gamme.", 26 | "DefaultScalingMethod": "M\u00e9thode de mise \u00e0 l'\u00e9chelle par d\u00e9faut\u00a0:", 27 | "ChromaScalingMethod": "M\u00e9thode de mise \u00e0 l'\u00e9chelle des couleurs :", 28 | "DownScalingMethod": "M\u00e9thode de r\u00e9duction d'\u00e9chelle :", 29 | "TScalingMethod": "M\u00e9thode de mise \u00e0 l'\u00e9chelle de l'axe temporel :", 30 | "ForceCorrectDownscaling": "Forcer la r\u00e9duction d'\u00e9chelle correcte", 31 | "ForceCorrectDownscalingHelp": "En utilisant des filtres bas\u00e9s sur la convolution, augmente la taille du filtre lors de la r\u00e9duction d'\u00e9chelle. Augmente la qualit\u00e9 mais r\u00e9duit les performances pendant la r\u00e9duction d'\u00e9chelle.", 32 | "EnableDeband": "Activer l\u2019algorithme pour enlever les bandes", 33 | "EnableDebandHelp": "Cela r\u00e9duit grandement les bandes visibles et autres artefacts, aux d\u00e9pens de la performance et de la nettet\u00e9 de certains petits d\u00e9tails.", 34 | "EnableSigmoid": "Activer la transformation sigmo\u00efdale des couleurs", 35 | "EnableSigmoidHelp": "Lors de l'augmentation d'\u00e9chelle, utiliser une transformation sigmo\u00efdale pour les couleurs afin d'\u00e9viter les artefacts de sur-oscillation.", 36 | "LabelOutputRangeHelp": "Il est plut\u00f4t conseill\u00e9 d'utiliser l'option de plage de couleur de votre carte graphique, si possible.", 37 | "LabelDitherDepth": "Niveau de tramage :", 38 | "LabelDitherDepthHelp": "Veuillez noter que le niveau de l'appareil d'affichage connect\u00e9 ne peut pas \u00eatre d\u00e9tect\u00e9. Souvent, les dalles LCD effectuent leur propre tramage, qui pourrait entrer en conflit avec cette option et produire un mauvais r\u00e9sultat en sortie.", 39 | "Dither8": "Tramage de sortie sur 8 bit", 40 | "DefaultAudioDelay": "D\u00e9lai audio par d\u00e9faut :", 41 | "DefaultAudioDelayHelp": "D\u00e9lai audio en millisecondes.", 42 | "AudioDelay2325": "D\u00e9lai audio (23-25 ips) :", 43 | "AudioDelay2325Help": "D\u00e9lai audio en millisecondes pour les vid\u00e9os avec un d\u00e9bit d'images de 23-25 images par seconde.", 44 | "EnableExclusiveAudioModeHelp": "Active le mode de sortie exclusif. Dans ce mode, le syst\u00e8me est g\u00e9n\u00e9ralement bloqu\u00e9, seul Emby pourra utiliser les sorties audio.", 45 | "ThreeDMode": "Mode de conversion 3D\u00a0:", 46 | "MonoConvertTo2D": "Mono (convertir en 2D)" 47 | } 48 | -------------------------------------------------------------------------------- /res/plugins/mpvplayer/strings/hr.json: -------------------------------------------------------------------------------- 1 | { 2 | "UserRefreshRate": "Preferred Refresh Rates", 3 | "UserRefreshRateHelp": "Add Refresh Rates in the order of preference and separate with semicolon (ex. 50;60;23)", 4 | "EnableVideoDisplaySyncingHelp": "Resample audio to match the video. This mode will also try to adjust audio speed to compensate for other drift. (This means it will play the audio at a different speed every once in a while to reduce the A/V difference.)", 5 | "LabelOutputRange": "Output range:", 6 | "LabelHardwareAccelerationMode": "Hardware acceleration mode:", 7 | "Auto": "Automatski", 8 | "None": "Ni\u0161ta", 9 | "ChangeRefreshRate": "Promijeni brzinu osvje\u017eavanja monitora kako bi se slagala sa videom", 10 | "ChangeRefreshRateHelp": "Changes the primary display refresh rate to closer align with the currently playing video stream. Reportedly works better when Video Display Sync is enabled as well.", 11 | "LabelSpeakerLayout": "Speaker layout:", 12 | "Stereo": "Stereo", 13 | "Quadraphonic": "Kvadrifoni\u010dan", 14 | "Surround": "Okru\u017eeni", 15 | "LabelDynamicRangeCompression": "Dynamic range compression:", 16 | "LabelEnableAudioPassthroughFor": "Enable audio passthrough for:", 17 | "LabelUpmixAudioFor": "Upmix audio channels for:", 18 | "LabelUpmixAudioForHelp": "Upmix audio to utilize all speaker channels.", 19 | "EnableDeinterlacing": "Enable deinterlacing", 20 | "EnableOpenGlHq": "Enable OpenGL high quality profile", 21 | "EnableVideoDisplaySyncing": "Enable video display syncing", 22 | "EnableInterpolation": "Enable interpolation", 23 | "EnableInterpolationHelp": "Reduce stuttering caused by mismatches in the video fps and display refresh rate (also known as judder).", 24 | "EnableExclusiveAudioMode": "Enable exclusive audio mode", 25 | "SettingRequiresHighEnd": "This setting requires a high end system.", 26 | "DefaultScalingMethod": "Default scaling method:", 27 | "ChromaScalingMethod": "Chroma scaling method:", 28 | "DownScalingMethod": "Downscaling method:", 29 | "TScalingMethod": "Temporal axis scaling method:", 30 | "ForceCorrectDownscaling": "Force correct downscaling", 31 | "ForceCorrectDownscalingHelp": "When using convolution based filters, extend the filter size when downscaling. Increases quality, but reduces performance while downscaling.", 32 | "EnableDeband": "Enable the debanding algorithm", 33 | "EnableDebandHelp": "This greatly reduces the amount of visible banding, blocking and other quantization artifacts, at the expense of performance and very slight blurring of some of the finest details.", 34 | "EnableSigmoid": "Enable sigmoidal color transform", 35 | "EnableSigmoidHelp": "When upscaling, use a sigmoidal color transform to avoid emphasizing ringing artifacts.", 36 | "LabelOutputRangeHelp": "It is advisable to use your graphics driver's color range option instead, if available.", 37 | "LabelDitherDepth": "Dither depth:", 38 | "LabelDitherDepthHelp": "Note that the depth of the connected video display device cannot be detected. Often, LCD panels will do dithering on their own, which conflicts with this option and leads to ugly output.", 39 | "Dither8": "Dither to 8 bit output", 40 | "DefaultAudioDelay": "Default audio delay:", 41 | "DefaultAudioDelayHelp": "Audio delay in milliseconds.", 42 | "AudioDelay2325": "Audio delay (23-25 fps):", 43 | "AudioDelay2325Help": "Audio delay in milliseconds for videos with framerates from 23-25 fps.", 44 | "EnableExclusiveAudioModeHelp": "Enable exclusive output mode. In this mode, the system is usually locked out, and only Emby will be able to output audio.", 45 | "ThreeDMode": "3D conversion mode:", 46 | "MonoConvertTo2D": "mono (convert to 2D)" 47 | } 48 | -------------------------------------------------------------------------------- /res/plugins/mpvplayer/strings/it.json: -------------------------------------------------------------------------------- 1 | { 2 | "UserRefreshRate": "Frequenze di aggiornamento preferite", 3 | "UserRefreshRateHelp": "Aggiungi frequenze di aggiornamento nell'ordine di preferenza e separa con punto e virgola (ad esempio 50; 60; 23)", 4 | "EnableVideoDisplaySyncingHelp": "Ricampiona audio per abbinare il video. Questa modalit\u00e0 cercher\u00e0 anche di regolare la velocit\u00e0 dell'audio per compensare altre derive. (Ci\u00f2 significa che riprodurr\u00e0 l'audio a una velocit\u00e0 diversa ogni tanto per ridurre la differenza A / V).", 5 | "LabelOutputRange": "Gamma output:", 6 | "LabelHardwareAccelerationMode": "Accelerazione Hardware:", 7 | "Auto": "Auto", 8 | "None": "Nessuno", 9 | "ChangeRefreshRate": "Modifica frequenza di refresh del display in base al video", 10 | "ChangeRefreshRateHelp": "Cambia la frequenza di aggiornamento del display principale per renderla pi\u00f9 simile al flusso video attualmente in riproduzione. Funziona al meglio quando \u00e8 abilitato anche Video Display Sync.", 11 | "LabelSpeakerLayout": "Layout Speaker:", 12 | "Stereo": "Stereo", 13 | "Quadraphonic": "Quadrifonia", 14 | "Surround": "Surround", 15 | "LabelDynamicRangeCompression": "Compressione dinamica:", 16 | "LabelEnableAudioPassthroughFor": "Attiva il passthrough audio per:", 17 | "LabelUpmixAudioFor": "Upmix canali audio per:", 18 | "LabelUpmixAudioForHelp": "Upmix audio per utilizzare tutti i canali degli altoparlanti.", 19 | "EnableDeinterlacing": "Abilita deinterlacciamento", 20 | "EnableOpenGlHq": "Abilita profilo di alta qualit\u00e0 di OpenGL", 21 | "EnableVideoDisplaySyncing": "Abilita la sincronizzazione del video", 22 | "EnableInterpolation": "Attiva l'interpolazione", 23 | "EnableInterpolationHelp": "Riduce lo stuttering causato da disallineamenti negli fps dei video e nella frequenza di aggiornamento del display (noto anche come judder).", 24 | "EnableExclusiveAudioMode": "Abilita la modalit\u00e0 audio esclusiva", 25 | "SettingRequiresHighEnd": "Questa impostazione richiede un sistema di fascia alta.", 26 | "DefaultScalingMethod": "Metodo di scaling predefinito:", 27 | "ChromaScalingMethod": "Metodo di scaling Chroma:", 28 | "DownScalingMethod": "Metodo Downscaling:", 29 | "TScalingMethod": "Metodo di scaling dell'asse temporale:", 30 | "ForceCorrectDownscaling": "Forza downscaling corretto", 31 | "ForceCorrectDownscalingHelp": "Quando si utilizzano filtri basati su convoluzione, estendere la dimensione del filtro quando si riduce il downscaling. Aumenta la qualit\u00e0, ma riduce le prestazioni durante il downscaling.", 32 | "EnableDeband": "Attiva l'algoritmo di debianizzazione", 33 | "EnableDebandHelp": "Ci\u00f2 riduce notevolmente la quantit\u00e0 di bande visibili, bloccanti e altri artefatti di quantizzazione, a scapito delle prestazioni e della leggera sfocatura di alcuni dei dettagli migliori.", 34 | "EnableSigmoid": "Abilita trasformazione sigmoidale", 35 | "EnableSigmoidHelp": "Quando eseguire l'upscaling, utilizzare una trasformazione dei colori sigmoidale per evitare di sottolineare gli artefatti sonori.", 36 | "LabelOutputRangeHelp": "\u00c8 consigliabile utilizzare l'opzione di gamma dei colori dei driver grafici, se disponibile.", 37 | "LabelDitherDepth": "Profondit\u00e0 di retinatura:", 38 | "LabelDitherDepthHelp": "Notare che la profondit\u00e0 del dispositivo di visualizzazione video collegato non pu\u00f2 essere rilevata. Spesso i pannelli dell'affissione a cristalli liquidi faranno dithering da soli, che sono in conflitto con questa opzione e portano ad un brutto output.", 39 | "Dither8": "Retinatura output a 8 bit", 40 | "DefaultAudioDelay": "Ritardo audio predefinito:", 41 | "DefaultAudioDelayHelp": "Ritardo audio in millisecondi.", 42 | "AudioDelay2325": "Ritardo audio (23-25 \u200b\u200bfps):", 43 | "AudioDelay2325Help": "Ritardo audio in millisecondi per i video con framerate da 23 a 25 fps.", 44 | "EnableExclusiveAudioModeHelp": "Abilita la modalit\u00e0 di output esclusiva. In questa modalit\u00e0, il sistema \u00e8 di solito bloccato e solo Emby sar\u00e0 in grado di emettere audio.", 45 | "ThreeDMode": "modalit\u00e0 conversione 3D:", 46 | "MonoConvertTo2D": "mono (converti in 2D)" 47 | } 48 | -------------------------------------------------------------------------------- /res/plugins/mpvplayer/strings/lt-LT.json: -------------------------------------------------------------------------------- 1 | { 2 | "UserRefreshRate": "Preferred Refresh Rates", 3 | "UserRefreshRateHelp": "Add Refresh Rates in the order of preference and separate with semicolon (ex. 50;60;23)", 4 | "EnableVideoDisplaySyncingHelp": "Resample audio to match the video. This mode will also try to adjust audio speed to compensate for other drift. (This means it will play the audio at a different speed every once in a while to reduce the A/V difference.)", 5 | "LabelOutputRange": "Output range:", 6 | "LabelHardwareAccelerationMode": "Hardware acceleration mode:", 7 | "Auto": "Auto", 8 | "None": "Joks", 9 | "ChangeRefreshRate": "Pakeisti monitoriaus da\u017en\u012f kad sutapt\u0173 su video", 10 | "ChangeRefreshRateHelp": "Changes the primary display refresh rate to closer align with the currently playing video stream. Reportedly works better when Video Display Sync is enabled as well.", 11 | "LabelSpeakerLayout": "Speaker layout:", 12 | "Stereo": "Stereo", 13 | "Quadraphonic": "Keturi", 14 | "Surround": "Aplink garsas", 15 | "LabelDynamicRangeCompression": "Dynamic range compression:", 16 | "LabelEnableAudioPassthroughFor": "Enable audio passthrough for:", 17 | "LabelUpmixAudioFor": "Upmix audio channels for:", 18 | "LabelUpmixAudioForHelp": "Upmix audio to utilize all speaker channels.", 19 | "EnableDeinterlacing": "Enable deinterlacing", 20 | "EnableOpenGlHq": "Enable OpenGL high quality profile", 21 | "EnableVideoDisplaySyncing": "Enable video display syncing", 22 | "EnableInterpolation": "Enable interpolation", 23 | "EnableInterpolationHelp": "Reduce stuttering caused by mismatches in the video fps and display refresh rate (also known as judder).", 24 | "EnableExclusiveAudioMode": "Enable exclusive audio mode", 25 | "SettingRequiresHighEnd": "This setting requires a high end system.", 26 | "DefaultScalingMethod": "Default scaling method:", 27 | "ChromaScalingMethod": "Chroma scaling method:", 28 | "DownScalingMethod": "Downscaling method:", 29 | "TScalingMethod": "Temporal axis scaling method:", 30 | "ForceCorrectDownscaling": "Force correct downscaling", 31 | "ForceCorrectDownscalingHelp": "When using convolution based filters, extend the filter size when downscaling. Increases quality, but reduces performance while downscaling.", 32 | "EnableDeband": "Enable the debanding algorithm", 33 | "EnableDebandHelp": "This greatly reduces the amount of visible banding, blocking and other quantization artifacts, at the expense of performance and very slight blurring of some of the finest details.", 34 | "EnableSigmoid": "Enable sigmoidal color transform", 35 | "EnableSigmoidHelp": "When upscaling, use a sigmoidal color transform to avoid emphasizing ringing artifacts.", 36 | "LabelOutputRangeHelp": "It is advisable to use your graphics driver's color range option instead, if available.", 37 | "LabelDitherDepth": "Dither depth:", 38 | "LabelDitherDepthHelp": "Note that the depth of the connected video display device cannot be detected. Often, LCD panels will do dithering on their own, which conflicts with this option and leads to ugly output.", 39 | "Dither8": "Dither to 8 bit output", 40 | "DefaultAudioDelay": "Default audio delay:", 41 | "DefaultAudioDelayHelp": "Audio delay in milliseconds.", 42 | "AudioDelay2325": "Audio delay (23-25 fps):", 43 | "AudioDelay2325Help": "Audio delay in milliseconds for videos with framerates from 23-25 fps.", 44 | "EnableExclusiveAudioModeHelp": "Enable exclusive output mode. In this mode, the system is usually locked out, and only Emby will be able to output audio.", 45 | "ThreeDMode": "3D conversion mode:", 46 | "MonoConvertTo2D": "mono (convert to 2D)" 47 | } 48 | -------------------------------------------------------------------------------- /res/plugins/mpvplayer/strings/nl.json: -------------------------------------------------------------------------------- 1 | { 2 | "UserRefreshRate": "Voorkeursverversingssnelheden", 3 | "UserRefreshRateHelp": "Voeg verversingssnelheden toe in voorkeursvolgorde, gescheiden met een puntkomma (vb. 50;60;23)", 4 | "EnableVideoDisplaySyncingHelp": "Resample audio to match the video. This mode will also try to adjust audio speed to compensate for other drift. (This means it will play the audio at a different speed every once in a while to reduce the A/V difference.)", 5 | "LabelOutputRange": "Output range:", 6 | "LabelHardwareAccelerationMode": "Hardwareversnellingsmodus:", 7 | "Auto": "Automatisch", 8 | "None": "Geen", 9 | "ChangeRefreshRate": "Pas scherm refresh rate aan video aan", 10 | "ChangeRefreshRateHelp": "Verandert de verversingssnelheid van het primaire beeldscherm om de momenteel spelende video dichter te benaderen. Schijnt beter te werken met Video Display Sync ook ingeschakeld.", 11 | "LabelSpeakerLayout": "Luidsprekeropstelling:", 12 | "Stereo": "Stereo", 13 | "Quadraphonic": "Quadrofonisch", 14 | "Surround": "Surround", 15 | "LabelDynamicRangeCompression": "Dynamic range compression:", 16 | "LabelEnableAudioPassthroughFor": "Activeer audio doorgave voor:", 17 | "LabelUpmixAudioFor": "Upmix audio channels for:", 18 | "LabelUpmixAudioForHelp": "Upmix audio to utilize all speaker channels.", 19 | "EnableDeinterlacing": "Activeer deinterlacing", 20 | "EnableOpenGlHq": "Activeer OpenGL hoge kwaliteitsprofiel", 21 | "EnableVideoDisplaySyncing": "Activeer video display synchronisatie", 22 | "EnableInterpolation": "Activeer interpolatie", 23 | "EnableInterpolationHelp": "Verminder schokken veroorzaakt door wanverhoudingen tussen de video fps en de verversingssnelheid van het scherm (ook gekend als judder)", 24 | "EnableExclusiveAudioMode": "Activeer audio exclusieve modus", 25 | "SettingRequiresHighEnd": "Deze instellinge vereist een high end systeem.", 26 | "DefaultScalingMethod": "Standaard schalingsmethode:", 27 | "ChromaScalingMethod": "Chroma schalingsmethode:", 28 | "DownScalingMethod": "Downscaling method:", 29 | "TScalingMethod": "Temporal axis scaling method:", 30 | "ForceCorrectDownscaling": "Force correct downscaling", 31 | "ForceCorrectDownscalingHelp": "When using convolution based filters, extend the filter size when downscaling. Increases quality, but reduces performance while downscaling.", 32 | "EnableDeband": "Enable the debanding algorithm", 33 | "EnableDebandHelp": "This greatly reduces the amount of visible banding, blocking and other quantization artifacts, at the expense of performance and very slight blurring of some of the finest details.", 34 | "EnableSigmoid": "Enable sigmoidal color transform", 35 | "EnableSigmoidHelp": "When upscaling, use a sigmoidal color transform to avoid emphasizing ringing artifacts.", 36 | "LabelOutputRangeHelp": "It is advisable to use your graphics driver's color range option instead, if available.", 37 | "LabelDitherDepth": "Dither depth:", 38 | "LabelDitherDepthHelp": "Note that the depth of the connected video display device cannot be detected. Often, LCD panels will do dithering on their own, which conflicts with this option and leads to ugly output.", 39 | "Dither8": "Dither to 8 bit output", 40 | "DefaultAudioDelay": "Default audio delay:", 41 | "DefaultAudioDelayHelp": "Audio delay in milliseconds.", 42 | "AudioDelay2325": "Audio delay (23-25 fps):", 43 | "AudioDelay2325Help": "Audio delay in milliseconds for videos with framerates from 23-25 fps.", 44 | "EnableExclusiveAudioModeHelp": "Enable exclusive output mode. In this mode, the system is usually locked out, and only Emby will be able to output audio.", 45 | "ThreeDMode": "3D conversion mode:", 46 | "MonoConvertTo2D": "mono (convert to 2D)" 47 | } 48 | -------------------------------------------------------------------------------- /res/plugins/mpvplayer/strings/pl.json: -------------------------------------------------------------------------------- 1 | { 2 | "UserRefreshRate": "Preferowane cz\u0119stotliwo\u015bci od\u015bwie\u017cania", 3 | "UserRefreshRateHelp": "Umo\u017cliwia dodanie cz\u0119stotliwo\u015bci w preferowanej kolejno\u015bci, rozdzielonych \u015brednikiem (np. 50;60;23)", 4 | "EnableVideoDisplaySyncingHelp": "Umo\u017cliwia przetwarzanie pr\u00f3bkowania d\u017awi\u0119ku w celu dopasowania go do wy\u015bwietlanego obrazu. Tryb ten b\u0119dzie dodatkowo pr\u00f3bowa\u0142 dostosowa\u0107 pr\u0119dko\u015b\u0107 d\u017awi\u0119ku, aby zrekompensowa\u0107 inne przesuni\u0119cie. (Oznacza to, \u017ce d\u017awi\u0119k b\u0119dzie odtwarzany z inn\u0105 pr\u0119dko\u015bci\u0105 za ka\u017cdym razem, aby zredukowa\u0107 r\u00f3\u017cnice w synchronizacji obrazu z d\u017awi\u0119kiem.)", 5 | "LabelOutputRange": "Zakres kolor\u00f3w:", 6 | "LabelHardwareAccelerationMode": "Tryb akceleracji sprz\u0119towej:", 7 | "Auto": "Automatycznie", 8 | "None": "Brak", 9 | "ChangeRefreshRate": "Dopasowuj od\u015bwie\u017canie wy\u015bwietlacza do cz\u0119stotliwo\u015bci materia\u0142u wideo", 10 | "ChangeRefreshRateHelp": "Umo\u017cliwia dopasowanie cz\u0119stotliwo\u015bci od\u015bwie\u017cania podstawowego wy\u015bwietlacza do cz\u0119stotliwo\u015bci materia\u0142u wideo. Dzia\u0142a lepiej, gdy aktywowano funkcj\u0119 synchronizacji pionowej.", 11 | "LabelSpeakerLayout": "Uk\u0142ad g\u0142o\u015bnik\u00f3w:", 12 | "Stereo": "Stereo", 13 | "Quadraphonic": "Kwadrofoniczny", 14 | "Surround": "Przestrzenny", 15 | "LabelDynamicRangeCompression": "Kompresja zakresu dynamiki:", 16 | "LabelEnableAudioPassthroughFor": "Aktywuj przekazywanie d\u017awi\u0119ku dla:", 17 | "LabelUpmixAudioFor": "Miksuj w g\u00f3r\u0119 kana\u0142y d\u017awi\u0119kowe dla:", 18 | "LabelUpmixAudioForHelp": "Umo\u017cliwia miksowanie d\u017awi\u0119ku w g\u00f3r\u0119, aby odtwarza\u0107 d\u017awi\u0119k na wszystkich g\u0142o\u015bnikach.", 19 | "EnableDeinterlacing": "Usuwaj przeplot", 20 | "EnableOpenGlHq": "Aktywuj profil wysokiej jako\u015bci OpenGL", 21 | "EnableVideoDisplaySyncing": "Synchronizuj odtwarzanie wideo z wy\u015bwietlaczem", 22 | "EnableInterpolation": "Aktywuj interpolacj\u0119", 23 | "EnableInterpolationHelp": "Umo\u017cliwia redukcj\u0119 poszarpania obrazu, spowodowane niedopasowanie klatka\u017cu materia\u0142u wideo z cz\u0119stotliwo\u015bci\u0105 od\u015bwie\u017cania wy\u015bwietlacza.", 24 | "EnableExclusiveAudioMode": "Aktywuj tryb wy\u0142\u0105czno\u015bci urz\u0105dzenia d\u017awi\u0119kowego", 25 | "SettingRequiresHighEnd": "To ustawienie wymaga sprz\u0119tu wysokiej klasy.", 26 | "DefaultScalingMethod": "Domy\u015blna metoda skalowania:", 27 | "ChromaScalingMethod": "Metoda skalowania chrominancji:", 28 | "DownScalingMethod": "Metoda skalowania w d\u00f3\u0142:", 29 | "TScalingMethod": "Metoda skalowania osi czasowych:", 30 | "ForceCorrectDownscaling": "Wymuszaj poprawne skalowanie w d\u00f3\u0142", 31 | "ForceCorrectDownscalingHelp": "Podczas u\u017cywania filtr\u00f3w bazuj\u0105cych na macierzy splot\u00f3w, zwi\u0119ksza rozmiar filtra podczas skalowania w d\u00f3\u0142. Zwi\u0119ksza to jako\u015b\u0107, ale obni\u017ca wydajno\u015b\u0107 podczas skalowania.", 32 | "EnableDeband": "Aktywuj algorytm eliminowania fa\u0142szywych kontur\u00f3w", 33 | "EnableDebandHelp": "Umo\u017cliwia redukcj\u0119 liczby widocznych fa\u0142szywych kontur\u00f3w, artefakt\u00f3w blokowych i innych artefakt\u00f3w kwantyzacji, kosztem wydajno\u015bci i niewielkim rozmazaniem drobnych szczeg\u00f3\u0142\u00f3w.", 34 | "EnableSigmoid": "Aktywuj transformacj\u0119 krzywej S kolor\u00f3w", 35 | "EnableSigmoidHelp": "Umo\u017cliwia, podczas skalowania w g\u00f3r\u0119, u\u017cywanie transformacji kolor\u00f3w przy pomocy krzywej S, w celu unikni\u0119cia artefakt\u00f3w pier\u015bcieniowych.", 36 | "LabelOutputRangeHelp": "Zaleca si\u0119 u\u017cywanie opcji zakresu kolor\u00f3w sterownika graficznego, je\u015bli jest dost\u0119pna.", 37 | "LabelDitherDepth": "G\u0142\u0119bia rozpraszania:", 38 | "LabelDitherDepthHelp": "Nale\u017cy zauwa\u017cy\u0107, \u017ce wykrycie g\u0142\u0119bi kolor\u00f3w pod\u0142\u0105czonego urz\u0105dzenia wy\u015bwietlaj\u0105cego nie jest mo\u017cliwe. Panele LCD wykonuj\u0105 rozpraszanie we w\u0142asnym zakresie, co stoi w konflikcie z t\u0105 opcj\u0105 i prowadzi do brzydkiego obrazu.", 39 | "Dither8": "Rozpraszaj do wyj\u015bciowej postaci 8 bitowej", 40 | "DefaultAudioDelay": "Domy\u015blne op\u00f3\u017anienie d\u017awi\u0119ku:", 41 | "DefaultAudioDelayHelp": "Okre\u015bla op\u00f3\u017anienie d\u017awi\u0119ku w stosunku do obrazu w milisekundach.", 42 | "AudioDelay2325": "Op\u00f3\u017anienie d\u017awi\u0119ku (23-25 klatek)", 43 | "AudioDelay2325Help": "Okre\u015bla op\u00f3\u017anienie d\u017awi\u0119ku w milisekundach, w stosunku do obrazu, dla materia\u0142\u00f3w wideo o cz\u0119stotliwo\u015bci klatek 23-25.", 44 | "EnableExclusiveAudioModeHelp": "Umo\u017cliwia dost\u0119p do urz\u0105dzenia d\u017awi\u0119kowego w trybie wy\u0142\u0105czno\u015bci. W tym trybie, podsystem d\u017awi\u0119kowy jest zablokowany, tylko Emby b\u0119dzie mia\u0142o mo\u017cliwo\u015b\u0107 odtwarzania d\u017awi\u0119k\u00f3w.", 45 | "ThreeDMode": "Tryb konwersji 3D:", 46 | "MonoConvertTo2D": "Mono (konwertuj do 2D)" 47 | } 48 | -------------------------------------------------------------------------------- /res/plugins/mpvplayer/strings/pt-BR.json: -------------------------------------------------------------------------------- 1 | { 2 | "UserRefreshRate": "Taxas de Atualiza\u00e7\u00e3o Preferidas", 3 | "UserRefreshRateHelp": "Adicionar Taxas de Atualiza\u00e7\u00e3o por ordem de prefer\u00eancia e separadas com ponto-e-v\u00edrgula (ex. 50;60;23)", 4 | "EnableVideoDisplaySyncingHelp": "Fazer resample do \u00e1udio para combinar com o v\u00eddeo. Este modo tentar\u00e1 ajustar a velocidade do \u00e1udio para compensar a diferen\u00e7a. (Isto significa que reproduzir\u00e1 o \u00e1udio em uma velocidade diferente toda vez que reduzir a diferen\u00e7a com A/V).", 5 | "LabelOutputRange": "Alcance da sa\u00edda:", 6 | "LabelHardwareAccelerationMode": "Modo de acelera\u00e7\u00e3o de hardware:", 7 | "Auto": "Auto", 8 | "None": "Nenhum", 9 | "ChangeRefreshRate": "Alterar taxa de atualiza\u00e7\u00e3o de exibi\u00e7\u00e3o para combinar com o v\u00eddeo.", 10 | "ChangeRefreshRateHelp": "Altera a taxa de atualiza\u00e7\u00e3o do monitor principal para se alinhar com a reprodu\u00e7\u00e3o do stream de v\u00eddeo atual. Segundo alguns casos, funciona melhor quando a Sincroniza\u00e7\u00e3o do Monitor de V\u00eddeo tamb\u00e9m est\u00e1 ativa.", 11 | "LabelSpeakerLayout": "Layout de Alto-falantes:", 12 | "Stereo": "Est\u00e9reo", 13 | "Quadraphonic": "Quadraf\u00f4nico", 14 | "Surround": "Surround", 15 | "LabelDynamicRangeCompression": "Compress\u00e3o de gama din\u00e2mica:", 16 | "LabelEnableAudioPassthroughFor": ":Ativar passagem direta de \u00e1udio para:", 17 | "LabelUpmixAudioFor": "Fazer upmix de canais de \u00e1udio para:", 18 | "LabelUpmixAudioForHelp": "Fa\u00e7a o upmix de \u00e1udio para utilizar todos os canais dos alto-falantes.", 19 | "EnableDeinterlacing": "Ativar desentrele\u00e7amento", 20 | "EnableOpenGlHq": "Ativar perfil de alta qualidade OpenGL", 21 | "EnableVideoDisplaySyncing": "Ativar sincroniza\u00e7\u00e3o de exibi\u00e7\u00e3o de v\u00eddeo", 22 | "EnableInterpolation": "Ativar interpola\u00e7\u00e3o", 23 | "EnableInterpolationHelp": "Reduzir travamentos causados por diferen\u00e7as entre o fps do v\u00eddeo e a taxa de atualiza\u00e7\u00e3o do monitor (tamb\u00e9m conhecido como judder).", 24 | "EnableExclusiveAudioMode": "Ativar modo de \u00e1udio exclusivo", 25 | "SettingRequiresHighEnd": "Esta configura\u00e7\u00e3o exige um sistema potente.", 26 | "DefaultScalingMethod": "M\u00e9todo padr\u00e3o de scaling:", 27 | "ChromaScalingMethod": "M\u00e9todo de scaling de chroma:", 28 | "DownScalingMethod": "M\u00e9todos de downscaling:", 29 | "TScalingMethod": "M\u00e9todos de Temporal axis scaling:", 30 | "ForceCorrectDownscaling": "For\u00e7ar a downscaling correta", 31 | "ForceCorrectDownscalingHelp": "Ao usar filtros baseados em convolu\u00e7\u00e3o, estenda o tamanho do filtro ao fazer downscaling. Aumenta a qualidade, mas reduz o desempenho durante o downscaling.", 32 | "EnableDeband": "Ative o algoritmo de debanding", 33 | "EnableDebandHelp": "Isso reduz consideravelmente a quantidade de bandas vis\u00edveis, bloqueios e outros artefatos de quantifica\u00e7\u00e3o, em detrimento do desempenho e um desfoque muito leve de alguns dos melhores detalhes.", 34 | "EnableSigmoid": "Permitir a transforma\u00e7\u00e3o da cor sigmoidal", 35 | "EnableSigmoidHelp": "Ao fazer upscaling, use uma transforma\u00e7\u00e3o de cor sigmoidal para evitar enfatizar os artefatos de ringing.", 36 | "LabelOutputRangeHelp": "\u00c9 aconselh\u00e1vel usar a op\u00e7\u00e3o do seu intervalo de cores do driver gr\u00e1fico, se estiver dispon\u00edvel.", 37 | "LabelDitherDepth": "Profundidade do dither:", 38 | "LabelDitherDepthHelp": "Observe que a profundidade do dispositivo de exibi\u00e7\u00e3o de v\u00eddeo conectado n\u00e3o pode ser detectada. Muitas vezes, os pain\u00e9is LCD ir\u00e3o definir por conta pr\u00f3pria, o que entra em conflito com esta op\u00e7\u00e3o e leva a uma m\u00e1 sa\u00edda.", 39 | "Dither8": "Dither para sa\u00edda de 8 bits", 40 | "DefaultAudioDelay": "Atraso do \u00e1udio padr\u00e3o:", 41 | "DefaultAudioDelayHelp": "Atraso do \u00e1udio em milissegundos.", 42 | "AudioDelay2325": "Atraso do \u00e1udio (23-25 fps):", 43 | "AudioDelay2325Help": "Atraso do \u00e1udio em milissegundos para v\u00eddeos com taxa de 23-35 fps.", 44 | "EnableExclusiveAudioModeHelp": "Ativar modo de sa\u00edda exclusivo. Neste modo, o sistema \u00e9 normalmente bloqueado e somente o Emby poder\u00e1 fazer a sa\u00edda do \u00e1udio.", 45 | "ThreeDMode": "Modo de convers\u00e3o 3D:", 46 | "MonoConvertTo2D": "mono (converter para 2D)" 47 | } 48 | -------------------------------------------------------------------------------- /res/plugins/mpvplayer/strings/pt-PT.json: -------------------------------------------------------------------------------- 1 | { 2 | "UserRefreshRate": "Preferred Refresh Rates", 3 | "UserRefreshRateHelp": "Add Refresh Rates in the order of preference and separate with semicolon (ex. 50;60;23)", 4 | "EnableVideoDisplaySyncingHelp": "Resample audio to match the video. This mode will also try to adjust audio speed to compensate for other drift. (This means it will play the audio at a different speed every once in a while to reduce the A/V difference.)", 5 | "LabelOutputRange": "Output range:", 6 | "LabelHardwareAccelerationMode": "Hardware acceleration mode:", 7 | "Auto": "Autom\u00e1tico", 8 | "None": "Nenhum", 9 | "ChangeRefreshRate": "Mudar a taxa de atualiza\u00e7\u00e3o do monitor para corresponder com o v\u00eddeo", 10 | "ChangeRefreshRateHelp": "Changes the primary display refresh rate to closer align with the currently playing video stream. Reportedly works better when Video Display Sync is enabled as well.", 11 | "LabelSpeakerLayout": "Speaker layout:", 12 | "Stereo": "Est\u00e9reo", 13 | "Quadraphonic": "Quadraf\u00f3nico", 14 | "Surround": "Surround", 15 | "LabelDynamicRangeCompression": "Dynamic range compression:", 16 | "LabelEnableAudioPassthroughFor": "Enable audio passthrough for:", 17 | "LabelUpmixAudioFor": "Upmix audio channels for:", 18 | "LabelUpmixAudioForHelp": "Upmix audio to utilize all speaker channels.", 19 | "EnableDeinterlacing": "Enable deinterlacing", 20 | "EnableOpenGlHq": "Enable OpenGL high quality profile", 21 | "EnableVideoDisplaySyncing": "Enable video display syncing", 22 | "EnableInterpolation": "Enable interpolation", 23 | "EnableInterpolationHelp": "Reduce stuttering caused by mismatches in the video fps and display refresh rate (also known as judder).", 24 | "EnableExclusiveAudioMode": "Enable exclusive audio mode", 25 | "SettingRequiresHighEnd": "This setting requires a high end system.", 26 | "DefaultScalingMethod": "Default scaling method:", 27 | "ChromaScalingMethod": "Chroma scaling method:", 28 | "DownScalingMethod": "Downscaling method:", 29 | "TScalingMethod": "Temporal axis scaling method:", 30 | "ForceCorrectDownscaling": "Force correct downscaling", 31 | "ForceCorrectDownscalingHelp": "When using convolution based filters, extend the filter size when downscaling. Increases quality, but reduces performance while downscaling.", 32 | "EnableDeband": "Enable the debanding algorithm", 33 | "EnableDebandHelp": "This greatly reduces the amount of visible banding, blocking and other quantization artifacts, at the expense of performance and very slight blurring of some of the finest details.", 34 | "EnableSigmoid": "Enable sigmoidal color transform", 35 | "EnableSigmoidHelp": "When upscaling, use a sigmoidal color transform to avoid emphasizing ringing artifacts.", 36 | "LabelOutputRangeHelp": "It is advisable to use your graphics driver's color range option instead, if available.", 37 | "LabelDitherDepth": "Dither depth:", 38 | "LabelDitherDepthHelp": "Note that the depth of the connected video display device cannot be detected. Often, LCD panels will do dithering on their own, which conflicts with this option and leads to ugly output.", 39 | "Dither8": "Dither to 8 bit output", 40 | "DefaultAudioDelay": "Default audio delay:", 41 | "DefaultAudioDelayHelp": "Audio delay in milliseconds.", 42 | "AudioDelay2325": "Audio delay (23-25 fps):", 43 | "AudioDelay2325Help": "Audio delay in milliseconds for videos with framerates from 23-25 fps.", 44 | "EnableExclusiveAudioModeHelp": "Enable exclusive output mode. In this mode, the system is usually locked out, and only Emby will be able to output audio.", 45 | "ThreeDMode": "3D conversion mode:", 46 | "MonoConvertTo2D": "mono (convert to 2D)" 47 | } 48 | -------------------------------------------------------------------------------- /res/plugins/mpvplayer/strings/ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "UserRefreshRate": "\u041f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0435 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f", 3 | "UserRefreshRateHelp": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0441 \u0442\u043e\u0447\u043a\u043e\u0439 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 50;60;23)", 4 | "EnableVideoDisplaySyncingHelp": "\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u043f\u0440\u0435\u0434\u0438\u0441\u043a\u0440\u0435\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0430\u0443\u0434\u0438\u043e \u0434\u043b\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0441 \u0432\u0438\u0434\u0435\u043e. \u041f\u0440\u0438 \u0434\u0430\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0430\u0443\u0434\u0438\u043e \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0430\u0446\u0438\u0438 \u0434\u0440\u0435\u0439\u0444\u0430 (\u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0430\u0443\u0434\u0438\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0441 \u0440\u0430\u0437\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043f\u043e\u043a\u0430 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 A/V \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0430).", 5 | "LabelOutputRange": "\u0412\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d:", 6 | "LabelHardwareAccelerationMode": "\u0420\u0435\u0436\u0438\u043c \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f:", 7 | "Auto": "\u0410\u0432\u0442\u043e", 8 | "None": "\u041d\u0438\u043a\u0430\u043a\u043e\u0439", 9 | "ChangeRefreshRate": "\u041c\u0435\u043d\u044f\u0442\u044c \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430 \u0434\u043b\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0441 \u0432\u0438\u0434\u0435\u043e", 10 | "ChangeRefreshRateHelp": "\u0418\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u0434\u043b\u044f \u0431\u043b\u0438\u0436\u043d\u0435\u0433\u043e \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u0441 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b\u043c \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u043e\u043c. \u041f\u043e \u043e\u0442\u0437\u044b\u0432\u0430\u043c, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0443\u0447\u0448\u0435 \u043a\u043e\u0433\u0434\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f Display Display Sync.", 11 | "LabelSpeakerLayout": "\u041a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0430 \u0433\u0440\u043e\u043c\u043a\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435\u043b\u0435\u0439:", 12 | "Stereo": "\u0421\u0442\u0435\u0440\u0435\u043e", 13 | "Quadraphonic": "\u041a\u0432\u0430\u0434\u0440\u043e", 14 | "Surround": "\u041e\u0431\u044a\u0435\u043c\u043d\u043e\u0435 \u0437\u0432\u0443\u0447\u0430\u043d\u0438\u0435", 15 | "LabelDynamicRangeCompression": "\u041a\u043e\u043c\u043f\u0440\u0435\u0441\u0441\u0438\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430:", 16 | "LabelEnableAudioPassthroughFor": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0445\u043e\u0434\u043d\u043e\u0435 \u0430\u0443\u0434\u0438\u043e \u0434\u043b\u044f:", 17 | "LabelUpmixAudioFor": "\u041f\u043e\u0432\u044b\u0448\u0430\u044e\u0449\u0435\u0435 \u043c\u0438\u043a\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0443\u0434\u0438\u043e \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0434\u043b\u044f:", 18 | "LabelUpmixAudioForHelp": "\u041f\u043e\u0432\u044b\u0448\u0430\u044e\u0449\u0435\u0435 \u043c\u0438\u043a\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0443\u0434\u0438\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043a\u0430\u043d\u0430\u043b\u044b \u0433\u0440\u043e\u043c\u043a\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435\u043b\u0435\u0439.", 19 | "EnableDeinterlacing": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u00ab\u0433\u0440\u0435\u0431\u0451\u043d\u043a\u0438\u00bb", 20 | "EnableOpenGlHq": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 OpenGL", 21 | "EnableVideoDisplaySyncing": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0435\u043e", 22 | "EnableInterpolation": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044e", 23 | "EnableInterpolationHelp": "\u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0437\u0430\u0438\u043a\u0430\u043d\u0438\u0435, \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u043e\u0435 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f\u043c\u0438 \u0441 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 \u043a\u0430\u0434\u0440\u043e\u0432 \u0432\u0438\u0434\u0435\u043e \u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430 (\u0442\u0430\u043a\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0435 \u043a\u0430\u043a \u00ab\u0434\u0440\u043e\u0436\u0430\u043d\u0438\u0435\u00bb).", 24 | "EnableExclusiveAudioMode": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043c\u043e\u043d\u043e\u043f\u043e\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0430\u0443\u0434\u0438\u043e", 25 | "SettingRequiresHighEnd": "\u042d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0435\u043b\u0430", 26 | "DefaultScalingMethod": "\u041c\u0435\u0442\u043e\u0434 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e:", 27 | "ChromaScalingMethod": "\u041c\u0435\u0442\u043e\u0434 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u043d\u043e\u0441\u0442\u0438:", 28 | "DownScalingMethod": "\u041c\u0435\u0442\u043e\u0434 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430:", 29 | "TScalingMethod": "\u041c\u0435\u0442\u043e\u0434 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u0441\u0438:", 30 | "ForceCorrectDownscaling": "\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430", 31 | "ForceCorrectDownscalingHelp": "\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f, \u0443\u0432\u0435\u043b\u0438\u0447\u044c\u0442\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u043a\u043e\u0433\u0434\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431. \u041f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e, \u043d\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440 \u043f\u043e\u043a\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431.", 32 | "EnableDeband": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u043e\u0441", 33 | "EnableDebandHelp": "\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u043f\u043e\u043b\u043e\u0441, \u0431\u043b\u043e\u043a\u043e\u0432 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430 \u0441\u0447\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u044b\u0442\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u0435\u043b\u043a\u0438\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439.", 34 | "EnableSigmoid": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0438\u0433\u043c\u043e\u0432\u0438\u0434\u043d\u043e\u0435 \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435", 35 | "EnableSigmoidHelp": "\u041f\u0440\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441\u0438\u0433\u043c\u043e\u0432\u0438\u0434\u043d\u043e\u0435 \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432 \u0442\u0438\u043f\u0430 \u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u044f \u00ab\u0437\u0432\u043e\u043d\u0430\u00bb.", 36 | "LabelOutputRangeHelp": "\u0416\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0446\u0432\u0435\u0442\u043e\u0432\u0443\u044e \u0433\u0430\u043c\u043c\u0443 \u0432\u0430\u0448\u0435\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u0435\u0441\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e.", 37 | "LabelDitherDepth": "\u0413\u043b\u0443\u0431\u0438\u043d\u0430 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u044f:", 38 | "LabelDitherDepthHelp": "\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0435\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430. \u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0416\u041a-\u043f\u0430\u043d\u0435\u043b\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u0435\u0442 \u0441 \u0434\u0430\u043d\u043d\u043e\u0439 \u043e\u043f\u0446\u0438\u0435\u0439 \u0438 \u0432\u0435\u0434\u0451\u0442 \u043a \u0438\u0441\u043a\u0430\u0436\u0451\u043d\u043d\u043e\u043c\u0443 \u0432\u044b\u0445\u043e\u0434\u0443.", 39 | "Dither8": "\u0421\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u043e 8-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u0430", 40 | "DefaultAudioDelay": "\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0430\u0443\u0434\u0438\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e:", 41 | "DefaultAudioDelayHelp": "\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0430\u0443\u0434\u0438\u043e, \u043c\u0441:", 42 | "AudioDelay2325": "\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0430\u0443\u0434\u0438\u043e (23-25 \u043a\u0430\u0434\u0440/\u0441)", 43 | "AudioDelay2325Help": "\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0430\u0443\u0434\u0438\u043e \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u0434\u043b\u044f \u0432\u0438\u0434\u0435\u043e \u0441 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 \u043a\u0430\u0434\u0440\u043e\u0432 \u043e\u0442 23-25 \u043a\u0430\u0434\u0440/\u0441.", 44 | "EnableExclusiveAudioModeHelp": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u043c\u043e\u043d\u043e\u043f\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u0430. \u0412 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e Emby \u0441\u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0430\u0443\u0434\u0438\u043e.", 45 | "ThreeDMode": "\u0420\u0435\u0436\u0438\u043c 3D-\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f:", 46 | "MonoConvertTo2D": "\u043c\u043e\u043d\u043e (\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043e 2D)" 47 | } 48 | -------------------------------------------------------------------------------- /res/plugins/mpvplayer/strings/sv.json: -------------------------------------------------------------------------------- 1 | { 2 | "UserRefreshRate": "F\u00f6redragna uppdateringsfrekvenser", 3 | "UserRefreshRateHelp": "L\u00e4gg till uppdateringsfrekvenser i \u00f6nskad prioritetsordning. Separera flera med semikolon (t.ex. '50, 60; 23')", 4 | "EnableVideoDisplaySyncingHelp": "Sampla om ljud f\u00f6r att matcha videon. Detta l\u00e4ge kommer ocks\u00e5 att f\u00f6rs\u00f6ka att justera ljudhastigheten f\u00f6r att kompensera f\u00f6r annan f\u00f6rskjutning. Detta betyder att ljudet kommer att spelas med en annan hastighet varje g\u00e5ng f\u00f6r att minska A/V-skillnaden.", 5 | "LabelOutputRange": "Utmatningsomf\u00e5ng:", 6 | "LabelHardwareAccelerationMode": "L\u00e4ge f\u00f6r h\u00e5rdvaruacceleration:", 7 | "Auto": "Auto", 8 | "None": "Ingen", 9 | "ChangeRefreshRate": "\u00c4ndra bildsk\u00e4rmens uppdateringsfrekvens s\u00e5 att den matchar video", 10 | "ChangeRefreshRateHelp": "\u00c4ndrar den prim\u00e4ra visningsuppdateringshastigheten f\u00f6r att komma n\u00e4rmare den aktuella videostr\u00f6mmen. Enligt rapporter s\u00e5 fungerar det b\u00e4ttre n\u00e4r videosynkronisering ocks\u00e5 \u00e4r aktiverat.", 11 | "LabelSpeakerLayout": "H\u00f6gtalarlayout:", 12 | "Stereo": "Stereo", 13 | "Quadraphonic": "Kvadrofonisk", 14 | "Surround": "Surround", 15 | "LabelDynamicRangeCompression": "Dynamisk omf\u00e5ngskompression:", 16 | "LabelEnableAudioPassthroughFor": "Aktivera genomstr\u00f6mning av ljud f\u00f6r:", 17 | "LabelUpmixAudioFor": "Mixa upp ljudkanaler f\u00f6r:", 18 | "LabelUpmixAudioForHelp": "Mixa upp ljud f\u00f6r att anv\u00e4nda samtliga kanaler f\u00f6r h\u00f6gtalare.", 19 | "EnableDeinterlacing": "Aktivera avfl\u00e4tning", 20 | "EnableOpenGlHq": "Aktivera OpenGLs h\u00f6gkvalitativa profil", 21 | "EnableVideoDisplaySyncing": "Aktivera synkronisering av bildsk\u00e4rm", 22 | "EnableInterpolation": "Aktivera interpolering", 23 | "EnableInterpolationHelp": "Minska hackig bild som orsakats av att videons fps och bildsk\u00e4rmens uppdateringsfrekvens matchar d\u00e5ligt (\u00e4ven k\u00e4nt som judder - skakning, ryckning).", 24 | "EnableExclusiveAudioMode": "Aktivera exklusivt ljudl\u00e4ge", 25 | "SettingRequiresHighEnd": "Denna inst\u00e4llning kr\u00e4ver ett kraftfullt system.", 26 | "DefaultScalingMethod": "F\u00f6rvald skalningsmetod:", 27 | "ChromaScalingMethod": "Nedskalningsmetod f\u00f6r f\u00e4rgstyrka/f\u00e4rgm\u00e4ttnad:", 28 | "DownScalingMethod": "Nedskalningsmetod:", 29 | "TScalingMethod": "Temporal axelskalningsmetod:", 30 | "ForceCorrectDownscaling": "Tvinga korrekt nedskalning", 31 | "ForceCorrectDownscalingHelp": "N\u00e4r filter baserade p\u00e5 konvolution anv\u00e4nds, f\u00f6rl\u00e4ng filterstorlek under nedskalning. \u00d6kar kvaliteten, men minskar prestandan under nedskalning.", 32 | "EnableDeband": "Aktivera avbandningsalgoritmen", 33 | "EnableDebandHelp": "Detta minskar avsev\u00e4rt m\u00e4ngden synlig bandning, blockering och andra kvantiseringsartefakter, p\u00e5 bekostnad av prestanda och tillkomsten av mycket lite osk\u00e4rpa f\u00f6r de finaste detaljerna.", 34 | "EnableSigmoid": "Aktivera sigmoid transformation av f\u00e4rger", 35 | "EnableSigmoidHelp": "Vid uppskalning, anv\u00e4nds en sigmoid transformation av f\u00e4rger f\u00f6r att undvika att f\u00f6rst\u00e4rka artefakter fr\u00e5n ringing.", 36 | "LabelOutputRangeHelp": "Det \u00e4r rekommenderat att anv\u00e4nda grafikdrivrutinernas alternativ f\u00f6r f\u00e4rgomr\u00e5de ist\u00e4llet, om det finns tillg\u00e4ngligt.", 37 | "LabelDitherDepth": "Djup f\u00f6r interpolation (dither):", 38 | "LabelDitherDepthHelp": "Observera att djupet p\u00e5 den anslutna bildsk\u00e4rmsenheten inte kan detekteras. LCD-paneler g\u00f6r ofta interpolation (dithering) p\u00e5 egen hand, vilket skapar en konflikt med denna inst\u00e4llning och leder till ful utmatning.", 39 | "Dither8": "Interpolera (dither) till 8 bitars utmatning", 40 | "DefaultAudioDelay": "Standard f\u00f6r ljudf\u00f6rdr\u00f6jning:", 41 | "DefaultAudioDelayHelp": "Ljudf\u00f6rdr\u00f6jning i millisekunder:", 42 | "AudioDelay2325": "Ljudf\u00f6rdr\u00f6jning (23-25 bilder per sekund):", 43 | "AudioDelay2325Help": "Ljudf\u00f6rdr\u00f6jning i millisekunder f\u00f6r videor med bildhastigheter p\u00e5 23-25 bilder per sekund.", 44 | "EnableExclusiveAudioModeHelp": "Aktivera exklusivt utmatningsl\u00e4ge. I det h\u00e4r l\u00e4get s\u00e5 \u00e4r systemet vanligtvis utel\u00e5st. Enbart Emby kommer att ha m\u00f6jlighet till att mata ut ljud.", 45 | "ThreeDMode": "L\u00e4ge f\u00f6r konvertering av 3D:", 46 | "MonoConvertTo2D": "Mono (konvertera till 2D)" 47 | } 48 | -------------------------------------------------------------------------------- /res/plugins/mpvplayer/strings/zh-CN.json: -------------------------------------------------------------------------------- 1 | { 2 | "UserRefreshRate": "Preferred Refresh Rates", 3 | "UserRefreshRateHelp": "Add Refresh Rates in the order of preference and separate with semicolon (ex. 50;60;23)", 4 | "EnableVideoDisplaySyncingHelp": "Resample audio to match the video. This mode will also try to adjust audio speed to compensate for other drift. (This means it will play the audio at a different speed every once in a while to reduce the A/V difference.)", 5 | "LabelOutputRange": "\u8f93\u51fa\u8303\u56f4\uff1a", 6 | "LabelHardwareAccelerationMode": "\u786c\u4ef6\u52a0\u901f\u6a21\u5f0f\uff1a", 7 | "Auto": "\u81ea\u52a8", 8 | "None": "\u65e0", 9 | "ChangeRefreshRate": "\u66f4\u6539\u663e\u793a\u5c4f\u5237\u65b0\u7387\u4ee5\u8ddf\u89c6\u9891\u540c\u6b65", 10 | "ChangeRefreshRateHelp": "Changes the primary display refresh rate to closer align with the currently playing video stream. Reportedly works better when Video Display Sync is enabled as well.", 11 | "LabelSpeakerLayout": "Speaker layout:", 12 | "Stereo": "\u53cc\u58f0\u9053", 13 | "Quadraphonic": "\u56db\u58f0\u9053", 14 | "Surround": "\u73af\u7ed5\u58f0", 15 | "LabelDynamicRangeCompression": "Dynamic range compression:", 16 | "LabelEnableAudioPassthroughFor": "Enable audio passthrough for:", 17 | "LabelUpmixAudioFor": "Upmix audio channels for:", 18 | "LabelUpmixAudioForHelp": "Upmix\u97f3\u9891\u5229\u7528\u6240\u6709\u626c\u58f0\u5668\u901a\u9053\u3002", 19 | "EnableDeinterlacing": "Enable deinterlacing", 20 | "EnableOpenGlHq": "Enable OpenGL high quality profile", 21 | "EnableVideoDisplaySyncing": "Enable video display syncing", 22 | "EnableInterpolation": "Enable interpolation", 23 | "EnableInterpolationHelp": "Reduce stuttering caused by mismatches in the video fps and display refresh rate (also known as judder).", 24 | "EnableExclusiveAudioMode": "Enable exclusive audio mode", 25 | "SettingRequiresHighEnd": "This setting requires a high end system.", 26 | "DefaultScalingMethod": "Default scaling method:", 27 | "ChromaScalingMethod": "Chroma scaling method:", 28 | "DownScalingMethod": "Downscaling method:", 29 | "TScalingMethod": "Temporal axis scaling method:", 30 | "ForceCorrectDownscaling": "Force correct downscaling", 31 | "ForceCorrectDownscalingHelp": "When using convolution based filters, extend the filter size when downscaling. Increases quality, but reduces performance while downscaling.", 32 | "EnableDeband": "Enable the debanding algorithm", 33 | "EnableDebandHelp": "This greatly reduces the amount of visible banding, blocking and other quantization artifacts, at the expense of performance and very slight blurring of some of the finest details.", 34 | "EnableSigmoid": "Enable sigmoidal color transform", 35 | "EnableSigmoidHelp": "When upscaling, use a sigmoidal color transform to avoid emphasizing ringing artifacts.", 36 | "LabelOutputRangeHelp": "It is advisable to use your graphics driver's color range option instead, if available.", 37 | "LabelDitherDepth": "Dither depth:", 38 | "LabelDitherDepthHelp": "Note that the depth of the connected video display device cannot be detected. Often, LCD panels will do dithering on their own, which conflicts with this option and leads to ugly output.", 39 | "Dither8": "Dither to 8 bit output", 40 | "DefaultAudioDelay": "Default audio delay:", 41 | "DefaultAudioDelayHelp": "Audio delay in milliseconds.", 42 | "AudioDelay2325": "Audio delay (23-25 fps):", 43 | "AudioDelay2325Help": "Audio delay in milliseconds for videos with framerates from 23-25 fps.", 44 | "EnableExclusiveAudioModeHelp": "\u542f\u7528\u72ec\u5360\u8f93\u51fa\u6a21\u5f0f\u3002 \u5728\u8fd9\u79cd\u6a21\u5f0f\u4e0b\uff0c\u7cfb\u7edf\u901a\u5e38\u88ab\u9501\u5b9a\uff0c\u53ea\u6709Emby\u624d\u80fd\u8f93\u51fa\u97f3\u9891\u3002", 45 | "ThreeDMode": "3D conversion mode:", 46 | "MonoConvertTo2D": "mono (convert to 2D)" 47 | } 48 | -------------------------------------------------------------------------------- /res/plugins/mpvplayer/video.html: -------------------------------------------------------------------------------- 1 | 
2 |
3 |
4 | 5 |
6 | 7 |
8 | 20 |
21 | 22 |
23 | 28 |
${LabelOutputRangeHelp}
29 |
30 | 31 |
32 | 37 |
38 | 39 |

${Advanced}

40 | 41 |
42 | 43 |
${DefaultAudioDelayHelp}
44 |
45 | 46 |
47 | 48 |
${AudioDelay2325Help}
49 |
50 | 51 |
52 | 56 |
${ChangeRefreshRateHelp}
57 |
58 | 59 |
60 | 61 |
${UserRefreshRateHelp}
62 |
63 | 64 |
65 | 69 |
${EnableVideoDisplaySyncingHelp}
70 |
71 | 72 |
73 | 77 |
${SettingRequiresHighEnd}
78 |
79 | 80 |
81 | 85 |
${EnableInterpolationHelp}
86 |
87 | 88 |
89 | 108 |
109 | 110 |
111 | 122 |
123 | 124 |
125 | 136 |
137 | 138 |
139 | 150 |
151 | 152 |
153 | 164 |
165 | 166 |
167 | 171 |
${ForceCorrectDownscalingHelp}
172 |
173 | 174 |
175 | 179 |
${EnableSigmoidHelp}
180 |
181 | 182 |
183 | 187 |
${EnableDebandHelp}
188 |
189 | 190 |
191 | 196 |
${LabelDitherDepthHelp}
197 |
198 |
199 | 200 |
201 |
202 |
-------------------------------------------------------------------------------- /screenshots/Home.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/screenshots/Home.PNG -------------------------------------------------------------------------------- /screenshots/In Movies Screenshot.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/screenshots/In Movies Screenshot.PNG -------------------------------------------------------------------------------- /screenshots/Login.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/screenshots/Login.PNG -------------------------------------------------------------------------------- /screenshots/Movies.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/screenshots/Movies.PNG -------------------------------------------------------------------------------- /screenshots/Music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/screenshots/Music.png -------------------------------------------------------------------------------- /screenshots/TV_Shows.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/screenshots/TV_Shows.PNG -------------------------------------------------------------------------------- /src/common/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "experimentalDecorators": true, 4 | "moduleResolution": "Node", 5 | "module": "commonjs", 6 | "target": "es2018", 7 | "sourceMap": true, 8 | "rootDir": ".", 9 | "outDir": "../../build/common", 10 | "importHelpers": true, 11 | "lib": ["es2018"], 12 | "types": [], 13 | "composite": true 14 | }, 15 | "include": ["./**/*.ts"], 16 | "exclude": ["node_modules"] 17 | } 18 | -------------------------------------------------------------------------------- /src/common/types.ts: -------------------------------------------------------------------------------- 1 | export type JsonPrimitiveValue = null | number | string | boolean; 2 | export type JsonSingleValue = JsonPrimitiveValue | JsonObject; 3 | export type JsonValue = JsonSingleValue | JsonSingleValue[]; 4 | 5 | export interface JsonObject { 6 | [key: string]: JsonValue; 7 | } 8 | 9 | export type WindowState = "Normal" | "Minimized" | "Maximized" | "Fullscreen"; 10 | -------------------------------------------------------------------------------- /src/main/cec/command-map.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @packageDocumentation 3 | * Command Map Module. Maps CEC event codes to Jellyfin commands. 4 | */ 5 | 6 | /** 7 | * Parses CEC event code and converts it into a Jellyfin command. 8 | * @param code 2 character code. 9 | */ 10 | export function parseCmd(code: string): string | undefined { 11 | switch (code.toUpperCase()) { 12 | case "00": // Select 13 | return "select"; 14 | case "01": // Up 15 | return "up"; 16 | case "02": // Down 17 | return "down"; 18 | case "03": // Left 19 | return "left"; 20 | case "04": // Right 21 | return "right"; 22 | case "05": // Right-Up 23 | // return "select"; 24 | break; 25 | case "06": // Right-Down 26 | // return "up"; 27 | break; 28 | case "07": // Left-Up 29 | // return "down"; 30 | break; 31 | case "08": // Left-Down 32 | // return "left"; 33 | break; 34 | case "09": // Root Menu 35 | return "menu"; 36 | case "0A": // Setup Menu 37 | return "settings"; 38 | case "0B": // Contents Menu 39 | // return "select"; 40 | break; 41 | case "0C": // Favorite Menu 42 | return "favorites"; 43 | case "0D": // Exit 44 | return "back"; // exit is just back 45 | 46 | // 0E to 1F is reserved 47 | 48 | case "20": // 0 49 | // return "select"; 50 | break; 51 | case "21": // 1 52 | // return "up"; 53 | break; 54 | case "22": // 2 55 | // return "down"; 56 | break; 57 | case "23": // 3 58 | // return "left"; 59 | break; 60 | case "24": // 4 61 | // return "right"; 62 | break; 63 | case "25": // 5 64 | // return "select"; 65 | break; 66 | case "26": // 6 67 | // return "up"; 68 | break; 69 | case "27": // 7 70 | // return "down"; 71 | break; 72 | case "28": // 8 73 | // return "left"; 74 | break; 75 | case "29": // 9 76 | // return "menu"; 77 | break; 78 | case "2A": // Dot 79 | // return "menu"; 80 | break; 81 | case "2B": // Enter 82 | return "select"; 83 | case "2C": // Clear 84 | // return "favorites"; 85 | break; 86 | 87 | // 2D to 2E is reserved 88 | 89 | case "2F": // Next Favorite 90 | // return "back"; 91 | break; 92 | 93 | case "30": // Channel Up 94 | // return "select"; 95 | break; 96 | case "31": // Channel Down 97 | // return "up"; 98 | break; 99 | case "32": // Previous Channel 100 | // return "down"; 101 | break; 102 | case "33": // Sound Select 103 | // return "left"; 104 | break; 105 | case "34": // Input Select 106 | // return "right"; 107 | break; 108 | case "35": // Display Information 109 | // return "select"; 110 | break; 111 | case "36": // Help 112 | // return "up"; 113 | break; 114 | case "37": // Page Up 115 | return "pageup"; 116 | case "38": // Page Down 117 | return "pagedown"; 118 | 119 | // 39 to 3F is reserved 120 | 121 | case "40": // Power 122 | // return "select"; 123 | break; 124 | case "41": // Volume Up 125 | return "volumeup"; 126 | case "42": // Volume Down 127 | return "volumedown"; 128 | case "43": // Mute 129 | return "togglemute"; 130 | case "44": // Play 131 | return "play"; 132 | case "45": // Stop 133 | return "stop"; 134 | case "46": // Pause 135 | return "pause"; 136 | case "47": // Record 137 | return "record"; 138 | case "48": // Rewind 139 | return "rewind"; 140 | case "49": // Fast Forward 141 | return "fastforward"; 142 | case "4A": // Eject 143 | // return "menu"; 144 | break; 145 | case "4B": // Forward 146 | return "next"; 147 | case "4C": // Backward 148 | return "previous"; 149 | case "4D": // Stop-Record 150 | // return "previous"; 151 | break; 152 | case "4E": // Pause-Record 153 | // return "previous"; 154 | break; 155 | 156 | // 4F is reserved 157 | 158 | case "50": // Angle 159 | // return "select"; 160 | break; 161 | case "51": // Sub Picture 162 | // return "volumeup"; 163 | break; 164 | case "52": // Video On Demand 165 | // return "volumedown"; 166 | break; 167 | case "53": // Electronic Program Guide 168 | return "guide"; 169 | case "54": // Timer Programming 170 | // return "play"; 171 | break; 172 | case "55": // Initial Configuration 173 | // return "stop"; 174 | break; 175 | 176 | // 56 to 5F is reserved 177 | 178 | case "60": // Play Function 179 | return "play"; 180 | case "61": // Pause-Play Function 181 | return "playpause"; 182 | case "62": // Record Function 183 | return "record"; 184 | case "63": // Pause-Record Function 185 | // return ""; 186 | break; 187 | case "64": // Stop Function 188 | return "stop"; 189 | case "65": // Mute Function 190 | return "togglemute"; 191 | case "66": // Restore Volume Function 192 | // return "togglemute"; 193 | break; 194 | case "67": // Tune Function 195 | // return "togglemute"; 196 | break; 197 | case "68": // Select Media Function 198 | // return "togglemute"; 199 | break; 200 | case "69": // Select A/V Input Function 201 | // return "togglemute"; 202 | break; 203 | case "6A": // Select Audio Input Function 204 | // return "togglemute"; 205 | break; 206 | case "6B": // Power Toggle Function 207 | // return "togglemute"; 208 | break; 209 | case "6C": // Power Off Function 210 | // return "togglemute"; 211 | break; 212 | case "6D": // Power On Function 213 | // return "togglemute"; 214 | break; 215 | 216 | // 6E to 70 is reserved 217 | 218 | case "71": // F1 (Blue) 219 | // return "playpause"; 220 | break; 221 | case "72": // F2 (Red) 222 | // return "record"; 223 | break; 224 | case "73": // F3 (Green) 225 | // return ""; 226 | break; 227 | case "74": // F4 (Yellow) 228 | // return "stop"; 229 | break; 230 | case "75": // F5 231 | // return "togglemute"; 232 | break; 233 | case "76": // Data 234 | // return "togglemute; 235 | break; 236 | } 237 | } 238 | -------------------------------------------------------------------------------- /src/main/cec/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @packageDocumentation 3 | * Adds support for HDMI-CEC. Uses the application cec-client. 4 | */ 5 | 6 | import { ChildProcessWithoutNullStreams, spawn } from "child_process"; 7 | import { parseCmd } from "./command-map"; 8 | import { EventEmitter } from "events"; 9 | import { join } from "path"; 10 | import { tmpdir } from "os"; 11 | import { createWriteStream, mkdirSync, statSync } from "fs"; 12 | 13 | interface CecAdapter { 14 | device?: string; 15 | lAddr?: string; 16 | } 17 | 18 | export class CEC { 19 | private initialized = false; // indicates if the CEC module is initialized 20 | private readonly emitter: EventEmitter; 21 | private readonly CEC_ADAPTER: CecAdapter = {}; 22 | private readonly process: ChildProcessWithoutNullStreams; 23 | 24 | constructor(cecExePath: string) { 25 | console.log("Initializing cec-client...\n"); 26 | // register the emitter 27 | this.emitter = new EventEmitter(); 28 | 29 | // spawn the cec-client 30 | this.process = spawn(cecExePath, [ 31 | "-t", 32 | "r", // default device is recorder 33 | "-d", 34 | "15", 35 | "-o", 36 | "JellyfinDesktop", 37 | ]); 38 | // if cec-client is not installed, then we run the app normally 39 | this.emitter.on("error", () => { 40 | console.info("ERROR: cec-client not installed, running without cec functionality."); 41 | // console.log(err); 42 | }); 43 | 44 | this.registerEvents(); 45 | } 46 | 47 | public onReceive(callback: (cmd: string) => void): void { 48 | this.emitter.on("receive-cmd", callback); 49 | } 50 | 51 | public kill(): void { 52 | this.process.kill(); 53 | } 54 | 55 | private testTVOn(cecProcess): void { 56 | cecProcess.stdin.write("on 0\n"); 57 | } 58 | 59 | private testSetActive(cecProcess): void { 60 | cecProcess.stdin.write("as\n"); 61 | } 62 | 63 | /** 64 | * Register the CEC events and handle CEC logging. 65 | */ 66 | private registerEvents(): void { 67 | // create new log file 68 | const logPath = tmpdir(); 69 | const logFile = join(logPath, "/cec-log.txt"); 70 | try { 71 | const stats = statSync(logPath); 72 | // if not a directory, then we need to create the appropriate directory 73 | if (!stats.isDirectory()) { 74 | console.log(`created directory ${logPath}`); 75 | mkdirSync(logPath); 76 | } 77 | } catch (err) { 78 | // create the directory 79 | if (err.code === "ENOENT") { 80 | console.log(`created directory ${logPath}`); 81 | mkdirSync(logPath); 82 | } 83 | } 84 | let logStream = createWriteStream(logFile); 85 | logStream.end(); 86 | 87 | /** 88 | * CEC Events. Events are detected by parsing the cec-client pipelines. 89 | */ 90 | const remoteButton: { 91 | state?: 0 | 1; 92 | cmd?: string; 93 | } = {}; // 0 is not pressed, 1 is pressed 94 | this.process.stdout.on("data", (data) => { 95 | // console.log("cec-client:\n" + data); 96 | // check for initialization 97 | if (!this.initialized) { 98 | const dataAsString = data.toString().replace(/\s+/g, ""); 99 | const indexOfAdapter = dataAsString.includes("CECclientregistered"); 100 | if (indexOfAdapter) { 101 | console.info("\nCEC Client successfully registered.\n"); 102 | const adapterRegExp = /logicaladdress\(es\)=(\w+)\((\d+)\)/g; 103 | const cecAdapterVals = adapterRegExp.exec(dataAsString); 104 | this.CEC_ADAPTER.device = cecAdapterVals[1]; 105 | this.CEC_ADAPTER.lAddr = cecAdapterVals[2]; 106 | console.info(`CEC Adapter Device:\t${JSON.stringify(this.CEC_ADAPTER)}`); 107 | this.initialized = true; 108 | // run after-init functions here: 109 | this.testTVOn(this.process); 110 | this.testSetActive(this.process); 111 | } 112 | return; // don't execute any other functions until initialized 113 | } 114 | // check for remote commands 115 | if (data.toString().includes(">>")) { 116 | const cecCmd = data.toString().split(">>")[1].replace(/\s+/g, "").split(":"); 117 | // console.log(cecCmd); 118 | if ((cecCmd[0][0] == 0 || cecCmd[0][0] == 5) && cecCmd[0][1] == this.CEC_ADAPTER.lAddr) { 119 | // device => adapter 120 | if (cecCmd[1] == "44") { 121 | // key pressed 122 | console.debug("remote control button pressed"); 123 | remoteButton.state = 1; 124 | remoteButton.cmd = cecCmd[2]; 125 | this.emitter.emit("receive-cmd", parseCmd(remoteButton.cmd)); 126 | } else if (cecCmd[1] == "45") { 127 | // key released 128 | console.debug("remote control button released"); 129 | remoteButton.state = 0; 130 | } 131 | } 132 | } 133 | logStream = createWriteStream(logFile, { flags: "a" }); 134 | logStream.write(data); 135 | logStream.end(); 136 | }); 137 | 138 | this.process.stderr.on("data", function (data) { 139 | console.warn(`cec-client error:\n${data}`); 140 | logStream = createWriteStream(logFile, { flags: "a" }); 141 | logStream.write(data); 142 | logStream.end(); 143 | }); 144 | 145 | this.process.on("close", function (code) { 146 | console.warn(`cec-client exited with code ${code}`); 147 | logStream = createWriteStream(logFile, { flags: "a" }); 148 | logStream.write(`child process exited with code ${code}`); 149 | logStream.end(); 150 | }); 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /src/main/serverdiscovery.ts: -------------------------------------------------------------------------------- 1 | import * as dgram from "dgram"; 2 | 3 | export function findServers(timeoutMs: number): Promise { 4 | const PORT = 7359; 5 | const MULTICAST_ADDR = "255.255.255.255"; 6 | 7 | const servers = []; 8 | let client: dgram.Socket; 9 | 10 | let callback: (res: string) => void; 11 | 12 | const result = new Promise((resolve) => (callback = resolve)); 13 | 14 | try { 15 | client = dgram.createSocket({ type: "udp4", reuseAddr: true }); 16 | } catch (err) { 17 | return Promise.resolve(JSON.stringify(servers)); 18 | } 19 | 20 | function onError(err: Error): void { 21 | console.warn("Error discovering servers: ", err); 22 | try { 23 | client.close(); 24 | } catch (err) { 25 | console.warn("Error closing udp client: ", err); 26 | } 27 | } 28 | 29 | function onTimerExpired(): void { 30 | console.log("timer expired", servers.length, "servers received"); 31 | console.log(servers); 32 | callback(JSON.stringify(servers)); 33 | 34 | try { 35 | client.close(); 36 | } catch (err) { 37 | console.error("Error: Closing udp client: ", err); 38 | } 39 | } 40 | 41 | client.on("message", (message, info) => { 42 | console.info(`Message from: ${info.address}:${info.port}`); 43 | try { 44 | // Expected server properties 45 | console.debug(`Server discovery json: ${message.toString()}`); 46 | const server = JSON.parse(message.toString()); 47 | server.EndpointAddress = info.address; 48 | servers.push(server); 49 | } catch (err) { 50 | console.warn(`Error receiving server info: ${err}`); 51 | } 52 | }); 53 | 54 | client.on("listening", function () { 55 | try { 56 | const address = client.address(); 57 | client.setBroadcast(true); 58 | const message = new Buffer("who is JellyfinServer?"); 59 | client.send(message, 0, message.length, PORT, MULTICAST_ADDR, function (err) { 60 | if (err) console.error(err); 61 | }); 62 | console.info(`UDP Client listening on ${address.address}:${address.port}`); 63 | console.info(`starting udp receive timer with timeout ms: ${timeoutMs}`); 64 | setTimeout(onTimerExpired, timeoutMs); 65 | } catch (err) { 66 | onError(err); 67 | } 68 | }); 69 | 70 | try { 71 | client.bind(); 72 | } catch (err) { 73 | onError(err); 74 | return Promise.resolve(JSON.stringify(servers)); 75 | } 76 | 77 | return result; 78 | } 79 | -------------------------------------------------------------------------------- /src/main/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "experimentalDecorators": true, 4 | "moduleResolution": "Node", 5 | "module": "commonjs", 6 | "target": "es2018", 7 | "sourceMap": true, 8 | "rootDir": ".", 9 | "outDir": "../../build/main", 10 | "importHelpers": true, 11 | "lib": ["es2018"], 12 | "types": ["node"], 13 | "skipLibCheck": true 14 | }, 15 | "include": ["./**/*.ts"], 16 | "exclude": ["node_modules"], 17 | "references": [ 18 | { 19 | "path": "../common" 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /src/main/wakeonlan.ts: -------------------------------------------------------------------------------- 1 | import * as net from "net"; 2 | import * as dgram from "dgram"; 3 | 4 | export function createMagicPacket(mac: string): Buffer { 5 | const MAC_LENGTH = 6; 6 | const MAC_REPEAT = 16; 7 | const PACKET_HEADER = 6; 8 | const parts = mac.match(/[0-9a-fA-F]{2}/g); 9 | if (!parts || parts.length != MAC_LENGTH) throw new Error(`malformed MAC address '${mac}'`); 10 | let buffer = new Buffer(PACKET_HEADER); 11 | const bufMac = new Buffer( 12 | parts.map(function (p) { 13 | return parseInt(p, 16); 14 | }) 15 | ); 16 | buffer.fill(0xff); 17 | for (let i = 0; i < MAC_REPEAT; i++) { 18 | buffer = Buffer.concat([buffer, bufMac]); 19 | } 20 | return buffer; 21 | } 22 | 23 | export function wake(mac: string, port = 9, address = "255.255.255.255"): Promise { 24 | // create magic packet 25 | let magicPacket: Buffer; 26 | try { 27 | magicPacket = createMagicPacket(mac); 28 | } catch (err) { 29 | return Promise.reject(err); 30 | } 31 | return new Promise((resolve, reject) => { 32 | const socket = dgram 33 | .createSocket(net.isIPv6(address) ? "udp6" : "udp4") 34 | .on("error", (err) => { 35 | socket.close(); 36 | reject(err); 37 | }) 38 | .once("listening", () => { 39 | socket.setBroadcast(true); 40 | }); 41 | socket.send(magicPacket, 0, magicPacket.length, port, address, function (err, res) { 42 | if (err) { 43 | reject(err); 44 | } else { 45 | resolve(res == magicPacket.length); 46 | } 47 | socket.close(); 48 | }); 49 | }); 50 | } 51 | -------------------------------------------------------------------------------- /src/shell/amd.ts: -------------------------------------------------------------------------------- 1 | declare function define(moduleDefinitions: string[], module: (...modules: any) => any): void; 2 | declare function require(moduleDefinitions: string[], module: (...modules: any) => any): void; 3 | -------------------------------------------------------------------------------- /src/shell/apphost.ts: -------------------------------------------------------------------------------- 1 | import { JsonObject, WindowState } from "../common/types"; 2 | 3 | define([], function () { 4 | "use strict"; 5 | 6 | function getCapabilities(): Promise { 7 | const caps = { 8 | PlayableMediaTypes: ["Audio", "Video"], 9 | 10 | SupportsPersistentIdentifier: true, 11 | }; 12 | 13 | return Promise.resolve(caps); 14 | } 15 | 16 | function getWindowState(): WindowState { 17 | return document["windowState"] || "Normal"; 18 | } 19 | 20 | function setWindowState(state: WindowState): Promise { 21 | // Normal 22 | // Minimized 23 | // Maximized 24 | 25 | return sendCommand(`windowstate-${state}`); 26 | } 27 | 28 | function sendCommand(name): Promise { 29 | return fetch(`electronapphost://${name}`) 30 | .then((response) => { 31 | if (!response.ok) { 32 | console.error("Error sending command: ", response); 33 | throw response; 34 | } 35 | }) 36 | .catch(console.error); 37 | } 38 | 39 | function supportsVoiceInput(): boolean { 40 | return ( 41 | window.SpeechRecognition || 42 | window["webkitSpeechRecognition"] || 43 | window["mozSpeechRecognition"] || 44 | window["oSpeechRecognition"] || 45 | !!window["msSpeechRecognition"] 46 | ); 47 | } 48 | 49 | const supportedFeatures = (function (): string[] { 50 | const features = [ 51 | "windowstate", 52 | "exit", 53 | "runatstartup", 54 | "filedownload", 55 | "externallinks", 56 | "sleep", 57 | //'restart', 58 | "shutdown", 59 | ]; 60 | 61 | if (navigator["share"]) { 62 | features.push("sharing"); 63 | } 64 | 65 | if (window["appStartInfo"].supportsTransparentWindow) { 66 | features.push("windowtransparency"); 67 | } 68 | 69 | if (supportsVoiceInput()) { 70 | features.push("voiceinput"); 71 | } 72 | 73 | if (self["ServiceWorkerSyncRegistered"]) { 74 | features.push("sync"); 75 | } 76 | 77 | features.push("youtube"); 78 | features.push("connectsignup"); 79 | 80 | features.push("soundeffects"); 81 | features.push("displaymode"); 82 | features.push("plugins"); 83 | features.push("skins"); 84 | features.push("exitmenu"); 85 | features.push("htmlaudioautoplay"); 86 | features.push("htmlvideoautoplay"); 87 | features.push("fullscreenchange"); 88 | features.push("displayableversion"); 89 | 90 | //features.push('remotecontrol'); 91 | 92 | features.push("multiserver"); 93 | features.push("imageanalysis"); 94 | 95 | features.push("remoteaudio"); 96 | features.push("remotevideo"); 97 | 98 | features.push("screensaver"); 99 | 100 | features.push("otherapppromotions"); 101 | features.push("fileinput"); 102 | 103 | features.push("nativeblurayplayback"); 104 | features.push("nativedvdplayback"); 105 | features.push("subtitleappearancesettings"); 106 | 107 | features.push("displaylanguage"); 108 | 109 | return features; 110 | })(); 111 | 112 | return { 113 | getWindowState: getWindowState, 114 | setWindowState: setWindowState, 115 | supports: function (command: string): boolean { 116 | return supportedFeatures.includes(command.toLowerCase()); 117 | }, 118 | capabilities: function (): JsonObject { 119 | return { 120 | PlayableMediaTypes: ["Audio", "Video"], 121 | 122 | SupportsPersistentIdentifier: true, 123 | }; 124 | }, 125 | getCapabilities: getCapabilities, 126 | exit: function (): Promise { 127 | return sendCommand("exit"); 128 | }, 129 | sleep: function (): Promise { 130 | return sendCommand("sleep"); 131 | }, 132 | restart: function (): Promise { 133 | return sendCommand("restart"); 134 | }, 135 | shutdown: function (): Promise { 136 | return sendCommand("shutdown"); 137 | }, 138 | init: function (): Promise { 139 | return Promise.resolve(); 140 | }, 141 | appName: function (): string { 142 | return window["appStartInfo"].name; 143 | }, 144 | appVersion: function (): string { 145 | return window["appStartInfo"].version; 146 | }, 147 | deviceName: function (): string { 148 | return window["appStartInfo"].deviceName; 149 | }, 150 | deviceId: function (): string { 151 | return window["appStartInfo"].deviceId; 152 | }, 153 | 154 | moreIcon: "dots-vert", 155 | getKeyOptions: function (): JsonObject { 156 | return { 157 | // chromium doesn't automatically handle these 158 | handleAltLeftBack: true, 159 | handleAltRightForward: true, 160 | keyMaps: { 161 | back: [ 162 | 8, 163 | // ESC 164 | 27, 165 | ], 166 | }, 167 | }; 168 | }, 169 | 170 | setTheme: function (themeSettings: { themeColor: string }): void { 171 | const metaThemeColor = document.querySelector("meta[name=theme-color]"); 172 | if (metaThemeColor) { 173 | metaThemeColor.setAttribute("content", themeSettings.themeColor); 174 | } 175 | }, 176 | 177 | setUserScalable: function (scalable): void { 178 | const att = scalable 179 | ? "viewport-fit=cover, width=device-width, initial-scale=1, minimum-scale=1, user-scalable=yes" 180 | : "viewport-fit=cover, width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"; 181 | 182 | document.querySelector("meta[name=viewport]").setAttribute("content", att); 183 | }, 184 | 185 | deviceIconUrl: function (): string | null { 186 | return null; 187 | }, 188 | }; 189 | }); 190 | -------------------------------------------------------------------------------- /src/shell/filesystem.ts: -------------------------------------------------------------------------------- 1 | define([], function () { 2 | function exits(endpoint, path): Promise { 3 | return fetch(`electronfs://${endpoint}?path=${path}`, { method: "POST" }) 4 | .then((response) => { 5 | if (!response.ok) { 6 | console.error("Error checking fs: ", response); 7 | throw response; 8 | } 9 | return response; 10 | }) 11 | .then(async (response) => { 12 | const text = await response.text(); 13 | return text === "true"; 14 | }); 15 | } 16 | 17 | return { 18 | fileExists: function (path: string): Promise { 19 | return exits("fileexists", path); 20 | }, 21 | directoryExists: function (path: string): Promise { 22 | return exits("directoryexists", path); 23 | }, 24 | }; 25 | }); 26 | -------------------------------------------------------------------------------- /src/shell/fullscreenmanager.ts: -------------------------------------------------------------------------------- 1 | define(["apphost", "events"], function (appHost, events) { 2 | class FullscreenManager { 3 | public requestFullscreen(): void { 4 | appHost.setWindowState("Maximized"); 5 | events.trigger(this, "fullscreenchange"); 6 | } 7 | 8 | public exitFullscreen(): void { 9 | appHost.setWindowState("Normal"); 10 | events.trigger(this, "fullscreenchange"); 11 | } 12 | 13 | public isFullScreen(): boolean { 14 | const windowState = appHost.getWindowState(); 15 | return windowState == "Maximized" || windowState == "Fullscreen"; 16 | } 17 | } 18 | 19 | return new FullscreenManager(); 20 | }); 21 | -------------------------------------------------------------------------------- /src/shell/globals.d.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellyfin-archive/jellyfin-desktop/f69a32dd993d1a692c4c872684190ec911c78f4b/src/shell/globals.d.ts -------------------------------------------------------------------------------- /src/shell/plugins/mpvplayer.css: -------------------------------------------------------------------------------- 1 | .mpv-videoPlayerContainer { 2 | position: fixed !important; 3 | top: 0; 4 | bottom: 0; 5 | left: 0; 6 | right: 0; 7 | display: flex; 8 | align-items: center; 9 | } 10 | 11 | .mpv-videoPlayerContainer:not(.mpv-videoPlayerContainer-withBackdrop):not(.mpv-videoPlayerContainer-onTop) { 12 | display: none; 13 | } 14 | 15 | .mpv-videoPlayerContainer-withBackdrop { 16 | background-repeat: no-repeat; 17 | background-position: center center; 18 | background-size: cover; 19 | background-attachment: fixed; 20 | background-color: #000; 21 | } 22 | 23 | .mpv-videoPlayerContainer-onTop { 24 | z-index: 1000; 25 | } 26 | 27 | @keyframes mpvvideoplayer-zoomin { 28 | from { 29 | transform: scale3d(.2, .2, .2); 30 | opacity: .6; 31 | } 32 | 33 | to { 34 | transform: none; 35 | opacity: initial; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/shell/plugins/mpvplayer/audio.ts: -------------------------------------------------------------------------------- 1 | define(["loading", "appSettings", "emby-select", "emby-checkbox", "emby-scroller"], function (loading, appSettings) { 2 | function getMultiCheckboxValues(view: HTMLElement, className: string): string[] { 3 | const checkboxes: NodeListOf = view.querySelectorAll(`.${className}`); 4 | const values = []; 5 | 6 | for (let i = 0, length = checkboxes.length; i < length; i++) { 7 | if (checkboxes[i].checked) { 8 | values.push(checkboxes[i].getAttribute("data-value")); 9 | } 10 | } 11 | 12 | return values; 13 | } 14 | 15 | function setMultiCheckboxValues(view: HTMLElement, className: string, values: string): void { 16 | const valList = values.split(","); 17 | const checkboxes: NodeListOf = view.querySelectorAll(`.${className}`); 18 | 19 | for (let i = 0, length = checkboxes.length; i < length; i++) { 20 | checkboxes[i].checked = valList.includes(checkboxes[i].getAttribute("data-value")); 21 | } 22 | } 23 | 24 | function onSubmit(e): false { 25 | e.preventDefault(); 26 | return false; 27 | } 28 | 29 | return function (view): void { 30 | view.querySelector("form").addEventListener("submit", onSubmit); 31 | 32 | view.addEventListener("viewbeforeshow", function (e) { 33 | const isRestored = e.detail.isRestored; 34 | 35 | window["Emby"].Page.setTitle("Audio Settings"); 36 | 37 | loading.hide(); 38 | 39 | if (!isRestored) { 40 | renderSettings(); 41 | } 42 | }); 43 | 44 | view.addEventListener("viewbeforehide", saveSettings); 45 | 46 | function saveSettings(): void { 47 | appSettings.set("mpv-drc", view.querySelector(".selectDrc").value); 48 | appSettings.set("mpv-speakerlayout", view.querySelector(".selectSpeakerLayout").value); 49 | appSettings.set("mpv-exclusiveAudio", view.querySelector(".chkExclusiveMode").checked); 50 | 51 | appSettings.set("mpv-audiospdif", getMultiCheckboxValues(view, "chkSpdif").join(",")); 52 | appSettings.set("mpv-upmixaudiofor", getMultiCheckboxValues(view, "chkUpmixAudioFor").join(",")); 53 | } 54 | 55 | function renderSettings(): void { 56 | view.querySelector(".selectSpeakerLayout").value = appSettings.get("mpv-speakerlayout") || ""; 57 | view.querySelector(".selectDrc").value = appSettings.get("mpv-drc") || ""; 58 | view.querySelector(".chkExclusiveMode").checked = appSettings.get("mpv-exclusiveAudio") === "true"; 59 | 60 | setMultiCheckboxValues(view, "chkSpdif", appSettings.get("mpv-audiospdif") || ""); 61 | setMultiCheckboxValues(view, "chkUpmixAudioFor", appSettings.get("mpv-upmixaudiofor") || ""); 62 | } 63 | }; 64 | }); 65 | -------------------------------------------------------------------------------- /src/shell/plugins/mpvplayer/video.ts: -------------------------------------------------------------------------------- 1 | define([ 2 | "loading", 3 | "pluginManager", 4 | "appSettings", 5 | "emby-select", 6 | "emby-checkbox", 7 | "emby-input", 8 | "emby-scroller", 9 | ], function (loading, pluginManager, appSettings) { 10 | function onSubmit(e): false { 11 | e.preventDefault(); 12 | return false; 13 | } 14 | 15 | return function (view): void { 16 | view.querySelector("form").addEventListener("submit", onSubmit); 17 | 18 | view.addEventListener("viewbeforeshow", function (e) { 19 | const isRestored = e.detail.isRestored; 20 | 21 | window["Emby"].Page.setTitle("Video Settings"); 22 | 23 | loading.hide(); 24 | 25 | if (!isRestored) { 26 | renderSettings(); 27 | } 28 | }); 29 | 30 | view.addEventListener("viewbeforehide", saveSettings); 31 | 32 | function saveSettings(): void { 33 | appSettings.set("mpv-hwdec", view.querySelector(".selectHwaMode").value); 34 | appSettings.set("mpv-outputlevels", view.querySelector(".selectNominalRange").value); 35 | appSettings.set("mpv-displaysync", view.querySelector(".chkRefreshRateMode").checked); 36 | appSettings.set("mpv-displaysync_override", view.querySelector(".txtUserRefreshRate").value); 37 | appSettings.set("mpv-videosync", view.querySelector(".chkVideoSync").checked); 38 | appSettings.set("mpv-deinterlace", view.querySelector(".selectDeinterlace").value); 39 | appSettings.set("mpv-scale", view.querySelector(".selectScale").value); 40 | appSettings.set("mpv-cscale", view.querySelector(".selectCScale").value); 41 | appSettings.set("mpv-dscale", view.querySelector(".selectDScale").value); 42 | appSettings.set("mpv-tscale", view.querySelector(".selectTScale").value); 43 | appSettings.set("mpv-ditherdepth", view.querySelector(".selectDitherDepth").value); 44 | 45 | appSettings.set("mpv-audiodelay", view.querySelector(".txtDefaultAudioDelay").value); 46 | appSettings.set("mpv-audiodelay2325", view.querySelector(".txtAudioDelay2325").value); 47 | 48 | appSettings.set("mpv-interpolation", view.querySelector(".chkInterpolation").checked); 49 | appSettings.set("mpv-openglhq", view.querySelector(".chkOpenglhq").checked); 50 | appSettings.set("mpv-correctdownscaling", view.querySelector(".chkCorrectDownscaling").checked); 51 | appSettings.set("mpv-sigmoidupscaling", view.querySelector(".chkSigmoid").checked); 52 | appSettings.set("mpv-deband", view.querySelector(".chkDeband").checked); 53 | appSettings.set("mpv-videostereomode", view.querySelector(".selectVideoStereoMode").value); 54 | } 55 | 56 | function renderSettings(): void { 57 | view.querySelector(".selectHwaMode").value = appSettings.get("mpv-hwdec") || ""; 58 | view.querySelector(".selectNominalRange").value = appSettings.get("mpv-outputlevels") || ""; 59 | view.querySelector(".chkRefreshRateMode").checked = appSettings.get("mpv-displaysync") === "true"; 60 | view.querySelector(".txtUserRefreshRate").value = appSettings.get("mpv-displaysync_override") || ""; 61 | view.querySelector(".chkVideoSync").checked = appSettings.get("mpv-videosync") === "true"; 62 | view.querySelector(".selectDeinterlace").value = appSettings.get("mpv-deinterlace") || ""; 63 | view.querySelector(".selectScale").value = appSettings.get("mpv-scale") || ""; 64 | view.querySelector(".selectCScale").value = appSettings.get("mpv-cscale") || ""; 65 | view.querySelector(".selectDScale").value = appSettings.get("mpv-dscale") || ""; 66 | view.querySelector(".selectTScale").value = appSettings.get("mpv-tscale") || ""; 67 | view.querySelector(".selectVideoStereoMode").value = appSettings.get("mpv-videostereomode") || ""; 68 | view.querySelector(".selectDitherDepth").value = appSettings.get("mpv-ditherdepth") || ""; 69 | 70 | view.querySelector(".txtDefaultAudioDelay").value = appSettings.get("mpv-audiodelay") || "0"; 71 | view.querySelector(".txtAudioDelay2325").value = appSettings.get("mpv-audiodelay2325") || "0"; 72 | 73 | view.querySelector(".chkOpenglhq").checked = appSettings.get("mpv-openglhq") === "true"; 74 | view.querySelector(".chkInterpolation").checked = appSettings.get("mpv-interpolation") === "true"; 75 | view.querySelector(".chkCorrectDownscaling").checked = appSettings.get("mpv-correctdownscaling") === "true"; 76 | view.querySelector(".chkSigmoid").checked = appSettings.get("mpv-sigmoidupscaling") === "true"; 77 | view.querySelector(".chkDeband").checked = appSettings.get("mpv-deband") === "true"; 78 | } 79 | }; 80 | }); 81 | -------------------------------------------------------------------------------- /src/shell/scripts/appclose.ts: -------------------------------------------------------------------------------- 1 | require(["playbackManager"], function (playbackManager) { 2 | window["AppCloseHelper"] = { 3 | onClosing: function (): void { 4 | // Prevent backwards navigation from stopping video 5 | history.back = (): void => { 6 | return; 7 | }; 8 | 9 | playbackManager.onAppClose(); 10 | }, 11 | }; 12 | }); 13 | -------------------------------------------------------------------------------- /src/shell/scripts/videohandler.ts: -------------------------------------------------------------------------------- 1 | require(["playbackManager", "events"], function (playbackManager, events) { 2 | function sendCommand(name: string, method = "GET"): void { 3 | fetch(`electronapphost://${name}`, { 4 | method, 5 | }).catch(console.error); 6 | } 7 | 8 | let videoOn: boolean | undefined; 9 | 10 | events.on(playbackManager, "playbackstart", () => { 11 | if (playbackManager.isPlayingVideo()) { 12 | videoOn = true; 13 | sendCommand("video-on", "POST"); 14 | } 15 | }); 16 | 17 | events.on(playbackManager, "playbackstop", () => { 18 | if (videoOn) { 19 | videoOn = false; 20 | sendCommand("video-off", "POST"); 21 | } 22 | }); 23 | 24 | sendCommand("loaded"); 25 | }); 26 | -------------------------------------------------------------------------------- /src/shell/serverdiscovery.ts: -------------------------------------------------------------------------------- 1 | import { JsonObject } from "../common/types"; 2 | 3 | define([], function () { 4 | return { 5 | findServers: async function (timeoutMs): Promise { 6 | const response = await fetch(`electronserverdiscovery://findservers?timeout=${timeoutMs}`, { 7 | method: "POST", 8 | }); 9 | if (!response.ok) { 10 | throw response; 11 | } 12 | // Expected server properties 13 | // Name, Id, Address, EndpointAddress (optional) 14 | return response.json(); 15 | }, 16 | }; 17 | }); 18 | -------------------------------------------------------------------------------- /src/shell/shell.ts: -------------------------------------------------------------------------------- 1 | define(["events", "apphost"], function (events, apphost) { 2 | function sendCommand(name: string): Promise { 3 | return fetch(`electronapphost://${name}`).then((response) => { 4 | if (!response.ok) { 5 | console.error("Error sending command: ", response); 6 | throw response; 7 | } 8 | return response; 9 | }); 10 | } 11 | 12 | const shell = {}; 13 | let closingWindowState; 14 | 15 | function getProcessClosePromise(pid): Promise { 16 | // returns a promise that resolves or rejects when a process closes 17 | return new Promise(function (resolve, reject) { 18 | events.on(shell, "closed", function (e, processId, error) { 19 | if (processId === pid) { 20 | if (closingWindowState) { 21 | apphost.setWindowState(closingWindowState); 22 | closingWindowState = null; 23 | } 24 | 25 | if (error) { 26 | reject(); 27 | } else { 28 | resolve(); 29 | } 30 | } 31 | }); 32 | }); 33 | } 34 | 35 | window["onChildProcessClosed"] = function (processId, error): void { 36 | events.trigger(shell, "closed", [processId, error]); 37 | }; 38 | 39 | function paramsToString(params): string { 40 | const values = []; 41 | 42 | for (const key in params) { 43 | const value = params[key]; 44 | 45 | if (value !== null && value !== undefined && value !== "") { 46 | values.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`); 47 | } 48 | } 49 | return values.join("&"); 50 | } 51 | 52 | shell["openUrl"] = function (url): Promise { 53 | return sendCommand(`openurl?url=${url}`); 54 | }; 55 | 56 | shell["canExec"] = true; 57 | 58 | shell["close"] = function (processId): Promise { 59 | const url = `shellclose?id=${processId}`; 60 | 61 | return sendCommand(url); 62 | }; 63 | 64 | shell["exec"] = function (options): Promise { 65 | const url = `shellstart?${paramsToString(options)}`; 66 | 67 | return sendCommand(url).then(function (response) { 68 | if (apphost.supports("windowstate")) { 69 | closingWindowState = apphost.getWindowState(); 70 | apphost.setWindowState("Minimized"); 71 | } 72 | 73 | events.trigger(shell, "exec", [response]); 74 | 75 | return { 76 | id: response, 77 | promise: getProcessClosePromise(response), 78 | }; 79 | }); 80 | }; 81 | 82 | return shell; 83 | }); 84 | -------------------------------------------------------------------------------- /src/shell/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "experimentalDecorators": true, 4 | "moduleResolution": "Node", 5 | "module": "commonjs", 6 | "target": "es2018", 7 | "sourceMap": true, 8 | "rootDir": ".", 9 | "outDir": "../../build/shell", 10 | "importHelpers": true, 11 | "lib": ["es2018", "dom"], 12 | "types": [] 13 | }, 14 | "include": ["./**/*.ts"], 15 | "exclude": ["node_modules"], 16 | "references": [ 17 | { 18 | "path": "../common" 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /src/shell/wakeonlan.ts: -------------------------------------------------------------------------------- 1 | define([], function () { 2 | function send(info): Promise { 3 | return fetch(`electronwakeonlan://wakeserver?macaddress=${info.MacAddress}&port=${info.Port}`, { 4 | method: "POST", 5 | }).then((response) => { 6 | if (!response.ok) { 7 | throw response; 8 | } 9 | }); 10 | } 11 | 12 | function isSupported(): boolean { 13 | return true; 14 | } 15 | 16 | return { 17 | send, 18 | isSupported, 19 | }; 20 | }); 21 | --------------------------------------------------------------------------------