Merge branch 'master' into blurred-pdf-fixed

This commit is contained in:
Zourlo 2023-03-15 16:28:15 +09:00 committed by GitHub
commit 5239ae2ad2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
27 changed files with 225 additions and 194 deletions

View File

@ -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'

View File

@ -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

View File

@ -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
View File

@ -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:

View File

@ -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}

View File

@ -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

View File

@ -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
View File

@ -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": {}
} }

View File

@ -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",

View File

@ -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' });
}

View File

@ -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.
@ -669,7 +660,7 @@ import { appRouter } from '../appRouter';
return (index % numRandomColors) + 1; return (index % numRandomColors) + 1;
} else { } else {
return getRandomInt(1, numRandomColors); return randomInt(1, numRandomColors);
} }
} }

View File

@ -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',

View File

@ -1,3 +1,5 @@
import { randomInt } from '../../utils/number.ts';
let currentId = 0; let currentId = 0;
function addUniquePlaylistItemId(item) { function addUniquePlaylistItemId(item) {
if (!item.PlaylistItemId) { if (!item.PlaylistItemId) {
@ -56,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;

View File

@ -80,6 +80,13 @@
</div> </div>
</div> </div>
<div class="verticalSection">
<h2>${HeaderPerformance}</h2>
<div class="inputContainer">
<input is="emby-input" id="txtParallelImageEncodingLimit" label="${LabelParallelImageEncodingLimit}" type="number" pattern="[0-9]*" min="0" step="1" />
<div class="fieldDescription">${LabelParallelImageEncodingLimitHelp}</div>
</div>
</div>
<br /> <br />
<div> <div>
<button is="emby-button" type="submit" class="raised button-submit block"> <button is="emby-button" type="submit" class="raised button-submit block">

View File

@ -21,6 +21,7 @@ import alert from '../../components/alert';
$('#selectLocalizationLanguage', page).html(languageOptions.map(function (language) { $('#selectLocalizationLanguage', page).html(languageOptions.map(function (language) {
return '<option value="' + language.Value + '">' + language.Name + '</option>'; return '<option value="' + language.Value + '">' + language.Name + '</option>';
})).val(config.UICulture); })).val(config.UICulture);
page.querySelector('#txtParallelImageEncodingLimit').value = config.ParallelImageEncodingLimit || '';
loading.hide(); loading.hide();
} }
@ -36,6 +37,7 @@ import alert from '../../components/alert';
config.MetadataPath = $('#txtMetadataPath', form).val(); config.MetadataPath = $('#txtMetadataPath', form).val();
config.MetadataNetworkPath = $('#txtMetadataNetworkPath', form).val(); config.MetadataNetworkPath = $('#txtMetadataNetworkPath', form).val();
config.QuickConnectAvailable = form.querySelector('#chkQuickConnectAvailable').checked; config.QuickConnectAvailable = form.querySelector('#chkQuickConnectAvailable').checked;
config.ParallelImageEncodingLimit = parseInt(form.querySelector('#txtParallelImageEncodingLimit').value || '0', 10);
ApiClient.updateServerConfiguration(config).then(function() { ApiClient.updateServerConfiguration(config).then(function() {
ApiClient.getNamedConfiguration(brandingConfigKey).then(function(brandingConfig) { ApiClient.getNamedConfiguration(brandingConfigKey).then(function(brandingConfig) {

View File

@ -1,4 +1,5 @@
import { PluginType } from '../../types/plugin.ts'; import { PluginType } from '../../types/plugin.ts';
import { randomInt } from '../../utils/number.ts';
export default function () { export default function () {
const self = this; const self = this;
@ -25,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 },

View File

@ -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,6 +225,7 @@ 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;
@ -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')}

View File

@ -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": "Кароткаметражка"
} }

View File

@ -1714,5 +1714,7 @@
"SubtitleMagenta": "Magenta", "SubtitleMagenta": "Magenta",
"SubtitleRed": "Rot", "SubtitleRed": "Rot",
"SubtitleWhite": "Weiß", "SubtitleWhite": "Weiß",
"SubtitleYellow": "Gelb" "SubtitleYellow": "Gelb",
"Featurette": "Featurette",
"Short": "Kurzfilm"
} }

View File

@ -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"
} }

View File

@ -420,6 +420,7 @@
"HeaderPassword": "Password", "HeaderPassword": "Password",
"HeaderPasswordReset": "Password Reset", "HeaderPasswordReset": "Password Reset",
"HeaderPaths": "Paths", "HeaderPaths": "Paths",
"HeaderPerformance": "Performance",
"HeaderPhotoAlbums": "Photo Albums", "HeaderPhotoAlbums": "Photo Albums",
"HeaderPinCodeReset": "Reset Easy PIN Code", "HeaderPinCodeReset": "Reset Easy PIN Code",
"HeaderPlayAll": "Play All", "HeaderPlayAll": "Play All",
@ -791,6 +792,8 @@
"LabelOriginalName": "Original name:", "LabelOriginalName": "Original name:",
"LabelOriginalTitle": "Original title:", "LabelOriginalTitle": "Original title:",
"LabelOverview": "Overview:", "LabelOverview": "Overview:",
"LabelParallelImageEncodingLimit": "Parallel image encoding limit",
"LabelParallelImageEncodingLimitHelp": "Maximum amount of image encodings that are allowed to run in parallel. Setting this to 0 will choose a limit based on your system specs.",
"LabelParentalRating": "Parental rating:", "LabelParentalRating": "Parental rating:",
"LabelParentNumber": "Parent number:", "LabelParentNumber": "Parent number:",
"LabelPassword": "Password:", "LabelPassword": "Password:",

View File

@ -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"
} }

View File

@ -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 :",

View File

@ -109,7 +109,7 @@
"Connect": "Verbind", "Connect": "Verbind",
"ContinueWatching": "Verderkijken", "ContinueWatching": "Verderkijken",
"Continuing": "Wordt vervolgd", "Continuing": "Wordt vervolgd",
"CriticRating": "Critici-beoordeling", "CriticRating": "Beoordeling critici",
"CustomDlnaProfilesHelp": "Maak een aangepast profiel om een nieuw apparaat aan te maken of overschrijf een systeemprofiel.", "CustomDlnaProfilesHelp": "Maak een aangepast profiel om een nieuw apparaat aan te maken of overschrijf een systeemprofiel.",
"DateAdded": "Datum toegevoegd", "DateAdded": "Datum toegevoegd",
"DatePlayed": "Datum afgespeeld", "DatePlayed": "Datum afgespeeld",
@ -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!",
@ -822,7 +822,7 @@
"OptionAutomaticallyGroupSeriesHelp": "Series die verspreid zijn over meerdere mappen binnen deze bibliotheek worden automatisch samengevoegd tot één serie.", "OptionAutomaticallyGroupSeriesHelp": "Series die verspreid zijn over meerdere mappen binnen deze bibliotheek worden automatisch samengevoegd tot één serie.",
"OptionBluray": "BD", "OptionBluray": "BD",
"OptionCommunityRating": "Beoordeling gemeenschap", "OptionCommunityRating": "Beoordeling gemeenschap",
"OptionCriticRating": "Beoordeling door critici", "OptionCriticRating": "Beoordeling critici",
"OptionCustomUsers": "Aangepast", "OptionCustomUsers": "Aangepast",
"OptionDaily": "Dagelijks", "OptionDaily": "Dagelijks",
"OptionDateAdded": "Datum toegevoegd", "OptionDateAdded": "Datum toegevoegd",
@ -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"
} }

View File

@ -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": "短片"
} }

View File

@ -650,7 +650,7 @@
"LabelEmbedAlbumArtDidl": "於 DIDL 中嵌入專輯封面", "LabelEmbedAlbumArtDidl": "於 DIDL 中嵌入專輯封面",
"LabelEasyPinCode": "簡易PIN代碼", "LabelEasyPinCode": "簡易PIN代碼",
"LabelDynamicExternalId": "{0} Id:", "LabelDynamicExternalId": "{0} Id:",
"LabelDropSubtitleHere": "將字幕檔到這裡,或點擊瀏覽。", "LabelDropSubtitleHere": "將字幕檔拖動到這裡,或點擊瀏覽。",
"LabelDropShadow": "陰影:", "LabelDropShadow": "陰影:",
"LabelDroppedFrames": "丟棄的幀:", "LabelDroppedFrames": "丟棄的幀:",
"LabelDropImageHere": "拖移圖片到這裡,或是點擊來選取。", "LabelDropImageHere": "拖移圖片到這裡,或是點擊來選取。",
@ -1096,5 +1096,11 @@
"LabelSyncPlaySettingsSyncCorrection": "同步校正", "LabelSyncPlaySettingsSyncCorrection": "同步校正",
"HomeVideosPhotos": "家庭影片及相片", "HomeVideosPhotos": "家庭影片及相片",
"MessageConfirmRevokeApiKey": "你是否確定要廢除此 API Key有關程序將無法再連接此伺服器。", "MessageConfirmRevokeApiKey": "你是否確定要廢除此 API Key有關程序將無法再連接此伺服器。",
"LabelSyncPlaySettingsExtraTimeOffsetHelp": "為目標裝置調較 SyncPlay 延遲時間(毫秒)以改善不同步問題,請小心調較。" "LabelSyncPlaySettingsExtraTimeOffsetHelp": "為目標裝置調較 SyncPlay 延遲時間(毫秒)以改善不同步問題,請小心調較。",
"Experimental": "試驗性",
"HeaderDummyChapter": "章節圖片",
"IgnoreDtsHelp": "禁用此選項或可解決部份問題,如無法正常播放外部音訊。",
"DownloadAll": "全部下載",
"LabelDummyChapterDuration": "間距:",
"LabelDummyChapterDurationHelp": "章節圖片擷取間距(秒)"
} }

View File

@ -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.