mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Merge with master
This commit is contained in:
commit
d845c3a7e4
81 changed files with 2072 additions and 888 deletions
5
.github/workflows/build.yml
vendored
5
.github/workflows/build.yml
vendored
|
@ -18,7 +18,7 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out Git repository
|
- name: Check out Git repository
|
||||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
|
||||||
|
|
||||||
- name: Setup node environment
|
- name: Setup node environment
|
||||||
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
|
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
|
||||||
|
@ -57,9 +57,11 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Save PR context
|
- name: Save PR context
|
||||||
env:
|
env:
|
||||||
|
PR_BRANCH: ${{ github.ref_name }}
|
||||||
PR_NUMBER: ${{ github.event.number }}
|
PR_NUMBER: ${{ github.event.number }}
|
||||||
PR_SHA: ${{ github.event.pull_request.head.sha }}
|
PR_SHA: ${{ github.event.pull_request.head.sha }}
|
||||||
run: |
|
run: |
|
||||||
|
echo $PR_BRANCH > PR_branch
|
||||||
echo $PR_NUMBER > PR_number
|
echo $PR_NUMBER > PR_number
|
||||||
echo $PR_SHA > PR_sha
|
echo $PR_SHA > PR_sha
|
||||||
|
|
||||||
|
@ -68,5 +70,6 @@ jobs:
|
||||||
with:
|
with:
|
||||||
name: PR_context
|
name: PR_context
|
||||||
path: |
|
path: |
|
||||||
|
PR_branch
|
||||||
PR_number
|
PR_number
|
||||||
PR_sha
|
PR_sha
|
||||||
|
|
8
.github/workflows/codeql.yml
vendored
8
.github/workflows/codeql.yml
vendored
|
@ -19,16 +19,16 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
|
||||||
|
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@8f596b4ae3cb3c588a5c46780b86dd53fef16c52 # v3.25.2
|
uses: github/codeql-action/init@ccf74c947955fd1cf117aef6a0e4e66191ef6f61 # v3.25.4
|
||||||
with:
|
with:
|
||||||
languages: javascript
|
languages: javascript
|
||||||
queries: +security-extended
|
queries: +security-extended
|
||||||
|
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@8f596b4ae3cb3c588a5c46780b86dd53fef16c52 # v3.25.2
|
uses: github/codeql-action/autobuild@ccf74c947955fd1cf117aef6a0e4e66191ef6f61 # v3.25.4
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@8f596b4ae3cb3c588a5c46780b86dd53fef16c52 # v3.25.2
|
uses: github/codeql-action/analyze@ccf74c947955fd1cf117aef6a0e4e66191ef6f61 # v3.25.4
|
||||||
|
|
2
.github/workflows/commands.yml
vendored
2
.github/workflows/commands.yml
vendored
|
@ -18,7 +18,7 @@ jobs:
|
||||||
comment-id: ${{ github.event.comment.id }}
|
comment-id: ${{ github.event.comment.id }}
|
||||||
reactions: '+1'
|
reactions: '+1'
|
||||||
- name: Checkout the latest code
|
- name: Checkout the latest code
|
||||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.JF_BOT_TOKEN }}
|
token: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
2
.github/workflows/pr-suggestions.yml
vendored
2
.github/workflows/pr-suggestions.yml
vendored
|
@ -17,7 +17,7 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out Git repository
|
- name: Check out Git repository
|
||||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
|
|
||||||
|
|
53
.github/workflows/publish.yml
vendored
53
.github/workflows/publish.yml
vendored
|
@ -8,13 +8,40 @@ on:
|
||||||
- completed
|
- completed
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
pr-context:
|
||||||
|
name: PR context
|
||||||
|
if: ${{ github.event.workflow_run.event == 'pull_request' }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
branch: ${{ env.pr_branch }}
|
||||||
|
commit: ${{ env.pr_sha }}
|
||||||
|
pr_number: ${{ env.pr_number }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Get PR context
|
||||||
|
uses: dawidd6/action-download-artifact@09f2f74827fd3a8607589e5ad7f9398816f540fe # v3.1.4
|
||||||
|
id: pr_context
|
||||||
|
with:
|
||||||
|
run_id: ${{ github.event.workflow_run.id }}
|
||||||
|
name: PR_context
|
||||||
|
|
||||||
|
- name: Set PR context environment variables
|
||||||
|
if: ${{ steps.pr_context.conclusion == 'success' }}
|
||||||
|
run: |
|
||||||
|
echo "pr_branch=$(cat PR_branch)" >> $GITHUB_ENV
|
||||||
|
echo "pr_number=$(cat PR_number)" >> $GITHUB_ENV
|
||||||
|
echo "pr_sha=$(cat PR_sha)" >> $GITHUB_ENV
|
||||||
|
|
||||||
publish:
|
publish:
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
deployments: write
|
deployments: write
|
||||||
|
|
||||||
name: Deploy to Cloudflare Pages
|
name: Deploy to Cloudflare Pages
|
||||||
|
if: ${{ always() }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
needs:
|
||||||
|
- pr-context
|
||||||
outputs:
|
outputs:
|
||||||
url: ${{ steps.cf.outputs.url }}
|
url: ${{ steps.cf.outputs.url }}
|
||||||
|
|
||||||
|
@ -33,32 +60,10 @@ jobs:
|
||||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||||
projectName: jellyfin-web
|
projectName: jellyfin-web
|
||||||
branch: ${{ github.event.workflow_run.head_branch }}
|
branch: ${{ needs.pr-context.outputs.branch || github.ref_name }}
|
||||||
directory: dist
|
directory: dist
|
||||||
gitHubToken: ${{ secrets.GITHUB_TOKEN }}
|
gitHubToken: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
pr-context:
|
|
||||||
name: PR context
|
|
||||||
if: ${{ always() && github.event.workflow_run.event == 'pull_request' }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
commit: ${{ env.pr_sha }}
|
|
||||||
pr_number: ${{ env.pr_number }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Get PR context
|
|
||||||
uses: dawidd6/action-download-artifact@09f2f74827fd3a8607589e5ad7f9398816f540fe # v3.1.4
|
|
||||||
id: pr_context
|
|
||||||
with:
|
|
||||||
run_id: ${{ github.event.workflow_run.id }}
|
|
||||||
name: PR_context
|
|
||||||
|
|
||||||
- name: Set PR context environment variables
|
|
||||||
if: ${{ steps.pr_context.conclusion == 'success' }}
|
|
||||||
run: |
|
|
||||||
echo "pr_number=$(cat PR_number)" >> $GITHUB_ENV
|
|
||||||
echo "pr_sha=$(cat PR_sha)" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
compose-comment:
|
compose-comment:
|
||||||
name: Compose comment
|
name: Compose comment
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
|
@ -68,7 +73,7 @@ jobs:
|
||||||
- pr-context
|
- pr-context
|
||||||
|
|
||||||
with:
|
with:
|
||||||
branch: ${{ github.event.workflow_run.head_branch }}
|
branch: ${{ needs.pr-context.outputs.branch || github.ref_name }}
|
||||||
commit: ${{ needs.pr-context.outputs.commit != '' && needs.pr-context.outputs.commit || github.event.workflow_run.head_sha }}
|
commit: ${{ needs.pr-context.outputs.commit != '' && needs.pr-context.outputs.commit || github.event.workflow_run.head_sha }}
|
||||||
preview_url: ${{ needs.publish.outputs.url }}
|
preview_url: ${{ needs.publish.outputs.url }}
|
||||||
build_workflow_run_id: ${{ github.event.workflow_run.id }}
|
build_workflow_run_id: ${{ github.event.workflow_run.id }}
|
||||||
|
|
10
.github/workflows/quality.yml
vendored
10
.github/workflows/quality.yml
vendored
|
@ -17,7 +17,7 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out Git repository
|
- name: Check out Git repository
|
||||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
|
||||||
|
|
||||||
- name: Setup node environment
|
- name: Setup node environment
|
||||||
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
|
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
|
||||||
|
@ -41,7 +41,7 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out Git repository
|
- name: Check out Git repository
|
||||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
|
||||||
|
|
||||||
- name: Setup node environment
|
- name: Setup node environment
|
||||||
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
|
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
|
||||||
|
@ -62,7 +62,7 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out Git repository
|
- name: Check out Git repository
|
||||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
|
||||||
|
|
||||||
- name: Setup node environment
|
- name: Setup node environment
|
||||||
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
|
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
|
||||||
|
@ -86,7 +86,7 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out Git repository
|
- name: Check out Git repository
|
||||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
|
||||||
|
|
||||||
- name: Setup node environment
|
- name: Setup node environment
|
||||||
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
|
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
|
||||||
|
@ -107,7 +107,7 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out Git repository
|
- name: Check out Git repository
|
||||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
|
||||||
|
|
||||||
- name: Setup node environment
|
- name: Setup node environment
|
||||||
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
|
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
|
||||||
|
|
2
.github/workflows/update-sdk.yml
vendored
2
.github/workflows/update-sdk.yml
vendored
|
@ -16,7 +16,7 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out Git repository
|
- name: Check out Git repository
|
||||||
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
|
||||||
with:
|
with:
|
||||||
ref: master
|
ref: master
|
||||||
token: ${{ secrets.JF_BOT_TOKEN }}
|
token: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
|
|
|
@ -86,6 +86,7 @@
|
||||||
- [GeorgeH005](https://github.com/GeorgeH005)
|
- [GeorgeH005](https://github.com/GeorgeH005)
|
||||||
- [JPUC1143](https://github.com/Jpuc1143)
|
- [JPUC1143](https://github.com/Jpuc1143)
|
||||||
- [David Angel](https://github.com/davidangel)
|
- [David Angel](https://github.com/davidangel)
|
||||||
|
- [Pithaya](https://github.com/Pithaya)
|
||||||
|
|
||||||
## Emby Contributors
|
## Emby Contributors
|
||||||
|
|
||||||
|
|
18
package-lock.json
generated
18
package-lock.json
generated
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "jellyfin-web",
|
"name": "jellyfin-web",
|
||||||
"version": "10.9.0",
|
"version": "10.10.0",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "jellyfin-web",
|
"name": "jellyfin-web",
|
||||||
"version": "10.9.0",
|
"version": "10.10.0",
|
||||||
"license": "GPL-2.0-or-later",
|
"license": "GPL-2.0-or-later",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emotion/react": "11.11.4",
|
"@emotion/react": "11.11.4",
|
||||||
|
@ -18,7 +18,7 @@
|
||||||
"@fontsource/noto-sans-sc": "5.0.18",
|
"@fontsource/noto-sans-sc": "5.0.18",
|
||||||
"@fontsource/noto-sans-tc": "5.0.18",
|
"@fontsource/noto-sans-tc": "5.0.18",
|
||||||
"@jellyfin/libass-wasm": "4.2.1",
|
"@jellyfin/libass-wasm": "4.2.1",
|
||||||
"@jellyfin/sdk": "0.0.0-unstable.202404101900",
|
"@jellyfin/sdk": "0.0.0-unstable.202405050501",
|
||||||
"@loadable/component": "5.16.3",
|
"@loadable/component": "5.16.3",
|
||||||
"@mui/icons-material": "5.15.11",
|
"@mui/icons-material": "5.15.11",
|
||||||
"@mui/material": "5.15.11",
|
"@mui/material": "5.15.11",
|
||||||
|
@ -3728,9 +3728,9 @@
|
||||||
"integrity": "sha512-oWK2yz8fFlMXkIuxUc9g/bqN2h56AB+8b6vF/Ikns6WZ/nmcGJ/5lcVaLI4csE83yWgmco4gHO3HyJDsM9EXcQ=="
|
"integrity": "sha512-oWK2yz8fFlMXkIuxUc9g/bqN2h56AB+8b6vF/Ikns6WZ/nmcGJ/5lcVaLI4csE83yWgmco4gHO3HyJDsM9EXcQ=="
|
||||||
},
|
},
|
||||||
"node_modules/@jellyfin/sdk": {
|
"node_modules/@jellyfin/sdk": {
|
||||||
"version": "0.0.0-unstable.202404101900",
|
"version": "0.0.0-unstable.202405050501",
|
||||||
"resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202404101900.tgz",
|
"resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202405050501.tgz",
|
||||||
"integrity": "sha512-/OQyJIfOMQf23eabSEOARYiHkUhwsHNQL9SenEYGuV1p9ikmIRivqHwwtbPSTC7IEO6qmq62rndfQpNpIuIjdw==",
|
"integrity": "sha512-d7TvTH3gGltNH7WrcuJsC+NiTV4HMCxKhzEeW1dGchA6aXRS1aEcnTqsR/ArONQDzlM6ac9Y+y9gfvJYJ6Bgyg==",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"axios": "^1.3.4"
|
"axios": "^1.3.4"
|
||||||
}
|
}
|
||||||
|
@ -25587,9 +25587,9 @@
|
||||||
"integrity": "sha512-oWK2yz8fFlMXkIuxUc9g/bqN2h56AB+8b6vF/Ikns6WZ/nmcGJ/5lcVaLI4csE83yWgmco4gHO3HyJDsM9EXcQ=="
|
"integrity": "sha512-oWK2yz8fFlMXkIuxUc9g/bqN2h56AB+8b6vF/Ikns6WZ/nmcGJ/5lcVaLI4csE83yWgmco4gHO3HyJDsM9EXcQ=="
|
||||||
},
|
},
|
||||||
"@jellyfin/sdk": {
|
"@jellyfin/sdk": {
|
||||||
"version": "0.0.0-unstable.202404101900",
|
"version": "0.0.0-unstable.202405050501",
|
||||||
"resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202404101900.tgz",
|
"resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202405050501.tgz",
|
||||||
"integrity": "sha512-/OQyJIfOMQf23eabSEOARYiHkUhwsHNQL9SenEYGuV1p9ikmIRivqHwwtbPSTC7IEO6qmq62rndfQpNpIuIjdw==",
|
"integrity": "sha512-d7TvTH3gGltNH7WrcuJsC+NiTV4HMCxKhzEeW1dGchA6aXRS1aEcnTqsR/ArONQDzlM6ac9Y+y9gfvJYJ6Bgyg==",
|
||||||
"requires": {}
|
"requires": {}
|
||||||
},
|
},
|
||||||
"@jest/schemas": {
|
"@jest/schemas": {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "jellyfin-web",
|
"name": "jellyfin-web",
|
||||||
"version": "10.9.0",
|
"version": "10.10.0",
|
||||||
"description": "Web interface for Jellyfin",
|
"description": "Web interface for Jellyfin",
|
||||||
"repository": "https://github.com/jellyfin/jellyfin-web",
|
"repository": "https://github.com/jellyfin/jellyfin-web",
|
||||||
"license": "GPL-2.0-or-later",
|
"license": "GPL-2.0-or-later",
|
||||||
|
@ -79,7 +79,7 @@
|
||||||
"@fontsource/noto-sans-sc": "5.0.18",
|
"@fontsource/noto-sans-sc": "5.0.18",
|
||||||
"@fontsource/noto-sans-tc": "5.0.18",
|
"@fontsource/noto-sans-tc": "5.0.18",
|
||||||
"@jellyfin/libass-wasm": "4.2.1",
|
"@jellyfin/libass-wasm": "4.2.1",
|
||||||
"@jellyfin/sdk": "0.0.0-unstable.202404101900",
|
"@jellyfin/sdk": "0.0.0-unstable.202405050501",
|
||||||
"@loadable/component": "5.16.3",
|
"@loadable/component": "5.16.3",
|
||||||
"@mui/icons-material": "5.15.11",
|
"@mui/icons-material": "5.15.11",
|
||||||
"@mui/material": "5.15.11",
|
"@mui/material": "5.15.11",
|
||||||
|
|
|
@ -10,11 +10,6 @@ $mui-bp-xl: 1536px;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure the footer renders over the drawer
|
|
||||||
.appfooter {
|
|
||||||
z-index: 1201 !important; // mui drawer uses z-index 1200
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hide some items from the user "settings" page that are in the drawer
|
// Hide some items from the user "settings" page that are in the drawer
|
||||||
#myPreferencesMenuPage {
|
#myPreferencesMenuPage {
|
||||||
.lnkQuickConnectPreferences,
|
.lnkQuickConnectPreferences,
|
||||||
|
|
|
@ -6,7 +6,7 @@ import React, { type FC, useCallback } from 'react';
|
||||||
import Box from '@mui/material/Box';
|
import Box from '@mui/material/Box';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { useLocalStorage } from 'hooks/useLocalStorage';
|
import { useLocalStorage } from 'hooks/useLocalStorage';
|
||||||
import { useGetItem, useGetItemsViewByType } from 'hooks/useFetchItems';
|
import { useGetItemsViewByType } from 'hooks/useFetchItems';
|
||||||
import { getDefaultLibraryViewSettings, getSettingsKey } from 'utils/items';
|
import { getDefaultLibraryViewSettings, getSettingsKey } from 'utils/items';
|
||||||
import { CardShape } from 'utils/card';
|
import { CardShape } from 'utils/card';
|
||||||
import Loading from 'components/loading/LoadingComponent';
|
import Loading from 'components/loading/LoadingComponent';
|
||||||
|
@ -28,6 +28,7 @@ import { LibraryTab } from 'types/libraryTab';
|
||||||
import { type LibraryViewSettings, type ParentId, ViewMode } from 'types/library';
|
import { type LibraryViewSettings, type ParentId, ViewMode } from 'types/library';
|
||||||
import type { CardOptions } from 'types/cardOptions';
|
import type { CardOptions } from 'types/cardOptions';
|
||||||
import type { ListOptions } from 'types/listOptions';
|
import type { ListOptions } from 'types/listOptions';
|
||||||
|
import { useItem } from 'hooks/useItem';
|
||||||
|
|
||||||
interface ItemsViewProps {
|
interface ItemsViewProps {
|
||||||
viewType: LibraryTab;
|
viewType: LibraryTab;
|
||||||
|
@ -79,7 +80,7 @@ const ItemsView: FC<ItemsViewProps> = ({
|
||||||
itemType,
|
itemType,
|
||||||
libraryViewSettings
|
libraryViewSettings
|
||||||
);
|
);
|
||||||
const { data: item } = useGetItem(parentId);
|
const { data: item } = useItem(parentId || undefined);
|
||||||
|
|
||||||
const getListOptions = useCallback(() => {
|
const getListOptions = useCallback(() => {
|
||||||
const listOptions: ListOptions = {
|
const listOptions: ListOptions = {
|
||||||
|
|
|
@ -5,7 +5,6 @@ import React, { useCallback } from 'react';
|
||||||
|
|
||||||
import Page from 'components/Page';
|
import Page from 'components/Page';
|
||||||
import globalize from 'scripts/globalize';
|
import globalize from 'scripts/globalize';
|
||||||
import theme from 'themes/theme';
|
|
||||||
import { DisplayPreferences } from './DisplayPreferences';
|
import { DisplayPreferences } from './DisplayPreferences';
|
||||||
import { ItemDetailPreferences } from './ItemDetailPreferences';
|
import { ItemDetailPreferences } from './ItemDetailPreferences';
|
||||||
import { LibraryPreferences } from './LibraryPreferences';
|
import { LibraryPreferences } from './LibraryPreferences';
|
||||||
|
@ -80,11 +79,7 @@ export default function UserDisplayPreferences() {
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
type='submit'
|
type='submit'
|
||||||
sx={{
|
size='large'
|
||||||
color: theme.palette.text.primary,
|
|
||||||
fontSize: theme.typography.htmlFontSize,
|
|
||||||
fontWeight: theme.typography.fontWeightBold
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
{globalize.translate('Save')}
|
{globalize.translate('Save')}
|
||||||
</Button>
|
</Button>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
position: fixed;
|
position: fixed;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
z-index: 10;
|
z-index: 1201 !important; // mui drawer uses z-index 1200
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
transition: transform 180ms linear;
|
transition: transform 180ms linear;
|
||||||
contain: layout style;
|
contain: layout style;
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
* @module components/cardBuilder/cardBuilder
|
* @module components/cardBuilder/cardBuilder
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { PersonKind } from '@jellyfin/sdk/lib/generated-client/models/person-kind';
|
||||||
import escapeHtml from 'escape-html';
|
import escapeHtml from 'escape-html';
|
||||||
|
|
||||||
import browser from 'scripts/browser';
|
import browser from 'scripts/browser';
|
||||||
|
@ -698,8 +699,26 @@ function getCardFooterText(item, apiClient, options, footerClass, progressHtml,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.showPersonRoleOrType && item.Role) {
|
if (options.showPersonRoleOrType && item.Type) {
|
||||||
|
if (item.Role) {
|
||||||
|
if ([ PersonKind.Actor, PersonKind.GuestStar ].includes(item.Type)) {
|
||||||
|
// List actor roles formatted like "as Character Name"
|
||||||
lines.push(globalize.translate('PersonRole', escapeHtml(item.Role)));
|
lines.push(globalize.translate('PersonRole', escapeHtml(item.Role)));
|
||||||
|
} else if (item.Role.toLowerCase() === item.Type.toLowerCase()) {
|
||||||
|
// Role and Type are the same so use the localized Type
|
||||||
|
lines.push(escapeHtml(globalize.translate(item.Type)));
|
||||||
|
} else if (item.Role.toLowerCase().includes(item.Type.toLowerCase())) {
|
||||||
|
// Avoid duplication if the Role includes the Type (i.e. Executive Producer)
|
||||||
|
lines.push(escapeHtml(item.Role));
|
||||||
|
} else {
|
||||||
|
// Type and Role are unique so list both (i.e. Writer | Novel)
|
||||||
|
lines.push(escapeHtml(globalize.translate(item.Type)));
|
||||||
|
lines.push(escapeHtml(item.Role));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// No Role so use the localized Type
|
||||||
|
lines.push(escapeHtml(globalize.translate(item.Type)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1285,8 +1304,7 @@ function updateUserData(card, userData) {
|
||||||
|
|
||||||
if (!playedIndicator) {
|
if (!playedIndicator) {
|
||||||
playedIndicator = document.createElement('div');
|
playedIndicator = document.createElement('div');
|
||||||
playedIndicator.classList.add('playedIndicator');
|
playedIndicator.classList.add('playedIndicator', 'indicator');
|
||||||
playedIndicator.classList.add('indicator');
|
|
||||||
indicatorsElem = ensureIndicators(card, indicatorsElem);
|
indicatorsElem = ensureIndicators(card, indicatorsElem);
|
||||||
indicatorsElem.appendChild(playedIndicator);
|
indicatorsElem.appendChild(playedIndicator);
|
||||||
}
|
}
|
||||||
|
@ -1302,7 +1320,7 @@ function updateUserData(card, userData) {
|
||||||
|
|
||||||
if (!countIndicator) {
|
if (!countIndicator) {
|
||||||
countIndicator = document.createElement('div');
|
countIndicator = document.createElement('div');
|
||||||
countIndicator.classList.add('countIndicator');
|
countIndicator.classList.add('countIndicator', 'indicator');
|
||||||
indicatorsElem = ensureIndicators(card, indicatorsElem);
|
indicatorsElem = ensureIndicators(card, indicatorsElem);
|
||||||
indicatorsElem.appendChild(countIndicator);
|
indicatorsElem.appendChild(countIndicator);
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,7 +165,7 @@ const UserPasswordForm: FunctionComponent<IProps> = ({ userId }: IProps) => {
|
||||||
<ButtonElement
|
<ButtonElement
|
||||||
type='submit'
|
type='submit'
|
||||||
className='raised button-submit block'
|
className='raised button-submit block'
|
||||||
title='Save'
|
title='SavePassword'
|
||||||
/>
|
/>
|
||||||
<ButtonElement
|
<ButtonElement
|
||||||
type='button'
|
type='button'
|
||||||
|
|
|
@ -137,15 +137,15 @@ export function loadRecentlyAdded(
|
||||||
options: SectionOptions
|
options: SectionOptions
|
||||||
) {
|
) {
|
||||||
elem.classList.remove('verticalSection');
|
elem.classList.remove('verticalSection');
|
||||||
const excludeViewTypes = ['playlists', 'livetv', 'boxsets', 'channels'];
|
const excludeViewTypes = ['playlists', 'livetv', 'boxsets', 'channels', 'folders'];
|
||||||
const userExcludeItems = user.Configuration?.LatestItemsExcludes ?? [];
|
const userExcludeItems = user.Configuration?.LatestItemsExcludes ?? [];
|
||||||
|
|
||||||
userViews.forEach(item => {
|
userViews.forEach(item => {
|
||||||
if (!item.Id || userExcludeItems.indexOf(item.Id) !== -1) {
|
if (!item.Id || userExcludeItems.includes(item.Id)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!item.CollectionType || excludeViewTypes.indexOf(item.CollectionType) !== -1) {
|
if (item.CollectionType && excludeViewTypes.includes(item.CollectionType)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,7 @@ export function getPlayedIndicatorHtml(item) {
|
||||||
if (enablePlayedIndicator(item)) {
|
if (enablePlayedIndicator(item)) {
|
||||||
const userData = item.UserData || {};
|
const userData = item.UserData || {};
|
||||||
if (userData.UnplayedItemCount) {
|
if (userData.UnplayedItemCount) {
|
||||||
return '<div class="countIndicator indicator">' + datetime.toLocaleString(userData.UnplayedItemCount) + '</div>';
|
return '<div class="countIndicator indicator">' + formatCountIndicator(userData.UnplayedItemCount) + '</div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (userData.PlayedPercentage && userData.PlayedPercentage >= 100 || (userData.Played)) {
|
if (userData.PlayedPercentage && userData.PlayedPercentage >= 100 || (userData.Played)) {
|
||||||
|
@ -93,12 +93,16 @@ export function getChildCountIndicatorHtml(item, options) {
|
||||||
const minCount = options?.minCount ? options.minCount : 0;
|
const minCount = options?.minCount ? options.minCount : 0;
|
||||||
|
|
||||||
if (item.ChildCount && item.ChildCount > minCount) {
|
if (item.ChildCount && item.ChildCount > minCount) {
|
||||||
return '<div class="countIndicator indicator">' + datetime.toLocaleString(item.ChildCount) + '</div>';
|
return '<div class="countIndicator indicator">' + formatCountIndicator(item.ChildCount) + '</div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function formatCountIndicator(count) {
|
||||||
|
return count >= 100 ? '99+' : count.toString();
|
||||||
|
}
|
||||||
|
|
||||||
export function getTimerIndicator(item) {
|
export function getTimerIndicator(item) {
|
||||||
let status;
|
let status;
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,10 @@ const enablePlayedIndicator = (item: ItemDto) => {
|
||||||
return itemHelper.canMarkPlayed(item);
|
return itemHelper.canMarkPlayed(item);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const formatCountIndicator = (count: number) => {
|
||||||
|
return count >= 100 ? '99+' : count.toString();
|
||||||
|
};
|
||||||
|
|
||||||
const useIndicator = (item: ItemDto) => {
|
const useIndicator = (item: ItemDto) => {
|
||||||
const getMediaSourceIndicator = () => {
|
const getMediaSourceIndicator = () => {
|
||||||
const mediaSourceCount = item.MediaSourceCount ?? 0;
|
const mediaSourceCount = item.MediaSourceCount ?? 0;
|
||||||
|
@ -135,7 +139,7 @@ const useIndicator = (item: ItemDto) => {
|
||||||
if (childCount > 1) {
|
if (childCount > 1) {
|
||||||
return (
|
return (
|
||||||
<Box className='countIndicator indicator childCountIndicator'>
|
<Box className='countIndicator indicator childCountIndicator'>
|
||||||
{datetime.toLocaleString(item.ChildCount)}
|
{formatCountIndicator(childCount)}
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -149,7 +153,7 @@ const useIndicator = (item: ItemDto) => {
|
||||||
if (userData.UnplayedItemCount) {
|
if (userData.UnplayedItemCount) {
|
||||||
return (
|
return (
|
||||||
<Box className='countIndicator indicator unplayedItemCount'>
|
<Box className='countIndicator indicator unplayedItemCount'>
|
||||||
{datetime.toLocaleString(userData.UnplayedItemCount)}
|
{formatCountIndicator(userData.UnplayedItemCount)}
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -280,11 +280,11 @@ export function getCommands(options) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.PlaylistItemId && options.playlistId) {
|
if (item.PlaylistItemId && options.playlistId && options.canEditPlaylist) {
|
||||||
commands.push({
|
commands.push({
|
||||||
name: globalize.translate('RemoveFromPlaylist'),
|
name: globalize.translate('RemoveFromPlaylist'),
|
||||||
id: 'removefromplaylist',
|
id: 'removefromplaylist',
|
||||||
icon: 'remove'
|
icon: 'playlist_remove'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -292,7 +292,7 @@ export function getCommands(options) {
|
||||||
commands.push({
|
commands.push({
|
||||||
name: globalize.translate('RemoveFromCollection'),
|
name: globalize.translate('RemoveFromCollection'),
|
||||||
id: 'removefromcollection',
|
id: 'removefromcollection',
|
||||||
icon: 'remove'
|
icon: 'playlist_remove'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -696,6 +696,6 @@ export function show(options) {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
getCommands: getCommands,
|
getCommands,
|
||||||
show: show
|
show
|
||||||
};
|
};
|
||||||
|
|
|
@ -432,6 +432,12 @@ export function setContentType(parent, contentType) {
|
||||||
parent.querySelector('.fldAllowEmbeddedSubtitlesContainer').classList.add('hide');
|
parent.querySelector('.fldAllowEmbeddedSubtitlesContainer').classList.add('hide');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (contentType === 'music') {
|
||||||
|
parent.querySelector('.lyricSettingsSection').classList.remove('hide');
|
||||||
|
} else {
|
||||||
|
parent.querySelector('.lyricSettingsSection').classList.add('hide');
|
||||||
|
}
|
||||||
|
|
||||||
parent.querySelector('.chkAutomaticallyAddToCollectionContainer').classList.toggle('hide', contentType !== 'movies' && contentType !== 'mixed');
|
parent.querySelector('.chkAutomaticallyAddToCollectionContainer').classList.toggle('hide', contentType !== 'movies' && contentType !== 'mixed');
|
||||||
|
|
||||||
return populateMetadataSettings(parent, contentType);
|
return populateMetadataSettings(parent, contentType);
|
||||||
|
@ -536,6 +542,7 @@ export function getLibraryOptions(parent) {
|
||||||
SkipSubtitlesIfEmbeddedSubtitlesPresent: parent.querySelector('#chkSkipIfGraphicalSubsPresent').checked,
|
SkipSubtitlesIfEmbeddedSubtitlesPresent: parent.querySelector('#chkSkipIfGraphicalSubsPresent').checked,
|
||||||
SkipSubtitlesIfAudioTrackMatches: parent.querySelector('#chkSkipIfAudioTrackPresent').checked,
|
SkipSubtitlesIfAudioTrackMatches: parent.querySelector('#chkSkipIfAudioTrackPresent').checked,
|
||||||
SaveSubtitlesWithMedia: parent.querySelector('#chkSaveSubtitlesLocally').checked,
|
SaveSubtitlesWithMedia: parent.querySelector('#chkSaveSubtitlesLocally').checked,
|
||||||
|
SaveLyricsWithMedia: parent.querySelector('#chkSaveLyricsLocally').checked,
|
||||||
RequirePerfectSubtitleMatch: parent.querySelector('#chkRequirePerfectMatch').checked,
|
RequirePerfectSubtitleMatch: parent.querySelector('#chkRequirePerfectMatch').checked,
|
||||||
AutomaticallyAddToCollection: parent.querySelector('#chkAutomaticallyAddToCollection').checked,
|
AutomaticallyAddToCollection: parent.querySelector('#chkAutomaticallyAddToCollection').checked,
|
||||||
MetadataSavers: Array.prototype.map.call(Array.prototype.filter.call(parent.querySelectorAll('.chkMetadataSaver'), elem => {
|
MetadataSavers: Array.prototype.map.call(Array.prototype.filter.call(parent.querySelectorAll('.chkMetadataSaver'), elem => {
|
||||||
|
@ -596,6 +603,7 @@ export function setLibraryOptions(parent, options) {
|
||||||
parent.querySelector('#selectAllowEmbeddedSubtitles').value = options.AllowEmbeddedSubtitles;
|
parent.querySelector('#selectAllowEmbeddedSubtitles').value = options.AllowEmbeddedSubtitles;
|
||||||
parent.querySelector('#chkSkipIfGraphicalSubsPresent').checked = options.SkipSubtitlesIfEmbeddedSubtitlesPresent;
|
parent.querySelector('#chkSkipIfGraphicalSubsPresent').checked = options.SkipSubtitlesIfEmbeddedSubtitlesPresent;
|
||||||
parent.querySelector('#chkSaveSubtitlesLocally').checked = options.SaveSubtitlesWithMedia;
|
parent.querySelector('#chkSaveSubtitlesLocally').checked = options.SaveSubtitlesWithMedia;
|
||||||
|
parent.querySelector('#chkSaveLyricsLocally').checked = options.SaveLyricsWithMedia;
|
||||||
parent.querySelector('#chkSkipIfAudioTrackPresent').checked = options.SkipSubtitlesIfAudioTrackMatches;
|
parent.querySelector('#chkSkipIfAudioTrackPresent').checked = options.SkipSubtitlesIfAudioTrackMatches;
|
||||||
parent.querySelector('#chkRequirePerfectMatch').checked = options.RequirePerfectSubtitleMatch;
|
parent.querySelector('#chkRequirePerfectMatch').checked = options.RequirePerfectSubtitleMatch;
|
||||||
parent.querySelector('#chkAutomaticallyAddToCollection').checked = options.AutomaticallyAddToCollection;
|
parent.querySelector('#chkAutomaticallyAddToCollection').checked = options.AutomaticallyAddToCollection;
|
||||||
|
|
|
@ -193,3 +193,15 @@
|
||||||
<div class="fieldDescription checkboxFieldDescription">${SaveSubtitlesIntoMediaFoldersHelp}</div>
|
<div class="fieldDescription checkboxFieldDescription">${SaveSubtitlesIntoMediaFoldersHelp}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="lyricSettingsSection hide">
|
||||||
|
<h2>${Lyrics}</h2>
|
||||||
|
|
||||||
|
<div class="checkboxContainer checkboxContainer-withDescription advanced">
|
||||||
|
<label>
|
||||||
|
<input type="checkbox" is="emby-checkbox" id="chkSaveLyricsLocally" />
|
||||||
|
<span>${SaveLyricsIntoMediaFolders}</span>
|
||||||
|
</label>
|
||||||
|
<div class="fieldDescription checkboxFieldDescription">${SaveLyricsIntoMediaFoldersHelp}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
|
@ -591,8 +591,7 @@ function setFieldVisibilities(context, item) {
|
||||||
|| item.Type === 'Genre'
|
|| item.Type === 'Genre'
|
||||||
|| item.Type === 'Studio'
|
|| item.Type === 'Studio'
|
||||||
|| item.Type === 'MusicGenre'
|
|| item.Type === 'MusicGenre'
|
||||||
|| item.Type === 'TvChannel'
|
|| item.Type === 'TvChannel') {
|
||||||
|| item.Type === 'Book') {
|
|
||||||
hideElement('#peopleCollapsible', context);
|
hideElement('#peopleCollapsible', context);
|
||||||
} else {
|
} else {
|
||||||
showElement('#peopleCollapsible', context);
|
showElement('#peopleCollapsible', context);
|
||||||
|
|
|
@ -26,6 +26,18 @@
|
||||||
<option value="Engineer">${Engineer}</option>
|
<option value="Engineer">${Engineer}</option>
|
||||||
<option value="Mixer">${Mixer}</option>
|
<option value="Mixer">${Mixer}</option>
|
||||||
<option value="Remixer">${Remixer}</option>
|
<option value="Remixer">${Remixer}</option>
|
||||||
|
<option value="AlbumArtist">${AlbumArtist}</option>
|
||||||
|
<option value="Artist">${Artist}</option>
|
||||||
|
<option value="Creator">${Creator}</option>
|
||||||
|
<option value="Author">${Author}</option>
|
||||||
|
<option value="Illustrator">${Illustrator}</option>
|
||||||
|
<option value="Penciller">${Penciller}</option>
|
||||||
|
<option value="Inker">${Inker}</option>
|
||||||
|
<option value="Colorist">${Colorist}</option>
|
||||||
|
<option value="Letterer">${Letterer}</option>
|
||||||
|
<option value="CoverArtist">${CoverArtist}</option>
|
||||||
|
<option value="Editor">${Editor}</option>
|
||||||
|
<option value="Translator">${Translator}</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -43,8 +43,7 @@ let currentRuntimeTicks = 0;
|
||||||
|
|
||||||
let isVisibilityAllowed = true;
|
let isVisibilityAllowed = true;
|
||||||
|
|
||||||
let lyricPageActive = false;
|
let isLyricPageActive = false;
|
||||||
let isAudio = false;
|
|
||||||
|
|
||||||
function getNowPlayingBarHtml() {
|
function getNowPlayingBarHtml() {
|
||||||
let html = '';
|
let html = '';
|
||||||
|
@ -86,7 +85,7 @@ function getNowPlayingBarHtml() {
|
||||||
|
|
||||||
html += `<button is="paper-icon-button-light" class="btnAirPlay mediaButton" title="${globalize.translate('AirPlay')}"><span class="material-icons airplay" aria-hidden="true"></span></button>`;
|
html += `<button is="paper-icon-button-light" class="btnAirPlay mediaButton" title="${globalize.translate('AirPlay')}"><span class="material-icons airplay" aria-hidden="true"></span></button>`;
|
||||||
|
|
||||||
html += `<button is="paper-icon-button-light" class="openLyricsButton mediaButton" title="${globalize.translate('Lyrics')}"><span class="material-icons lyrics" style="top:0.1em" aria-hidden="true"></span></button>`;
|
html += `<button is="paper-icon-button-light" class="openLyricsButton mediaButton hide" title="${globalize.translate('Lyrics')}"><span class="material-icons lyrics" style="top:0.1em" aria-hidden="true"></span></button>`;
|
||||||
|
|
||||||
html += `<button is="paper-icon-button-light" class="toggleRepeatButton mediaButton" title="${globalize.translate('Repeat')}"><span class="material-icons repeat" aria-hidden="true"></span></button>`;
|
html += `<button is="paper-icon-button-light" class="toggleRepeatButton mediaButton" title="${globalize.translate('Repeat')}"><span class="material-icons repeat" aria-hidden="true"></span></button>`;
|
||||||
html += `<button is="paper-icon-button-light" class="btnShuffleQueue mediaButton" title="${globalize.translate('Shuffle')}"><span class="material-icons shuffle" aria-hidden="true"></span></button>`;
|
html += `<button is="paper-icon-button-light" class="btnShuffleQueue mediaButton" title="${globalize.translate('Shuffle')}"><span class="material-icons shuffle" aria-hidden="true"></span></button>`;
|
||||||
|
@ -220,7 +219,7 @@ function bindEvents(elem) {
|
||||||
});
|
});
|
||||||
|
|
||||||
lyricButton.addEventListener('click', function() {
|
lyricButton.addEventListener('click', function() {
|
||||||
if (lyricPageActive) {
|
if (isLyricPageActive) {
|
||||||
appRouter.back();
|
appRouter.back();
|
||||||
} else {
|
} else {
|
||||||
appRouter.show('lyrics');
|
appRouter.show('lyrics');
|
||||||
|
@ -303,8 +302,8 @@ function getNowPlayingBar() {
|
||||||
nowPlayingBarElement = parentContainer.querySelector('.nowPlayingBar');
|
nowPlayingBarElement = parentContainer.querySelector('.nowPlayingBar');
|
||||||
|
|
||||||
if (layoutManager.mobile) {
|
if (layoutManager.mobile) {
|
||||||
hideButton(nowPlayingBarElement.querySelector('.btnShuffleQueue'));
|
nowPlayingBarElement.querySelector('.btnShuffleQueue').classList.add('hide');
|
||||||
hideButton(nowPlayingBarElement.querySelector('.nowPlayingBarCenter'));
|
nowPlayingBarElement.querySelector('.nowPlayingBarCenter').classList.add('hide');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (browser.safari && browser.slow) {
|
if (browser.safari && browser.slow) {
|
||||||
|
@ -319,14 +318,6 @@ function getNowPlayingBar() {
|
||||||
return nowPlayingBarElement;
|
return nowPlayingBarElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
function showButton(button) {
|
|
||||||
button.classList.remove('hide');
|
|
||||||
}
|
|
||||||
|
|
||||||
function hideButton(button) {
|
|
||||||
button.classList.add('hide');
|
|
||||||
}
|
|
||||||
|
|
||||||
function updatePlayPauseState(isPaused) {
|
function updatePlayPauseState(isPaused) {
|
||||||
if (playPauseButtons) {
|
if (playPauseButtons) {
|
||||||
playPauseButtons.forEach((button) => {
|
playPauseButtons.forEach((button) => {
|
||||||
|
@ -378,7 +369,7 @@ function updatePlayerStateInternal(event, state, player) {
|
||||||
updateTimeDisplay(playState.PositionTicks, nowPlayingItem.RunTimeTicks, playbackManager.getBufferedRanges(player));
|
updateTimeDisplay(playState.PositionTicks, nowPlayingItem.RunTimeTicks, playbackManager.getBufferedRanges(player));
|
||||||
|
|
||||||
updateNowPlayingInfo(state);
|
updateNowPlayingInfo(state);
|
||||||
updateLyricButton();
|
updateLyricButton(nowPlayingItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateRepeatModeDisplay(repeatMode) {
|
function updateRepeatModeDisplay(repeatMode) {
|
||||||
|
@ -453,11 +444,7 @@ function updatePlayerVolumeState(isMuted, volumeLevel) {
|
||||||
showVolumeSlider = false;
|
showVolumeSlider = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (showMuteButton) {
|
muteButton.classList.toggle('hide', !showMuteButton);
|
||||||
showButton(muteButton);
|
|
||||||
} else {
|
|
||||||
hideButton(muteButton);
|
|
||||||
}
|
|
||||||
|
|
||||||
// See bindEvents for why this is necessary
|
// See bindEvents for why this is necessary
|
||||||
if (volumeSlider) {
|
if (volumeSlider) {
|
||||||
|
@ -469,20 +456,18 @@ function updatePlayerVolumeState(isMuted, volumeLevel) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateLyricButton() {
|
function updateLyricButton(item) {
|
||||||
if (!isEnabled) {
|
if (!isEnabled) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
isAudio ? showButton(lyricButton) : hideButton(lyricButton);
|
const hasLyrics = !!item && item.Type === 'Audio' && item.HasLyrics;
|
||||||
|
lyricButton.classList.toggle('hide', !hasLyrics);
|
||||||
setLyricButtonActiveStatus();
|
setLyricButtonActiveStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
function setLyricButtonActiveStatus() {
|
function setLyricButtonActiveStatus() {
|
||||||
if (!isEnabled) {
|
if (!isEnabled) return;
|
||||||
return;
|
|
||||||
}
|
lyricButton.classList.toggle('buttonActive', isLyricPageActive);
|
||||||
lyricButton.classList.toggle('buttonActive', lyricPageActive);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function seriesImageUrl(item, options) {
|
function seriesImageUrl(item, options) {
|
||||||
|
@ -628,8 +613,6 @@ function onPlaybackStart(e, state) {
|
||||||
console.debug('nowplaying event: ' + e.type);
|
console.debug('nowplaying event: ' + e.type);
|
||||||
const player = this;
|
const player = this;
|
||||||
|
|
||||||
isAudio = state.NowPlayingItem.Type === 'Audio';
|
|
||||||
|
|
||||||
onStateChanged.call(player, e, state);
|
onStateChanged.call(player, e, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -733,7 +716,7 @@ function onStateChanged(event, state) {
|
||||||
}
|
}
|
||||||
|
|
||||||
getNowPlayingBar();
|
getNowPlayingBar();
|
||||||
updateLyricButton();
|
updateLyricButton(state.NowPlayingItem);
|
||||||
updatePlayerStateInternal(event, state, player);
|
updatePlayerStateInternal(event, state, player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -790,7 +773,7 @@ function refreshFromPlayer(player, type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function bindToPlayer(player) {
|
function bindToPlayer(player) {
|
||||||
lyricPageActive = appRouter.currentRouteInfo.path.toLowerCase() === '/lyrics';
|
isLyricPageActive = appRouter.currentRouteInfo.path.toLowerCase() === '/lyrics';
|
||||||
if (player === currentPlayer) {
|
if (player === currentPlayer) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -823,7 +806,7 @@ Events.on(playbackManager, 'playerchange', function () {
|
||||||
bindToPlayer(playbackManager.getCurrentPlayer());
|
bindToPlayer(playbackManager.getCurrentPlayer());
|
||||||
|
|
||||||
document.addEventListener('viewbeforeshow', function (e) {
|
document.addEventListener('viewbeforeshow', function (e) {
|
||||||
lyricPageActive = appRouter.currentRouteInfo.path.toLowerCase() === '/lyrics';
|
isLyricPageActive = appRouter.currentRouteInfo.path.toLowerCase() === '/lyrics';
|
||||||
setLyricButtonActiveStatus();
|
setLyricButtonActiveStatus();
|
||||||
if (!e.detail.options.enableMediaControl) {
|
if (!e.detail.options.enableMediaControl) {
|
||||||
if (isVisibilityAllowed) {
|
if (isVisibilityAllowed) {
|
||||||
|
|
|
@ -1,38 +1,40 @@
|
||||||
import type { BaseItemDto } from '@jellyfin/sdk/lib/generated-client';
|
import ServerConnections from 'components/ServerConnections';
|
||||||
|
import { getItemQuery } from 'hooks/useItem';
|
||||||
|
import { toApi } from 'utils/jellyfin-apiclient/compat';
|
||||||
|
import { queryClient } from 'utils/query/queryClient';
|
||||||
|
|
||||||
import { playbackManager } from './playbackmanager';
|
import { playbackManager } from './playbackmanager';
|
||||||
|
|
||||||
interface PlaybackInfo {
|
async function mirrorIfEnabled(serverId: string, itemId: string) {
|
||||||
item: BaseItemDto;
|
if (playbackManager.enableDisplayMirroring()) {
|
||||||
context?: string;
|
const playerInfo = playbackManager.getPlayerInfo();
|
||||||
}
|
|
||||||
|
|
||||||
function mirrorItem(info: PlaybackInfo, player?: unknown) {
|
if (playerInfo && !playerInfo.isLocalPlayer && playerInfo.supportedCommands.indexOf('DisplayContent') !== -1) {
|
||||||
const { item } = info;
|
const apiClient = ServerConnections.getApiClient(serverId);
|
||||||
|
const api = toApi(apiClient);
|
||||||
|
const userId = apiClient.getCurrentUserId();
|
||||||
|
|
||||||
|
try {
|
||||||
|
const item = await queryClient.fetchQuery(getItemQuery(
|
||||||
|
api,
|
||||||
|
userId,
|
||||||
|
itemId));
|
||||||
|
|
||||||
playbackManager.displayContent({
|
playbackManager.displayContent({
|
||||||
ItemName: item.Name,
|
ItemName: item.Name,
|
||||||
ItemId: item.Id,
|
ItemId: item.Id,
|
||||||
ItemType: item.Type,
|
ItemType: item.Type
|
||||||
Context: info.context
|
}, playbackManager.getCurrentPlayer());
|
||||||
}, player);
|
} catch (err) {
|
||||||
}
|
console.error('[DisplayMirrorManager] failed to mirror item', err);
|
||||||
|
}
|
||||||
function mirrorIfEnabled(info: PlaybackInfo) {
|
|
||||||
if (info && playbackManager.enableDisplayMirroring()) {
|
|
||||||
const playerInfo = playbackManager.getPlayerInfo();
|
|
||||||
|
|
||||||
if (playerInfo && !playerInfo.isLocalPlayer && playerInfo.supportedCommands.indexOf('DisplayContent') !== -1) {
|
|
||||||
mirrorItem(info, playbackManager.getCurrentPlayer());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
document.addEventListener('viewshow', e => {
|
document.addEventListener('viewshow', e => {
|
||||||
const state = e.detail.state || {};
|
const { serverId, id } = e.detail?.params || {};
|
||||||
const { item } = state;
|
if (serverId && id) {
|
||||||
|
void mirrorIfEnabled(serverId, id);
|
||||||
if (item?.ServerId) {
|
|
||||||
mirrorIfEnabled({ item });
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -18,6 +18,7 @@ import { PluginType } from '../../types/plugin.ts';
|
||||||
import { includesAny } from '../../utils/container.ts';
|
import { includesAny } from '../../utils/container.ts';
|
||||||
import { getItems } from '../../utils/jellyfin-apiclient/getItems.ts';
|
import { getItems } from '../../utils/jellyfin-apiclient/getItems.ts';
|
||||||
import { getItemBackdropImageUrl } from '../../utils/jellyfin-apiclient/backdropImage';
|
import { getItemBackdropImageUrl } from '../../utils/jellyfin-apiclient/backdropImage';
|
||||||
|
import { MediaType } from '@jellyfin/sdk/lib/generated-client/models/media-type';
|
||||||
|
|
||||||
import { MediaError } from 'types/mediaError';
|
import { MediaError } from 'types/mediaError';
|
||||||
import { getMediaError } from 'utils/mediaError';
|
import { getMediaError } from 'utils/mediaError';
|
||||||
|
@ -1789,42 +1790,85 @@ class PlaybackManager {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function translateItemsForPlayback(items, options) {
|
async function translateItemsForPlayback(items, options) {
|
||||||
if (!items.length) return Promise.resolve([]);
|
if (!items.length) return [];
|
||||||
|
|
||||||
if (items.length > 1 && options && options.ids) {
|
sortItemsIfNeeded(items, options);
|
||||||
|
|
||||||
|
const firstItem = items[0];
|
||||||
|
const serverId = firstItem.ServerId;
|
||||||
|
const queryOptions = options.queryOptions || {};
|
||||||
|
|
||||||
|
const promise = getPlaybackPromise(firstItem, serverId, options, queryOptions, items);
|
||||||
|
|
||||||
|
if (promise) {
|
||||||
|
const result = await promise;
|
||||||
|
return result ? result.Items : items;
|
||||||
|
} else {
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function sortItemsIfNeeded(items, options) {
|
||||||
|
if (items.length > 1 && options?.ids) {
|
||||||
// Use the original request id array for sorting the result in the proper order
|
// Use the original request id array for sorting the result in the proper order
|
||||||
items.sort(function (a, b) {
|
items.sort(function (a, b) {
|
||||||
return options.ids.indexOf(a.Id) - options.ids.indexOf(b.Id);
|
return options.ids.indexOf(a.Id) - options.ids.indexOf(b.Id);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const firstItem = items[0];
|
function getPlaybackPromise(firstItem, serverId, options, queryOptions, items) {
|
||||||
let promise;
|
switch (firstItem.Type) {
|
||||||
|
case 'Program':
|
||||||
const serverId = firstItem.ServerId;
|
return getItemsForPlayback(serverId, {
|
||||||
|
|
||||||
const queryOptions = options.queryOptions || {};
|
|
||||||
|
|
||||||
if (firstItem.Type === 'Program') {
|
|
||||||
promise = getItemsForPlayback(serverId, {
|
|
||||||
Ids: firstItem.ChannelId
|
Ids: firstItem.ChannelId
|
||||||
});
|
});
|
||||||
} else if (firstItem.Type === 'Playlist') {
|
case 'Playlist':
|
||||||
promise = getItemsForPlayback(serverId, {
|
return getItemsForPlayback(serverId, {
|
||||||
ParentId: firstItem.Id,
|
ParentId: firstItem.Id,
|
||||||
SortBy: options.shuffle ? 'Random' : null
|
SortBy: options.shuffle ? 'Random' : null
|
||||||
});
|
});
|
||||||
} else if (firstItem.Type === 'MusicArtist') {
|
case 'MusicArtist':
|
||||||
promise = getItemsForPlayback(serverId, mergePlaybackQueries({
|
return getItemsForPlayback(serverId, mergePlaybackQueries({
|
||||||
ArtistIds: firstItem.Id,
|
ArtistIds: firstItem.Id,
|
||||||
Filters: 'IsNotFolder',
|
Filters: 'IsNotFolder',
|
||||||
Recursive: true,
|
Recursive: true,
|
||||||
SortBy: options.shuffle ? 'Random' : 'SortName',
|
SortBy: options.shuffle ? 'Random' : 'SortName',
|
||||||
MediaTypes: 'Audio'
|
MediaTypes: 'Audio'
|
||||||
}, queryOptions));
|
}, queryOptions));
|
||||||
} else if (firstItem.MediaType === 'Photo') {
|
case 'PhotoAlbum':
|
||||||
promise = getItemsForPlayback(serverId, mergePlaybackQueries({
|
return getItemsForPlayback(serverId, mergePlaybackQueries({
|
||||||
|
ParentId: firstItem.Id,
|
||||||
|
Filters: 'IsNotFolder',
|
||||||
|
// Setting this to true may cause some incorrect sorting
|
||||||
|
Recursive: false,
|
||||||
|
SortBy: options.shuffle ? 'Random' : 'SortName',
|
||||||
|
// Only include Photos because we do not handle mixed queues currently
|
||||||
|
MediaTypes: 'Photo',
|
||||||
|
Limit: UNLIMITED_ITEMS
|
||||||
|
}, queryOptions));
|
||||||
|
case 'MusicGenre':
|
||||||
|
return getItemsForPlayback(serverId, mergePlaybackQueries({
|
||||||
|
GenreIds: firstItem.Id,
|
||||||
|
Filters: 'IsNotFolder',
|
||||||
|
Recursive: true,
|
||||||
|
SortBy: options.shuffle ? 'Random' : 'SortName',
|
||||||
|
MediaTypes: 'Audio'
|
||||||
|
}, queryOptions));
|
||||||
|
case 'Series':
|
||||||
|
case 'Season':
|
||||||
|
return getSeriesOrSeasonPlaybackPromise(firstItem, options, items);
|
||||||
|
case 'Episode':
|
||||||
|
return getEpisodePlaybackPromise(firstItem, options, items);
|
||||||
|
}
|
||||||
|
|
||||||
|
return getNonItemTypePromise(firstItem, serverId, options, queryOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getNonItemTypePromise(firstItem, serverId, options, queryOptions) {
|
||||||
|
if (firstItem.MediaType === 'Photo') {
|
||||||
|
return getItemsForPlayback(serverId, mergePlaybackQueries({
|
||||||
ParentId: firstItem.ParentId,
|
ParentId: firstItem.ParentId,
|
||||||
Filters: 'IsNotFolder',
|
Filters: 'IsNotFolder',
|
||||||
// Setting this to true may cause some incorrect sorting
|
// Setting this to true may cause some incorrect sorting
|
||||||
|
@ -1847,66 +1891,8 @@ class PlaybackManager {
|
||||||
|
|
||||||
return Promise.resolve(result);
|
return Promise.resolve(result);
|
||||||
});
|
});
|
||||||
} else if (firstItem.Type === 'PhotoAlbum') {
|
|
||||||
promise = getItemsForPlayback(serverId, mergePlaybackQueries({
|
|
||||||
ParentId: firstItem.Id,
|
|
||||||
Filters: 'IsNotFolder',
|
|
||||||
// Setting this to true may cause some incorrect sorting
|
|
||||||
Recursive: false,
|
|
||||||
SortBy: options.shuffle ? 'Random' : 'SortName',
|
|
||||||
// Only include Photos because we do not handle mixed queues currently
|
|
||||||
MediaTypes: 'Photo',
|
|
||||||
Limit: UNLIMITED_ITEMS
|
|
||||||
}, queryOptions));
|
|
||||||
} else if (firstItem.Type === 'MusicGenre') {
|
|
||||||
promise = getItemsForPlayback(serverId, mergePlaybackQueries({
|
|
||||||
GenreIds: firstItem.Id,
|
|
||||||
Filters: 'IsNotFolder',
|
|
||||||
Recursive: true,
|
|
||||||
SortBy: options.shuffle ? 'Random' : 'SortName',
|
|
||||||
MediaTypes: 'Audio'
|
|
||||||
}, queryOptions));
|
|
||||||
} else if (firstItem.Type === 'Series' || firstItem.Type === 'Season') {
|
|
||||||
const apiClient = ServerConnections.getApiClient(firstItem.ServerId);
|
|
||||||
const isSeason = firstItem.Type === 'Season';
|
|
||||||
|
|
||||||
promise = apiClient.getEpisodes(firstItem.SeriesId || firstItem.Id, {
|
|
||||||
IsVirtualUnaired: false,
|
|
||||||
IsMissing: false,
|
|
||||||
SeasonId: isSeason ? firstItem.Id : undefined,
|
|
||||||
SortBy: options.shuffle ? 'Random' : undefined,
|
|
||||||
UserId: apiClient.getCurrentUserId(),
|
|
||||||
Fields: ['Chapters', 'Trickplay']
|
|
||||||
}).then(function (episodesResult) {
|
|
||||||
const originalResults = episodesResult.Items;
|
|
||||||
|
|
||||||
let foundItem = false;
|
|
||||||
|
|
||||||
if (!options.shuffle) {
|
|
||||||
episodesResult.Items = episodesResult.Items.filter(function (e) {
|
|
||||||
if (foundItem) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!e.UserData.Played) {
|
|
||||||
foundItem = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (episodesResult.Items.length === 0) {
|
|
||||||
episodesResult.Items = originalResults;
|
|
||||||
}
|
|
||||||
|
|
||||||
episodesResult.TotalRecordCount = episodesResult.Items.length;
|
|
||||||
|
|
||||||
return episodesResult;
|
|
||||||
});
|
|
||||||
} else if (firstItem.IsFolder && firstItem.CollectionType === 'homevideos') {
|
} else if (firstItem.IsFolder && firstItem.CollectionType === 'homevideos') {
|
||||||
promise = getItemsForPlayback(serverId, mergePlaybackQueries({
|
return getItemsForPlayback(serverId, mergePlaybackQueries({
|
||||||
ParentId: firstItem.Id,
|
ParentId: firstItem.Id,
|
||||||
Filters: 'IsNotFolder',
|
Filters: 'IsNotFolder',
|
||||||
Recursive: true,
|
Recursive: true,
|
||||||
|
@ -1922,7 +1908,8 @@ class PlaybackManager {
|
||||||
} else if (firstItem.Type !== 'BoxSet') {
|
} else if (firstItem.Type !== 'BoxSet') {
|
||||||
sortBy = 'SortName';
|
sortBy = 'SortName';
|
||||||
}
|
}
|
||||||
promise = getItemsForPlayback(serverId, mergePlaybackQueries({
|
|
||||||
|
return getItemsForPlayback(serverId, mergePlaybackQueries({
|
||||||
ParentId: firstItem.Id,
|
ParentId: firstItem.Id,
|
||||||
Filters: 'IsNotFolder',
|
Filters: 'IsNotFolder',
|
||||||
Recursive: true,
|
Recursive: true,
|
||||||
|
@ -1930,12 +1917,77 @@ class PlaybackManager {
|
||||||
SortBy: sortBy,
|
SortBy: sortBy,
|
||||||
MediaTypes: 'Audio,Video'
|
MediaTypes: 'Audio,Video'
|
||||||
}, queryOptions));
|
}, queryOptions));
|
||||||
} else if (firstItem.Type === 'Episode' && items.length === 1 && getPlayer(firstItem, options).supportsProgress !== false) {
|
}
|
||||||
promise = new Promise(function (resolve, reject) {
|
|
||||||
|
if (promise) {
|
||||||
|
return promise.then(function (result) {
|
||||||
|
if (firstItem.Type === 'AudioBook') {
|
||||||
|
options.startIndex = result.StartIndex;
|
||||||
|
}
|
||||||
|
return result ? result.Items : items;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getSeriesOrSeasonPlaybackPromise(firstItem, options, items) {
|
||||||
|
const apiClient = ServerConnections.getApiClient(firstItem.ServerId);
|
||||||
|
const startSeasonId = firstItem.Type === 'Season' ? items[options.startIndex || 0].Id : undefined;
|
||||||
|
|
||||||
|
const episodesResult = await apiClient.getEpisodes(firstItem.SeriesId || firstItem.Id, {
|
||||||
|
IsVirtualUnaired: false,
|
||||||
|
IsMissing: false,
|
||||||
|
SeasonId: (startSeasonId && items.length === 1) ? startSeasonId : undefined,
|
||||||
|
SortBy: options.shuffle ? 'Random' : undefined,
|
||||||
|
UserId: apiClient.getCurrentUserId(),
|
||||||
|
Fields: ['Chapters', 'Trickplay']
|
||||||
|
});
|
||||||
|
|
||||||
|
if (options.shuffle) {
|
||||||
|
episodesResult.StartIndex = 0;
|
||||||
|
} else {
|
||||||
|
episodesResult.StartIndex = undefined;
|
||||||
|
let seasonStartIndex;
|
||||||
|
for (const [index, e] of episodesResult.Items.entries()) {
|
||||||
|
if (startSeasonId) {
|
||||||
|
if (e.SeasonId == startSeasonId) {
|
||||||
|
if (seasonStartIndex === undefined) {
|
||||||
|
seasonStartIndex = index;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!e.UserData.Played) {
|
||||||
|
episodesResult.StartIndex = index;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
episodesResult.StartIndex = episodesResult.StartIndex || seasonStartIndex || 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: fix calling code to read episodesResult.StartIndex instead when set.
|
||||||
|
options.startIndex = episodesResult.StartIndex;
|
||||||
|
|
||||||
|
episodesResult.TotalRecordCount = episodesResult.Items.length;
|
||||||
|
|
||||||
|
return episodesResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getEpisodePlaybackPromise(firstItem, options, items) {
|
||||||
|
if (items.length === 1 && getPlayer(firstItem, options).supportsProgress !== false) {
|
||||||
|
return getEpisodes(firstItem, options);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getEpisodes(firstItem, options) {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
const apiClient = ServerConnections.getApiClient(firstItem.ServerId);
|
const apiClient = ServerConnections.getApiClient(firstItem.ServerId);
|
||||||
|
|
||||||
apiClient.getCurrentUser().then(function (user) {
|
if (!firstItem.SeriesId) {
|
||||||
if (!user.Configuration.EnableNextEpisodeAutoPlay || !firstItem.SeriesId) {
|
|
||||||
resolve(null);
|
resolve(null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1946,35 +1998,23 @@ class PlaybackManager {
|
||||||
UserId: apiClient.getCurrentUserId(),
|
UserId: apiClient.getCurrentUserId(),
|
||||||
Fields: ['Chapters', 'Trickplay']
|
Fields: ['Chapters', 'Trickplay']
|
||||||
}).then(function (episodesResult) {
|
}).then(function (episodesResult) {
|
||||||
let foundItem = false;
|
resolve(filterEpisodes(episodesResult, firstItem, options));
|
||||||
episodesResult.Items = episodesResult.Items.filter(function (e) {
|
|
||||||
if (foundItem) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (e.Id === firstItem.Id) {
|
|
||||||
foundItem = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
episodesResult.TotalRecordCount = episodesResult.Items.length;
|
|
||||||
resolve(episodesResult);
|
|
||||||
}, reject);
|
}, reject);
|
||||||
});
|
});
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (promise) {
|
function filterEpisodes(episodesResult, firstItem, options) {
|
||||||
return promise.then(function (result) {
|
for (const [index, e] of episodesResult.Items.entries()) {
|
||||||
if (firstItem.Type === 'AudioBook') {
|
if (e.Id === firstItem.Id) {
|
||||||
options.startIndex = result.StartIndex;
|
episodesResult.StartIndex = index;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return result ? result.Items : items;
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
return Promise.resolve(items);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: fix calling code to read episodesResult.StartIndex instead when set.
|
||||||
|
options.startIndex = episodesResult.StartIndex;
|
||||||
|
episodesResult.TotalRecordCount = episodesResult.Items.length;
|
||||||
|
return episodesResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.translateItemsForPlayback = translateItemsForPlayback;
|
self.translateItemsForPlayback = translateItemsForPlayback;
|
||||||
|
@ -2252,35 +2292,42 @@ class PlaybackManager {
|
||||||
playOptions.isFirstItem = true;
|
playOptions.isFirstItem = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return runInterceptors(item, playOptions).then(function () {
|
const apiClient = ServerConnections.getApiClient(item.ServerId);
|
||||||
if (playOptions.fullscreen) {
|
|
||||||
loading.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: This should be the media type requested, not the original media type
|
// TODO: This should be the media type requested, not the original media type
|
||||||
const mediaType = item.MediaType;
|
const mediaType = item.MediaType;
|
||||||
|
|
||||||
const onBitrateDetectionFailure = function () {
|
return runInterceptors(item, playOptions)
|
||||||
return playAfterBitrateDetect(getSavedMaxStreamingBitrate(ServerConnections.getApiClient(item.ServerId), mediaType), item, playOptions, onPlaybackStartedFn, prevSource);
|
.then(() => {
|
||||||
};
|
if (playOptions.fullscreen) {
|
||||||
|
loading.show();
|
||||||
|
}
|
||||||
|
|
||||||
if (!isServerItem(item) || itemHelper.isLocalItem(item)) {
|
if (!isServerItem(item) || itemHelper.isLocalItem(item)) {
|
||||||
return onBitrateDetectionFailure();
|
return Promise.reject('skip bitrate detection');
|
||||||
}
|
}
|
||||||
|
|
||||||
const apiClient = ServerConnections.getApiClient(item.ServerId);
|
return apiClient.getEndpointInfo().then((endpointInfo) => {
|
||||||
apiClient.getEndpointInfo().then(function (endpointInfo) {
|
|
||||||
if ((mediaType === 'Video' || mediaType === 'Audio') && appSettings.enableAutomaticBitrateDetection(endpointInfo.IsInNetwork, mediaType)) {
|
if ((mediaType === 'Video' || mediaType === 'Audio') && appSettings.enableAutomaticBitrateDetection(endpointInfo.IsInNetwork, mediaType)) {
|
||||||
return apiClient.detectBitrate().then(function (bitrate) {
|
return apiClient.detectBitrate().then((bitrate) => {
|
||||||
appSettings.maxStreamingBitrate(endpointInfo.IsInNetwork, mediaType, bitrate);
|
appSettings.maxStreamingBitrate(endpointInfo.IsInNetwork, mediaType, bitrate);
|
||||||
|
return bitrate;
|
||||||
return playAfterBitrateDetect(bitrate, item, playOptions, onPlaybackStartedFn, prevSource);
|
});
|
||||||
}, onBitrateDetectionFailure);
|
|
||||||
} else {
|
|
||||||
onBitrateDetectionFailure();
|
|
||||||
}
|
}
|
||||||
}, onBitrateDetectionFailure);
|
|
||||||
}, onInterceptorRejection);
|
return Promise.reject('skip bitrate detection');
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(() => getSavedMaxStreamingBitrate(apiClient, mediaType))
|
||||||
|
.then((bitrate) => {
|
||||||
|
return playAfterBitrateDetect(bitrate, item, playOptions, onPlaybackStartedFn, prevSource);
|
||||||
|
})
|
||||||
|
.catch(onInterceptorRejection)
|
||||||
|
.finally(() => {
|
||||||
|
if (playOptions.fullscreen) {
|
||||||
|
loading.hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function cancelPlayback() {
|
function cancelPlayback() {
|
||||||
|
@ -2294,8 +2341,21 @@ class PlaybackManager {
|
||||||
Events.trigger(self, 'playbackcancelled');
|
Events.trigger(self, 'playbackcancelled');
|
||||||
}
|
}
|
||||||
|
|
||||||
function onInterceptorRejection() {
|
function onInterceptorRejection(e) {
|
||||||
cancelPlayback();
|
cancelPlayback();
|
||||||
|
|
||||||
|
let displayErrorCode = 'ErrorDefault';
|
||||||
|
|
||||||
|
if (e instanceof Response) {
|
||||||
|
if (e.status >= 500) {
|
||||||
|
displayErrorCode = `PlaybackError.${MediaError.SERVER_ERROR}`;
|
||||||
|
} else if (e.status >= 400) {
|
||||||
|
displayErrorCode = `PlaybackError.${MediaError.NO_MEDIA_ERROR}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
showPlaybackInfoErrorMessage(self, displayErrorCode);
|
||||||
|
|
||||||
return Promise.reject();
|
return Promise.reject();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2789,7 +2849,7 @@ class PlaybackManager {
|
||||||
} else {
|
} else {
|
||||||
if (item.AlbumId != null) {
|
if (item.AlbumId != null) {
|
||||||
return apiClient.getItem(apiClient.getCurrentUserId(), item.AlbumId).then(function(result) {
|
return apiClient.getItem(apiClient.getCurrentUserId(), item.AlbumId).then(function(result) {
|
||||||
mediaSource.albumLUFS = result.LUFS;
|
mediaSource.albumNormalizationGain = result.NormalizationGain;
|
||||||
return mediaSource;
|
return mediaSource;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -3320,8 +3380,14 @@ class PlaybackManager {
|
||||||
if (errorOccurred) {
|
if (errorOccurred) {
|
||||||
showPlaybackInfoErrorMessage(self, 'PlaybackError' + displayErrorCode);
|
showPlaybackInfoErrorMessage(self, 'PlaybackError' + displayErrorCode);
|
||||||
} else if (nextItem) {
|
} else if (nextItem) {
|
||||||
|
const apiClient = ServerConnections.getApiClient(nextItem.item.ServerId);
|
||||||
|
|
||||||
|
apiClient.getCurrentUser().then(function (user) {
|
||||||
|
if (user.Configuration.EnableNextEpisodeAutoPlay || nextMediaType !== MediaType.Video) {
|
||||||
self.nextTrack();
|
self.nextTrack();
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function onPlaybackChanging(activePlayer, newPlayer, newItem) {
|
function onPlaybackChanging(activePlayer, newPlayer, newItem) {
|
||||||
|
|
|
@ -173,6 +173,8 @@ function loadForm(context, user, userSettings, systemInfo, apiClient) {
|
||||||
|
|
||||||
context.querySelector('.chkPlayDefaultAudioTrack').checked = user.Configuration.PlayDefaultAudioTrack || false;
|
context.querySelector('.chkPlayDefaultAudioTrack').checked = user.Configuration.PlayDefaultAudioTrack || false;
|
||||||
context.querySelector('.chkPreferFmp4HlsContainer').checked = userSettings.preferFmp4HlsContainer();
|
context.querySelector('.chkPreferFmp4HlsContainer').checked = userSettings.preferFmp4HlsContainer();
|
||||||
|
context.querySelector('.chkEnableDts').checked = appSettings.enableDts();
|
||||||
|
context.querySelector('.chkEnableTrueHd').checked = appSettings.enableTrueHd();
|
||||||
context.querySelector('.chkEnableCinemaMode').checked = userSettings.enableCinemaMode();
|
context.querySelector('.chkEnableCinemaMode').checked = userSettings.enableCinemaMode();
|
||||||
context.querySelector('#selectAudioNormalization').value = userSettings.selectAudioNormalization();
|
context.querySelector('#selectAudioNormalization').value = userSettings.selectAudioNormalization();
|
||||||
context.querySelector('.chkEnableNextVideoOverlay').checked = userSettings.enableNextVideoInfoOverlay();
|
context.querySelector('.chkEnableNextVideoOverlay').checked = userSettings.enableNextVideoInfoOverlay();
|
||||||
|
@ -216,6 +218,9 @@ function saveUser(context, user, userSettingsInstance, apiClient) {
|
||||||
appSettings.maxVideoWidth(context.querySelector('.selectMaxVideoWidth').value);
|
appSettings.maxVideoWidth(context.querySelector('.selectMaxVideoWidth').value);
|
||||||
appSettings.limitSupportedVideoResolution(context.querySelector('.chkLimitSupportedVideoResolution').checked);
|
appSettings.limitSupportedVideoResolution(context.querySelector('.chkLimitSupportedVideoResolution').checked);
|
||||||
|
|
||||||
|
appSettings.enableDts(context.querySelector('.chkEnableDts').checked);
|
||||||
|
appSettings.enableTrueHd(context.querySelector('.chkEnableTrueHd').checked);
|
||||||
|
|
||||||
setMaxBitrateFromField(context.querySelector('.selectVideoInNetworkQuality'), true, 'Video');
|
setMaxBitrateFromField(context.querySelector('.selectVideoInNetworkQuality'), true, 'Video');
|
||||||
setMaxBitrateFromField(context.querySelector('.selectVideoInternetQuality'), false, 'Video');
|
setMaxBitrateFromField(context.querySelector('.selectVideoInternetQuality'), false, 'Video');
|
||||||
setMaxBitrateFromField(context.querySelector('.selectMusicInternetQuality'), false, 'Audio');
|
setMaxBitrateFromField(context.querySelector('.selectMusicInternetQuality'), false, 'Audio');
|
||||||
|
|
|
@ -159,6 +159,28 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="verticalSection verticalSection-extrabottompadding">
|
||||||
|
<h2 class="sectionTitle">
|
||||||
|
${HeaderVideoAdvanced}
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<div class="checkboxContainer checkboxContainer-withDescription fldEnableDts">
|
||||||
|
<label>
|
||||||
|
<input type="checkbox" is="emby-checkbox" class="chkEnableDts" />
|
||||||
|
<span>${EnableDts}</span>
|
||||||
|
</label>
|
||||||
|
<div class="fieldDescription checkboxFieldDescription">${EnableDtsHelp}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="checkboxContainer checkboxContainer-withDescription fldEnableTrueHd">
|
||||||
|
<label>
|
||||||
|
<input type="checkbox" is="emby-checkbox" class="chkEnableTrueHd" />
|
||||||
|
<span>${EnableTrueHd}</span>
|
||||||
|
</label>
|
||||||
|
<div class="fieldDescription checkboxFieldDescription">${EnableTrueHdHelp}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<button is="emby-button" type="submit" class="raised button-submit block btnSave hide">
|
<button is="emby-button" type="submit" class="raised button-submit block btnSave hide">
|
||||||
<span>${Save}</span>
|
<span>${Save}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { getItemsApi } from '@jellyfin/sdk/lib/utils/api/items-api';
|
||||||
import { getPlaylistsApi } from '@jellyfin/sdk/lib/utils/api/playlists-api';
|
import { getPlaylistsApi } from '@jellyfin/sdk/lib/utils/api/playlists-api';
|
||||||
import escapeHtml from 'escape-html';
|
import escapeHtml from 'escape-html';
|
||||||
|
|
||||||
|
import toast from 'components/toast/toast';
|
||||||
import dom from 'scripts/dom';
|
import dom from 'scripts/dom';
|
||||||
import globalize from 'scripts/globalize';
|
import globalize from 'scripts/globalize';
|
||||||
import { currentSettings as userSettings } from 'scripts/settings/userSettings';
|
import { currentSettings as userSettings } from 'scripts/settings/userSettings';
|
||||||
|
@ -52,12 +53,14 @@ function onSubmit(this: HTMLElement, e: Event) {
|
||||||
addToPlaylist(panel, playlistId)
|
addToPlaylist(panel, playlistId)
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
console.error('[PlaylistEditor] Failed to add to playlist %s', playlistId, err);
|
console.error('[PlaylistEditor] Failed to add to playlist %s', playlistId, err);
|
||||||
|
toast(globalize.translate('PlaylistError.AddFailed'));
|
||||||
})
|
})
|
||||||
.finally(loading.hide);
|
.finally(loading.hide);
|
||||||
} else {
|
} else {
|
||||||
createPlaylist(panel)
|
createPlaylist(panel)
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
console.error('[PlaylistEditor] Failed to create playlist', err);
|
console.error('[PlaylistEditor] Failed to create playlist', err);
|
||||||
|
toast(globalize.translate('PlaylistError.CreateFailed'));
|
||||||
})
|
})
|
||||||
.finally(loading.hide);
|
.finally(loading.hide);
|
||||||
}
|
}
|
||||||
|
@ -73,13 +76,16 @@ function createPlaylist(dlg: DialogElement) {
|
||||||
const apiClient = ServerConnections.getApiClient(currentServerId);
|
const apiClient = ServerConnections.getApiClient(currentServerId);
|
||||||
const api = toApi(apiClient);
|
const api = toApi(apiClient);
|
||||||
|
|
||||||
const itemIds = dlg.querySelector<HTMLInputElement>('.fldSelectedItemIds')?.value || '';
|
const itemIds = dlg.querySelector<HTMLInputElement>('.fldSelectedItemIds')?.value || undefined;
|
||||||
|
|
||||||
return getPlaylistsApi(api)
|
return getPlaylistsApi(api)
|
||||||
.createPlaylist({
|
.createPlaylist({
|
||||||
name: dlg.querySelector<HTMLInputElement>('#txtNewPlaylistName')?.value,
|
createPlaylistDto: {
|
||||||
ids: itemIds.split(','),
|
Name: dlg.querySelector<HTMLInputElement>('#txtNewPlaylistName')?.value,
|
||||||
userId: apiClient.getCurrentUserId()
|
IsPublic: dlg.querySelector<HTMLInputElement>('#chkPlaylistPublic')?.checked,
|
||||||
|
Ids: itemIds?.split(','),
|
||||||
|
UserId: apiClient.getCurrentUserId()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.then(result => {
|
.then(result => {
|
||||||
dlg.submitted = true;
|
dlg.submitted = true;
|
||||||
|
@ -147,6 +153,32 @@ function populatePlaylists(editorOptions: PlaylistEditorOptions, panel: DialogEl
|
||||||
recursive: true
|
recursive: true
|
||||||
})
|
})
|
||||||
.then(({ data }) => {
|
.then(({ data }) => {
|
||||||
|
return Promise.all((data.Items || []).map(item => {
|
||||||
|
const playlist = {
|
||||||
|
item,
|
||||||
|
permissions: undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!item.Id) return playlist;
|
||||||
|
|
||||||
|
return getPlaylistsApi(api)
|
||||||
|
.getPlaylistUser({
|
||||||
|
playlistId: item.Id,
|
||||||
|
userId: apiClient.getCurrentUserId()
|
||||||
|
})
|
||||||
|
.then(({ data: permissions }) => ({
|
||||||
|
...playlist,
|
||||||
|
permissions
|
||||||
|
}))
|
||||||
|
.catch(err => {
|
||||||
|
// If a user doesn't have access, then the request will 404 and throw
|
||||||
|
console.info('[PlaylistEditor] Failed to fetch playlist permissions', err);
|
||||||
|
|
||||||
|
return playlist;
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
})
|
||||||
|
.then(playlists => {
|
||||||
let html = '';
|
let html = '';
|
||||||
|
|
||||||
if ((editorOptions.enableAddToPlayQueue !== false && playbackManager.isPlaying()) || SyncPlay?.Manager.isSyncPlayEnabled()) {
|
if ((editorOptions.enableAddToPlayQueue !== false && playbackManager.isPlaying()) || SyncPlay?.Manager.isSyncPlayEnabled()) {
|
||||||
|
@ -155,8 +187,10 @@ function populatePlaylists(editorOptions: PlaylistEditorOptions, panel: DialogEl
|
||||||
|
|
||||||
html += `<option value="">${globalize.translate('OptionNew')}</option>`;
|
html += `<option value="">${globalize.translate('OptionNew')}</option>`;
|
||||||
|
|
||||||
html += data.Items?.map(i => {
|
html += playlists.map(({ item, permissions }) => {
|
||||||
return `<option value="${i.Id}">${escapeHtml(i.Name)}</option>`;
|
if (!permissions?.CanEdit) return '';
|
||||||
|
|
||||||
|
return `<option value="${item.Id}">${escapeHtml(item.Name)}</option>`;
|
||||||
});
|
});
|
||||||
|
|
||||||
select.innerHTML = html;
|
select.innerHTML = html;
|
||||||
|
@ -195,6 +229,17 @@ function getEditorHtml(items: string[]) {
|
||||||
html += `<input is="emby-input" type="text" id="txtNewPlaylistName" required="required" label="${globalize.translate('LabelName')}"${autoFocus} />`;
|
html += `<input is="emby-input" type="text" id="txtNewPlaylistName" required="required" label="${globalize.translate('LabelName')}"${autoFocus} />`;
|
||||||
html += '</div>';
|
html += '</div>';
|
||||||
|
|
||||||
|
html += `
|
||||||
|
<div class="checkboxContainer checkboxContainer-withDescription">
|
||||||
|
<label>
|
||||||
|
<input type="checkbox" is="emby-checkbox" id="chkPlaylistPublic" checked />
|
||||||
|
<span>${globalize.translate('PlaylistPublic')}</span>
|
||||||
|
</label>
|
||||||
|
<div class="fieldDescription checkboxFieldDescription">
|
||||||
|
${globalize.translate('PlaylistPublicDescription')}
|
||||||
|
</div>
|
||||||
|
</div>`;
|
||||||
|
|
||||||
// newPlaylistInfo
|
// newPlaylistInfo
|
||||||
html += '</div>';
|
html += '</div>';
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type';
|
||||||
import { Action, createHashHistory } from 'history';
|
import { Action, createHashHistory } from 'history';
|
||||||
|
|
||||||
import { appHost } from '../apphost';
|
import { appHost } from '../apphost';
|
||||||
|
@ -9,8 +10,11 @@ import loading from '../loading/loading';
|
||||||
import viewManager from '../viewManager/viewManager';
|
import viewManager from '../viewManager/viewManager';
|
||||||
import ServerConnections from '../ServerConnections';
|
import ServerConnections from '../ServerConnections';
|
||||||
import alert from '../alert';
|
import alert from '../alert';
|
||||||
import { ConnectionState } from '../../utils/jellyfin-apiclient/ConnectionState.ts';
|
|
||||||
import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type';
|
import { queryClient } from 'utils/query/queryClient';
|
||||||
|
import { getItemQuery } from 'hooks/useItem';
|
||||||
|
import { toApi } from 'utils/jellyfin-apiclient/compat';
|
||||||
|
import { ConnectionState } from 'utils/jellyfin-apiclient/ConnectionState.ts';
|
||||||
|
|
||||||
export const history = createHashHistory();
|
export const history = createHashHistory();
|
||||||
|
|
||||||
|
@ -183,10 +187,18 @@ class AppRouter {
|
||||||
|
|
||||||
showItem(item, serverId, options) {
|
showItem(item, serverId, options) {
|
||||||
// TODO: Refactor this so it only gets items, not strings.
|
// TODO: Refactor this so it only gets items, not strings.
|
||||||
if (typeof (item) === 'string') {
|
if (typeof item === 'string') {
|
||||||
const apiClient = serverId ? ServerConnections.getApiClient(serverId) : ServerConnections.currentApiClient();
|
const apiClient = serverId ? ServerConnections.getApiClient(serverId) : ServerConnections.currentApiClient();
|
||||||
apiClient.getItem(apiClient.getCurrentUserId(), item).then((itemObject) => {
|
const api = toApi(apiClient);
|
||||||
|
const userId = apiClient.getCurrentUserId();
|
||||||
|
|
||||||
|
queryClient
|
||||||
|
.fetchQuery(getItemQuery(api, userId, item))
|
||||||
|
.then(itemObject => {
|
||||||
this.showItem(itemObject, options);
|
this.showItem(itemObject, options);
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
console.error('[AppRouter] Failed to fetch item', err);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
if (arguments.length === 2) {
|
if (arguments.length === 2) {
|
||||||
|
@ -194,7 +206,7 @@ class AppRouter {
|
||||||
}
|
}
|
||||||
|
|
||||||
const url = this.getRouteUrl(item, options);
|
const url = this.getRouteUrl(item, options);
|
||||||
this.show(url, { item });
|
this.show(url);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* Module shortcuts.
|
* Module shortcuts.
|
||||||
* @module components/shortcuts
|
* @module components/shortcuts
|
||||||
*/
|
*/
|
||||||
|
import { getPlaylistsApi } from '@jellyfin/sdk/lib/utils/api/playlists-api';
|
||||||
|
|
||||||
import { playbackManager } from './playback/playbackmanager';
|
import { playbackManager } from './playback/playbackmanager';
|
||||||
import inputManager from '../scripts/inputManager';
|
import inputManager from '../scripts/inputManager';
|
||||||
|
@ -12,6 +13,7 @@ import recordingHelper from './recordingcreator/recordinghelper';
|
||||||
import ServerConnections from './ServerConnections';
|
import ServerConnections from './ServerConnections';
|
||||||
import toast from './toast/toast';
|
import toast from './toast/toast';
|
||||||
import * as userSettings from '../scripts/settings/userSettings';
|
import * as userSettings from '../scripts/settings/userSettings';
|
||||||
|
import { toApi } from 'utils/jellyfin-apiclient/compat';
|
||||||
|
|
||||||
function playAllFromHere(card, serverId, queue) {
|
function playAllFromHere(card, serverId, queue) {
|
||||||
const parent = card.parentNode;
|
const parent = card.parentNode;
|
||||||
|
@ -100,7 +102,7 @@ function notifyRefreshNeeded(childElement, itemsContainer) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function showContextMenu(card, options) {
|
function showContextMenu(card, options = {}) {
|
||||||
getItem(card).then(item => {
|
getItem(card).then(item => {
|
||||||
const playlistId = card.getAttribute('data-playlistid');
|
const playlistId = card.getAttribute('data-playlistid');
|
||||||
const collectionId = card.getAttribute('data-collectionid');
|
const collectionId = card.getAttribute('data-collectionid');
|
||||||
|
@ -110,18 +112,48 @@ function showContextMenu(card, options) {
|
||||||
item.PlaylistItemId = elem ? elem.getAttribute('data-playlistitemid') : null;
|
item.PlaylistItemId = elem ? elem.getAttribute('data-playlistitemid') : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
import('./itemContextMenu').then((itemContextMenu) => {
|
const apiClient = ServerConnections.getApiClient(item.ServerId);
|
||||||
ServerConnections.getApiClient(item.ServerId).getCurrentUser().then(user => {
|
const api = toApi(apiClient);
|
||||||
itemContextMenu.show(Object.assign({
|
|
||||||
item: item,
|
Promise.all([
|
||||||
|
// Import the item menu component
|
||||||
|
import('./itemContextMenu'),
|
||||||
|
// Fetch the current user
|
||||||
|
apiClient.getCurrentUser(),
|
||||||
|
// Fetch playlist perms if item is a child of a playlist
|
||||||
|
playlistId ?
|
||||||
|
getPlaylistsApi(api)
|
||||||
|
.getPlaylistUser({
|
||||||
|
playlistId,
|
||||||
|
userId: apiClient.getCurrentUserId()
|
||||||
|
})
|
||||||
|
.then(({ data }) => data)
|
||||||
|
.catch(err => {
|
||||||
|
// If a user doesn't have access, then the request will 404 and throw
|
||||||
|
console.info('[Shortcuts] Failed to fetch playlist permissions', err);
|
||||||
|
return { CanEdit: false };
|
||||||
|
}) :
|
||||||
|
// Not a playlist item
|
||||||
|
Promise.resolve({ CanEdit: false })
|
||||||
|
])
|
||||||
|
.then(([
|
||||||
|
itemContextMenu,
|
||||||
|
user,
|
||||||
|
playlistPerms
|
||||||
|
]) => {
|
||||||
|
return itemContextMenu.show({
|
||||||
|
item,
|
||||||
play: true,
|
play: true,
|
||||||
queue: true,
|
queue: true,
|
||||||
playAllFromHere: !item.IsFolder,
|
playAllFromHere: item.Type === 'Season' || !item.IsFolder,
|
||||||
queueAllFromHere: !item.IsFolder,
|
queueAllFromHere: !item.IsFolder,
|
||||||
playlistId: playlistId,
|
playlistId,
|
||||||
collectionId: collectionId,
|
canEditPlaylist: !!playlistPerms.CanEdit,
|
||||||
user: user
|
collectionId,
|
||||||
}, options || {}))
|
user,
|
||||||
|
...options
|
||||||
|
});
|
||||||
|
})
|
||||||
.then(result => {
|
.then(result => {
|
||||||
if (result.command === 'playallfromhere' || result.command === 'queueallfromhere') {
|
if (result.command === 'playallfromhere' || result.command === 'queueallfromhere') {
|
||||||
executeAction(card, options.positionTo, result.command);
|
executeAction(card, options.positionTo, result.command);
|
||||||
|
@ -131,8 +163,6 @@ function showContextMenu(card, options) {
|
||||||
})
|
})
|
||||||
.catch(() => { /* no-op */ });
|
.catch(() => { /* no-op */ });
|
||||||
});
|
});
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getItemInfoFromCard(card) {
|
function getItemInfoFromCard(card) {
|
||||||
|
@ -406,8 +436,8 @@ export function getShortcutAttributesHtml(item, serverId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
on: on,
|
on,
|
||||||
off: off,
|
off,
|
||||||
onClick: onClick,
|
onClick,
|
||||||
getShortcutAttributesHtml: getShortcutAttributesHtml
|
getShortcutAttributesHtml
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,14 @@
|
||||||
|
import { MediaType } from '@jellyfin/sdk/lib/generated-client/models/media-type';
|
||||||
|
import { getLibraryApi } from '@jellyfin/sdk/lib/utils/api/library-api';
|
||||||
|
|
||||||
|
import { getItemQuery } from 'hooks/useItem';
|
||||||
|
import { currentSettings as userSettings } from 'scripts/settings/userSettings';
|
||||||
|
import { ItemKind } from 'types/base/models/item-kind';
|
||||||
|
import Events from 'utils/events.ts';
|
||||||
|
import { toApi } from 'utils/jellyfin-apiclient/compat';
|
||||||
|
import { queryClient } from 'utils/query/queryClient';
|
||||||
|
|
||||||
import { playbackManager } from './playback/playbackmanager';
|
import { playbackManager } from './playback/playbackmanager';
|
||||||
import * as userSettings from '../scripts/settings/userSettings';
|
|
||||||
import Events from '../utils/events.ts';
|
|
||||||
import ServerConnections from './ServerConnections';
|
import ServerConnections from './ServerConnections';
|
||||||
|
|
||||||
let currentOwnerId;
|
let currentOwnerId;
|
||||||
|
@ -50,44 +58,61 @@ function stopIfPlaying() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function enabled(mediaType) {
|
function enabled(mediaType) {
|
||||||
if (mediaType === 'Video') {
|
if (mediaType === MediaType.Video) {
|
||||||
return userSettings.enableThemeVideos();
|
return userSettings.enableThemeVideos();
|
||||||
}
|
}
|
||||||
|
|
||||||
return userSettings.enableThemeSongs();
|
return userSettings.enableThemeSongs();
|
||||||
}
|
}
|
||||||
|
|
||||||
const excludeTypes = ['CollectionFolder', 'UserView', 'Program', 'SeriesTimer', 'Person', 'TvChannel', 'Channel'];
|
const excludeTypes = [
|
||||||
|
ItemKind.CollectionFolder,
|
||||||
|
ItemKind.UserView,
|
||||||
|
ItemKind.Person,
|
||||||
|
ItemKind.Program,
|
||||||
|
ItemKind.TvChannel,
|
||||||
|
ItemKind.Channel,
|
||||||
|
ItemKind.SeriesTimer
|
||||||
|
];
|
||||||
|
|
||||||
|
async function loadThemeMedia(serverId, itemId) {
|
||||||
|
const apiClient = ServerConnections.getApiClient(serverId);
|
||||||
|
const api = toApi(apiClient);
|
||||||
|
const userId = apiClient.getCurrentUserId();
|
||||||
|
|
||||||
|
try {
|
||||||
|
const item = await queryClient.fetchQuery(getItemQuery(
|
||||||
|
api,
|
||||||
|
userId,
|
||||||
|
itemId));
|
||||||
|
|
||||||
function loadThemeMedia(item) {
|
|
||||||
if (item.CollectionType) {
|
if (item.CollectionType) {
|
||||||
stopIfPlaying();
|
stopIfPlaying();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (excludeTypes.indexOf(item.Type) !== -1) {
|
if (excludeTypes.includes(item.Type)) {
|
||||||
stopIfPlaying();
|
stopIfPlaying();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const apiClient = ServerConnections.getApiClient(item.ServerId);
|
const { data: themeMedia } = await getLibraryApi(api)
|
||||||
apiClient.getThemeMedia(apiClient.getCurrentUserId(), item.Id, true).then(function (themeMediaResult) {
|
.getThemeMedia({ userId, itemId: item.Id, inheritFromParent: true });
|
||||||
const result = userSettings.enableThemeVideos() && themeMediaResult.ThemeVideosResult.Items.length ? themeMediaResult.ThemeVideosResult : themeMediaResult.ThemeSongsResult;
|
|
||||||
|
|
||||||
const ownerId = result.OwnerId;
|
const result = userSettings.enableThemeVideos() && themeMedia.ThemeVideosResult?.Items?.length ? themeMedia.ThemeVideosResult : themeMedia.ThemeSongsResult;
|
||||||
|
|
||||||
if (ownerId !== currentOwnerId) {
|
if (result.OwnerId !== currentOwnerId) {
|
||||||
playThemeMedia(result.Items, ownerId);
|
playThemeMedia(result.Items, result.OwnerId);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error('[ThemeMediaPlayer] failed to load theme media', err);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
document.addEventListener('viewshow', function (e) {
|
document.addEventListener('viewshow', e => {
|
||||||
const state = e.detail.state || {};
|
const { serverId, id } = e.detail?.params || {};
|
||||||
const item = state.item;
|
if (serverId && id) {
|
||||||
|
void loadThemeMedia(serverId, id);
|
||||||
if (item?.ServerId) {
|
|
||||||
loadThemeMedia(item);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,7 +125,7 @@ document.addEventListener('viewshow', function (e) {
|
||||||
}
|
}
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
Events.on(playbackManager, 'playbackstart', function (e, player) {
|
Events.on(playbackManager, 'playbackstart', (_e, player) => {
|
||||||
const item = playbackManager.currentItem(player);
|
const item = playbackManager.currentItem(player);
|
||||||
// User played something manually
|
// User played something manually
|
||||||
if (currentThemeIds.indexOf(item.Id) == -1) {
|
if (currentThemeIds.indexOf(item.Id) == -1) {
|
||||||
|
|
|
@ -83,7 +83,11 @@
|
||||||
<div class="verticalSection">
|
<div class="verticalSection">
|
||||||
<h2>${HeaderPerformance}</h2>
|
<h2>${HeaderPerformance}</h2>
|
||||||
<div class="inputContainer">
|
<div class="inputContainer">
|
||||||
<input is="emby-input" id="txtParallelImageEncodingLimit" label="${LabelParallelImageEncodingLimit}" type="number" pattern="[0-9]*" min="0" step="1" />
|
<input is="emby-input" id="txtLibraryScanFanoutConcurrency" label="${LibraryScanFanoutConcurrency}" placeholder="0" type="number" pattern="[0-9]*" min="0" step="1" />
|
||||||
|
<div class="fieldDescription">${LibraryScanFanoutConcurrencyHelp}</div>
|
||||||
|
</div>
|
||||||
|
<div class="inputContainer">
|
||||||
|
<input is="emby-input" id="txtParallelImageEncodingLimit" label="${LabelParallelImageEncodingLimit}" placeholder="0" type="number" pattern="[0-9]*" min="0" step="1" />
|
||||||
<div class="fieldDescription">${LabelParallelImageEncodingLimitHelp}</div>
|
<div class="fieldDescription">${LabelParallelImageEncodingLimitHelp}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -19,6 +19,7 @@ function loadPage(page, config, languageOptions, systemInfo) {
|
||||||
$('#selectLocalizationLanguage', page).html(languageOptions.map(function (language) {
|
$('#selectLocalizationLanguage', page).html(languageOptions.map(function (language) {
|
||||||
return '<option value="' + language.Value + '">' + language.Name + '</option>';
|
return '<option value="' + language.Value + '">' + language.Name + '</option>';
|
||||||
})).val(config.UICulture);
|
})).val(config.UICulture);
|
||||||
|
page.querySelector('#txtLibraryScanFanoutConcurrency').value = config.LibraryScanFanoutConcurrency || '';
|
||||||
page.querySelector('#txtParallelImageEncodingLimit').value = config.ParallelImageEncodingLimit || '';
|
page.querySelector('#txtParallelImageEncodingLimit').value = config.ParallelImageEncodingLimit || '';
|
||||||
|
|
||||||
loading.hide();
|
loading.hide();
|
||||||
|
@ -35,6 +36,7 @@ function onSubmit() {
|
||||||
config.MetadataPath = $('#txtMetadataPath', form).val();
|
config.MetadataPath = $('#txtMetadataPath', form).val();
|
||||||
config.MetadataNetworkPath = $('#txtMetadataNetworkPath', form).val();
|
config.MetadataNetworkPath = $('#txtMetadataNetworkPath', form).val();
|
||||||
config.QuickConnectAvailable = form.querySelector('#chkQuickConnectAvailable').checked;
|
config.QuickConnectAvailable = form.querySelector('#chkQuickConnectAvailable').checked;
|
||||||
|
config.LibraryScanFanoutConcurrency = parseInt(form.querySelector('#txtLibraryScanFanoutConcurrency').value || '0', 10);
|
||||||
config.ParallelImageEncodingLimit = parseInt(form.querySelector('#txtParallelImageEncodingLimit').value || '0', 10);
|
config.ParallelImageEncodingLimit = parseInt(form.querySelector('#txtParallelImageEncodingLimit').value || '0', 10);
|
||||||
|
|
||||||
ApiClient.updateServerConfiguration(config).then(function() {
|
ApiClient.updateServerConfiguration(config).then(function() {
|
||||||
|
|
|
@ -175,14 +175,14 @@
|
||||||
|
|
||||||
<div id="additionalPartsCollapsible" class="verticalSection detailVerticalSection hide">
|
<div id="additionalPartsCollapsible" class="verticalSection detailVerticalSection hide">
|
||||||
<h2 class="sectionTitle sectionTitle-cards padded-right">${HeaderAdditionalParts}</h2>
|
<h2 class="sectionTitle sectionTitle-cards padded-right">${HeaderAdditionalParts}</h2>
|
||||||
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">
|
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale no-padding" data-centerfocus="true">
|
||||||
<div id="additionalPartsContent" is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
<div id="additionalPartsContent" is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="verticalSection detailVerticalSection moreFromSeasonSection hide">
|
<div class="verticalSection detailVerticalSection moreFromSeasonSection hide">
|
||||||
<h2 class="sectionTitle sectionTitle-cards padded-right"></h2>
|
<h2 class="sectionTitle sectionTitle-cards padded-right"></h2>
|
||||||
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">
|
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale no-padding" data-centerfocus="true">
|
||||||
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -194,21 +194,21 @@
|
||||||
|
|
||||||
<div class="verticalSection detailVerticalSection moreFromArtistSection hide">
|
<div class="verticalSection detailVerticalSection moreFromArtistSection hide">
|
||||||
<h2 class="sectionTitle sectionTitle-cards padded-right"></h2>
|
<h2 class="sectionTitle sectionTitle-cards padded-right"></h2>
|
||||||
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">
|
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale no-padding" data-centerfocus="true">
|
||||||
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="castCollapsible" class="verticalSection detailVerticalSection hide">
|
<div id="castCollapsible" class="verticalSection detailVerticalSection hide">
|
||||||
<h2 id="peopleHeader" class="sectionTitle sectionTitle-cards padded-right">${HeaderCastAndCrew}</h2>
|
<h2 id="peopleHeader" class="sectionTitle sectionTitle-cards padded-right">${HeaderCastAndCrew}</h2>
|
||||||
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">
|
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale no-padding" data-centerfocus="true">
|
||||||
<div id="castContent" is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
<div id="castContent" is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="guestCastCollapsible" class="verticalSection detailVerticalSection hide">
|
<div id="guestCastCollapsible" class="verticalSection detailVerticalSection hide">
|
||||||
<h2 id="guestCastHeader" class="sectionTitle sectionTitle-cards padded-right">${HeaderGuestCast}</h2>
|
<h2 id="guestCastHeader" class="sectionTitle sectionTitle-cards padded-right">${HeaderGuestCast}</h2>
|
||||||
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">
|
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale no-padding" data-centerfocus="true">
|
||||||
<div id="guestCastContent" is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
<div id="guestCastContent" is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -220,28 +220,28 @@
|
||||||
|
|
||||||
<div id="specialsCollapsible" class="verticalSection detailVerticalSection hide">
|
<div id="specialsCollapsible" class="verticalSection detailVerticalSection hide">
|
||||||
<h2 class="sectionTitle sectionTitle-cards padded-right">${SpecialFeatures}</h2>
|
<h2 class="sectionTitle sectionTitle-cards padded-right">${SpecialFeatures}</h2>
|
||||||
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">
|
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale no-padding" data-centerfocus="true">
|
||||||
<div id="specialsContent" is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
<div id="specialsContent" is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="musicVideosCollapsible" class="verticalSection detailVerticalSection hide">
|
<div id="musicVideosCollapsible" class="verticalSection detailVerticalSection hide">
|
||||||
<h2 class="sectionTitle sectionTitle-cards padded-right">${MusicVideos}</h2>
|
<h2 class="sectionTitle sectionTitle-cards padded-right">${MusicVideos}</h2>
|
||||||
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">
|
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale no-padding" data-centerfocus="true">
|
||||||
<div id="musicVideosContent" is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
<div id="musicVideosContent" is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="scenesCollapsible" class="verticalSection detailVerticalSection verticalSection-extrabottompadding hide">
|
<div id="scenesCollapsible" class="verticalSection detailVerticalSection verticalSection-extrabottompadding hide">
|
||||||
<h2 class="sectionTitle sectionTitle-cards padded-right">${HeaderScenes}</h2>
|
<h2 class="sectionTitle sectionTitle-cards padded-right">${HeaderScenes}</h2>
|
||||||
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">
|
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale no-padding" data-centerfocus="true">
|
||||||
<div id="scenesContent" is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
<div id="scenesContent" is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="similarCollapsible" class="verticalSection detailVerticalSection verticalSection-extrabottompadding hide">
|
<div id="similarCollapsible" class="verticalSection detailVerticalSection verticalSection-extrabottompadding hide">
|
||||||
<h2 class="sectionTitle sectionTitle-cards padded-right">${HeaderMoreLikeThis}</h2>
|
<h2 class="sectionTitle sectionTitle-cards padded-right">${HeaderMoreLikeThis}</h2>
|
||||||
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">
|
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale no-padding" data-centerfocus="true">
|
||||||
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer similarContent"></div>
|
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer similarContent"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { PersonKind } from '@jellyfin/sdk/lib/generated-client/models/person-kind';
|
||||||
import { intervalToDuration } from 'date-fns';
|
import { intervalToDuration } from 'date-fns';
|
||||||
import DOMPurify from 'dompurify';
|
import DOMPurify from 'dompurify';
|
||||||
import escapeHtml from 'escape-html';
|
import escapeHtml from 'escape-html';
|
||||||
|
@ -822,8 +823,18 @@ function setInitialCollapsibleState(page, item, apiClient, context, user) {
|
||||||
page.querySelector('#specialsCollapsible').classList.add('hide');
|
page.querySelector('#specialsCollapsible').classList.add('hide');
|
||||||
}
|
}
|
||||||
|
|
||||||
renderCast(page, item);
|
const cast = [];
|
||||||
renderGuestCast(page, item);
|
const guestCast = [];
|
||||||
|
(item.People || []).forEach(p => {
|
||||||
|
if (p.Type === PersonKind.GuestStar) {
|
||||||
|
guestCast.push(p);
|
||||||
|
} else {
|
||||||
|
cast.push(p);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
renderCast(page, item, cast);
|
||||||
|
renderGuestCast(page, item, guestCast);
|
||||||
|
|
||||||
if (item.PartCount && item.PartCount > 1) {
|
if (item.PartCount && item.PartCount > 1) {
|
||||||
page.querySelector('#additionalPartsCollapsible').classList.remove('hide');
|
page.querySelector('#additionalPartsCollapsible').classList.remove('hide');
|
||||||
|
@ -1803,11 +1814,7 @@ function renderSpecials(page, item, user) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderCast(page, item) {
|
function renderCast(page, item, people) {
|
||||||
const people = (item.People || []).filter(function (p) {
|
|
||||||
return p.Type === 'Actor';
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!people.length) {
|
if (!people.length) {
|
||||||
page.querySelector('#castCollapsible').classList.add('hide');
|
page.querySelector('#castCollapsible').classList.add('hide');
|
||||||
return;
|
return;
|
||||||
|
@ -1827,9 +1834,7 @@ function renderCast(page, item) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderGuestCast(page, item) {
|
function renderGuestCast(page, item, people) {
|
||||||
const people = (item.People || []).filter(p => p.Type === 'GuestStar');
|
|
||||||
|
|
||||||
if (!people.length) {
|
if (!people.length) {
|
||||||
page.querySelector('#guestCastCollapsible').classList.add('hide');
|
page.querySelector('#guestCastCollapsible').classList.add('hide');
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import type {
|
import {
|
||||||
LibraryUpdateInfo
|
MediaType,
|
||||||
|
type LibraryUpdateInfo
|
||||||
} from '@jellyfin/sdk/lib/generated-client';
|
} from '@jellyfin/sdk/lib/generated-client';
|
||||||
|
import { ApiClient } from 'jellyfin-apiclient';
|
||||||
import React, { type FC, useCallback, useEffect, useRef } from 'react';
|
import React, { type FC, useCallback, useEffect, useRef } from 'react';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import Box from '@mui/material/Box';
|
import Box from '@mui/material/Box';
|
||||||
|
@ -20,6 +22,7 @@ import MultiSelect from 'components/multiSelect/multiSelect';
|
||||||
import loading from 'components/loading/loading';
|
import loading from 'components/loading/loading';
|
||||||
import focusManager from 'components/focusManager';
|
import focusManager from 'components/focusManager';
|
||||||
import type { ParentId } from 'types/library';
|
import type { ParentId } from 'types/library';
|
||||||
|
import type { PlaybackStopInfo } from 'types/playbackStopInfo';
|
||||||
|
|
||||||
function disableEvent(e: MouseEvent) {
|
function disableEvent(e: MouseEvent) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
@ -221,7 +224,7 @@ const ItemsContainer: FC<ItemsContainerProps> = ({
|
||||||
);
|
);
|
||||||
|
|
||||||
const onLibraryChanged = useCallback(
|
const onLibraryChanged = useCallback(
|
||||||
(_e: Event, apiClient, data: LibraryUpdateInfo) => {
|
(_e: Event, _apiClient: ApiClient, data: LibraryUpdateInfo) => {
|
||||||
if (eventsToMonitor.includes('seriestimers') || eventsToMonitor.includes('timers')) {
|
if (eventsToMonitor.includes('seriestimers') || eventsToMonitor.includes('timers')) {
|
||||||
// yes this is an assumption
|
// yes this is an assumption
|
||||||
return;
|
return;
|
||||||
|
@ -253,12 +256,12 @@ const ItemsContainer: FC<ItemsContainerProps> = ({
|
||||||
);
|
);
|
||||||
|
|
||||||
const onPlaybackStopped = useCallback(
|
const onPlaybackStopped = useCallback(
|
||||||
(_e: Event, apiClient, stopInfo) => {
|
(_e: Event, stopInfo: PlaybackStopInfo) => {
|
||||||
const state = stopInfo.state;
|
const state = stopInfo.state;
|
||||||
|
|
||||||
if (
|
if (
|
||||||
state.NowPlayingItem
|
state.NowPlayingItem
|
||||||
&& state.NowPlayingItem.MediaType === 'Video'
|
&& state.NowPlayingItem.MediaType === MediaType.Video
|
||||||
) {
|
) {
|
||||||
if (eventsToMonitor.includes('videoplayback')) {
|
if (eventsToMonitor.includes('videoplayback')) {
|
||||||
notifyRefreshNeeded(true);
|
notifyRefreshNeeded(true);
|
||||||
|
@ -266,8 +269,8 @@ const ItemsContainer: FC<ItemsContainerProps> = ({
|
||||||
}
|
}
|
||||||
} else if (
|
} else if (
|
||||||
state.NowPlayingItem
|
state.NowPlayingItem
|
||||||
&& state.NowPlayingItem.MediaType === 'Audio'
|
&& state.NowPlayingItem.MediaType === MediaType.Audio
|
||||||
&& eventsToMonitor.includes('videoplayback')
|
&& eventsToMonitor.includes('audioplayback')
|
||||||
) {
|
) {
|
||||||
notifyRefreshNeeded(true);
|
notifyRefreshNeeded(true);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -26,3 +26,13 @@
|
||||||
margin-left: 1.2em;
|
margin-left: 1.2em;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.no-padding {
|
||||||
|
[dir="ltr"] & {
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
[dir="rtl"] & {
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -28,36 +28,6 @@ import { LibraryViewSettings, ParentId } from 'types/library';
|
||||||
import { LibraryTab } from 'types/libraryTab';
|
import { LibraryTab } from 'types/libraryTab';
|
||||||
import { Section, SectionApiMethod, SectionType } from 'types/sections';
|
import { Section, SectionApiMethod, SectionType } from 'types/sections';
|
||||||
|
|
||||||
const fetchGetItem = async (
|
|
||||||
currentApi: JellyfinApiContext,
|
|
||||||
parentId: ParentId,
|
|
||||||
options?: AxiosRequestConfig
|
|
||||||
) => {
|
|
||||||
const { api, user } = currentApi;
|
|
||||||
if (api && user?.Id && parentId) {
|
|
||||||
const response = await getUserLibraryApi(api).getItem(
|
|
||||||
{
|
|
||||||
userId: user.Id,
|
|
||||||
itemId: parentId
|
|
||||||
},
|
|
||||||
{
|
|
||||||
signal: options?.signal
|
|
||||||
}
|
|
||||||
);
|
|
||||||
return response.data;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useGetItem = (parentId: ParentId) => {
|
|
||||||
const currentApi = useApi();
|
|
||||||
const isLivetv = parentId === 'livetv';
|
|
||||||
return useQuery({
|
|
||||||
queryKey: ['Item', parentId],
|
|
||||||
queryFn: ({ signal }) => fetchGetItem(currentApi, parentId, { signal }),
|
|
||||||
enabled: !!parentId && !isLivetv
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const fetchGetItems = async (
|
const fetchGetItems = async (
|
||||||
currentApi: JellyfinApiContext,
|
currentApi: JellyfinApiContext,
|
||||||
parametersOptions: ItemsApiGetItemsRequest,
|
parametersOptions: ItemsApiGetItemsRequest,
|
||||||
|
|
41
src/hooks/useItem.ts
Normal file
41
src/hooks/useItem.ts
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
import type { Api } from '@jellyfin/sdk/lib/api';
|
||||||
|
import { getUserLibraryApi } from '@jellyfin/sdk/lib/utils/api/user-library-api';
|
||||||
|
import { useQuery } from '@tanstack/react-query';
|
||||||
|
import type { AxiosRequestConfig } from 'axios';
|
||||||
|
|
||||||
|
import { queryOptions } from 'utils/query/queryOptions';
|
||||||
|
|
||||||
|
import { useApi } from './useApi';
|
||||||
|
|
||||||
|
const fetchItem = async (
|
||||||
|
api?: Api,
|
||||||
|
userId?: string,
|
||||||
|
itemId?: string,
|
||||||
|
options?: AxiosRequestConfig
|
||||||
|
) => {
|
||||||
|
if (!api) throw new Error('No API instance available');
|
||||||
|
if (!itemId) throw new Error('No item ID provided');
|
||||||
|
|
||||||
|
const response = await getUserLibraryApi(api)
|
||||||
|
.getItem({ userId, itemId }, options);
|
||||||
|
return response.data;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getItemQuery = (
|
||||||
|
api?: Api,
|
||||||
|
userId?: string,
|
||||||
|
itemId?: string
|
||||||
|
) => queryOptions({
|
||||||
|
queryKey: [ 'User', userId, 'Items', itemId ],
|
||||||
|
queryFn: ({ signal }) => fetchItem(api, userId, itemId, { signal }),
|
||||||
|
staleTime: 1000, // 1 second
|
||||||
|
enabled: !!api && !!userId && !!itemId
|
||||||
|
});
|
||||||
|
|
||||||
|
export const useItem = (
|
||||||
|
itemId?: string
|
||||||
|
) => {
|
||||||
|
const apiContext = useApi();
|
||||||
|
const { api, user } = apiContext;
|
||||||
|
return useQuery(getItemQuery(api, user?.Id, itemId));
|
||||||
|
};
|
|
@ -2,8 +2,6 @@ import { Update } from 'history';
|
||||||
import { useLayoutEffect, useState } from 'react';
|
import { useLayoutEffect, useState } from 'react';
|
||||||
import type { History, Router } from '@remix-run/router';
|
import type { History, Router } from '@remix-run/router';
|
||||||
|
|
||||||
const normalizePath = (pathname: string) => pathname.replace(/^!/, '');
|
|
||||||
|
|
||||||
interface UseLegacyRouterSyncProps {
|
interface UseLegacyRouterSyncProps {
|
||||||
router: Router;
|
router: Router;
|
||||||
history: History;
|
history: History;
|
||||||
|
@ -20,8 +18,18 @@ export function useLegacyRouterSync({ router, history }: UseLegacyRouterSyncProp
|
||||||
* implementation, so we need to remove the leading `!` from the pathname. React Router already removes the
|
* implementation, so we need to remove the leading `!` from the pathname. React Router already removes the
|
||||||
* hash for us.
|
* hash for us.
|
||||||
*/
|
*/
|
||||||
if (update.location.pathname.startsWith('!')) {
|
if (update.location.pathname.startsWith('/!/')) {
|
||||||
history.replace(normalizePath(update.location.pathname), update.location.state);
|
history.replace(
|
||||||
|
{ ...update.location, pathname: update.location.pathname.replace(/^\/!/, '') },
|
||||||
|
update.location.state);
|
||||||
|
} else if (update.location.pathname.startsWith('/!')) {
|
||||||
|
history.replace(
|
||||||
|
{ ...update.location, pathname: update.location.pathname.replace(/^\/!/, '/') },
|
||||||
|
update.location.state);
|
||||||
|
} else if (update.location.pathname.startsWith('!')) {
|
||||||
|
history.replace(
|
||||||
|
{ ...update.location, pathname: update.location.pathname.replace(/^!/, '') },
|
||||||
|
update.location.state);
|
||||||
} else if (!isSynced) {
|
} else if (!isSynced) {
|
||||||
await router.navigate(update.location, { replace: true });
|
await router.navigate(update.location, { replace: true });
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,11 +12,6 @@
|
||||||
<meta name="application-name" content="Jellyfin">
|
<meta name="application-name" content="Jellyfin">
|
||||||
<meta name="robots" content="noindex, nofollow, noarchive">
|
<meta name="robots" content="noindex, nofollow, noarchive">
|
||||||
<meta name="referrer" content="no-referrer">
|
<meta name="referrer" content="no-referrer">
|
||||||
<meta property="og:title" content="Jellyfin">
|
|
||||||
<meta property="og:site_name" content="Jellyfin">
|
|
||||||
<meta property="og:url" content="https://jellyfin.org">
|
|
||||||
<meta property="og:description" content="The Free Software Media System">
|
|
||||||
<meta property="og:type" content="article">
|
|
||||||
|
|
||||||
<meta id="themeColor" name="theme-color" content="#202020">
|
<meta id="themeColor" name="theme-color" content="#202020">
|
||||||
|
|
||||||
|
@ -116,6 +111,7 @@
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
width: 0.8em;
|
width: 0.8em;
|
||||||
padding-left: env(safe-area-inset-left);
|
padding-left: env(safe-area-inset-left);
|
||||||
|
caret-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
[dir="ltr"] .mainDrawerHandle {
|
[dir="ltr"] .mainDrawerHandle {
|
||||||
|
|
|
@ -193,21 +193,10 @@ async function onAppReady() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Apply custom CSS
|
||||||
const apiClient = ServerConnections.currentApiClient();
|
const apiClient = ServerConnections.currentApiClient();
|
||||||
if (apiClient) {
|
if (apiClient) {
|
||||||
const updateStyle = (css) => {
|
const brandingCss = fetch(apiClient.getUrl('Branding/Css'))
|
||||||
let style = document.querySelector('#cssBranding');
|
|
||||||
if (!style) {
|
|
||||||
// Inject the branding css as a dom element in body so it will take
|
|
||||||
// precedence over other stylesheets
|
|
||||||
style = document.createElement('style');
|
|
||||||
style.id = 'cssBranding';
|
|
||||||
document.body.appendChild(style);
|
|
||||||
}
|
|
||||||
style.textContent = css;
|
|
||||||
};
|
|
||||||
|
|
||||||
const style = fetch(apiClient.getUrl('Branding/Css'))
|
|
||||||
.then(function(response) {
|
.then(function(response) {
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error(response.status + ' ' + response.statusText);
|
throw new Error(response.status + ' ' + response.statusText);
|
||||||
|
@ -219,41 +208,33 @@ async function onAppReady() {
|
||||||
});
|
});
|
||||||
|
|
||||||
const handleStyleChange = async () => {
|
const handleStyleChange = async () => {
|
||||||
if (currentSettings.disableCustomCss()) {
|
let style = document.querySelector('#cssBranding');
|
||||||
updateStyle('');
|
if (!style) {
|
||||||
} else {
|
|
||||||
updateStyle(await style);
|
|
||||||
}
|
|
||||||
|
|
||||||
const localCss = currentSettings.customCss();
|
|
||||||
let localStyle = document.querySelector('#localCssBranding');
|
|
||||||
if (localCss) {
|
|
||||||
if (!localStyle) {
|
|
||||||
// Inject the branding css as a dom element in body so it will take
|
// Inject the branding css as a dom element in body so it will take
|
||||||
// precedence over other stylesheets
|
// precedence over other stylesheets
|
||||||
localStyle = document.createElement('style');
|
style = document.createElement('style');
|
||||||
localStyle.id = 'localCssBranding';
|
style.id = 'cssBranding';
|
||||||
document.body.appendChild(localStyle);
|
document.body.appendChild(style);
|
||||||
}
|
|
||||||
localStyle.textContent = localCss;
|
|
||||||
} else if (localStyle) {
|
|
||||||
localStyle.textContent = '';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const css = [];
|
||||||
|
// Only add branding CSS when enabled
|
||||||
|
if (!currentSettings.disableCustomCss()) css.push(await brandingCss);
|
||||||
|
// Always add user CSS
|
||||||
|
css.push(currentSettings.customCss());
|
||||||
|
|
||||||
|
style.textContent = css.join('\n');
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleUserChange = () => {
|
Events.on(ServerConnections, 'localusersignedin', handleStyleChange);
|
||||||
handleStyleChange();
|
Events.on(ServerConnections, 'localusersignedout', handleStyleChange);
|
||||||
};
|
|
||||||
|
|
||||||
Events.on(ServerConnections, 'localusersignedin', handleUserChange);
|
|
||||||
Events.on(ServerConnections, 'localusersignedout', handleUserChange);
|
|
||||||
Events.on(currentSettings, 'change', (e, prop) => {
|
Events.on(currentSettings, 'change', (e, prop) => {
|
||||||
if (prop == 'disableCustomCss' || prop == 'customCss') {
|
if (prop == 'disableCustomCss' || prop == 'customCss') {
|
||||||
handleStyleChange();
|
handleStyleChange();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
style.then(updateStyle);
|
handleStyleChange();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -113,18 +113,22 @@ class HtmlAudioPlayer {
|
||||||
let val = options.url;
|
let val = options.url;
|
||||||
console.debug('playing url: ' + val);
|
console.debug('playing url: ' + val);
|
||||||
import('../../scripts/settings/userSettings').then((userSettings) => {
|
import('../../scripts/settings/userSettings').then((userSettings) => {
|
||||||
if (userSettings.selectAudioNormalization() == 'TrackGain' && options.item.LUFS != null) {
|
let normalizationGain;
|
||||||
const dbGain = -18 - options.item.LUFS;
|
if (userSettings.selectAudioNormalization() == 'TrackGain') {
|
||||||
self.gainNode.gain.value = Math.pow(10, (dbGain / 20));
|
normalizationGain = options.item.NormalizationGain
|
||||||
console.debug('[HtmlAudioPlayer] Using track gain');
|
?? options.mediaSource.albumNormalizationGain;
|
||||||
} else if (userSettings.selectAudioNormalization() == 'AlbumGain' && options.mediaSource.albumLUFS != null) {
|
} else if (userSettings.selectAudioNormalization() == 'AlbumGain') {
|
||||||
const dbGain = -18 - options.mediaSource.albumLUFS;
|
normalizationGain =
|
||||||
self.gainNode.gain.value = Math.pow(10, (dbGain / 20));
|
options.mediaSource.albumNormalizationGain
|
||||||
console.debug('[HtmlAudioPlayer] Using album gain');
|
?? options.item.NormalizationGain;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (normalizationGain) {
|
||||||
|
self.gainNode.gain.value = Math.pow(10, normalizationGain / 20);
|
||||||
} else {
|
} else {
|
||||||
self.gainNode.gain.value = 1;
|
self.gainNode.gain.value = 1;
|
||||||
}
|
}
|
||||||
console.debug('gain:' + self.gainNode.gain.value);
|
console.debug('gain: ' + self.gainNode.gain.value);
|
||||||
}).catch((err) => {
|
}).catch((err) => {
|
||||||
console.error('Failed to add/change gainNode', err);
|
console.error('Failed to add/change gainNode', err);
|
||||||
});
|
});
|
||||||
|
|
|
@ -1250,14 +1250,14 @@ export class HtmlVideoPlayer {
|
||||||
*/
|
*/
|
||||||
renderSsaAss(videoElement, track, item) {
|
renderSsaAss(videoElement, track, item) {
|
||||||
const supportedFonts = ['application/vnd.ms-opentype', 'application/x-truetype-font', 'font/otf', 'font/ttf', 'font/woff', 'font/woff2'];
|
const supportedFonts = ['application/vnd.ms-opentype', 'application/x-truetype-font', 'font/otf', 'font/ttf', 'font/woff', 'font/woff2'];
|
||||||
const avaliableFonts = [];
|
const availableFonts = [];
|
||||||
const attachments = this._currentPlayOptions.mediaSource.MediaAttachments || [];
|
const attachments = this._currentPlayOptions.mediaSource.MediaAttachments || [];
|
||||||
const apiClient = ServerConnections.getApiClient(item);
|
const apiClient = ServerConnections.getApiClient(item);
|
||||||
attachments.forEach(i => {
|
attachments.forEach(i => {
|
||||||
// we only require font files and ignore embedded media attachments like covers as there are cases where ffmpeg fails to extract those
|
// we only require font files and ignore embedded media attachments like covers as there are cases where ffmpeg fails to extract those
|
||||||
if (supportedFonts.includes(i.MimeType)) {
|
if (supportedFonts.includes(i.MimeType)) {
|
||||||
// embedded font url
|
// embedded font url
|
||||||
avaliableFonts.push(apiClient.getUrl(i.DeliveryUrl));
|
availableFonts.push(apiClient.getUrl(i.DeliveryUrl));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const fallbackFontList = apiClient.getUrl('/FallbackFont/Fonts', {
|
const fallbackFontList = apiClient.getUrl('/FallbackFont/Fonts', {
|
||||||
|
@ -1268,7 +1268,7 @@ export class HtmlVideoPlayer {
|
||||||
const options = {
|
const options = {
|
||||||
video: videoElement,
|
video: videoElement,
|
||||||
subUrl: getTextTrackUrl(track, item),
|
subUrl: getTextTrackUrl(track, item),
|
||||||
fonts: avaliableFonts,
|
fonts: availableFonts,
|
||||||
workerUrl: `${appRouter.baseUrl()}/libraries/subtitles-octopus-worker.js`,
|
workerUrl: `${appRouter.baseUrl()}/libraries/subtitles-octopus-worker.js`,
|
||||||
legacyWorkerUrl: `${appRouter.baseUrl()}/libraries/subtitles-octopus-worker-legacy.js`,
|
legacyWorkerUrl: `${appRouter.baseUrl()}/libraries/subtitles-octopus-worker-legacy.js`,
|
||||||
onError() {
|
onError() {
|
||||||
|
@ -1307,10 +1307,10 @@ export class HtmlVideoPlayer {
|
||||||
if (config.EnableFallbackFont) {
|
if (config.EnableFallbackFont) {
|
||||||
apiClient.getJSON(fallbackFontList).then((fontFiles = []) => {
|
apiClient.getJSON(fallbackFontList).then((fontFiles = []) => {
|
||||||
fontFiles.forEach(font => {
|
fontFiles.forEach(font => {
|
||||||
const fontUrl = apiClient.getUrl(`/FallbackFont/Fonts/${font.Name}`, {
|
const fontUrl = apiClient.getUrl(`/FallbackFont/Fonts/${encodeURIComponent(font.Name)}`, {
|
||||||
api_key: apiClient.accessToken()
|
api_key: apiClient.accessToken()
|
||||||
});
|
});
|
||||||
avaliableFonts.push(fontUrl);
|
availableFonts.push(fontUrl);
|
||||||
});
|
});
|
||||||
this.#currentAssRenderer = new SubtitlesOctopus(options);
|
this.#currentAssRenderer = new SubtitlesOctopus(options);
|
||||||
});
|
});
|
||||||
|
|
|
@ -94,6 +94,25 @@ function supportsAc3(videoTestElement) {
|
||||||
return videoTestElement.canPlayType('audio/mp4; codecs="ac-3"').replace(/no/, '');
|
return videoTestElement.canPlayType('audio/mp4; codecs="ac-3"').replace(/no/, '');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the device supports DTS (DCA).
|
||||||
|
* @param {HTMLVideoElement} videoTestElement The video test element
|
||||||
|
* @returns {boolean|null} _true_ if the device supports DTS (DCA). _false_ if the device doesn't support DTS (DCA). _null_ if support status is unknown.
|
||||||
|
*/
|
||||||
|
function canPlayDts(videoTestElement) {
|
||||||
|
// DTS audio is not supported by Samsung TV 2018+ (Tizen 4.0+) and LG TV 2020-2022 (webOS 5.0, 6.0 and 22) models
|
||||||
|
if (browser.tizenVersion >= 4 || (browser.web0sVersion >= 5 && browser.web0sVersion < 23)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (videoTestElement.canPlayType('video/mp4; codecs="dts-"').replace(/no/, '')
|
||||||
|
|| videoTestElement.canPlayType('video/mp4; codecs="dts+"').replace(/no/, '')) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
function supportsEac3(videoTestElement) {
|
function supportsEac3(videoTestElement) {
|
||||||
if (browser.tizen || browser.web0s) {
|
if (browser.tizen || browser.web0s) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -121,6 +140,15 @@ function supportsAc3InHls(videoTestElement) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function supportsMp3InHls(videoTestElement) {
|
||||||
|
if (videoTestElement.canPlayType) {
|
||||||
|
return videoTestElement.canPlayType('application/x-mpegurl; codecs="avc1.64001E, mp4a.40.34"').replace(/no/, '')
|
||||||
|
|| videoTestElement.canPlayType('application/vnd.apple.mpegURL; codecs="avc1.64001E, mp4a.40.34"').replace(/no/, '');
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
function canPlayAudioFormat(format) {
|
function canPlayAudioFormat(format) {
|
||||||
let typeString;
|
let typeString;
|
||||||
|
|
||||||
|
@ -460,6 +488,7 @@ export default function (options) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const canPlayAacVideoAudio = videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.40.2"').replace(/no/, '');
|
const canPlayAacVideoAudio = videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.40.2"').replace(/no/, '');
|
||||||
|
const canPlayMp3VideoAudioInHls = supportsMp3InHls(videoTestElement);
|
||||||
const canPlayAc3VideoAudio = supportsAc3(videoTestElement);
|
const canPlayAc3VideoAudio = supportsAc3(videoTestElement);
|
||||||
const canPlayEac3VideoAudio = supportsEac3(videoTestElement);
|
const canPlayEac3VideoAudio = supportsEac3(videoTestElement);
|
||||||
const canPlayAc3VideoAudioInHls = supportsAc3InHls(videoTestElement);
|
const canPlayAc3VideoAudioInHls = supportsAc3InHls(videoTestElement);
|
||||||
|
@ -474,12 +503,15 @@ export default function (options) {
|
||||||
|
|
||||||
if (supportsMp3VideoAudio) {
|
if (supportsMp3VideoAudio) {
|
||||||
videoAudioCodecs.push('mp3');
|
videoAudioCodecs.push('mp3');
|
||||||
|
}
|
||||||
|
|
||||||
// PS4 fails to load HLS with mp3 audio
|
// Safari supports mp3 with HLS, but only in mpegts container, and the supportsMp3VideoAudio will return false.
|
||||||
if (!browser.ps4) {
|
if (browser.safari || (supportsMp3VideoAudio && !browser.ps4)) {
|
||||||
hlsInTsVideoAudioCodecs.push('mp3');
|
hlsInTsVideoAudioCodecs.push('mp3');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Most browsers won't support mp3 with HLS, so this is usually false, but just in case.
|
||||||
|
if (canPlayMp3VideoAudioInHls) {
|
||||||
hlsInFmp4VideoAudioCodecs.push('mp3');
|
hlsInFmp4VideoAudioCodecs.push('mp3');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -515,14 +547,9 @@ export default function (options) {
|
||||||
hlsInFmp4VideoAudioCodecs.push('mp2');
|
hlsInFmp4VideoAudioCodecs.push('mp2');
|
||||||
}
|
}
|
||||||
|
|
||||||
let supportsDts = options.supportsDts;
|
let supportsDts = appSettings.enableDts() || options.supportsDts;
|
||||||
if (supportsDts == null) {
|
if (supportsDts == null) {
|
||||||
supportsDts = browser.tizen || browser.web0sVersion || videoTestElement.canPlayType('video/mp4; codecs="dts-"').replace(/no/, '') || videoTestElement.canPlayType('video/mp4; codecs="dts+"').replace(/no/, '');
|
supportsDts = canPlayDts(videoTestElement);
|
||||||
|
|
||||||
// DTS audio is not supported by Samsung TV 2018+ (Tizen 4.0+) and LG TV 2020-2022 (webOS 5.0, 6.0 and 22) models
|
|
||||||
if (browser.tizenVersion >= 4 || (browser.web0sVersion >= 5 && browser.web0sVersion < 23)) {
|
|
||||||
supportsDts = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (supportsDts) {
|
if (supportsDts) {
|
||||||
|
@ -535,7 +562,7 @@ export default function (options) {
|
||||||
videoAudioCodecs.push('pcm_s24le');
|
videoAudioCodecs.push('pcm_s24le');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.supportsTrueHd) {
|
if (appSettings.enableTrueHd() || options.supportsTrueHd) {
|
||||||
videoAudioCodecs.push('truehd');
|
videoAudioCodecs.push('truehd');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,48 +1,74 @@
|
||||||
import listView from '../components/listview/listview';
|
import { getPlaylistsApi } from '@jellyfin/sdk/lib/utils/api/playlists-api';
|
||||||
|
|
||||||
function getFetchPlaylistItemsFn(itemId) {
|
import ServerConnections from 'components/ServerConnections';
|
||||||
|
import listView from 'components/listview/listview';
|
||||||
|
import { toApi } from 'utils/jellyfin-apiclient/compat';
|
||||||
|
|
||||||
|
function getFetchPlaylistItemsFn(apiClient, itemId) {
|
||||||
return function () {
|
return function () {
|
||||||
const query = {
|
const query = {
|
||||||
Fields: 'PrimaryImageAspectRatio',
|
Fields: 'PrimaryImageAspectRatio',
|
||||||
EnableImageTypes: 'Primary,Backdrop,Banner,Thumb',
|
EnableImageTypes: 'Primary,Backdrop,Banner,Thumb',
|
||||||
UserId: ApiClient.getCurrentUserId()
|
UserId: apiClient.getCurrentUserId()
|
||||||
};
|
};
|
||||||
return ApiClient.getJSON(ApiClient.getUrl(`Playlists/${itemId}/Items`, query));
|
return apiClient.getJSON(apiClient.getUrl(`Playlists/${itemId}/Items`, query));
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function getItemsHtmlFn(itemId) {
|
function getItemsHtmlFn(playlistId, isEditable = false) {
|
||||||
return function (items) {
|
return function (items) {
|
||||||
return listView.getListViewHtml({
|
return listView.getListViewHtml({
|
||||||
items: items,
|
items,
|
||||||
showIndex: false,
|
showIndex: false,
|
||||||
showRemoveFromPlaylist: true,
|
|
||||||
playFromHere: true,
|
playFromHere: true,
|
||||||
action: 'playallfromhere',
|
action: 'playallfromhere',
|
||||||
smallIcon: true,
|
smallIcon: true,
|
||||||
dragHandle: true,
|
dragHandle: isEditable,
|
||||||
playlistId: itemId
|
playlistId
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function init(page, item) {
|
async function init(page, item) {
|
||||||
|
const apiClient = ServerConnections.getApiClient(item.ServerId);
|
||||||
|
const api = toApi(apiClient);
|
||||||
|
|
||||||
|
let isEditable = false;
|
||||||
|
const { data } = await getPlaylistsApi(api)
|
||||||
|
.getPlaylistUser({
|
||||||
|
playlistId: item.Id,
|
||||||
|
userId: apiClient.getCurrentUserId()
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
// If a user doesn't have access, then the request will 404 and throw
|
||||||
|
console.info('[PlaylistViewer] Failed to fetch playlist permissions', err);
|
||||||
|
return { data: {} };
|
||||||
|
});
|
||||||
|
isEditable = !!data.CanEdit;
|
||||||
|
|
||||||
const elem = page.querySelector('#childrenContent .itemsContainer');
|
const elem = page.querySelector('#childrenContent .itemsContainer');
|
||||||
elem.classList.add('vertical-list');
|
elem.classList.add('vertical-list');
|
||||||
elem.classList.remove('vertical-wrap');
|
elem.classList.remove('vertical-wrap');
|
||||||
elem.enableDragReordering(true);
|
elem.enableDragReordering(isEditable);
|
||||||
elem.fetchData = getFetchPlaylistItemsFn(item.Id);
|
elem.fetchData = getFetchPlaylistItemsFn(apiClient, item.Id);
|
||||||
elem.getItemsHtml = getItemsHtmlFn(item.Id);
|
elem.getItemsHtml = getItemsHtmlFn(item.Id, isEditable);
|
||||||
|
}
|
||||||
|
|
||||||
|
function refresh(page) {
|
||||||
|
page.querySelector('#childrenContent').classList.add('verticalSection-extrabottompadding');
|
||||||
|
page.querySelector('#childrenContent .itemsContainer').refreshItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
function render(page, item) {
|
function render(page, item) {
|
||||||
if (!page.playlistInit) {
|
if (!page.playlistInit) {
|
||||||
page.playlistInit = true;
|
page.playlistInit = true;
|
||||||
init(page, item);
|
init(page, item)
|
||||||
|
.finally(() => {
|
||||||
|
refresh(page);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
refresh(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
page.querySelector('#childrenContent').classList.add('verticalSection-extrabottompadding');
|
|
||||||
page.querySelector('#childrenContent .itemsContainer').refreshItems();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const PlaylistViewer = {
|
const PlaylistViewer = {
|
||||||
|
|
|
@ -132,6 +132,32 @@ class AppSettings {
|
||||||
return toBoolean(this.get('limitSupportedVideoResolution'), false);
|
return toBoolean(this.get('limitSupportedVideoResolution'), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get or set 'Enable DTS' state.
|
||||||
|
* @param {boolean|undefined} val - Flag to enable 'Enable DTS' or undefined.
|
||||||
|
* @return {boolean} 'Enable DTS' state.
|
||||||
|
*/
|
||||||
|
enableDts(val) {
|
||||||
|
if (val !== undefined) {
|
||||||
|
return this.set('enableDts', val.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
return toBoolean(this.get('enableDts'), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get or set 'Enable TrueHD' state.
|
||||||
|
* @param {boolean|undefined} val - Flag to enable 'Enable TrueHD' or undefined.
|
||||||
|
* @return {boolean} 'Enable TrueHD' state.
|
||||||
|
*/
|
||||||
|
enableTrueHd(val) {
|
||||||
|
if (val !== undefined) {
|
||||||
|
return this.set('enableTrueHd', val.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
return toBoolean(this.get('enableTrueHd'), false);
|
||||||
|
}
|
||||||
|
|
||||||
set(name, value, userId) {
|
set(name, value, userId) {
|
||||||
const currentValue = this.get(name, userId);
|
const currentValue = this.get(name, userId);
|
||||||
localStorage.setItem(this.#getKey(name, userId), value);
|
localStorage.setItem(this.#getKey(name, userId), value);
|
||||||
|
|
|
@ -197,7 +197,7 @@
|
||||||
"HeaderSelectTranscodingPathHelp": "تصفح أو أدخل المسار الذي ترغب أن يُستخدم لملفات التشفير البيني. يجب أن يكون هذا المجلد قابل للكتابة فيه.",
|
"HeaderSelectTranscodingPathHelp": "تصفح أو أدخل المسار الذي ترغب أن يُستخدم لملفات التشفير البيني. يجب أن يكون هذا المجلد قابل للكتابة فيه.",
|
||||||
"HeaderSendMessage": "أرسل رسالة",
|
"HeaderSendMessage": "أرسل رسالة",
|
||||||
"HeaderServerSettings": "إعدادات الخادم",
|
"HeaderServerSettings": "إعدادات الخادم",
|
||||||
"HeaderSetupLibrary": "ضبط مكتبة المحتوى الخاصة بك",
|
"HeaderSetupLibrary": "ضبط مكاتب المحتوى الخاصة بك",
|
||||||
"HeaderSortBy": "ترتيب حسب",
|
"HeaderSortBy": "ترتيب حسب",
|
||||||
"HeaderSortOrder": "تسلسل الترتيب",
|
"HeaderSortOrder": "تسلسل الترتيب",
|
||||||
"HeaderSpecialEpisodeInfo": "معلومات الحلقة الخاصة",
|
"HeaderSpecialEpisodeInfo": "معلومات الحلقة الخاصة",
|
||||||
|
@ -255,7 +255,7 @@
|
||||||
"LabelCollection": "المجموعة",
|
"LabelCollection": "المجموعة",
|
||||||
"LabelCommunityRating": "تقييم الجمهور",
|
"LabelCommunityRating": "تقييم الجمهور",
|
||||||
"LabelContentType": "نوع المحتوى",
|
"LabelContentType": "نوع المحتوى",
|
||||||
"LabelCountry": "البلد",
|
"LabelCountry": "البلد/المنطقة",
|
||||||
"LabelCurrentPassword": "كلمة السر الحالية",
|
"LabelCurrentPassword": "كلمة السر الحالية",
|
||||||
"LabelCustomCertificatePath": "مسار شهادة SSL المخصص",
|
"LabelCustomCertificatePath": "مسار شهادة SSL المخصص",
|
||||||
"LabelCustomCertificatePathHelp": "مسار ملف PKCS # 12 يحتوي على شهادة ومفتاح خاص لتمكين دعم TLS على مجال مخصص.",
|
"LabelCustomCertificatePathHelp": "مسار ملف PKCS # 12 يحتوي على شهادة ومفتاح خاص لتمكين دعم TLS على مجال مخصص.",
|
||||||
|
@ -527,7 +527,7 @@
|
||||||
"MessagePasswordResetForUsers": "تم إعادة تعيين كلمات المرور للمستخدمين التاليين. يمكنهم الآن تسجيل الدخول باستخدام رموز الـPIN التي تم استخدامها لإعادة الضبط.",
|
"MessagePasswordResetForUsers": "تم إعادة تعيين كلمات المرور للمستخدمين التاليين. يمكنهم الآن تسجيل الدخول باستخدام رموز الـPIN التي تم استخدامها لإعادة الضبط.",
|
||||||
"MessagePleaseEnsureInternetMetadata": "الرجاء التأكد من أن إمكانية إنزال واصفات البيانات من الإنترنت ممكنة.",
|
"MessagePleaseEnsureInternetMetadata": "الرجاء التأكد من أن إمكانية إنزال واصفات البيانات من الإنترنت ممكنة.",
|
||||||
"MessagePluginConfigurationRequiresLocalAccess": "لضبط هذا البرنامج المساعد ، يرجى تسجيل الدخول إلى الخادم المحلي الخاص بك مباشرة.",
|
"MessagePluginConfigurationRequiresLocalAccess": "لضبط هذا البرنامج المساعد ، يرجى تسجيل الدخول إلى الخادم المحلي الخاص بك مباشرة.",
|
||||||
"MessagePluginInstallDisclaimer": "تحذير: تنصيب الملحقات التي بناها أعضاء مجتمع Jellyfin هي طريقة رائعة لتحسين متعة استخدام Jellyfin عن طريق أضافة مزايا وخدمات الجديدة. ولكن تنصيب ملحقات من مصادر ثالثة تحمل بعظ الخطورة.\nقبل تثبيت الملحقات، نرجو أخذ العلم بالآثار التي قد تلحقها بخادم Jellyfin الخاص بك، مثل أوقات أطولة لتمشيط مكتبتك، والعمليات الخلفية الإضافية وتقليل استقرار نظامك.",
|
"MessagePluginInstallDisclaimer": "تحذير: تنصيب مكونات إضافية من مصادر طرف ثالث تحمل بعض المخاطر. قد تتضمن بعض البرمجيات الضارة، وقد تتغير في أي وقت. فقط قم بتنصيب المكونات الإضافية من مصدر تثق به، يرجى أخذ العلم بالآثار المحتملة التي قد تلحقها، مثل أوقات أطول لتمشيط مكتبتك، والعمليات الخلفية الإضافية.",
|
||||||
"MessageReenableUser": "أنظر أدناه لإعادة التفعيل",
|
"MessageReenableUser": "أنظر أدناه لإعادة التفعيل",
|
||||||
"MessageTheFollowingLocationWillBeRemovedFromLibrary": "مكان الوسائط التالي سيزال من مكتبة Jellyfin الخاصة بك",
|
"MessageTheFollowingLocationWillBeRemovedFromLibrary": "مكان الوسائط التالي سيزال من مكتبة Jellyfin الخاصة بك",
|
||||||
"MessageUnableToConnectToServer": "لم نستطع الاتصال إلى الخادم المختار في الوقت الحالي. الرجاء التأكد من أنه يعمل ثم المحاولة مرة أخرى.",
|
"MessageUnableToConnectToServer": "لم نستطع الاتصال إلى الخادم المختار في الوقت الحالي. الرجاء التأكد من أنه يعمل ثم المحاولة مرة أخرى.",
|
||||||
|
@ -1085,7 +1085,7 @@
|
||||||
"Record": "سجل",
|
"Record": "سجل",
|
||||||
"RecentlyWatched": "شاهدت مؤخرا",
|
"RecentlyWatched": "شاهدت مؤخرا",
|
||||||
"Rate": "معدل",
|
"Rate": "معدل",
|
||||||
"QuickConnectAuthorizeSuccess": "تمت الموافقة على الطلب",
|
"QuickConnectAuthorizeSuccess": "تمت المصادقة على الجهاز بنجاح!",
|
||||||
"QuickConnectAuthorizeCode": "أدخل الرمز {0} لتسجيل الدخول",
|
"QuickConnectAuthorizeCode": "أدخل الرمز {0} لتسجيل الدخول",
|
||||||
"QuickConnectActivationSuccessful": "تم التفعيل بنجاح",
|
"QuickConnectActivationSuccessful": "تم التفعيل بنجاح",
|
||||||
"Quality": "الجودة",
|
"Quality": "الجودة",
|
||||||
|
@ -1553,7 +1553,7 @@
|
||||||
"LabelColorPrimaries": "الألوان الأساسية",
|
"LabelColorPrimaries": "الألوان الأساسية",
|
||||||
"HeaderSyncPlayPlaybackSettings": "التشغيل",
|
"HeaderSyncPlayPlaybackSettings": "التشغيل",
|
||||||
"HeaderNewRepository": "مستودع جديد",
|
"HeaderNewRepository": "مستودع جديد",
|
||||||
"DirectPlayHelp": "الملف المصدر متوافق تمامًا مع هذا العميل ، وتستقبل الجلسة الملف بدون تعديلات.",
|
"DirectPlayHelp": "الملف المصدر متوافق تمامًا مع هذا العميل والجلسة تستقبل الملف بدون تعديلات.",
|
||||||
"LabelDashboardTheme": "قالب لوحة تحكم الخادم",
|
"LabelDashboardTheme": "قالب لوحة تحكم الخادم",
|
||||||
"LabelTonemappingParamHelp": "ضبط خوارزمية تعيين النغمة. القيم الموصى بها والافتراضية هي NaN. اتركه فارغًا بشكل عام.",
|
"LabelTonemappingParamHelp": "ضبط خوارزمية تعيين النغمة. القيم الموصى بها والافتراضية هي NaN. اتركه فارغًا بشكل عام.",
|
||||||
"LabelTonemappingParam": "معلمة تعيين النغمة",
|
"LabelTonemappingParam": "معلمة تعيين النغمة",
|
||||||
|
@ -1564,7 +1564,7 @@
|
||||||
"LabelAutomaticallyAddToCollection": "إضافة إلى المجموعة تلقائيا",
|
"LabelAutomaticallyAddToCollection": "إضافة إلى المجموعة تلقائيا",
|
||||||
"Console": "وحدة التحكم",
|
"Console": "وحدة التحكم",
|
||||||
"Casual": "غير رسمي",
|
"Casual": "غير رسمي",
|
||||||
"AllowTonemappingHelp": "يمكن أن يؤدي تعيين النغمة إلى تحويل النطاق الديناميكي لمقاطع الفيديو من HDR إلى SDR مع الحفاظ على تفاصيل الصورة والألوان. هذه بينات مهمة جدًا لتمثيل المشهد الأصلي بشكل وفي للمقطع ألأصلي. حاليًا يعمل هذا ألاعداد فقط مع مقاطع فيديو HDR10 أو HLG. يتطلب هذا ألأعداد وقت تشغيل OpenCL أو CUDA.",
|
"AllowTonemappingHelp": "يمكن أن يؤدي تعيين النغمة إلى تحويل النطاق الديناميكي لمقاطع الفيديو من HDR إلى SDR مع الحفاظ على تفاصيل الصورة والألوان. هذه بينات مهمة جدًا لتمثيل المشهد الأصلي بشكل وفي للمقطع ألأصلي. حاليًا يعمل هذا ألاعداد فقط مع مقاطع فيديو HDR10 أو HLG. يتطلب هذا ألأعداد وقت تشغيل GPGPU.",
|
||||||
"RefFramesNotSupported": "الإطارات المرجعية غير مدعومة",
|
"RefFramesNotSupported": "الإطارات المرجعية غير مدعومة",
|
||||||
"InterlacedVideoNotSupported": "الفيديو المتشابك غير مدعوم",
|
"InterlacedVideoNotSupported": "الفيديو المتشابك غير مدعوم",
|
||||||
"AnamorphicVideoNotSupported": "لا يتم دعم الفيديو ذي الصورة المشوهة",
|
"AnamorphicVideoNotSupported": "لا يتم دعم الفيديو ذي الصورة المشوهة",
|
||||||
|
@ -1663,9 +1663,9 @@
|
||||||
"MediaInfoVideoRangeType": "نوع نطاق الفيديو",
|
"MediaInfoVideoRangeType": "نوع نطاق الفيديو",
|
||||||
"LabelVideoRangeType": "نوع نطاق الفيديو",
|
"LabelVideoRangeType": "نوع نطاق الفيديو",
|
||||||
"VideoRangeTypeNotSupported": "نوع نطاق الفيديو غير مدعوم",
|
"VideoRangeTypeNotSupported": "نوع نطاق الفيديو غير مدعوم",
|
||||||
"LabelVppTonemappingContrastHelp": "تطبيق كسب التباين في تعيين نغمة VPP. القيم الموصى بها والافتراضية هي 1.2 و 1.",
|
"LabelVppTonemappingContrastHelp": "تطبيق كسب التباين في تعيين نغمة VPP. القيم الموصى بها والافتراضية هي 1.",
|
||||||
"LabelVppTonemappingContrast": "كسب تباين تعيين نغمة VPP",
|
"LabelVppTonemappingContrast": "كسب تباين تعيين نغمة VPP",
|
||||||
"LabelVppTonemappingBrightnessHelp": "تطبيق كسب السطوع في تعيين نغمة VPP. كل من القيم الموصى بها والافتراضية هي 0.",
|
"LabelVppTonemappingBrightnessHelp": "تطبيق كسب السطوع في تعيين نغمة VPP. القيم الموصى بها والافتراضية هي 0.",
|
||||||
"LabelVppTonemappingBrightness": "كسب سطوع رسم الخرائط VPP نغمة",
|
"LabelVppTonemappingBrightness": "كسب سطوع رسم الخرائط VPP نغمة",
|
||||||
"ScreenResolution": "تعيين مسار الترجمة على أساس البند السابق",
|
"ScreenResolution": "تعيين مسار الترجمة على أساس البند السابق",
|
||||||
"RememberSubtitleSelectionsHelp": "تعيين مسار الترجمة على أساس البند السابق.",
|
"RememberSubtitleSelectionsHelp": "تعيين مسار الترجمة على أساس البند السابق.",
|
||||||
|
@ -1715,14 +1715,60 @@
|
||||||
"LogLevel.None": "لا شيئ",
|
"LogLevel.None": "لا شيئ",
|
||||||
"MenuOpen": "أفتح القائمة",
|
"MenuOpen": "أفتح القائمة",
|
||||||
"AllowSegmentDeletion": "ألغاء القسم",
|
"AllowSegmentDeletion": "ألغاء القسم",
|
||||||
"AllowSegmentDeletionHelp": "ألغي الأقسام القديمة بعد أن يتم أرسالها للعميل. هذا يساهم بمنع أن يتم تخزين الملف ألذي تم أعادة ترميزه. ستعمل هذه الميزة فقط عندما يتم كبح الترميز. قم بأيقاف هذا الأعداد في حال واجهت مشاكل بتشغيل ألصوت أو ألفديو.",
|
"AllowSegmentDeletionHelp": "ألغي الأقسام القديمة بعد أن يتم تحميلها من قبل العميل. هذا يساهم بمنع أن يتم تخزين الملف ألذي تم أعادة ترميزه بالكامل. قم بأيقاف هذا الأعداد في حال واجهت مشاكل بتشغيل الصوت أو الفيديو.",
|
||||||
"LabelThrottleDelaySeconds": "أكبح بعد",
|
"LabelThrottleDelaySeconds": "أكبح بعد",
|
||||||
"LabelThrottleDelaySecondsHelp": "ألزمن بالثواني الذي سيتم بعده كبح أعادة الترميز. يجب أن يكون الزمن طويلاً بكفاية ليحافظ العميل على مخزون صحي. يجب أن يكون كفح أعادة الترميز مفعلاً ليعمل هذا ألاعاداد.",
|
"LabelThrottleDelaySecondsHelp": "ألزمن بالثواني الذي سيتم بعده كبح أعادة الترميز. يجب أن يكون الزمن طويلاً بكفاية ليحافظ العميل على مخزون صحي. يجب أن يكون كفح أعادة الترميز مفعلاً ليعمل هذا ألاعاداد.",
|
||||||
"LabelSegmentKeepSeconds": "الممدة للأحتفاظ على الشرائح",
|
"LabelSegmentKeepSeconds": "الممدة للأحتفاظ على الشرائح",
|
||||||
"LabelEnableAudioVbrHelp": "معدل البِت المتغير ينتج على جودة أفضل مقارنة بمعدل البت المتوسط، ولكن في بعض الحالات النادرة قد يسبب مشاكل في التخزين المؤقت والتوافق.",
|
"LabelEnableAudioVbrHelp": "معدل البِت المتغير ينتج على جودة أفضل مقارنة بمعدل البت المتوسط، ولكن في بعض الحالات النادرة قد يسبب مشاكل في التخزين المؤقت والتوافق.",
|
||||||
"LabelSegmentKeepSecondsHelp": "الزمن بالثواني الذي يجب الاحتفاظ به للشرائح قبل أن يتم الكتابة فوقها. يجب أن يكون أكبر من \"بعد الخنق\". يعمل هذا ألأعداد فقط إذا كان حذف الشرائح مفعلًا.",
|
"LabelSegmentKeepSecondsHelp": "الزمن بالثواني الذي يجب الاحتفاظ به للشرائح بعد أن يتم تحميلها من قبل العميل. يعمل هذا ألأعداد فقط إذا كان حذف الشرائح مفعلًا.",
|
||||||
"AiTranslated": "مترجمة من قبل ذكاء اسطناعي",
|
"AiTranslated": "مترجمة من قبل ذكاء اسطناعي",
|
||||||
"SelectAudioNormalizationHelp": "كسب الالبوم-تعديل الصوت لكل مسار لكي يعملون بنفس مستوى- كسب الالبوم- تعديل مستوى الصوت لكل المسارات في البوم واحد مع ابقاء على النطاق الديناميكي للألبوم.",
|
"SelectAudioNormalizationHelp": "كسب الالبوم-تعديل الصوت لكل مسار لكي يعملون بنفس مستوى- كسب الالبوم- تعديل مستوى الصوت لكل المسارات في البوم واحد مع ابقاء على النطاق الديناميكي للألبوم.",
|
||||||
"ButtonEditUser": "تعديل مستخدم",
|
"ButtonEditUser": "تعديل مستخدم",
|
||||||
"AllowSubtitleManagement": "اسمح لهذا المستخدم تعديل الترجمات"
|
"AllowSubtitleManagement": "اسمح لهذا المستخدم تعديل الترجمات",
|
||||||
|
"HeaderDeleteSeries": "حذف مسلسل",
|
||||||
|
"DeleteEntireSeries": "حذف {0} حلقات",
|
||||||
|
"DeleteSeries": "حذف المسلسل",
|
||||||
|
"HeaderEpisodesStatus": "حالة الحلقات",
|
||||||
|
"LabelSelectAudioNormalization": "تطبيع الصوت",
|
||||||
|
"DeleteEpisode": "حذف الحلقة",
|
||||||
|
"EnableLibrary": "إتاحة المكتبة",
|
||||||
|
"LabelSyncPlayNoGroups": "لا توجد مجموعات متاحة",
|
||||||
|
"DeleteName": "حذف {0}",
|
||||||
|
"LabelServerVersion": "نسخة الخادم",
|
||||||
|
"LabelWebVersion": "نسخة الويب",
|
||||||
|
"LabelBuildVersion": "نسخة الإصدار",
|
||||||
|
"SavePassword": "حفظ كلمة المرور",
|
||||||
|
"SubtitleBlack": "أسود",
|
||||||
|
"SubtitleWhite": "أبيض",
|
||||||
|
"UserMenu": "قائمة المستخدم",
|
||||||
|
"LabelScanBehavior": "سلوك المسح",
|
||||||
|
"PriorityHigh": "عالي",
|
||||||
|
"PriorityBelowNormal": "تحت الطبيعي",
|
||||||
|
"PriorityNormal": "طبيعي",
|
||||||
|
"PriorityAboveNormal": "فوق الطبيعي",
|
||||||
|
"LabelProcessPriority": "أولوية المعالجة",
|
||||||
|
"PriorityIdle": "خامل",
|
||||||
|
"PlaybackError.PLAYER_ERROR": "التشغيل فشل لخطأ في مشغل الوسائط.",
|
||||||
|
"Studio": "الأستيديو",
|
||||||
|
"SubtitleYellow": "أصفر",
|
||||||
|
"PlaybackError.NETWORK_ERROR": "التشغيل فشل لخطأ في الشبكة.",
|
||||||
|
"UnknownError": "حدث خطأ غير معلوم.",
|
||||||
|
"Select": "اختيار",
|
||||||
|
"SubtitleRed": "أحمر",
|
||||||
|
"PasswordRequiredForAdmin": "يجب توفر كلمة مرور لحسابات المسؤول.",
|
||||||
|
"SecondarySubtitles": "الترجمات الثانوية",
|
||||||
|
"PlaybackError.NO_MEDIA_ERROR": "غير قايل لإيجاد مصدر موثق للوسائط لللتشغيل.",
|
||||||
|
"PlaybackError.SERVER_ERROR": "التشغيل فشل لخطأ في الخادم.",
|
||||||
|
"PlaybackError.MEDIA_NOT_SUPPORTED": "التشغيل فشل لأن الوسائط غير مدعومة من هذا العميل.",
|
||||||
|
"PlaybackError.NotAllowed": "تشغيل هذه الوسائط غير مسموح.",
|
||||||
|
"LabelJpegQuality": "جودة JPEG",
|
||||||
|
"SubtitleGreen": "أخضر",
|
||||||
|
"SearchResultsEmpty": "نأسف! لا يوجد نتاج لـ \"{0}\"",
|
||||||
|
"SubtitleLightGray": "رمادي فاتح",
|
||||||
|
"Short": "قصير",
|
||||||
|
"SubtitleGray": "رمادي",
|
||||||
|
"SubtitleBlue": "أزرق",
|
||||||
|
"AllowContentWithTagsHelp": "اعرض الوسائط التي تحتوي على الأقل واحدة من الاصناف المحددة.",
|
||||||
|
"AirPlay": "ايربلاي",
|
||||||
|
"Author": "الكاتب"
|
||||||
}
|
}
|
||||||
|
|
|
@ -749,7 +749,7 @@
|
||||||
"DashboardArchitecture": "Arquitectura: {0}",
|
"DashboardArchitecture": "Arquitectura: {0}",
|
||||||
"DailyAt": "Diariament a {0}",
|
"DailyAt": "Diariament a {0}",
|
||||||
"ClearQueue": "Esborra la cua",
|
"ClearQueue": "Esborra la cua",
|
||||||
"Bwdif": "BWDIF",
|
"Bwdif": "Bob Weaver DeInterlacing Filter (BWDIF)",
|
||||||
"ButtonPlayer": "Reproductor",
|
"ButtonPlayer": "Reproductor",
|
||||||
"ButtonCast": "Transmetre a dispositiu",
|
"ButtonCast": "Transmetre a dispositiu",
|
||||||
"ApiKeysCaption": "Llista de les claus API activades actualment",
|
"ApiKeysCaption": "Llista de les claus API activades actualment",
|
||||||
|
@ -864,7 +864,7 @@
|
||||||
"HeaderSelectFallbackFontPath": "Seleccioneu la ruta de la carpeta de fonts",
|
"HeaderSelectFallbackFontPath": "Seleccioneu la ruta de la carpeta de fonts",
|
||||||
"Yesterday": "Ahir",
|
"Yesterday": "Ahir",
|
||||||
"Yes": "Si",
|
"Yes": "Si",
|
||||||
"Yadif": "YADIF",
|
"Yadif": "Yet Another DeInterlacing Filter (YADIF)",
|
||||||
"XmlTvPathHelp": "Una ruta a un arxiu XMLTV. Jellyfin llegirà aquesta imatge i comprovar periòdicament si hi ha actualitzacions. Vostè és responsable de crear i actualitzar l'arxiu.",
|
"XmlTvPathHelp": "Una ruta a un arxiu XMLTV. Jellyfin llegirà aquesta imatge i comprovar periòdicament si hi ha actualitzacions. Vostè és responsable de crear i actualitzar l'arxiu.",
|
||||||
"XmlDocumentAttributeListHelp": "Aquests atributs s'apliquen a l'element arrel de cada resposta XML.",
|
"XmlDocumentAttributeListHelp": "Aquests atributs s'apliquen a l'element arrel de cada resposta XML.",
|
||||||
"Writers": "Escriptors",
|
"Writers": "Escriptors",
|
||||||
|
@ -1335,7 +1335,7 @@
|
||||||
"LabelAudioChannels": "Canals d'àudio",
|
"LabelAudioChannels": "Canals d'àudio",
|
||||||
"LabelAudioBitrate": "Taxa de bits d'àudio",
|
"LabelAudioBitrate": "Taxa de bits d'àudio",
|
||||||
"LabelAudioBitDepth": "Profunditat de bits d'àudio",
|
"LabelAudioBitDepth": "Profunditat de bits d'àudio",
|
||||||
"LabelAppNameExample": "Exemple: Sickbeard, Sonarr",
|
"LabelAppNameExample": "Un nom llegible per persones per identificar les claus de l'API. Aquesta configuració no afectarà la funcionalitat.",
|
||||||
"LabelAppName": "Nom de l'aplicació",
|
"LabelAppName": "Nom de l'aplicació",
|
||||||
"LabelAllowHWTranscoding": "Permetre la transcodificació de maquinari",
|
"LabelAllowHWTranscoding": "Permetre la transcodificació de maquinari",
|
||||||
"LabelAllowedRemoteAddressesMode": "La manera de filtre d'adreces IP remota",
|
"LabelAllowedRemoteAddressesMode": "La manera de filtre d'adreces IP remota",
|
||||||
|
@ -1863,5 +1863,25 @@
|
||||||
"DeleteLyrics": "Esborrar lletres",
|
"DeleteLyrics": "Esborrar lletres",
|
||||||
"HeaderNoLyrics": "No s'ha trobat cap lletra",
|
"HeaderNoLyrics": "No s'ha trobat cap lletra",
|
||||||
"Lyrics": "Lletres",
|
"Lyrics": "Lletres",
|
||||||
"ViewLyrics": "Veure lletres"
|
"ViewLyrics": "Veure lletres",
|
||||||
|
"SavePassword": "Desar contrasenya",
|
||||||
|
"EnableDts": "Habilitar DTS (DCA)",
|
||||||
|
"PlaylistError.AddFailed": "S'ha produït un error en afegir a la llista de reproducció",
|
||||||
|
"PlaylistError.CreateFailed": "S'ha produït un error en crear la llista de reproducció",
|
||||||
|
"HeaderVideoAdvanced": "Vídeo Avançat",
|
||||||
|
"Author": "Autor",
|
||||||
|
"Colorist": "Colorista",
|
||||||
|
"CoverArtist": "Artista de portada",
|
||||||
|
"Creator": "Creador",
|
||||||
|
"Editor": "Editor",
|
||||||
|
"EnableDtsHelp": "Habiliteu-lo només si el vostre dispositiu és compatible amb DTS o està connectat a un receptor d'àudio compatible, en cas contrari, pot provocar un error de reproducció.",
|
||||||
|
"EnableTrueHd": "Habilitar TrueHD",
|
||||||
|
"EnableTrueHdHelp": "Habiliteu-lo només si el vostre dispositiu és compatible amb TrueHD o està connectat a un receptor d'àudio compatible, en cas contrari, pot provocar un error de reproducció.",
|
||||||
|
"Illustrator": "Il·lustrador",
|
||||||
|
"Translator": "Traductor",
|
||||||
|
"PlaylistPublic": "Permetre accés públic",
|
||||||
|
"PlaylistPublicDescription": "Permetre que qualsevol usuari registrat vegi aquesta llista de reproducció.",
|
||||||
|
"HeaderLyricDownloads": "Descàrregues de lletres",
|
||||||
|
"SaveLyricsIntoMediaFolders": "Desa la lletra a les carpetes multimèdia",
|
||||||
|
"SaveLyricsIntoMediaFoldersHelp": "Emmagatzemar les lletres al costat dels fitxers d'àudio permetrà gestionar-les més fàcilment."
|
||||||
}
|
}
|
||||||
|
|
|
@ -303,7 +303,7 @@
|
||||||
"HeaderSendMessage": "Poslat zprávu",
|
"HeaderSendMessage": "Poslat zprávu",
|
||||||
"HeaderSeriesOptions": "Nastavení seriálu",
|
"HeaderSeriesOptions": "Nastavení seriálu",
|
||||||
"HeaderServerSettings": "Nastavení serveru",
|
"HeaderServerSettings": "Nastavení serveru",
|
||||||
"HeaderSetupLibrary": "Nastavení Vašich knihoven médií",
|
"HeaderSetupLibrary": "Nastavit knihovny médií",
|
||||||
"HeaderSortBy": "Třídit dle",
|
"HeaderSortBy": "Třídit dle",
|
||||||
"HeaderSortOrder": "Pořadí třídění",
|
"HeaderSortOrder": "Pořadí třídění",
|
||||||
"HeaderSpecialEpisodeInfo": "Infromace o speciální epizodě",
|
"HeaderSpecialEpisodeInfo": "Infromace o speciální epizodě",
|
||||||
|
@ -362,7 +362,7 @@
|
||||||
"LabelAlbumArtists": "Alba umělce",
|
"LabelAlbumArtists": "Alba umělce",
|
||||||
"LabelAllowHWTranscoding": "Povolit hardwarové překódování",
|
"LabelAllowHWTranscoding": "Povolit hardwarové překódování",
|
||||||
"LabelAppName": "Název aplikace",
|
"LabelAppName": "Název aplikace",
|
||||||
"LabelAppNameExample": "Příklad: Sickbeard, Sonarr",
|
"LabelAppNameExample": "Čitelný název pro identifikaci klíčů k API. Toto nastavení nemá vliv na funkčnost.",
|
||||||
"LabelArtists": "Umělci",
|
"LabelArtists": "Umělci",
|
||||||
"LabelArtistsHelp": "Více interpretů se odděluje pomocí středníku.",
|
"LabelArtistsHelp": "Více interpretů se odděluje pomocí středníku.",
|
||||||
"LabelAudioLanguagePreference": "Preferovaný jazyk zvuku",
|
"LabelAudioLanguagePreference": "Preferovaný jazyk zvuku",
|
||||||
|
@ -1267,7 +1267,7 @@
|
||||||
"PathNotFound": "Cesta nebyla nalezena. Zkontrolujte, zda je platná a zkuste to znovu.",
|
"PathNotFound": "Cesta nebyla nalezena. Zkontrolujte, zda je platná a zkuste to znovu.",
|
||||||
"WeeklyAt": "V {0} v {1}",
|
"WeeklyAt": "V {0} v {1}",
|
||||||
"LastSeen": "Naposledy zobrazené {0}",
|
"LastSeen": "Naposledy zobrazené {0}",
|
||||||
"Yadif": "YADIF",
|
"Yadif": "Yet Another DeInterlacing Filter (YADIF)",
|
||||||
"LabelLibraryPageSizeHelp": "Počet položek k zobrazení na stránce knihovny. Nastavte na 0 pro vypnutí stránkování.",
|
"LabelLibraryPageSizeHelp": "Počet položek k zobrazení na stránce knihovny. Nastavte na 0 pro vypnutí stránkování.",
|
||||||
"LabelLibraryPageSize": "Velikost stránky knihovny",
|
"LabelLibraryPageSize": "Velikost stránky knihovny",
|
||||||
"LabelDeinterlaceMethod": "Metoda odstranění prokládání",
|
"LabelDeinterlaceMethod": "Metoda odstranění prokládání",
|
||||||
|
@ -1371,7 +1371,7 @@
|
||||||
"LabelIconMaxResHelp": "Maximální rozlišení ikon daných vlastností 'upnp:icon'.",
|
"LabelIconMaxResHelp": "Maximální rozlišení ikon daných vlastností 'upnp:icon'.",
|
||||||
"LabelAlbumArtMaxResHelp": "Maximální rozlišení obrázku v souboru dané vlastností 'upnp:albumArtURI'.",
|
"LabelAlbumArtMaxResHelp": "Maximální rozlišení obrázku v souboru dané vlastností 'upnp:albumArtURI'.",
|
||||||
"Other": "Ostatní",
|
"Other": "Ostatní",
|
||||||
"Bwdif": "BWDIF",
|
"Bwdif": "Bob Weaver DeInterlacing Filter (BWDIF)",
|
||||||
"UseDoubleRateDeinterlacingHelp": "Toto nastavení při odstranění prokládání zdvojnásobuje snímkovou frekvenci, aby výsledné video vypadalo stejně plynule, jako při přehrávání prokládaného obsahu v televizi.",
|
"UseDoubleRateDeinterlacingHelp": "Toto nastavení při odstranění prokládání zdvojnásobuje snímkovou frekvenci, aby výsledné video vypadalo stejně plynule, jako při přehrávání prokládaného obsahu v televizi.",
|
||||||
"UseDoubleRateDeinterlacing": "Zdvojnásobit snímkovou frekvenci při odstranění prokládání",
|
"UseDoubleRateDeinterlacing": "Zdvojnásobit snímkovou frekvenci při odstranění prokládání",
|
||||||
"LabelTonemappingParamHelp": "Pro ladění algoritmu mapování tónů. Doporučená a výchozí hodnota je NaN. Obecně je pole ponecháváno prázdné.",
|
"LabelTonemappingParamHelp": "Pro ladění algoritmu mapování tónů. Doporučená a výchozí hodnota je NaN. Obecně je pole ponecháváno prázdné.",
|
||||||
|
@ -1719,7 +1719,7 @@
|
||||||
"Short": "Krátký film",
|
"Short": "Krátký film",
|
||||||
"HeaderPerformance": "Výkon",
|
"HeaderPerformance": "Výkon",
|
||||||
"LabelParallelImageEncodingLimit": "Počet paralelních kódování obrázků",
|
"LabelParallelImageEncodingLimit": "Počet paralelních kódování obrázků",
|
||||||
"LabelParallelImageEncodingLimitHelp": "Maximální počet kódování obrázků, které mohou běžet zároveň. Nastavením na 0 bude limit nastaven dle parametrů systému.",
|
"LabelParallelImageEncodingLimitHelp": "Maximální počet kódování obrázků, které mohou běžet zároveň. Nastavením na 0 bude limit nastaven dle počtu jader CPU.",
|
||||||
"LabelEnableAudioVbr": "Povolit kódování zvuku VBR",
|
"LabelEnableAudioVbr": "Povolit kódování zvuku VBR",
|
||||||
"LabelEnableAudioVbrHelp": "Proměnlivý bitový tok (VBR) nabízí lepší poměr mezi kvalitou a průměrným bitovým tokem, ale někdy může způsobit dodatečné načítání či problémy s kompatibilitou.",
|
"LabelEnableAudioVbrHelp": "Proměnlivý bitový tok (VBR) nabízí lepší poměr mezi kvalitou a průměrným bitovým tokem, ale někdy může způsobit dodatečné načítání či problémy s kompatibilitou.",
|
||||||
"Select": "Vybrat",
|
"Select": "Vybrat",
|
||||||
|
@ -1867,5 +1867,30 @@
|
||||||
"HeaderDeleteLyrics": "Odstranit texty písní",
|
"HeaderDeleteLyrics": "Odstranit texty písní",
|
||||||
"HeaderNoLyrics": "Žádné texty písní nebyly nalezeny",
|
"HeaderNoLyrics": "Žádné texty písní nebyly nalezeny",
|
||||||
"Lyrics": "Texty písní",
|
"Lyrics": "Texty písní",
|
||||||
"ViewLyrics": "Zobrazit texty písní"
|
"ViewLyrics": "Zobrazit texty písní",
|
||||||
|
"SavePassword": "Uložit heslo",
|
||||||
|
"PlaylistError.AddFailed": "Přidání do seznamu skladeb se nezdařilo",
|
||||||
|
"PlaylistError.CreateFailed": "Tvorba seznamu skladeb se nezdařila",
|
||||||
|
"EnableDts": "Povolit DTS (DCA)",
|
||||||
|
"EnableDtsHelp": "Povolte pouze pokud zařízení podporuje DTS nebo je připojeno ke kompatibilnímu AV receiveru, jinak by mohlo dojít k potížím s přehráváním.",
|
||||||
|
"EnableTrueHd": "Povolit TrueHD",
|
||||||
|
"EnableTrueHdHelp": "Povolte pouze pokud zařízení podporuje TrueHD nebo je připojeno ke kompatibilnímu AV receiveru, jinak by mohlo dojít k potížím s přehráváním.",
|
||||||
|
"HeaderVideoAdvanced": "Pokročilé video",
|
||||||
|
"PlaylistPublic": "Povolit veřejný přístup",
|
||||||
|
"PlaylistPublicDescription": "Tento seznam skladeb bude možné zobrazit i nepřihlášeným uživatelům.",
|
||||||
|
"HeaderLyricDownloads": "Stažení textů písní",
|
||||||
|
"SaveLyricsIntoMediaFolders": "Uložit texty písní do složek s médii",
|
||||||
|
"SaveLyricsIntoMediaFoldersHelp": "Uložení textů písní spolu se zvukovými souboru je snazší pro správu.",
|
||||||
|
"Author": "Autor",
|
||||||
|
"Colorist": "Kolorista",
|
||||||
|
"CoverArtist": "Obálka",
|
||||||
|
"Creator": "Tvůrce",
|
||||||
|
"Editor": "Editor",
|
||||||
|
"Illustrator": "Ilustrátor",
|
||||||
|
"Inker": "Inker",
|
||||||
|
"Letterer": "Lettrista",
|
||||||
|
"Penciller": "Výtvarník",
|
||||||
|
"Translator": "Překladatel",
|
||||||
|
"LibraryScanFanoutConcurrencyHelp": "Maximální počet souběžných úloh skenování knihovny. Nastavením na 0 bude počet dán počtem jader CPU. UPOZORNĚNÍ: Příliš vyskoý počet může způsobit problémy se síťovými souborými systémy. V takovém případě počet snižte.",
|
||||||
|
"LibraryScanFanoutConcurrency": "Maximální počet souběžných skenování knihovny"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1366,7 +1366,7 @@
|
||||||
"Poster": "Poster",
|
"Poster": "Poster",
|
||||||
"Photo": "Foto",
|
"Photo": "Foto",
|
||||||
"Other": "Sonstiges",
|
"Other": "Sonstiges",
|
||||||
"Bwdif": "BWDIF",
|
"Bwdif": "Bob Weaver DeInterlacing Filter (BWDIF)",
|
||||||
"UseDoubleRateDeinterlacingHelp": "Diese Einstellung verwendet die Halbbildrate beim Deinterlacing, oft auch als Bob-Deinterlacing bezeichnet. Dabei wird die Bildrate des Videos verdoppelt, um eine vollständige Bewegung wie beim Betrachten eines Interlaced-Video auf einem Fernseher zu erzielen.",
|
"UseDoubleRateDeinterlacingHelp": "Diese Einstellung verwendet die Halbbildrate beim Deinterlacing, oft auch als Bob-Deinterlacing bezeichnet. Dabei wird die Bildrate des Videos verdoppelt, um eine vollständige Bewegung wie beim Betrachten eines Interlaced-Video auf einem Fernseher zu erzielen.",
|
||||||
"UseDoubleRateDeinterlacing": "Verdoppelung der Bildfrequenz beim Deinterlacing",
|
"UseDoubleRateDeinterlacing": "Verdoppelung der Bildfrequenz beim Deinterlacing",
|
||||||
"LabelIconMaxResHelp": "Maximale Auflösung der Icons, die über die Eigenschaft 'upnp:icon' bereitgestellt wird.",
|
"LabelIconMaxResHelp": "Maximale Auflösung der Icons, die über die Eigenschaft 'upnp:icon' bereitgestellt wird.",
|
||||||
|
@ -1867,5 +1867,6 @@
|
||||||
"ErrorDeletingLyrics": "Es trat ein Fehler beim Löschen der Songtexte vom Server auf. Bitte stelle sicher, dass Jellyfin die notwendigen Zugriffsrechte besitzt.",
|
"ErrorDeletingLyrics": "Es trat ein Fehler beim Löschen der Songtexte vom Server auf. Bitte stelle sicher, dass Jellyfin die notwendigen Zugriffsrechte besitzt.",
|
||||||
"HeaderDeleteLyrics": "Songtexte löschen",
|
"HeaderDeleteLyrics": "Songtexte löschen",
|
||||||
"HeaderNoLyrics": "Keine Songtexte gefunden",
|
"HeaderNoLyrics": "Keine Songtexte gefunden",
|
||||||
"ViewLyrics": "Songtexte ansehen"
|
"ViewLyrics": "Songtexte ansehen",
|
||||||
|
"Author": "Autor"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1196,7 +1196,7 @@
|
||||||
"HeaderSpecialEpisodeInfo": "Special Episode Info",
|
"HeaderSpecialEpisodeInfo": "Special Episode Info",
|
||||||
"HeaderSortOrder": "Sort Order",
|
"HeaderSortOrder": "Sort Order",
|
||||||
"HeaderSortBy": "Sort By",
|
"HeaderSortBy": "Sort By",
|
||||||
"HeaderSetupLibrary": "Setup your media libraries",
|
"HeaderSetupLibrary": "Set up your media libraries",
|
||||||
"HeaderServerSettings": "Server Settings",
|
"HeaderServerSettings": "Server Settings",
|
||||||
"HeaderSeriesStatus": "Programmes Status",
|
"HeaderSeriesStatus": "Programmes Status",
|
||||||
"HeaderSeriesOptions": "Programmes Options",
|
"HeaderSeriesOptions": "Programmes Options",
|
||||||
|
@ -1249,7 +1249,7 @@
|
||||||
"NoCreatedLibraries": "Seems like you haven't created any libraries yet. {0}Would you like to create one now?{1}",
|
"NoCreatedLibraries": "Seems like you haven't created any libraries yet. {0}Would you like to create one now?{1}",
|
||||||
"AskAdminToCreateLibrary": "Ask an administrator to create a library.",
|
"AskAdminToCreateLibrary": "Ask an administrator to create a library.",
|
||||||
"PlaybackErrorNoCompatibleStream": "This client isn't compatible with the media and the server isn't sending a compatible media format.",
|
"PlaybackErrorNoCompatibleStream": "This client isn't compatible with the media and the server isn't sending a compatible media format.",
|
||||||
"AllowFfmpegThrottlingHelp": "When a transcode or remux gets far enough ahead from the current playback position, pause the process so it will consume less resources. This is most useful when watching without seeking often. Turn this off if you experience playback issues.",
|
"AllowFfmpegThrottlingHelp": "When a transcode or remux gets far enough ahead from the current playback position, pause the process so it will consume fewer resources. This is most useful when watching without seeking often. Turn this off if you experience playback issues.",
|
||||||
"AllowFfmpegThrottling": "Throttle Transcodes",
|
"AllowFfmpegThrottling": "Throttle Transcodes",
|
||||||
"OnApplicationStartup": "On application startup",
|
"OnApplicationStartup": "On application startup",
|
||||||
"EveryXHours": "Every {0} hours",
|
"EveryXHours": "Every {0} hours",
|
||||||
|
@ -1860,5 +1860,13 @@
|
||||||
"PlaybackError.SERVER_ERROR": "Playback failed due to a server error.",
|
"PlaybackError.SERVER_ERROR": "Playback failed due to a server error.",
|
||||||
"PlaybackError.NotAllowed": "Playback of this media is not allowed.",
|
"PlaybackError.NotAllowed": "Playback of this media is not allowed.",
|
||||||
"PlaybackError.RateLimitExceeded": "This media cannot be played at this time due to rate limits.",
|
"PlaybackError.RateLimitExceeded": "This media cannot be played at this time due to rate limits.",
|
||||||
"Lyric": "Lyric"
|
"Lyric": "Lyric",
|
||||||
|
"SavePassword": "Save Password",
|
||||||
|
"ViewLyrics": "View lyrics",
|
||||||
|
"ConfirmDeleteLyrics": "Deleting these lyrics will delete them from both the file system and your media library. Are you sure you wish to continue?",
|
||||||
|
"DeleteLyrics": "Delete lyrics",
|
||||||
|
"ErrorDeletingLyrics": "There was an error deleting the lyrics from the server. Please check that Jellyfin has write access to the media folder and try again.",
|
||||||
|
"HeaderDeleteLyrics": "Delete Lyrics",
|
||||||
|
"HeaderNoLyrics": "No lyrics found",
|
||||||
|
"Lyrics": "Lyrics"
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
"AllowContentWithTagsHelp": "Only show media with at least one of the specified tags.",
|
"AllowContentWithTagsHelp": "Only show media with at least one of the specified tags.",
|
||||||
"AllowSubtitleManagement": "Allow this user to edit subtitles",
|
"AllowSubtitleManagement": "Allow this user to edit subtitles",
|
||||||
"AllowFfmpegThrottling": "Throttle Transcodes",
|
"AllowFfmpegThrottling": "Throttle Transcodes",
|
||||||
"AllowFfmpegThrottlingHelp": "When a transcode or remux gets far enough ahead from the current playback position, pause the process so it will consume less resources. This is most useful when watching without seeking often. Turn this off if you experience playback issues.",
|
"AllowFfmpegThrottlingHelp": "When a transcode or remux gets far enough ahead from the current playback position, pause the process so it will consume fewer resources. This is most useful when watching without seeking often. Turn this off if you experience playback issues.",
|
||||||
"AllowSegmentDeletion": "Delete segments",
|
"AllowSegmentDeletion": "Delete segments",
|
||||||
"AllowSegmentDeletionHelp": "Delete old segments after they have been downloaded by the client. This prevents having to store the entire transcoded file on disk. Turn this off if you experience playback issues.",
|
"AllowSegmentDeletionHelp": "Delete old segments after they have been downloaded by the client. This prevents having to store the entire transcoded file on disk. Turn this off if you experience playback issues.",
|
||||||
"LabelThrottleDelaySeconds": "Throttle after",
|
"LabelThrottleDelaySeconds": "Throttle after",
|
||||||
|
@ -57,6 +57,7 @@
|
||||||
"AsManyAsPossible": "As many as possible",
|
"AsManyAsPossible": "As many as possible",
|
||||||
"AspectRatio": "Aspect Ratio",
|
"AspectRatio": "Aspect Ratio",
|
||||||
"Audio": "Audio",
|
"Audio": "Audio",
|
||||||
|
"Author": "Author",
|
||||||
"Authorize": "Authorize",
|
"Authorize": "Authorize",
|
||||||
"AuthProviderHelp": "Select an authentication provider to be used to authenticate this user's password.",
|
"AuthProviderHelp": "Select an authentication provider to be used to authenticate this user's password.",
|
||||||
"Auto": "Auto",
|
"Auto": "Auto",
|
||||||
|
@ -131,7 +132,7 @@
|
||||||
"ButtonUninstall": "Uninstall",
|
"ButtonUninstall": "Uninstall",
|
||||||
"ButtonUseQuickConnect": "Use Quick Connect",
|
"ButtonUseQuickConnect": "Use Quick Connect",
|
||||||
"ButtonWebsite": "Website",
|
"ButtonWebsite": "Website",
|
||||||
"Bwdif": "BWDIF",
|
"Bwdif": "Bob Weaver DeInterlacing Filter (BWDIF)",
|
||||||
"CancelRecording": "Cancel recording",
|
"CancelRecording": "Cancel recording",
|
||||||
"CancelSeries": "Cancel series",
|
"CancelSeries": "Cancel series",
|
||||||
"Casual": "Casual",
|
"Casual": "Casual",
|
||||||
|
@ -151,6 +152,7 @@
|
||||||
"ClearQueue": "Clear queue",
|
"ClearQueue": "Clear queue",
|
||||||
"ClientSettings": "Client Settings",
|
"ClientSettings": "Client Settings",
|
||||||
"Collections": "Collections",
|
"Collections": "Collections",
|
||||||
|
"Colorist": "Colorist",
|
||||||
"ColorPrimaries": "Color primaries",
|
"ColorPrimaries": "Color primaries",
|
||||||
"ColorSpace": "Color space",
|
"ColorSpace": "Color space",
|
||||||
"ColorTransfer": "Color transfer",
|
"ColorTransfer": "Color transfer",
|
||||||
|
@ -174,6 +176,8 @@
|
||||||
"CopyFailed": "Could not copy",
|
"CopyFailed": "Could not copy",
|
||||||
"CopyStreamURL": "Copy Stream URL",
|
"CopyStreamURL": "Copy Stream URL",
|
||||||
"CopyStreamURLSuccess": "URL copied successfully.",
|
"CopyStreamURLSuccess": "URL copied successfully.",
|
||||||
|
"CoverArtist": "Cover artist",
|
||||||
|
"Creator": "Creator",
|
||||||
"CriticRating": "Critics rating",
|
"CriticRating": "Critics rating",
|
||||||
"Cursive": "Cursive",
|
"Cursive": "Cursive",
|
||||||
"DailyAt": "Daily at {0}",
|
"DailyAt": "Daily at {0}",
|
||||||
|
@ -232,6 +236,7 @@
|
||||||
"DrmChannelsNotImported": "Channels with DRM will not be imported.",
|
"DrmChannelsNotImported": "Channels with DRM will not be imported.",
|
||||||
"DropShadow": "Drop Shadow",
|
"DropShadow": "Drop Shadow",
|
||||||
"Edit": "Edit",
|
"Edit": "Edit",
|
||||||
|
"Editor": "Editor",
|
||||||
"EditImages": "Edit images",
|
"EditImages": "Edit images",
|
||||||
"EditMetadata": "Edit metadata",
|
"EditMetadata": "Edit metadata",
|
||||||
"EditSubtitles": "Edit subtitles",
|
"EditSubtitles": "Edit subtitles",
|
||||||
|
@ -246,6 +251,8 @@
|
||||||
"EnableDetailsBanner": "Details Banner",
|
"EnableDetailsBanner": "Details Banner",
|
||||||
"EnableDetailsBannerHelp": "Display a banner image at the top of the item details page.",
|
"EnableDetailsBannerHelp": "Display a banner image at the top of the item details page.",
|
||||||
"EnableDisplayMirroring": "Display mirroring",
|
"EnableDisplayMirroring": "Display mirroring",
|
||||||
|
"EnableDts": "Enable DTS (DCA)",
|
||||||
|
"EnableDtsHelp": "Only enable if your device supports DTS or is connected to a compatible audio receiver, otherwise it may cause playback failure.",
|
||||||
"EnableExternalVideoPlayers": "External video players",
|
"EnableExternalVideoPlayers": "External video players",
|
||||||
"EnableExternalVideoPlayersHelp": "An external player menu will be shown when starting video playback.",
|
"EnableExternalVideoPlayersHelp": "An external player menu will be shown when starting video playback.",
|
||||||
"EnableFasterAnimations": "Faster animations",
|
"EnableFasterAnimations": "Faster animations",
|
||||||
|
@ -267,6 +274,8 @@
|
||||||
"EnableThemeSongsHelp": "Play the theme songs in background while browsing the library.",
|
"EnableThemeSongsHelp": "Play the theme songs in background while browsing the library.",
|
||||||
"EnableThemeVideosHelp": "Play theme videos in the background while browsing the library.",
|
"EnableThemeVideosHelp": "Play theme videos in the background while browsing the library.",
|
||||||
"EnableTonemapping": "Enable Tone mapping",
|
"EnableTonemapping": "Enable Tone mapping",
|
||||||
|
"EnableTrueHd": "Enable TrueHD",
|
||||||
|
"EnableTrueHdHelp": "Only enable if your device supports TrueHD or is connected to a compatible audio receiver, otherwise it may cause playback failure.",
|
||||||
"EncoderPresetHelp": "Pick a faster value to improve performance, or a slower value to improve quality.",
|
"EncoderPresetHelp": "Pick a faster value to improve performance, or a slower value to improve quality.",
|
||||||
"Ended": "Ended",
|
"Ended": "Ended",
|
||||||
"EndsAtValue": "Ends at {0}",
|
"EndsAtValue": "Ends at {0}",
|
||||||
|
@ -417,6 +426,7 @@
|
||||||
"HeaderLibrarySettings": "Library Settings",
|
"HeaderLibrarySettings": "Library Settings",
|
||||||
"HeaderLiveTvTunerSetup": "Live TV Tuner Setup",
|
"HeaderLiveTvTunerSetup": "Live TV Tuner Setup",
|
||||||
"HeaderLoginFailure": "Login Failure",
|
"HeaderLoginFailure": "Login Failure",
|
||||||
|
"HeaderLyricDownloads": "Lyric Downloads",
|
||||||
"HeaderMedia": "Media",
|
"HeaderMedia": "Media",
|
||||||
"HeaderMediaFolders": "Media Folders",
|
"HeaderMediaFolders": "Media Folders",
|
||||||
"HeaderMetadataSettings": "Metadata Settings",
|
"HeaderMetadataSettings": "Metadata Settings",
|
||||||
|
@ -474,7 +484,7 @@
|
||||||
"HeaderSeriesOptions": "Series Options",
|
"HeaderSeriesOptions": "Series Options",
|
||||||
"HeaderSeriesStatus": "Series Status",
|
"HeaderSeriesStatus": "Series Status",
|
||||||
"HeaderServerAddressSettings": "Server Address Settings",
|
"HeaderServerAddressSettings": "Server Address Settings",
|
||||||
"HeaderSetupLibrary": "Setup your media libraries",
|
"HeaderSetupLibrary": "Set up your media libraries",
|
||||||
"HeaderSortBy": "Sort By",
|
"HeaderSortBy": "Sort By",
|
||||||
"HeaderSortOrder": "Sort Order",
|
"HeaderSortOrder": "Sort Order",
|
||||||
"HeaderSpecialEpisodeInfo": "Special Episode Info",
|
"HeaderSpecialEpisodeInfo": "Special Episode Info",
|
||||||
|
@ -501,6 +511,7 @@
|
||||||
"HeaderUploadSubtitle": "Upload Subtitle",
|
"HeaderUploadSubtitle": "Upload Subtitle",
|
||||||
"HeaderUser": "User",
|
"HeaderUser": "User",
|
||||||
"HeaderUsers": "Users",
|
"HeaderUsers": "Users",
|
||||||
|
"HeaderVideoAdvanced": "Video Advanced",
|
||||||
"HeaderVideoQuality": "Video Quality",
|
"HeaderVideoQuality": "Video Quality",
|
||||||
"HeaderVideos": "Videos",
|
"HeaderVideos": "Videos",
|
||||||
"HeaderVideoType": "Video Type",
|
"HeaderVideoType": "Video Type",
|
||||||
|
@ -516,9 +527,11 @@
|
||||||
"Identify": "Identify",
|
"Identify": "Identify",
|
||||||
"IgnoreDts": "Ignore DTS (decoding timestamp)",
|
"IgnoreDts": "Ignore DTS (decoding timestamp)",
|
||||||
"IgnoreDtsHelp": "Disabling this option may resolve some issues, e.g. missing audio on channels with separate audio and video streams.",
|
"IgnoreDtsHelp": "Disabling this option may resolve some issues, e.g. missing audio on channels with separate audio and video streams.",
|
||||||
|
"Illustrator": "Illustrator",
|
||||||
"Image": "Image",
|
"Image": "Image",
|
||||||
"Images": "Images",
|
"Images": "Images",
|
||||||
"ImportFavoriteChannelsHelp": "Only channels that are marked as favorite on the tuner device will be imported.",
|
"ImportFavoriteChannelsHelp": "Only channels that are marked as favorite on the tuner device will be imported.",
|
||||||
|
"Inker": "Inker",
|
||||||
"InstallingPackage": "Installing {0} (version {1})",
|
"InstallingPackage": "Installing {0} (version {1})",
|
||||||
"InstantMix": "Instant mix",
|
"InstantMix": "Instant mix",
|
||||||
"ItemCount": "{0} items",
|
"ItemCount": "{0} items",
|
||||||
|
@ -544,7 +557,7 @@
|
||||||
"LabelAllowedRemoteAddressesMode": "Remote IP address filter mode",
|
"LabelAllowedRemoteAddressesMode": "Remote IP address filter mode",
|
||||||
"LabelAllowHWTranscoding": "Allow hardware transcoding",
|
"LabelAllowHWTranscoding": "Allow hardware transcoding",
|
||||||
"LabelAppName": "App name",
|
"LabelAppName": "App name",
|
||||||
"LabelAppNameExample": "Example: Sickbeard, Sonarr",
|
"LabelAppNameExample": "A human readable name for identifying API keys. This setting will not affect functionality.",
|
||||||
"LabelArtists": "Artists",
|
"LabelArtists": "Artists",
|
||||||
"LabelArtistsHelp": "Separate multiple artists with a semicolon.",
|
"LabelArtistsHelp": "Separate multiple artists with a semicolon.",
|
||||||
"LabelAudioBitDepth": "Audio bit depth",
|
"LabelAudioBitDepth": "Audio bit depth",
|
||||||
|
@ -759,7 +772,7 @@
|
||||||
"LabelOriginalTitle": "Original title",
|
"LabelOriginalTitle": "Original title",
|
||||||
"LabelOverview": "Overview",
|
"LabelOverview": "Overview",
|
||||||
"LabelParallelImageEncodingLimit": "Parallel image encoding limit",
|
"LabelParallelImageEncodingLimit": "Parallel image encoding limit",
|
||||||
"LabelParallelImageEncodingLimitHelp": "Maximum amount of image encodings that are allowed to run in parallel. Setting this to 0 will choose a limit based on your system specs.",
|
"LabelParallelImageEncodingLimitHelp": "Maximum number of image encodings that are allowed to run in parallel. Setting this to 0 will choose a limit based on your systems core count.",
|
||||||
"LabelParentalRating": "Parental rating",
|
"LabelParentalRating": "Parental rating",
|
||||||
"LabelParentNumber": "Parent number",
|
"LabelParentNumber": "Parent number",
|
||||||
"LabelPassword": "Password",
|
"LabelPassword": "Password",
|
||||||
|
@ -944,7 +957,10 @@
|
||||||
"LatestFromLibrary": "Recently Added in {0}",
|
"LatestFromLibrary": "Recently Added in {0}",
|
||||||
"LearnHowYouCanContribute": "Learn how you can contribute.",
|
"LearnHowYouCanContribute": "Learn how you can contribute.",
|
||||||
"LeaveBlankToNotSetAPassword": "You can leave this field blank to set no password.",
|
"LeaveBlankToNotSetAPassword": "You can leave this field blank to set no password.",
|
||||||
|
"Letterer": "Letterer",
|
||||||
"LibraryAccessHelp": "Select the libraries to share with this user. Administrators will be able to edit all folders using the metadata manager.",
|
"LibraryAccessHelp": "Select the libraries to share with this user. Administrators will be able to edit all folders using the metadata manager.",
|
||||||
|
"LibraryScanFanoutConcurrency": "Parallel library scan tasks limit",
|
||||||
|
"LibraryScanFanoutConcurrencyHelp": "Maximum number of parallel tasks during library scans. Setting this to 0 will choose a limit based on your systems core count. WARNING: Setting this number too high may cause issues with network file systems; if you encounter problems lower this number.",
|
||||||
"LimitSupportedVideoResolution": "Limit maximum supported video resolution",
|
"LimitSupportedVideoResolution": "Limit maximum supported video resolution",
|
||||||
"LimitSupportedVideoResolutionHelp": "Use 'Maximum Allowed Video Transcoding Resolution' as maximum supported video resolution.",
|
"LimitSupportedVideoResolutionHelp": "Use 'Maximum Allowed Video Transcoding Resolution' as maximum supported video resolution.",
|
||||||
"List": "List",
|
"List": "List",
|
||||||
|
@ -1230,6 +1246,7 @@
|
||||||
"PasswordResetProviderHelp": "Pick a password reset provider to be used when this user requests a password reset.",
|
"PasswordResetProviderHelp": "Pick a password reset provider to be used when this user requests a password reset.",
|
||||||
"PasswordSaved": "Password saved.",
|
"PasswordSaved": "Password saved.",
|
||||||
"PathNotFound": "The path could not be found. Please ensure the path is valid and try again.",
|
"PathNotFound": "The path could not be found. Please ensure the path is valid and try again.",
|
||||||
|
"Penciller": "Penciler",
|
||||||
"People": "People",
|
"People": "People",
|
||||||
"PerfectMatch": "Perfect match",
|
"PerfectMatch": "Perfect match",
|
||||||
"Person": "Person",
|
"Person": "Person",
|
||||||
|
@ -1257,6 +1274,10 @@
|
||||||
"PlayCount": "Play count",
|
"PlayCount": "Play count",
|
||||||
"Played": "Played",
|
"Played": "Played",
|
||||||
"PlayFromBeginning": "Play from beginning",
|
"PlayFromBeginning": "Play from beginning",
|
||||||
|
"PlaylistError.AddFailed": "Error adding to playlist",
|
||||||
|
"PlaylistError.CreateFailed": "Error creating playlist",
|
||||||
|
"PlaylistPublic": "Allow public access",
|
||||||
|
"PlaylistPublicDescription": "Allow this playlist to be viewed by any logged in user.",
|
||||||
"Playlists": "Playlists",
|
"Playlists": "Playlists",
|
||||||
"PlayNext": "Play next",
|
"PlayNext": "Play next",
|
||||||
"PlayNextEpisodeAutomatically": "Play next episode automatically",
|
"PlayNextEpisodeAutomatically": "Play next episode automatically",
|
||||||
|
@ -1347,6 +1368,9 @@
|
||||||
"Saturday": "Saturday",
|
"Saturday": "Saturday",
|
||||||
"Save": "Save",
|
"Save": "Save",
|
||||||
"SaveChanges": "Save changes",
|
"SaveChanges": "Save changes",
|
||||||
|
"SaveLyricsIntoMediaFolders": "Save lyrics into media folders",
|
||||||
|
"SaveLyricsIntoMediaFoldersHelp": "Storing lyrics next to audio files will allow them to be more easily managed.",
|
||||||
|
"SavePassword": "Save Password",
|
||||||
"SaveRecordingNFO": "Save recording EPG metadata in NFO",
|
"SaveRecordingNFO": "Save recording EPG metadata in NFO",
|
||||||
"SaveRecordingNFOHelp": "Save metadata from EPG listings provider along side media.",
|
"SaveRecordingNFOHelp": "Save metadata from EPG listings provider along side media.",
|
||||||
"SaveRecordingImages": "Save recording EPG images",
|
"SaveRecordingImages": "Save recording EPG images",
|
||||||
|
@ -1472,6 +1496,7 @@
|
||||||
"TrackCount": "{0} tracks",
|
"TrackCount": "{0} tracks",
|
||||||
"Trailers": "Trailers",
|
"Trailers": "Trailers",
|
||||||
"Transcoding": "Transcoding",
|
"Transcoding": "Transcoding",
|
||||||
|
"Translator": "Translator",
|
||||||
"Tuesday": "Tuesday",
|
"Tuesday": "Tuesday",
|
||||||
"TV": "TV",
|
"TV": "TV",
|
||||||
"TvLibraryHelp": "Review the {0}TV naming guide{1}.",
|
"TvLibraryHelp": "Review the {0}TV naming guide{1}.",
|
||||||
|
@ -1542,7 +1567,7 @@
|
||||||
"XmlTvNewsCategoriesHelp": "Programs with these categories will be displayed as news programs. Separate multiple with '|'.",
|
"XmlTvNewsCategoriesHelp": "Programs with these categories will be displayed as news programs. Separate multiple with '|'.",
|
||||||
"XmlTvPathHelp": "A path to a XMLTV file. Jellyfin will read this file and periodically check it for updates. You are responsible for creating and updating the file.",
|
"XmlTvPathHelp": "A path to a XMLTV file. Jellyfin will read this file and periodically check it for updates. You are responsible for creating and updating the file.",
|
||||||
"XmlTvSportsCategoriesHelp": "Programs with these categories will be displayed as sports programs. Separate multiple with '|'.",
|
"XmlTvSportsCategoriesHelp": "Programs with these categories will be displayed as sports programs. Separate multiple with '|'.",
|
||||||
"Yadif": "YADIF",
|
"Yadif": "Yet Another DeInterlacing Filter (YADIF)",
|
||||||
"Yes": "Yes",
|
"Yes": "Yes",
|
||||||
"Yesterday": "Yesterday",
|
"Yesterday": "Yesterday",
|
||||||
"HeaderSelectFallbackFontPath": "Select Fallback Font Folder Path",
|
"HeaderSelectFallbackFontPath": "Select Fallback Font Folder Path",
|
||||||
|
|
|
@ -171,7 +171,7 @@
|
||||||
"GuestStar": "Estrella invitada",
|
"GuestStar": "Estrella invitada",
|
||||||
"Guide": "Guía",
|
"Guide": "Guía",
|
||||||
"GuideProviderSelectListings": "Seleccionar listados",
|
"GuideProviderSelectListings": "Seleccionar listados",
|
||||||
"H264CrfHelp": "El 'Factor de Velocidad Constante' (CRF) es el ajuste de calidad predeterminado para los codificadores x264 y x265. Puede establecer los valores entre 0 y 51, donde valores más bajos resultarían en una mejor calidad (a expensas de tamaños de archivo más altos). Los valores sanos están entre 18 y 28. El valor predeterminado para x264 es 23, y para x265 es 28, por lo que puede utilizar esto como punto de partida.",
|
"H264CrfHelp": "El 'Factor de Velocidad Constante' (CRF) es el ajuste de calidad predeterminado para los codificadores de software x264 y x265. Puede establecer los valores entre 0 y 51, donde valores más bajos resultarían en una mejor calidad (a expensas de tamaños de archivo más altos). Los valores sanos están entre 18 y 28. El valor predeterminado para x264 es 23, y para x265 es 28, por lo que puede utilizar esto como punto de partida. Los codificadores de hardware no usan estos ajustes.",
|
||||||
"EncoderPresetHelp": "Elige un valor más rápido para mejorar el rendimiento o un valor más lento para mejorar la calidad.",
|
"EncoderPresetHelp": "Elige un valor más rápido para mejorar el rendimiento o un valor más lento para mejorar la calidad.",
|
||||||
"HDPrograms": "Programas en HD",
|
"HDPrograms": "Programas en HD",
|
||||||
"HardwareAccelerationWarning": "Activar la aceleración por hardware puede producir inestabilidades en algunos entornos. Asegúrate de que tu sistema operativo y tus controladores de vídeo están actualizados. Si tienes dificultades para reproducir los vídeos después de activar esto, tendrás que volver a poner este ajuste en None.",
|
"HardwareAccelerationWarning": "Activar la aceleración por hardware puede producir inestabilidades en algunos entornos. Asegúrate de que tu sistema operativo y tus controladores de vídeo están actualizados. Si tienes dificultades para reproducir los vídeos después de activar esto, tendrás que volver a poner este ajuste en None.",
|
||||||
|
@ -311,7 +311,7 @@
|
||||||
"HeaderSendMessage": "Enviar mensaje",
|
"HeaderSendMessage": "Enviar mensaje",
|
||||||
"HeaderSeriesOptions": "Opciones de series",
|
"HeaderSeriesOptions": "Opciones de series",
|
||||||
"HeaderServerSettings": "Ajustes del servidor",
|
"HeaderServerSettings": "Ajustes del servidor",
|
||||||
"HeaderSetupLibrary": "Configure sus bibliotecas de medios",
|
"HeaderSetupLibrary": "Configure su biblioteca multimedia",
|
||||||
"HeaderSortBy": "Ordenar por",
|
"HeaderSortBy": "Ordenar por",
|
||||||
"HeaderSortOrder": "Orden",
|
"HeaderSortOrder": "Orden",
|
||||||
"HeaderSpecialEpisodeInfo": "Información del episodio especial",
|
"HeaderSpecialEpisodeInfo": "Información del episodio especial",
|
||||||
|
@ -374,7 +374,7 @@
|
||||||
"LabelAllowedRemoteAddresses": "Filtro de dirección IP remota",
|
"LabelAllowedRemoteAddresses": "Filtro de dirección IP remota",
|
||||||
"LabelAllowedRemoteAddressesMode": "Modo de filtro de dirección IP remota",
|
"LabelAllowedRemoteAddressesMode": "Modo de filtro de dirección IP remota",
|
||||||
"LabelAppName": "Nombre de la aplicación",
|
"LabelAppName": "Nombre de la aplicación",
|
||||||
"LabelAppNameExample": "Ejemplo: Sickbeard, Sonarr",
|
"LabelAppNameExample": "Un nombre leible por humanos para identificar llaves de API. Esta opcion no afectara funcionalidad. Ejemplo: Sickbeard, Sonarr",
|
||||||
"LabelArtists": "Artistas",
|
"LabelArtists": "Artistas",
|
||||||
"LabelArtistsHelp": "Separar múltiples artistas utilizando punto y coma.",
|
"LabelArtistsHelp": "Separar múltiples artistas utilizando punto y coma.",
|
||||||
"LabelAudioLanguagePreference": "Idioma de audio preferido",
|
"LabelAudioLanguagePreference": "Idioma de audio preferido",
|
||||||
|
@ -1275,7 +1275,7 @@
|
||||||
"LabelLibraryPageSize": "Tamaño de la página de la biblioteca",
|
"LabelLibraryPageSize": "Tamaño de la página de la biblioteca",
|
||||||
"LabelLibraryPageSizeHelp": "Establece la cantidad de ítems a mostrar en una página de la biblioteca. Ponlo en 0 para desactivar la paginación.",
|
"LabelLibraryPageSizeHelp": "Establece la cantidad de ítems a mostrar en una página de la biblioteca. Ponlo en 0 para desactivar la paginación.",
|
||||||
"UnsupportedPlayback": "Jellyfin no puede desencriptar contenido protegido por DRM aunque intentará reproducirlo de todas formas. Algunos archivos pueden aparecer completamente negros debido a encriptación u otras características no soportadas, como títulos interactivos.",
|
"UnsupportedPlayback": "Jellyfin no puede desencriptar contenido protegido por DRM aunque intentará reproducirlo de todas formas. Algunos archivos pueden aparecer completamente negros debido a encriptación u otras características no soportadas, como títulos interactivos.",
|
||||||
"Yadif": "YADIF",
|
"Yadif": "Otro filtro de desentrelazado YADIF",
|
||||||
"ButtonTogglePlaylist": "Lista de reproducción",
|
"ButtonTogglePlaylist": "Lista de reproducción",
|
||||||
"Filter": "Filtro",
|
"Filter": "Filtro",
|
||||||
"New": "Nuevo",
|
"New": "Nuevo",
|
||||||
|
@ -1363,7 +1363,7 @@
|
||||||
"Restart": "Reiniciar",
|
"Restart": "Reiniciar",
|
||||||
"ResetPassword": "Reiniciar Contraseña",
|
"ResetPassword": "Reiniciar Contraseña",
|
||||||
"Profile": "Perfil",
|
"Profile": "Perfil",
|
||||||
"Bwdif": "BWDIF",
|
"Bwdif": "Filtro de Desentrelazado de Bob Weaver",
|
||||||
"UseDoubleRateDeinterlacing": "Duplicar el número de cuadros por segundo al desentrelazar",
|
"UseDoubleRateDeinterlacing": "Duplicar el número de cuadros por segundo al desentrelazar",
|
||||||
"Photo": "Fotografía",
|
"Photo": "Fotografía",
|
||||||
"MusicVideos": "Vídeos musicales",
|
"MusicVideos": "Vídeos musicales",
|
||||||
|
@ -1708,7 +1708,7 @@
|
||||||
"PreferEmbeddedExtrasTitlesOverFileNames": "Prefiere títulos incrustados sobre nombres de archivo para extras",
|
"PreferEmbeddedExtrasTitlesOverFileNames": "Prefiere títulos incrustados sobre nombres de archivo para extras",
|
||||||
"LabelDummyChapterCountHelp": "Número máximo de imágenes de capítulos que se extraerán para cada archivo multimedia.",
|
"LabelDummyChapterCountHelp": "Número máximo de imágenes de capítulos que se extraerán para cada archivo multimedia.",
|
||||||
"LabelEnableAudioVbrHelp": "La tasa de bits variable ofrece una mejor relación entre calidad y tasa de bits promedio, pero en algunos casos raros puede causar problemas de almacenamiento de búfer y compatibilidad.",
|
"LabelEnableAudioVbrHelp": "La tasa de bits variable ofrece una mejor relación entre calidad y tasa de bits promedio, pero en algunos casos raros puede causar problemas de almacenamiento de búfer y compatibilidad.",
|
||||||
"LabelParallelImageEncodingLimitHelp": "Cantidad máxima de codificaciones de imágenes que pueden ejecutarse en paralelo. Establecer esto en 0 elegirá un límite basado en las especificaciones de su sistema.",
|
"LabelParallelImageEncodingLimitHelp": "Cantidad máxima de codificaciones de imágenes que pueden ejecutarse en paralelo. Establecer esto en 0 elegirá un límite basado en la cantidad de nucleos (CPU) en su sistema.",
|
||||||
"ResolutionMatchSource": "Coincidir fuente",
|
"ResolutionMatchSource": "Coincidir fuente",
|
||||||
"SubtitleMagenta": "Magenta",
|
"SubtitleMagenta": "Magenta",
|
||||||
"SubtitleWhite": "Blanco",
|
"SubtitleWhite": "Blanco",
|
||||||
|
@ -1801,7 +1801,7 @@
|
||||||
"LabelServerVersion": "Versión del servidor",
|
"LabelServerVersion": "Versión del servidor",
|
||||||
"AllowMjpegEncoding": "Permitir codificación en formato MJPEG (utilizado durante la generación de trickplay)",
|
"AllowMjpegEncoding": "Permitir codificación en formato MJPEG (utilizado durante la generación de trickplay)",
|
||||||
"Trickplay": "Trickplay",
|
"Trickplay": "Trickplay",
|
||||||
"LabelTrickplayAccel": "Habilitar aceleración por hardware",
|
"LabelTrickplayAccel": "Habilitar descodificación por hardware",
|
||||||
"LabelScanBehavior": "Comportamiento de Escaneo",
|
"LabelScanBehavior": "Comportamiento de Escaneo",
|
||||||
"ConfirmDeleteSeries": "Eliminar esta serie eliminará TODOS {0} episodios tanto del sistema de archivos como de tu biblioteca de medios. ¿Estás seguro de que deseas continuar?",
|
"ConfirmDeleteSeries": "Eliminar esta serie eliminará TODOS {0} episodios tanto del sistema de archivos como de tu biblioteca de medios. ¿Estás seguro de que deseas continuar?",
|
||||||
"DeleteEntireSeries": "Eliminar {0} Episodios",
|
"DeleteEntireSeries": "Eliminar {0} Episodios",
|
||||||
|
@ -1827,8 +1827,69 @@
|
||||||
"PlaybackError.SERVER_ERROR": "La reproducción falló por un error del servidor.",
|
"PlaybackError.SERVER_ERROR": "La reproducción falló por un error del servidor.",
|
||||||
"PlaybackError.NotAllowed": "La reproducción de este medio no está permitida.",
|
"PlaybackError.NotAllowed": "La reproducción de este medio no está permitida.",
|
||||||
"PlaybackError.RateLimitExceeded": "Este medio no puede reproducirse en este momento debído a límites.",
|
"PlaybackError.RateLimitExceeded": "Este medio no puede reproducirse en este momento debído a límites.",
|
||||||
"EnableLibrary": "Activar la librería",
|
"EnableLibrary": "Activar la biblioteca",
|
||||||
"EnableLibraryHelp": "Desactivando la biblioteca hará que no sea visible para ningún usuario.",
|
"EnableLibraryHelp": "Desactivar la biblioteca hará que no sea visible para ningún usuario.",
|
||||||
"ConfirmDeleteLyrics": "Borrando estas letras también las borrará tanto del sistema de ficheros como de tu librería de medios. ¿Estás seguro de que deseas continuar?",
|
"ConfirmDeleteLyrics": "Borrando estas letras también las borrará tanto del sistema de ficheros como de tu biblioteca de medios. ¿Estás seguro de que deseas continuar?",
|
||||||
"DeleteLyrics": "Borrar letras"
|
"DeleteLyrics": "Borrar letras",
|
||||||
|
"HeaderNoLyrics": "No se han encontrado letras",
|
||||||
|
"ErrorDeletingLyrics": "Ha ocurrido un error al borrar las letras del servidor. Por favor asegúrate que Jellyfin tiene permisos de escritura para la carpeta de medios e inténtalo otra vez.",
|
||||||
|
"HeaderDeleteLyrics": "Borrar letras",
|
||||||
|
"Lyrics": "Letras",
|
||||||
|
"LabelTrickplayAccelEncodingHelp": "Actualmente solo disponible en QSV y VAAPI, esta opción no tiene ningún efecto en otros métodos de aceleración por hardware.",
|
||||||
|
"LabelProcessPriorityHelp": "Configurar esto más bajo o alto determinará cómo la CPU priorizará el proceso de generación de ffmpeg para trickplay en relación con otros procesos. Si notas bajadas de rendimiento mientras las imágenes de trickplay se generan pero no quieres parar su generación por completo, intenta reducir tanto esto como el número de hilos.",
|
||||||
|
"EncodingFormatHelp": "Selecciona la codificación de vídeo a la que Jellyfin debe transcodificar. Jellyfin usará codificación por software cuando la aceleración por hardware para el formato seleccionado no esté disponible. La codificación H264 siempre estará habilitada.",
|
||||||
|
"NonBlockingScan": "No bloqueante - encola la generación, después devuelve",
|
||||||
|
"BlockingScan": "Bloqueante - encola la generación, el escaneo se bloquea hasta que termine",
|
||||||
|
"LabelTrickplayAccelEncoding": "Habilitar la codificación MJPEG por hardware",
|
||||||
|
"PriorityHigh": "Alto",
|
||||||
|
"LabelScanBehaviorHelp": "El comportamiento por defecto es no bloqueante, que añadirá los medios a la biblioteca antes de que la generación trickplay se complete. El comportamiento bloqueante se asegurará de que los archivos de trickplay hayan sido generados antes de que los medios se añadan a la biblioteca, pero hará los escaneos significativamente más largos.",
|
||||||
|
"PriorityBelowNormal": "Más bajo de lo normal",
|
||||||
|
"LabelProcessPriority": "Prioridad de procesos",
|
||||||
|
"PriorityIdle": "Libre",
|
||||||
|
"LabelImageInterval": "Intervalo de imágenes",
|
||||||
|
"LabelAllowContentWithTags": "Permitir items con etiquetas",
|
||||||
|
"ViewLyrics": "Ver letras",
|
||||||
|
"PriorityAboveNormal": "Superior a lo normal",
|
||||||
|
"PriorityNormal": "Normal",
|
||||||
|
"SavePassword": "Guardar contraseña",
|
||||||
|
"LabelTileWidth": "Anchura de pieza",
|
||||||
|
"LabelTileHeight": "Altura de pieza",
|
||||||
|
"LabelTileHeightHelp": "Máximo número de imágenes por pieza en la dirección Y.",
|
||||||
|
"LabelJpegQuality": "Calidad JPEG",
|
||||||
|
"ExtractTrickplayImagesHelp": "Las imágenes de trickplay son similares a las de los capítulos, excepto por que se distribuyen a lo largo del contenido y se usan para mostrarse como una previsualización mientras te mueves por el vídeo.",
|
||||||
|
"LabelImageIntervalHelp": "Intervalo de tiempo (ms) entre cada nueva imagen de trickplay.",
|
||||||
|
"LabelWidthResolutions": "Resoluciones de anchura",
|
||||||
|
"LabelQscale": "Qscale",
|
||||||
|
"LabelJpegQualityHelp": "La calidad de compresión JPEG para las imágenes de trickplay.",
|
||||||
|
"LabelExtractTrickplayDuringLibraryScan": "Extraer imágenes para trickplay durante el escaneo de la biblioteca",
|
||||||
|
"LabelTileWidthHelp": "Máximo número de imágenes por pieza en la dirección X.",
|
||||||
|
"LabelQscaleHelp": "La escala de calidad de imágenes de la salida de ffmpeg, siendo 2 la mayor calidad y 31 la peor.",
|
||||||
|
"LabelTrickplayThreads": "Hilos FFmpeg",
|
||||||
|
"LabelTrickplayThreadsHelp": "El número de hilos para pasar al argumento '-threads' de ffmpeg.",
|
||||||
|
"LabelWidthResolutionsHelp": "Lista separada por comas de las anchuras (px) en las que se generarán las imágenes de trickplay. Todas las imágenes se generarán proporcionalmente a la fuente, así que una anchura de 320 en un vídeo 16:9 acabará sobre 320x180.",
|
||||||
|
"OptionExtractTrickplayImage": "Habilitar la extracción de imágenes de trickplay",
|
||||||
|
"LabelExtractTrickplayDuringLibraryScanHelp": "Generar imágenes de trickplay cuando los vídeos se importan durante el escaneo de la biblioteca. De lo contrario se extraerán durante la tarea programada de extracción de imágenes de trickplay. Si la generación es no bloqueante esto no afectará al tiempo que la biblioteca tarda en escanearse.",
|
||||||
|
"Author": "Autor",
|
||||||
|
"LibraryScanFanoutConcurrencyHelp": "Numero maximo de tareas de escaneos en librerias paralelas. Marcar esta opcion en 0 escogera un limite basado en la cantidad de nucleos (CPU) en sus sistema. ADVERTENCIA: Marcar este numero demasiado alto puede causar problemas con sistemas de archivos de red; si encuentra problemas baje este numero.",
|
||||||
|
"LibraryScanFanoutConcurrency": "Limite de escaneos de tareas en librerias paralelas",
|
||||||
|
"Penciller": "Lapicista",
|
||||||
|
"PlaylistError.CreateFailed": "Error creando lista de reproduccion",
|
||||||
|
"PlaylistError.AddFailed": "Error agregando a lista de reproduccion",
|
||||||
|
"SaveLyricsIntoMediaFoldersHelp": "Almacenar letras junto a archivos de audio les permitira ser administradas mas facilmente.",
|
||||||
|
"Colorist": "Colorista",
|
||||||
|
"CoverArtist": "Caratula de Artista",
|
||||||
|
"Creator": "Creador",
|
||||||
|
"Editor": "Editor",
|
||||||
|
"Illustrator": "Ilustrador",
|
||||||
|
"Letterer": "Rotulador",
|
||||||
|
"Translator": "Traductor",
|
||||||
|
"EnableTrueHdHelp": "Solo habilitar si su dispositivo soporta TrueHD o esta conectado a receptor de audio compatible, de otra manera puede causar fallos de reproduccion.",
|
||||||
|
"EnableDts": "Habilitar DTS (DCA)",
|
||||||
|
"EnableDtsHelp": "Solo habilitar si su dispositivo soporta DTS o esta conectado a un receptor de audio compatible, de otra forma puede causar fallos de reproduccion.",
|
||||||
|
"EnableTrueHd": "Habilitar TrueHD",
|
||||||
|
"PlaylistPublic": "Permitir acceso publico",
|
||||||
|
"PlaylistPublicDescription": "Permitir que esta lista de reproduccion sea vista por cualquier usuario que este logueado.",
|
||||||
|
"HeaderLyricDownloads": "Descarga de letras",
|
||||||
|
"HeaderVideoAdvanced": "Video Avanzado",
|
||||||
|
"SaveLyricsIntoMediaFolders": "Guardar letras en carpeta de media"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1605,7 +1605,7 @@
|
||||||
"EnableAudioNormalization": "معمول سازی صوت",
|
"EnableAudioNormalization": "معمول سازی صوت",
|
||||||
"AllowCollectionManagement": "به این کاربر اجازه مدیریت مجموعه را بده",
|
"AllowCollectionManagement": "به این کاربر اجازه مدیریت مجموعه را بده",
|
||||||
"AllowSegmentDeletion": "تکه ها را پاک کن",
|
"AllowSegmentDeletion": "تکه ها را پاک کن",
|
||||||
"AllowSegmentDeletionHelp": "پاک کردن تکه های قدیمی را بعد از فرستادن به کلاینت. این کار از ذخیره کل فایل transcode شده بر روی هارد جلوگیری می کند. این تنها زمانی کار می کند که throttling فعال باشد. درصورت مشکل در هنگام پخش این ویژگی را غیرفعال کنید.",
|
"AllowSegmentDeletionHelp": "پاک کردن تکه های قدیمی بعد از دریافت کلاینت. این کار از ذخیره کل فایل transcode شده بر روی هارد جلوگیری می کند. این تنها زمانی کار می کند که throttling فعال باشد. درصورت مشکل در هنگام پخش این ویژگی را غیرفعال کنید.",
|
||||||
"LogLevel.Error": "خطا",
|
"LogLevel.Error": "خطا",
|
||||||
"LogLevel.Critical": "بحرانی",
|
"LogLevel.Critical": "بحرانی",
|
||||||
"LogLevel.None": "هیچکدام",
|
"LogLevel.None": "هیچکدام",
|
||||||
|
@ -1625,5 +1625,8 @@
|
||||||
"LogLevel.Information": "اطلاعات",
|
"LogLevel.Information": "اطلاعات",
|
||||||
"LogoScreensaver": "محافظ صفحه لوگو",
|
"LogoScreensaver": "محافظ صفحه لوگو",
|
||||||
"Localization": "محلیسازی",
|
"Localization": "محلیسازی",
|
||||||
"HeaderGuestCast": "بازیگران مهمان"
|
"HeaderGuestCast": "بازیگران مهمان",
|
||||||
|
"AirPlay": "پخش هوا",
|
||||||
|
"AllowContentWithTagsHelp": "فقط رسانه های دارای حداقل یکی از برچسب های مشخص شده را نشان بده.",
|
||||||
|
"AllowSubtitleManagement": "به این کاربر اجازه ویرایش زیرنویس بده"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1856,5 +1856,23 @@
|
||||||
"ExtractTrickplayImagesHelp": "Trickplay-kuvat ovat samankaltaisia kuin kappalekuvat, paitsi että ne ovat koko sisällön pituudelta ja niitä käytetään esikatseluna videota selattaessa.",
|
"ExtractTrickplayImagesHelp": "Trickplay-kuvat ovat samankaltaisia kuin kappalekuvat, paitsi että ne ovat koko sisällön pituudelta ja niitä käytetään esikatseluna videota selattaessa.",
|
||||||
"NonBlockingScan": "Ei-blokkaava - asettaa generoinnin jonoon ja palaa",
|
"NonBlockingScan": "Ei-blokkaava - asettaa generoinnin jonoon ja palaa",
|
||||||
"BlockingScan": "Blokkaava - asettaa generoinnin jonoon ja estää skannauksen ennen kuin se on valmis",
|
"BlockingScan": "Blokkaava - asettaa generoinnin jonoon ja estää skannauksen ennen kuin se on valmis",
|
||||||
"LabelExtractTrickplayDuringLibraryScan": "Luo trickplay-kuvat kirjaston skannauksen yhteydessä"
|
"LabelExtractTrickplayDuringLibraryScan": "Luo trickplay-kuvat kirjaston skannauksen yhteydessä",
|
||||||
|
"PlaylistError.AddFailed": "Virhe soittolistaan lisättäessä",
|
||||||
|
"PlaylistError.CreateFailed": "Virhe soittolistaa luodessa",
|
||||||
|
"LibraryScanFanoutConcurrency": "Rinnakkaisten kirjastopäivityksien raja",
|
||||||
|
"Lyrics": "Sanoitukset",
|
||||||
|
"SavePassword": "Tallenna salasana",
|
||||||
|
"Author": "Tekijä",
|
||||||
|
"Colorist": "Koloristi",
|
||||||
|
"CoverArtist": "Kansitaiteilija",
|
||||||
|
"Creator": "Luoja",
|
||||||
|
"Illustrator": "Kuvittaja",
|
||||||
|
"Translator": "Kääntäjä",
|
||||||
|
"DeleteLyrics": "Poista sanoitukset",
|
||||||
|
"HeaderDeleteLyrics": "Poista sanoitukset",
|
||||||
|
"HeaderNoLyrics": "Sanoituksia ei löydy",
|
||||||
|
"ViewLyrics": "Näytä sanoitukset",
|
||||||
|
"HeaderLyricDownloads": "Sanoitusten lataaminen",
|
||||||
|
"SaveLyricsIntoMediaFolders": "Tallenna sanoitukset mediakansioon",
|
||||||
|
"PlaylistPublic": "Salli julkinen pääsy"
|
||||||
}
|
}
|
||||||
|
|
|
@ -426,7 +426,7 @@
|
||||||
"LabelAllowedRemoteAddresses": "Filtre d'adresse IP distante",
|
"LabelAllowedRemoteAddresses": "Filtre d'adresse IP distante",
|
||||||
"LabelAllowedRemoteAddressesMode": "Type de filtre des adresses IP distantes",
|
"LabelAllowedRemoteAddressesMode": "Type de filtre des adresses IP distantes",
|
||||||
"LabelAppName": "Nom de l'application",
|
"LabelAppName": "Nom de l'application",
|
||||||
"LabelAppNameExample": "Exemple : Sickbeard, Sonarr",
|
"LabelAppNameExample": "Nom humainement lisible pour identifier les clés d'API. Ce paramètre n'affecte pas les fonctionnalités.",
|
||||||
"LabelArtists": "Artistes",
|
"LabelArtists": "Artistes",
|
||||||
"LabelArtistsHelp": "Séparer les artistes par un point-virgule.",
|
"LabelArtistsHelp": "Séparer les artistes par un point-virgule.",
|
||||||
"LabelAudioLanguagePreference": "Langue audio préférée",
|
"LabelAudioLanguagePreference": "Langue audio préférée",
|
||||||
|
@ -1245,7 +1245,7 @@
|
||||||
"LabelDroppedFrames": "Images perdues",
|
"LabelDroppedFrames": "Images perdues",
|
||||||
"LabelCorruptedFrames": "Images corrompues",
|
"LabelCorruptedFrames": "Images corrompues",
|
||||||
"AskAdminToCreateLibrary": "Demander à un administrateur de créer une médiathèque.",
|
"AskAdminToCreateLibrary": "Demander à un administrateur de créer une médiathèque.",
|
||||||
"AllowFfmpegThrottlingHelp": "Quand le transcodage ou le remultiplexage est suffisamment en avant de la position de lecture, le processus se mettra en pause afin d’économiser des ressources. Ceci est particulièrement utile lors d’une lecture continue. À désactiver en cas de problèmes de lecture.",
|
"AllowFfmpegThrottlingHelp": "Quand le transcodage ou le remultiplexage est suffisamment en avance sur la lecture, le processus se mettra en pause afin d’économiser des ressources. Ceci est particulièrement utile lors d’une lecture continue. À désactiver en cas de problèmes de lecture.",
|
||||||
"AllowFfmpegThrottling": "Adapter la vitesse du transcodage",
|
"AllowFfmpegThrottling": "Adapter la vitesse du transcodage",
|
||||||
"NoCreatedLibraries": "Il semble que vous n'ayez pas encore créé de bibliothèques. {0}Voulez-vous en créer une maintenant ?{1}",
|
"NoCreatedLibraries": "Il semble que vous n'ayez pas encore créé de bibliothèques. {0}Voulez-vous en créer une maintenant ?{1}",
|
||||||
"PlaybackErrorNoCompatibleStream": "Ce client n'est pas compatible avec le média et le serveur n'envoie pas de format compatible.",
|
"PlaybackErrorNoCompatibleStream": "Ce client n'est pas compatible avec le média et le serveur n'envoie pas de format compatible.",
|
||||||
|
@ -1272,7 +1272,7 @@
|
||||||
"ListPaging": "{0}-{1} de {2}",
|
"ListPaging": "{0}-{1} de {2}",
|
||||||
"WriteAccessRequired": "Jellyfin a besoin d'un accès en écriture à ce dossier. Merci de vérifier les permissions de ce-dernier puis de réessayer.",
|
"WriteAccessRequired": "Jellyfin a besoin d'un accès en écriture à ce dossier. Merci de vérifier les permissions de ce-dernier puis de réessayer.",
|
||||||
"PathNotFound": "Le chemin d'accès n'a pas pu être trouvé. Merci de vérifier qu'il est valide et de réessayer.",
|
"PathNotFound": "Le chemin d'accès n'a pas pu être trouvé. Merci de vérifier qu'il est valide et de réessayer.",
|
||||||
"Yadif": "YADIF",
|
"Yadif": "Yet Another DeInterlacing Filter (YADIF)",
|
||||||
"LabelDeinterlaceMethod": "Méthode de désentrelacement",
|
"LabelDeinterlaceMethod": "Méthode de désentrelacement",
|
||||||
"DeinterlaceMethodHelp": "Sélectionner la méthode de désentrelacement à utiliser lors du transcodage de contenu entrelacé. Lorsque l'accélération matérielle supportant le désentrelacement matériel est activée, le désentrelaceur matériel sera utilisé à la place de ce paramètre.",
|
"DeinterlaceMethodHelp": "Sélectionner la méthode de désentrelacement à utiliser lors du transcodage de contenu entrelacé. Lorsque l'accélération matérielle supportant le désentrelacement matériel est activée, le désentrelaceur matériel sera utilisé à la place de ce paramètre.",
|
||||||
"LabelLibraryPageSize": "Taille des pages de la médiathèque",
|
"LabelLibraryPageSize": "Taille des pages de la médiathèque",
|
||||||
|
@ -1377,7 +1377,7 @@
|
||||||
"Other": "Autre",
|
"Other": "Autre",
|
||||||
"PosterCard": "Affiche sur carte",
|
"PosterCard": "Affiche sur carte",
|
||||||
"UseDoubleRateDeinterlacing": "Multiplier par deux la fréquence d'images lors du désentrelacement",
|
"UseDoubleRateDeinterlacing": "Multiplier par deux la fréquence d'images lors du désentrelacement",
|
||||||
"Bwdif": "BWDIF",
|
"Bwdif": "Bob Weaver DeInterlacing Filter (BWDIF)",
|
||||||
"UseDoubleRateDeinterlacingHelp": "Ce réglage utilise la fréquence de trame lors du désentrelacement, souvent appelé désentrelacement \"bob\", qui double la fréquence d'images de la vidéo pour fournir un mouvement fluide comme en regardant une vidéo entrelacée sur un téléviseur.",
|
"UseDoubleRateDeinterlacingHelp": "Ce réglage utilise la fréquence de trame lors du désentrelacement, souvent appelé désentrelacement \"bob\", qui double la fréquence d'images de la vidéo pour fournir un mouvement fluide comme en regardant une vidéo entrelacée sur un téléviseur.",
|
||||||
"LabelTonemappingDesat": "Désaturation tonale",
|
"LabelTonemappingDesat": "Désaturation tonale",
|
||||||
"TonemappingRangeHelp": "Définir la gamme de couleurs de sortie. Choisir 'Auto' pour utiliser la même gamme de couleurs qu'en entrée.",
|
"TonemappingRangeHelp": "Définir la gamme de couleurs de sortie. Choisir 'Auto' pour utiliser la même gamme de couleurs qu'en entrée.",
|
||||||
|
@ -1615,7 +1615,7 @@
|
||||||
"SelectAll": "Tout sélectionner",
|
"SelectAll": "Tout sélectionner",
|
||||||
"ButtonExitApp": "Quitter l'application",
|
"ButtonExitApp": "Quitter l'application",
|
||||||
"Clip": "Clip",
|
"Clip": "Clip",
|
||||||
"ThemeVideo": "Thème Vidéo",
|
"ThemeVideo": "Thème vidéo",
|
||||||
"ThemeSong": "Thème musical",
|
"ThemeSong": "Thème musical",
|
||||||
"Sample": "Échantillon",
|
"Sample": "Échantillon",
|
||||||
"Scene": "Scène",
|
"Scene": "Scène",
|
||||||
|
@ -1676,7 +1676,7 @@
|
||||||
"RememberSubtitleSelections": "Définir la piste de sous-titre en fonction de l'élément précédent",
|
"RememberSubtitleSelections": "Définir la piste de sous-titre en fonction de l'élément précédent",
|
||||||
"RememberAudioSelectionsHelp": "Choisir la piste audio la plus proche de la dernière vidéo.",
|
"RememberAudioSelectionsHelp": "Choisir la piste audio la plus proche de la dernière vidéo.",
|
||||||
"RememberAudioSelections": "Définir la piste audio en fonction de l'élément précédent",
|
"RememberAudioSelections": "Définir la piste audio en fonction de l'élément précédent",
|
||||||
"IgnoreDtsHelp": "Désactiver cette option peut résoudre certains problèmes, par exemple une piste audio manquante sur les chaines TV avec flux audio et vidéo séparés.",
|
"IgnoreDtsHelp": "Désactiver cette option peut résoudre certains problèmes, par exemple une piste audio manquante sur les chaînes avec flux audio et vidéo séparés.",
|
||||||
"OptionDateShowAdded": "Date d'ajout de la série",
|
"OptionDateShowAdded": "Date d'ajout de la série",
|
||||||
"OptionDateEpisodeAdded": "Date d'ajout de l'épisode",
|
"OptionDateEpisodeAdded": "Date d'ajout de l'épisode",
|
||||||
"IgnoreDts": "Ignorer le DTS (horodatage de décodage)",
|
"IgnoreDts": "Ignorer le DTS (horodatage de décodage)",
|
||||||
|
@ -1719,7 +1719,7 @@
|
||||||
"Short": "Court-métrage",
|
"Short": "Court-métrage",
|
||||||
"HeaderPerformance": "Performance",
|
"HeaderPerformance": "Performance",
|
||||||
"LabelParallelImageEncodingLimit": "Limite de parallélisation de l'encodage d'image",
|
"LabelParallelImageEncodingLimit": "Limite de parallélisation de l'encodage d'image",
|
||||||
"LabelParallelImageEncodingLimitHelp": "Nombre maximal d’encodages d’image autorisés à s’exécuter en parallèle. Si vous définissez cette valeur sur 0, vous choisirez une limite en fonction des spécifications de votre système.",
|
"LabelParallelImageEncodingLimitHelp": "Nombre maximal d’encodages d’image autorisés à s’exécuter en parallèle. Si vous définissez cette valeur sur 0, la limite sera choisie en fonction du nombre de cœurs de votre système.",
|
||||||
"LabelEnableAudioVbr": "Activer l’encodage audio VBR",
|
"LabelEnableAudioVbr": "Activer l’encodage audio VBR",
|
||||||
"LabelEnableAudioVbrHelp": "Le débit binaire variable offre une qualité supérieure à la moyenne mais peut, dans de rares cas, causer des problèmes de mise en mémoire tampon et de compatibilité.",
|
"LabelEnableAudioVbrHelp": "Le débit binaire variable offre une qualité supérieure à la moyenne mais peut, dans de rares cas, causer des problèmes de mise en mémoire tampon et de compatibilité.",
|
||||||
"LabelTonemappingMode": "Mode de mappage tonal",
|
"LabelTonemappingMode": "Mode de mappage tonal",
|
||||||
|
@ -1807,8 +1807,8 @@
|
||||||
"LabelAllowContentWithTags": "Autoriser les objets comportants des étiquettes",
|
"LabelAllowContentWithTags": "Autoriser les objets comportants des étiquettes",
|
||||||
"ConfirmDeleteSeries": "La suppression de cette série effacera l'ENTIÈRETÉ des {0} épisodes à la fois de votre système de ficher et de votre médiathèque. Êtes-vous sur de vouloir continuer ?",
|
"ConfirmDeleteSeries": "La suppression de cette série effacera l'ENTIÈRETÉ des {0} épisodes à la fois de votre système de ficher et de votre médiathèque. Êtes-vous sur de vouloir continuer ?",
|
||||||
"DeleteEntireSeries": "Supprimer {0} Épisodes",
|
"DeleteEntireSeries": "Supprimer {0} Épisodes",
|
||||||
"DeleteSeries": "Supprimer Séries",
|
"DeleteSeries": "Supprimer la série",
|
||||||
"DeleteEpisode": "Suppri",
|
"DeleteEpisode": "Supprimer l'épisode",
|
||||||
"HeaderDeleteSeries": "Supprimer Séries",
|
"HeaderDeleteSeries": "Supprimer Séries",
|
||||||
"EnableSmoothScroll": "Activer le défilement fluide",
|
"EnableSmoothScroll": "Activer le défilement fluide",
|
||||||
"Lyric": "Parole",
|
"Lyric": "Parole",
|
||||||
|
@ -1835,7 +1835,7 @@
|
||||||
"LabelProcessPriorityHelp": "Un réglage inférieur ou supérieur déterminera la manière dont le processeur donne la priorité au processus de génération de trickplay ffmpeg par rapport aux autres processus. Si vous remarquez un ralentissement lors de la génération d'images trickplay mais que vous ne souhaitez pas arrêter complètement leur génération, essayez de réduire ce ralentissement en modifiant le nombre de threads.",
|
"LabelProcessPriorityHelp": "Un réglage inférieur ou supérieur déterminera la manière dont le processeur donne la priorité au processus de génération de trickplay ffmpeg par rapport aux autres processus. Si vous remarquez un ralentissement lors de la génération d'images trickplay mais que vous ne souhaitez pas arrêter complètement leur génération, essayez de réduire ce ralentissement en modifiant le nombre de threads.",
|
||||||
"LabelImageIntervalHelp": "Intervalle de temps (ms) entre chaque nouvelle image trickplay.",
|
"LabelImageIntervalHelp": "Intervalle de temps (ms) entre chaque nouvelle image trickplay.",
|
||||||
"LabelWidthResolutions": "Largeur des résolutions",
|
"LabelWidthResolutions": "Largeur des résolutions",
|
||||||
"LabelTrickplayAccel": "Activer l'accélération matérielle",
|
"LabelTrickplayAccel": "Activer le décodage matériel",
|
||||||
"LabelTrickplayAccelHelp": "Assurez-vous d'activer « Autoriser l'encodage MJPEG » dans Transcodage si votre matériel le prend en charge.",
|
"LabelTrickplayAccelHelp": "Assurez-vous d'activer « Autoriser l'encodage MJPEG » dans Transcodage si votre matériel le prend en charge.",
|
||||||
"NonBlockingScan": "Non bloquant - génération de files d'attente, puis retour",
|
"NonBlockingScan": "Non bloquant - génération de files d'attente, puis retour",
|
||||||
"BlockingScan": "Bloquant - génération de files d'attente, analyse des blocs jusqu'à la fin",
|
"BlockingScan": "Bloquant - génération de files d'attente, analyse des blocs jusqu'à la fin",
|
||||||
|
@ -1858,14 +1858,34 @@
|
||||||
"PlaybackError.MEDIA_NOT_SUPPORTED": "La lecture a échoué car le média n'est pas pris en charge par ce client.",
|
"PlaybackError.MEDIA_NOT_SUPPORTED": "La lecture a échoué car le média n'est pas pris en charge par ce client.",
|
||||||
"PlaybackError.NETWORK_ERROR": "La lecture a échoué à cause d'une erreur réseau.",
|
"PlaybackError.NETWORK_ERROR": "La lecture a échoué à cause d'une erreur réseau.",
|
||||||
"PlaybackError.NO_MEDIA_ERROR": "Impossible de trouver une source multimédia valide à lire.",
|
"PlaybackError.NO_MEDIA_ERROR": "Impossible de trouver une source multimédia valide à lire.",
|
||||||
"PlaybackError.PLAYER_ERROR": "La lecture a échoué en raison d'une erreur fatale du joueur.",
|
"PlaybackError.PLAYER_ERROR": "La lecture a échoué en raison d'une erreur fatale du lecteur.",
|
||||||
"LabelTrickplayAccelEncoding": "Activer l'encodage MJPEG accéléré par le matériel",
|
"LabelTrickplayAccelEncoding": "Activer l'encodage MJPEG accéléré par le matériel",
|
||||||
"LabelTrickplayAccelEncodingHelp": "Actuellement disponible uniquement sur QSV et VAAPI, cette option n'a aucun effet sur les autres méthodes d'accélération matérielle.",
|
"LabelTrickplayAccelEncodingHelp": "Actuellement disponible uniquement sur QSV et VAAPI, cette option n'a aucun effet sur les autres méthodes d'accélération matérielle.",
|
||||||
"ErrorDeletingLyrics": "Une erreur est survenu lors de la suppression des paroles du serveur. S'il vous plaît verifier que Jellyfin peut modifier les fichier dans le dossier multimedia et réessayez.",
|
"ErrorDeletingLyrics": "Une erreur est survenu lors de la suppression des paroles du serveur. S'il vous plaît verifier que Jellyfin peut modifier les fichier dans le dossier multimedia et réessayez.",
|
||||||
"HeaderDeleteLyrics": "Supprimez ces paroles",
|
"HeaderDeleteLyrics": "Suppression des paroles",
|
||||||
"ConfirmDeleteLyrics": "En supprimant ces paroles vous les supprimez a la fois de votre systeme de fichier et de votre bibliothèque. Êtes vous sure de vouloir continuez ?",
|
"ConfirmDeleteLyrics": "En supprimant ces paroles vous les supprimez a la fois de votre systeme de fichier et de votre bibliothèque. Êtes vous sure de vouloir continuez ?",
|
||||||
"DeleteLyrics": "Supprimez ces paroles",
|
"DeleteLyrics": "Supprimer ces paroles",
|
||||||
"HeaderNoLyrics": "Aucune paroles n'ont êtes trouves",
|
"HeaderNoLyrics": "Aucune paroles n'ont êtes trouves",
|
||||||
"Lyrics": "Paroles",
|
"Lyrics": "Paroles",
|
||||||
"ViewLyrics": "Voir les paroles"
|
"ViewLyrics": "Voir les paroles",
|
||||||
|
"SavePassword": "Sauvegarder le mot de passe",
|
||||||
|
"EnableDts": "Activer DTS (DCA)",
|
||||||
|
"EnableDtsHelp": "N'activez cette option que si votre appareil prend en charge le DTS ou s'il est connecté à un lecteur audio compatible, sinon la lecture risque d'échouer.",
|
||||||
|
"EnableTrueHdHelp": "N'activez cette option que si votre appareil prend en charge la norme TrueHD ou s'il est connecté à un lecteur audio compatible, sinon la lecture risque d'échouer.",
|
||||||
|
"EnableTrueHd": "Activer le TrueHD",
|
||||||
|
"PlaylistError.CreateFailed": "Erreur lors de la création d'une liste de lecture",
|
||||||
|
"SaveLyricsIntoMediaFolders": "Enregistrer les paroles dans les dossiers média",
|
||||||
|
"PlaylistError.AddFailed": "Erreur d'ajout à la liste de lecture",
|
||||||
|
"SaveLyricsIntoMediaFoldersHelp": "Le stockage des paroles à côté des fichiers audio permet de les gérer plus facilement.",
|
||||||
|
"HeaderVideoAdvanced": "Vidéo avancée",
|
||||||
|
"PlaylistPublic": "Autoriser l'accès public",
|
||||||
|
"PlaylistPublicDescription": "Autoriser la lecture de cette liste de lecture par n'importe quel utilisateur connecté.",
|
||||||
|
"HeaderLyricDownloads": "Téléchargements des paroles",
|
||||||
|
"Illustrator": "Illustrateur",
|
||||||
|
"Author": "Auteur",
|
||||||
|
"LibraryScanFanoutConcurrencyHelp": "Nombre maximal de tâches en parallèle pour les scans de bibliothèque. Si vous définissez cette valeur à 0, la limite sera choisie en fonction du nombre de cœurs de votre système. ATTENTION : Définir une valeur trop élevée peut causer des problèmes avec les systèmes de fichiers en réseau ; si vous rencontrez des problèmes, diminuez cette valeur.",
|
||||||
|
"Colorist": "Coloriste",
|
||||||
|
"Creator": "Créateur",
|
||||||
|
"LibraryScanFanoutConcurrency": "Limite de tâches de scan de bibliothèque en parallèle",
|
||||||
|
"Translator": "Traducteur"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1281,5 +1281,6 @@
|
||||||
"LabelMaxAudiobookResume": "דקות נותרות בספר המוקלט להמשך",
|
"LabelMaxAudiobookResume": "דקות נותרות בספר המוקלט להמשך",
|
||||||
"LabelMaxAudiobookResumeHelp": "כותרים נחשבים כנוגנו במלואם כאשר משך הזמן הנותר קטן יותר מערך זה.",
|
"LabelMaxAudiobookResumeHelp": "כותרים נחשבים כנוגנו במלואם כאשר משך הזמן הנותר קטן יותר מערך זה.",
|
||||||
"LabelMetadataReaders": "קוראי מטא-דאטה",
|
"LabelMetadataReaders": "קוראי מטא-דאטה",
|
||||||
"LabelMetadataSavers": "שומרי מטא-דאטה"
|
"LabelMetadataSavers": "שומרי מטא-דאטה",
|
||||||
|
"PlaybackError.RateLimitExceeded": "מדיה"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1071,7 +1071,7 @@
|
||||||
"ButtonUseQuickConnect": "Omogući brzo povezivanje",
|
"ButtonUseQuickConnect": "Omogući brzo povezivanje",
|
||||||
"ButtonActivate": "Aktiviraj",
|
"ButtonActivate": "Aktiviraj",
|
||||||
"AllowedRemoteAddressesHelp": "Popis IP adresa ili mrežnih maska odvojen zarezom za mreže kojima će biti dopušten udaljeni pristup. Ako ostane prazno, bit će dopuštene sve udaljene adrese.",
|
"AllowedRemoteAddressesHelp": "Popis IP adresa ili mrežnih maska odvojen zarezom za mreže kojima će biti dopušten udaljeni pristup. Ako ostane prazno, bit će dopuštene sve udaljene adrese.",
|
||||||
"AllowFfmpegThrottlingHelp": "Kada se transkodira ili remiks dovoljno udalji od trenutne pozicije reprodukcije, zaustavite postupak tako da će potrošiti manje resursa. Ovo je najkorisnije kada gledate bez čestog traženja. Isključite ovo ako imate problema s reprodukcijom.",
|
"AllowFfmpegThrottlingHelp": "Kada se transkodira ili se remuks dovoljno udalji od trenutne pozicije reprodukcije, zaustavite postupak tako da se troši manje resursa. Ovo je najkorisnije kada gledate bez čestog traženja. Isključite ovo ako imate problema s reprodukcijom.",
|
||||||
"BurnSubtitlesHelp": "Odredite treba li server snimati titlove tijekom transkodiranja videozapisa. Izbjegavanje toga uvelike će poboljšati performanse. Odaberite Automatski za snimanje slikovnih formata (VobSub, PGS, SUB, IDX itd.) i određenih ASS ili SSA titlova.",
|
"BurnSubtitlesHelp": "Odredite treba li server snimati titlove tijekom transkodiranja videozapisa. Izbjegavanje toga uvelike će poboljšati performanse. Odaberite Automatski za snimanje slikovnih formata (VobSub, PGS, SUB, IDX itd.) i određenih ASS ili SSA titlova.",
|
||||||
"BoxSet": "Komplet",
|
"BoxSet": "Komplet",
|
||||||
"Authorize": "Ovlastite",
|
"Authorize": "Ovlastite",
|
||||||
|
@ -1512,7 +1512,7 @@
|
||||||
"ShowYear": "Prikaži godinu",
|
"ShowYear": "Prikaži godinu",
|
||||||
"LabelLocalCustomCss": "Prilagođeni CSS kod za stil koji se odnosi samo na ovog klijenta. Možda ćete htjeti onemogućiti prilagođeni CSS kod poslužitelja.",
|
"LabelLocalCustomCss": "Prilagođeni CSS kod za stil koji se odnosi samo na ovog klijenta. Možda ćete htjeti onemogućiti prilagođeni CSS kod poslužitelja.",
|
||||||
"LabelPlayerDimensions": "Dimenzije izvođača",
|
"LabelPlayerDimensions": "Dimenzije izvođača",
|
||||||
"LabelSegmentKeepSecondsHelp": "Vrijeme u sekundama za koje se segmenti trebaju čuvati prije nego što se prebrišu. Mora biti veći od \"Throttle after\". Radi samo ako je omogućeno brisanje segmenta.",
|
"LabelSegmentKeepSecondsHelp": "Vrijeme u sekundama za koje se segmenti trebaju čuvati prije nego što se prebrišu. Radi samo ako je omogućeno brisanje segmenta.",
|
||||||
"LabelKnownProxies": "Poznati proxy-i",
|
"LabelKnownProxies": "Poznati proxy-i",
|
||||||
"ButtonBackspace": "Backspace",
|
"ButtonBackspace": "Backspace",
|
||||||
"LabelHomeScreenSectionValue": "{0}. odjeljak početne",
|
"LabelHomeScreenSectionValue": "{0}. odjeljak početne",
|
||||||
|
|
|
@ -142,7 +142,7 @@
|
||||||
"HeaderSeasons": "Évadok",
|
"HeaderSeasons": "Évadok",
|
||||||
"HeaderSelectMetadataPath": "Válaszd ki a metaadat útvonalat",
|
"HeaderSelectMetadataPath": "Válaszd ki a metaadat útvonalat",
|
||||||
"HeaderSendMessage": "Üzenet küldése",
|
"HeaderSendMessage": "Üzenet küldése",
|
||||||
"HeaderSetupLibrary": "Média könyvtárak beállítása",
|
"HeaderSetupLibrary": "Állítsd be a média könyvtáraidat",
|
||||||
"HeaderSortBy": "Megjelenítés",
|
"HeaderSortBy": "Megjelenítés",
|
||||||
"HeaderSortOrder": "Sorrend",
|
"HeaderSortOrder": "Sorrend",
|
||||||
"HeaderStatus": "Állapot",
|
"HeaderStatus": "Állapot",
|
||||||
|
@ -482,7 +482,7 @@
|
||||||
"ButtonSelectView": "Válassz nézetet",
|
"ButtonSelectView": "Válassz nézetet",
|
||||||
"ButtonStart": "Indítás",
|
"ButtonStart": "Indítás",
|
||||||
"CancelRecording": "Felvétel törlése",
|
"CancelRecording": "Felvétel törlése",
|
||||||
"CancelSeries": "Sorozat törlése",
|
"CancelSeries": "Sorozat visszavonása",
|
||||||
"Categories": "Kategóriák",
|
"Categories": "Kategóriák",
|
||||||
"ChangingMetadataImageSettingsNewContent": "A metaadatok vagy az artwork fileok letöltési beállításainak módosítása csak a könyvtárhoz hozzáadott új tartalomra vonatkozik. A meglévő címek módosításainak alkalmazásához manuálisan kell frissíteni a metaadatokat.",
|
"ChangingMetadataImageSettingsNewContent": "A metaadatok vagy az artwork fileok letöltési beállításainak módosítása csak a könyvtárhoz hozzáadott új tartalomra vonatkozik. A meglévő címek módosításainak alkalmazásához manuálisan kell frissíteni a metaadatokat.",
|
||||||
"ChannelAccessHelp": "Válaszd ki a megosztani kívánt csatornákat a felhasználóval. A rendszergazdák a metaadatkezelő segítségével szerkeszthetik az összes csatornát.",
|
"ChannelAccessHelp": "Válaszd ki a megosztani kívánt csatornákat a felhasználóval. A rendszergazdák a metaadatkezelő segítségével szerkeszthetik az összes csatornát.",
|
||||||
|
@ -494,8 +494,8 @@
|
||||||
"Composer": "Zeneszerző",
|
"Composer": "Zeneszerző",
|
||||||
"ConfigureDateAdded": "Állítsa be, hogy a „Hozzáadás Dátuma” metaadatok hogyan legyenek meghatározva az Irányítópult > Könyvtárak > NFO-beállítások menüpontban",
|
"ConfigureDateAdded": "Állítsa be, hogy a „Hozzáadás Dátuma” metaadatok hogyan legyenek meghatározva az Irányítópult > Könyvtárak > NFO-beállítások menüpontban",
|
||||||
"ConfirmDeleteImage": "Kép törlése?",
|
"ConfirmDeleteImage": "Kép törlése?",
|
||||||
"ConfirmDeleteItem": "Az elem törlése mind a fájlrendszerből, mind a médiakönyvtárból törlődik. Biztosan folytatni akarod?",
|
"ConfirmDeleteItem": "Az elem törlésével az törlődni fog a fájlrendszerből és a médiakönyvtárból is. Biztosan folytatni akarod?",
|
||||||
"ConfirmDeleteItems": "Az elem törlése mind a fájlrendszerből, mind a médiakönyvtárból törlődik. Biztosan folytatni akarod?",
|
"ConfirmDeleteItems": "Az elemek törlésével azok törlődni fognak a fájlrendszerből és a médiakönyvtárból is. Biztosan folytatni akarod?",
|
||||||
"ConfirmDeletion": "Törlés megerősítése",
|
"ConfirmDeletion": "Törlés megerősítése",
|
||||||
"ConfirmEndPlayerSession": "Szeretnéd leállítani a Jellyfin-t {0}?",
|
"ConfirmEndPlayerSession": "Szeretnéd leállítani a Jellyfin-t {0}?",
|
||||||
"ContinueWatching": "Megtekintés folytatása",
|
"ContinueWatching": "Megtekintés folytatása",
|
||||||
|
@ -563,7 +563,7 @@
|
||||||
"HeaderActivity": "Tevékenységek",
|
"HeaderActivity": "Tevékenységek",
|
||||||
"HeaderAdditionalParts": "További részek",
|
"HeaderAdditionalParts": "További részek",
|
||||||
"HeaderAdmin": "Felügyelet",
|
"HeaderAdmin": "Felügyelet",
|
||||||
"HeaderAlbumArtists": "Albumelőadók",
|
"HeaderAlbumArtists": "Album előadók",
|
||||||
"HeaderAlert": "Figyelem",
|
"HeaderAlert": "Figyelem",
|
||||||
"HeaderAllowMediaDeletionFrom": "Médiatörlés engedélyezése innen",
|
"HeaderAllowMediaDeletionFrom": "Médiatörlés engedélyezése innen",
|
||||||
"HeaderApiKey": "API kulcs",
|
"HeaderApiKey": "API kulcs",
|
||||||
|
@ -1114,7 +1114,7 @@
|
||||||
"EnableStreamLooping": "Élő műsorfolyamok automatikus újrajátszása",
|
"EnableStreamLooping": "Élő műsorfolyamok automatikus újrajátszása",
|
||||||
"EnableStreamLoopingHelp": "Kapcsold be, ha az élő stream csak néhány másodpercnyi adatot tartalmaz és folyamatosan újra kell kérni. Ennek szükségtelen bekapcsolása problémát okozhat.",
|
"EnableStreamLoopingHelp": "Kapcsold be, ha az élő stream csak néhány másodpercnyi adatot tartalmaz és folyamatosan újra kell kérni. Ennek szükségtelen bekapcsolása problémát okozhat.",
|
||||||
"Guide": "Műsorújság",
|
"Guide": "Műsorújság",
|
||||||
"H264CrfHelp": "A 'Constant Rate Factor' (CRF) az alapértelmezett minőségi beállítás az x264 és x265 enkóderhez. Az értékek 0 és 51 között állíthatók, ahol az alacsonyabb érték jobb minőséget eredményez (nagyobb fájl méret mellett). Az ajánlott érték 18 és 28 között van. Az x264 alapértelmezett beállítása 23, x265-é 28, ez lehet kiindulási alap.",
|
"H264CrfHelp": "A 'Constant Rate Factor' (CRF) az alapértelmezett minőségi beállítás az x264 és x265 enkóderekhez. Az értékek 0 és 51 között állíthatók, ahol az alacsonyabb érték jobb minőséget eredményez (nagyobb fájl méret mellett). Az ajánlott érték 18 és 28 között van. Az x264 alapértelmezett beállítása 23, x265-é 28, ez lehet kiindulási alap. A hardveresen gyorsított enkóderek nem használják ezt a beállítást.",
|
||||||
"HeaderApiKeysHelp": "A külső alkalmazásoknak egy API kulcsra van szüksége, hogy kommunikáljanak a szerverrel. A kulcsokat egy fiókkal történő belépéssel lehet megkapni, vagy kézileg felvenni egy alkalmazáshoz tartozó kulcsot.",
|
"HeaderApiKeysHelp": "A külső alkalmazásoknak egy API kulcsra van szüksége, hogy kommunikáljanak a szerverrel. A kulcsokat egy fiókkal történő belépéssel lehet megkapni, vagy kézileg felvenni egy alkalmazáshoz tartozó kulcsot.",
|
||||||
"HeaderBranding": "Személyes arculat",
|
"HeaderBranding": "Személyes arculat",
|
||||||
"HeaderContinueListening": "Folyamatban lévő zenék",
|
"HeaderContinueListening": "Folyamatban lévő zenék",
|
||||||
|
@ -1397,7 +1397,7 @@
|
||||||
"LabelTonemappingRange": "Tónusleképezés tartomány",
|
"LabelTonemappingRange": "Tónusleképezés tartomány",
|
||||||
"TonemappingAlgorithmHelp": "A tónusleképezés finomhangolható. Ha még nem ismered ezeket az opciókat, tartsd meg az alapértelmezett értéket. Az ajánlott érték 'BT.2390'.",
|
"TonemappingAlgorithmHelp": "A tónusleképezés finomhangolható. Ha még nem ismered ezeket az opciókat, tartsd meg az alapértelmezett értéket. Az ajánlott érték 'BT.2390'.",
|
||||||
"LabelTonemappingAlgorithm": "Válaszd ki a használni kívánt tónusleképezési algoritmust",
|
"LabelTonemappingAlgorithm": "Válaszd ki a használni kívánt tónusleképezési algoritmust",
|
||||||
"AllowTonemappingHelp": "",
|
"AllowTonemappingHelp": "A tónusleképzés képes a HDR videók dinamika tartományát SDR tartományba átalakítani, miközben megtartja a kép színét és részleteit, ami elengedhetetlen az eredeti látvány megőrzéséhez. Jelenleg csak 10 bites HDR10, HLG és DoVi tartalmakon működik. Használatához szükséges a vonatkozó GPGPU szolgáltatás.",
|
||||||
"EnableTonemapping": "Tónusleképezés engedélyezése",
|
"EnableTonemapping": "Tónusleképezés engedélyezése",
|
||||||
"LabelOpenclDeviceHelp": "Ez az OpenCL eszköz, amelyet a tónusleképezéshez használnak. A pont bal oldala a platform száma, a jobb oldala pedig a platformon található eszköz száma. Az alapértelmezett érték 0.0. Az OpenCL hardveres gyorsítási módszert tartalmazó FFmpeg alkalmazásfájl szükséges.",
|
"LabelOpenclDeviceHelp": "Ez az OpenCL eszköz, amelyet a tónusleképezéshez használnak. A pont bal oldala a platform száma, a jobb oldala pedig a platformon található eszköz száma. Az alapértelmezett érték 0.0. Az OpenCL hardveres gyorsítási módszert tartalmazó FFmpeg alkalmazásfájl szükséges.",
|
||||||
"LabelOpenclDevice": "OpenCL eszköz",
|
"LabelOpenclDevice": "OpenCL eszköz",
|
||||||
|
@ -1649,7 +1649,7 @@
|
||||||
"OriginalAirDate": "Eredeti megjelenési dátum",
|
"OriginalAirDate": "Eredeti megjelenési dátum",
|
||||||
"MessageUnauthorizedUser": "Jelenleg nincs jogosultsága a szerver elérésére. További információért fordulj a szerver rendszergazdájához.",
|
"MessageUnauthorizedUser": "Jelenleg nincs jogosultsága a szerver elérésére. További információért fordulj a szerver rendszergazdájához.",
|
||||||
"Digital": "Digitális",
|
"Digital": "Digitális",
|
||||||
"EnableEnhancedNvdecDecoderHelp": "Kísérleti NVDEC implementáció, csak akkor engedélyezze ezt a lehetőséget, ha dekódolási hibákat észlel.",
|
"EnableEnhancedNvdecDecoderHelp": "Bővített NVDEC implementáció, csak akkor engedélyezze, ha dekódolási hibákat észlel.",
|
||||||
"HomeVideosPhotos": "Otthoni videók és fotók",
|
"HomeVideosPhotos": "Otthoni videók és fotók",
|
||||||
"Bold": "Félkövér",
|
"Bold": "Félkövér",
|
||||||
"LabelTextWeight": "Betűvastagság",
|
"LabelTextWeight": "Betűvastagság",
|
||||||
|
@ -1795,5 +1795,74 @@
|
||||||
"LabelServerVersion": "Szerver verzió",
|
"LabelServerVersion": "Szerver verzió",
|
||||||
"AllowSubtitleManagement": "Feliratok szerkesztésének engedélyezése ennél a felhasználónál",
|
"AllowSubtitleManagement": "Feliratok szerkesztésének engedélyezése ennél a felhasználónál",
|
||||||
"AllowContentWithTagsHelp": "Csak a megadott címkék legalább egyikével rendelkező médiát jeleníti meg.",
|
"AllowContentWithTagsHelp": "Csak a megadott címkék legalább egyikével rendelkező médiát jeleníti meg.",
|
||||||
"AirPlay": "AirPlay"
|
"AirPlay": "AirPlay",
|
||||||
|
"LabelScanBehaviorHelp": "A kiindulási magatartás nem blokkoló, tehát a tartalom a könyvtárba kerül a lejátszástrükk generálás befejezése előtt. A blokkoló magatartás meggátolja könyvtárba kerülést a generálás befejeződéséig, de lényegesen hosszabbá teszi a könyvtárak beolvasását.",
|
||||||
|
"PlaybackError.SERVER_ERROR": "A lejátszás meghiúsult kiszolgáló hiba miatt.",
|
||||||
|
"PlaybackError.NO_MEDIA_ERROR": "Nem található lejátszható tartalom.",
|
||||||
|
"BlockContentWithTagsHelp": "Rejtse el a legalább egy megadott címkével ellátott tartalmakat.",
|
||||||
|
"PlaybackError.NETWORK_ERROR": "A lejátszás meghiúsult hálózati hiba miatt.",
|
||||||
|
"PlaybackError.PLAYER_ERROR": "A lejátszás meghiúsult végzetes lejátszó hiba miatt.",
|
||||||
|
"SavePassword": "Jelszó mentése",
|
||||||
|
"LabelEncodingFormatOptions": "Enkóder formátum beállítások",
|
||||||
|
"EncodingFormatHelp": "Válaszd ki, hogy a Jellyfin melyik enkódert használja. Ha hardveres gyorsítás nem elérhető a választott enkóderhez, a Jellyfin szoftver enkódert fog helyette használni. A H264 enkóder mindig engedélyezve lesz.",
|
||||||
|
"Trickplay": "Lejátszótrükk",
|
||||||
|
"PlaybackError.MEDIA_DECODE_ERROR": "A lejátszás meghiúsult tartalom dekódolási hiba miatt.",
|
||||||
|
"PlaybackError.MEDIA_NOT_SUPPORTED": "A lejátszás meghiúsult, mert a tartalmat a kliens nem támogatja.",
|
||||||
|
"PlaybackError.NotAllowed": "Ennek a tartalomnak a lejátszása nem engedélyezett.",
|
||||||
|
"BlockingScan": "Blokkoló - beütemezi a generációt és blokkolja a tartalom keresést ameddig elkészül",
|
||||||
|
"LabelTrickplayAccelEncodingHelp": "Jelenleg csak QSV és VAAPI gyorsítókon elérhető, más hardveres gyorsítókat nem befolyásol.",
|
||||||
|
"PriorityHigh": "Magas",
|
||||||
|
"LabelTrickplayAccelEncoding": "Hardveresen gyorsított MJPEG enkódolás engedélyezése",
|
||||||
|
"ConfirmDeleteLyrics": "A dalszövegek törlésével azok törlődni fognak a fájlrendszerből és a médiakönyvtárból is. Biztosan folytatni akarod?",
|
||||||
|
"DeleteEntireSeries": "{0} Epizód törlése",
|
||||||
|
"DeleteEpisode": "Epizód törlése",
|
||||||
|
"DeleteLyrics": "Dalszövegek törlése",
|
||||||
|
"DeleteSeries": "Sorozat törlése",
|
||||||
|
"DeleteName": "{0} Törlése",
|
||||||
|
"ErrorDeletingLyrics": "A dalszövegek törlése közben hiba lépett fel. Kérlek ellenőrizd, hogy a Jellyfin rendelkezik e írási jogosultsággal a könyvtárhoz, majd próbáld újra.",
|
||||||
|
"HeaderDeleteSeries": "Sorozat törlése",
|
||||||
|
"HeaderDeleteLyrics": "Dalszövegek Törlése",
|
||||||
|
"HeaderNoLyrics": "Nem található dalszöveg",
|
||||||
|
"LimitSupportedVideoResolutionHelp": "Használja a maximum engedélyezett videó átkódolási felbontást a maximum támogatott videó felbontásként.",
|
||||||
|
"Lyric": "Dalszöveg",
|
||||||
|
"Lyrics": "Dalszövegek",
|
||||||
|
"PlaybackError.RateLimitExceeded": "Ez a tartalom jelenleg nem játszható adatkorlát miatt.",
|
||||||
|
"ViewLyrics": "Dalszövegek megtekintése",
|
||||||
|
"EnableVideoToolboxTonemapping": "VideoToolbox tónusleképzés engedélyezése",
|
||||||
|
"AllowVideoToolboxTonemappingHelp": "Hardveresen gyorsított tónusleképzés a VideoToolbox-tól. Képes a HDR10, HDR10+ és HLG formátumok dekódolására, de nem támogatja a Dolby Vision Profile 5-öt. Ez magasabb prioritású más Metal implementációkhoz képest.",
|
||||||
|
"PriorityAboveNormal": "Normális feletti",
|
||||||
|
"PriorityNormal": "Normális",
|
||||||
|
"PriorityBelowNormal": "Normális alatti",
|
||||||
|
"PriorityIdle": "Üresjárat",
|
||||||
|
"EnableLibrary": "Könyvtár engedélyezése",
|
||||||
|
"EnableLibraryHelp": "Könyvtár tiltása, miközben rejtve marad az összes felhasználó elől.",
|
||||||
|
"LabelProcessPriority": "Folyamat prioritása",
|
||||||
|
"EnableSmoothScroll": "Folyékony görgetés engedélyezése",
|
||||||
|
"LabelAllowContentWithTags": "Engedje a címkézett elemeket",
|
||||||
|
"LimitSupportedVideoResolution": "Korlátozza a maximális támogatott videó felbontást",
|
||||||
|
"PlaybackError.ASS_RENDER_ERROR": "Hiba történt az ASS/SSA feliratok renderelésekor.",
|
||||||
|
"PlaybackError.FATAL_HLS_ERROR": "Végzetes hiba jelentkezett a HLS stream-ben.",
|
||||||
|
"LabelTrickplayAccel": "Hardveres dekódolás engedélyezése",
|
||||||
|
"NonBlockingScan": "Nem blokkoló - beütemezi a generálást, majd visszatér",
|
||||||
|
"LabelScanBehavior": "Tartalom keresési magatartás",
|
||||||
|
"ConfirmDeleteSeries": "A sorozat törlésével törlődni fog az ÖSSZES {0} epizód a fájlrendszerből és a médiakönyvtárból is. Biztosan folytatni akarod?",
|
||||||
|
"LabelQscaleHelp": "Az ffmpeg kimeneti képkockák minőségskálája, melyen 2 a legmagasabb és 31 a legalacsonyabb minőségi érték.",
|
||||||
|
"LabelTrickplayThreads": "FFmpeg szálak",
|
||||||
|
"LabelWidthResolutions": "Horizontális felbontás",
|
||||||
|
"ExtractTrickplayImagesHelp": "A lejátszástrükk képkockák hasonlóak a fejezetképekhez, de a tartalom teljes hosszában generálódnak hogy aztán a videó tekerésekor megjelenjenek az idővonalon előnézeteként.",
|
||||||
|
"LabelProcessPriorityHelp": "Ennek az alacsonyabbra vagy magasabbra állításával szabályozható, hogy a processzoron az ffmpeg lejátszástrükk generálás folyamata milyen prioritással fusson más folyamatokhoz képest. Ha lassulást tapasztal lejátszástrükk generálás közben, de nem akarja leállítani a folyamatot, próbálja meg csökkenteni a prioritást és a használt processzor szálak számát.",
|
||||||
|
"LabelImageInterval": "Kép intervallum",
|
||||||
|
"LabelTileWidth": "Csempe szélesség",
|
||||||
|
"LabelTileHeight": "Csempe magasság",
|
||||||
|
"LabelTileWidthHelp": "Csempén elhelyezkedő képek maximális száma vízszintesen.",
|
||||||
|
"LabelImageIntervalHelp": "Időintervallum (ms) lejátszástrükk képkockák között.",
|
||||||
|
"LabelJpegQuality": "JPEG minőség",
|
||||||
|
"LabelWidthResolutionsHelp": "A generálandó lejátszástrükk képkockák szélességének (px) vesszővel elválasztott listája. Minden képkocka a forrás képarányával arányos, így egy 320 széles 16:9 arányú képkocka felbontása körülbelül 320x180 lesz.",
|
||||||
|
"LabelJpegQualityHelp": "Lejátszástrükk képkockák JPEG tömörítési minősége.",
|
||||||
|
"LabelQscale": "Qskála",
|
||||||
|
"LabelTileHeightHelp": "Csempén elhelyezkedő képek maximális száma függőlegesen.",
|
||||||
|
"LabelTrickplayThreadsHelp": "Az ffmpeg '-threads' argumentumának átadandó szálak száma.",
|
||||||
|
"OptionExtractTrickplayImage": "Lejátszástrükk képkockák kinyerésének engedélyezése",
|
||||||
|
"LabelExtractTrickplayDuringLibraryScan": "Lejátszástrükk képkockák kinyerése a könyvtár beolvasásakor",
|
||||||
|
"LabelExtractTrickplayDuringLibraryScanHelp": "Lejátszástrükk képkockák generálása könyvtár beolvasáskor a frissen importált videóknál. Ha nincs bekapcsolva, a lejátszástrükk képkockákat az erre ütemezett feladat fogja kinyerni. Nem blokkoló magatartás esetén ez nem befolyásolja a könyvtár beolvasás idejét."
|
||||||
}
|
}
|
||||||
|
|
|
@ -915,11 +915,11 @@
|
||||||
"MinutesAfter": "Menit Setelah",
|
"MinutesAfter": "Menit Setelah",
|
||||||
"MetadataManager": "Manajer Metadata",
|
"MetadataManager": "Manajer Metadata",
|
||||||
"Metadata": "Metadata",
|
"Metadata": "Metadata",
|
||||||
"MessageSyncPlayErrorMedia": "Gagal Mengaktifkan SyncPlay! Media Error cok.",
|
"MessageSyncPlayErrorMedia": "Gagal Mengaktifkan SyncPlay! Media Error.",
|
||||||
"MessageSyncPlayErrorMissingSession": "SyncPlay gagal! Sesi Hilang njir...",
|
"MessageSyncPlayErrorMissingSession": "SyncPlay gagal! Sesi Hilang njir...",
|
||||||
"MessageSyncPlayErrorNoActivePlayer": "SyncPlay dimatikan. Tidak ada pemutar aktif.",
|
"MessageSyncPlayErrorNoActivePlayer": "SyncPlay dimatikan. Tidak ada pemutar aktif.",
|
||||||
"MessageSyncPlayErrorAccessingGroups": "Muncul Error ketika mengakses list grup.",
|
"MessageSyncPlayErrorAccessingGroups": "Muncul Error ketika mengakses list grup.",
|
||||||
"MessageSyncPlayLibraryAccessDenied": "Akses konten ini Dibatasi cok.",
|
"MessageSyncPlayLibraryAccessDenied": "Akses konten ini Dibatasi.",
|
||||||
"MessageSyncPlayJoinGroupDenied": "Tidak dapat bergabung dengan grup.",
|
"MessageSyncPlayJoinGroupDenied": "Tidak dapat bergabung dengan grup.",
|
||||||
"MessageSyncPlayCreateGroupDenied": "ijin diperlukan untuk membuat grup.",
|
"MessageSyncPlayCreateGroupDenied": "ijin diperlukan untuk membuat grup.",
|
||||||
"MessageSyncPlayGroupDoesNotExist": "Gagal bergabung dengan grup karena tidak ada njing!.",
|
"MessageSyncPlayGroupDoesNotExist": "Gagal bergabung dengan grup karena tidak ada njing!.",
|
||||||
|
@ -1681,5 +1681,7 @@
|
||||||
"AllowCollectionManagement": "Izinkan pengguna ini untuk mengatur koleksi",
|
"AllowCollectionManagement": "Izinkan pengguna ini untuk mengatur koleksi",
|
||||||
"AllowSegmentDeletion": "Hapus segmen",
|
"AllowSegmentDeletion": "Hapus segmen",
|
||||||
"LabelThrottleDelaySeconds": "Batasi setelah",
|
"LabelThrottleDelaySeconds": "Batasi setelah",
|
||||||
"LabelSegmentKeepSeconds": ""
|
"LabelSegmentKeepSeconds": "Waktu untuk menetapkan segmen",
|
||||||
|
"AllowSubtitleManagement": "Izinkan user untuk mengubah tarakir",
|
||||||
|
"AllowSegmentDeletionHelp": "Hapus bagian lama setelah terunduh oleh pengguna. Fitur ini akan mencegah penyimpanan file teralihsandikan ke dalam penyimpanan. Matikan fitur ini jika terjadi masalah dalam pemutaran."
|
||||||
}
|
}
|
||||||
|
|
|
@ -1264,7 +1264,7 @@
|
||||||
"ListPaging": "{0}-{1} di {2}",
|
"ListPaging": "{0}-{1} di {2}",
|
||||||
"WriteAccessRequired": "Jellyfin richiede il permesso di scrittura su questa cartella. Verificare l'autorizzazione e riprovare.",
|
"WriteAccessRequired": "Jellyfin richiede il permesso di scrittura su questa cartella. Verificare l'autorizzazione e riprovare.",
|
||||||
"PathNotFound": "Percorso non trovato. Assicurarsi che sia valido e riprovare.",
|
"PathNotFound": "Percorso non trovato. Assicurarsi che sia valido e riprovare.",
|
||||||
"Yadif": "YADIF",
|
"Yadif": "Yet Another DeInterlacing Filter (YADIF)",
|
||||||
"Season": "Stagione",
|
"Season": "Stagione",
|
||||||
"Movie": "Film",
|
"Movie": "Film",
|
||||||
"LabelLibraryPageSizeHelp": "Numero di elementi presenti nella paginazione della libreria. Il valore 0 disabilita la paginazione.",
|
"LabelLibraryPageSizeHelp": "Numero di elementi presenti nella paginazione della libreria. Il valore 0 disabilita la paginazione.",
|
||||||
|
@ -1369,7 +1369,7 @@
|
||||||
"Image": "Immagine",
|
"Image": "Immagine",
|
||||||
"Other": "Altro",
|
"Other": "Altro",
|
||||||
"Data": "Dati",
|
"Data": "Dati",
|
||||||
"Bwdif": "BWDIF",
|
"Bwdif": "Bob Weaver DeInterlacing Filter (BWDIF)",
|
||||||
"UseDoubleRateDeinterlacing": "Raddoppia il frame rate durante il deinterlacciamento",
|
"UseDoubleRateDeinterlacing": "Raddoppia il frame rate durante il deinterlacciamento",
|
||||||
"KnownProxiesHelp": "Lista degli IP o hostname separati da virgola dei proxy utilizzati per connettersi a Jellyfin. Ciò consente di gestire al meglio gli header 'X-Forwarded-For'. Richiede il riavvio dopo il salvataggio.",
|
"KnownProxiesHelp": "Lista degli IP o hostname separati da virgola dei proxy utilizzati per connettersi a Jellyfin. Ciò consente di gestire al meglio gli header 'X-Forwarded-For'. Richiede il riavvio dopo il salvataggio.",
|
||||||
"LabelKnownProxies": "Proxy conosciuti",
|
"LabelKnownProxies": "Proxy conosciuti",
|
||||||
|
@ -1867,5 +1867,23 @@
|
||||||
"HeaderDeleteLyrics": "Cancella Testi",
|
"HeaderDeleteLyrics": "Cancella Testi",
|
||||||
"HeaderNoLyrics": "Nessun testo trovato",
|
"HeaderNoLyrics": "Nessun testo trovato",
|
||||||
"Lyrics": "Testi",
|
"Lyrics": "Testi",
|
||||||
"ViewLyrics": "Visualizza testi"
|
"ViewLyrics": "Visualizza testi",
|
||||||
|
"PlaylistError.AddFailed": "Errore nell'aggiunta alla playlist",
|
||||||
|
"PlaylistError.CreateFailed": "Errore nella creazione della playlist",
|
||||||
|
"SavePassword": "Salva Password",
|
||||||
|
"Author": "Autore",
|
||||||
|
"Creator": "Creatore",
|
||||||
|
"Editor": "Editore",
|
||||||
|
"Illustrator": "Illustratore",
|
||||||
|
"Letterer": "Paroliere",
|
||||||
|
"SaveLyricsIntoMediaFolders": "Salva le liriche nella cartella dei media",
|
||||||
|
"Translator": "Traduttore",
|
||||||
|
"EnableDts": "Abilita DTS (DCA)",
|
||||||
|
"EnableDtsHelp": "Abilitare solo se il device supporta DTS o se connesso a un ricevitore audio compatibile, altrimenti può causare errori di riproduzione.",
|
||||||
|
"EnableTrueHd": "Abilita TrueHD",
|
||||||
|
"EnableTrueHdHelp": "Abilita solo se il device supporta TrueHD o se connesso a un ricevitore audio compatibile, altrimenti può causare errori di riproduzione.",
|
||||||
|
"HeaderVideoAdvanced": "Avanzate Video",
|
||||||
|
"PlaylistPublic": "Consenti accesso pubblico",
|
||||||
|
"PlaylistPublicDescription": "Consenti che questa playlist sia visibile ad ogni utente loggato.",
|
||||||
|
"HeaderLyricDownloads": "Downloads Liriche"
|
||||||
}
|
}
|
||||||
|
|
|
@ -190,7 +190,7 @@
|
||||||
"ColorTransfer": "Color transfer",
|
"ColorTransfer": "Color transfer",
|
||||||
"DeathDateValue": "死亡日:{0}",
|
"DeathDateValue": "死亡日:{0}",
|
||||||
"Depressed": "陰鬱",
|
"Depressed": "陰鬱",
|
||||||
"ErrorAddingListingsToSchedulesDirect": "Schedules Directのアカウントにラインナップを追加中にエラーが発生しました。 スケジュールダイレクトでは、アカウントごとに限られた数のラインナップしか許可されません。続けるには、Schedules Direct にログインしてアカウントから他のリストを削除する必要があります。",
|
"ErrorAddingListingsToSchedulesDirect": "Schedules Direct のアカウントにラインナップを追加中にエラーが発生しました。Schedules Direct では、アカウントごとに限られた数のラインナップしか許可されません。続けるには、Schedules Direct にログインしてアカウントから他のリストを削除する必要があります。",
|
||||||
"ErrorAddingMediaPathToVirtualFolder": "メディアパスの追加中にエラーが発生しました。 パスが有効で、Jellyfin がその場所にアクセスできることを確認してください。",
|
"ErrorAddingMediaPathToVirtualFolder": "メディアパスの追加中にエラーが発生しました。 パスが有効で、Jellyfin がその場所にアクセスできることを確認してください。",
|
||||||
"ErrorAddingTunerDevice": "チューナーデバイスの追加中にエラーが発生しました。 アクセス可能であることを確認して、もう一度やり直してください。",
|
"ErrorAddingTunerDevice": "チューナーデバイスの追加中にエラーが発生しました。 アクセス可能であることを確認して、もう一度やり直してください。",
|
||||||
"ErrorAddingXmlTvFile": "XMLTV ファイルへのアクセス中にエラーが発生しました。 ファイルが存在することを確認して、やり直してください。",
|
"ErrorAddingXmlTvFile": "XMLTV ファイルへのアクセス中にエラーが発生しました。 ファイルが存在することを確認して、やり直してください。",
|
||||||
|
@ -227,7 +227,7 @@
|
||||||
"Guide": "ガイド",
|
"Guide": "ガイド",
|
||||||
"GuideProviderLogin": "ログイン",
|
"GuideProviderLogin": "ログイン",
|
||||||
"GuideProviderSelectListings": "リストを選択",
|
"GuideProviderSelectListings": "リストを選択",
|
||||||
"H264CrfHelp": "Constant Rate Factor」(CRF)は、x264 および x265 エンコーダのデフォルトの品質設定です。0 から 51 の間で値を設定することができ、低い値はより良い品質となります(より高いファイルサイズを犠牲にして)。正常な値は18と28の間です。x264のデフォルトは23、x265のデフォルトは28なので、これを出発点として使用することができます。",
|
"H264CrfHelp": "「Constant Rate Factor」(CRF)は、x264 および x265 ソフトウェアエンコーダのデフォルトの品質設定です。0 から 51 の間で値を設定することができ、低い値はより良い品質となります(より高いファイルサイズを犠牲にして)。正常な値は18と28の間です。x264のデフォルトは23、x265のデフォルトは28なので、これを出発点として使用することができます。ハードウェアエンコーダーはこれらの設定を使用しません。",
|
||||||
"EncoderPresetHelp": "パフォーマンスを向上させるには小さい値を、品質を向上させるには大きい値を選んでください。",
|
"EncoderPresetHelp": "パフォーマンスを向上させるには小さい値を、品質を向上させるには大きい値を選んでください。",
|
||||||
"HDPrograms": "HD番組",
|
"HDPrograms": "HD番組",
|
||||||
"HardwareAccelerationWarning": "ハードウェアアクセラレーションを有効にすると、環境によっては不安定になる可能性があります。 オペレーティングシステムとビデオドライバが完全に最新であることを確認してください。 これを有効にした後でビデオの再生が困難な場合は、設定を[なし]に戻す必要があります。",
|
"HardwareAccelerationWarning": "ハードウェアアクセラレーションを有効にすると、環境によっては不安定になる可能性があります。 オペレーティングシステムとビデオドライバが完全に最新であることを確認してください。 これを有効にした後でビデオの再生が困難な場合は、設定を[なし]に戻す必要があります。",
|
||||||
|
@ -713,7 +713,7 @@
|
||||||
"LabelAlbumArtists": "アルバムアーティスト",
|
"LabelAlbumArtists": "アルバムアーティスト",
|
||||||
"LabelAllowHWTranscoding": "ハードウェアトランスコーディングを許可",
|
"LabelAllowHWTranscoding": "ハードウェアトランスコーディングを許可",
|
||||||
"LabelAllowedRemoteAddresses": "リモートIPアドレスフィルター",
|
"LabelAllowedRemoteAddresses": "リモートIPアドレスフィルター",
|
||||||
"LabelAppNameExample": "例: スケートボード、ソナー",
|
"LabelAppNameExample": "API キーを識別するための人が判読できる名前。この設定は機能には影響しません。",
|
||||||
"LabelArtists": "アーティスト",
|
"LabelArtists": "アーティスト",
|
||||||
"LabelAudioBitDepth": "音声ビット深度",
|
"LabelAudioBitDepth": "音声ビット深度",
|
||||||
"LabelAudioBitrate": "音声ビットレート",
|
"LabelAudioBitrate": "音声ビットレート",
|
||||||
|
@ -1387,7 +1387,7 @@
|
||||||
"LabelTonemappingRange": "トーンマッピングの範囲",
|
"LabelTonemappingRange": "トーンマッピングの範囲",
|
||||||
"TonemappingAlgorithmHelp": "トーンマッピングは微調整が可能です。これらのオプションに慣れていない場合は、デフォルトのままにしておいてください。推奨値は'BT.2390'です。",
|
"TonemappingAlgorithmHelp": "トーンマッピングは微調整が可能です。これらのオプションに慣れていない場合は、デフォルトのままにしておいてください。推奨値は'BT.2390'です。",
|
||||||
"LabelTonemappingAlgorithm": "使用するトーンマッピング アルゴリズムを選択",
|
"LabelTonemappingAlgorithm": "使用するトーンマッピング アルゴリズムを選択",
|
||||||
"AllowTonemappingHelp": "トーンマッピングは、元のシーンを表現するのに非常に重要な情報である画像のディテールや色を維持したまま、映像のダイナミックレンジを HDR から SDR に変換することができます。現在、10 ビット HDR、HLG と DoVi ビデオでのみ動作します。対応する OpenCL または CUDA ランタイムが必須です。",
|
"AllowTonemappingHelp": "トーンマッピングは、元のシーンを表現するのに非常に重要な情報である画像のディテールや色を維持したまま、映像のダイナミックレンジを HDR から SDR に変換することができます。現在、10 ビット HDR、HLG と DoVi ビデオでのみ動作します。対応する GPGPU ランタイムが必須です。",
|
||||||
"EnableTonemapping": "トーンマッピングを有効化",
|
"EnableTonemapping": "トーンマッピングを有効化",
|
||||||
"LabelOpenclDeviceHelp": "これはトーンマッピングに使用する OpenCL デバイスです。ドットの左側がプラットフォーム番号、右側がプラットフォーム上のデバイス番号となります。デフォルト値は 0.0。FFmpeg アプリケーションファイルは OpenCL ハードウェアアクセラレーションメソッドを含む必要があります。",
|
"LabelOpenclDeviceHelp": "これはトーンマッピングに使用する OpenCL デバイスです。ドットの左側がプラットフォーム番号、右側がプラットフォーム上のデバイス番号となります。デフォルト値は 0.0。FFmpeg アプリケーションファイルは OpenCL ハードウェアアクセラレーションメソッドを含む必要があります。",
|
||||||
"LabelOpenclDevice": "OpenCL デバイス",
|
"LabelOpenclDevice": "OpenCL デバイス",
|
||||||
|
@ -1415,8 +1415,8 @@
|
||||||
"ListPaging": "{2} 中の {0}-{1}",
|
"ListPaging": "{2} 中の {0}-{1}",
|
||||||
"WriteAccessRequired": "Jellyfin はこのフォルダへの書き込み権限を要求します。書き込みアクセスを確認してもう一度お試しください。",
|
"WriteAccessRequired": "Jellyfin はこのフォルダへの書き込み権限を要求します。書き込みアクセスを確認してもう一度お試しください。",
|
||||||
"PathNotFound": "パスを見つけることができませんでした。パスが有効であることを確認してもう一度お試しください。",
|
"PathNotFound": "パスを見つけることができませんでした。パスが有効であることを確認してもう一度お試しください。",
|
||||||
"Bwdif": "BWDIF",
|
"Bwdif": "Bob Weaver DeInterlacing Filter (BWDIF)",
|
||||||
"Yadif": "YADIF",
|
"Yadif": "Yet Another DeInterlacing Filter (YADIF)",
|
||||||
"XmlTvSportsCategoriesHelp": "これらのカテゴリの番組はスポーツ番組として表示されます。複数の場合は '|' で区切ってください。",
|
"XmlTvSportsCategoriesHelp": "これらのカテゴリの番組はスポーツ番組として表示されます。複数の場合は '|' で区切ってください。",
|
||||||
"XmlTvPathHelp": "XMLTV ファイルのパス。Jellyfin はこのファイルを読み込んで定期的に更新を確認します。ファイルの作成と更新はあなたが責任を持って行ってください。",
|
"XmlTvPathHelp": "XMLTV ファイルのパス。Jellyfin はこのファイルを読み込んで定期的に更新を確認します。ファイルの作成と更新はあなたが責任を持って行ってください。",
|
||||||
"XmlTvNewsCategoriesHelp": "これらのカテゴリの番組はニュース番組として表示されます。複数の場合は '|' で区切ってください。",
|
"XmlTvNewsCategoriesHelp": "これらのカテゴリの番組はニュース番組として表示されます。複数の場合は '|' で区切ってください。",
|
||||||
|
@ -1748,7 +1748,7 @@
|
||||||
"Unknown": "不明",
|
"Unknown": "不明",
|
||||||
"AllowCollectionManagement": "このユーザーにコレクションの管理を許可する",
|
"AllowCollectionManagement": "このユーザーにコレクションの管理を許可する",
|
||||||
"AllowSegmentDeletion": "セグメントを削除",
|
"AllowSegmentDeletion": "セグメントを削除",
|
||||||
"AllowSegmentDeletionHelp": "クライアントに送信した古いセグメントを削除します。トランスコードしたファイル全体をディスクに保存しておくことはできなくなります。「スロットル」が有効の場合にのみ動作します。再生に問題が起きたら、オフにしてください。",
|
"AllowSegmentDeletionHelp": "クライアントによりダウンロードされた古いセグメントを削除します。トランスコードしたファイル全体をディスクに保存しておくことはできなくなります。再生に問題が起きたら、オフにしてください。",
|
||||||
"LabelThrottleDelaySeconds": "スロットルまでの時間",
|
"LabelThrottleDelaySeconds": "スロットルまでの時間",
|
||||||
"LabelThrottleDelaySecondsHelp": "「スロットル」を行うまでの秒数。クライアントが安定して再生できるバッファーを維持するのに十分大きなサイズでなければなりません。「スロットル」が有効の場合にのみ動作します。",
|
"LabelThrottleDelaySecondsHelp": "「スロットル」を行うまでの秒数。クライアントが安定して再生できるバッファーを維持するのに十分大きなサイズでなければなりません。「スロットル」が有効の場合にのみ動作します。",
|
||||||
"LabelSegmentKeepSeconds": "セグメントの保存時間",
|
"LabelSegmentKeepSeconds": "セグメントの保存時間",
|
||||||
|
@ -1783,5 +1783,89 @@
|
||||||
"LabelWebVersion": "ウェブバージョン",
|
"LabelWebVersion": "ウェブバージョン",
|
||||||
"LabelTrackGain": "トラックゲイン",
|
"LabelTrackGain": "トラックゲイン",
|
||||||
"ForeignPartsOnly": "強制/外国語パートのみ",
|
"ForeignPartsOnly": "強制/外国語パートのみ",
|
||||||
"HeaderGuestCast": "ゲストスター"
|
"HeaderGuestCast": "ゲストスター",
|
||||||
|
"AirPlay": "AirPlay",
|
||||||
|
"ChannelResolutionSD": "SD",
|
||||||
|
"LabelEncodingFormatOptions": "エンコーディングフォーマットのオプション",
|
||||||
|
"AllowSubtitleManagement": "このユーザーに字幕の編集を許可する",
|
||||||
|
"AllowContentWithTagsHelp": "指定したタグのうち、少なくとも1つが付けられているメディアのみ表示します。",
|
||||||
|
"EncodingFormatHelp": "Jellyfinがトランスコードする際の動画エンコーディングを選択してください。選択したフォーマットのハードウェアアクセラレーションが利用できない場合、Jellyfinはソフトウェアエンコーディングを使用します。H264エンコーディングは常に有効になります。",
|
||||||
|
"LabelTrickplayAccelEncoding": "ハードウェアアクセラレーションを使用したMJPEGエンコーディングを有効にする",
|
||||||
|
"LimitSupportedVideoResolution": "最大対応動画解像度を制限する",
|
||||||
|
"SavePassword": "パスワードを保存",
|
||||||
|
"LabelJpegQuality": "JPEG の品質",
|
||||||
|
"LabelAllowContentWithTags": "タグ付きのアイテムを許可する",
|
||||||
|
"PlaybackError.FATAL_HLS_ERROR": "HLSストリームで致命的なエラーが発生しました。",
|
||||||
|
"PlaybackError.PLAYER_ERROR": "プレーヤーの致命的なエラーにより、再生に失敗しました。",
|
||||||
|
"PlaybackError.SERVER_ERROR": "サーバーエラーにより、再生に失敗しました。",
|
||||||
|
"PlaybackError.NotAllowed": "このメディアの再生は許可されていません。",
|
||||||
|
"LabelScanBehavior": "スキャンの動作",
|
||||||
|
"OptionExtractTrickplayImage": "トリックプレイ画像の抽出を有効にする",
|
||||||
|
"EnableLibrary": "ライブラリーを有効にする",
|
||||||
|
"EnableSmoothScroll": "スムーズスクロールを有効にする",
|
||||||
|
"PlaybackError.ASS_RENDER_ERROR": "ASS/SSA字幕レンダラーでエラーが発生しました。",
|
||||||
|
"AllowVideoToolboxTonemappingHelp": "VideoToolboxによるハードウェアアクセラレーションを使用したトーンマッピングです。これは、HDR10、HDR10+、HLGなどのほとんどのHDRフォーマットで動作しますが、Dolby Vision Profile 5では動作しません。これは、他のMetal実装と比較して優先度が高くなっています。",
|
||||||
|
"LabelImageIntervalHelp": "新しいトリックプレイ画像が生成される時間間隔(ミリ秒)です。",
|
||||||
|
"ConfirmDeleteLyrics": "これらの歌詞を削除すると、ファイルシステムとメディアライブラリーの両方から削除されます。本当に続行しますか?",
|
||||||
|
"DeleteEntireSeries": "{0} つのエピソードを削除",
|
||||||
|
"DeleteLyrics": "歌詞を削除",
|
||||||
|
"DeleteEpisode": "エピソードを削除",
|
||||||
|
"DlnaMovedMessage": "DLNA機能がプラグインに移行されました。",
|
||||||
|
"ErrorDeletingLyrics": "サーバーから歌詞を削除する際にエラーが発生しました。Jellyfinがメディアフォルダへの書き込み権限を持っていることを確認して、もう一度お試しください。",
|
||||||
|
"HeaderNoLyrics": "歌詞が見つかりません",
|
||||||
|
"LimitSupportedVideoResolutionHelp": "「許可された最大動画トランスコード解像度」を最大対応動画解像度として使用します。",
|
||||||
|
"Lyrics": "歌詞",
|
||||||
|
"PlaybackError.MEDIA_DECODE_ERROR": "メディアのデコード中にエラーが発生したため、再生に失敗しました。",
|
||||||
|
"PlaybackError.MEDIA_NOT_SUPPORTED": "クライアントがこのメディアをサポートしていないため、再生に失敗しました。",
|
||||||
|
"PlaybackError.NETWORK_ERROR": "ネットワークエラーのため、再生に失敗しました。",
|
||||||
|
"PlaybackError.NO_MEDIA_ERROR": "再生できる有効なメディアソースが見つかりません。",
|
||||||
|
"ViewLyrics": "歌詞を表示",
|
||||||
|
"LabelTrickplayAccel": "ハードウェアデコーディングを有効にする",
|
||||||
|
"LabelTrickplayAccelEncodingHelp": "現在、QSVとVAAPIでのみ利用可能です。このオプションは、他のハードウェアアクセラレーション方式には影響しません。",
|
||||||
|
"LabelQscaleHelp": "ffmpeg で出力される画像のクオリティスケールで、2が最高品質、31が最低品質となります。",
|
||||||
|
"LabelTrickplayThreads": "FFmpeg のスレッド数",
|
||||||
|
"ExtractTrickplayImagesHelp": "トリックプレイ画像は、チャプター画像に似ていますが、コンテンツの全体にわたって使用され、ビデオをスクラブしているときにプレビューを表示するために使用されます。",
|
||||||
|
"LabelExtractTrickplayDuringLibraryScan": "ライブラリスキャン中にトリックプレイ画像を抽出する",
|
||||||
|
"Lyric": "歌詞",
|
||||||
|
"BlockContentWithTagsHelp": "指定したタグの少なくとも1つがあるメディアを隠します。",
|
||||||
|
"ChannelResolutionHD": "HD",
|
||||||
|
"ChannelResolutionFullHD": "Full HD",
|
||||||
|
"ChannelResolutionSDPAL": "SD (PAL)",
|
||||||
|
"DeleteName": "{0} を削除",
|
||||||
|
"ChannelResolutionUHD4K": "UHD (4K)",
|
||||||
|
"Colorist": "カラリスト",
|
||||||
|
"CoverArtist": "カバーアーティスト",
|
||||||
|
"HeaderDeleteSeries": "シリーズを削除",
|
||||||
|
"ConfirmDeleteSeries": "このシリーズを削除すると、システムとメディアライブラリーの両方から {0} エピソード「すべて」を削除することになります。本当に続行してもいいですか?",
|
||||||
|
"EnableLibraryHelp": "ライブラリーを無効化すると、すべてのユーザービューからライブラリーが非表示になります。",
|
||||||
|
"EnableDts": "DTS (DCA) を有効化",
|
||||||
|
"EnableDtsHelp": "デバイスが DTS をサポートしているか、互換性のある音声レシーバーに接続している場合にも見有効化してください。そうでなければ、再生が失敗する可能性があります。",
|
||||||
|
"EnableTrueHd": "TrueHD を有効化",
|
||||||
|
"EnableTrueHdHelp": "TrueHD をサポートするデバイスか、互換性のある音声レシーバーと接続した場合にのみ有効化してください。そうでなければ、再生が失敗する可能性があります。",
|
||||||
|
"HeaderDeleteLyrics": "歌詞を削除",
|
||||||
|
"DeleteSeries": "シリーズを削除",
|
||||||
|
"LabelProcessPriority": "プロセスの優先度",
|
||||||
|
"Author": "作者",
|
||||||
|
"Creator": "クリエイター",
|
||||||
|
"Editor": "編集者",
|
||||||
|
"Illustrator": "イラストレーター",
|
||||||
|
"Translator": "翻訳者",
|
||||||
|
"PriorityNormal": "普通",
|
||||||
|
"LabelTileWidth": "タイルの幅",
|
||||||
|
"LabelTileHeight": "タイルの高さ",
|
||||||
|
"PriorityIdle": "アイドル中",
|
||||||
|
"PlaybackError.RateLimitExceeded": "レート制限のため、現在このメディアは再生できません。",
|
||||||
|
"PriorityBelowNormal": "普通以下",
|
||||||
|
"PriorityAboveNormal": "普通以上",
|
||||||
|
"LabelImageInterval": "画像インターバル",
|
||||||
|
"PriorityHigh": "高",
|
||||||
|
"LabelTileWidthHelp": "X 方向のタイルあたりの画像の最大数。",
|
||||||
|
"LabelTileHeightHelp": "Y 方向のタイルあたりの画像の最大数。",
|
||||||
|
"LabelTrickplayThreadsHelp": "ffmpeg の「-threads」引数に渡すスレッドの数。",
|
||||||
|
"PlaylistPublic": "パブリックアクセスを許可",
|
||||||
|
"PlaylistPublicDescription": "ログインしているすべてのユーザーがこのプレイリストを閲覧できるようにします。",
|
||||||
|
"HeaderLyricDownloads": "歌詞のダウンロード",
|
||||||
|
"SaveLyricsIntoMediaFolders": "歌詞をメディアフォルダーに保存",
|
||||||
|
"SaveLyricsIntoMediaFoldersHelp": "歌詞をオーディオファイルの隣に保存すると、歌詞の管理がより簡単になります。",
|
||||||
|
"LabelWidthResolutions": "横の解像度"
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,5 +51,100 @@
|
||||||
"LabelThrottleDelaySecondsHelp": "წამთა ოდენობა, რის შემდეგაც ტრანსკოდირება იქნება შეფერხებული. უნდა იყოს საკმარისად ხანგრძლივი, იმისთვის რომ, კლიენტმა შეინარჩუნოს ჯანსაღი ბუფერი. მუშაობს მხოლოდ მაშინ, როდესაც შეფერხების ფუნქცია ჩართულია.",
|
"LabelThrottleDelaySecondsHelp": "წამთა ოდენობა, რის შემდეგაც ტრანსკოდირება იქნება შეფერხებული. უნდა იყოს საკმარისად ხანგრძლივი, იმისთვის რომ, კლიენტმა შეინარჩუნოს ჯანსაღი ბუფერი. მუშაობს მხოლოდ მაშინ, როდესაც შეფერხების ფუნქცია ჩართულია.",
|
||||||
"LabelSegmentKeepSeconds": "მითითებული დროის განმავლობაში მონაკვეთები შეინახება",
|
"LabelSegmentKeepSeconds": "მითითებული დროის განმავლობაში მონაკვეთები შეინახება",
|
||||||
"AirPlay": "ეარფლეი",
|
"AirPlay": "ეარფლეი",
|
||||||
"LabelThrottleDelaySeconds": "შემდეგ"
|
"LabelThrottleDelaySeconds": "შემდეგ",
|
||||||
|
"Audio": "აუდიო",
|
||||||
|
"AllowRemoteAccessHelp": "თუ არარის მონიშნული, ყველა გარე კავშირი დაიბლოკება.",
|
||||||
|
"AllowMediaConversionHelp": "მედიის კონვერტაციის უფლების მიცემა ან ჩამორთმევა.",
|
||||||
|
"AspectRatio": "ასპექტის თანაფარდობა",
|
||||||
|
"Auto": "ავტომატური",
|
||||||
|
"ButtonAddServer": "სერვერის დამატება",
|
||||||
|
"AllowOnTheFlySubtitleExtraction": "სუბტიტრების პროცესში ამოღების დაშვება",
|
||||||
|
"ButtonUninstall": "წაშლა",
|
||||||
|
"AllowMediaConversion": "მედიის კონვერტაციის დაშვება",
|
||||||
|
"AnyLanguage": "ნებისმიერი ენა",
|
||||||
|
"BlockContentWithTagsHelp": "ისეთი მედიის დამალვა, რომელსაც გააჩნია არჩეულებიდან ერთი თეგი მაინც.",
|
||||||
|
"ButtonParentalControl": "მშობლის კონტროლი",
|
||||||
|
"ChannelResolutionUHD4K": "UHD (4K)",
|
||||||
|
"AllowRemoteAccess": "ამ სერვერზე გარე კავშირების დაშვება",
|
||||||
|
"Artist": "მსახიობი",
|
||||||
|
"ButtonAddScheduledTaskTrigger": "ტრიგერის დამატება",
|
||||||
|
"ButtonRefreshGuideData": "გაიდის დატის გადატვირთვა",
|
||||||
|
"ButtonRename": "გადარქმევა",
|
||||||
|
"ChannelNameOnly": "მხოლოდ არხი {0}",
|
||||||
|
"ChannelNumber": "არხის ნომერი",
|
||||||
|
"Author": "ავტორი",
|
||||||
|
"Blacklist": "შავი სია",
|
||||||
|
"ButtonActivate": "აქტივაცია",
|
||||||
|
"ButtonAddMediaLibrary": "მედიის ბიბლიოთეკის დამატება",
|
||||||
|
"ButtonArrowLeft": "მარცხნივ",
|
||||||
|
"ButtonArrowRight": "მარჯვნივ",
|
||||||
|
"ButtonEditUser": "იუზერის რედაქტირება",
|
||||||
|
"ButtonForgotPassword": "პაროლი დამავიწყდა",
|
||||||
|
"ButtonPlayer": "ფლეერი",
|
||||||
|
"ButtonResume": "გაგრძელება",
|
||||||
|
"ButtonRevoke": "წართმევა",
|
||||||
|
"ButtonSelectView": "ხედვის არჩევა",
|
||||||
|
"ButtonSend": "გაგზავნა",
|
||||||
|
"ButtonStart": "დაწყება",
|
||||||
|
"CancelRecording": "ჩაწერვის გაუქმება",
|
||||||
|
"Categories": "კატეგორიები",
|
||||||
|
"ChannelResolutionFullHD": "Full HD",
|
||||||
|
"ClearQueue": "რიგის გასუფთავება",
|
||||||
|
"ClientSettings": "კლიენტის პარამეტრები",
|
||||||
|
"CommunityRating": "საზოგადოების რეიტინგი",
|
||||||
|
"Composer": "კომპოზიტორი",
|
||||||
|
"Conductor": "დირიჟორი",
|
||||||
|
"AlwaysPlaySubtitles": "ყოველთვის დაკვრა",
|
||||||
|
"AlwaysPlaySubtitlesHelp": "სუბტიტრები ჩაიტვირთება ენის პარამეტრის მიხედვით, აუდიოს ენის მიუხედავად.",
|
||||||
|
"Anytime": "ნებისმიერ დროს",
|
||||||
|
"ApiKeysCaption": "ამჟამად ჩართული API გასაღებთა სია",
|
||||||
|
"AroundTime": "დაახლოებით {0}",
|
||||||
|
"Arranger": "დამხარისხებელი",
|
||||||
|
"Ascending": "ზრდადი",
|
||||||
|
"AskAdminToCreateLibrary": "ბიბლიოთეკის შექმნისათვის, თხოვეთ ადმინისტრატორს.",
|
||||||
|
"AsManyAsPossible": "რაც შეიძლება მეტი",
|
||||||
|
"Authorize": "ნების დართვა",
|
||||||
|
"AuthProviderHelp": "აირჩიეთ აუტენთიფიკატორი რომელიც იქნება გამოყენებული იუზერის პაროლის აუტენთიფიკაციის დროს.",
|
||||||
|
"Banner": "ბანერი",
|
||||||
|
"BirthDateValue": "დაიბადა: {0}",
|
||||||
|
"BirthLocation": "დაბადების ადგილი",
|
||||||
|
"BirthPlaceValue": "დაბადების ადგილი: {0}",
|
||||||
|
"ButtonAddImage": "სურათის დამატება",
|
||||||
|
"ButtonAddUser": "იუზერის დამატება",
|
||||||
|
"ButtonAudioTracks": "აუდიო ხაზები",
|
||||||
|
"ButtonBack": "უკან",
|
||||||
|
"ButtonCancel": "გაუქმება",
|
||||||
|
"ButtonChangeServer": "სერვერის ცვლილება",
|
||||||
|
"ButtonEditOtherUserPreferences": "შეცვალეთ ამ იუზერის პროფილი, სურათი და პირადი პარამეტრები.",
|
||||||
|
"ButtonGotIt": "გასაგებია",
|
||||||
|
"ButtonInfo": "ინფო",
|
||||||
|
"ButtonManualLogin": "ხელით დალოგინება",
|
||||||
|
"ButtonMore": "კიდე",
|
||||||
|
"ButtonPause": "პაუზა",
|
||||||
|
"ButtonQuickStartGuide": "სწრაფი სტარტის გაიდი",
|
||||||
|
"ButtonRemove": "ამოღება",
|
||||||
|
"ButtonSignOut": "გამოსვლა",
|
||||||
|
"ButtonExitApp": "აპლიკაციის დახურვა",
|
||||||
|
"ButtonSpace": "სფეისი",
|
||||||
|
"ButtonSplit": "გახლეჩვა",
|
||||||
|
"ButtonTogglePlaylist": "ფლეილისთი",
|
||||||
|
"ButtonTrailer": "ტრეილერი",
|
||||||
|
"CancelSeries": "სერიალის გაუქმება",
|
||||||
|
"ButtonClose": "დახურვა",
|
||||||
|
"ButtonFullscreen": "მთელ ეკრანზე",
|
||||||
|
"ButtonScanAllLibraries": "ყველა ბიბლიოთეკის სკანირება",
|
||||||
|
"ButtonSelectDirectory": "დირექტორიის არჩევა",
|
||||||
|
"ButtonSubmit": "გაგზავნა",
|
||||||
|
"ButtonLibraryAccess": "წვდომა ბიბლიოთეკაზე",
|
||||||
|
"ButtonNextTrack": "შემდეგი თრექი",
|
||||||
|
"ButtonOk": "ოკ",
|
||||||
|
"ButtonPreviousTrack": "წინა თრექი",
|
||||||
|
"ButtonShutdown": "გამორთვა",
|
||||||
|
"ButtonSignIn": "შესვლა",
|
||||||
|
"ButtonStop": "გაჩერება",
|
||||||
|
"ButtonUseQuickConnect": "Quick Connect-ის გამოყენება",
|
||||||
|
"ButtonWebsite": "ვებსაიტი",
|
||||||
|
"ChannelResolutionHD": "HD",
|
||||||
|
"ChannelResolutionSD": "SD",
|
||||||
|
"ChannelResolutionSDPAL": "SD (PAL)"
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,17 +6,44 @@
|
||||||
"AllEpisodes": "L-episodji kollha",
|
"AllEpisodes": "L-episodji kollha",
|
||||||
"AllLanguages": "Il-lingwi kollha",
|
"AllLanguages": "Il-lingwi kollha",
|
||||||
"AllLibraries": "Il-libreriji kollha",
|
"AllLibraries": "Il-libreriji kollha",
|
||||||
"AccessRestrictedTryAgainLater": "Bħalissa l-aċċess huwa ristrett. Jekk jogħgbok erġa' prova iktar tard.",
|
"AccessRestrictedTryAgainLater": "L-aċċess bħalissa huwa ristrett. Jekk jogħgbok erġa' pprova aktar tard.",
|
||||||
"Actor": "Attur",
|
"Actor": "Attur",
|
||||||
"Add": "Żid",
|
"Add": "Żid",
|
||||||
"AddedOnValue": "{0} Miżjuda",
|
"AddedOnValue": "{0} miżjud",
|
||||||
"AddToCollection": "Żid fil-kollezzjoni",
|
"AddToCollection": "Żid fil-kollezzjoni",
|
||||||
"AddToFavorites": "Żid fil-lista tal-favoriti",
|
"AddToFavorites": "Żid fil-lista tal-favoriti",
|
||||||
"AgeValue": "({0} snin)",
|
"AgeValue": "({0} snin)",
|
||||||
"AirDate": "Data tax-xandir",
|
"AirDate": "Data tax-xandir",
|
||||||
"Aired": "Imxandar",
|
"Aired": "Imxandar",
|
||||||
"Albums": "Albums",
|
"Albums": "Albums",
|
||||||
"All": "Kollox",
|
"All": "Kollha",
|
||||||
"AllChannels": "L-istazzjonijiet kollha",
|
"AllChannels": "L-istazzjonijiet kollha",
|
||||||
"AllComplexFormats": "Il-formats ikkumplikati kollha (ASS, SSA, VobSub, PGS, SUB, IDX, …)"
|
"AllComplexFormats": "Il-formats kumplessi kollha (ASS, SSA, VobSub, PGS, SUB, IDX, …)",
|
||||||
|
"AirPlay": "AirPlay",
|
||||||
|
"Alerts": "Twissijiet",
|
||||||
|
"AlbumArtist": "Artist tal-Album",
|
||||||
|
"AllowedRemoteAddressesHelp": "Lista separata b'virgola ta' indirizzi IP jew entrati ta' IP/netmask għal netwerks li se jitħallew jikkonnettjaw remotament. Jekk titħalla vojta, l-indirizzi remoti kollha jkunu permessi.",
|
||||||
|
"AllowCollectionManagement": "Ħalli lil dan l-utent jimmaniġġja l-kollezzjonijiet",
|
||||||
|
"AllowContentWithTagsHelp": "Uri biss midja b'mill-inqas waħda mit-tags speċifikati.",
|
||||||
|
"AllowSubtitleManagement": "Ħalli lil dan l-utent jeditja s-sottotitli",
|
||||||
|
"Artists": "Artisti",
|
||||||
|
"Collections": "Kollezzjonijiet",
|
||||||
|
"Genres": "Ġeneri",
|
||||||
|
"HeaderContinueWatching": "Kompli Segwi",
|
||||||
|
"Favorites": "Favoriti",
|
||||||
|
"Books": "Kotba",
|
||||||
|
"Channels": "Kanali",
|
||||||
|
"HeaderAlbumArtists": "Artisti tal-album",
|
||||||
|
"AllowSegmentDeletionHelp": "Ħassar segmenti qodma wara li jkunu ġew imniżżla mill-klijent. Dan jipprevjeni li jkollu jaħżen il-fajl kollu transkodifikat fuq disk. Itfi din jekk ikollok problemi ta' daqq.",
|
||||||
|
"AllowSegmentDeletion": "Ħassar segmenti",
|
||||||
|
"LabelSegmentKeepSeconds": "Żmien li żżomm is-segmenti",
|
||||||
|
"Shows": "Programmi",
|
||||||
|
"Default": "Standard",
|
||||||
|
"Playlists": "Playlists",
|
||||||
|
"Folders": "Folders",
|
||||||
|
"Photos": "Ritratti",
|
||||||
|
"Songs": "Kanzunetti",
|
||||||
|
"Movies": "Films",
|
||||||
|
"MusicVideos": "Vidjows tal-Mużika",
|
||||||
|
"ValueSpecialEpisodeName": "Speċjali - {0}"
|
||||||
}
|
}
|
||||||
|
|
|
@ -410,7 +410,7 @@
|
||||||
"LabelAllowedRemoteAddresses": "Filter externe IP-adressen",
|
"LabelAllowedRemoteAddresses": "Filter externe IP-adressen",
|
||||||
"LabelAllowedRemoteAddressesMode": "Filtermodus externe IP-adressen",
|
"LabelAllowedRemoteAddressesMode": "Filtermodus externe IP-adressen",
|
||||||
"LabelAppName": "Applicatienaam",
|
"LabelAppName": "Applicatienaam",
|
||||||
"LabelAppNameExample": "Voorbeeld: Sickbeard, Sonarr",
|
"LabelAppNameExample": "Een leesbare naam om de API-sleutel te herkennen. Deze instelling heeft geen invloed op de functionaliteit.",
|
||||||
"LabelArtists": "Artiesten",
|
"LabelArtists": "Artiesten",
|
||||||
"LabelArtistsHelp": "Scheid meerdere artiesten met een puntkomma.",
|
"LabelArtistsHelp": "Scheid meerdere artiesten met een puntkomma.",
|
||||||
"LabelAudioLanguagePreference": "Voorkeurstaal geluid",
|
"LabelAudioLanguagePreference": "Voorkeurstaal geluid",
|
||||||
|
@ -481,7 +481,7 @@
|
||||||
"LabelEnableDlnaServerHelp": "Sta UPnP-apparaten op je netwerk toe om door inhoud te bladeren en deze af te spelen.",
|
"LabelEnableDlnaServerHelp": "Sta UPnP-apparaten op je netwerk toe om door inhoud te bladeren en deze af te spelen.",
|
||||||
"LabelEnableHardwareDecodingFor": "Hardwaredecodering inschakelen voor",
|
"LabelEnableHardwareDecodingFor": "Hardwaredecodering inschakelen voor",
|
||||||
"LabelEnableRealtimeMonitor": "Real-time monitoring inschakelen",
|
"LabelEnableRealtimeMonitor": "Real-time monitoring inschakelen",
|
||||||
"LabelEnableRealtimeMonitorHelp": "Wijzigingen aan bestanden worden op ondersteunde bestandssystemen direct verwerkt.",
|
"LabelEnableRealtimeMonitorHelp": "Op ondersteunde bestandssystemen worden wijzigingen aan bestanden direct verwerkt.",
|
||||||
"LabelEnableSingleImageInDidlLimit": "Beperken tot een enkele ingesloten afbeelding",
|
"LabelEnableSingleImageInDidlLimit": "Beperken tot een enkele ingesloten afbeelding",
|
||||||
"LabelEnableSingleImageInDidlLimitHelp": "Sommige apparaten zullen niet goed weergeven als er meerdere afbeeldingen ingesloten zijn in DIDL.",
|
"LabelEnableSingleImageInDidlLimitHelp": "Sommige apparaten zullen niet goed weergeven als er meerdere afbeeldingen ingesloten zijn in DIDL.",
|
||||||
"LabelEndDate": "Einddatum",
|
"LabelEndDate": "Einddatum",
|
||||||
|
@ -637,8 +637,8 @@
|
||||||
"LabelServerHost": "Host",
|
"LabelServerHost": "Host",
|
||||||
"LabelServerHostHelp": "192.168.1.100:8096 of https://mijnserver.nl",
|
"LabelServerHostHelp": "192.168.1.100:8096 of https://mijnserver.nl",
|
||||||
"LabelSimultaneousConnectionLimit": "Limiet gelijktijdige streams",
|
"LabelSimultaneousConnectionLimit": "Limiet gelijktijdige streams",
|
||||||
"LabelSkipBackLength": "Terugspoellengte",
|
"LabelSkipBackLength": "Stapgrootte terugspringen",
|
||||||
"LabelSkipForwardLength": "Vooruitspoellengte",
|
"LabelSkipForwardLength": "Stapgrootte vooruitspringen",
|
||||||
"LabelSkipIfAudioTrackPresent": "Overslaan als het standaard geluidsspoor overeenkomt met de taal van de download",
|
"LabelSkipIfAudioTrackPresent": "Overslaan als het standaard geluidsspoor overeenkomt met de taal van de download",
|
||||||
"LabelSkipIfAudioTrackPresentHelp": "Vink dit uit om ervoor te zorgen dat alle video's ondertiteling krijgen, ongeacht de geluidstaal.",
|
"LabelSkipIfAudioTrackPresentHelp": "Vink dit uit om ervoor te zorgen dat alle video's ondertiteling krijgen, ongeacht de geluidstaal.",
|
||||||
"LabelSkipIfGraphicalSubsPresent": "Overslaan als de video al ingesloten ondertiteling heeft",
|
"LabelSkipIfGraphicalSubsPresent": "Overslaan als de video al ingesloten ondertiteling heeft",
|
||||||
|
@ -649,7 +649,7 @@
|
||||||
"LabelSortOrder": "Sorteervolgorde",
|
"LabelSortOrder": "Sorteervolgorde",
|
||||||
"LabelSortTitle": "Sorteertitel",
|
"LabelSortTitle": "Sorteertitel",
|
||||||
"LabelSource": "Bron",
|
"LabelSource": "Bron",
|
||||||
"LabelSpecialSeasonsDisplayName": "Weergavenaam speciaal seizoen",
|
"LabelSpecialSeasonsDisplayName": "Weergavenaam specials-seizoen",
|
||||||
"LabelSportsCategories": "Sportcategorieën",
|
"LabelSportsCategories": "Sportcategorieën",
|
||||||
"LabelStartWhenPossible": "Starten indien mogelijk",
|
"LabelStartWhenPossible": "Starten indien mogelijk",
|
||||||
"LabelStopWhenPossible": "Stoppen indien mogelijk",
|
"LabelStopWhenPossible": "Stoppen indien mogelijk",
|
||||||
|
@ -917,7 +917,7 @@
|
||||||
"PleaseSelectTwoItems": "Selecteer ten minste twee items.",
|
"PleaseSelectTwoItems": "Selecteer ten minste twee items.",
|
||||||
"MessagePluginInstalled": "De plug-in is succesvol geïnstalleerd. De server moet opnieuw worden opgestart om de wijzigingen door te voeren.",
|
"MessagePluginInstalled": "De plug-in is succesvol geïnstalleerd. De server moet opnieuw worden opgestart om de wijzigingen door te voeren.",
|
||||||
"PreferEmbeddedTitlesOverFileNames": "Ingesloten titels boven bestandsnamen verkiezen",
|
"PreferEmbeddedTitlesOverFileNames": "Ingesloten titels boven bestandsnamen verkiezen",
|
||||||
"PreferEmbeddedTitlesOverFileNamesHelp": "Bepaal de standaard weergavetitel wanneer er geen internetmetadata of lokale metadata beschikbaar is.",
|
"PreferEmbeddedTitlesOverFileNamesHelp": "Bepaal de standaard weergavetitel wanneer er geen internetmetadata of lokale metadata beschikbaar zijn.",
|
||||||
"Premieres": "Premières",
|
"Premieres": "Premières",
|
||||||
"Previous": "Vorige",
|
"Previous": "Vorige",
|
||||||
"Primary": "Primair",
|
"Primary": "Primair",
|
||||||
|
@ -990,7 +990,7 @@
|
||||||
"Shows": "Series",
|
"Shows": "Series",
|
||||||
"Shuffle": "Willekeurig",
|
"Shuffle": "Willekeurig",
|
||||||
"SimultaneousConnectionLimitHelp": "Het maximum aantal toegestane gelijktijdige streams. Geef 0 in voor geen limiet.",
|
"SimultaneousConnectionLimitHelp": "Het maximum aantal toegestane gelijktijdige streams. Geef 0 in voor geen limiet.",
|
||||||
"SkipEpisodesAlreadyInMyLibrary": "Neem geen afleveringen op die al in mijn bibliotheek aanwezig zijn",
|
"SkipEpisodesAlreadyInMyLibrary": "Geen afleveringen opnemen die al in mijn bibliotheek staan",
|
||||||
"SkipEpisodesAlreadyInMyLibraryHelp": "Afleveringen zullen worden vergeleken met behulp van seizoens- en afleveringsnummers, indien beschikbaar.",
|
"SkipEpisodesAlreadyInMyLibraryHelp": "Afleveringen zullen worden vergeleken met behulp van seizoens- en afleveringsnummers, indien beschikbaar.",
|
||||||
"Small": "Klein",
|
"Small": "Klein",
|
||||||
"SmallCaps": "Kleine letters",
|
"SmallCaps": "Kleine letters",
|
||||||
|
@ -1072,7 +1072,7 @@
|
||||||
"ValueTimeLimitSingleHour": "Tijdslimiet: 1 uur",
|
"ValueTimeLimitSingleHour": "Tijdslimiet: 1 uur",
|
||||||
"Vertical": "Verticaal",
|
"Vertical": "Verticaal",
|
||||||
"ViewAlbum": "Album weergeven",
|
"ViewAlbum": "Album weergeven",
|
||||||
"ViewPlaybackInfo": "Afspeelinfo weergeven",
|
"ViewPlaybackInfo": "Afspeelinformatie weergeven",
|
||||||
"Watched": "Gekeken",
|
"Watched": "Gekeken",
|
||||||
"Wednesday": "Woensdag",
|
"Wednesday": "Woensdag",
|
||||||
"WelcomeToProject": "Welkom bij Jellyfin!",
|
"WelcomeToProject": "Welkom bij Jellyfin!",
|
||||||
|
@ -1157,7 +1157,7 @@
|
||||||
"OptionResElement": "'res'-element",
|
"OptionResElement": "'res'-element",
|
||||||
"TV": "Tv",
|
"TV": "Tv",
|
||||||
"LabelTypeMetadataDownloaders": "Metadata-downloaders ({0})",
|
"LabelTypeMetadataDownloaders": "Metadata-downloaders ({0})",
|
||||||
"OptionLoginAttemptsBeforeLockout": "Bepaal hoeveel foutieve inlogpogingen kunnen plaatsvinden voordat de gebruiker buitengesloten wordt.",
|
"OptionLoginAttemptsBeforeLockout": "Bepaal hoeveel foutieve aanmeldpogingen kunnen plaatsvinden voordat de gebruiker buitengesloten wordt.",
|
||||||
"Premiere": "Première",
|
"Premiere": "Première",
|
||||||
"TabPlugins": "Plug-ins",
|
"TabPlugins": "Plug-ins",
|
||||||
"LabelAudioSampleRate": "Bemonsteringsfrequentie geluid",
|
"LabelAudioSampleRate": "Bemonsteringsfrequentie geluid",
|
||||||
|
@ -1173,7 +1173,7 @@
|
||||||
"MusicLibraryHelp": "Bekijk de {0}muzieknaamgevingsgids{1}.",
|
"MusicLibraryHelp": "Bekijk de {0}muzieknaamgevingsgids{1}.",
|
||||||
"LabelAudioBitDepth": "Bitdiepte geluid",
|
"LabelAudioBitDepth": "Bitdiepte geluid",
|
||||||
"OptionRandom": "Willekeurig",
|
"OptionRandom": "Willekeurig",
|
||||||
"PlaybackData": "Afspeelinfo",
|
"PlaybackData": "Afspeelinformatie",
|
||||||
"PasswordResetProviderHelp": "Kies een aanbieder voor wachtwoordherstel die moet worden gebruikt wanneer deze gebruiker een wachtwoordherstel aanvraagt.",
|
"PasswordResetProviderHelp": "Kies een aanbieder voor wachtwoordherstel die moet worden gebruikt wanneer deze gebruiker een wachtwoordherstel aanvraagt.",
|
||||||
"Screenshots": "Schermafdruk",
|
"Screenshots": "Schermafdruk",
|
||||||
"Series": "Series",
|
"Series": "Series",
|
||||||
|
@ -1237,7 +1237,7 @@
|
||||||
"BoxSet": "Boxset",
|
"BoxSet": "Boxset",
|
||||||
"AskAdminToCreateLibrary": "Vraag een beheerder om een bibliotheek aan te maken.",
|
"AskAdminToCreateLibrary": "Vraag een beheerder om een bibliotheek aan te maken.",
|
||||||
"Artist": "Artiest",
|
"Artist": "Artiest",
|
||||||
"AllowFfmpegThrottlingHelp": "Wanneer een transcodering of remux ver genoeg voorloopt op de huidige afspeelpositie zal het proces worden gepauzeerd zodat er minder middelen worden gebruikt. Dit is vooral nuttig wanneer je kijkt zonder vaak te spoelen. Schakel dit uit als je afspeelproblemen ondervindt.",
|
"AllowFfmpegThrottlingHelp": "Wanneer een transcodering of remux ver genoeg voorloopt op de huidige afspeelpositie zal het proces worden gepauzeerd zodat er minder middelen worden gebruikt. Dit is vooral nuttig wanneer er beperkt terug- of vooruitgespoeld wordt. Schakel dit uit als je afspeelproblemen ondervindt.",
|
||||||
"AllowFfmpegThrottling": "Transcoderingen afknijpen",
|
"AllowFfmpegThrottling": "Transcoderingen afknijpen",
|
||||||
"LabelPlayerDimensions": "Afmetingen speler",
|
"LabelPlayerDimensions": "Afmetingen speler",
|
||||||
"LabelLibraryPageSizeHelp": "Kies het aantal items dat wordt weergegeven op een bibliotheekpagina. Kies 0 om dit te verbergen.",
|
"LabelLibraryPageSizeHelp": "Kies het aantal items dat wordt weergegeven op een bibliotheekpagina. Kies 0 om dit te verbergen.",
|
||||||
|
@ -1253,7 +1253,7 @@
|
||||||
"PlaybackErrorNoCompatibleStream": "Dit apparaat ondersteunt de afgespeelde media niet en de server verstuurt geen compatibel mediaformaat.",
|
"PlaybackErrorNoCompatibleStream": "Dit apparaat ondersteunt de afgespeelde media niet en de server verstuurt geen compatibel mediaformaat.",
|
||||||
"Person": "Persoon",
|
"Person": "Persoon",
|
||||||
"OptionForceRemoteSourceTranscoding": "Transcoderen forceren van mediabronnen op afstand (zoals live-tv)",
|
"OptionForceRemoteSourceTranscoding": "Transcoderen forceren van mediabronnen op afstand (zoals live-tv)",
|
||||||
"NoCreatedLibraries": "Het lijkt erop dat er nog geen bibliotheek is gecreëerd. {0}Wil je er nu een aanmaken?{1}",
|
"NoCreatedLibraries": "Het lijkt erop dat er nog geen bibliotheek is aangemaakt. {0}Wil je er nu een aanmaken?{1}",
|
||||||
"Movie": "Film",
|
"Movie": "Film",
|
||||||
"MessageConfirmAppExit": "Wil je afsluiten?",
|
"MessageConfirmAppExit": "Wil je afsluiten?",
|
||||||
"LabelVideoResolution": "Beeldresolutie",
|
"LabelVideoResolution": "Beeldresolutie",
|
||||||
|
@ -1271,7 +1271,7 @@
|
||||||
"ListPaging": "{0}-{1} van {2}",
|
"ListPaging": "{0}-{1} van {2}",
|
||||||
"WriteAccessRequired": "Jellyfin vereist schrijftoegang tot deze map. Zorg voor schrijftoegang en probeer het opnieuw.",
|
"WriteAccessRequired": "Jellyfin vereist schrijftoegang tot deze map. Zorg voor schrijftoegang en probeer het opnieuw.",
|
||||||
"PathNotFound": "Het pad kan niet gevonden worden. Zorg ervoor dat het pad geldig is en probeer opnieuw.",
|
"PathNotFound": "Het pad kan niet gevonden worden. Zorg ervoor dat het pad geldig is en probeer opnieuw.",
|
||||||
"Yadif": "YADIF",
|
"Yadif": "Yet Another DeInterlacing Filter (YADIF)",
|
||||||
"SelectAdminUsername": "Kies een gebruikersnaam voor de beheerdersaccount.",
|
"SelectAdminUsername": "Kies een gebruikersnaam voor de beheerdersaccount.",
|
||||||
"ButtonTogglePlaylist": "Afspeellijst",
|
"ButtonTogglePlaylist": "Afspeellijst",
|
||||||
"LabelRequireHttpsHelp": "Indien aangevinkt, zal de server alle verzoeken via HTTP automatisch omleiden naar HTTPS. Dit heeft geen effect als de server niet luistert op HTTPS.",
|
"LabelRequireHttpsHelp": "Indien aangevinkt, zal de server alle verzoeken via HTTP automatisch omleiden naar HTTPS. Dit heeft geen effect als de server niet luistert op HTTPS.",
|
||||||
|
@ -1347,7 +1347,7 @@
|
||||||
"MessageGetInstalledPluginsError": "Er is een fout opgetreden bij het ophalen van de lijst met geïnstalleerde plug-ins.",
|
"MessageGetInstalledPluginsError": "Er is een fout opgetreden bij het ophalen van de lijst met geïnstalleerde plug-ins.",
|
||||||
"MessagePluginInstallError": "Er is een fout opgetreden tijdens het installeren van de plugin.",
|
"MessagePluginInstallError": "Er is een fout opgetreden tijdens het installeren van de plugin.",
|
||||||
"LabelUnstable": "Instabiel",
|
"LabelUnstable": "Instabiel",
|
||||||
"NextTrack": "Naar volgende gaan",
|
"NextTrack": "Volgend item",
|
||||||
"LabelAlbumArtMaxResHelp": "Maximale resolutie van de albumhoes, beschreven in de eigenschap 'upnp:albumArtURI'.",
|
"LabelAlbumArtMaxResHelp": "Maximale resolutie van de albumhoes, beschreven in de eigenschap 'upnp:albumArtURI'.",
|
||||||
"Image": "Afbeelding",
|
"Image": "Afbeelding",
|
||||||
"Other": "Andere",
|
"Other": "Andere",
|
||||||
|
@ -1355,9 +1355,9 @@
|
||||||
"LabelIconMaxResHelp": "Maximale resolutie van pictogrammen die worden weergegeven via de eigenschap 'upnp:icon'.",
|
"LabelIconMaxResHelp": "Maximale resolutie van pictogrammen die worden weergegeven via de eigenschap 'upnp:icon'.",
|
||||||
"MusicVideos": "Muziekvideo's",
|
"MusicVideos": "Muziekvideo's",
|
||||||
"Preview": "Voorvertoning",
|
"Preview": "Voorvertoning",
|
||||||
"SubtitleVerticalPositionHelp": "Regelnummer waar tekst verschijnt. Positieve cijfers geven top-down aan. Negatieve getallen geven bottom-up aan.",
|
"SubtitleVerticalPositionHelp": "Regelnummer waar tekst verschijnt. Positieve getallen geven top-down aan. Negatieve getallen geven bottom-up aan.",
|
||||||
"ButtonCast": "Naar apparaat casten",
|
"ButtonCast": "Naar apparaat casten",
|
||||||
"Bwdif": "BWDIF",
|
"Bwdif": "Bob Weaver DeInterlacing Filter (BWDIF)",
|
||||||
"VideoAudio": "Beeld Geluid",
|
"VideoAudio": "Beeld Geluid",
|
||||||
"Video": "Beeld",
|
"Video": "Beeld",
|
||||||
"UseDoubleRateDeinterlacingHelp": "Deze instelling gebruikt de veldsnelheid bij de-interliniëren, ook wel bob-de-interliniëring genoemd, waarmee de verversingssnelheid van de video wordt verdubbeld om volledige beweging te bieden, zoals je zou zien bij het bekijken van geïnterlinieerd beeld op een tv.",
|
"UseDoubleRateDeinterlacingHelp": "Deze instelling gebruikt de veldsnelheid bij de-interliniëren, ook wel bob-de-interliniëring genoemd, waarmee de verversingssnelheid van de video wordt verdubbeld om volledige beweging te bieden, zoals je zou zien bij het bekijken van geïnterlinieerd beeld op een tv.",
|
||||||
|
@ -1369,7 +1369,7 @@
|
||||||
"Restart": "Herstarten",
|
"Restart": "Herstarten",
|
||||||
"ResetPassword": "Wachtwoord opnieuw instellen",
|
"ResetPassword": "Wachtwoord opnieuw instellen",
|
||||||
"Profile": "Profiel",
|
"Profile": "Profiel",
|
||||||
"PreviousTrack": "Naar vorige gaan",
|
"PreviousTrack": "Vorig item",
|
||||||
"PosterCard": "Posterkaart",
|
"PosterCard": "Posterkaart",
|
||||||
"Poster": "Poster",
|
"Poster": "Poster",
|
||||||
"PlaybackRate": "Afspeelsnelheid",
|
"PlaybackRate": "Afspeelsnelheid",
|
||||||
|
@ -1575,8 +1575,8 @@
|
||||||
"LabelSyncPlaySettingsSkipToSync": "SkipToSync inschakelen",
|
"LabelSyncPlaySettingsSkipToSync": "SkipToSync inschakelen",
|
||||||
"LabelSyncPlaySettingsSpeedToSyncHelp": "Methode voor synchronisatiecorrectie die bestaat uit het versnellen van het afspelen. Synchronisatiecorrectie moet ingeschakeld zijn.",
|
"LabelSyncPlaySettingsSpeedToSyncHelp": "Methode voor synchronisatiecorrectie die bestaat uit het versnellen van het afspelen. Synchronisatiecorrectie moet ingeschakeld zijn.",
|
||||||
"LabelSyncPlaySettingsSpeedToSync": "SpeedToSync inschakelen",
|
"LabelSyncPlaySettingsSpeedToSync": "SpeedToSync inschakelen",
|
||||||
"LabelSyncPlaySettingsMinDelaySkipToSyncHelp": "Minimale afspeelvertraging (in ms) waarna SpeedToSync de afspeelpositie probeert te corrigeren.",
|
"LabelSyncPlaySettingsMinDelaySkipToSyncHelp": "Minimale afspeelvertraging (in ms) waarna SkipToSync de afspeelpositie probeert te corrigeren.",
|
||||||
"LabelSyncPlaySettingsMinDelaySkipToSync": "Minimumvertraging SpeedToSync",
|
"LabelSyncPlaySettingsMinDelaySkipToSync": "Minimumvertraging SkipToSync",
|
||||||
"LabelSyncPlaySettingsSpeedToSyncDurationHelp": "Hoeveelheid milliseconden die SpeedToSync gebruikt om de afspeelpositie te corrigeren.",
|
"LabelSyncPlaySettingsSpeedToSyncDurationHelp": "Hoeveelheid milliseconden die SpeedToSync gebruikt om de afspeelpositie te corrigeren.",
|
||||||
"LabelSyncPlaySettingsSpeedToSyncDuration": "Duur SpeedToSync",
|
"LabelSyncPlaySettingsSpeedToSyncDuration": "Duur SpeedToSync",
|
||||||
"LabelSyncPlaySettingsMaxDelaySpeedToSyncHelp": "Maximale afspeelvertraging (in ms) waarna SkipToSync gebruikt wordt in plaats van SpeedToSync.",
|
"LabelSyncPlaySettingsMaxDelaySpeedToSyncHelp": "Maximale afspeelvertraging (in ms) waarna SkipToSync gebruikt wordt in plaats van SpeedToSync.",
|
||||||
|
@ -1717,7 +1717,7 @@
|
||||||
"Featurette": "Featurette",
|
"Featurette": "Featurette",
|
||||||
"Short": "Korte film",
|
"Short": "Korte film",
|
||||||
"HeaderPerformance": "Prestaties",
|
"HeaderPerformance": "Prestaties",
|
||||||
"LabelParallelImageEncodingLimitHelp": "Maximaal aantal afbeeldingscoderingen dat tegelijkertijd mag lopen. Bij een instelling van 0 wordt een limiet gekozen gebaseerd op je systeemspecificaties.",
|
"LabelParallelImageEncodingLimitHelp": "Maximaal aantal afbeeldingscoderingen dat tegelijkertijd mag lopen. Bij een instelling van 0 wordt een limiet gekozen gebaseerd op het aantal processorkernen in je systeem.",
|
||||||
"LabelParallelImageEncodingLimit": "Limiet gelijktijdige afbeeldingscoderingen",
|
"LabelParallelImageEncodingLimit": "Limiet gelijktijdige afbeeldingscoderingen",
|
||||||
"LabelEnableAudioVbr": "VBR-audiocodering inschakelen",
|
"LabelEnableAudioVbr": "VBR-audiocodering inschakelen",
|
||||||
"LabelEnableAudioVbrHelp": "Een variabele bitsnelheid biedt een betere verhouding tussen kwaliteit en gemiddelde bitsnelheid, maar kan in zeldzame gevallen tot bufferen of compatibiliteitsproblemen leiden.",
|
"LabelEnableAudioVbrHelp": "Een variabele bitsnelheid biedt een betere verhouding tussen kwaliteit en gemiddelde bitsnelheid, maar kan in zeldzame gevallen tot bufferen of compatibiliteitsproblemen leiden.",
|
||||||
|
@ -1818,8 +1818,8 @@
|
||||||
"LabelTrickplayAccelHelp": "Zorg dat 'MJPEG-codering toestaan' onder Transcoderen is ingeschakeld indien je hardware dit ondersteunt.",
|
"LabelTrickplayAccelHelp": "Zorg dat 'MJPEG-codering toestaan' onder Transcoderen is ingeschakeld indien je hardware dit ondersteunt.",
|
||||||
"AllowMjpegEncoding": "Coderen in MJPEG-formaat toestaan (gebruikt tijdens trickplay-generatie)",
|
"AllowMjpegEncoding": "Coderen in MJPEG-formaat toestaan (gebruikt tijdens trickplay-generatie)",
|
||||||
"LabelScanBehaviorHelp": "Het standaardgedrag is niet-blokkerend en zal media toevoegen aan de bibiotheek voordat de trickplay-generatie voltooid is. Blokkeren zorgt ervoor dat trickplay-bestanden gegenereerd worden voordat media aan de bibliotheek wordt toegevoegd. De scan duurt hierdoor significant langer.",
|
"LabelScanBehaviorHelp": "Het standaardgedrag is niet-blokkerend en zal media toevoegen aan de bibiotheek voordat de trickplay-generatie voltooid is. Blokkeren zorgt ervoor dat trickplay-bestanden gegenereerd worden voordat media aan de bibliotheek wordt toegevoegd. De scan duurt hierdoor significant langer.",
|
||||||
"NonBlockingScan": "Niet-blokkerend - scan gaat verder tijdens generatie",
|
"NonBlockingScan": "Niet-blokkerend - scan gaat verder tijdens het genereren",
|
||||||
"BlockingScan": "Blokkerend - wacht met scannen tot generatie is voltooid",
|
"BlockingScan": "Blokkerend - wacht met scannen tot het genereren is voltooid",
|
||||||
"PriorityBelowNormal": "Beneden normaal",
|
"PriorityBelowNormal": "Beneden normaal",
|
||||||
"PriorityAboveNormal": "Boven normaal",
|
"PriorityAboveNormal": "Boven normaal",
|
||||||
"LabelWidthResolutions": "Breedteresoluties",
|
"LabelWidthResolutions": "Breedteresoluties",
|
||||||
|
@ -1830,11 +1830,11 @@
|
||||||
"LabelTrickplayThreads": "FFmpeg-threads",
|
"LabelTrickplayThreads": "FFmpeg-threads",
|
||||||
"LabelTrickplayThreadsHelp": "Het aantal threads dat aan het '-threads'-argument van FFmpeg wordt doorgegeven.",
|
"LabelTrickplayThreadsHelp": "Het aantal threads dat aan het '-threads'-argument van FFmpeg wordt doorgegeven.",
|
||||||
"OptionExtractTrickplayImage": "Uitpakken van trickplay-afbeeldingen inschakelen",
|
"OptionExtractTrickplayImage": "Uitpakken van trickplay-afbeeldingen inschakelen",
|
||||||
"LabelProcessPriorityHelp": "Deze instelling bepaalt welke prioriteit de processor aan het trickplay-generatieproces van ffmpeg geeft. Als het systeem traag reageert tijdens het genereren van trickplay-afbeeldingen maar je de generatie niet volledig wilt stoppen, kun je deze instelling, alsmede de hoeveelheid threads, verlagen.",
|
"LabelProcessPriorityHelp": "Deze instelling bepaalt welke prioriteit de processor aan het trickplay-generatieproces van ffmpeg geeft. Als het systeem traag reageert tijdens het genereren van trickplay-afbeeldingen maar je het genereren niet volledig wilt stoppen, kun je deze instelling, alsmede de hoeveelheid threads, verlagen.",
|
||||||
"LabelTileHeightHelp": "Maximaal aantal afbeeldingen per tegel in de Y-richting.",
|
"LabelTileHeightHelp": "Maximaal aantal afbeeldingen per tegel in de Y-richting.",
|
||||||
"LabelQscale": "Qscale",
|
"LabelQscale": "Qscale",
|
||||||
"LabelQscaleHelp": "De kwaliteitsschaal van afbeeldingen die door FFmpeg worden geproduceerd, waarbij 2 de hoogste en 31 de laagste kwaliteit is.",
|
"LabelQscaleHelp": "De kwaliteitsschaal van afbeeldingen die door FFmpeg worden geproduceerd, waarbij 2 de hoogste en 31 de laagste kwaliteit is.",
|
||||||
"LabelExtractTrickplayDuringLibraryScanHelp": "Genereer trickplay-afbeeldingen wanneer video's worden geïmporteerd tijdens de bibliotheekscan. Anders zullen ze worden uitgepakt tijdens de geplande taak voor trickplay-afbeeldingen. Als de generatie op niet-blokkerend wordt ingesteld heeft deze optie geen negatieve invloed op de duur van de bibliotheekscan.",
|
"LabelExtractTrickplayDuringLibraryScanHelp": "Genereer trickplay-afbeeldingen wanneer video's worden geïmporteerd tijdens de bibliotheekscan. Anders zullen ze worden uitgepakt tijdens de geplande taak voor trickplay-afbeeldingen. Als het genereren op niet-blokkerend wordt ingesteld heeft deze optie geen negatieve invloed op de duur van de bibliotheekscan.",
|
||||||
"ExtractTrickplayImagesHelp": "Trickplay-afbeeldingen lijken op hoofdstukafbeeldingen, maar beslaan de gehele lengte van de inhoud en geven een voorvertoning bij het spoelen door video's.",
|
"ExtractTrickplayImagesHelp": "Trickplay-afbeeldingen lijken op hoofdstukafbeeldingen, maar beslaan de gehele lengte van de inhoud en geven een voorvertoning bij het spoelen door video's.",
|
||||||
"Lyric": "Songtekst",
|
"Lyric": "Songtekst",
|
||||||
"PlaybackError.ASS_RENDER_ERROR": "Er is een fout opgetreden in de renderer voor ASS/SSA-ondertiteling.",
|
"PlaybackError.ASS_RENDER_ERROR": "Er is een fout opgetreden in de renderer voor ASS/SSA-ondertiteling.",
|
||||||
|
@ -1866,5 +1866,30 @@
|
||||||
"ConfirmDeleteLyrics": "Dit zal deze liedtekst verwijderen van zowel het bestandssysteem als uit je mediabibliotheek. Weet je zeker dat je wilt doorgaan?",
|
"ConfirmDeleteLyrics": "Dit zal deze liedtekst verwijderen van zowel het bestandssysteem als uit je mediabibliotheek. Weet je zeker dat je wilt doorgaan?",
|
||||||
"DeleteLyrics": "Liedtekst verwijderen",
|
"DeleteLyrics": "Liedtekst verwijderen",
|
||||||
"HeaderNoLyrics": "Geen liedtekst gevonden",
|
"HeaderNoLyrics": "Geen liedtekst gevonden",
|
||||||
"Lyrics": "Liedtekst"
|
"Lyrics": "Liedtekst",
|
||||||
|
"SavePassword": "Wachtwoord opslaan",
|
||||||
|
"EnableDts": "DTS (DCA) inschakelen",
|
||||||
|
"EnableDtsHelp": "Schakel dit alleen in als je apparaat DTS ondersteunt of is verbonden met een compatibele geluidsontvanger, anders kan dit afspeelfouten veroorzaken.",
|
||||||
|
"EnableTrueHd": "TrueHD inschakelen",
|
||||||
|
"EnableTrueHdHelp": "Schakel dit alleen in als je apparaat TrueHD ondersteunt of is verbonden met een compatibele geluidsontvanger, anders kan dit afspeelfouten veroorzaken.",
|
||||||
|
"HeaderVideoAdvanced": "Video geavanceerd",
|
||||||
|
"PlaylistError.CreateFailed": "Fout bij aanmaken afspeellijst",
|
||||||
|
"PlaylistError.AddFailed": "Fout bij toevoegen aan afspeellijst",
|
||||||
|
"PlaylistPublicDescription": "Iedere aangemelde gebruiker toestaan deze afspeellijst te bekijken.",
|
||||||
|
"PlaylistPublic": "Openbare toegang toestaan",
|
||||||
|
"HeaderLyricDownloads": "Liedtekstdownloads",
|
||||||
|
"SaveLyricsIntoMediaFolders": "Liedteksten opslaan in mediamappen",
|
||||||
|
"SaveLyricsIntoMediaFoldersHelp": "Het opslaan van liedteksten in dezelfde map als de geluidsbestanden zorgt ervoor dat deze beter te beheren zijn.",
|
||||||
|
"Author": "Auteur",
|
||||||
|
"Colorist": "Inkleurder",
|
||||||
|
"CoverArtist": "Omslagartiest",
|
||||||
|
"Creator": "Bedenker",
|
||||||
|
"Editor": "Redacteur",
|
||||||
|
"Illustrator": "Illustrator",
|
||||||
|
"Inker": "Inkter",
|
||||||
|
"Letterer": "Beletteraar",
|
||||||
|
"Penciller": "Schetser",
|
||||||
|
"Translator": "Vertaler",
|
||||||
|
"LibraryScanFanoutConcurrencyHelp": "Maximaal aantal gelijktijdige taken tijdens bibliotheekscans. Bij een instelling van 0 wordt een limiet gekozen gebaseerd op het aantal processorkernen in je systeem. WAARSCHUWING: een te hoge instelling kan problemen veroorzaken met netwerkbestandssystemen; verlaag dit getal als je problemen tegenkomt.",
|
||||||
|
"LibraryScanFanoutConcurrency": "Limiet gelijktijdige bibiotheekscantaken"
|
||||||
}
|
}
|
||||||
|
|
|
@ -367,7 +367,7 @@
|
||||||
"HeaderSeriesOptions": "Opcje nagrywania serialu",
|
"HeaderSeriesOptions": "Opcje nagrywania serialu",
|
||||||
"HeaderSeriesStatus": "Stan serialu",
|
"HeaderSeriesStatus": "Stan serialu",
|
||||||
"HeaderServerSettings": "Ustawienia serwera",
|
"HeaderServerSettings": "Ustawienia serwera",
|
||||||
"HeaderSetupLibrary": "Skonfiguruj swoje biblioteki mediów",
|
"HeaderSetupLibrary": "Skonfiguruj biblioteki mediów",
|
||||||
"HeaderSortBy": "Sortuj według",
|
"HeaderSortBy": "Sortuj według",
|
||||||
"HeaderSortOrder": "Porządek sortowania",
|
"HeaderSortOrder": "Porządek sortowania",
|
||||||
"HeaderSpecialEpisodeInfo": "Specjalne informacje o odcinku",
|
"HeaderSpecialEpisodeInfo": "Specjalne informacje o odcinku",
|
||||||
|
@ -435,7 +435,7 @@
|
||||||
"LabelAllowedRemoteAddresses": "Filtr adresów IP",
|
"LabelAllowedRemoteAddresses": "Filtr adresów IP",
|
||||||
"LabelAllowedRemoteAddressesMode": "Tryb filtra adresów IP",
|
"LabelAllowedRemoteAddressesMode": "Tryb filtra adresów IP",
|
||||||
"LabelAppName": "Nazwa aplikacji",
|
"LabelAppName": "Nazwa aplikacji",
|
||||||
"LabelAppNameExample": "Przykład: Sickbeard, Sonarr",
|
"LabelAppNameExample": "Czytelna dla człowieka nazwa służąca do identyfikacji kluczy API. To ustawienie nie ma wpływu na funkcjonalność.",
|
||||||
"LabelArtists": "Wykonawcy",
|
"LabelArtists": "Wykonawcy",
|
||||||
"LabelArtistsHelp": "Oddziel wielu wykonawców średnikiem \";\".",
|
"LabelArtistsHelp": "Oddziel wielu wykonawców średnikiem \";\".",
|
||||||
"LabelAudioLanguagePreference": "Preferowany język ścieżki dźwiękowej",
|
"LabelAudioLanguagePreference": "Preferowany język ścieżki dźwiękowej",
|
||||||
|
@ -1255,7 +1255,7 @@
|
||||||
"Episode": "Odcinek",
|
"Episode": "Odcinek",
|
||||||
"DeinterlaceMethodHelp": "Wybierz metodę usuwania przeplotu używaną podczas transkodowania. Gdy przyśpieszenie sprzętowe wspierające usuwanie przeplotu jest włączone sprzętowe usuwanie przeplotu zostanie użyte zamiast tego ustawienia.",
|
"DeinterlaceMethodHelp": "Wybierz metodę usuwania przeplotu używaną podczas transkodowania. Gdy przyśpieszenie sprzętowe wspierające usuwanie przeplotu jest włączone sprzętowe usuwanie przeplotu zostanie użyte zamiast tego ustawienia.",
|
||||||
"ClientSettings": "Ustawienia klienta",
|
"ClientSettings": "Ustawienia klienta",
|
||||||
"ButtonTogglePlaylist": "Playlista",
|
"ButtonTogglePlaylist": "Lista odtwarzania",
|
||||||
"ButtonSyncPlay": "Odtwarzanie zsynchronizowane",
|
"ButtonSyncPlay": "Odtwarzanie zsynchronizowane",
|
||||||
"ClearQueue": "Wyczyść kolejkę",
|
"ClearQueue": "Wyczyść kolejkę",
|
||||||
"StopPlayback": "Zatrzymaj odtwarzanie",
|
"StopPlayback": "Zatrzymaj odtwarzanie",
|
||||||
|
@ -1276,7 +1276,7 @@
|
||||||
"ListPaging": "{0}-{1} z {2}",
|
"ListPaging": "{0}-{1} z {2}",
|
||||||
"WriteAccessRequired": "Jellyfin wymaga praw zapisu do tego katalogu. Upewnij się, że prawa zapisu zostały przyznane i spróbuj ponownie.",
|
"WriteAccessRequired": "Jellyfin wymaga praw zapisu do tego katalogu. Upewnij się, że prawa zapisu zostały przyznane i spróbuj ponownie.",
|
||||||
"PathNotFound": "Ścieżka nie została znaleziona. Upewnij się, że ścieżka jest poprawna i spróbuj ponownie.",
|
"PathNotFound": "Ścieżka nie została znaleziona. Upewnij się, że ścieżka jest poprawna i spróbuj ponownie.",
|
||||||
"Yadif": "YADIF",
|
"Yadif": "YADIF (Yet Another DeInterlacing Filter)",
|
||||||
"Writers": "Scenariusz",
|
"Writers": "Scenariusz",
|
||||||
"ViewAlbumArtist": "Zobacz wykonawcę albumu",
|
"ViewAlbumArtist": "Zobacz wykonawcę albumu",
|
||||||
"TabRepositories": "Repozytoria",
|
"TabRepositories": "Repozytoria",
|
||||||
|
@ -1367,7 +1367,7 @@
|
||||||
"Poster": "Plakat",
|
"Poster": "Plakat",
|
||||||
"MusicVideos": "Teledyski",
|
"MusicVideos": "Teledyski",
|
||||||
"VideoAudio": "Dźwięk wideo",
|
"VideoAudio": "Dźwięk wideo",
|
||||||
"Bwdif": "BWDIF",
|
"Bwdif": "BWDIF (Bob Weaver DeInterlacing Filter)",
|
||||||
"UseDoubleRateDeinterlacing": "Podwój częstotliwość wyświetlania klatek podczas usuwania przeplotu",
|
"UseDoubleRateDeinterlacing": "Podwój częstotliwość wyświetlania klatek podczas usuwania przeplotu",
|
||||||
"Photo": "Zdjęcie",
|
"Photo": "Zdjęcie",
|
||||||
"LabelIconMaxResHelp": "Maksymalna rozdzielczość ikon udostępnianych przez 'upnp:icon'.",
|
"LabelIconMaxResHelp": "Maksymalna rozdzielczość ikon udostępnianych przez 'upnp:icon'.",
|
||||||
|
@ -1480,7 +1480,7 @@
|
||||||
"LabelSyncPlayTimeSyncDevice": "Synchronizacja czasu z",
|
"LabelSyncPlayTimeSyncDevice": "Synchronizacja czasu z",
|
||||||
"LabelSyncPlayResumePlaybackDescription": "Wróć do grupy odtwarzania",
|
"LabelSyncPlayResumePlaybackDescription": "Wróć do grupy odtwarzania",
|
||||||
"LabelSyncPlayResumePlayback": "Wznów lokalne odtwarzanie",
|
"LabelSyncPlayResumePlayback": "Wznów lokalne odtwarzanie",
|
||||||
"LabelSyncPlayHaltPlaybackDescription": "I ignoruj aktualizacje aktualnej playlisty",
|
"LabelSyncPlayHaltPlaybackDescription": "I ignoruj aktualizacje aktualnej listy odtwarzania",
|
||||||
"LabelSyncPlayHaltPlayback": "Zatrzymaj lokalne odtwarzanie",
|
"LabelSyncPlayHaltPlayback": "Zatrzymaj lokalne odtwarzanie",
|
||||||
"LabelSSDPTracingFilterHelp": "Opcjonalny adres IP po który filtrować ruch SSDP.",
|
"LabelSSDPTracingFilterHelp": "Opcjonalny adres IP po który filtrować ruch SSDP.",
|
||||||
"LabelSSDPTracingFilter": "Filtr SSDP",
|
"LabelSSDPTracingFilter": "Filtr SSDP",
|
||||||
|
@ -1867,5 +1867,30 @@
|
||||||
"ErrorDeletingLyrics": "Wystąpił błąd podczas usuwania słów z serwera. Sprawdź, czy Jellyfin ma uprawnienia do zapisu w folderze multimediów i spróbuj ponownie.",
|
"ErrorDeletingLyrics": "Wystąpił błąd podczas usuwania słów z serwera. Sprawdź, czy Jellyfin ma uprawnienia do zapisu w folderze multimediów i spróbuj ponownie.",
|
||||||
"HeaderDeleteLyrics": "Usuń słowa",
|
"HeaderDeleteLyrics": "Usuń słowa",
|
||||||
"Lyrics": "Słowa",
|
"Lyrics": "Słowa",
|
||||||
"ViewLyrics": "Zobacz słowa"
|
"ViewLyrics": "Zobacz słowa",
|
||||||
|
"SavePassword": "Zapisz hasło",
|
||||||
|
"EnableDts": "Włącz DTS (DCA)",
|
||||||
|
"EnableDtsHelp": "Włącz tylko wtedy, gdy urządzenie obsługuje DTS lub jest podłączone do kompatybilnego odbiornika audio, w przeciwnym razie może to spowodować błąd odtwarzania.",
|
||||||
|
"EnableTrueHd": "Włącz TrueHD",
|
||||||
|
"EnableTrueHdHelp": "Włącz tylko wtedy, gdy urządzenie obsługuje TrueHD lub jest podłączone do kompatybilnego odbiornika audio, w przeciwnym razie może to spowodować błąd odtwarzania.",
|
||||||
|
"HeaderVideoAdvanced": "Zaawansowane wideo",
|
||||||
|
"PlaylistError.AddFailed": "Błąd dodawania do listy odtwarzania",
|
||||||
|
"PlaylistError.CreateFailed": "Błąd tworzenia listy odtwarzania",
|
||||||
|
"SaveLyricsIntoMediaFoldersHelp": "Przechowywanie słów obok plików audio ułatwi zarządzanie nimi.",
|
||||||
|
"PlaylistPublic": "Zezwól na dostęp publiczny",
|
||||||
|
"PlaylistPublicDescription": "Zezwól na oglądanie tej listy odtwarzania każdemu zalogowanemu użytkownikowi.",
|
||||||
|
"HeaderLyricDownloads": "Pobieranie słów",
|
||||||
|
"SaveLyricsIntoMediaFolders": "Zapisuj słowa w folderach multimediów",
|
||||||
|
"Author": "Autor",
|
||||||
|
"Colorist": "Kolorysta",
|
||||||
|
"CoverArtist": "Artysta okładki",
|
||||||
|
"Creator": "Twórca",
|
||||||
|
"Editor": "Edytor",
|
||||||
|
"Illustrator": "Ilustrator",
|
||||||
|
"Inker": "Inker",
|
||||||
|
"Letterer": "Liternik",
|
||||||
|
"Penciller": "Rysownik",
|
||||||
|
"Translator": "Tłumacz",
|
||||||
|
"LibraryScanFanoutConcurrency": "Limit zadań równoległego skanowania bibliotek",
|
||||||
|
"LibraryScanFanoutConcurrencyHelp": "Maksymalna liczba zadań równoległych podczas skanowania bibliotek. Ustawienie tej opcji na 0 spowoduje wybranie limitu na podstawie liczby rdzeni systemu. OSTRZEŻENIE: ustawienie zbyt dużej liczby może powodować problemy z sieciowymi systemami plików; jeśli napotkasz problemy, obniż tę liczbę."
|
||||||
}
|
}
|
||||||
|
|
|
@ -209,7 +209,7 @@
|
||||||
"GuestStar": "Convidado especial",
|
"GuestStar": "Convidado especial",
|
||||||
"Guide": "Guia",
|
"Guide": "Guia",
|
||||||
"GuideProviderSelectListings": "Selecionar Listas",
|
"GuideProviderSelectListings": "Selecionar Listas",
|
||||||
"H264CrfHelp": "O CRF (Constant Rate Factor) é a configuração padrão de qualidade para o codificador x264 e x265. Você pode definir valores entre 0 e 51, onde valores menores resultarão em melhor qualidade (ao custo de arquivos maiores). Valores saudáveis estão entre 18 e 28. O padrão para o x264 é 23 e para x265 é 28, então você pode usar esses valores como um ponto de partida.",
|
"H264CrfHelp": "O 'Constant Rate Factor' (CRF) é a configuração de qualidade padrão para os codificadores de software x264 e x265. Você pode definir os valores entre 0 e 51, sendo que valores mais baixos resultam em melhor qualidade (às custas de tamanhos de arquivo maiores). Valores adequados estão entre 18 e 28. O padrão para x264 é 23 e para x265 é 28, portanto, você pode usar isso como ponto de partida. Os codificadores por hardware não usam essas configurações.",
|
||||||
"EncoderPresetHelp": "Escolha um valor mais rápido para melhorar o desempenho ou um valor mais lento para melhorar a qualidade.",
|
"EncoderPresetHelp": "Escolha um valor mais rápido para melhorar o desempenho ou um valor mais lento para melhorar a qualidade.",
|
||||||
"HDPrograms": "Programas em HD",
|
"HDPrograms": "Programas em HD",
|
||||||
"HardwareAccelerationWarning": "Ativar a aceleração de hardware pode causar instabilidade em alguns sistemas. Verifique se seu sistema operacional e drivers de vídeo estão atualizados. Se tiver dificuldades em reproduzir vídeo depois de ativar, retorne a configuração para automático.",
|
"HardwareAccelerationWarning": "Ativar a aceleração de hardware pode causar instabilidade em alguns sistemas. Verifique se seu sistema operacional e drivers de vídeo estão atualizados. Se tiver dificuldades em reproduzir vídeo depois de ativar, retorne a configuração para automático.",
|
||||||
|
@ -1390,7 +1390,7 @@
|
||||||
"LabelTonemappingRange": "Faixa de mapeamento de tom",
|
"LabelTonemappingRange": "Faixa de mapeamento de tom",
|
||||||
"TonemappingAlgorithmHelp": "O mapeamento de tons pode ser ajustado precisamente. Se você não esta familiarizado com essas opções, mantenha o valor padrão. O valor recomendado é 'BT.2390'.",
|
"TonemappingAlgorithmHelp": "O mapeamento de tons pode ser ajustado precisamente. Se você não esta familiarizado com essas opções, mantenha o valor padrão. O valor recomendado é 'BT.2390'.",
|
||||||
"LabelTonemappingAlgorithm": "Selecione o algoritmo de mapeamento de tons a ser usado",
|
"LabelTonemappingAlgorithm": "Selecione o algoritmo de mapeamento de tons a ser usado",
|
||||||
"AllowTonemappingHelp": "O mapeamento de tons pode transformar a faixa dinâmica de um vídeo de HDR para SDR, mantendo detalhes de cores da imagem e informações muito importantes para representar a cena original. Atualmente, funciona apenas ao transcodificar vídeos no padrão HDR10, HLG e DoVI . Isso requer as bibliotecas OpenCL ou CUDA correspondente.",
|
"AllowTonemappingHelp": "O mapeamento de tons pode transformar a faixa dinâmica de um vídeo de HDR para SDR, mantendo detalhes e cores da imagem, que são informações muito importantes para representar a cena original. Atualmente, funciona apenas ao transcodificar vídeos com 10bit HDR10, HLG e DoVi. Isso requer a biblioteca GPGPU correspondente.",
|
||||||
"EnableTonemapping": "Ativar mapeamento de tons",
|
"EnableTonemapping": "Ativar mapeamento de tons",
|
||||||
"LabelOpenclDeviceHelp": "Dispositivo OpenCL usado para a mapeação de tons. Os números ao lado esquerdo do ponto (.) são referentes ao número da plataforma, os números a direita representam o número do dispositivo dentro da plataforma. O valor padrão é 0.0. O arquivo da aplicação FFmpeg contendo o método de aceleração de hardware OpenCL é obrigatório.",
|
"LabelOpenclDeviceHelp": "Dispositivo OpenCL usado para a mapeação de tons. Os números ao lado esquerdo do ponto (.) são referentes ao número da plataforma, os números a direita representam o número do dispositivo dentro da plataforma. O valor padrão é 0.0. O arquivo da aplicação FFmpeg contendo o método de aceleração de hardware OpenCL é obrigatório.",
|
||||||
"LabelOpenclDevice": "Dispositivo OpenCL",
|
"LabelOpenclDevice": "Dispositivo OpenCL",
|
||||||
|
@ -1634,7 +1634,7 @@
|
||||||
"Trailer": "Trailer",
|
"Trailer": "Trailer",
|
||||||
"Clip": "Destaque",
|
"Clip": "Destaque",
|
||||||
"AllowEmbeddedSubtitlesAllowNoneOption": "Não permitir nada",
|
"AllowEmbeddedSubtitlesAllowNoneOption": "Não permitir nada",
|
||||||
"EnableEnhancedNvdecDecoderHelp": "Implementação experimental do NVDEC. Não habilite esta opção a menos que você encontre erros de decodificação.",
|
"EnableEnhancedNvdecDecoderHelp": "Implementação aprimorada do NVDEC, desative essa opção para usar o CUVID se encontrar erros de decodificação.",
|
||||||
"ThemeVideo": "Vídeo tema",
|
"ThemeVideo": "Vídeo tema",
|
||||||
"ThemeSong": "Música tema",
|
"ThemeSong": "Música tema",
|
||||||
"Sample": "Amostra",
|
"Sample": "Amostra",
|
||||||
|
@ -1767,11 +1767,11 @@
|
||||||
"AiTranslated": "Traduzido por IA",
|
"AiTranslated": "Traduzido por IA",
|
||||||
"MachineTranslated": "Traduzido por Máquina",
|
"MachineTranslated": "Traduzido por Máquina",
|
||||||
"AllowSegmentDeletion": "Remover segmentos",
|
"AllowSegmentDeletion": "Remover segmentos",
|
||||||
"AllowSegmentDeletionHelp": "Remover segmentos antigos após serem enviados ao cliente. Isso previne armazenar o arquivo transcodificado em disco. Funciona apenas com limitação habilitada. Desligue esta opção se você tiver problemas com a reprodução.",
|
"AllowSegmentDeletionHelp": "Exclua segmentos antigos depois que eles tiverem sido baixados pelo cliente. Isso evita a necessidade de armazenar todo o arquivo transcodificado no disco. Desative esse recurso se você tiver problemas de reprodução.",
|
||||||
"LabelThrottleDelaySeconds": "Limitar após",
|
"LabelThrottleDelaySeconds": "Limitar após",
|
||||||
"LabelThrottleDelaySecondsHelp": "Tempo em segundos em que o transcodificador será limitado. É necessário que seja grande o suficiente para que o cliente mantenha um buffer saudável. Funciona apenas se o limitador estiver habilitado.",
|
"LabelThrottleDelaySecondsHelp": "Tempo em segundos em que o transcodificador será limitado. É necessário que seja grande o suficiente para que o cliente mantenha um buffer saudável. Funciona apenas se o limitador estiver habilitado.",
|
||||||
"LabelSegmentKeepSeconds": "Tempo para manter seguimentos",
|
"LabelSegmentKeepSeconds": "Tempo para manter seguimentos",
|
||||||
"LabelSegmentKeepSecondsHelp": "Tempo em segundos para que os seguimentos sejam armazenados antes de serem sobrescritos. É necessário que seja maior que \"Limitar após\". Funciona apenas se a remoção de segmentos estiver habilitada.",
|
"LabelSegmentKeepSecondsHelp": "Tempo em segundos, pelo qual os segmentos devem ser mantidos após serem baixados pelo cliente. Só funciona se a exclusão de segmentos estiver ativada.",
|
||||||
"SearchResultsEmpty": "Desculpe! Nenhum resultaod encontrado para \"{0}\"",
|
"SearchResultsEmpty": "Desculpe! Nenhum resultaod encontrado para \"{0}\"",
|
||||||
"ForeignPartsOnly": "Apenas partes extrangeiras/forçadas",
|
"ForeignPartsOnly": "Apenas partes extrangeiras/forçadas",
|
||||||
"HearingImpairedShort": "HI/SDH",
|
"HearingImpairedShort": "HI/SDH",
|
||||||
|
@ -1825,5 +1825,37 @@
|
||||||
"PlaybackError.NETWORK_ERROR": "A reprodução falhou devido a um erro de rede.",
|
"PlaybackError.NETWORK_ERROR": "A reprodução falhou devido a um erro de rede.",
|
||||||
"PlaybackError.NO_MEDIA_ERROR": "Não foi possível encontrar uma fonte de mídia válida para reproduzir.",
|
"PlaybackError.NO_MEDIA_ERROR": "Não foi possível encontrar uma fonte de mídia válida para reproduzir.",
|
||||||
"PlaybackError.SERVER_ERROR": "A reprodução falhou devido a um erro no servidor.",
|
"PlaybackError.SERVER_ERROR": "A reprodução falhou devido a um erro no servidor.",
|
||||||
"ViewLyrics": "Ver letras"
|
"ViewLyrics": "Ver letras",
|
||||||
|
"LabelEncodingFormatOptions": "Opções de formato de codificação",
|
||||||
|
"EncodingFormatHelp": "Selecione a codificação de vídeo para a qual o Jellyfin deve transcodificar. O Jellyfin usará codificação por software quando a aceleração de hardware para o formato selecionado não estiver disponível. A codificação H264 sempre estará ativada.",
|
||||||
|
"AllowVideoToolboxTonemappingHelp": "Mapeamento de tons acelerado por hardware fornecido pelo VideoToolbox. Ele funciona com a maioria dos formatos HDR, incluindo HDR10, HDR10+ e HLG, mas não funciona com o Dolby Vision Profile 5. Isso tem uma prioridade mais alta em comparação com outra implementação do Metal.",
|
||||||
|
"PriorityHigh": "Alta",
|
||||||
|
"LabelTrickplayAccelEncoding": "Ativar codificação MJPEG acelerada por hardware",
|
||||||
|
"LabelTrickplayAccel": "Ativar decodificação por hardware",
|
||||||
|
"LabelTrickplayAccelEncodingHelp": "Atualmente disponível apenas no QSV e VAAPI, essa opção não tem efeito sobre outros métodos de aceleração por hardware.",
|
||||||
|
"LabelScanBehavior": "Comportamento do Escaneamento",
|
||||||
|
"PriorityAboveNormal": "Acima do normal",
|
||||||
|
"PriorityNormal": "Normal",
|
||||||
|
"EnableVideoToolboxTonemapping": "Habilitar mapeamento de tons do VideoToolbox",
|
||||||
|
"PriorityBelowNormal": "Abaixo do normal",
|
||||||
|
"PriorityIdle": "Ocioso",
|
||||||
|
"LabelProcessPriority": "Prioridade do Processo",
|
||||||
|
"LabelImageIntervalHelp": "Intervalo de tempo (ms) entre cada nova imagem do trickplay.",
|
||||||
|
"LabelWidthResolutionsHelp": "Lista separada por vírgula das larguras (px) em que as imagens do trickplay serão geradas. Todas as imagens devem ser geradas proporcionalmente à fonte, de modo que uma largura de 320 em um vídeo de 16:9 resulta em cerca de 320x180.",
|
||||||
|
"OptionExtractTrickplayImage": "Ativar extração de imagens trickplay",
|
||||||
|
"ExtractTrickplayImagesHelp": "Imagens de Trickplay são semelhantes às imagens de capítulo, exceto que abrangem todo o comprimento do conteúdo e são usadas para mostrar uma prévia ao navegar pelos vídeos.",
|
||||||
|
"LabelExtractTrickplayDuringLibraryScan": "Extrair imagens trickplay durante o escaneamento da biblioteca",
|
||||||
|
"LabelExtractTrickplayDuringLibraryScanHelp": "Gerar imagens de trickplay quando os vídeos são importados durante o escaneamento da biblioteca. Caso contrário, elas serão extraídas durante a tarefa agendada de imagens trickplay. Se a geração estiver configurada como não-bloqueadora, isso não afetará o tempo que a varredura da biblioteca leva para ser concluída.",
|
||||||
|
"LabelWidthResolutions": "Resolução de largura",
|
||||||
|
"NonBlockingScan": "Não Bloqueadora - enfileira a geração e depois retorna",
|
||||||
|
"BlockingScan": "Bloqueadora - enfileira a geração e bloqueia escaneamento até a conclusão",
|
||||||
|
"LabelImageInterval": "Intervalo de imagens",
|
||||||
|
"LabelJpegQuality": "Qualidade JPEG",
|
||||||
|
"LabelJpegQualityHelp": "A qualidade de compressão JPEG para imagens trickplay.",
|
||||||
|
"LabelQscaleHelp": "A escala de qualidade das imagens produzidas pelo ffmpeg, sendo 2 a qualidade mais alta e 31 a mais baixa.",
|
||||||
|
"LabelProcessPriorityHelp": "A configuração desse valor mais baixo ou mais alto determinará como a CPU prioriza o processo de geração de trickplay do ffmpeg em relação a outros processos. Se você notar lentidão durante a geração de imagens do trickplay, mas não quiser interromper totalmente a geração, tente diminuir esse valor, bem como a contagem de threads.",
|
||||||
|
"LabelScanBehaviorHelp": "O comportamento padrão é não bloqueadora, o que adicionará mídia à biblioteca antes que a geração do trickplay seja feita. Bloquear garantirá que os arquivos trickplay sejam gerados antes que a mídia seja adicionada à biblioteca, mas tornará os escaneamentos significativamente mais longos.",
|
||||||
|
"LabelTrickplayThreadsHelp": "O número de threads a ser passado para o argumento '-threads' do ffmpeg.",
|
||||||
|
"LabelTrickplayThreads": "FFmpeg Threads",
|
||||||
|
"Trickplay": "Trickplay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -215,7 +215,7 @@
|
||||||
"LabelAlbumArtPN": "PN da capa do álbum",
|
"LabelAlbumArtPN": "PN da capa do álbum",
|
||||||
"LabelAlbumArtists": "Artistas do álbum",
|
"LabelAlbumArtists": "Artistas do álbum",
|
||||||
"LabelAppName": "Nome da aplicação",
|
"LabelAppName": "Nome da aplicação",
|
||||||
"LabelAppNameExample": "Exemplo: Sickbeard, Sonarr",
|
"LabelAppNameExample": "Um nome legível por humanos para identificar as chaves da API. Esta definição não afetará a funcionalidade.",
|
||||||
"LabelArtists": "Artistas",
|
"LabelArtists": "Artistas",
|
||||||
"LabelArtistsHelp": "Separe múltiplos artistas com ponto e virgula (;).",
|
"LabelArtistsHelp": "Separe múltiplos artistas com ponto e virgula (;).",
|
||||||
"LabelAudioLanguagePreference": "Idioma de áudio preferido",
|
"LabelAudioLanguagePreference": "Idioma de áudio preferido",
|
||||||
|
@ -1763,7 +1763,7 @@
|
||||||
"LabelAlbumGain": "Ganho do Album",
|
"LabelAlbumGain": "Ganho do Album",
|
||||||
"BackdropScreensaver": "Fundo do protetor de ecrã",
|
"BackdropScreensaver": "Fundo do protetor de ecrã",
|
||||||
"LabelIsHearingImpaired": "Para deficientes auditivos (SDH)",
|
"LabelIsHearingImpaired": "Para deficientes auditivos (SDH)",
|
||||||
"LabelBackdropScreensaverIntervalHelp": "O tempo em segundos entre diferentes cenários ao usar o protetor de ecrã de cenário.",
|
"LabelBackdropScreensaverIntervalHelp": "O tempo em segundos entre a mudança de diferentes imagens de fundo na proteção de ecrã.",
|
||||||
"LabelBackdropScreensaverInterval": "Intervalo do fundo do protetor de ecrã",
|
"LabelBackdropScreensaverInterval": "Intervalo do fundo do protetor de ecrã",
|
||||||
"HeaderAllRecordings": "Todas as Gravações",
|
"HeaderAllRecordings": "Todas as Gravações",
|
||||||
"SelectAudioNormalizationHelp": "Ganho de faixa - ajusta o volume de cada faixa para que sejam reproduzidas com o mesmo volume. Ganho do álbum - ajusta o volume de todas as faixas apenas de um álbum, mantendo a faixa dinâmica do álbum.",
|
"SelectAudioNormalizationHelp": "Ganho de faixa - ajusta o volume de cada faixa para que sejam reproduzidas com o mesmo volume. Ganho do álbum - ajusta o volume de todas as faixas apenas de um álbum, mantendo a faixa dinâmica do álbum.",
|
||||||
|
@ -1862,5 +1862,19 @@
|
||||||
"PlaybackError.NO_MEDIA_ERROR": "Não foi possível encontrar uma fonte multimédia válida para reproduzir.",
|
"PlaybackError.NO_MEDIA_ERROR": "Não foi possível encontrar uma fonte multimédia válida para reproduzir.",
|
||||||
"LabelServerVersion": "Versão do servidor",
|
"LabelServerVersion": "Versão do servidor",
|
||||||
"LabelWebVersion": "Versão web",
|
"LabelWebVersion": "Versão web",
|
||||||
"LabelBuildVersion": "Versão de compilação"
|
"LabelBuildVersion": "Versão de compilação",
|
||||||
|
"SavePassword": "Guardar palavra-passe",
|
||||||
|
"Author": "Autor",
|
||||||
|
"Colorist": "Colorista",
|
||||||
|
"CoverArtist": "Artista da capa",
|
||||||
|
"Creator": "Criador",
|
||||||
|
"Editor": "Editor",
|
||||||
|
"EnableTrueHd": "Ativar TrueHD",
|
||||||
|
"EnableTrueHdHelp": "Ativar apenas se o dispositivo suportar TrueHD ou estiver ligado a um recetor de áudio compatível; caso contrário, pode provocar falhas de reprodução.",
|
||||||
|
"Illustrator": "Ilustrador",
|
||||||
|
"Letterer": "Letrista",
|
||||||
|
"EnableDts": "Ativar DTS (DCA)",
|
||||||
|
"EnableDtsHelp": "Ativar apenas se o dispositivo suportar DTS ou estiver ligado a um recetor de áudio compatível; caso contrário, pode provocar falhas de reprodução.",
|
||||||
|
"HeaderLyricDownloads": "Descarregar letras",
|
||||||
|
"HeaderVideoAdvanced": "Avançadas do vídeo"
|
||||||
}
|
}
|
||||||
|
|
|
@ -395,7 +395,7 @@
|
||||||
"LabelAudioBitrate": "Taxa de bits de áudio",
|
"LabelAudioBitrate": "Taxa de bits de áudio",
|
||||||
"LabelArtistsHelp": "Separe artistas múltiplos com um ponto e vírgula.",
|
"LabelArtistsHelp": "Separe artistas múltiplos com um ponto e vírgula.",
|
||||||
"LabelArtists": "Artistas",
|
"LabelArtists": "Artistas",
|
||||||
"LabelAppNameExample": "Exemplo: Sickbeard, NzbDrone",
|
"LabelAppNameExample": "Um nome legível por humanos para identificar as chaves da API. Esta definição não afetará a funcionalidade.",
|
||||||
"LabelAppName": "Nome da aplicação",
|
"LabelAppName": "Nome da aplicação",
|
||||||
"LabelAllowedRemoteAddressesMode": "Tipo de filtro de IP remoto",
|
"LabelAllowedRemoteAddressesMode": "Tipo de filtro de IP remoto",
|
||||||
"LabelAllowedRemoteAddresses": "Filtro de IP remoto",
|
"LabelAllowedRemoteAddresses": "Filtro de IP remoto",
|
||||||
|
@ -1487,7 +1487,7 @@
|
||||||
"UnsupportedPlayback": "Jellyfin não pode desencriptar conteúdo protegido por DRM, mas todo o conteúdo será testado de qualquer maneira, incluindo títulos protegidos. Alguns arquivos podem aparecer completamente pretos devido à encriptação ou a outros recursos não suportados, como títulos interativos.",
|
"UnsupportedPlayback": "Jellyfin não pode desencriptar conteúdo protegido por DRM, mas todo o conteúdo será testado de qualquer maneira, incluindo títulos protegidos. Alguns arquivos podem aparecer completamente pretos devido à encriptação ou a outros recursos não suportados, como títulos interativos.",
|
||||||
"MessageSyncPlayGroupWait": "{0} está a armazenar em buffer…",
|
"MessageSyncPlayGroupWait": "{0} está a armazenar em buffer…",
|
||||||
"LabelSelectAudioNormalization": "Normalização de áudio",
|
"LabelSelectAudioNormalization": "Normalização de áudio",
|
||||||
"LabelBackdropScreensaverIntervalHelp": "O tempo em segundos entre diferentes cenários ao usar o protetor de tela de cenário.",
|
"LabelBackdropScreensaverIntervalHelp": "O tempo em segundos entre a mudança de diferentes imagens de fundo na proteção de ecrã.",
|
||||||
"LabelServerVersion": "Versão do servidor",
|
"LabelServerVersion": "Versão do servidor",
|
||||||
"LabelTonemappingPeakHelp": "Substitua o sinal/pico nominal/de referência por este valor. Útil quando as informações de pico incorporadas nos metadados de exibição não são confiáveis ou quando há mapeamento de tons de uma faixa mais baixa para uma faixa mais alta. Os valores recomendados e padrão são 100 e 0.",
|
"LabelTonemappingPeakHelp": "Substitua o sinal/pico nominal/de referência por este valor. Útil quando as informações de pico incorporadas nos metadados de exibição não são confiáveis ou quando há mapeamento de tons de uma faixa mais baixa para uma faixa mais alta. Os valores recomendados e padrão são 100 e 0.",
|
||||||
"OptionDateShowAdded": "Data de exibição adicionada",
|
"OptionDateShowAdded": "Data de exibição adicionada",
|
||||||
|
@ -1495,7 +1495,7 @@
|
||||||
"WriteAccessRequired": "Jellyfin requer acesso de gravação a esta pasta. Garanta o acesso de gravação e tente novamente.",
|
"WriteAccessRequired": "Jellyfin requer acesso de gravação a esta pasta. Garanta o acesso de gravação e tente novamente.",
|
||||||
"LabelFallbackFontPathHelp": "Essas fontes são usadas por alguns clientes para renderizar legendas. Consulte a documentação para obter mais informações.",
|
"LabelFallbackFontPathHelp": "Essas fontes são usadas por alguns clientes para renderizar legendas. Consulte a documentação para obter mais informações.",
|
||||||
"EnableGamepadHelp": "Ouça a entrada de qualquer controlador conectado. (Requer: Modo de exibição 'TV')",
|
"EnableGamepadHelp": "Ouça a entrada de qualquer controlador conectado. (Requer: Modo de exibição 'TV')",
|
||||||
"BackdropScreensaver": "Protetor de tela de fundo",
|
"BackdropScreensaver": "Fundo do protetor de ecrã",
|
||||||
"LabelLevel": "Nível",
|
"LabelLevel": "Nível",
|
||||||
"LabelSyncPlaySettingsMinDelaySpeedToSync": "Atraso mínimo da velocidade de sincronização",
|
"LabelSyncPlaySettingsMinDelaySpeedToSync": "Atraso mínimo da velocidade de sincronização",
|
||||||
"OptionDateEpisodeAdded": "Data do episódio adicionado",
|
"OptionDateEpisodeAdded": "Data do episódio adicionado",
|
||||||
|
@ -1611,7 +1611,7 @@
|
||||||
"LabelVideoRange": "Alcance de vídeo",
|
"LabelVideoRange": "Alcance de vídeo",
|
||||||
"Mixer": "Misturador",
|
"Mixer": "Misturador",
|
||||||
"LabelSystem": "Sistema",
|
"LabelSystem": "Sistema",
|
||||||
"SaveRecordingImages": "Salvar gravação de imagens EPG",
|
"SaveRecordingImages": "Guardar imagens da gravação EPG",
|
||||||
"SaveRecordingImagesHelp": "Guardar imagens do fornecedor de listas EPG juntamente com os ficheiros multimédia.",
|
"SaveRecordingImagesHelp": "Guardar imagens do fornecedor de listas EPG juntamente com os ficheiros multimédia.",
|
||||||
"UseDoubleRateDeinterlacing": "Duplicar a velocidade de fotogramas ao desentrelaçar",
|
"UseDoubleRateDeinterlacing": "Duplicar a velocidade de fotogramas ao desentrelaçar",
|
||||||
"MessageSyncPlayUserJoined": "{0} entrou no grupo.",
|
"MessageSyncPlayUserJoined": "{0} entrou no grupo.",
|
||||||
|
@ -1624,7 +1624,7 @@
|
||||||
"YoutubeBadRequest": "Requisição ruim.",
|
"YoutubeBadRequest": "Requisição ruim.",
|
||||||
"YoutubeDenied": "O vídeo solicitado não pode ser reproduzido em players incorporados.",
|
"YoutubeDenied": "O vídeo solicitado não pode ser reproduzido em players incorporados.",
|
||||||
"TypeOptionPluralBoxSet": "Conjuntos de caixas",
|
"TypeOptionPluralBoxSet": "Conjuntos de caixas",
|
||||||
"LabelBackdropScreensaverInterval": "Intervalo do protetor de tela de fundo",
|
"LabelBackdropScreensaverInterval": "Intervalo do fundo do protetor de ecrã",
|
||||||
"UseDoubleRateDeinterlacingHelp": "Esta definição utiliza a taxa de campo durante o desentrelaçamento, muitas vezes referido como desentrelaçamento bob, que duplica a taxa de fotogramas do vídeo para proporcionar movimento fluído, como o que verias ao ver vídeo entrelaçado numa televisão.",
|
"UseDoubleRateDeinterlacingHelp": "Esta definição utiliza a taxa de campo durante o desentrelaçamento, muitas vezes referido como desentrelaçamento bob, que duplica a taxa de fotogramas do vídeo para proporcionar movimento fluído, como o que verias ao ver vídeo entrelaçado numa televisão.",
|
||||||
"LabelDirectStreamingInfo": "Informações de transmissão direta",
|
"LabelDirectStreamingInfo": "Informações de transmissão direta",
|
||||||
"LabelAlbumGain": "Ganho do álbum",
|
"LabelAlbumGain": "Ganho do álbum",
|
||||||
|
@ -1860,5 +1860,19 @@
|
||||||
"NonBlockingScan": "Não bloqueante - coloca a geração em fila de espera e depois regressa",
|
"NonBlockingScan": "Não bloqueante - coloca a geração em fila de espera e depois regressa",
|
||||||
"LabelExtractTrickplayDuringLibraryScan": "Extrair imagens trickplay durante a análise da biblioteca",
|
"LabelExtractTrickplayDuringLibraryScan": "Extrair imagens trickplay durante a análise da biblioteca",
|
||||||
"LabelExtractTrickplayDuringLibraryScanHelp": "Gera imagens trickplay quando os vídeos são importados durante a análise da biblioteca. Caso contrário, serão extraídas durante a tarefa agendada de imagens trickplay. Se a geração estiver definida como não bloqueante, isto não afetará o tempo que a análise da biblioteca demora a ser concluída.",
|
"LabelExtractTrickplayDuringLibraryScanHelp": "Gera imagens trickplay quando os vídeos são importados durante a análise da biblioteca. Caso contrário, serão extraídas durante a tarefa agendada de imagens trickplay. Se a geração estiver definida como não bloqueante, isto não afetará o tempo que a análise da biblioteca demora a ser concluída.",
|
||||||
"PlaybackError.ASS_RENDER_ERROR": "Foi encontrado um erro no renderizador de legendas ASS/SSA."
|
"PlaybackError.ASS_RENDER_ERROR": "Foi encontrado um erro no renderizador de legendas ASS/SSA.",
|
||||||
|
"SavePassword": "Guardar palavra-passe",
|
||||||
|
"Author": "Autor",
|
||||||
|
"Colorist": "Colorista",
|
||||||
|
"CoverArtist": "Artista da capa",
|
||||||
|
"Creator": "Criador",
|
||||||
|
"Editor": "Editor",
|
||||||
|
"Illustrator": "Ilustrador",
|
||||||
|
"EnableDts": "Ativar DTS (DCA)",
|
||||||
|
"EnableDtsHelp": "Ativar apenas se o dispositivo suportar DTS ou estiver ligado a um recetor de áudio compatível; caso contrário, pode provocar falhas de reprodução.",
|
||||||
|
"EnableTrueHd": "Ativar TrueHD",
|
||||||
|
"EnableTrueHdHelp": "Ativar apenas se o dispositivo suportar TrueHD ou estiver ligado a um recetor de áudio compatível; caso contrário, pode provocar falhas de reprodução.",
|
||||||
|
"HeaderVideoAdvanced": "Avançadas do vídeo",
|
||||||
|
"HeaderLyricDownloads": "Descarregar letras",
|
||||||
|
"Letterer": "Letrista"
|
||||||
}
|
}
|
||||||
|
|
|
@ -760,7 +760,7 @@
|
||||||
"MediaInfoAnamorphic": "Анаморфность",
|
"MediaInfoAnamorphic": "Анаморфность",
|
||||||
"MediaInfoAspectRatio": "Соотношение сторон",
|
"MediaInfoAspectRatio": "Соотношение сторон",
|
||||||
"MediaInfoBitDepth": "Разрядность",
|
"MediaInfoBitDepth": "Разрядность",
|
||||||
"MediaInfoBitrate": "Битрейт",
|
"MediaInfoBitrate": "Потоковая скорость",
|
||||||
"MediaInfoChannels": "Каналы",
|
"MediaInfoChannels": "Каналы",
|
||||||
"MediaInfoCodec": "Кодек",
|
"MediaInfoCodec": "Кодек",
|
||||||
"MediaInfoCodecTag": "Тег кодека",
|
"MediaInfoCodecTag": "Тег кодека",
|
||||||
|
@ -1816,7 +1816,7 @@
|
||||||
"AllowMjpegEncoding": "Разрешить кодирование в формате MJPEG (используется при создании трюковой игры)",
|
"AllowMjpegEncoding": "Разрешить кодирование в формате MJPEG (используется при создании трюковой игры)",
|
||||||
"LabelProcessPriorityHelp": "Установив это значение ниже или выше, вы определите, как процессор расставит приоритеты для процесса генерации trickplay в формате ffmpeg по отношению к другим процессам. Если вы заметили замедление при создании изображений trickplay, но не хотите полностью останавливать их генерацию, попробуйте уменьшить это значение, а также количество потоков.",
|
"LabelProcessPriorityHelp": "Установив это значение ниже или выше, вы определите, как процессор расставит приоритеты для процесса генерации trickplay в формате ffmpeg по отношению к другим процессам. Если вы заметили замедление при создании изображений trickplay, но не хотите полностью останавливать их генерацию, попробуйте уменьшить это значение, а также количество потоков.",
|
||||||
"LabelEncodingFormatOptions": "Параметры формата кодирования",
|
"LabelEncodingFormatOptions": "Параметры формата кодирования",
|
||||||
"LabelTrickplayAccel": "Включить аппаратное ускорение",
|
"LabelTrickplayAccel": "Включить аппаратное декодирование",
|
||||||
"LabelTrickplayAccelHelp": "Обязательно включите \"Разрешить кодировку MJPEG\" в режиме транскодирования, если ваше оборудование поддерживает это.",
|
"LabelTrickplayAccelHelp": "Обязательно включите \"Разрешить кодировку MJPEG\" в режиме транскодирования, если ваше оборудование поддерживает это.",
|
||||||
"PriorityAboveNormal": "Выше нормы",
|
"PriorityAboveNormal": "Выше нормы",
|
||||||
"LabelTileWidth": "Ширина плитки",
|
"LabelTileWidth": "Ширина плитки",
|
||||||
|
@ -1858,5 +1858,15 @@
|
||||||
"PriorityHigh": "Высокий",
|
"PriorityHigh": "Высокий",
|
||||||
"PriorityNormal": "Нормальный",
|
"PriorityNormal": "Нормальный",
|
||||||
"LabelJpegQualityHelp": "Уровень сжатия JPEG для кадров trickplay.",
|
"LabelJpegQualityHelp": "Уровень сжатия JPEG для кадров trickplay.",
|
||||||
"NonBlockingScan": "Асинхронное - ставит генерацию в очередь и продолжает"
|
"NonBlockingScan": "Асинхронное - ставит генерацию в очередь и продолжает",
|
||||||
|
"Lyrics": "Текст песни",
|
||||||
|
"SavePassword": "Сохранить пароль",
|
||||||
|
"ViewLyrics": "Просмотр текста песни",
|
||||||
|
"LabelTrickplayAccelEncoding": "Включить аппаратное ускорение кодирования MJPEG",
|
||||||
|
"LabelTrickplayAccelEncodingHelp": "Эта опция доступна только для QSV и VAAPI, она не влияет на другие методы аппаратного ускорения.",
|
||||||
|
"ConfirmDeleteLyrics": "Удаление этих текстов песен приведет к удалению их как из файловой системы, так и из вашей медиатеки. Вы уверены, что хотите продолжить?",
|
||||||
|
"DeleteLyrics": "Удалить тексты песен",
|
||||||
|
"ErrorDeletingLyrics": "Возникла ошибка при удалении текста песни с сервера. Пожалуйста, проверьте, имеет ли Jellyfin доступ на запись в папку с медиа, и попробуйте ещё раз.",
|
||||||
|
"HeaderDeleteLyrics": "Удалить Текст песни",
|
||||||
|
"HeaderNoLyrics": "Текст песни не найден"
|
||||||
}
|
}
|
||||||
|
|
|
@ -215,7 +215,7 @@
|
||||||
"HeaderSelectPath": "Vybrať priečinok",
|
"HeaderSelectPath": "Vybrať priečinok",
|
||||||
"HeaderSendMessage": "Poslať správu",
|
"HeaderSendMessage": "Poslať správu",
|
||||||
"HeaderServerSettings": "Nastavenia servera",
|
"HeaderServerSettings": "Nastavenia servera",
|
||||||
"HeaderSetupLibrary": "Nastavenie vašich knižníc médií",
|
"HeaderSetupLibrary": "Nastavenie Vašich knižníc médií",
|
||||||
"HeaderSortBy": "Zoradiť podľa",
|
"HeaderSortBy": "Zoradiť podľa",
|
||||||
"HeaderStartNow": "Začať teraz",
|
"HeaderStartNow": "Začať teraz",
|
||||||
"HeaderStopRecording": "Zastaviť nahrávanie",
|
"HeaderStopRecording": "Zastaviť nahrávanie",
|
||||||
|
@ -251,7 +251,7 @@
|
||||||
"LabelAllowHWTranscoding": "Povoliť hardvérové prekódovanie",
|
"LabelAllowHWTranscoding": "Povoliť hardvérové prekódovanie",
|
||||||
"LabelAllowedRemoteAddresses": "Filter vzdialených IP adries",
|
"LabelAllowedRemoteAddresses": "Filter vzdialených IP adries",
|
||||||
"LabelAppName": "Názov appky",
|
"LabelAppName": "Názov appky",
|
||||||
"LabelAppNameExample": "Príklad: Sickbeard, Sonarr",
|
"LabelAppNameExample": "Čitateľný názov na identifikáciu kľúčov API. Toto nastavenie neovplyvní funkčnosť.",
|
||||||
"LabelArtists": "Interpreti",
|
"LabelArtists": "Interpreti",
|
||||||
"LabelArtistsHelp": "Viacej interpretov oddeľte pomocou bodkočiarky.",
|
"LabelArtistsHelp": "Viacej interpretov oddeľte pomocou bodkočiarky.",
|
||||||
"LabelAudioLanguagePreference": "Uprednostňovaný jazyk zvuku",
|
"LabelAudioLanguagePreference": "Uprednostňovaný jazyk zvuku",
|
||||||
|
@ -1261,7 +1261,7 @@
|
||||||
"ListPaging": "{0}-{1} z {2}",
|
"ListPaging": "{0}-{1} z {2}",
|
||||||
"WriteAccessRequired": "Server vyžaduje práva na zapisovanie do tohoto priečinku. Prosím, uistite sa že má práva na zapisovanie a skúste to znova.",
|
"WriteAccessRequired": "Server vyžaduje práva na zapisovanie do tohoto priečinku. Prosím, uistite sa že má práva na zapisovanie a skúste to znova.",
|
||||||
"PathNotFound": "Táto cesta nebola nájdená. Prosím, uistite sa že cesta je správna a skúste to znovu.",
|
"PathNotFound": "Táto cesta nebola nájdená. Prosím, uistite sa že cesta je správna a skúste to znovu.",
|
||||||
"Yadif": "YADIF",
|
"Yadif": "Yet Another DeInterlacing Filter (YADIF)",
|
||||||
"Season": "Séria",
|
"Season": "Séria",
|
||||||
"Person": "Osoba",
|
"Person": "Osoba",
|
||||||
"Movie": "Film",
|
"Movie": "Film",
|
||||||
|
@ -1363,7 +1363,7 @@
|
||||||
"DeleteAll": "Zmazať všetko",
|
"DeleteAll": "Zmazať všetko",
|
||||||
"Data": "Údaje",
|
"Data": "Údaje",
|
||||||
"ThumbCard": "Thumb karta",
|
"ThumbCard": "Thumb karta",
|
||||||
"Bwdif": "BWDIF",
|
"Bwdif": "Bob Weaver DeInterlacing Filter (BWDIF)",
|
||||||
"LabelEnableSSDPTracing": "Povoliť trasovanie SSDP",
|
"LabelEnableSSDPTracing": "Povoliť trasovanie SSDP",
|
||||||
"LabelEnableIP6Help": "Povolí IPv6 funkcionalitu.",
|
"LabelEnableIP6Help": "Povolí IPv6 funkcionalitu.",
|
||||||
"LabelEnableIP6": "Povoliť IPv6",
|
"LabelEnableIP6": "Povoliť IPv6",
|
||||||
|
@ -1706,7 +1706,7 @@
|
||||||
"LabelEnableAudioVbr": "Povoliť kódovanie zvuku VBR",
|
"LabelEnableAudioVbr": "Povoliť kódovanie zvuku VBR",
|
||||||
"HeaderPerformance": "Výkon",
|
"HeaderPerformance": "Výkon",
|
||||||
"AllowCollectionManagement": "Povoliť tomuto používateľovi spravovať kolekcie",
|
"AllowCollectionManagement": "Povoliť tomuto používateľovi spravovať kolekcie",
|
||||||
"LabelParallelImageEncodingLimitHelp": "Maximálny počet kódovaní obrazu, ktoré môžu bežať paralelne. Nastavením tejto hodnoty na 0 sa zvolí limit na základe špecifikácie vášho systému.",
|
"LabelParallelImageEncodingLimitHelp": "Maximálny počet kódovaní obrázkov, ktoré môžu bežať paralelne. Nastavením tejto hodnoty na 0 sa zvolí limit na základe špecifikácie vášho systému.",
|
||||||
"TonemappingModeHelp": "Vyberte režim mapovania tónov. Ak sa vyskytnú preexponované svetlé miesta, skúste prepnúť na režim RGB.",
|
"TonemappingModeHelp": "Vyberte režim mapovania tónov. Ak sa vyskytnú preexponované svetlé miesta, skúste prepnúť na režim RGB.",
|
||||||
"Featurette": "Stredne dlhý film",
|
"Featurette": "Stredne dlhý film",
|
||||||
"Short": "Krátky film",
|
"Short": "Krátky film",
|
||||||
|
@ -1867,5 +1867,30 @@
|
||||||
"ErrorDeletingLyrics": "Pri odstraňovaní textov piesní zo servera došlo k chybe. Skontrolujte, či má Jellyfin prístup na zápis do priečinka médií, a skúste to znova.",
|
"ErrorDeletingLyrics": "Pri odstraňovaní textov piesní zo servera došlo k chybe. Skontrolujte, či má Jellyfin prístup na zápis do priečinka médií, a skúste to znova.",
|
||||||
"HeaderDeleteLyrics": "Odstrániť texty piesní",
|
"HeaderDeleteLyrics": "Odstrániť texty piesní",
|
||||||
"HeaderNoLyrics": "Nenašli sa žiadne texty piesní",
|
"HeaderNoLyrics": "Nenašli sa žiadne texty piesní",
|
||||||
"ViewLyrics": "Zobraziť texty piesní"
|
"ViewLyrics": "Zobraziť texty piesní",
|
||||||
|
"SavePassword": "Uložiť heslo",
|
||||||
|
"PlaylistError.AddFailed": "Chyba pri pridávaní do playlistu",
|
||||||
|
"PlaylistError.CreateFailed": "Chyba pri vytváraní playlistu",
|
||||||
|
"EnableDts": "Povoliť DTS (DCA)",
|
||||||
|
"EnableDtsHelp": "Povoľte len vtedy, ak vaše zariadenie podporuje DTS alebo je pripojené ku kompatibilnému audio receiveru, inak môže dôjsť k zlyhaniu prehrávania.",
|
||||||
|
"EnableTrueHd": "Povoliť TrueHD",
|
||||||
|
"EnableTrueHdHelp": "Povoľte len vtedy, ak vaše zariadenie podporuje TrueHD alebo je pripojené ku kompatibilnému audio receiveru, inak môže dôjsť k zlyhaniu prehrávania.",
|
||||||
|
"HeaderVideoAdvanced": "Pokročilé video",
|
||||||
|
"PlaylistPublic": "Povoliť verejný prístup",
|
||||||
|
"HeaderLyricDownloads": "Stiahnutie textov piesní",
|
||||||
|
"Author": "Autor",
|
||||||
|
"Colorist": "Kolorista",
|
||||||
|
"Creator": "Tvorca",
|
||||||
|
"CoverArtist": "Autor obálky",
|
||||||
|
"Editor": "Editor",
|
||||||
|
"Illustrator": "Ilustrátor",
|
||||||
|
"Inker": "Inker",
|
||||||
|
"Letterer": "Lettrista",
|
||||||
|
"Penciller": "Penciler",
|
||||||
|
"SaveLyricsIntoMediaFolders": "Uložiť texty piesní do priečinkov médií",
|
||||||
|
"SaveLyricsIntoMediaFoldersHelp": "Uloženie textov piesní k zvukovým súborom umožní ich jednoduchšie spravovanie.",
|
||||||
|
"Translator": "Prekladateľ",
|
||||||
|
"PlaylistPublicDescription": "Povoliť zobrazenie tohto playlistu každému prihlásenému používateľovi.",
|
||||||
|
"LibraryScanFanoutConcurrencyHelp": "Maximálny počet paralelných úloh počas skenovania knižnice. Nastavením tejto hodnoty na 0 sa zvolí limit na základe počtu jadier CPU vášho systému. UPOZORNENIE: Nastavenie príliš vysokého čísla môže spôsobiť problémy so sieťovými súborovými systémami, Ak sa vyskytnú problémy, znížte toto číslo.",
|
||||||
|
"LibraryScanFanoutConcurrency": "Limit úloh paralelného skenovania knižnice"
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
"AllowedRemoteAddressesHelp": "தொலைதூரத்துடன் இணைக்க அனுமதிக்கப்படும் நெட்வொர்க்குகளுக்கான ஐபி முகவரிகள் அல்லது ஐபி / நெட்மாஸ்க் உள்ளீடுகளின் கமாவால் பிரிக்கப்பட்ட பட்டியல். காலியாக இருந்தால், எல்லா தொலை முகவரிகளும் அனுமதிக்கப்படும்.",
|
"AllowedRemoteAddressesHelp": "தொலைதூரத்துடன் இணைக்க அனுமதிக்கப்படும் நெட்வொர்க்குகளுக்கான ஐபி முகவரிகள் அல்லது ஐபி / நெட்மாஸ்க் உள்ளீடுகளின் கமாவால் பிரிக்கப்பட்ட பட்டியல். காலியாக இருந்தால், எல்லா தொலை முகவரிகளும் அனுமதிக்கப்படும்.",
|
||||||
"AllowRemoteAccessHelp": "தேர்வு செய்யப்படாவிட்டால், எல்லா தொலைநிலை இணைப்புகளும் தடுக்கப்படும்.",
|
"AllowRemoteAccessHelp": "தேர்வு செய்யப்படாவிட்டால், எல்லா தொலைநிலை இணைப்புகளும் தடுக்கப்படும்.",
|
||||||
"AllowRemoteAccess": "இந்த சேவையகத்திற்கு தொலை இணைப்புகளை அனுமதிக்கவும்",
|
"AllowRemoteAccess": "இந்த சேவையகத்திற்கு தொலை இணைப்புகளை அனுமதிக்கவும்",
|
||||||
"AllowFfmpegThrottlingHelp": "ஒரு டிரான்ஸ்கோட் அல்லது ரீமக்ஸ் தற்போதைய பின்னணி நிலையிலிருந்து வெகு தொலைவில் இருக்கும்போது, செயல்முறையை இடைநிறுத்துங்கள், இதனால் அது குறைந்த ஆதாரங்களை நுகரும். அடிக்கடி தேடாமல் பார்க்கும்போது இது மிகவும் பயனுள்ளதாக இருக்கும். பின்னணி சிக்கல்களை நீங்கள் சந்தித்தால் இதை அணைக்கவும்.",
|
"AllowFfmpegThrottlingHelp": "டிரான்ஸ்கோட் அல்லது ரீமக்ஸ் தற்போதைய பிளேபேக் நிலையில் இருந்து போதுமான அளவு முன்னேறும் போது, செயல்முறையை இடைநிறுத்தவும், அதனால் அது குறைவான ஆதாரங்களைப் பயன்படுத்தும். அடிக்கடி தேடாமல் பார்க்கும் போது இது மிகவும் பயனுள்ளதாக இருக்கும். பிளேபேக் சிக்கல்களை நீங்கள் சந்தித்தால் இதை முடக்கவும்.",
|
||||||
"AllowFfmpegThrottling": "திராட்டில் ட்ரான்ஸ்கோட்கள்",
|
"AllowFfmpegThrottling": "திராட்டில் ட்ரான்ஸ்கோட்கள்",
|
||||||
"AllowOnTheFlySubtitleExtractionHelp": "வீடியோ டிரான்ஸ்கோடிங்கைத் தடுக்க உதவும் வகையில் உட்பொதிக்கப்பட்ட வசனங்களை வீடியோக்களிலிருந்து பிரித்தெடுத்து வாடிக்கையாளர்களுக்கு எளிய உரையில் வழங்கலாம். சில கணினிகளில் இது நீண்ட நேரம் எடுக்கும் மற்றும் பிரித்தெடுக்கும் செயல்பாட்டின் போது வீடியோ பிளேபேக் நிறுத்தப்படும். கிளையன்ட் சாதனத்தால் பூர்வீகமாக ஆதரிக்கப்படாதபோது உட்பொதிக்கப்பட்ட வசன வரிகள் வீடியோ டிரான்ஸ்கோடிங்கில் எரிக்கப்படுவதை முடக்கு.",
|
"AllowOnTheFlySubtitleExtractionHelp": "வீடியோ டிரான்ஸ்கோடிங்கைத் தடுக்க உதவும் வகையில் உட்பொதிக்கப்பட்ட வசனங்களை வீடியோக்களிலிருந்து பிரித்தெடுத்து வாடிக்கையாளர்களுக்கு எளிய உரையில் வழங்கலாம். சில கணினிகளில் இது நீண்ட நேரம் எடுக்கும் மற்றும் பிரித்தெடுக்கும் செயல்பாட்டின் போது வீடியோ பிளேபேக் நிறுத்தப்படும். கிளையன்ட் சாதனத்தால் பூர்வீகமாக ஆதரிக்கப்படாதபோது உட்பொதிக்கப்பட்ட வசன வரிகள் வீடியோ டிரான்ஸ்கோடிங்கில் எரிக்கப்படுவதை முடக்கு.",
|
||||||
"AllowOnTheFlySubtitleExtraction": "வசன வரிகள் பிரித்தெடுக்க அனுமதிக்கவும்",
|
"AllowOnTheFlySubtitleExtraction": "வசன வரிகள் பிரித்தெடுக்க அனுமதிக்கவும்",
|
||||||
|
@ -333,7 +333,7 @@
|
||||||
"HeaderConfirmRevokeApiKey": "API விசையைத் திரும்பப்பெறுக",
|
"HeaderConfirmRevokeApiKey": "API விசையைத் திரும்பப்பெறுக",
|
||||||
"HeaderConfirmProfileDeletion": "சுயவிவர நீக்குதலை உறுதிப்படுத்தவும்",
|
"HeaderConfirmProfileDeletion": "சுயவிவர நீக்குதலை உறுதிப்படுத்தவும்",
|
||||||
"HeaderSortBy": "மூலம் வரிசைப்படுத்து",
|
"HeaderSortBy": "மூலம் வரிசைப்படுத்து",
|
||||||
"HeaderSetupLibrary": "உங்கள் மீடியா நூலகங்களை அமைக்கவும்",
|
"HeaderSetupLibrary": "உங்கள் ஊடக நூலகங்களை அமைக்கவும்",
|
||||||
"HeaderServerSettings": "சேவையக அமைப்புகள்",
|
"HeaderServerSettings": "சேவையக அமைப்புகள்",
|
||||||
"HeaderServerAddressSettings": "சேவையக முகவரி அமைப்புகள்",
|
"HeaderServerAddressSettings": "சேவையக முகவரி அமைப்புகள்",
|
||||||
"HeaderSeriesStatus": "தொடர் நிலை",
|
"HeaderSeriesStatus": "தொடர் நிலை",
|
||||||
|
@ -492,7 +492,7 @@
|
||||||
"LabelAudioBitDepth": "ஆடியோ பிட் ஆழம்",
|
"LabelAudioBitDepth": "ஆடியோ பிட் ஆழம்",
|
||||||
"LabelArtistsHelp": "அரைக்காற்புள்ளியுடன் பல கலைஞர்களைப் பிரிக்கவும்.",
|
"LabelArtistsHelp": "அரைக்காற்புள்ளியுடன் பல கலைஞர்களைப் பிரிக்கவும்.",
|
||||||
"LabelArtists": "கலைஞர்கள்",
|
"LabelArtists": "கலைஞர்கள்",
|
||||||
"LabelAppNameExample": "எடுத்துக்காட்டு: Sickbeard, Sonarr",
|
"LabelAppNameExample": "API விசைகளை அடையாளம் காண மனிதனால் படிக்கக்கூடிய பெயர். இந்த அமைப்பு செயல்பாட்டை பாதிக்காது.",
|
||||||
"LabelAppName": "பயன்பாட்டின் பெயர்",
|
"LabelAppName": "பயன்பாட்டின் பெயர்",
|
||||||
"LabelAllowedRemoteAddressesMode": "தொலை ஐபி முகவரி வடிகட்டி பயன்முறை",
|
"LabelAllowedRemoteAddressesMode": "தொலை ஐபி முகவரி வடிகட்டி பயன்முறை",
|
||||||
"LabelAllowedRemoteAddresses": "தொலை ஐபி முகவரி வடிப்பான்",
|
"LabelAllowedRemoteAddresses": "தொலை ஐபி முகவரி வடிப்பான்",
|
||||||
|
@ -1241,7 +1241,7 @@
|
||||||
"Yesterday": "நேற்று",
|
"Yesterday": "நேற்று",
|
||||||
"Yes": "ஆம்",
|
"Yes": "ஆம்",
|
||||||
"YadifBob": "யடிஃப் பாப்",
|
"YadifBob": "யடிஃப் பாப்",
|
||||||
"Yadif": "யடிஃப்",
|
"Yadif": "இன்னுமொரு டீஇண்டர்லேசிங் வடிகட்டி (YADIF)",
|
||||||
"XmlTvSportsCategoriesHelp": "இந்த வகைகளைக் கொண்ட நிகழ்ச்சிகள் விளையாட்டுத் திட்டங்களாகக் காட்டப்படும். '|' உடன் பலவற்றைப் பிரிக்கவும்.",
|
"XmlTvSportsCategoriesHelp": "இந்த வகைகளைக் கொண்ட நிகழ்ச்சிகள் விளையாட்டுத் திட்டங்களாகக் காட்டப்படும். '|' உடன் பலவற்றைப் பிரிக்கவும்.",
|
||||||
"XmlTvPathHelp": "XMLTV கோப்புக்கான பாதை. ஜெல்லிஃபின் இந்த கோப்பைப் படித்து புதுப்பிப்புகளுக்கு அவ்வப்போது சரிபார்க்கும். கோப்பை உருவாக்கி புதுப்பிக்க நீங்கள் பொறுப்பு.",
|
"XmlTvPathHelp": "XMLTV கோப்புக்கான பாதை. ஜெல்லிஃபின் இந்த கோப்பைப் படித்து புதுப்பிப்புகளுக்கு அவ்வப்போது சரிபார்க்கும். கோப்பை உருவாக்கி புதுப்பிக்க நீங்கள் பொறுப்பு.",
|
||||||
"XmlTvNewsCategoriesHelp": "இந்த வகைகளைக் கொண்ட நிகழ்ச்சிகள் செய்தித் திட்டங்களாகக் காட்டப்படும். '|' உடன் பலவற்றைப் பிரிக்கவும்.",
|
"XmlTvNewsCategoriesHelp": "இந்த வகைகளைக் கொண்ட நிகழ்ச்சிகள் செய்தித் திட்டங்களாகக் காட்டப்படும். '|' உடன் பலவற்றைப் பிரிக்கவும்.",
|
||||||
|
@ -1385,7 +1385,7 @@
|
||||||
"LabelIconMaxResHelp": "'upnp:icon' பண்பு வழியாக வெளிப்படும் ஐகான்களின் அதிகபட்ச தெளிவுத்திறன்.",
|
"LabelIconMaxResHelp": "'upnp:icon' பண்பு வழியாக வெளிப்படும் ஐகான்களின் அதிகபட்ச தெளிவுத்திறன்.",
|
||||||
"LabelAlbumArtMaxResHelp": "'upnp:albumArtURI' பண்பு மூலம் வெளிப்படும் ஆல்பம் கலையின் அதிகபட்ச தெளிவுத்திறன்.",
|
"LabelAlbumArtMaxResHelp": "'upnp:albumArtURI' பண்பு மூலம் வெளிப்படும் ஆல்பம் கலையின் அதிகபட்ச தெளிவுத்திறன்.",
|
||||||
"Other": "மற்றவை",
|
"Other": "மற்றவை",
|
||||||
"Bwdif": "BWDIF",
|
"Bwdif": "பாப் வீவர் டிஇண்டர்லேசிங் வடிகட்டி (BWDIF)",
|
||||||
"UseDoubleRateDeinterlacingHelp": "டீஇன்டர்லேசிங் செய்யும் போது இந்த அமைப்பு புலம் வீதத்தைப் பயன்படுத்துகிறது, இது பெரும்பாலும் பாப் டீஇன்டர்லேசிங் என அழைக்கப்படுகிறது, இது டிவியில் ஒன்றோடொன்று இணைக்கப்பட்ட வீடியோவைப் பார்க்கும்போது நீங்கள் பார்ப்பது போன்ற முழு இயக்கத்தையும் வழங்க வீடியோவின் பிரேம் வீதத்தை இரட்டிப்பாக்குகிறது.",
|
"UseDoubleRateDeinterlacingHelp": "டீஇன்டர்லேசிங் செய்யும் போது இந்த அமைப்பு புலம் வீதத்தைப் பயன்படுத்துகிறது, இது பெரும்பாலும் பாப் டீஇன்டர்லேசிங் என அழைக்கப்படுகிறது, இது டிவியில் ஒன்றோடொன்று இணைக்கப்பட்ட வீடியோவைப் பார்க்கும்போது நீங்கள் பார்ப்பது போன்ற முழு இயக்கத்தையும் வழங்க வீடியோவின் பிரேம் வீதத்தை இரட்டிப்பாக்குகிறது.",
|
||||||
"UseDoubleRateDeinterlacing": "செயலிழக்கும்போது பிரேம் வீதத்தை இரட்டிப்பாக்குங்கள்",
|
"UseDoubleRateDeinterlacing": "செயலிழக்கும்போது பிரேம் வீதத்தை இரட்டிப்பாக்குங்கள்",
|
||||||
"LabelMaxMuxingQueueSizeHelp": "அனைத்து ஸ்ட்ரீம்களும் தொடங்கும் வரை காத்திருக்கும் போது, இடையகப்படுத்தக்கூடிய பாக்கெட்டுகளின் அதிகபட்ச எண்ணிக்கை. FFmpeg பதிவுகளில் \"அவுட்புட் ஸ்ட்ரீமிற்காக பல பாக்கெட்டுகள் இடையகப்படுத்தப்பட்டுள்ளன\" என்ற பிழையை நீங்கள் இன்னும் சந்தித்தால் அதை அதிகரிக்க முயற்சிக்கவும். பரிந்துரைக்கப்பட்ட மதிப்பு 2048 ஆகும்.",
|
"LabelMaxMuxingQueueSizeHelp": "அனைத்து ஸ்ட்ரீம்களும் தொடங்கும் வரை காத்திருக்கும் போது, இடையகப்படுத்தக்கூடிய பாக்கெட்டுகளின் அதிகபட்ச எண்ணிக்கை. FFmpeg பதிவுகளில் \"அவுட்புட் ஸ்ட்ரீமிற்காக பல பாக்கெட்டுகள் இடையகப்படுத்தப்பட்டுள்ளன\" என்ற பிழையை நீங்கள் இன்னும் சந்தித்தால் அதை அதிகரிக்க முயற்சிக்கவும். பரிந்துரைக்கப்பட்ட மதிப்பு 2048 ஆகும்.",
|
||||||
|
@ -1764,7 +1764,7 @@
|
||||||
"LogLevel.Critical": "முக்கியம்",
|
"LogLevel.Critical": "முக்கியம்",
|
||||||
"NotificationsMovedMessage": "அறிவிப்புகள் செயல்பாடு Webhook செருகுநிரலுக்கு நகர்த்தப்பட்டது.",
|
"NotificationsMovedMessage": "அறிவிப்புகள் செயல்பாடு Webhook செருகுநிரலுக்கு நகர்த்தப்பட்டது.",
|
||||||
"LabelEnableLUFSScanHelp": "டிராக்குகள் முழுவதும் சமமான ஒலியைப் பெற செயலிகள் ஆடியோ பிளேபேக்கை இயல்பாக்கலாம். இது லைப்ரரி ஸ்கேன்களில் தாமதத்தை ஏற்படுத்தும் மற்றும் அதிக கணினி வளங்களை உபயோக படுத்தும் என்பதை நினைவில் கொள்ளவும்.",
|
"LabelEnableLUFSScanHelp": "டிராக்குகள் முழுவதும் சமமான ஒலியைப் பெற செயலிகள் ஆடியோ பிளேபேக்கை இயல்பாக்கலாம். இது லைப்ரரி ஸ்கேன்களில் தாமதத்தை ஏற்படுத்தும் மற்றும் அதிக கணினி வளங்களை உபயோக படுத்தும் என்பதை நினைவில் கொள்ளவும்.",
|
||||||
"LabelParallelImageEncodingLimitHelp": "இணையாக இயக்க அனுமதிக்கப்படும் பட குறியாக்கங்களின் அதிகபட்ச அளவு. இதை 0 ஆக அமைப்பது உங்கள் கணினி விவரக்குறிப்புகளின் அடிப்படையில் வரம்பை தேர்வு செய்யும்.",
|
"LabelParallelImageEncodingLimitHelp": "இணையாக இயக்க அனுமதிக்கப்படும் பட குறியாக்கங்களின் அதிகபட்ச எண்ணிக்கை. இதை 0 ஆக அமைப்பது உங்கள் கணினியின் முக்கிய எண்ணிக்கையின் அடிப்படையில் வரம்பை தேர்ந்தெடுக்கும்.",
|
||||||
"MessageRenameMediaFolder": "மீடியா லைப்ரரிக்கு மறுபெயரிடுவது அனைத்து மெட்டாடேட்டாவையும் இழக்க நேரிடும், எச்சரிக்கையுடன் தொடரவும்.",
|
"MessageRenameMediaFolder": "மீடியா லைப்ரரிக்கு மறுபெயரிடுவது அனைத்து மெட்டாடேட்டாவையும் இழக்க நேரிடும், எச்சரிக்கையுடன் தொடரவும்.",
|
||||||
"SubtitleRed": "சிவப்பு",
|
"SubtitleRed": "சிவப்பு",
|
||||||
"SubtitleWhite": "வெள்ளை",
|
"SubtitleWhite": "வெள்ளை",
|
||||||
|
@ -1846,7 +1846,7 @@
|
||||||
"EncodingFormatHelp": "ஜெல்லிஃபின் மாற்றியமைக்க வேண்டிய வீடியோ குறியாக்கத்தைத் தேர்ந்தெடுக்கவும். தேர்ந்தெடுக்கப்பட்ட வடிவமைப்பிற்கான வன்பொருள் முடுக்கம் கிடைக்காதபோது ஜெல்லிஃபின் மென்பொருள் குறியாக்கத்தைப் பயன்படுத்தும். H264 குறியாக்கம் எப்போதும் இயக்கப்படும்.",
|
"EncodingFormatHelp": "ஜெல்லிஃபின் மாற்றியமைக்க வேண்டிய வீடியோ குறியாக்கத்தைத் தேர்ந்தெடுக்கவும். தேர்ந்தெடுக்கப்பட்ட வடிவமைப்பிற்கான வன்பொருள் முடுக்கம் கிடைக்காதபோது ஜெல்லிஃபின் மென்பொருள் குறியாக்கத்தைப் பயன்படுத்தும். H264 குறியாக்கம் எப்போதும் இயக்கப்படும்.",
|
||||||
"LabelTileWidthHelp": "X திசையில் ஒரு டைலுக்கு அதிகபட்ச படங்களின் எண்ணிக்கை.",
|
"LabelTileWidthHelp": "X திசையில் ஒரு டைலுக்கு அதிகபட்ச படங்களின் எண்ணிக்கை.",
|
||||||
"AllowMjpegEncoding": "MJPEG வடிவத்தில் குறியாக்கத்தை அனுமதிக்கவும் (ட்ரிக்ப்ளே உருவாக்கத்தின் போது பயன்படுத்தப்பட்டது)",
|
"AllowMjpegEncoding": "MJPEG வடிவத்தில் குறியாக்கத்தை அனுமதிக்கவும் (ட்ரிக்ப்ளே உருவாக்கத்தின் போது பயன்படுத்தப்பட்டது)",
|
||||||
"LabelTrickplayAccel": "வன்பொருள் முடுக்கத்தை இயக்கு",
|
"LabelTrickplayAccel": "வன்பொருள் டிகோடிங்கை இயக்கு",
|
||||||
"LabelScanBehavior": "ஸ்கேன் நடத்தை",
|
"LabelScanBehavior": "ஸ்கேன் நடத்தை",
|
||||||
"PriorityHigh": "உயர்",
|
"PriorityHigh": "உயர்",
|
||||||
"LabelImageInterval": "பட இடைவெளி",
|
"LabelImageInterval": "பட இடைவெளி",
|
||||||
|
@ -1869,5 +1869,39 @@
|
||||||
"PriorityNormal": "இயல்பானது",
|
"PriorityNormal": "இயல்பானது",
|
||||||
"PriorityIdle": "செயலற்ற",
|
"PriorityIdle": "செயலற்ற",
|
||||||
"LabelProcessPriority": "செயல்முறை முன்னுரிமை",
|
"LabelProcessPriority": "செயல்முறை முன்னுரிமை",
|
||||||
"LabelQscale": "Qscale"
|
"LabelQscale": "Qscale",
|
||||||
|
"EnableTrueHdHelp": "உங்கள் சாதனம் TrueHD ஐ ஆதரித்தால் அல்லது இணக்கமான ஆடியோ ரிசீவருடன் இணைக்கப்பட்டிருந்தால் மட்டுமே இயக்கவும், இல்லையெனில் அது பிளேபேக் தோல்வியை ஏற்படுத்தலாம்.",
|
||||||
|
"LibraryScanFanoutConcurrencyHelp": "லைப்ரரி ஸ்கேன்களின் போது இணையான பணிகளின் அதிகபட்ச எண்ணிக்கை. இதை 0 ஆக அமைப்பது உங்கள் கணினியின் முக்கிய எண்ணிக்கையின் அடிப்படையில் வரம்பை தேர்ந்தெடுக்கும். எச்சரிக்கை: இந்த எண்ணை மிக அதிகமாக அமைப்பதால் பிணைய கோப்பு முறைமைகளில் சிக்கல்கள் ஏற்படலாம்; நீங்கள் சிக்கல்களை எதிர்கொண்டால், இந்த எண்ணைக் குறைக்கவும்.",
|
||||||
|
"PlaylistError.CreateFailed": "பிளேலிஸ்ட்டை உருவாக்குவதில் பிழை",
|
||||||
|
"PlaylistError.AddFailed": "பிளேலிஸ்ட்டில் சேர்ப்பதில் பிழை",
|
||||||
|
"SaveLyricsIntoMediaFolders": "மீடியா கோப்புறைகளில் பாடல் வரிகளைச் சேமிக்கவும்",
|
||||||
|
"LibraryScanFanoutConcurrency": "இணை நூலக ஸ்கேன் பணிகள் வரம்பு",
|
||||||
|
"ViewLyrics": "பாடல் வரிகளைப் பார்க்கவும்",
|
||||||
|
"SavePassword": "கடவுச்சொல்லை சேமிக்கவும்",
|
||||||
|
"Author": "நூலாசிரியர்",
|
||||||
|
"Colorist": "வண்ணமயமானவர்",
|
||||||
|
"CoverArtist": "அட்டைப்படக் கலைஞர்",
|
||||||
|
"Creator": "படைப்பாளி",
|
||||||
|
"DeleteLyrics": "பாடல் வரிகளை நீக்கவும்",
|
||||||
|
"Editor": "ஆசிரியர்",
|
||||||
|
"EnableTrueHd": "TrueHD ஐ இயக்கவும்",
|
||||||
|
"Illustrator": "சித்திரக்காரர்",
|
||||||
|
"Inker": "இன்கர்",
|
||||||
|
"Letterer": "கடிதம் எழுதுபவர்",
|
||||||
|
"Penciller": "பென்சிலர்",
|
||||||
|
"SaveLyricsIntoMediaFoldersHelp": "ஆடியோ கோப்புகளுக்கு அடுத்ததாக பாடல் வரிகளை சேமிப்பது அவற்றை எளிதாக நிர்வகிக்க அனுமதிக்கும்.",
|
||||||
|
"Translator": "மொழிபெயர்ப்பாளர்",
|
||||||
|
"EnableDts": "DTS (DCA) ஐ இயக்கு",
|
||||||
|
"EnableDtsHelp": "உங்கள் சாதனம் DTSஐ ஆதரித்தால் அல்லது இணக்கமான ஆடியோ ரிசீவருடன் இணைக்கப்பட்டிருந்தால் மட்டுமே இயக்கவும், இல்லையெனில் அது பிளேபேக் தோல்வியை ஏற்படுத்தக்கூடும்.",
|
||||||
|
"HeaderDeleteLyrics": "பாடல் வரிகளை நீக்கு",
|
||||||
|
"HeaderVideoAdvanced": "வீடியோ மேம்பட்டது",
|
||||||
|
"Lyrics": "பாடல் வரிகள்",
|
||||||
|
"ConfirmDeleteLyrics": "இந்தப் பாடல் வரிகளை நீக்குவது கோப்பு முறைமை மற்றும் உங்கள் மீடியா லைப்ரரி இரண்டிலிருந்தும் நீக்கப்படும். நீங்கள் நிச்சயமாக தொடர விரும்புகிறீர்களா?",
|
||||||
|
"LabelTrickplayAccelEncodingHelp": "தற்போது QSV மற்றும் VAAPI இல் மட்டுமே கிடைக்கிறது, இந்த விருப்பம் மற்ற வன்பொருள் முடுக்க முறைகளில் எந்த விளைவையும் ஏற்படுத்தாது.",
|
||||||
|
"LabelTrickplayAccelEncoding": "வன்பொருள் துரிதப்படுத்தப்பட்ட MJPEG குறியாக்கத்தை இயக்கவும்",
|
||||||
|
"PlaylistPublic": "பொது அணுகலை அனுமதிக்கவும்",
|
||||||
|
"PlaylistPublicDescription": "உள்நுழைந்துள்ள எவரும் இந்த பிளேலிஸ்ட்டைப் பார்க்க அனுமதிக்கவும்.",
|
||||||
|
"ErrorDeletingLyrics": "சேவையகத்திலிருந்து பாடல் வரிகளை நீக்குவதில் பிழை. ஜெல்லிஃபின் மீடியா கோப்புறையில் எழுதுவதற்கான அணுகலைப் பெற்றுள்ளதா என்பதைச் சரிபார்த்து, மீண்டும் முயற்சிக்கவும்.",
|
||||||
|
"HeaderNoLyrics": "பாடல் வரிகள் எதுவும் கிடைக்கவில்லை",
|
||||||
|
"HeaderLyricDownloads": "பாடல் வரிகள் பதிவிறக்கம்"
|
||||||
}
|
}
|
||||||
|
|
|
@ -580,7 +580,7 @@
|
||||||
"ClientSettings": "İstemci Ayarları",
|
"ClientSettings": "İstemci Ayarları",
|
||||||
"BoxSet": "Seri Filmler",
|
"BoxSet": "Seri Filmler",
|
||||||
"AskAdminToCreateLibrary": "Bir yöneticiden kütüphane oluşturmasını isteyin.",
|
"AskAdminToCreateLibrary": "Bir yöneticiden kütüphane oluşturmasını isteyin.",
|
||||||
"AllowFfmpegThrottlingHelp": "Video kod dönüştürme işlemleri yeterince ilerlediyse kaynak tüketimini azaltmak için durdur. İleri/geri sarma işlemlerinin az yapıldığı durumlarda çok kullanışlıdır. Oynatım sorunları ile karşılaşırsanız bu özelliği kapatın.",
|
"AllowFfmpegThrottlingHelp": "Video kod dönüştürme işlemleri yeterince ilerlediyse daha az kaynak tüketmesi için işlem duraklatılır. İleri/geri sarma işlemlerinin az yapıldığı durumlarda çok kullanışlıdır. Oynatım sorunları ile karşılaşırsanız bu özelliği kapatın.",
|
||||||
"AlbumArtist": "Albüm Sanatçısı",
|
"AlbumArtist": "Albüm Sanatçısı",
|
||||||
"HeaderTuners": "Alıcılar",
|
"HeaderTuners": "Alıcılar",
|
||||||
"HeaderTranscodingProfileHelp": "Kod dönüştürme gerektiğinde hangi biçimin kullanılacağını belirlemek için kod dönüştürme profilleri ekle.",
|
"HeaderTranscodingProfileHelp": "Kod dönüştürme gerektiğinde hangi biçimin kullanılacağını belirlemek için kod dönüştürme profilleri ekle.",
|
||||||
|
@ -695,7 +695,7 @@
|
||||||
"LabelAudioBitrate": "Ses bit hızı",
|
"LabelAudioBitrate": "Ses bit hızı",
|
||||||
"LabelAudioBitDepth": "Ses bit derinliği",
|
"LabelAudioBitDepth": "Ses bit derinliği",
|
||||||
"LabelArtistsHelp": "Birden çok sanatçıyı noktalı virgülle ayırın.",
|
"LabelArtistsHelp": "Birden çok sanatçıyı noktalı virgülle ayırın.",
|
||||||
"LabelAppNameExample": "Örnek: Sickbeard, Sonarr",
|
"LabelAppNameExample": "API anahtarlarını tanımlamak için kullanılan bir ad. Bu ayar işlevselliği etkilemeyecektir.",
|
||||||
"LabelAllowedRemoteAddressesMode": "Uzak IP adresi filtre modu",
|
"LabelAllowedRemoteAddressesMode": "Uzak IP adresi filtre modu",
|
||||||
"LabelAllowedRemoteAddresses": "Uzak IP adresi filtresi",
|
"LabelAllowedRemoteAddresses": "Uzak IP adresi filtresi",
|
||||||
"LabelAlbumArtists": "Albüm sanatçıları",
|
"LabelAlbumArtists": "Albüm sanatçıları",
|
||||||
|
@ -890,7 +890,7 @@
|
||||||
"HeaderNetworking": "IP Protokolleri",
|
"HeaderNetworking": "IP Protokolleri",
|
||||||
"HeaderDebugging": "Hata ayıklama ve izleme",
|
"HeaderDebugging": "Hata ayıklama ve izleme",
|
||||||
"EnableTonemapping": "Ton eşlemeyi etkinleştir",
|
"EnableTonemapping": "Ton eşlemeyi etkinleştir",
|
||||||
"Bwdif": "BWDIF",
|
"Bwdif": "Bob Weaver DeInterlacing Filter (BWDIF)",
|
||||||
"Sort": "Sırala",
|
"Sort": "Sırala",
|
||||||
"Shuffle": "Karıştır",
|
"Shuffle": "Karıştır",
|
||||||
"Suggestions": "Öneriler",
|
"Suggestions": "Öneriler",
|
||||||
|
@ -1630,7 +1630,7 @@
|
||||||
"EnableFallbackFontHelp": "Özel alternatif yazı tiplerini etkinleştirin. Bu, yanlış altyazı oluşturma sorununu önleyebilir.",
|
"EnableFallbackFontHelp": "Özel alternatif yazı tiplerini etkinleştirin. Bu, yanlış altyazı oluşturma sorununu önleyebilir.",
|
||||||
"EnableFallbackFont": "Yedek yazı tiplerini etkinleştir",
|
"EnableFallbackFont": "Yedek yazı tiplerini etkinleştir",
|
||||||
"HeaderSelectFallbackFontPath": "Yedek Yazı Tipi Klasörü Yolunu Seçin",
|
"HeaderSelectFallbackFontPath": "Yedek Yazı Tipi Klasörü Yolunu Seçin",
|
||||||
"Yadif": "YADIF",
|
"Yadif": "Yet Another DeInterlacing Filter (YADIF)",
|
||||||
"XmlTvSportsCategoriesHelp": "Bu kategorilere sahip programlar spor programları olarak gösterilecektir. Birden çok girdiyi '|' ile ayırın.",
|
"XmlTvSportsCategoriesHelp": "Bu kategorilere sahip programlar spor programları olarak gösterilecektir. Birden çok girdiyi '|' ile ayırın.",
|
||||||
"XmlTvPathHelp": "Bir XMLTV dosya yolu. Jellyfin bu dosyayı okuyacak ve güncellemeler için düzenli olarak kontrol edecektir. Dosyayı oluşturmak ve güncellemek sizin sorumluluğunuzdadır.",
|
"XmlTvPathHelp": "Bir XMLTV dosya yolu. Jellyfin bu dosyayı okuyacak ve güncellemeler için düzenli olarak kontrol edecektir. Dosyayı oluşturmak ve güncellemek sizin sorumluluğunuzdadır.",
|
||||||
"XmlTvNewsCategoriesHelp": "Bu kategorilere sahip programlar haber programları olarak gösterilecektir. Birden çok girdiyi '|' ile ayırın.",
|
"XmlTvNewsCategoriesHelp": "Bu kategorilere sahip programlar haber programları olarak gösterilecektir. Birden çok girdiyi '|' ile ayırın.",
|
||||||
|
@ -1730,7 +1730,7 @@
|
||||||
"LabelDummyChapterDuration": "Aralık",
|
"LabelDummyChapterDuration": "Aralık",
|
||||||
"LabelChapterImageResolutionHelp": "Çıkarılan bölüm resimleri çözünürlüğü. Bunu değiştirmenin mevcut sahte bölümler üzerinde hiçbir etkisi olmayacaktır.",
|
"LabelChapterImageResolutionHelp": "Çıkarılan bölüm resimleri çözünürlüğü. Bunu değiştirmenin mevcut sahte bölümler üzerinde hiçbir etkisi olmayacaktır.",
|
||||||
"LabelParallelImageEncodingLimit": "Paralel resim kodlama sınırı",
|
"LabelParallelImageEncodingLimit": "Paralel resim kodlama sınırı",
|
||||||
"LabelParallelImageEncodingLimitHelp": "Paralel olarak çalışmasına izin verilen maksimum resim kodlaması miktarı. Bunu 0 olarak ayarlamak, sistem özelliklerinize göre bir sınır seçecektir.",
|
"LabelParallelImageEncodingLimitHelp": "Paralel olarak çalışmasına izin verilen maksimum resim kodlaması sayısı. Bunu 0 olarak ayarlamak, sisteminizin çekirdek sayısına göre bir sınır seçecektir.",
|
||||||
"AllowSegmentDeletionHelp": "İstemcinin indirdiği eski segmentleri silin. Bu işlem tamamen dönüştürülmüş dosyaların diskte yer kaplamasına engel olur. Eğer oynatımda problem yaşıyorsanız lütfen bu seçeneği devre dışı bırakın.",
|
"AllowSegmentDeletionHelp": "İstemcinin indirdiği eski segmentleri silin. Bu işlem tamamen dönüştürülmüş dosyaların diskte yer kaplamasına engel olur. Eğer oynatımda problem yaşıyorsanız lütfen bu seçeneği devre dışı bırakın.",
|
||||||
"LabelDeveloper": "Geliştirici",
|
"LabelDeveloper": "Geliştirici",
|
||||||
"HeaderEpisodesStatus": "Bölüm Durumu",
|
"HeaderEpisodesStatus": "Bölüm Durumu",
|
||||||
|
@ -1852,5 +1852,33 @@
|
||||||
"EnableLibrary": "Kütüphaneyi etkinleştir",
|
"EnableLibrary": "Kütüphaneyi etkinleştir",
|
||||||
"EnableLibraryHelp": "Kütüphanenin devre dışı bırakılması kütüphaneyi tüm kullanıcı görünümlerinden gizleyecektir.",
|
"EnableLibraryHelp": "Kütüphanenin devre dışı bırakılması kütüphaneyi tüm kullanıcı görünümlerinden gizleyecektir.",
|
||||||
"LabelTrickplayAccelEncoding": "Donanım hızlandırmalı MJPEG kodlamayı etkinleştir",
|
"LabelTrickplayAccelEncoding": "Donanım hızlandırmalı MJPEG kodlamayı etkinleştir",
|
||||||
"LabelTrickplayAccelEncodingHelp": "Şu anda yalnızca QSV ve VAAPI'de kullanılabilir. Bu seçeneğin diğer donanım hızlandırma yöntemleri üzerinde bir etkisi yoktur."
|
"LabelTrickplayAccelEncodingHelp": "Şu anda yalnızca QSV ve VAAPI'de kullanılabilir. Bu seçeneğin diğer donanım hızlandırma yöntemleri üzerinde bir etkisi yoktur.",
|
||||||
|
"HeaderDeleteLyrics": "Şarkı Sözlerini Sil",
|
||||||
|
"ViewLyrics": "Şarkı sözünü göster",
|
||||||
|
"ConfirmDeleteLyrics": "Bu şarkı sözlerini silmek, onları hem dosya sisteminden hem de medya kütüphanenizden silecektir. Devam etmek istediğinizden emin misiniz?",
|
||||||
|
"ErrorDeletingLyrics": "Şarkı sözlerini sunucudan silerken bir hata oluştu. Lütfen Jellyfin'in medya klasörüne yazma erişimi olup olmadığını kontrol edin ve tekrar deneyin.",
|
||||||
|
"DeleteLyrics": "Şarkı sözünü sil",
|
||||||
|
"HeaderNoLyrics": "Şarkı sözü bulunamadı",
|
||||||
|
"Lyrics": "Şarkı sözü",
|
||||||
|
"SavePassword": "Parolayı Kaydet",
|
||||||
|
"PlaylistError.CreateFailed": "Çalma listesi oluşturulamadı",
|
||||||
|
"LibraryScanFanoutConcurrency": "Paralel kütüphane tarama görevleri sınırı",
|
||||||
|
"LibraryScanFanoutConcurrencyHelp": "Kütüphane taramaları sırasında maksimum paralel görev sayısı. Bunu 0 olarak ayarlamak, sisteminizin çekirdek sayısına göre bir sınır seçecektir. UYARI: Bu sayının çok yüksek ayarlanması ağ dosya sistemlerinde sorunlara neden olabilir; sorunla karşılaşırsanız bu sayıyı düşürün.",
|
||||||
|
"PlaylistError.AddFailed": "Çalma listesine eklenemedi",
|
||||||
|
"SaveLyricsIntoMediaFoldersHelp": "Şarkı sözlerini ses dosyalarının yanında saklamak, bunların daha kolay yönetilmesini sağlayacaktır.",
|
||||||
|
"SaveLyricsIntoMediaFolders": "Şarkı sözlerini medya klasörlerine kaydet",
|
||||||
|
"Author": "Yazar",
|
||||||
|
"Colorist": "Renklendiren",
|
||||||
|
"CoverArtist": "Kapak sanatçısı",
|
||||||
|
"Creator": "Yaratıcı",
|
||||||
|
"Editor": "Editör",
|
||||||
|
"Illustrator": "İllüstratör",
|
||||||
|
"Translator": "Çeviri",
|
||||||
|
"EnableDts": "DTS'yi (DCA) etkinleştir",
|
||||||
|
"EnableTrueHd": "TrueHD'yi etkinleştir",
|
||||||
|
"EnableTrueHdHelp": "Yalnızca cihazınız TrueHD'yi destekliyorsa veya uyumlu bir ses alıcısına bağlıysa etkinleştirin; aksi takdirde oynatma hatasına neden olabilir.",
|
||||||
|
"EnableDtsHelp": "Yalnızca cihazınız DTS'yi destekliyorsa veya uyumlu bir ses alıcısına bağlıysa etkinleştirin; aksi takdirde oynatma hatasına neden olabilir.",
|
||||||
|
"PlaylistPublic": "Genel erişime izin ver",
|
||||||
|
"PlaylistPublicDescription": "Bu oynatma listesinin oturum açmış herhangi bir kullanıcı tarafından görüntülenmesine izin verin.",
|
||||||
|
"HeaderLyricDownloads": "Şarkı Sözü İndirme"
|
||||||
}
|
}
|
||||||
|
|
|
@ -284,7 +284,7 @@
|
||||||
"DashboardArchitecture": "Архітектура: {0}",
|
"DashboardArchitecture": "Архітектура: {0}",
|
||||||
"DailyAt": "Щодня о {0}",
|
"DailyAt": "Щодня о {0}",
|
||||||
"ClearQueue": "Очистити чергу",
|
"ClearQueue": "Очистити чергу",
|
||||||
"Bwdif": "Фільтр BWDIF",
|
"Bwdif": "Фільтр деінтерлейсингу Боба Уівера (BWDIF)",
|
||||||
"ButtonUseQuickConnect": "Використати Quick Connect",
|
"ButtonUseQuickConnect": "Використати Quick Connect",
|
||||||
"ButtonPlayer": "Програвач",
|
"ButtonPlayer": "Програвач",
|
||||||
"ButtonCast": "Трансляція на пристрій",
|
"ButtonCast": "Трансляція на пристрій",
|
||||||
|
@ -558,7 +558,7 @@
|
||||||
"LabelAudioSampleRate": "Розрядність аудіо",
|
"LabelAudioSampleRate": "Розрядність аудіо",
|
||||||
"LabelAudioBitDepth": "Розрядність аудіо",
|
"LabelAudioBitDepth": "Розрядність аудіо",
|
||||||
"LabelArtistsHelp": "Розділіть декількох виконавців крапкою з комою.",
|
"LabelArtistsHelp": "Розділіть декількох виконавців крапкою з комою.",
|
||||||
"LabelAppNameExample": "Приклад: Боляча борода, Sonarr",
|
"LabelAppNameExample": "Людська назва для ідентифікації API-ключів. Цей параметр не впливає на функціональність.",
|
||||||
"LabelAlbumArtPN": "Обкладинка альбому PN",
|
"LabelAlbumArtPN": "Обкладинка альбому PN",
|
||||||
"LabelAlbumArtists": "Виконавці альбому",
|
"LabelAlbumArtists": "Виконавці альбому",
|
||||||
"LabelAlbumArtHelp": "PN використовується для обкладинки альбому в атрибуті 'dlna:profileID' в 'upnp:albumArtURI'. Деякі пристрої вимагають певного значення, незалежно від розміру зображення.",
|
"LabelAlbumArtHelp": "PN використовується для обкладинки альбому в атрибуті 'dlna:profileID' в 'upnp:albumArtURI'. Деякі пристрої вимагають певного значення, незалежно від розміру зображення.",
|
||||||
|
@ -1553,7 +1553,7 @@
|
||||||
"HeaderSelectFallbackFontPath": "Оберіть шлях до теки резервного шрифту",
|
"HeaderSelectFallbackFontPath": "Оберіть шлях до теки резервного шрифту",
|
||||||
"Yesterday": "Вчора",
|
"Yesterday": "Вчора",
|
||||||
"Yes": "Так",
|
"Yes": "Так",
|
||||||
"Yadif": "YADIF",
|
"Yadif": "Ще один фільтр деінтерлейсингу (YADIF)",
|
||||||
"XmlTvSportsCategoriesHelp": "Програми з цими категоріями відображатимуться як спортивні програми. Розділіть множинні символом «|».",
|
"XmlTvSportsCategoriesHelp": "Програми з цими категоріями відображатимуться як спортивні програми. Розділіть множинні символом «|».",
|
||||||
"XmlTvNewsCategoriesHelp": "Програми з цими категоріями відображатимуться як програми новин. Розділіть множинні символом «|».",
|
"XmlTvNewsCategoriesHelp": "Програми з цими категоріями відображатимуться як програми новин. Розділіть множинні символом «|».",
|
||||||
"XmlTvMovieCategoriesHelp": "Програми з цими категоріями відображатимуться як фільми. Розділіть множинні символом «|».",
|
"XmlTvMovieCategoriesHelp": "Програми з цими категоріями відображатимуться як фільми. Розділіть множинні символом «|».",
|
||||||
|
@ -1716,7 +1716,7 @@
|
||||||
"Featurette": "Художник",
|
"Featurette": "Художник",
|
||||||
"HeaderPerformance": "Продуктивність",
|
"HeaderPerformance": "Продуктивність",
|
||||||
"LabelParallelImageEncodingLimit": "Обмеження на паралельне кодування зображень",
|
"LabelParallelImageEncodingLimit": "Обмеження на паралельне кодування зображень",
|
||||||
"LabelParallelImageEncodingLimitHelp": "Максимальна кількість кодувань зображень, які дозволено запускати паралельно. Якщо встановити значення 0, буде обрано обмеження на основі характеристик вашої системи.",
|
"LabelParallelImageEncodingLimitHelp": "Максимальна кількість кодувань зображень, які дозволено запускати паралельно. Якщо встановити значення 0, буде обрано обмеження на основі кількості ядер у вашій системі.",
|
||||||
"LabelEnableAudioVbrHelp": "Змінний бітрейт забезпечує краще співвідношення якості до середнього бітрейту, але в деяких рідкісних випадках може спричинити проблеми з буферизацією та сумісністю.",
|
"LabelEnableAudioVbrHelp": "Змінний бітрейт забезпечує краще співвідношення якості до середнього бітрейту, але в деяких рідкісних випадках може спричинити проблеми з буферизацією та сумісністю.",
|
||||||
"LabelEnableAudioVbr": "Увімкнути VBR",
|
"LabelEnableAudioVbr": "Увімкнути VBR",
|
||||||
"Select": "Обрати",
|
"Select": "Обрати",
|
||||||
|
@ -1864,5 +1864,27 @@
|
||||||
"HeaderDeleteLyrics": "Видалити текст пісні",
|
"HeaderDeleteLyrics": "Видалити текст пісні",
|
||||||
"HeaderNoLyrics": "Текст пісні не знайдено",
|
"HeaderNoLyrics": "Текст пісні не знайдено",
|
||||||
"Lyrics": "Текст пісні",
|
"Lyrics": "Текст пісні",
|
||||||
"ViewLyrics": "Переглянути текст пісні"
|
"ViewLyrics": "Переглянути текст пісні",
|
||||||
|
"SavePassword": "Зберегти пароль",
|
||||||
|
"PlaylistError.AddFailed": "Помилка додавання до списку відтворення",
|
||||||
|
"PlaylistError.CreateFailed": "Помилка створення списку відтворення",
|
||||||
|
"SaveLyricsIntoMediaFoldersHelp": "Зберігання текстів пісень поруч з аудіофайлами дозволить легше ними керувати.",
|
||||||
|
"Author": "Автор",
|
||||||
|
"Colorist": "Колорист",
|
||||||
|
"CoverArtist": "Художник обкладинки",
|
||||||
|
"Creator": "Творець",
|
||||||
|
"Editor": "Редактор",
|
||||||
|
"Illustrator": "Ілюстратор",
|
||||||
|
"Letterer": "Письменник",
|
||||||
|
"Translator": "Перекладач",
|
||||||
|
"EnableDts": "Увімкнути DTS (DCA)",
|
||||||
|
"EnableDtsHelp": "Увімкніть, якщо ваш пристрій підтримує DTS або підключений до сумісного аудіо ресивера, інакше це може призвести до збоїв у відтворенні.",
|
||||||
|
"EnableTrueHd": "Увімкнути TrueHD",
|
||||||
|
"EnableTrueHdHelp": "Увімкніть, якщо ваш пристрій підтримує TrueHD або підключений до сумісного аудіо приймача, інакше це може призвести до збоїв у відтворенні.",
|
||||||
|
"PlaylistPublic": "Дозволити публічний доступ",
|
||||||
|
"PlaylistPublicDescription": "Дозвольте переглядати цей список відтворення будь-якому зареєстрованому користувачеві.",
|
||||||
|
"HeaderLyricDownloads": "Завантаження текстів пісень",
|
||||||
|
"SaveLyricsIntoMediaFolders": "Зберігати тексти пісень в теках з медіафайлами",
|
||||||
|
"LibraryScanFanoutConcurrencyHelp": "Максимальна кількість паралельних завдань під час сканування медіатеки. Якщо встановити значення 0, буде обрано обмеження на основі кількості ядер у вашій системі. ПОПЕРЕДЖЕННЯ: Занадто високе значення цього параметра може спричинити проблеми з мережевими файловими системами; якщо ви зіткнулися з такими проблемами, зменшіть це значення.",
|
||||||
|
"LibraryScanFanoutConcurrency": "Обмеження на паралельне сканування медіатек"
|
||||||
}
|
}
|
||||||
|
|
|
@ -398,7 +398,7 @@
|
||||||
"LabelAllowedRemoteAddresses": "远程IP地址过滤器",
|
"LabelAllowedRemoteAddresses": "远程IP地址过滤器",
|
||||||
"LabelAllowedRemoteAddressesMode": "远程IP地址过滤器模式",
|
"LabelAllowedRemoteAddressesMode": "远程IP地址过滤器模式",
|
||||||
"LabelAppName": "APP名称",
|
"LabelAppName": "APP名称",
|
||||||
"LabelAppNameExample": "例如:Sickbeard, Sonarr",
|
"LabelAppNameExample": "用于识别 API 密钥的可读名称。此设置不影响功能。",
|
||||||
"LabelArtists": "艺术家",
|
"LabelArtists": "艺术家",
|
||||||
"LabelArtistsHelp": "将多个艺术家用分号分隔。",
|
"LabelArtistsHelp": "将多个艺术家用分号分隔。",
|
||||||
"LabelAudioLanguagePreference": "首选音频语言",
|
"LabelAudioLanguagePreference": "首选音频语言",
|
||||||
|
@ -457,7 +457,7 @@
|
||||||
"LabelDownloadLanguages": "下载语言",
|
"LabelDownloadLanguages": "下载语言",
|
||||||
"LabelDropImageHere": "拖拽或点击选择图像于此处。",
|
"LabelDropImageHere": "拖拽或点击选择图像于此处。",
|
||||||
"LabelDroppedFrames": "丢弃的帧",
|
"LabelDroppedFrames": "丢弃的帧",
|
||||||
"LabelDropShadow": "阴影",
|
"LabelDropShadow": "字体描边",
|
||||||
"LabelDynamicExternalId": "{0} Id",
|
"LabelDynamicExternalId": "{0} Id",
|
||||||
"LabelEasyPinCode": "简单 PIN 码",
|
"LabelEasyPinCode": "简单 PIN 码",
|
||||||
"LabelEmbedAlbumArtDidl": "在DIDL中嵌入专辑封面",
|
"LabelEmbedAlbumArtDidl": "在DIDL中嵌入专辑封面",
|
||||||
|
@ -523,7 +523,7 @@
|
||||||
"LabelKodiMetadataSaveImagePaths": "保存图像路径在NFO文件",
|
"LabelKodiMetadataSaveImagePaths": "保存图像路径在NFO文件",
|
||||||
"LabelKodiMetadataSaveImagePathsHelp": "如果你的图像文件名不符合Kodi的规范,推荐使用。",
|
"LabelKodiMetadataSaveImagePathsHelp": "如果你的图像文件名不符合Kodi的规范,推荐使用。",
|
||||||
"LabelKodiMetadataUser": "为以下用户保存观看历史数据到 NFO 文件中",
|
"LabelKodiMetadataUser": "为以下用户保存观看历史数据到 NFO 文件中",
|
||||||
"LabelKodiMetadataUserHelp": "保存观看历史数据至 NFO 文件中以供其他应用程序利用。",
|
"LabelKodiMetadataUserHelp": "保存观看历史数据至 NFO 文件中以供其他应用程序使用。",
|
||||||
"LabelLanNetworks": "局域网",
|
"LabelLanNetworks": "局域网",
|
||||||
"LabelLanguage": "语言",
|
"LabelLanguage": "语言",
|
||||||
"LabelLineup": "排队",
|
"LabelLineup": "排队",
|
||||||
|
@ -705,7 +705,7 @@
|
||||||
"LabelffmpegPathHelp": "FFmpeg 应用文件或包含 FFmpeg 的文件夹的路径。",
|
"LabelffmpegPathHelp": "FFmpeg 应用文件或包含 FFmpeg 的文件夹的路径。",
|
||||||
"LanNetworksHelp": "在强制带宽限制时,认作本地网络上的 IP 地址或 IP/网络掩码条目的逗号分隔列表。如果设置此项,所有其它 IP 地址将被视为在外部网络上,并且将受到外部带宽限制。如果保留为空,则只将服务器的子网视为本地网络。",
|
"LanNetworksHelp": "在强制带宽限制时,认作本地网络上的 IP 地址或 IP/网络掩码条目的逗号分隔列表。如果设置此项,所有其它 IP 地址将被视为在外部网络上,并且将受到外部带宽限制。如果保留为空,则只将服务器的子网视为本地网络。",
|
||||||
"Large": "大",
|
"Large": "大",
|
||||||
"LatestFromLibrary": "最近添加于 {0}",
|
"LatestFromLibrary": "最近添加的 {0}",
|
||||||
"LearnHowYouCanContribute": "了解如何贡献。",
|
"LearnHowYouCanContribute": "了解如何贡献。",
|
||||||
"LibraryAccessHelp": "选择共享给此用户的媒体库。管理员有权使用媒体资料管理器来编辑所有文件夹。",
|
"LibraryAccessHelp": "选择共享给此用户的媒体库。管理员有权使用媒体资料管理器来编辑所有文件夹。",
|
||||||
"List": "列表",
|
"List": "列表",
|
||||||
|
@ -924,7 +924,7 @@
|
||||||
"PasswordResetComplete": "密码已重置。",
|
"PasswordResetComplete": "密码已重置。",
|
||||||
"PasswordResetConfirmation": "你确定要重置密码?",
|
"PasswordResetConfirmation": "你确定要重置密码?",
|
||||||
"PasswordSaved": "密码已保存。",
|
"PasswordSaved": "密码已保存。",
|
||||||
"People": "人物",
|
"People": "演职人员",
|
||||||
"PerfectMatch": "最佳匹配",
|
"PerfectMatch": "最佳匹配",
|
||||||
"Photos": "照片",
|
"Photos": "照片",
|
||||||
"PictureInPicture": "画中画",
|
"PictureInPicture": "画中画",
|
||||||
|
@ -1019,7 +1019,7 @@
|
||||||
"SortName": "排序名称",
|
"SortName": "排序名称",
|
||||||
"Sports": "体育",
|
"Sports": "体育",
|
||||||
"StopRecording": "停止录制",
|
"StopRecording": "停止录制",
|
||||||
"Studios": "工作室",
|
"Studios": "制片发行商",
|
||||||
"SubtitleAppearanceSettingsAlsoPassedToCastDevices": "这些设置也会被应用于任何通过此设备发起的 Google Cast 播放。",
|
"SubtitleAppearanceSettingsAlsoPassedToCastDevices": "这些设置也会被应用于任何通过此设备发起的 Google Cast 播放。",
|
||||||
"SubtitleAppearanceSettingsDisclaimer": "以下设置不适用于上述图形字幕或嵌入其自身样式的 ASS/SSA 字幕。",
|
"SubtitleAppearanceSettingsDisclaimer": "以下设置不适用于上述图形字幕或嵌入其自身样式的 ASS/SSA 字幕。",
|
||||||
"SubtitleDownloadersHelp": "按优先顺序启用并排列您的首选字幕下载程序。",
|
"SubtitleDownloadersHelp": "按优先顺序启用并排列您的首选字幕下载程序。",
|
||||||
|
@ -1270,7 +1270,7 @@
|
||||||
"EveryXMinutes": "每 {0} 分钟",
|
"EveryXMinutes": "每 {0} 分钟",
|
||||||
"WriteAccessRequired": "Jellyfin需要此文件夹的写入权限。请确认是否拥有写入权限并重试。",
|
"WriteAccessRequired": "Jellyfin需要此文件夹的写入权限。请确认是否拥有写入权限并重试。",
|
||||||
"PathNotFound": "无法找到此路径。请确认路径有效并重试。",
|
"PathNotFound": "无法找到此路径。请确认路径有效并重试。",
|
||||||
"Yadif": "YADIF",
|
"Yadif": "另一种去隔行滤镜(YADIF)",
|
||||||
"LabelDeinterlaceMethod": "反交错方法",
|
"LabelDeinterlaceMethod": "反交错方法",
|
||||||
"DeinterlaceMethodHelp": "选择对隔行扫描内容进行软转码时所用的反交错方法。当启用支持硬件反交错的硬件加速后,将使用硬件解码器代替此设置。",
|
"DeinterlaceMethodHelp": "选择对隔行扫描内容进行软转码时所用的反交错方法。当启用支持硬件反交错的硬件加速后,将使用硬件解码器代替此设置。",
|
||||||
"LabelLibraryPageSize": "媒体库分页阈值",
|
"LabelLibraryPageSize": "媒体库分页阈值",
|
||||||
|
@ -1408,7 +1408,7 @@
|
||||||
"Data": "数据",
|
"Data": "数据",
|
||||||
"UseDoubleRateDeinterlacing": "反交错时使帧率翻倍",
|
"UseDoubleRateDeinterlacing": "反交错时使帧率翻倍",
|
||||||
"UseDoubleRateDeinterlacingHelp": "此设置使用去隔行时的场频,通常称为 Bob 去隔行,它将视频的帧频加倍,以提供完整的运动效果,就像在电视上观看隔行视频时看到的那样。",
|
"UseDoubleRateDeinterlacingHelp": "此设置使用去隔行时的场频,通常称为 Bob 去隔行,它将视频的帧频加倍,以提供完整的运动效果,就像在电视上观看隔行视频时看到的那样。",
|
||||||
"Bwdif": "BWDIF",
|
"Bwdif": "Bob Weaver 去隔行滤镜(BWDIF)",
|
||||||
"QuickConnectNotActive": "快速连接在此服务器上未启用",
|
"QuickConnectNotActive": "快速连接在此服务器上未启用",
|
||||||
"QuickConnectNotAvailable": "联系您的服务器管理员以启用快速连接",
|
"QuickConnectNotAvailable": "联系您的服务器管理员以启用快速连接",
|
||||||
"QuickConnectInvalidCode": "无效的快速连接验证码",
|
"QuickConnectInvalidCode": "无效的快速连接验证码",
|
||||||
|
@ -1626,7 +1626,7 @@
|
||||||
"ShowParentImages": "显示节目图片",
|
"ShowParentImages": "显示节目图片",
|
||||||
"AllowEmbeddedSubtitlesAllowTextOption": "允许文本",
|
"AllowEmbeddedSubtitlesAllowTextOption": "允许文本",
|
||||||
"AllowEmbeddedSubtitlesAllowImageOption": "允许图像",
|
"AllowEmbeddedSubtitlesAllowImageOption": "允许图像",
|
||||||
"AllowEmbeddedSubtitlesAllowNoneOption": "允许无",
|
"AllowEmbeddedSubtitlesAllowNoneOption": "不允许",
|
||||||
"AllowEmbeddedSubtitlesAllowAllOption": "允许全部",
|
"AllowEmbeddedSubtitlesAllowAllOption": "允许全部",
|
||||||
"AllowEmbeddedSubtitlesHelp": "禁用媒体容器中封装的字幕。 需要对媒体库进行全面刷新。",
|
"AllowEmbeddedSubtitlesHelp": "禁用媒体容器中封装的字幕。 需要对媒体库进行全面刷新。",
|
||||||
"AllowEmbeddedSubtitles": "禁用不同类型的嵌入字幕",
|
"AllowEmbeddedSubtitles": "禁用不同类型的嵌入字幕",
|
||||||
|
@ -1642,7 +1642,7 @@
|
||||||
"ButtonBackspace": "退格",
|
"ButtonBackspace": "退格",
|
||||||
"EnableRewatchingNextUpHelp": "启用在“接下来”模块中显示已观看的剧集。",
|
"EnableRewatchingNextUpHelp": "启用在“接下来”模块中显示已观看的剧集。",
|
||||||
"Localization": "本地化",
|
"Localization": "本地化",
|
||||||
"ItemDetails": "文件详情",
|
"ItemDetails": "项目详情",
|
||||||
"EnableRewatchingNextUp": "在接下来界面中启用重新播放",
|
"EnableRewatchingNextUp": "在接下来界面中启用重新播放",
|
||||||
"Production": "制片",
|
"Production": "制片",
|
||||||
"StoryArc": "故事线",
|
"StoryArc": "故事线",
|
||||||
|
@ -1652,7 +1652,7 @@
|
||||||
"EnableEnhancedNvdecDecoderHelp": "增强的 NVDEC 实现,如果遇到解码错误,请禁用此选项以使用 CUVID。",
|
"EnableEnhancedNvdecDecoderHelp": "增强的 NVDEC 实现,如果遇到解码错误,请禁用此选项以使用 CUVID。",
|
||||||
"HomeVideosPhotos": "家庭视频和照片",
|
"HomeVideosPhotos": "家庭视频和照片",
|
||||||
"Bold": "粗体",
|
"Bold": "粗体",
|
||||||
"LabelTextWeight": "文字粗细",
|
"LabelTextWeight": "文本粗细",
|
||||||
"EnableSplashScreen": "显示启动画面",
|
"EnableSplashScreen": "显示启动画面",
|
||||||
"MediaInfoDvBlSignalCompatibilityId": "杜比视界 BL 兼容性序号",
|
"MediaInfoDvBlSignalCompatibilityId": "杜比视界 BL 兼容性序号",
|
||||||
"MediaInfoBlPresentFlag": "杜比视界 BL 存在标记",
|
"MediaInfoBlPresentFlag": "杜比视界 BL 存在标记",
|
||||||
|
@ -1717,7 +1717,7 @@
|
||||||
"SubtitleYellow": "黄色",
|
"SubtitleYellow": "黄色",
|
||||||
"Featurette": "花絮",
|
"Featurette": "花絮",
|
||||||
"Short": "短片",
|
"Short": "短片",
|
||||||
"LabelParallelImageEncodingLimitHelp": "允许并行运行的图像编码的最大数量。设为 0 以根据您的系统配置自动设置。",
|
"LabelParallelImageEncodingLimitHelp": "允许并行运行的最大图像编码数量。 将其设置为 0 将根据您的系统核心数量选择限制。",
|
||||||
"HeaderPerformance": "性能",
|
"HeaderPerformance": "性能",
|
||||||
"LabelParallelImageEncodingLimit": "并行图像编码限制",
|
"LabelParallelImageEncodingLimit": "并行图像编码限制",
|
||||||
"LabelEnableAudioVbr": "启用 VBR 音频编码",
|
"LabelEnableAudioVbr": "启用 VBR 音频编码",
|
||||||
|
@ -1728,7 +1728,7 @@
|
||||||
"MenuOpen": "打开菜单",
|
"MenuOpen": "打开菜单",
|
||||||
"MenuClose": "关闭菜单",
|
"MenuClose": "关闭菜单",
|
||||||
"UserMenu": "用户菜单",
|
"UserMenu": "用户菜单",
|
||||||
"Studio": "广播",
|
"Studio": "制片发行商",
|
||||||
"AllowCollectionManagement": "允许该用户管理收藏夹",
|
"AllowCollectionManagement": "允许该用户管理收藏夹",
|
||||||
"EnableAudioNormalizationHelp": "音频标准化将添加一个恒定的增益,以保持平均音量在所需的级别(-18dB)。",
|
"EnableAudioNormalizationHelp": "音频标准化将添加一个恒定的增益,以保持平均音量在所需的级别(-18dB)。",
|
||||||
"EnableAudioNormalization": "音频标准化",
|
"EnableAudioNormalization": "音频标准化",
|
||||||
|
@ -1773,7 +1773,7 @@
|
||||||
"ForeignPartsOnly": "仅限强制开启/外语部分",
|
"ForeignPartsOnly": "仅限强制开启/外语部分",
|
||||||
"HearingImpairedShort": "听障/聋哑人士字幕",
|
"HearingImpairedShort": "听障/聋哑人士字幕",
|
||||||
"UnknownError": "发生未知错误。",
|
"UnknownError": "发生未知错误。",
|
||||||
"GoHome": "回家",
|
"GoHome": "返回主页",
|
||||||
"BackdropScreensaver": "背景屏保",
|
"BackdropScreensaver": "背景屏保",
|
||||||
"LogoScreensaver": "徽标屏保",
|
"LogoScreensaver": "徽标屏保",
|
||||||
"LabelIsHearingImpaired": "用于听障/聋哑人士",
|
"LabelIsHearingImpaired": "用于听障/聋哑人士",
|
||||||
|
@ -1867,5 +1867,30 @@
|
||||||
"DeleteLyrics": "删除歌词",
|
"DeleteLyrics": "删除歌词",
|
||||||
"HeaderDeleteLyrics": "删除歌词",
|
"HeaderDeleteLyrics": "删除歌词",
|
||||||
"HeaderNoLyrics": "未找到歌词",
|
"HeaderNoLyrics": "未找到歌词",
|
||||||
"ViewLyrics": "查看歌词"
|
"ViewLyrics": "查看歌词",
|
||||||
|
"SavePassword": "保存密码",
|
||||||
|
"EnableDts": "启用 DTS(DCA)",
|
||||||
|
"EnableDtsHelp": "仅当您的设备支持 DTS 编码或连接到兼容的音频接收器时才启用,否则可能会导致播放失败。",
|
||||||
|
"EnableTrueHd": "启用 TrueHD",
|
||||||
|
"HeaderVideoAdvanced": "高级视频选项",
|
||||||
|
"EnableTrueHdHelp": "仅当您的设备支持 TrueHD 编码或连接到兼容的音频接收器时才启用,否则可能会导致播放失败。",
|
||||||
|
"HeaderLyricDownloads": "歌词下载",
|
||||||
|
"SaveLyricsIntoMediaFolders": "将歌词保存到媒体文件夹中",
|
||||||
|
"SaveLyricsIntoMediaFoldersHelp": "将歌词存储在音频文件旁边将使它们更容易管理。",
|
||||||
|
"PlaylistPublic": "允许公开访问",
|
||||||
|
"PlaylistPublicDescription": "允许任何登录用户查看此播放列表。",
|
||||||
|
"PlaylistError.CreateFailed": "创建播放列表时出错",
|
||||||
|
"PlaylistError.AddFailed": "添加到播放列表时出错",
|
||||||
|
"Author": "作者",
|
||||||
|
"Colorist": "着色师",
|
||||||
|
"CoverArtist": "封面艺术家",
|
||||||
|
"Creator": "创作者",
|
||||||
|
"Editor": "编辑",
|
||||||
|
"Illustrator": "插画师",
|
||||||
|
"Inker": "着墨师",
|
||||||
|
"Letterer": "文字书写员",
|
||||||
|
"Penciller": "铅笔师",
|
||||||
|
"Translator": "译者",
|
||||||
|
"LibraryScanFanoutConcurrency": "并行媒体库扫描任务限制",
|
||||||
|
"LibraryScanFanoutConcurrencyHelp": "媒体库扫描期间并行任务的最大数量。将其设置为 0 将根据您的系统核心数量选择限制。警告:将此数字设置得太高可能会导致网络文件系统出现问题; 如果您遇到问题,请降低此数字。"
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -55,7 +55,18 @@ const theme = createTheme({
|
||||||
MuiButton: {
|
MuiButton: {
|
||||||
defaultProps: {
|
defaultProps: {
|
||||||
variant: 'contained'
|
variant: 'contained'
|
||||||
|
},
|
||||||
|
variants: [
|
||||||
|
{
|
||||||
|
props: {
|
||||||
|
size: 'large'
|
||||||
|
},
|
||||||
|
style: {
|
||||||
|
fontSize: '1rem',
|
||||||
|
fontWeight: 'bold'
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
MuiFormControl: {
|
MuiFormControl: {
|
||||||
defaultProps: {
|
defaultProps: {
|
||||||
|
|
46
src/types/playbackStopInfo.ts
Normal file
46
src/types/playbackStopInfo.ts
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
import type {
|
||||||
|
BaseItemDto,
|
||||||
|
GroupShuffleMode,
|
||||||
|
MediaSourceInfo,
|
||||||
|
MediaType,
|
||||||
|
PlayerStateInfo
|
||||||
|
} from '@jellyfin/sdk/lib/generated-client';
|
||||||
|
|
||||||
|
export interface BufferedRange {
|
||||||
|
start?: number;
|
||||||
|
end?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PlayState extends PlayerStateInfo {
|
||||||
|
ShuffleMode?: GroupShuffleMode;
|
||||||
|
MaxStreamingBitrate?: number | null;
|
||||||
|
PlaybackStartTimeTicks?: number | null;
|
||||||
|
PlaybackRate?: number | null;
|
||||||
|
SecondarySubtitleStreamIndex?: number | null;
|
||||||
|
BufferedRanges?: BufferedRange[];
|
||||||
|
PlaySessionId?: string | null;
|
||||||
|
PlaylistItemId?: string | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface MediaSource extends MediaSourceInfo {
|
||||||
|
enableDirectPlay?: boolean;
|
||||||
|
DefaultSecondarySubtitleStreamIndex?: number | null;
|
||||||
|
StreamUrl?: string | null;
|
||||||
|
albumNormalizationGain?: number | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PlayerState {
|
||||||
|
PlayState: PlayState;
|
||||||
|
NowPlayingItem: BaseItemDto | null;
|
||||||
|
NextItem: BaseItemDto | null;
|
||||||
|
NextMediaType: MediaType | null;
|
||||||
|
MediaSource: MediaSource | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PlaybackStopInfo {
|
||||||
|
player: unknown; // TODO: add a proper interface
|
||||||
|
state: PlayerState;
|
||||||
|
nextItem: BaseItemDto | null;
|
||||||
|
nextMediaType: MediaType | null;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue