mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Merge branch 'master' into fix_long_getItems_request_URL
This commit is contained in:
commit
09a6ef2cdb
85 changed files with 358 additions and 320 deletions
|
@ -26,8 +26,6 @@ jobs:
|
||||||
|
|
||||||
- script: 'npm ci --no-audit'
|
- script: 'npm ci --no-audit'
|
||||||
displayName: 'Install Dependencies'
|
displayName: 'Install Dependencies'
|
||||||
env:
|
|
||||||
SKIP_PREPARE: 'true'
|
|
||||||
|
|
||||||
- script: 'npm run build:development'
|
- script: 'npm run build:development'
|
||||||
displayName: 'Build Development'
|
displayName: 'Build Development'
|
||||||
|
|
|
@ -68,6 +68,7 @@ module.exports = {
|
||||||
'padded-blocks': ['error', 'never'],
|
'padded-blocks': ['error', 'never'],
|
||||||
'prefer-const': ['error', { 'destructuring': 'all' }],
|
'prefer-const': ['error', { 'destructuring': 'all' }],
|
||||||
'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }],
|
'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }],
|
||||||
|
'radix': ['error'],
|
||||||
'@babel/semi': ['error'],
|
'@babel/semi': ['error'],
|
||||||
'space-before-blocks': ['error'],
|
'space-before-blocks': ['error'],
|
||||||
'space-infix-ops': 'error',
|
'space-infix-ops': 'error',
|
||||||
|
|
6
.github/workflows/codeql-analysis.yml
vendored
6
.github/workflows/codeql-analysis.yml
vendored
|
@ -21,11 +21,11 @@ jobs:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
|
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@32dc499307d133bb5085bae78498c0ac2cf762d5 # v2.2.5
|
uses: github/codeql-action/init@16964e90ba004cdf0cd845b866b5df21038b7723 # v2.2.6
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
queries: +security-extended
|
queries: +security-extended
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@32dc499307d133bb5085bae78498c0ac2cf762d5 # v2.2.5
|
uses: github/codeql-action/autobuild@16964e90ba004cdf0cd845b866b5df21038b7723 # v2.2.6
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@32dc499307d133bb5085bae78498c0ac2cf762d5 # v2.2.5
|
uses: github/codeql-action/analyze@16964e90ba004cdf0cd845b866b5df21038b7723 # v2.2.6
|
||||||
|
|
8
.github/workflows/lint.yml
vendored
8
.github/workflows/lint.yml
vendored
|
@ -24,8 +24,6 @@ jobs:
|
||||||
|
|
||||||
- name: Install Node.js dependencies
|
- name: Install Node.js dependencies
|
||||||
run: npm ci --no-audit
|
run: npm ci --no-audit
|
||||||
env:
|
|
||||||
SKIP_PREPARE: true
|
|
||||||
|
|
||||||
- name: Run a production build
|
- name: Run a production build
|
||||||
run: npm run build:production
|
run: npm run build:production
|
||||||
|
@ -50,8 +48,6 @@ jobs:
|
||||||
|
|
||||||
- name: Install Node.js dependencies
|
- name: Install Node.js dependencies
|
||||||
run: npm ci --no-audit
|
run: npm ci --no-audit
|
||||||
env:
|
|
||||||
SKIP_PREPARE: true
|
|
||||||
|
|
||||||
- name: Run eslint
|
- name: Run eslint
|
||||||
run: npm run lint
|
run: npm run lint
|
||||||
|
@ -76,8 +72,6 @@ jobs:
|
||||||
|
|
||||||
- name: Install Node.js dependencies
|
- name: Install Node.js dependencies
|
||||||
run: npm ci --no-audit
|
run: npm ci --no-audit
|
||||||
env:
|
|
||||||
SKIP_PREPARE: true
|
|
||||||
|
|
||||||
- name: Run stylelint
|
- name: Run stylelint
|
||||||
run: npm run stylelint:css
|
run: npm run stylelint:css
|
||||||
|
@ -102,8 +96,6 @@ jobs:
|
||||||
|
|
||||||
- name: Install Node.js dependencies
|
- name: Install Node.js dependencies
|
||||||
run: npm ci --no-audit
|
run: npm ci --no-audit
|
||||||
env:
|
|
||||||
SKIP_PREPARE: true
|
|
||||||
|
|
||||||
- name: Run stylelint
|
- name: Run stylelint
|
||||||
run: npm run stylelint:scss
|
run: npm run stylelint:scss
|
||||||
|
|
4
.github/workflows/tsc.yml
vendored
4
.github/workflows/tsc.yml
vendored
|
@ -24,8 +24,6 @@ jobs:
|
||||||
|
|
||||||
- name: Install Node.js dependencies
|
- name: Install Node.js dependencies
|
||||||
run: npm ci --no-audit
|
run: npm ci --no-audit
|
||||||
env:
|
|
||||||
SKIP_PREPARE: true
|
|
||||||
|
|
||||||
- name: Run tsc
|
- name: Run tsc
|
||||||
run: npm run build:check
|
run: npm run build:check
|
||||||
|
|
1
debian/rules
vendored
1
debian/rules
vendored
|
@ -12,6 +12,7 @@ override_dh_clistrip:
|
||||||
|
|
||||||
override_dh_auto_build:
|
override_dh_auto_build:
|
||||||
npm ci --no-audit --unsafe-perm
|
npm ci --no-audit --unsafe-perm
|
||||||
|
npm run build:production
|
||||||
mv $(CURDIR)/dist $(CURDIR)/web
|
mv $(CURDIR)/dist $(CURDIR)/web
|
||||||
|
|
||||||
override_dh_auto_clean:
|
override_dh_auto_clean:
|
||||||
|
|
|
@ -8,4 +8,6 @@ RUN apk add autoconf g++ make libpng-dev gifsicle alpine-sdk automake libtool ma
|
||||||
WORKDIR ${SOURCE_DIR}
|
WORKDIR ${SOURCE_DIR}
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
RUN npm ci --no-audit --unsafe-perm && mv dist ${ARTIFACT_DIR}
|
RUN npm ci --no-audit --unsafe-perm \
|
||||||
|
&& npm run build:production \
|
||||||
|
&& mv dist ${ARTIFACT_DIR}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
FROM fedora:37
|
FROM fedora:38
|
||||||
|
|
||||||
# Docker build arguments
|
# Docker build arguments
|
||||||
ARG SOURCE_DIR=/jellyfin
|
ARG SOURCE_DIR=/jellyfin
|
||||||
|
|
|
@ -15,6 +15,7 @@ fi
|
||||||
|
|
||||||
# build archives
|
# build archives
|
||||||
npm ci --no-audit --unsafe-perm
|
npm ci --no-audit --unsafe-perm
|
||||||
|
npm run build:production
|
||||||
mv dist jellyfin-web_${version}
|
mv dist jellyfin-web_${version}
|
||||||
tar -czf jellyfin-web_${version}_portable.tar.gz jellyfin-web_${version}
|
tar -czf jellyfin-web_${version}_portable.tar.gz jellyfin-web_${version}
|
||||||
rm -rf dist
|
rm -rf dist
|
||||||
|
|
|
@ -35,6 +35,7 @@ chown root:root -R .
|
||||||
|
|
||||||
%build
|
%build
|
||||||
npm ci --no-audit --unsafe-perm
|
npm ci --no-audit --unsafe-perm
|
||||||
|
npm run build:production
|
||||||
|
|
||||||
|
|
||||||
%install
|
%install
|
||||||
|
|
236
package-lock.json
generated
236
package-lock.json
generated
|
@ -23,7 +23,7 @@
|
||||||
"classnames": "2.3.2",
|
"classnames": "2.3.2",
|
||||||
"core-js": "3.29.0",
|
"core-js": "3.29.0",
|
||||||
"date-fns": "2.29.3",
|
"date-fns": "2.29.3",
|
||||||
"dompurify": "2.4.4",
|
"dompurify": "3.0.1",
|
||||||
"epubjs": "0.4.2",
|
"epubjs": "0.4.2",
|
||||||
"escape-html": "1.0.3",
|
"escape-html": "1.0.3",
|
||||||
"fast-text-encoding": "1.0.6",
|
"fast-text-encoding": "1.0.6",
|
||||||
|
@ -68,8 +68,8 @@
|
||||||
"@types/lodash-es": "4.17.6",
|
"@types/lodash-es": "4.17.6",
|
||||||
"@types/react": "17.0.53",
|
"@types/react": "17.0.53",
|
||||||
"@types/react-dom": "17.0.19",
|
"@types/react-dom": "17.0.19",
|
||||||
"@typescript-eslint/eslint-plugin": "5.54.0",
|
"@typescript-eslint/eslint-plugin": "5.54.1",
|
||||||
"@typescript-eslint/parser": "5.54.0",
|
"@typescript-eslint/parser": "5.54.1",
|
||||||
"@uupaa/dynamic-import-polyfill": "1.0.2",
|
"@uupaa/dynamic-import-polyfill": "1.0.2",
|
||||||
"autoprefixer": "10.4.13",
|
"autoprefixer": "10.4.13",
|
||||||
"babel-loader": "9.1.2",
|
"babel-loader": "9.1.2",
|
||||||
|
@ -105,7 +105,7 @@
|
||||||
"stylelint": "15.2.0",
|
"stylelint": "15.2.0",
|
||||||
"stylelint-config-rational-order": "0.1.2",
|
"stylelint-config-rational-order": "0.1.2",
|
||||||
"stylelint-no-browser-hacks": "1.2.1",
|
"stylelint-no-browser-hacks": "1.2.1",
|
||||||
"stylelint-order": "6.0.2",
|
"stylelint-order": "6.0.3",
|
||||||
"stylelint-scss": "4.4.0",
|
"stylelint-scss": "4.4.0",
|
||||||
"ts-loader": "9.4.2",
|
"ts-loader": "9.4.2",
|
||||||
"typescript": "4.9.5",
|
"typescript": "4.9.5",
|
||||||
|
@ -2611,11 +2611,11 @@
|
||||||
"integrity": "sha512-xQVJw+lZUg4U1TmLS80reBECfPtpCgRF8hhUSvUUQM9g68OvINyUU3K2yqRH+8tomGpghiRaIcr/bUJ83e0veA=="
|
"integrity": "sha512-xQVJw+lZUg4U1TmLS80reBECfPtpCgRF8hhUSvUUQM9g68OvINyUU3K2yqRH+8tomGpghiRaIcr/bUJ83e0veA=="
|
||||||
},
|
},
|
||||||
"node_modules/@jellyfin/sdk": {
|
"node_modules/@jellyfin/sdk": {
|
||||||
"version": "0.0.0-unstable.202302070552",
|
"version": "0.0.0-unstable.202303130502",
|
||||||
"resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202302070552.tgz",
|
"resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202303130502.tgz",
|
||||||
"integrity": "sha512-hwrHLLFPTCEcrMywpLWwgGKEDKBjgu3o+ruMV3qCG7uAmKAQq48kuaZ818rJD+LjWBjBIUixnLJq1qUlHsgc+A==",
|
"integrity": "sha512-j3ntDjTnZlU511J0CpuPVSSSYrx9so4Y3q6qYOVsB6/evH4/2BNkWYRbKgCnUtCULIV90T6KGc2EcS4GGxojCg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "1.2.6",
|
"axios": "1.3.4",
|
||||||
"compare-versions": "5.0.3"
|
"compare-versions": "5.0.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -3200,14 +3200,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/eslint-plugin": {
|
"node_modules/@typescript-eslint/eslint-plugin": {
|
||||||
"version": "5.54.0",
|
"version": "5.54.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz",
|
||||||
"integrity": "sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw==",
|
"integrity": "sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/scope-manager": "5.54.0",
|
"@typescript-eslint/scope-manager": "5.54.1",
|
||||||
"@typescript-eslint/type-utils": "5.54.0",
|
"@typescript-eslint/type-utils": "5.54.1",
|
||||||
"@typescript-eslint/utils": "5.54.0",
|
"@typescript-eslint/utils": "5.54.1",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"grapheme-splitter": "^1.0.4",
|
"grapheme-splitter": "^1.0.4",
|
||||||
"ignore": "^5.2.0",
|
"ignore": "^5.2.0",
|
||||||
|
@ -3249,14 +3249,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/parser": {
|
"node_modules/@typescript-eslint/parser": {
|
||||||
"version": "5.54.0",
|
"version": "5.54.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.1.tgz",
|
||||||
"integrity": "sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==",
|
"integrity": "sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/scope-manager": "5.54.0",
|
"@typescript-eslint/scope-manager": "5.54.1",
|
||||||
"@typescript-eslint/types": "5.54.0",
|
"@typescript-eslint/types": "5.54.1",
|
||||||
"@typescript-eslint/typescript-estree": "5.54.0",
|
"@typescript-eslint/typescript-estree": "5.54.1",
|
||||||
"debug": "^4.3.4"
|
"debug": "^4.3.4"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
|
@ -3276,13 +3276,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/scope-manager": {
|
"node_modules/@typescript-eslint/scope-manager": {
|
||||||
"version": "5.54.0",
|
"version": "5.54.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz",
|
||||||
"integrity": "sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==",
|
"integrity": "sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "5.54.0",
|
"@typescript-eslint/types": "5.54.1",
|
||||||
"@typescript-eslint/visitor-keys": "5.54.0"
|
"@typescript-eslint/visitor-keys": "5.54.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||||
|
@ -3293,13 +3293,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/type-utils": {
|
"node_modules/@typescript-eslint/type-utils": {
|
||||||
"version": "5.54.0",
|
"version": "5.54.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz",
|
||||||
"integrity": "sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ==",
|
"integrity": "sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/typescript-estree": "5.54.0",
|
"@typescript-eslint/typescript-estree": "5.54.1",
|
||||||
"@typescript-eslint/utils": "5.54.0",
|
"@typescript-eslint/utils": "5.54.1",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"tsutils": "^3.21.0"
|
"tsutils": "^3.21.0"
|
||||||
},
|
},
|
||||||
|
@ -3320,9 +3320,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/types": {
|
"node_modules/@typescript-eslint/types": {
|
||||||
"version": "5.54.0",
|
"version": "5.54.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.1.tgz",
|
||||||
"integrity": "sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==",
|
"integrity": "sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||||
|
@ -3333,13 +3333,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/typescript-estree": {
|
"node_modules/@typescript-eslint/typescript-estree": {
|
||||||
"version": "5.54.0",
|
"version": "5.54.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz",
|
||||||
"integrity": "sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==",
|
"integrity": "sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "5.54.0",
|
"@typescript-eslint/types": "5.54.1",
|
||||||
"@typescript-eslint/visitor-keys": "5.54.0",
|
"@typescript-eslint/visitor-keys": "5.54.1",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"globby": "^11.1.0",
|
"globby": "^11.1.0",
|
||||||
"is-glob": "^4.0.3",
|
"is-glob": "^4.0.3",
|
||||||
|
@ -3404,16 +3404,16 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/utils": {
|
"node_modules/@typescript-eslint/utils": {
|
||||||
"version": "5.54.0",
|
"version": "5.54.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.1.tgz",
|
||||||
"integrity": "sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==",
|
"integrity": "sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/json-schema": "^7.0.9",
|
"@types/json-schema": "^7.0.9",
|
||||||
"@types/semver": "^7.3.12",
|
"@types/semver": "^7.3.12",
|
||||||
"@typescript-eslint/scope-manager": "5.54.0",
|
"@typescript-eslint/scope-manager": "5.54.1",
|
||||||
"@typescript-eslint/types": "5.54.0",
|
"@typescript-eslint/types": "5.54.1",
|
||||||
"@typescript-eslint/typescript-estree": "5.54.0",
|
"@typescript-eslint/typescript-estree": "5.54.1",
|
||||||
"eslint-scope": "^5.1.1",
|
"eslint-scope": "^5.1.1",
|
||||||
"eslint-utils": "^3.0.0",
|
"eslint-utils": "^3.0.0",
|
||||||
"semver": "^7.3.7"
|
"semver": "^7.3.7"
|
||||||
|
@ -3445,12 +3445,12 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/visitor-keys": {
|
"node_modules/@typescript-eslint/visitor-keys": {
|
||||||
"version": "5.54.0",
|
"version": "5.54.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz",
|
||||||
"integrity": "sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==",
|
"integrity": "sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "5.54.0",
|
"@typescript-eslint/types": "5.54.1",
|
||||||
"eslint-visitor-keys": "^3.3.0"
|
"eslint-visitor-keys": "^3.3.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
|
@ -4111,9 +4111,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/axios": {
|
"node_modules/axios": {
|
||||||
"version": "1.2.6",
|
"version": "1.3.4",
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.2.6.tgz",
|
"resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz",
|
||||||
"integrity": "sha512-rC/7F08XxZwjMV4iuWv+JpD3E0Ksqg9nac4IIg6RwNuF0JTeWoCo/mBNG54+tNhhI11G3/VDRbdDQTs9hGp4pQ==",
|
"integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"follow-redirects": "^1.15.0",
|
"follow-redirects": "^1.15.0",
|
||||||
"form-data": "^4.0.0",
|
"form-data": "^4.0.0",
|
||||||
|
@ -5965,9 +5965,9 @@
|
||||||
"integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww=="
|
"integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww=="
|
||||||
},
|
},
|
||||||
"node_modules/dompurify": {
|
"node_modules/dompurify": {
|
||||||
"version": "2.4.4",
|
"version": "3.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.4.tgz",
|
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.1.tgz",
|
||||||
"integrity": "sha512-1e2SpqHiRx4DPvmRuXU5J0di3iQACwJM+mFGE2HAkkK7Tbnfk9WcghcAmyWc9CRrjyRRUpmuhPUH6LphQQR3EQ=="
|
"integrity": "sha512-60tsgvPKwItxZZdfLmamp0MTcecCta3avOhsLgPZ0qcWt96OasFfhkeIRbJ6br5i0fQawT1/RBGB5L58/Jpwuw=="
|
||||||
},
|
},
|
||||||
"node_modules/domutils": {
|
"node_modules/domutils": {
|
||||||
"version": "1.7.0",
|
"version": "1.7.0",
|
||||||
|
@ -17063,22 +17063,22 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/stylelint-order": {
|
"node_modules/stylelint-order": {
|
||||||
"version": "6.0.2",
|
"version": "6.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.3.tgz",
|
||||||
"integrity": "sha512-yuac0BE6toHd27wUPvYVVQicAJthKFIv1HPQFH3Q0dExiO3Z6Uam7geoO0tUd5Z9ddsATYK++1qWNDX4RxMH5Q==",
|
"integrity": "sha512-1j1lOb4EU/6w49qZeT2SQVJXm0Ht+Qnq9GMfUa3pMwoyojIWfuA+JUDmoR97Bht1RLn4ei0xtLGy87M7d29B1w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"postcss": "^8.4.21",
|
"postcss": "^8.4.21",
|
||||||
"postcss-sorting": "^8.0.1"
|
"postcss-sorting": "^8.0.2"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"stylelint": "^14.0.0 || ^15.0.0"
|
"stylelint": "^14.0.0 || ^15.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/stylelint-order/node_modules/postcss-sorting": {
|
"node_modules/stylelint-order/node_modules/postcss-sorting": {
|
||||||
"version": "8.0.1",
|
"version": "8.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.2.tgz",
|
||||||
"integrity": "sha512-go9Zoxx7KQH+uLrJ9xa5wRErFeXu01ydA6O8m7koPXkmAN7Ts//eRcIqjo0stBR4+Nir2gMYDOWAOx7O5EPUZA==",
|
"integrity": "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"postcss": "^8.4.20"
|
"postcss": "^8.4.20"
|
||||||
|
@ -20912,11 +20912,11 @@
|
||||||
"integrity": "sha512-xQVJw+lZUg4U1TmLS80reBECfPtpCgRF8hhUSvUUQM9g68OvINyUU3K2yqRH+8tomGpghiRaIcr/bUJ83e0veA=="
|
"integrity": "sha512-xQVJw+lZUg4U1TmLS80reBECfPtpCgRF8hhUSvUUQM9g68OvINyUU3K2yqRH+8tomGpghiRaIcr/bUJ83e0veA=="
|
||||||
},
|
},
|
||||||
"@jellyfin/sdk": {
|
"@jellyfin/sdk": {
|
||||||
"version": "0.0.0-unstable.202302070552",
|
"version": "0.0.0-unstable.202303130502",
|
||||||
"resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202302070552.tgz",
|
"resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202303130502.tgz",
|
||||||
"integrity": "sha512-hwrHLLFPTCEcrMywpLWwgGKEDKBjgu3o+ruMV3qCG7uAmKAQq48kuaZ818rJD+LjWBjBIUixnLJq1qUlHsgc+A==",
|
"integrity": "sha512-j3ntDjTnZlU511J0CpuPVSSSYrx9so4Y3q6qYOVsB6/evH4/2BNkWYRbKgCnUtCULIV90T6KGc2EcS4GGxojCg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"axios": "1.2.6",
|
"axios": "1.3.4",
|
||||||
"compare-versions": "5.0.3"
|
"compare-versions": "5.0.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -21437,14 +21437,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/eslint-plugin": {
|
"@typescript-eslint/eslint-plugin": {
|
||||||
"version": "5.54.0",
|
"version": "5.54.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz",
|
||||||
"integrity": "sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw==",
|
"integrity": "sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/scope-manager": "5.54.0",
|
"@typescript-eslint/scope-manager": "5.54.1",
|
||||||
"@typescript-eslint/type-utils": "5.54.0",
|
"@typescript-eslint/type-utils": "5.54.1",
|
||||||
"@typescript-eslint/utils": "5.54.0",
|
"@typescript-eslint/utils": "5.54.1",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"grapheme-splitter": "^1.0.4",
|
"grapheme-splitter": "^1.0.4",
|
||||||
"ignore": "^5.2.0",
|
"ignore": "^5.2.0",
|
||||||
|
@ -21466,53 +21466,53 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/parser": {
|
"@typescript-eslint/parser": {
|
||||||
"version": "5.54.0",
|
"version": "5.54.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.1.tgz",
|
||||||
"integrity": "sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==",
|
"integrity": "sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/scope-manager": "5.54.0",
|
"@typescript-eslint/scope-manager": "5.54.1",
|
||||||
"@typescript-eslint/types": "5.54.0",
|
"@typescript-eslint/types": "5.54.1",
|
||||||
"@typescript-eslint/typescript-estree": "5.54.0",
|
"@typescript-eslint/typescript-estree": "5.54.1",
|
||||||
"debug": "^4.3.4"
|
"debug": "^4.3.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/scope-manager": {
|
"@typescript-eslint/scope-manager": {
|
||||||
"version": "5.54.0",
|
"version": "5.54.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz",
|
||||||
"integrity": "sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==",
|
"integrity": "sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/types": "5.54.0",
|
"@typescript-eslint/types": "5.54.1",
|
||||||
"@typescript-eslint/visitor-keys": "5.54.0"
|
"@typescript-eslint/visitor-keys": "5.54.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/type-utils": {
|
"@typescript-eslint/type-utils": {
|
||||||
"version": "5.54.0",
|
"version": "5.54.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz",
|
||||||
"integrity": "sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ==",
|
"integrity": "sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/typescript-estree": "5.54.0",
|
"@typescript-eslint/typescript-estree": "5.54.1",
|
||||||
"@typescript-eslint/utils": "5.54.0",
|
"@typescript-eslint/utils": "5.54.1",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"tsutils": "^3.21.0"
|
"tsutils": "^3.21.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/types": {
|
"@typescript-eslint/types": {
|
||||||
"version": "5.54.0",
|
"version": "5.54.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.1.tgz",
|
||||||
"integrity": "sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==",
|
"integrity": "sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@typescript-eslint/typescript-estree": {
|
"@typescript-eslint/typescript-estree": {
|
||||||
"version": "5.54.0",
|
"version": "5.54.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz",
|
||||||
"integrity": "sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==",
|
"integrity": "sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/types": "5.54.0",
|
"@typescript-eslint/types": "5.54.1",
|
||||||
"@typescript-eslint/visitor-keys": "5.54.0",
|
"@typescript-eslint/visitor-keys": "5.54.1",
|
||||||
"debug": "^4.3.4",
|
"debug": "^4.3.4",
|
||||||
"globby": "^11.1.0",
|
"globby": "^11.1.0",
|
||||||
"is-glob": "^4.0.3",
|
"is-glob": "^4.0.3",
|
||||||
|
@ -21552,16 +21552,16 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/utils": {
|
"@typescript-eslint/utils": {
|
||||||
"version": "5.54.0",
|
"version": "5.54.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.1.tgz",
|
||||||
"integrity": "sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==",
|
"integrity": "sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/json-schema": "^7.0.9",
|
"@types/json-schema": "^7.0.9",
|
||||||
"@types/semver": "^7.3.12",
|
"@types/semver": "^7.3.12",
|
||||||
"@typescript-eslint/scope-manager": "5.54.0",
|
"@typescript-eslint/scope-manager": "5.54.1",
|
||||||
"@typescript-eslint/types": "5.54.0",
|
"@typescript-eslint/types": "5.54.1",
|
||||||
"@typescript-eslint/typescript-estree": "5.54.0",
|
"@typescript-eslint/typescript-estree": "5.54.1",
|
||||||
"eslint-scope": "^5.1.1",
|
"eslint-scope": "^5.1.1",
|
||||||
"eslint-utils": "^3.0.0",
|
"eslint-utils": "^3.0.0",
|
||||||
"semver": "^7.3.7"
|
"semver": "^7.3.7"
|
||||||
|
@ -21579,12 +21579,12 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/visitor-keys": {
|
"@typescript-eslint/visitor-keys": {
|
||||||
"version": "5.54.0",
|
"version": "5.54.1",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz",
|
||||||
"integrity": "sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==",
|
"integrity": "sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/types": "5.54.0",
|
"@typescript-eslint/types": "5.54.1",
|
||||||
"eslint-visitor-keys": "^3.3.0"
|
"eslint-visitor-keys": "^3.3.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@ -22088,9 +22088,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"axios": {
|
"axios": {
|
||||||
"version": "1.2.6",
|
"version": "1.3.4",
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.2.6.tgz",
|
"resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz",
|
||||||
"integrity": "sha512-rC/7F08XxZwjMV4iuWv+JpD3E0Ksqg9nac4IIg6RwNuF0JTeWoCo/mBNG54+tNhhI11G3/VDRbdDQTs9hGp4pQ==",
|
"integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"follow-redirects": "^1.15.0",
|
"follow-redirects": "^1.15.0",
|
||||||
"form-data": "^4.0.0",
|
"form-data": "^4.0.0",
|
||||||
|
@ -23480,9 +23480,9 @@
|
||||||
"integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww=="
|
"integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww=="
|
||||||
},
|
},
|
||||||
"dompurify": {
|
"dompurify": {
|
||||||
"version": "2.4.4",
|
"version": "3.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.4.tgz",
|
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.1.tgz",
|
||||||
"integrity": "sha512-1e2SpqHiRx4DPvmRuXU5J0di3iQACwJM+mFGE2HAkkK7Tbnfk9WcghcAmyWc9CRrjyRRUpmuhPUH6LphQQR3EQ=="
|
"integrity": "sha512-60tsgvPKwItxZZdfLmamp0MTcecCta3avOhsLgPZ0qcWt96OasFfhkeIRbJ6br5i0fQawT1/RBGB5L58/Jpwuw=="
|
||||||
},
|
},
|
||||||
"domutils": {
|
"domutils": {
|
||||||
"version": "1.7.0",
|
"version": "1.7.0",
|
||||||
|
@ -31951,19 +31951,19 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"stylelint-order": {
|
"stylelint-order": {
|
||||||
"version": "6.0.2",
|
"version": "6.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.3.tgz",
|
||||||
"integrity": "sha512-yuac0BE6toHd27wUPvYVVQicAJthKFIv1HPQFH3Q0dExiO3Z6Uam7geoO0tUd5Z9ddsATYK++1qWNDX4RxMH5Q==",
|
"integrity": "sha512-1j1lOb4EU/6w49qZeT2SQVJXm0Ht+Qnq9GMfUa3pMwoyojIWfuA+JUDmoR97Bht1RLn4ei0xtLGy87M7d29B1w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"postcss": "^8.4.21",
|
"postcss": "^8.4.21",
|
||||||
"postcss-sorting": "^8.0.1"
|
"postcss-sorting": "^8.0.2"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"postcss-sorting": {
|
"postcss-sorting": {
|
||||||
"version": "8.0.1",
|
"version": "8.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.2.tgz",
|
||||||
"integrity": "sha512-go9Zoxx7KQH+uLrJ9xa5wRErFeXu01ydA6O8m7koPXkmAN7Ts//eRcIqjo0stBR4+Nir2gMYDOWAOx7O5EPUZA==",
|
"integrity": "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {}
|
"requires": {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
"@types/lodash-es": "4.17.6",
|
"@types/lodash-es": "4.17.6",
|
||||||
"@types/react": "17.0.53",
|
"@types/react": "17.0.53",
|
||||||
"@types/react-dom": "17.0.19",
|
"@types/react-dom": "17.0.19",
|
||||||
"@typescript-eslint/eslint-plugin": "5.54.0",
|
"@typescript-eslint/eslint-plugin": "5.54.1",
|
||||||
"@typescript-eslint/parser": "5.54.0",
|
"@typescript-eslint/parser": "5.54.1",
|
||||||
"@uupaa/dynamic-import-polyfill": "1.0.2",
|
"@uupaa/dynamic-import-polyfill": "1.0.2",
|
||||||
"autoprefixer": "10.4.13",
|
"autoprefixer": "10.4.13",
|
||||||
"babel-loader": "9.1.2",
|
"babel-loader": "9.1.2",
|
||||||
|
@ -56,7 +56,7 @@
|
||||||
"stylelint": "15.2.0",
|
"stylelint": "15.2.0",
|
||||||
"stylelint-config-rational-order": "0.1.2",
|
"stylelint-config-rational-order": "0.1.2",
|
||||||
"stylelint-no-browser-hacks": "1.2.1",
|
"stylelint-no-browser-hacks": "1.2.1",
|
||||||
"stylelint-order": "6.0.2",
|
"stylelint-order": "6.0.3",
|
||||||
"stylelint-scss": "4.4.0",
|
"stylelint-scss": "4.4.0",
|
||||||
"ts-loader": "9.4.2",
|
"ts-loader": "9.4.2",
|
||||||
"typescript": "4.9.5",
|
"typescript": "4.9.5",
|
||||||
|
@ -82,7 +82,7 @@
|
||||||
"classnames": "2.3.2",
|
"classnames": "2.3.2",
|
||||||
"core-js": "3.29.0",
|
"core-js": "3.29.0",
|
||||||
"date-fns": "2.29.3",
|
"date-fns": "2.29.3",
|
||||||
"dompurify": "2.4.4",
|
"dompurify": "3.0.1",
|
||||||
"epubjs": "0.4.2",
|
"epubjs": "0.4.2",
|
||||||
"escape-html": "1.0.3",
|
"escape-html": "1.0.3",
|
||||||
"fast-text-encoding": "1.0.6",
|
"fast-text-encoding": "1.0.6",
|
||||||
|
@ -131,7 +131,6 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "npm run serve",
|
"start": "npm run serve",
|
||||||
"serve": "webpack serve --config webpack.dev.js",
|
"serve": "webpack serve --config webpack.dev.js",
|
||||||
"prepare": "node ./scripts/prepare.js",
|
|
||||||
"build:development": "webpack --config webpack.dev.js",
|
"build:development": "webpack --config webpack.dev.js",
|
||||||
"build:production": "cross-env NODE_ENV=\"production\" webpack --config webpack.prod.js",
|
"build:production": "cross-env NODE_ENV=\"production\" webpack --config webpack.prod.js",
|
||||||
"build:check": "tsc --noEmit",
|
"build:check": "tsc --noEmit",
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
const { execSync } = require('child_process');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The npm `prepare` script needs to run a build to support installing
|
|
||||||
* a package from git repositories (this is dumb but a limitation of how
|
|
||||||
* npm behaves). We don't want to run these in CI though because
|
|
||||||
* building is slow so this script will skip the build when the
|
|
||||||
* `SKIP_PREPARE` environment variable has been set.
|
|
||||||
*/
|
|
||||||
if (!process.env.SKIP_PREPARE) {
|
|
||||||
execSync('webpack --config webpack.prod.js', { stdio: 'inherit' });
|
|
||||||
}
|
|
|
@ -19,7 +19,7 @@ import template from './accessSchedule.template.html';
|
||||||
const pct = hours % 1;
|
const pct = hours % 1;
|
||||||
|
|
||||||
if (pct) {
|
if (pct) {
|
||||||
minutes = parseInt(60 * pct);
|
minutes = parseInt(60 * pct, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
return datetime.getDisplayTime(new Date(2000, 1, 1, hours, minutes, 0, 0));
|
return datetime.getDisplayTime(new Date(2000, 1, 1, hours, minutes, 0, 0));
|
||||||
|
|
|
@ -64,10 +64,10 @@ import { toBoolean } from '../utils/string.ts';
|
||||||
|
|
||||||
function reloadData(instance, elem, apiClient, startIndex, limit) {
|
function reloadData(instance, elem, apiClient, startIndex, limit) {
|
||||||
if (startIndex == null) {
|
if (startIndex == null) {
|
||||||
startIndex = parseInt(elem.getAttribute('data-activitystartindex') || '0');
|
startIndex = parseInt(elem.getAttribute('data-activitystartindex') || '0', 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
limit = limit || parseInt(elem.getAttribute('data-activitylimit') || '7');
|
limit = limit || parseInt(elem.getAttribute('data-activitylimit') || '7', 10);
|
||||||
const minDate = new Date();
|
const minDate = new Date();
|
||||||
const hasUserId = toBoolean(elem.getAttribute('data-useractivity'), true);
|
const hasUserId = toBoolean(elem.getAttribute('data-useractivity'), true);
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ import browser from '../../scripts/browser';
|
||||||
import { playbackManager } from '../playback/playbackmanager';
|
import { playbackManager } from '../playback/playbackmanager';
|
||||||
import itemShortcuts from '../shortcuts';
|
import itemShortcuts from '../shortcuts';
|
||||||
import imageHelper from '../../scripts/imagehelper';
|
import imageHelper from '../../scripts/imagehelper';
|
||||||
|
import { randomInt } from '../../utils/number.ts';
|
||||||
import './card.scss';
|
import './card.scss';
|
||||||
import '../../elements/emby-button/paper-icon-button-light';
|
import '../../elements/emby-button/paper-icon-button-light';
|
||||||
import '../guide/programs.scss';
|
import '../guide/programs.scss';
|
||||||
|
@ -640,16 +641,6 @@ import { appRouter } from '../appRouter';
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates a random integer in a given range.
|
|
||||||
* @param {number} min - Minimum of the range.
|
|
||||||
* @param {number} max - Maximum of the range.
|
|
||||||
* @returns {number} Randomly generated number.
|
|
||||||
*/
|
|
||||||
function getRandomInt(min, max) {
|
|
||||||
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates an index used to select the default color of a card based on a string.
|
* Generates an index used to select the default color of a card based on a string.
|
||||||
* @param {?string} [str] - String to use for generating the index.
|
* @param {?string} [str] - String to use for generating the index.
|
||||||
|
@ -663,13 +654,13 @@ import { appRouter } from '../appRouter';
|
||||||
const character = String(str.slice(charIndex, charIndex + 1).charCodeAt());
|
const character = String(str.slice(charIndex, charIndex + 1).charCodeAt());
|
||||||
let sum = 0;
|
let sum = 0;
|
||||||
for (let i = 0; i < character.length; i++) {
|
for (let i = 0; i < character.length; i++) {
|
||||||
sum += parseInt(character.charAt(i));
|
sum += parseInt(character.charAt(i), 10);
|
||||||
}
|
}
|
||||||
const index = String(sum).slice(-1);
|
const index = String(sum).slice(-1);
|
||||||
|
|
||||||
return (index % numRandomColors) + 1;
|
return (index % numRandomColors) + 1;
|
||||||
} else {
|
} else {
|
||||||
return getRandomInt(1, numRandomColors);
|
return randomInt(1, numRandomColors);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ import datetime from '../../scripts/datetime';
|
||||||
import globalize from '../../scripts/globalize';
|
import globalize from '../../scripts/globalize';
|
||||||
import loading from '../loading/loading';
|
import loading from '../loading/loading';
|
||||||
import skinManager from '../../scripts/themeManager';
|
import skinManager from '../../scripts/themeManager';
|
||||||
|
import { PluginType } from '../../types/plugin.ts';
|
||||||
import Events from '../../utils/events.ts';
|
import Events from '../../utils/events.ts';
|
||||||
import '../../elements/emby-select/emby-select';
|
import '../../elements/emby-select/emby-select';
|
||||||
import '../../elements/emby-checkbox/emby-checkbox';
|
import '../../elements/emby-checkbox/emby-checkbox';
|
||||||
|
@ -35,7 +36,7 @@ import template from './displaySettings.template.html';
|
||||||
|
|
||||||
function loadScreensavers(context, userSettings) {
|
function loadScreensavers(context, userSettings) {
|
||||||
const selectScreensaver = context.querySelector('.selectScreensaver');
|
const selectScreensaver = context.querySelector('.selectScreensaver');
|
||||||
const options = pluginManager.ofType('screensaver').map(plugin => {
|
const options = pluginManager.ofType(PluginType.Screensaver).map(plugin => {
|
||||||
return {
|
return {
|
||||||
name: plugin.name,
|
name: plugin.name,
|
||||||
value: plugin.id
|
value: plugin.id
|
||||||
|
|
|
@ -13,7 +13,7 @@ import ServerConnections from './ServerConnections';
|
||||||
const playedIndicator = card.querySelector('.playedIndicator');
|
const playedIndicator = card.querySelector('.playedIndicator');
|
||||||
const playedIndicatorHtml = playedIndicator ? playedIndicator.innerHTML : null;
|
const playedIndicatorHtml = playedIndicator ? playedIndicator.innerHTML : null;
|
||||||
const options = {
|
const options = {
|
||||||
Limit: parseInt(playedIndicatorHtml || '10'),
|
Limit: parseInt(playedIndicatorHtml || '10', 10),
|
||||||
Fields: 'PrimaryImageAspectRatio,DateCreated',
|
Fields: 'PrimaryImageAspectRatio,DateCreated',
|
||||||
ParentId: itemId,
|
ParentId: itemId,
|
||||||
GroupItems: false
|
GroupItems: false
|
||||||
|
|
|
@ -1149,12 +1149,12 @@ function Guide(options) {
|
||||||
guideContext.querySelector('.guideDateTabs').addEventListener('tabchange', function (e) {
|
guideContext.querySelector('.guideDateTabs').addEventListener('tabchange', function (e) {
|
||||||
const allTabButtons = e.target.querySelectorAll('.guide-date-tab-button');
|
const allTabButtons = e.target.querySelectorAll('.guide-date-tab-button');
|
||||||
|
|
||||||
const tabButton = allTabButtons[parseInt(e.detail.selectedTabIndex)];
|
const tabButton = allTabButtons[parseInt(e.detail.selectedTabIndex, 10)];
|
||||||
if (tabButton) {
|
if (tabButton) {
|
||||||
const previousButton = e.detail.previousIndex == null ? null : allTabButtons[parseInt(e.detail.previousIndex)];
|
const previousButton = e.detail.previousIndex == null ? null : allTabButtons[parseInt(e.detail.previousIndex, 10)];
|
||||||
|
|
||||||
const date = new Date();
|
const date = new Date();
|
||||||
date.setTime(parseInt(tabButton.getAttribute('data-date')));
|
date.setTime(parseInt(tabButton.getAttribute('data-date'), 10));
|
||||||
|
|
||||||
const scrollWidth = programGrid.scrollWidth;
|
const scrollWidth = programGrid.scrollWidth;
|
||||||
let scrollToTimeMs;
|
let scrollToTimeMs;
|
||||||
|
@ -1166,7 +1166,7 @@ function Guide(options) {
|
||||||
|
|
||||||
if (previousButton) {
|
if (previousButton) {
|
||||||
const previousDate = new Date();
|
const previousDate = new Date();
|
||||||
previousDate.setTime(parseInt(previousButton.getAttribute('data-date')));
|
previousDate.setTime(parseInt(previousButton.getAttribute('data-date'), 10));
|
||||||
|
|
||||||
scrollToTimeMs += (previousDate.getHours() * 60 * 60 * 1000);
|
scrollToTimeMs += (previousDate.getHours() * 60 * 60 * 1000);
|
||||||
scrollToTimeMs += (previousDate.getMinutes() * 60 * 1000);
|
scrollToTimeMs += (previousDate.getMinutes() * 60 * 1000);
|
||||||
|
|
|
@ -278,9 +278,9 @@ import template from './imageeditor.template.html';
|
||||||
const apiClient = ServerConnections.getApiClient(serverId);
|
const apiClient = ServerConnections.getApiClient(serverId);
|
||||||
|
|
||||||
const type = imageCard.getAttribute('data-imagetype');
|
const type = imageCard.getAttribute('data-imagetype');
|
||||||
const index = parseInt(imageCard.getAttribute('data-index'));
|
const index = parseInt(imageCard.getAttribute('data-index'), 10);
|
||||||
const providerCount = parseInt(imageCard.getAttribute('data-providers'));
|
const providerCount = parseInt(imageCard.getAttribute('data-providers'), 10);
|
||||||
const numImages = parseInt(imageCard.getAttribute('data-numimages'));
|
const numImages = parseInt(imageCard.getAttribute('data-numimages'), 10);
|
||||||
|
|
||||||
import('../actionSheet/actionSheet').then(({default: actionSheet}) => {
|
import('../actionSheet/actionSheet').then(({default: actionSheet}) => {
|
||||||
const commands = [];
|
const commands = [];
|
||||||
|
@ -385,7 +385,7 @@ import template from './imageeditor.template.html';
|
||||||
addListeners(context, 'btnDeleteImage', 'click', function () {
|
addListeners(context, 'btnDeleteImage', 'click', function () {
|
||||||
const type = this.getAttribute('data-imagetype');
|
const type = this.getAttribute('data-imagetype');
|
||||||
let index = this.getAttribute('data-index');
|
let index = this.getAttribute('data-index');
|
||||||
index = index === 'null' ? null : parseInt(index);
|
index = index === 'null' ? null : parseInt(index, 10);
|
||||||
const apiClient = ServerConnections.getApiClient(currentItem.ServerId);
|
const apiClient = ServerConnections.getApiClient(currentItem.ServerId);
|
||||||
deleteImage(context, currentItem.Id, type, index, apiClient, true);
|
deleteImage(context, currentItem.Id, type, index, apiClient, true);
|
||||||
});
|
});
|
||||||
|
|
|
@ -15,7 +15,6 @@ import toast from './toast/toast';
|
||||||
const user = options.user;
|
const user = options.user;
|
||||||
|
|
||||||
const canPlay = playbackManager.canPlay(item);
|
const canPlay = playbackManager.canPlay(item);
|
||||||
const restrictOptions = (browser.operaTv || browser.web0s) && !user.Policy.IsAdministrator;
|
|
||||||
|
|
||||||
const commands = [];
|
const commands = [];
|
||||||
|
|
||||||
|
@ -99,8 +98,8 @@ import toast from './toast/toast';
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!restrictOptions) {
|
if (!browser.tv) {
|
||||||
if (itemHelper.supportsAddingToCollection(item)) {
|
if (itemHelper.supportsAddingToCollection(item) && options.EnableCollectionManagement) {
|
||||||
commands.push({
|
commands.push({
|
||||||
name: globalize.translate('AddToCollection'),
|
name: globalize.translate('AddToCollection'),
|
||||||
id: 'addtocollection',
|
id: 'addtocollection',
|
||||||
|
@ -272,7 +271,7 @@ import toast from './toast/toast';
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!restrictOptions && options.share === true && itemHelper.canShare(item, user)) {
|
if (!browser.tv && options.share === true && itemHelper.canShare(item, user)) {
|
||||||
commands.push({
|
commands.push({
|
||||||
name: globalize.translate('Share'),
|
name: globalize.translate('Share'),
|
||||||
id: 'share',
|
id: 'share',
|
||||||
|
|
|
@ -138,7 +138,7 @@ const attributeDelimiterHtml = layoutManager.tv ? '' : '<span class="hide">: </s
|
||||||
attributes.push(createAttribute(globalize.translate('MediaInfoChannels'), `${stream.Channels} ch`));
|
attributes.push(createAttribute(globalize.translate('MediaInfoChannels'), `${stream.Channels} ch`));
|
||||||
}
|
}
|
||||||
if (stream.BitRate) {
|
if (stream.BitRate) {
|
||||||
attributes.push(createAttribute(globalize.translate('MediaInfoBitrate'), `${parseInt(stream.BitRate / 1000)} kbps`));
|
attributes.push(createAttribute(globalize.translate('MediaInfoBitrate'), `${parseInt(stream.BitRate / 1000, 10)} kbps`));
|
||||||
}
|
}
|
||||||
if (stream.SampleRate) {
|
if (stream.SampleRate) {
|
||||||
attributes.push(createAttribute(globalize.translate('MediaInfoSampleRate'), `${stream.SampleRate} Hz`));
|
attributes.push(createAttribute(globalize.translate('MediaInfoSampleRate'), `${stream.SampleRate} Hz`));
|
||||||
|
|
|
@ -52,7 +52,7 @@ import datetime from '../../scripts/datetime';
|
||||||
|
|
||||||
if (value) {
|
if (value) {
|
||||||
if (identifyField[i].type === 'number') {
|
if (identifyField[i].type === 'number') {
|
||||||
value = parseInt(value);
|
value = parseInt(value, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
lookupInfo[identifyField[i].getAttribute('data-lookup')] = value;
|
lookupInfo[identifyField[i].getAttribute('data-lookup')] = value;
|
||||||
|
@ -123,7 +123,7 @@ import datetime from '../../scripts/datetime';
|
||||||
elem.innerHTML = html;
|
elem.innerHTML = html;
|
||||||
|
|
||||||
function onSearchImageClick() {
|
function onSearchImageClick() {
|
||||||
const index = parseInt(this.getAttribute('data-index'));
|
const index = parseInt(this.getAttribute('data-index'), 10);
|
||||||
|
|
||||||
const currentResult = results[index];
|
const currentResult = results[index];
|
||||||
|
|
||||||
|
|
|
@ -531,7 +531,7 @@ import template from './libraryoptionseditor.template.html';
|
||||||
PreferredMetadataLanguage: parent.querySelector('#selectLanguage').value,
|
PreferredMetadataLanguage: parent.querySelector('#selectLanguage').value,
|
||||||
MetadataCountryCode: parent.querySelector('#selectCountry').value,
|
MetadataCountryCode: parent.querySelector('#selectCountry').value,
|
||||||
SeasonZeroDisplayName: parent.querySelector('#txtSeasonZeroName').value,
|
SeasonZeroDisplayName: parent.querySelector('#txtSeasonZeroName').value,
|
||||||
AutomaticRefreshIntervalDays: parseInt(parent.querySelector('#selectAutoRefreshInterval').value),
|
AutomaticRefreshIntervalDays: parseInt(parent.querySelector('#selectAutoRefreshInterval').value, 10),
|
||||||
EnableEmbeddedTitles: parent.querySelector('#chkEnableEmbeddedTitles').checked,
|
EnableEmbeddedTitles: parent.querySelector('#chkEnableEmbeddedTitles').checked,
|
||||||
EnableEmbeddedExtrasTitles: parent.querySelector('#chkEnableEmbeddedExtrasTitles').checked,
|
EnableEmbeddedExtrasTitles: parent.querySelector('#chkEnableEmbeddedExtrasTitles').checked,
|
||||||
EnableEmbeddedEpisodeInfos: parent.querySelector('#chkEnableEmbeddedEpisodeInfos').checked,
|
EnableEmbeddedEpisodeInfos: parent.querySelector('#chkEnableEmbeddedEpisodeInfos').checked,
|
||||||
|
|
|
@ -168,7 +168,7 @@ import template from './mediaLibraryCreator.template.html';
|
||||||
|
|
||||||
function onRemoveClick(e) {
|
function onRemoveClick(e) {
|
||||||
const button = dom.parentWithClass(e.target, 'btnRemovePath');
|
const button = dom.parentWithClass(e.target, 'btnRemovePath');
|
||||||
const index = parseInt(button.getAttribute('data-index'));
|
const index = parseInt(button.getAttribute('data-index'), 10);
|
||||||
const location = pathInfos[index].Path;
|
const location = pathInfos[index].Path;
|
||||||
const locationLower = location.toLowerCase();
|
const locationLower = location.toLowerCase();
|
||||||
pathInfos = pathInfos.filter(p => {
|
pathInfos = pathInfos.filter(p => {
|
||||||
|
|
|
@ -93,7 +93,7 @@ import template from './mediaLibraryEditor.template.html';
|
||||||
const listItem = dom.parentWithClass(e.target, 'listItem');
|
const listItem = dom.parentWithClass(e.target, 'listItem');
|
||||||
|
|
||||||
if (listItem) {
|
if (listItem) {
|
||||||
const index = parseInt(listItem.getAttribute('data-index'));
|
const index = parseInt(listItem.getAttribute('data-index'), 10);
|
||||||
const pathInfos = (currentOptions.library.LibraryOptions || {}).PathInfos || [];
|
const pathInfos = (currentOptions.library.LibraryOptions || {}).PathInfos || [];
|
||||||
const pathInfo = index == null ? {} : pathInfos[index] || {};
|
const pathInfo = index == null ? {} : pathInfos[index] || {};
|
||||||
const originalPath = pathInfo.Path || (index == null ? null : currentOptions.library.Locations[index]);
|
const originalPath = pathInfo.Path || (index == null ? null : currentOptions.library.Locations[index]);
|
||||||
|
|
|
@ -357,14 +357,14 @@ import template from './metadataEditor.template.html';
|
||||||
let index;
|
let index;
|
||||||
const btnDeletePerson = dom.parentWithClass(e.target, 'btnDeletePerson');
|
const btnDeletePerson = dom.parentWithClass(e.target, 'btnDeletePerson');
|
||||||
if (btnDeletePerson) {
|
if (btnDeletePerson) {
|
||||||
index = parseInt(btnDeletePerson.getAttribute('data-index'));
|
index = parseInt(btnDeletePerson.getAttribute('data-index'), 10);
|
||||||
currentItem.People.splice(index, 1);
|
currentItem.People.splice(index, 1);
|
||||||
populatePeople(context, currentItem.People);
|
populatePeople(context, currentItem.People);
|
||||||
}
|
}
|
||||||
|
|
||||||
const btnEditPerson = dom.parentWithClass(e.target, 'btnEditPerson');
|
const btnEditPerson = dom.parentWithClass(e.target, 'btnEditPerson');
|
||||||
if (btnEditPerson) {
|
if (btnEditPerson) {
|
||||||
index = parseInt(btnEditPerson.getAttribute('data-index'));
|
index = parseInt(btnEditPerson.getAttribute('data-index'), 10);
|
||||||
editPerson(context, currentItem.People[index], index);
|
editPerson(context, currentItem.People[index], index);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -114,8 +114,8 @@ import shell from '../../scripts/shell';
|
||||||
const itemId = item.Id;
|
const itemId = item.Id;
|
||||||
|
|
||||||
// Convert to ms
|
// Convert to ms
|
||||||
const duration = parseInt(item.RunTimeTicks ? (item.RunTimeTicks / 10000) : 0);
|
const duration = parseInt(item.RunTimeTicks ? (item.RunTimeTicks / 10000) : 0, 10);
|
||||||
const currentTime = parseInt(playState.PositionTicks ? (playState.PositionTicks / 10000) : 0);
|
const currentTime = parseInt(playState.PositionTicks ? (playState.PositionTicks / 10000) : 0, 10);
|
||||||
|
|
||||||
const isPaused = playState.IsPaused || false;
|
const isPaused = playState.IsPaused || false;
|
||||||
const canSeek = playState.CanSeek || false;
|
const canSeek = playState.CanSeek || false;
|
||||||
|
@ -247,7 +247,7 @@ import shell from '../../scripts/shell';
|
||||||
navigator.mediaSession.setActionHandler('seekto', function (object) {
|
navigator.mediaSession.setActionHandler('seekto', function (object) {
|
||||||
const item = playbackManager.getPlayerState(currentPlayer).NowPlayingItem;
|
const item = playbackManager.getPlayerState(currentPlayer).NowPlayingItem;
|
||||||
// Convert to ms
|
// Convert to ms
|
||||||
const duration = parseInt(item.RunTimeTicks ? (item.RunTimeTicks / 10000) : 0);
|
const duration = parseInt(item.RunTimeTicks ? (item.RunTimeTicks / 10000) : 0, 10);
|
||||||
const wantedTime = object.seekTime * 1000;
|
const wantedTime = object.seekTime * 1000;
|
||||||
playbackManager.seekPercent(wantedTime / duration * 100, currentPlayer);
|
playbackManager.seekPercent(wantedTime / duration * 100, currentPlayer);
|
||||||
});
|
});
|
||||||
|
|
|
@ -11,6 +11,7 @@ import { appHost } from '../apphost';
|
||||||
import Screenfull from 'screenfull';
|
import Screenfull from 'screenfull';
|
||||||
import ServerConnections from '../ServerConnections';
|
import ServerConnections from '../ServerConnections';
|
||||||
import alert from '../alert';
|
import alert from '../alert';
|
||||||
|
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';
|
||||||
|
|
||||||
|
@ -1693,7 +1694,7 @@ class PlaybackManager {
|
||||||
|
|
||||||
function changeStream(player, ticks, params) {
|
function changeStream(player, ticks, params) {
|
||||||
if (canPlayerSeek(player) && params == null) {
|
if (canPlayerSeek(player) && params == null) {
|
||||||
player.currentTime(parseInt(ticks / 10000));
|
player.currentTime(parseInt(ticks / 10000, 10));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1717,7 +1718,7 @@ class PlaybackManager {
|
||||||
const apiClient = ServerConnections.getApiClient(currentItem.ServerId);
|
const apiClient = ServerConnections.getApiClient(currentItem.ServerId);
|
||||||
|
|
||||||
if (ticks) {
|
if (ticks) {
|
||||||
ticks = parseInt(ticks);
|
ticks = parseInt(ticks, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
const maxBitrate = params.MaxStreamingBitrate || self.getMaxStreamingBitrate(player);
|
const maxBitrate = params.MaxStreamingBitrate || self.getMaxStreamingBitrate(player);
|
||||||
|
@ -2268,7 +2269,7 @@ class PlaybackManager {
|
||||||
|
|
||||||
function runInterceptors(item, playOptions) {
|
function runInterceptors(item, playOptions) {
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
const interceptors = pluginManager.ofType('preplayintercept');
|
const interceptors = pluginManager.ofType(PluginType.PreplayIntercept);
|
||||||
|
|
||||||
interceptors.sort(function (a, b) {
|
interceptors.sort(function (a, b) {
|
||||||
return (a.order || 0) - (b.order || 0);
|
return (a.order || 0) - (b.order || 0);
|
||||||
|
@ -3429,12 +3430,12 @@ class PlaybackManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
Events.on(pluginManager, 'registered', function (e, plugin) {
|
Events.on(pluginManager, 'registered', function (e, plugin) {
|
||||||
if (plugin.type === 'mediaplayer') {
|
if (plugin.type === PluginType.MediaPlayer) {
|
||||||
initMediaPlayer(plugin);
|
initMediaPlayer(plugin);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
pluginManager.ofType('mediaplayer').forEach(initMediaPlayer);
|
pluginManager.ofType(PluginType.MediaPlayer).forEach(initMediaPlayer);
|
||||||
|
|
||||||
function sendProgressUpdate(player, progressEventName, reportPlaylist) {
|
function sendProgressUpdate(player, progressEventName, reportPlaylist) {
|
||||||
if (!player) {
|
if (!player) {
|
||||||
|
@ -3649,7 +3650,7 @@ class PlaybackManager {
|
||||||
|
|
||||||
percent /= 100;
|
percent /= 100;
|
||||||
ticks *= percent;
|
ticks *= percent;
|
||||||
this.seek(parseInt(ticks), player);
|
this.seek(parseInt(ticks, 10), player);
|
||||||
}
|
}
|
||||||
|
|
||||||
seekMs(ms, player = this._currentPlayer) {
|
seekMs(ms, player = this._currentPlayer) {
|
||||||
|
@ -4036,13 +4037,13 @@ class PlaybackManager {
|
||||||
this.setBrightness(cmd.Arguments.Brightness, player);
|
this.setBrightness(cmd.Arguments.Brightness, player);
|
||||||
break;
|
break;
|
||||||
case 'SetAudioStreamIndex':
|
case 'SetAudioStreamIndex':
|
||||||
this.setAudioStreamIndex(parseInt(cmd.Arguments.Index), player);
|
this.setAudioStreamIndex(parseInt(cmd.Arguments.Index, 10), player);
|
||||||
break;
|
break;
|
||||||
case 'SetSubtitleStreamIndex':
|
case 'SetSubtitleStreamIndex':
|
||||||
this.setSubtitleStreamIndex(parseInt(cmd.Arguments.Index), player);
|
this.setSubtitleStreamIndex(parseInt(cmd.Arguments.Index, 10), player);
|
||||||
break;
|
break;
|
||||||
case 'SetMaxStreamingBitrate':
|
case 'SetMaxStreamingBitrate':
|
||||||
this.setMaxStreamingBitrate(parseInt(cmd.Arguments.Bitrate), player);
|
this.setMaxStreamingBitrate(parseInt(cmd.Arguments.Bitrate, 10), player);
|
||||||
break;
|
break;
|
||||||
case 'ToggleFullscreen':
|
case 'ToggleFullscreen':
|
||||||
this.toggleFullscreen(player);
|
this.toggleFullscreen(player);
|
||||||
|
|
|
@ -43,7 +43,7 @@ function showQualityMenu(player, btn) {
|
||||||
items: menuItems,
|
items: menuItems,
|
||||||
positionTo: btn
|
positionTo: btn
|
||||||
}).then(function (id) {
|
}).then(function (id) {
|
||||||
const bitrate = parseInt(id);
|
const bitrate = parseInt(id, 10);
|
||||||
if (bitrate !== selectedBitrate) {
|
if (bitrate !== selectedBitrate) {
|
||||||
playbackManager.setMaxStreamingBitrate({
|
playbackManager.setMaxStreamingBitrate({
|
||||||
enableAutomaticBitrateDetection: bitrate ? false : true,
|
enableAutomaticBitrateDetection: bitrate ? false : true,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/*eslint prefer-const: "error"*/
|
import { randomInt } from '../../utils/number.ts';
|
||||||
|
|
||||||
let currentId = 0;
|
let currentId = 0;
|
||||||
function addUniquePlaylistItemId(item) {
|
function addUniquePlaylistItemId(item) {
|
||||||
|
@ -58,7 +58,7 @@ class PlayQueueManager {
|
||||||
const currentPlaylistItem = this._playlist.splice(this.getCurrentPlaylistIndex(), 1)[0];
|
const currentPlaylistItem = this._playlist.splice(this.getCurrentPlaylistIndex(), 1)[0];
|
||||||
|
|
||||||
for (let i = this._playlist.length - 1; i > 0; i--) {
|
for (let i = this._playlist.length - 1; i > 0; i--) {
|
||||||
const j = Math.floor(Math.random() * i);
|
const j = randomInt(0, i - 1);
|
||||||
const temp = this._playlist[i];
|
const temp = this._playlist[i];
|
||||||
this._playlist[i] = this._playlist[j];
|
this._playlist[i] = this._playlist[j];
|
||||||
this._playlist[j] = temp;
|
this._playlist[j] = temp;
|
||||||
|
|
|
@ -12,8 +12,6 @@ import ServerConnections from '../ServerConnections';
|
||||||
import toast from '../toast/toast';
|
import toast from '../toast/toast';
|
||||||
import template from './recordingfields.template.html';
|
import template from './recordingfields.template.html';
|
||||||
|
|
||||||
/*eslint prefer-const: "error"*/
|
|
||||||
|
|
||||||
function loadData(parent, program) {
|
function loadData(parent, program) {
|
||||||
if (program.IsSeries) {
|
if (program.IsSeries) {
|
||||||
parent.querySelector('.recordSeriesContainer').classList.remove('hide');
|
parent.querySelector('.recordSeriesContainer').classList.remove('hide');
|
||||||
|
|
|
@ -5,8 +5,6 @@ import toast from '../toast/toast';
|
||||||
import confirm from '../confirm/confirm';
|
import confirm from '../confirm/confirm';
|
||||||
import dialog from '../dialog/dialog';
|
import dialog from '../dialog/dialog';
|
||||||
|
|
||||||
/*eslint prefer-const: "error"*/
|
|
||||||
|
|
||||||
function changeRecordingToSeries(apiClient, timerId, programId, confirmTimerCancellation) {
|
function changeRecordingToSeries(apiClient, timerId, programId, confirmTimerCancellation) {
|
||||||
loading.show();
|
loading.show();
|
||||||
|
|
||||||
|
|
|
@ -17,8 +17,6 @@ import '../../styles/flexstyles.scss';
|
||||||
import ServerConnections from '../ServerConnections';
|
import ServerConnections from '../ServerConnections';
|
||||||
import template from './seriesrecordingeditor.template.html';
|
import template from './seriesrecordingeditor.template.html';
|
||||||
|
|
||||||
/*eslint prefer-const: "error"*/
|
|
||||||
|
|
||||||
let currentDialog;
|
let currentDialog;
|
||||||
let recordingUpdated = false;
|
let recordingUpdated = false;
|
||||||
let recordingDeleted = false;
|
let recordingDeleted = false;
|
||||||
|
|
|
@ -13,8 +13,6 @@ import '../formdialog.scss';
|
||||||
import ServerConnections from '../ServerConnections';
|
import ServerConnections from '../ServerConnections';
|
||||||
import toast from '../toast/toast';
|
import toast from '../toast/toast';
|
||||||
|
|
||||||
/*eslint prefer-const: "error"*/
|
|
||||||
|
|
||||||
function getEditorHtml() {
|
function getEditorHtml() {
|
||||||
let html = '';
|
let html = '';
|
||||||
|
|
||||||
|
|
|
@ -20,8 +20,6 @@ import ServerConnections from '../ServerConnections';
|
||||||
import toast from '../toast/toast';
|
import toast from '../toast/toast';
|
||||||
import { appRouter } from '../appRouter';
|
import { appRouter } from '../appRouter';
|
||||||
|
|
||||||
/*eslint prefer-const: "error"*/
|
|
||||||
|
|
||||||
let showMuteButton = true;
|
let showMuteButton = true;
|
||||||
let showVolumeSlider = true;
|
let showVolumeSlider = true;
|
||||||
|
|
||||||
|
@ -46,7 +44,7 @@ function showAudioMenu(context, player, button) {
|
||||||
items: menuItems,
|
items: menuItems,
|
||||||
positionTo: button,
|
positionTo: button,
|
||||||
callback: function (id) {
|
callback: function (id) {
|
||||||
playbackManager.setAudioStreamIndex(parseInt(id), player);
|
playbackManager.setAudioStreamIndex(parseInt(id, 10), player);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -78,7 +76,7 @@ function showSubtitleMenu(context, player, button) {
|
||||||
items: menuItems,
|
items: menuItems,
|
||||||
positionTo: button,
|
positionTo: button,
|
||||||
callback: function (id) {
|
callback: function (id) {
|
||||||
playbackManager.setSubtitleStreamIndex(parseInt(id), player);
|
playbackManager.setSubtitleStreamIndex(parseInt(id, 10), player);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -150,7 +150,7 @@ import toast from './toast/toast';
|
||||||
StartDate: card.getAttribute('data-startdate'),
|
StartDate: card.getAttribute('data-startdate'),
|
||||||
EndDate: card.getAttribute('data-enddate'),
|
EndDate: card.getAttribute('data-enddate'),
|
||||||
UserData: {
|
UserData: {
|
||||||
PlaybackPositionTicks: parseInt(card.getAttribute('data-positionticks') || '0')
|
PlaybackPositionTicks: parseInt(card.getAttribute('data-positionticks') || '0', 10)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -201,7 +201,7 @@ import toast from './toast/toast';
|
||||||
ServerId: serverId
|
ServerId: serverId
|
||||||
});
|
});
|
||||||
} else if (action === 'play' || action === 'resume') {
|
} else if (action === 'play' || action === 'resume') {
|
||||||
const startPositionTicks = parseInt(card.getAttribute('data-positionticks') || '0');
|
const startPositionTicks = parseInt(card.getAttribute('data-positionticks') || '0', 10);
|
||||||
|
|
||||||
if (playbackManager.canPlay(item)) {
|
if (playbackManager.canPlay(item)) {
|
||||||
playbackManager.play({
|
playbackManager.play({
|
||||||
|
|
|
@ -100,7 +100,7 @@ import { getParameterByName } from '../../../utils/url.ts';
|
||||||
}).join('') + '</div>';
|
}).join('') + '</div>';
|
||||||
const elem = $('.httpHeaderIdentificationList', page).html(html).trigger('create');
|
const elem = $('.httpHeaderIdentificationList', page).html(html).trigger('create');
|
||||||
$('.btnDeleteIdentificationHeader', elem).on('click', function () {
|
$('.btnDeleteIdentificationHeader', elem).on('click', function () {
|
||||||
const itemIndex = parseInt(this.getAttribute('data-index'));
|
const itemIndex = parseInt(this.getAttribute('data-index'), 10);
|
||||||
currentProfile.Identification.Headers.splice(itemIndex, 1);
|
currentProfile.Identification.Headers.splice(itemIndex, 1);
|
||||||
renderIdentificationHeaders(page, currentProfile.Identification.Headers);
|
renderIdentificationHeaders(page, currentProfile.Identification.Headers);
|
||||||
});
|
});
|
||||||
|
@ -154,7 +154,7 @@ import { getParameterByName } from '../../../utils/url.ts';
|
||||||
}).join('') + '</div>';
|
}).join('') + '</div>';
|
||||||
const elem = $('.xmlDocumentAttributeList', page).html(html).trigger('create');
|
const elem = $('.xmlDocumentAttributeList', page).html(html).trigger('create');
|
||||||
$('.btnDeleteXmlAttribute', elem).on('click', function () {
|
$('.btnDeleteXmlAttribute', elem).on('click', function () {
|
||||||
const itemIndex = parseInt(this.getAttribute('data-index'));
|
const itemIndex = parseInt(this.getAttribute('data-index'), 10);
|
||||||
currentProfile.XmlRootAttributes.splice(itemIndex, 1);
|
currentProfile.XmlRootAttributes.splice(itemIndex, 1);
|
||||||
renderXmlDocumentAttributes(page, currentProfile.XmlRootAttributes);
|
renderXmlDocumentAttributes(page, currentProfile.XmlRootAttributes);
|
||||||
});
|
});
|
||||||
|
@ -198,12 +198,12 @@ import { getParameterByName } from '../../../utils/url.ts';
|
||||||
}).join('') + '</div>';
|
}).join('') + '</div>';
|
||||||
const elem = $('.subtitleProfileList', page).html(html).trigger('create');
|
const elem = $('.subtitleProfileList', page).html(html).trigger('create');
|
||||||
$('.btnDeleteProfile', elem).on('click', function () {
|
$('.btnDeleteProfile', elem).on('click', function () {
|
||||||
const itemIndex = parseInt(this.getAttribute('data-index'));
|
const itemIndex = parseInt(this.getAttribute('data-index'), 10);
|
||||||
currentProfile.SubtitleProfiles.splice(itemIndex, 1);
|
currentProfile.SubtitleProfiles.splice(itemIndex, 1);
|
||||||
renderSubtitleProfiles(page, currentProfile.SubtitleProfiles);
|
renderSubtitleProfiles(page, currentProfile.SubtitleProfiles);
|
||||||
});
|
});
|
||||||
$('.lnkEditSubProfile', elem).on('click', function () {
|
$('.lnkEditSubProfile', elem).on('click', function () {
|
||||||
const itemIndex = parseInt(this.getAttribute('data-index'));
|
const itemIndex = parseInt(this.getAttribute('data-index'), 10);
|
||||||
editSubtitleProfile(page, currentProfile.SubtitleProfiles[itemIndex]);
|
editSubtitleProfile(page, currentProfile.SubtitleProfiles[itemIndex]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -292,7 +292,7 @@ import { getParameterByName } from '../../../utils/url.ts';
|
||||||
deleteDirectPlayProfile(page, index);
|
deleteDirectPlayProfile(page, index);
|
||||||
});
|
});
|
||||||
$('.lnkEditSubProfile', elem).on('click', function () {
|
$('.lnkEditSubProfile', elem).on('click', function () {
|
||||||
const index = parseInt(this.getAttribute('data-profileindex'));
|
const index = parseInt(this.getAttribute('data-profileindex'), 10);
|
||||||
editDirectPlayProfile(page, currentProfile.DirectPlayProfiles[index]);
|
editDirectPlayProfile(page, currentProfile.DirectPlayProfiles[index]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -353,7 +353,7 @@ import { getParameterByName } from '../../../utils/url.ts';
|
||||||
deleteTranscodingProfile(page, index);
|
deleteTranscodingProfile(page, index);
|
||||||
});
|
});
|
||||||
$('.lnkEditSubProfile', elem).on('click', function () {
|
$('.lnkEditSubProfile', elem).on('click', function () {
|
||||||
const index = parseInt(this.getAttribute('data-profileindex'));
|
const index = parseInt(this.getAttribute('data-profileindex'), 10);
|
||||||
editTranscodingProfile(page, currentProfile.TranscodingProfiles[index]);
|
editTranscodingProfile(page, currentProfile.TranscodingProfiles[index]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -437,7 +437,7 @@ import { getParameterByName } from '../../../utils/url.ts';
|
||||||
deleteContainerProfile(page, index);
|
deleteContainerProfile(page, index);
|
||||||
});
|
});
|
||||||
$('.lnkEditSubProfile', elem).on('click', function () {
|
$('.lnkEditSubProfile', elem).on('click', function () {
|
||||||
const index = parseInt(this.getAttribute('data-profileindex'));
|
const index = parseInt(this.getAttribute('data-profileindex'), 10);
|
||||||
editContainerProfile(page, currentProfile.ContainerProfiles[index]);
|
editContainerProfile(page, currentProfile.ContainerProfiles[index]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -509,7 +509,7 @@ import { getParameterByName } from '../../../utils/url.ts';
|
||||||
deleteCodecProfile(page, index);
|
deleteCodecProfile(page, index);
|
||||||
});
|
});
|
||||||
$('.lnkEditSubProfile', elem).on('click', function () {
|
$('.lnkEditSubProfile', elem).on('click', function () {
|
||||||
const index = parseInt(this.getAttribute('data-profileindex'));
|
const index = parseInt(this.getAttribute('data-profileindex'), 10);
|
||||||
editCodecProfile(page, currentProfile.CodecProfiles[index]);
|
editCodecProfile(page, currentProfile.CodecProfiles[index]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -589,7 +589,7 @@ import { getParameterByName } from '../../../utils/url.ts';
|
||||||
deleteResponseProfile(page, index);
|
deleteResponseProfile(page, index);
|
||||||
});
|
});
|
||||||
$('.lnkEditSubProfile', elem).on('click', function () {
|
$('.lnkEditSubProfile', elem).on('click', function () {
|
||||||
const index = parseInt(this.getAttribute('data-profileindex'));
|
const index = parseInt(this.getAttribute('data-profileindex'), 10);
|
||||||
editResponseProfile(page, currentProfile.ResponseProfiles[index]);
|
editResponseProfile(page, currentProfile.ResponseProfiles[index]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,8 +98,8 @@ import alert from '../../components/alert';
|
||||||
config.VppTonemappingBrightness = form.querySelector('#txtVppTonemappingBrightness').value;
|
config.VppTonemappingBrightness = form.querySelector('#txtVppTonemappingBrightness').value;
|
||||||
config.VppTonemappingContrast = form.querySelector('#txtVppTonemappingContrast').value;
|
config.VppTonemappingContrast = form.querySelector('#txtVppTonemappingContrast').value;
|
||||||
config.EncoderPreset = form.querySelector('#selectEncoderPreset').value;
|
config.EncoderPreset = form.querySelector('#selectEncoderPreset').value;
|
||||||
config.H264Crf = parseInt(form.querySelector('#txtH264Crf').value || '0');
|
config.H264Crf = parseInt(form.querySelector('#txtH264Crf').value || '0', 10);
|
||||||
config.H265Crf = parseInt(form.querySelector('#txtH265Crf').value || '0');
|
config.H265Crf = parseInt(form.querySelector('#txtH265Crf').value || '0', 10);
|
||||||
config.DeinterlaceMethod = form.querySelector('#selectDeinterlaceMethod').value;
|
config.DeinterlaceMethod = form.querySelector('#selectDeinterlaceMethod').value;
|
||||||
config.DeinterlaceDoubleRate = form.querySelector('#chkDoubleRateDeinterlacing').checked;
|
config.DeinterlaceDoubleRate = form.querySelector('#chkDoubleRateDeinterlacing').checked;
|
||||||
config.EnableSubtitleExtraction = form.querySelector('#chkEnableSubtitleExtraction').checked;
|
config.EnableSubtitleExtraction = form.querySelector('#chkEnableSubtitleExtraction').checked;
|
||||||
|
|
|
@ -92,7 +92,7 @@ import cardBuilder from '../../components/cardbuilder/cardBuilder';
|
||||||
|
|
||||||
function showCardMenu(page, elem, virtualFolders) {
|
function showCardMenu(page, elem, virtualFolders) {
|
||||||
const card = dom.parentWithClass(elem, 'card');
|
const card = dom.parentWithClass(elem, 'card');
|
||||||
const index = parseInt(card.getAttribute('data-index'));
|
const index = parseInt(card.getAttribute('data-index'), 10);
|
||||||
const virtualFolder = virtualFolders[index];
|
const virtualFolder = virtualFolders[index];
|
||||||
const menuItems = [];
|
const menuItems = [];
|
||||||
menuItems.push({
|
menuItems.push({
|
||||||
|
@ -192,7 +192,7 @@ import cardBuilder from '../../components/cardbuilder/cardBuilder';
|
||||||
});
|
});
|
||||||
$('.editLibrary', divVirtualFolders).on('click', function () {
|
$('.editLibrary', divVirtualFolders).on('click', function () {
|
||||||
const card = $(this).parents('.card')[0];
|
const card = $(this).parents('.card')[0];
|
||||||
const index = parseInt(card.getAttribute('data-index'));
|
const index = parseInt(card.getAttribute('data-index'), 10);
|
||||||
const virtualFolder = virtualFolders[index];
|
const virtualFolder = virtualFolders[index];
|
||||||
|
|
||||||
if (virtualFolder.ItemId) {
|
if (virtualFolder.ItemId) {
|
||||||
|
|
|
@ -235,7 +235,7 @@ import { getParameterByName } from '../../../utils/url.ts';
|
||||||
const btnDeleteTrigger = dom.parentWithClass(e.target, 'btnDeleteTrigger');
|
const btnDeleteTrigger = dom.parentWithClass(e.target, 'btnDeleteTrigger');
|
||||||
|
|
||||||
if (btnDeleteTrigger) {
|
if (btnDeleteTrigger) {
|
||||||
ScheduledTaskPage.confirmDeleteTrigger(view, parseInt(btnDeleteTrigger.getAttribute('data-index')));
|
ScheduledTaskPage.confirmDeleteTrigger(view, parseInt(btnDeleteTrigger.getAttribute('data-index'), 10));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
view.addEventListener('viewshow', function () {
|
view.addEventListener('viewshow', function () {
|
||||||
|
|
|
@ -15,7 +15,7 @@ import Dashboard from '../../utils/dashboard';
|
||||||
loading.show();
|
loading.show();
|
||||||
const form = this;
|
const form = this;
|
||||||
ApiClient.getServerConfiguration().then(function (config) {
|
ApiClient.getServerConfiguration().then(function (config) {
|
||||||
config.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($('#txtRemoteClientBitrateLimit', form).val() || '0'));
|
config.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($('#txtRemoteClientBitrateLimit', form).val() || '0'), 10);
|
||||||
ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult);
|
ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -222,17 +222,17 @@ export default function (view, params) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function onBeforeTabChange(evt) {
|
function onBeforeTabChange(evt) {
|
||||||
preLoadTab(view, parseInt(evt.detail.selectedTabIndex));
|
preLoadTab(view, parseInt(evt.detail.selectedTabIndex, 10));
|
||||||
}
|
}
|
||||||
|
|
||||||
function onTabChange(evt) {
|
function onTabChange(evt) {
|
||||||
const previousTabController = tabControllers[parseInt(evt.detail.previousIndex)];
|
const previousTabController = tabControllers[parseInt(evt.detail.previousIndex, 10)];
|
||||||
|
|
||||||
if (previousTabController && previousTabController.onHide) {
|
if (previousTabController && previousTabController.onHide) {
|
||||||
previousTabController.onHide();
|
previousTabController.onHide();
|
||||||
}
|
}
|
||||||
|
|
||||||
loadTab(view, parseInt(evt.detail.selectedTabIndex));
|
loadTab(view, parseInt(evt.detail.selectedTabIndex, 10));
|
||||||
}
|
}
|
||||||
|
|
||||||
function getTabContainers() {
|
function getTabContainers() {
|
||||||
|
@ -339,7 +339,7 @@ export default function (view, params) {
|
||||||
|
|
||||||
let isViewRestored;
|
let isViewRestored;
|
||||||
const self = this;
|
const self = this;
|
||||||
let currentTabIndex = parseInt(params.tab || getDefaultTabIndex('livetv'));
|
let currentTabIndex = parseInt(params.tab || getDefaultTabIndex('livetv'), 10);
|
||||||
let initialTabIndex = currentTabIndex;
|
let initialTabIndex = currentTabIndex;
|
||||||
let lastFullRender = 0;
|
let lastFullRender = 0;
|
||||||
[].forEach.call(view.querySelectorAll('.sectionTitleTextButton-programs'), function (link) {
|
[].forEach.call(view.querySelectorAll('.sectionTitleTextButton-programs'), function (link) {
|
||||||
|
|
|
@ -245,11 +245,11 @@ import Dashboard from '../../utils/dashboard';
|
||||||
}
|
}
|
||||||
|
|
||||||
function onBeforeTabChange(e) {
|
function onBeforeTabChange(e) {
|
||||||
preLoadTab(view, parseInt(e.detail.selectedTabIndex));
|
preLoadTab(view, parseInt(e.detail.selectedTabIndex, 10));
|
||||||
}
|
}
|
||||||
|
|
||||||
function onTabChange(e) {
|
function onTabChange(e) {
|
||||||
loadTab(view, parseInt(e.detail.selectedTabIndex));
|
loadTab(view, parseInt(e.detail.selectedTabIndex, 10));
|
||||||
}
|
}
|
||||||
|
|
||||||
function getTabContainers() {
|
function getTabContainers() {
|
||||||
|
@ -350,7 +350,7 @@ import Dashboard from '../../utils/dashboard';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId));
|
let currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId), 10);
|
||||||
const suggestionsTabIndex = 1;
|
const suggestionsTabIndex = 1;
|
||||||
|
|
||||||
this.initTab = function () {
|
this.initTab = function () {
|
||||||
|
|
|
@ -975,7 +975,7 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components
|
||||||
title: globalize.translate('Audio'),
|
title: globalize.translate('Audio'),
|
||||||
positionTo: positionTo
|
positionTo: positionTo
|
||||||
}).then(function (id) {
|
}).then(function (id) {
|
||||||
const index = parseInt(id);
|
const index = parseInt(id, 10);
|
||||||
|
|
||||||
if (index !== currentIndex) {
|
if (index !== currentIndex) {
|
||||||
playbackManager.setAudioStreamIndex(index, player);
|
playbackManager.setAudioStreamIndex(index, player);
|
||||||
|
@ -1022,7 +1022,7 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components
|
||||||
positionTo
|
positionTo
|
||||||
}).then(function (id) {
|
}).then(function (id) {
|
||||||
if (id) {
|
if (id) {
|
||||||
const index = parseInt(id);
|
const index = parseInt(id, 10);
|
||||||
if (index !== currentIndex) {
|
if (index !== currentIndex) {
|
||||||
playbackManager.setSecondarySubtitleStreamIndex(index, player);
|
playbackManager.setSecondarySubtitleStreamIndex(index, player);
|
||||||
}
|
}
|
||||||
|
@ -1099,7 +1099,7 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components
|
||||||
console.error(e);
|
console.error(e);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const index = parseInt(id);
|
const index = parseInt(id, 10);
|
||||||
|
|
||||||
if (index !== currentIndex) {
|
if (index !== currentIndex) {
|
||||||
playbackManager.setSubtitleStreamIndex(index, player);
|
playbackManager.setSubtitleStreamIndex(index, player);
|
||||||
|
@ -1633,7 +1633,7 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components
|
||||||
ms /= 100;
|
ms /= 100;
|
||||||
ms *= value;
|
ms *= value;
|
||||||
ms += programStartDateMs;
|
ms += programStartDateMs;
|
||||||
return '<h1 class="sliderBubbleText">' + getDisplayTimeWithoutAmPm(new Date(parseInt(ms)), true) + '</h1>';
|
return '<h1 class="sliderBubbleText">' + getDisplayTimeWithoutAmPm(new Date(parseInt(ms, 10)), true) + '</h1>';
|
||||||
}
|
}
|
||||||
|
|
||||||
return '--:--';
|
return '--:--';
|
||||||
|
|
|
@ -224,11 +224,11 @@ import autoFocuser from '../../components/autoFocuser';
|
||||||
|
|
||||||
export default function (view, params) {
|
export default function (view, params) {
|
||||||
function onBeforeTabChange(e) {
|
function onBeforeTabChange(e) {
|
||||||
preLoadTab(view, parseInt(e.detail.selectedTabIndex));
|
preLoadTab(view, parseInt(e.detail.selectedTabIndex, 10));
|
||||||
}
|
}
|
||||||
|
|
||||||
function onTabChange(e) {
|
function onTabChange(e) {
|
||||||
const newIndex = parseInt(e.detail.selectedTabIndex);
|
const newIndex = parseInt(e.detail.selectedTabIndex, 10);
|
||||||
loadTab(view, newIndex);
|
loadTab(view, newIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -340,7 +340,7 @@ import autoFocuser from '../../components/autoFocuser';
|
||||||
}
|
}
|
||||||
|
|
||||||
const self = this;
|
const self = this;
|
||||||
let currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId));
|
let currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId), 10);
|
||||||
const suggestionsTabIndex = 1;
|
const suggestionsTabIndex = 1;
|
||||||
|
|
||||||
self.initTab = function () {
|
self.initTab = function () {
|
||||||
|
|
|
@ -414,7 +414,7 @@ import Sortable from 'sortablejs';
|
||||||
clearRefreshInterval(itemsContainer);
|
clearRefreshInterval(itemsContainer);
|
||||||
|
|
||||||
if (!intervalMs) {
|
if (!intervalMs) {
|
||||||
intervalMs = parseInt(itemsContainer.getAttribute('data-refreshinterval') || '0');
|
intervalMs = parseInt(itemsContainer.getAttribute('data-refreshinterval') || '0', 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (intervalMs) {
|
if (intervalMs) {
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
const ProgressBarPrototype = Object.create(HTMLDivElement.prototype);
|
const ProgressBarPrototype = Object.create(HTMLDivElement.prototype);
|
||||||
|
|
||||||
function onAutoTimeProgress() {
|
function onAutoTimeProgress() {
|
||||||
const start = parseInt(this.getAttribute('data-starttime'));
|
const start = parseInt(this.getAttribute('data-starttime'), 10);
|
||||||
const end = parseInt(this.getAttribute('data-endtime'));
|
const end = parseInt(this.getAttribute('data-endtime'), 10);
|
||||||
|
|
||||||
const now = new Date().getTime();
|
const now = new Date().getTime();
|
||||||
const total = end - start;
|
const total = end - start;
|
||||||
|
|
|
@ -91,7 +91,7 @@ const EmbyScrollButtonsPrototype = Object.create(HTMLDivElement.prototype);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
value = parseInt(value);
|
value = parseInt(value, 10);
|
||||||
if (isNaN(value)) {
|
if (isNaN(value)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,7 +75,7 @@ const Scroller: FC<ScrollerProps> = ({
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isNaN(parseInt(value))) {
|
if (isNaN(parseInt(value, 10))) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -75,11 +75,11 @@ import '../../styles/scrollstyles.scss';
|
||||||
current.classList.remove(activeButtonClass);
|
current.classList.remove(activeButtonClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
const previousIndex = current ? parseInt(current.getAttribute('data-index')) : null;
|
const previousIndex = current ? parseInt(current.getAttribute('data-index'), 10) : null;
|
||||||
|
|
||||||
setActiveTabButton(tabButton);
|
setActiveTabButton(tabButton);
|
||||||
|
|
||||||
const index = parseInt(tabButton.getAttribute('data-index'));
|
const index = parseInt(tabButton.getAttribute('data-index'), 10);
|
||||||
|
|
||||||
triggerBeforeTabChange(tabs, index, previousIndex);
|
triggerBeforeTabChange(tabs, index, previousIndex);
|
||||||
|
|
||||||
|
@ -194,7 +194,7 @@ import '../../styles/scrollstyles.scss';
|
||||||
initScroller(this);
|
initScroller(this);
|
||||||
|
|
||||||
const current = this.querySelector('.' + activeButtonClass);
|
const current = this.querySelector('.' + activeButtonClass);
|
||||||
const currentIndex = current ? parseInt(current.getAttribute('data-index')) : parseInt(this.getAttribute('data-index') || '0');
|
const currentIndex = current ? parseInt(current.getAttribute('data-index'), 10) : parseInt(this.getAttribute('data-index') || '0', 10);
|
||||||
|
|
||||||
if (currentIndex !== -1) {
|
if (currentIndex !== -1) {
|
||||||
this.selectedTabIndex = currentIndex;
|
this.selectedTabIndex = currentIndex;
|
||||||
|
|
|
@ -14,7 +14,7 @@ function calculateOffset(textarea) {
|
||||||
let offset = 0;
|
let offset = 0;
|
||||||
|
|
||||||
for (let i = 0; i < props.length; i++) {
|
for (let i = 0; i < props.length; i++) {
|
||||||
offset += parseInt(style[props[i]]);
|
offset += parseInt(style[props[i]], 10);
|
||||||
}
|
}
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
/* eslint-disable indent */
|
/* eslint-disable indent */
|
||||||
import ServerConnections from '../../components/ServerConnections';
|
import ServerConnections from '../../components/ServerConnections';
|
||||||
|
import { PluginType } from '../../types/plugin.ts';
|
||||||
|
|
||||||
class BackdropScreensaver {
|
class BackdropScreensaver {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.name = 'Backdrop ScreenSaver';
|
this.name = 'Backdrop ScreenSaver';
|
||||||
this.type = 'screensaver';
|
this.type = PluginType.Screensaver;
|
||||||
this.id = 'backdropscreensaver';
|
this.id = 'backdropscreensaver';
|
||||||
this.supportsAnonymous = false;
|
this.supportsAnonymous = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ import TableOfContents from './tableOfContents';
|
||||||
import dom from '../../scripts/dom';
|
import dom from '../../scripts/dom';
|
||||||
import { translateHtml } from '../../scripts/globalize';
|
import { translateHtml } from '../../scripts/globalize';
|
||||||
import * as userSettings from '../../scripts/settings/userSettings';
|
import * as userSettings from '../../scripts/settings/userSettings';
|
||||||
|
import { PluginType } from '../../types/plugin.ts';
|
||||||
import Events from '../../utils/events.ts';
|
import Events from '../../utils/events.ts';
|
||||||
|
|
||||||
import '../../elements/emby-button/paper-icon-button-light';
|
import '../../elements/emby-button/paper-icon-button-light';
|
||||||
|
@ -19,7 +20,7 @@ import './style.scss';
|
||||||
export class BookPlayer {
|
export class BookPlayer {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.name = 'Book Player';
|
this.name = 'Book Player';
|
||||||
this.type = 'mediaplayer';
|
this.type = PluginType.MediaPlayer;
|
||||||
this.id = 'bookplayer';
|
this.id = 'bookplayer';
|
||||||
this.priority = 1;
|
this.priority = 1;
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ import globalize from '../../scripts/globalize';
|
||||||
import castSenderApiLoader from './castSenderApi';
|
import castSenderApiLoader from './castSenderApi';
|
||||||
import ServerConnections from '../../components/ServerConnections';
|
import ServerConnections from '../../components/ServerConnections';
|
||||||
import alert from '../../components/alert';
|
import alert from '../../components/alert';
|
||||||
|
import { PluginType } from '../../types/plugin.ts';
|
||||||
import Events from '../../utils/events.ts';
|
import Events from '../../utils/events.ts';
|
||||||
import { getItems } from '../../utils/jellyfin-apiclient/getItems.ts';
|
import { getItems } from '../../utils/jellyfin-apiclient/getItems.ts';
|
||||||
|
|
||||||
|
@ -572,7 +573,7 @@ class ChromecastPlayer {
|
||||||
constructor() {
|
constructor() {
|
||||||
// playbackManager needs this
|
// playbackManager needs this
|
||||||
this.name = PlayerName;
|
this.name = PlayerName;
|
||||||
this.type = 'mediaplayer';
|
this.type = PluginType.MediaPlayer;
|
||||||
this.id = 'chromecast';
|
this.id = 'chromecast';
|
||||||
this.isLocalPlayer = false;
|
this.isLocalPlayer = false;
|
||||||
this.lastPlayerData = {};
|
this.lastPlayerData = {};
|
||||||
|
@ -686,7 +687,7 @@ class ChromecastPlayer {
|
||||||
}
|
}
|
||||||
|
|
||||||
seek(position) {
|
seek(position) {
|
||||||
position = parseInt(position);
|
position = parseInt(position, 10);
|
||||||
|
|
||||||
position = position / 10000000;
|
position = position / 10000000;
|
||||||
|
|
||||||
|
|
|
@ -6,13 +6,14 @@ import keyboardnavigation from '../../scripts/keyboardNavigation';
|
||||||
import { appRouter } from '../../components/appRouter';
|
import { appRouter } from '../../components/appRouter';
|
||||||
import ServerConnections from '../../components/ServerConnections';
|
import ServerConnections from '../../components/ServerConnections';
|
||||||
import * as userSettings from '../../scripts/settings/userSettings';
|
import * as userSettings from '../../scripts/settings/userSettings';
|
||||||
|
import { PluginType } from '../../types/plugin.ts';
|
||||||
|
|
||||||
import './style.scss';
|
import './style.scss';
|
||||||
|
|
||||||
export class ComicsPlayer {
|
export class ComicsPlayer {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.name = 'Comics Player';
|
this.name = 'Comics Player';
|
||||||
this.type = 'mediaplayer';
|
this.type = PluginType.MediaPlayer;
|
||||||
this.id = 'comicsplayer';
|
this.id = 'comicsplayer';
|
||||||
this.priority = 1;
|
this.priority = 1;
|
||||||
this.imageMap = new Map();
|
this.imageMap = new Map();
|
||||||
|
|
|
@ -2,6 +2,7 @@ import globalize from '../../scripts/globalize';
|
||||||
import * as userSettings from '../../scripts/settings/userSettings';
|
import * as userSettings from '../../scripts/settings/userSettings';
|
||||||
import { appHost } from '../../components/apphost';
|
import { appHost } from '../../components/apphost';
|
||||||
import alert from '../../components/alert';
|
import alert from '../../components/alert';
|
||||||
|
import { PluginType } from '../../types/plugin.ts';
|
||||||
|
|
||||||
// TODO: Replace with date-fns
|
// TODO: Replace with date-fns
|
||||||
// https://stackoverflow.com/questions/6117814/get-week-of-year-in-javascript-like-in-php
|
// https://stackoverflow.com/questions/6117814/get-week-of-year-in-javascript-like-in-php
|
||||||
|
@ -46,7 +47,7 @@ function showIsoMessage() {
|
||||||
class ExpirementalPlaybackWarnings {
|
class ExpirementalPlaybackWarnings {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.name = 'Experimental playback warnings';
|
this.name = 'Experimental playback warnings';
|
||||||
this.type = 'preplayintercept';
|
this.type = PluginType.PreplayIntercept;
|
||||||
this.id = 'expirementalplaybackwarnings';
|
this.id = 'expirementalplaybackwarnings';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { appHost } from '../../components/apphost';
|
||||||
import * as htmlMediaHelper from '../../components/htmlMediaHelper';
|
import * as htmlMediaHelper from '../../components/htmlMediaHelper';
|
||||||
import profileBuilder from '../../scripts/browserDeviceProfile';
|
import profileBuilder from '../../scripts/browserDeviceProfile';
|
||||||
import { getIncludeCorsCredentials } from '../../scripts/settings/webSettings';
|
import { getIncludeCorsCredentials } from '../../scripts/settings/webSettings';
|
||||||
|
import { PluginType } from '../../types/plugin.ts';
|
||||||
import Events from '../../utils/events.ts';
|
import Events from '../../utils/events.ts';
|
||||||
|
|
||||||
function getDefaultProfile() {
|
function getDefaultProfile() {
|
||||||
|
@ -88,7 +89,7 @@ class HtmlAudioPlayer {
|
||||||
const self = this;
|
const self = this;
|
||||||
|
|
||||||
self.name = 'Html Audio Player';
|
self.name = 'Html Audio Player';
|
||||||
self.type = 'mediaplayer';
|
self.type = PluginType.MediaPlayer;
|
||||||
self.id = 'htmlaudioplayer';
|
self.id = 'htmlaudioplayer';
|
||||||
|
|
||||||
// Let any players created by plugins take priority
|
// Let any players created by plugins take priority
|
||||||
|
|
|
@ -30,6 +30,7 @@ import ServerConnections from '../../components/ServerConnections';
|
||||||
import profileBuilder, { canPlaySecondaryAudio } from '../../scripts/browserDeviceProfile';
|
import profileBuilder, { canPlaySecondaryAudio } from '../../scripts/browserDeviceProfile';
|
||||||
import { getIncludeCorsCredentials } from '../../scripts/settings/webSettings';
|
import { getIncludeCorsCredentials } from '../../scripts/settings/webSettings';
|
||||||
import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../components/backdrop/backdrop';
|
import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../components/backdrop/backdrop';
|
||||||
|
import { PluginType } from '../../types/plugin.ts';
|
||||||
import Events from '../../utils/events.ts';
|
import Events from '../../utils/events.ts';
|
||||||
import { includesAny } from '../../utils/container.ts';
|
import { includesAny } from '../../utils/container.ts';
|
||||||
import debounce from 'lodash-es/debounce';
|
import debounce from 'lodash-es/debounce';
|
||||||
|
@ -170,7 +171,7 @@ function tryRemoveElement(elem) {
|
||||||
/**
|
/**
|
||||||
* @type {string}
|
* @type {string}
|
||||||
*/
|
*/
|
||||||
type = 'mediaplayer';
|
type = PluginType.MediaPlayer;
|
||||||
/**
|
/**
|
||||||
* @type {string}
|
* @type {string}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
|
import { PluginType } from '../../types/plugin.ts';
|
||||||
|
import { randomInt } from '../../utils/number.ts';
|
||||||
|
|
||||||
export default function () {
|
export default function () {
|
||||||
const self = this;
|
const self = this;
|
||||||
|
|
||||||
self.name = 'Logo ScreenSaver';
|
self.name = 'Logo ScreenSaver';
|
||||||
self.type = 'screensaver';
|
self.type = PluginType.Screensaver;
|
||||||
self.id = 'logoscreensaver';
|
self.id = 'logoscreensaver';
|
||||||
self.supportsAnonymous = true;
|
self.supportsAnonymous = true;
|
||||||
|
|
||||||
|
@ -23,16 +26,12 @@ export default function () {
|
||||||
const elem = document.querySelector('.logoScreenSaverImage');
|
const elem = document.querySelector('.logoScreenSaverImage');
|
||||||
|
|
||||||
if (elem && elem.animate) {
|
if (elem && elem.animate) {
|
||||||
const random = getRandomInt(0, animations.length - 1);
|
const random = randomInt(0, animations.length - 1);
|
||||||
|
|
||||||
animations[random](elem, 1);
|
animations[random](elem, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getRandomInt(min, max) {
|
|
||||||
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
||||||
}
|
|
||||||
|
|
||||||
function bounceInLeft(elem, iterations) {
|
function bounceInLeft(elem, iterations) {
|
||||||
const keyframes = [
|
const keyframes = [
|
||||||
{ transform: 'translate3d(-3000px, 0, 0)', opacity: '0', offset: 0 },
|
{ transform: 'translate3d(-3000px, 0, 0)', opacity: '0', offset: 0 },
|
||||||
|
|
|
@ -4,6 +4,7 @@ import keyboardnavigation from '../../scripts/keyboardNavigation';
|
||||||
import dialogHelper from '../../components/dialogHelper/dialogHelper';
|
import dialogHelper from '../../components/dialogHelper/dialogHelper';
|
||||||
import dom from '../../scripts/dom';
|
import dom from '../../scripts/dom';
|
||||||
import { appRouter } from '../../components/appRouter';
|
import { appRouter } from '../../components/appRouter';
|
||||||
|
import { PluginType } from '../../types/plugin.ts';
|
||||||
import Events from '../../utils/events.ts';
|
import Events from '../../utils/events.ts';
|
||||||
|
|
||||||
import './style.scss';
|
import './style.scss';
|
||||||
|
@ -12,7 +13,7 @@ import '../../elements/emby-button/paper-icon-button-light';
|
||||||
export class PdfPlayer {
|
export class PdfPlayer {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.name = 'PDF Player';
|
this.name = 'PDF Player';
|
||||||
this.type = 'mediaplayer';
|
this.type = PluginType.MediaPlayer;
|
||||||
this.id = 'pdfplayer';
|
this.id = 'pdfplayer';
|
||||||
this.priority = 1;
|
this.priority = 1;
|
||||||
|
|
||||||
|
@ -261,7 +262,7 @@ export class PdfPlayer {
|
||||||
for (const page of pages) {
|
for (const page of pages) {
|
||||||
if (!this.pages[page]) {
|
if (!this.pages[page]) {
|
||||||
this.pages[page] = document.createElement('canvas');
|
this.pages[page] = document.createElement('canvas');
|
||||||
this.renderPage(this.pages[page], parseInt(page.slice(4)));
|
this.renderPage(this.pages[page], parseInt(page.slice(4), 10));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import ServerConnections from '../../components/ServerConnections';
|
import ServerConnections from '../../components/ServerConnections';
|
||||||
|
import { PluginType } from '../../types/plugin.ts';
|
||||||
|
|
||||||
export default class PhotoPlayer {
|
export default class PhotoPlayer {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.name = 'Photo Player';
|
this.name = 'Photo Player';
|
||||||
this.type = 'mediaplayer';
|
this.type = PluginType.MediaPlayer;
|
||||||
this.id = 'photoplayer';
|
this.id = 'photoplayer';
|
||||||
this.priority = 1;
|
this.priority = 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import globalize from '../../scripts/globalize';
|
import globalize from '../../scripts/globalize';
|
||||||
import ServerConnections from '../../components/ServerConnections';
|
import ServerConnections from '../../components/ServerConnections';
|
||||||
import alert from '../../components/alert';
|
import alert from '../../components/alert';
|
||||||
|
import { PluginType } from '../../types/plugin.ts';
|
||||||
|
|
||||||
function showErrorMessage() {
|
function showErrorMessage() {
|
||||||
return alert(globalize.translate('MessagePlayAccessRestricted'));
|
return alert(globalize.translate('MessagePlayAccessRestricted'));
|
||||||
|
@ -9,7 +10,7 @@ function showErrorMessage() {
|
||||||
class PlayAccessValidation {
|
class PlayAccessValidation {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.name = 'Playback validation';
|
this.name = 'Playback validation';
|
||||||
this.type = 'preplayintercept';
|
this.type = PluginType.PreplayIntercept;
|
||||||
this.id = 'playaccessvalidation';
|
this.id = 'playaccessvalidation';
|
||||||
this.order = -2;
|
this.order = -2;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { playbackManager } from '../../components/playback/playbackmanager';
|
import { playbackManager } from '../../components/playback/playbackmanager';
|
||||||
import serverNotifications from '../../scripts/serverNotifications';
|
import serverNotifications from '../../scripts/serverNotifications';
|
||||||
import ServerConnections from '../../components/ServerConnections';
|
import ServerConnections from '../../components/ServerConnections';
|
||||||
|
import { PluginType } from '../../types/plugin.ts';
|
||||||
import Events from '../../utils/events.ts';
|
import Events from '../../utils/events.ts';
|
||||||
|
|
||||||
function getActivePlayerId() {
|
function getActivePlayerId() {
|
||||||
|
@ -181,7 +182,7 @@ class SessionPlayer {
|
||||||
const self = this;
|
const self = this;
|
||||||
|
|
||||||
this.name = 'Remote Control';
|
this.name = 'Remote Control';
|
||||||
this.type = 'mediaplayer';
|
this.type = PluginType.MediaPlayer;
|
||||||
this.isLocalPlayer = false;
|
this.isLocalPlayer = false;
|
||||||
this.id = 'remoteplayer';
|
this.id = 'remoteplayer';
|
||||||
|
|
||||||
|
|
|
@ -254,7 +254,7 @@ class Manager {
|
||||||
if (typeof cmd.When === 'string') {
|
if (typeof cmd.When === 'string') {
|
||||||
cmd.When = new Date(cmd.When);
|
cmd.When = new Date(cmd.When);
|
||||||
cmd.EmittedAt = new Date(cmd.EmittedAt);
|
cmd.EmittedAt = new Date(cmd.EmittedAt);
|
||||||
cmd.PositionTicks = cmd.PositionTicks ? parseInt(cmd.PositionTicks) : null;
|
cmd.PositionTicks = cmd.PositionTicks ? parseInt(cmd.PositionTicks, 10) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.isSyncPlayEnabled()) {
|
if (!this.isSyncPlayEnabled()) {
|
||||||
|
|
|
@ -5,8 +5,9 @@ import SyncPlay from './core';
|
||||||
import SyncPlayNoActivePlayer from './ui/players/NoActivePlayer';
|
import SyncPlayNoActivePlayer from './ui/players/NoActivePlayer';
|
||||||
import SyncPlayHtmlVideoPlayer from './ui/players/HtmlVideoPlayer';
|
import SyncPlayHtmlVideoPlayer from './ui/players/HtmlVideoPlayer';
|
||||||
import SyncPlayHtmlAudioPlayer from './ui/players/HtmlAudioPlayer';
|
import SyncPlayHtmlAudioPlayer from './ui/players/HtmlAudioPlayer';
|
||||||
|
import { Plugin, PluginType } from '../../types/plugin';
|
||||||
|
|
||||||
class SyncPlayPlugin {
|
class SyncPlayPlugin implements Plugin {
|
||||||
name: string;
|
name: string;
|
||||||
id: string;
|
id: string;
|
||||||
type: string;
|
type: string;
|
||||||
|
@ -17,7 +18,7 @@ class SyncPlayPlugin {
|
||||||
this.id = 'syncplay';
|
this.id = 'syncplay';
|
||||||
// NOTE: This should probably be a "mediaplayer" so the playback manager can handle playback logic, but
|
// NOTE: This should probably be a "mediaplayer" so the playback manager can handle playback logic, but
|
||||||
// SyncPlay needs refactored so it does not have an independent playback manager.
|
// SyncPlay needs refactored so it does not have an independent playback manager.
|
||||||
this.type = 'syncplay';
|
this.type = PluginType.SyncPlay;
|
||||||
this.priority = 1;
|
this.priority = 1;
|
||||||
|
|
||||||
this.init();
|
this.init();
|
||||||
|
|
|
@ -2,6 +2,7 @@ import browser from '../../scripts/browser';
|
||||||
import { appRouter } from '../../components/appRouter';
|
import { appRouter } from '../../components/appRouter';
|
||||||
import loading from '../../components/loading/loading';
|
import loading from '../../components/loading/loading';
|
||||||
import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../components/backdrop/backdrop';
|
import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../components/backdrop/backdrop';
|
||||||
|
import { PluginType } from '../../types/plugin.ts';
|
||||||
import Events from '../../utils/events.ts';
|
import Events from '../../utils/events.ts';
|
||||||
|
|
||||||
/* globals YT */
|
/* globals YT */
|
||||||
|
@ -197,7 +198,7 @@ function setCurrentSrc(instance, elem, options) {
|
||||||
class YoutubePlayer {
|
class YoutubePlayer {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.name = 'Youtube Player';
|
this.name = 'Youtube Player';
|
||||||
this.type = 'mediaplayer';
|
this.type = PluginType.MediaPlayer;
|
||||||
this.id = 'youtubeplayer';
|
this.id = 'youtubeplayer';
|
||||||
|
|
||||||
// Let any players created by plugins take priority
|
// Let any players created by plugins take priority
|
||||||
|
|
|
@ -55,7 +55,7 @@ const getTabs = () => {
|
||||||
|
|
||||||
const Movies: FC = () => {
|
const Movies: FC = () => {
|
||||||
const [ searchParams ] = useSearchParams();
|
const [ searchParams ] = useSearchParams();
|
||||||
const currentTabIndex = parseInt(searchParams.get('tab') || getDefaultTabIndex(searchParams.get('topParentId')).toString());
|
const currentTabIndex = parseInt(searchParams.get('tab') || getDefaultTabIndex(searchParams.get('topParentId')).toString(), 10);
|
||||||
const [ selectedIndex, setSelectedIndex ] = useState(currentTabIndex);
|
const [ selectedIndex, setSelectedIndex ] = useState(currentTabIndex);
|
||||||
const element = useRef<HTMLDivElement>(null);
|
const element = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
|
@ -95,7 +95,7 @@ const Movies: FC = () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const onTabChange = useCallback((e: { detail: { selectedTabIndex: string; }; }) => {
|
const onTabChange = useCallback((e: { detail: { selectedTabIndex: string; }; }) => {
|
||||||
const newIndex = parseInt(e.detail.selectedTabIndex);
|
const newIndex = parseInt(e.detail.selectedTabIndex, 10);
|
||||||
setSelectedIndex(newIndex);
|
setSelectedIndex(newIndex);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
|
|
@ -159,6 +159,7 @@ const UserEdit: FunctionComponent = () => {
|
||||||
(page.querySelector('.chkIsAdmin') as HTMLInputElement).checked = user.Policy.IsAdministrator;
|
(page.querySelector('.chkIsAdmin') as HTMLInputElement).checked = user.Policy.IsAdministrator;
|
||||||
(page.querySelector('.chkDisabled') as HTMLInputElement).checked = user.Policy.IsDisabled;
|
(page.querySelector('.chkDisabled') as HTMLInputElement).checked = user.Policy.IsDisabled;
|
||||||
(page.querySelector('.chkIsHidden') as HTMLInputElement).checked = user.Policy.IsHidden;
|
(page.querySelector('.chkIsHidden') as HTMLInputElement).checked = user.Policy.IsHidden;
|
||||||
|
(page.querySelector('.chkEnableCollectionManagement') as HTMLInputElement).checked = user.Policy.EnableCollectionManagement;
|
||||||
(page.querySelector('.chkRemoteControlSharedDevices') as HTMLInputElement).checked = user.Policy.EnableSharedDeviceControl;
|
(page.querySelector('.chkRemoteControlSharedDevices') as HTMLInputElement).checked = user.Policy.EnableSharedDeviceControl;
|
||||||
(page.querySelector('.chkEnableRemoteControlOtherUsers') as HTMLInputElement).checked = user.Policy.EnableRemoteControlOfOtherUsers;
|
(page.querySelector('.chkEnableRemoteControlOtherUsers') as HTMLInputElement).checked = user.Policy.EnableRemoteControlOfOtherUsers;
|
||||||
(page.querySelector('.chkEnableDownloading') as HTMLInputElement).checked = user.Policy.EnableContentDownloading;
|
(page.querySelector('.chkEnableDownloading') as HTMLInputElement).checked = user.Policy.EnableContentDownloading;
|
||||||
|
@ -224,12 +225,13 @@ const UserEdit: FunctionComponent = () => {
|
||||||
user.Policy.EnableAudioPlaybackTranscoding = (page.querySelector('.chkEnableAudioPlaybackTranscoding') as HTMLInputElement).checked;
|
user.Policy.EnableAudioPlaybackTranscoding = (page.querySelector('.chkEnableAudioPlaybackTranscoding') as HTMLInputElement).checked;
|
||||||
user.Policy.EnableVideoPlaybackTranscoding = (page.querySelector('.chkEnableVideoPlaybackTranscoding') as HTMLInputElement).checked;
|
user.Policy.EnableVideoPlaybackTranscoding = (page.querySelector('.chkEnableVideoPlaybackTranscoding') as HTMLInputElement).checked;
|
||||||
user.Policy.EnablePlaybackRemuxing = (page.querySelector('.chkEnableVideoPlaybackRemuxing') as HTMLInputElement).checked;
|
user.Policy.EnablePlaybackRemuxing = (page.querySelector('.chkEnableVideoPlaybackRemuxing') as HTMLInputElement).checked;
|
||||||
|
user.Policy.EnableCollectionManagement = (page.querySelector('.chkEnableCollectionManagement') as HTMLInputElement).checked;
|
||||||
user.Policy.ForceRemoteSourceTranscoding = (page.querySelector('.chkForceRemoteSourceTranscoding') as HTMLInputElement).checked;
|
user.Policy.ForceRemoteSourceTranscoding = (page.querySelector('.chkForceRemoteSourceTranscoding') as HTMLInputElement).checked;
|
||||||
user.Policy.EnableContentDownloading = (page.querySelector('.chkEnableDownloading') as HTMLInputElement).checked;
|
user.Policy.EnableContentDownloading = (page.querySelector('.chkEnableDownloading') as HTMLInputElement).checked;
|
||||||
user.Policy.EnableRemoteAccess = (page.querySelector('.chkRemoteAccess') as HTMLInputElement).checked;
|
user.Policy.EnableRemoteAccess = (page.querySelector('.chkRemoteAccess') as HTMLInputElement).checked;
|
||||||
user.Policy.RemoteClientBitrateLimit = Math.floor(1e6 * parseFloat((page.querySelector('#txtRemoteClientBitrateLimit') as HTMLInputElement).value || '0'));
|
user.Policy.RemoteClientBitrateLimit = Math.floor(1e6 * parseFloat((page.querySelector('#txtRemoteClientBitrateLimit') as HTMLInputElement).value || '0'));
|
||||||
user.Policy.LoginAttemptsBeforeLockout = parseInt((page.querySelector('#txtLoginAttemptsBeforeLockout') as HTMLInputElement).value || '0');
|
user.Policy.LoginAttemptsBeforeLockout = parseInt((page.querySelector('#txtLoginAttemptsBeforeLockout') as HTMLInputElement).value || '0', 10);
|
||||||
user.Policy.MaxActiveSessions = parseInt((page.querySelector('#txtMaxActiveSessions') as HTMLInputElement).value || '0');
|
user.Policy.MaxActiveSessions = parseInt((page.querySelector('#txtMaxActiveSessions') as HTMLInputElement).value || '0', 10);
|
||||||
user.Policy.AuthenticationProviderId = (page.querySelector('#selectLoginProvider') as HTMLSelectElement).value;
|
user.Policy.AuthenticationProviderId = (page.querySelector('#selectLoginProvider') as HTMLSelectElement).value;
|
||||||
user.Policy.PasswordResetProviderId = (page.querySelector('#selectPasswordResetProvider') as HTMLSelectElement).value;
|
user.Policy.PasswordResetProviderId = (page.querySelector('#selectPasswordResetProvider') as HTMLSelectElement).value;
|
||||||
user.Policy.EnableContentDeletion = (page.querySelector('.chkEnableDeleteAllFolders') as HTMLInputElement).checked;
|
user.Policy.EnableContentDeletion = (page.querySelector('.chkEnableDeleteAllFolders') as HTMLInputElement).checked;
|
||||||
|
@ -375,6 +377,11 @@ const UserEdit: FunctionComponent = () => {
|
||||||
className='chkIsAdmin'
|
className='chkIsAdmin'
|
||||||
title='OptionAllowUserToManageServer'
|
title='OptionAllowUserToManageServer'
|
||||||
/>
|
/>
|
||||||
|
<CheckBoxElement
|
||||||
|
labelClassName='checkboxContainer'
|
||||||
|
className='chkEnableCollectionManagement'
|
||||||
|
title='AllowCollectionManagement'
|
||||||
|
/>
|
||||||
<div id='featureAccessFields' className='verticalSection'>
|
<div id='featureAccessFields' className='verticalSection'>
|
||||||
<h2 className='paperListLabel'>
|
<h2 className='paperListLabel'>
|
||||||
{globalize.translate('HeaderFeatureAccess')}
|
{globalize.translate('HeaderFeatureAccess')}
|
||||||
|
|
|
@ -224,7 +224,7 @@ const uaMatch = function (ua) {
|
||||||
|
|
||||||
version = version || match[2] || '0';
|
version = version || match[2] || '0';
|
||||||
|
|
||||||
let versionMajor = parseInt(version.split('.')[0]);
|
let versionMajor = parseInt(version.split('.')[0], 10);
|
||||||
|
|
||||||
if (isNaN(versionMajor)) {
|
if (isNaN(versionMajor)) {
|
||||||
versionMajor = 0;
|
versionMajor = 0;
|
||||||
|
@ -295,7 +295,7 @@ if (browser.web0s) {
|
||||||
delete browser.safari;
|
delete browser.safari;
|
||||||
|
|
||||||
const v = (navigator.appVersion).match(/Tizen (\d+).(\d+)/);
|
const v = (navigator.appVersion).match(/Tizen (\d+).(\d+)/);
|
||||||
browser.tizenVersion = parseInt(v[1]);
|
browser.tizenVersion = parseInt(v[1], 10);
|
||||||
} else {
|
} else {
|
||||||
browser.orsay = userAgent.toLowerCase().indexOf('smarthub') !== -1;
|
browser.orsay = userAgent.toLowerCase().indexOf('smarthub') !== -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ import imageHelper from './imagehelper';
|
||||||
import { getMenuLinks } from '../scripts/settings/webSettings';
|
import { getMenuLinks } from '../scripts/settings/webSettings';
|
||||||
import Dashboard, { pageClassOn } from '../utils/dashboard';
|
import Dashboard, { pageClassOn } from '../utils/dashboard';
|
||||||
import ServerConnections from '../components/ServerConnections';
|
import ServerConnections from '../components/ServerConnections';
|
||||||
|
import { PluginType } from '../types/plugin.ts';
|
||||||
import Events from '../utils/events.ts';
|
import Events from '../utils/events.ts';
|
||||||
import { getParameterByName } from '../utils/url.ts';
|
import { getParameterByName } from '../utils/url.ts';
|
||||||
|
|
||||||
|
@ -159,7 +160,7 @@ import '../styles/flexstyles.scss';
|
||||||
// Button is present
|
// Button is present
|
||||||
headerSyncButton
|
headerSyncButton
|
||||||
// SyncPlay plugin is loaded
|
// SyncPlay plugin is loaded
|
||||||
&& pluginManager.plugins.filter(plugin => plugin.id === 'syncplay').length > 0
|
&& pluginManager.ofType(PluginType.SyncPlay).length > 0
|
||||||
// SyncPlay enabled for user
|
// SyncPlay enabled for user
|
||||||
&& policy?.SyncPlayAccess !== 'None'
|
&& policy?.SyncPlayAccess !== 'None'
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { pluginManager } from '../components/pluginManager';
|
||||||
import inputManager from './inputManager';
|
import inputManager from './inputManager';
|
||||||
import * as userSettings from './settings/userSettings';
|
import * as userSettings from './settings/userSettings';
|
||||||
import ServerConnections from '../components/ServerConnections';
|
import ServerConnections from '../components/ServerConnections';
|
||||||
|
import { PluginType } from '../types/plugin.ts';
|
||||||
import Events from '../utils/events.ts';
|
import Events from '../utils/events.ts';
|
||||||
|
|
||||||
import './screensavermanager.scss';
|
import './screensavermanager.scss';
|
||||||
|
@ -34,7 +35,7 @@ function getScreensaverPlugin(isLoggedIn) {
|
||||||
option = isLoggedIn ? 'backdropscreensaver' : 'logoscreensaver';
|
option = isLoggedIn ? 'backdropscreensaver' : 'logoscreensaver';
|
||||||
}
|
}
|
||||||
|
|
||||||
const plugins = pluginManager.ofType('screensaver');
|
const plugins = pluginManager.ofType(PluginType.Screensaver);
|
||||||
|
|
||||||
for (const plugin of plugins) {
|
for (const plugin of plugins) {
|
||||||
if (plugin.id === option) {
|
if (plugin.id === option) {
|
||||||
|
|
|
@ -98,11 +98,11 @@ function processGeneralCommand(cmd, apiClient) {
|
||||||
break;
|
break;
|
||||||
case 'SetAudioStreamIndex':
|
case 'SetAudioStreamIndex':
|
||||||
notifyApp();
|
notifyApp();
|
||||||
playbackManager.setAudioStreamIndex(parseInt(cmd.Arguments.Index));
|
playbackManager.setAudioStreamIndex(parseInt(cmd.Arguments.Index, 10));
|
||||||
break;
|
break;
|
||||||
case 'SetSubtitleStreamIndex':
|
case 'SetSubtitleStreamIndex':
|
||||||
notifyApp();
|
notifyApp();
|
||||||
playbackManager.setSubtitleStreamIndex(parseInt(cmd.Arguments.Index));
|
playbackManager.setSubtitleStreamIndex(parseInt(cmd.Arguments.Index, 10));
|
||||||
break;
|
break;
|
||||||
case 'ToggleFullscreen':
|
case 'ToggleFullscreen':
|
||||||
inputManager.handleCommand('togglefullscreen');
|
inputManager.handleCommand('togglefullscreen');
|
||||||
|
|
|
@ -70,7 +70,7 @@ class AppSettings {
|
||||||
// return a huge number so that it always direct plays
|
// return a huge number so that it always direct plays
|
||||||
return 150000000;
|
return 150000000;
|
||||||
} else {
|
} else {
|
||||||
return parseInt(this.get(key) || '0') || 1500000;
|
return parseInt(this.get(key) || '0', 10) || 1500000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ class AppSettings {
|
||||||
}
|
}
|
||||||
|
|
||||||
const defaultValue = 320000;
|
const defaultValue = 320000;
|
||||||
return parseInt(this.get('maxStaticMusicBitrate') || defaultValue.toString()) || defaultValue;
|
return parseInt(this.get('maxStaticMusicBitrate') || defaultValue.toString(), 10) || defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
maxChromecastBitrate(val) {
|
maxChromecastBitrate(val) {
|
||||||
|
@ -89,7 +89,7 @@ class AppSettings {
|
||||||
}
|
}
|
||||||
|
|
||||||
val = this.get('chromecastBitrate1');
|
val = this.get('chromecastBitrate1');
|
||||||
return val ? parseInt(val) : null;
|
return val ? parseInt(val, 10) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -348,7 +348,7 @@ export class UserSettings {
|
||||||
return this.set('skipBackLength', val.toString());
|
return this.set('skipBackLength', val.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
return parseInt(this.get('skipBackLength') || '10000');
|
return parseInt(this.get('skipBackLength') || '10000', 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -361,7 +361,7 @@ export class UserSettings {
|
||||||
return this.set('skipForwardLength', val.toString());
|
return this.set('skipForwardLength', val.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
return parseInt(this.get('skipForwardLength') || '30000');
|
return parseInt(this.get('skipForwardLength') || '30000', 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1380,7 +1380,7 @@
|
||||||
"UnknownAudioStreamInfo": "Інфармацыя аб аўдыяплыні невядомая",
|
"UnknownAudioStreamInfo": "Інфармацыя аб аўдыяплыні невядомая",
|
||||||
"DirectPlayError": "Узнікла памылка пры запуску прамога прайгравання",
|
"DirectPlayError": "Узнікла памылка пры запуску прамога прайгравання",
|
||||||
"SelectAll": "Абраць усё",
|
"SelectAll": "Абраць усё",
|
||||||
"Clip": "Художнік",
|
"Clip": "Кліп",
|
||||||
"Sample": "Прыклад",
|
"Sample": "Прыклад",
|
||||||
"LabelVppTonemappingBrightness": "Узмацненне яркасці танальнага адлюстравання VPP:",
|
"LabelVppTonemappingBrightness": "Узмацненне яркасці танальнага адлюстравання VPP:",
|
||||||
"LabelVppTonemappingBrightnessHelp": "Прымяніць узмацненне яркасці ў танальным адлюстраванні VPP. І рэкамендаванае, і стандартнае значэнне роўна 0.",
|
"LabelVppTonemappingBrightnessHelp": "Прымяніць узмацненне яркасці ў танальным адлюстраванні VPP. І рэкамендаванае, і стандартнае значэнне роўна 0.",
|
||||||
|
@ -1700,5 +1700,7 @@
|
||||||
"SubtitleMagenta": "Пурпурны",
|
"SubtitleMagenta": "Пурпурны",
|
||||||
"SubtitleRed": "Чырвоны",
|
"SubtitleRed": "Чырвоны",
|
||||||
"SubtitleWhite": "Белы",
|
"SubtitleWhite": "Белы",
|
||||||
"SubtitleYellow": "Жоўты"
|
"SubtitleYellow": "Жоўты",
|
||||||
|
"Featurette": "Кароткаметражка",
|
||||||
|
"Short": "Кароткаметражка"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1622,7 +1622,7 @@
|
||||||
"DeletedScene": "Vymazaná scéna",
|
"DeletedScene": "Vymazaná scéna",
|
||||||
"BehindTheScenes": "Z natáčení",
|
"BehindTheScenes": "Z natáčení",
|
||||||
"Trailer": "Upoutávka",
|
"Trailer": "Upoutávka",
|
||||||
"Clip": "Krátký film",
|
"Clip": "Filmový klip",
|
||||||
"AllowEmbeddedSubtitlesHelp": "Zakázat titulky, které jsou vložené v kontejneru média. Vyžaduje kompletní přeskenování knihovny.",
|
"AllowEmbeddedSubtitlesHelp": "Zakázat titulky, které jsou vložené v kontejneru média. Vyžaduje kompletní přeskenování knihovny.",
|
||||||
"AllowEmbeddedSubtitlesAllowTextOption": "Povolit textové titulky",
|
"AllowEmbeddedSubtitlesAllowTextOption": "Povolit textové titulky",
|
||||||
"AllowEmbeddedSubtitlesAllowImageOption": "Povolit grafické titulky",
|
"AllowEmbeddedSubtitlesAllowImageOption": "Povolit grafické titulky",
|
||||||
|
@ -1714,5 +1714,7 @@
|
||||||
"SubtitleMagenta": "Fialová",
|
"SubtitleMagenta": "Fialová",
|
||||||
"SubtitleRed": "Červená",
|
"SubtitleRed": "Červená",
|
||||||
"SubtitleWhite": "Bílá",
|
"SubtitleWhite": "Bílá",
|
||||||
"SubtitleYellow": "Žlutá"
|
"SubtitleYellow": "Žlutá",
|
||||||
|
"Featurette": "Středně dlouhý film",
|
||||||
|
"Short": "Krátký film"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1629,7 +1629,7 @@
|
||||||
"DeletedScene": "Deleted Scene",
|
"DeletedScene": "Deleted Scene",
|
||||||
"BehindTheScenes": "Behind the Scenes",
|
"BehindTheScenes": "Behind the Scenes",
|
||||||
"Trailer": "Trailer",
|
"Trailer": "Trailer",
|
||||||
"Clip": "Featurette",
|
"Clip": "Clip",
|
||||||
"ShowParentImages": "Show programme images",
|
"ShowParentImages": "Show programme images",
|
||||||
"NextUpRewatching": "Rewatching",
|
"NextUpRewatching": "Rewatching",
|
||||||
"MixedMoviesShows": "Mixed Films and Programmes",
|
"MixedMoviesShows": "Mixed Films and Programmes",
|
||||||
|
@ -1714,5 +1714,7 @@
|
||||||
"SubtitleMagenta": "Magenta",
|
"SubtitleMagenta": "Magenta",
|
||||||
"SubtitleRed": "Red",
|
"SubtitleRed": "Red",
|
||||||
"SubtitleWhite": "White",
|
"SubtitleWhite": "White",
|
||||||
"SubtitleYellow": "Yellow"
|
"SubtitleYellow": "Yellow",
|
||||||
|
"Featurette": "Featurette",
|
||||||
|
"Short": "Short"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1671,7 +1671,9 @@
|
||||||
"UnknownAudioStreamInfo": "The audio stream info is unknown",
|
"UnknownAudioStreamInfo": "The audio stream info is unknown",
|
||||||
"DirectPlayError": "There was an error starting direct playback",
|
"DirectPlayError": "There was an error starting direct playback",
|
||||||
"SelectAll": "Select All",
|
"SelectAll": "Select All",
|
||||||
"Clip": "Featurette",
|
"Featurette": "Featurette",
|
||||||
|
"Short": "Short",
|
||||||
|
"Clip": "Clip",
|
||||||
"Trailer": "Trailer",
|
"Trailer": "Trailer",
|
||||||
"BehindTheScenes": "Behind the Scenes",
|
"BehindTheScenes": "Behind the Scenes",
|
||||||
"DeletedScene": "Deleted Scene",
|
"DeletedScene": "Deleted Scene",
|
||||||
|
|
|
@ -1634,7 +1634,7 @@
|
||||||
"ButtonSpace": "Välilyönti",
|
"ButtonSpace": "Välilyönti",
|
||||||
"ThemeVideo": "Tunnusvideo",
|
"ThemeVideo": "Tunnusvideo",
|
||||||
"ThemeSong": "Tunnusmusiikki",
|
"ThemeSong": "Tunnusmusiikki",
|
||||||
"Clip": "Lyhytfilmi",
|
"Clip": "Klippi",
|
||||||
"Scene": "Kohtaus",
|
"Scene": "Kohtaus",
|
||||||
"Interview": "Haastattelu",
|
"Interview": "Haastattelu",
|
||||||
"UnknownAudioStreamInfo": "Äänivirran tiedot ovat tuntemattomia",
|
"UnknownAudioStreamInfo": "Äänivirran tiedot ovat tuntemattomia",
|
||||||
|
@ -1677,7 +1677,7 @@
|
||||||
"MessageNoFavoritesAvailable": "Suosikkeja ei ole tällä hetkellä käytettävissä.",
|
"MessageNoFavoritesAvailable": "Suosikkeja ei ole tällä hetkellä käytettävissä.",
|
||||||
"EnableCardLayout": "Näytä visuaalinen KorttiLaatikko",
|
"EnableCardLayout": "Näytä visuaalinen KorttiLaatikko",
|
||||||
"Unreleased": "Ei vielä julkaistu",
|
"Unreleased": "Ei vielä julkaistu",
|
||||||
"MediaInfoDvVersionMajor": "",
|
"MediaInfoDvVersionMajor": "DV-pääversio",
|
||||||
"DownloadAll": "Lataa kaikki",
|
"DownloadAll": "Lataa kaikki",
|
||||||
"Experimental": "Kokeellinen",
|
"Experimental": "Kokeellinen",
|
||||||
"LabelStereoDownmixAlgorithm": "Stereoäänen alasmiksausalgoritmi:",
|
"LabelStereoDownmixAlgorithm": "Stereoäänen alasmiksausalgoritmi:",
|
||||||
|
@ -1697,5 +1697,22 @@
|
||||||
"ResolutionMatchSource": "Vastaa lähdettä",
|
"ResolutionMatchSource": "Vastaa lähdettä",
|
||||||
"PreferEmbeddedExtrasTitlesOverFileNames": "Suosi lisämateriaaleille upotettuja otsikoita tiedostonimien sijaan",
|
"PreferEmbeddedExtrasTitlesOverFileNames": "Suosi lisämateriaaleille upotettuja otsikoita tiedostonimien sijaan",
|
||||||
"PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Lisämateriaaleilla on usein sama otsikko kuin niiden isännällä. Valitse tämä käyttääksesi silti upotettuja otsikoita.",
|
"PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Lisämateriaaleilla on usein sama otsikko kuin niiden isännällä. Valitse tämä käyttääksesi silti upotettuja otsikoita.",
|
||||||
"SecondarySubtitles": "Toissijaiset tekstitykset"
|
"SecondarySubtitles": "Toissijaiset tekstitykset",
|
||||||
|
"MediaInfoElPresentFlag": "DV EL havaittu",
|
||||||
|
"SubtitleBlack": "Musta",
|
||||||
|
"SubtitleCyan": "Syaani",
|
||||||
|
"SubtitleGray": "Harmaa",
|
||||||
|
"SubtitleGreen": "Vihreä",
|
||||||
|
"SubtitleLightGray": "Vaaleanharmaa",
|
||||||
|
"SubtitleMagenta": "Magenta",
|
||||||
|
"SubtitleRed": "Punainen",
|
||||||
|
"SubtitleWhite": "Valkoinen",
|
||||||
|
"SubtitleYellow": "Keltainen",
|
||||||
|
"MediaInfoDvBlSignalCompatibilityId": "DV BL -signaaliyhteensopivuuden ID",
|
||||||
|
"SubtitleBlue": "Sininen",
|
||||||
|
"Featurette": "Oheisfilmi",
|
||||||
|
"Short": "Lyhytfilmi",
|
||||||
|
"MediaInfoBlPresentFlag": "DV BL havaittu",
|
||||||
|
"MediaInfoRpuPresentFlag": "DV RPU havaittu",
|
||||||
|
"MediaInfoDvVersionMinor": "DV-väliversio"
|
||||||
}
|
}
|
||||||
|
|
|
@ -234,7 +234,7 @@
|
||||||
"HeaderApiKeys": "Clés API",
|
"HeaderApiKeys": "Clés API",
|
||||||
"HeaderApiKeysHelp": "Les applications externes ont besoin d'une clé d'API pour communiquer avec le serveur. Les clés sont distribuées lors d'une connexion avec un compte normal ou en accordant manuellement une clé à une application.",
|
"HeaderApiKeysHelp": "Les applications externes ont besoin d'une clé d'API pour communiquer avec le serveur. Les clés sont distribuées lors d'une connexion avec un compte normal ou en accordant manuellement une clé à une application.",
|
||||||
"HeaderApp": "Application",
|
"HeaderApp": "Application",
|
||||||
"HeaderAppearsOn": "Apparait dans",
|
"HeaderAppearsOn": "Apparaît dans",
|
||||||
"HeaderAudioBooks": "Livres audio",
|
"HeaderAudioBooks": "Livres audio",
|
||||||
"HeaderAudioSettings": "Réglages audio",
|
"HeaderAudioSettings": "Réglages audio",
|
||||||
"HeaderBlockItemsWithNoRating": "Bloquer les éléments avec des informations de classification inconnues ou n'en disposant pas :",
|
"HeaderBlockItemsWithNoRating": "Bloquer les éléments avec des informations de classification inconnues ou n'en disposant pas :",
|
||||||
|
@ -979,7 +979,7 @@
|
||||||
"Rate": "Débit",
|
"Rate": "Débit",
|
||||||
"RecentlyWatched": "Vu récemment",
|
"RecentlyWatched": "Vu récemment",
|
||||||
"RecommendationBecauseYouLike": "Parce que vous aimez {0}",
|
"RecommendationBecauseYouLike": "Parce que vous aimez {0}",
|
||||||
"RecommendationBecauseYouWatched": "Parce que vous avez regardé {0}",
|
"RecommendationBecauseYouWatched": "Parce-que vous avez regardé {0}",
|
||||||
"RecommendationDirectedBy": "Réalisé par {0}",
|
"RecommendationDirectedBy": "Réalisé par {0}",
|
||||||
"RecommendationStarring": "Avec {0}",
|
"RecommendationStarring": "Avec {0}",
|
||||||
"Record": "Enregistrer",
|
"Record": "Enregistrer",
|
||||||
|
@ -1614,7 +1614,7 @@
|
||||||
"AudioIsExternal": "Le flux audio est externe",
|
"AudioIsExternal": "Le flux audio est externe",
|
||||||
"SelectAll": "Tout sélectionner",
|
"SelectAll": "Tout sélectionner",
|
||||||
"ButtonExitApp": "Quitter l'application",
|
"ButtonExitApp": "Quitter l'application",
|
||||||
"Clip": "Court-métrage",
|
"Clip": "Clip",
|
||||||
"ThemeVideo": "Générique",
|
"ThemeVideo": "Générique",
|
||||||
"ThemeSong": "Thème musical",
|
"ThemeSong": "Thème musical",
|
||||||
"Sample": "Échantillon",
|
"Sample": "Échantillon",
|
||||||
|
@ -1714,5 +1714,7 @@
|
||||||
"SubtitleMagenta": "Magenta",
|
"SubtitleMagenta": "Magenta",
|
||||||
"SubtitleRed": "Rouge",
|
"SubtitleRed": "Rouge",
|
||||||
"SubtitleWhite": "Blanc",
|
"SubtitleWhite": "Blanc",
|
||||||
"SubtitleYellow": "Jaune"
|
"SubtitleYellow": "Jaune",
|
||||||
|
"Featurette": "Featurette",
|
||||||
|
"Short": "Court-métrage"
|
||||||
}
|
}
|
||||||
|
|
|
@ -787,7 +787,7 @@
|
||||||
"NewEpisodesOnly": "Alleen nieuwe afleveringen",
|
"NewEpisodesOnly": "Alleen nieuwe afleveringen",
|
||||||
"News": "Nieuws",
|
"News": "Nieuws",
|
||||||
"Next": "Volgende",
|
"Next": "Volgende",
|
||||||
"NextUp": "Hierna",
|
"NextUp": "Volgende",
|
||||||
"No": "Nee",
|
"No": "Nee",
|
||||||
"NoNewDevicesFound": "Er zijn geen nieuwe apparaten gevonden. Sluit deze melding en voer handmatig de apparaat gegevens in om een nieuwe tuner toe te voegen.",
|
"NoNewDevicesFound": "Er zijn geen nieuwe apparaten gevonden. Sluit deze melding en voer handmatig de apparaat gegevens in om een nieuwe tuner toe te voegen.",
|
||||||
"MessageNoNextUpItems": "Niets gevonden. Start met kijken!",
|
"MessageNoNextUpItems": "Niets gevonden. Start met kijken!",
|
||||||
|
@ -1544,7 +1544,7 @@
|
||||||
"LabelSyncPlaySettingsSkipToSyncHelp": "Synchronisatie correctiemethode die bestaat uit het zoeken naar de geschatte positie. Synchronisatie Correctie moet ingeschakeld zijn.",
|
"LabelSyncPlaySettingsSkipToSyncHelp": "Synchronisatie correctiemethode die bestaat uit het zoeken naar de geschatte positie. Synchronisatie Correctie moet ingeschakeld zijn.",
|
||||||
"MessageSent": "Bericht verzonden.",
|
"MessageSent": "Bericht verzonden.",
|
||||||
"Mixer": "Mixer",
|
"Mixer": "Mixer",
|
||||||
"UseEpisodeImagesInNextUpHelp": "'Hierna'- en 'Verderkijken'-secties zullen afleveringsafbeeldingen gebruiken als thumbnails in plaats van de primaire thumbnail van de serie.",
|
"UseEpisodeImagesInNextUpHelp": "Secties 'Volgende' en 'Verderkijken' zullen afleveringsafbeeldingen gebruiken als miniaturen in plaats van de primaire miniatuur van de serie.",
|
||||||
"SetUsingLastTracks": "Ondertitel/Audio-sporen instellen met vorig item",
|
"SetUsingLastTracks": "Ondertitel/Audio-sporen instellen met vorig item",
|
||||||
"SetUsingLastTracksHelp": "Probeer de ondertiteling/het audiospoor in te stellen op de video die het meest overeenkomt met de laatste video.",
|
"SetUsingLastTracksHelp": "Probeer de ondertiteling/het audiospoor in te stellen op de video die het meest overeenkomt met de laatste video.",
|
||||||
"TextSent": "Tekst verzonden.",
|
"TextSent": "Tekst verzonden.",
|
||||||
|
@ -1556,11 +1556,11 @@
|
||||||
"VideoProfileNotSupported": "Het profiel van de videocodec wordt niet ondersteund",
|
"VideoProfileNotSupported": "Het profiel van de videocodec wordt niet ondersteund",
|
||||||
"Lyricist": "Tekstschrijver",
|
"Lyricist": "Tekstschrijver",
|
||||||
"NextChapter": "Volgend hoofdstuk",
|
"NextChapter": "Volgend hoofdstuk",
|
||||||
"LabelMaxDaysForNextUp": "Maximaal dagen in 'Hierna':",
|
"LabelMaxDaysForNextUp": "Maximaal dagen in 'Volgende':",
|
||||||
"LabelMaxDaysForNextUpHelp": "Zet het maximaal aantal dagen dat een serie in de 'Hierna'-lijst staat zonder het te kijken.",
|
"LabelMaxDaysForNextUpHelp": "Stel het maximaal aantal dagen in dat een serie in de 'Volgende'-lijst staat zonder het te kijken.",
|
||||||
"PreviousChapter": "Vorig hoofdstuk",
|
"PreviousChapter": "Vorig hoofdstuk",
|
||||||
"Remixer": "Remixer",
|
"Remixer": "Remixer",
|
||||||
"UseEpisodeImagesInNextUp": "Gebruik afleveringscovers in de secties 'Hierna' en 'Verderkijken'",
|
"UseEpisodeImagesInNextUp": "Gebruik afleveringscovers in de secties 'Volgende' en 'Verderkijken'",
|
||||||
"EnableGamepadHelp": "Luister naar input van alle aangesloten controllers. (Vereist weergavemodus 'Tv')",
|
"EnableGamepadHelp": "Luister naar input van alle aangesloten controllers. (Vereist weergavemodus 'Tv')",
|
||||||
"VideoCodecNotSupported": "De videocodec wordt niet ondersteund",
|
"VideoCodecNotSupported": "De videocodec wordt niet ondersteund",
|
||||||
"AudioBitrateNotSupported": "De bitrate van de audio wordt niet ondersteund",
|
"AudioBitrateNotSupported": "De bitrate van de audio wordt niet ondersteund",
|
||||||
|
@ -1625,11 +1625,11 @@
|
||||||
"ButtonBackspace": "Backspace",
|
"ButtonBackspace": "Backspace",
|
||||||
"StoryArc": "Verhaallijn",
|
"StoryArc": "Verhaallijn",
|
||||||
"ItemDetails": "Itemdetails",
|
"ItemDetails": "Itemdetails",
|
||||||
"EnableRewatchingNextUp": "Opnieuw kijken inschakelen in Hierna",
|
"EnableRewatchingNextUp": "Opnieuw kijken inschakelen in Volgende",
|
||||||
"Bold": "Vetgedrukt",
|
"Bold": "Vetgedrukt",
|
||||||
"LabelTextWeight": "Tekstdikte:",
|
"LabelTextWeight": "Tekstdikte:",
|
||||||
"HomeVideosPhotos": "Homevideo's en foto's",
|
"HomeVideosPhotos": "Homevideo's en foto's",
|
||||||
"EnableRewatchingNextUpHelp": "Laat reeds gekeken afleveringen zien in 'Hierna'-secties.",
|
"EnableRewatchingNextUpHelp": "Laat reeds gekeken afleveringen zien in sectie 'Volgende'.",
|
||||||
"ContainerBitrateExceedsLimit": "De bitrate van de video overschrijdt de limiet",
|
"ContainerBitrateExceedsLimit": "De bitrate van de video overschrijdt de limiet",
|
||||||
"LabelMaxVideoResolution": "Maximaal toegestane resolutie voor transcoderingen",
|
"LabelMaxVideoResolution": "Maximaal toegestane resolutie voor transcoderingen",
|
||||||
"UnknownAudioStreamInfo": "De audio stream info is onbekend",
|
"UnknownAudioStreamInfo": "De audio stream info is onbekend",
|
||||||
|
@ -1674,7 +1674,7 @@
|
||||||
"DeletedScene": "Verwijderde scene",
|
"DeletedScene": "Verwijderde scene",
|
||||||
"BehindTheScenes": "Achter de scenes",
|
"BehindTheScenes": "Achter de scenes",
|
||||||
"Trailer": "Trailer",
|
"Trailer": "Trailer",
|
||||||
"Clip": "Korte film",
|
"Clip": "Clip",
|
||||||
"SelectAll": "Selecteer alles",
|
"SelectAll": "Selecteer alles",
|
||||||
"DirectPlayError": "Er is een fout opgetreden tijdens het starten van direct afspelen",
|
"DirectPlayError": "Er is een fout opgetreden tijdens het starten van direct afspelen",
|
||||||
"OptionDateShowAdded": "Datum Serie Toegevoegd",
|
"OptionDateShowAdded": "Datum Serie Toegevoegd",
|
||||||
|
@ -1713,5 +1713,7 @@
|
||||||
"SubtitleMagenta": "Magenta",
|
"SubtitleMagenta": "Magenta",
|
||||||
"SubtitleRed": "Rood",
|
"SubtitleRed": "Rood",
|
||||||
"SubtitleWhite": "Wit",
|
"SubtitleWhite": "Wit",
|
||||||
"SubtitleYellow": "Geel"
|
"SubtitleYellow": "Geel",
|
||||||
|
"Featurette": "Featurette",
|
||||||
|
"Short": "Korte film"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1621,7 +1621,7 @@
|
||||||
"DeletedScene": "删减场景",
|
"DeletedScene": "删减场景",
|
||||||
"BehindTheScenes": "幕后花絮",
|
"BehindTheScenes": "幕后花絮",
|
||||||
"Trailer": "预告片",
|
"Trailer": "预告片",
|
||||||
"Clip": "花絮",
|
"Clip": "片段",
|
||||||
"ButtonExitApp": "退出应用",
|
"ButtonExitApp": "退出应用",
|
||||||
"ShowParentImages": "显示系列图片",
|
"ShowParentImages": "显示系列图片",
|
||||||
"AllowEmbeddedSubtitlesAllowTextOption": "允许文本",
|
"AllowEmbeddedSubtitlesAllowTextOption": "允许文本",
|
||||||
|
@ -1714,5 +1714,7 @@
|
||||||
"SubtitleGreen": "绿色",
|
"SubtitleGreen": "绿色",
|
||||||
"SubtitleMagenta": "品红色",
|
"SubtitleMagenta": "品红色",
|
||||||
"SubtitleRed": "红色",
|
"SubtitleRed": "红色",
|
||||||
"SubtitleYellow": "黄色"
|
"SubtitleYellow": "黄色",
|
||||||
|
"Featurette": "花絮",
|
||||||
|
"Short": "短片"
|
||||||
}
|
}
|
||||||
|
|
13
src/types/plugin.ts
Normal file
13
src/types/plugin.ts
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
export enum PluginType {
|
||||||
|
MediaPlayer = 'mediaplayer',
|
||||||
|
PreplayIntercept = 'preplayintercept',
|
||||||
|
Screensaver = 'screensaver',
|
||||||
|
SyncPlay = 'syncplay'
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Plugin {
|
||||||
|
name: string
|
||||||
|
id: string
|
||||||
|
type: PluginType | string
|
||||||
|
priority: number
|
||||||
|
}
|
|
@ -2,6 +2,16 @@ function toLocaleStringSupportsOptions() {
|
||||||
return !!(typeof Intl === 'object' && Intl && typeof Intl.NumberFormat === 'function');
|
return !!(typeof Intl === 'object' && Intl && typeof Intl.NumberFormat === 'function');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a random integer in a given range.
|
||||||
|
* @param {number} min - Minimum of the range.
|
||||||
|
* @param {number} max - Maximum of the range.
|
||||||
|
* @returns {number} Randomly generated number.
|
||||||
|
*/
|
||||||
|
export function randomInt(min: number, max: number): number {
|
||||||
|
return Math.floor(Math.random() * (max - min + 1)) + min;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the value of a number formatted as a perentage.
|
* Gets the value of a number formatted as a perentage.
|
||||||
* @param {number} value The value as a number.
|
* @param {number} value The value as a number.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue