mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Merge branch 'master' into create-subtitles-keyboard-shortcut
This commit is contained in:
commit
8bf4542957
42 changed files with 1375 additions and 319 deletions
471
package-lock.json
generated
471
package-lock.json
generated
|
@ -21,7 +21,7 @@
|
|||
"@jellyfin/sdk": "0.0.0-unstable.202409260501",
|
||||
"@mui/icons-material": "5.16.7",
|
||||
"@mui/material": "5.16.7",
|
||||
"@mui/x-date-pickers": "7.17.0",
|
||||
"@mui/x-date-pickers": "7.18.0",
|
||||
"@react-hook/resize-observer": "2.0.2",
|
||||
"@tanstack/react-query": "5.56.2",
|
||||
"@tanstack/react-query-devtools": "5.56.2",
|
||||
|
@ -77,7 +77,7 @@
|
|||
"@types/loadable__component": "5.13.9",
|
||||
"@types/lodash-es": "4.17.12",
|
||||
"@types/markdown-it": "14.1.2",
|
||||
"@types/react": "18.3.7",
|
||||
"@types/react": "18.3.8",
|
||||
"@types/react-dom": "18.3.0",
|
||||
"@types/sortablejs": "1.15.8",
|
||||
"@typescript-eslint/eslint-plugin": "5.62.0",
|
||||
|
@ -106,12 +106,12 @@
|
|||
"html-webpack-plugin": "5.6.0",
|
||||
"jsdom": "25.0.0",
|
||||
"mini-css-extract-plugin": "2.9.1",
|
||||
"postcss": "8.4.42",
|
||||
"postcss": "8.4.47",
|
||||
"postcss-loader": "8.1.1",
|
||||
"postcss-preset-env": "10.0.3",
|
||||
"postcss-scss": "4.0.9",
|
||||
"sass": "1.79.1",
|
||||
"sass-loader": "16.0.1",
|
||||
"sass": "1.79.3",
|
||||
"sass-loader": "16.0.2",
|
||||
"source-map-loader": "5.0.0",
|
||||
"speed-measure-webpack-plugin": "1.5.0",
|
||||
"style-loader": "4.0.0",
|
||||
|
@ -136,7 +136,7 @@
|
|||
"yarn": "YARN NO LONGER USED - use npm instead."
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"sass-embedded": "1.79.1"
|
||||
"sass-embedded": "1.79.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@aashutoshrathi/word-wrap": {
|
||||
|
@ -5493,14 +5493,14 @@
|
|||
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
|
||||
},
|
||||
"node_modules/@mui/x-date-pickers": {
|
||||
"version": "7.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.17.0.tgz",
|
||||
"integrity": "sha512-3mIw1uOZU/yKweZsVAo9QnwVFzLHqXgXG1TbGbDJ4AU6FhN2TCUlR9tzKHSlYdAHZ0bEWDS1/bgeGsQC7skXMA==",
|
||||
"version": "7.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.18.0.tgz",
|
||||
"integrity": "sha512-12tXIoMj9vpS8fS/bS3kWPCoVrH38vNGCxgplI0vOnUrN9rJuYJz3agLPJe1S0xciTw+9W8ZSe3soaW+owoz1Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.25.6",
|
||||
"@mui/utils": "^5.16.6",
|
||||
"@mui/x-internals": "7.17.0",
|
||||
"@mui/x-internals": "7.18.0",
|
||||
"@types/react-transition-group": "^4.4.11",
|
||||
"clsx": "^2.1.1",
|
||||
"prop-types": "^15.8.1",
|
||||
|
@ -5518,7 +5518,7 @@
|
|||
"@emotion/styled": "^11.8.1",
|
||||
"@mui/material": "^5.15.14 || ^6.0.0",
|
||||
"@mui/system": "^5.15.14 || ^6.0.0",
|
||||
"date-fns": "^2.25.0 || ^3.2.0",
|
||||
"date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0",
|
||||
"date-fns-jalali": "^2.13.0-0 || ^3.2.0-0",
|
||||
"dayjs": "^1.10.7",
|
||||
"luxon": "^3.0.2",
|
||||
|
@ -5559,9 +5559,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@mui/x-internals": {
|
||||
"version": "7.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.17.0.tgz",
|
||||
"integrity": "sha512-FLlAGSJl/vsuaA/8hPGazXFppyzIzxApJJDZMoTS0geUmHd0hyooISV2ltllLmrZ/DGtHhI08m8GGnHL6/vVeg==",
|
||||
"version": "7.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.18.0.tgz",
|
||||
"integrity": "sha512-lzCHOWIR0cAIY1bGrWSprYerahbnH5C31ql/2OWCEjcngL2NAV1M6oKI2Vp4HheqzJ822c60UyWyapvyjSzY/A==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.25.6",
|
||||
|
@ -6549,9 +6549,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"node_modules/@types/react": {
|
||||
"version": "18.3.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.7.tgz",
|
||||
"integrity": "sha512-KUnDCJF5+AiZd8owLIeVHqmW9yM4sqmDVf2JRJiBMFkGvkoZ4/WyV2lL4zVsoinmRS/W3FeEdZLEWFRofnT2FQ==",
|
||||
"version": "18.3.8",
|
||||
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.8.tgz",
|
||||
"integrity": "sha512-syBUrW3/XpnW4WJ41Pft+I+aPoDVbrBVQGEnbD7NijDGlVC+8gV/XKRY+7vMDlfPpbwYt0l1vd/Sj8bJGMbs9Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/prop-types": "*",
|
||||
|
@ -16838,9 +16838,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/postcss": {
|
||||
"version": "8.4.42",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.42.tgz",
|
||||
"integrity": "sha512-hywKUQB9Ra4dR1mGhldy5Aj1X3MWDSIA1cEi+Uy0CjheLvP6Ual5RlwMCh8i/X121yEDLDIKBsrCQ8ba3FDMfQ==",
|
||||
"version": "8.4.47",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
|
||||
"integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
|
@ -16859,8 +16859,8 @@
|
|||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"nanoid": "^3.3.7",
|
||||
"picocolors": "^1.0.1",
|
||||
"source-map-js": "^1.2.0"
|
||||
"picocolors": "^1.1.0",
|
||||
"source-map-js": "^1.2.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^10 || ^12 || >=14"
|
||||
|
@ -20195,9 +20195,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"node_modules/sass": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass/-/sass-1.79.1.tgz",
|
||||
"integrity": "sha512-+mA7svoNKeL0DiJqZGeR/ZGUu8he4I8o3jyUcOFyo4eBJrwNgIMmAEwCMo/N2Y3wdjOBcRzoNxZIOtrtMX8EXg==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass/-/sass-1.79.3.tgz",
|
||||
"integrity": "sha512-m7dZxh0W9EZ3cw50Me5GOuYm/tVAJAn91SUnohLRo9cXBixGUOdvmryN+dXpwR831bhoY3Zv7rEFt85PUwTmzA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
|
@ -20213,9 +20213,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.1.tgz",
|
||||
"integrity": "sha512-UIgG9sHZZ1fT28bxOGi6RUTyvuNvnNQ5nUCdeDGOiS+pGhxLNMdoSFd1cwF8cF5+JUfS6PK8TVAc+aNX4Q3ZGQ==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.3.tgz",
|
||||
"integrity": "sha512-zUve2qCn6uSOMZnZazLzrDWq//OQWFle5G45vJjv3B/ADIA3TXVgqHqN3u7D2vGajOGREz0HN5nhliSoKmQqZA==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
|
@ -20234,32 +20234,32 @@
|
|||
"node": ">=16.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"sass-embedded-android-arm": "1.79.1",
|
||||
"sass-embedded-android-arm64": "1.79.1",
|
||||
"sass-embedded-android-ia32": "1.79.1",
|
||||
"sass-embedded-android-riscv64": "1.79.1",
|
||||
"sass-embedded-android-x64": "1.79.1",
|
||||
"sass-embedded-darwin-arm64": "1.79.1",
|
||||
"sass-embedded-darwin-x64": "1.79.1",
|
||||
"sass-embedded-linux-arm": "1.79.1",
|
||||
"sass-embedded-linux-arm64": "1.79.1",
|
||||
"sass-embedded-linux-ia32": "1.79.1",
|
||||
"sass-embedded-linux-musl-arm": "1.79.1",
|
||||
"sass-embedded-linux-musl-arm64": "1.79.1",
|
||||
"sass-embedded-linux-musl-ia32": "1.79.1",
|
||||
"sass-embedded-linux-musl-riscv64": "1.79.1",
|
||||
"sass-embedded-linux-musl-x64": "1.79.1",
|
||||
"sass-embedded-linux-riscv64": "1.79.1",
|
||||
"sass-embedded-linux-x64": "1.79.1",
|
||||
"sass-embedded-win32-arm64": "1.79.1",
|
||||
"sass-embedded-win32-ia32": "1.79.1",
|
||||
"sass-embedded-win32-x64": "1.79.1"
|
||||
"sass-embedded-android-arm": "1.79.3",
|
||||
"sass-embedded-android-arm64": "1.79.3",
|
||||
"sass-embedded-android-ia32": "1.79.3",
|
||||
"sass-embedded-android-riscv64": "1.79.3",
|
||||
"sass-embedded-android-x64": "1.79.3",
|
||||
"sass-embedded-darwin-arm64": "1.79.3",
|
||||
"sass-embedded-darwin-x64": "1.79.3",
|
||||
"sass-embedded-linux-arm": "1.79.3",
|
||||
"sass-embedded-linux-arm64": "1.79.3",
|
||||
"sass-embedded-linux-ia32": "1.79.3",
|
||||
"sass-embedded-linux-musl-arm": "1.79.3",
|
||||
"sass-embedded-linux-musl-arm64": "1.79.3",
|
||||
"sass-embedded-linux-musl-ia32": "1.79.3",
|
||||
"sass-embedded-linux-musl-riscv64": "1.79.3",
|
||||
"sass-embedded-linux-musl-x64": "1.79.3",
|
||||
"sass-embedded-linux-riscv64": "1.79.3",
|
||||
"sass-embedded-linux-x64": "1.79.3",
|
||||
"sass-embedded-win32-arm64": "1.79.3",
|
||||
"sass-embedded-win32-ia32": "1.79.3",
|
||||
"sass-embedded-win32-x64": "1.79.3"
|
||||
}
|
||||
},
|
||||
"node_modules/sass-embedded-android-arm": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.1.tgz",
|
||||
"integrity": "sha512-p6TaAOFUDx3DjK3i8Y3c4rNXnSJZcivYL+CojMefHZgJNm7PS0mrpzr4a0kkD25saZO208r+Fa258ax1+GzEvA==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.3.tgz",
|
||||
"integrity": "sha512-rrdaVDkKBLUqzdqlBFamUbeuLG+8r/QLXHIgz4qPhIDqceJH6ds0Vzrae9Ef6DhYfMatOg2xiScdatwQ8Yl/hA==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
|
@ -20273,9 +20273,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-android-arm64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.1.tgz",
|
||||
"integrity": "sha512-q+Q1GdLCTVazpfX/vKJGRQJTjZwSkcViUThzSOtCDwNK6vMbJB3x6CHmHmKWYnjceA2y73QRgs9kR+NDLZoPLQ==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.3.tgz",
|
||||
"integrity": "sha512-Wqm/WKHIDQl7w7eIQRO/GQ7EXfnwNpipCyJL7Xtb15vSAV64J4/0D/esy6GOPlVG+qcu8/XN8NV7Bf5wZ2ExUw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
|
@ -20289,9 +20289,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-android-ia32": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.1.tgz",
|
||||
"integrity": "sha512-bp4x5gjv1Wq5cAur8iKYZShfG27XUS/nrhqJU0PN2EGqu+YTklYR4ouoR4yZDFXjNA7RKmqqzJE+8Jks5cVnGA==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.3.tgz",
|
||||
"integrity": "sha512-6rDmH0O7hjBP04/xBAFzSYYMU/7MrQYCak4541BZIbIfa2uw0x/8+mB7lZjdgFsBrFjcpdVCPhZPUE6Y50c00A==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
|
@ -20305,9 +20305,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-android-riscv64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.1.tgz",
|
||||
"integrity": "sha512-1BJT4XtWvQeCjFUzNg1+Xa8RtIP8p2odBF5ly4i7ON6pHHYknjbpHTXIXFkz5sgLReFue9q/bsKIgvSPHMgkIg==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.3.tgz",
|
||||
"integrity": "sha512-B/PgB0AfTCvOlF1g89raJTwTXIUQUM3OXDWqEKIlJEZM1Yao91i8ZkyrFkDMzT4G5sETy4o8pgK+qE9+7bFlug==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
|
@ -20321,9 +20321,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-android-x64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.1.tgz",
|
||||
"integrity": "sha512-eqqDI9hOLNpbdEtBG7uJoAnim5xvscjlUTqHsqGlkddTdnXjwgcUDeqmc3z4iFr1wq7bZpb+xz6FM3MJxeLa7g==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.3.tgz",
|
||||
"integrity": "sha512-a5cpo9Yw4xnX32Uo3WfMZLaTVnI/h2n7U3K3eTygyj707yhGkUB0i+qxldzCw8MmKivIu9irG6O4kmnRjW6f7g==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
|
@ -20337,9 +20337,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-darwin-arm64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.1.tgz",
|
||||
"integrity": "sha512-6co9oRwPmyvEC9I5SyW+NHOQKLmVfQZVbYWvFQl3EPLsUCTQ88dVteQwPdpm+3MY0GNjLjjVppeyAsmWHjUmjQ==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.3.tgz",
|
||||
"integrity": "sha512-imafD0nlVz5FJhqBqxUbG5rK4E3cu1GxhMZ5VhKm0k4t5jFQo+3OjN7sHT4Ee2Mk1g8sjr5dtq5enDU4fs6lXA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
|
@ -20353,9 +20353,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-darwin-x64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.1.tgz",
|
||||
"integrity": "sha512-9rFlxTj5gxtxA1EBkO3dJ1W70Zebpw28wHUs/wByrT1FqR6+uPnyLOWwt5WJLc4AoS1LLQz/ZeknxL/mKI+GrA==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.3.tgz",
|
||||
"integrity": "sha512-pjciT1FcMUMA4rWdpyZYSwMOvxk5JP7R6vy7TzvqkUEqXxP9FTflYnAiwgYUDVTpngHHqRxTjdyW+e+h2L9dHw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
|
@ -20369,9 +20369,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-linux-arm": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.1.tgz",
|
||||
"integrity": "sha512-Qdc94coLXxQ4NNS9DT+V9RtJ7TnttRhaNFR79ZU8RtZ1jHTWLnnC1rEDm1Br3btOy7op3eplFpJahfNZPRFKug==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.3.tgz",
|
||||
"integrity": "sha512-n0bDtzABPE5YaL9wSLxNPiQMl1zArsGblHJyED6fEHz41m+OkCTopfO8IVjcf+MBrK/j11gonxiIGWO+fNOxvg==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
|
@ -20385,9 +20385,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-linux-arm64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.1.tgz",
|
||||
"integrity": "sha512-7LyLZ9XJU/9CAzCrWWFhqGEK620tYoNxMIpqX1yfNUiDGoolXfs1WDpxEiXqQaw4DmcPeAkqqAs8tg7qekDXBg==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.3.tgz",
|
||||
"integrity": "sha512-ODo8ghwk6KHxchgwxq4CwgfYwWdreEbsQoukeEgRKxHcuLB9XF6tol9pGlfrc8sYox48Vp5WDCZuzgoo6rJ6tg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
|
@ -20401,9 +20401,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-linux-ia32": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.1.tgz",
|
||||
"integrity": "sha512-9ZsVRSZJvUT6gNL1wS54cRdNqGfpi32zGh4q/Q62AKbAqmNb+BvuQT4TsBLuIEMDaR75Z1xvj1iArguD/LX00A==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.3.tgz",
|
||||
"integrity": "sha512-oC3rUyIE6mEm2etsc4CuNu6IVmB6CoSM4KsubxzCD3S37QFXq8wYbI0t9iiDdTkKb5Iu+vUyhn+tYJRVHg0tvw==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
|
@ -20417,9 +20417,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-linux-musl-arm": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.1.tgz",
|
||||
"integrity": "sha512-4MBu1aFvGE45CYii6dbdce3nPNc8CKcQ0spf7r6DeEn19NWJ0dNkYMTIa8Xy+TwZ1uS92g8E+M/aXmwQlRXQCA==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.3.tgz",
|
||||
"integrity": "sha512-TOUYMtDs9xoMsJSEEr7NjtcVCqVpg1eSOQHXXruJ1kiYfxwmHrCYTjTLoefbZ29mWqIq8NUaXJG4rZNDK6NzRA==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
|
@ -20433,9 +20433,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-linux-musl-arm64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.1.tgz",
|
||||
"integrity": "sha512-4iNhJgeyyZrsBA/RwSiTRaxPSsHpvjr8I+oN6E0OpEzyY62QIxhQGGf1A73fOs6tJLw58ba14tAm/bblGefLFQ==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.3.tgz",
|
||||
"integrity": "sha512-Q9/5lsrK/JnQci3DwxZ9PGIIrRxuo/bySv+gbyVp8Kb7gdkZcEsY7HkxaBJfwVEwpZSGAyCviyZDHDMILjliOw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
|
@ -20449,9 +20449,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-linux-musl-ia32": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.1.tgz",
|
||||
"integrity": "sha512-5CF4mrbrnrtpKcoxuJnF6SryOqjyCdXyPJ6U6PjOUYEA1T1Cd/sE0cB+wswTQRgPVrYQO1d9c0eSEY1gZijp0g==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.3.tgz",
|
||||
"integrity": "sha512-T2uERh3gs9eWUzdkDadPuYbelQJQLZyX8myutUd4fxyrQ7ToQRBwcMoynEjl48DBHnM0oRiJUHrV9uFuJ+fmRA==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
|
@ -20465,9 +20465,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-linux-musl-riscv64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.1.tgz",
|
||||
"integrity": "sha512-ZOVpi6c0vfD0vBBtmQqwd4+gGbrnsKnuyrh2ghoNbwg4oMHo85S0rCUR/3Uny6oFDKnTTJkWjamig3gy6ygzYQ==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.3.tgz",
|
||||
"integrity": "sha512-XTuYtTBPFeEjydS2GsIUkMztzXIiz13noknE7m1yAbVxOchu9jD9FCLAdK9pVPPki+9BiLSxsutYwOcQn8atqQ==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
|
@ -20481,9 +20481,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-linux-musl-x64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.1.tgz",
|
||||
"integrity": "sha512-0lcQZ7hZ6/gBoJ/Od7BX33Q3jr9oGaQxJfYZ0wmCK4qSu3S06UoBTELy9Njv51h+JaWJFUwzROay8bGWrEVuLQ==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.3.tgz",
|
||||
"integrity": "sha512-gDHfaPlxT/XQTMbfb2y+U6zDMuI8pfapVXTYlUrgYhKH2KoICclIvahhjFii5i5+1dHpfGzjgYKBqI3nvZsYFg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
|
@ -20497,9 +20497,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-linux-riscv64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.1.tgz",
|
||||
"integrity": "sha512-KQED61FrdYvW0YEMncBsak/PshpGkdPpzLLGXjdUqKqe6Tiv8/zqrlD8GC8CIvSBRxZs7ybyFMPi1KyjnvtUdQ==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.3.tgz",
|
||||
"integrity": "sha512-NONTa//1ZfxA87+Zjp3rabL+Z9gM67FJBdktRKXXMBAce5i8eCj/eqJGUOGPjYxtvxtQw77cex0qMr9SZnX6ww==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
|
@ -20513,9 +20513,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-linux-x64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.1.tgz",
|
||||
"integrity": "sha512-s4QSuvdNrQq00XB2t3Dt+B05rc5cvONnveHijaXtqS+yb98tvNvDiozVfS20k4k1eklhoBC8FBm165RAXDGEuA==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.3.tgz",
|
||||
"integrity": "sha512-drlUqMMw222+f/T5sNrIAv+z0vQwLkO4zAlDmf4biLdWIloPP/3plTodAkMyfagNcvA8jG2jN414pJXBI3zK6w==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
|
@ -20529,9 +20529,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-win32-arm64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.1.tgz",
|
||||
"integrity": "sha512-S7gzwMAvevFEJGZaWNltfJtvi8LCceWNs94b8uHQhmq8F/YFRy/iNPVAVB3SvnvBrIk8Iy2X6AXWoneLHFsNfg==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.3.tgz",
|
||||
"integrity": "sha512-gYz0IUb0fLkHUbhq+HR52wvQfG75Zu1s48/v48TqC+b04H/01k2eiawp/Ec1f+lhpIL/pr5+n5jWR6CjkxPdnQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
|
@ -20545,9 +20545,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-win32-ia32": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.1.tgz",
|
||||
"integrity": "sha512-UjxQ6KtO3UthJMvjlVaE3QiO76wRXLcM/gejSp2cgYUVRHYXFr88z0XjQiZc9mJEuvHi69BvvmpCjN4iptKO5A==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.3.tgz",
|
||||
"integrity": "sha512-fbDTyzbqRc+xCWZ+YHSDt2WvGk5PW2K0SjyHuwes/Fls1+wdO4iHIukE/pD+HSWytYrtCqhe7EFq5Ug5HxGTLg==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
|
@ -20561,9 +20561,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-embedded-win32-x64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.1.tgz",
|
||||
"integrity": "sha512-hN9fO2Z5c5YhvF/p31PM4861y6wglwc11/K5vTaGwDKkhfVrKoT2iMGC9r0GshsP9D/LV8s+StoFe3NLYYp8Qg==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.3.tgz",
|
||||
"integrity": "sha512-vvfr6wyCaHvdQbGS8UkYab6DXc1FKJRYFT5aFE3QTVqbzCqmJ5tf80E4+gvB99nljLtMjwKR1d332iWI9KDLhw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
|
@ -20603,9 +20603,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/sass-loader": {
|
||||
"version": "16.0.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.1.tgz",
|
||||
"integrity": "sha512-xACl1ToTsKnL9Ce5yYpRxrLj9QUDCnwZNhzpC7tKiFyA8zXsd3Ap+HGVnbCgkdQcm43E+i6oKAWBsvGA6ZoiMw==",
|
||||
"version": "16.0.2",
|
||||
"resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz",
|
||||
"integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
|
@ -25649,34 +25649,6 @@
|
|||
"url": "https://opencollective.com/vitest"
|
||||
}
|
||||
},
|
||||
"node_modules/vite/node_modules/postcss": {
|
||||
"version": "8.4.47",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
|
||||
"integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/postcss/"
|
||||
},
|
||||
{
|
||||
"type": "tidelift",
|
||||
"url": "https://tidelift.com/funding/github/npm/postcss"
|
||||
},
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/ai"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"nanoid": "^3.3.7",
|
||||
"picocolors": "^1.1.0",
|
||||
"source-map-js": "^1.2.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^10 || ^12 || >=14"
|
||||
}
|
||||
},
|
||||
"node_modules/vitest": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.1.tgz",
|
||||
|
@ -29570,13 +29542,13 @@
|
|||
}
|
||||
},
|
||||
"@mui/x-date-pickers": {
|
||||
"version": "7.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.17.0.tgz",
|
||||
"integrity": "sha512-3mIw1uOZU/yKweZsVAo9QnwVFzLHqXgXG1TbGbDJ4AU6FhN2TCUlR9tzKHSlYdAHZ0bEWDS1/bgeGsQC7skXMA==",
|
||||
"version": "7.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.18.0.tgz",
|
||||
"integrity": "sha512-12tXIoMj9vpS8fS/bS3kWPCoVrH38vNGCxgplI0vOnUrN9rJuYJz3agLPJe1S0xciTw+9W8ZSe3soaW+owoz1Q==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.25.6",
|
||||
"@mui/utils": "^5.16.6",
|
||||
"@mui/x-internals": "7.17.0",
|
||||
"@mui/x-internals": "7.18.0",
|
||||
"@types/react-transition-group": "^4.4.11",
|
||||
"clsx": "^2.1.1",
|
||||
"prop-types": "^15.8.1",
|
||||
|
@ -29584,9 +29556,9 @@
|
|||
}
|
||||
},
|
||||
"@mui/x-internals": {
|
||||
"version": "7.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.17.0.tgz",
|
||||
"integrity": "sha512-FLlAGSJl/vsuaA/8hPGazXFppyzIzxApJJDZMoTS0geUmHd0hyooISV2ltllLmrZ/DGtHhI08m8GGnHL6/vVeg==",
|
||||
"version": "7.18.0",
|
||||
"resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.18.0.tgz",
|
||||
"integrity": "sha512-lzCHOWIR0cAIY1bGrWSprYerahbnH5C31ql/2OWCEjcngL2NAV1M6oKI2Vp4HheqzJ822c60UyWyapvyjSzY/A==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.25.6",
|
||||
"@mui/utils": "^5.16.6"
|
||||
|
@ -30242,9 +30214,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"@types/react": {
|
||||
"version": "18.3.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.7.tgz",
|
||||
"integrity": "sha512-KUnDCJF5+AiZd8owLIeVHqmW9yM4sqmDVf2JRJiBMFkGvkoZ4/WyV2lL4zVsoinmRS/W3FeEdZLEWFRofnT2FQ==",
|
||||
"version": "18.3.8",
|
||||
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.8.tgz",
|
||||
"integrity": "sha512-syBUrW3/XpnW4WJ41Pft+I+aPoDVbrBVQGEnbD7NijDGlVC+8gV/XKRY+7vMDlfPpbwYt0l1vd/Sj8bJGMbs9Q==",
|
||||
"requires": {
|
||||
"@types/prop-types": "*",
|
||||
"csstype": "^3.0.2"
|
||||
|
@ -37727,14 +37699,14 @@
|
|||
"dev": true
|
||||
},
|
||||
"postcss": {
|
||||
"version": "8.4.42",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.42.tgz",
|
||||
"integrity": "sha512-hywKUQB9Ra4dR1mGhldy5Aj1X3MWDSIA1cEi+Uy0CjheLvP6Ual5RlwMCh8i/X121yEDLDIKBsrCQ8ba3FDMfQ==",
|
||||
"version": "8.4.47",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
|
||||
"integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"nanoid": "^3.3.7",
|
||||
"picocolors": "^1.0.1",
|
||||
"source-map-js": "^1.2.0"
|
||||
"picocolors": "^1.1.0",
|
||||
"source-map-js": "^1.2.1"
|
||||
}
|
||||
},
|
||||
"postcss-attribute-case-insensitive": {
|
||||
|
@ -39732,9 +39704,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"sass": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass/-/sass-1.79.1.tgz",
|
||||
"integrity": "sha512-+mA7svoNKeL0DiJqZGeR/ZGUu8he4I8o3jyUcOFyo4eBJrwNgIMmAEwCMo/N2Y3wdjOBcRzoNxZIOtrtMX8EXg==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass/-/sass-1.79.3.tgz",
|
||||
"integrity": "sha512-m7dZxh0W9EZ3cw50Me5GOuYm/tVAJAn91SUnohLRo9cXBixGUOdvmryN+dXpwR831bhoY3Zv7rEFt85PUwTmzA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"chokidar": "^4.0.0",
|
||||
|
@ -39760,9 +39732,9 @@
|
|||
}
|
||||
},
|
||||
"sass-embedded": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.1.tgz",
|
||||
"integrity": "sha512-UIgG9sHZZ1fT28bxOGi6RUTyvuNvnNQ5nUCdeDGOiS+pGhxLNMdoSFd1cwF8cF5+JUfS6PK8TVAc+aNX4Q3ZGQ==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.3.tgz",
|
||||
"integrity": "sha512-zUve2qCn6uSOMZnZazLzrDWq//OQWFle5G45vJjv3B/ADIA3TXVgqHqN3u7D2vGajOGREz0HN5nhliSoKmQqZA==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"@bufbuild/protobuf": "^2.0.0",
|
||||
|
@ -39770,26 +39742,26 @@
|
|||
"colorjs.io": "^0.5.0",
|
||||
"immutable": "^4.0.0",
|
||||
"rxjs": "^7.4.0",
|
||||
"sass-embedded-android-arm": "1.79.1",
|
||||
"sass-embedded-android-arm64": "1.79.1",
|
||||
"sass-embedded-android-ia32": "1.79.1",
|
||||
"sass-embedded-android-riscv64": "1.79.1",
|
||||
"sass-embedded-android-x64": "1.79.1",
|
||||
"sass-embedded-darwin-arm64": "1.79.1",
|
||||
"sass-embedded-darwin-x64": "1.79.1",
|
||||
"sass-embedded-linux-arm": "1.79.1",
|
||||
"sass-embedded-linux-arm64": "1.79.1",
|
||||
"sass-embedded-linux-ia32": "1.79.1",
|
||||
"sass-embedded-linux-musl-arm": "1.79.1",
|
||||
"sass-embedded-linux-musl-arm64": "1.79.1",
|
||||
"sass-embedded-linux-musl-ia32": "1.79.1",
|
||||
"sass-embedded-linux-musl-riscv64": "1.79.1",
|
||||
"sass-embedded-linux-musl-x64": "1.79.1",
|
||||
"sass-embedded-linux-riscv64": "1.79.1",
|
||||
"sass-embedded-linux-x64": "1.79.1",
|
||||
"sass-embedded-win32-arm64": "1.79.1",
|
||||
"sass-embedded-win32-ia32": "1.79.1",
|
||||
"sass-embedded-win32-x64": "1.79.1",
|
||||
"sass-embedded-android-arm": "1.79.3",
|
||||
"sass-embedded-android-arm64": "1.79.3",
|
||||
"sass-embedded-android-ia32": "1.79.3",
|
||||
"sass-embedded-android-riscv64": "1.79.3",
|
||||
"sass-embedded-android-x64": "1.79.3",
|
||||
"sass-embedded-darwin-arm64": "1.79.3",
|
||||
"sass-embedded-darwin-x64": "1.79.3",
|
||||
"sass-embedded-linux-arm": "1.79.3",
|
||||
"sass-embedded-linux-arm64": "1.79.3",
|
||||
"sass-embedded-linux-ia32": "1.79.3",
|
||||
"sass-embedded-linux-musl-arm": "1.79.3",
|
||||
"sass-embedded-linux-musl-arm64": "1.79.3",
|
||||
"sass-embedded-linux-musl-ia32": "1.79.3",
|
||||
"sass-embedded-linux-musl-riscv64": "1.79.3",
|
||||
"sass-embedded-linux-musl-x64": "1.79.3",
|
||||
"sass-embedded-linux-riscv64": "1.79.3",
|
||||
"sass-embedded-linux-x64": "1.79.3",
|
||||
"sass-embedded-win32-arm64": "1.79.3",
|
||||
"sass-embedded-win32-ia32": "1.79.3",
|
||||
"sass-embedded-win32-x64": "1.79.3",
|
||||
"supports-color": "^8.1.1",
|
||||
"varint": "^6.0.0"
|
||||
},
|
||||
|
@ -39812,129 +39784,129 @@
|
|||
}
|
||||
},
|
||||
"sass-embedded-android-arm": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.1.tgz",
|
||||
"integrity": "sha512-p6TaAOFUDx3DjK3i8Y3c4rNXnSJZcivYL+CojMefHZgJNm7PS0mrpzr4a0kkD25saZO208r+Fa258ax1+GzEvA==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.3.tgz",
|
||||
"integrity": "sha512-rrdaVDkKBLUqzdqlBFamUbeuLG+8r/QLXHIgz4qPhIDqceJH6ds0Vzrae9Ef6DhYfMatOg2xiScdatwQ8Yl/hA==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-android-arm64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.1.tgz",
|
||||
"integrity": "sha512-q+Q1GdLCTVazpfX/vKJGRQJTjZwSkcViUThzSOtCDwNK6vMbJB3x6CHmHmKWYnjceA2y73QRgs9kR+NDLZoPLQ==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.3.tgz",
|
||||
"integrity": "sha512-Wqm/WKHIDQl7w7eIQRO/GQ7EXfnwNpipCyJL7Xtb15vSAV64J4/0D/esy6GOPlVG+qcu8/XN8NV7Bf5wZ2ExUw==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-android-ia32": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.1.tgz",
|
||||
"integrity": "sha512-bp4x5gjv1Wq5cAur8iKYZShfG27XUS/nrhqJU0PN2EGqu+YTklYR4ouoR4yZDFXjNA7RKmqqzJE+8Jks5cVnGA==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.3.tgz",
|
||||
"integrity": "sha512-6rDmH0O7hjBP04/xBAFzSYYMU/7MrQYCak4541BZIbIfa2uw0x/8+mB7lZjdgFsBrFjcpdVCPhZPUE6Y50c00A==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-android-riscv64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.1.tgz",
|
||||
"integrity": "sha512-1BJT4XtWvQeCjFUzNg1+Xa8RtIP8p2odBF5ly4i7ON6pHHYknjbpHTXIXFkz5sgLReFue9q/bsKIgvSPHMgkIg==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.3.tgz",
|
||||
"integrity": "sha512-B/PgB0AfTCvOlF1g89raJTwTXIUQUM3OXDWqEKIlJEZM1Yao91i8ZkyrFkDMzT4G5sETy4o8pgK+qE9+7bFlug==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-android-x64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.1.tgz",
|
||||
"integrity": "sha512-eqqDI9hOLNpbdEtBG7uJoAnim5xvscjlUTqHsqGlkddTdnXjwgcUDeqmc3z4iFr1wq7bZpb+xz6FM3MJxeLa7g==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.3.tgz",
|
||||
"integrity": "sha512-a5cpo9Yw4xnX32Uo3WfMZLaTVnI/h2n7U3K3eTygyj707yhGkUB0i+qxldzCw8MmKivIu9irG6O4kmnRjW6f7g==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-darwin-arm64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.1.tgz",
|
||||
"integrity": "sha512-6co9oRwPmyvEC9I5SyW+NHOQKLmVfQZVbYWvFQl3EPLsUCTQ88dVteQwPdpm+3MY0GNjLjjVppeyAsmWHjUmjQ==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.3.tgz",
|
||||
"integrity": "sha512-imafD0nlVz5FJhqBqxUbG5rK4E3cu1GxhMZ5VhKm0k4t5jFQo+3OjN7sHT4Ee2Mk1g8sjr5dtq5enDU4fs6lXA==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-darwin-x64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.1.tgz",
|
||||
"integrity": "sha512-9rFlxTj5gxtxA1EBkO3dJ1W70Zebpw28wHUs/wByrT1FqR6+uPnyLOWwt5WJLc4AoS1LLQz/ZeknxL/mKI+GrA==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.3.tgz",
|
||||
"integrity": "sha512-pjciT1FcMUMA4rWdpyZYSwMOvxk5JP7R6vy7TzvqkUEqXxP9FTflYnAiwgYUDVTpngHHqRxTjdyW+e+h2L9dHw==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-linux-arm": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.1.tgz",
|
||||
"integrity": "sha512-Qdc94coLXxQ4NNS9DT+V9RtJ7TnttRhaNFR79ZU8RtZ1jHTWLnnC1rEDm1Br3btOy7op3eplFpJahfNZPRFKug==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.3.tgz",
|
||||
"integrity": "sha512-n0bDtzABPE5YaL9wSLxNPiQMl1zArsGblHJyED6fEHz41m+OkCTopfO8IVjcf+MBrK/j11gonxiIGWO+fNOxvg==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-linux-arm64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.1.tgz",
|
||||
"integrity": "sha512-7LyLZ9XJU/9CAzCrWWFhqGEK620tYoNxMIpqX1yfNUiDGoolXfs1WDpxEiXqQaw4DmcPeAkqqAs8tg7qekDXBg==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.3.tgz",
|
||||
"integrity": "sha512-ODo8ghwk6KHxchgwxq4CwgfYwWdreEbsQoukeEgRKxHcuLB9XF6tol9pGlfrc8sYox48Vp5WDCZuzgoo6rJ6tg==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-linux-ia32": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.1.tgz",
|
||||
"integrity": "sha512-9ZsVRSZJvUT6gNL1wS54cRdNqGfpi32zGh4q/Q62AKbAqmNb+BvuQT4TsBLuIEMDaR75Z1xvj1iArguD/LX00A==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.3.tgz",
|
||||
"integrity": "sha512-oC3rUyIE6mEm2etsc4CuNu6IVmB6CoSM4KsubxzCD3S37QFXq8wYbI0t9iiDdTkKb5Iu+vUyhn+tYJRVHg0tvw==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-linux-musl-arm": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.1.tgz",
|
||||
"integrity": "sha512-4MBu1aFvGE45CYii6dbdce3nPNc8CKcQ0spf7r6DeEn19NWJ0dNkYMTIa8Xy+TwZ1uS92g8E+M/aXmwQlRXQCA==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.3.tgz",
|
||||
"integrity": "sha512-TOUYMtDs9xoMsJSEEr7NjtcVCqVpg1eSOQHXXruJ1kiYfxwmHrCYTjTLoefbZ29mWqIq8NUaXJG4rZNDK6NzRA==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-linux-musl-arm64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.1.tgz",
|
||||
"integrity": "sha512-4iNhJgeyyZrsBA/RwSiTRaxPSsHpvjr8I+oN6E0OpEzyY62QIxhQGGf1A73fOs6tJLw58ba14tAm/bblGefLFQ==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.3.tgz",
|
||||
"integrity": "sha512-Q9/5lsrK/JnQci3DwxZ9PGIIrRxuo/bySv+gbyVp8Kb7gdkZcEsY7HkxaBJfwVEwpZSGAyCviyZDHDMILjliOw==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-linux-musl-ia32": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.1.tgz",
|
||||
"integrity": "sha512-5CF4mrbrnrtpKcoxuJnF6SryOqjyCdXyPJ6U6PjOUYEA1T1Cd/sE0cB+wswTQRgPVrYQO1d9c0eSEY1gZijp0g==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.3.tgz",
|
||||
"integrity": "sha512-T2uERh3gs9eWUzdkDadPuYbelQJQLZyX8myutUd4fxyrQ7ToQRBwcMoynEjl48DBHnM0oRiJUHrV9uFuJ+fmRA==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-linux-musl-riscv64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.1.tgz",
|
||||
"integrity": "sha512-ZOVpi6c0vfD0vBBtmQqwd4+gGbrnsKnuyrh2ghoNbwg4oMHo85S0rCUR/3Uny6oFDKnTTJkWjamig3gy6ygzYQ==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.3.tgz",
|
||||
"integrity": "sha512-XTuYtTBPFeEjydS2GsIUkMztzXIiz13noknE7m1yAbVxOchu9jD9FCLAdK9pVPPki+9BiLSxsutYwOcQn8atqQ==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-linux-musl-x64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.1.tgz",
|
||||
"integrity": "sha512-0lcQZ7hZ6/gBoJ/Od7BX33Q3jr9oGaQxJfYZ0wmCK4qSu3S06UoBTELy9Njv51h+JaWJFUwzROay8bGWrEVuLQ==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.3.tgz",
|
||||
"integrity": "sha512-gDHfaPlxT/XQTMbfb2y+U6zDMuI8pfapVXTYlUrgYhKH2KoICclIvahhjFii5i5+1dHpfGzjgYKBqI3nvZsYFg==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-linux-riscv64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.1.tgz",
|
||||
"integrity": "sha512-KQED61FrdYvW0YEMncBsak/PshpGkdPpzLLGXjdUqKqe6Tiv8/zqrlD8GC8CIvSBRxZs7ybyFMPi1KyjnvtUdQ==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.3.tgz",
|
||||
"integrity": "sha512-NONTa//1ZfxA87+Zjp3rabL+Z9gM67FJBdktRKXXMBAce5i8eCj/eqJGUOGPjYxtvxtQw77cex0qMr9SZnX6ww==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-linux-x64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.1.tgz",
|
||||
"integrity": "sha512-s4QSuvdNrQq00XB2t3Dt+B05rc5cvONnveHijaXtqS+yb98tvNvDiozVfS20k4k1eklhoBC8FBm165RAXDGEuA==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.3.tgz",
|
||||
"integrity": "sha512-drlUqMMw222+f/T5sNrIAv+z0vQwLkO4zAlDmf4biLdWIloPP/3plTodAkMyfagNcvA8jG2jN414pJXBI3zK6w==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-win32-arm64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.1.tgz",
|
||||
"integrity": "sha512-S7gzwMAvevFEJGZaWNltfJtvi8LCceWNs94b8uHQhmq8F/YFRy/iNPVAVB3SvnvBrIk8Iy2X6AXWoneLHFsNfg==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.3.tgz",
|
||||
"integrity": "sha512-gYz0IUb0fLkHUbhq+HR52wvQfG75Zu1s48/v48TqC+b04H/01k2eiawp/Ec1f+lhpIL/pr5+n5jWR6CjkxPdnQ==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-win32-ia32": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.1.tgz",
|
||||
"integrity": "sha512-UjxQ6KtO3UthJMvjlVaE3QiO76wRXLcM/gejSp2cgYUVRHYXFr88z0XjQiZc9mJEuvHi69BvvmpCjN4iptKO5A==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.3.tgz",
|
||||
"integrity": "sha512-fbDTyzbqRc+xCWZ+YHSDt2WvGk5PW2K0SjyHuwes/Fls1+wdO4iHIukE/pD+HSWytYrtCqhe7EFq5Ug5HxGTLg==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded-win32-x64": {
|
||||
"version": "1.79.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.1.tgz",
|
||||
"integrity": "sha512-hN9fO2Z5c5YhvF/p31PM4861y6wglwc11/K5vTaGwDKkhfVrKoT2iMGC9r0GshsP9D/LV8s+StoFe3NLYYp8Qg==",
|
||||
"version": "1.79.3",
|
||||
"resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.3.tgz",
|
||||
"integrity": "sha512-vvfr6wyCaHvdQbGS8UkYab6DXc1FKJRYFT5aFE3QTVqbzCqmJ5tf80E4+gvB99nljLtMjwKR1d332iWI9KDLhw==",
|
||||
"optional": true
|
||||
},
|
||||
"sass-loader": {
|
||||
"version": "16.0.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.1.tgz",
|
||||
"integrity": "sha512-xACl1ToTsKnL9Ce5yYpRxrLj9QUDCnwZNhzpC7tKiFyA8zXsd3Ap+HGVnbCgkdQcm43E+i6oKAWBsvGA6ZoiMw==",
|
||||
"version": "16.0.2",
|
||||
"resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz",
|
||||
"integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"neo-async": "^2.6.2"
|
||||
|
@ -43647,19 +43619,6 @@
|
|||
"fsevents": "~2.3.3",
|
||||
"postcss": "^8.4.43",
|
||||
"rollup": "^4.20.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"postcss": {
|
||||
"version": "8.4.47",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
|
||||
"integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"nanoid": "^3.3.7",
|
||||
"picocolors": "^1.1.0",
|
||||
"source-map-js": "^1.2.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"vite-node": {
|
||||
|
|
12
package.json
12
package.json
|
@ -16,7 +16,7 @@
|
|||
"@types/loadable__component": "5.13.9",
|
||||
"@types/lodash-es": "4.17.12",
|
||||
"@types/markdown-it": "14.1.2",
|
||||
"@types/react": "18.3.7",
|
||||
"@types/react": "18.3.8",
|
||||
"@types/react-dom": "18.3.0",
|
||||
"@types/sortablejs": "1.15.8",
|
||||
"@typescript-eslint/eslint-plugin": "5.62.0",
|
||||
|
@ -45,12 +45,12 @@
|
|||
"html-webpack-plugin": "5.6.0",
|
||||
"jsdom": "25.0.0",
|
||||
"mini-css-extract-plugin": "2.9.1",
|
||||
"postcss": "8.4.42",
|
||||
"postcss": "8.4.47",
|
||||
"postcss-loader": "8.1.1",
|
||||
"postcss-preset-env": "10.0.3",
|
||||
"postcss-scss": "4.0.9",
|
||||
"sass": "1.79.1",
|
||||
"sass-loader": "16.0.1",
|
||||
"sass": "1.79.3",
|
||||
"sass-loader": "16.0.2",
|
||||
"source-map-loader": "5.0.0",
|
||||
"speed-measure-webpack-plugin": "1.5.0",
|
||||
"style-loader": "4.0.0",
|
||||
|
@ -82,7 +82,7 @@
|
|||
"@jellyfin/sdk": "0.0.0-unstable.202409260501",
|
||||
"@mui/icons-material": "5.16.7",
|
||||
"@mui/material": "5.16.7",
|
||||
"@mui/x-date-pickers": "7.17.0",
|
||||
"@mui/x-date-pickers": "7.18.0",
|
||||
"@react-hook/resize-observer": "2.0.2",
|
||||
"@tanstack/react-query": "5.56.2",
|
||||
"@tanstack/react-query-devtools": "5.56.2",
|
||||
|
@ -127,7 +127,7 @@
|
|||
"whatwg-fetch": "3.6.20"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"sass-embedded": "1.79.1"
|
||||
"sass-embedded": "1.79.3"
|
||||
},
|
||||
"browserslist": [
|
||||
"last 2 Firefox versions",
|
||||
|
|
|
@ -168,8 +168,8 @@ const UserEdit = () => {
|
|||
(page.querySelector('.chkRemoteAccess') as HTMLInputElement).checked = user.Policy?.EnableRemoteAccess == null || user.Policy?.EnableRemoteAccess;
|
||||
(page.querySelector('#txtRemoteClientBitrateLimit') as HTMLInputElement).value = user.Policy?.RemoteClientBitrateLimit && user.Policy?.RemoteClientBitrateLimit > 0 ?
|
||||
(user.Policy?.RemoteClientBitrateLimit / 1e6).toLocaleString(undefined, { maximumFractionDigits: 6 }) : '';
|
||||
(page.querySelector('#txtLoginAttemptsBeforeLockout') as HTMLInputElement).value = String(user.Policy?.MaxActiveSessions) || '0';
|
||||
(page.querySelector('#txtMaxActiveSessions') as HTMLInputElement).value = String(user.Policy?.SyncPlayAccess) || '0';
|
||||
(page.querySelector('#txtLoginAttemptsBeforeLockout') as HTMLInputElement).value = String(user.Policy?.LoginAttemptsBeforeLockout) || '-1';
|
||||
(page.querySelector('#txtMaxActiveSessions') as HTMLInputElement).value = String(user.Policy?.MaxActiveSessions) || '0';
|
||||
if (window.ApiClient.isMinServerVersion('10.6.0')) {
|
||||
(page.querySelector('#selectSyncPlayAccess') as HTMLSelectElement).value = String(user.Policy?.SyncPlayAccess);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
import React, { FC, useCallback } from 'react';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
import { IconButton } from '@mui/material';
|
||||
import DeleteIcon from '@mui/icons-material/Delete';
|
||||
|
||||
import { useCancelSeriesTimer } from 'hooks/api/liveTvHooks';
|
||||
import globalize from 'lib/globalize';
|
||||
import loading from 'components/loading/loading';
|
||||
import toast from 'components/toast/toast';
|
||||
import confirm from 'components/confirm/confirm';
|
||||
|
||||
interface CancelSeriesTimerButtonProps {
|
||||
itemId: string;
|
||||
}
|
||||
|
||||
const CancelSeriesTimerButton: FC<CancelSeriesTimerButtonProps> = ({
|
||||
itemId
|
||||
}) => {
|
||||
const navigate = useNavigate();
|
||||
const cancelSeriesTimer = useCancelSeriesTimer();
|
||||
|
||||
const onCancelSeriesTimerClick = useCallback(() => {
|
||||
confirm({
|
||||
text: globalize.translate('MessageConfirmRecordingCancellation'),
|
||||
primary: 'delete',
|
||||
confirmText: globalize.translate('HeaderCancelSeries'),
|
||||
cancelText: globalize.translate('HeaderKeepSeries')
|
||||
})
|
||||
.then(function () {
|
||||
loading.show();
|
||||
cancelSeriesTimer.mutate(
|
||||
{
|
||||
timerId: itemId
|
||||
},
|
||||
{
|
||||
onSuccess: async () => {
|
||||
toast(globalize.translate('SeriesCancelled'));
|
||||
loading.hide();
|
||||
navigate('/livetv.html');
|
||||
},
|
||||
onError: (err: unknown) => {
|
||||
loading.hide();
|
||||
toast(globalize.translate('MessageCancelSeriesTimerError'));
|
||||
console.error(
|
||||
'[cancelSeriesTimer] failed to cancel series timer',
|
||||
err
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
})
|
||||
.catch(() => {
|
||||
// confirm dialog closed
|
||||
});
|
||||
}, [cancelSeriesTimer, navigate, itemId]);
|
||||
|
||||
return (
|
||||
<IconButton
|
||||
className='button-flat btnCancelSeriesTimer'
|
||||
title={globalize.translate('CancelSeries')}
|
||||
onClick={onCancelSeriesTimerClick}
|
||||
>
|
||||
<DeleteIcon />
|
||||
</IconButton>
|
||||
);
|
||||
};
|
||||
|
||||
export default CancelSeriesTimerButton;
|
|
@ -0,0 +1,60 @@
|
|||
import React, { FC, useCallback } from 'react';
|
||||
import { IconButton } from '@mui/material';
|
||||
import StopIcon from '@mui/icons-material/Stop';
|
||||
import { useQueryClient } from '@tanstack/react-query';
|
||||
import { useCancelTimer } from 'hooks/api/liveTvHooks';
|
||||
import globalize from 'lib/globalize';
|
||||
import loading from 'components/loading/loading';
|
||||
import toast from 'components/toast/toast';
|
||||
|
||||
interface CancelTimerButtonProps {
|
||||
timerId: string;
|
||||
queryKey?: string[];
|
||||
}
|
||||
|
||||
const CancelTimerButton: FC<CancelTimerButtonProps> = ({
|
||||
timerId,
|
||||
queryKey
|
||||
}) => {
|
||||
const queryClient = useQueryClient();
|
||||
const cancelTimer = useCancelTimer();
|
||||
|
||||
const onCancelTimerClick = useCallback(() => {
|
||||
loading.show();
|
||||
cancelTimer.mutate(
|
||||
{
|
||||
timerId: timerId
|
||||
},
|
||||
{
|
||||
onSuccess: async () => {
|
||||
toast(globalize.translate('RecordingCancelled'));
|
||||
loading.hide();
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey
|
||||
});
|
||||
},
|
||||
|
||||
onError: (err: unknown) => {
|
||||
loading.hide();
|
||||
toast(globalize.translate('MessageCancelTimerError'));
|
||||
console.error(
|
||||
'[cancelTimer] failed to cancel timer',
|
||||
err
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
}, [cancelTimer, queryClient, queryKey, timerId]);
|
||||
|
||||
return (
|
||||
<IconButton
|
||||
className='button-flat btnCancelTimer'
|
||||
title={globalize.translate('StopRecording')}
|
||||
onClick={onCancelTimerClick}
|
||||
>
|
||||
<StopIcon />
|
||||
</IconButton>
|
||||
);
|
||||
};
|
||||
|
||||
export default CancelTimerButton;
|
|
@ -0,0 +1,42 @@
|
|||
import React, { FC, useCallback } from 'react';
|
||||
import { IconButton } from '@mui/material';
|
||||
import FileDownloadIcon from '@mui/icons-material/FileDownload';
|
||||
import { useGetDownload } from 'hooks/api/libraryHooks';
|
||||
import globalize from 'lib/globalize';
|
||||
import { download } from 'scripts/fileDownloader';
|
||||
import type { NullableString } from 'types/base/common/shared/types';
|
||||
|
||||
interface DownloadButtonProps {
|
||||
itemId: string;
|
||||
itemServerId: NullableString,
|
||||
itemName: NullableString,
|
||||
itemPath: NullableString,
|
||||
}
|
||||
|
||||
const DownloadButton: FC<DownloadButtonProps> = ({ itemId, itemServerId, itemName, itemPath }) => {
|
||||
const { data: downloadHref } = useGetDownload({ itemId });
|
||||
|
||||
const onDownloadClick = useCallback(async () => {
|
||||
download([
|
||||
{
|
||||
url: downloadHref,
|
||||
itemId: itemId,
|
||||
serverId: itemServerId,
|
||||
title: itemName,
|
||||
filename: itemPath?.replace(/^.*[\\/]/, '')
|
||||
}
|
||||
]);
|
||||
}, [downloadHref, itemId, itemName, itemPath, itemServerId]);
|
||||
|
||||
return (
|
||||
<IconButton
|
||||
className='button-flat btnDownload'
|
||||
title={globalize.translate('Download')}
|
||||
onClick={onDownloadClick}
|
||||
>
|
||||
<FileDownloadIcon />
|
||||
</IconButton>
|
||||
);
|
||||
};
|
||||
|
||||
export default DownloadButton;
|
|
@ -0,0 +1,28 @@
|
|||
import React, { FC, useCallback } from 'react';
|
||||
import { IconButton } from '@mui/material';
|
||||
import ExploreIcon from '@mui/icons-material/Explore';
|
||||
import { playbackManager } from 'components/playback/playbackmanager';
|
||||
import globalize from 'lib/globalize';
|
||||
import type { ItemDto } from 'types/base/models/item-dto';
|
||||
|
||||
interface InstantMixButtonProps {
|
||||
item?: ItemDto;
|
||||
}
|
||||
|
||||
const InstantMixButton: FC<InstantMixButtonProps> = ({ item }) => {
|
||||
const onInstantMixClick = useCallback(() => {
|
||||
playbackManager.instantMix(item);
|
||||
}, [item]);
|
||||
|
||||
return (
|
||||
<IconButton
|
||||
className='button-flat btnInstantMix'
|
||||
title={globalize.translate('HeaderInstantMix')}
|
||||
onClick={onInstantMixClick}
|
||||
>
|
||||
<ExploreIcon />
|
||||
</IconButton>
|
||||
);
|
||||
};
|
||||
|
||||
export default InstantMixButton;
|
|
@ -0,0 +1,219 @@
|
|||
import React, { FC, useCallback, useMemo } from 'react';
|
||||
import { IconButton } from '@mui/material';
|
||||
import MoreVertIcon from '@mui/icons-material/MoreVert';
|
||||
import { useQueryClient } from '@tanstack/react-query';
|
||||
import { useApi } from 'hooks/useApi';
|
||||
import { useGetItemByType } from '../../hooks/api/useGetItemByType';
|
||||
import globalize from 'lib/globalize';
|
||||
import itemContextMenu from 'components/itemContextMenu';
|
||||
import { playbackManager } from 'components/playback/playbackmanager';
|
||||
import { appRouter } from 'components/router/appRouter';
|
||||
|
||||
import { ItemKind } from 'types/base/models/item-kind';
|
||||
import type { NullableString } from 'types/base/common/shared/types';
|
||||
import type { ItemDto } from 'types/base/models/item-dto';
|
||||
|
||||
interface PlayAllFromHereOptions {
|
||||
item: ItemDto;
|
||||
items: ItemDto[];
|
||||
serverId: NullableString;
|
||||
queue?: boolean;
|
||||
}
|
||||
|
||||
function playAllFromHere(opts: PlayAllFromHereOptions) {
|
||||
const { item, items, serverId, queue } = opts;
|
||||
|
||||
const ids = [];
|
||||
|
||||
let foundCard = false;
|
||||
let startIndex;
|
||||
|
||||
for (let i = 0, length = items?.length; i < length; i++) {
|
||||
if (items[i] === item) {
|
||||
foundCard = true;
|
||||
startIndex = i;
|
||||
}
|
||||
if (foundCard || !queue) {
|
||||
ids.push(items[i].Id);
|
||||
}
|
||||
}
|
||||
|
||||
if (!ids.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (queue) {
|
||||
return playbackManager.queue({
|
||||
ids,
|
||||
serverId
|
||||
});
|
||||
} else {
|
||||
return playbackManager.play({
|
||||
ids,
|
||||
serverId,
|
||||
startIndex
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export interface ContextMenuOpts {
|
||||
open?: boolean;
|
||||
play?: boolean;
|
||||
playAllFromHere?: boolean;
|
||||
queueAllFromHere?: boolean;
|
||||
cancelTimer?: boolean;
|
||||
record?: boolean;
|
||||
deleteItem?: boolean;
|
||||
shuffle?: boolean;
|
||||
instantMix?: boolean;
|
||||
share?: boolean;
|
||||
stopPlayback?: boolean;
|
||||
clearQueue?: boolean;
|
||||
queue?: boolean;
|
||||
playlist?: boolean;
|
||||
edit?: boolean;
|
||||
editImages?: boolean;
|
||||
editSubtitles?: boolean;
|
||||
identify?: boolean;
|
||||
moremediainfo?: boolean;
|
||||
openAlbum?: boolean;
|
||||
openArtist?: boolean;
|
||||
openLyrics?: boolean;
|
||||
}
|
||||
|
||||
interface MoreCommandsButtonProps {
|
||||
itemType: ItemKind;
|
||||
selectedItemId?: string;
|
||||
itemId?: string;
|
||||
items?: ItemDto[] | null;
|
||||
collectionId?: NullableString;
|
||||
playlistId?: NullableString;
|
||||
canEditPlaylist?: boolean;
|
||||
itemPlaylistItemId?: NullableString;
|
||||
contextMenuOpts?: ContextMenuOpts;
|
||||
queryKey?: string[];
|
||||
}
|
||||
|
||||
const MoreCommandsButton: FC<MoreCommandsButtonProps> = ({
|
||||
itemType,
|
||||
selectedItemId,
|
||||
itemId,
|
||||
collectionId,
|
||||
playlistId,
|
||||
canEditPlaylist,
|
||||
itemPlaylistItemId,
|
||||
contextMenuOpts,
|
||||
items,
|
||||
queryKey
|
||||
}) => {
|
||||
const { user } = useApi();
|
||||
const queryClient = useQueryClient();
|
||||
const { data: item } = useGetItemByType({
|
||||
itemType,
|
||||
itemId: selectedItemId || itemId || ''
|
||||
});
|
||||
const parentId = item?.SeasonId || item?.SeriesId || item?.ParentId;
|
||||
|
||||
const playlistItem = useMemo(() => {
|
||||
let PlaylistItemId: string | null = null;
|
||||
let PlaylistIndex = -1;
|
||||
let PlaylistItemCount = 0;
|
||||
|
||||
if (playlistId) {
|
||||
PlaylistItemId = itemPlaylistItemId || null;
|
||||
|
||||
if (items?.length) {
|
||||
PlaylistItemCount = items.length;
|
||||
PlaylistIndex = items.findIndex(listItem => listItem.PlaylistItemId === PlaylistItemId);
|
||||
}
|
||||
}
|
||||
return { PlaylistItemId, PlaylistIndex, PlaylistItemCount };
|
||||
}, [itemPlaylistItemId, items, playlistId]);
|
||||
|
||||
const defaultMenuOptions = useMemo(() => {
|
||||
return {
|
||||
|
||||
item: {
|
||||
...item,
|
||||
...playlistItem
|
||||
},
|
||||
user: user,
|
||||
play: true,
|
||||
queue: true,
|
||||
playAllFromHere: item?.Type === ItemKind.Season || !item?.IsFolder,
|
||||
queueAllFromHere: !item?.IsFolder,
|
||||
canEditPlaylist: canEditPlaylist,
|
||||
playlistId: playlistId,
|
||||
collectionId: collectionId,
|
||||
...contextMenuOpts
|
||||
};
|
||||
}, [canEditPlaylist, collectionId, contextMenuOpts, item, playlistId, playlistItem, user]);
|
||||
|
||||
const onMoreCommandsClick = useCallback(
|
||||
async (e: React.MouseEvent<HTMLElement>) => {
|
||||
itemContextMenu
|
||||
.show({
|
||||
...defaultMenuOptions,
|
||||
positionTo: e.currentTarget
|
||||
})
|
||||
.then(async function (result) {
|
||||
if (result.command === 'playallfromhere') {
|
||||
console.log('handleItemClick', {
|
||||
item,
|
||||
items: items || [],
|
||||
serverId: item?.ServerId
|
||||
});
|
||||
playAllFromHere({
|
||||
item: item || {},
|
||||
items: items || [],
|
||||
serverId: item?.ServerId
|
||||
});
|
||||
} else if (result.command === 'queueallfromhere') {
|
||||
playAllFromHere({
|
||||
item: item || {},
|
||||
items: items || [],
|
||||
serverId: item?.ServerId,
|
||||
queue: true
|
||||
});
|
||||
} else if (result.deleted) {
|
||||
if (result?.itemId !== itemId) {
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey
|
||||
});
|
||||
} else if (parentId) {
|
||||
appRouter.showItem(parentId, item?.ServerId);
|
||||
} else {
|
||||
await appRouter.goHome();
|
||||
}
|
||||
} else if (result.updated) {
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey
|
||||
});
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
/* no-op */
|
||||
});
|
||||
},
|
||||
[defaultMenuOptions, item, itemId, items, parentId, queryClient, queryKey]
|
||||
);
|
||||
|
||||
if (
|
||||
item
|
||||
&& itemContextMenu.getCommands(defaultMenuOptions).length
|
||||
) {
|
||||
return (
|
||||
<IconButton
|
||||
className='button-flat btnMoreCommands'
|
||||
title={globalize.translate('ButtonMore')}
|
||||
onClick={onMoreCommandsClick}
|
||||
>
|
||||
<MoreVertIcon />
|
||||
</IconButton>
|
||||
);
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
export default MoreCommandsButton;
|
|
@ -0,0 +1,87 @@
|
|||
import React, { FC, useCallback, useMemo } from 'react';
|
||||
import { IconButton } from '@mui/material';
|
||||
import PlayArrowIcon from '@mui/icons-material/PlayArrow';
|
||||
import ReplayIcon from '@mui/icons-material/Replay';
|
||||
import { useQueryClient } from '@tanstack/react-query';
|
||||
import { useApi } from 'hooks/useApi';
|
||||
import { getChannelQuery } from 'hooks/api/liveTvHooks/useGetChannel';
|
||||
import globalize from 'lib/globalize';
|
||||
import { playbackManager } from 'components/playback/playbackmanager';
|
||||
import type { ItemDto } from 'types/base/models/item-dto';
|
||||
import { ItemKind } from 'types/base/models/item-kind';
|
||||
import itemHelper from 'components/itemHelper';
|
||||
|
||||
interface PlayOrResumeButtonProps {
|
||||
item: ItemDto;
|
||||
isResumable?: boolean;
|
||||
selectedMediaSourceId?: string | null;
|
||||
selectedAudioTrack?: number;
|
||||
selectedSubtitleTrack?: number;
|
||||
}
|
||||
|
||||
const PlayOrResumeButton: FC<PlayOrResumeButtonProps> = ({
|
||||
item,
|
||||
isResumable,
|
||||
selectedMediaSourceId,
|
||||
selectedAudioTrack,
|
||||
selectedSubtitleTrack
|
||||
}) => {
|
||||
const apiContext = useApi();
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
const playOptions = useMemo(() => {
|
||||
if (itemHelper.supportsMediaSourceSelection(item)) {
|
||||
return {
|
||||
startPositionTicks:
|
||||
item.UserData && isResumable ?
|
||||
item.UserData.PlaybackPositionTicks :
|
||||
0,
|
||||
mediaSourceId: selectedMediaSourceId,
|
||||
audioStreamIndex: selectedAudioTrack || null,
|
||||
subtitleStreamIndex: selectedSubtitleTrack
|
||||
};
|
||||
}
|
||||
}, [
|
||||
item,
|
||||
isResumable,
|
||||
selectedMediaSourceId,
|
||||
selectedAudioTrack,
|
||||
selectedSubtitleTrack
|
||||
]);
|
||||
|
||||
const onPlayClick = useCallback(async () => {
|
||||
if (item.Type === ItemKind.Program && item.ChannelId) {
|
||||
const channel = await queryClient.fetchQuery(
|
||||
getChannelQuery(apiContext, {
|
||||
channelId: item.ChannelId
|
||||
})
|
||||
);
|
||||
playbackManager.play({
|
||||
items: [channel]
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
playbackManager.play({
|
||||
items: [item],
|
||||
...playOptions
|
||||
});
|
||||
}, [apiContext, item, playOptions, queryClient]);
|
||||
|
||||
return (
|
||||
<IconButton
|
||||
className='button-flat btnPlayOrResume'
|
||||
data-action={isResumable ? 'resume' : 'play'}
|
||||
title={
|
||||
isResumable ?
|
||||
globalize.translate('ButtonResume') :
|
||||
globalize.translate('Play')
|
||||
}
|
||||
onClick={onPlayClick}
|
||||
>
|
||||
{isResumable ? <ReplayIcon /> : <PlayArrowIcon />}
|
||||
</IconButton>
|
||||
);
|
||||
};
|
||||
|
||||
export default PlayOrResumeButton;
|
|
@ -0,0 +1,28 @@
|
|||
import React, { FC, useCallback } from 'react';
|
||||
import { IconButton } from '@mui/material';
|
||||
import TheatersIcon from '@mui/icons-material/Theaters';
|
||||
import { playbackManager } from 'components/playback/playbackmanager';
|
||||
import globalize from 'lib/globalize';
|
||||
import type { ItemDto } from 'types/base/models/item-dto';
|
||||
|
||||
interface PlayTrailerButtonProps {
|
||||
item?: ItemDto;
|
||||
}
|
||||
|
||||
const PlayTrailerButton: FC<PlayTrailerButtonProps> = ({ item }) => {
|
||||
const onPlayTrailerClick = useCallback(async () => {
|
||||
await playbackManager.playTrailers(item);
|
||||
}, [item]);
|
||||
|
||||
return (
|
||||
<IconButton
|
||||
className='button-flat btnPlayTrailer'
|
||||
title={globalize.translate('ButtonTrailer')}
|
||||
onClick={onPlayTrailerClick}
|
||||
>
|
||||
<TheatersIcon />
|
||||
</IconButton>
|
||||
);
|
||||
};
|
||||
|
||||
export default PlayTrailerButton;
|
|
@ -0,0 +1,29 @@
|
|||
import React, { FC, useCallback } from 'react';
|
||||
import { IconButton } from '@mui/material';
|
||||
import ShuffleIcon from '@mui/icons-material/Shuffle';
|
||||
|
||||
import { playbackManager } from 'components/playback/playbackmanager';
|
||||
import globalize from 'lib/globalize';
|
||||
import type { ItemDto } from 'types/base/models/item-dto';
|
||||
|
||||
interface ShuffleButtonProps {
|
||||
item: ItemDto;
|
||||
}
|
||||
|
||||
const ShuffleButton: FC<ShuffleButtonProps> = ({ item }) => {
|
||||
const shuffle = useCallback(() => {
|
||||
playbackManager.shuffle(item);
|
||||
}, [item]);
|
||||
|
||||
return (
|
||||
<IconButton
|
||||
title={globalize.translate('Shuffle')}
|
||||
className='button-flat btnShuffle'
|
||||
onClick={shuffle}
|
||||
>
|
||||
<ShuffleIcon />
|
||||
</IconButton>
|
||||
);
|
||||
};
|
||||
|
||||
export default ShuffleButton;
|
|
@ -0,0 +1,68 @@
|
|||
import React, { FC, useCallback } from 'react';
|
||||
import { IconButton } from '@mui/material';
|
||||
import CallSplitIcon from '@mui/icons-material/CallSplit';
|
||||
import { useQueryClient } from '@tanstack/react-query';
|
||||
import { useDeleteAlternateSources } from 'hooks/api/videosHooks';
|
||||
import globalize from 'lib/globalize';
|
||||
import confirm from 'components/confirm/confirm';
|
||||
import loading from 'components/loading/loading';
|
||||
import toast from 'components/toast/toast';
|
||||
|
||||
interface SplitVersionsButtonProps {
|
||||
paramId: string;
|
||||
queryKey?: string[];
|
||||
}
|
||||
|
||||
const SplitVersionsButton: FC<SplitVersionsButtonProps> = ({
|
||||
paramId,
|
||||
queryKey
|
||||
}) => {
|
||||
const queryClient = useQueryClient();
|
||||
const deleteAlternateSources = useDeleteAlternateSources();
|
||||
|
||||
const splitVersions = useCallback(() => {
|
||||
confirm({
|
||||
title: globalize.translate('HeaderSplitMediaApart'),
|
||||
text: globalize.translate('MessageConfirmSplitMediaSources')
|
||||
})
|
||||
.then(function () {
|
||||
loading.show();
|
||||
deleteAlternateSources.mutate(
|
||||
{
|
||||
itemId: paramId
|
||||
},
|
||||
{
|
||||
onSuccess: async () => {
|
||||
loading.hide();
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey
|
||||
});
|
||||
},
|
||||
onError: (err: unknown) => {
|
||||
loading.hide();
|
||||
toast(globalize.translate('MessageSplitVersionsError'));
|
||||
console.error(
|
||||
'[splitVersions] failed to split versions',
|
||||
err
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
})
|
||||
.catch(() => {
|
||||
// confirm dialog closed
|
||||
});
|
||||
}, [deleteAlternateSources, paramId, queryClient, queryKey]);
|
||||
|
||||
return (
|
||||
<IconButton
|
||||
className='button-flat btnSplitVersions'
|
||||
title={globalize.translate('ButtonSplit')}
|
||||
onClick={splitVersions}
|
||||
>
|
||||
<CallSplitIcon />
|
||||
</IconButton>
|
||||
);
|
||||
};
|
||||
|
||||
export default SplitVersionsButton;
|
|
@ -0,0 +1,62 @@
|
|||
import type { AxiosRequestConfig } from 'axios';
|
||||
import { getUserLibraryApi } from '@jellyfin/sdk/lib/utils/api/user-library-api';
|
||||
import { getLiveTvApi } from '@jellyfin/sdk/lib/utils/api/live-tv-api';
|
||||
import { useQuery } from '@tanstack/react-query';
|
||||
import { type JellyfinApiContext, useApi } from 'hooks/useApi';
|
||||
import type { ItemDto } from 'types/base/models/item-dto';
|
||||
import { ItemKind } from 'types/base/models/item-kind';
|
||||
|
||||
const getItemByType = async (
|
||||
apiContext: JellyfinApiContext,
|
||||
itemType: ItemKind,
|
||||
itemId: string,
|
||||
options?: AxiosRequestConfig
|
||||
) => {
|
||||
const { api, user } = apiContext;
|
||||
|
||||
if (!api) throw new Error('[getItemByType] No API instance available');
|
||||
if (!user?.Id) throw new Error('[getItemByType] No User ID provided');
|
||||
|
||||
let response;
|
||||
switch (itemType) {
|
||||
case ItemKind.Timer: {
|
||||
response = await getLiveTvApi(api).getTimer(
|
||||
{ timerId: itemId },
|
||||
options
|
||||
);
|
||||
break;
|
||||
}
|
||||
case ItemKind.SeriesTimer:
|
||||
response = await getLiveTvApi(api).getSeriesTimer(
|
||||
{ timerId: itemId },
|
||||
options
|
||||
);
|
||||
break;
|
||||
default: {
|
||||
response = await getUserLibraryApi(api).getItem(
|
||||
{ userId: user.Id, itemId },
|
||||
options
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return response.data as ItemDto;
|
||||
};
|
||||
|
||||
interface UseGetItemByTypeProps {
|
||||
itemType: ItemKind;
|
||||
itemId: string;
|
||||
}
|
||||
|
||||
export const useGetItemByType = ({
|
||||
itemType,
|
||||
itemId
|
||||
}: UseGetItemByTypeProps) => {
|
||||
const apiContext = useApi();
|
||||
return useQuery({
|
||||
queryKey: ['ItemByType', { itemType, itemId }],
|
||||
queryFn: ({ signal }) =>
|
||||
getItemByType(apiContext, itemType, itemId, { signal }),
|
||||
enabled: !!apiContext.api && !!apiContext.user?.Id && !!itemId
|
||||
});
|
||||
};
|
|
@ -351,12 +351,13 @@ export function getCommands(options) {
|
|||
return commands;
|
||||
}
|
||||
|
||||
function getResolveFunction(resolve, id, changed, deleted) {
|
||||
function getResolveFunction(resolve, commandId, changed, deleted, itemId) {
|
||||
return function () {
|
||||
resolve({
|
||||
command: id,
|
||||
command: commandId,
|
||||
updated: changed,
|
||||
deleted: deleted
|
||||
deleted: deleted,
|
||||
itemId: itemId
|
||||
});
|
||||
};
|
||||
}
|
||||
|
@ -533,7 +534,7 @@ function executeCommand(item, id, options) {
|
|||
getResolveFunction(resolve, id)();
|
||||
break;
|
||||
case 'delete':
|
||||
deleteItem(apiClient, item).then(getResolveFunction(resolve, id, true, true), getResolveFunction(resolve, id));
|
||||
deleteItem(apiClient, item).then(getResolveFunction(resolve, id, true, true, itemId), getResolveFunction(resolve, id));
|
||||
break;
|
||||
case 'share':
|
||||
navigator.share({
|
||||
|
|
|
@ -718,7 +718,7 @@ function setFieldVisibilities(context, item) {
|
|||
showElement('#fldDisplayOrder', context);
|
||||
hideElement('.seriesDisplayOrderDescription', context);
|
||||
|
||||
context.querySelector('#selectDisplayOrder').innerHTML = '<option value="SortName">' + globalize.translate('SortName') + '</option><option value="PremiereDate">' + globalize.translate('ReleaseDate') + '</option>';
|
||||
context.querySelector('#selectDisplayOrder').innerHTML = '<option value="Default">' + globalize.translate('DateModified') + '<option value="SortName">' + globalize.translate('SortName') + '</option><option value="PremiereDate">' + globalize.translate('ReleaseDate') + '</option>';
|
||||
} else if (item.Type === 'Series') {
|
||||
showElement('#fldDisplayOrder', context);
|
||||
showElement('.seriesDisplayOrderDescription', context);
|
||||
|
|
|
@ -2407,20 +2407,20 @@ class PlaybackManager {
|
|||
});
|
||||
}
|
||||
|
||||
function rankStreamType(prevIndex, prevSource, mediaSource, streamType, isSecondarySubtitle) {
|
||||
function rankStreamType(prevIndex, prevSource, mediaStreams, trackOptions, streamType, isSecondarySubtitle) {
|
||||
if (prevIndex == -1) {
|
||||
console.debug(`AutoSet ${streamType} - No Stream Set`);
|
||||
if (streamType == 'Subtitle') {
|
||||
if (isSecondarySubtitle) {
|
||||
mediaSource.DefaultSecondarySubtitleStreamIndex = -1;
|
||||
trackOptions.DefaultSecondarySubtitleStreamIndex = -1;
|
||||
} else {
|
||||
mediaSource.DefaultSubtitleStreamIndex = -1;
|
||||
trackOptions.DefaultSubtitleStreamIndex = -1;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!prevSource.MediaStreams || !mediaSource.MediaStreams) {
|
||||
if (!prevSource.MediaStreams || !mediaStreams) {
|
||||
console.debug(`AutoSet ${streamType} - No MediaStreams`);
|
||||
return;
|
||||
}
|
||||
|
@ -2446,7 +2446,7 @@ class PlaybackManager {
|
|||
}
|
||||
|
||||
let newRelIndex = 0;
|
||||
for (const stream of mediaSource.MediaStreams) {
|
||||
for (const stream of mediaStreams) {
|
||||
if (stream.Type != streamType) continue;
|
||||
|
||||
let score = 0;
|
||||
|
@ -2469,38 +2469,38 @@ class PlaybackManager {
|
|||
console.debug(`AutoSet ${streamType} - Using ${bestStreamIndex} score ${bestStreamScore}.`);
|
||||
if (streamType == 'Subtitle') {
|
||||
if (isSecondarySubtitle) {
|
||||
mediaSource.DefaultSecondarySubtitleStreamIndex = bestStreamIndex;
|
||||
trackOptions.DefaultSecondarySubtitleStreamIndex = bestStreamIndex;
|
||||
} else {
|
||||
mediaSource.DefaultSubtitleStreamIndex = bestStreamIndex;
|
||||
trackOptions.DefaultSubtitleStreamIndex = bestStreamIndex;
|
||||
}
|
||||
}
|
||||
if (streamType == 'Audio') {
|
||||
mediaSource.DefaultAudioStreamIndex = bestStreamIndex;
|
||||
trackOptions.DefaultAudioStreamIndex = bestStreamIndex;
|
||||
}
|
||||
} else {
|
||||
console.debug(`AutoSet ${streamType} - Threshold not met. Using default.`);
|
||||
}
|
||||
}
|
||||
|
||||
function autoSetNextTracks(prevSource, mediaSource, audio, subtitle) {
|
||||
function autoSetNextTracks(prevSource, mediaStreams, trackOptions, audio, subtitle) {
|
||||
try {
|
||||
if (!prevSource) return;
|
||||
|
||||
if (!mediaSource) {
|
||||
console.warn('AutoSet - No mediaSource');
|
||||
if (!mediaStreams) {
|
||||
console.warn('AutoSet - No mediaStreams');
|
||||
return;
|
||||
}
|
||||
|
||||
if (audio && typeof prevSource.DefaultAudioStreamIndex == 'number') {
|
||||
rankStreamType(prevSource.DefaultAudioStreamIndex, prevSource, mediaSource, 'Audio');
|
||||
rankStreamType(prevSource.DefaultAudioStreamIndex, prevSource, mediaStreams, trackOptions, 'Audio');
|
||||
}
|
||||
|
||||
if (subtitle && typeof prevSource.DefaultSubtitleStreamIndex == 'number') {
|
||||
rankStreamType(prevSource.DefaultSubtitleStreamIndex, prevSource, mediaSource, 'Subtitle');
|
||||
rankStreamType(prevSource.DefaultSubtitleStreamIndex, prevSource, mediaStreams, trackOptions, 'Subtitle');
|
||||
}
|
||||
|
||||
if (subtitle && typeof prevSource.DefaultSecondarySubtitleStreamIndex == 'number') {
|
||||
rankStreamType(prevSource.DefaultSecondarySubtitleStreamIndex, prevSource, mediaSource, 'Subtitle', true);
|
||||
rankStreamType(prevSource.DefaultSecondarySubtitleStreamIndex, prevSource, mediaStreams, trackOptions, 'Subtitle', true);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(`AutoSet - Caught unexpected error: ${e}`);
|
||||
|
@ -2572,12 +2572,18 @@ class PlaybackManager {
|
|||
});
|
||||
}
|
||||
|
||||
return Promise.all([promise, player.getDeviceProfile(item)]).then(function (responses) {
|
||||
const apiClient = ServerConnections.getApiClient(item.ServerId);
|
||||
const mediaSourceId = playOptions.mediaSourceId || item.Id;
|
||||
const getMediaStreams = apiClient.getItem(apiClient.getCurrentUserId(), mediaSourceId)
|
||||
.then(fullItem => {
|
||||
return fullItem.MediaStreams;
|
||||
});
|
||||
|
||||
return Promise.all([promise, player.getDeviceProfile(item), apiClient.getCurrentUser(), getMediaStreams]).then(function (responses) {
|
||||
const deviceProfile = responses[1];
|
||||
const user = responses[2];
|
||||
const mediaStreams = responses[3];
|
||||
|
||||
const apiClient = ServerConnections.getApiClient(item.ServerId);
|
||||
|
||||
const mediaSourceId = playOptions.mediaSourceId;
|
||||
const audioStreamIndex = playOptions.audioStreamIndex;
|
||||
const subtitleStreamIndex = playOptions.subtitleStreamIndex;
|
||||
const options = {
|
||||
|
@ -2600,9 +2606,20 @@ class PlaybackManager {
|
|||
// this reference was only needed by sendPlaybackListToPlayer
|
||||
playOptions.items = null;
|
||||
|
||||
const trackOptions = {};
|
||||
|
||||
autoSetNextTracks(prevSource, mediaStreams, trackOptions, user.Configuration.RememberAudioSelections, user.Configuration.RememberSubtitleSelections);
|
||||
if (trackOptions.DefaultAudioStreamIndex != null) {
|
||||
options.audioStreamIndex = trackOptions.DefaultAudioStreamIndex;
|
||||
}
|
||||
if (trackOptions.DefaultSubtitleStreamIndex != null) {
|
||||
options.subtitleStreamIndex = trackOptions.DefaultSubtitleStreamIndex;
|
||||
}
|
||||
|
||||
return getPlaybackMediaSource(player, apiClient, deviceProfile, item, mediaSourceId, options).then(async (mediaSource) => {
|
||||
const user = await apiClient.getCurrentUser();
|
||||
autoSetNextTracks(prevSource, mediaSource, user.Configuration.RememberAudioSelections, user.Configuration.RememberSubtitleSelections);
|
||||
if (trackOptions.DefaultSecondarySubtitleStreamIndex != null) {
|
||||
mediaSource.DefaultSecondarySubtitleStreamIndex = trackOptions.DefaultSecondarySubtitleStreamIndex;
|
||||
}
|
||||
|
||||
if (mediaSource.DefaultSubtitleStreamIndex == null || mediaSource.DefaultSubtitleStreamIndex < 0) {
|
||||
mediaSource.DefaultSubtitleStreamIndex = mediaSource.DefaultSecondarySubtitleStreamIndex;
|
||||
|
|
|
@ -31,11 +31,16 @@ export default function (view, params, tabContent, options) {
|
|||
}
|
||||
|
||||
function shuffle() {
|
||||
ApiClient.getItem(
|
||||
ApiClient.getCurrentUserId(),
|
||||
params.topParentId
|
||||
).then((item) => {
|
||||
playbackManager.shuffle(item);
|
||||
isLoading = true;
|
||||
loading.show();
|
||||
const newQuery = { ...query, SortBy: 'Random', StartIndex: 0, Limit: 300 };
|
||||
return ApiClient.getItems(ApiClient.getCurrentUserId(), newQuery).then(({ Items }) => {
|
||||
playbackManager.play({
|
||||
items: Items,
|
||||
autoplay: true
|
||||
});
|
||||
}).finally(() => {
|
||||
isLoading = false;
|
||||
});
|
||||
}
|
||||
|
||||
|
|
1
src/hooks/api/libraryHooks/index.ts
Normal file
1
src/hooks/api/libraryHooks/index.ts
Normal file
|
@ -0,0 +1 @@
|
|||
export * from './useGetDownload';
|
34
src/hooks/api/libraryHooks/useGetDownload.ts
Normal file
34
src/hooks/api/libraryHooks/useGetDownload.ts
Normal file
|
@ -0,0 +1,34 @@
|
|||
import type { AxiosRequestConfig } from 'axios';
|
||||
import type { LibraryApiGetDownloadRequest } from '@jellyfin/sdk/lib/generated-client';
|
||||
import { getLibraryApi } from '@jellyfin/sdk/lib/utils/api/library-api';
|
||||
import { queryOptions, useQuery } from '@tanstack/react-query';
|
||||
import { type JellyfinApiContext, useApi } from 'hooks/useApi';
|
||||
|
||||
const getDownload = async (
|
||||
apiContext: JellyfinApiContext,
|
||||
params: LibraryApiGetDownloadRequest,
|
||||
options?: AxiosRequestConfig
|
||||
) => {
|
||||
const { api, user } = apiContext;
|
||||
|
||||
if (!api) throw new Error('[getDownload] No API instance available');
|
||||
if (!user?.Id) throw new Error('[getDownload] No User ID provided');
|
||||
|
||||
const response = await getLibraryApi(api).getDownload(params, options);
|
||||
return response.data;
|
||||
};
|
||||
|
||||
export const getDownloadQuery = (
|
||||
apiContext: JellyfinApiContext,
|
||||
params: LibraryApiGetDownloadRequest
|
||||
) =>
|
||||
queryOptions({
|
||||
queryKey: ['Download', params.itemId],
|
||||
queryFn: ({ signal }) => getDownload(apiContext, params, { signal }),
|
||||
enabled: !!apiContext.api && !!apiContext.user?.Id && !!params.itemId
|
||||
});
|
||||
|
||||
export const useGetDownload = (params: LibraryApiGetDownloadRequest) => {
|
||||
const apiContext = useApi();
|
||||
return useQuery(getDownloadQuery(apiContext, params));
|
||||
};
|
5
src/hooks/api/liveTvHooks/index.ts
Normal file
5
src/hooks/api/liveTvHooks/index.ts
Normal file
|
@ -0,0 +1,5 @@
|
|||
export * from './useCancelSeriesTimer';
|
||||
export * from './useCancelTimer';
|
||||
export * from './useGetChannel';
|
||||
export * from './useGetSeriesTimer';
|
||||
export * from './useGetTimer';
|
24
src/hooks/api/liveTvHooks/useCancelSeriesTimer.ts
Normal file
24
src/hooks/api/liveTvHooks/useCancelSeriesTimer.ts
Normal file
|
@ -0,0 +1,24 @@
|
|||
import type { LiveTvApiCancelSeriesTimerRequest } from '@jellyfin/sdk/lib/generated-client';
|
||||
import { getLiveTvApi } from '@jellyfin/sdk/lib/utils/api/live-tv-api';
|
||||
import { useMutation } from '@tanstack/react-query';
|
||||
import { type JellyfinApiContext, useApi } from 'hooks/useApi';
|
||||
|
||||
const cancelSeriesTimer = async (
|
||||
apiContext: JellyfinApiContext,
|
||||
params: LiveTvApiCancelSeriesTimerRequest
|
||||
) => {
|
||||
const { api } = apiContext;
|
||||
|
||||
if (!api) throw new Error('[cancelSeriesTimer] No API instance available');
|
||||
|
||||
const response = await getLiveTvApi(api).cancelSeriesTimer(params);
|
||||
return response.data;
|
||||
};
|
||||
|
||||
export const useCancelSeriesTimer = () => {
|
||||
const apiContext = useApi();
|
||||
return useMutation({
|
||||
mutationFn: (params: LiveTvApiCancelSeriesTimerRequest) =>
|
||||
cancelSeriesTimer(apiContext, params)
|
||||
});
|
||||
};
|
24
src/hooks/api/liveTvHooks/useCancelTimer.ts
Normal file
24
src/hooks/api/liveTvHooks/useCancelTimer.ts
Normal file
|
@ -0,0 +1,24 @@
|
|||
import type { LiveTvApiCancelTimerRequest } from '@jellyfin/sdk/lib/generated-client';
|
||||
import { getLiveTvApi } from '@jellyfin/sdk/lib/utils/api/live-tv-api';
|
||||
import { useMutation } from '@tanstack/react-query';
|
||||
import { type JellyfinApiContext, useApi } from 'hooks/useApi';
|
||||
|
||||
const cancelTimer = async (
|
||||
apiContext: JellyfinApiContext,
|
||||
params: LiveTvApiCancelTimerRequest
|
||||
) => {
|
||||
const { api } = apiContext;
|
||||
|
||||
if (!api) throw new Error('[cancelTimer] No API instance available');
|
||||
|
||||
const response = await getLiveTvApi(api).cancelTimer(params);
|
||||
return response.data;
|
||||
};
|
||||
|
||||
export const useCancelTimer = () => {
|
||||
const apiContext = useApi();
|
||||
return useMutation({
|
||||
mutationFn: (params: LiveTvApiCancelTimerRequest) =>
|
||||
cancelTimer(apiContext, params)
|
||||
});
|
||||
};
|
41
src/hooks/api/liveTvHooks/useGetChannel.ts
Normal file
41
src/hooks/api/liveTvHooks/useGetChannel.ts
Normal file
|
@ -0,0 +1,41 @@
|
|||
import type { AxiosRequestConfig } from 'axios';
|
||||
import type { LiveTvApiGetChannelRequest } from '@jellyfin/sdk/lib/generated-client';
|
||||
import { getLiveTvApi } from '@jellyfin/sdk/lib/utils/api/live-tv-api';
|
||||
import { queryOptions, useQuery } from '@tanstack/react-query';
|
||||
import { type JellyfinApiContext, useApi } from 'hooks/useApi';
|
||||
|
||||
const getChannel = async (
|
||||
apiContext: JellyfinApiContext,
|
||||
params: LiveTvApiGetChannelRequest,
|
||||
options?: AxiosRequestConfig
|
||||
) => {
|
||||
const { api, user } = apiContext;
|
||||
|
||||
if (!api) throw new Error('[getChannel] No API instance available');
|
||||
if (!user?.Id) throw new Error('[getChannel] No User ID provided');
|
||||
|
||||
const response = await getLiveTvApi(api).getChannel(
|
||||
{
|
||||
userId: user.Id,
|
||||
...params
|
||||
},
|
||||
options
|
||||
);
|
||||
return response.data;
|
||||
};
|
||||
|
||||
export const getChannelQuery = (
|
||||
apiContext: JellyfinApiContext,
|
||||
params: LiveTvApiGetChannelRequest
|
||||
) =>
|
||||
queryOptions({
|
||||
queryKey: ['Channel', params.channelId],
|
||||
queryFn: ({ signal }) => getChannel(apiContext, params, { signal }),
|
||||
enabled:
|
||||
!!apiContext.api && !!apiContext.user?.Id && !!params.channelId
|
||||
});
|
||||
|
||||
export const useGetChannel = (params: LiveTvApiGetChannelRequest) => {
|
||||
const apiContext = useApi();
|
||||
return useQuery(getChannelQuery(apiContext, params));
|
||||
};
|
35
src/hooks/api/liveTvHooks/useGetSeriesTimer.ts
Normal file
35
src/hooks/api/liveTvHooks/useGetSeriesTimer.ts
Normal file
|
@ -0,0 +1,35 @@
|
|||
import type { AxiosRequestConfig } from 'axios';
|
||||
import type { LiveTvApiGetSeriesTimerRequest } from '@jellyfin/sdk/lib/generated-client';
|
||||
import { getLiveTvApi } from '@jellyfin/sdk/lib/utils/api/live-tv-api';
|
||||
import { queryOptions, useQuery } from '@tanstack/react-query';
|
||||
import { type JellyfinApiContext, useApi } from 'hooks/useApi';
|
||||
|
||||
const getSeriesTimer = async (
|
||||
apiContext: JellyfinApiContext,
|
||||
params: LiveTvApiGetSeriesTimerRequest,
|
||||
options?: AxiosRequestConfig
|
||||
) => {
|
||||
const { api } = apiContext;
|
||||
|
||||
if (!api) throw new Error('[getSeriesTimer] No API instance available');
|
||||
|
||||
const response = await getLiveTvApi(api).getSeriesTimer(params, options);
|
||||
return response.data;
|
||||
};
|
||||
|
||||
export const getSeriesTimerQuery = (
|
||||
apiContext: JellyfinApiContext,
|
||||
params: LiveTvApiGetSeriesTimerRequest
|
||||
) =>
|
||||
queryOptions({
|
||||
queryKey: ['SeriesTimer', params.timerId],
|
||||
queryFn: ({ signal }) => getSeriesTimer(apiContext, params, { signal }),
|
||||
enabled: !!apiContext.api && !!apiContext.user?.Id && !!params.timerId
|
||||
});
|
||||
|
||||
export const useGetSeriesTimer = (
|
||||
requestParameters: LiveTvApiGetSeriesTimerRequest
|
||||
) => {
|
||||
const apiContext = useApi();
|
||||
return useQuery(getSeriesTimerQuery(apiContext, requestParameters));
|
||||
};
|
33
src/hooks/api/liveTvHooks/useGetTimer.ts
Normal file
33
src/hooks/api/liveTvHooks/useGetTimer.ts
Normal file
|
@ -0,0 +1,33 @@
|
|||
import type { AxiosRequestConfig } from 'axios';
|
||||
import type { LiveTvApiGetTimerRequest } from '@jellyfin/sdk/lib/generated-client';
|
||||
import { getLiveTvApi } from '@jellyfin/sdk/lib/utils/api/live-tv-api';
|
||||
import { queryOptions, useQuery } from '@tanstack/react-query';
|
||||
import { type JellyfinApiContext, useApi } from 'hooks/useApi';
|
||||
|
||||
const getTimer = async (
|
||||
currentApi: JellyfinApiContext,
|
||||
params: LiveTvApiGetTimerRequest,
|
||||
options?: AxiosRequestConfig
|
||||
) => {
|
||||
const { api } = currentApi;
|
||||
|
||||
if (!api) throw new Error('[getTimer] No API instance available');
|
||||
|
||||
const response = await getLiveTvApi(api).getTimer(params, options);
|
||||
return response.data;
|
||||
};
|
||||
|
||||
export const getTimerQuery = (
|
||||
apiContext: JellyfinApiContext,
|
||||
params: LiveTvApiGetTimerRequest
|
||||
) =>
|
||||
queryOptions({
|
||||
queryKey: ['Timer', params.timerId],
|
||||
queryFn: ({ signal }) => getTimer(apiContext, params, { signal }),
|
||||
enabled: !!apiContext.api && !!apiContext.user?.Id && !!params.timerId
|
||||
});
|
||||
|
||||
export const useGetTimer = (requestParameters: LiveTvApiGetTimerRequest) => {
|
||||
const apiContext = useApi();
|
||||
return useQuery(getTimerQuery(apiContext, requestParameters));
|
||||
};
|
1
src/hooks/api/videosHooks/index.ts
Normal file
1
src/hooks/api/videosHooks/index.ts
Normal file
|
@ -0,0 +1 @@
|
|||
export * from './useDeleteAlternateSources';
|
24
src/hooks/api/videosHooks/useDeleteAlternateSources.ts
Normal file
24
src/hooks/api/videosHooks/useDeleteAlternateSources.ts
Normal file
|
@ -0,0 +1,24 @@
|
|||
import type { VideosApiDeleteAlternateSourcesRequest } from '@jellyfin/sdk/lib/generated-client';
|
||||
import { getVideosApi } from '@jellyfin/sdk/lib/utils/api/videos-api';
|
||||
import { useMutation } from '@tanstack/react-query';
|
||||
import { type JellyfinApiContext, useApi } from 'hooks/useApi';
|
||||
|
||||
const deleteAlternateSources = async (
|
||||
apiContext: JellyfinApiContext,
|
||||
params: VideosApiDeleteAlternateSourcesRequest
|
||||
) => {
|
||||
const { api } = apiContext;
|
||||
|
||||
if (!api) throw new Error('[deleteAlternateSources] No API instance available');
|
||||
|
||||
const response = await getVideosApi(api).deleteAlternateSources(params);
|
||||
return response.data;
|
||||
};
|
||||
|
||||
export const useDeleteAlternateSources = () => {
|
||||
const apiContext = useApi();
|
||||
return useMutation({
|
||||
mutationFn: (params: VideosApiDeleteAlternateSourcesRequest) =>
|
||||
deleteAlternateSources(apiContext, params)
|
||||
});
|
||||
};
|
|
@ -326,5 +326,10 @@
|
|||
"ColorPrimaries": "কালার প্রাইমারি",
|
||||
"AllowCollectionManagement": "এই ব্যবহারকারীকে কালেকশন্স গুলি পরিচালনা করার অনুমতি দিন",
|
||||
"AllowSegmentDeletion": "অংশগুলি মুছে ফেলুন",
|
||||
"AllowSegmentDeletionHelp": "পুরানো বিভাগগুলি ক্লায়েন্টের কাছে পাঠানোর পরে মুছে ফেলুন। এটি ডিস্কে পুরো ট্রান্সকোডেড ফাইল সংরক্ষণ করতে বাধা দেয়। এটি কেবল থ্রোটলিং সক্ষম করে কাজ করবে। আপনি যদি প্লেব্যাক সমস্যার সম্মুখীন হন তবে এটি বন্ধ করুন।"
|
||||
"AllowSegmentDeletionHelp": "পুরানো বিভাগগুলি ক্লায়েন্টের কাছে পাঠানোর পরে মুছে ফেলুন। এটি ডিস্কে পুরো ট্রান্সকোডেড ফাইল সংরক্ষণ করতে বাধা দেয়। এটি কেবল থ্রোটলিং সক্ষম করে কাজ করবে। আপনি যদি প্লেব্যাক সমস্যার সম্মুখীন হন তবে এটি বন্ধ করুন।",
|
||||
"AirPlay": "এয়ারপ্লে",
|
||||
"AllowContentWithTagsHelp": "শুধুমাত্র নির্দিষ্ট ট্যাগগুলির মধ্যে অন্তত একটি সহ মিডিয়া দেখান।",
|
||||
"Alternate": "বিকল্প",
|
||||
"AllowSubtitleManagement": "এই ব্যবহারকারীকে সাবটাইটেল সম্পাদনা করার অনুমতি দিন",
|
||||
"AllowFmp4TranscodingContainerHelp": "HEVC এবং HDR বিষয়বস্তু সক্ষম করতে এই টিউনারটির জন্য fMP4 ট্রান্সকোডিং কন্টেইনারকে অনুমতি দিন। সমস্ত টিউনার এই ধারকটির সাথে সামঞ্জস্যপূর্ণ নয়৷ আপনি যদি প্লেব্যাক সমস্যা অনুভব করেন তবে এটি অক্ষম করুন।"
|
||||
}
|
||||
|
|
|
@ -1858,7 +1858,7 @@
|
|||
"LabelEncodingFormatOptions": "Možnosti formátu kódování",
|
||||
"EncodingFormatHelp": "Vyberte formát, do kterého by měly být překódovány videa. Pokud není k dispozici hardwarová akcelerace pro vybraný formát, bude použito softwarové kódování. Kódování do formátu H.264 bude vždy povoleno.",
|
||||
"LabelTrickplayAccelEncoding": "Povolit hardwarově akcelerované kódování MJPEG",
|
||||
"LabelTrickplayAccelEncodingHelp": "Tato možnost je momentálně dostupná pouze při použití QSV, VAAPI a VideoToolbox. Nemá vliv na ostatní hardwarovou akceleraci.",
|
||||
"LabelTrickplayAccelEncodingHelp": "Tato možnost je momentálně dostupná pouze při použití QSV, VA-API, VideoToolbox a RKMPP. Nemá vliv na ostatní hardwarovou akceleraci.",
|
||||
"EnableLibrary": "Povolit knihovnu",
|
||||
"EnableLibraryHelp": "Vypnutím knihovny ji skryjete ze všech míst, kde je uživateli zobrazena.",
|
||||
"ConfirmDeleteLyrics": "Písně budou odstraněny ze systému i knihovny médií. Opravdu chcete pokračovat?",
|
||||
|
@ -1950,5 +1950,22 @@
|
|||
"AllowFmp4TranscodingContainerHelp": "Povolením kontejneru fMP4 pro překódování umožníte tomuto tuneru pracovat s obsahem ve formátu HEVC a s HDR. Kompatibilní jsou jen některé tunery. Pokud máte potíže s přehráváním, tuto možnost vypněte.",
|
||||
"LabelSaveTrickplayLocally": "Uložit obrázky trickplay k médiím",
|
||||
"LabelSaveTrickplayLocallyHelp": "Uložením obrázků trickplay do složek s médii se usnadní jejich přesun a přístup k nim.",
|
||||
"ReplaceTrickplayImages": "Nahradit existující obrázky trickplay"
|
||||
"ReplaceTrickplayImages": "Nahradit existující obrázky trickplay",
|
||||
"MessageCancelSeriesTimerError": "Při rušení časovače seriálu došlo k chybě",
|
||||
"DateModified": "Datum upravení",
|
||||
"LabelAudioTagSettings": "Nastavení zvukových značek",
|
||||
"LabelCustomTagDelimiters": "Vlastní oddělovač značek",
|
||||
"LabelCustomTagDelimitersHelp": "Znaky, které budou považovány za oddělovače značek.",
|
||||
"LabelDelimiterWhitelistHelp": "Položky, které budou vyloučeny z rozdělování značek. Každý řádek je jedna položka.",
|
||||
"LabelDelimiterWhitelist": "Seznam výjimek při oddělování",
|
||||
"LabelLyricDownloaders": "Stahovače textů písní",
|
||||
"LyricDownloadersHelp": "Povolit a seřadit své stahovače textů písní podle preferovaného pořadí.",
|
||||
"MessageCancelTimerError": "Při rušení časovače došlo k chybě",
|
||||
"MessageSplitVersionsError": "Při rozdělování verzí došlo k chybě",
|
||||
"PreferNonstandardArtistsTag": "Preferovat značku ARTISTS, pokud existuje",
|
||||
"PreferNonstandardArtistsTagHelp": "Použít nestandardní značku ARTISTS místo ARTIST, pokud je k dispozici.",
|
||||
"RenderPgsSubtitle": "Experimentální rendrování titulků ve formátu PGS",
|
||||
"RenderPgsSubtitleHelp": "Zda má klient zobrazit titulky ve formátu PGS místo jejich vypálení do obrazu. Můžete se tak vyhnout překódování na serveru výměnou za horší výkon klienta.",
|
||||
"UseCustomTagDelimiters": "Použít vlastní oddělovač značek",
|
||||
"UseCustomTagDelimitersHelp": "Rozdělit značky pro umělce a žánry pomocí vlastních znaků."
|
||||
}
|
||||
|
|
|
@ -134,8 +134,8 @@
|
|||
"Disc": "Disk",
|
||||
"Disconnect": "Verbindung trennen",
|
||||
"Display": "Anzeige",
|
||||
"DisplayInMyMedia": "Auf Homescreen anzeigen",
|
||||
"DisplayInOtherHomeScreenSections": "Bereiche wie 'Neueste Medien' oder 'Weiterschauen' auf dem Homescreen anzeigen",
|
||||
"DisplayInMyMedia": "Auf Startbildschirm anzeigen",
|
||||
"DisplayInOtherHomeScreenSections": "Bereiche wie 'Neueste Medien' oder 'Weiterschauen' auf dem Startbildschirm anzeigen",
|
||||
"DisplayMissingEpisodesWithinSeasons": "Fehlende Folgen innerhalb von Staffeln anzeigen",
|
||||
"DisplayMissingEpisodesWithinSeasonsHelp": "Dies muss in den Servereinstellungen auch für TV-Bibliotheken aktiviert werden.",
|
||||
"DisplayModeHelp": "Wähle den für die Oberfläche zu verwendenden Layoutstil.",
|
||||
|
@ -1954,5 +1954,14 @@
|
|||
"ReplaceTrickplayImages": "Ersetzen vorhandener Trickplay-Bilder",
|
||||
"LabelSaveTrickplayLocally": "Trickplay-Bilder bei den Medien speichern",
|
||||
"LabelSaveTrickplayLocallyHelp": "Wenn Sie Trickplay-Bilder in Medienordnern speichern, werden sie bei Ihren Medien abgelegt und ermöglichen so eine einfache Migration und den Zugriff.",
|
||||
"RenderPgsSubtitle": "Experimentelles PGS-Untertitel-Rendering"
|
||||
"RenderPgsSubtitle": "Experimentelles PGS-Untertitel-Rendering",
|
||||
"LabelAudioTagSettings": "Audio-Tag Einstellungen",
|
||||
"LabelCustomTagDelimitersHelp": "Zeichen die zur Trennung von Tags verwendet werden sollen.",
|
||||
"LabelDelimiterWhitelistHelp": "Artikel, die vom Tag-Splitting ausgeschlossen werden sollen. Ein Artikel pro Zeile.",
|
||||
"PreferNonstandardArtistsTag": "Bevorzuge KÜNSTLER-Tag, falls vorhanden",
|
||||
"PreferNonstandardArtistsTagHelp": "Verwenden Sie den nicht standardisierten ARTISTS-Tag anstelle des ARTIST-Tags, sofern verfügbar.",
|
||||
"UseCustomTagDelimitersHelp": "Trennen Sie Künstler-/Genre-Tags mit benutzerdefinierten Zeichen.",
|
||||
"LabelCustomTagDelimiters": "Benutzerdefinierte Tag-Begrenzung",
|
||||
"LabelDelimiterWhitelist": "Trennzeichen Whitelist",
|
||||
"UseCustomTagDelimiters": "Benutzerdefinierte Tag-Begrenzung verwenden"
|
||||
}
|
||||
|
|
|
@ -191,6 +191,7 @@
|
|||
"DailyAt": "Daily at {0}",
|
||||
"Data": "Data",
|
||||
"DateAdded": "Date added",
|
||||
"DateModified": "Date modified",
|
||||
"DatePlayed": "Date played",
|
||||
"DeathDateValue": "Died: {0}",
|
||||
"Default": "Default",
|
||||
|
@ -1067,6 +1068,8 @@
|
|||
"MessageAreYouSureDeleteSubtitles": "Are you sure you wish to delete this subtitle file?",
|
||||
"MessageAreYouSureYouWishToRemoveMediaFolder": "Are you sure you wish to remove this media folder?",
|
||||
"MessageBrowsePluginCatalog": "Browse our plugin catalog to view available plugins.",
|
||||
"MessageCancelSeriesTimerError": "An error occurred while canceling the series timer",
|
||||
"MessageCancelTimerError": "An error occurred while canceling the timer",
|
||||
"MessageChangeRecordingPath": "Changing your recording folder will not migrate existing recordings from the old location to the new. You'll need to move them manually if desired.",
|
||||
"MessageConfirmAppExit": "Do you want to exit?",
|
||||
"MessageConfirmDeleteGuideProvider": "Are you sure you wish to delete this guide provider?",
|
||||
|
@ -1119,6 +1122,7 @@
|
|||
"MessageRenameMediaFolder": "Renaming a media library will cause all metadata to be lost, proceed with caution.",
|
||||
"MessageRepositoryInstallDisclaimer": "WARNING: Installing a third party plugin repository carries risks. It may contain unstable or malicious code, and may change at any time. Only install repositories from authors that you trust.",
|
||||
"MessageSent": "Message sent.",
|
||||
"MessageSplitVersionsError": "An error occurred while splitting versions",
|
||||
"MessageSyncPlayCreateGroupDenied": "Permission required to create a group.",
|
||||
"MessageSyncPlayDisabled": "SyncPlay disabled.",
|
||||
"MessageSyncPlayEnabled": "SyncPlay enabled.",
|
||||
|
|
|
@ -1938,5 +1938,18 @@
|
|||
"PriorityNormal": "Normaalväärtus",
|
||||
"PriorityAboveNormal": "Üle normaalväärtuse",
|
||||
"LabelTileWidthHelp": "Piltide maksimaalne arv ühe ruudu kohta X-suunas.",
|
||||
"ExtractTrickplayImagesHelp": "Trickplay-pildid on sarnased peatükkide piltidega, kuid need hõlmavad kogu sisu. Neid kasutatakse videote skriinimisel eelvaate kuvamiseks."
|
||||
"ExtractTrickplayImagesHelp": "Trickplay-pildid on sarnased peatükkide piltidega, kuid need hõlmavad kogu sisu. Neid kasutatakse videote skriinimisel eelvaate kuvamiseks.",
|
||||
"LabelDelimiterWhitelistHelp": "Üksused, mida siltideks jagamisel ignoreeritakse. Iga üksus omaette real.",
|
||||
"PreferNonstandardArtistsTag": "Eelista ARTISTS silti kui see saadaval on",
|
||||
"LabelAudioTagSettings": "Audiosiltide seadistused",
|
||||
"DateModified": "Muutmiskuupäev",
|
||||
"LabelCustomTagDelimiters": "Kohandatud siltide eraldaja",
|
||||
"LabelCustomTagDelimitersHelp": "Tähemärgid mida kasutatakse siltide eraldajana.",
|
||||
"LabelDelimiterWhitelist": "Lubatud eraldusmärgid",
|
||||
"MessageCancelSeriesTimerError": "Sarja taimeri tühistamisel ilmnes viga",
|
||||
"MessageCancelTimerError": "Taimeri tühistamisel ilmnes viga",
|
||||
"MessageSplitVersionsError": "Versioonideks jagamisel tekkis viga",
|
||||
"PreferNonstandardArtistsTagHelp": "Kasuta ARTIST sildi asemel ebastandartset ARTISTS silti kui see saadaval on.",
|
||||
"UseCustomTagDelimiters": "Kasuta kohandatud siltide eraldajat",
|
||||
"UseCustomTagDelimitersHelp": "Kasuta siltideks jagamisel kohandatud tähemärke."
|
||||
}
|
||||
|
|
|
@ -1860,7 +1860,7 @@
|
|||
"PlaybackError.NO_MEDIA_ERROR": "Impossible de trouver une source multimédia valide à lire.",
|
||||
"PlaybackError.PLAYER_ERROR": "La lecture a échoué en raison d'une erreur fatale du lecteur.",
|
||||
"LabelTrickplayAccelEncoding": "Activer l'encodage MJPEG accéléré par le matériel",
|
||||
"LabelTrickplayAccelEncodingHelp": "Actuellement disponible uniquement sur QSV et VAAPI, cette option n'a aucun effet sur les autres méthodes d'accélération matérielle.",
|
||||
"LabelTrickplayAccelEncodingHelp": "Actuellement disponible uniquement avec QSV, VA-API, VideoToolbox et RKMPP, cette option n'a aucun effet sur les autres méthodes d'accélération matérielle.",
|
||||
"ErrorDeletingLyrics": "Une erreur est survenu lors de la suppression des paroles du serveur. S'il vous plaît verifier que Jellyfin peut modifier les fichier dans le dossier multimedia et réessayez.",
|
||||
"HeaderDeleteLyrics": "Suppression des paroles",
|
||||
"ConfirmDeleteLyrics": "En supprimant ces paroles vous les supprimez a la fois de votre systeme de fichier et de votre bibliothèque. Êtes vous sure de vouloir continuez ?",
|
||||
|
@ -1928,5 +1928,7 @@
|
|||
"HeaderUploadLyrics": "Téléverser des paroles",
|
||||
"DisableVbrAudioEncodingHelp": "Empêche le serveur d'encoder l'audio avec VBR pour ce client.",
|
||||
"EnableHi10p": "Active le profil H.264 High 10",
|
||||
"EnableHi10pHelp": "Activer pour éviter l'encodage des vidéos H.264 10-bits. Désactiver cette option si la vidéo affiche des images vides."
|
||||
"EnableHi10pHelp": "Activer pour éviter l'encodage des vidéos H.264 10-bits. Désactiver cette option si la vidéo affiche des images vides.",
|
||||
"AlwaysRemuxFlacAudioFilesHelp": "Si votre navigateur refuse de lire des fichiers ou s'il calcule incorrectement l'horodatage, activer ceci en guise d'alternative.",
|
||||
"AlwaysRemuxMp3AudioFilesHelp": "Si votre navigateur calcule incorrectement l'horodatage de certains fichiers, activer ceci en guise d'alternative."
|
||||
}
|
||||
|
|
|
@ -1868,5 +1868,10 @@
|
|||
"Creator": "Készítő",
|
||||
"Editor": "Szerkesztő",
|
||||
"EnableDtsHelp": "Csak akkor engedélyezze, hogyha az eszköze támogatja a DTS-t vagy ha csatlakoztatott egy megfelelő audió vevőkészüléket. Ellenkező esetben visszajátszási problémákat okozhat.",
|
||||
"Author": "Szerző"
|
||||
"Author": "Szerző",
|
||||
"AllowStreamSharingHelp": "Engedélyezés, hogy a Jellyfin megkettőzze a tunerből származó mpegts adatfolyamot, és megossza azt a kliensekkel. Ez akkor hasznos, ha a tuner korlátozott számú adatfolyamot támogat, de ez egyéb lejátszási problémákat okozhat.",
|
||||
"AllowFmp4TranscodingContainerHelp": "Az fMP4 átkódolási konténer engedélyezése ehhez a tunerhez, a HEVC és HDR tartalmak engedélyezéséhez. Nem minden tuner kompatibilis ezzel a tárolóval. Tiltsa le, ha lejátszási problémákat tapasztal.",
|
||||
"Alternate": "Alternatív",
|
||||
"AlternateDVD": "Alternatív DVD",
|
||||
"AllowTonemappingSoftwareHelp": "A tónusleképzés képes a HDR videók dinamika tartományát SDR tartományba átalakítani, miközben megtartja a kép színét és részleteit, ami elengedhetetlen az eredeti jelenet megőrzéséhez. Jelenleg csak 10 bites HDR10, HLG és DoVi tartalmakon működik."
|
||||
}
|
||||
|
|
|
@ -1943,5 +1943,8 @@
|
|||
"EnableHi10pHelp": "Abilita per evitare la transcodifica dei video H.264 a 10 bit. Disabilitare quest'opzione se il video mostra fotogrammi vuoti.",
|
||||
"LabelSaveTrickplayLocally": "Salva le immagini trickplay accanto ai media",
|
||||
"LabelSaveTrickplayLocallyHelp": "Salvare le immagini trickplay nella stessa cartella del video ti permetterà di spostarle e accederle più facilmente.",
|
||||
"ReplaceTrickplayImages": "Sostituisci le immagini trickplay"
|
||||
"ReplaceTrickplayImages": "Sostituisci le immagini trickplay",
|
||||
"FallbackMaxStreamingBitrateHelp": "Il bitrate massimo dello streaming viene utilizzato quando ffprobe non è in grado di determinare il bitrate sorgente. Ciò aiuta a impedire che i client richiedano un bitrate di transcodifica troppo alto che potrebbe causare il fallimento del player e il sovraccarico dell'encoder.",
|
||||
"LabelFallbackMaxStreamingBitrate": "Bitrate massimo di ripiego (Mbps)",
|
||||
"DateModified": "Data di modifica"
|
||||
}
|
||||
|
|
|
@ -1011,7 +1011,7 @@
|
|||
"Filters": "Filtre",
|
||||
"HeaderExternalIds": "Eksterne IDer",
|
||||
"HeaderFetcherSettings": "Henteinnstillinger",
|
||||
"TabServer": "Server",
|
||||
"TabServer": "Tjener",
|
||||
"TabStreaming": "Strømming",
|
||||
"TagsValue": "Tagger: {0}",
|
||||
"ThemeSongs": "Temamusikk",
|
||||
|
@ -1949,5 +1949,14 @@
|
|||
"LabelWidthResolutionsHelp": "Kommaseparert liste over breddene (px) som trickplay-bilder vil bli generert med. Alle bilder skal genereres proporsjonalt med kilden, så en bredde på 320 på en 16:9-video ender opp på rundt 320x180.",
|
||||
"LabelTileWidthHelp": "Maksimalt antall bilder per rad i X-retningen.",
|
||||
"LabelTileHeightHelp": "Maksimalt antall bilder per kolonne i Y-retningen.",
|
||||
"LabelJpegQualityHelp": "JPEG-komprimeringskvaliteten for trickplay-bilder."
|
||||
"LabelJpegQualityHelp": "JPEG-komprimeringskvaliteten for trickplay-bilder.",
|
||||
"LabelAudioTagSettings": "Innstillinger for lydtager",
|
||||
"LabelCustomTagDelimiters": "Egendefinert skilletegn for tagger",
|
||||
"LabelCustomTagDelimitersHelp": "Tegn som skal behandles som skilletegn for å separere tagger.",
|
||||
"LabelDelimiterWhitelist": "Hviteliste for skilletegn",
|
||||
"LabelDelimiterWhitelistHelp": "Objekter som skal ekskluderes fra tagdeling. Ett objekt per linje.",
|
||||
"PreferNonstandardArtistsTag": "Foretrekk ARTISTER-tag om tilgjengelig",
|
||||
"PreferNonstandardArtistsTagHelp": "Bruk ikke-standard ARTISTS-taggen istedenfor ARTIST-taggen når den er tilgjengelig.",
|
||||
"UseCustomTagDelimiters": "Bruk egendefinert skilletegn for tagger",
|
||||
"UseCustomTagDelimitersHelp": "Del artist- og sjanger-tagger med egendefinert tegn."
|
||||
}
|
||||
|
|
|
@ -1962,5 +1962,9 @@
|
|||
"UseCustomTagDelimiters": "Aangepast scheidingsteken voor tags gebruiken",
|
||||
"UseCustomTagDelimitersHelp": "Artiest- en genre-tags splitsen met aangepaste tekens.",
|
||||
"PreferNonstandardArtistsTagHelp": "Gebruik de incourante ARTISTS-tag in plaats van de ARTIST-tag indien beschikbaar.",
|
||||
"PreferNonstandardArtistsTag": "ARTISTS-tag verkiezen indien beschikbaar"
|
||||
"PreferNonstandardArtistsTag": "ARTISTS-tag verkiezen indien beschikbaar",
|
||||
"MessageCancelTimerError": "Er is een fout opgetreden bij het annuleren van de tijdklok",
|
||||
"MessageSplitVersionsError": "Er is een fout opgetreden bij het splitsen van de versies",
|
||||
"MessageCancelSeriesTimerError": "Er is een fout opgetreden bij het annuleren van de serietijdklok",
|
||||
"DateModified": "Datum gewijzigd"
|
||||
}
|
||||
|
|
|
@ -1963,5 +1963,9 @@
|
|||
"LabelCustomTagDelimitersHelp": "Znaki, które należy traktować jako ograniczniki oddzielające tagi.",
|
||||
"PreferNonstandardArtistsTagHelp": "Jeśli jest dostępny, użyj niestandardowego tagu WYKONAWCY zamiast tagu WYKONAWCA.",
|
||||
"UseCustomTagDelimitersHelp": "Podziel tagi wykonawcy/gatunku za pomocą niestandardowych znaków.",
|
||||
"LabelCustomTagDelimiters": "Niestandardowy ogranicznik tagów"
|
||||
"LabelCustomTagDelimiters": "Niestandardowy ogranicznik tagów",
|
||||
"MessageCancelSeriesTimerError": "Wystąpił błąd podczas anulowania timera serialu",
|
||||
"MessageCancelTimerError": "Wystąpił błąd podczas anulowania timera",
|
||||
"MessageSplitVersionsError": "Wystąpił błąd podczas podziału wersji",
|
||||
"DateModified": "Data modyfikacji"
|
||||
}
|
||||
|
|
|
@ -1256,7 +1256,7 @@
|
|||
"OnWakeFromSleep": "Pri prebúdzaní zo spánku",
|
||||
"WeeklyAt": "{0}s na {1}",
|
||||
"DailyAt": "Denne o {0}",
|
||||
"LastSeen": "Naposledy videný {0}",
|
||||
"LastSeen": "Posledná aktivita {0}",
|
||||
"PersonRole": "ako {0}",
|
||||
"ListPaging": "{0}-{1} z {2}",
|
||||
"WriteAccessRequired": "Server vyžaduje práva na zapisovanie do tohoto priečinku. Prosím, uistite sa že má práva na zapisovanie a skúste to znova.",
|
||||
|
@ -1861,7 +1861,7 @@
|
|||
"EnableLibraryHelp": "Zakázaním knižnice ju skryjete zo všetkých zobrazení používateľa.",
|
||||
"Lyrics": "Texty piesní",
|
||||
"LabelTrickplayAccelEncoding": "Povoliť hardvérovú akceleráciu kódovania MJPEG",
|
||||
"LabelTrickplayAccelEncodingHelp": "Táto možnosť je v súčasnosti dostupná len pre QSV a VAAPI, na ostatné metódy hardvérovej akcelerácie nemá žiadny vplyv.",
|
||||
"LabelTrickplayAccelEncodingHelp": "Táto možnosť je v súčasnosti k dispozícii len pre QSV, VA-API, VideoToolbox a RKMPP, na ostatné metódy hardvérovej akcelerácie nemá žiadny vplyv.",
|
||||
"DeleteLyrics": "Odstrániť texty piesní",
|
||||
"ConfirmDeleteLyrics": "Texty piesní budú odstránené zo systému a aj z knižnice médií. Ste si istí, že chcete pokračovať?",
|
||||
"ErrorDeletingLyrics": "Pri odstraňovaní textov piesní zo servera došlo k chybe. Skontrolujte, či má Jellyfin prístup na zápis do priečinka médií, a skúste to znova.",
|
||||
|
@ -1899,5 +1899,58 @@
|
|||
"Regional": "Regionálne",
|
||||
"AlternateDVD": "Alternatívne DVD",
|
||||
"LabelSelectPreferredTranscodeVideoCodec": "Preferovaný video kodek pre prekódovanie",
|
||||
"HeaderNextItem": "Nasleduje {0}"
|
||||
"HeaderNextItem": "Nasleduje {0}",
|
||||
"DisableVbrAudioEncodingHelp": "Zabrániť serveru kódovať zvuk pomocou VBR pre tohto klienta.",
|
||||
"DateModified": "Dátum úpravy",
|
||||
"HeaderAudioAdvanced": "Pokročilé nastavenia zvuku",
|
||||
"HeaderPreviewLyrics": "Náhľad textov piesní",
|
||||
"LabelAllowStreamSharing": "Povoliť zdieľanie streamu",
|
||||
"LabelDuration": "Dĺžka",
|
||||
"LabelDisableVbrAudioEncoding": "Zakázať kódovanie zvuku VBR",
|
||||
"LabelEnablePlugin": "Povoliť zásuvný modul",
|
||||
"LabelInstalled": "Nainštalované",
|
||||
"LabelNotInstalled": "Nie je nainštalované",
|
||||
"LabelRepository": "Repozitár",
|
||||
"MediaInfoRotation": "Rotácia",
|
||||
"MoveToBottom": "Presunúť na spodnú časť",
|
||||
"MoveToTop": "Presunúť na vrchnú časť",
|
||||
"PreferNonstandardArtistsTagHelp": "Ak je to možné, použiť neštandardnú značku ARTISTS namiesto značky ARTIST.",
|
||||
"PreviewLyrics": "Náhľad textov piesní",
|
||||
"Reset": "Resetovať",
|
||||
"ReplaceTrickplayImages": "Nahradiť existujúce obrázky trickplay",
|
||||
"LabelLyricDownloaders": "Sťahovače textov piesní",
|
||||
"EditLyrics": "Upraviť texty piesní",
|
||||
"HeaderAddLyrics": "Pridať texty piesní",
|
||||
"HeaderUploadLyrics": "Nahrať texty piesní",
|
||||
"LabelIsSynced": "Je synchronizovaný",
|
||||
"NoLyricsSearchResultsFound": "Nenašli sa žiadne texty piesní.",
|
||||
"PluginLoadRepoError": "Pri získavaní údajov o zásuvnom module z repozitáru došlo k chybe.",
|
||||
"LabelAudioTagSettings": "Nastavenia zvukových štítkov",
|
||||
"LyricDownloadersHelp": "Povoliť a zoradiť preferované sťahovače titulkov podľa priority.",
|
||||
"SearchForLyrics": "Vyhľadávať texty piesní",
|
||||
"EnableHi10pHelp": "Povoľte, aby ste zabránili prekódovaniu 10-bitových videí kodeku H.264. Túto možnosť zakážte, ak sa vo videu zobrazujú prázdne snímky.",
|
||||
"LabelTrickplayKeyFrameOnlyExtractionHelp": "Extrahovať iba kľúčové snímky pre výrazne rýchlejšie spracovanie na úkor presnosti časovania. Ak nakonfigurovaný hardvérový dekodér nepodporuje tento režim, použije sa namiesto neho softvérový dekodér.",
|
||||
"FallbackMaxStreamingBitrateHelp": "Maximálny dátový tok sa používa ako záložná hodnota, keď ffprobe nedokáže určiť dátový tok zdrojového streamu. Pomáha to zabrániť tomu, aby klienti požadovali príliš vysoký dátový tok prekódovania, čo by mohlo spôsobiť zlyhanie prehrávača a preťaženie kodéra.",
|
||||
"EnableHi10p": "Povoliť profil H.264 High 10",
|
||||
"LabelAllowFmp4TranscodingContainer": "Povoliť kontajner fMP4 na prekódovanie",
|
||||
"LabelAlwaysRemuxFlacAudioFiles": "Vždy remuxovať zvukové súbory FLAC",
|
||||
"LabelAlwaysRemuxMp3AudioFiles": "Vždy remuxovať zvukové súbory MP3",
|
||||
"LabelSaveTrickplayLocallyHelp": "Uložením obrázkov trickplay do priečinkov médií sa uľahčí ich migrácia a prístup k nim.",
|
||||
"LibraryInvalidItemIdError": "Knižnica je v neplatnom stave a nie je možné ju upravovať. Pravdepodobne sa stretávate s chybou: cesta v databáze nie je správna cesta v súborovom systéme.",
|
||||
"SelectPreferredTranscodeVideoCodecHelp": "Vybrať preferovaný kodek videa, do ktorého sa má prekódovať. Ak preferovaný kodek nie je podporovaný, server použije ďalší najlepší dostupný kodek.",
|
||||
"LabelCustomTagDelimiters": "Vlastný oddeľovač tagov",
|
||||
"LabelCustomTagDelimitersHelp": "Znaky, ktoré sa majú považovať za oddeľovače na oddelenie tagov.",
|
||||
"LabelDelimiterWhitelist": "Biela listina oddeľovačov",
|
||||
"RenderPgsSubtitleHelp": "Určite, či má klient vykresľovať titulky formátu PGS namiesto použitia vpálených titulkov. Tým sa možno vyhnúť prekódovaniu na strane servera výmenou za horší výkon na strane klienta.",
|
||||
"AllowFmp4TranscodingContainerHelp": "Povolením kontajneru fMP4 pre prekódovanie umožníte tomuto tuneru spracovať obsah vo formáte HEVC a HDR. Nie všetky tunery sú kompatibilné s týmto kontajnerom. Ak sa vyskytnú problémy s prehrávaním, zakažte ho.",
|
||||
"AllowStreamSharingHelp": "Umožniť aplikácii Jellyfin duplikovať mpegts stream z tunera a zdieľať tento duplikovaný stream so svojimi klientmi. Je to užitočné, keď má tuner limit celkového počtu streamov, ale môže to spôsobiť aj problémy s prehrávaním.",
|
||||
"AndOtherArtists": "{0} a {1} ďalších umelcov.",
|
||||
"AlwaysRemuxMp3AudioFilesHelp": "Ak máte súbory, ktorých časové značky váš prehliadač vypočítava nepresne, povoľte túto možnosť ako dočasné riešenie.",
|
||||
"AlwaysRemuxFlacAudioFilesHelp": "Ak máte súbory, ktoré prehliadač odmieta prehrávať alebo pri ktorých nepresne počíta časové značky, povoľte túto funkciu ako dočasné riešenie.",
|
||||
"AllowTonemappingSoftwareHelp": "Mapovanie tónov dokáže transformovať dynamický rozsah videa z HDR na SDR pri zachovaní detailov obrazu a farieb, ktoré sú veľmi dôležitými informáciami na zobrazenie pôvodnej scény. V súčasnosti funguje len s 10bitovými videami HDR10, HLG a DoVi.",
|
||||
"LabelDropLyricsHere": "Pretiahnite texty piesní sem alebo kliknutím vyberte súbor.",
|
||||
"LabelFallbackMaxStreamingBitrate": "Záložný maximálny dátový tok (Mbps)",
|
||||
"LabelSaveTrickplayLocally": "Uložit obrázky trickplay k médiám",
|
||||
"LabelDelimiterWhitelistHelp": "Položky, ktoré sa majú vylúčiť z oddelovania tagov. Jedna položka na riadok.",
|
||||
"LabelNoChangelog": "Pre túto verziu nie je k dispozícii žiadny zoznam zmien."
|
||||
}
|
||||
|
|
|
@ -1754,9 +1754,9 @@
|
|||
"AllowSegmentDeletion": "Radera segment",
|
||||
"AllowSegmentDeletionHelp": "Radera gamla segment efter att de har laddats ner av användaren. Detta förhindrar att hela den transkodade filen behöver lagras på hårddisken. Stäng av detta om du upplever uppspelningsproblem.",
|
||||
"LabelThrottleDelaySeconds": "Begränsa efter",
|
||||
"LabelThrottleDelaySecondsHelp": "Tid i sekunder efter vilken transkodern kommer att strypas. Måste vara tillräckligt stor för att klienten ska kunna upprätthålla en sund buffert. Fungerar endast om strypning är aktiverat.",
|
||||
"LabelSegmentKeepSeconds": "Tid för att behålla segment",
|
||||
"LabelSegmentKeepSecondsHelp": "Tid i sekunder där segment ska sparas efter laddats ner av användaren. Fungerar endast om segmentradering är aktiverat.",
|
||||
"LabelThrottleDelaySecondsHelp": "Tid i sekunder efter vilken transkodern kommer att strypas. Måste vara tillräckligt stor för att klienten ska kunna upprätthålla en tillräcklig buffert. Fungerar endast om strypning är aktiverat.",
|
||||
"LabelSegmentKeepSeconds": "Tid att behålla segment",
|
||||
"LabelSegmentKeepSecondsHelp": "Tid i sekunder då segment ska sparas efter att ha laddats ner av användaren. Fungerar endast om segmentradering är aktiverat.",
|
||||
"LabelDeveloper": "Utväcklare",
|
||||
"Notifications": "Notifieringar",
|
||||
"UserMenu": "Användarmeny",
|
||||
|
@ -1912,7 +1912,7 @@
|
|||
"LabelDuration": "Varaktighet",
|
||||
"LabelDropLyricsHere": "Släpp sångtext här, eller klicka för att bläddra.",
|
||||
"LabelIsSynced": "Är synkroniserad",
|
||||
"AllowTonemappingSoftwareHelp": "Tonmappning kan konvertera det dynamiska omfånget för en video från HDR till SDR samtidigt som bilddetaljer och färger bibehålls, vilket är mycket viktig information för att representera den ursprungliga scenen. Fungerar för närvarande endast med 10-bitars HDR10- och HLG-videor.",
|
||||
"AllowTonemappingSoftwareHelp": "Tonmappning kan konvertera det dynamiska omfånget för en video från HDR till SDR samtidigt som bilddetaljer och färger bibehålls, vilket är mycket viktig information för att representera den ursprungliga scenen. Fungerar för närvarande endast med 10-bitars HDR10-, DoVi- och HLG-videor.",
|
||||
"HeaderPreviewLyrics": "Förhandsgranska sångtext",
|
||||
"LibraryInvalidItemIdError": "Biblioteket är i ett ogiltigt tillstånd och kan inte redigeras. Det är möjligt att du stött på en bugg: sökvägen i databasen är inte rätt sökväg i filsystemet.",
|
||||
"MoveToTop": "Flytta längst upp",
|
||||
|
@ -1938,5 +1938,7 @@
|
|||
"FallbackMaxStreamingBitrateHelp": "Den högsta uppspelningsbithastigheten används ifall ffprobe inte lyckas fastställa källans bithastighet. Detta gör så att klienter inte efterfrågar en för hög omkodningsbithastighet, vilket kan resultera i att mediespelaren kraschar och överbelastar omkodaren.",
|
||||
"LabelAllowFmp4TranscodingContainer": "Tillåt fMP4 omkodningscontainer",
|
||||
"LabelAlwaysRemuxMp3AudioFiles": "Remux:a alltid MP3-ljudfiler",
|
||||
"LabelAlwaysRemuxFlacAudioFiles": "Remux:a alltid FLAC-ljudfiler"
|
||||
"LabelAlwaysRemuxFlacAudioFiles": "Remux:a alltid FLAC-ljudfiler",
|
||||
"AllowFmp4TranscodingContainerHelp": "Tillåt fMP4-omkodande container för denna tuner för att stödja HEVC- och HDR-kodat innehåll. Inte alla tuners är kompatibla med denna sortens container. Avaktivera detta valet ifall du upplever problem med uppspelning.",
|
||||
"AllowStreamSharingHelp": "Tillåt Jellyfin att duplicera MPEG-transportströmmen från tunern, och att dela den duplicerade strömmen till sina klienter. Detta är användbart när tunern har en maxgräns för antalet strömmar, men kan samtidigt orsaka problem med uppspelning."
|
||||
}
|
||||
|
|
|
@ -1963,5 +1963,9 @@
|
|||
"LabelDelimiterWhitelistHelp": "从标签分隔中排除的项目。每行一项。",
|
||||
"PreferNonstandardArtistsTag": "可用时首选的艺术家标签",
|
||||
"PreferNonstandardArtistsTagHelp": "如果可用,使用非标准的艺术家标签代替艺术家标签。",
|
||||
"UseCustomTagDelimitersHelp": "使用自定义字符分割\"艺术家/类型\"标签。"
|
||||
"UseCustomTagDelimitersHelp": "使用自定义字符分割\"艺术家/类型\"标签。",
|
||||
"MessageCancelSeriesTimerError": "取消节目计时器时发生错误",
|
||||
"MessageCancelTimerError": "取消计时器时发生错误",
|
||||
"MessageSplitVersionsError": "分割版本时发生错误",
|
||||
"DateModified": "修改日期"
|
||||
}
|
||||
|
|
|
@ -1939,5 +1939,32 @@
|
|||
"LabelDropLyricsHere": "將歌詞拖曳至此處,或點擊以瀏覽。",
|
||||
"LabelAlwaysRemuxFlacAudioFiles": "總是重新封裝 FLAC 音訊",
|
||||
"LabelAlwaysRemuxMp3AudioFiles": "總是重新封裝 MP3 音訊",
|
||||
"LabelDisableVbrAudioEncoding": "停用可變位元率 (VBR) 音訊編碼"
|
||||
"LabelDisableVbrAudioEncoding": "停用可變位元率 (VBR) 音訊編碼",
|
||||
"DateModified": "修改日期",
|
||||
"FallbackMaxStreamingBitrateHelp": "當 ffprobe 無法判斷來源位元率時,將使用最大串流位元率。可以避免用戶端請求過高的轉檔位元率,進而導致播放失敗或編碼器過載。",
|
||||
"LabelAudioTagSettings": "音訊標籤設定",
|
||||
"LabelCustomTagDelimiters": "自訂標籤分隔字元",
|
||||
"LabelCustomTagDelimitersHelp": "用來分隔標籤的字元。",
|
||||
"LabelFallbackMaxStreamingBitrate": "備用最大串流位元率 (Mbps)",
|
||||
"LabelAllowFmp4TranscodingContainer": "允許使用 fMP4 容器轉檔",
|
||||
"MessageCancelSeriesTimerError": "取消節目計時器時發生錯誤",
|
||||
"MessageCancelTimerError": "取消計時器時發生錯誤",
|
||||
"MessageSplitVersionsError": "分割版本時發生錯誤",
|
||||
"LabelLyricDownloaders": "歌詞下載器",
|
||||
"LyricDownloadersHelp": "啟用並依照偏好排序字幕下載器。",
|
||||
"RenderPgsSubtitle": "實驗性 PGS 字幕渲染",
|
||||
"RenderPgsSubtitleHelp": "在用戶端渲染 PGS 字幕,代替伺服器端燒錄字幕。以降低用戶端效能為代價避免伺服器端轉檔。",
|
||||
"PreferNonstandardArtistsTag": "可用時偏好 ARTISTS 標籤",
|
||||
"PreferNonstandardArtistsTagHelp": "可用時使用非標準的 ARTISTS 標籤代替 ARTIST 標籤。",
|
||||
"ReplaceTrickplayImages": "替換現有的快轉縮圖",
|
||||
"UseCustomTagDelimiters": "使用自訂標籤分隔字元",
|
||||
"UseCustomTagDelimitersHelp": "使用自訂的字元分割藝術家、風格標籤。",
|
||||
"AllowFmp4TranscodingContainerHelp": "允許使用 fMP4 容器轉檔來自此解碼器的內容以啟用 HEVC 和 HDR。並非所有解碼器都和此容器相容。如果遇到播放問題,請停用此設定。",
|
||||
"LabelSaveTrickplayLocally": "將快轉縮圖儲存在媒體旁邊",
|
||||
"LabelSaveTrickplayLocallyHelp": "將快轉縮圖儲存在媒體資料夾會將它們放在媒體旁邊,以便遷移和存取。",
|
||||
"VideoCodecTagNotSupported": "不支援的視訊編碼標籤",
|
||||
"LabelDelimiterWhitelist": "分隔字元白名單",
|
||||
"LabelDelimiterWhitelistHelp": "從標籤分隔中排除的項目。每行一項。",
|
||||
"AllowStreamSharingHelp": "允許 Jellyfin 複製解碼器中的 MPEGTS 串流並共用給多個用戶端。當解碼器有總串流數量限制時很有用,但是可能導致播放問題。",
|
||||
"LabelAllowStreamSharing": "允許串流共用"
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue