diff --git a/.eslintrc.js b/.eslintrc.js index 91a4cf29c..01714c04c 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 d9c4eadc2..a607dd0da 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 8707e1e1e..2f10d09e0 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 376a215b9..8a9f26a3c 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 34b8976a1..a847eeb67 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 2ca9e29d6..8c2686a7e 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 e33bce82d..c2c37b5e2 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 25e942c4b..113fa3c07 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 bd1651fa1..aee1640a5 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 33df97532..bbfb35ebc 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 4a12a78d0..2cb709e11 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 dfbc0a676..04c03c660 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 f479fb4c8..794e845f8 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 4db46e332..c3316df1a 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 4cf6e0736..4eadda8e3 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 7a65e4887..f71852985 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 c99b33285..5c5d1b619 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 656292ece..32fe9c213 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 a96e390de..41c55c362 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 285997a44..41287dd00 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 36137af21..907de76b8 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 7f9d3f36d..22816aee3 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 1711169db..b2c9033bc 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 e0bcb1562..e132c706e 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 ae7647798..9ada1d60c 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 da9557d62..dabaf1c8a 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 5ce5b55c9..76d0090ba 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 f717b0ae6..1592b27c2 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 d62919227..65c99b645 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 c90acc007..c9f931297 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 6b6405904..530e102f1 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 fb69d20aa..a9596c378 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 6632ef628..398496817 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 d16fe7756..6c560c222 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 e8054e5fb..7ce944830 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 70ae0644d..90d835e1c 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 763f0eb2d..c2b67e421 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 742a77df4..d890148c3 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 72f5a69fb..6a5aee364 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 8a0fa01df..cdc8c69a3 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 60e51c784..62f43a343 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 b332e4238..572cccc1f 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 80da4d7b1..dcdfe4587 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 dc5f89644..7b5123c90 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 c9a64b658..12a5f1a9d 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 9eec8503c..0946f10e6 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 fd98d163e..d2db85156 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 537e842d9..348d6d2be 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 ad83d9bf2..f9790189e 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 b8c89726c..f122d6da2 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 9b417534f..ed7268748 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 49ff20390..62cb3edf4 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 2989eb9bd..a98715705 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 334b658eb..cf57fa2ee 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 90469c59f..3dc1d04c9 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 8b97984d0..8446838df 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 accdbe56b..fbc77cc7b 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 7559b827c..053b03228 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 8b2b4bebc..5eb13c979 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 6b798c6c4..b15eea9d8 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 7b2cf65b4..d1ad28b99 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 b05ddd31f..040df1af7 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 c0e48e9a5..de64af44d 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 2d98aa5a9..8f562f1aa 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 bbb154a4e..e2e15d2ab 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 ed76a04ab..06af0b308 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 d7bbab581..2af8aa184 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 17c72f8e1..64deaa2fc 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 258e67071..f0c3639b8 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 ba7096c0d..2cbe4117f 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 d1e53b38d..0066cf48a 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 8c58bf6ff..296746613 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 5a0276e5f..faa8bb90a 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 066f5b1a4..cb212e529 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 073af9c0d..7f8ae7ecb 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 6919169a5..aa85e3c31 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 ae0f0fef5..4c7769f32 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 14313318a..36b38cc1f 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 df5e213b7..8924d0695 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 efbb533b2..2da57b922 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 bf71834f0..55fd02c8a 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 2c48b4087..3817988d6 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 7c41c5318..44aa79b82 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 ceb5653c7..effa1cab6 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 f1a435106..721ed7403 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 59c066aaf..33d99aa75 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 383d89378..36589dfcb 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 f782d0b91..0377feab6 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 362fb7ee9..0d4b944be 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 d154018b4..192f90bb6 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 b2eef63c7..67fe05563 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 ff39fae33..055afb0f8 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 a6042189d..7540d0c68 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 a98f72e61..e5943d69b 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 0a44aaad3..ce4f6410a 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 8965676e4..eb3fac9ec 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 de8c0c483..7863cafe4 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 517b7fe0e..afec7eafa 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 000000000..bcd4de5a3 --- /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 c557841b1..cdb48331d 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 56bd791ca..5da9ed77a 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 66a8347df..25bc969da 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 5ed424f28..e8f1f4c75 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 e00503fd3..9eb20a1e5 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 87fb8aa95..32dab32ea 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 ed9d5e135..2be94048e 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 6e88a568f..429da4f3d 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 1ea16b736..3ea66967b 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 759c754f1..d16e37c1e 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 4b4b946e9..b2896012d 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 }