diff --git a/.eslintrc.js b/.eslintrc.js index 91a4cf29c3..01714c04c4 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -64,7 +64,9 @@ module.exports = { 'no-var': ['error'], 'no-void': ['error', { 'allowAsStatement': true }], 'no-warning-comments': ['warn', { 'terms': ['fixme', 'hack', 'xxx'] }], + 'object-curly-spacing': ['error', 'always'], 'one-var': ['error', 'never'], + 'operator-linebreak': ['error', 'before', { overrides: { '?': 'after', ':': 'after', '=': 'after' } }], 'padded-blocks': ['error', 'never'], 'prefer-const': ['error', { 'destructuring': 'all' }], 'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }], @@ -267,7 +269,6 @@ module.exports = { 'no-useless-constructor': ['off'], '@typescript-eslint/no-useless-constructor': ['error'], - 'max-params': ['error', 7], 'sonarjs/cognitive-complexity': ['warn'] } } diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index d9c4eadc27..a607dd0da6 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -19,13 +19,13 @@ jobs: language: [ 'javascript' ] steps: - name: Checkout repository - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - name: Initialize CodeQL - uses: github/codeql-action/init@168b99b3c22180941ae7dbdd5f5c9678ede476ba # v2.2.7 + uses: github/codeql-action/init@04df1262e6247151b5ac09cd2c303ac36ad3f62b # v2.2.9 with: languages: ${{ matrix.language }} queries: +security-extended - name: Autobuild - uses: github/codeql-action/autobuild@168b99b3c22180941ae7dbdd5f5c9678ede476ba # v2.2.7 + uses: github/codeql-action/autobuild@04df1262e6247151b5ac09cd2c303ac36ad3f62b # v2.2.9 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@168b99b3c22180941ae7dbdd5f5c9678ede476ba # v2.2.7 + uses: github/codeql-action/analyze@04df1262e6247151b5ac09cd2c303ac36ad3f62b # v2.2.9 diff --git a/.github/workflows/commands.yml b/.github/workflows/commands.yml index 8707e1e1ea..2f10d09e03 100644 --- a/.github/workflows/commands.yml +++ b/.github/workflows/commands.yml @@ -18,7 +18,7 @@ jobs: comment-id: ${{ github.event.comment.id }} reactions: '+1' - name: Checkout the latest code - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 with: token: ${{ secrets.JF_BOT_TOKEN }} fetch-depth: 0 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 376a215b94..8a9f26a3cf 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - name: Setup node environment uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 @@ -37,7 +37,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - name: Setup node environment uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 @@ -58,7 +58,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - name: Setup node environment uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 @@ -82,7 +82,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - name: Setup node environment uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 diff --git a/.github/workflows/repo-stale.yaml b/.github/workflows/repo-stale.yaml index 34b8976a1f..a847eeb678 100644 --- a/.github/workflows/repo-stale.yaml +++ b/.github/workflows/repo-stale.yaml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest if: ${{ contains(github.repository, 'jellyfin/') }} steps: - - uses: actions/stale@6f05e4244c9a0b2ed3401882b05d701dd0a7289b # v7.0.0 + - uses: actions/stale@1160a2240286f5da8ec72b1c0816ce2481aabf84 # v8.0.0 with: repo-token: ${{ secrets.JF_BOT_TOKEN }} operations-per-run: 75 @@ -37,7 +37,7 @@ jobs: runs-on: ubuntu-latest if: ${{ contains(github.repository, 'jellyfin/') }} steps: - - uses: actions/stale@6f05e4244c9a0b2ed3401882b05d701dd0a7289b # v7.0.0 + - uses: actions/stale@1160a2240286f5da8ec72b1c0816ce2481aabf84 # v8.0.0 with: repo-token: ${{ secrets.JF_BOT_TOKEN }} operations-per-run: 75 diff --git a/.github/workflows/tsc.yml b/.github/workflows/tsc.yml index 2ca9e29d68..8c2686a7ed 100644 --- a/.github/workflows/tsc.yml +++ b/.github/workflows/tsc.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - name: Setup node environment uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 diff --git a/package-lock.json b/package-lock.json index e33bce82dd..c2c37b5e2c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,10 +20,10 @@ "blurhash": "2.0.5", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", - "core-js": "3.29.0", + "core-js": "3.29.1", "date-fns": "2.29.3", "dompurify": "3.0.1", - "epubjs": "0.4.2", + "epubjs": "0.3.93", "escape-html": "1.0.3", "event-target-polyfill": "github:ThaUnknown/event-target-polyfill", "fast-text-encoding": "1.0.6", @@ -34,17 +34,17 @@ "intersection-observer": "0.12.2", "jassub": "1.5.12", "jellyfin-apiclient": "1.10.0", - "jquery": "3.6.3", + "jquery": "3.6.4", "jstree": "3.3.15", "libarchive.js": "1.3.0", "lodash-es": "4.17.21", - "marked": "4.2.12", + "marked": "4.3.0", "material-design-icons-iconfont": "6.7.0", "native-promise-only": "0.8.1", "pdfjs-dist": "2.16.105", "react": "17.0.2", "react-dom": "17.0.2", - "react-router-dom": "6.8.2", + "react-router-dom": "6.9.0", "resize-observer-polyfill": "1.5.1", "screenfull": "6.0.2", "sortablejs": "1.15.0", @@ -55,8 +55,8 @@ "workbox-precaching": "6.5.4" }, "devDependencies": { - "@babel/core": "7.21.0", - "@babel/eslint-parser": "7.19.1", + "@babel/core": "7.21.3", + "@babel/eslint-parser": "7.21.3", "@babel/eslint-plugin": "7.19.1", "@babel/plugin-proposal-class-properties": "7.18.6", "@babel/plugin-proposal-private-methods": "7.18.6", @@ -66,13 +66,13 @@ "@babel/preset-typescript": "7.21.0", "@types/escape-html": "1.0.2", "@types/loadable__component": "5.13.4", - "@types/lodash-es": "4.17.6", + "@types/lodash-es": "4.17.7", "@types/react": "17.0.53", "@types/react-dom": "17.0.19", - "@typescript-eslint/eslint-plugin": "5.54.1", - "@typescript-eslint/parser": "5.54.1", + "@typescript-eslint/eslint-plugin": "5.56.0", + "@typescript-eslint/parser": "5.56.0", "@uupaa/dynamic-import-polyfill": "1.0.2", - "autoprefixer": "10.4.13", + "autoprefixer": "10.4.14", "babel-loader": "9.1.2", "babel-plugin-dynamic-import-polyfill": "1.0.0", "clean-webpack-plugin": "4.0.0", @@ -82,7 +82,7 @@ "css-loader": "6.7.3", "cssnano": "5.1.15", "es-check": "7.1.0", - "eslint": "8.35.0", + "eslint": "8.36.0", "eslint-plugin-compat": "4.1.2", "eslint-plugin-eslint-comments": "3.2.0", "eslint-plugin-import": "2.27.5", @@ -90,29 +90,29 @@ "eslint-plugin-promise": "6.1.1", "eslint-plugin-react": "7.32.2", "eslint-plugin-react-hooks": "4.6.0", - "eslint-plugin-sonarjs": "0.18.0", - "expose-loader": "4.0.0", + "eslint-plugin-sonarjs": "0.19.0", + "expose-loader": "4.1.0", "html-loader": "4.2.0", "html-webpack-plugin": "5.5.0", - "mini-css-extract-plugin": "2.7.3", + "mini-css-extract-plugin": "2.7.5", "postcss": "8.4.21", - "postcss-loader": "7.0.2", + "postcss-loader": "7.1.0", "postcss-preset-env": "8.0.1", "postcss-scss": "4.0.6", - "sass": "1.58.3", - "sass-loader": "13.2.0", + "sass": "1.59.3", + "sass-loader": "13.2.1", "source-map-loader": "4.0.1", - "style-loader": "3.3.1", - "stylelint": "15.2.0", + "style-loader": "3.3.2", + "stylelint": "15.3.0", "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.2.1", "stylelint-order": "6.0.3", - "stylelint-scss": "4.4.0", + "stylelint-scss": "4.5.0", "ts-loader": "9.4.2", - "typescript": "4.9.5", - "webpack": "5.76.0", + "typescript": "5.0.2", + "webpack": "5.76.3", "webpack-cli": "5.0.1", - "webpack-dev-server": "4.11.1", + "webpack-dev-server": "4.13.1", "webpack-merge": "5.8.0", "workbox-webpack-plugin": "6.5.4", "worker-loader": "3.0.8" @@ -197,21 +197,21 @@ } }, "node_modules/@babel/core": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", - "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", + "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", + "@babel/generator": "^7.21.3", "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.0", + "@babel/helper-module-transforms": "^7.21.2", "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.0", + "@babel/parser": "^7.21.3", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0", + "@babel/traverse": "^7.21.3", + "@babel/types": "^7.21.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -227,9 +227,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz", - "integrity": "sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.3.tgz", + "integrity": "sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -261,12 +261,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", - "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", + "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", "dev": true, "dependencies": { - "@babel/types": "^7.21.0", + "@babel/types": "^7.21.3", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -641,9 +641,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", - "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", + "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1911,19 +1911,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", - "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", + "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", + "@babel/generator": "^7.21.3", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.2", - "@babel/types": "^7.21.2", + "@babel/parser": "^7.21.3", + "@babel/types": "^7.21.3", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1932,9 +1932,9 @@ } }, "node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", + "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.19.4", @@ -2001,9 +2001,9 @@ } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.0.1.tgz", - "integrity": "sha512-sYD3H7ReR88S/4+V5VbKiBEUJF4FqvG+8aNJkxqoPAnbhFziDG22IDZc4+h+xA63SfgM+h15lq5OnLeCxQ9nPA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.1.0.tgz", + "integrity": "sha512-dtqFyoJBHUxGi9zPZdpCKP1xk8tq6KPHJ/NY4qWXiYo6IcSGwzk3L8x2XzZbbyOyBs9xQARoGveU2AsgLj6D2A==", "dev": true, "engines": { "node": "^14 || ^16 || >=18" @@ -2431,15 +2431,48 @@ "node": ">=10.0.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.1.tgz", + "integrity": "sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", - "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", + "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.5.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -2535,9 +2568,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", - "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2763,9 +2796,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.3.tgz", - "integrity": "sha512-YRHie1yQEj0kqqCTCJEfHqYSSNlZQ696QJG+MMiW4mxSl9I0ojz/eRhJS4fs88Z5i6D1SmoF9d3K99/QOhI8/w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.4.0.tgz", + "integrity": "sha512-BJ9SxXux8zAg991UmT8slpwpsd31K1dHHbD3Ba4VzD+liLQ4WAMSxQp2d2ZPRPfN0jN2NPRowcSSoM7lCaF08Q==", "engines": { "node": ">=14" } @@ -3009,6 +3042,15 @@ "@types/react": "*" } }, + "node_modules/@types/localforage": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/localforage/-/localforage-0.0.34.tgz", + "integrity": "sha512-tJxahnjm9dEI1X+hQSC5f2BSd/coZaqbIl1m3TCl0q9SVuC52XcXfV0XmoCU1+PmjyucuVITwoTnN8OlTbEXXA==", + "deprecated": "This is a stub types definition for localforage (https://github.com/localForage/localForage). localforage provides its own type definitions, so you don't need @types/localforage installed!", + "dependencies": { + "localforage": "*" + } + }, "node_modules/@types/lodash": { "version": "4.14.178", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", @@ -3016,9 +3058,9 @@ "dev": true }, "node_modules/@types/lodash-es": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz", - "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==", + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.7.tgz", + "integrity": "sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==", "dev": true, "dependencies": { "@types/lodash": "*" @@ -3054,12 +3096,6 @@ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, "node_modules/@types/prop-types": { "version": "15.7.4", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", @@ -3196,19 +3232,19 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz", - "integrity": "sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.56.0.tgz", + "integrity": "sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.54.1", - "@typescript-eslint/type-utils": "5.54.1", - "@typescript-eslint/utils": "5.54.1", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.56.0", + "@typescript-eslint/type-utils": "5.56.0", + "@typescript-eslint/utils": "5.56.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -3245,14 +3281,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.1.tgz", - "integrity": "sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.56.0.tgz", + "integrity": "sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.54.1", - "@typescript-eslint/types": "5.54.1", - "@typescript-eslint/typescript-estree": "5.54.1", + "@typescript-eslint/scope-manager": "5.56.0", + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/typescript-estree": "5.56.0", "debug": "^4.3.4" }, "engines": { @@ -3272,13 +3308,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz", - "integrity": "sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", + "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.54.1", - "@typescript-eslint/visitor-keys": "5.54.1" + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/visitor-keys": "5.56.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3289,13 +3325,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz", - "integrity": "sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz", + "integrity": "sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.54.1", - "@typescript-eslint/utils": "5.54.1", + "@typescript-eslint/typescript-estree": "5.56.0", + "@typescript-eslint/utils": "5.56.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -3316,9 +3352,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.1.tgz", - "integrity": "sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", + "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3329,13 +3365,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz", - "integrity": "sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", + "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.54.1", - "@typescript-eslint/visitor-keys": "5.54.1", + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/visitor-keys": "5.56.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3400,18 +3436,18 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.1.tgz", - "integrity": "sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.56.0.tgz", + "integrity": "sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==", "dev": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.54.1", - "@typescript-eslint/types": "5.54.1", - "@typescript-eslint/typescript-estree": "5.54.1", + "@typescript-eslint/scope-manager": "5.56.0", + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/typescript-estree": "5.56.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "engines": { @@ -3441,12 +3477,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz", - "integrity": "sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", + "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/types": "5.56.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -3662,6 +3698,14 @@ } } }, + "node_modules/@xmldom/xmldom": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.9.tgz", + "integrity": "sha512-yceMpm/xd4W2a85iqZyO09gTnHvXF6pyiWjD2jcOJs7hRoZtNNOO1eJlhHj1ixA+xip2hOyGn+LgcvLCMo5zXA==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -4053,9 +4097,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "dev": true, "funding": [ { @@ -4068,8 +4112,8 @@ } ], "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -4625,9 +4669,9 @@ "dev": true }, "node_modules/caniuse-lite": { - "version": "1.0.30001456", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001456.tgz", - "integrity": "sha512-XFHJY5dUgmpMV25UqaD4kVq2LsiaU5rS8fb0f17pCoXQiQslzmFgnfOxfvo1bTpTqf7dwG/N/05CnLCnOEKmzA==", + "version": "1.0.30001466", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001466.tgz", + "integrity": "sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==", "devOptional": true, "funding": [ { @@ -5162,9 +5206,9 @@ } }, "node_modules/core-js": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.0.tgz", - "integrity": "sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg==", + "version": "3.29.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.1.tgz", + "integrity": "sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -6177,17 +6221,19 @@ } }, "node_modules/epubjs": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/epubjs/-/epubjs-0.4.2.tgz", - "integrity": "sha512-ex+ntja2AmPeq++qgjYfwrEzrO8UUBbTch1RJcRftShUmn8no6qi4Cax75FH0QopLA+6L8HM6iR94M0/I8V3GQ==", + "version": "0.3.93", + "resolved": "https://registry.npmjs.org/epubjs/-/epubjs-0.3.93.tgz", + "integrity": "sha512-c06pNSdBxcXv3dZSbXAVLE1/pmleRhOT6mXNZo6INKmvuKpYB65MwU/lO7830czCtjIiK9i+KR+3S+p0wtljrw==", "dependencies": { + "@types/localforage": "0.0.34", + "@xmldom/xmldom": "^0.7.5", + "core-js": "^3.18.3", "event-emitter": "^0.3.5", - "jszip": "^3.1.5", - "lodash": "^4.17.5", - "marks-pane": "^1.0.7", - "path-webpack": "0.0.3", - "stream-browserify": "^2.0.1", - "xmldom": "^0.1.27" + "jszip": "^3.7.1", + "localforage": "^1.10.0", + "lodash": "^4.17.21", + "marks-pane": "^1.0.9", + "path-webpack": "0.0.3" } }, "node_modules/error-ex": { @@ -6406,13 +6452,15 @@ } }, "node_modules/eslint": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", - "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^2.0.0", - "@eslint/js": "8.35.0", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -6423,9 +6471,8 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", + "espree": "^9.5.0", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -6447,7 +6494,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -6836,9 +6882,9 @@ } }, "node_modules/eslint-plugin-sonarjs": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.18.0.tgz", - "integrity": "sha512-DJ3osLnt6KFdT5e9ZuIDOjT5A6wUGSLeiJJT03lPgpdD+7CVWlYAw9Goe3bt7SmbFO3Xh89NOCZAuB9XA7bAUQ==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.19.0.tgz", + "integrity": "sha512-6+s5oNk5TFtVlbRxqZN7FIGmjdPCYQKaTzFPmqieCmsU1kBYDzndTeQav0xtQNwZJWu5awWfTGe8Srq9xFOGnw==", "dev": true, "engines": { "node": ">=14" @@ -6869,24 +6915,6 @@ "node": ">=8.0.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, "node_modules/eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", @@ -7172,9 +7200,9 @@ } }, "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", + "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", "dev": true, "dependencies": { "acorn": "^8.8.0", @@ -7395,9 +7423,9 @@ "dev": true }, "node_modules/expose-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-4.0.0.tgz", - "integrity": "sha512-kUEvHyf6MPR2ubZCL9aziP9Br5wxMvq1cghTpYhM6MW52NPq+7hXixw2EqQuI1SvGb1fDjc2ehJOg6645wR6ww==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-4.1.0.tgz", + "integrity": "sha512-oLAesnzerwDGGADzBMnu0LPqqnlVz6e2V9lTa+/4X6VeW9W93x/nJpw05WBrcIdbqXm/EdnEQpiVDFFiQXuNfg==", "dev": true, "engines": { "node": ">= 14.15.0" @@ -9707,9 +9735,9 @@ } }, "node_modules/jquery": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz", - "integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==" + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz", + "integrity": "sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ==" }, "node_modules/js-base64": { "version": "2.6.4", @@ -9866,18 +9894,18 @@ } }, "node_modules/klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true, "engines": { "node": ">= 8" } }, "node_modules/known-css-properties": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", - "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz", + "integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==", "dev": true }, "node_modules/kuler": { @@ -9901,6 +9929,16 @@ "language-subtag-registry": "~0.3.2" } }, + "node_modules/launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, "node_modules/leven": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", @@ -9928,6 +9966,14 @@ "resolved": "https://registry.npmjs.org/libarchive.js/-/libarchive.js-1.3.0.tgz", "integrity": "sha512-EkQfRXt9DhWwj6BnEA2TNpOf4jTnzSTUPGgE+iFxcdNqjktY8GitbDeHnx8qZA0/IukNyyBUR3oQKRdYkO+HFg==" }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lilconfig": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", @@ -9966,6 +10012,14 @@ "node": ">=8.9.0" } }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "dependencies": { + "lie": "3.1.1" + } + }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -10166,9 +10220,9 @@ "dev": true }, "node_modules/marked": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz", - "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "bin": { "marked": "bin/marked.js" }, @@ -10409,9 +10463,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.3.tgz", - "integrity": "sha512-CD9cXeKeXLcnMw8FZdtfrRrLaM7gwCl4nKuKn2YkY2Bw5wdlB8zU2cCzw+w2zS9RFvbrufTBkMCJACNPwqQA0w==", + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz", + "integrity": "sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ==", "dev": true, "dependencies": { "schema-utils": "^4.0.0" @@ -11837,13 +11891,13 @@ } }, "node_modules/postcss-loader": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.2.tgz", - "integrity": "sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.1.0.tgz", + "integrity": "sha512-vTD2DJ8vJD0Vr1WzMQkRZWRjcynGh3t7NeoLg+Sb1TeuK7etiZfL/ZwHbaVa3M+Qni7Lj/29voV9IggnIUjlIw==", "dev": true, "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", + "cosmiconfig": "^8.0.0", + "klona": "^2.0.6", "semver": "^7.3.8" }, "engines": { @@ -11858,20 +11912,28 @@ "webpack": "^5.0.0" } }, + "node_modules/postcss-loader/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/postcss-loader/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", + "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", "dev": true, "dependencies": { - "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "path-type": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" } }, "node_modules/postcss-loader/node_modules/import-fresh": { @@ -11890,6 +11952,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/postcss-loader/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/postcss-loader/node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -13128,11 +13202,11 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-router": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.2.tgz", - "integrity": "sha512-lF7S0UmXI5Pd8bmHvMdPKI4u4S5McxmHnzJhrYi9ZQ6wE+DA8JN5BzVC5EEBuduWWDaiJ8u6YhVOCmThBli+rw==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.9.0.tgz", + "integrity": "sha512-51lKevGNUHrt6kLuX3e/ihrXoXCa9ixY/nVWRLlob4r/l0f45x3SzBvYJe3ctleLUQQ5fVa4RGgJOTH7D9Umhw==", "dependencies": { - "@remix-run/router": "1.3.3" + "@remix-run/router": "1.4.0" }, "engines": { "node": ">=14" @@ -13142,12 +13216,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.2.tgz", - "integrity": "sha512-N/oAF1Shd7g4tWy+75IIufCGsHBqT74tnzHQhbiUTYILYF0Blk65cg+HPZqwC+6SqEyx033nKqU7by38v3lBZg==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.9.0.tgz", + "integrity": "sha512-/seUAPY01VAuwkGyVBPCn1OXfVbaWGGu4QN9uj0kCPcTyNYgL1ldZpxZUpRU7BLheKQI4Twtl/OW2nHRF1u26Q==", "dependencies": { - "@remix-run/router": "1.3.3", - "react-router": "6.8.2" + "@remix-run/router": "1.4.0", + "react-router": "6.9.0" }, "engines": { "node": ">=14" @@ -13347,18 +13421,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/regexpu-core": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", @@ -13708,9 +13770,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.58.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz", - "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==", + "version": "1.59.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.59.3.tgz", + "integrity": "sha512-QCq98N3hX1jfTCoUAsF3eyGuXLsY7BCnCEg9qAact94Yc21npG2/mVOqoDvE0fCbWDqiM4WlcJQla0gWG2YlxQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -13725,12 +13787,12 @@ } }, "node_modules/sass-loader": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", - "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.1.tgz", + "integrity": "sha512-VQUrgUa5/waIzMrzyuko3sj5WD9NMsYph91cNICx+OaODbRtLl6To2fswLx8MH2qNxXFqRtpvdPQIa7mE93YOA==", "dev": true, "dependencies": { - "klona": "^2.0.4", + "klona": "^2.0.6", "neo-async": "^2.6.2" }, "engines": { @@ -14046,6 +14108,15 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", + "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -14579,15 +14650,6 @@ "node": ">= 0.4" } }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -14765,9 +14827,9 @@ } }, "node_modules/style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.2.tgz", + "integrity": "sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw==", "dev": true, "engines": { "node": ">= 12.13.0" @@ -14803,18 +14865,18 @@ } }, "node_modules/stylelint": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.2.0.tgz", - "integrity": "sha512-wjg5OLn8zQwjlj5cYUgyQpMWKzct42AG5dYlqkHRJQJqsystFFn3onqEc263KH4xfEI0W3lZCnlIhFfS64uwSA==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.3.0.tgz", + "integrity": "sha512-9UYBYk7K9rtlKcTUDZrtntE840sZM00qyYBQHHe7tjwMNUsPsGvR6Fd43IxHEAhRrDLzpy3TVaHb6CReBB3eFg==", "dev": true, "dependencies": { "@csstools/css-parser-algorithms": "^2.0.1", - "@csstools/css-tokenizer": "^2.0.1", + "@csstools/css-tokenizer": "^2.1.0", "@csstools/media-query-list-parser": "^2.0.1", "@csstools/selector-specificity": "^2.1.1", "balanced-match": "^2.0.0", "colord": "^2.9.3", - "cosmiconfig": "^8.0.0", + "cosmiconfig": "^8.1.0", "css-functions-list": "^3.1.0", "css-tree": "^2.3.1", "debug": "^4.3.4", @@ -14829,7 +14891,7 @@ "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.26.0", + "known-css-properties": "^0.27.0", "mathml-tag-names": "^2.1.3", "meow": "^9.0.0", "micromatch": "^4.0.5", @@ -14845,7 +14907,7 @@ "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "style-search": "^0.1.0", - "supports-hyperlinks": "^2.3.0", + "supports-hyperlinks": "^3.0.0", "svg-tags": "^1.0.0", "table": "^6.8.1", "v8-compile-cache": "^2.3.0", @@ -17099,9 +17161,9 @@ } }, "node_modules/stylelint-scss": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.4.0.tgz", - "integrity": "sha512-Qy66a+/30aylFhPmUArHhVsHOun1qrO93LGT15uzLuLjWS7hKDfpFm34mYo1ndR4MCo8W4bEZM1+AlJRJORaaw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.5.0.tgz", + "integrity": "sha512-/+rQ8FePOiwT5xblOHkujYzRYfSjmE6HYhLpqJShL+9wH6/HaAVj4mWpXlpEsM3ZgIpOblG9Y+/BycSJzWgjNw==", "dev": true, "dependencies": { "lodash": "^4.17.21", @@ -17136,9 +17198,9 @@ "dev": true }, "node_modules/stylelint/node_modules/cosmiconfig": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.0.tgz", - "integrity": "sha512-0tLZ9URlPGU7JsKq0DQOQ3FoRsYX8xDZ7xMiATQfaiGMz7EHowNkbU9u1coAOmnh9p/1ySpm0RB3JNWRXM5GCg==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", + "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", "dev": true, "dependencies": { "import-fresh": "^3.2.1", @@ -17342,16 +17404,16 @@ } }, "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", + "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", "dev": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.18" } }, "node_modules/supports-hyperlinks/node_modules/has-flag": { @@ -17958,16 +18020,16 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.20" } }, "node_modules/unbox-primitive": { @@ -18375,9 +18437,9 @@ "dev": true }, "node_modules/webpack": { - "version": "5.76.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", - "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", + "version": "5.76.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz", + "integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==", "devOptional": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -18511,9 +18573,9 @@ "dev": true }, "node_modules/webpack-dev-server": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", - "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.1.tgz", + "integrity": "sha512-5tWg00bnWbYgkN+pd5yISQKDejRBYGEw15RaEEslH+zdbNDxxaZvEAO2WulaSaFKb5n3YG8JXsGaDsut1D0xdA==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -18535,6 +18597,7 @@ "html-entities": "^2.3.2", "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", "open": "^8.0.9", "p-retry": "^4.5.0", "rimraf": "^3.0.2", @@ -18544,7 +18607,7 @@ "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" + "ws": "^8.13.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" @@ -18560,6 +18623,9 @@ "webpack": "^4.37.0 || ^5.0.0" }, "peerDependenciesMeta": { + "webpack": { + "optional": true + }, "webpack-cli": { "optional": true } @@ -19202,16 +19268,16 @@ "dev": true }, "node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "dev": true, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -19228,15 +19294,6 @@ "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", "dev": true }, - "node_modules/xmldom": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", - "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", - "deprecated": "Deprecated due to CVE-2021-21366 resolved in 0.5.0", - "engines": { - "node": ">=0.1" - } - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -19341,21 +19398,21 @@ "dev": true }, "@babel/core": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", - "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", + "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", + "@babel/generator": "^7.21.3", "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.0", + "@babel/helper-module-transforms": "^7.21.2", "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.0", + "@babel/parser": "^7.21.3", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0", + "@babel/traverse": "^7.21.3", + "@babel/types": "^7.21.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -19364,9 +19421,9 @@ } }, "@babel/eslint-parser": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz", - "integrity": "sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.3.tgz", + "integrity": "sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==", "dev": true, "requires": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -19384,12 +19441,12 @@ } }, "@babel/generator": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", - "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", + "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", "dev": true, "requires": { - "@babel/types": "^7.21.0", + "@babel/types": "^7.21.3", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -19673,9 +19730,9 @@ } }, "@babel/parser": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", - "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", + "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -20517,27 +20574,27 @@ } }, "@babel/traverse": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", - "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", + "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", + "@babel/generator": "^7.21.3", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.2", - "@babel/types": "^7.21.2", + "@babel/parser": "^7.21.3", + "@babel/types": "^7.21.3", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", + "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.19.4", @@ -20572,9 +20629,9 @@ "requires": {} }, "@csstools/css-tokenizer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.0.1.tgz", - "integrity": "sha512-sYD3H7ReR88S/4+V5VbKiBEUJF4FqvG+8aNJkxqoPAnbhFziDG22IDZc4+h+xA63SfgM+h15lq5OnLeCxQ9nPA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.1.0.tgz", + "integrity": "sha512-dtqFyoJBHUxGi9zPZdpCKP1xk8tq6KPHJ/NY4qWXiYo6IcSGwzk3L8x2XzZbbyOyBs9xQARoGveU2AsgLj6D2A==", "dev": true }, "@csstools/media-query-list-parser": { @@ -20784,15 +20841,38 @@ "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", "dev": true }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + } + } + }, + "@eslint-community/regexpp": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.1.tgz", + "integrity": "sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw==", + "dev": true + }, "@eslint/eslintrc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", - "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", + "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.5.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -20862,9 +20942,9 @@ } }, "@eslint/js": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", - "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", "dev": true }, "@fontsource/noto-sans": { @@ -21046,9 +21126,9 @@ } }, "@remix-run/router": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.3.tgz", - "integrity": "sha512-YRHie1yQEj0kqqCTCJEfHqYSSNlZQ696QJG+MMiW4mxSl9I0ojz/eRhJS4fs88Z5i6D1SmoF9d3K99/QOhI8/w==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.4.0.tgz", + "integrity": "sha512-BJ9SxXux8zAg991UmT8slpwpsd31K1dHHbD3Ba4VzD+liLQ4WAMSxQp2d2ZPRPfN0jN2NPRowcSSoM7lCaF08Q==" }, "@rollup/plugin-babel": { "version": "5.3.1", @@ -21260,6 +21340,14 @@ "@types/react": "*" } }, + "@types/localforage": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/localforage/-/localforage-0.0.34.tgz", + "integrity": "sha512-tJxahnjm9dEI1X+hQSC5f2BSd/coZaqbIl1m3TCl0q9SVuC52XcXfV0XmoCU1+PmjyucuVITwoTnN8OlTbEXXA==", + "requires": { + "localforage": "*" + } + }, "@types/lodash": { "version": "4.14.178", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", @@ -21267,9 +21355,9 @@ "dev": true }, "@types/lodash-es": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz", - "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==", + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.7.tgz", + "integrity": "sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==", "dev": true, "requires": { "@types/lodash": "*" @@ -21305,12 +21393,6 @@ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, "@types/prop-types": { "version": "15.7.4", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", @@ -21446,19 +21528,19 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz", - "integrity": "sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.56.0.tgz", + "integrity": "sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.54.1", - "@typescript-eslint/type-utils": "5.54.1", - "@typescript-eslint/utils": "5.54.1", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.56.0", + "@typescript-eslint/type-utils": "5.56.0", + "@typescript-eslint/utils": "5.56.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -21475,53 +21557,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.1.tgz", - "integrity": "sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.56.0.tgz", + "integrity": "sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.54.1", - "@typescript-eslint/types": "5.54.1", - "@typescript-eslint/typescript-estree": "5.54.1", + "@typescript-eslint/scope-manager": "5.56.0", + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/typescript-estree": "5.56.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz", - "integrity": "sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", + "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.54.1", - "@typescript-eslint/visitor-keys": "5.54.1" + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/visitor-keys": "5.56.0" } }, "@typescript-eslint/type-utils": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz", - "integrity": "sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz", + "integrity": "sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.54.1", - "@typescript-eslint/utils": "5.54.1", + "@typescript-eslint/typescript-estree": "5.56.0", + "@typescript-eslint/utils": "5.56.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.1.tgz", - "integrity": "sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", + "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz", - "integrity": "sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", + "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.54.1", - "@typescript-eslint/visitor-keys": "5.54.1", + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/visitor-keys": "5.56.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -21561,18 +21643,18 @@ } }, "@typescript-eslint/utils": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.1.tgz", - "integrity": "sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.56.0.tgz", + "integrity": "sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==", "dev": true, "requires": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.54.1", - "@typescript-eslint/types": "5.54.1", - "@typescript-eslint/typescript-estree": "5.54.1", + "@typescript-eslint/scope-manager": "5.56.0", + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/typescript-estree": "5.56.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "dependencies": { @@ -21588,12 +21670,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz", - "integrity": "sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", + "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", "dev": true, "requires": { - "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/types": "5.56.0", "eslint-visitor-keys": "^3.3.0" }, "dependencies": { @@ -21778,6 +21860,11 @@ "dev": true, "requires": {} }, + "@xmldom/xmldom": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.9.tgz", + "integrity": "sha512-yceMpm/xd4W2a85iqZyO09gTnHvXF6pyiWjD2jcOJs7hRoZtNNOO1eJlhHj1ixA+xip2hOyGn+LgcvLCMo5zXA==" + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -22071,13 +22158,13 @@ "dev": true }, "autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "dev": true, "requires": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -22511,9 +22598,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001456", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001456.tgz", - "integrity": "sha512-XFHJY5dUgmpMV25UqaD4kVq2LsiaU5rS8fb0f17pCoXQiQslzmFgnfOxfvo1bTpTqf7dwG/N/05CnLCnOEKmzA==", + "version": "1.0.30001466", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001466.tgz", + "integrity": "sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==", "devOptional": true }, "ccount": { @@ -22912,9 +22999,9 @@ } }, "core-js": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.0.tgz", - "integrity": "sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg==" + "version": "3.29.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.1.tgz", + "integrity": "sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==" }, "core-js-compat": { "version": "3.25.3", @@ -23653,17 +23740,19 @@ "dev": true }, "epubjs": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/epubjs/-/epubjs-0.4.2.tgz", - "integrity": "sha512-ex+ntja2AmPeq++qgjYfwrEzrO8UUBbTch1RJcRftShUmn8no6qi4Cax75FH0QopLA+6L8HM6iR94M0/I8V3GQ==", + "version": "0.3.93", + "resolved": "https://registry.npmjs.org/epubjs/-/epubjs-0.3.93.tgz", + "integrity": "sha512-c06pNSdBxcXv3dZSbXAVLE1/pmleRhOT6mXNZo6INKmvuKpYB65MwU/lO7830czCtjIiK9i+KR+3S+p0wtljrw==", "requires": { + "@types/localforage": "0.0.34", + "@xmldom/xmldom": "^0.7.5", + "core-js": "^3.18.3", "event-emitter": "^0.3.5", - "jszip": "^3.1.5", - "lodash": "^4.17.5", - "marks-pane": "^1.0.7", - "path-webpack": "0.0.3", - "stream-browserify": "^2.0.1", - "xmldom": "^0.1.27" + "jszip": "^3.7.1", + "localforage": "^1.10.0", + "lodash": "^4.17.21", + "marks-pane": "^1.0.9", + "path-webpack": "0.0.3" } }, "error-ex": { @@ -23847,13 +23936,15 @@ "dev": true }, "eslint": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", - "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", "dev": true, "requires": { - "@eslint/eslintrc": "^2.0.0", - "@eslint/js": "8.35.0", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -23864,9 +23955,8 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", + "espree": "^9.5.0", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -23888,7 +23978,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -24361,9 +24450,9 @@ "requires": {} }, "eslint-plugin-sonarjs": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.18.0.tgz", - "integrity": "sha512-DJ3osLnt6KFdT5e9ZuIDOjT5A6wUGSLeiJJT03lPgpdD+7CVWlYAw9Goe3bt7SmbFO3Xh89NOCZAuB9XA7bAUQ==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.19.0.tgz", + "integrity": "sha512-6+s5oNk5TFtVlbRxqZN7FIGmjdPCYQKaTzFPmqieCmsU1kBYDzndTeQav0xtQNwZJWu5awWfTGe8Srq9xFOGnw==", "dev": true, "requires": {} }, @@ -24383,15 +24472,6 @@ "estraverse": "^4.1.1" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - }, "eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", @@ -24399,9 +24479,9 @@ "dev": true }, "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", + "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", "dev": true, "requires": { "acorn": "^8.8.0", @@ -24574,9 +24654,9 @@ } }, "expose-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-4.0.0.tgz", - "integrity": "sha512-kUEvHyf6MPR2ubZCL9aziP9Br5wxMvq1cghTpYhM6MW52NPq+7hXixw2EqQuI1SvGb1fDjc2ehJOg6645wR6ww==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-4.1.0.tgz", + "integrity": "sha512-oLAesnzerwDGGADzBMnu0LPqqnlVz6e2V9lTa+/4X6VeW9W93x/nJpw05WBrcIdbqXm/EdnEQpiVDFFiQXuNfg==", "dev": true, "requires": {} }, @@ -26286,9 +26366,9 @@ } }, "jquery": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz", - "integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==" + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz", + "integrity": "sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ==" }, "js-base64": { "version": "2.6.4", @@ -26421,15 +26501,15 @@ "dev": true }, "klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true }, "known-css-properties": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", - "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz", + "integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==", "dev": true }, "kuler": { @@ -26453,6 +26533,16 @@ "language-subtag-registry": "~0.3.2" } }, + "launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "requires": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, "leven": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", @@ -26474,6 +26564,14 @@ "resolved": "https://registry.npmjs.org/libarchive.js/-/libarchive.js-1.3.0.tgz", "integrity": "sha512-EkQfRXt9DhWwj6BnEA2TNpOf4jTnzSTUPGgE+iFxcdNqjktY8GitbDeHnx8qZA0/IukNyyBUR3oQKRdYkO+HFg==" }, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "requires": { + "immediate": "~3.0.5" + } + }, "lilconfig": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", @@ -26503,6 +26601,14 @@ "json5": "^2.1.2" } }, + "localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "requires": { + "lie": "3.1.1" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -26665,9 +26771,9 @@ "dev": true }, "marked": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz", - "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==" }, "marks-pane": { "version": "1.0.9", @@ -26839,9 +26945,9 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.3.tgz", - "integrity": "sha512-CD9cXeKeXLcnMw8FZdtfrRrLaM7gwCl4nKuKn2YkY2Bw5wdlB8zU2cCzw+w2zS9RFvbrufTBkMCJACNPwqQA0w==", + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz", + "integrity": "sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ==", "dev": true, "requires": { "schema-utils": "^4.0.0" @@ -27835,27 +27941,32 @@ } }, "postcss-loader": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.2.tgz", - "integrity": "sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.1.0.tgz", + "integrity": "sha512-vTD2DJ8vJD0Vr1WzMQkRZWRjcynGh3t7NeoLg+Sb1TeuK7etiZfL/ZwHbaVa3M+Qni7Lj/29voV9IggnIUjlIw==", "dev": true, "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", + "cosmiconfig": "^8.0.0", + "klona": "^2.0.6", "semver": "^7.3.8" }, "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", + "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", "dev": true, "requires": { - "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "path-type": "^4.0.0" } }, "import-fresh": { @@ -27868,6 +27979,15 @@ "resolve-from": "^4.0.0" } }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -28731,20 +28851,20 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-router": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.2.tgz", - "integrity": "sha512-lF7S0UmXI5Pd8bmHvMdPKI4u4S5McxmHnzJhrYi9ZQ6wE+DA8JN5BzVC5EEBuduWWDaiJ8u6YhVOCmThBli+rw==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.9.0.tgz", + "integrity": "sha512-51lKevGNUHrt6kLuX3e/ihrXoXCa9ixY/nVWRLlob4r/l0f45x3SzBvYJe3ctleLUQQ5fVa4RGgJOTH7D9Umhw==", "requires": { - "@remix-run/router": "1.3.3" + "@remix-run/router": "1.4.0" } }, "react-router-dom": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.2.tgz", - "integrity": "sha512-N/oAF1Shd7g4tWy+75IIufCGsHBqT74tnzHQhbiUTYILYF0Blk65cg+HPZqwC+6SqEyx033nKqU7by38v3lBZg==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.9.0.tgz", + "integrity": "sha512-/seUAPY01VAuwkGyVBPCn1OXfVbaWGGu4QN9uj0kCPcTyNYgL1ldZpxZUpRU7BLheKQI4Twtl/OW2nHRF1u26Q==", "requires": { - "@remix-run/router": "1.3.3", - "react-router": "6.8.2" + "@remix-run/router": "1.4.0", + "react-router": "6.9.0" } }, "read-file-stdin": { @@ -28899,12 +29019,6 @@ "functions-have-names": "^1.2.2" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, "regexpu-core": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", @@ -29172,9 +29286,9 @@ "dev": true }, "sass": { - "version": "1.58.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz", - "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==", + "version": "1.59.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.59.3.tgz", + "integrity": "sha512-QCq98N3hX1jfTCoUAsF3eyGuXLsY7BCnCEg9qAact94Yc21npG2/mVOqoDvE0fCbWDqiM4WlcJQla0gWG2YlxQ==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", @@ -29183,12 +29297,12 @@ } }, "sass-loader": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", - "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.1.tgz", + "integrity": "sha512-VQUrgUa5/waIzMrzyuko3sj5WD9NMsYph91cNICx+OaODbRtLl6To2fswLx8MH2qNxXFqRtpvdPQIa7mE93YOA==", "dev": true, "requires": { - "klona": "^2.0.4", + "klona": "^2.0.6", "neo-async": "^2.6.2" } }, @@ -29432,6 +29546,12 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shell-quote": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", + "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", + "dev": true + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -29877,15 +29997,6 @@ "internal-slot": "^1.0.4" } }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -30023,9 +30134,9 @@ "dev": true }, "style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.2.tgz", + "integrity": "sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw==", "dev": true, "requires": {} }, @@ -30046,18 +30157,18 @@ } }, "stylelint": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.2.0.tgz", - "integrity": "sha512-wjg5OLn8zQwjlj5cYUgyQpMWKzct42AG5dYlqkHRJQJqsystFFn3onqEc263KH4xfEI0W3lZCnlIhFfS64uwSA==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.3.0.tgz", + "integrity": "sha512-9UYBYk7K9rtlKcTUDZrtntE840sZM00qyYBQHHe7tjwMNUsPsGvR6Fd43IxHEAhRrDLzpy3TVaHb6CReBB3eFg==", "dev": true, "requires": { "@csstools/css-parser-algorithms": "^2.0.1", - "@csstools/css-tokenizer": "^2.0.1", + "@csstools/css-tokenizer": "^2.1.0", "@csstools/media-query-list-parser": "^2.0.1", "@csstools/selector-specificity": "^2.1.1", "balanced-match": "^2.0.0", "colord": "^2.9.3", - "cosmiconfig": "^8.0.0", + "cosmiconfig": "^8.1.0", "css-functions-list": "^3.1.0", "css-tree": "^2.3.1", "debug": "^4.3.4", @@ -30072,7 +30183,7 @@ "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.26.0", + "known-css-properties": "^0.27.0", "mathml-tag-names": "^2.1.3", "meow": "^9.0.0", "micromatch": "^4.0.5", @@ -30088,7 +30199,7 @@ "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "style-search": "^0.1.0", - "supports-hyperlinks": "^2.3.0", + "supports-hyperlinks": "^3.0.0", "svg-tags": "^1.0.0", "table": "^6.8.1", "v8-compile-cache": "^2.3.0", @@ -30114,9 +30225,9 @@ "dev": true }, "cosmiconfig": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.0.tgz", - "integrity": "sha512-0tLZ9URlPGU7JsKq0DQOQ3FoRsYX8xDZ7xMiATQfaiGMz7EHowNkbU9u1coAOmnh9p/1ySpm0RB3JNWRXM5GCg==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", + "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", "dev": true, "requires": { "import-fresh": "^3.2.1", @@ -31996,9 +32107,9 @@ } }, "stylelint-scss": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.4.0.tgz", - "integrity": "sha512-Qy66a+/30aylFhPmUArHhVsHOun1qrO93LGT15uzLuLjWS7hKDfpFm34mYo1ndR4MCo8W4bEZM1+AlJRJORaaw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.5.0.tgz", + "integrity": "sha512-/+rQ8FePOiwT5xblOHkujYzRYfSjmE6HYhLpqJShL+9wH6/HaAVj4mWpXlpEsM3ZgIpOblG9Y+/BycSJzWgjNw==", "dev": true, "requires": { "lodash": "^4.17.21", @@ -32055,9 +32166,9 @@ } }, "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", + "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", "dev": true, "requires": { "has-flag": "^4.0.0", @@ -32504,9 +32615,9 @@ } }, "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", "dev": true }, "unbox-primitive": { @@ -32824,9 +32935,9 @@ "dev": true }, "webpack": { - "version": "5.76.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", - "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", + "version": "5.76.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz", + "integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==", "devOptional": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -32956,9 +33067,9 @@ } }, "webpack-dev-server": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", - "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.1.tgz", + "integrity": "sha512-5tWg00bnWbYgkN+pd5yISQKDejRBYGEw15RaEEslH+zdbNDxxaZvEAO2WulaSaFKb5n3YG8JXsGaDsut1D0xdA==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", @@ -32980,6 +33091,7 @@ "html-entities": "^2.3.2", "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", "open": "^8.0.9", "p-retry": "^4.5.0", "rimraf": "^3.0.2", @@ -32989,7 +33101,7 @@ "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" + "ws": "^8.13.0" }, "dependencies": { "colorette": { @@ -33493,9 +33605,9 @@ "dev": true }, "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "dev": true, "requires": {} }, @@ -33505,11 +33617,6 @@ "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", "dev": true }, - "xmldom": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", - "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 25e942c4b7..113fa3c07a 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,8 @@ "repository": "https://github.com/jellyfin/jellyfin-web", "license": "GPL-2.0-or-later", "devDependencies": { - "@babel/core": "7.21.0", - "@babel/eslint-parser": "7.19.1", + "@babel/core": "7.21.3", + "@babel/eslint-parser": "7.21.3", "@babel/eslint-plugin": "7.19.1", "@babel/plugin-proposal-class-properties": "7.18.6", "@babel/plugin-proposal-private-methods": "7.18.6", @@ -16,13 +16,13 @@ "@babel/preset-typescript": "7.21.0", "@types/escape-html": "1.0.2", "@types/loadable__component": "5.13.4", - "@types/lodash-es": "4.17.6", + "@types/lodash-es": "4.17.7", "@types/react": "17.0.53", "@types/react-dom": "17.0.19", - "@typescript-eslint/eslint-plugin": "5.54.1", - "@typescript-eslint/parser": "5.54.1", + "@typescript-eslint/eslint-plugin": "5.56.0", + "@typescript-eslint/parser": "5.56.0", "@uupaa/dynamic-import-polyfill": "1.0.2", - "autoprefixer": "10.4.13", + "autoprefixer": "10.4.14", "babel-loader": "9.1.2", "babel-plugin-dynamic-import-polyfill": "1.0.0", "clean-webpack-plugin": "4.0.0", @@ -32,7 +32,7 @@ "css-loader": "6.7.3", "cssnano": "5.1.15", "es-check": "7.1.0", - "eslint": "8.35.0", + "eslint": "8.36.0", "eslint-plugin-compat": "4.1.2", "eslint-plugin-eslint-comments": "3.2.0", "eslint-plugin-import": "2.27.5", @@ -40,29 +40,29 @@ "eslint-plugin-promise": "6.1.1", "eslint-plugin-react": "7.32.2", "eslint-plugin-react-hooks": "4.6.0", - "eslint-plugin-sonarjs": "0.18.0", - "expose-loader": "4.0.0", + "eslint-plugin-sonarjs": "0.19.0", + "expose-loader": "4.1.0", "html-loader": "4.2.0", "html-webpack-plugin": "5.5.0", - "mini-css-extract-plugin": "2.7.3", + "mini-css-extract-plugin": "2.7.5", "postcss": "8.4.21", - "postcss-loader": "7.0.2", + "postcss-loader": "7.1.0", "postcss-preset-env": "8.0.1", "postcss-scss": "4.0.6", - "sass": "1.58.3", - "sass-loader": "13.2.0", + "sass": "1.59.3", + "sass-loader": "13.2.1", "source-map-loader": "4.0.1", - "style-loader": "3.3.1", - "stylelint": "15.2.0", + "style-loader": "3.3.2", + "stylelint": "15.3.0", "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.2.1", "stylelint-order": "6.0.3", - "stylelint-scss": "4.4.0", + "stylelint-scss": "4.5.0", "ts-loader": "9.4.2", - "typescript": "4.9.5", - "webpack": "5.76.0", + "typescript": "5.0.2", + "webpack": "5.76.3", "webpack-cli": "5.0.1", - "webpack-dev-server": "4.11.1", + "webpack-dev-server": "4.13.1", "webpack-merge": "5.8.0", "workbox-webpack-plugin": "6.5.4", "worker-loader": "3.0.8" @@ -79,10 +79,10 @@ "blurhash": "2.0.5", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.3.2", - "core-js": "3.29.0", + "core-js": "3.29.1", "date-fns": "2.29.3", "dompurify": "3.0.1", - "epubjs": "0.4.2", + "epubjs": "0.3.93", "escape-html": "1.0.3", "event-target-polyfill": "github:ThaUnknown/event-target-polyfill", "fast-text-encoding": "1.0.6", @@ -93,17 +93,17 @@ "intersection-observer": "0.12.2", "jassub": "1.5.12", "jellyfin-apiclient": "1.10.0", - "jquery": "3.6.3", + "jquery": "3.6.4", "jstree": "3.3.15", "libarchive.js": "1.3.0", "lodash-es": "4.17.21", - "marked": "4.2.12", + "marked": "4.3.0", "material-design-icons-iconfont": "6.7.0", "native-promise-only": "0.8.1", "pdfjs-dist": "2.16.105", "react": "17.0.2", "react-dom": "17.0.2", - "react-router-dom": "6.8.2", + "react-router-dom": "6.9.0", "resize-observer-polyfill": "1.5.1", "screenfull": "6.0.2", "sortablejs": "1.15.0", diff --git a/postcss.config.js b/postcss.config.js index bd1651fa19..aee1640a54 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -7,8 +7,8 @@ const config = () => ({ plugins: [ // Explicitly specify browserslist to override ones from node_modules // For example, Swiper has it in its package.json - postcssPresetEnv({browsers: packageConfig.browserslist}), - autoprefixer({overrideBrowserslist: packageConfig.browserslist}), + postcssPresetEnv({ browsers: packageConfig.browserslist }), + autoprefixer({ overrideBrowserslist: packageConfig.browserslist }), cssnano() ] }); diff --git a/src/components/accessSchedule/accessSchedule.js b/src/components/accessSchedule/accessSchedule.js index 33df97532e..bbfb35ebca 100644 --- a/src/components/accessSchedule/accessSchedule.js +++ b/src/components/accessSchedule/accessSchedule.js @@ -37,7 +37,7 @@ import template from './accessSchedule.template.html'; context.querySelector('#selectEnd').innerHTML = html; } - function loadSchedule(context, {DayOfWeek, StartHour, EndHour}) { + function loadSchedule(context, { DayOfWeek, StartHour, EndHour }) { context.querySelector('#selectDay').value = DayOfWeek || 'Sunday'; context.querySelector('#selectStart').value = StartHour || 0; context.querySelector('#selectEnd').value = EndHour || 0; diff --git a/src/components/apphost.js b/src/components/apphost.js index 4a12a78d0e..2cb709e112 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -309,8 +309,8 @@ function askForExit() { exitPromise = actionsheet.show({ title: globalize.translate('MessageConfirmAppExit'), items: [ - {id: 'yes', name: globalize.translate('Yes')}, - {id: 'no', name: globalize.translate('No')} + { id: 'yes', name: globalize.translate('Yes') }, + { id: 'no', name: globalize.translate('No') } ] }).then(function (value) { if (value === 'yes') { @@ -366,20 +366,20 @@ export const appHost = { }; }, deviceName: function () { - return window.NativeShell?.AppHost?.deviceName - ? window.NativeShell.AppHost.deviceName() : getDeviceName(); + return window.NativeShell?.AppHost?.deviceName ? + window.NativeShell.AppHost.deviceName() : getDeviceName(); }, deviceId: function () { - return window.NativeShell?.AppHost?.deviceId - ? window.NativeShell.AppHost.deviceId() : getDeviceId(); + return window.NativeShell?.AppHost?.deviceId ? + window.NativeShell.AppHost.deviceId() : getDeviceId(); }, appName: function () { - return window.NativeShell?.AppHost?.appName - ? window.NativeShell.AppHost.appName() : appName; + return window.NativeShell?.AppHost?.appName ? + window.NativeShell.AppHost.appName() : appName; }, appVersion: function () { - return window.NativeShell?.AppHost?.appVersion - ? window.NativeShell.AppHost.appVersion() : Package.version; + return window.NativeShell?.AppHost?.appVersion ? + window.NativeShell.AppHost.appVersion() : Package.version; }, getPushTokenInfo: function () { return {}; diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index dfbc0a6768..04c03c6605 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -896,13 +896,13 @@ import { appRouter } from '../appRouter'; } if (options.showYear || options.showSeriesYear) { - const productionYear = item.ProductionYear && datetime.toLocaleString(item.ProductionYear, {useGrouping: false}); + const productionYear = item.ProductionYear && datetime.toLocaleString(item.ProductionYear, { useGrouping: false }); if (item.Type === 'Series') { if (item.Status === 'Continuing') { lines.push(globalize.translate('SeriesYearToPresent', productionYear || '')); } else { if (item.EndDate && item.ProductionYear) { - const endYear = datetime.toLocaleString(datetime.parseISO8601Date(item.EndDate).getFullYear(), {useGrouping: false}); + const endYear = datetime.toLocaleString(datetime.parseISO8601Date(item.EndDate).getFullYear(), { useGrouping: false }); lines.push(productionYear + ((endYear === item.ProductionYear) ? '' : (' - ' + endYear))); } else { lines.push(productionYear || ''); diff --git a/src/components/cardbuilder/chaptercardbuilder.js b/src/components/cardbuilder/chaptercardbuilder.js index f479fb4c88..794e845f8f 100644 --- a/src/components/cardbuilder/chaptercardbuilder.js +++ b/src/components/cardbuilder/chaptercardbuilder.js @@ -28,7 +28,7 @@ import ServerConnections from '../ServerConnections'; } const mediaStreams = ((item.MediaSources || [])[0] || {}).MediaStreams || []; - const videoStream = mediaStreams.filter(({Type}) => { + const videoStream = mediaStreams.filter(({ Type }) => { return Type === 'Video'; })[0] || {}; @@ -68,7 +68,7 @@ import ServerConnections from '../ServerConnections'; return html; } - function getImgUrl({Id}, {ImageTag}, index, maxWidth, apiClient) { + function getImgUrl({ Id }, { ImageTag }, index, maxWidth, apiClient) { if (ImageTag) { return apiClient.getScaledImageUrl(Id, { @@ -82,7 +82,7 @@ import ServerConnections from '../ServerConnections'; return null; } - function buildChapterCard(item, apiClient, chapter, index, {width, coverImage}, className, shape) { + function buildChapterCard(item, apiClient, chapter, index, { width, coverImage }, className, shape) { const imgUrl = getImgUrl(item, chapter, index, width || 400, apiClient); let cardImageContainerClass = 'cardContent cardContent-shadow cardImageContainer chapterCardImageContainer'; diff --git a/src/components/common/Filter.tsx b/src/components/common/Filter.tsx index 4db46e332b..c3316df1a2 100644 --- a/src/components/common/Filter.tsx +++ b/src/components/common/Filter.tsx @@ -22,7 +22,7 @@ const Filter: FC = ({ const element = useRef(null); const showFilterMenu = useCallback(() => { - import('../filtermenu/filtermenu').then(({default: FilterMenu}) => { + import('../filtermenu/filtermenu').then(({ default: FilterMenu }) => { const filterMenu = new FilterMenu(); filterMenu.show({ settings: viewQuerySettings, diff --git a/src/components/common/NewCollection.tsx b/src/components/common/NewCollection.tsx index 4cf6e07365..4eadda8e36 100644 --- a/src/components/common/NewCollection.tsx +++ b/src/components/common/NewCollection.tsx @@ -6,7 +6,7 @@ const NewCollection: FC = () => { const element = useRef(null); const showCollectionEditor = useCallback(() => { - import('../collectionEditor/collectionEditor').then(({default: CollectionEditor}) => { + import('../collectionEditor/collectionEditor').then(({ default: CollectionEditor }) => { const serverId = window.ApiClient.serverId(); const collectionEditor = new CollectionEditor(); collectionEditor.show({ diff --git a/src/components/common/SelectView.tsx b/src/components/common/SelectView.tsx index 7a65e48872..f718529857 100644 --- a/src/components/common/SelectView.tsx +++ b/src/components/common/SelectView.tsx @@ -16,7 +16,7 @@ const SelectView: FC = ({ const element = useRef(null); const showViewSettingsMenu = useCallback(() => { - import('../viewSettings/viewSettings').then(({default: ViewSettings}) => { + import('../viewSettings/viewSettings').then(({ default: ViewSettings }) => { const viewsettings = new ViewSettings(); viewsettings.show({ settings: viewQuerySettings, diff --git a/src/components/common/Sort.tsx b/src/components/common/Sort.tsx index c99b332858..5c5d1b6193 100644 --- a/src/components/common/Sort.tsx +++ b/src/components/common/Sort.tsx @@ -19,7 +19,7 @@ const Sort: FC = ({ const element = useRef(null); const showSortMenu = useCallback(() => { - import('../sortmenu/sortmenu').then(({default: SortMenu}) => { + import('../sortmenu/sortmenu').then(({ default: SortMenu }) => { const sortMenu = new SortMenu(); sortMenu.show({ settings: viewQuerySettings, diff --git a/src/components/dashboard/users/AccessContainer.tsx b/src/components/dashboard/users/AccessContainer.tsx index 656292ece7..32fe9c213d 100644 --- a/src/components/dashboard/users/AccessContainer.tsx +++ b/src/components/dashboard/users/AccessContainer.tsx @@ -14,7 +14,7 @@ type IProps = { children?: React.ReactNode } -const AccessContainer: FunctionComponent = ({containerClassName, headerTitle, checkBoxClassName, checkBoxTitle, listContainerClassName, accessClassName, listTitle, description, children }: IProps) => { +const AccessContainer: FunctionComponent = ({ containerClassName, headerTitle, checkBoxClassName, checkBoxTitle, listContainerClassName, accessClassName, listTitle, description, children }: IProps) => { return (

{globalize.translate(headerTitle)}

diff --git a/src/components/dashboard/users/AccessScheduleList.tsx b/src/components/dashboard/users/AccessScheduleList.tsx index a96e390de1..41c55c3621 100644 --- a/src/components/dashboard/users/AccessScheduleList.tsx +++ b/src/components/dashboard/users/AccessScheduleList.tsx @@ -22,7 +22,7 @@ function getDisplayTime(hours = 0) { return datetime.getDisplayTime(new Date(2000, 1, 1, hours, minutes, 0, 0)); } -const AccessScheduleList: FunctionComponent = ({index, DayOfWeek, StartHour, EndHour}: AccessScheduleListProps) => { +const AccessScheduleList: FunctionComponent = ({ index, DayOfWeek, StartHour, EndHour }: AccessScheduleListProps) => { return (
= ({tag}: IProps) => { +const BlockedTagList: FunctionComponent = ({ tag }: IProps) => { return (
diff --git a/src/components/dashboard/users/SectionTabs.tsx b/src/components/dashboard/users/SectionTabs.tsx index 285997a44d..41287dd009 100644 --- a/src/components/dashboard/users/SectionTabs.tsx +++ b/src/components/dashboard/users/SectionTabs.tsx @@ -36,7 +36,7 @@ const createLinkElement = (activeTab: string) => ({ ` }); -const SectionTabs: FunctionComponent = ({activeTab}: IProps) => { +const SectionTabs: FunctionComponent = ({ activeTab }: IProps) => { return (
= ({ user = {} }: IProps) => {
= ({userId}: IProps) => { +const UserPasswordForm: FunctionComponent = ({ userId }: IProps) => { const element = useRef(null); const loadUser = useCallback(() => { @@ -76,7 +76,7 @@ const UserPasswordForm: FunctionComponent = ({userId}: IProps) => { chkEnableLocalEasyPassword.checked = user.Configuration.EnableLocalPassword || false; - import('../../autoFocuser').then(({default: autoFocuser}) => { + import('../../autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(page); }); }); @@ -214,7 +214,7 @@ const UserPasswordForm: FunctionComponent = ({userId}: IProps) => {
@@ -260,7 +260,7 @@ const UserPasswordForm: FunctionComponent = ({userId}: IProps) => {
diff --git a/src/components/guide/guide.js b/src/components/guide/guide.js index 36137af21d..907de76b88 100644 --- a/src/components/guide/guide.js +++ b/src/components/guide/guide.js @@ -29,7 +29,7 @@ import ServerConnections from '../ServerConnections'; import template from './tvguide.template.html'; function showViewSettings(instance) { - import('./guide-settings').then(({default: guideSettingsDialog}) => { + import('./guide-settings').then(({ default: guideSettingsDialog }) => { guideSettingsDialog.show(instance.categoryOptions).then(function () { instance.refresh(); }); diff --git a/src/components/htmlMediaHelper.js b/src/components/htmlMediaHelper.js index 7f9d3f36d5..22816aee35 100644 --- a/src/components/htmlMediaHelper.js +++ b/src/components/htmlMediaHelper.js @@ -26,8 +26,8 @@ import Events from '../utils/events.ts'; function canPlayNativeHls() { const media = document.createElement('video'); - return !!(media.canPlayType('application/x-mpegURL').replace(/no/, '') || - media.canPlayType('application/vnd.apple.mpegURL').replace(/no/, '')); + return !!(media.canPlayType('application/x-mpegURL').replace(/no/, '') + || media.canPlayType('application/vnd.apple.mpegURL').replace(/no/, '')); } export function enableHlsJsPlayer(runTimeTicks, mediaType) { @@ -201,8 +201,8 @@ import Events from '../utils/events.ts'; .catch((e) => { const errorName = (e.name || '').toLowerCase(); // safari uses aborterror - if (errorName === 'notallowederror' || - errorName === 'aborterror') { + if (errorName === 'notallowederror' + || errorName === 'aborterror') { // swallow this error because the user can still click the play button on the video element return Promise.resolve(); } diff --git a/src/components/imageeditor/imageeditor.js b/src/components/imageeditor/imageeditor.js index 1711169dbc..b2c9033bc3 100644 --- a/src/components/imageeditor/imageeditor.js +++ b/src/components/imageeditor/imageeditor.js @@ -282,7 +282,7 @@ import template from './imageeditor.template.html'; const providerCount = parseInt(imageCard.getAttribute('data-providers'), 10); const numImages = parseInt(imageCard.getAttribute('data-numimages'), 10); - import('../actionSheet/actionSheet').then(({default: actionSheet}) => { + import('../actionSheet/actionSheet').then(({ default: actionSheet }) => { const commands = []; commands.push({ @@ -353,7 +353,7 @@ import template from './imageeditor.template.html'; addListeners(context, 'btnOpenUploadMenu', 'click', function () { const imageType = this.getAttribute('data-imagetype'); - import('../imageUploader/imageUploader').then(({default: imageUploader}) => { + import('../imageUploader/imageUploader').then(({ default: imageUploader }) => { imageUploader.show({ theme: options.theme, diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index e0bcb1562b..e132c706e3 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -326,7 +326,7 @@ import toast from './toast/toast'; // eslint-disable-next-line sonarjs/max-switch-cases switch (id) { case 'addtocollection': - import('./collectionEditor/collectionEditor').then(({default: CollectionEditor}) => { + import('./collectionEditor/collectionEditor').then(({ default: CollectionEditor }) => { const collectionEditor = new CollectionEditor(); collectionEditor.show({ items: [itemId], @@ -335,7 +335,7 @@ import toast from './toast/toast'; }); break; case 'addtoplaylist': - import('./playlisteditor/playlisteditor').then(({default: playlistEditor}) => { + import('./playlisteditor/playlisteditor').then(({ default: playlistEditor }) => { new playlistEditor({ items: [itemId], serverId: serverId @@ -408,7 +408,7 @@ import toast from './toast/toast'; break; } case 'editsubtitles': - import('./subtitleeditor/subtitleeditor').then(({default: subtitleEditor}) => { + import('./subtitleeditor/subtitleeditor').then(({ default: subtitleEditor }) => { subtitleEditor.show(itemId, serverId).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); }); break; @@ -464,7 +464,7 @@ import toast from './toast/toast'; playbackManager.clearQueue(); break; case 'record': - import('./recordingcreator/recordingcreator').then(({default: recordingCreator}) => { + import('./recordingcreator/recordingcreator').then(({ default: recordingCreator }) => { recordingCreator.show(itemId, serverId).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); }); break; @@ -535,7 +535,7 @@ import toast from './toast/toast'; } function deleteTimer(apiClient, item, resolve, command) { - import('./recordingcreator/recordinghelper').then(({default: recordingHelper}) => { + import('./recordingcreator/recordinghelper').then(({ default: recordingHelper }) => { const timerId = item.TimerId || item.Id; recordingHelper.cancelTimerWithConfirmation(timerId, item.ServerId).then(function () { getResolveFunction(resolve, command, true)(); @@ -544,7 +544,7 @@ import toast from './toast/toast'; } function deleteSeriesTimer(apiClient, item, resolve, command) { - import('./recordingcreator/recordinghelper').then(({default: recordingHelper}) => { + import('./recordingcreator/recordinghelper').then(({ default: recordingHelper }) => { recordingHelper.cancelSeriesTimerWithConfirmation(item.Id, item.ServerId).then(function () { getResolveFunction(resolve, command, true)(); }); @@ -585,15 +585,15 @@ import toast from './toast/toast'; const serverId = apiClient.serverInfo().Id; if (item.Type === 'Timer') { - import('./recordingcreator/recordingeditor').then(({default: recordingEditor}) => { + import('./recordingcreator/recordingeditor').then(({ default: recordingEditor }) => { recordingEditor.show(item.Id, serverId).then(resolve, reject); }); } else if (item.Type === 'SeriesTimer') { - import('./recordingcreator/seriesrecordingeditor').then(({default: recordingEditor}) => { + import('./recordingcreator/seriesrecordingeditor').then(({ default: recordingEditor }) => { recordingEditor.show(item.Id, serverId).then(resolve, reject); }); } else { - import('./metadataEditor/metadataEditor').then(({default: metadataEditor}) => { + import('./metadataEditor/metadataEditor').then(({ default: metadataEditor }) => { metadataEditor.show(item.Id, serverId).then(resolve, reject); }); } @@ -614,7 +614,7 @@ import toast from './toast/toast'; } function refresh(apiClient, item) { - import('./refreshdialog/refreshdialog').then(({default: refreshDialog}) => { + import('./refreshdialog/refreshdialog').then(({ default: refreshDialog }) => { new refreshDialog({ itemIds: [item.Id], serverId: apiClient.serverInfo().Id, diff --git a/src/components/itemidentifier/itemidentifier.js b/src/components/itemidentifier/itemidentifier.js index ae76477989..9ada1d60c2 100644 --- a/src/components/itemidentifier/itemidentifier.js +++ b/src/components/itemidentifier/itemidentifier.js @@ -167,7 +167,7 @@ import datetime from '../../scripts/datetime'; lines.push(escapeHtml(identifyResult.Name)); if (identifyResult.ProductionYear) { - lines.push(datetime.toLocaleString(identifyResult.ProductionYear, {useGrouping: false})); + lines.push(datetime.toLocaleString(identifyResult.ProductionYear, { useGrouping: false })); } let resultHtml = lines.join('
'); diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.js b/src/components/libraryoptionseditor/libraryoptionseditor.js index da9557d62e..dabaf1c8a9 100644 --- a/src/components/libraryoptionseditor/libraryoptionseditor.js +++ b/src/components/libraryoptionseditor/libraryoptionseditor.js @@ -316,7 +316,7 @@ import template from './libraryoptionseditor.template.html'; } function showImageOptionsForType(type) { - import('../imageOptionsEditor/imageOptionsEditor').then(({default: ImageOptionsEditor}) => { + import('../imageOptionsEditor/imageOptionsEditor').then(({ default: ImageOptionsEditor }) => { let typeOptions = getTypeOptions(currentLibraryOptions, type); if (!typeOptions) { typeOptions = { diff --git a/src/components/maintabsmanager.js b/src/components/maintabsmanager.js index 5ce5b55c9a..76d0090ba8 100644 --- a/src/components/maintabsmanager.js +++ b/src/components/maintabsmanager.js @@ -65,7 +65,7 @@ import '../elements/emby-button/emby-button'; } }; - import('../scripts/touchHelper').then(({default: TouchHelper}) => { + import('../scripts/touchHelper').then(({ default: TouchHelper }) => { const touchHelper = new TouchHelper(view.parentNode.parentNode); Events.on(touchHelper, 'swipeleft', onSwipeLeft); diff --git a/src/components/mediaLibraryCreator/mediaLibraryCreator.js b/src/components/mediaLibraryCreator/mediaLibraryCreator.js index f717b0ae65..1592b27c2e 100644 --- a/src/components/mediaLibraryCreator/mediaLibraryCreator.js +++ b/src/components/mediaLibraryCreator/mediaLibraryCreator.js @@ -25,7 +25,7 @@ import toast from '../toast/toast'; import alert from '../alert'; import template from './mediaLibraryCreator.template.html'; - function onAddLibrary() { + function onAddLibrary(e) { if (isCreating) { return false; } @@ -62,7 +62,7 @@ import template from './mediaLibraryCreator.template.html'; isCreating = false; loading.hide(); }); - return false; + e.preventDefault(); } function getCollectionTypeOptionsHtml(collectionTypeOptions) { @@ -96,14 +96,14 @@ import template from './mediaLibraryCreator.template.html'; $('.collectionTypeFieldDescription', dlg).html(folderOption?.message || ''); }); page.querySelector('.btnAddFolder').addEventListener('click', onAddButtonClick); - page.querySelector('.btnSubmit').addEventListener('click', onAddLibrary); + page.querySelector('.addLibraryForm').addEventListener('submit', onAddLibrary); page.querySelector('.folderList').addEventListener('click', onRemoveClick); } function onAddButtonClick() { const page = dom.parentWithClass(this, 'dlg-librarycreator'); - import('../directorybrowser/directorybrowser').then(({default: DirectoryBrowser}) => { + import('../directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { const picker = new DirectoryBrowser(); picker.show({ enableNetworkSharePath: true, diff --git a/src/components/mediaLibraryCreator/mediaLibraryCreator.template.html b/src/components/mediaLibraryCreator/mediaLibraryCreator.template.html index d62919227f..65c99b6450 100644 --- a/src/components/mediaLibraryCreator/mediaLibraryCreator.template.html +++ b/src/components/mediaLibraryCreator/mediaLibraryCreator.template.html @@ -1,37 +1,39 @@ -
- -

${ButtonAddMediaLibrary}

-
- -
-
- -
- -
-
-
- -
- -
- -
-
-

${Folders}

- -
-
-
- -
+ +
+ +

${ButtonAddMediaLibrary}

-
-
- -
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+
+

${Folders}

+ +
+
+
+ +
+
+
+ +
+ +
+ diff --git a/src/components/mediaLibraryEditor/mediaLibraryEditor.js b/src/components/mediaLibraryEditor/mediaLibraryEditor.js index c90acc0078..c9f931297d 100644 --- a/src/components/mediaLibraryEditor/mediaLibraryEditor.js +++ b/src/components/mediaLibraryEditor/mediaLibraryEditor.js @@ -164,7 +164,7 @@ import template from './mediaLibraryEditor.template.html'; } function showDirectoryBrowser(context, originalPath, networkPath) { - import('../directorybrowser/directorybrowser').then(({default: DirectoryBrowser}) => { + import('../directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { const picker = new DirectoryBrowser(); picker.show({ enableNetworkSharePath: true, diff --git a/src/components/mediainfo/mediainfo.js b/src/components/mediainfo/mediainfo.js index 6b64059041..530e102f14 100644 --- a/src/components/mediainfo/mediainfo.js +++ b/src/components/mediainfo/mediainfo.js @@ -177,13 +177,13 @@ import * as userSettings from '../../scripts/settings/userSettings'; if (options.year !== false && item.ProductionYear && item.Type === 'Series') { if (item.Status === 'Continuing') { - miscInfo.push(globalize.translate('SeriesYearToPresent', datetime.toLocaleString(item.ProductionYear, {useGrouping: false}))); + miscInfo.push(globalize.translate('SeriesYearToPresent', datetime.toLocaleString(item.ProductionYear, { useGrouping: false }))); } else if (item.ProductionYear) { - text = datetime.toLocaleString(item.ProductionYear, {useGrouping: false}); + text = datetime.toLocaleString(item.ProductionYear, { useGrouping: false }); if (item.EndDate) { try { - const endYear = datetime.toLocaleString(datetime.parseISO8601Date(item.EndDate).getFullYear(), {useGrouping: false}); + const endYear = datetime.toLocaleString(datetime.parseISO8601Date(item.EndDate).getFullYear(), { useGrouping: false }); if (endYear !== item.ProductionYear) { text += `-${endYear}`; @@ -253,7 +253,7 @@ import * as userSettings from '../../scripts/settings/userSettings'; miscInfo.push(item.ProductionYear); } else if (item.PremiereDate) { try { - text = datetime.toLocaleString(datetime.parseISO8601Date(item.PremiereDate).getFullYear(), {useGrouping: false}); + text = datetime.toLocaleString(datetime.parseISO8601Date(item.PremiereDate).getFullYear(), { useGrouping: false }); miscInfo.push(text); } catch (e) { console.error('error parsing date:', item.PremiereDate); diff --git a/src/components/metadataEditor/metadataEditor.js b/src/components/metadataEditor/metadataEditor.js index fb69d20aa2..a9596c3786 100644 --- a/src/components/metadataEditor/metadataEditor.js +++ b/src/components/metadataEditor/metadataEditor.js @@ -211,7 +211,7 @@ import template from './metadataEditor.template.html'; } function addElementToList(source, sortCallback) { - import('../prompt/prompt').then(({default: prompt}) => { + import('../prompt/prompt').then(({ default: prompt }) => { prompt({ label: 'Value:' }).then(function (text) { @@ -229,7 +229,7 @@ import template from './metadataEditor.template.html'; } function editPerson(context, person, index) { - import('./personEditor').then(({default: personEditor}) => { + import('./personEditor').then(({ default: personEditor }) => { personEditor.show(person).then(function (updatedPerson) { const isNew = index === -1; @@ -253,7 +253,7 @@ import template from './metadataEditor.template.html'; } function showMoreMenu(context, button, user) { - import('../itemContextMenu').then(({default: itemContextMenu}) => { + import('../itemContextMenu').then(({ default: itemContextMenu }) => { const item = currentItem; itemContextMenu.show({ @@ -588,12 +588,12 @@ import template from './metadataEditor.template.html'; hideElement('#collapsibleSpecialEpisodeInfo', context); } - if (item.Type === 'Person' || - item.Type === 'Genre' || - item.Type === 'Studio' || - item.Type === 'MusicGenre' || - item.Type === 'TvChannel' || - item.Type === 'Book') { + if (item.Type === 'Person' + || item.Type === 'Genre' + || item.Type === 'Studio' + || item.Type === 'MusicGenre' + || item.Type === 'TvChannel' + || item.Type === 'Book') { hideElement('#peopleCollapsible', context); } else { showElement('#peopleCollapsible', context); diff --git a/src/components/multiSelect/multiSelect.js b/src/components/multiSelect/multiSelect.js index 6632ef628b..3984968174 100644 --- a/src/components/multiSelect/multiSelect.js +++ b/src/components/multiSelect/multiSelect.js @@ -267,7 +267,7 @@ import datetime from '../../scripts/datetime'; } break; case 'addtocollection': - import('../collectionEditor/collectionEditor').then(({default: CollectionEditor}) => { + import('../collectionEditor/collectionEditor').then(({ default: CollectionEditor }) => { const collectionEditor = new CollectionEditor(); collectionEditor.show({ items: items, @@ -308,7 +308,7 @@ import datetime from '../../scripts/datetime'; dispatchNeedsRefresh(); break; case 'refresh': - import('../refreshdialog/refreshdialog').then(({default: refreshDialog}) => { + import('../refreshdialog/refreshdialog').then(({ default: refreshDialog }) => { new refreshDialog({ itemIds: items, serverId: serverId diff --git a/src/components/playback/mediasession.js b/src/components/playback/mediasession.js index d16fe7756f..6c560c222d 100644 --- a/src/components/playback/mediasession.js +++ b/src/components/playback/mediasession.js @@ -69,7 +69,7 @@ import shell from '../../scripts/shell'; const list = []; imageSizes.forEach((size) => { - const url = getImageUrl(item, {height: size}); + const url = getImageUrl(item, { height: size }); if (url !== null) { list.push(url); } diff --git a/src/components/playerstats/playerstats.js b/src/components/playerstats/playerstats.js index e8054e5fb3..7ce9448306 100644 --- a/src/components/playerstats/playerstats.js +++ b/src/components/playerstats/playerstats.js @@ -4,7 +4,8 @@ import Events from '../../utils/events.ts'; import layoutManager from '../layoutManager'; import { playbackManager } from '../playback/playbackmanager'; import playMethodHelper from '../playback/playmethodhelper'; -import SyncPlay from '../../plugins/syncPlay/core'; +import { pluginManager } from '../pluginManager'; +import { PluginType } from '../../types/plugin.ts'; import './playerstats.scss'; import ServerConnections from '../ServerConnections'; @@ -325,6 +326,12 @@ import ServerConnections from '../ServerConnections'; } function getSyncPlayStats() { + const SyncPlay = pluginManager.firstOfType(PluginType.SyncPlay)?.instance; + + if (!SyncPlay?.Manager.isSyncPlayEnabled()) { + return []; + } + const syncStats = []; const stats = SyncPlay.Manager.getStats(); @@ -422,10 +429,10 @@ import ServerConnections from '../ServerConnections'; name: globalize.translate('LabelOriginalMediaInfo') }); - const apiClient = ServerConnections.getApiClient(playbackManager.currentItem(player).ServerId); - if (SyncPlay.Manager.isSyncPlayEnabled() && apiClient.isMinServerVersion('10.6.0')) { + const syncPlayStats = getSyncPlayStats(); + if (syncPlayStats.length > 0) { categories.push({ - stats: getSyncPlayStats(), + stats: syncPlayStats, name: globalize.translate('LabelSyncPlayInfo') }); } diff --git a/src/components/playlisteditor/playlisteditor.js b/src/components/playlisteditor/playlisteditor.js index 70ae0644d1..90d835e1c5 100644 --- a/src/components/playlisteditor/playlisteditor.js +++ b/src/components/playlisteditor/playlisteditor.js @@ -4,10 +4,12 @@ import dialogHelper from '../dialogHelper/dialogHelper'; import loading from '../loading/loading'; import layoutManager from '../layoutManager'; import { playbackManager } from '../playback/playbackmanager'; -import SyncPlay from '../../plugins/syncPlay/core'; +import { pluginManager } from '../pluginManager'; import * as userSettings from '../../scripts/settings/userSettings'; import { appRouter } from '../appRouter'; import globalize from '../../scripts/globalize'; +import { PluginType } from '../../types/plugin.ts'; + import '../../elements/emby-button/emby-button'; import '../../elements/emby-input/emby-input'; import '../../elements/emby-button/paper-icon-button-light'; @@ -117,10 +119,12 @@ import ServerConnections from '../ServerConnections'; }; const apiClient = ServerConnections.getApiClient(currentServerId); + const SyncPlay = pluginManager.firstOfType(PluginType.SyncPlay)?.instance; + apiClient.getItems(apiClient.getCurrentUserId(), options).then(result => { let html = ''; - if ((editorOptions.enableAddToPlayQueue !== false && playbackManager.isPlaying()) || SyncPlay.Manager.isSyncPlayEnabled()) { + if ((editorOptions.enableAddToPlayQueue !== false && playbackManager.isPlaying()) || SyncPlay?.Manager.isSyncPlayEnabled()) { html += ``; } diff --git a/src/components/pluginManager.js b/src/components/pluginManager.js index 763f0eb2d1..c2b67e4213 100644 --- a/src/components/pluginManager.js +++ b/src/components/pluginManager.js @@ -119,9 +119,14 @@ class PluginManager { } ofType(type) { - return this.pluginsList.filter((o) => { - return o.type === type; - }); + return this.pluginsList.filter(plugin => plugin.type === type); + } + + firstOfType(type) { + // Get all plugins of the specified type + return this.ofType(type) + // Return the plugin with the "highest" (lowest numeric value) priority + .sort((p1, p2) => (p1.priority || 0) - (p2.priority || 0))[0]; } #mapRoute(plugin, route) { diff --git a/src/components/recordingcreator/recordingfields.js b/src/components/recordingcreator/recordingfields.js index 742a77df4b..d890148c3b 100644 --- a/src/components/recordingcreator/recordingfields.js +++ b/src/components/recordingcreator/recordingfields.js @@ -141,7 +141,7 @@ function onManageRecordingClick() { } const self = this; - import('./recordingeditor').then(({default: recordingEditor}) => { + import('./recordingeditor').then(({ default: recordingEditor }) => { recordingEditor.show(self.TimerId, options.serverId, { enableCancel: false }).then(function () { @@ -159,7 +159,7 @@ function onManageSeriesRecordingClick() { const self = this; - import('./seriesrecordingeditor').then(({default: seriesRecordingEditor}) => { + import('./seriesrecordingeditor').then(({ default: seriesRecordingEditor }) => { seriesRecordingEditor.show(self.SeriesTimerId, options.serverId, { enableCancel: false diff --git a/src/components/scrollManager.js b/src/components/scrollManager.js index 72f5a69fb2..6a5aee3645 100644 --- a/src/components/scrollManager.js +++ b/src/components/scrollManager.js @@ -389,13 +389,13 @@ import layoutManager from './layoutManager'; if (xScroller !== yScroller) { if (xScroller) { - scrollToHelper(xScroller, {left: scrollX, behavior: scrollBehavior}); + scrollToHelper(xScroller, { left: scrollX, behavior: scrollBehavior }); } if (yScroller) { - scrollToHelper(yScroller, {top: scrollY, behavior: scrollBehavior}); + scrollToHelper(yScroller, { top: scrollY, behavior: scrollBehavior }); } } else if (xScroller) { - scrollToHelper(xScroller, {left: scrollX, top: scrollY, behavior: scrollBehavior}); + scrollToHelper(xScroller, { left: scrollX, top: scrollY, behavior: scrollBehavior }); } } @@ -597,7 +597,7 @@ import layoutManager from './layoutManager'; setTimeout(function() { scrollToElement(e.target, useSmoothScroll()); }, 0); - }, {capture: true}); + }, { capture: true }); } /* eslint-enable indent */ diff --git a/src/components/search/SearchFields.tsx b/src/components/search/SearchFields.tsx index 8a0fa01dfd..cdc8c69a3c 100644 --- a/src/components/search/SearchFields.tsx +++ b/src/components/search/SearchFields.tsx @@ -85,8 +85,8 @@ const SearchFields: FunctionComponent = ({ onSearch = () => { dangerouslySetInnerHTML={createInputElement()} />
- {layoutManager.tv && !browser.tv && - + {layoutManager.tv && !browser.tv + && }
); diff --git a/src/components/shortcuts.js b/src/components/shortcuts.js index 60e51c784c..62f43a3436 100644 --- a/src/components/shortcuts.js +++ b/src/components/shortcuts.js @@ -71,7 +71,7 @@ import toast from './toast/toast'; } function showProgramDialog(item) { - import('./recordingcreator/recordingcreator').then(({default:recordingCreator}) => { + import('./recordingcreator/recordingcreator').then(({ default:recordingCreator }) => { recordingCreator.show(item.Id, item.ServerId); }); } @@ -272,7 +272,7 @@ import toast from './toast/toast'; } function addToPlaylist(item) { - import('./playlisteditor/playlisteditor').then(({default: playlistEditor}) => { + import('./playlisteditor/playlisteditor').then(({ default: playlistEditor }) => { new playlistEditor().show({ items: [item.Id], serverId: item.ServerId @@ -297,16 +297,16 @@ import toast from './toast/toast'; if (item.Type === 'Timer') { if (item.ProgramId) { - import('./recordingcreator/recordingcreator').then(({default: recordingCreator}) => { + import('./recordingcreator/recordingcreator').then(({ default: recordingCreator }) => { recordingCreator.show(item.ProgramId, currentServerId).then(resolve, reject); }); } else { - import('./recordingcreator/recordingeditor').then(({default: recordingEditor}) => { + import('./recordingcreator/recordingeditor').then(({ default: recordingEditor }) => { recordingEditor.show(item.Id, currentServerId).then(resolve, reject); }); } } else { - import('./metadataEditor/metadataEditor').then(({default: metadataEditor}) => { + import('./metadataEditor/metadataEditor').then(({ default: metadataEditor }) => { metadataEditor.show(item.Id, currentServerId).then(resolve, reject); }); } diff --git a/src/components/subtitleeditor/subtitleeditor.js b/src/components/subtitleeditor/subtitleeditor.js index b332e4238f..572cccc1fa 100644 --- a/src/components/subtitleeditor/subtitleeditor.js +++ b/src/components/subtitleeditor/subtitleeditor.js @@ -342,7 +342,7 @@ function showDownloadOptions(button, context, subtitleId) { } function centerFocus(elem, horiz, on) { - import('../../scripts/scrollHelper').then(({default: scrollHelper}) => { + import('../../scripts/scrollHelper').then(({ default: scrollHelper }) => { const fn = on ? 'on' : 'off'; scrollHelper.centerFocus[fn](elem, horiz); }); @@ -353,7 +353,7 @@ function onOpenUploadMenu(e) { const selectLanguage = dialog.querySelector('#selectLanguage'); const apiClient = ServerConnections.getApiClient(currentItem.ServerId); - import('../subtitleuploader/subtitleuploader').then(({default: subtitleUploader}) => { + import('../subtitleuploader/subtitleuploader').then(({ default: subtitleUploader }) => { subtitleUploader.show({ languages: { list: selectLanguage.innerHTML, diff --git a/src/components/subtitlesync/subtitlesync.js b/src/components/subtitlesync/subtitlesync.js index 80da4d7b12..dcdfe45874 100644 --- a/src/components/subtitlesync/subtitlesync.js +++ b/src/components/subtitlesync/subtitlesync.js @@ -94,9 +94,9 @@ function init(instance) { subtitleSyncSlider.getBubbleHtml = function (value) { const newOffset = getOffsetFromPercentage(value); - return '

' + - (newOffset > 0 ? '+' : '') + parseFloat(newOffset) + 's' + - '

'; + return '

' + + (newOffset > 0 ? '+' : '') + parseFloat(newOffset) + 's' + + '

'; }; subtitleSyncCloseButton.addEventListener('click', function () { diff --git a/src/components/tvproviders/xmltv.js b/src/components/tvproviders/xmltv.js index dc5f896447..7b5123c908 100644 --- a/src/components/tvproviders/xmltv.js +++ b/src/components/tvproviders/xmltv.js @@ -48,7 +48,7 @@ function refreshTunerDevices(page, providerInfo, devices) { function onSelectPathClick(e) { const page = $(e.target).parents('.xmltvForm')[0]; - import('../directorybrowser/directorybrowser').then(({default: DirectoryBrowser}) => { + import('../directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { const picker = new DirectoryBrowser(); picker.show({ includeFiles: true, diff --git a/src/components/viewManager/viewManager.js b/src/components/viewManager/viewManager.js index c9a64b658a..12a5f1a9d6 100644 --- a/src/components/viewManager/viewManager.js +++ b/src/components/viewManager/viewManager.js @@ -97,7 +97,7 @@ function dispatchViewEvent(view, eventInfo, eventName, isCancellable) { return eventResult; } -function getViewEventDetail(view, {state, url, options = {}}, isRestored) { +function getViewEventDetail(view, { state, url, options = {} }, isRestored) { const index = url.indexOf('?'); // eslint-disable-next-line compat/compat const searchParams = new URLSearchParams(url.substring(index + 1)); diff --git a/src/controllers/dashboard/apikeys.js b/src/controllers/dashboard/apikeys.js index 9eec8503c5..0946f10e60 100644 --- a/src/controllers/dashboard/apikeys.js +++ b/src/controllers/dashboard/apikeys.js @@ -52,7 +52,7 @@ import { pageIdOn } from '../../utils/dashboard'; } function showNewKeyPrompt(page) { - import('../../components/prompt/prompt').then(({default: prompt}) => { + import('../../components/prompt/prompt').then(({ default: prompt }) => { prompt({ title: globalize.translate('HeaderNewApiKey'), label: globalize.translate('LabelAppName'), diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index fd98d163e9..d2db85156a 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -65,7 +65,7 @@ import confirm from '../../components/confirm/confirm'; } function showSendMessageForm(btn, session) { - import('../../components/prompt/prompt').then(({default: prompt}) => { + import('../../components/prompt/prompt').then(({ default: prompt }) => { prompt({ title: globalize.translate('HeaderSendMessage'), label: globalize.translate('LabelMessageText'), @@ -82,7 +82,7 @@ import confirm from '../../components/confirm/confirm'; } function showOptionsMenu(btn, session) { - import('../../components/actionSheet/actionSheet').then(({default: actionsheet}) => { + import('../../components/actionSheet/actionSheet').then(({ default: actionsheet }) => { const menuItems = []; if (session.ServerId && session.DeviceId !== ServerConnections.deviceId()) { diff --git a/src/controllers/dashboard/devices/devices.js b/src/controllers/dashboard/devices/devices.js index 537e842d90..348d6d2be1 100644 --- a/src/controllers/dashboard/devices/devices.js +++ b/src/controllers/dashboard/devices/devices.js @@ -68,7 +68,7 @@ import confirm from '../../../components/confirm/confirm'; }); } - import('../../../components/actionSheet/actionSheet').then(({default: actionsheet}) => { + import('../../../components/actionSheet/actionSheet').then(({ default: actionsheet }) => { actionsheet.show({ items: menuItems, positionTo: btn, diff --git a/src/controllers/dashboard/encodingsettings.html b/src/controllers/dashboard/encodingsettings.html index ad83d9bf27..f9790189e6 100644 --- a/src/controllers/dashboard/encodingsettings.html +++ b/src/controllers/dashboard/encodingsettings.html @@ -253,6 +253,13 @@
${EnableFallbackFontHelp}
+
+ +
${LabelEnableAudioVbrHelp}
+
${LabelDownMixAudioScaleHelp}
diff --git a/src/controllers/dashboard/encodingsettings.js b/src/controllers/dashboard/encodingsettings.js index b8c89726cd..f122d6da2a 100644 --- a/src/controllers/dashboard/encodingsettings.js +++ b/src/controllers/dashboard/encodingsettings.js @@ -22,6 +22,7 @@ import alert from '../../components/alert'; page.querySelector('#chkAllowHevcEncoding').checked = config.AllowHevcEncoding; $('#selectVideoDecoder', page).val(config.HardwareAccelerationType); $('#selectThreadCount', page).val(config.EncodingThreadCount); + page.querySelector('#chkEnableAudioVbr').checked = config.EnableAudioVbr; $('#txtDownMixAudioBoost', page).val(config.DownMixAudioBoost); $('#selectStereoDownmixAlgorithm').val(config.DownMixStereoAlgorithm || 'None'); page.querySelector('#txtMaxMuxingQueueSize').value = config.MaxMuxingQueueSize || ''; @@ -78,6 +79,7 @@ import alert from '../../components/alert'; const onDecoderConfirmed = function () { loading.show(); ApiClient.getNamedConfiguration('encoding').then(function (config) { + config.EnableAudioVbr = form.querySelector('#chkEnableAudioVbr').checked; config.DownMixAudioBoost = $('#txtDownMixAudioBoost', form).val(); config.DownMixStereoAlgorithm = $('#selectStereoDownmixAlgorithm', form).val() || 'None'; config.MaxMuxingQueueSize = form.querySelector('#txtMaxMuxingQueueSize').value; @@ -237,7 +239,7 @@ import alert from '../../components/alert'; setDecodingCodecsVisible(page, this.value); }); $('#btnSelectEncoderPath', page).on('click.selectDirectory', function () { - import('../../components/directorybrowser/directorybrowser').then(({default: DirectoryBrowser}) => { + import('../../components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { const picker = new DirectoryBrowser(); picker.show({ includeFiles: true, @@ -252,7 +254,7 @@ import alert from '../../components/alert'; }); }); $('#btnSelectTranscodingTempPath', page).on('click.selectDirectory', function () { - import('../../components/directorybrowser/directorybrowser').then(({default: DirectoryBrowser}) => { + import('../../components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { const picker = new DirectoryBrowser(); picker.show({ callback: function (path) { @@ -269,7 +271,7 @@ import alert from '../../components/alert'; }); }); $('#btnSelectFallbackFontPath', page).on('click.selectDirectory', function () { - import('../../components/directorybrowser/directorybrowser').then(({default: DirectoryBrowser}) => { + import('../../components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { const picker = new DirectoryBrowser(); picker.show({ includeDirectories: true, diff --git a/src/controllers/dashboard/general.js b/src/controllers/dashboard/general.js index 9b417534f4..ed7268748f 100644 --- a/src/controllers/dashboard/general.js +++ b/src/controllers/dashboard/general.js @@ -60,7 +60,7 @@ import alert from '../../components/alert'; const brandingConfigKey = 'branding'; export default function (view) { $('#btnSelectCachePath', view).on('click.selectDirectory', function () { - import('../../components/directorybrowser/directorybrowser').then(({default: DirectoryBrowser}) => { + import('../../components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { const picker = new DirectoryBrowser(); picker.show({ callback: function (path) { @@ -77,7 +77,7 @@ import alert from '../../components/alert'; }); }); $('#btnSelectMetadataPath', view).on('click.selectDirectory', function () { - import('../../components/directorybrowser/directorybrowser').then(({default: DirectoryBrowser}) => { + import('../../components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { const picker = new DirectoryBrowser(); picker.show({ path: $('#txtMetadataPath', view).val(), diff --git a/src/controllers/dashboard/library.js b/src/controllers/dashboard/library.js index 49ff203902..62cb3edf42 100644 --- a/src/controllers/dashboard/library.js +++ b/src/controllers/dashboard/library.js @@ -15,7 +15,7 @@ import cardBuilder from '../../components/cardbuilder/cardBuilder'; /* eslint-disable indent */ function addVirtualFolder(page) { - import('../../components/mediaLibraryCreator/mediaLibraryCreator').then(({default: medialibrarycreator}) => { + import('../../components/mediaLibraryCreator/mediaLibraryCreator').then(({ default: medialibrarycreator }) => { new medialibrarycreator({ collectionTypeOptions: getCollectionTypeOptions().filter(function (f) { return !f.hidden; @@ -30,7 +30,7 @@ import cardBuilder from '../../components/cardbuilder/cardBuilder'; } function editVirtualFolder(page, virtualFolder) { - import('../../components/mediaLibraryEditor/mediaLibraryEditor').then(({default: medialibraryeditor}) => { + import('../../components/mediaLibraryEditor/mediaLibraryEditor').then(({ default: medialibraryeditor }) => { new medialibraryeditor({ refresh: shouldRefreshLibraryAfterChanges(page), library: virtualFolder @@ -64,7 +64,7 @@ import cardBuilder from '../../components/cardbuilder/cardBuilder'; } function refreshVirtualFolder(page, virtualFolder) { - import('../../components/refreshdialog/refreshdialog').then(({default: refreshDialog}) => { + import('../../components/refreshdialog/refreshdialog').then(({ default: refreshDialog }) => { new refreshDialog({ itemIds: [virtualFolder.ItemId], serverId: ApiClient.serverId(), @@ -74,7 +74,7 @@ import cardBuilder from '../../components/cardbuilder/cardBuilder'; } function renameVirtualFolder(page, virtualFolder) { - import('../../components/prompt/prompt').then(({default: prompt}) => { + import('../../components/prompt/prompt').then(({ default: prompt }) => { prompt({ label: globalize.translate('LabelNewName'), description: globalize.translate('MessageRenameMediaFolder'), diff --git a/src/controllers/dashboard/networking.js b/src/controllers/dashboard/networking.js index 2989eb9bd5..a98715705c 100644 --- a/src/controllers/dashboard/networking.js +++ b/src/controllers/dashboard/networking.js @@ -181,7 +181,7 @@ import alert from '../../components/alert'; } }); view.querySelector('#btnSelectCertPath').addEventListener('click', function () { - import('../../components/directorybrowser/directorybrowser').then(({default: DirectoryBrowser}) => { + import('../../components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { const picker = new DirectoryBrowser(); picker.show({ includeFiles: true, diff --git a/src/controllers/list.js b/src/controllers/list.js index 334b658ebc..cf57fa2ee0 100644 --- a/src/controllers/list.js +++ b/src/controllers/list.js @@ -349,7 +349,7 @@ import LibraryMenu from '../scripts/libraryMenu'; function showViewSettingsMenu() { const instance = this; - import('../components/viewSettings/viewSettings').then(({default: ViewSettings}) => { + import('../components/viewSettings/viewSettings').then(({ default: ViewSettings }) => { new ViewSettings().show({ settingsKey: instance.getSettingsKey(), settings: instance.getViewSettings(), @@ -364,7 +364,7 @@ import LibraryMenu from '../scripts/libraryMenu'; function showFilterMenu() { const instance = this; - import('../components/filtermenu/filtermenu').then(({default: FilterMenu}) => { + import('../components/filtermenu/filtermenu').then(({ default: FilterMenu }) => { new FilterMenu().show({ settingsKey: instance.getSettingsKey(), settings: instance.getFilters(), @@ -383,7 +383,7 @@ import LibraryMenu from '../scripts/libraryMenu'; function showSortMenu() { const instance = this; - import('../components/sortmenu/sortmenu').then(({default: SortMenu}) => { + import('../components/sortmenu/sortmenu').then(({ default: SortMenu }) => { new SortMenu().show({ settingsKey: instance.getSettingsKey(), settings: instance.getSortValues(), @@ -401,7 +401,7 @@ import LibraryMenu from '../scripts/libraryMenu'; function onNewItemClick() { const instance = this; - import('../components/playlisteditor/playlisteditor').then(({default: playlistEditor}) => { + import('../components/playlisteditor/playlisteditor').then(({ default: playlistEditor }) => { new playlistEditor({ items: [], serverId: instance.params.serverId @@ -772,7 +772,7 @@ class ItemsView { } function autoFocus() { - import('../components/autoFocuser').then(({default: autoFocuser}) => { + import('../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(view); }); } diff --git a/src/controllers/livetv/livetvchannels.js b/src/controllers/livetv/livetvchannels.js index 90469c59f6..3dc1d04c97 100644 --- a/src/controllers/livetv/livetvchannels.js +++ b/src/controllers/livetv/livetvchannels.js @@ -100,7 +100,7 @@ export default function (view, params, tabContent) { } function showFilterMenu(context) { - import('../../components/filterdialog/filterdialog').then(({default: FilterDialog}) => { + import('../../components/filterdialog/filterdialog').then(({ default: FilterDialog }) => { const filterDialog = new FilterDialog({ query: getQuery(), mode: 'livetvchannels', @@ -124,7 +124,7 @@ export default function (view, params, tabContent) { loading.hide(); isLoading = false; - import('../../components/autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(context); }); }); diff --git a/src/controllers/livetv/livetvsuggested.js b/src/controllers/livetv/livetvsuggested.js index 8b97984d0a..8446838df5 100644 --- a/src/controllers/livetv/livetvsuggested.js +++ b/src/controllers/livetv/livetvsuggested.js @@ -61,7 +61,7 @@ function loadRecommendedPrograms(page) { }); loading.hide(); - import('../../components/autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(page); }); }); @@ -273,7 +273,7 @@ export default function (view, params) { break; } - import(`../livetv/${depends}`).then(({default: controllerFactory}) => { + import(`../livetv/${depends}`).then(({ default: controllerFactory }) => { let tabContent; if (index === 0) { diff --git a/src/controllers/livetvguideprovider.js b/src/controllers/livetvguideprovider.js index accdbe56bc..fbc77cc7b6 100644 --- a/src/controllers/livetvguideprovider.js +++ b/src/controllers/livetvguideprovider.js @@ -9,7 +9,7 @@ function onListingsSubmitted() { } function init(page, type, providerId) { - import(`../components/tvproviders/${type}`).then(({default: factory}) => { + import(`../components/tvproviders/${type}`).then(({ default: factory }) => { const instance = new factory(page, providerId, {}); Events.on(instance, 'submitted', onListingsSubmitted); instance.init(); @@ -17,7 +17,7 @@ function init(page, type, providerId) { } function loadTemplate(page, type, providerId) { - import(`../components/tvproviders/${type}.template.html`).then(({default: html}) => { + import(`../components/tvproviders/${type}.template.html`).then(({ default: html }) => { page.querySelector('.providerTemplate').innerHTML = globalize.translateHtml(html); init(page, type, providerId); }); diff --git a/src/controllers/livetvsettings.js b/src/controllers/livetvsettings.js index 7559b827c2..053b032282 100644 --- a/src/controllers/livetvsettings.js +++ b/src/controllers/livetvsettings.js @@ -64,7 +64,7 @@ $(document).on('pageinit', '#liveTvSettingsPage', function () { const page = this; $('.liveTvSettingsForm').off('submit', onSubmit).on('submit', onSubmit); $('#btnSelectRecordingPath', page).on('click.selectDirectory', function () { - import('../components/directorybrowser/directorybrowser').then(({default: DirectoryBrowser}) => { + import('../components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { const picker = new DirectoryBrowser(); picker.show({ callback: function (path) { @@ -79,7 +79,7 @@ $(document).on('pageinit', '#liveTvSettingsPage', function () { }); }); $('#btnSelectMovieRecordingPath', page).on('click.selectDirectory', function () { - import('../components/directorybrowser/directorybrowser').then(({default: DirectoryBrowser}) => { + import('../components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { const picker = new DirectoryBrowser(); picker.show({ callback: function (path) { @@ -94,7 +94,7 @@ $(document).on('pageinit', '#liveTvSettingsPage', function () { }); }); $('#btnSelectSeriesRecordingPath', page).on('click.selectDirectory', function () { - import('../components/directorybrowser/directorybrowser').then(({default: DirectoryBrowser}) => { + import('../components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { const picker = new DirectoryBrowser(); picker.show({ callback: function (path) { @@ -109,7 +109,7 @@ $(document).on('pageinit', '#liveTvSettingsPage', function () { }); }); $('#btnSelectPostProcessorPath', page).on('click.selectDirectory', function () { - import('../components/directorybrowser/directorybrowser').then(({default: DirectoryBrowser}) => { + import('../components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { const picker = new DirectoryBrowser(); picker.show({ includeFiles: true, diff --git a/src/controllers/livetvstatus.js b/src/controllers/livetvstatus.js index 8b2b4bebc3..5eb13c9793 100644 --- a/src/controllers/livetvstatus.js +++ b/src/controllers/livetvstatus.js @@ -147,7 +147,7 @@ function showProviderOptions(page, providerId, button) { id: 'map' }); - import('../components/actionSheet/actionSheet').then(({default: actionsheet}) => { + import('../components/actionSheet/actionSheet').then(({ default: actionsheet }) => { actionsheet.show({ items: items, positionTo: button @@ -165,7 +165,7 @@ function showProviderOptions(page, providerId, button) { } function mapChannels(page, providerId) { - import('../components/channelMapper/channelMapper').then(({default: channelMapper}) => { + import('../components/channelMapper/channelMapper').then(({ default: channelMapper }) => { new channelMapper({ serverId: ApiClient.serverInfo().Id, providerId: providerId @@ -237,7 +237,7 @@ function addProvider(button) { id: 'xmltv' }); - import('../components/actionSheet/actionSheet').then(({default: actionsheet}) => { + import('../components/actionSheet/actionSheet').then(({ default: actionsheet }) => { actionsheet.show({ items: menuItems, positionTo: button, @@ -263,7 +263,7 @@ function showDeviceMenu(button, tunerDeviceId) { id: 'edit' }); - import('../components/actionSheet/actionSheet').then(({default: actionsheet}) => { + import('../components/actionSheet/actionSheet').then(({ default: actionsheet }) => { actionsheet.show({ items: items, positionTo: button diff --git a/src/controllers/livetvtuner.js b/src/controllers/livetvtuner.js index 6b798c6c4a..b15eea9d8a 100644 --- a/src/controllers/livetvtuner.js +++ b/src/controllers/livetvtuner.js @@ -106,7 +106,7 @@ function submitForm(page) { } function getDetectedDevice() { - return import('../components/tunerPicker').then(({default: tunerPicker}) => { + return import('../components/tunerPicker').then(({ default: tunerPicker }) => { return new tunerPicker().show({ serverId: ApiClient.serverId() }); @@ -222,7 +222,7 @@ export default function (view, params) { }); }); view.querySelector('.btnSelectPath').addEventListener('click', function () { - import('../components/directorybrowser/directorybrowser').then(({default: DirectoryBrowser}) => { + import('../components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { const picker = new DirectoryBrowser(); picker.show({ includeFiles: true, diff --git a/src/controllers/music/musicalbums.js b/src/controllers/music/musicalbums.js index 7b2cf65b42..d1ad28b992 100644 --- a/src/controllers/music/musicalbums.js +++ b/src/controllers/music/musicalbums.js @@ -180,7 +180,7 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer'; loading.hide(); isLoading = false; - import('../../components/autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(tabContent); }); }); @@ -191,7 +191,7 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer'; let isLoading = false; this.showFilterMenu = function () { - import('../../components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { + import('../../components/filterdialog/filterdialog').then(({ default: filterDialogFactory }) => { const filterDialog = new filterDialogFactory({ query: getQuery(), mode: 'albums', diff --git a/src/controllers/music/musicartists.js b/src/controllers/music/musicartists.js index b05ddd31fa..040df1af73 100644 --- a/src/controllers/music/musicartists.js +++ b/src/controllers/music/musicartists.js @@ -162,7 +162,7 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer'; loading.hide(); isLoading = false; - import('../../components/autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(tabContent); }); }); @@ -172,7 +172,7 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer'; let isLoading = false; this.showFilterMenu = function () { - import('../../components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { + import('../../components/filterdialog/filterdialog').then(({ default: filterDialogFactory }) => { const filterDialog = new filterDialogFactory({ query: getQuery(tabContent), mode: this.mode, diff --git a/src/controllers/music/musicgenres.js b/src/controllers/music/musicgenres.js index c0e48e9a52..de64af44de 100644 --- a/src/controllers/music/musicgenres.js +++ b/src/controllers/music/musicgenres.js @@ -92,7 +92,7 @@ import loading from '../../components/loading/loading'; libraryBrowser.saveQueryValues(getSavedQueryKey(), query); loading.hide(); - import('../../components/autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(context); }); }); diff --git a/src/controllers/music/musicplaylists.js b/src/controllers/music/musicplaylists.js index 2d98aa5a99..8f562f1aaa 100644 --- a/src/controllers/music/musicplaylists.js +++ b/src/controllers/music/musicplaylists.js @@ -63,7 +63,7 @@ import loading from '../../components/loading/loading'; libraryBrowser.saveQueryValues(getSavedQueryKey(), query); loading.hide(); - import('../../components/autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(context); }); }); diff --git a/src/controllers/music/musicrecommended.js b/src/controllers/music/musicrecommended.js index bbb154a4e1..e2e15d2ab2 100644 --- a/src/controllers/music/musicrecommended.js +++ b/src/controllers/music/musicrecommended.js @@ -75,7 +75,7 @@ import Dashboard from '../../utils/dashboard'; imageLoader.lazyChildren(elem); loading.hide(); - import('../../components/autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(page); }); }); @@ -171,7 +171,7 @@ import Dashboard from '../../utils/dashboard'; loadRecentlyPlayed(tabContent, parentId); loadFrequentlyPlayed(tabContent, parentId); - import('../../components/favoriteitems').then(({default: favoriteItems}) => { + import('../../components/favoriteitems').then(({ default: favoriteItems }) => { favoriteItems.render(tabContent, ApiClient.getCurrentUserId(), parentId, ['favoriteArtists', 'favoriteAlbums', 'favoriteSongs']); }); } @@ -290,7 +290,7 @@ import Dashboard from '../../utils/dashboard'; break; } - import(`../music/${depends}`).then(({default: controllerFactory}) => { + import(`../music/${depends}`).then(({ default: controllerFactory }) => { let tabContent; if (index == 1) { diff --git a/src/controllers/music/songs.js b/src/controllers/music/songs.js index ed76a04ab3..06af0b3081 100644 --- a/src/controllers/music/songs.js +++ b/src/controllers/music/songs.js @@ -124,7 +124,7 @@ export default function (view, params, tabContent) { loading.hide(); isLoading = false; - import('../../components/autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(page); }); }); @@ -135,7 +135,7 @@ export default function (view, params, tabContent) { let isLoading = false; self.showFilterMenu = function () { - import('../../components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { + import('../../components/filterdialog/filterdialog').then(({ default: filterDialogFactory }) => { const filterDialog = new filterDialogFactory({ query: getQuery(tabContent), mode: 'songs', diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index d7bbab581d..2af8aa1848 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1,6 +1,5 @@ import escapeHtml from 'escape-html'; import { playbackManager } from '../../../components/playback/playbackmanager'; -import SyncPlay from '../../../plugins/syncPlay/core'; import browser from '../../../scripts/browser'; import dom from '../../../scripts/dom'; import inputManager from '../../../scripts/inputManager'; @@ -25,6 +24,8 @@ import SubtitleSync from '../../../components/subtitlesync/subtitlesync'; import { appRouter } from '../../../components/appRouter'; import LibraryMenu from '../../../scripts/libraryMenu'; import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components/backdrop/backdrop'; +import { pluginManager } from '../../../components/pluginManager'; +import { PluginType } from '../../../types/plugin.ts'; /* eslint-disable indent */ const TICKS_PER_MINUTE = 600000000; @@ -64,7 +65,7 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components ServerConnections.getApiClient(item.ServerId).getCurrentUser().then(function (user) { if (user.Policy.EnableLiveTvManagement) { - import('../../../components/recordingcreator/recordingbutton').then(({default: RecordingButton}) => { + import('../../../components/recordingcreator/recordingbutton').then(({ default: RecordingButton }) => { if (recordingButtonManager) { recordingButtonManager.refreshItem(item); return; @@ -216,7 +217,7 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components let title = itemName; if (item.PremiereDate) { try { - const year = datetime.toLocaleString(datetime.parseISO8601Date(item.PremiereDate).getFullYear(), {useGrouping: false}); + const year = datetime.toLocaleString(datetime.parseISO8601Date(item.PremiereDate).getFullYear(), { useGrouping: false }); title += ` (${year})`; } catch (e) { console.error(e); @@ -622,7 +623,7 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components } function showComingUpNext(player) { - import('../../../components/upnextdialog/upnextdialog').then(({default: UpNextDialog}) => { + import('../../../components/upnextdialog/upnextdialog').then(({ default: UpNextDialog }) => { if (!(currentVisibleMenu || currentUpNextDialog)) { currentVisibleMenu = 'upnext'; comingUpNextDisplayed = true; @@ -896,8 +897,8 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components const state = playbackManager.getPlayerState(player); // show subtitle offset feature only if player and media support it - const showSubOffset = playbackManager.supportSubtitleOffset(player) && - playbackManager.canHandleOffsetOnCurrentSubtitle(player); + const showSubOffset = playbackManager.supportSubtitleOffset(player) + && playbackManager.canHandleOffsetOnCurrentSubtitle(player); playerSettingsMenu.show({ mediaType: 'Video', @@ -929,7 +930,7 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components } function toggleStats() { - import('../../../components/playerstats/playerstats').then(({default: PlayerStats}) => { + import('../../../components/playerstats/playerstats').then(({ default: PlayerStats }) => { const player = currentPlayer; if (player) { @@ -969,7 +970,7 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components }); const positionTo = this; - import('../../../components/actionSheet/actionSheet').then(({default: actionsheet}) => { + import('../../../components/actionSheet/actionSheet').then(({ default: actionsheet }) => { actionsheet.show({ items: menuItems, title: globalize.translate('Audio'), @@ -1086,7 +1087,7 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components const positionTo = this; - import('../../../components/actionSheet/actionSheet').then(({default: actionsheet}) => { + import('../../../components/actionSheet/actionSheet').then(({ default: actionsheet }) => { actionsheet.show({ title: globalize.translate('Subtitles'), items: menuItems, @@ -1774,38 +1775,39 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components }, iconVisibilityTime); }; - Events.on(SyncPlay.Manager, 'enabled', (event, enabled) => { - if (enabled) { - // SyncPlay enabled - } else { - const syncPlayIcon = view.querySelector('#syncPlayIcon'); - syncPlayIcon.style.visibility = 'hidden'; - } - }); + const SyncPlay = pluginManager.firstOfType(PluginType.SyncPlay)?.instance; + if (SyncPlay) { + Events.on(SyncPlay.Manager, 'enabled', (_event, enabled) => { + if (!enabled) { + const syncPlayIcon = view.querySelector('#syncPlayIcon'); + syncPlayIcon.style.visibility = 'hidden'; + } + }); - Events.on(SyncPlay.Manager, 'notify-osd', (event, action) => { - showIcon(action); - }); + Events.on(SyncPlay.Manager, 'notify-osd', (_event, action) => { + showIcon(action); + }); - Events.on(SyncPlay.Manager, 'group-state-update', (event, state, reason) => { - if (state === 'Playing' && reason === 'Unpause') { - showIcon('schedule-play'); - } else if (state === 'Playing' && reason === 'Ready') { - showIcon('schedule-play'); - } else if (state === 'Paused' && reason === 'Pause') { - showIcon('pause'); - } else if (state === 'Paused' && reason === 'Ready') { - showIcon('clear'); - } else if (state === 'Waiting' && reason === 'Seek') { - showIcon('seek'); - } else if (state === 'Waiting' && reason === 'Buffer') { - showIcon('buffering'); - } else if (state === 'Waiting' && reason === 'Pause') { - showIcon('wait-pause'); - } else if (state === 'Waiting' && reason === 'Unpause') { - showIcon('wait-unpause'); - } - }); + Events.on(SyncPlay.Manager, 'group-state-update', (_event, state, reason) => { + if (state === 'Playing' && reason === 'Unpause') { + showIcon('schedule-play'); + } else if (state === 'Playing' && reason === 'Ready') { + showIcon('schedule-play'); + } else if (state === 'Paused' && reason === 'Pause') { + showIcon('pause'); + } else if (state === 'Paused' && reason === 'Ready') { + showIcon('clear'); + } else if (state === 'Waiting' && reason === 'Seek') { + showIcon('seek'); + } else if (state === 'Waiting' && reason === 'Buffer') { + showIcon('buffering'); + } else if (state === 'Waiting' && reason === 'Pause') { + showIcon('wait-pause'); + } else if (state === 'Waiting' && reason === 'Unpause') { + showIcon('wait-unpause'); + } + }); + } } /* eslint-enable indent */ diff --git a/src/controllers/session/addServer/index.js b/src/controllers/session/addServer/index.js index 17c72f8e19..64deaa2fcf 100644 --- a/src/controllers/session/addServer/index.js +++ b/src/controllers/session/addServer/index.js @@ -54,7 +54,7 @@ import { ConnectionState } from '../../../utils/jellyfin-apiclient/ConnectionSta view.querySelector('.addServerForm').addEventListener('submit', onServerSubmit); view.querySelector('.btnCancel').addEventListener('click', goBack); - import('../../../components/autoFocuser').then(({default: autoFocuser}) => { + import('../../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(view); }); @@ -65,7 +65,7 @@ import { ConnectionState } from '../../../utils/jellyfin-apiclient/ConnectionSta } function goBack() { - import('../../../components/appRouter').then(({appRouter}) => { + import('../../../components/appRouter').then(({ appRouter }) => { appRouter.back(); }); } diff --git a/src/controllers/session/login/index.js b/src/controllers/session/login/index.js index 258e670713..f0c3639b83 100644 --- a/src/controllers/session/login/index.js +++ b/src/controllers/session/login/index.js @@ -201,7 +201,7 @@ import './login.scss'; view.querySelector('.manualLoginForm').classList.add('hide'); view.querySelector('.btnManual').classList.remove('hide'); - import('../../../components/autoFocuser').then(({default: autoFocuser}) => { + import('../../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(view); }); } diff --git a/src/controllers/shows/episodes.js b/src/controllers/shows/episodes.js index ba7096c0d4..2cbe4117f6 100644 --- a/src/controllers/shows/episodes.js +++ b/src/controllers/shows/episodes.js @@ -162,7 +162,7 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer'; loading.hide(); isLoading = false; - import('../../components/autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(page); }); }); @@ -173,7 +173,7 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer'; let isLoading = false; self.showFilterMenu = function () { - import('../../components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { + import('../../components/filterdialog/filterdialog').then(({ default: filterDialogFactory }) => { const filterDialog = new filterDialogFactory({ query: getQuery(tabContent), mode: 'episodes', diff --git a/src/controllers/shows/tvrecommended.js b/src/controllers/shows/tvrecommended.js index d1e53b38de..0066cf48a2 100644 --- a/src/controllers/shows/tvrecommended.js +++ b/src/controllers/shows/tvrecommended.js @@ -269,7 +269,7 @@ import autoFocuser from '../../components/autoFocuser'; break; } - import(`../shows/${depends}`).then(({default: controllerFactory}) => { + import(`../shows/${depends}`).then(({ default: controllerFactory }) => { let tabContent; if (index === 1) { diff --git a/src/controllers/shows/tvshows.js b/src/controllers/shows/tvshows.js index 8c58bf6ff1..296746613e 100644 --- a/src/controllers/shows/tvshows.js +++ b/src/controllers/shows/tvshows.js @@ -191,7 +191,7 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer'; loading.hide(); isLoading = false; - import('../../components/autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(page); }); }); @@ -201,7 +201,7 @@ import '../../elements/emby-itemscontainer/emby-itemscontainer'; let isLoading = false; this.showFilterMenu = function () { - import('../../components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { + import('../../components/filterdialog/filterdialog').then(({ default: filterDialogFactory }) => { const filterDialog = new filterDialogFactory({ query: getQuery(tabContent), mode: 'series', diff --git a/src/controllers/shows/tvstudios.js b/src/controllers/shows/tvstudios.js index 5a0276e5f4..faa8bb90af 100644 --- a/src/controllers/shows/tvstudios.js +++ b/src/controllers/shows/tvstudios.js @@ -50,7 +50,7 @@ import cardBuilder from '../../components/cardbuilder/cardBuilder'; }); loading.hide(); - import('../../components/autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(context); }); }); diff --git a/src/controllers/user/controls/index.js b/src/controllers/user/controls/index.js index 066f5b1a42..cb212e5297 100644 --- a/src/controllers/user/controls/index.js +++ b/src/controllers/user/controls/index.js @@ -21,7 +21,7 @@ export default function (view) { view.querySelector('form').addEventListener('submit', submit); view.querySelector('.btnSave').classList.remove('hide'); - import('../../../components/autoFocuser').then(({default: autoFocuser}) => { + import('../../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(view); }); }); diff --git a/src/controllers/user/menu/index.js b/src/controllers/user/menu/index.js index 073af9c0db..7f8ae7ecb4 100644 --- a/src/controllers/user/menu/index.js +++ b/src/controllers/user/menu/index.js @@ -68,7 +68,7 @@ export default function (view, params) { page.querySelector('.lnkControlsPreferences').classList.add('hide'); } - import('../../../components/autoFocuser').then(({default: autoFocuser}) => { + import('../../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(view); }); }); diff --git a/src/elements/SectionTitleContainer.tsx b/src/elements/SectionTitleContainer.tsx index 6919169a5f..aa85e3c312 100644 --- a/src/elements/SectionTitleContainer.tsx +++ b/src/elements/SectionTitleContainer.tsx @@ -13,7 +13,7 @@ type IProps = { isLinkVisible?: boolean; url?: string; } -const SectionTitleContainer: FunctionComponent = ({SectionClassName, title, isBtnVisible = false, btnId, btnClassName, btnTitle, btnIcon, isLinkVisible = true, url}: IProps) => { +const SectionTitleContainer: FunctionComponent = ({ SectionClassName, title, isBtnVisible = false, btnId, btnClassName, btnTitle, btnIcon, isLinkVisible = true, url }: IProps) => { return (

diff --git a/src/elements/emby-itemscontainer/emby-itemscontainer.js b/src/elements/emby-itemscontainer/emby-itemscontainer.js index ae0f0fef54..4c7769f32e 100644 --- a/src/elements/emby-itemscontainer/emby-itemscontainer.js +++ b/src/elements/emby-itemscontainer/emby-itemscontainer.js @@ -72,7 +72,7 @@ import Sortable from 'sortablejs'; } const self = this; - import('../../components/multiSelect/multiSelect').then(({default: MultiSelect}) => { + import('../../components/multiSelect/multiSelect').then(({ default: MultiSelect }) => { self.multiSelect = new MultiSelect({ container: self, bindOnClick: false diff --git a/src/elements/emby-scroller/Scroller.tsx b/src/elements/emby-scroller/Scroller.tsx index 14313318a6..36b38cc1fb 100644 --- a/src/elements/emby-scroller/Scroller.tsx +++ b/src/elements/emby-scroller/Scroller.tsx @@ -229,8 +229,8 @@ const Scroller: FC = ({ return ( <> { - showControls && scrollState.scrollWidth > scrollState.scrollSize + 20 && - scrollState.scrollSize + 20 + && { if (result.Items.length) { - import('../../components/slideshow/slideshow').then(({default: Slideshow}) => { + import('../../components/slideshow/slideshow').then(({ default: Slideshow }) => { const newSlideShow = new Slideshow({ showTitle: true, cover: true, diff --git a/src/plugins/bookPlayer/plugin.js b/src/plugins/bookPlayer/plugin.js index df5e213b72..8924d06951 100644 --- a/src/plugins/bookPlayer/plugin.js +++ b/src/plugins/bookPlayer/plugin.js @@ -17,15 +17,31 @@ import '../../elements/emby-button/paper-icon-button-light'; import html from './template.html'; import './style.scss'; +const THEMES = { + 'dark': { 'body': { 'color': '#d8dadc', 'background': '#000', 'font-size': 'medium' } }, + 'sepia': { 'body': { 'color': '#d8a262', 'background': '#000', 'font-size': 'medium' } }, + 'light': { 'body': { 'color': '#000', 'background': '#fff', 'font-size': 'medium' } } +}; +const THEME_ORDER = ['dark', 'sepia', 'light']; +const FONT_SIZES = ['x-small', 'small', 'medium', 'large', 'x-large']; + export class BookPlayer { constructor() { this.name = 'Book Player'; this.type = PluginType.MediaPlayer; this.id = 'bookplayer'; this.priority = 1; - + if (!userSettings.theme() || userSettings.theme() === 'dark') { + this.theme = 'dark'; + } else { + this.theme = 'light'; + } + this.fontSize = 'medium'; this.onDialogClosed = this.onDialogClosed.bind(this); this.openTableOfContents = this.openTableOfContents.bind(this); + this.rotateTheme = this.rotateTheme.bind(this); + this.increaseFontSize = this.increaseFontSize.bind(this); + this.decreaseFontSize = this.decreaseFontSize.bind(this); this.previous = this.previous.bind(this); this.next = this.next.bind(this); this.onWindowKeyUp = this.onWindowKeyUp.bind(this); @@ -164,6 +180,9 @@ export class BookPlayer { elem.querySelector('#btnBookplayerExit').addEventListener('click', this.onDialogClosed, { once: true }); elem.querySelector('#btnBookplayerToc').addEventListener('click', this.openTableOfContents); elem.querySelector('#btnBookplayerFullscreen').addEventListener('click', this.toggleFullscreen); + elem.querySelector('#btnBookplayerRotateTheme').addEventListener('click', this.rotateTheme); + elem.querySelector('#btnBookplayerIncreaseFontSize').addEventListener('click', this.increaseFontSize); + elem.querySelector('#btnBookplayerDecreaseFontSize').addEventListener('click', this.decreaseFontSize); elem.querySelector('#btnBookplayerPrev')?.addEventListener('click', this.previous); elem.querySelector('#btnBookplayerNext')?.addEventListener('click', this.next); } @@ -184,6 +203,9 @@ export class BookPlayer { elem.querySelector('#btnBookplayerExit').removeEventListener('click', this.onDialogClosed); elem.querySelector('#btnBookplayerToc').removeEventListener('click', this.openTableOfContents); elem.querySelector('#btnBookplayerFullscreen').removeEventListener('click', this.toggleFullscreen); + elem.querySelector('#btnBookplayerRotateTheme').removeEventListener('click', this.rotateTheme); + elem.querySelector('#btnBookplayerIncreaseFontSize').removeEventListener('click', this.increaseFontSize); + elem.querySelector('#btnBookplayerDecreaseFontSize').removeEventListener('click', this.decreaseFontSize); elem.querySelector('#btnBookplayerPrev')?.removeEventListener('click', this.previous); elem.querySelector('#btnBookplayerNext')?.removeEventListener('click', this.next); } @@ -214,6 +236,31 @@ export class BookPlayer { } } + rotateTheme() { + if (this.loaded) { + const newTheme = THEME_ORDER[(THEME_ORDER.indexOf(this.theme) + 1) % THEME_ORDER.length]; + this.rendition.themes.register('default', THEMES[newTheme]); + this.rendition.themes.update('default'); + this.theme = newTheme; + } + } + + increaseFontSize() { + if (this.loaded && this.fontSize !== FONT_SIZES[FONT_SIZES.length - 1]) { + const newFontSize = FONT_SIZES[(FONT_SIZES.indexOf(this.fontSize) + 1)]; + this.rendition.themes.fontSize(newFontSize); + this.fontSize = newFontSize; + } + } + + decreaseFontSize() { + if (this.loaded && this.fontSize !== FONT_SIZES[0]) { + const newFontSize = FONT_SIZES[(FONT_SIZES.indexOf(this.fontSize) - 1)]; + this.rendition.themes.fontSize(newFontSize); + this.fontSize = newFontSize; + } + } + previous(e) { e?.preventDefault(); if (this.rendition) { @@ -296,11 +343,8 @@ export class BookPlayer { this.currentSrc = downloadHref; this.rendition = rendition; - rendition.themes.register('dark', { 'body': { 'color': '#fff' } }); - - if (userSettings.theme(undefined) === 'dark' || userSettings.theme(undefined) === null) { - rendition.themes.select('dark'); - } + rendition.themes.register('default', THEMES[this.theme]); + rendition.themes.select('default'); return rendition.display().then(() => { const epubElem = document.querySelector('.epub-container'); diff --git a/src/plugins/bookPlayer/tableOfContents.js b/src/plugins/bookPlayer/tableOfContents.js index efbb533b22..2da57b9229 100644 --- a/src/plugins/bookPlayer/tableOfContents.js +++ b/src/plugins/bookPlayer/tableOfContents.js @@ -23,8 +23,8 @@ export default class TableOfContents { bindEvents() { const elem = this.elem; - elem.addEventListener('close', this.onDialogClosed, {once: true}); - elem.querySelector('.btnBookplayerTocClose').addEventListener('click', this.onDialogClosed, {once: true}); + elem.addEventListener('close', this.onDialogClosed, { once: true }); + elem.querySelector('.btnBookplayerTocClose').addEventListener('click', this.onDialogClosed, { once: true }); } unbindEvents() { diff --git a/src/plugins/bookPlayer/template.html b/src/plugins/bookPlayer/template.html index bf71834f02..55fd02c8a1 100644 --- a/src/plugins/bookPlayer/template.html +++ b/src/plugins/bookPlayer/template.html @@ -11,6 +11,15 @@ + + + diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 2c48b40878..3817988d65 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -107,7 +107,7 @@ function tryRemoveElement(elem) { } function requireHlsPlayer(callback) { - import('hls.js').then(({default: hls}) => { + import('hls.js').then(({ default: hls }) => { hls.DefaultConfig.lowLatencyMode = false; hls.DefaultConfig.backBufferLength = Infinity; hls.DefaultConfig.liveBackBufferLength = 90; @@ -396,7 +396,7 @@ function tryRemoveElement(elem) { * @private */ setSrcWithFlvJs(elem, options, url) { - return import('flv.js').then(({default: flvjs}) => { + return import('flv.js').then(({ default: flvjs }) => { const flvPlayer = flvjs.createPlayer({ type: 'flv', url: url diff --git a/src/plugins/photoPlayer/plugin.js b/src/plugins/photoPlayer/plugin.js index 7c41c53188..44aa79b82f 100644 --- a/src/plugins/photoPlayer/plugin.js +++ b/src/plugins/photoPlayer/plugin.js @@ -11,7 +11,7 @@ export default class PhotoPlayer { play(options) { return new Promise(function (resolve) { - import('../../components/slideshow/slideshow').then(({default: Slideshow}) => { + import('../../components/slideshow/slideshow').then(({ default: Slideshow }) => { const index = options.startIndex || 0; const apiClient = ServerConnections.currentApiClient(); diff --git a/src/plugins/syncPlay/core/PlaybackCore.js b/src/plugins/syncPlay/core/PlaybackCore.js index ceb5653c76..effa1cab62 100644 --- a/src/plugins/syncPlay/core/PlaybackCore.js +++ b/src/plugins/syncPlay/core/PlaybackCore.js @@ -133,9 +133,9 @@ class PlaybackCore { */ async sendBufferingRequest(isBuffering = true) { const playerWrapper = this.manager.getPlayerWrapper(); - const currentPosition = (playerWrapper.currentTimeAsync - ? await playerWrapper.currentTimeAsync() - : playerWrapper.currentTime()); + const currentPosition = (playerWrapper.currentTimeAsync ? + await playerWrapper.currentTimeAsync() : + playerWrapper.currentTime()); const currentPositionTicks = Math.round(currentPosition * Helper.TicksPerMillisecond); const isPlaying = playerWrapper.isPlaying(); @@ -172,11 +172,11 @@ class PlaybackCore { */ async applyCommand(command) { // Check if duplicate. - if (this.lastCommand && - this.lastCommand.When.getTime() === command.When.getTime() && - this.lastCommand.PositionTicks === command.PositionTicks && - this.lastCommand.Command === command.Command && - this.lastCommand.PlaylistItemId === command.PlaylistItemId + if (this.lastCommand + && this.lastCommand.When.getTime() === command.When.getTime() + && this.lastCommand.PositionTicks === command.PositionTicks + && this.lastCommand.Command === command.Command + && this.lastCommand.PlaylistItemId === command.PlaylistItemId ) { // Duplicate command found, check playback state and correct if needed. console.debug('SyncPlay applyCommand: duplicate command received!', command); @@ -192,9 +192,9 @@ class PlaybackCore { } else { // Check if playback state matches requested command. const playerWrapper = this.manager.getPlayerWrapper(); - const currentPositionTicks = Math.round((playerWrapper.currentTimeAsync - ? await playerWrapper.currentTimeAsync() - : playerWrapper.currentTime()) * Helper.TicksPerMillisecond); + const currentPositionTicks = Math.round((playerWrapper.currentTimeAsync ? + await playerWrapper.currentTimeAsync() : + playerWrapper.currentTime()) * Helper.TicksPerMillisecond); const isPlaying = playerWrapper.isPlaying(); switch (command.Command) { @@ -279,9 +279,9 @@ class PlaybackCore { const playAtTimeLocal = this.timeSyncCore.remoteDateToLocal(playAtTime); const playerWrapper = this.manager.getPlayerWrapper(); - const currentPositionTicks = (playerWrapper.currentTimeAsync - ? await playerWrapper.currentTimeAsync() - : playerWrapper.currentTime()) * Helper.TicksPerMillisecond; + const currentPositionTicks = (playerWrapper.currentTimeAsync ? + await playerWrapper.currentTimeAsync() : + playerWrapper.currentTime()) * Helper.TicksPerMillisecond; if (playAtTimeLocal > currentTime) { const playTimeout = playAtTimeLocal - currentTime; diff --git a/src/plugins/syncPlay/core/QueueCore.js b/src/plugins/syncPlay/core/QueueCore.js index f1a435106e..721ed7403a 100644 --- a/src/plugins/syncPlay/core/QueueCore.js +++ b/src/plugins/syncPlay/core/QueueCore.js @@ -174,9 +174,9 @@ class QueueCore { const currentTime = new Date(); const now = this.manager.timeSyncCore.localDateToRemote(currentTime); - const currentPosition = (playerWrapper.currentTimeAsync - ? await playerWrapper.currentTimeAsync() - : playerWrapper.currentTime()); + const currentPosition = (playerWrapper.currentTimeAsync ? + await playerWrapper.currentTimeAsync() : + playerWrapper.currentTime()); const currentPositionTicks = Math.round(currentPosition * Helper.TicksPerMillisecond); const isPlaying = playerWrapper.isPlaying(); diff --git a/src/plugins/syncPlay/plugin.ts b/src/plugins/syncPlay/plugin.ts index 59c066aaf7..33d99aa757 100644 --- a/src/plugins/syncPlay/plugin.ts +++ b/src/plugins/syncPlay/plugin.ts @@ -12,6 +12,7 @@ class SyncPlayPlugin implements Plugin { id: string; type: string; priority: number; + instance: typeof SyncPlay; constructor() { this.name = 'SyncPlay Plugin'; @@ -21,6 +22,8 @@ class SyncPlayPlugin implements Plugin { this.type = PluginType.SyncPlay; this.priority = 1; + this.instance = SyncPlay; + this.init(); } diff --git a/src/plugins/syncPlay/ui/groupSelectionMenu.js b/src/plugins/syncPlay/ui/groupSelectionMenu.js index 383d893782..36589dfcb4 100644 --- a/src/plugins/syncPlay/ui/groupSelectionMenu.js +++ b/src/plugins/syncPlay/ui/groupSelectionMenu.js @@ -1,11 +1,12 @@ -import SyncPlay from '../core'; import SyncPlaySettingsEditor from './settings/SettingsEditor'; import loading from '../../../components/loading/loading'; import toast from '../../../components/toast/toast'; import actionsheet from '../../../components/actionSheet/actionSheet'; import globalize from '../../../scripts/globalize'; import playbackPermissionManager from './playbackPermissionManager'; +import { pluginManager } from '../../../components/pluginManager'; import ServerConnections from '../../../components/ServerConnections'; +import { PluginType } from '../../../types/plugin.ts'; import Events from '../../../utils/events.ts'; import './groupSelectionMenu.scss'; @@ -17,8 +18,22 @@ class GroupSelectionMenu { constructor() { // Register to SyncPlay events. this.syncPlayEnabled = false; - Events.on(SyncPlay.Manager, 'enabled', (e, enabled) => { - this.syncPlayEnabled = enabled; + this.SyncPlay = pluginManager.firstOfType(PluginType.SyncPlay)?.instance; + + if (this.SyncPlay) { + Events.on(this.SyncPlay.Manager, 'enabled', (_event, enabled) => { + this.syncPlayEnabled = enabled; + }); + } + + Events.on(pluginManager, 'registered', (_event0, plugin) => { + if (plugin.type === PluginType.SyncPlay) { + this.SyncPlay = plugin.instance; + + Events.on(plugin.instance.Manager, 'enabled', (_event1, enabled) => { + this.syncPlayEnabled = enabled; + }); + } }); } @@ -103,10 +118,11 @@ class GroupSelectionMenu { * @param {Object} apiClient - ApiClient. */ showLeaveGroupSelection(button, user, apiClient) { - const groupInfo = SyncPlay.Manager.getGroupInfo(); + const groupInfo = this.SyncPlay?.Manager.getGroupInfo(); const menuItems = []; - if (!SyncPlay.Manager.isPlaylistEmpty() && !SyncPlay.Manager.isPlaybackActive()) { + if (!this.SyncPlay?.Manager.isPlaylistEmpty() + && !this.SyncPlay?.Manager.isPlaybackActive()) { menuItems.push({ name: globalize.translate('LabelSyncPlayResumePlayback'), icon: 'play_circle_filled', @@ -114,7 +130,7 @@ class GroupSelectionMenu { selected: false, secondaryText: globalize.translate('LabelSyncPlayResumePlaybackDescription') }); - } else if (SyncPlay.Manager.isPlaybackActive()) { + } else if (this.SyncPlay?.Manager.isPlaybackActive()) { menuItems.push({ name: globalize.translate('LabelSyncPlayHaltPlayback'), icon: 'pause_circle_filled', @@ -149,15 +165,15 @@ class GroupSelectionMenu { border: true }; - actionsheet.show(menuOptions).then(function (id) { + actionsheet.show(menuOptions).then((id) => { if (id == 'resume-playback') { - SyncPlay.Manager.resumeGroupPlayback(apiClient); + this.SyncPlay?.Manager.resumeGroupPlayback(apiClient); } else if (id == 'halt-playback') { - SyncPlay.Manager.haltGroupPlayback(apiClient); + this.SyncPlay?.Manager.haltGroupPlayback(apiClient); } else if (id == 'leave-group') { apiClient.leaveSyncPlayGroup(); } else if (id == 'settings') { - new SyncPlaySettingsEditor(apiClient, SyncPlay.Manager.getTimeSyncCore(), { groupInfo: groupInfo }) + new SyncPlaySettingsEditor(apiClient, this.SyncPlay?.Manager.getTimeSyncCore(), { groupInfo: groupInfo }) .embed() .catch(error => { if (error) { diff --git a/src/plugins/syncPlay/ui/settings/SettingsEditor.js b/src/plugins/syncPlay/ui/settings/SettingsEditor.js index f782d0b91e..0377feab65 100644 --- a/src/plugins/syncPlay/ui/settings/SettingsEditor.js +++ b/src/plugins/syncPlay/ui/settings/SettingsEditor.js @@ -3,13 +3,14 @@ * @module components/syncPlay/settings/SettingsEditor */ -import SyncPlay from '../../core'; import { setSetting } from '../../core/Settings'; import dialogHelper from '../../../../components/dialogHelper/dialogHelper'; import layoutManager from '../../../../components/layoutManager'; +import { pluginManager } from '../../../../components/pluginManager'; import loading from '../../../../components/loading/loading'; import toast from '../../../../components/toast/toast'; import globalize from '../../../../scripts/globalize'; +import { PluginType } from '../../../../types/plugin.ts'; import Events from '../../../../utils/events.ts'; import 'material-design-icons-iconfont'; @@ -36,6 +37,7 @@ class SettingsEditor { this.apiClient = apiClient; this.timeSyncCore = timeSyncCore; this.options = options; + this.SyncPlay = pluginManager.firstOfType(PluginType.SyncPlay)?.instance; } async embed() { @@ -95,14 +97,14 @@ class SettingsEditor { async initEditor() { const { context } = this; - context.querySelector('#txtExtraTimeOffset').value = SyncPlay.Manager.timeSyncCore.extraTimeOffset; - context.querySelector('#chkSyncCorrection').checked = SyncPlay.Manager.playbackCore.enableSyncCorrection; - context.querySelector('#txtMinDelaySpeedToSync').value = SyncPlay.Manager.playbackCore.minDelaySpeedToSync; - context.querySelector('#txtMaxDelaySpeedToSync').value = SyncPlay.Manager.playbackCore.maxDelaySpeedToSync; - context.querySelector('#txtSpeedToSyncDuration').value = SyncPlay.Manager.playbackCore.speedToSyncDuration; - context.querySelector('#txtMinDelaySkipToSync').value = SyncPlay.Manager.playbackCore.minDelaySkipToSync; - context.querySelector('#chkSpeedToSync').checked = SyncPlay.Manager.playbackCore.useSpeedToSync; - context.querySelector('#chkSkipToSync').checked = SyncPlay.Manager.playbackCore.useSkipToSync; + context.querySelector('#txtExtraTimeOffset').value = this.SyncPlay?.Manager.timeSyncCore.extraTimeOffset; + context.querySelector('#chkSyncCorrection').checked = this.SyncPlay?.Manager.playbackCore.enableSyncCorrection; + context.querySelector('#txtMinDelaySpeedToSync').value = this.SyncPlay?.Manager.playbackCore.minDelaySpeedToSync; + context.querySelector('#txtMaxDelaySpeedToSync').value = this.SyncPlay?.Manager.playbackCore.maxDelaySpeedToSync; + context.querySelector('#txtSpeedToSyncDuration').value = this.SyncPlay?.Manager.playbackCore.speedToSyncDuration; + context.querySelector('#txtMinDelaySkipToSync').value = this.SyncPlay?.Manager.playbackCore.minDelaySkipToSync; + context.querySelector('#chkSpeedToSync').checked = this.SyncPlay?.Manager.playbackCore.useSpeedToSync; + context.querySelector('#chkSkipToSync').checked = this.SyncPlay?.Manager.playbackCore.useSkipToSync; } onSubmit() { @@ -139,7 +141,7 @@ class SettingsEditor { setSetting('useSpeedToSync', useSpeedToSync); setSetting('useSkipToSync', useSkipToSync); - Events.trigger(SyncPlay.Manager, 'settings-update'); + Events.trigger(this.SyncPlay?.Manager, 'settings-update'); } } diff --git a/src/routes/movies/SuggestionsView.tsx b/src/routes/movies/SuggestionsView.tsx index 362fb7ee91..0d4b944be9 100644 --- a/src/routes/movies/SuggestionsView.tsx +++ b/src/routes/movies/SuggestionsView.tsx @@ -9,7 +9,7 @@ import RecommendationContainer from '../../components/common/RecommendationConta import SectionContainer from '../../components/common/SectionContainer'; import { LibraryViewProps } from '../../types/interface'; -const SuggestionsView: FC = ({topParentId}) => { +const SuggestionsView: FC = ({ topParentId }) => { const [ latestItems, setLatestItems ] = useState([]); const [ resumeResult, setResumeResult ] = useState({}); const [ recommendations, setRecommendations ] = useState([]); @@ -28,7 +28,7 @@ const SuggestionsView: FC = ({topParentId}) => { }, [enableScrollX]); const autoFocus = useCallback((page) => { - import('../../components/autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(page); }); }, []); diff --git a/src/routes/search.tsx b/src/routes/search.tsx index d154018b4e..192f90bb67 100644 --- a/src/routes/search.tsx +++ b/src/routes/search.tsx @@ -19,8 +19,8 @@ const Search: FunctionComponent = () => { className='mainAnimatedPage libraryPage allLibraryPage noSecondaryNavPage' > - {!query && - } diff --git a/src/routes/user/useredit.tsx b/src/routes/user/useredit.tsx index b2eef63c76..67fe055632 100644 --- a/src/routes/user/useredit.tsx +++ b/src/routes/user/useredit.tsx @@ -172,7 +172,7 @@ const UserEdit: FunctionComponent = () => { (page.querySelector('.chkForceRemoteSourceTranscoding') as HTMLInputElement).checked = user.Policy.ForceRemoteSourceTranscoding; (page.querySelector('.chkRemoteAccess') as HTMLInputElement).checked = user.Policy.EnableRemoteAccess == null || user.Policy.EnableRemoteAccess; (page.querySelector('#txtRemoteClientBitrateLimit') as HTMLInputElement).value = user.Policy.RemoteClientBitrateLimit > 0 ? - (user.Policy.RemoteClientBitrateLimit / 1e6).toLocaleString(undefined, {maximumFractionDigits: 6}) : ''; + (user.Policy.RemoteClientBitrateLimit / 1e6).toLocaleString(undefined, { maximumFractionDigits: 6 }) : ''; (page.querySelector('#txtLoginAttemptsBeforeLockout') as HTMLInputElement).value = user.Policy.LoginAttemptsBeforeLockout || '0'; (page.querySelector('#txtMaxActiveSessions') as HTMLInputElement).value = user.Policy.MaxActiveSessions || '0'; if (window.ApiClient.isMinServerVersion('10.6.0')) { @@ -314,7 +314,7 @@ const UserEdit: FunctionComponent = () => {
{
{globalize.translate('HeaderThisUserIsCurrentlyDisabled')}
-
+
{globalize.translate('MessageReenableUser')}
@@ -386,7 +386,7 @@ const UserEdit: FunctionComponent = () => {

{globalize.translate('HeaderFeatureAccess')}

-
+
{

{globalize.translate('HeaderPlayback')}

-
+
{
-

+

{globalize.translate('HeaderAllowMediaDeletionFrom')}

@@ -484,7 +484,7 @@ const UserEdit: FunctionComponent = () => {

{globalize.translate('HeaderRemoteControl')}

-
+
{ const showSchedulePopup = (schedule: AccessSchedule, index: number) => { schedule = schedule || {}; - import('../../components/accessSchedule/accessSchedule').then(({default: accessschedule}) => { + import('../../components/accessSchedule/accessSchedule').then(({ default: accessschedule }) => { accessschedule.show({ schedule: schedule }).then(function (updatedSchedule) { @@ -272,7 +272,7 @@ const UserParentalControl: FunctionComponent = () => { }; const showBlockedTagPopup = () => { - import('../../components/prompt/prompt').then(({default: prompt}) => { + import('../../components/prompt/prompt').then(({ default: prompt }) => { prompt({ label: globalize.translate('LabelTag') }).then(function (value) { @@ -367,7 +367,7 @@ const UserParentalControl: FunctionComponent = () => {

-
+
{ btnIcon='add' isLinkVisible={false} /> -
+
{blockedTags.map(tag => { return { })}
-
+
{
-
-

+
+

{userName}


diff --git a/src/routes/user/userprofiles.tsx b/src/routes/user/userprofiles.tsx index ff39fae33f..055afb0f8b 100644 --- a/src/routes/user/userprofiles.tsx +++ b/src/routes/user/userprofiles.tsx @@ -1,5 +1,5 @@ import type { UserDto } from '@jellyfin/sdk/lib/generated-client'; -import React, {FunctionComponent, useEffect, useState, useRef} from 'react'; +import React, { FunctionComponent, useEffect, useState, useRef } from 'react'; import Dashboard from '../../utils/dashboard'; import globalize from '../../scripts/globalize'; import loading from '../../components/loading/loading'; @@ -75,7 +75,7 @@ const UserProfiles: FunctionComponent = () => { icon: 'delete' }); - import('../../components/actionSheet/actionSheet').then(({default: actionsheet}) => { + import('../../components/actionSheet/actionSheet').then(({ default: actionsheet }) => { actionsheet.show({ items: menuItems, positionTo: card, diff --git a/src/scripts/browser.js b/src/scripts/browser.js index a6042189dc..7540d0c684 100644 --- a/src/scripts/browser.js +++ b/src/scripts/browser.js @@ -187,25 +187,25 @@ function supportsCssAnimation(allowPrefix) { const uaMatch = function (ua) { ua = ua.toLowerCase(); - const match = /(edg)[ /]([\w.]+)/.exec(ua) || - /(edga)[ /]([\w.]+)/.exec(ua) || - /(edgios)[ /]([\w.]+)/.exec(ua) || - /(edge)[ /]([\w.]+)/.exec(ua) || - /(opera)[ /]([\w.]+)/.exec(ua) || - /(opr)[ /]([\w.]+)/.exec(ua) || - /(chrome)[ /]([\w.]+)/.exec(ua) || - /(safari)[ /]([\w.]+)/.exec(ua) || - /(firefox)[ /]([\w.]+)/.exec(ua) || - ua.indexOf('compatible') < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; + const match = /(edg)[ /]([\w.]+)/.exec(ua) + || /(edga)[ /]([\w.]+)/.exec(ua) + || /(edgios)[ /]([\w.]+)/.exec(ua) + || /(edge)[ /]([\w.]+)/.exec(ua) + || /(opera)[ /]([\w.]+)/.exec(ua) + || /(opr)[ /]([\w.]+)/.exec(ua) + || /(chrome)[ /]([\w.]+)/.exec(ua) + || /(safari)[ /]([\w.]+)/.exec(ua) + || /(firefox)[ /]([\w.]+)/.exec(ua) + || ua.indexOf('compatible') < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) + || []; const versionMatch = /(version)[ /]([\w.]+)/.exec(ua); - let platform_match = /(ipad)/.exec(ua) || - /(iphone)/.exec(ua) || - /(windows)/.exec(ua) || - /(android)/.exec(ua) || - []; + let platform_match = /(ipad)/.exec(ua) + || /(iphone)/.exec(ua) + || /(windows)/.exec(ua) + || /(android)/.exec(ua) + || []; let browser = match[1] || ''; diff --git a/src/scripts/browserDeviceProfile.js b/src/scripts/browserDeviceProfile.js index a98f72e612..e5943d69bb 100644 --- a/src/scripts/browserDeviceProfile.js +++ b/src/scripts/browserDeviceProfile.js @@ -17,11 +17,11 @@ import browser from './browser'; } // hevc main level 4.0 - return !!videoTestElement.canPlayType && - (videoTestElement.canPlayType('video/mp4; codecs="hvc1.1.L120"').replace(/no/, '') || - videoTestElement.canPlayType('video/mp4; codecs="hev1.1.L120"').replace(/no/, '') || - videoTestElement.canPlayType('video/mp4; codecs="hvc1.1.0.L120"').replace(/no/, '') || - videoTestElement.canPlayType('video/mp4; codecs="hev1.1.0.L120"').replace(/no/, '')); + return !!videoTestElement.canPlayType + && (videoTestElement.canPlayType('video/mp4; codecs="hvc1.1.L120"').replace(/no/, '') + || videoTestElement.canPlayType('video/mp4; codecs="hev1.1.L120"').replace(/no/, '') + || videoTestElement.canPlayType('video/mp4; codecs="hvc1.1.0.L120"').replace(/no/, '') + || videoTestElement.canPlayType('video/mp4; codecs="hev1.1.0.L120"').replace(/no/, '')); } let _supportsTextTracks; @@ -53,8 +53,8 @@ import browser from './browser'; } const media = document.createElement('video'); - return !!(media.canPlayType('application/x-mpegURL').replace(/no/, '') || - media.canPlayType('application/vnd.apple.mpegURL').replace(/no/, '')); + return !!(media.canPlayType('application/x-mpegURL').replace(/no/, '') + || media.canPlayType('application/vnd.apple.mpegURL').replace(/no/, '')); } function canPlayHlsWithMSE() { @@ -96,8 +96,8 @@ import browser from './browser'; } if (videoTestElement.canPlayType) { - return videoTestElement.canPlayType('application/x-mpegurl; codecs="avc1.42E01E, ac-3"').replace(/no/, '') || - videoTestElement.canPlayType('application/vnd.apple.mpegURL; codecs="avc1.42E01E, ac-3"').replace(/no/, ''); + return videoTestElement.canPlayType('application/x-mpegurl; codecs="avc1.42E01E, ac-3"').replace(/no/, '') + || videoTestElement.canPlayType('application/vnd.apple.mpegURL; codecs="avc1.42E01E, ac-3"').replace(/no/, ''); } return false; @@ -146,8 +146,8 @@ import browser from './browser'; return true; } - if (videoTestElement.canPlayType('video/x-matroska').replace(/no/, '') || - videoTestElement.canPlayType('video/mkv').replace(/no/, '')) { + if (videoTestElement.canPlayType('video/x-matroska').replace(/no/, '') + || videoTestElement.canPlayType('video/mkv').replace(/no/, '')) { return true; } @@ -815,19 +815,19 @@ export function canPlaySecondaryAudio(videoTestElement) { let maxH264Level = 42; let h264Profiles = 'high|main|baseline|constrained baseline'; - if (browser.tizen || browser.web0s || - videoTestElement.canPlayType('video/mp4; codecs="avc1.640833"').replace(/no/, '')) { + if (browser.tizen || browser.web0s + || videoTestElement.canPlayType('video/mp4; codecs="avc1.640833"').replace(/no/, '')) { maxH264Level = 51; } // Support H264 Level 52 (Tizen 5.0) - app only - if ((browser.tizenVersion >= 5 && window.NativeShell) || - videoTestElement.canPlayType('video/mp4; codecs="avc1.640834"').replace(/no/, '')) { + if ((browser.tizenVersion >= 5 && window.NativeShell) + || videoTestElement.canPlayType('video/mp4; codecs="avc1.640834"').replace(/no/, '')) { maxH264Level = 52; } - if ((browser.tizen || - videoTestElement.canPlayType('video/mp4; codecs="avc1.6e0033"').replace(/no/, '')) + if ((browser.tizen + || videoTestElement.canPlayType('video/mp4; codecs="avc1.6e0033"').replace(/no/, '')) // These tests are passing in safari, but playback is failing && !browser.safari && !browser.iOS && !browser.web0s && !browser.edge && !browser.mobile ) { @@ -838,28 +838,28 @@ export function canPlaySecondaryAudio(videoTestElement) { let hevcProfiles = 'main'; // hevc main level 4.1 - if (videoTestElement.canPlayType('video/mp4; codecs="hvc1.1.4.L123"').replace(/no/, '') || - videoTestElement.canPlayType('video/mp4; codecs="hev1.1.4.L123"').replace(/no/, '')) { + if (videoTestElement.canPlayType('video/mp4; codecs="hvc1.1.4.L123"').replace(/no/, '') + || videoTestElement.canPlayType('video/mp4; codecs="hev1.1.4.L123"').replace(/no/, '')) { maxHevcLevel = 123; } // hevc main10 level 4.1 - if (videoTestElement.canPlayType('video/mp4; codecs="hvc1.2.4.L123"').replace(/no/, '') || - videoTestElement.canPlayType('video/mp4; codecs="hev1.2.4.L123"').replace(/no/, '')) { + if (videoTestElement.canPlayType('video/mp4; codecs="hvc1.2.4.L123"').replace(/no/, '') + || videoTestElement.canPlayType('video/mp4; codecs="hev1.2.4.L123"').replace(/no/, '')) { maxHevcLevel = 123; hevcProfiles = 'main|main 10'; } // hevc main10 level 5.1 - if (videoTestElement.canPlayType('video/mp4; codecs="hvc1.2.4.L153"').replace(/no/, '') || - videoTestElement.canPlayType('video/mp4; codecs="hev1.2.4.L153"').replace(/no/, '')) { + if (videoTestElement.canPlayType('video/mp4; codecs="hvc1.2.4.L153"').replace(/no/, '') + || videoTestElement.canPlayType('video/mp4; codecs="hev1.2.4.L153"').replace(/no/, '')) { maxHevcLevel = 153; hevcProfiles = 'main|main 10'; } // hevc main10 level 6.1 - if (videoTestElement.canPlayType('video/mp4; codecs="hvc1.2.4.L183"').replace(/no/, '') || - videoTestElement.canPlayType('video/mp4; codecs="hev1.2.4.L183"').replace(/no/, '')) { + if (videoTestElement.canPlayType('video/mp4; codecs="hvc1.2.4.L183"').replace(/no/, '') + || videoTestElement.canPlayType('video/mp4; codecs="hev1.2.4.L183"').replace(/no/, '')) { maxHevcLevel = 183; hevcProfiles = 'main|main 10'; } diff --git a/src/scripts/libraryBrowser.js b/src/scripts/libraryBrowser.js index 0a44aaad36..ce4f6410a1 100644 --- a/src/scripts/libraryBrowser.js +++ b/src/scripts/libraryBrowser.js @@ -55,7 +55,7 @@ export function showLayoutMenu (button, currentLayout, views) { }; }); - import('../components/actionSheet/actionSheet').then(({default: actionsheet}) => { + import('../components/actionSheet/actionSheet').then(({ default: actionsheet }) => { actionsheet.show({ items: menuItems, positionTo: button, @@ -122,7 +122,7 @@ export function showSortMenu (options) { Promise.all([ import('../components/dialogHelper/dialogHelper'), import('../elements/emby-radio/emby-radio') - ]).then(([{default: dialogHelper}]) => { + ]).then(([{ default: dialogHelper }]) => { function onSortByChange() { const newValue = this.value; diff --git a/src/scripts/playlists.js b/src/scripts/playlists.js index 8965676e46..eb3fac9ece 100644 --- a/src/scripts/playlists.js +++ b/src/scripts/playlists.js @@ -189,7 +189,7 @@ export default function (view) { reloadItems(); }); view.querySelector('.btnNewPlaylist').addEventListener('click', function () { - import('../components/playlisteditor/playlisteditor').then(({default: playlistEditor}) => { + import('../components/playlisteditor/playlisteditor').then(({ default: playlistEditor }) => { const serverId = ApiClient.serverInfo().Id; new playlistEditor({ items: [], diff --git a/src/scripts/serverNotifications.js b/src/scripts/serverNotifications.js index de8c0c483c..7863cafe46 100644 --- a/src/scripts/serverNotifications.js +++ b/src/scripts/serverNotifications.js @@ -1,5 +1,5 @@ import { playbackManager } from '../components/playback/playbackmanager'; -import SyncPlay from '../plugins/syncPlay/core'; +import { pluginManager } from '../components/pluginManager'; import inputManager from '../scripts/inputManager'; import focusManager from '../components/focusManager'; import { appRouter } from '../components/appRouter'; @@ -7,6 +7,7 @@ import ServerConnections from '../components/ServerConnections'; import toast from '../components/toast/toast'; import alert from '../components/alert'; import Events from '../utils/events.ts'; +import { PluginType } from '../types/plugin.ts'; const serverNotifications = {}; @@ -140,6 +141,8 @@ function processGeneralCommand(cmd, apiClient) { function onMessageReceived(e, msg) { const apiClient = this; + const SyncPlay = pluginManager.firstOfType(PluginType.SyncPlay)?.instance; + if (msg.MessageType === 'Play') { notifyApp(); const serverId = apiClient.serverInfo().Id; @@ -186,9 +189,9 @@ function onMessageReceived(e, msg) { } } } else if (msg.MessageType === 'SyncPlayCommand') { - SyncPlay.Manager.processCommand(msg.Data, apiClient); + SyncPlay?.Manager.processCommand(msg.Data, apiClient); } else if (msg.MessageType === 'SyncPlayGroupUpdate') { - SyncPlay.Manager.processGroupUpdate(msg.Data, apiClient); + SyncPlay?.Manager.processGroupUpdate(msg.Data, apiClient); } else { Events.trigger(serverNotifications, msg.MessageType, [apiClient, msg.Data]); } diff --git a/src/scripts/settings/webSettings.js b/src/scripts/settings/webSettings.js index 517b7fe0e2..afec7eafac 100644 --- a/src/scripts/settings/webSettings.js +++ b/src/scripts/settings/webSettings.js @@ -23,7 +23,7 @@ async function fetchLocal(url, options) { } /* eslint-disable-next-line compat/compat */ - resolve(new Response(xhr.responseText, {status: status})); + resolve(new Response(xhr.responseText, { status: status })); }; xhr.onerror = () => { diff --git a/src/strings/bn.json b/src/strings/bn.json new file mode 100644 index 0000000000..bcd4de5a35 --- /dev/null +++ b/src/strings/bn.json @@ -0,0 +1,19 @@ +{ + "Favorites": "পছন্দসমূহ", + "Albums": "অ্যালবামসমূহ", + "Artists": "শিল্পীগণ", + "Books": "পুস্তকসমূহ", + "Channels": "চ্যানেলসমূহ", + "Collections": "সংগ্রহশালা", + "Folders": "ফোল্ডারসমূহ", + "Genres": "শৈলীধারাসমূহ", + "HeaderAlbumArtists": "অ্যালবাম শিল্পীবৃন্দ", + "HeaderContinueWatching": "দেখতে থাকুন", + "Movies": "চলচ্চিত্রসমূহ", + "MusicVideos": "সঙ্গীত ভিডিয়ো সমূহ", + "Photos": "চিত্রসমূহ", + "Playlists": "প্লে লিস্ট সমূহ", + "Songs": "সঙ্গীতসমূহ", + "Sync": "সমলয় স্থাপন", + "ValueSpecialEpisodeName": "বিশেষ পর্ব - {0}" +} diff --git a/src/strings/ca.json b/src/strings/ca.json index c557841b1e..cdb48331d5 100644 --- a/src/strings/ca.json +++ b/src/strings/ca.json @@ -14,10 +14,10 @@ "AspectRatio": "Relació d'aspecte", "Audio": "Àudio", "MessageBrowsePluginCatalog": "Consulteu el nostre catàleg per veure els complements disponibles.", - "ButtonAddMediaLibrary": "Afegir Biblioteca Multimèdia", + "ButtonAddMediaLibrary": "Afegir biblioteca de mitjans", "ButtonAddScheduledTaskTrigger": "Afegir Disparador", "ButtonAddServer": "Afegeix Servidor", - "ButtonAddUser": "Afegir Usuari", + "ButtonAddUser": "Afegir usuari", "ButtonArrowLeft": "Esquerra", "ButtonArrowRight": "Dreta", "ButtonBack": "Darrera", @@ -38,7 +38,7 @@ "ButtonQuickStartGuide": "Guia d'inici ràpid", "ButtonRefreshGuideData": "Actualitza les dades de la guia", "ButtonRemove": "Elimina", - "ButtonResetEasyPassword": "Reinicia el codi PIN senzill", + "ButtonResetEasyPassword": "Restabliu el codi Easy PIN", "ButtonResume": "Reprèn", "ButtonSelectDirectory": "Selecciona el directori", "ButtonSend": "Envia", @@ -61,7 +61,7 @@ "DeleteImage": "Esborra Imatge", "DeleteImageConfirmation": "Esteu segur que voleu suprimir aquesta imatge?", "DeleteMedia": "Esborra", - "DeleteUser": "Esborra Usuari", + "DeleteUser": "Esborrar usuari", "Desktop": "Escriptori", "DeviceAccessHelp": "Això només s'aplica a dispositius que poden ser identificats i no previndrà l'accés des del navegador. Filtrant l'accés de dispositius a l'usuari previndrà l'ús de nous dispositius fins que hagin estat aprovats aquí.", "Disconnect": "Desconnecta", @@ -233,7 +233,7 @@ "LabelDay": "Dia de la setmana:", "LabelDeathDate": "Data de defunció:", "LabelDefaultUser": "Usuari per defecte:", - "LabelDefaultUserHelp": "Determinar quina biblioteca d'usuari s'hauria de mostrar als dispositius connectats. Es pot anul·lar per a cada dispositiu emprant perfils.", + "LabelDefaultUserHelp": "Determina quina biblioteca d'usuari s'hauria de mostrar als dispositius connectats. Es pot anul·lar per a cada dispositiu emprant perfils.", "LabelDeviceDescription": "Descripció del dispositiu:", "LabelDiscNumber": "Disc:", "LabelDisplayLanguage": "Idioma de visualització:", @@ -300,7 +300,7 @@ "LabelModelDescription": "Descripció del model:", "LabelModelName": "Nom del model:", "LabelModelNumber": "Nombre de model:", - "LabelMonitorUsers": "Supervisar activitat de:", + "LabelMonitorUsers": "Supervisar l'activitat de:", "LabelMovieRecordingPath": "Directori de gravació de pel·lícules:", "LabelName": "Nom:", "LabelNewName": "Nou nom:", @@ -371,7 +371,7 @@ "Live": "Directe", "MarkPlayed": "Marca com a reproduït", "MarkUnplayed": "Marca com a no reproduït", - "MaxParentalRatingHelp": "El contingut amb una valoració superior no serà mostrat a l'usuari.", + "MaxParentalRatingHelp": "El contingut amb una classificació superior no serà mostrat a l'usuari.", "MediaInfoAspectRatio": "Relació d'aspecte", "MediaInfoChannels": "Canals", "MediaInfoDefault": "Per defecte", @@ -402,7 +402,7 @@ "Mobile": "Mòbil", "Monday": "Dilluns", "MoreFromValue": "Més de {0}", - "MoreUsersCanBeAddedLater": "Podeu afegir més usuaris des del tauler de control després.", + "MoreUsersCanBeAddedLater": "Es poden afegir més usuaris des del Tauler de control.", "MoveLeft": "Moure a l'esquerra", "MoveRight": "Moure a la dreta", "Mute": "Silencia", @@ -431,7 +431,7 @@ "OptionAllowRemoteControlOthers": "Permetre el control remot d'altres usuaris", "OptionAllowRemoteSharedDevices": "Permetre el control remot dels dispositius compartits", "OptionAllowRemoteSharedDevicesHelp": "Els dispositius DLNA es consideren compartits fins que un usuari comença a controlar-los.", - "OptionAllowUserToManageServer": "Permet aquest usuari gestionar el servidor", + "OptionAllowUserToManageServer": "Permet a aquest usuari gestionar el servidor", "OptionCommunityRating": "Valoració de la Comunitat", "OptionCriticRating": "Valoració dels Crítics", "OptionDaily": "Diari", @@ -439,7 +439,7 @@ "OptionDateAddedImportTime": "Empra la data d'escaneig", "OptionDatePlayed": "Data de Reproducció", "OptionDisableUser": "Desactiva aquest usuari", - "OptionDisableUserHelp": "El servidor no permetrà cap connexió d’aquest usuari. Les connexions existents es tancaran bruscament.", + "OptionDisableUserHelp": "El servidor no permetrà cap connexió d’aquest usuari. Les connexions existents es tancaran immediatament.", "OptionDislikes": "No m'agrada", "OptionEmbedSubtitles": "Incrusta dins el contenidor", "OptionEnableAccessFromAllDevices": "Habilita l'accés des de tots els dispositius", @@ -647,7 +647,7 @@ "BoxRear": "Caixa (posterior)", "BoxSet": "Col·leció", "Box": "Caixa", - "BookLibraryHelp": "L'àudio i els llibres de text són compatibles. Reviseu la {0} guia de denominació de llibres {1}.", + "BookLibraryHelp": "Els audiollibres i els llibres son compatibles. Reviseu la {0} guia de denominació de llibres {1}.", "Backdrops": "Fons", "Backdrop": "Fons", "Artist": "Artista", @@ -663,14 +663,14 @@ "CopyStreamURL": "Copia l'URL de reproducció", "ContinueWatching": "Continuar mirant", "ConfirmEndPlayerSession": "Vols tancar Jellyfin a {0}?", - "ConfirmDeleteItems": "L'esborrat d'aquests elements els eliminarà del sistema de fitxers i de la biblioteca multimèdia. Estàs segur que vols continuar?", - "ConfirmDeleteItem": "L'esborrat d'aquest element l'eliminarà del sistema de fitxers i de la biblioteca multimèdia. Estàs segur que vols continuar?", + "ConfirmDeleteItems": "L'esborrat d'aquests elements els eliminarà del sistema de fitxers i de la biblioteca de mitjans. Esteu segurs que voleu continuar?", + "ConfirmDeleteItem": "L'esborrat d'aquest element l'eliminarà del sistema de fitxers i de la biblioteca multimèdia. Esteu segurs que voleu continuar?", "ConfigureDateAdded": "Configureu com es determinen les metadades de la \"Data d'afegit\" al Tauler > Biblioteques > Configuració de l'NFO", "CommunityRating": "Ràting comunitari", "ColorTransfer": "Transferència de color", "ColorSpace": "Espai de color", "ColorPrimaries": "Colors primaris", - "DefaultMetadataLangaugeDescription": "Aquests són els teus valors per defecte i poden ser personalitats per cada biblioteca.", + "DefaultMetadataLangaugeDescription": "Aquests son els vostres valors per defecte i poden ser personalitzats per a cada biblioteca.", "Default": "Per defecte", "DatePlayed": "Data reproduït", "DateAdded": "Data d'addició", @@ -716,7 +716,7 @@ "EnableBackdropsHelp": "Mostra imatges al fons d'algunes pàgines mentre navegueu per la biblioteca.", "EnableAutoCast": "Establir com a defecte", "EditMetadata": "Edita les metadades", - "EasyPasswordHelp": "El vostre codi PIN fàcil s'utilitza per accedir fora de línia als clients compatibles i també es pot utilitzar per iniciar la sessió a la xarxa fàcilment.", + "EasyPasswordHelp": "El vostre codi Easy PIN s'utilitza per accedir fora de línia als clients compatibles i també es pot utilitzar per iniciar la sessió a la xarxa fàcilment.", "DrmChannelsNotImported": "Els canals amb DRM no s’importaran.", "DownloadsValue": "{0} descàrregues", "DisplayMissingEpisodesWithinSeasonsHelp": "Això també s'ha d'activar per a les biblioteques de TV a la configuració del servidor.", @@ -731,7 +731,7 @@ "DirectPlaying": "Reproducció directe", "DetectingDevices": "Detectant dispositius", "Descending": "Descendent", - "DeleteUserConfirmation": "Esteu segur que voleu eliminar aquest usuari?", + "DeleteUserConfirmation": "Esteu segurs que voleu eliminar aquest usuari?", "DeleteDeviceConfirmation": "Esteu segurs que voleu suprimir aquest dispositiu? Tornarà a aparèixer la propera vegada que un usuari iniciï la sessió amb ell.", "Data": "Dades", "ButtonUseQuickConnect": "Utilitzar Quick Connect", @@ -770,7 +770,7 @@ "EnablePlugin": "Activar", "DirectStreamHelp1": "El flux de vídeo és compatible amb el dispositiu, però té un format d'àudio incompatible (DTS, Dolby TrueHD, etc.) o un nombre de canals d'àudio. El flux de vídeo es tornarà a empaquetar sense pèrdues sobre la marxa abans d'enviar-lo al dispositiu. Només es transcodificarà el flux d'àudio.", "DirectPlayHelp": "El fitxer font és totalment compatible amb aquest client i la sessió rep el fitxer sense modificacions.", - "DeleteDevicesConfirmation": "Esteu segurs que voleu suprimir tots els dispositius? Es tancarà la sessió de la resta de sessions. Els dispositius tornaran a aparèixer la pròxima vegada que un usuari iniciï la sessió.", + "DeleteDevicesConfirmation": "Esteu segurs que voleu suprimir tots els dispositius? Es tancaran la sessió de la resta de sessions. Els dispositius tornaran a aparèixer la pròxima vegada que un usuari iniciï la sessió.", "DeleteAll": "Eliminar tots", "DeinterlaceMethodHelp": "Seleccioneu el mètode de desentrellaçat que voleu utilitzar quan transcodifiqueu el programari de contingut entrellaçat. Quan està activada l'acceleració de maquinari que admet el desentrellaçat de maquinari, s'utilitzarà el desentrellaçador de maquinari en lloc d'aquesta configuració.", "HeaderDirectPlayProfileHelp": "Afegiu perfils de reproducció directa per indicar quins formats pot gestionar el dispositiu de forma nativa.", @@ -922,7 +922,7 @@ "TabLogs": "Registres", "SystemDlnaProfilesHelp": "Perfils de el sistema són de només lectura. Els canvis en un perfil de sistema seran emmagatzemades a un nou perfil personalitzat.", "SyncPlayGroupDefaultTitle": "Grup {0}'s", - "SyncPlayAccessHelp": "La funció SyncPlay permet sincronitzar la reproducció amb altres dispositius. Seleccioneu el nivell d'accés que té aquest usuari a SyncPlay.", + "SyncPlayAccessHelp": "La funció SyncPlay permet sincronitzar la reproducció amb altres dispositius. Seleccioneu el nivell d'accés a SyncPlay que té aquest usuari.", "SubtitleVerticalPositionHelp": "Número de línia on apareix el text. Els nombres positius indiquen dalt a baix. Els nombres negatius indiquen dalt a baix.", "SubtitleOffset": "Subtítol Offset", "SubtitleDownloadersHelp": "Activa i classificar les seves descarregadors de subtítols preferits en ordre de prioritat.", @@ -989,7 +989,7 @@ "MessageUnableToConnectToServer": "No es pot connectar amb el servidor seleccionat en aquest moment. Assegureu-vos que està funcionant i torni a intentar-ho.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Les ubicacions següents mitjans de comunicació seran eliminats de la biblioteca:", "MessageSyncPlayUserLeft": "{0} ha deixat el grup.", - "MessageSyncPlayUserJoined": "{0} s'ha unit a el grup.", + "MessageSyncPlayUserJoined": "{0} s'ha unit al grup.", "MessageSyncPlayPlaybackPermissionRequired": "Permís de reproducció requerit.", "MessageSyncPlayNoGroupsAvailable": "No hi ha grups disponibles. Comença a jugar alguna cosa primer.", "MessageSyncPlayLibraryAccessDenied": "L'accés a aquest contingut està restringit.", @@ -1012,13 +1012,13 @@ "MessagePluginConfigurationRequiresLocalAccess": "Connecteu-vos amb el servidor local directament per configurar aquest complement.", "MessagePleaseWait": "Si us plau, espereu. Això pot trigar un minut.", "MessagePlayAccessRestricted": "La reproducció d'aquest contingut està restringit actualment. Poseu-vos en contacte amb l'administrador de servidor per obtenir més informació.", - "MessagePasswordResetForUsers": "Els següents usuaris han tingut restablir les seves contrasenyes. Ara poden accedir als codis PIN que es van utilitzar per realitzar el restabliment.", + "MessagePasswordResetForUsers": "S'han restablert contrasenyes dels següents usuaris. Ara poden accedir amb codis Easy PIN que van utilitzar per realitzar el restabliment.", "MessageNoServersAvailable": "No hi ha servidors han estat trobats usant el descobriment automàtic de servidor.", "MessageNoRepositories": "No hi ha repositoris.", "MessageNoGenresAvailable": "Permetre alguns proveïdors de metadades per tirar dels gèneres a través d'Internet.", "MessageNoCollectionsAvailable": "Les col·leccions us permeten gaudir d'agrupacions personalitzades de pel·lícules, sèries i àlbums. Feu clic al botó '+' per començar a crear col·leccions.", "MessageLeaveEmptyToInherit": "Deixar en blanc per Heretar configuració d'un element principal o el valor predeterminat global.", - "MessageInvalidUser": "Nom d'usuari o contrasenya incorrectes. Torni-ho a provar.", + "MessageInvalidUser": "Nom d'usuari o contrasenya incorrectes. Torneu-ho a provar.", "MessageInvalidForgotPasswordPin": "S'ha introduït un codi PIN no vàlid o caducat. Torni-ho a provar.", "MessageImageTypeNotSelected": "Seleccioneu un tipus d'imatge al menú desplegable.", "MessageImageFileTypeAllowed": "Només els arxius JPEG i PNG són compatibles.", @@ -1026,7 +1026,7 @@ "MessageForgotPasswordInNetworkRequired": "Torneu a iniciar el procés de restabliment de contrasenya des de dins de la seva xarxa domèstica.", "MessageForgotPasswordFileCreated": "El següent arxiu s'ha creat en el seu servidor i conté instruccions sobre com procedir:", "MessageFileReadError": "Hi ha hagut un error a llegint l'arxiu. Torni-ho a provar.", - "MessageDirectoryPickerLinuxInstruction": "Per a Linux amb Arch Linux, CentOS, Debian, Fedora, openSUSE, o Ubuntu, ha de concedir a l'usuari del servei al menys l'accés de lectura als llocs d'emmagatzematge.", + "MessageDirectoryPickerLinuxInstruction": "Per a Linux amb Arch Linux, CentOS, Debian, Fedora, openSUSE, o Ubuntu, ha de concedir a l'usuari del servei com a mínim l'accés de lectura als llocs d'emmagatzematge.", "MessageDirectoryPickerBSDInstruction": "Per BSD, pot ser que hagi de configurar l'emmagatzematge dins del seu presó FreeNAS pel Jellyfin pot accedir als mitjans de comunicació.", "MessageDeleteTaskTrigger": "Esteu segur que voleu eliminar aquest disparador tasca?", "MessageCreateAccountAt": "Crear un compte a {0}", @@ -1090,9 +1090,9 @@ "LabelVaapiDeviceHelp": "Aquest és el \"render node\" que s'utilitza per a l'acceleració de maquinari.", "LabelVaapiDevice": "Dispositiu VA-API:", "LabelUserRemoteClientBitrateLimitHelp": "Substituir el valor global predeterminat establert a la configuració del servidor, vegeu Tauler de control > Reproducció > Streaming.", - "LabelUserMaxActiveSessions": "nombre màxim de sessions simultànies d'usuaris:", - "LabelUserLoginAttemptsBeforeLockout": "Intents de connexió fallits abans que l'usuari està bloquejat:", - "LabelUserLibraryHelp": "Seleccioneu el qual la biblioteca d'usuaris per visualitzar al dispositiu. Deixar en blanc per heretar la configuració predeterminada.", + "LabelUserMaxActiveSessions": "Nombre màxim de sessions simultànies d'usuaris:", + "LabelUserLoginAttemptsBeforeLockout": "Intents de connexió fallits abans que l'usuari sigui bloquejat:", + "LabelUserLibraryHelp": "Seleccioneu quina biblioteca d'usuari es visualitza al dispositiu. Deixeu-ho en blanc per heretar la configuració predeterminada.", "LabelUserAgent": "Agent d'usuari:", "LabelUnstable": "Inestable", "LabelUDPPortRangeHelp": "Restringir Jellyfin utilitzar aquest rang de ports a fer les connexions UDP. (Per defecte és 1024-65535) Nota
: Certes funcions requereixen ports que poden estar fora d'aquest rang fix ..", @@ -1135,7 +1135,7 @@ "LabelSyncPlayLeaveGroup": "Marxar del grup", "LabelSyncPlayHaltPlaybackDescription": "I ignorar les actualitzacions de llista de reproducció actual", "LabelSyncPlayHaltPlayback": "Aturar la reproducció local", - "LabelSyncPlayAccessNone": "Desactivat per aquest usuari", + "LabelSyncPlayAccessNone": "Desactivat per a aquest usuari", "LabelSyncPlayAccessJoinGroups": "Permetre als usuaris a unir-se als grups", "LabelSyncPlayAccessCreateAndJoinGroups": "Permetre a l'usuari crear i unir-se a grups", "LabelSyncPlayAccess": "Accés SyncPlay:", @@ -1237,8 +1237,8 @@ "LabelLibraryPageSizeHelp": "Estableix la quantitat d'elements a mostrar en una pàgina de la biblioteca. Es posa a 0 per tal de desactivar la paginació.", "LabelLibraryPageSize": "Mida de pàgina de la biblioteca:", "LabelLanNetworks": "Xarxes LAN:", - "LabelKodiMetadataUserHelp": "Guardar dades de visionat als arxius NFO de manera que altres aplicacions les puguin utilitzar.", - "LabelKodiMetadataUser": "Guardar les dades de vigilància d'usuari a arxius NFO per:", + "LabelKodiMetadataUserHelp": "Guarda les dades de visionat en arxius NFO de manera que altres aplicacions les puguin utilitzar.", + "LabelKodiMetadataUser": "Guardar les dades de visualització d'usuari en arxius NFO per a:", "LabelKodiMetadataSaveImagePathsHelp": "Això es recomana si vostè té els noms d'arxiu d'imatge que no s'ajusten a les directrius de Kodi.", "LabelKodiMetadataEnableExtraThumbsHelp": "Quan es descarreguin imatges, es poden guardar tant a \"extrafanart\" i \"extrathumbs\" per assegurar la màxima compatibilitat amb els skins del Kodi.", "LabelKodiMetadataEnableExtraThumbs": "Còpia extrafanart a el camp extrathumbs", @@ -1262,7 +1262,7 @@ "LabelH265Crf": "H.265 codifica CRF:", "LabelH264Crf": "H.264 codifica CRF:", "LabelFormat": "Format:", - "LabelForgotPasswordUsernameHelp": "Introdueix el nom d'usuari, si ho recordi.", + "LabelForgotPasswordUsernameHelp": "Introduïu el nom d'usuari, si el recordeu.", "LabelFont": "Font:", "LabelFolder": "Carpeta:", "LabelFileOrUrl": "Arxiu o URL:", @@ -1453,7 +1453,7 @@ "OptionMaxActiveSessionsHelp": "Un valor de 0 desactivarà la funció.", "OptionMaxActiveSessions": "Establir el nombre màxim de sessions simultànies d'usuaris.", "OptionMax": "Max", - "OptionLoginAttemptsBeforeLockoutHelp": "Un valor de 0 significa que hereten el valor per defecte de 3 intents per a usuaris normals i 5 pels administradors. Establir a -1 desactiva la funció.", + "OptionLoginAttemptsBeforeLockoutHelp": "Un valor de 0 significa que s'hereten els valors per defecte: 3 intents per als usuaris normals i 5 per als administradors. Establir a -1 desactiva la funció.", "OptionLoginAttemptsBeforeLockout": "Determina el nombre d'intents d'inici de sessió incorrectes que es poden fer abans que es bloquegi.", "OptionIsSD": "SD", "OptionIsHD": "HD", @@ -1480,7 +1480,7 @@ "OptionAllowVideoPlaybackRemuxing": "Permet la reproducció de vídeo que requereix una conversió sense recodificació", "OptionAllowSyncTranscoding": "Permet la descàrrega i la sincronització dels mitjans que requereixen transcodificació", "OptionAllowMediaPlaybackTranscodingHelp": "La restricció de l'accés a la transcodificació pot provocar errors de reproducció en els clients a causa dels formats de mitjans compatibles.", - "OptionAllowContentDownloadHelp": "Els usuaris poden descarregar els mitjans de comunicació i emmagatzemar-la en els seus dispositius. Això no és el mateix que una funció de sincronització. biblioteques de llibres requereixen aquesta habilitat per funcionar.", + "OptionAllowContentDownloadHelp": "Els usuaris poden descarregar els mitjans i emmagatzemar-los als seus dispositius. Això no és el mateix que una funció de sincronització. Les biblioteques de llibres ho requereixen per funcionar.", "OptionAllowContentDownload": "Permetre la descàrrega dels mitjans", "OptionAllowAudioPlaybackTranscoding": "Permet la reproducció d'àudio que requereix la transcodificació", "Option3D": "3D", @@ -1715,5 +1715,6 @@ "SubtitleRed": "Vermell", "SubtitleYellow": "Groc", "StereoDownmixAlgorithmHelp": "Algoritme utilitzat per barrejar àudio multicanal a estèreo.", - "DownloadAll": "Descarrega-ho tot" + "DownloadAll": "Descarrega-ho tot", + "LabelEnableAudioVbr": "Activar la codificació d'àudio VBR" } diff --git a/src/strings/cs.json b/src/strings/cs.json index 56bd791cae..5da9ed77aa 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -1719,5 +1719,7 @@ "Short": "Krátký film", "HeaderPerformance": "Výkon", "LabelParallelImageEncodingLimit": "Počet paralelních kódování obrázků", - "LabelParallelImageEncodingLimitHelp": "Maximální počet kódování obrázků, které mohou běžet zároveň. Nastavením na 0 bude limit nastaven dle parametrů systému." + "LabelParallelImageEncodingLimitHelp": "Maximální počet kódování obrázků, které mohou běžet zároveň. Nastavením na 0 bude limit nastaven dle parametrů systému.", + "LabelEnableAudioVbr": "Povolit kódování zvuku VBR", + "LabelEnableAudioVbrHelp": "Proměnlivý bitový tok (VBR) nabízí lepší poměr mezi kvalitou a průměrným bitovým tokem, ale někdy může způsobit dodatečné načítání či problémy s kompatibilitou." } diff --git a/src/strings/da.json b/src/strings/da.json index 66a8347df7..25bc969da8 100644 --- a/src/strings/da.json +++ b/src/strings/da.json @@ -80,8 +80,8 @@ "Composer": "Komponist", "ConfigureDateAdded": "Konfigurer hvordan metadata for 'tilføjet' dato bestemmes, under Kontrolpanel > Biblioteker > NFO indstillinger", "ConfirmDeleteImage": "Slet billede?", - "ConfirmDeleteItem": "Hvis dette element slettes, fjernes det både fra dit filsystem samt din mediebibliotek. Er du sikker på du ønsker at fortsætte?", - "ConfirmDeleteItems": "Sletning af disse emner vil både fjerne dem fra filsystemet og dit mediebibliotek. Er du sikker på at du vil fortsætte?", + "ConfirmDeleteItem": "Hvis dette element slettes, fjernes det fra både dit filsystem og dit mediebibliotek. Er du sikker på at fortsætte?", + "ConfirmDeleteItems": "Sletning af disse emner vil fjerne dem fra både filsystemet og dit mediebibliotek. Er du sikker på at du vil fortsætte?", "ConfirmDeletion": "Bekræft sletning", "Connect": "Forbind", "Continuing": "Forsættes", @@ -136,7 +136,7 @@ "FileReadError": "Der opstod en fejl i forsøget på at læse filen.", "Friday": "Fredag", "Fullscreen": "Fuldskærm", - "General": "Generel", + "General": "Generelt", "Genres": "Genrer", "GroupVersions": "Grupér versioner", "GuestStar": "Gæsteskuespiller", @@ -272,7 +272,7 @@ "HeaderSendMessage": "Send besked", "HeaderSeriesOptions": "Serieindstillinger", "HeaderServerSettings": "Serverindstillinger", - "HeaderSetupLibrary": "Opsæt dine mediebiblioteker", + "HeaderSetupLibrary": "Konfigurer dine mediebiblioteker", "HeaderSortBy": "Sorter Efter", "HeaderSortOrder": "Sorteringsorden", "HeaderSpecialEpisodeInfo": "Information om specialepisoder", @@ -404,7 +404,7 @@ "LabelFriendlyName": "System venligt navn:", "LabelServerNameHelp": "Dette navn bruges til at identificere serveren. Som udgangspunkt anvendes computerens navn.", "LabelGroupMoviesIntoCollections": "Grupper film i samlinger", - "LabelGroupMoviesIntoCollectionsHelp": "Film i samlinger vil blive vist som en samlet enhed i filmlister.", + "LabelGroupMoviesIntoCollectionsHelp": "Film i samlinger vil blive vist som en samlet visning i filmlister.", "LabelH264Crf": "H.264-kodning CRF:", "LabelEncoderPreset": "Forudindstilling for kodning:", "LabelHardwareAccelerationType": "Hardwareacceleration:", @@ -451,9 +451,9 @@ "LabelMessageText": "Beskedtekst:", "LabelMessageTitle": "Titel på besked:", "LabelMetadataDownloadLanguage": "Foretrukket sprog for nedhentning:", - "LabelMetadataDownloadersHelp": "Aktiver og ranger dine fortrukne metadata downloadere i en prioriteret rækkefølge. Lavt rangerende downloadere bliver kun benyttet til at udfylde manglende information.", + "LabelMetadataDownloadersHelp": "Aktiver og ranger dine foretrukne metadata kilder i prioriteret rækkefølge. Lavt rangerende kilder vil kun blive benyttet til at udfylde manglende information.", "LabelMetadataPath": "Metadatasti:", - "LabelMetadataPathHelp": "Angiv en brugerdefineret lokation til downloadet grafik og metadata.", + "LabelMetadataPathHelp": "Angiv en brugerdefineret lokation til hentet grafik og metadata.", "LabelMetadataReaders": "Metadata aflæsere:", "LabelMetadataReadersHelp": "Ranger dine fortrukne lokale metadatakilder i prioriteret rækkefølge. Den først fundne fil vil blive aflæst.", "LabelMetadataSavers": "Metadata-gemmer:", @@ -546,7 +546,7 @@ "LabelStartWhenPossible": "Start når muligt:", "LabelStopWhenPossible": "Stop når muligt:", "LabelStopping": "Standser", - "LabelSubtitleDownloaders": "undertekst downloadere:", + "LabelSubtitleDownloaders": "Kilder til undertekster:", "LabelSubtitleFormatHelp": "F. eks: srt", "LabelSubtitlePlaybackMode": "Underteksttilstand:", "LabelSupportedMediaTypes": "Understøttede medieformater:", @@ -561,7 +561,7 @@ "LabelTriggerType": "Udløsertype:", "LabelTunerIpAddress": "IP-adresse for Tuner:", "LabelTunerType": "Tunertype:", - "LabelTypeMetadataDownloaders": "Metadata downloadere ({0}):", + "LabelTypeMetadataDownloaders": "Kilder for metadata ({0}):", "LabelTypeText": "Tekst", "LabelUseNotificationServices": "Brug følgende tjenester:", "LabelUser": "Bruger:", @@ -622,7 +622,7 @@ "MessageDeleteTaskTrigger": "Er du sikker på du ønsker at slette denne task trigger?", "MessageDirectoryPickerBSDInstruction": "For BSD skal du muligvis konfigurere lager i dit 'FreeNAS Jail', så Jellyfin kan tilgå dine medie filer.", "MessageDirectoryPickerLinuxInstruction": "For Linux på Arch Linux, CentOS, Debian, Fedora, openSUSE eller Ubuntu, skal du give servicebrugeren mindst læseadgang til dine lagerpladser.", - "MessageDownloadQueued": "Download sat i kø.", + "MessageDownloadQueued": "Hent sat i kø.", "MessageEnablingOptionLongerScans": "Aktivering af denne indstilling kan resultere i væsentlig længere biblioteks skan.", "MessageFileReadError": "Der opstod en fejl i forsøget på at læse filen.", "MessageForgotPasswordFileCreated": "Den følgende fil er blevet oprettet på din server og indeholder instruktioner vedrørende hvordan du skal fortsætte:", @@ -638,7 +638,7 @@ "MessageNoTrailersFound": "Installer forfilm kanalen for at tilføje et bibliotek med forfilm hentet fra internettet.", "MessageNothingHere": "Her er ingenting.", "MessagePasswordResetForUsers": "Følgende brugere har fået nulstillet deres adgangskoder. De kan nu logge på med de pinkoder, der blev brugt til at udføre nulstillingen.", - "MessagePleaseEnsureInternetMetadata": "Sørg venligst for at hentning af metadata fra internettet er aktiveret.", + "MessagePleaseEnsureInternetMetadata": "Venligst sikre at hentning af metadata fra internettet er aktiveret.", "MessagePleaseWait": "Vent venligst. Dette kan tage et minut.", "MessagePluginConfigurationRequiresLocalAccess": "For at opsætte dette plugin log da venligst direkte ind på din lokale server.", "MessagePluginInstallDisclaimer": "Plugins fremstillet af medlemmer fra fællesskabet er en alle tiders måde at forbedre din oplevelse med yderligere features og fordele. Før installation, bedes du venligst være opmærksom på de effekter de kan have på din server; så som lange scantider på biblioteker, yderligere baggrundsbehandling og forringet systemstabilitet.", @@ -688,7 +688,7 @@ "OptionAllowRemoteControlOthers": "Tillad fjernstyring af andre brugere", "OptionAllowRemoteSharedDevices": "Tillad fjernstyring af delte enheder", "OptionAllowRemoteSharedDevicesHelp": "DLNA-enheder betragtes som delt, indtil en bruger begynder at kontrollere dem.", - "OptionAllowSyncTranscoding": "Tillad medie hentning og synkronisering der kræver omkodning", + "OptionAllowSyncTranscoding": "Tillad at hente medier og synkronisering der kræver omkodning", "OptionAllowUserToManageServer": "Tillad denne bruger at administrere serveren", "OptionAllowVideoPlaybackRemuxing": "Tillad videoafspilning som kræver konvertering uden omkodning", "OptionAllowVideoPlaybackTranscoding": "Tillad videoafspilning der kræver transkodning", @@ -706,7 +706,7 @@ "OptionDisableUserHelp": "Serveren vil ikke tillade forbindelser fra denne bruger. Eksisterende forbindelser vil blive afbrudt øjeblikkeligt.", "OptionDislikes": "Ikke-Lide", "OptionDisplayFolderView": "Få vist en mappevisning til at se enkle mediemapper", - "OptionDisplayFolderViewHelp": "Vis mapper sammen med dine andre mediebiblioteker. Dette kan være nyttigt, hvis du gerne vil have en almindelig mappevisning.", + "OptionDisplayFolderViewHelp": "Vis mapper sammen med dine andre mediebiblioteker. Dette kan være nyttigt, hvis du gerne vil have en simpel mappevisning.", "OptionDownloadImagesInAdvance": "Download billeder på forhånd", "OptionDownloadImagesInAdvanceHelp": "Som standard downloades de fleste billeder kun, når de anmodes fra en Jellyfin-app. Aktivér denne mulighed for at downloade alle billeder på forhånd, da nye medier importeres. Dette kan forårsage betydeligt længere biblioteksscanninger.", "OptionDvd": "DVD", @@ -746,7 +746,7 @@ "OptionReleaseDate": "Udgivelsesdato", "OptionReportByteRangeSeekingWhenTranscoding": "Angiv at serveren understøtter bytes øgning nrdeå r transkodes", "OptionReportByteRangeSeekingWhenTranscodingHelp": "Dette er krævet for nogle enheder der ikke er særligt gode til tidssøgning.", - "OptionRequirePerfectSubtitleMatch": "Download kun undertekster der er perfekte matches for videofiler", + "OptionRequirePerfectSubtitleMatch": "Hent kun undertekster der er perfekte matches for videofiler", "OptionResumable": "Kan genoptages", "OptionSaveMetadataAsHidden": "Gem metadata og billeder som skjulte filer", "OptionSaveMetadataAsHiddenHelp": "Ændring af dette vil blive anvendt på nyt metadata gemt fremadrettet. Allerede eksisterende metadata-filer opdateres næste gang de gemmes af serveren.", @@ -835,7 +835,7 @@ "ServerNameIsRestarting": "Serveren bag {0} genstarter.", "ServerNameIsShuttingDown": "Serveren bag {0} lukker ned.", "ServerRestartNeededAfterPluginInstall": "Jellyfin skal genstartes efter installation af en tilføjelse.", - "ServerUpdateNeeded": "Denne server bør opdateres. For at hente den nyeste version besøg venligst {0}", + "ServerUpdateNeeded": "Denne server bør opdateres. For at hente den nyeste version, besøg venligst {0}", "Settings": "Indstillinger", "SettingsSaved": "Indstillinger er gemt.", "SettingsWarning": "Ændring af disse værdier kan resultere i instabilitet eller forbindelsesfejl. Hvis du oplever fejl, anbefaler vi at du skifter til standardværdier.", @@ -851,16 +851,16 @@ "Sports": "Sport", "StopRecording": "Stop optagelse", "Studios": "Studier", - "SubtitleDownloadersHelp": "Aktiver og ranger dine prefererede undertekst hentere i priotets orden.", + "SubtitleDownloadersHelp": "Aktiver og ranger dine foretrukne kilder for undertekster i prioriteret rækkefølge.", "Subtitles": "Undertekster", "Sunday": "Søndag", - "Sync": "Synk", + "Sync": "Synkroniser", "SystemDlnaProfilesHelp": "Systemprofiler kan ikke overskrives. Ændringer i en systemprofil vil blive gemt i en ny brugerdefineret profil.", "TabAccess": "Adgang", "TabAdvanced": "Avanceret", "TabCatalog": "Katalog", "TabContainers": "Containere", - "TabDashboard": "Betjeningspanel", + "TabDashboard": "Dashboard", "TabDirectPlay": "Direkte afspilning", "TabLatest": "Nyligt tilføjet", "TabMusic": "Musik", @@ -920,13 +920,13 @@ "XmlTvSportsCategoriesHelp": "Programmer med disse kategorier bliver vist som sportsprogrammer. Adskil flere med '|'.", "Yesterday": "I går", "AirDate": "Udgivelsesdato", - "Albums": "Albummer", + "Albums": "Album", "Artists": "Kunstnere", "Books": "Bøger", "Collections": "Samlinger", "Favorites": "Favoritter", "Folders": "Mapper", - "HeaderAlbumArtists": "Albumkunstner", + "HeaderAlbumArtists": "Albums kunstnere", "Absolute": "Absolut", "AccessRestrictedTryAgainLater": "Adgang er begrænset lige nu. Prøv venligst igen senere.", "Aired": "Udgivet", @@ -1057,7 +1057,7 @@ "LabelMetadata": "Metadata:", "LabelModelUrl": "Model URL:", "LabelPreferredSubtitleLanguage": "Foretrukket undertekst sprog:", - "LabelProfileCodecs": "Codecs:", + "LabelProfileCodecs": "Kodeks:", "LabelProfileContainer": "Beholder:", "LabelProfileVideoCodecs": "Video Codec:", "LabelReasonForTranscoding": "Grund til omkodning:", @@ -1121,10 +1121,10 @@ "OptionProtocolHls": "HTTP Live Streaming (HLS)", "OptionProtocolHttp": "Web", "OptionRegex": "Regex", - "OptionRequirePerfectSubtitleMatchHelp": "At påkræve en perfekt match vil filtrere undertekster så kun dem der er testet og tjekket der passer nøjagtigt til din video fil vil blive inkluderet. At fravælge denne vil forøge chancerne for at undertekster bliver hentet, men vil også forøge risikoen for ikke-passende og ukorrekte undertekster.", + "OptionRequirePerfectSubtitleMatchHelp": "At påkræve et perfekt match, vil filtrere undertekster så kun dem der er testet og tjekket at de passer nøjagtigt til din video fil, vil blive inkluderet. Hvis du fravælger vil det forøge chancerne for at undertekster bliver hentet, men vil også forøge risikoen for ikke-passende og ukorrekte undertekster.", "OptionResElement": "'res' element", "PerfectMatch": "Perfekt match", - "Photos": "Fotoer", + "Photos": "Fotos", "PlayCount": "Afspilninger", "PlayNext": "Afspil næste", "PlayNextEpisodeAutomatically": "Afspil næste afsnit automatisk", @@ -1233,8 +1233,8 @@ "DashboardServerName": "Server: {0}", "DashboardVersionNumber": "Version: {0}", "LabelTranscodingProgress": "Transkodnings forløb:", - "LabelTranscodingFramerate": "Transcoding framerate:", - "LabelTranscodes": "Transcodes:", + "LabelTranscodingFramerate": "Omkodnings opdateringshastighed:", + "LabelTranscodes": "Omkodede filer:", "LabelTranscodePath": "Transkodnings sti:", "LabelStreamType": "Streamtype:", "LabelSonyAggregationFlags": "Sony aggregering flag:", @@ -1325,7 +1325,7 @@ "HeaderPortRanges": "Brandmur og Proxy indstillinger", "HeaderNewRepository": "Nyt arkiv", "HeaderNetworking": "IP Protokoller", - "HeaderDVR": "Digital optager", + "HeaderDVR": "DVR", "HeaderDeleteDevices": "Fjern alle enheder", "HeaderDebugging": "Fejlfinding og sporing", "HeaderAutoDiscovery": "Netværksopdagelse", @@ -1381,10 +1381,10 @@ "Other": "Andet", "OptionMaxActiveSessionsHelp": "En værdi på 0 vil deaktivere denne funktion.", "OptionMaxActiveSessions": "Angiv det maksimale antal samtidige bruger sessioner.", - "OptionAllowContentDownloadHelp": "Brugere kan hente media og gemme det på deres enheder. Dette er ikke det samme som en sync funktion. Bog biblioteker kræver dette aktiveres for at fungere ordentlig.", - "OptionAllowContentDownload": "Tillad hentning af media", + "OptionAllowContentDownloadHelp": "Brugere kan hente materiale og gemme det på deres enheder. Dette er ikke det samme som en synk funktion. Bog biblioteker kræver at dette er aktiveret for at fungere korrekt.", + "OptionAllowContentDownload": "Tillad at hente media", "NextTrack": "Spring til næste", - "MusicVideos": "Musik videoer", + "MusicVideos": "Musikvideoer", "MillisecondsUnit": "ms", "MessageSyncPlayUserLeft": "{0} har forladt gruppen.", "MessageSyncPlayUserJoined": "{0} deltager i gruppen.", @@ -1609,7 +1609,7 @@ "AllowEmbeddedSubtitlesAllowImageOption": "Tillad billede", "AllowEmbeddedSubtitlesAllowNoneOption": "Tillad ingen", "AllowEmbeddedSubtitlesAllowAllOption": "Tillad alle", - "AllowEmbeddedSubtitlesHelp": "Deaktiver undertekster som er pakket i medie. Kræver en komplet biblioteksopdatering.", + "AllowEmbeddedSubtitlesHelp": "Deaktiver undertekster som er pakket i mediet. Kræver en komplet biblioteksopdatering.", "OtherArtist": "Anden artist", "OriginalAirDate": "Original sendedato", "NextChapter": "Næste kapitel", @@ -1665,5 +1665,40 @@ "SubtitleGreen": "Grøn", "SubtitleLightGray": "lysegrå", "SubtitleRed": "Rød", - "Short": "Kort" + "Short": "Kort", + "Featurette": "Klip", + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Ekstramateriale har ofte det samme indlejrede navn som det oprindelige materiale. Brug denne for at bruge den indlejrede titel alligevel.", + "MediaInfoDoViTitle": "DV titel", + "OptionDateEpisodeAdded": "Dato episoden blev tilføjet", + "PreferEmbeddedExtrasTitlesOverFileNames": "Foretræk indlejrede titler fremfor filnavne på ekstramateriale", + "LabelTextWeight": "Tekst vægt:", + "RememberSubtitleSelectionsHelp": "Forsøg at vælge undertekst ud fra tætteste match af foregående video.", + "SaveRecordingImages": "Gem optagelsens EPG billeder", + "HomeVideosPhotos": "Hjemmevideoer og -billeder", + "IgnoreDtsHelp": "Deaktivering af denne indstilling kan muligvis løse udfordringer såsom manglende lydkanal med separate lyd- og videospor.", + "EnableSplashScreen": "Vis opstarts skærm", + "LabelStereoDownmixAlgorithm": "", + "LabelMaxVideoResolution": "Max opløsning af video omkodnings opløsning", + "HeaderRecordingMetadataSaving": "Optager metadata", + "LabelChapterImageResolutionHelp": "Opløsningen af det udtrukne kapitelbillede.", + "MessageRenameMediaFolder": "Omdøbning af et mediebibliotek sletter al tilhørende metadata. Fortsæt med forsigtighed.", + "StereoDownmixAlgorithmHelp": "Algoritme brugt til at nedskalere flerkanals lyd til stereo.", + "IgnoreDts": "Ignorer DTS (afkodning af tidsstempel)", + "LabelDummyChapterDuration": "Interval:", + "LabelDummyChapterDurationHelp": "Interval i sekunder for udtræk af kapitelbilleder.", + "LabelDummyChapterCount": "Begrænsning:", + "LabelDummyChapterCountHelp": "Det maksimum antal kapitelbilleder der udtrækkes for hver mediefil.", + "MediaInfoDvProfile": "DV profil", + "LabelParallelImageEncodingLimit": "Parallel billedkodning grænese", + "LabelParallelImageEncodingLimitHelp": "Max antal af billedkodninger, som er tilladt at køre parallelt. Ved at sætte denne til 0, vil der blive valgt et max ud fra dit system.", + "MessageNoItemsAvailable": "Ingen elementer er tilgængelige i øjeblikket.", + "MessageNoFavoritesAvailable": "Ingen favoritter er tilgængelige i øjeblikket.", + "OptionDateShowAdded": "Dato serien blev tilføjet", + "RememberAudioSelections": "Vælg lydspor baseret på foregående element", + "RememberAudioSelectionsHelp": "Forsøg at vælge lydspor ud fra tætteste match ud fra foregående video.", + "RememberSubtitleSelections": "Vælg undertekst baseret på foregående element", + "EnableCardLayout": "Vis visuel CardBox", + "ResolutionMatchSource": "Match kilde", + "SubtitleCyan": "Cyan", + "SubtitleMagenta": "Magenta" } diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 5ed424f28e..e8f1f4c759 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -637,6 +637,8 @@ "LabelEasyPinCode": "Easy PIN code:", "LabelEmbedAlbumArtDidl": "Embed album art in DIDL", "LabelEmbedAlbumArtDidlHelp": "Some devices prefer this method for getting the album art. Others may fail to play with this option enabled.", + "LabelEnableAudioVbr": "Enable VBR audio encoding", + "LabelEnableAudioVbrHelp": "Variable bitrate offers better quality to average bitrate ratio, but in some rare cases may cause buffering and compatibility issues.", "LabelEnableAutomaticPortMap": "Enable automatic port mapping", "LabelEnableAutomaticPortMapHelp": "Automatically forward public ports on your router to local ports on your server via UPnP. This may not work with some router models or network configurations. Changes will not apply until after a server restart.", "LabelEnableBlastAliveMessages": "Blast alive messages", diff --git a/src/strings/fr.json b/src/strings/fr.json index e00503fd3e..9eb20a1e50 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1719,5 +1719,7 @@ "Short": "Court-métrage", "HeaderPerformance": "Performance", "LabelParallelImageEncodingLimit": "Limite de parallélisation de l'encodage d'image", - "LabelParallelImageEncodingLimitHelp": "Nombre maximal d’encodages d’image autorisés à s’exécuter en parallèle. Si vous définissez cette valeur sur 0, vous choisirez une limite en fonction des spécifications de votre système." + "LabelParallelImageEncodingLimitHelp": "Nombre maximal d’encodages d’image autorisés à s’exécuter en parallèle. Si vous définissez cette valeur sur 0, vous choisirez une limite en fonction des spécifications de votre système.", + "LabelEnableAudioVbr": "Activer l’encodage audio VBR", + "LabelEnableAudioVbrHelp": "Le débit binaire variable offre une qualité supérieure à la moyenne mais peut, dans de rares cas, causer des problèmes de mise en mémoire tampon et de compatibilité." } diff --git a/src/strings/hi-in.json b/src/strings/hi-in.json index 87fb8aa95b..32dab32ead 100644 --- a/src/strings/hi-in.json +++ b/src/strings/hi-in.json @@ -148,5 +148,6 @@ "Songs": "गाने", "Larger": "और बड़ा", "ListPaging": "{2} का {0}-{1}", - "Shows": "शो" + "Shows": "शो", + "ValueSpecialEpisodeName": "विशेष" } diff --git a/src/strings/hu.json b/src/strings/hu.json index ed9d5e135d..2be94048e3 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -1614,7 +1614,7 @@ "ContainerBitrateExceedsLimit": "A videó bitrátája meghaladja a limitet", "SelectAll": "Összes kiválasztása", "ButtonExitApp": "Kilépés az alkalmazásból", - "Clip": "Rövidfilm", + "Clip": "Klip", "ThemeVideo": "Téma Videó", "ThemeSong": "Főcímdal", "Sample": "Minta", @@ -1711,5 +1711,10 @@ "LabelDummyChapterCount": "Határvonal:", "LabelChapterImageResolution": "Felbontás:", "LabelChapterImageResolutionHelp": "A kinyert fejezetképek felbontása.", - "HeaderPerformance": "Teljesítmény" + "HeaderPerformance": "Teljesítmény", + "Short": "Rövidfilm", + "Featurette": "Mellékfilm", + "LabelParallelImageEncodingLimitHelp": "Maximálisan engedélyezett egyidejűleg futó képkódolások száma. 0-ra állítva a rendszer specifikációja alapján lesz kiválasztva a limit.", + "ResolutionMatchSource": "Forrásnak megfelelő", + "LabelParallelImageEncodingLimit": "Egyidejű képkódolási limit" } diff --git a/src/strings/ro.json b/src/strings/ro.json index 6e88a568f6..429da4f3df 100644 --- a/src/strings/ro.json +++ b/src/strings/ro.json @@ -127,7 +127,7 @@ "Sunday": "Duminică", "TabAccess": "Acces", "TabAdvanced": "Avansat", - "TabLatest": "Cele mai recente", + "TabLatest": "Adăugate recent", "TabMusic": "Muzică", "TabMyPlugins": "Plugin-urile mele", "TabNetworks": "Trusturi TV", @@ -946,7 +946,7 @@ "List": "Listă", "LeaveBlankToNotSetAPassword": "Puteți lăsa acest câmp necompletat pentru a nu seta o parolă.", "LearnHowYouCanContribute": "Aflați cum puteți contribui.", - "LatestFromLibrary": "Ultimele {0}", + "LatestFromLibrary": "Ultimele adăugate {0}", "Large": "Mare", "LanNetworksHelp": "Lista separată de virgule a adreselor IP sau a intrărilor de tip IP/mască de rețea pentru rețelele care vor fi luate în considerare în rețeaua locală atunci când se aplică restricțiile de lățime de bandă. Dacă este setat, toate celelalte adrese IP vor fi considerate a fi în rețeaua externă și vor fi supuse restricțiilor de lățime de bandă externe. Dacă este lăsat necompletat, numai subnetul serverului este considerat a fi în rețeaua locală.", "LabelffmpegPathHelp": "Calea către executabilul FFmpeg sau dosarul care conține FFmpeg.", @@ -1614,7 +1614,7 @@ "DeletedScene": "Scene șterse", "BehindTheScenes": "În spatele scenei", "Trailer": "Trailer", - "Clip": "Featurette", + "Clip": "Clip", "SelectAll": "Selectează Tot", "DirectPlayError": "A apărut o eroare la pornirea redării directe", "UnknownAudioStreamInfo": "Informațiile fluxului audio sunt necunoscute", @@ -1663,7 +1663,7 @@ "IgnoreDts": "Ignoră DTS (marca de timp a decodării)", "DownloadAll": "Descărcați tot", "MessageNoItemsAvailable": "Niciun articol nu este valabil în momentul actual.", - "MessageRenameMediaFolder": "Redenumirea unei biblioteci va cauza toate metadatele să fie pierdute, continuați cu grijă.", + "MessageRenameMediaFolder": "Redenumirea unei biblioteci va șterge toate fisierele metadata, continuați cu grijă.", "OptionDateEpisodeAdded": "Dată Adăugare Episod", "OptionDateShowAdded": "Dată Adăugare Serial", "MessageNoFavoritesAvailable": "Niciun favorit nu este valabil în momentul actual.", @@ -1680,5 +1680,6 @@ "LabelParallelImageEncodingLimit": "Limita encodărilor simultane", "LabelParallelImageEncodingLimitHelp": "Numărul maxim de encodări ale imaginilor care sunt permise să ruleze simultan. Setarea acestei valori la 0 va alege automat o limită bazată pe specificațiile tehnice ale sistemului.", "HeaderDummyChapter": "Imaginile Capitolelor", - "HeaderRecordingMetadataSaving": "Înregistrarea Metadatelor" + "HeaderRecordingMetadataSaving": "Înregistrarea Metadatelor", + "EnableSplashScreen": "Activează ecranul splash" } diff --git a/src/strings/vi.json b/src/strings/vi.json index 1ea16b7367..3ea66967be 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -1662,7 +1662,7 @@ "RememberAudioSelectionsHelp": "Cố gắng đặt bản âm thanh phù hợp nhất với video cuối cùng.", "RememberAudioSelections": "Đặt bản nhạc dựa trên mục trước đó", "LabelMaxVideoResolution": "Độ Phân Giải Chuyển Mã Video Tối Đa Được Phép", - "VideoRangeTypeNotSupported": "Loại phạm vi của video không được hỗ trợ", + "VideoRangeTypeNotSupported": "Không hỗ trợ loại dải động của video", "Interview": "Phỏng vấn", "Sample": "Mẫu", "Trailer": "", @@ -1709,5 +1709,8 @@ "LabelParallelImageEncodingLimitHelp": "Lượng mã hóa hình ảnh tối đa được phép chạy song song. Đặt giá trị này thành 0 sẽ chọn giới hạn dựa trên thông số kỹ thuật hệ thống của bạn.", "SecondarySubtitles": "Phụ đề phụ", "HeaderPerformance": "Hiệu suất", - "LabelParallelImageEncodingLimit": "Giới hạn mã hóa hình ảnh song song" + "LabelParallelImageEncodingLimit": "Giới hạn mã hóa hình ảnh song song", + "MediaInfoDvBlSignalCompatibilityId": "Id tương thích tính hiệu DV bl", + "LabelEnableAudioVbr": "Bật mã hóa âm thanh VBR", + "LabelEnableAudioVbrHelp": "Tốc độ bit thay đổi mang lại chất lượng tốt hơn so với tỷ lệ bit trung bình, nhưng trong một số trường hợp hiếm gặp, có thể gây ra sự cố về khả năng tương thích và bộ đệm." } diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 759c754f1e..d16e37c1e4 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1380,10 +1380,10 @@ "Preview": "预览", "SubtitleVerticalPositionHelp": "文字出现的行号。正数表示由上到下,负数表示由下到上。", "LabelSubtitleVerticalPosition": "垂直位置:", - "PreviousTrack": "上一曲", + "PreviousTrack": "上一集", "MessageGetInstalledPluginsError": "获取已安装插件列表时出现错误。", "MessagePluginInstallError": "安装插件时出现错误。", - "NextTrack": "下一曲", + "NextTrack": "下一集", "LabelUnstable": "不稳定", "PlaybackRate": "播放速度", "LabelMaxMuxingQueueSize": "最大混合器队列大小:", @@ -1719,5 +1719,7 @@ "Short": "短片", "LabelParallelImageEncodingLimitHelp": "允许并行运行的图像编码的最大数量。设为 0 以根据您的系统配置自动设置。", "HeaderPerformance": "性能", - "LabelParallelImageEncodingLimit": "并行图像编码限制" + "LabelParallelImageEncodingLimit": "并行图像编码限制", + "LabelEnableAudioVbr": "启用 VBR 音频编码", + "LabelEnableAudioVbrHelp": "可变比特率(VBR)相比平均比特率(ABR)可以提供更好的质量,但在少见情况中可能造成缓冲和兼容性问题。" } diff --git a/src/types/plugin.ts b/src/types/plugin.ts index 4b4b946e90..b2896012df 100644 --- a/src/types/plugin.ts +++ b/src/types/plugin.ts @@ -9,5 +9,5 @@ export interface Plugin { name: string id: string type: PluginType | string - priority: number + priority?: number }