Compare commits

..

4 Commits

Author SHA1 Message Date
fallenbagel
cd8d5744ef fix(mediarequest entity): narrow cascade to insert & remove to prevent hook recursion
Restrict cascade options on the MediaRequest→Media relation to only `insert` and `remove`to avoid
nested subscriber/AfterUpdate recursion when saving entities.
2025-05-01 22:47:45 +08:00
fallenbagel
e4d34c04cb fix(mediasubscriber): use event.manager for parent media updates on remove
Replace `getRepository(Media)` calls with `event.manager` in the `afterRemove` hook so that
parent-media status resets run within the same transaction/QueryRunner (important for postgresql.
Doesnt affect sqlite).
2025-05-01 22:45:24 +08:00
Gauthier
14b10178f8 fix(mediarequest): move methods modifying MediaRequest to its Subscriber 2025-04-30 18:55:50 +02:00
Gauthier
48fbb5c032 fix(mediarequest): refactor to .save() instead of .update() for TypeORM
The .update() method of TypeORM doesn't come with all the functionalities of the .save()
method. Its goal is to partially update a Repository without doing any extra operation. This
introduces issues with event from the database subscriber not triggered correctly, because of
this partial update: https://github.com/typeorm/typeorm/issues/2809#issuecomment-451914877

This PR rollback to .save() instead of .update() to avoid the aforementioned issues, at the
cost of some lifehook issues. These issues are happening with PostgreSQL because the .save()
method shouldn't be used inside an Entity Listener, an Event Subscriber should be used instead:
https://orkhan.gitbook.io/typeorm/docs/listeners-and-subscribers#what-is-an-entity-listener
2025-04-30 13:28:33 +02:00
117 changed files with 2101 additions and 5785 deletions

View File

@@ -296,8 +296,7 @@
"avatar_url": "https://avatars.githubusercontent.com/u/13354331?v=4",
"profile": "https://github.com/xeruf",
"contributions": [
"doc",
"code"
"doc"
]
},
{
@@ -382,6 +381,33 @@
"code"
]
},
{
"login": "j0srisk",
"name": "Joseph Risk",
"avatar_url": "https://avatars.githubusercontent.com/u/18372584?v=4",
"profile": "http://josephrisk.com",
"contributions": [
"code"
]
},
{
"login": "Loetwiek",
"name": "Loetwiek",
"avatar_url": "https://avatars.githubusercontent.com/u/79059734?v=4",
"profile": "https://github.com/Loetwiek",
"contributions": [
"code"
]
},
{
"login": "Fuochi",
"name": "Fuochi",
"avatar_url": "https://avatars.githubusercontent.com/u/4720478?v=4",
"profile": "https://github.com/Fuochi",
"contributions": [
"doc"
]
},
{
"login": "mobihen",
"name": "Nir Israel Hen",
@@ -427,6 +453,69 @@
"security"
]
},
{
"login": "j0srisk",
"name": "Joseph Risk",
"avatar_url": "https://avatars.githubusercontent.com/u/18372584?v=4",
"profile": "http://josephrisk.com",
"contributions": [
"code"
]
},
{
"login": "Loetwiek",
"name": "Loetwiek",
"avatar_url": "https://avatars.githubusercontent.com/u/79059734?v=4",
"profile": "https://github.com/Loetwiek",
"contributions": [
"code"
]
},
{
"login": "Fuochi",
"name": "Fuochi",
"avatar_url": "https://avatars.githubusercontent.com/u/4720478?v=4",
"profile": "https://github.com/Fuochi",
"contributions": [
"doc"
]
},
{
"login": "demrich",
"name": "David Emrich",
"avatar_url": "https://avatars.githubusercontent.com/u/30092389?v=4",
"profile": "https://github.com/demrich",
"contributions": [
"code"
]
},
{
"login": "maxnatamo",
"name": "Max T. Kristiansen",
"avatar_url": "https://avatars.githubusercontent.com/u/5898152?v=4",
"profile": "https://maxtrier.dk",
"contributions": [
"code"
]
},
{
"login": "DamsDev1",
"name": "Damien Fajole",
"avatar_url": "https://avatars.githubusercontent.com/u/60252259?v=4",
"profile": "https://damsdev.me",
"contributions": [
"code"
]
},
{
"login": "AhmedNSidd",
"name": "Ahmed Siddiqui",
"avatar_url": "https://avatars.githubusercontent.com/u/36286128?v=4",
"profile": "https://github.com/AhmedNSidd",
"contributions": [
"code"
]
},
{
"login": "Zariel",
"name": "Chris Bannister",
@@ -535,6 +624,87 @@
"code"
]
},
{
"login": "j0srisk",
"name": "Joseph Risk",
"avatar_url": "https://avatars.githubusercontent.com/u/18372584?v=4",
"profile": "http://josephrisk.com",
"contributions": [
"code"
]
},
{
"login": "Loetwiek",
"name": "Loetwiek",
"avatar_url": "https://avatars.githubusercontent.com/u/79059734?v=4",
"profile": "https://github.com/Loetwiek",
"contributions": [
"code"
]
},
{
"login": "Fuochi",
"name": "Fuochi",
"avatar_url": "https://avatars.githubusercontent.com/u/4720478?v=4",
"profile": "https://github.com/Fuochi",
"contributions": [
"doc"
]
},
{
"login": "demrich",
"name": "David Emrich",
"avatar_url": "https://avatars.githubusercontent.com/u/30092389?v=4",
"profile": "https://github.com/demrich",
"contributions": [
"code"
]
},
{
"login": "maxnatamo",
"name": "Max T. Kristiansen",
"avatar_url": "https://avatars.githubusercontent.com/u/5898152?v=4",
"profile": "https://maxtrier.dk",
"contributions": [
"code"
]
},
{
"login": "DamsDev1",
"name": "Damien Fajole",
"avatar_url": "https://avatars.githubusercontent.com/u/60252259?v=4",
"profile": "https://damsdev.me",
"contributions": [
"code"
]
},
{
"login": "AhmedNSidd",
"name": "Ahmed Siddiqui",
"avatar_url": "https://avatars.githubusercontent.com/u/36286128?v=4",
"profile": "https://github.com/AhmedNSidd",
"contributions": [
"code"
]
},
{
"login": "JackW6809",
"name": "JackOXI",
"avatar_url": "https://avatars.githubusercontent.com/u/53652452?v=4",
"profile": "https://github.com/JackW6809",
"contributions": [
"code"
]
},
{
"login": "StancuFlorin",
"name": "Stancu Florin",
"avatar_url": "https://avatars.githubusercontent.com/u/1199404?v=4",
"profile": "http://indicus.ro",
"contributions": [
"code"
]
},
{
"login": "RankWeis",
"name": "RankWeis",
@@ -544,6 +714,105 @@
"code"
]
},
{
"login": "j0srisk",
"name": "Joseph Risk",
"avatar_url": "https://avatars.githubusercontent.com/u/18372584?v=4",
"profile": "http://josephrisk.com",
"contributions": [
"code"
]
},
{
"login": "Loetwiek",
"name": "Loetwiek",
"avatar_url": "https://avatars.githubusercontent.com/u/79059734?v=4",
"profile": "https://github.com/Loetwiek",
"contributions": [
"code"
]
},
{
"login": "Fuochi",
"name": "Fuochi",
"avatar_url": "https://avatars.githubusercontent.com/u/4720478?v=4",
"profile": "https://github.com/Fuochi",
"contributions": [
"doc"
]
},
{
"login": "demrich",
"name": "David Emrich",
"avatar_url": "https://avatars.githubusercontent.com/u/30092389?v=4",
"profile": "https://github.com/demrich",
"contributions": [
"code"
]
},
{
"login": "maxnatamo",
"name": "Max T. Kristiansen",
"avatar_url": "https://avatars.githubusercontent.com/u/5898152?v=4",
"profile": "https://maxtrier.dk",
"contributions": [
"code"
]
},
{
"login": "DamsDev1",
"name": "Damien Fajole",
"avatar_url": "https://avatars.githubusercontent.com/u/60252259?v=4",
"profile": "https://damsdev.me",
"contributions": [
"code"
]
},
{
"login": "AhmedNSidd",
"name": "Ahmed Siddiqui",
"avatar_url": "https://avatars.githubusercontent.com/u/36286128?v=4",
"profile": "https://github.com/AhmedNSidd",
"contributions": [
"code"
]
},
{
"login": "JackW6809",
"name": "JackOXI",
"avatar_url": "https://avatars.githubusercontent.com/u/53652452?v=4",
"profile": "https://github.com/JackW6809",
"contributions": [
"code"
]
},
{
"login": "StancuFlorin",
"name": "Stancu Florin",
"avatar_url": "https://avatars.githubusercontent.com/u/1199404?v=4",
"profile": "http://indicus.ro",
"contributions": [
"code"
]
},
{
"login": "lmiklosko",
"name": "Lukas Miklosko",
"avatar_url": "https://avatars.githubusercontent.com/u/44380311?v=4",
"profile": "https://github.com/lmiklosko",
"contributions": [
"code"
]
},
{
"login": "gauthier-th",
"name": "Gauthier",
"avatar_url": "https://avatars.githubusercontent.com/u/37781713?v=4",
"profile": "https://gauthierth.fr/",
"contributions": [
"code"
]
},
{
"login": "jessielw",
"name": "Jessie Wilson",
@@ -580,6 +849,105 @@
"code"
]
},
{
"login": "j0srisk",
"name": "Joseph Risk",
"avatar_url": "https://avatars.githubusercontent.com/u/18372584?v=4",
"profile": "http://josephrisk.com",
"contributions": [
"code"
]
},
{
"login": "Loetwiek",
"name": "Loetwiek",
"avatar_url": "https://avatars.githubusercontent.com/u/79059734?v=4",
"profile": "https://github.com/Loetwiek",
"contributions": [
"code"
]
},
{
"login": "Fuochi",
"name": "Fuochi",
"avatar_url": "https://avatars.githubusercontent.com/u/4720478?v=4",
"profile": "https://github.com/Fuochi",
"contributions": [
"doc"
]
},
{
"login": "demrich",
"name": "David Emrich",
"avatar_url": "https://avatars.githubusercontent.com/u/30092389?v=4",
"profile": "https://github.com/demrich",
"contributions": [
"code"
]
},
{
"login": "maxnatamo",
"name": "Max T. Kristiansen",
"avatar_url": "https://avatars.githubusercontent.com/u/5898152?v=4",
"profile": "https://maxtrier.dk",
"contributions": [
"code"
]
},
{
"login": "DamsDev1",
"name": "Damien Fajole",
"avatar_url": "https://avatars.githubusercontent.com/u/60252259?v=4",
"profile": "https://damsdev.me",
"contributions": [
"code"
]
},
{
"login": "AhmedNSidd",
"name": "Ahmed Siddiqui",
"avatar_url": "https://avatars.githubusercontent.com/u/36286128?v=4",
"profile": "https://github.com/AhmedNSidd",
"contributions": [
"code"
]
},
{
"login": "JackW6809",
"name": "JackOXI",
"avatar_url": "https://avatars.githubusercontent.com/u/53652452?v=4",
"profile": "https://github.com/JackW6809",
"contributions": [
"code"
]
},
{
"login": "StancuFlorin",
"name": "Stancu Florin",
"avatar_url": "https://avatars.githubusercontent.com/u/1199404?v=4",
"profile": "http://indicus.ro",
"contributions": [
"code"
]
},
{
"login": "lmiklosko",
"name": "Lukas Miklosko",
"avatar_url": "https://avatars.githubusercontent.com/u/44380311?v=4",
"profile": "https://github.com/lmiklosko",
"contributions": [
"code"
]
},
{
"login": "gauthier-th",
"name": "Gauthier",
"avatar_url": "https://avatars.githubusercontent.com/u/37781713?v=4",
"profile": "https://gauthierth.fr/",
"contributions": [
"code"
]
},
{
"login": "vfaergestad",
"name": "vfaergestad",
@@ -588,60 +956,6 @@
"contributions": [
"code"
]
},
{
"login": "wolffman122",
"name": "wolffman122",
"avatar_url": "https://avatars.githubusercontent.com/u/19178872?v=4",
"profile": "https://github.com/wolffman122",
"contributions": [
"code"
]
},
{
"login": "Schrottfresser",
"name": "Schrottfresser",
"avatar_url": "https://avatars.githubusercontent.com/u/39998368?v=4",
"profile": "https://github.com/Schrottfresser",
"contributions": [
"code"
]
},
{
"login": "DillionLowry",
"name": "Dillion",
"avatar_url": "https://avatars.githubusercontent.com/u/91228469?v=4",
"profile": "https://github.com/DillionLowry",
"contributions": [
"code"
]
},
{
"login": "JamsRepos",
"name": "Jam",
"avatar_url": "https://avatars.githubusercontent.com/u/1347620?v=4",
"profile": "https://github.com/JamsRepos",
"contributions": [
"code"
]
},
{
"login": "joelowrance",
"name": "Joe Lowrance",
"avatar_url": "https://avatars.githubusercontent.com/u/63176?v=4",
"profile": "http://www.joelowrance.com",
"contributions": [
"code"
]
},
{
"login": "0xSysR3ll",
"name": "0xsysr3ll",
"avatar_url": "https://avatars.githubusercontent.com/u/31414959?v=4",
"profile": "https://github.com/0xSysR3ll",
"contributions": [
"code"
]
}
]
}

View File

@@ -1,716 +1,3 @@
# [2.7.0](https://github.com/fallenbagel/jellyseerr/compare/v2.6.0...v2.7.0) (2025-06-20)
### Bug Fixes
* **blacklist:** hide items from MediaSliders when hideBlacklisted is enabled ([#1713](https://github.com/fallenbagel/jellyseerr/issues/1713)) ([d4a6cb2](https://github.com/fallenbagel/jellyseerr/commit/d4a6cb268a33d96c03f1f76c207b5597e4eae6e7))
* correct typing issue ([#1715](https://github.com/fallenbagel/jellyseerr/issues/1715)) ([bb95c70](https://github.com/fallenbagel/jellyseerr/commit/bb95c7009faaf22103c1c8e84e3403823377ce0f))
* **jellyfin:** use the same deviceId for admins ([#1710](https://github.com/fallenbagel/jellyseerr/issues/1710)) ([c7284f4](https://github.com/fallenbagel/jellyseerr/commit/c7284f473c43634b3a324f3b11a9a60990b3c0da))
* **proxy:** apply http proxy settings to axios ([#1716](https://github.com/fallenbagel/jellyseerr/issues/1716)) ([7c969f4](https://github.com/fallenbagel/jellyseerr/commit/7c969f4235aa052234084c3cb951d485c6fff9cd))
* redirect the 'Request' button to the right page ([#1711](https://github.com/fallenbagel/jellyseerr/issues/1711)) ([9cb7e14](https://github.com/fallenbagel/jellyseerr/commit/9cb7e1495ab2860cea614d10f6f7b62cf77b4def)), closes [#1588](https://github.com/fallenbagel/jellyseerr/issues/1588)
* **settings:** add a tip for youtube URL setting ([#1714](https://github.com/fallenbagel/jellyseerr/issues/1714)) ([fb8677f](https://github.com/fallenbagel/jellyseerr/commit/fb8677f29cfe2a7f0e0c465a1a742be119517886))
### Features
* add force ipv4 first setting ([#1719](https://github.com/fallenbagel/jellyseerr/issues/1719)) ([0357d17](https://github.com/fallenbagel/jellyseerr/commit/0357d172058ceda7d49a0c18c13009e0031e034d))
# [2.6.0](https://github.com/fallenbagel/jellyseerr/compare/v2.5.2...v2.6.0) (2025-06-09)
### Bug Fixes
* add missing cache for some tmdb images ([#1656](https://github.com/fallenbagel/jellyseerr/issues/1656)) ([8949ede](https://github.com/fallenbagel/jellyseerr/commit/8949edea7edcb64546f2c8b9363120102509a2a5))
* **entity:** use TIMESTAMPTZ in Postgres and sort issue comments oldest-first ([#1654](https://github.com/fallenbagel/jellyseerr/issues/1654)) ([8da1c92](https://github.com/fallenbagel/jellyseerr/commit/8da1c9292391a39b8c08ed9f7cd7a2bb10217588)), closes [#1569](https://github.com/fallenbagel/jellyseerr/issues/1569) [#1568](https://github.com/fallenbagel/jellyseerr/issues/1568)
* **filters:** display the right value when resetting the filter options ([#1695](https://github.com/fallenbagel/jellyseerr/issues/1695)) ([c0dd2e5](https://github.com/fallenbagel/jellyseerr/commit/c0dd2e5e27ad9927c52c54cd66bfb2b3cf7890d0)), closes [#1693](https://github.com/fallenbagel/jellyseerr/issues/1693)
* **imagecache:** fix avatar cache folder creation ([#1581](https://github.com/fallenbagel/jellyseerr/issues/1581)) ([355b76d](https://github.com/fallenbagel/jellyseerr/commit/355b76de5cc029a76708bb754c6c4fd72ce99e3d)), closes [#1520](https://github.com/fallenbagel/jellyseerr/issues/1520)
* **issuecomment:** fix issue display lists in IssueComment ([#1638](https://github.com/fallenbagel/jellyseerr/issues/1638)) ([515124b](https://github.com/fallenbagel/jellyseerr/commit/515124bab4b5e13759cb9497489dea828a6cef52)), closes [#1328](https://github.com/fallenbagel/jellyseerr/issues/1328) [#1328](https://github.com/fallenbagel/jellyseerr/issues/1328) [#1328](https://github.com/fallenbagel/jellyseerr/issues/1328)
* **jellyfin:** clean up Jellyfin sessions on Jellyseerr logout ([#1651](https://github.com/fallenbagel/jellyseerr/issues/1651)) ([b27dbd7](https://github.com/fallenbagel/jellyseerr/commit/b27dbd7a155bed9490afdd9dc25ef8a7ca9311eb))
* **mediarequests:** properly sort season numbers in media requests ([#1688](https://github.com/fallenbagel/jellyseerr/issues/1688)) ([6b8c0bd](https://github.com/fallenbagel/jellyseerr/commit/6b8c0bd8f3ac7a5c74bc0cb2c81edd2c22a7a618)), closes [#1336](https://github.com/fallenbagel/jellyseerr/issues/1336)
* **pushover notificatons:** the sound setting will now be stored correctly ([#1630](https://github.com/fallenbagel/jellyseerr/issues/1630)) ([5fd65eb](https://github.com/fallenbagel/jellyseerr/commit/5fd65eb1ba4e8f383e8a11cb1004acc3bace26c0)), closes [#1614](https://github.com/fallenbagel/jellyseerr/issues/1614)
* **requestlist:** remove unnecessary semicolon ([#1647](https://github.com/fallenbagel/jellyseerr/issues/1647)) ([6b9aedb](https://github.com/fallenbagel/jellyseerr/commit/6b9aedb97062e6b551cc7e023f699b8b26f730f0))
* **ui:** correct seasons badge order ([#1648](https://github.com/fallenbagel/jellyseerr/issues/1648)) ([123894b](https://github.com/fallenbagel/jellyseerr/commit/123894b475fae421b416781587432ecc4e50acc2))
* **ui:** make person media type filter consistent on mobile ([#1669](https://github.com/fallenbagel/jellyseerr/issues/1669)) ([24e1e94](https://github.com/fallenbagel/jellyseerr/commit/24e1e94747c9a070bc84a64ace47166efe52f7f1))
* **url validation:** correct URL validation for empty fields ([#1657](https://github.com/fallenbagel/jellyseerr/issues/1657)) ([d226dbb](https://github.com/fallenbagel/jellyseerr/commit/d226dbb9b4279c3d649fb0c72656d35ba065491c))
* **usediscover hook:** detect end of pagination when totalSize is a multiple of pageSize ([#1649](https://github.com/fallenbagel/jellyseerr/issues/1649)) ([45f2540](https://github.com/fallenbagel/jellyseerr/commit/45f25408c62f87e4a2b73e270644fb2f1f79a290)), closes [#1623](https://github.com/fallenbagel/jellyseerr/issues/1623)
* **usersettings:** exclude current user when checking for existing email ([#1689](https://github.com/fallenbagel/jellyseerr/issues/1689)) ([ea7e68f](https://github.com/fallenbagel/jellyseerr/commit/ea7e68fc99bbc783277891b3408f07b7a70765be))
### Features
* add caching for TVDB images ([#1655](https://github.com/fallenbagel/jellyseerr/issues/1655)) ([e69649d](https://github.com/fallenbagel/jellyseerr/commit/e69649d71d19d23cafac363792a7e89c897bcad0))
* add content certification/age-rating filter ([#1418](https://github.com/fallenbagel/jellyseerr/issues/1418)) ([149d79e](https://github.com/fallenbagel/jellyseerr/commit/149d79e5404cae48217806079b0ac0a34fbaeb35)), closes [#501](https://github.com/fallenbagel/jellyseerr/issues/501) [#501](https://github.com/fallenbagel/jellyseerr/issues/501)
* allow changing YouTube host for trailers ([#643](https://github.com/fallenbagel/jellyseerr/issues/643)) ([d01f9a0](https://github.com/fallenbagel/jellyseerr/commit/d01f9a058042657ae1ce39537cdf0029ef878c8e))
* **blacklist:** Automatically add media with blacklisted tags to the blacklist ([#1306](https://github.com/fallenbagel/jellyseerr/issues/1306)) ([4a5ac3c](https://github.com/fallenbagel/jellyseerr/commit/4a5ac3cc42fd924e8c83d64e5b01de44bed6b8ab))
* **blacklist:** hide blacklisted items from discover pages for admins ([#1601](https://github.com/fallenbagel/jellyseerr/issues/1601)) ([185167a](https://github.com/fallenbagel/jellyseerr/commit/185167a0a75eb710a8696b58f7bc0a3f5939cee8))
* **discord.ts:** adds a link to the pending approval discord notification ([#436](https://github.com/fallenbagel/jellyseerr/issues/436)) ([14ee52e](https://github.com/fallenbagel/jellyseerr/commit/14ee52e93e7e6b2c1c5ec6cf05abcac3c0d8163a))
* filter by media type on PersonDetails ([#1566](https://github.com/fallenbagel/jellyseerr/issues/1566)) ([a19dcaf](https://github.com/fallenbagel/jellyseerr/commit/a19dcaf5e5c5cc4072a7e4733bbbf149a352915b)), closes [#1513](https://github.com/fallenbagel/jellyseerr/issues/1513) [#1513](https://github.com/fallenbagel/jellyseerr/issues/1513)
* **gotify:** added priority input for gotify ([#1410](https://github.com/fallenbagel/jellyseerr/issues/1410)) ([21400ce](https://github.com/fallenbagel/jellyseerr/commit/21400cecdc1b964023087bce479bb7d141049080))
* **issuecomment:** fix translation issue ([#1635](https://github.com/fallenbagel/jellyseerr/issues/1635)) ([8a42fe1](https://github.com/fallenbagel/jellyseerr/commit/8a42fe16b5ebca80e76d98fb05006cf41f5a953a)), closes [#1604](https://github.com/fallenbagel/jellyseerr/issues/1604)
* make chart probes configurable ([#1574](https://github.com/fallenbagel/jellyseerr/issues/1574)) ([c3b8574](https://github.com/fallenbagel/jellyseerr/commit/c3b8574515de4f5a2c13f36b3a00708d0858966e))
* now uses markdown linebreaks instead of relying purely on newlines ([#1514](https://github.com/fallenbagel/jellyseerr/issues/1514)) ([7d36dc1](https://github.com/fallenbagel/jellyseerr/commit/7d36dc182b462c12a31833ee08e74255d7964c24))
* **ntfy:** add native ntfy notification support ([#1599](https://github.com/fallenbagel/jellyseerr/issues/1599)) ([fc4db7f](https://github.com/fallenbagel/jellyseerr/commit/fc4db7fa002acbb31f1fd8d20da019291d8096d8)), closes [#499](https://github.com/fallenbagel/jellyseerr/issues/499)
* **requestlist:** add requests list media type filtering ([#1511](https://github.com/fallenbagel/jellyseerr/issues/1511)) ([e8f1edc](https://github.com/fallenbagel/jellyseerr/commit/e8f1edc0621387921dca73a8c9ad1d15f6b3a847))
## [2.5.2](https://github.com/fallenbagel/jellyseerr/compare/v2.5.1...v2.5.2) (2025-04-03)
### Bug Fixes
* **auth:** Bitwarden autofill fix on local/Jellyfin login (2) ([#1487](https://github.com/fallenbagel/jellyseerr/issues/1487)) ([85bbc85](https://github.com/fallenbagel/jellyseerr/commit/85bbc857141d38bcf5244078437ed6a3318bba67))
* **avatar:** fix avatar cache busting by using avatarVersion ([#1537](https://github.com/fallenbagel/jellyseerr/issues/1537)) ([29034b3](https://github.com/fallenbagel/jellyseerr/commit/29034b350d35ebaed52556448e46436aeb644e77))
* correct "Remove from *arr" button ([#1544](https://github.com/fallenbagel/jellyseerr/issues/1544)) ([8dc1d81](https://github.com/fallenbagel/jellyseerr/commit/8dc1d8196c67bee0e772941445c294f0ca367961)), closes [#1476](https://github.com/fallenbagel/jellyseerr/issues/1476) [#1494](https://github.com/fallenbagel/jellyseerr/issues/1494)
* **helm:** apply annotations to pvc ([#1489](https://github.com/fallenbagel/jellyseerr/issues/1489)) ([e5ab847](https://github.com/fallenbagel/jellyseerr/commit/e5ab847547564869c3aa6443b1e22208c09a7810))
* **jellyfin:** ensure deviceID is never empty ([#1538](https://github.com/fallenbagel/jellyseerr/issues/1538)) ([7438042](https://github.com/fallenbagel/jellyseerr/commit/7438042757cb0e81534cf9f766d84dd3ff57fd84))
* **job:** handle media removal for 4k on the same server ([#1543](https://github.com/fallenbagel/jellyseerr/issues/1543)) ([63dc27d](https://github.com/fallenbagel/jellyseerr/commit/63dc27d400ecc80a18442fc42dd417cc03c3f9e1))
* **job:** rename Plex Sync to Jellyfin Sync ([#1549](https://github.com/fallenbagel/jellyseerr/issues/1549)) ([2f6be95](https://github.com/fallenbagel/jellyseerr/commit/2f6be955b51e8920c8954413286577e6fea4aee2))
* **migrations:** add missing Postgres migration and fix SQLite migration ([#1532](https://github.com/fallenbagel/jellyseerr/issues/1532)) ([0b0b76e](https://github.com/fallenbagel/jellyseerr/commit/0b0b76e58c583fc7c31d7821e7825e32065f7944)), closes [#1466](https://github.com/fallenbagel/jellyseerr/issues/1466)
* **ui:** handle import-from-plex response as array ([#1510](https://github.com/fallenbagel/jellyseerr/issues/1510)) ([4cd02ba](https://github.com/fallenbagel/jellyseerr/commit/4cd02babbace98c01bcef153a50d34cb36dd1d4b))
* **ui:** resolve discover language dropdown overlap ([#1497](https://github.com/fallenbagel/jellyseerr/issues/1497)) ([f5b3a52](https://github.com/fallenbagel/jellyseerr/commit/f5b3a526cb9b12c19e5ff6a79240e3d85685ff9b)), closes [#1475](https://github.com/fallenbagel/jellyseerr/issues/1475)
## [2.5.1](https://github.com/fallenbagel/jellyseerr/compare/v2.5.0...v2.5.1) (2025-03-17)
### Bug Fixes
* **auth:** Bitwarden autofill fix on local/Jellyfin login ([#1459](https://github.com/fallenbagel/jellyseerr/issues/1459)) ([b085e12](https://github.com/fallenbagel/jellyseerr/commit/b085e12ff9df9f57d71ca1fe27fefa8319229a2a))
* **blacklist:** add back the blacklist button on TitleCard for Plex ([#1463](https://github.com/fallenbagel/jellyseerr/issues/1463)) ([4d1163c](https://github.com/fallenbagel/jellyseerr/commit/4d1163c34384efa59fe9b5401c5bd42d7f0435fc)), closes [#1398](https://github.com/fallenbagel/jellyseerr/issues/1398)
* check if the file still exists in the service before deleting ([#1476](https://github.com/fallenbagel/jellyseerr/issues/1476)) ([f773e0f](https://github.com/fallenbagel/jellyseerr/commit/f773e0fb2a62f4f316ca7f8fe3d8dabdebae2ab7))
* **job:** resolve edge case issue with season availability updates ([#1483](https://github.com/fallenbagel/jellyseerr/issues/1483)) ([77a36f9](https://github.com/fallenbagel/jellyseerr/commit/77a36f971444ee5dc0d15b2d34a8daaf4e1f28b5))
* **mediarequest:** correct download sync for Radarr ([#1484](https://github.com/fallenbagel/jellyseerr/issues/1484)) ([c2d9d00](https://github.com/fallenbagel/jellyseerr/commit/c2d9d00b415fecbb5a8d7ca28a6ed76ea3ba3c19)), closes [#1376](https://github.com/fallenbagel/jellyseerr/issues/1376)
* **proxy:** update http proxy to accept bypass list with undici v7 ([#1456](https://github.com/fallenbagel/jellyseerr/issues/1456)) ([9891a75](https://github.com/fallenbagel/jellyseerr/commit/9891a7577cc0874f41c38ff0e6e5a6b4d8315281)), closes [#1454](https://github.com/fallenbagel/jellyseerr/issues/1454)
* **requestlist:** hide the remove from *arr button when no service exists ([#1457](https://github.com/fallenbagel/jellyseerr/issues/1457)) ([33e7a15](https://github.com/fallenbagel/jellyseerr/commit/33e7a153aa64461a715595d070fba53d52b34767)), closes [#1449](https://github.com/fallenbagel/jellyseerr/issues/1449)
* **smtp-notification-test:** missing allowSelfSigned option in test function ([#1461](https://github.com/fallenbagel/jellyseerr/issues/1461)) ([b8425d6](https://github.com/fallenbagel/jellyseerr/commit/b8425d6388003322edd7b4b2473aeb24c06e4802))
* **ui:** correct seasons badge order ([#1485](https://github.com/fallenbagel/jellyseerr/issues/1485)) ([f884ac9](https://github.com/fallenbagel/jellyseerr/commit/f884ac9c660d1931c8b3815dcaefd109da249f2a))
* **ui:** move watch trailer button above the 4k request button ([#1465](https://github.com/fallenbagel/jellyseerr/issues/1465)) ([a6dd4a8](https://github.com/fallenbagel/jellyseerr/commit/a6dd4a8fedb9af9810581b1cc18cfea53b3cfd39)), closes [#1462](https://github.com/fallenbagel/jellyseerr/issues/1462)
* **ui:** resolve streaming region dropdown overlap ([#1477](https://github.com/fallenbagel/jellyseerr/issues/1477)) ([767a241](https://github.com/fallenbagel/jellyseerr/commit/767a24164d6c9d101e613c53960985f4fbe2ce93)), closes [#1475](https://github.com/fallenbagel/jellyseerr/issues/1475)
### Reverts
* **airdate:** reverts airdate offset & changes relative time to only display date (not time) ([#1467](https://github.com/fallenbagel/jellyseerr/issues/1467)) ([8394eb5](https://github.com/fallenbagel/jellyseerr/commit/8394eb5ad405a90e840952d5977712e1ab890530)), closes [#1390](https://github.com/fallenbagel/jellyseerr/issues/1390)
# [2.5.0](https://github.com/fallenbagel/jellyseerr/compare/v2.4.0...v2.5.0) (2025-03-11)
### Bug Fixes
* **ui:** correct media action icon size ([#1444](https://github.com/fallenbagel/jellyseerr/issues/1444)) ([771ecdf](https://github.com/fallenbagel/jellyseerr/commit/771ecdf7812004eec0f516cc424f9982936c8a2a)), closes [#1440](https://github.com/fallenbagel/jellyseerr/issues/1440)
* **users:** correct user list for Postgres ([#1443](https://github.com/fallenbagel/jellyseerr/issues/1443)) ([5b998be](https://github.com/fallenbagel/jellyseerr/commit/5b998bef82388dccaaa462ff2ff3a526dd03338c)), closes [#1333](https://github.com/fallenbagel/jellyseerr/issues/1333)
### Features
* **helm:** upgrade jellyseerr to 2.4.0 ([#1438](https://github.com/fallenbagel/jellyseerr/issues/1438)) ([077e355](https://github.com/fallenbagel/jellyseerr/commit/077e355c775af92ff4dd2341543555d473c1abbb))
### Reverts
* reverts csrf-csrf back to csurf ([#1442](https://github.com/fallenbagel/jellyseerr/issues/1442)) ([21ab20b](https://github.com/fallenbagel/jellyseerr/commit/21ab20bba97102fe9eb9d4af4213a604c05e0acc)), closes [#1393](https://github.com/fallenbagel/jellyseerr/issues/1393)
# [2.4.0](https://github.com/fallenbagel/jellyseerr/compare/v2.3.0...v2.4.0) (2025-03-10)
### Bug Fixes
* add email requirement for local users ([#1389](https://github.com/fallenbagel/jellyseerr/issues/1389)) ([f0a6055](https://github.com/fallenbagel/jellyseerr/commit/f0a605577469248a2a7c2170be8310e106131c59)), closes [#900](https://github.com/fallenbagel/jellyseerr/issues/900) [#1367](https://github.com/fallenbagel/jellyseerr/issues/1367)
* **api:** make item endpoints user-independent ([#1413](https://github.com/fallenbagel/jellyseerr/issues/1413)) ([9cc6930](https://github.com/fallenbagel/jellyseerr/commit/9cc6930fed31c834201fe4e8a2a2f456b878dec6))
* assign the keep-alive value explicitly ([#1368](https://github.com/fallenbagel/jellyseerr/issues/1368)) ([438ccfe](https://github.com/fallenbagel/jellyseerr/commit/438ccfe9c37f4848b84e60a2ce64687e0b4e4dc0)), closes [#1365](https://github.com/fallenbagel/jellyseerr/issues/1365)
* corrected spelling errors in function names ([#1366](https://github.com/fallenbagel/jellyseerr/issues/1366)) ([e035cd8](https://github.com/fallenbagel/jellyseerr/commit/e035cd84ae24502f43cf842d6d10621f28719682))
* disable first page revalidation in useSWRInfinite ([#1386](https://github.com/fallenbagel/jellyseerr/issues/1386)) ([d563b36](https://github.com/fallenbagel/jellyseerr/commit/d563b361869d8183041cb6aea91279e17a513070)), closes [#1380](https://github.com/fallenbagel/jellyseerr/issues/1380)
* disallow admins to edit other admins in bulk edit ([#1340](https://github.com/fallenbagel/jellyseerr/issues/1340)) ([2dbd109](https://github.com/fallenbagel/jellyseerr/commit/2dbd1096d2756a7213209419d1d4da36e7267959)), closes [#1309](https://github.com/fallenbagel/jellyseerr/issues/1309)
* **emby:** throw the right error message if no library exists ([#1415](https://github.com/fallenbagel/jellyseerr/issues/1415)) ([67bd639](https://github.com/fallenbagel/jellyseerr/commit/67bd639a432d724bb34b7d6fed76c0bb66d94147))
* fix remove from *arr in item details ([#1387](https://github.com/fallenbagel/jellyseerr/issues/1387)) ([9712f56](https://github.com/fallenbagel/jellyseerr/commit/9712f5605471a673edb3d25048dc08d1addd58db))
* **helm:** no change, fixing OCI manifest corruption ([#1310](https://github.com/fallenbagel/jellyseerr/issues/1310)) ([418f0c2](https://github.com/fallenbagel/jellyseerr/commit/418f0c2eb844e8814aca0d280292e9fb372cc118))
* **jobs:** run plex/jellyfin jobs only for the relevant media server ([#1331](https://github.com/fallenbagel/jellyseerr/issues/1331)) ([2b7974f](https://github.com/fallenbagel/jellyseerr/commit/2b7974fa06f196b40de270ad24e54b227143b081)), closes [#1329](https://github.com/fallenbagel/jellyseerr/issues/1329)
* make watchlist buttons consistent ([#1272](https://github.com/fallenbagel/jellyseerr/issues/1272)) ([f247642](https://github.com/fallenbagel/jellyseerr/commit/f247642b76ebefd9eeb8aed485573b5d6b133673)), closes [#1270](https://github.com/fallenbagel/jellyseerr/issues/1270)
* **mediarequest:** optimise more typeorm lifecycle triggers ([#1376](https://github.com/fallenbagel/jellyseerr/issues/1376)) ([80927b9](https://github.com/fallenbagel/jellyseerr/commit/80927b97058a219fca9fa580243cb3f966fb0b37)), closes [#513](https://github.com/fallenbagel/jellyseerr/issues/513)
* missing plex.tv url in images remotePatterns ([#1356](https://github.com/fallenbagel/jellyseerr/issues/1356)) ([b29959b](https://github.com/fallenbagel/jellyseerr/commit/b29959b0637fd8add9598d2a3d05f9a0972b65df))
* **overriderules:** allows every user to be added to the override rules ([#1333](https://github.com/fallenbagel/jellyseerr/issues/1333)) ([af8d6b4](https://github.com/fallenbagel/jellyseerr/commit/af8d6b475c0040f7b96f04e3783ac8b4c702b3db))
* **overriderules:** correct disabled condition for override rule creation ([#1419](https://github.com/fallenbagel/jellyseerr/issues/1419)) ([1de518d](https://github.com/fallenbagel/jellyseerr/commit/1de518d9154ea7809688c73ebefdcac66d27bdf8))
* **overriderules:** enable override rules only when a service exists ([#1417](https://github.com/fallenbagel/jellyseerr/issues/1417)) ([4e44282](https://github.com/fallenbagel/jellyseerr/commit/4e44282387e7b511daecd961cdc9da98cb4b0139))
* resolve a vulnerability with admin token ([#1345](https://github.com/fallenbagel/jellyseerr/issues/1345)) ([620135a](https://github.com/fallenbagel/jellyseerr/commit/620135aeac6d9fc284a3daddcafd1964474d2789))
* **settings:** remove dns server option ([#1416](https://github.com/fallenbagel/jellyseerr/issues/1416)) ([ada467e](https://github.com/fallenbagel/jellyseerr/commit/ada467ecf40c7c27d57ae69ad515bd245d7bb639)), closes [#1266](https://github.com/fallenbagel/jellyseerr/issues/1266)
* **setup:** resolve looping library validation error message ([#1316](https://github.com/fallenbagel/jellyseerr/issues/1316)) ([6ab4632](https://github.com/fallenbagel/jellyseerr/commit/6ab463285d566c18ef0b4034fbfd0b5863a4f7a5))
* **watchlist:** disable Jellyseerr's watchlist for Plex users ([#1398](https://github.com/fallenbagel/jellyseerr/issues/1398)) ([4eddbaa](https://github.com/fallenbagel/jellyseerr/commit/4eddbaa71b7972b6db33976102501fb8b6333206)), closes [#1344](https://github.com/fallenbagel/jellyseerr/issues/1344)
### Features
* add a robots.txt file ([#1335](https://github.com/fallenbagel/jellyseerr/issues/1335)) ([24d3f52](https://github.com/fallenbagel/jellyseerr/commit/24d3f523fc07ff4b28d041b2a74cfb5ab0a788a7)), closes [#1323](https://github.com/fallenbagel/jellyseerr/issues/1323)
* add linked accounts page ([#883](https://github.com/fallenbagel/jellyseerr/issues/883)) ([64f05bc](https://github.com/fallenbagel/jellyseerr/commit/64f05bcad6956f7e8cbe3fdf5f430af1f30ddd6d))
* **airdatebadge:** convert airDate from UTC to local timezone ([#1390](https://github.com/fallenbagel/jellyseerr/issues/1390)) ([a790b1a](https://github.com/fallenbagel/jellyseerr/commit/a790b1abccfa9c3f8272ade8cd055017905dd87f)), closes [#1373](https://github.com/fallenbagel/jellyseerr/issues/1373)
* **api:** make rottentomatoes matching more robust ([#1265](https://github.com/fallenbagel/jellyseerr/issues/1265)) ([907ba6f](https://github.com/fallenbagel/jellyseerr/commit/907ba6fdea0341e8d0f429eaf6aaa404dbc7daff))
* **helm:** Add possibility to pass volumes and volume mounts ([#1291](https://github.com/fallenbagel/jellyseerr/issues/1291)) ([62c1a70](https://github.com/fallenbagel/jellyseerr/commit/62c1a70b373ee574ad9ff98d322085976dbc7868))
* revamp login page and support disabling media server login ([#1286](https://github.com/fallenbagel/jellyseerr/issues/1286)) ([73d8efa](https://github.com/fallenbagel/jellyseerr/commit/73d8efaa54888b5282624e618c1461c23653f0b9))
* **settings:** add a disclaimer for dns servers and ipv4 first settings ([#1375](https://github.com/fallenbagel/jellyseerr/issues/1375)) ([1176171](https://github.com/fallenbagel/jellyseerr/commit/117617188ed988bd8a90e9fbe8bada08d5b14513))
* **ui:** prevent password manager interference & improve service links ([#1396](https://github.com/fallenbagel/jellyseerr/issues/1396)) ([e97a13e](https://github.com/fallenbagel/jellyseerr/commit/e97a13e1e46298be9f334c8e6c6028fb8a99c53d)), closes [#3989](https://github.com/fallenbagel/jellyseerr/issues/3989)
* update Jellyfin logo ([#1359](https://github.com/fallenbagel/jellyseerr/issues/1359)) ([c181cee](https://github.com/fallenbagel/jellyseerr/commit/c181cee328eb867f90d906757b8bddaeb74ba9f2))
* upgrade chart to 2.0.0 ([#1268](https://github.com/fallenbagel/jellyseerr/issues/1268)) ([0ee3e69](https://github.com/fallenbagel/jellyseerr/commit/0ee3e69a6101f5a8818b6d4c5654d84f6aac322b))
# [2.3.0](https://github.com/fallenbagel/jellyseerr/compare/v2.2.3...v2.3.0) (2025-01-16)
### Bug Fixes
* correct typos for the special episodes setting ([#1209](https://github.com/fallenbagel/jellyseerr/issues/1209)) ([ebe7d11](https://github.com/fallenbagel/jellyseerr/commit/ebe7d11a5393f3d444dd9613854d6054af1ec58b)), closes [#1193](https://github.com/fallenbagel/jellyseerr/issues/1193) [#1208](https://github.com/fallenbagel/jellyseerr/issues/1208)
* **externalapi:** clear cache after a request is made ([#1217](https://github.com/fallenbagel/jellyseerr/issues/1217)) ([f718cec](https://github.com/fallenbagel/jellyseerr/commit/f718cec23fccbfd16fdb792c2778cd543b751799)), closes [#1207](https://github.com/fallenbagel/jellyseerr/issues/1207)
* **jellyfinlogin:** add proper error message when no admin user exists ([#1216](https://github.com/fallenbagel/jellyseerr/issues/1216)) ([ac90802](https://github.com/fallenbagel/jellyseerr/commit/ac908026dbb7ca06c0fb520bbb360120d6b87feb))
* optimize media status update to avoid lifecycle hook triggers ([#1218](https://github.com/fallenbagel/jellyseerr/issues/1218)) ([656cd91](https://github.com/fallenbagel/jellyseerr/commit/656cd91c9c90e57914b7fedb097f29e21fb18090))
* **overriderules:** allow override rules only when the service is created ([#1259](https://github.com/fallenbagel/jellyseerr/issues/1259)) ([ce1b39f](https://github.com/fallenbagel/jellyseerr/commit/ce1b39f73b953b6fa0a00948e72d24c43476bc5f))
* prevent TypeORM subscribers from calling itself over and over ([#1215](https://github.com/fallenbagel/jellyseerr/issues/1215)) ([d67ec57](https://github.com/fallenbagel/jellyseerr/commit/d67ec571c5950f04b85f5a268b38eb026a156320))
* resolve plex user mismatch due to caching issues ([#1242](https://github.com/fallenbagel/jellyseerr/issues/1242)) ([131a5a2](https://github.com/fallenbagel/jellyseerr/commit/131a5a2b0b1a235599940affc183b93c36f12ade)), closes [#1227](https://github.com/fallenbagel/jellyseerr/issues/1227)
* **settingsmigrator:** prevent region migration from running multiple times ([#1255](https://github.com/fallenbagel/jellyseerr/issues/1255)) ([1c6f536](https://github.com/fallenbagel/jellyseerr/commit/1c6f5362d773c850a5e58b5013f0d65474467e9c)), closes [#1251](https://github.com/fallenbagel/jellyseerr/issues/1251)
* **setup:** fix continue button disabled on refresh in setup 3 ([#1211](https://github.com/fallenbagel/jellyseerr/issues/1211)) ([0b331ca](https://github.com/fallenbagel/jellyseerr/commit/0b331ca579c75e546dcdbf0f1896e0f0ec3a89f1))
* **setup:** plex library setting validation ([#1233](https://github.com/fallenbagel/jellyseerr/issues/1233)) ([b8dbfaa](https://github.com/fallenbagel/jellyseerr/commit/b8dbfaaed083734b05a28a05bf100941dc673ea7))
* specify cached image type ([#1237](https://github.com/fallenbagel/jellyseerr/issues/1237)) ([d71ee58](https://github.com/fallenbagel/jellyseerr/commit/d71ee58302fe95c9c79e27b4edf317a98faf6f5c))
* **ui:** resolve streaming region dropdown overlap ([#1210](https://github.com/fallenbagel/jellyseerr/issues/1210)) ([2f0e493](https://github.com/fallenbagel/jellyseerr/commit/2f0e4932572497322df0d7d7f4377aeb9cc35d5b)), closes [#1206](https://github.com/fallenbagel/jellyseerr/issues/1206)
* **users:** correct request count query for PostgreSQL compatibility ([#1213](https://github.com/fallenbagel/jellyseerr/issues/1213)) ([f3ebf60](https://github.com/fallenbagel/jellyseerr/commit/f3ebf6028b23f803a1c8801b1541a444e8856421))
### Features
* Add latest tag to ghcr container image ([#1224](https://github.com/fallenbagel/jellyseerr/issues/1224)) ([b9dc9bc](https://github.com/fallenbagel/jellyseerr/commit/b9dc9bceb5805889c1ea3157c3ace880865eaf9c))
* Add release charts workflow ([#1140](https://github.com/fallenbagel/jellyseerr/issues/1140)) ([3cc34b0](https://github.com/fallenbagel/jellyseerr/commit/3cc34b0db6b868a6133408a69a60b7eab69d9ea3))
* **settings:** add settings for custom DNS servers and IPv4 resolution first ([#1266](https://github.com/fallenbagel/jellyseerr/issues/1266)) ([7fcc0eb](https://github.com/fallenbagel/jellyseerr/commit/7fcc0eb66d907e74b72197d6abee511150ab5e1e))
# [2.3.0](https://github.com/fallenbagel/jellyseerr/compare/v2.2.3...v2.3.0) (2025-01-16)
### Bug Fixes
* correct typos for the special episodes setting ([#1209](https://github.com/fallenbagel/jellyseerr/issues/1209)) ([ebe7d11](https://github.com/fallenbagel/jellyseerr/commit/ebe7d11a5393f3d444dd9613854d6054af1ec58b)), closes [#1193](https://github.com/fallenbagel/jellyseerr/issues/1193) [#1208](https://github.com/fallenbagel/jellyseerr/issues/1208)
* **externalapi:** clear cache after a request is made ([#1217](https://github.com/fallenbagel/jellyseerr/issues/1217)) ([f718cec](https://github.com/fallenbagel/jellyseerr/commit/f718cec23fccbfd16fdb792c2778cd543b751799)), closes [#1207](https://github.com/fallenbagel/jellyseerr/issues/1207)
* **jellyfinlogin:** add proper error message when no admin user exists ([#1216](https://github.com/fallenbagel/jellyseerr/issues/1216)) ([ac90802](https://github.com/fallenbagel/jellyseerr/commit/ac908026dbb7ca06c0fb520bbb360120d6b87feb))
* optimize media status update to avoid lifecycle hook triggers ([#1218](https://github.com/fallenbagel/jellyseerr/issues/1218)) ([656cd91](https://github.com/fallenbagel/jellyseerr/commit/656cd91c9c90e57914b7fedb097f29e21fb18090))
* **overriderules:** allow override rules only when the service is created ([#1259](https://github.com/fallenbagel/jellyseerr/issues/1259)) ([ce1b39f](https://github.com/fallenbagel/jellyseerr/commit/ce1b39f73b953b6fa0a00948e72d24c43476bc5f))
* prevent TypeORM subscribers from calling itself over and over ([#1215](https://github.com/fallenbagel/jellyseerr/issues/1215)) ([d67ec57](https://github.com/fallenbagel/jellyseerr/commit/d67ec571c5950f04b85f5a268b38eb026a156320))
* resolve plex user mismatch due to caching issues ([#1242](https://github.com/fallenbagel/jellyseerr/issues/1242)) ([131a5a2](https://github.com/fallenbagel/jellyseerr/commit/131a5a2b0b1a235599940affc183b93c36f12ade)), closes [#1227](https://github.com/fallenbagel/jellyseerr/issues/1227)
* **settingsmigrator:** prevent region migration from running multiple times ([#1255](https://github.com/fallenbagel/jellyseerr/issues/1255)) ([1c6f536](https://github.com/fallenbagel/jellyseerr/commit/1c6f5362d773c850a5e58b5013f0d65474467e9c)), closes [#1251](https://github.com/fallenbagel/jellyseerr/issues/1251)
* **setup:** fix continue button disabled on refresh in setup 3 ([#1211](https://github.com/fallenbagel/jellyseerr/issues/1211)) ([0b331ca](https://github.com/fallenbagel/jellyseerr/commit/0b331ca579c75e546dcdbf0f1896e0f0ec3a89f1))
* **setup:** plex library setting validation ([#1233](https://github.com/fallenbagel/jellyseerr/issues/1233)) ([b8dbfaa](https://github.com/fallenbagel/jellyseerr/commit/b8dbfaaed083734b05a28a05bf100941dc673ea7))
* specify cached image type ([#1237](https://github.com/fallenbagel/jellyseerr/issues/1237)) ([d71ee58](https://github.com/fallenbagel/jellyseerr/commit/d71ee58302fe95c9c79e27b4edf317a98faf6f5c))
* **ui:** resolve streaming region dropdown overlap ([#1210](https://github.com/fallenbagel/jellyseerr/issues/1210)) ([2f0e493](https://github.com/fallenbagel/jellyseerr/commit/2f0e4932572497322df0d7d7f4377aeb9cc35d5b)), closes [#1206](https://github.com/fallenbagel/jellyseerr/issues/1206)
* **users:** correct request count query for PostgreSQL compatibility ([#1213](https://github.com/fallenbagel/jellyseerr/issues/1213)) ([f3ebf60](https://github.com/fallenbagel/jellyseerr/commit/f3ebf6028b23f803a1c8801b1541a444e8856421))
### Features
* Add latest tag to ghcr container image ([#1224](https://github.com/fallenbagel/jellyseerr/issues/1224)) ([b9dc9bc](https://github.com/fallenbagel/jellyseerr/commit/b9dc9bceb5805889c1ea3157c3ace880865eaf9c))
* Add release charts workflow ([#1140](https://github.com/fallenbagel/jellyseerr/issues/1140)) ([3cc34b0](https://github.com/fallenbagel/jellyseerr/commit/3cc34b0db6b868a6133408a69a60b7eab69d9ea3))
* **settings:** add settings for custom DNS servers and IPv4 resolution first ([#1266](https://github.com/fallenbagel/jellyseerr/issues/1266)) ([7fcc0eb](https://github.com/fallenbagel/jellyseerr/commit/7fcc0eb66d907e74b72197d6abee511150ab5e1e))
## [2.2.3](https://github.com/fallenbagel/jellyseerr/compare/v2.2.2...v2.2.3) (2024-12-30)
### Bug Fixes
* properly fetch sonarr/radarr specific override rules ([#1199](https://github.com/fallenbagel/jellyseerr/issues/1199)) ([814a735](https://github.com/fallenbagel/jellyseerr/commit/814a7357c0c7418091e8d3e911adc403811c9dfe))
* **usersettings:** fix the streaming region setting toggling itself ([#1203](https://github.com/fallenbagel/jellyseerr/issues/1203)) ([7e94ad7](https://github.com/fallenbagel/jellyseerr/commit/7e94ad721026a03d3ae640ee2deb60e321cabf10)), closes [#1200](https://github.com/fallenbagel/jellyseerr/issues/1200)
## [2.2.2](https://github.com/fallenbagel/jellyseerr/compare/v2.2.1...v2.2.2) (2024-12-30)
### Bug Fixes
* **overriderules:** apply override rules to tv shows during request ([#1198](https://github.com/fallenbagel/jellyseerr/issues/1198)) ([f8a8ebd](https://github.com/fallenbagel/jellyseerr/commit/f8a8ebdf76f939ccc28ce7b39343e3a606c90b33)), closes [#1197](https://github.com/fallenbagel/jellyseerr/issues/1197) [#1195](https://github.com/fallenbagel/jellyseerr/issues/1195)
## [2.2.1](https://github.com/fallenbagel/jellyseerr/compare/v2.2.0...v2.2.1) (2024-12-30)
### Bug Fixes
* **overriderules:** apply override rules during request only for non-admin/non-auto-approve users ([#1197](https://github.com/fallenbagel/jellyseerr/issues/1197)) ([8da4870](https://github.com/fallenbagel/jellyseerr/commit/8da48709977fa0111225c3519f9128bea41867fc)), closes [#1195](https://github.com/fallenbagel/jellyseerr/issues/1195)
# [2.2.0](https://github.com/fallenbagel/jellyseerr/compare/v2.1.0...v2.2.0) (2024-12-29)
### Bug Fixes
* **avatarproxy:** add support for Emby avatars ([#1128](https://github.com/fallenbagel/jellyseerr/issues/1128)) ([17418f8](https://github.com/fallenbagel/jellyseerr/commit/17418f82af53362338aebe9602373a3c8fa027f7)), closes [#1101](https://github.com/fallenbagel/jellyseerr/issues/1101)
* **blacklist:** remove a "undefined" appearing when the blacklist modal closes ([#1142](https://github.com/fallenbagel/jellyseerr/issues/1142)) ([b01f98f](https://github.com/fallenbagel/jellyseerr/commit/b01f98f7e280a037eba303eeaa836f6623daa440))
* **discover:** display recent requests even if there is an error with *arr ([#1141](https://github.com/fallenbagel/jellyseerr/issues/1141)) ([fa443c0](https://github.com/fallenbagel/jellyseerr/commit/fa443c05bedfca8208bfb05ab02c3b0e678e4ca0))
* **discover:** resolve a typing issue with the WatchlistItem interface ([#1156](https://github.com/fallenbagel/jellyseerr/issues/1156)) ([de6e591](https://github.com/fallenbagel/jellyseerr/commit/de6e591baedacb33704216842dddaa2b96bfae19))
* **emby:** change default value of Accept-Encoding header ([#1157](https://github.com/fallenbagel/jellyseerr/issues/1157)) ([7c734bc](https://github.com/fallenbagel/jellyseerr/commit/7c734bc8732a511e62edfcc371028ead6b6f1b12))
* fix PostgreSQL migrations and TelegramMessageThreadId migration ([#1171](https://github.com/fallenbagel/jellyseerr/issues/1171)) ([0491a04](https://github.com/fallenbagel/jellyseerr/commit/0491a04ef1816e81bb495746cc529fc621e4e147))
* handle non-existent rottentomatoes rating for movies ([#1169](https://github.com/fallenbagel/jellyseerr/issues/1169)) ([347a24a](https://github.com/fallenbagel/jellyseerr/commit/347a24a97b354725c4ccb3b5a07793b96ff60b80))
* remove non-null requirement for some fields ([#1175](https://github.com/fallenbagel/jellyseerr/issues/1175)) ([13d15d1](https://github.com/fallenbagel/jellyseerr/commit/13d15d1dcf4a80bc0b544fecbeced706f2dbd816)), closes [#628](https://github.com/fallenbagel/jellyseerr/issues/628)
* **requestlist:** use default value of sort direction only if valid ([#1174](https://github.com/fallenbagel/jellyseerr/issues/1174)) ([59c22cc](https://github.com/fallenbagel/jellyseerr/commit/59c22ccc089c960b523ccfb69efc680b2687c353)), closes [#1147](https://github.com/fallenbagel/jellyseerr/issues/1147)
* **server/settings:** write settings to a temp file then move to avoid corruption ([#1067](https://github.com/fallenbagel/jellyseerr/issues/1067)) ([01bbece](https://github.com/fallenbagel/jellyseerr/commit/01bbeced65b82f5041462cd7a6c9016274acade4))
* **ui:** allow thetvdb images for unmatched series ([#1105](https://github.com/fallenbagel/jellyseerr/issues/1105)) ([9b151fe](https://github.com/fallenbagel/jellyseerr/commit/9b151feb4f44d631b44c88c089f184c4c93161c5)), closes [#1075](https://github.com/fallenbagel/jellyseerr/issues/1075)
* **ui:** display Rotten Tomatoes for 0% ratings ([#1178](https://github.com/fallenbagel/jellyseerr/issues/1178)) ([5345207](https://github.com/fallenbagel/jellyseerr/commit/534520794071d8530d6325460e61dabfcb46fbf0)), closes [#1166](https://github.com/fallenbagel/jellyseerr/issues/1166)
* **ui:** resize streaming service logos ([#1106](https://github.com/fallenbagel/jellyseerr/issues/1106)) ([fe5d016](https://github.com/fallenbagel/jellyseerr/commit/fe5d016929d18c38aef7a3d48e4828188131e025)), closes [#1103](https://github.com/fallenbagel/jellyseerr/issues/1103)
* use less strict validation for external URLs ([#1104](https://github.com/fallenbagel/jellyseerr/issues/1104)) ([14f316a](https://github.com/fallenbagel/jellyseerr/commit/14f316a9a6d91c25c43e07ae66923785f90b1fdf)), closes [#1068](https://github.com/fallenbagel/jellyseerr/issues/1068)
* use links instead of buttons for external links in movie/tv details page ([#923](https://github.com/fallenbagel/jellyseerr/issues/923)) ([5776715](https://github.com/fallenbagel/jellyseerr/commit/57767156f79cb0bcb761f6fc0907d747f126e146))
* use tmdb first as metadata provider and fallback to tvdb ([#1138](https://github.com/fallenbagel/jellyseerr/issues/1138)) ([84fd884](https://github.com/fallenbagel/jellyseerr/commit/84fd884052ea2177c92d144367c4b4ed1dde3b73)), closes [#1137](https://github.com/fallenbagel/jellyseerr/issues/1137)
* **usediscover hook:** fixing duplicate movies ([#708](https://github.com/fallenbagel/jellyseerr/issues/708)) ([39dbb7f](https://github.com/fallenbagel/jellyseerr/commit/39dbb7f7e59cf4b1b5f029089c6b1ea6a0d7e5f5))
* **usersettings:** allow unset email and add more explicit email error message ([#1096](https://github.com/fallenbagel/jellyseerr/issues/1096)) ([39a5ccb](https://github.com/fallenbagel/jellyseerr/commit/39a5ccb7f3a6ed4e93b12e11021bb30515936ce7))
### Features
* add a setting for special episodes ([#1193](https://github.com/fallenbagel/jellyseerr/issues/1193)) ([b6e2e6c](https://github.com/fallenbagel/jellyseerr/commit/b6e2e6ce615cb94cea8d2335140fe245a0ca2d8a))
* add postgres support + migrations ([#628](https://github.com/fallenbagel/jellyseerr/issues/628)) ([44a9221](https://github.com/fallenbagel/jellyseerr/commit/44a9221a9dca501fa57c0bcbd743aed9889059ff)), closes [#186](https://github.com/fallenbagel/jellyseerr/issues/186)
* **helm:** add base helm chart ([#1116](https://github.com/fallenbagel/jellyseerr/issues/1116)) ([27e3d46](https://github.com/fallenbagel/jellyseerr/commit/27e3d465bd7eaa3f382c961220f8af1860a15c7f))
* **notifications:** added telegram thread id's ([#1145](https://github.com/fallenbagel/jellyseerr/issues/1145)) ([d76d794](https://github.com/fallenbagel/jellyseerr/commit/d76d79441142ccc6fe2357549f39a1fba3546ff9))
* **notifications:** improve discord notifications ([#1102](https://github.com/fallenbagel/jellyseerr/issues/1102)) ([5c24e79](https://github.com/fallenbagel/jellyseerr/commit/5c24e79b1dddc3c8421e57e67302fa3dc064f87f))
* override rules ([#945](https://github.com/fallenbagel/jellyseerr/issues/945)) ([9a59529](https://github.com/fallenbagel/jellyseerr/commit/9a595296dbdd00bb3477052b53412e6019667740))
* **requestlist:** sort direction ([#1147](https://github.com/fallenbagel/jellyseerr/issues/1147)) ([66a5ab4](https://github.com/fallenbagel/jellyseerr/commit/66a5ab41ab646501f72a658782e8a89f9faf939f))
* **usersettings:** add separate setting for streaming region ([#993](https://github.com/fallenbagel/jellyseerr/issues/993)) ([89831f7](https://github.com/fallenbagel/jellyseerr/commit/89831f70909df0a76dfa8a027702e4e5f9b57be8)), closes [#890](https://github.com/fallenbagel/jellyseerr/issues/890)
# [2.1.0](https://github.com/fallenbagel/jellyseerr/compare/v2.0.1...v2.1.0) (2024-11-12)
### Bug Fixes
* **blacklist:** request data only when modal is shown, remove useless ratelimit and lazy load blacklist ([#1084](https://github.com/fallenbagel/jellyseerr/issues/1084)) ([694913c](https://github.com/fallenbagel/jellyseerr/commit/694913c767c558147f413e2375b2512567541127))
* cache Jellyfin/Emby avatars from API ([#1045](https://github.com/fallenbagel/jellyseerr/issues/1045)) ([0bbcfcb](https://github.com/fallenbagel/jellyseerr/commit/0bbcfcbd5e03137aba35ceb07e42f623aefa41d7))
* **externalapi:** extract basic auth and pass it through header ([#1062](https://github.com/fallenbagel/jellyseerr/issues/1062)) ([cf59102](https://github.com/fallenbagel/jellyseerr/commit/cf59102ef91fa0e907cc6369b0fe60b503c823ca)), closes [#1027](https://github.com/fallenbagel/jellyseerr/issues/1027)
* fixes wrong avatar rendered for the modifiedBy user in request list ([#1028](https://github.com/fallenbagel/jellyseerr/issues/1028)) ([cbb1a74](https://github.com/fallenbagel/jellyseerr/commit/cbb1a74526ef5c003b7081c31146c52e7e551d60)), closes [#1017](https://github.com/fallenbagel/jellyseerr/issues/1017)
* **i18n:** update extractMessages function for better escaping of characters ([#1079](https://github.com/fallenbagel/jellyseerr/issues/1079)) ([a2d2fd3](https://github.com/fallenbagel/jellyseerr/commit/a2d2fd3c2a53fc98d6288bd049fd8e37a1914280))
* remove language profiles dropdown for Sonarr v4 ([#1000](https://github.com/fallenbagel/jellyseerr/issues/1000)) ([d331798](https://github.com/fallenbagel/jellyseerr/commit/d331798b28a7bd32a27fc0ccbad2354be2e15b02)), closes [#207](https://github.com/fallenbagel/jellyseerr/issues/207)
* resolve error when setup on second attempt ([#1061](https://github.com/fallenbagel/jellyseerr/issues/1061)) ([64f4610](https://github.com/fallenbagel/jellyseerr/commit/64f4610b9ffcad01c24ecdd81b8b3a2f3db4c98d))
* **setup:** add leading slash validation for baseUrl ([#1083](https://github.com/fallenbagel/jellyseerr/issues/1083)) ([2829c25](https://github.com/fallenbagel/jellyseerr/commit/2829c2548aa0cd03f92433d3bc3b9b2739e98486))
* update i18n translations ([#1090](https://github.com/fallenbagel/jellyseerr/issues/1090)) ([f25b32a](https://github.com/fallenbagel/jellyseerr/commit/f25b32aec8ec3c2fd40ccfc6a83f18ddc99c1a15))
* use fs/promises for settings ([#1057](https://github.com/fallenbagel/jellyseerr/issues/1057)) ([f2ed101](https://github.com/fallenbagel/jellyseerr/commit/f2ed101e522561dab8563b744d908ff036c957c5))
### Features
* add a warning if permissions are missing from config folder ([#1030](https://github.com/fallenbagel/jellyseerr/issues/1030)) ([f2b6315](https://github.com/fallenbagel/jellyseerr/commit/f2b63156d1d4aa903eb261d2c80c059c39d9091b))
* add bypass list, bypass local addresses and username/password to proxy setting ([#1059](https://github.com/fallenbagel/jellyseerr/issues/1059)) ([ca838a0](https://github.com/fallenbagel/jellyseerr/commit/ca838a00fa4acb0ccdfbac8be4cf7fde493346f7))
* add more logs to migrations and create a settings backup ([#1036](https://github.com/fallenbagel/jellyseerr/issues/1036)) ([326001c](https://github.com/fallenbagel/jellyseerr/commit/326001c3ecc92dc730f327130a71e797882a62b9))
* exit Jellyseerr when migration fails ([#1026](https://github.com/fallenbagel/jellyseerr/issues/1026)) ([a2b3408](https://github.com/fallenbagel/jellyseerr/commit/a2b3408c9aa5e22e1193f535c969325254f08193))
* proxy setting ([#1031](https://github.com/fallenbagel/jellyseerr/issues/1031)) ([4b4eeb6](https://github.com/fallenbagel/jellyseerr/commit/4b4eeb6ec707e0971fe8745910edbfb546bf25fe))
## [2.0.1](https://github.com/fallenbagel/jellyseerr/compare/v2.0.0...v2.0.1) (2024-10-17)
### Bug Fixes
* fetch override to attach XSRF token to fix csrfProtection issue ([#1014](https://github.com/fallenbagel/jellyseerr/issues/1014)) ([4945b54](https://github.com/fallenbagel/jellyseerr/commit/4945b5429848b36fc0ee41cf0277ed79f53d8286)), closes [#1011](https://github.com/fallenbagel/jellyseerr/issues/1011)
* handle non-existent rottentomatoes rating ([#1018](https://github.com/fallenbagel/jellyseerr/issues/1018)) ([a351264](https://github.com/fallenbagel/jellyseerr/commit/a351264b878b2660ae7a6415f26d38b52015c591))
* rewrite avatarproxy and CachedImage ([#1016](https://github.com/fallenbagel/jellyseerr/issues/1016)) ([4e48fdf](https://github.com/fallenbagel/jellyseerr/commit/4e48fdf2cb9f76ae5c25073b585718650abd3288)), closes [#1012](https://github.com/fallenbagel/jellyseerr/issues/1012) [#1013](https://github.com/fallenbagel/jellyseerr/issues/1013)
* use jellyfinMediaId4k for mediaUrl4k ([#1006](https://github.com/fallenbagel/jellyseerr/issues/1006)) ([a0f80fe](https://github.com/fallenbagel/jellyseerr/commit/a0f80fe7647ef4a9025ca93407cd21ddc640fed1)), closes [#520](https://github.com/fallenbagel/jellyseerr/issues/520)
# [2.0.0](https://github.com/fallenbagel/jellyseerr/compare/v1.9.2...v2.0.0) (2024-10-15)
### Bug Fixes
* abort availability sync job if auth token invalid/connection lost ([#845](https://github.com/fallenbagel/jellyseerr/issues/845)) ([bdee340](https://github.com/fallenbagel/jellyseerr/commit/bdee34053080c8975a88ba16a9e8f402e10fe7e1))
* add an error message to say when an email is already taken ([#947](https://github.com/fallenbagel/jellyseerr/issues/947)) ([89e0a83](https://github.com/fallenbagel/jellyseerr/commit/89e0a831ec85a6905f539f59b7523bb1feb90bcf))
* add missing brackets ([#888](https://github.com/fallenbagel/jellyseerr/issues/888)) ([6cea8bb](https://github.com/fallenbagel/jellyseerr/commit/6cea8bba592b8db566b4d8147630385f5c377f1b))
* add missing content-type header ([#887](https://github.com/fallenbagel/jellyseerr/issues/887)) ([2be9c7d](https://github.com/fallenbagel/jellyseerr/commit/2be9c7dcc1f418726a19e99cfdb3933257a03c6f))
* add missing header when creating an issue ([#879](https://github.com/fallenbagel/jellyseerr/issues/879)) ([084e1b2](https://github.com/fallenbagel/jellyseerr/commit/084e1b224e109f0f8279741b9a5ead138396d7f8))
* add missing parameter to delete requests from ExternalAPI ([#904](https://github.com/fallenbagel/jellyseerr/issues/904)) ([36d98a2](https://github.com/fallenbagel/jellyseerr/commit/36d98a2681921a8770027b78878688f2782e8b77)), closes [#903](https://github.com/fallenbagel/jellyseerr/issues/903)
* **api:** fix nextjs error handler ([#882](https://github.com/fallenbagel/jellyseerr/issues/882)) ([0116c13](https://github.com/fallenbagel/jellyseerr/commit/0116c13e0632d1ccec43299fbb10cd71db45bc29))
* **api:** handle non-existent ratings on IMDb ([#822](https://github.com/fallenbagel/jellyseerr/issues/822)) ([74a2d25](https://github.com/fallenbagel/jellyseerr/commit/74a2d25f153b07a0cae5b44adca5fa1fed5a3b9e))
* **api:** save new password when reset password of local account ([#886](https://github.com/fallenbagel/jellyseerr/issues/886)) ([5cc4389](https://github.com/fallenbagel/jellyseerr/commit/5cc43898256b130c2576f34a3d4e7ce6a3940d3e))
* **blacklist:** add blacklist to mobile menu ([#980](https://github.com/fallenbagel/jellyseerr/issues/980)) ([f390da4](https://github.com/fallenbagel/jellyseerr/commit/f390da486625a22951956ba96867de63f73bfc2b)), closes [#979](https://github.com/fallenbagel/jellyseerr/issues/979)
* change SeriesSearch to MissingEpisodeSearch for season requests ([#711](https://github.com/fallenbagel/jellyseerr/issues/711)) ([ee7e91c](https://github.com/fallenbagel/jellyseerr/commit/ee7e91c7c948b17b556a625919eb1252a721bb6e))
* **docker:** add postinstall script ([#839](https://github.com/fallenbagel/jellyseerr/issues/839)) ([f714132](https://github.com/fallenbagel/jellyseerr/commit/f7141329094d88eb0940b1db1f21376142cb8893))
* enhance error messages when Fetch API fails ([#893](https://github.com/fallenbagel/jellyseerr/issues/893)) ([fccfca6](https://github.com/fallenbagel/jellyseerr/commit/fccfca6ed06c8dc599e1ea4b1b3dbac48eb3a7f6))
* handle status badge for season packs ([#927](https://github.com/fallenbagel/jellyseerr/issues/927)) ([80f6301](https://github.com/fallenbagel/jellyseerr/commit/80f63017ac5e9b1720a19c761dbef4dd517f1c2c))
* length of undefined on users warnings ([#875](https://github.com/fallenbagel/jellyseerr/issues/875)) ([c600566](https://github.com/fallenbagel/jellyseerr/commit/c600566ac0045c2314f9013b063007b087ee4327))
* remove DNS caching ([#837](https://github.com/fallenbagel/jellyseerr/issues/837)) ([268c7df](https://github.com/fallenbagel/jellyseerr/commit/268c7df28eea8b911d6a53297f5ce296983067ce))
* remove email requirement for the user, and use the username if no email provided ([#900](https://github.com/fallenbagel/jellyseerr/issues/900)) ([d5f817e](https://github.com/fallenbagel/jellyseerr/commit/d5f817e734131cdacc229361d9498a095af57950))
* remove protocol-relative URLs from next/image ([#889](https://github.com/fallenbagel/jellyseerr/issues/889)) ([c80d9a8](https://github.com/fallenbagel/jellyseerr/commit/c80d9a853a2a3451293a5382ef183c18add0c040))
* resize episode preview image ([#842](https://github.com/fallenbagel/jellyseerr/issues/842)) ([96ba53f](https://github.com/fallenbagel/jellyseerr/commit/96ba53fecc7b9d269f0d974051ab62836b0102bc))
* resize header image in network and studio pages ([#902](https://github.com/fallenbagel/jellyseerr/issues/902)) ([4220855](https://github.com/fallenbagel/jellyseerr/commit/422085523e5dfc132f3c3ca19eaa87117828b7be))
* rewrite request from axios to Fetch ([#920](https://github.com/fallenbagel/jellyseerr/issues/920)) ([9aee888](https://github.com/fallenbagel/jellyseerr/commit/9aee8887d3cca6e018f4be1c8400c22e86bf8dab))
* rewrite the rate limit utility ([#896](https://github.com/fallenbagel/jellyseerr/issues/896)) ([3fc14c9](https://github.com/fallenbagel/jellyseerr/commit/3fc14c9e2262463afec666e7f54e38d0d36cff68))
* **session:** set the correct TTL for the cookie store ([#992](https://github.com/fallenbagel/jellyseerr/issues/992)) ([96e1d40](https://github.com/fallenbagel/jellyseerr/commit/96e1d40304749ce00d2ff7359efc39a1d9724358)), closes [#991](https://github.com/fallenbagel/jellyseerr/issues/991)
* set correct user type when importing from emby ([#949](https://github.com/fallenbagel/jellyseerr/issues/949)) ([e57d265](https://github.com/fallenbagel/jellyseerr/commit/e57d2654d1c634a91649722d3a2bf4d73c4a02ca)), closes [#948](https://github.com/fallenbagel/jellyseerr/issues/948)
* **setup:** page display when homepage is loading ([#940](https://github.com/fallenbagel/jellyseerr/issues/940)) ([7423bbb](https://github.com/fallenbagel/jellyseerr/commit/7423bbbffc5bee2e52e3348254f035dc8527d973))
* **tmdb:** fallback movie/show overview to English when none is available in requested locale ([#928](https://github.com/fallenbagel/jellyseerr/issues/928)) ([12f908d](https://github.com/fallenbagel/jellyseerr/commit/12f908de7f5fbd717a5f151858b6edee3be13ed9)), closes [#925](https://github.com/fallenbagel/jellyseerr/issues/925)
* update the filter removing existing users from Jellyfin import modal ([#924](https://github.com/fallenbagel/jellyseerr/issues/924)) ([61dcd8e](https://github.com/fallenbagel/jellyseerr/commit/61dcd8e487d7886773ccb12501623c17838476e5))
### Code Refactoring
* **jellyfin:** abstract jellyfin hostname, updated ui to reflect it, better validation ([#773](https://github.com/fallenbagel/jellyseerr/issues/773)) ([38ad875](https://github.com/fallenbagel/jellyseerr/commit/38ad875dd7848b4e92ac3ccdd16dbf785f6a5c4d))
### Features
* add environment variable for API key ([#831](https://github.com/fallenbagel/jellyseerr/issues/831)) ([45ef150](https://github.com/fallenbagel/jellyseerr/commit/45ef150e36944d456cc9440574b5ac75f2e4bbc1))
* adds status filter for tv shows ([#796](https://github.com/fallenbagel/jellyseerr/issues/796)) ([cfd1bc2](https://github.com/fallenbagel/jellyseerr/commit/cfd1bc253557d6e19725743b8aa9a2fa33bbe760)), closes [#605](https://github.com/fallenbagel/jellyseerr/issues/605)
* allow request managers to delete data from sonarr/radarr ([#644](https://github.com/fallenbagel/jellyseerr/issues/644)) ([a5d22ba](https://github.com/fallenbagel/jellyseerr/commit/a5d22ba5b83dd0e812b16f06476d993b5d59cb2a))
* blacklist items from Discover page ([#632](https://github.com/fallenbagel/jellyseerr/issues/632)) ([818aa60](https://github.com/fallenbagel/jellyseerr/commit/818aa60aac185da07bfb71b08e0448939b63a736)), closes [#490](https://github.com/fallenbagel/jellyseerr/issues/490)
* Jellyfin/Emby server type setup ([#685](https://github.com/fallenbagel/jellyseerr/issues/685)) ([15cb949](https://github.com/fallenbagel/jellyseerr/commit/15cb949f1f2e617853f90ae7bb8ae5d6622f610e))
* **jellyfinapi:** switch to API tokens instead of auth tokens ([#868](https://github.com/fallenbagel/jellyseerr/issues/868)) ([bd4da6d](https://github.com/fallenbagel/jellyseerr/commit/bd4da6d5fc8cb55c2bc3d9a8336787cbd30814d0))
* Option on item's page to add/remove from watchlist ([#781](https://github.com/fallenbagel/jellyseerr/issues/781)) ([2348f23](https://github.com/fallenbagel/jellyseerr/commit/2348f23f433195d64dee3e6eeede296fca5fdbc9)), closes [#730](https://github.com/fallenbagel/jellyseerr/issues/730)
* refresh monitored downloads before getting queue items ([#994](https://github.com/fallenbagel/jellyseerr/issues/994)) ([92ba262](https://github.com/fallenbagel/jellyseerr/commit/92ba26207dcb1ddd696e0f01931d2609c521ae45)), closes [#866](https://github.com/fallenbagel/jellyseerr/issues/866)
* show quality profile on request ([#847](https://github.com/fallenbagel/jellyseerr/issues/847)) ([6445332](https://github.com/fallenbagel/jellyseerr/commit/64453320d36595e75dcb710dfd43997bf2d2acd5))
* **translation:** added full Hebrew translation ([#871](https://github.com/fallenbagel/jellyseerr/issues/871)) ([c96ca67](https://github.com/fallenbagel/jellyseerr/commit/c96ca6742e0a6d5685319c52f995fe06e439a450))
* update Plex logo ([#884](https://github.com/fallenbagel/jellyseerr/issues/884)) ([3a363ae](https://github.com/fallenbagel/jellyseerr/commit/3a363ae1ffa7f384be6f7d25f8558b1e55a73fb3))
### Reverts
* fix(api): fix nextjs error handler ([#882](https://github.com/fallenbagel/jellyseerr/issues/882)) ([#892](https://github.com/fallenbagel/jellyseerr/issues/892)) ([62dbde4](https://github.com/fallenbagel/jellyseerr/commit/62dbde448c7f7d530de8534bb8538452d0f91276))
### BREAKING CHANGES
* This commit deprecates the JELLYFIN_TYPE variable to identify Emby media server and
instead rely on the mediaServerType that is set in the `settings.json`. Existing environment
variable users can log out and log back in to set the mediaServerType to `3` (Emby).
* feat(api): add severType to the api
* This adds a serverType to the `/auth/jellyfin` which requires a serverType to be
set (`jellyfin`/`emby`)
* refactor: use enums for serverType and rename selectedservice to serverType
* refactor(auth): jellyfin/emby authentication to set MediaServerType
* fix: issue page formatMessage for 4k media
* refactor: cleaner way of handling serverType change using MediaServerType instead of strings
instead of using strings now it will use MediaServerType enums for serverType
* revert: removed conditional render of the auto-request permission
reverts the conditional render toshow the auto-request permission if the mediaServerType was set to
Plex as this should be handled in a different PR and Cypress tests should be modified
accordingly(currently cypress test would fail if this conditional check is there)
* feat: add server type step to setup
* feat: migrate existing emby setups to use emby mediaServerType
* fix: scan jobs not running when media server type is emby
* fix: emby media server type migration
* refactor: change emby logo to full logo
* style: decrease emby logo size in setup screen
* refactor: use title case for servertype i18n message
* refactor(i18n): fix a typo
* refactor: use enums instead of numbers
* fix: remove old references to JELLYFIN_TYPE environment variable
* fix: go back to the last step when refresh the setup page
* fix: move "scanning in background" tip next to the scanning section
* fix: redirect the setup page when Jellyseerr is already setup
* **jellyfin:** Jellyfin settings now does not include a hostname. Instead it abstracted it to ip,
port, useSsl, and urlBase. However, migration of old settings to new settings should work
automatically.
* refactor: remove console logs and use getHostname and ApiErrorCodes
* fix: store req.body jellyfin settings temporarily and store only if valid
This should fix the issue where settings are saved even if the url
was invalid. Now the settings will only be saved if the url is
valid. Sort of like a test connection.
* refactor: clean up commented out code
* refactor(i18n): extract translation keys
* fix(auth): auth failing with jellyfin login is disabled
* fix(settings): jellyfin migrations replacing the rest of the settings
* fix(settings): jellyfin hostname should be carried out if hostname exists
* fix(settings): merging the wrong settings source
* refactor(settings): use migrator for dynamic settings migrations
* refactor(settingsmigrator): settings migration handler and the migrations
* test(cypress): fix cypress tests failing
cypress settings were lacking some of the jobs so when the startJobs() is called when the app
starts, it was failing to schedule the jobs where their cron timings were not specified in the
cypress settings. Therefore, this commit adds those jobs back. In addition, other setting options
were added to keep cypress settings consistent with a normal user.
* chore(prettierignore): ignore cypress/config/settings.cypress.json as it does not need prettier
* chore(prettier): ran formatter on cypress config to fix format check error
format check locally passes on this file. However, it fails during the github actions format check.
Therefore, json language features formatter was run instead of prettier to see if that fixes the
issue.
* test(cypress): add only missing jobs to the cypress settings
* ci: attempt at trying to get formatter to pass on cypress config json file
* refactor: revert the changes brought to try and fix formatter
added back the rest of the cypress settings and removed cypress settings from .prettierignore
* refactor(settings): better erorr logging when jellyfin connection test fails in settings page
## [1.9.2](https://github.com/fallenbagel/jellyseerr/compare/v1.9.1...v1.9.2) (2024-06-13)
### Bug Fixes
* **auth:** improve login resilience with headerless fallback authentication ([#814](https://github.com/fallenbagel/jellyseerr/issues/814)) ([a9741fa](https://github.com/fallenbagel/jellyseerr/commit/a9741fa36d06710aa00d28db3dd2c29f2b0973d3))
* **auth:** validation of ipv6/ipv4 ([#812](https://github.com/fallenbagel/jellyseerr/issues/812)) ([9aeb360](https://github.com/fallenbagel/jellyseerr/commit/9aeb3604e6498c388df1d30dd0b613ba84160fc0)), closes [#795](https://github.com/fallenbagel/jellyseerr/issues/795)
* bypass cache-able lookups when resolving localhost ([#813](https://github.com/fallenbagel/jellyseerr/issues/813)) ([b5a0699](https://github.com/fallenbagel/jellyseerr/commit/b5a069901a9545772deaa9c491f2075261da0189))
## [1.9.1](https://github.com/fallenbagel/jellyseerr/compare/v1.9.0...v1.9.1) (2024-06-12)
### Bug Fixes
* **api:** add DNS caching ([#810](https://github.com/fallenbagel/jellyseerr/issues/810)) ([46ee8a4](https://github.com/fallenbagel/jellyseerr/commit/46ee8a4ca13b026bd929b4027eb001cc74064bb8)), closes [#387](https://github.com/fallenbagel/jellyseerr/issues/387) [#657](https://github.com/fallenbagel/jellyseerr/issues/657) [#728](https://github.com/fallenbagel/jellyseerr/issues/728)
* empty email in user settings ([#807](https://github.com/fallenbagel/jellyseerr/issues/807)) ([20863d4](https://github.com/fallenbagel/jellyseerr/commit/20863d4a8dabe78fb5c52995b5bcb2da557a804e)), closes [#803](https://github.com/fallenbagel/jellyseerr/issues/803)
* **jellyfinscanner:** assign only 4k available badge for a 4k request instead of both badges ([#805](https://github.com/fallenbagel/jellyseerr/issues/805)) ([d31a2c3](https://github.com/fallenbagel/jellyseerr/commit/d31a2c37e639c1126b446277fa5d666d8102fef5))
* remove the settings button of media when useless ([#809](https://github.com/fallenbagel/jellyseerr/issues/809)) ([f52939e](https://github.com/fallenbagel/jellyseerr/commit/f52939e4cdcbee94fc35165f613f6b3e21599e3c))
### Reverts
* Revert "ci: update format check command to ignore .prettierignore files (#787)" (#788) ([4757f1c](https://github.com/fallenbagel/jellyseerr/commit/4757f1c3e599304410a737c11f97db92a2bfcefd)), closes [#787](https://github.com/fallenbagel/jellyseerr/issues/787) [#788](https://github.com/fallenbagel/jellyseerr/issues/788)
# [1.9.0](https://github.com/fallenbagel/jellyseerr/compare/v1.8.1...v1.9.0) (2024-05-29)
### Bug Fixes
* **api:** save user email on the first try ([#760](https://github.com/fallenbagel/jellyseerr/issues/760)) ([0bbcfdc](https://github.com/fallenbagel/jellyseerr/commit/0bbcfdc4f9ff9735f45232a2412ac8444f525de9)), closes [#227](https://github.com/fallenbagel/jellyseerr/issues/227) [#748](https://github.com/fallenbagel/jellyseerr/issues/748)
* **api:** small errors on overseerr-api.yaml ([#721](https://github.com/fallenbagel/jellyseerr/issues/721)) ([0eea109](https://github.com/fallenbagel/jellyseerr/commit/0eea1090dfdba4333646280c84b09b0197fefa74))
* **auth:** case-sensitive logins not updating authtokens ([#778](https://github.com/fallenbagel/jellyseerr/issues/778)) ([2bd125d](https://github.com/fallenbagel/jellyseerr/commit/2bd125d9a55d15a398ceb5f2996105a5e861b6e0))
* **jellyfinapi:** use external api class for jellyfin api requests ([#762](https://github.com/fallenbagel/jellyseerr/issues/762)) ([650c339](https://github.com/fallenbagel/jellyseerr/commit/650c339d74d4fe85ef7f76184901e86f4eeada85)), closes [#728](https://github.com/fallenbagel/jellyseerr/issues/728) [#387](https://github.com/fallenbagel/jellyseerr/issues/387)
* **logging:** handle media server connection refused error/toast ([#748](https://github.com/fallenbagel/jellyseerr/issues/748)) ([f486fb5](https://github.com/fallenbagel/jellyseerr/commit/f486fb5e75f9ea21456952b6a52cb841e30f3556))
* use UTF8 encoding for webhook JSON ([#714](https://github.com/fallenbagel/jellyseerr/issues/714)) ([c0a0b9c](https://github.com/fallenbagel/jellyseerr/commit/c0a0b9c8a8b0c2eeaf3fa9159f10742baa9f6c1f))
### Features
* add Latin American Spanish translation ([#725](https://github.com/fallenbagel/jellyseerr/issues/725)) ([783fda9](https://github.com/fallenbagel/jellyseerr/commit/783fda9621aef8ffd46e5f036136de82ed502ccc)), closes [#677](https://github.com/fallenbagel/jellyseerr/issues/677)
* add merge conflict labeler workflow ([#719](https://github.com/fallenbagel/jellyseerr/issues/719)) ([d9d07c7](https://github.com/fallenbagel/jellyseerr/commit/d9d07c705a24d5c49905066aac45a3c6a2e36a53))
* **auth:** send real information on login ([#470](https://github.com/fallenbagel/jellyseerr/issues/470)) ([d765055](https://github.com/fallenbagel/jellyseerr/commit/d765055da83ee94546399f6348aee14d8427d462))
* **settings:** stores jellyfin/emby server name in the settings ([#763](https://github.com/fallenbagel/jellyseerr/issues/763)) ([7a5e8d6](https://github.com/fallenbagel/jellyseerr/commit/7a5e8d69bf620c8e7bf5f284840b1a5fe757ae5f))
## [1.8.1](https://github.com/fallenbagel/jellyseerr/compare/v1.8.0...v1.8.1) (2024-04-17)
### Reverts
* Revert "fix: disable seasonfolder option in sonarr for jellyfin/Emby users" (#718) ([cd0fa3e](https://github.com/fallenbagel/jellyseerr/commit/cd0fa3e2232dcb522673143f113fc382fb2ff0a3)), closes [#718](https://github.com/fallenbagel/jellyseerr/issues/718)
# [1.8.0](https://github.com/fallenbagel/jellyseerr/compare/v1.7.0...v1.8.0) (2024-04-15)
### Bug Fixes
* correct width issue in datepicker of filterSliderOver ([f564cdd](https://github.com/fallenbagel/jellyseerr/commit/f564cddff4525ccebffbf304672d49c57aefe635)), closes [#415](https://github.com/fallenbagel/jellyseerr/issues/415)
* disable seasonfolder option in sonarr for jellyfin/Emby users ([8ec8f2a](https://github.com/fallenbagel/jellyseerr/commit/8ec8f2ac5730aad3b12dcd8ed95bb553b46b399c)), closes [#126](https://github.com/fallenbagel/jellyseerr/issues/126) [#575](https://github.com/fallenbagel/jellyseerr/issues/575)
* **embyauth:** remove the accidentally added mediaServerType change code from another PR ([#684](https://github.com/fallenbagel/jellyseerr/issues/684)) ([c2e8771](https://github.com/fallenbagel/jellyseerr/commit/c2e87714b4c4aa11bf68dcd82b76979f82990f3c))
* ensure watchlist updates are immediately reflected ([b85d7f3](https://github.com/fallenbagel/jellyseerr/commit/b85d7f37b931735ca2ad955dccb6599bf445fc73))
* fix german translation for "components.Discover.FilterSlideover.tmdbuservotecount" ([e032c02](https://github.com/fallenbagel/jellyseerr/commit/e032c02f5f84dc4b6b470eecb18ba2c376c55f37))
* fix the translations for watchlist permissions and userSettings page ([8c82a61](https://github.com/fallenbagel/jellyseerr/commit/8c82a61450a7525c0e2f1b64e6939da47a7c715d))
* **i18n:** fixed jellyfin jobs ([7eed236](https://github.com/fallenbagel/jellyseerr/commit/7eed23637ddfb10bdcb19698e7ae171f07299502))
* **jellyfin.ts:** process virtual seasons if they have non virtual episodes ([#639](https://github.com/fallenbagel/jellyseerr/issues/639)) ([db84f65](https://github.com/fallenbagel/jellyseerr/commit/db84f6529ab285be26c96daaab065dfabf347417))
* **jellyfinapi:** refactors jellyfin library sync to support automatic grouping and collections ([#700](https://github.com/fallenbagel/jellyseerr/issues/700)) ([3856061](https://github.com/fallenbagel/jellyseerr/commit/3856061fe1ee4d3457996586b4979ad9dd60765a)), closes [#450](https://github.com/fallenbagel/jellyseerr/issues/450) [#524](https://github.com/fallenbagel/jellyseerr/issues/524) [#256](https://github.com/fallenbagel/jellyseerr/issues/256) [#489](https://github.com/fallenbagel/jellyseerr/issues/489) [#450](https://github.com/fallenbagel/jellyseerr/issues/450) [#524](https://github.com/fallenbagel/jellyseerr/issues/524) [#515](https://github.com/fallenbagel/jellyseerr/issues/515) [#474](https://github.com/fallenbagel/jellyseerr/issues/474) [#473](https://github.com/fallenbagel/jellyseerr/issues/473)
* **jellyfinlogin:** use externalHostname if set for forgetpassword link ([405f6bb](https://github.com/fallenbagel/jellyseerr/commit/405f6bbb7ffc390327c99dcef2cbbf9b3bc75f01)), closes [#199](https://github.com/fallenbagel/jellyseerr/issues/199) [#424](https://github.com/fallenbagel/jellyseerr/issues/424) [#212](https://github.com/fallenbagel/jellyseerr/issues/212)
* **jellyfinscanner:** conditionally assign the jellyfinMediaId and jellyfinMediaId4k ([#686](https://github.com/fallenbagel/jellyseerr/issues/686)) ([530be42](https://github.com/fallenbagel/jellyseerr/commit/530be4272cce1b0d74d7f4156b8d794cda6ea03f)), closes [#681](https://github.com/fallenbagel/jellyseerr/issues/681)
* **langcode:** fixes the ukranian language code ([dc67aaa](https://github.com/fallenbagel/jellyseerr/commit/dc67aaaf53eae86ba20c6c2798c92ec40962d85f)), closes [#504](https://github.com/fallenbagel/jellyseerr/issues/504)
* nullable type for jellyfinMediaId(4k) ([#702](https://github.com/fallenbagel/jellyseerr/issues/702)) ([0900a95](https://github.com/fallenbagel/jellyseerr/commit/0900a95532501b6f4d9698de7530a771512924fc)), closes [#668](https://github.com/fallenbagel/jellyseerr/issues/668)
* request watchlist items sequentially to prevent bypassing quota ([#3667](https://github.com/fallenbagel/jellyseerr/issues/3667)) ([b40ba07](https://github.com/fallenbagel/jellyseerr/commit/b40ba07a4de5857b8392f667038eeb0b22aa5d9a))
* resolved issue with region selector and all regions value ([#3652](https://github.com/fallenbagel/jellyseerr/issues/3652)) ([28a2c50](https://github.com/fallenbagel/jellyseerr/commit/28a2c50495d0ce531da7f8c442bd488a54b1e84c))
* typos on readme ([#655](https://github.com/fallenbagel/jellyseerr/issues/655)) ([eee9a02](https://github.com/fallenbagel/jellyseerr/commit/eee9a025d246c72bcd3aca753d9e49c1f8f064ea))
* **watchlist:** added missing prop for watchlist item removal button in watchlist page ([a0ec992](https://github.com/fallenbagel/jellyseerr/commit/a0ec992028093257e9fa043622e236014f02dea3))
* **watchlist:** discover local watchlist item display and profile local watchlist slider visibility ([3cb9494](https://github.com/fallenbagel/jellyseerr/commit/3cb9494e6210151716587d8c4b22e0a21692cf88))
### Features
* add ko language ([#3619](https://github.com/fallenbagel/jellyseerr/issues/3619)) ([9250735](https://github.com/fallenbagel/jellyseerr/commit/92507359b48db08b0066047d6505660b8c8b0b12))
* add Peacock to Network Slider ([#3545](https://github.com/fallenbagel/jellyseerr/issues/3545)) ([0c39057](https://github.com/fallenbagel/jellyseerr/commit/0c39057ca58743697e9dcc3b678440ac3688c65a))
* add tooltips to tautulli avatars ([#3601](https://github.com/fallenbagel/jellyseerr/issues/3601)) ([c484810](https://github.com/fallenbagel/jellyseerr/commit/c484810f965f8d04643c25c6d283dd83f4bd4a23))
* added Letterboxd links for the external link blocks for movies ([981f5e6](https://github.com/fallenbagel/jellyseerr/commit/981f5e679c4c707e119741240a58de8bb07f9d6c))
* check if first jellyfin user is admin ([#635](https://github.com/fallenbagel/jellyseerr/issues/635)) ([010df62](https://github.com/fallenbagel/jellyseerr/commit/010df62776191fe4c195e590df338f8d8523f55b)), closes [#610](https://github.com/fallenbagel/jellyseerr/issues/610)
* jellyseerr makeover ([#715](https://github.com/fallenbagel/jellyseerr/issues/715)) ([0c27132](https://github.com/fallenbagel/jellyseerr/commit/0c2713213c56de342f76300d12ce01fd543d2ce3))
* **job:** media availability support for jellyfin/emby ([#522](https://github.com/fallenbagel/jellyseerr/issues/522)) ([3eb1bb3](https://github.com/fallenbagel/jellyseerr/commit/3eb1bb3d8ff22391acb2e629bbec7b6e4b65ca95)), closes [#406](https://github.com/fallenbagel/jellyseerr/issues/406) [#193](https://github.com/fallenbagel/jellyseerr/issues/193) [#516](https://github.com/fallenbagel/jellyseerr/issues/516) [#362](https://github.com/fallenbagel/jellyseerr/issues/362) [#84](https://github.com/fallenbagel/jellyseerr/issues/84)
* **notif:** add Pushover sound options ([#2403](https://github.com/fallenbagel/jellyseerr/issues/2403)) ([3ea5076](https://github.com/fallenbagel/jellyseerr/commit/3ea5076053359b518b1b4d537e7b61580d9275a3))
* select default seriesType for anime ([#3627](https://github.com/fallenbagel/jellyseerr/issues/3627)) ([f628635](https://github.com/fallenbagel/jellyseerr/commit/f6286359cfd2ed93fc692aa2efda37310e02c11c)), closes [#3626](https://github.com/fallenbagel/jellyseerr/issues/3626)
* standard series type selector ([#3628](https://github.com/fallenbagel/jellyseerr/issues/3628)) ([7bdd25e](https://github.com/fallenbagel/jellyseerr/commit/7bdd25e5a45843a3e530d3fa2b0887664b53eec8))
* translations update from Hosted Weblate ([#3258](https://github.com/fallenbagel/jellyseerr/issues/3258)) ([e62a078](https://github.com/fallenbagel/jellyseerr/commit/e62a078298ced7dec627fb3ff9fc8f99a39d5e1b))
* update SameSite policy of session cookie to Lax ([#3650](https://github.com/fallenbagel/jellyseerr/issues/3650)) ([c84ca43](https://github.com/fallenbagel/jellyseerr/commit/c84ca4307465af4278f3dad5cf9c2b8cbae3fada))
### Reverts
* **jellyfinapi:** reverts [#450](https://github.com/fallenbagel/jellyseerr/issues/450) as it broke library sync support for local accounts using LDAP ([b5acc09](https://github.com/fallenbagel/jellyseerr/commit/b5acc09ba98e2dd9b61e6b78721e4dd9f42a996c)), closes [#489](https://github.com/fallenbagel/jellyseerr/issues/489)
# [1.7.0](https://github.com/fallenbagel/jellyseerr/compare/v1.6.0...v1.7.0) (2023-09-14)
### Bug Fixes
* adjust the plex watchlist sync schedule to have fuzziness ([#3502](https://github.com/fallenbagel/jellyseerr/issues/3502)) ([2c3f533](https://github.com/fallenbagel/jellyseerr/commit/2c3f5330764492e1323afd2d1f25e28ad78a2f2f))
* handle issue causing incorrect media to change to unknown ([#3516](https://github.com/fallenbagel/jellyseerr/issues/3516)) ([83b008c](https://github.com/fallenbagel/jellyseerr/commit/83b008c8391459bd02dc74bcdb0d8caf27207bdf))
* improved handling of edge case that could cause availability sync to fail ([#3497](https://github.com/fallenbagel/jellyseerr/issues/3497)) ([d0836ce](https://github.com/fallenbagel/jellyseerr/commit/d0836ce0efd55fccf2546087a0c4f94f7cb2e82a))
* Include all defaults in payload ([#3538](https://github.com/fallenbagel/jellyseerr/issues/3538)) ([cb63bf2](https://github.com/fallenbagel/jellyseerr/commit/cb63bf217b9e8810a5210b4bf475b2a96583cc84))
* multiple notifications for available media ([048fa96](https://github.com/fallenbagel/jellyseerr/commit/048fa967f2e5b23831ac9917c703934c50ef75f0))
* repeat notifications for available 4k media ([30361f2](https://github.com/fallenbagel/jellyseerr/commit/30361f2ab751d9a882a9120e0f3df28dc42cc2cd))
* resolved issue with create slider causing incorrect form submission ([#3514](https://github.com/fallenbagel/jellyseerr/issues/3514)) ([a761b7d](https://github.com/fallenbagel/jellyseerr/commit/a761b7dd35a5bd61bb4eb0275b75d1e0977e6a2d))
* resolved user access check issue ([#3551](https://github.com/fallenbagel/jellyseerr/issues/3551)) ([2816c66](https://github.com/fallenbagel/jellyseerr/commit/2816c66300bf870d493c0665b0e984d60f707dfd))
* **server/api/jellyfin.ts:** use /Library/VirtualFolders Jellyfin API call to fetch Jellyfin libs ([8685f57](https://github.com/fallenbagel/jellyseerr/commit/8685f5796a99d9700146bae9892319db10508d68)), closes [#256](https://github.com/fallenbagel/jellyseerr/issues/256)
* **statusbadge:** handle missing season/episode number ([#3526](https://github.com/fallenbagel/jellyseerr/issues/3526)) ([01de972](https://github.com/fallenbagel/jellyseerr/commit/01de972a8fe2ea3c18d5b2f426d01b5b14d142d4))
* **tautulli:** only test connection if hostname is defined ([#3573](https://github.com/fallenbagel/jellyseerr/issues/3573)) ([f7b4dfc](https://github.com/fallenbagel/jellyseerr/commit/f7b4dfcac472d08c54779a14fc1ad3c90927df26))
* **ui:** corrected issues icon color ([#3498](https://github.com/fallenbagel/jellyseerr/issues/3498)) ([c1a47bd](https://github.com/fallenbagel/jellyseerr/commit/c1a47bd9de332cb4925974690f5a33448b5cc2e6))
### Features
* **rating:** added IMDB Radarr proxy ([#3496](https://github.com/fallenbagel/jellyseerr/issues/3496)) ([b4191f9](https://github.com/fallenbagel/jellyseerr/commit/b4191f9c65b7ff08764e61d18e7a75bc8d4b3325))
# [1.6.0](https://github.com/fallenbagel/jellyseerr/compare/v1.5.0...v1.6.0) (2023-08-04)
### Bug Fixes
* availability sync file detection ([#3371](https://github.com/fallenbagel/jellyseerr/issues/3371)) ([7522aa3](https://github.com/fallenbagel/jellyseerr/commit/7522aa31743b169c903ebdf9d4d698645d27514c))
* corrected initial fallback data load on details page ([#3395](https://github.com/fallenbagel/jellyseerr/issues/3395)) ([4bd8764](https://github.com/fallenbagel/jellyseerr/commit/4bd87647d0551c20e13589a62690a6f3e5ad8ff7))
* correctly load series fallback modal with sonarr v4 ([#3451](https://github.com/fallenbagel/jellyseerr/issues/3451)) ([e051b1d](https://github.com/fallenbagel/jellyseerr/commit/e051b1dfea9c9320cc9dd420c475ae74cff0d901))
* **deps:** update all non-major dependencies ([#3223](https://github.com/fallenbagel/jellyseerr/issues/3223)) ([f5191ad](https://github.com/fallenbagel/jellyseerr/commit/f5191aded680357522a65bbdcc40d162b8fbf594))
* error deleting users with over 1000 requests ([#3376](https://github.com/fallenbagel/jellyseerr/issues/3376)) ([ac77b03](https://github.com/fallenbagel/jellyseerr/commit/ac77b037d5fb0c54f5edf4b29d04adb57aef388f))
* external url regex is now consistent with internal url ([33ec443](https://github.com/fallenbagel/jellyseerr/commit/33ec4436fb82e1eb1bc97dd650088c27785e9d94))
* externalLinkBlock ([46cd4d0](https://github.com/fallenbagel/jellyseerr/commit/46cd4d01d9a3cf17d79350c5e678202820272299))
* fix regex for internal url to use a more effecient one ([e848386](https://github.com/fallenbagel/jellyseerr/commit/e848386d10f05f157e7a6dde8847ecab50c169ac))
* fixes RT ratings for tv shows ([#3492](https://github.com/fallenbagel/jellyseerr/issues/3492)) ([04fbd00](https://github.com/fallenbagel/jellyseerr/commit/04fbd00d4ac29045592588ef8b664d1916991e37)), closes [#3491](https://github.com/fallenbagel/jellyseerr/issues/3491)
* **genreselector:** fix searching in Genre filter ([#3468](https://github.com/fallenbagel/jellyseerr/issues/3468)) ([d7fa35e](https://github.com/fallenbagel/jellyseerr/commit/d7fa35e066cf371797aaa46ca464aa531ba8fb35))
* handle search results with collections ([#3393](https://github.com/fallenbagel/jellyseerr/issues/3393)) ([70b1540](https://github.com/fallenbagel/jellyseerr/commit/70b1540ae23e83e01013856a9e06ad39e600922d))
* lock body scroll when using webkit ([#3399](https://github.com/fallenbagel/jellyseerr/issues/3399)) ([c27f960](https://github.com/fallenbagel/jellyseerr/commit/c27f96096ac8cc6c387f9d1dde5b263576ac2132))
* **logs:** jellyfin auth error now has the severity warn consistent with local login ([cc041b5](https://github.com/fallenbagel/jellyseerr/commit/cc041b5e0aa2b67573edba5919772b77a5111162)), closes [#224](https://github.com/fallenbagel/jellyseerr/issues/224)
* make a (shallow) copy of radarr/sonarr tags into a request before adding user tags ([#3485](https://github.com/fallenbagel/jellyseerr/issues/3485)) ([48f7666](https://github.com/fallenbagel/jellyseerr/commit/48f76662d5c08156f1da3f47e216c5f02668f64b))
* **ui:** corrected default badge hover opacity ([#3369](https://github.com/fallenbagel/jellyseerr/issues/3369)) ([a4d07f5](https://github.com/fallenbagel/jellyseerr/commit/a4d07f5afab613317d96c9c6e9b47157a5a28986))
* **ui:** corrected mobile menu spacing in collection details ([#3432](https://github.com/fallenbagel/jellyseerr/issues/3432)) ([77a33cb](https://github.com/fallenbagel/jellyseerr/commit/77a33cb74d744bb747b791785799b632af8c7862))
* **ui:** Make play symbol white ([1fe4bb8](https://github.com/fallenbagel/jellyseerr/commit/1fe4bb8a0415a72791ced75a2fba1027287398d5))
* **ui:** Resize Emby icon and add margins ([ad69d67](https://github.com/fallenbagel/jellyseerr/commit/ad69d6715e976630092bfbbb1843886523551014))
* **watchlist:** add validation for creation request ([03316c6](https://github.com/fallenbagel/jellyseerr/commit/03316c642d1ecf89753789af08caf6e3aac80113))
* **watchlist:** fix github code scanning ([c08897b](https://github.com/fallenbagel/jellyseerr/commit/c08897bdc1cff65862c62347572bbbd01b6c36ac))
### Features
* **add watchlist:** adding midding functionality from overserr ([5f1c10d](https://github.com/fallenbagel/jellyseerr/commit/5f1c10d50aaa430bcda96218ef2cc12a0eb926f3))
* adds streaming services custom slider ([#3361](https://github.com/fallenbagel/jellyseerr/issues/3361)) ([2520d8f](https://github.com/fallenbagel/jellyseerr/commit/2520d8f739abfde608f3ef66a9fbe6b7b5c6647a))
* auto tagging requested media with username ([#3338](https://github.com/fallenbagel/jellyseerr/issues/3338)) ([24f268b](https://github.com/fallenbagel/jellyseerr/commit/24f268b6cb67d9a8d8675cd6e09dd83a7f499add))
* **discover:** support filtering by tmdb user vote count on discover page ([#3407](https://github.com/fallenbagel/jellyseerr/issues/3407)) ([aa84977](https://github.com/fallenbagel/jellyseerr/commit/aa849776809dfe891e67ff4db6861ef44df1a774))
* **settings:** add internal url to jellyfin settings form ([0a30cd3](https://github.com/fallenbagel/jellyseerr/commit/0a30cd356d217a39546c016cc8bfa6ff6ad75e3e)), closes [#194](https://github.com/fallenbagel/jellyseerr/issues/194)
* **src/components/externallinkblock/index.tsx:** support Emby icon ([672061c](https://github.com/fallenbagel/jellyseerr/commit/672061cd646c97c9954790c8e50eac88ea2666e9))
* **tooltip:** email tooltip now appears when hovered over info icon ([cd7930e](https://github.com/fallenbagel/jellyseerr/commit/cd7930eef98451a781e5c9dc5ec223600a379f42))
* translations update ([47287c3](https://github.com/fallenbagel/jellyseerr/commit/47287c368885d14bd1a56e3e8318ce22dd0f6ddf)), closes [#381](https://github.com/fallenbagel/jellyseerr/issues/381)
* **watchlist:** add translation for en ([b7e3d28](https://github.com/fallenbagel/jellyseerr/commit/b7e3d285ed35b623062eceb0d99035cafbf075a6))
# [1.5.0](https://github.com/fallenbagel/jellyseerr/compare/v1.4.1...v1.5.0) (2023-04-20)
### Bug Fixes
* add better checks on 4k detection of series ([bc9017f](https://github.com/fallenbagel/jellyseerr/commit/bc9017f54d84ec24c4d74d38e1b4e24219425d41))
* added a refresh interval if download status is in progress ([#3275](https://github.com/fallenbagel/jellyseerr/issues/3275)) ([1e2c6f4](https://github.com/fallenbagel/jellyseerr/commit/1e2c6f46ab66c836f321b5d8e34f1e8124c0b542))
* **build:** increase threshold for amount of data to be fetched when SSR'ing ([#3320](https://github.com/fallenbagel/jellyseerr/issues/3320)) ([d7b83d2](https://github.com/fallenbagel/jellyseerr/commit/d7b83d22cee3d20db564cc0564d42802b02327e3))
* disable availability sync temporarily ([2e5cf22](https://github.com/fallenbagel/jellyseerr/commit/2e5cf226265686012329248e7f729fec324c3deb))
* hide remove button when default service is not configured ([7d4455b](https://github.com/fallenbagel/jellyseerr/commit/7d4455ba6bfd12e2730f7085cbb87df246f01d22))
* **jellyfin scan:** temporary workaround fix for jellyfin scan when display specials within season ([38fb66d](https://github.com/fallenbagel/jellyseerr/commit/38fb66d31e41232c01898d0d362af8338eb7b960)), closes [#215](https://github.com/fallenbagel/jellyseerr/issues/215) [#176](https://github.com/fallenbagel/jellyseerr/issues/176) [#246](https://github.com/fallenbagel/jellyseerr/issues/246)
* lint issues ([bcd2bb7](https://github.com/fallenbagel/jellyseerr/commit/bcd2bb7c96810f5a6932f42468a628d2db1bc771))
* logger was set to info for the wrong logs ([#3354](https://github.com/fallenbagel/jellyseerr/issues/3354)) ([c36a4ba](https://github.com/fallenbagel/jellyseerr/commit/c36a4ba2b8df05873f5dfd0946a9bc3dc4ecfd1d))
* remove unnecessary parenthesis from api key generation ([#3336](https://github.com/fallenbagel/jellyseerr/issues/3336)) ([6bd3f01](https://github.com/fallenbagel/jellyseerr/commit/6bd3f015d65507efca60279007bd2b86ee860643))
* **snapcraft:** use the correct config folder for image cache ([#3302](https://github.com/fallenbagel/jellyseerr/issues/3302)) ([c93467b](https://github.com/fallenbagel/jellyseerr/commit/c93467b3acf2c256324297e7e8f21e9944005dd4))
* **ui:** hide mini status badge if non-4K media status is unknown ([#3346](https://github.com/fallenbagel/jellyseerr/issues/3346)) ([50f06da](https://github.com/fallenbagel/jellyseerr/commit/50f06dabbffc693f0843584a64d1d96e77982820))
* **ui:** hide search bar behind slideover when opened ([#3348](https://github.com/fallenbagel/jellyseerr/issues/3348)) ([b3882de](https://github.com/fallenbagel/jellyseerr/commit/b3882de8930a70adb2f93a27be6370bfa1826587))
* **ui:** prevent title cards from flickering when quickly hovering across them ([#3349](https://github.com/fallenbagel/jellyseerr/issues/3349)) ([eb5502a](https://github.com/fallenbagel/jellyseerr/commit/eb5502a16f86e37a933f6beca0678c2d228e77d5))
* **watchlist:** correctly load more than 20 watchlist items ([#3351](https://github.com/fallenbagel/jellyseerr/issues/3351)) ([af880a6](https://github.com/fallenbagel/jellyseerr/commit/af880a6c839794b34bddcd7e0fe56353aa48ba36))
### Features
* add a button in ManageSlideOver to remove the movie and the file from Radarr/Sonarr ([2e74584](https://github.com/fallenbagel/jellyseerr/commit/2e7458457e995dd3ec6dd96035fe997646cdd446))
* availability sync rework ([#3219](https://github.com/fallenbagel/jellyseerr/issues/3219)) ([ae38183](https://github.com/fallenbagel/jellyseerr/commit/ae3818304b2f75222d1bd223ece94f829a3b42d0)), closes [#377](https://github.com/fallenbagel/jellyseerr/issues/377)
* full title of download item on hover with tooltip ([#3296](https://github.com/fallenbagel/jellyseerr/issues/3296)) ([33e7691](https://github.com/fallenbagel/jellyseerr/commit/33e7691b94d7d369a0a1410e434850bc51e5572e))
### Performance Improvements
* **imageproxy:** do not set cookies to image proxy so CDNs can cache images ([#3332](https://github.com/fallenbagel/jellyseerr/issues/3332)) ([966639d](https://github.com/fallenbagel/jellyseerr/commit/966639df430d32f6bfebdb16314dc4590d21caf8))
## [1.4.1](https://github.com/fallenbagel/jellyseerr/compare/v1.4.0...v1.4.1) (2023-01-31)
### Bug Fixes
* pass in library type when scanning recently added items ([#3287](https://github.com/fallenbagel/jellyseerr/issues/3287)) ([8942eb8](https://github.com/fallenbagel/jellyseerr/commit/8942eb8b7c4fa1d16aa2e72e8ba7120a653c9aa2))
* **ui:** air date will use UTC for timezone ([#3297](https://github.com/fallenbagel/jellyseerr/issues/3297)) ([3e43586](https://github.com/fallenbagel/jellyseerr/commit/3e43586acc0804c3fff524509caa890a104e132b))
* **ui:** correct range slider styling in chrome ([#3299](https://github.com/fallenbagel/jellyseerr/issues/3299)) ([d954328](https://github.com/fallenbagel/jellyseerr/commit/d9543289111d72245564d25d300a71b0ea3954ba))
* **ui:** show 5 icons when possible on mobile menu ([#3298](https://github.com/fallenbagel/jellyseerr/issues/3298)) ([7040da1](https://github.com/fallenbagel/jellyseerr/commit/7040da1334f6d18e19a494c73caa17f7df552dfe))
* **ui:** style range thumbs correctly for firefox ([#3294](https://github.com/fallenbagel/jellyseerr/issues/3294)) ([9d10e6a](https://github.com/fallenbagel/jellyseerr/commit/9d10e6a88c0996671f1d9d20792e1930dbc82329))
# [1.4.0](https://github.com/fallenbagel/jellyseerr/compare/v1.3.0...v1.4.0) (2023-01-29)
### Bug Fixes
* add bg-opacity to in-progress status badges ([#3190](https://github.com/fallenbagel/jellyseerr/issues/3190)) ([68223f4](https://github.com/fallenbagel/jellyseerr/commit/68223f4b1e98b01825516dcba39cbb2d3df31a70))
* added download status and title to request card/item error components ([#3186](https://github.com/fallenbagel/jellyseerr/issues/3186)) ([3309f77](https://github.com/fallenbagel/jellyseerr/commit/3309f77aa4be1d70b27693531c119a8e26822518))
* arrow icons were misplaced on mobile in slider edit ([#3260](https://github.com/fallenbagel/jellyseerr/issues/3260)) ([d328485](https://github.com/fallenbagel/jellyseerr/commit/d328485161b9cae6a70ef0713b4878207bc6015e))
* **build:** update usage of publish snap action ([#3272](https://github.com/fallenbagel/jellyseerr/issues/3272)) ([51b05cd](https://github.com/fallenbagel/jellyseerr/commit/51b05cd8fbb5d332807d8c00b2ffb7b10c3d0179))
* changed overflow scroll to only if necessary ([#3184](https://github.com/fallenbagel/jellyseerr/issues/3184)) ([27feeea](https://github.com/fallenbagel/jellyseerr/commit/27feeea69121336557deda1f32b65a5daa146f82))
* convert genre/studio to string in create slider ([#3201](https://github.com/fallenbagel/jellyseerr/issues/3201)) ([93afead](https://github.com/fallenbagel/jellyseerr/commit/93afead92e497f2e5bce67a34fffdaa08d20c7f2))
* correct checkbox position (again) for slider edits ([#3227](https://github.com/fallenbagel/jellyseerr/issues/3227)) ([3ba6df1](https://github.com/fallenbagel/jellyseerr/commit/3ba6df1a41c084c4a6a90354338047623abef521))
* correct grid sizing for webkit on streaming services ([#3248](https://github.com/fallenbagel/jellyseerr/issues/3248)) ([6fd11cf](https://github.com/fallenbagel/jellyseerr/commit/6fd11cf4254e1a19310592bec78a6de52bc073a8))
* correct issue detail bottom padding on mobile displays ([#3268](https://github.com/fallenbagel/jellyseerr/issues/3268)) ([3db010b](https://github.com/fallenbagel/jellyseerr/commit/3db010b9eaec62aa08d973a61caf1801471bbf3e))
* correct link to correct keyword results for series ([#3208](https://github.com/fallenbagel/jellyseerr/issues/3208)) ([4e9be7a](https://github.com/fallenbagel/jellyseerr/commit/4e9be7a3f7304ee7be5ee6fd34b1ea8f6c0cf399))
* correct spacing between sliders ([#3225](https://github.com/fallenbagel/jellyseerr/issues/3225)) ([62e2de7](https://github.com/fallenbagel/jellyseerr/commit/62e2de70bf37b72d5f63370b662d4103a642775b))
* correctly check mobile menu permissions ([#3271](https://github.com/fallenbagel/jellyseerr/issues/3271)) ([f4a22dc](https://github.com/fallenbagel/jellyseerr/commit/f4a22dc437404558f301ccfc195cf0a300dd1ff2))
* correctly restore selected streaming service filters ([#3249](https://github.com/fallenbagel/jellyseerr/issues/3249)) ([154f3e7](https://github.com/fallenbagel/jellyseerr/commit/154f3e72efbf0b663358b3029156f54516f01a2f))
* create shared class to add bottom spacing ([#3269](https://github.com/fallenbagel/jellyseerr/issues/3269)) ([5d1c6f7](https://github.com/fallenbagel/jellyseerr/commit/5d1c6f706555613d97ed9e61d8b665543c2f239b))
* **deps:** pin dependency @headlessui/react to 1.7.7 ([#3194](https://github.com/fallenbagel/jellyseerr/issues/3194)) [skip ci] ([c4b16ab](https://github.com/fallenbagel/jellyseerr/commit/c4b16abc62647c74215155942a4230a31a238677))
* **deps:** update dependency @heroicons/react to v2 ([#2970](https://github.com/fallenbagel/jellyseerr/issues/2970)) ([dd48d59](https://github.com/fallenbagel/jellyseerr/commit/dd48d59b20e2d1800ea30912116f4a4f1bb7928f))
* **deps:** update dependency axios to v1 ([#3202](https://github.com/fallenbagel/jellyseerr/issues/3202)) ([421029e](https://github.com/fallenbagel/jellyseerr/commit/421029ebab66c9a6622ba47e56d7f6473524cce4))
* **deps:** update dependency swr to v2 ([#3212](https://github.com/fallenbagel/jellyseerr/issues/3212)) ([7b6db50](https://github.com/fallenbagel/jellyseerr/commit/7b6db50ae55b1fc60d19a5cff62dd46bb989fa51))
* **experimental:** use new RT API (sorta) ([#3179](https://github.com/fallenbagel/jellyseerr/issues/3179)) ([357cab8](https://github.com/fallenbagel/jellyseerr/commit/357cab87ac7752b8e119b51c938b343c661d83c2))
* improve small screen layout for discover editing ([#3221](https://github.com/fallenbagel/jellyseerr/issues/3221)) ([d23b213](https://github.com/fallenbagel/jellyseerr/commit/d23b2132de05f072f7f9daad83d81421d747cf99))
* include new package calendar css in build ([#3235](https://github.com/fallenbagel/jellyseerr/issues/3235)) ([c2a1a20](https://github.com/fallenbagel/jellyseerr/commit/c2a1a20a3bb20039a1936c7fe0ecb9e8311a0aea))
* issues with issues ([#3267](https://github.com/fallenbagel/jellyseerr/issues/3267)) ([fd21971](https://github.com/fallenbagel/jellyseerr/commit/fd219717c01c558814d7a80de6304272b5a7944e))
* multiple genre filtering now works ([#3282](https://github.com/fallenbagel/jellyseerr/issues/3282)) ([5076938](https://github.com/fallenbagel/jellyseerr/commit/507693881b939819413f0959df5ef6b7a357eb5c))
* prevent double encode if we are on /search endpoint ([#3238](https://github.com/fallenbagel/jellyseerr/issues/3238)) ([a343f8a](https://github.com/fallenbagel/jellyseerr/commit/a343f8ad915491a9c81512c7e541a1dac8906025))
* **request:** approve request when retrying request ([#3234](https://github.com/fallenbagel/jellyseerr/issues/3234)) ([b515701](https://github.com/fallenbagel/jellyseerr/commit/b5157010c46cd9083993d5ee0172007b83d631da))
* **request:** mark request as approved if media is already available when retrying failed request ([#3244](https://github.com/fallenbagel/jellyseerr/issues/3244)) ([cb65074](https://github.com/fallenbagel/jellyseerr/commit/cb650745f6a33e69391a633e6d272831f314e098))
* restore border to ghost button and fix discover slider visibility toggle position ([#3226](https://github.com/fallenbagel/jellyseerr/issues/3226)) ([2eebb7f](https://github.com/fallenbagel/jellyseerr/commit/2eebb7fd3941b34fe9472aaf9d28265df8cce311))
* restore status badges on titles on actors page when hide available media enabled ([#3206](https://github.com/fallenbagel/jellyseerr/issues/3206)) ([9d3446d](https://github.com/fallenbagel/jellyseerr/commit/9d3446d370499c3251159393e5c791b01225e05c))
* screen would zoom on mobile if date picker input was selected ([#3241](https://github.com/fallenbagel/jellyseerr/issues/3241)) ([3aefddd](https://github.com/fallenbagel/jellyseerr/commit/3aefddd48834d86150d5f5cceb2d08af3a78847b))
* series displayed an empty season with series list/request modal ([#3147](https://github.com/fallenbagel/jellyseerr/issues/3147)) ([2179637](https://github.com/fallenbagel/jellyseerr/commit/2179637d437999290eaa4152f6f37c71fc3d8ba3))
* tooltip shows properly if not in progress ([#3185](https://github.com/fallenbagel/jellyseerr/issues/3185)) ([6face8c](https://github.com/fallenbagel/jellyseerr/commit/6face8cc4564b978fb98af32659b326d8c5cede8))
* **ui:** series first air date sorting ([#3283](https://github.com/fallenbagel/jellyseerr/issues/3283)) ([374c78c](https://github.com/fallenbagel/jellyseerr/commit/374c78c989cc86bb144a954a91d5d183c4b591c0))
* update StatusBadgeMini to shrink on title cards (and remove ring) ([#3210](https://github.com/fallenbagel/jellyseerr/issues/3210)) ([042a1a9](https://github.com/fallenbagel/jellyseerr/commit/042a1a950fdd4d4a61edf4bc19657f9b7a526da8))
### Features
* add discover customization ([#3182](https://github.com/fallenbagel/jellyseerr/issues/3182)) ([cd35748](https://github.com/fallenbagel/jellyseerr/commit/cd3574851a12517cbfadc109e6412a7a9e44c114))
* add keywords to movie/series detail pages ([#3204](https://github.com/fallenbagel/jellyseerr/issues/3204)) ([e084649](https://github.com/fallenbagel/jellyseerr/commit/e084649878a58c296786141d12dd69a69a27ee85))
* add streaming services filter ([#3247](https://github.com/fallenbagel/jellyseerr/issues/3247)) ([1154156](https://github.com/fallenbagel/jellyseerr/commit/1154156459403494e8daf0c89a3ba356aeea1d97))
* discover inline customization ([#3220](https://github.com/fallenbagel/jellyseerr/issues/3220)) ([8bd10b5](https://github.com/fallenbagel/jellyseerr/commit/8bd10b5bf3d1b8069872b616c7c8596caeb4937e))
* discover overhaul (filters!) ([#3232](https://github.com/fallenbagel/jellyseerr/issues/3232)) ([dd00e48](https://github.com/fallenbagel/jellyseerr/commit/dd00e48f59054b44bef6b32a2c169e59f6175051))
* discover slider edit arrow buttons for reordering ([#3259](https://github.com/fallenbagel/jellyseerr/issues/3259)) ([da00d45](https://github.com/fallenbagel/jellyseerr/commit/da00d454e17e8b00d04f6e26f6dd5153ed6ced81))
* **lang:** translations update from Hosted Weblate ([#3030](https://github.com/fallenbagel/jellyseerr/issues/3030)) ([0d8b390](https://github.com/fallenbagel/jellyseerr/commit/0d8b390b678731e76bd1f0f8a0a4952c11e77f4d))
* new mobile menu ([#3251](https://github.com/fallenbagel/jellyseerr/issues/3251)) ([fcbca17](https://github.com/fallenbagel/jellyseerr/commit/fcbca1722f31f32633a57bc5048f46c9da057d87))
* translations update from Hosted Weblate ([#3218](https://github.com/fallenbagel/jellyseerr/issues/3218)) ([5940ff7](https://github.com/fallenbagel/jellyseerr/commit/5940ff7f5f62eed9ac5aa6f02803418aaa09813a))
* **ui:** add episode number to front of episode name in season details ([#3086](https://github.com/fallenbagel/jellyseerr/issues/3086)) ([a672b32](https://github.com/fallenbagel/jellyseerr/commit/a672b324ec391a20f6f3a1daed82a8d276a52c2c))
* **ui:** request card progress bar ([#3123](https://github.com/fallenbagel/jellyseerr/issues/3123)) ([03853a1](https://github.com/fallenbagel/jellyseerr/commit/03853a1b9155c8a2153c8885022a74619af1bc15))
# [1.3.0](https://github.com/fallenbagel/jellyseerr/compare/v1.2.1...v1.3.0) (2023-01-02)
### Bug Fixes

View File

@@ -11,7 +11,7 @@
<a href="http://translate.jellyseerr.dev/engage/jellyseerr/"><img src="http://translate.jellyseerr.dev/widget/jellyseerr/jellyseerr-frontend/svg-badge.svg" alt="Translation status" /></a>
<a href="https://github.com/fallenbagel/jellyseerr/blob/develop/LICENSE"><img alt="GitHub" src="https://img.shields.io/github/license/fallenbagel/jellyseerr"></a>
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
<a href="#contributors-"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-69-orange.svg"/></a>
<a href="#contributors-"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-92-orange.svg"/></a>
<!-- ALL-CONTRIBUTORS-BADGE:END -->
**Jellyseerr** is a free and open source software application for managing requests for your media library. It integrates with the media server of your choice: [Jellyfin](https://jellyfin.org), [Plex](https://plex.tv), and [Emby](https://emby.media/). In addition, it integrates with your existing services, such as **[Sonarr](https://sonarr.tv/)**, **[Radarr](https://radarr.video/)**.
@@ -122,9 +122,9 @@ Thanks goes to these wonderful people from Overseerr ([emoji key](https://allcon
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Br33ce"><img src="https://avatars.githubusercontent.com/u/124933490?v=4?s=100" width="100px;" alt="Br33ce"/><br /><sub><b>Br33ce</b></sub></a><br /><a href="#translation-Br33ce" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://athfan.com"><img src="https://avatars.githubusercontent.com/u/13810742?v=4?s=100" width="100px;" alt="Athfan Khaleel"/><br /><sub><b>Athfan Khaleel</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=athphane" title="Documentation">📖</a> <a href="https://github.com/fallenbagel/jellyseerr/commits?author=athphane" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://athfan.com"><img src="https://avatars.githubusercontent.com/u/13810742?v=4?s=100" width="100px;" alt="Athfan Khaleel"/><br /><sub><b>Athfan Khaleel</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=athphane" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mdll23"><img src="https://avatars.githubusercontent.com/u/142844478?v=4?s=100" width="100px;" alt="Michael Dallinger"/><br /><sub><b>Michael Dallinger</b></sub></a><br /><a href="#translation-mdll23" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/xeruf"><img src="https://avatars.githubusercontent.com/u/13354331?v=4?s=100" width="100px;" alt="Janek"/><br /><sub><b>Janek</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=xeruf" title="Documentation">📖</a> <a href="https://github.com/fallenbagel/jellyseerr/commits?author=xeruf" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/xeruf"><img src="https://avatars.githubusercontent.com/u/13354331?v=4?s=100" width="100px;" alt="Janek"/><br /><sub><b>Janek</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=xeruf" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://aleksasiriski.dev"><img src="https://avatars.githubusercontent.com/u/31509435?v=4?s=100" width="100px;" alt="Aleksa Siriški"/><br /><sub><b>Aleksa Siriški</b></sub></a><br /><a href="#infra-aleksasiriski" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://danishhumair.com"><img src="https://avatars.githubusercontent.com/u/121830048?v=4?s=100" width="100px;" alt="Danish Humair"/><br /><sub><b>Danish Humair</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Danish-H" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://arm0.red"><img src="https://avatars.githubusercontent.com/u/16858514?v=4?s=100" width="100px;" alt="Stephen Harris"/><br /><sub><b>Stephen Harris</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=trackmastersteve" title="Documentation">📖</a></td>
@@ -136,43 +136,74 @@ Thanks goes to these wonderful people from Overseerr ([emoji key](https://allcon
<td align="center" valign="top" width="14.28%"><a href="https://joaquinolivero.com"><img src="https://avatars.githubusercontent.com/u/66050823?v=4?s=100" width="100px;" alt="Joaquin Olivero"/><br /><sub><b>Joaquin Olivero</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=JoaquinOlivero" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Bretterteig"><img src="https://avatars.githubusercontent.com/u/47298401?v=4?s=100" width="100px;" alt="Julian Behr"/><br /><sub><b>Julian Behr</b></sub></a><br /><a href="#translation-Bretterteig" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ThowZzy"><img src="https://avatars.githubusercontent.com/u/61882536?v=4?s=100" width="100px;" alt="ThowZzy"/><br /><sub><b>ThowZzy</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=ThowZzy" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://mobihen.com"><img src="https://avatars.githubusercontent.com/u/35529491?v=4?s=100" width="100px;" alt="Nir Israel Hen"/><br /><sub><b>Nir Israel Hen</b></sub></a><br /><a href="#translation-mobihen" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/XDark187"><img src="https://avatars.githubusercontent.com/u/39034192?v=4?s=100" width="100px;" alt="Baraa"/><br /><sub><b>Baraa</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=XDark187" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://josephrisk.com"><img src="https://avatars.githubusercontent.com/u/18372584?v=4?s=100" width="100px;" alt="Joseph Risk"/><br /><sub><b>Joseph Risk</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=j0srisk" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Loetwiek"><img src="https://avatars.githubusercontent.com/u/79059734?v=4?s=100" width="100px;" alt="Loetwiek"/><br /><sub><b>Loetwiek</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Loetwiek" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fuochi"><img src="https://avatars.githubusercontent.com/u/4720478?v=4?s=100" width="100px;" alt="Fuochi"/><br /><sub><b>Fuochi</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Fuochi" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://mobihen.com"><img src="https://avatars.githubusercontent.com/u/35529491?v=4?s=100" width="100px;" alt="Nir Israel Hen"/><br /><sub><b>Nir Israel Hen</b></sub></a><br /><a href="#translation-mobihen" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/XDark187"><img src="https://avatars.githubusercontent.com/u/39034192?v=4?s=100" width="100px;" alt="Baraa"/><br /><sub><b>Baraa</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=XDark187" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/franciscofsales"><img src="https://avatars.githubusercontent.com/u/7977645?v=4?s=100" width="100px;" alt="Francisco Sales"/><br /><sub><b>Francisco Sales</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=franciscofsales" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/myselfolli"><img src="https://avatars.githubusercontent.com/u/37535998?v=4?s=100" width="100px;" alt="Oliver Laing"/><br /><sub><b>Oliver Laing</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=myselfolli" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/M0NsTeRRR"><img src="https://avatars.githubusercontent.com/u/37785089?v=4?s=100" width="100px;" alt="Ludovic Ortega"/><br /><sub><b>Ludovic Ortega</b></sub></a><br /><a href="#security-M0NsTeRRR" title="Security">🛡️</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://josephrisk.com"><img src="https://avatars.githubusercontent.com/u/18372584?v=4?s=100" width="100px;" alt="Joseph Risk"/><br /><sub><b>Joseph Risk</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=j0srisk" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Loetwiek"><img src="https://avatars.githubusercontent.com/u/79059734?v=4?s=100" width="100px;" alt="Loetwiek"/><br /><sub><b>Loetwiek</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Loetwiek" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fuochi"><img src="https://avatars.githubusercontent.com/u/4720478?v=4?s=100" width="100px;" alt="Fuochi"/><br /><sub><b>Fuochi</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Fuochi" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/demrich"><img src="https://avatars.githubusercontent.com/u/30092389?v=4?s=100" width="100px;" alt="David Emrich"/><br /><sub><b>David Emrich</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=demrich" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://maxtrier.dk"><img src="https://avatars.githubusercontent.com/u/5898152?v=4?s=100" width="100px;" alt="Max T. Kristiansen"/><br /><sub><b>Max T. Kristiansen</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=maxnatamo" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://damsdev.me"><img src="https://avatars.githubusercontent.com/u/60252259?v=4?s=100" width="100px;" alt="Damien Fajole"/><br /><sub><b>Damien Fajole</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=DamsDev1" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AhmedNSidd"><img src="https://avatars.githubusercontent.com/u/36286128?v=4?s=100" width="100px;" alt="Ahmed Siddiqui"/><br /><sub><b>Ahmed Siddiqui</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=AhmedNSidd" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Zariel"><img src="https://avatars.githubusercontent.com/u/2213?v=4?s=100" width="100px;" alt="Chris Bannister"/><br /><sub><b>Chris Bannister</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Zariel" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/C4J3"><img src="https://avatars.githubusercontent.com/u/13005453?v=4?s=100" width="100px;" alt="Joe"/><br /><sub><b>Joe</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=C4J3" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://me.garnx.fr"><img src="https://avatars.githubusercontent.com/u/37373941?v=4?s=100" width="100px;" alt="Guillaume ARNOUX"/><br /><sub><b>Guillaume ARNOUX</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=guillaumearnx" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dr-carrot"><img src="https://avatars.githubusercontent.com/u/17272571?v=4?s=100" width="100px;" alt="dr-carrot"/><br /><sub><b>dr-carrot</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=dr-carrot" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gageorsburn"><img src="https://avatars.githubusercontent.com/u/4692734?v=4?s=100" width="100px;" alt="Gage Orsburn"/><br /><sub><b>Gage Orsburn</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=gageorsburn" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GkhnGRBZ"><img src="https://avatars.githubusercontent.com/u/127258824?v=4?s=100" width="100px;" alt="GkhnGRBZ"/><br /><sub><b>GkhnGRBZ</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=GkhnGRBZ" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://benhaney.com"><img src="https://avatars.githubusercontent.com/u/31331498?v=4?s=100" width="100px;" alt="Ben Haney"/><br /><sub><b>Ben Haney</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=benhaney" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Wunderharke"><img src="https://avatars.githubusercontent.com/u/5105672?v=4?s=100" width="100px;" alt="Wunderharke"/><br /><sub><b>Wunderharke</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Wunderharke" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/methbkts"><img src="https://avatars.githubusercontent.com/u/30674934?v=4?s=100" width="100px;" alt="Metin Bektas"/><br /><sub><b>Metin Bektas</b></sub></a><br /><a href="#infra-methbkts" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/andrewkolda"><img src="https://avatars.githubusercontent.com/u/158614532?v=4?s=100" width="100px;" alt="andrewkolda"/><br /><sub><b>andrewkolda</b></sub></a><br /><a href="#design-andrewkolda" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://ishanjain.me"><img src="https://avatars.githubusercontent.com/u/7921368?v=4?s=100" width="100px;" alt="Ishan Jain"/><br /><sub><b>Ishan Jain</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=ishanjain28" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://michaelt.xyz"><img src="https://avatars.githubusercontent.com/u/18223295?v=4?s=100" width="100px;" alt="Michael Thomas"/><br /><sub><b>Michael Thomas</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=michaelhthomas" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://josephrisk.com"><img src="https://avatars.githubusercontent.com/u/18372584?v=4?s=100" width="100px;" alt="Joseph Risk"/><br /><sub><b>Joseph Risk</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=j0srisk" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Loetwiek"><img src="https://avatars.githubusercontent.com/u/79059734?v=4?s=100" width="100px;" alt="Loetwiek"/><br /><sub><b>Loetwiek</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Loetwiek" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fuochi"><img src="https://avatars.githubusercontent.com/u/4720478?v=4?s=100" width="100px;" alt="Fuochi"/><br /><sub><b>Fuochi</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Fuochi" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="http://michaelt.xyz"><img src="https://avatars.githubusercontent.com/u/18223295?v=4?s=100" width="100px;" alt="Michael Thomas"/><br /><sub><b>Michael Thomas</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=michaelhthomas" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/demrich"><img src="https://avatars.githubusercontent.com/u/30092389?v=4?s=100" width="100px;" alt="David Emrich"/><br /><sub><b>David Emrich</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=demrich" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://maxtrier.dk"><img src="https://avatars.githubusercontent.com/u/5898152?v=4?s=100" width="100px;" alt="Max T. Kristiansen"/><br /><sub><b>Max T. Kristiansen</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=maxnatamo" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://damsdev.me"><img src="https://avatars.githubusercontent.com/u/60252259?v=4?s=100" width="100px;" alt="Damien Fajole"/><br /><sub><b>Damien Fajole</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=DamsDev1" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AhmedNSidd"><img src="https://avatars.githubusercontent.com/u/36286128?v=4?s=100" width="100px;" alt="Ahmed Siddiqui"/><br /><sub><b>Ahmed Siddiqui</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=AhmedNSidd" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JackW6809"><img src="https://avatars.githubusercontent.com/u/53652452?v=4?s=100" width="100px;" alt="JackOXI"/><br /><sub><b>JackOXI</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=JackW6809" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://indicus.ro"><img src="https://avatars.githubusercontent.com/u/1199404?v=4?s=100" width="100px;" alt="Stancu Florin"/><br /><sub><b>Stancu Florin</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=StancuFlorin" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/RankWeis"><img src="https://avatars.githubusercontent.com/u/733691?v=4?s=100" width="100px;" alt="RankWeis"/><br /><sub><b>RankWeis</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=RankWeis" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="http://josephrisk.com"><img src="https://avatars.githubusercontent.com/u/18372584?v=4?s=100" width="100px;" alt="Joseph Risk"/><br /><sub><b>Joseph Risk</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=j0srisk" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Loetwiek"><img src="https://avatars.githubusercontent.com/u/79059734?v=4?s=100" width="100px;" alt="Loetwiek"/><br /><sub><b>Loetwiek</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Loetwiek" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fuochi"><img src="https://avatars.githubusercontent.com/u/4720478?v=4?s=100" width="100px;" alt="Fuochi"/><br /><sub><b>Fuochi</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Fuochi" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/demrich"><img src="https://avatars.githubusercontent.com/u/30092389?v=4?s=100" width="100px;" alt="David Emrich"/><br /><sub><b>David Emrich</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=demrich" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://maxtrier.dk"><img src="https://avatars.githubusercontent.com/u/5898152?v=4?s=100" width="100px;" alt="Max T. Kristiansen"/><br /><sub><b>Max T. Kristiansen</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=maxnatamo" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://damsdev.me"><img src="https://avatars.githubusercontent.com/u/60252259?v=4?s=100" width="100px;" alt="Damien Fajole"/><br /><sub><b>Damien Fajole</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=DamsDev1" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AhmedNSidd"><img src="https://avatars.githubusercontent.com/u/36286128?v=4?s=100" width="100px;" alt="Ahmed Siddiqui"/><br /><sub><b>Ahmed Siddiqui</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=AhmedNSidd" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JackW6809"><img src="https://avatars.githubusercontent.com/u/53652452?v=4?s=100" width="100px;" alt="JackOXI"/><br /><sub><b>JackOXI</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=JackW6809" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://indicus.ro"><img src="https://avatars.githubusercontent.com/u/1199404?v=4?s=100" width="100px;" alt="Stancu Florin"/><br /><sub><b>Stancu Florin</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=StancuFlorin" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lmiklosko"><img src="https://avatars.githubusercontent.com/u/44380311?v=4?s=100" width="100px;" alt="Lukas Miklosko"/><br /><sub><b>Lukas Miklosko</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=lmiklosko" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://gauthierth.fr/"><img src="https://avatars.githubusercontent.com/u/37781713?v=4?s=100" width="100px;" alt="Gauthier"/><br /><sub><b>Gauthier</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=gauthier-th" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.linkedin.com/in/jessielwilson"><img src="https://avatars.githubusercontent.com/u/48299282?v=4?s=100" width="100px;" alt="Jessie Wilson"/><br /><sub><b>Jessie Wilson</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=jessielw" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/brotaxt"><img src="https://avatars.githubusercontent.com/u/25477935?v=4?s=100" width="100px;" alt="DominicKo"/><br /><sub><b>DominicKo</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=brotaxt" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://doctolib.com"><img src="https://avatars.githubusercontent.com/u/30508927?v=4?s=100" width="100px;" alt="Corentin Normand"/><br /><sub><b>Corentin Normand</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=corentinnormand" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/benbeauchamp7"><img src="https://avatars.githubusercontent.com/u/43358492?v=4?s=100" width="100px;" alt="Ben Beauchamp"/><br /><sub><b>Ben Beauchamp</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=benbeauchamp7" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vfaergestad"><img src="https://avatars.githubusercontent.com/u/49147564?v=4?s=100" width="100px;" alt="vfaergestad"/><br /><sub><b>vfaergestad</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=vfaergestad" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wolffman122"><img src="https://avatars.githubusercontent.com/u/19178872?v=4?s=100" width="100px;" alt="wolffman122"/><br /><sub><b>wolffman122</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=wolffman122" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Schrottfresser"><img src="https://avatars.githubusercontent.com/u/39998368?v=4?s=100" width="100px;" alt="Schrottfresser"/><br /><sub><b>Schrottfresser</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=Schrottfresser" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DillionLowry"><img src="https://avatars.githubusercontent.com/u/91228469?v=4?s=100" width="100px;" alt="Dillion"/><br /><sub><b>Dillion</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=DillionLowry" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JamsRepos"><img src="https://avatars.githubusercontent.com/u/1347620?v=4?s=100" width="100px;" alt="Jam"/><br /><sub><b>Jam</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=JamsRepos" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.joelowrance.com"><img src="https://avatars.githubusercontent.com/u/63176?v=4?s=100" width="100px;" alt="Joe Lowrance"/><br /><sub><b>Joe Lowrance</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=joelowrance" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0xSysR3ll"><img src="https://avatars.githubusercontent.com/u/31414959?v=4?s=100" width="100px;" alt="0xsysr3ll"/><br /><sub><b>0xsysr3ll</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=0xSysR3ll" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/benbeauchamp7"><img src="https://avatars.githubusercontent.com/u/43358492?v=4?s=100" width="100px;" alt="Ben Beauchamp"/><br /><sub><b>Ben Beauchamp</b></sub></a><br /><a href="https://github.com/fallenbagel/jellyseerr/commits?author=benbeauchamp7" title="Code">💻</a></td>
</tr>
</tbody>
</table>
@@ -307,7 +338,7 @@ Thanks goes to these wonderful people from Overseerr ([emoji key](https://allcon
<td align="center" valign="top" width="14.28%"><a href="https://izaacj.me"><img src="https://avatars.githubusercontent.com/u/711323?v=4?s=100" width="100px;" alt="Izaac Brånn"/><br /><sub><b>Izaac Brånn</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=IzaacJ" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SalmanTariq"><img src="https://avatars.githubusercontent.com/u/13284494?v=4?s=100" width="100px;" alt="Salman Tariq"/><br /><sub><b>Salman Tariq</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=SalmanTariq" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/andrew-kennedy"><img src="https://avatars.githubusercontent.com/u/2387159?v=4?s=100" width="100px;" alt="Andrew Kennedy"/><br /><sub><b>Andrew Kennedy</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=andrew-kennedy" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fallenbagel"><img src="https://avatars.githubusercontent.com/u/98979876?v=4?s=100" width="100px;" alt="Fallenbagel"/><br /><sub><b>Fallenbagel</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=Fallenbagel" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fallenbagel"><img src="https://avatars.githubusercontent.com/u/98979876?v=4?s=100" width="100px;" alt="Fallenbagel"/><br /><sub><b>Fallenbagel</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=Fallenbagel" title="Jellyseerr">🪼⌨️</a> <a href="https://github.com/sct/overseerr/commits?author=Fallenbagel" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://aidoge.xyz"><img src="https://avatars.githubusercontent.com/u/9427639?v=4?s=100" width="100px;" alt="Anton K. (ai Doge)"/><br /><sub><b>Anton K. (ai Doge)</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=scorp200" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://marcofaggian.com"><img src="https://avatars.githubusercontent.com/u/19221001?v=4?s=100" width="100px;" alt="Marco Faggian"/><br /><sub><b>Marco Faggian</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=marcofaggian" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://nemchik.com/"><img src="https://avatars.githubusercontent.com/u/725456?v=4?s=100" width="100px;" alt="Eric Nemchik"/><br /><sub><b>Eric Nemchik</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=nemchik" title="Code">💻</a></td>

View File

@@ -3,8 +3,8 @@ kubeVersion: ">=1.23.0-0"
name: jellyseerr-chart
description: Jellyseerr helm chart for Kubernetes
type: application
version: 2.5.0
appVersion: "2.6.0"
version: 2.4.0
appVersion: "2.5.2"
maintainers:
- name: Jellyseerr
url: https://github.com/Fallenbagel/jellyseerr

View File

@@ -1,6 +1,6 @@
# jellyseerr-chart
![Version: 2.5.0](https://img.shields.io/badge/Version-2.5.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 2.6.0](https://img.shields.io/badge/AppVersion-2.6.0-informational?style=flat-square)
![Version: 2.4.0](https://img.shields.io/badge/Version-2.4.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 2.5.2](https://img.shields.io/badge/AppVersion-2.5.2-informational?style=flat-square)
Jellyseerr helm chart for Kubernetes

View File

@@ -142,14 +142,6 @@
"token": "",
"priority": 0
}
},
"ntfy": {
"enabled": false,
"types": 0,
"options": {
"url": "",
"topic": ""
}
}
}
},

View File

@@ -37,8 +37,13 @@ docker run -d \
-p 5055:5055 \
-v /path/to/appdata/config:/app/config \
--restart unless-stopped \
fallenbagel/jellyseerr
ghcr.io/fallenbagel/jellyseerr
```
:::tip
If you are using emby, make sure to set the `JELLYFIN_TYPE` environment variable to `emby`.
`-e JELLYFIN_TYPE=emby`
:::
To run the container as a specific user/group, you may optionally add `--user=[ user | user:group | uid | uid:gid | user:gid | uid:group ]` to the above command.
@@ -50,7 +55,7 @@ docker stop jellyseerr && docker rm Jellyseerr
```
Pull the latest image:
```bash
docker pull fallenbagel/jellyseerr
docker pull ghcr.io/fallenbagel/jellyseerr
```
Finally, run the container with the same parameters originally used to create the container:
```bash
@@ -73,7 +78,7 @@ Define the `jellyseerr` service in your `compose.yaml` as follows:
---
services:
jellyseerr:
image: fallenbagel/jellyseerr:latest
image: ghcr.io/fallenbagel/jellyseerr:latest
container_name: jellyseerr
environment:
- LOG_LEVEL=debug
@@ -85,6 +90,9 @@ services:
- /path/to/appdata/config:/app/config
restart: unless-stopped
```
:::tip
If you are using emby, make sure to set the `JELLYFIN_TYPE` environment variable to `emby`.
:::
Then, start all services defined in the Compose file:
```bash
@@ -113,7 +121,8 @@ You may alternatively use a third-party mechanism like [dockge](https://github.c
2. Inside the **Community Applications** app store, search for **Jellyseerr**.
3. Click the **Install Button**.
4. On the following **Add Container** screen, make changes to the **Host Port** and **Host Path 1** \(Appdata\) as needed.
5. Click apply and access "Jellyseerr" at your `<ServerIP:HostPort>` in a web browser.
5. If you want to use emby, make sure to set the `JELLYFIN_TYPE` environment variable to `emby`. Otherwise, remove the variable.
6. Click apply and access "Jellyseerr" at your `<ServerIP:HostPort>` in a web browser.
## Windows
@@ -137,7 +146,7 @@ Then, create and start the Jellyseerr container:
<Tabs groupId="docker-methods" queryString>
<TabItem value="docker-cli" label="Docker CLI">
```bash
docker run -d --name jellyseerr -e LOG_LEVEL=debug -e TZ=Asia/Tashkent -p 5055:5055 -v "jellyseerr-data:/app/config" --restart unless-stopped fallenbagel/jellyseerr:latest
docker run -d --name jellyseerr -e LOG_LEVEL=debug -e TZ=Asia/Tashkent -p 5055:5055 -v "jellyseerr-data:/app/config" --restart unless-stopped ghcr.io/fallenbagel/jellyseerr:latest
```
#### Updating:
@@ -184,6 +193,12 @@ docker compose up -d
</TabItem>
</Tabs>
:::tip
If you are using a named volume, then you can safely **ignore** the warning about the `/app/config` folder being incorrectly mounted.
If you are using emby, make sure to set the `JELLYFIN_TYPE` environment variable to `emby`.
:::
To access the files inside the volume created above, navigate to `\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\jellyseerr-data\_data` using File Explorer.
:::info

View File

@@ -105,12 +105,6 @@ In some places (like China), the ISP blocks not only the DNS resolution but also
You can configure Jellyseerr to use a proxy with the [HTTP(S) Proxy](/using-jellyseerr/settings/general#https-proxy) setting.
### Option 3: Force IPV4 resolution first
Sometimes there are configuration issues with IPV6 that prevent the hostname resolution from working correctly.
You can try to force the resolution to use IPV4 first by going to `Settings > Networking > Advanced Networking` and enabling `Force IPv4 Resolution First` setting and restarting Jellyseerr.
### Option 4: Check that your server can reach TMDB API
Make sure that your server can reach the TMDB API by running the following command:
@@ -152,26 +146,3 @@ In a PowerShell window:
If you can't get a response, then your server can't reach the TMDB API.
This is usually due to a network configuration issue or a firewall blocking the connection.
## Account does not have admin privileges
If your admin account no longer has admin privileges, this is typically because your Jellyfin/Emby user ID has changed on the server side.
This can happen if you have a new installation of Jellyfin/Emby or if you have changed the user ID of your admin account.
### Solution: Reset admin access
1. Back up your `settings.json` file (located in your Jellyseerr data directory)
2. Stop the Jellyseerr container/service
3. Delete the `settings.json` file
4. Start Jellyseerr again
5. This will force the setup page to appear
6. Go through the setup process with the same login details
7. You can skip the services setup
8. Once you reach the discover page, stop Jellyseerr
9. Restore your backed-up `settings.json` file
10. Start Jellyseerr again
This process should restore your admin privileges while preserving your settings.
If you still encounter issues, please reach out on our support channels.

View File

@@ -78,12 +78,6 @@ Available media will still appear in search results, however, so it is possible
This setting is **disabled** by default.
## Hide Blacklisted Items
When enabled, media that has been blacklisted will not appear on the "Discover" home page, for all administrators. This can be useful to hide content that you don't want to see, such as content with specific tags or content that has been manually blacklisted when you have the "Manage Blacklist" permission.
This setting is **disabled** by default.
## Allow Partial Series Requests
When enabled, users will be able to submit requests for specific seasons of TV series. If disabled, users will only be able to submit requests for all unavailable seasons.

View File

@@ -1399,32 +1399,6 @@ components:
type: string
token:
type: string
NtfySettings:
type: object
properties:
enabled:
type: boolean
example: false
types:
type: number
example: 2
options:
type: object
properties:
url:
type: string
topic:
type: string
authMethodUsernamePassword:
type: boolean
username:
type: string
password:
type: string
authMethodToken:
type: boolean
token:
type: string
LunaSeaSettings:
type: object
properties:
@@ -1976,41 +1950,6 @@ components:
properties:
id:
type: string
Certification:
type: object
properties:
certification:
type: string
example: 'PG-13'
meaning:
type: string
example: 'Some material may be inappropriate for children under 13.'
nullable: true
order:
type: number
example: 3
nullable: true
required:
- certification
CertificationResponse:
type: object
properties:
certifications:
type: object
additionalProperties:
type: array
items:
$ref: '#/components/schemas/Certification'
example:
certifications:
US:
- certification: 'G'
meaning: 'All ages admitted'
order: 1
- certification: 'PG'
meaning: 'Some material may not be suitable for children under 10.'
order: 2
securitySchemes:
cookieAuth:
type: apiKey
@@ -3310,52 +3249,6 @@ paths:
responses:
'204':
description: Test notification attempted
/settings/notifications/ntfy:
get:
summary: Get ntfy.sh notification settings
description: Returns current ntfy.sh notification settings in a JSON object.
tags:
- settings
responses:
'200':
description: Returned ntfy.sh settings
content:
application/json:
schema:
$ref: '#/components/schemas/NtfySettings'
post:
summary: Update ntfy.sh notification settings
description: Update ntfy.sh notification settings with the provided values.
tags:
- settings
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/NtfySettings'
responses:
'200':
description: 'Values were sucessfully updated'
content:
application/json:
schema:
$ref: '#/components/schemas/NtfySettings'
/settings/notifications/ntfy/test:
post:
summary: Test ntfy.sh settings
description: Sends a test notification to the ntfy.sh agent.
tags:
- settings
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/NtfySettings'
responses:
'204':
description: Test notification attempted
/settings/notifications/slack:
get:
summary: Get Slack notification settings
@@ -4107,7 +4000,7 @@ paths:
type: string
userAgent:
type: string
/user/{userId}/pushSubscription/{endpoint}:
/user/{userId}/pushSubscription/{key}:
get:
summary: Get web push notification settings for a user
description: |
@@ -4121,7 +4014,7 @@ paths:
schema:
type: number
- in: path
name: endpoint
name: key
required: true
schema:
type: string
@@ -4153,7 +4046,7 @@ paths:
schema:
type: number
- in: path
name: endpoint
name: key
required: true
schema:
type: string
@@ -5061,37 +4954,6 @@ paths:
schema:
type: string
example: 8|9
- in: query
name: certification
schema:
type: string
example: PG-13
description: Exact certification to filter by (used when certificationMode is 'exact')
- in: query
name: certificationGte
schema:
type: string
example: G
description: Minimum certification to filter by (used when certificationMode is 'range')
- in: query
name: certificationLte
schema:
type: string
example: PG-13
description: Maximum certification to filter by (used when certificationMode is 'range')
- in: query
name: certificationCountry
schema:
type: string
example: US
description: Country code for the certification system (e.g., US, GB, CA)
- in: query
name: certificationMode
schema:
type: string
enum: [exact, range]
example: exact
description: Determines whether to use exact certification matching or a certification range (internal use only, not sent to TMDB API)
responses:
'200':
description: Results
@@ -5386,37 +5248,6 @@ paths:
schema:
type: string
example: 3|4
- in: query
name: certification
schema:
type: string
example: TV-14
description: Exact certification to filter by (used when certificationMode is 'exact')
- in: query
name: certificationGte
schema:
type: string
example: TV-PG
description: Minimum certification to filter by (used when certificationMode is 'range')
- in: query
name: certificationLte
schema:
type: string
example: TV-MA
description: Maximum certification to filter by (used when certificationMode is 'range')
- in: query
name: certificationCountry
schema:
type: string
example: US
description: Country code for the certification system (e.g., US, GB, CA)
- in: query
name: certificationMode
schema:
type: string
enum: [exact, range]
example: exact
description: Determines whether to use exact certification matching or a certification range (internal use only, not sent to TMDB API)
responses:
'200':
description: Results
@@ -5867,13 +5698,6 @@ paths:
type: number
nullable: true
example: 1
- in: query
name: mediaType
schema:
type: string
enum: [movie, tv, all]
nullable: true
default: all
responses:
'200':
description: Requests returned
@@ -7397,64 +7221,6 @@ paths:
type: array
items:
$ref: '#/components/schemas/WatchProviderDetails'
/certifications/movie:
get:
summary: Get movie certifications
description: Returns list of movie certifications from TMDB.
tags:
- other
security:
- cookieAuth: []
- apiKey: []
responses:
'200':
description: Movie certifications returned
content:
application/json:
schema:
$ref: '#/components/schemas/CertificationResponse'
'500':
description: Unable to retrieve movie certifications
content:
application/json:
schema:
type: object
properties:
status:
type: number
example: 500
message:
type: string
example: Unable to retrieve movie certifications.
/certifications/tv:
get:
summary: Get TV certifications
description: Returns list of TV show certifications from TMDB.
tags:
- other
security:
- cookieAuth: []
- apiKey: []
responses:
'200':
description: TV certifications returned
content:
application/json:
schema:
$ref: '#/components/schemas/CertificationResponse'
'500':
description: Unable to retrieve TV certifications
content:
application/json:
schema:
type: object
properties:
status:
type: number
example: 500
message:
type: string
example: Unable to retrieve TV certifications.
/overrideRule:
get:
summary: Get override rules

View File

@@ -1,6 +1,6 @@
{
"name": "jellyseerr",
"version": "2.7.0",
"version": "0.1.0",
"private": true,
"scripts": {
"preinstall": "npx only-allow pnpm",
@@ -43,8 +43,8 @@
"@supercharge/request-ip": "1.2.0",
"@svgr/webpack": "6.5.1",
"@tanem/react-nprogress": "5.0.30",
"@types/ua-parser-js": "^0.7.36",
"@types/wink-jaro-distance": "^2.0.2",
"@types/ua-parser-js": "^0.7.36",
"ace-builds": "1.15.2",
"axios": "1.3.4",
"axios-rate-limit": "1.3.0",
@@ -65,8 +65,6 @@
"express-session": "1.17.3",
"formik": "^2.4.6",
"gravatar-url": "3.1.0",
"http-proxy-agent": "^7.0.2",
"https-proxy-agent": "^7.0.6",
"lodash": "4.17.21",
"mime": "3",
"next": "^14.2.25",
@@ -103,8 +101,8 @@
"swr": "2.2.5",
"tailwind-merge": "^2.6.0",
"typeorm": "0.3.12",
"ua-parser-js": "^1.0.35",
"undici": "^7.3.0",
"ua-parser-js": "^1.0.35",
"web-push": "3.5.0",
"wink-jaro-distance": "^2.0.0",
"winston": "3.8.2",

36
pnpm-lock.yaml generated
View File

@@ -107,12 +107,6 @@ importers:
gravatar-url:
specifier: 3.1.0
version: 3.1.0
http-proxy-agent:
specifier: ^7.0.2
version: 7.0.2
https-proxy-agent:
specifier: ^7.0.6
version: 7.0.6
lodash:
specifier: 4.17.21
version: 4.17.21
@@ -3632,10 +3626,6 @@ packages:
resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==}
engines: {node: '>= 14'}
agent-base@7.1.3:
resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==}
engines: {node: '>= 14'}
agentkeepalive@4.5.0:
resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==}
engines: {node: '>= 8.0.0'}
@@ -5798,8 +5788,8 @@ packages:
resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
engines: {node: '>= 6'}
https-proxy-agent@7.0.6:
resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
https-proxy-agent@7.0.5:
resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==}
engines: {node: '>= 14'}
human-signals@1.1.1:
@@ -11132,7 +11122,7 @@ snapshots:
'@babel/helper-split-export-declaration': 7.24.7
'@babel/parser': 7.24.7
'@babel/types': 7.24.7
debug: 4.4.0(supports-color@5.5.0)
debug: 4.3.5
globals: 11.12.0
transitivePeerDependencies:
- supports-color
@@ -13349,7 +13339,7 @@ snapshots:
fs-extra: 11.2.0
globby: 11.1.0
http-proxy-agent: 7.0.2
https-proxy-agent: 7.0.6
https-proxy-agent: 7.0.5
issue-parser: 6.0.0
lodash: 4.17.21
mime: 3.0.0
@@ -13971,7 +13961,7 @@ snapshots:
dependencies:
'@typescript-eslint/types': 7.2.0
'@typescript-eslint/visitor-keys': 7.2.0
debug: 4.4.0(supports-color@5.5.0)
debug: 4.3.5
globby: 11.1.0
is-glob: 4.0.3
minimatch: 9.0.3
@@ -14062,12 +14052,10 @@ snapshots:
agent-base@7.1.1:
dependencies:
debug: 4.4.0(supports-color@5.5.0)
debug: 4.3.5
transitivePeerDependencies:
- supports-color
agent-base@7.1.3: {}
agentkeepalive@4.5.0:
dependencies:
humanize-ms: 1.2.1
@@ -15811,7 +15799,7 @@ snapshots:
debug: 4.3.5
enhanced-resolve: 5.17.0
eslint: 8.35.0
eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.35.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.35.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.35.0))(eslint@8.35.0)
eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.35.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.35.0)
eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.54.0(eslint@8.35.0)(typescript@4.9.5))(eslint@8.35.0)
fast-glob: 3.3.2
get-tsconfig: 4.7.5
@@ -15833,7 +15821,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.35.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.35.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.35.0))(eslint@8.35.0):
eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.35.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.35.0):
dependencies:
debug: 3.2.7(supports-color@8.1.1)
optionalDependencies:
@@ -16833,7 +16821,7 @@ snapshots:
http-proxy-agent@7.0.2:
dependencies:
agent-base: 7.1.1
debug: 4.4.0(supports-color@5.5.0)
debug: 4.3.5
transitivePeerDependencies:
- supports-color
@@ -16860,10 +16848,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
https-proxy-agent@7.0.6:
https-proxy-agent@7.0.5:
dependencies:
agent-base: 7.1.3
debug: 4.4.0(supports-color@5.5.0)
agent-base: 7.1.1
debug: 4.3.5
transitivePeerDependencies:
- supports-color

View File

@@ -22,23 +22,6 @@ export interface JellyfinUserResponse {
PrimaryImageTag?: string;
}
export interface JellyfinDevice {
Id: string;
Name: string;
LastUserName: string;
AppName: string;
AppVersion: string;
LastUserId: string;
DateLastActivity: string;
Capabilities: Record<string, unknown>;
}
export interface JellyfinDevicesResponse {
Items: JellyfinDevice[];
TotalRecordCount: number;
StartIndex: number;
}
export interface JellyfinLoginResponse {
User: JellyfinUserResponse;
AccessToken: string;
@@ -130,7 +113,9 @@ class JellyfinAPI extends ExternalAPI {
const safeDeviceId =
deviceId && deviceId.length > 0
? deviceId
: Buffer.from('BOT_jellyseerr').toString('base64');
: Buffer.from(`BOT_jellyseerr_fallback_${Date.now()}`).toString(
'base64'
);
let authHeaderVal: string;
if (authToken) {

View File

@@ -59,16 +59,6 @@ export const SortOptionsIterable = [
export type SortOptions = (typeof SortOptionsIterable)[number];
export interface TmdbCertificationResponse {
certifications: {
[country: string]: {
certification: string;
meaning?: string;
order?: number;
}[];
};
}
interface DiscoverMovieOptions {
page?: number;
includeAdult?: boolean;
@@ -88,10 +78,6 @@ interface DiscoverMovieOptions {
sortBy?: SortOptions;
watchRegion?: string;
watchProviders?: string;
certification?: string;
certificationGte?: string;
certificationLte?: string;
certificationCountry?: string;
}
interface DiscoverTvOptions {
@@ -114,10 +100,6 @@ interface DiscoverTvOptions {
watchRegion?: string;
watchProviders?: string;
withStatus?: string; // Returning Series: 0 Planned: 1 In Production: 2 Ended: 3 Cancelled: 4 Pilot: 5
certification?: string;
certificationGte?: string;
certificationLte?: string;
certificationCountry?: string;
}
class TheMovieDb extends ExternalAPI {
@@ -495,10 +477,6 @@ class TheMovieDb extends ExternalAPI {
voteCountLte,
watchProviders,
watchRegion,
certification,
certificationGte,
certificationLte,
certificationCountry,
}: DiscoverMovieOptions = {}): Promise<TmdbSearchMovieResponse> => {
try {
const defaultFutureDate = new Date(
@@ -545,10 +523,6 @@ class TheMovieDb extends ExternalAPI {
'vote_count.lte': voteCountLte,
watch_region: watchRegion,
with_watch_providers: watchProviders,
certification: certification,
'certification.gte': certificationGte,
'certification.lte': certificationLte,
certification_country: certificationCountry,
},
});
@@ -578,10 +552,6 @@ class TheMovieDb extends ExternalAPI {
watchProviders,
watchRegion,
withStatus,
certification,
certificationGte,
certificationLte,
certificationCountry,
}: DiscoverTvOptions = {}): Promise<TmdbSearchTvResponse> => {
try {
const defaultFutureDate = new Date(
@@ -629,10 +599,6 @@ class TheMovieDb extends ExternalAPI {
with_watch_providers: watchProviders,
watch_region: watchRegion,
with_status: withStatus,
certification: certification,
'certification.gte': certificationGte,
'certification.lte': certificationLte,
certification_country: certificationCountry,
},
});
@@ -1021,35 +987,6 @@ class TheMovieDb extends ExternalAPI {
}
}
public getMovieCertifications =
async (): Promise<TmdbCertificationResponse> => {
try {
const data = await this.get<TmdbCertificationResponse>(
'/certification/movie/list',
{},
604800 // 7 days
);
return data;
} catch (e) {
throw new Error(`[TMDB] Failed to fetch movie certifications: ${e}`);
}
};
public getTvCertifications = async (): Promise<TmdbCertificationResponse> => {
try {
const data = await this.get<TmdbCertificationResponse>(
'/certification/tv/list',
{},
604800 // 7 days
);
return data;
} catch (e) {
throw new Error(`[TMDB] Failed to fetch TV certifications: ${e.message}`);
}
};
public async getKeywordDetails({
keywordId,
}: {

View File

@@ -3,10 +3,10 @@ import dataSource from '@server/datasource';
import Media from '@server/entity/Media';
import { User } from '@server/entity/User';
import type { BlacklistItem } from '@server/interfaces/api/blacklistInterfaces';
import { DbAwareColumn } from '@server/utils/DbColumnHelper';
import type { EntityManager } from 'typeorm';
import {
Column,
CreateDateColumn,
Entity,
Index,
JoinColumn,
@@ -47,7 +47,7 @@ export class Blacklist implements BlacklistItem {
@Column({ nullable: true, type: 'varchar' })
public blacklistedTags?: string;
@DbAwareColumn({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP' })
@CreateDateColumn()
public createdAt: Date;
constructor(init?: Partial<Blacklist>) {

View File

@@ -2,8 +2,13 @@ import type { DiscoverSliderType } from '@server/constants/discover';
import { defaultSliders } from '@server/constants/discover';
import { getRepository } from '@server/datasource';
import logger from '@server/logger';
import { DbAwareColumn } from '@server/utils/DbColumnHelper';
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
import {
Column,
CreateDateColumn,
Entity,
PrimaryGeneratedColumn,
UpdateDateColumn,
} from 'typeorm';
@Entity()
class DiscoverSlider {
@@ -50,14 +55,10 @@ class DiscoverSlider {
@Column({ nullable: true })
public data?: string;
@DbAwareColumn({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP' })
@CreateDateColumn()
public createdAt: Date;
@DbAwareColumn({
type: 'datetime',
default: () => 'CURRENT_TIMESTAMP',
onUpdate: 'CURRENT_TIMESTAMP',
})
@UpdateDateColumn()
public updatedAt: Date;
constructor(init?: Partial<DiscoverSlider>) {

View File

@@ -1,13 +1,13 @@
import type { IssueType } from '@server/constants/issue';
import { IssueStatus } from '@server/constants/issue';
import { DbAwareColumn } from '@server/utils/DbColumnHelper';
import {
AfterLoad,
Column,
CreateDateColumn,
Entity,
ManyToOne,
OneToMany,
PrimaryGeneratedColumn,
UpdateDateColumn,
} from 'typeorm';
import IssueComment from './IssueComment';
import Media from './Media';
@@ -55,21 +55,12 @@ class Issue {
})
public comments: IssueComment[];
@DbAwareColumn({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP' })
@CreateDateColumn()
public createdAt: Date;
@DbAwareColumn({
type: 'datetime',
default: () => 'CURRENT_TIMESTAMP',
onUpdate: 'CURRENT_TIMESTAMP',
})
@UpdateDateColumn()
public updatedAt: Date;
@AfterLoad()
sortComments() {
this.comments?.sort((a, b) => a.id - b.id);
}
constructor(init?: Partial<Issue>) {
Object.assign(this, init);
}

View File

@@ -1,5 +1,11 @@
import { DbAwareColumn } from '@server/utils/DbColumnHelper';
import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
import {
Column,
CreateDateColumn,
Entity,
ManyToOne,
PrimaryGeneratedColumn,
UpdateDateColumn,
} from 'typeorm';
import Issue from './Issue';
import { User } from './User';
@@ -22,14 +28,10 @@ class IssueComment {
@Column({ type: 'text' })
public message: string;
@DbAwareColumn({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP' })
@CreateDateColumn()
public createdAt: Date;
@DbAwareColumn({
type: 'datetime',
default: () => 'CURRENT_TIMESTAMP',
onUpdate: 'CURRENT_TIMESTAMP',
})
@UpdateDateColumn()
public updatedAt: Date;
constructor(init?: Partial<IssueComment>) {

View File

@@ -15,11 +15,13 @@ import { getHostname } from '@server/utils/getHostname';
import {
AfterLoad,
Column,
CreateDateColumn,
Entity,
Index,
OneToMany,
OneToOne,
PrimaryGeneratedColumn,
UpdateDateColumn,
} from 'typeorm';
import Issue from './Issue';
import { MediaRequest } from './MediaRequest';
@@ -126,14 +128,10 @@ class Media {
@OneToOne(() => Blacklist, (blacklist) => blacklist.media)
public blacklist: Promise<Blacklist>;
@DbAwareColumn({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP' })
@CreateDateColumn()
public createdAt: Date;
@DbAwareColumn({
type: 'datetime',
default: () => 'CURRENT_TIMESTAMP',
onUpdate: 'CURRENT_TIMESTAMP',
})
@UpdateDateColumn()
public updatedAt: Date;
/**

View File

@@ -13,18 +13,18 @@ import notificationManager, { Notification } from '@server/lib/notifications';
import { Permission } from '@server/lib/permissions';
import { getSettings } from '@server/lib/settings';
import logger from '@server/logger';
import { DbAwareColumn } from '@server/utils/DbColumnHelper';
import { truncate } from 'lodash';
import {
AfterInsert,
AfterLoad,
AfterUpdate,
Column,
CreateDateColumn,
Entity,
ManyToOne,
OneToMany,
PrimaryGeneratedColumn,
RelationCount,
UpdateDateColumn,
} from 'typeorm';
import Media from './Media';
import SeasonRequest from './SeasonRequest';
@@ -535,14 +535,10 @@ export class MediaRequest {
})
public modifiedBy?: User;
@DbAwareColumn({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP' })
@CreateDateColumn()
public createdAt: Date;
@DbAwareColumn({
type: 'datetime',
default: () => 'CURRENT_TIMESTAMP',
onUpdate: 'CURRENT_TIMESTAMP',
})
@UpdateDateColumn()
public updatedAt: Date;
@Column({ type: 'varchar' })
@@ -702,13 +698,6 @@ export class MediaRequest {
}
}
@AfterLoad()
private sortSeasons() {
if (Array.isArray(this.seasons)) {
this.seasons.sort((a, b) => a.id - b.id);
}
}
static async sendNotification(
entity: MediaRequest,
media: Media,

View File

@@ -1,5 +1,10 @@
import { DbAwareColumn } from '@server/utils/DbColumnHelper';
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
import {
Column,
CreateDateColumn,
Entity,
PrimaryGeneratedColumn,
UpdateDateColumn,
} from 'typeorm';
@Entity()
class OverrideRule {
@@ -33,14 +38,10 @@ class OverrideRule {
@Column({ nullable: true })
public tags?: string;
@DbAwareColumn({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP' })
@CreateDateColumn()
public createdAt: Date;
@DbAwareColumn({
type: 'datetime',
default: () => 'CURRENT_TIMESTAMP',
onUpdate: 'CURRENT_TIMESTAMP',
})
@UpdateDateColumn()
public updatedAt: Date;
constructor(init?: Partial<OverrideRule>) {

View File

@@ -1,6 +1,12 @@
import { MediaStatus } from '@server/constants/media';
import { DbAwareColumn } from '@server/utils/DbColumnHelper';
import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
import {
Column,
CreateDateColumn,
Entity,
ManyToOne,
PrimaryGeneratedColumn,
UpdateDateColumn,
} from 'typeorm';
import Media from './Media';
@Entity()
@@ -22,14 +28,10 @@ class Season {
})
public media: Promise<Media>;
@DbAwareColumn({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP' })
@CreateDateColumn()
public createdAt: Date;
@DbAwareColumn({
type: 'datetime',
default: () => 'CURRENT_TIMESTAMP',
onUpdate: 'CURRENT_TIMESTAMP',
})
@UpdateDateColumn()
public updatedAt: Date;
constructor(init?: Partial<Season>) {

View File

@@ -1,6 +1,12 @@
import { MediaRequestStatus } from '@server/constants/media';
import { DbAwareColumn } from '@server/utils/DbColumnHelper';
import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
import {
Column,
CreateDateColumn,
Entity,
ManyToOne,
PrimaryGeneratedColumn,
UpdateDateColumn,
} from 'typeorm';
import { MediaRequest } from './MediaRequest';
@Entity()
@@ -19,14 +25,10 @@ class SeasonRequest {
})
public request: MediaRequest;
@DbAwareColumn({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP' })
@CreateDateColumn()
public createdAt: Date;
@DbAwareColumn({
type: 'datetime',
default: () => 'CURRENT_TIMESTAMP',
onUpdate: 'CURRENT_TIMESTAMP',
})
@UpdateDateColumn()
public updatedAt: Date;
constructor(init?: Partial<SeasonRequest>) {

View File

@@ -9,7 +9,6 @@ import { hasPermission, Permission } from '@server/lib/permissions';
import { getSettings } from '@server/lib/settings';
import logger from '@server/logger';
import { AfterDate } from '@server/utils/dateHelpers';
import { DbAwareColumn } from '@server/utils/DbColumnHelper';
import bcrypt from 'bcrypt';
import { randomUUID } from 'crypto';
import path from 'path';
@@ -17,12 +16,14 @@ import { default as generatePassword } from 'secure-random-password';
import {
AfterLoad,
Column,
CreateDateColumn,
Entity,
Not,
OneToMany,
OneToOne,
PrimaryGeneratedColumn,
RelationCount,
UpdateDateColumn,
} from 'typeorm';
import Issue from './Issue';
import { MediaRequest } from './MediaRequest';
@@ -137,14 +138,10 @@ export class User {
@OneToMany(() => Issue, (issue) => issue.createdBy, { cascade: true })
public createdIssues: Issue[];
@DbAwareColumn({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP' })
@CreateDateColumn()
public createdAt: Date;
@DbAwareColumn({
type: 'datetime',
default: () => 'CURRENT_TIMESTAMP',
onUpdate: 'CURRENT_TIMESTAMP',
})
@UpdateDateColumn()
public updatedAt: Date;
public warnings: string[] = [];

View File

@@ -1,5 +1,10 @@
import { DbAwareColumn } from '@server/utils/DbColumnHelper';
import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
import {
Column,
CreateDateColumn,
Entity,
ManyToOne,
PrimaryGeneratedColumn,
} from 'typeorm';
import { User } from './User';
@Entity()
@@ -25,11 +30,7 @@ export class UserPushSubscription {
@Column({ nullable: true })
public userAgent: string;
@DbAwareColumn({
type: 'datetime',
default: () => 'CURRENT_TIMESTAMP',
nullable: true,
})
@CreateDateColumn({ nullable: true })
public createdAt: Date;
constructor(init?: Partial<UserPushSubscription>) {

View File

@@ -5,14 +5,15 @@ import Media from '@server/entity/Media';
import { User } from '@server/entity/User';
import type { WatchlistItem } from '@server/interfaces/api/discoverInterfaces';
import logger from '@server/logger';
import { DbAwareColumn } from '@server/utils/DbColumnHelper';
import {
Column,
CreateDateColumn,
Entity,
Index,
ManyToOne,
PrimaryGeneratedColumn,
Unique,
UpdateDateColumn,
} from 'typeorm';
import type { ZodNumber, ZodOptional, ZodString } from 'zod';
@@ -55,14 +56,10 @@ export class Watchlist implements WatchlistItem {
})
public media: Media;
@DbAwareColumn({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP' })
@CreateDateColumn()
public createdAt: Date;
@DbAwareColumn({
type: 'datetime',
default: () => 'CURRENT_TIMESTAMP',
onUpdate: 'CURRENT_TIMESTAMP',
})
@UpdateDateColumn()
public updatedAt: Date;
constructor(init?: Partial<Watchlist>) {

View File

@@ -10,7 +10,6 @@ import DiscordAgent from '@server/lib/notifications/agents/discord';
import EmailAgent from '@server/lib/notifications/agents/email';
import GotifyAgent from '@server/lib/notifications/agents/gotify';
import LunaSeaAgent from '@server/lib/notifications/agents/lunasea';
import NtfyAgent from '@server/lib/notifications/agents/ntfy';
import PushbulletAgent from '@server/lib/notifications/agents/pushbullet';
import PushoverAgent from '@server/lib/notifications/agents/pushover';
import SlackAgent from '@server/lib/notifications/agents/slack';
@@ -28,7 +27,6 @@ import { getAppVersion } from '@server/utils/appVersion';
import createCustomProxyAgent from '@server/utils/customProxyAgent';
import restartFlag from '@server/utils/restartFlag';
import { getClientIp } from '@supercharge/request-ip';
import axios from 'axios';
import { TypeormStore } from 'connect-typeorm/out';
import cookieParser from 'cookie-parser';
import type { NextFunction, Request, Response } from 'express';
@@ -36,8 +34,6 @@ import express from 'express';
import * as OpenApiValidator from 'express-openapi-validator';
import type { Store } from 'express-session';
import session from 'express-session';
import http from 'http';
import https from 'https';
import next from 'next';
import path from 'path';
import swaggerUi from 'swagger-ui-express';
@@ -76,11 +72,6 @@ app
const settings = await getSettings().load();
restartFlag.initializeSettings(settings);
if (settings.network.forceIpv4First) {
axios.defaults.httpAgent = new http.Agent({ family: 4 });
axios.defaults.httpsAgent = new https.Agent({ family: 4 });
}
// Register HTTP proxy
if (settings.network.proxy.enabled) {
await createCustomProxyAgent(settings.network.proxy);
@@ -112,7 +103,6 @@ app
new DiscordAgent(),
new EmailAgent(),
new GotifyAgent(),
new NtfyAgent(),
new LunaSeaAgent(),
new PushbulletAgent(),
new PushoverAgent(),

View File

@@ -29,7 +29,6 @@ export interface PublicSettingsResponse {
applicationTitle: string;
applicationUrl: string;
hideAvailable: boolean;
hideBlacklisted: boolean;
localLogin: boolean;
mediaServerLogin: boolean;
movie4kEnabled: boolean;
@@ -46,7 +45,6 @@ export interface PublicSettingsResponse {
locale: string;
emailEnabled: boolean;
newPlexLogin: boolean;
youtubeUrl: string;
}
export interface CacheItem {

View File

@@ -142,9 +142,8 @@ class BlacklistedTagProcessor implements RunnableScanner<StatusBase> {
blacklistEntry.blacklistedTags &&
!blacklistEntry.blacklistedTags.includes(`,${keywordId},`)
) {
await blacklistRepository.update(blacklistEntry.id, {
blacklistedTags: `${blacklistEntry.blacklistedTags}${keywordId},`,
});
blacklistEntry.blacklistedTags = `${blacklistEntry.blacklistedTags}${keywordId},`;
await blacklistRepository.save(blacklistEntry);
}
} else {
// Media wasn't previously blacklisted, add it to the blacklist

View File

@@ -1,164 +0,0 @@
import { IssueStatus, IssueTypeName } from '@server/constants/issue';
import type { NotificationAgentNtfy } from '@server/lib/settings';
import { getSettings } from '@server/lib/settings';
import logger from '@server/logger';
import axios from 'axios';
import { hasNotificationType, Notification } from '..';
import type { NotificationAgent, NotificationPayload } from './agent';
import { BaseAgent } from './agent';
class NtfyAgent
extends BaseAgent<NotificationAgentNtfy>
implements NotificationAgent
{
protected getSettings(): NotificationAgentNtfy {
if (this.settings) {
return this.settings;
}
const settings = getSettings();
return settings.notifications.agents.ntfy;
}
private buildPayload(type: Notification, payload: NotificationPayload) {
const { applicationUrl } = getSettings().main;
const topic = this.getSettings().options.topic;
const priority = 3;
const title = payload.event
? `${payload.event} - ${payload.subject}`
: payload.subject;
let message = payload.message ?? '';
if (payload.request) {
message += `\n\nRequested By: ${payload.request.requestedBy.displayName}`;
let status = '';
switch (type) {
case Notification.MEDIA_PENDING:
status = 'Pending Approval';
break;
case Notification.MEDIA_APPROVED:
case Notification.MEDIA_AUTO_APPROVED:
status = 'Processing';
break;
case Notification.MEDIA_AVAILABLE:
status = 'Available';
break;
case Notification.MEDIA_DECLINED:
status = 'Declined';
break;
case Notification.MEDIA_FAILED:
status = 'Failed';
break;
}
if (status) {
message += `\nRequest Status: ${status}`;
}
} else if (payload.comment) {
message += `\nComment from ${payload.comment.user.displayName}:\n${payload.comment.message}`;
} else if (payload.issue) {
message += `\n\nReported By: ${payload.issue.createdBy.displayName}`;
message += `\nIssue Type: ${IssueTypeName[payload.issue.issueType]}`;
message += `\nIssue Status: ${
payload.issue.status === IssueStatus.OPEN ? 'Open' : 'Resolved'
}`;
}
for (const extra of payload.extra ?? []) {
message += `\n\n**${extra.name}**\n${extra.value}`;
}
const attach = payload.image;
let click;
if (applicationUrl && payload.media) {
click = `${applicationUrl}/${payload.media.mediaType}/${payload.media.tmdbId}`;
}
return {
topic,
priority,
title,
message,
attach,
click,
};
}
public shouldSend(): boolean {
const settings = this.getSettings();
if (settings.enabled && settings.options.url && settings.options.topic) {
return true;
}
return false;
}
public async send(
type: Notification,
payload: NotificationPayload
): Promise<boolean> {
const settings = this.getSettings();
if (
!payload.notifySystem ||
!hasNotificationType(type, settings.types ?? 0)
) {
return true;
}
logger.debug('Sending ntfy notification', {
label: 'Notifications',
type: Notification[type],
subject: payload.subject,
});
try {
let authHeader;
if (
settings.options.authMethodUsernamePassword &&
settings.options.username &&
settings.options.password
) {
const encodedAuth = Buffer.from(
`${settings.options.username}:${settings.options.password}`
).toString('base64');
authHeader = `Basic ${encodedAuth}`;
} else if (settings.options.authMethodToken) {
authHeader = `Bearer ${settings.options.token}`;
}
await axios.post(
settings.options.url,
this.buildPayload(type, payload),
authHeader
? {
headers: {
Authorization: authHeader,
},
}
: undefined
);
return true;
} catch (e) {
logger.error('Error sending ntfy notification', {
label: 'Notifications',
type: Notification[type],
subject: payload.subject,
errorMessage: e.message,
response: e?.response?.data,
});
return false;
}
}
}
export default NtfyAgent;

View File

@@ -122,7 +122,6 @@ export interface MainSettings {
tv: Quota;
};
hideAvailable: boolean;
hideBlacklisted: boolean;
localLogin: boolean;
mediaServerLogin: boolean;
newPlexLogin: boolean;
@@ -135,12 +134,10 @@ export interface MainSettings {
partialRequestsEnabled: boolean;
enableSpecialEpisodes: boolean;
locale: string;
youtubeUrl: string;
}
export interface NetworkSettings {
csrfProtection: boolean;
forceIpv4First: boolean;
trustProxy: boolean;
proxy: ProxySettings;
}
@@ -153,7 +150,6 @@ interface FullPublicSettings extends PublicSettings {
applicationTitle: string;
applicationUrl: string;
hideAvailable: boolean;
hideBlacklisted: boolean;
localLogin: boolean;
mediaServerLogin: boolean;
movie4kEnabled: boolean;
@@ -174,7 +170,6 @@ interface FullPublicSettings extends PublicSettings {
emailEnabled: boolean;
userEmailRequired: boolean;
newPlexLogin: boolean;
youtubeUrl: string;
}
export interface NotificationAgentConfig {
@@ -264,23 +259,10 @@ export interface NotificationAgentGotify extends NotificationAgentConfig {
};
}
export interface NotificationAgentNtfy extends NotificationAgentConfig {
options: {
url: string;
topic: string;
authMethodUsernamePassword?: boolean;
username?: string;
password?: string;
authMethodToken?: boolean;
token?: string;
};
}
export enum NotificationAgentKey {
DISCORD = 'discord',
EMAIL = 'email',
GOTIFY = 'gotify',
NTFY = 'ntfy',
PUSHBULLET = 'pushbullet',
PUSHOVER = 'pushover',
SLACK = 'slack',
@@ -293,7 +275,6 @@ interface NotificationAgents {
discord: NotificationAgentDiscord;
email: NotificationAgentEmail;
gotify: NotificationAgentGotify;
ntfy: NotificationAgentNtfy;
lunasea: NotificationAgentLunaSea;
pushbullet: NotificationAgentPushbullet;
pushover: NotificationAgentPushover;
@@ -365,7 +346,6 @@ class Settings {
tv: {},
},
hideAvailable: false,
hideBlacklisted: false,
localLogin: true,
mediaServerLogin: true,
newPlexLogin: true,
@@ -378,7 +358,6 @@ class Settings {
partialRequestsEnabled: true,
enableSpecialEpisodes: false,
locale: 'en',
youtubeUrl: '',
},
plex: {
name: '',
@@ -492,14 +471,6 @@ class Settings {
priority: 0,
},
},
ntfy: {
enabled: false,
types: 0,
options: {
url: '',
topic: '',
},
},
},
},
jobs: {
@@ -545,7 +516,6 @@ class Settings {
},
network: {
csrfProtection: false,
forceIpv4First: false,
trustProxy: false,
proxy: {
enabled: false,
@@ -626,7 +596,6 @@ class Settings {
applicationTitle: this.data.main.applicationTitle,
applicationUrl: this.data.main.applicationUrl,
hideAvailable: this.data.main.hideAvailable,
hideBlacklisted: this.data.main.hideBlacklisted,
localLogin: this.data.main.localLogin,
mediaServerLogin: this.data.main.mediaServerLogin,
jellyfinExternalHost: this.data.jellyfin.externalHostname,
@@ -651,7 +620,6 @@ class Settings {
userEmailRequired:
this.data.notifications.agents.email.options.userEmailRequired,
newPlexLogin: this.data.main.newPlexLogin,
youtubeUrl: this.data.main.youtubeUrl,
};
}

View File

@@ -1,231 +0,0 @@
import type { MigrationInterface, QueryRunner } from 'typeorm';
export class FixIssueTimestamps1746811308203 implements MigrationInterface {
name = 'FixIssueTimestamps1746811308203';
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
ALTER TABLE "watchlist"
ALTER COLUMN "createdAt" TYPE TIMESTAMP WITH TIME ZONE
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "watchlist"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP WITH TIME ZONE
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "override_rule"
ALTER COLUMN "createdAt" TYPE TIMESTAMP WITH TIME ZONE
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "override_rule"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP WITH TIME ZONE
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "season_request"
ALTER COLUMN "createdAt" TYPE TIMESTAMP WITH TIME ZONE
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "season_request"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP WITH TIME ZONE
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "media_request"
ALTER COLUMN "createdAt" TYPE TIMESTAMP WITH TIME ZONE
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "media_request"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP WITH TIME ZONE
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "user_push_subscription"
ALTER COLUMN "createdAt" TYPE TIMESTAMP WITH TIME ZONE
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "user"
ALTER COLUMN "createdAt" TYPE TIMESTAMP WITH TIME ZONE
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "user"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP WITH TIME ZONE
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "blacklist"
ALTER COLUMN "createdAt" TYPE TIMESTAMP WITH TIME ZONE
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "season"
ALTER COLUMN "createdAt" TYPE TIMESTAMP WITH TIME ZONE
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "season"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP WITH TIME ZONE
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "media"
ALTER COLUMN "createdAt" TYPE TIMESTAMP WITH TIME ZONE
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "media"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP WITH TIME ZONE
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "issue"
ALTER COLUMN "createdAt" TYPE TIMESTAMP WITH TIME ZONE
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "issue"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP WITH TIME ZONE
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "issue_comment"
ALTER COLUMN "createdAt" TYPE TIMESTAMP WITH TIME ZONE
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "issue_comment"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP WITH TIME ZONE
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "discover_slider"
ALTER COLUMN "createdAt" TYPE TIMESTAMP WITH TIME ZONE
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "discover_slider"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP WITH TIME ZONE
USING "updatedAt" AT TIME ZONE 'UTC'
`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
ALTER TABLE "discover_slider"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "discover_slider"
ALTER COLUMN "createdAt" TYPE TIMESTAMP
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "issue_comment"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "issue_comment"
ALTER COLUMN "createdAt" TYPE TIMESTAMP
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "issue"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "issue"
ALTER COLUMN "createdAt" TYPE TIMESTAMP
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "media"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "media"
ALTER COLUMN "createdAt" TYPE TIMESTAMP
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "season"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "season"
ALTER COLUMN "createdAt" TYPE TIMESTAMP
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "blacklist"
ALTER COLUMN "createdAt" TYPE TIMESTAMP
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "user"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "user"
ALTER COLUMN "createdAt" TYPE TIMESTAMP
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "user_push_subscription"
ALTER COLUMN "createdAt" TYPE TIMESTAMP
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "media_request"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "media_request"
ALTER COLUMN "createdAt" TYPE TIMESTAMP
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "season_request"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "season_request"
ALTER COLUMN "createdAt" TYPE TIMESTAMP
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "override_rule"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "override_rule"
ALTER COLUMN "createdAt" TYPE TIMESTAMP
USING "createdAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "watchlist"
ALTER COLUMN "updatedAt" TYPE TIMESTAMP
USING "updatedAt" AT TIME ZONE 'UTC'
`);
await queryRunner.query(`
ALTER TABLE "watchlist"
ALTER COLUMN "createdAt" TYPE TIMESTAMP
USING "createdAt" AT TIME ZONE 'UTC'
`);
}
}

View File

@@ -12,9 +12,7 @@ import logger from '@server/logger';
import { isAuthenticated } from '@server/middleware/auth';
import { checkAvatarChanged } from '@server/routes/avatarproxy';
import { ApiError } from '@server/types/error';
import { getAppVersion } from '@server/utils/appVersion';
import { getHostname } from '@server/utils/getHostname';
import axios from 'axios';
import * as EmailValidator from 'email-validator';
import { Router } from 'express';
import net from 'net';
@@ -277,14 +275,11 @@ authRoutes.post('/jellyfin', async (req, res, next) => {
select: { id: true, jellyfinDeviceId: true },
});
let deviceId = 'BOT_jellyseerr';
if (user && user.id === 1) {
// Admin is always BOT_jellyseerr
deviceId = 'BOT_jellyseerr';
} else if (user && user.jellyfinDeviceId) {
deviceId = user.jellyfinDeviceId;
} else if (body.username) {
deviceId = Buffer.from(`BOT_jellyseerr_${body.username}`).toString(
let deviceId = '';
if (user) {
deviceId = user.jellyfinDeviceId ?? '';
} else {
deviceId = Buffer.from(`BOT_jellyseerr_${body.username ?? ''}`).toString(
'base64'
);
}
@@ -516,9 +511,7 @@ authRoutes.post('/jellyfin', async (req, res, next) => {
case ApiErrorCode.InvalidUrl:
logger.error(
`The provided ${
settings.main.mediaServerType === MediaServerType.JELLYFIN
? ServerType.JELLYFIN
: ServerType.EMBY
process.env.JELLYFIN_TYPE == 'emby' ? 'Emby' : 'Jellyfin'
} is invalid or the server is not reachable.`,
{
label: 'Auth',
@@ -721,79 +714,17 @@ authRoutes.post('/local', async (req, res, next) => {
}
});
authRoutes.post('/logout', async (req, res, next) => {
try {
const userId = req.session?.userId;
if (!userId) {
return res.status(200).json({ status: 'ok' });
}
const settings = getSettings();
const isJellyfinOrEmby =
settings.main.mediaServerType === MediaServerType.JELLYFIN ||
settings.main.mediaServerType === MediaServerType.EMBY;
if (isJellyfinOrEmby) {
const user = await getRepository(User)
.createQueryBuilder('user')
.addSelect(['user.jellyfinUserId', 'user.jellyfinDeviceId'])
.where('user.id = :id', { id: userId })
.getOne();
if (user?.jellyfinUserId && user.jellyfinDeviceId) {
try {
const baseUrl = getHostname();
try {
await axios.delete(`${baseUrl}/Devices`, {
params: { Id: user.jellyfinDeviceId },
headers: {
'X-Emby-Authorization': `MediaBrowser Client="Jellyseerr", Device="Jellyseerr", DeviceId="jellyseerr", Version="${getAppVersion()}", Token="${
settings.jellyfin.apiKey
}"`,
},
});
} catch (error) {
logger.error('Failed to delete Jellyfin device', {
label: 'Auth',
error: error instanceof Error ? error.message : 'Unknown error',
userId: user.id,
jellyfinUserId: user.jellyfinUserId,
});
}
} catch (error) {
logger.error('Failed to delete Jellyfin device', {
label: 'Auth',
error: error instanceof Error ? error.message : 'Unknown error',
userId: user.id,
jellyfinUserId: user.jellyfinUserId,
});
}
}
}
req.session?.destroy((err: Error | null) => {
if (err) {
logger.error('Failed to destroy session', {
label: 'Auth',
error: err.message,
userId,
});
return next({ status: 500, message: 'Failed to destroy session.' });
}
logger.info('Successfully logged out user', {
label: 'Auth',
userId,
authRoutes.post('/logout', (req, res, next) => {
req.session?.destroy((err) => {
if (err) {
return next({
status: 500,
message: 'Something went wrong.',
});
res.status(200).json({ status: 'ok' });
});
} catch (error) {
logger.error('Error during logout process', {
label: 'Auth',
error: error instanceof Error ? error.message : 'Unknown error',
userId: req.session?.userId,
});
next({ status: 500, message: 'Error during logout process.' });
}
}
return res.status(200).json({ status: 'ok' });
});
});
authRoutes.post('/reset-password', async (req, res, next) => {

View File

@@ -23,7 +23,7 @@ async function initAvatarImageProxy() {
select: ['id', 'jellyfinUserId', 'jellyfinDeviceId'],
order: { id: 'ASC' },
});
const deviceId = admin?.jellyfinDeviceId || 'BOT_jellyseerr';
const deviceId = admin?.jellyfinDeviceId;
const authToken = getSettings().jellyfin.apiKey;
_avatarImageProxy = new ImageProxy('avatar', '', {
headers: {

View File

@@ -72,25 +72,16 @@ const QueryFilterOptions = z.object({
watchProviders: z.coerce.string().optional(),
watchRegion: z.coerce.string().optional(),
status: z.coerce.string().optional(),
certification: z.coerce.string().optional(),
certificationGte: z.coerce.string().optional(),
certificationLte: z.coerce.string().optional(),
certificationCountry: z.coerce.string().optional(),
certificationMode: z.enum(['exact', 'range']).optional(),
});
export type FilterOptions = z.infer<typeof QueryFilterOptions>;
const ApiQuerySchema = QueryFilterOptions.omit({
certificationMode: true,
});
discoverRoutes.get('/movies', async (req, res, next) => {
const tmdb = createTmdbWithRegionLanguage(req.user);
try {
const query = ApiQuerySchema.parse(req.query);
const query = QueryFilterOptions.parse(req.query);
const keywords = query.keywords;
const data = await tmdb.getDiscoverMovies({
page: Number(query.page),
sortBy: query.sortBy as SortOptions,
@@ -113,10 +104,6 @@ discoverRoutes.get('/movies', async (req, res, next) => {
voteCountLte: query.voteCountLte,
watchProviders: query.watchProviders,
watchRegion: query.watchRegion,
certification: query.certification,
certificationGte: query.certificationGte,
certificationLte: query.certificationLte,
certificationCountry: query.certificationCountry,
});
const media = await Media.getRelatedMedia(
@@ -375,7 +362,7 @@ discoverRoutes.get('/tv', async (req, res, next) => {
const tmdb = createTmdbWithRegionLanguage(req.user);
try {
const query = ApiQuerySchema.parse(req.query);
const query = QueryFilterOptions.parse(req.query);
const keywords = query.keywords;
const data = await tmdb.getDiscoverTv({
page: Number(query.page),
@@ -400,10 +387,6 @@ discoverRoutes.get('/tv', async (req, res, next) => {
watchProviders: query.watchProviders,
watchRegion: query.watchRegion,
withStatus: query.status,
certification: query.certification,
certificationGte: query.certificationGte,
certificationLte: query.certificationLte,
certificationCountry: query.certificationCountry,
});
const media = await Media.getRelatedMedia(

View File

@@ -3,36 +3,20 @@ import logger from '@server/logger';
import { Router } from 'express';
const router = Router();
const tmdbImageProxy = new ImageProxy('tmdb', 'https://image.tmdb.org', {
rateLimitOptions: {
maxRequests: 20,
maxRPS: 50,
},
});
const tvdbImageProxy = new ImageProxy('tvdb', 'https://artworks.thetvdb.com', {
rateLimitOptions: {
maxRequests: 20,
maxRPS: 50,
},
});
router.get('/:type/*', async (req, res) => {
const imagePath = req.path.replace(/^\/\w+/, '');
/**
* Image Proxy
*/
router.get('/*', async (req, res) => {
const imagePath = req.path.replace('/image', '');
try {
let imageData;
if (req.params.type === 'tmdb') {
imageData = await tmdbImageProxy.getImage(imagePath);
} else if (req.params.type === 'tvdb') {
imageData = await tvdbImageProxy.getImage(imagePath);
} else {
logger.error('Unsupported image type', {
imagePath,
type: req.params.type,
});
res.status(400).send('Unsupported image type');
return;
}
const imageData = await tmdbImageProxy.getImage(imagePath);
res.writeHead(200, {
'Content-Type': `image/${imageData.meta.extension}`,

View File

@@ -401,48 +401,6 @@ router.get('/watchproviders/tv', async (req, res, next) => {
}
});
router.get(
'/certifications/movie',
isAuthenticated(),
async (req, res, next) => {
const tmdb = new TheMovieDb();
try {
const certifications = await tmdb.getMovieCertifications();
return res.status(200).json(certifications);
} catch (e) {
logger.error('Something went wrong retrieving movie certifications', {
label: 'API',
errorMessage: e.message,
});
return next({
status: 500,
message: 'Unable to retrieve movie certifications.',
});
}
}
);
router.get('/certifications/tv', isAuthenticated(), async (req, res, next) => {
const tmdb = new TheMovieDb();
try {
const certifications = await tmdb.getTvCertifications();
return res.status(200).json(certifications);
} catch (e) {
logger.debug('Something went wrong retrieving TV certifications', {
label: 'API',
errorMessage: e.message,
});
return next({
status: 500,
message: 'Unable to retrieve TV certifications.',
});
}
});
router.get('/', (_req, res) => {
return res.status(200).json({
api: 'Jellyseerr API',

View File

@@ -38,7 +38,6 @@ requestRoutes.get<Record<string, unknown>, RequestResultsResponse>(
const requestedBy = req.query.requestedBy
? Number(req.query.requestedBy)
: null;
const mediaType = (req.query.mediaType as MediaType | 'all') || 'all';
let statusFilter: MediaRequestStatus[];
@@ -160,21 +159,6 @@ requestRoutes.get<Record<string, unknown>, RequestResultsResponse>(
});
}
switch (mediaType) {
case 'all':
break;
case 'movie':
query = query.andWhere('request.type = :type', {
type: MediaType.MOVIE,
});
break;
case 'tv':
query = query.andWhere('request.type = :type', {
type: MediaType.TV,
});
break;
}
const [requests, requestCount] = await query
.orderBy(sortFilter, sortDirection)
.take(pageSize)

View File

@@ -5,7 +5,6 @@ import DiscordAgent from '@server/lib/notifications/agents/discord';
import EmailAgent from '@server/lib/notifications/agents/email';
import GotifyAgent from '@server/lib/notifications/agents/gotify';
import LunaSeaAgent from '@server/lib/notifications/agents/lunasea';
import NtfyAgent from '@server/lib/notifications/agents/ntfy';
import PushbulletAgent from '@server/lib/notifications/agents/pushbullet';
import PushoverAgent from '@server/lib/notifications/agents/pushover';
import SlackAgent from '@server/lib/notifications/agents/slack';
@@ -414,38 +413,4 @@ notificationRoutes.post('/gotify/test', async (req, res, next) => {
}
});
notificationRoutes.get('/ntfy', (_req, res) => {
const settings = getSettings();
res.status(200).json(settings.notifications.agents.ntfy);
});
notificationRoutes.post('/ntfy', async (req, res) => {
const settings = getSettings();
settings.notifications.agents.ntfy = req.body;
await settings.save();
res.status(200).json(settings.notifications.agents.ntfy);
});
notificationRoutes.post('/ntfy/test', async (req, res, next) => {
if (!req.user) {
return next({
status: 500,
message: 'User information is missing from the request.',
});
}
const ntfyAgent = new NtfyAgent(req.body);
if (await sendTestNotification(ntfyAgent, req.user)) {
return res.status(204).send();
} else {
return next({
status: 500,
message: 'Failed to send ntfy notification.',
});
}
});
export default notificationRoutes;

View File

@@ -240,8 +240,8 @@ router.get<{ userId: number }>(
}
);
router.get<{ userId: number; endpoint: string }>(
'/:userId/pushSubscription/:endpoint',
router.get<{ userId: number; key: string }>(
'/:userId/pushSubscription/:key',
async (req, res, next) => {
try {
const userPushSubRepository = getRepository(UserPushSubscription);
@@ -252,7 +252,7 @@ router.get<{ userId: number; endpoint: string }>(
},
where: {
user: { id: req.params.userId },
endpoint: req.params.endpoint,
p256dh: req.params.key,
},
});
@@ -263,8 +263,8 @@ router.get<{ userId: number; endpoint: string }>(
}
);
router.delete<{ userId: number; endpoint: string }>(
'/:userId/pushSubscription/:endpoint',
router.delete<{ userId: number; key: string }>(
'/:userId/pushSubscription/:key',
async (req, res, next) => {
try {
const userPushSubRepository = getRepository(UserPushSubscription);
@@ -275,7 +275,7 @@ router.delete<{ userId: number; endpoint: string }>(
},
where: {
user: { id: req.params.userId },
endpoint: req.params.endpoint,
p256dh: req.params.key,
},
});
@@ -284,7 +284,7 @@ router.delete<{ userId: number; endpoint: string }>(
} catch (e) {
logger.error('Something went wrong deleting the user push subcription', {
label: 'API',
endpoint: req.params.endpoint,
key: req.params.key,
errorMessage: e.message,
});
return next({

View File

@@ -18,7 +18,6 @@ import { ApiError } from '@server/types/error';
import { getHostname } from '@server/utils/getHostname';
import { Router } from 'express';
import net from 'net';
import { Not } from 'typeorm';
import { canMakePermissionsChange } from '.';
const isOwnProfile = (): Middleware => {
@@ -126,9 +125,8 @@ userSettingsRoutes.post<
}
const existingUser = await userRepository.findOne({
where: { email: user.email, id: Not(user.id) },
where: { email: user.email },
});
if (oldEmail !== user.email && existingUser) {
throw new ApiError(400, ApiErrorCode.InvalidEmail);
}
@@ -421,9 +419,7 @@ userSettingsRoutes.post<{ username: string; password: string }>(
const hostname = getHostname();
const deviceId = Buffer.from(
req.user?.id === 1
? 'BOT_jellyseerr'
: `BOT_jellyseerr_${req.user.username ?? ''}`
`BOT_jellyseerr_${req.user.username ?? ''}`
).toString('base64');
const jellyfinserver = new JellyfinAPI(hostname, undefined, deviceId);

View File

@@ -1,8 +1,6 @@
import type { ProxySettings } from '@server/lib/settings';
import logger from '@server/logger';
import axios from 'axios';
import { HttpProxyAgent } from 'http-proxy-agent';
import { HttpsProxyAgent } from 'https-proxy-agent';
import type { Dispatcher } from 'undici';
import { Agent, ProxyAgent, setGlobalDispatcher } from 'undici';
@@ -56,29 +54,17 @@ export default async function createCustomProxyAgent(
: undefined;
try {
const proxyUrl =
(proxySettings.useSsl ? 'https://' : 'http://') +
proxySettings.hostname +
':' +
proxySettings.port;
const proxyAgent = new ProxyAgent({
uri: proxyUrl,
uri:
(proxySettings.useSsl ? 'https://' : 'http://') +
proxySettings.hostname +
':' +
proxySettings.port,
token,
keepAliveTimeout: 5000,
});
setGlobalDispatcher(proxyAgent.compose(noProxyInterceptor));
axios.defaults.httpAgent = new HttpProxyAgent(proxyUrl);
axios.defaults.httpsAgent = new HttpsProxyAgent(proxyUrl);
axios.interceptors.request.use((config) => {
if (config.url && skipUrl(config.url)) {
config.httpAgent = false;
config.httpsAgent = false;
}
return config;
});
} catch (e) {
logger.error('Failed to connect to the proxy: ' + e.message, {
label: 'Proxy',

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50"><g fill="currentColor"><path d="M50.4 46.883c-9.168 0-17.023 7.214-17.023 16.387v.007l.09 71.37-2.303 16.992 31.313-8.319h77.841c9.17 0 17.024-7.224 17.024-16.396V63.27c0-9.17-7.85-16.383-17.016-16.387h-.008zm0 11.566h89.926c3.222.004 5.45 2.347 5.45 4.82v63.655c0 2.475-2.232 4.82-5.457 4.82h-79.54l-15.908 4.807.162-.938-.088-72.343c0-2.476 2.23-4.82 5.455-4.82z" transform="scale(.26458)"/><path d="M88.2 95.309H64.92c-1.601 0-2.91 1.236-2.91 2.746l.022 18.602-.435 2.506 6.231-1.881H88.2c1.6 0 2.91-1.236 2.91-2.747v-16.48c0-1.51-1.31-2.746-2.91-2.746z" transform="translate(-51.147 -81.516)"/><path d="M50.4 46.883c-9.168 0-17.023 7.214-17.023 16.387v.007l.09 71.37-2.303 16.992 31.313-8.319h77.841c9.17 0 17.024-7.224 17.024-16.396V63.27c0-9.17-7.85-16.383-17.016-16.387h-.008zm0 11.566h89.926c3.222.004 5.45 2.347 5.45 4.82v63.655c0 2.475-2.232 4.82-5.457 4.82h-79.54l-15.908 4.807.162-.938-.088-72.343c0-2.476 2.23-4.82 5.455-4.82z" transform="scale(.26458)"/><path d="M62.57 116.77v-1.312l3.28-1.459q.159-.068.306-.102.158-.045.283-.068l.271-.022v-.09q-.136-.012-.271-.046-.125-.023-.283-.057-.147-.045-.306-.113l-3.28-1.459v-1.323l5.068 2.319v1.413z" transform="matrix(1.45366 0 0 1.72815 -75.122 -171.953)"/><path d="M62.309 110.31v1.903l3.437 1.53.022.007-.022.008-3.437 1.53v1.892l.37-.17 5.221-2.39v-1.75zm.525.817 4.541 2.08v1.076l-4.541 2.078v-.732l3.12-1.389.003-.002a1.56 1.56 0 0 1 .258-.086h.006l.008-.002c.094-.027.176-.047.246-.06l.498-.041v-.574l-.24-.02a1.411 1.411 0 0 1-.231-.04l-.008-.001-.008-.002a9.077 9.077 0 0 1-.263-.053 2.781 2.781 0 0 1-.266-.097l-.004-.002-3.119-1.39z" transform="matrix(1.45366 0 0 1.72815 -75.122 -171.953)"/><path d="M69.171 117.754h5.43v1.278h-5.43Z" transform="matrix(1.44935 0 0 1.66414 -74.104 -166.906)"/><path d="M68.908 117.492v1.802h5.955v-1.802zm.526.524h4.904v.754h-4.904z" transform="matrix(1.44935 0 0 1.66414 -74.104 -166.906)"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -6,7 +6,7 @@ const imageLoader: ImageLoader = ({ src }) => src;
export type CachedImageProps = ImageProps & {
src: string;
type: 'tmdb' | 'avatar' | 'tvdb';
type: 'tmdb' | 'avatar';
};
/**
@@ -22,15 +22,7 @@ const CachedImage = ({ src, type, ...props }: CachedImageProps) => {
// tmdb stuff
imageUrl =
currentSettings.cacheImages && !src.startsWith('/')
? src.replace(/^https:\/\/image\.tmdb\.org\//, '/imageproxy/tmdb/')
: src;
} else if (type === 'tvdb') {
imageUrl =
currentSettings.cacheImages && !src.startsWith('/')
? src.replace(
/^https:\/\/artworks\.thetvdb\.com\//,
'/imageproxy/tvdb/'
)
? src.replace(/^https:\/\/image\.tmdb\.org\//, '/imageproxy/')
: src;
} else if (type === 'avatar') {
// jellyfin avatar (if any)

View File

@@ -85,7 +85,7 @@ const DiscoverMovies = () => {
id="sortBy"
name="sortBy"
className="rounded-r-only"
value={preparedFilters.sortBy || SortOptions.PopularityDesc}
value={preparedFilters.sortBy}
onChange={(e) => updateQueryParams('sortBy', e.target.value)}
>
<option value={SortOptions.PopularityDesc}>

View File

@@ -1,4 +1,3 @@
import CachedImage from '@app/components/Common/CachedImage';
import Header from '@app/components/Common/Header';
import ListView from '@app/components/Common/ListView';
import PageTitle from '@app/components/Common/PageTitle';
@@ -8,6 +7,7 @@ import Error from '@app/pages/_error';
import defineMessages from '@app/utils/defineMessages';
import type { TvNetwork } from '@server/models/common';
import type { TvResult } from '@server/models/Search';
import Image from 'next/image';
import { useRouter } from 'next/router';
import { useIntl } from 'react-intl';
@@ -49,8 +49,7 @@ const DiscoverTvNetwork = () => {
<Header>
{firstResultData?.network.logoPath ? (
<div className="relative mb-6 flex h-24 justify-center sm:h-32">
<CachedImage
type="tmdb"
<Image
src={`https://image.tmdb.org/t/p/w780_filter(duotone,ffffff,bababa)${firstResultData.network.logoPath}`}
alt={firstResultData.network.name}
className="object-contain"

View File

@@ -1,4 +1,3 @@
import CachedImage from '@app/components/Common/CachedImage';
import Header from '@app/components/Common/Header';
import ListView from '@app/components/Common/ListView';
import PageTitle from '@app/components/Common/PageTitle';
@@ -8,6 +7,7 @@ import Error from '@app/pages/_error';
import defineMessages from '@app/utils/defineMessages';
import type { ProductionCompany } from '@server/models/common';
import type { MovieResult } from '@server/models/Search';
import Image from 'next/image';
import { useRouter } from 'next/router';
import { useIntl } from 'react-intl';
@@ -49,8 +49,7 @@ const DiscoverMovieStudio = () => {
<Header>
{firstResultData?.studio.logoPath ? (
<div className="relative mb-6 flex h-24 justify-center sm:h-32">
<CachedImage
type="tmdb"
<Image
src={`https://image.tmdb.org/t/p/w780_filter(duotone,ffffff,bababa)${firstResultData.studio.logoPath}`}
alt={firstResultData.studio.name}
className="object-contain"

View File

@@ -83,7 +83,7 @@ const DiscoverTv = () => {
id="sortBy"
name="sortBy"
className="rounded-r-only"
value={preparedFilters.sortBy || SortOptions.PopularityDesc}
value={preparedFilters.sortBy}
onChange={(e) => updateQueryParams('sortBy', e.target.value)}
>
<option value={SortOptions.PopularityDesc}>

View File

@@ -9,7 +9,6 @@ import {
GenreSelector,
KeywordSelector,
StatusSelector,
USCertificationSelector,
WatchProviderSelector,
} from '@app/components/Selector';
import useSettings from '@app/hooks/useSettings';
@@ -43,7 +42,6 @@ const messages = defineMessages('components.Discover.FilterSlideover', {
streamingservices: 'Streaming Services',
voteCount: 'Number of votes between {minValue} and {maxValue}',
status: 'Status',
certification: 'Content Rating',
});
type FilterSlideoverProps = {
@@ -192,16 +190,6 @@ const FilterSlideover = ({
updateQueryParams('language', value);
}}
/>
<span className="text-lg font-semibold">
{intl.formatMessage(messages.certification)}
</span>
<USCertificationSelector
type={type}
certification={currentFilters.certification}
onChange={(params) => {
batchUpdateQueryParams(params);
}}
/>
<span className="text-lg font-semibold">
{intl.formatMessage(messages.runtime)}
</span>

View File

@@ -109,11 +109,6 @@ export const QueryFilterOptions = z.object({
watchRegion: z.string().optional(),
watchProviders: z.string().optional(),
status: z.string().optional(),
certification: z.string().optional(),
certificationGte: z.string().optional(),
certificationLte: z.string().optional(),
certificationCountry: z.string().optional(),
certificationMode: z.enum(['exact', 'range']).optional(),
});
export type FilterOptions = z.infer<typeof QueryFilterOptions>;
@@ -197,30 +192,6 @@ export const prepareFilterValues = (
filterValues.watchRegion = values.watchRegion;
}
if (values.certification) {
filterValues.certification = values.certification;
}
if (values.certificationGte) {
filterValues.certificationGte = values.certificationGte;
}
if (values.certificationLte) {
filterValues.certificationLte = values.certificationLte;
}
if (values.certificationCountry) {
filterValues.certificationCountry = values.certificationCountry;
}
if (values.certificationMode) {
filterValues.certificationMode = values.certificationMode;
} else if (values.certification) {
filterValues.certificationMode = 'exact';
} else if (values.certificationGte || values.certificationLte) {
filterValues.certificationMode = 'range';
}
return filterValues;
};
@@ -252,20 +223,6 @@ export const countActiveFilters = (filterValues: FilterOptions): number => {
delete clonedFilters.watchRegion;
}
if (
clonedFilters.certification ||
clonedFilters.certificationGte ||
clonedFilters.certificationLte ||
clonedFilters.certificationCountry
) {
totalCount += 1;
delete clonedFilters.certification;
delete clonedFilters.certificationGte;
delete clonedFilters.certificationLte;
delete clonedFilters.certificationCountry;
}
delete clonedFilters.certificationMode;
totalCount += Object.keys(clonedFilters).length;
return totalCount;

View File

@@ -2,7 +2,6 @@ import Button from '@app/components/Common/Button';
import CachedImage from '@app/components/Common/CachedImage';
import Modal from '@app/components/Common/Modal';
import { Permission, useUser } from '@app/hooks/useUser';
import globalMessages from '@app/i18n/globalMessages';
import defineMessages from '@app/utils/defineMessages';
import { Menu, Transition } from '@headlessui/react';
import { EllipsisVerticalIcon } from '@heroicons/react/24/solid';
@@ -208,13 +207,13 @@ const IssueComment = ({
type="button"
onClick={() => setIsEditing(false)}
>
{intl.formatMessage(globalMessages.cancel)}
Cancel
</Button>
<Button
buttonType="primary"
disabled={!isValid || isSubmitting}
>
{intl.formatMessage(globalMessages.save)}
Save Changes
</Button>
</div>
</Form>
@@ -223,10 +222,7 @@ const IssueComment = ({
</Formik>
) : (
<div className="prose w-full max-w-full">
<ReactMarkdown
skipHtml
allowedElements={['p', 'em', 'strong', 'ul', 'ol', 'li']}
>
<ReactMarkdown skipHtml allowedElements={['p', 'em', 'strong']}>
{comment.message}
</ReactMarkdown>
</div>

View File

@@ -1,6 +1,6 @@
import CachedImage from '@app/components/Common/CachedImage';
import MiniQuotaDisplay from '@app/components/Layout/UserDropdown/MiniQuotaDisplay';
import { Permission, useUser } from '@app/hooks/useUser';
import { useUser } from '@app/hooks/useUser';
import defineMessages from '@app/utils/defineMessages';
import { Menu, Transition } from '@headlessui/react';
import {
@@ -36,7 +36,7 @@ ForwardedLink.displayName = 'ForwardedLink';
const UserDropdown = () => {
const intl = useIntl();
const { user, revalidate, hasPermission } = useUser();
const { user, revalidate } = useUser();
const logout = async () => {
const response = await axios.post('/api/v1/auth/logout');
@@ -118,14 +118,7 @@ const UserDropdown = () => {
<Menu.Item>
{({ active }) => (
<ForwardedLink
href={
hasPermission(
[Permission.MANAGE_REQUESTS, Permission.REQUEST_VIEW],
{ type: 'or' }
)
? `/users/${user?.id}/requests?filter=all`
: '/requests'
}
href={`/users/${user?.id}/requests?filter=all`}
className={`flex items-center rounded px-4 py-2 text-sm font-medium text-gray-200 transition duration-150 ease-in-out ${
active
? 'bg-gradient-to-br from-indigo-600 to-purple-600 text-white'

View File

@@ -1,7 +1,7 @@
import CachedImage from '@app/components/Common/CachedImage';
import TitleCard from '@app/components/TitleCard';
import defineMessages from '@app/utils/defineMessages';
import { ArrowRightCircleIcon } from '@heroicons/react/24/solid';
import Image from 'next/image';
import Link from 'next/link';
import { useState } from 'react';
import { useInView } from 'react-intersection-observer';
@@ -60,8 +60,7 @@ const ShowMoreCard = ({ url, posters }: ShowMoreCardProps) => {
<div className="relative z-10 grid h-full w-full grid-cols-2 items-center justify-center gap-2 opacity-30">
{posters[0] && (
<div className="">
<CachedImage
type="tmdb"
<Image
src={`https://image.tmdb.org/t/p/w300_and_h450_face${posters[0]}`}
alt=""
className="rounded-md"
@@ -72,8 +71,7 @@ const ShowMoreCard = ({ url, posters }: ShowMoreCardProps) => {
)}
{posters[1] && (
<div className="">
<CachedImage
type="tmdb"
<Image
src={`https://image.tmdb.org/t/p/w300_and_h450_face${posters[1]}`}
alt=""
className="rounded-md"
@@ -84,8 +82,7 @@ const ShowMoreCard = ({ url, posters }: ShowMoreCardProps) => {
)}
{posters[2] && (
<div className="">
<CachedImage
type="tmdb"
<Image
src={`https://image.tmdb.org/t/p/w300_and_h450_face${posters[2]}`}
alt=""
className="rounded-md"
@@ -96,8 +93,7 @@ const ShowMoreCard = ({ url, posters }: ShowMoreCardProps) => {
)}
{posters[3] && (
<div className="">
<CachedImage
type="tmdb"
<Image
src={`https://image.tmdb.org/t/p/w300_and_h450_face${posters[3]}`}
alt=""
className="rounded-md"

View File

@@ -74,14 +74,6 @@ const MediaSlider = ({
);
}
if (settings.currentSettings.hideBlacklisted) {
titles = titles.filter(
(i) =>
(i.mediaType === 'movie' || i.mediaType === 'tv') &&
i.mediaInfo?.status !== MediaStatus.BLACKLISTED
);
}
useEffect(() => {
if (
titles.length < 24 &&

View File

@@ -210,16 +210,10 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
svg: <PlayIcon />,
});
}
const trailerVideo = data.relatedVideos
const trailerUrl = data.relatedVideos
?.filter((r) => r.type === 'Trailer')
.sort((a, b) => a.size - b.size)
.pop();
const trailerUrl =
trailerVideo?.site === 'YouTube' &&
settings.currentSettings.youtubeUrl != ''
? `${settings.currentSettings.youtubeUrl}${trailerVideo?.key}`
: trailerVideo?.url;
.pop()?.url;
if (trailerUrl) {
mediaLinks.push({

View File

@@ -7,7 +7,6 @@ import TitleCard from '@app/components/TitleCard';
import globalMessages from '@app/i18n/globalMessages';
import Error from '@app/pages/_error';
import defineMessages from '@app/utils/defineMessages';
import { CircleStackIcon } from '@heroicons/react/24/solid';
import type { PersonCombinedCreditsResponse } from '@server/interfaces/api/personInterfaces';
import type { PersonDetails as PersonDetailsType } from '@server/models/Person';
import { groupBy } from 'lodash';
@@ -26,12 +25,9 @@ const messages = defineMessages('components.PersonDetails', {
ascharacter: 'as {character}',
});
type MediaType = 'all' | 'movie' | 'tv';
const PersonDetails = () => {
const intl = useIntl();
const router = useRouter();
const [currentMediaType, setCurrentMediaType] = useState<string>('all');
const { data, error } = useSWR<PersonDetailsType>(
`/api/v1/person/${router.query.personId}`
);
@@ -43,11 +39,7 @@ const PersonDetails = () => {
);
const sortedCast = useMemo(() => {
const filtered = (combinedCredits?.cast ?? []).filter(
(media) =>
currentMediaType === 'all' || media.mediaType === currentMediaType
);
const grouped = groupBy(filtered, 'id');
const grouped = groupBy(combinedCredits?.cast ?? [], 'id');
const reduced = Object.values(grouped).map((objs) => ({
...objs[0],
@@ -62,14 +54,10 @@ const PersonDetails = () => {
}
return 1;
});
}, [combinedCredits, currentMediaType]);
}, [combinedCredits]);
const sortedCrew = useMemo(() => {
const filtered = (combinedCredits?.crew ?? []).filter(
(media) =>
currentMediaType === 'all' || media.mediaType === currentMediaType
);
const grouped = groupBy(filtered, 'id');
const grouped = groupBy(combinedCredits?.crew ?? [], 'id');
const reduced = Object.values(grouped).map((objs) => ({
...objs[0],
@@ -84,7 +72,7 @@ const PersonDetails = () => {
}
return 1;
});
}, [combinedCredits, currentMediaType]);
}, [combinedCredits]);
if (!data && !error) {
return <LoadingSpinner />;
@@ -134,29 +122,6 @@ const PersonDetails = () => {
const isLoading = !combinedCredits && !errorCombinedCredits;
const mediaTypePicker = (
<div className="mb-2 flex flex-grow sm:mb-0 sm:mr-2 lg:flex-grow-0">
<span className="inline-flex cursor-default items-center rounded-l-md border border-r-0 border-gray-500 bg-gray-800 px-3 text-sm text-gray-100">
<CircleStackIcon className="h-6 w-6" />
</span>
<select
id="mediaType"
name="mediaType"
onChange={(e) => {
setCurrentMediaType(e.target.value as MediaType);
}}
value={currentMediaType}
className="rounded-r-only"
>
<option value="all">{intl.formatMessage(globalMessages.all)}</option>
<option value="movie">
{intl.formatMessage(globalMessages.movies)}
</option>
<option value="tv">{intl.formatMessage(globalMessages.tvshows)}</option>
</select>
</div>
);
const cast = (sortedCast ?? []).length > 0 && (
<>
<div className="slider-header">
@@ -270,13 +235,8 @@ const PersonDetails = () => {
/>
</div>
)}
<div className="w-full text-center text-gray-300 lg:text-left">
<div className="flex w-full items-center justify-center lg:justify-between">
<h1 className="text-3xl text-white lg:text-4xl">{data.name}</h1>
<div className="hidden flex-shrink-0 lg:block">
{mediaTypePicker}
</div>
</div>
<div className="text-center text-gray-300 lg:text-left">
<h1 className="text-3xl text-white lg:text-4xl">{data.name}</h1>
<div className="mt-1 mb-2 space-y-1 text-xs text-white sm:text-sm lg:text-base">
<div>{personAttributes.join(' | ')}</div>
{(data.alsoKnownAs ?? []).length > 0 && (
@@ -314,7 +274,6 @@ const PersonDetails = () => {
)}
</div>
</div>
<div className="lg:hidden">{mediaTypePicker}</div>
{data.knownForDepartment === 'Acting' ? [cast, crew] : [crew, cast]}
{isLoading && <LoadingSpinner />}
</>

View File

@@ -14,7 +14,6 @@ import {
Bars3BottomLeftIcon,
ChevronLeftIcon,
ChevronRightIcon,
CircleStackIcon,
FunnelIcon,
} from '@heroicons/react/24/solid';
import type { RequestResultsResponse } from '@server/interfaces/api/requestInterfaces';
@@ -48,8 +47,6 @@ type Sort = 'added' | 'modified';
type SortDirection = 'asc' | 'desc';
type MediaType = 'all' | 'movie' | 'tv';
const RequestList = () => {
const router = useRouter();
const intl = useIntl();
@@ -59,7 +56,6 @@ const RequestList = () => {
const { user: currentUser } = useUser();
const [currentFilter, setCurrentFilter] = useState<Filter>(Filter.PENDING);
const [currentSort, setCurrentSort] = useState<Sort>('added');
const [currentMediaType, setCurrentMediaType] = useState<string>('all');
const [currentSortDirection, setCurrentSortDirection] =
useState<SortDirection>('desc');
const [currentPageSize, setCurrentPageSize] = useState<number>(10);
@@ -75,7 +71,7 @@ const RequestList = () => {
} = useSWR<RequestResultsResponse>(
`/api/v1/request?take=${currentPageSize}&skip=${
pageIndex * currentPageSize
}&filter=${currentFilter}&mediaType=${currentMediaType}&sort=${currentSort}&sortDirection=${currentSortDirection}${
}&filter=${currentFilter}&sort=${currentSort}&sortDirection=${currentSortDirection}${
router.pathname.startsWith('/profile')
? `&requestedBy=${currentUser?.id}`
: router.query.userId
@@ -111,19 +107,12 @@ const RequestList = () => {
'rl-filter-settings',
JSON.stringify({
currentFilter,
currentMediaType,
currentSort,
currentSortDirection,
currentPageSize,
})
);
}, [
currentFilter,
currentMediaType,
currentSort,
currentSortDirection,
currentPageSize,
]);
}, [currentFilter, currentSort, currentSortDirection, currentPageSize]);
if (!data && !error) {
return <LoadingSpinner />;
@@ -163,36 +152,6 @@ const RequestList = () => {
{intl.formatMessage(messages.requests)}
</Header>
<div className="mt-2 flex flex-grow flex-col sm:flex-row lg:flex-grow-0">
<div className="mb-2 flex flex-grow sm:mb-0 sm:mr-2 lg:flex-grow-0">
<span className="inline-flex cursor-default items-center rounded-l-md border border-r-0 border-gray-500 bg-gray-800 px-3 text-sm text-gray-100">
<CircleStackIcon className="h-6 w-6" />
</span>
<select
id="mediaType"
name="mediaType"
onChange={(e) => {
setCurrentMediaType(e.target.value as MediaType);
router.push({
pathname: router.pathname,
query: router.query.userId
? { userId: router.query.userId }
: {},
});
}}
value={currentMediaType}
className="rounded-r-only"
>
<option value="all">
{intl.formatMessage(globalMessages.all)}
</option>
<option value="movie">
{intl.formatMessage(globalMessages.movies)}
</option>
<option value="tv">
{intl.formatMessage(globalMessages.tvshows)}
</option>
</select>
</div>
<div className="mb-2 flex flex-grow sm:mb-0 sm:mr-2 lg:flex-grow-0">
<span className="inline-flex cursor-default items-center rounded-l-md border border-r-0 border-gray-500 bg-gray-800 px-3 text-sm text-gray-100">
<FunnelIcon className="h-6 w-6" />
@@ -304,15 +263,11 @@ const RequestList = () => {
<span className="text-2xl text-gray-400">
{intl.formatMessage(globalMessages.noresults)}
</span>
{(currentFilter !== Filter.ALL ||
currentMediaType !== Filter.ALL) && (
{currentFilter !== Filter.ALL && (
<div className="mt-4">
<Button
buttonType="primary"
onClick={() => {
setCurrentFilter(Filter.ALL);
setCurrentMediaType(Filter.ALL);
}}
onClick={() => setCurrentFilter(Filter.ALL)}
>
{intl.formatMessage(messages.showallrequests)}
</Button>

View File

@@ -1,9 +1,9 @@
import Alert from '@app/components/Common/Alert';
import CachedImage from '@app/components/Common/CachedImage';
import Modal from '@app/components/Common/Modal';
import globalMessages from '@app/i18n/globalMessages';
import defineMessages from '@app/utils/defineMessages';
import type { SonarrSeries } from '@server/api/servarr/sonarr';
import Image from 'next/image';
import { useIntl } from 'react-intl';
import useSWR from 'swr';
@@ -89,8 +89,7 @@ const SearchByNameModal = ({
} `}
>
<div className="relative flex w-24 flex-none items-center space-x-4 self-stretch">
<CachedImage
type="tvdb"
<Image
src={
item.remotePoster ??
'/images/jellyseerr_poster_not_found.png'

View File

@@ -120,7 +120,7 @@ const TvRequestModal = ({
languageProfileId: requestOverrides?.language,
userId: requestOverrides?.user?.id,
tags: requestOverrides?.tags,
seasons: selectedSeasons.sort((a, b) => a - b),
seasons: selectedSeasons,
});
if (alsoApproveRequest) {
@@ -202,8 +202,7 @@ const TvRequestModal = ({
seasons: settings.currentSettings.partialRequestsEnabled
? selectedSeasons.sort((a, b) => a - b)
: getAllSeasons().filter(
(season) =>
!getAllRequestedSeasons().includes(season) && season !== 0
(season) => !getAllRequestedSeasons().includes(season)
),
...overrideParams,
});
@@ -303,10 +302,8 @@ const TvRequestModal = ({
}
};
const unrequestedSeasons = getAllSeasons().filter((season) =>
!settings.currentSettings.partialRequestsEnabled
? !getAllRequestedSeasons().includes(season) && season !== 0
: !getAllRequestedSeasons().includes(season)
const unrequestedSeasons = getAllSeasons().filter(
(season) => !getAllRequestedSeasons().includes(season)
);
const toggleAllSeasons = (): void => {
@@ -578,11 +575,7 @@ const TvRequestModal = ({
(season) =>
(!settings.currentSettings.enableSpecialEpisodes
? season.seasonNumber !== 0
: true) &&
(!settings.currentSettings.partialRequestsEnabled
? season.episodeCount !== 0 &&
season.seasonNumber !== 0
: season.episodeCount !== 0)
: true) && season.episodeCount !== 0
)
.map((season) => {
const seasonRequest = getSeasonRequest(

View File

@@ -34,7 +34,7 @@ const Search = () => {
{
query: router.query.query,
},
{ hideAvailable: false, hideBlacklisted: false }
{ hideAvailable: false }
);
if (error) {

View File

@@ -1,333 +0,0 @@
import { SmallLoadingSpinner } from '@app/components/Common/LoadingSpinner';
import defineMessages from '@app/utils/defineMessages';
import type { Region } from '@server/lib/settings';
import React, { useCallback, useEffect, useState } from 'react';
import { useIntl } from 'react-intl';
import AsyncSelect from 'react-select/async';
import useSWR from 'swr';
interface Certification {
certification: string;
meaning?: string;
order?: number;
}
interface CertificationResponse {
certifications: {
[country: string]: Certification[];
};
}
interface CertificationOption {
value: string;
label: string;
certification?: string;
}
interface CertificationSelectorProps {
type: string;
certificationCountry?: string;
certification?: string;
certificationGte?: string;
certificationLte?: string;
onChange: (params: {
certificationCountry?: string;
certification?: string;
certificationGte?: string;
certificationLte?: string;
}) => void;
showRange?: boolean;
}
const messages = defineMessages('components.Selector.CertificationSelector', {
selectCountry: 'Select a country',
selectCertification: 'Select a certification',
minRating: 'Minimum rating',
maxRating: 'Maximum rating',
noOptions: 'No options available',
starttyping: 'Starting typing to search.',
errorLoading: 'Failed to load certifications',
});
const CertificationSelector: React.FC<CertificationSelectorProps> = ({
type,
certificationCountry,
certification,
certificationGte,
certificationLte,
showRange = false,
onChange,
}) => {
const intl = useIntl();
const [selectedCountry, setSelectedCountry] =
useState<CertificationOption | null>(
certificationCountry
? { value: certificationCountry, label: certificationCountry }
: null
);
const [selectedCertification, setSelectedCertification] =
useState<CertificationOption | null>(null);
const [selectedCertificationGte, setSelectedCertificationGte] =
useState<CertificationOption | null>(null);
const [selectedCertificationLte, setSelectedCertificationLte] =
useState<CertificationOption | null>(null);
const {
data: certificationData,
error: certificationError,
isLoading: certificationLoading,
} = useSWR<CertificationResponse>(`/api/v1/certifications/${type}`);
const { data: regionsData } = useSWR<Region[]>('/api/v1/regions');
// Get the country name from its code
const getCountryName = useCallback(
(countryCode: string): string => {
const region = regionsData?.find(
(region) => region.iso_3166_1 === countryCode
);
return region?.name || countryCode;
},
[regionsData]
);
useEffect(() => {
if (certificationCountry && regionsData) {
setSelectedCountry({
value: certificationCountry,
label: getCountryName(certificationCountry),
});
}
}, [certificationCountry, regionsData, getCountryName]);
useEffect(() => {
if (!certificationData || !certificationCountry) return;
const certifications = (
certificationData.certifications[certificationCountry] || []
)
.sort((a, b) => {
if (a.order !== undefined && b.order !== undefined) {
return a.order - b.order;
}
return a.certification.localeCompare(b.certification);
})
.map((cert) => ({
value: cert.certification,
label: `${cert.certification}${
cert.meaning ? ` - ${cert.meaning}` : ''
}`,
certification: cert.certification,
}));
if (certification) {
setSelectedCertification(
certifications.find((c) => c.value === certification) || null
);
}
if (certificationGte) {
setSelectedCertificationGte(
certifications.find((c) => c.value === certificationGte) || null
);
}
if (certificationLte) {
setSelectedCertificationLte(
certifications.find((c) => c.value === certificationLte) || null
);
}
}, [
certificationData,
certificationCountry,
certification,
certificationGte,
certificationLte,
]);
if (certificationError) {
return (
<div className="text-red-500">
{intl.formatMessage(messages.errorLoading)}
</div>
);
}
if (certificationLoading || !certificationData) {
return <SmallLoadingSpinner />;
}
const loadCountryOptions = async (inputValue: string) => {
if (!certificationData || !regionsData) return [];
return Object.keys(certificationData.certifications)
.filter(
(code) =>
certificationData.certifications[code] &&
certificationData.certifications[code].length > 0 &&
(code.toLowerCase().includes(inputValue.toLowerCase()) ||
getCountryName(code)
.toLowerCase()
.includes(inputValue.toLowerCase()))
)
.sort((a, b) => getCountryName(a).localeCompare(getCountryName(b)))
.map((code) => ({
value: code,
label: getCountryName(code),
}));
};
const loadCertificationOptions = async (inputValue: string) => {
if (!certificationData || !certificationCountry) return [];
return (certificationData.certifications[certificationCountry] || [])
.sort((a, b) => {
if (a.order !== undefined && b.order !== undefined) {
return a.order - b.order;
}
return a.certification.localeCompare(b.certification);
})
.map((cert) => ({
value: cert.certification,
label: `${cert.certification}${
cert.meaning ? ` - ${cert.meaning}` : ''
}`,
certification: cert.certification,
}))
.filter((cert) =>
cert.label.toLowerCase().includes(inputValue.toLowerCase())
);
};
const handleCountryChange = (option: CertificationOption | null) => {
setSelectedCountry(option);
setSelectedCertification(null);
setSelectedCertificationGte(null);
setSelectedCertificationLte(null);
onChange({
certificationCountry: option?.value,
certification: undefined,
certificationGte: undefined,
certificationLte: undefined,
});
};
const handleCertificationChange = (option: CertificationOption | null) => {
setSelectedCertification(option);
onChange({
certificationCountry,
certification: option?.value,
certificationGte: undefined,
certificationLte: undefined,
});
};
const handleMinCertificationChange = (option: CertificationOption | null) => {
setSelectedCertificationGte(option);
onChange({
certificationCountry,
certification: undefined,
certificationGte: option?.value,
certificationLte: certificationLte,
});
};
const handleMaxCertificationChange = (option: CertificationOption | null) => {
setSelectedCertificationLte(option);
onChange({
certificationCountry,
certification: undefined,
certificationGte: certificationGte,
certificationLte: option?.value,
});
};
const formatCertificationLabel = (
option: CertificationOption,
{ context }: { context: string }
) => {
if (context === 'value') {
return option.certification || option.value;
}
// Show the full label with description in the menu
return option.label;
};
return (
<div className="space-y-2">
<AsyncSelect
className="react-select-container"
classNamePrefix="react-select"
cacheOptions
defaultOptions
loadOptions={loadCountryOptions}
value={selectedCountry}
onChange={handleCountryChange}
placeholder={intl.formatMessage(messages.selectCountry)}
isClearable
noOptionsMessage={({ inputValue }) =>
inputValue === ''
? intl.formatMessage(messages.starttyping)
: intl.formatMessage(messages.noOptions)
}
/>
{certificationCountry && !showRange && (
<AsyncSelect
className="react-select-container"
classNamePrefix="react-select"
cacheOptions
defaultOptions
loadOptions={loadCertificationOptions}
value={selectedCertification}
onChange={handleCertificationChange}
placeholder={intl.formatMessage(messages.selectCertification)}
formatOptionLabel={formatCertificationLabel}
isClearable
noOptionsMessage={() => intl.formatMessage(messages.noOptions)}
/>
)}
{certificationCountry && showRange && (
<div className="flex space-x-2">
<div className="flex-1">
<AsyncSelect
className="react-select-container"
classNamePrefix="react-select"
cacheOptions
defaultOptions
loadOptions={loadCertificationOptions}
value={selectedCertificationGte}
onChange={handleMinCertificationChange}
placeholder={intl.formatMessage(messages.minRating)}
formatOptionLabel={formatCertificationLabel}
isClearable
noOptionsMessage={() => intl.formatMessage(messages.noOptions)}
/>
</div>
<div className="flex-1">
<AsyncSelect
className="react-select-container"
classNamePrefix="react-select"
cacheOptions
defaultOptions
loadOptions={loadCertificationOptions}
value={selectedCertificationLte}
onChange={handleMaxCertificationChange}
placeholder={intl.formatMessage(messages.maxRating)}
formatOptionLabel={formatCertificationLabel}
isClearable
noOptionsMessage={() => intl.formatMessage(messages.noOptions)}
/>
</div>
</div>
)}
</div>
);
};
export default CertificationSelector;

View File

@@ -1,87 +0,0 @@
import React, { useEffect, useState } from 'react';
interface USCertificationSelectorProps {
type: string;
certification?: string;
onChange: (params: {
certificationCountry?: string;
certification?: string;
}) => void;
}
const US_MOVIE_CERTIFICATIONS = ['NR', 'G', 'PG', 'PG-13', 'R', 'NC-17'];
const US_TV_CERTIFICATIONS = [
'NR',
'TV-Y',
'TV-Y7',
'TV-G',
'TV-PG',
'TV-14',
'TV-MA',
];
const USCertificationSelector: React.FC<USCertificationSelectorProps> = ({
type,
certification,
onChange,
}) => {
const [selectedRatings, setSelectedRatings] = useState<string[]>(() =>
certification ? certification.split('|') : []
);
const certifications =
type === 'movie' ? US_MOVIE_CERTIFICATIONS : US_TV_CERTIFICATIONS;
useEffect(() => {
if (certification) {
setSelectedRatings(certification.split('|'));
} else {
setSelectedRatings([]);
}
}, [certification]);
const toggleRating = (rating: string) => {
setSelectedRatings((prevSelected) => {
let newSelected;
if (prevSelected.includes(rating)) {
newSelected = prevSelected.filter((r) => r !== rating);
} else {
newSelected = [...prevSelected, rating];
}
const newCertification =
newSelected.length > 0 ? newSelected.join('|') : undefined;
onChange({
certificationCountry: 'US',
certification: newCertification,
});
return newSelected;
});
};
return (
<div className="mb-4">
<div className="flex flex-wrap gap-2">
{certifications.map((rating) => (
<button
key={rating}
onClick={() => toggleRating(rating)}
className={`rounded-full px-3 py-1 text-sm font-medium transition-colors ${
selectedRatings.includes(rating)
? 'bg-indigo-600 text-white hover:bg-indigo-700'
: 'bg-gray-200 text-gray-700 hover:bg-gray-300 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600'
}`}
type="button"
>
{rating}
</button>
))}
</div>
</div>
);
};
export default USCertificationSelector;

View File

@@ -631,5 +631,3 @@ export const UserSelector = ({
/>
);
};
export { default as USCertificationSelector } from './USCertificationSelector';

View File

@@ -3,7 +3,6 @@ import LoadingSpinner from '@app/components/Common/LoadingSpinner';
import NotificationTypeSelector from '@app/components/NotificationTypeSelector';
import globalMessages from '@app/i18n/globalMessages';
import defineMessages from '@app/utils/defineMessages';
import { isValidURL } from '@app/utils/urlValidationHelper';
import { ArrowDownOnSquareIcon, BeakerIcon } from '@heroicons/react/24/solid';
import axios from 'axios';
import { Field, Form, Formik } from 'formik';
@@ -52,10 +51,10 @@ const NotificationsGotify = () => {
.required(intl.formatMessage(messages.validationUrlRequired)),
otherwise: Yup.string().nullable(),
})
.test(
'valid-url',
intl.formatMessage(messages.validationUrlRequired),
isValidURL
.matches(
// eslint-disable-next-line no-useless-escape
/^(https?:)?\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*)?([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,
intl.formatMessage(messages.validationUrlRequired)
)
.test(
'no-trailing-slash',

View File

@@ -1,368 +0,0 @@
import Button from '@app/components/Common/Button';
import LoadingSpinner from '@app/components/Common/LoadingSpinner';
import SensitiveInput from '@app/components/Common/SensitiveInput';
import NotificationTypeSelector from '@app/components/NotificationTypeSelector';
import globalMessages from '@app/i18n/globalMessages';
import defineMessages from '@app/utils/defineMessages';
import { isValidURL } from '@app/utils/urlValidationHelper';
import { ArrowDownOnSquareIcon, BeakerIcon } from '@heroicons/react/24/outline';
import type { NotificationAgentNtfy } from '@server/lib/settings';
import axios from 'axios';
import { Field, Form, Formik } from 'formik';
import { useState } from 'react';
import { useIntl } from 'react-intl';
import { useToasts } from 'react-toast-notifications';
import useSWR from 'swr';
import * as Yup from 'yup';
const messages = defineMessages(
'components.Settings.Notifications.NotificationsNtfy',
{
agentenabled: 'Enable Agent',
url: 'Server root URL',
topic: 'Topic',
usernamePasswordAuth: 'Username + Password authentication',
username: 'Username',
password: 'Password',
tokenAuth: 'Token authentication',
token: 'Token',
ntfysettingssaved: 'Ntfy notification settings saved successfully!',
ntfysettingsfailed: 'Ntfy notification settings failed to save.',
toastNtfyTestSending: 'Sending ntfy test notification…',
toastNtfyTestSuccess: 'Ntfy test notification sent!',
toastNtfyTestFailed: 'Ntfy test notification failed to send.',
validationNtfyUrl: 'You must provide a valid URL',
validationNtfyTopic: 'You must provide a topic',
validationTypes: 'You must select at least one notification type',
}
);
const NotificationsNtfy = () => {
const intl = useIntl();
const { addToast, removeToast } = useToasts();
const [isTesting, setIsTesting] = useState(false);
const {
data,
error,
mutate: revalidate,
} = useSWR<NotificationAgentNtfy>('/api/v1/settings/notifications/ntfy');
const NotificationsNtfySchema = Yup.object().shape({
url: Yup.string()
.when('enabled', {
is: true,
then: Yup.string()
.nullable()
.required(intl.formatMessage(messages.validationNtfyUrl)),
otherwise: Yup.string().nullable(),
})
.test(
'valid-url',
intl.formatMessage(messages.validationNtfyUrl),
isValidURL
),
topic: Yup.string()
.when('enabled', {
is: true,
then: Yup.string()
.nullable()
.required(intl.formatMessage(messages.validationNtfyUrl)),
otherwise: Yup.string().nullable(),
})
.defined(intl.formatMessage(messages.validationNtfyTopic)),
});
if (!data && !error) {
return <LoadingSpinner />;
}
return (
<Formik
initialValues={{
enabled: data?.enabled,
types: data?.types,
url: data?.options.url,
topic: data?.options.topic,
authMethodUsernamePassword: data?.options.authMethodUsernamePassword,
username: data?.options.username,
password: data?.options.password,
authMethodToken: data?.options.authMethodToken,
token: data?.options.token,
}}
validationSchema={NotificationsNtfySchema}
onSubmit={async (values) => {
try {
await axios.post('/api/v1/settings/notifications/ntfy', {
enabled: values.enabled,
types: values.types,
options: {
url: values.url,
topic: values.topic,
authMethodUsernamePassword: values.authMethodUsernamePassword,
username: values.username,
password: values.password,
authMethodToken: values.authMethodToken,
token: values.token,
},
});
addToast(intl.formatMessage(messages.ntfysettingssaved), {
appearance: 'success',
autoDismiss: true,
});
} catch (e) {
addToast(intl.formatMessage(messages.ntfysettingsfailed), {
appearance: 'error',
autoDismiss: true,
});
} finally {
revalidate();
}
}}
>
{({
errors,
touched,
isSubmitting,
values,
isValid,
setFieldValue,
setFieldTouched,
}) => {
const testSettings = async () => {
setIsTesting(true);
let toastId: string | undefined;
try {
addToast(
intl.formatMessage(messages.toastNtfyTestSending),
{
autoDismiss: false,
appearance: 'info',
},
(id) => {
toastId = id;
}
);
await axios.post('/api/v1/settings/notifications/ntfy/test', {
enabled: true,
types: values.types,
options: {
url: values.url,
topic: values.topic,
authMethodUsernamePassword: values.authMethodUsernamePassword,
username: values.username,
password: values.password,
authMethodToken: values.authMethodToken,
token: values.token,
},
});
if (toastId) {
removeToast(toastId);
}
addToast(intl.formatMessage(messages.toastNtfyTestSuccess), {
autoDismiss: true,
appearance: 'success',
});
} catch (e) {
if (toastId) {
removeToast(toastId);
}
addToast(intl.formatMessage(messages.toastNtfyTestFailed), {
autoDismiss: true,
appearance: 'error',
});
} finally {
setIsTesting(false);
}
};
return (
<Form className="section">
<div className="form-row">
<label htmlFor="enabled" className="checkbox-label">
{intl.formatMessage(messages.agentenabled)}
<span className="label-required">*</span>
</label>
<div className="form-input-area">
<Field type="checkbox" id="enabled" name="enabled" />
</div>
</div>
<div className="form-row">
<label htmlFor="url" className="text-label">
{intl.formatMessage(messages.url)}
<span className="label-required">*</span>
</label>
<div className="form-input-area">
<div className="form-input-field">
<Field id="url" name="url" type="text" inputMode="url" />
</div>
{errors.url &&
touched.url &&
typeof errors.url === 'string' && (
<div className="error">{errors.url}</div>
)}
</div>
</div>
<div className="form-row">
<label htmlFor="topic" className="text-label">
{intl.formatMessage(messages.topic)}
<span className="label-required">*</span>
</label>
<div className="form-input-area">
<div className="form-input-field">
<Field id="topic" name="topic" type="text" />
</div>
{errors.topic &&
touched.topic &&
typeof errors.topic === 'string' && (
<div className="error">{errors.topic}</div>
)}
</div>
</div>
<div className="form-row">
<label
htmlFor="authMethodUsernamePassword"
className="checkbox-label"
>
<span className="mr-2">
{intl.formatMessage(messages.usernamePasswordAuth)}
</span>
</label>
<div className="form-input-area">
<Field
type="checkbox"
id="authMethodUsernamePassword"
name="authMethodUsernamePassword"
disabled={values.authMethodToken}
onChange={() => {
setFieldValue(
'authMethodUsernamePassword',
!values.authMethodUsernamePassword
);
}}
/>
</div>
</div>
{values.authMethodUsernamePassword && (
<div className="mr-2 ml-4">
<div className="form-row">
<label htmlFor="username" className="text-label">
{intl.formatMessage(messages.username)}
</label>
<div className="form-input-area">
<div className="form-input-field">
<Field id="username" name="username" type="text" />
</div>
</div>
</div>
<div className="form-row">
<label htmlFor="password" className="text-label">
{intl.formatMessage(messages.password)}
</label>
<div className="form-input-area">
<div className="form-input-field">
<SensitiveInput
as="field"
id="password"
name="password"
/>
</div>
</div>
</div>
</div>
)}
<div className="form-row">
<label htmlFor="authMethodToken" className="checkbox-label">
<span className="mr-2">
{intl.formatMessage(messages.tokenAuth)}
</span>
</label>
<div className="form-input-area">
<Field
type="checkbox"
id="authMethodToken"
name="authMethodToken"
disabled={values.authMethodUsernamePassword}
onChange={() => {
setFieldValue('authMethodToken', !values.authMethodToken);
}}
/>
</div>
</div>
{values.authMethodToken && (
<div className="form-row mr-2 ml-4">
<label htmlFor="token" className="text-label">
{intl.formatMessage(messages.token)}
</label>
<div className="form-input-area">
<div className="form-input-field">
<SensitiveInput as="field" id="token" name="token" />
</div>
</div>
</div>
)}
<NotificationTypeSelector
currentTypes={values.enabled ? values.types || 0 : 0}
onUpdate={(newTypes) => {
setFieldValue('types', newTypes);
setFieldTouched('types');
if (newTypes) {
setFieldValue('enabled', true);
}
}}
error={
values.enabled && !values.types && touched.types
? intl.formatMessage(messages.validationTypes)
: undefined
}
/>
<div className="actions">
<div className="flex justify-end">
<span className="ml-3 inline-flex rounded-md shadow-sm">
<Button
buttonType="warning"
disabled={isSubmitting || !isValid || isTesting}
onClick={(e) => {
e.preventDefault();
testSettings();
}}
>
<BeakerIcon />
<span>
{isTesting
? intl.formatMessage(globalMessages.testing)
: intl.formatMessage(globalMessages.test)}
</span>
</Button>
</span>
<span className="ml-3 inline-flex rounded-md shadow-sm">
<Button
buttonType="primary"
type="submit"
disabled={
isSubmitting ||
!isValid ||
isTesting ||
(values.enabled && !values.types)
}
>
<ArrowDownOnSquareIcon />
<span>
{isSubmitting
? intl.formatMessage(globalMessages.saving)
: intl.formatMessage(globalMessages.save)}
</span>
</Button>
</span>
</div>
</div>
</Form>
);
}}
</Formik>
);
};
export default NotificationsNtfy;

View File

@@ -100,7 +100,6 @@ const NotificationsPushover = () => {
options: {
accessToken: values.accessToken,
userToken: values.userToken,
sound: values.sound,
},
});
addToast(intl.formatMessage(messages.pushoversettingssaved), {

View File

@@ -3,7 +3,6 @@ import LoadingSpinner from '@app/components/Common/LoadingSpinner';
import NotificationTypeSelector from '@app/components/NotificationTypeSelector';
import globalMessages from '@app/i18n/globalMessages';
import defineMessages from '@app/utils/defineMessages';
import { isValidURL } from '@app/utils/urlValidationHelper';
import { ArrowDownOnSquareIcon, BeakerIcon } from '@heroicons/react/24/outline';
import {
ArrowPathIcon,
@@ -108,10 +107,10 @@ const NotificationsWebhook = () => {
.required(intl.formatMessage(messages.validationWebhookUrl)),
otherwise: Yup.string().nullable(),
})
.test(
'valid-url',
intl.formatMessage(messages.validationWebhookUrl),
isValidURL
.matches(
// eslint-disable-next-line no-useless-escape
/^(https?:)?\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*)?([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,
intl.formatMessage(messages.validationWebhookUrl)
),
jsonPayload: Yup.string()
.when('enabled', {

View File

@@ -3,7 +3,6 @@ import SensitiveInput from '@app/components/Common/SensitiveInput';
import type { RadarrTestResponse } from '@app/components/Settings/SettingsServices';
import globalMessages from '@app/i18n/globalMessages';
import defineMessages from '@app/utils/defineMessages';
import { isValidURL } from '@app/utils/urlValidationHelper';
import { Transition } from '@headlessui/react';
import type { RadarrSettings } from '@server/lib/settings';
import axios from 'axios';
@@ -118,10 +117,9 @@ const RadarrModal = ({ onClose, radarr, onSave }: RadarrModalProps) => {
intl.formatMessage(messages.validationMinimumAvailabilityRequired)
),
externalUrl: Yup.string()
.test(
'valid-url',
intl.formatMessage(messages.validationApplicationUrl),
isValidURL
.matches(
/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}(\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*))?$/i,
intl.formatMessage(messages.validationApplicationUrl)
)
.test(
'no-trailing-slash',

View File

@@ -6,7 +6,6 @@ import LibraryItem from '@app/components/Settings/LibraryItem';
import useSettings from '@app/hooks/useSettings';
import globalMessages from '@app/i18n/globalMessages';
import defineMessages from '@app/utils/defineMessages';
import { isValidURL } from '@app/utils/urlValidationHelper';
import { ArrowDownOnSquareIcon } from '@heroicons/react/24/outline';
import { ApiErrorCode } from '@server/constants/error';
import { MediaServerType } from '@server/constants/server';
@@ -141,7 +140,10 @@ const SettingsJellyfin: React.FC<SettingsJellyfinProps> = ({
),
jellyfinExternalUrl: Yup.string()
.nullable()
.test('valid-url', intl.formatMessage(messages.validationUrl), isValidURL)
.matches(
/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}(\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*))?$/i,
intl.formatMessage(messages.validationUrl)
)
.test(
'no-trailing-slash',
intl.formatMessage(messages.validationUrlTrailingSlash),
@@ -149,7 +151,10 @@ const SettingsJellyfin: React.FC<SettingsJellyfinProps> = ({
),
jellyfinForgotPasswordUrl: Yup.string()
.nullable()
.test('valid-url', intl.formatMessage(messages.validationUrl), isValidURL)
.matches(
/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}(\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*))?$/i,
intl.formatMessage(messages.validationUrl)
)
.test(
'no-trailing-slash',
intl.formatMessage(messages.validationUrlTrailingSlash),

View File

@@ -13,7 +13,6 @@ import useLocale from '@app/hooks/useLocale';
import { Permission, useUser } from '@app/hooks/useUser';
import globalMessages from '@app/i18n/globalMessages';
import defineMessages from '@app/utils/defineMessages';
import { isValidURL } from '@app/utils/urlValidationHelper';
import { ArrowDownOnSquareIcon } from '@heroicons/react/24/outline';
import { ArrowPathIcon } from '@heroicons/react/24/solid';
import type { UserSettingsGeneralResponse } from '@server/interfaces/api/userSettingsInterfaces';
@@ -46,16 +45,11 @@ const messages = defineMessages('components.Settings.SettingsMain', {
'The "Process Blacklisted Tags" job will blacklist this many pages into each sort. Larger numbers will create a more accurate blacklist, but use more space.',
streamingRegion: 'Streaming Region',
streamingRegionTip: 'Show streaming sites by regional availability',
hideBlacklisted: 'Hide Blacklisted Items',
hideBlacklistedTip:
'Hide blacklisted items from discover pages for all users with the "Manage Blacklist" permission',
toastApiKeySuccess: 'New API key generated successfully!',
toastApiKeyFailure: 'Something went wrong while generating a new API key.',
toastSettingsSuccess: 'Settings saved successfully!',
toastSettingsFailure: 'Something went wrong while saving settings.',
hideAvailable: 'Hide Available Media',
hideAvailableTip:
'Hide available media from the discover pages but not search results',
cacheImages: 'Enable Image Caching',
cacheImagesTip:
'Cache externally sourced images (requires a significant amount of disk space)',
@@ -65,11 +59,6 @@ const messages = defineMessages('components.Settings.SettingsMain', {
partialRequestsEnabled: 'Allow Partial Series Requests',
enableSpecialEpisodes: 'Allow Special Episodes Requests',
locale: 'Display Language',
youtubeUrl: 'YouTube URL',
youtubeUrlTip:
'Base URL for YouTube videos if a self-hosted YouTube instance is used.',
validationUrl: 'You must provide a valid URL',
validationUrlTrailingSlash: 'URL must not end in a trailing slash',
});
const SettingsMain = () => {
@@ -91,10 +80,9 @@ const SettingsMain = () => {
intl.formatMessage(messages.validationApplicationTitle)
),
applicationUrl: Yup.string()
.test(
'valid-url',
intl.formatMessage(messages.validationApplicationUrl),
isValidURL
.matches(
/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}(\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*))?$/i,
intl.formatMessage(messages.validationApplicationUrl)
)
.test(
'no-trailing-slash',
@@ -112,13 +100,6 @@ const SettingsMain = () => {
'Number must be less than or equal to 250.',
(value) => (value ?? 0) <= 250
),
youtubeUrl: Yup.string()
.url(intl.formatMessage(messages.validationUrl))
.test(
'no-trailing-slash',
intl.formatMessage(messages.validationUrlTrailingSlash),
(value) => !value || !value.endsWith('/')
),
});
const regenerate = async () => {
@@ -164,7 +145,6 @@ const SettingsMain = () => {
applicationTitle: data?.applicationTitle,
applicationUrl: data?.applicationUrl,
hideAvailable: data?.hideAvailable,
hideBlacklisted: data?.hideBlacklisted,
locale: data?.locale ?? 'en',
discoverRegion: data?.discoverRegion,
originalLanguage: data?.originalLanguage,
@@ -174,7 +154,6 @@ const SettingsMain = () => {
partialRequestsEnabled: data?.partialRequestsEnabled,
enableSpecialEpisodes: data?.enableSpecialEpisodes,
cacheImages: data?.cacheImages,
youtubeUrl: data?.youtubeUrl,
}}
enableReinitialize
validationSchema={MainSettingsSchema}
@@ -184,7 +163,6 @@ const SettingsMain = () => {
applicationTitle: values.applicationTitle,
applicationUrl: values.applicationUrl,
hideAvailable: values.hideAvailable,
hideBlacklisted: values.hideBlacklisted,
locale: values.locale,
discoverRegion: values.discoverRegion,
streamingRegion: values.streamingRegion,
@@ -194,7 +172,6 @@ const SettingsMain = () => {
partialRequestsEnabled: values.partialRequestsEnabled,
enableSpecialEpisodes: values.enableSpecialEpisodes,
cacheImages: values.cacheImages,
youtubeUrl: values.youtubeUrl,
});
mutate('/api/v1/settings/public');
mutate('/api/v1/status');
@@ -451,9 +428,6 @@ const SettingsMain = () => {
{intl.formatMessage(messages.hideAvailable)}
</span>
<SettingsBadge badgeType="experimental" />
<span className="label-tip">
{intl.formatMessage(messages.hideAvailableTip)}
</span>
</label>
<div className="form-input-area">
<Field
@@ -466,29 +440,6 @@ const SettingsMain = () => {
/>
</div>
</div>
<div className="form-row">
<label htmlFor="hideBlacklisted" className="checkbox-label">
<span className="mr-2">
{intl.formatMessage(messages.hideBlacklisted)}
</span>
<span className="label-tip">
{intl.formatMessage(messages.hideBlacklistedTip)}
</span>
</label>
<div className="form-input-area">
<Field
type="checkbox"
id="hideBlacklisted"
name="hideBlacklisted"
onChange={() => {
setFieldValue(
'hideBlacklisted',
!values.hideBlacklisted
);
}}
/>
</div>
</div>
<div className="form-row">
<label
htmlFor="partialRequestsEnabled"
@@ -535,29 +486,6 @@ const SettingsMain = () => {
/>
</div>
</div>
<div className="form-row">
<label htmlFor="youtubeUrl" className="text-label">
{intl.formatMessage(messages.youtubeUrl)}
<span className="label-tip">
{intl.formatMessage(messages.youtubeUrlTip)}
</span>
</label>
<div className="form-input-area">
<div className="form-input-field">
<Field
id="youtubeUrl"
name="youtubeUrl"
type="text"
inputMode="url"
/>
</div>
{errors.youtubeUrl &&
touched.youtubeUrl &&
typeof errors.youtubeUrl === 'string' && (
<div className="error">{errors.youtubeUrl}</div>
)}
</div>
</div>
<div className="actions">
<div className="flex justify-end">
<span className="ml-3 inline-flex rounded-md shadow-sm">

View File

@@ -42,9 +42,6 @@ const messages = defineMessages('components.Settings.SettingsNetwork', {
networkDisclaimer:
'Network parameters from your container/system should be used instead of these settings. See the {docs} for more information.',
docs: 'documentation',
forceIpv4First: 'Force IPv4 Resolution First',
forceIpv4FirstTip:
'Force Jellyseerr to resolve IPv4 addresses first instead of IPv6',
});
const SettingsNetwork = () => {
@@ -89,7 +86,6 @@ const SettingsNetwork = () => {
<Formik
initialValues={{
csrfProtection: data?.csrfProtection,
forceIpv4First: data?.forceIpv4First,
trustProxy: data?.trustProxy,
proxyEnabled: data?.proxy?.enabled,
proxyHostname: data?.proxy?.hostname,
@@ -106,7 +102,6 @@ const SettingsNetwork = () => {
try {
await axios.post('/api/v1/settings/network', {
csrfProtection: values.csrfProtection,
forceIpv4First: values.forceIpv4First,
trustProxy: values.trustProxy,
proxy: {
enabled: values.proxyEnabled,
@@ -198,29 +193,6 @@ const SettingsNetwork = () => {
</Tooltip>
</div>
</div>
<div className="form-row">
<label htmlFor="forceIpv4First" className="checkbox-label">
<span className="mr-2">
{intl.formatMessage(messages.forceIpv4First)}
</span>
<SettingsBadge badgeType="advanced" className="mr-2" />
<SettingsBadge badgeType="restartRequired" />
<SettingsBadge badgeType="experimental" />
<span className="label-tip">
{intl.formatMessage(messages.forceIpv4FirstTip)}
</span>
</label>
<div className="form-input-area">
<Field
type="checkbox"
id="forceIpv4First"
name="forceIpv4First"
onChange={() => {
setFieldValue('forceIpv4First', !values.forceIpv4First);
}}
/>
</div>
</div>
<div className="form-row">
<label htmlFor="proxyEnabled" className="checkbox-label">
<span className="mr-2">

View File

@@ -1,7 +1,6 @@
import DiscordLogo from '@app/assets/extlogos/discord.svg';
import GotifyLogo from '@app/assets/extlogos/gotify.svg';
import LunaSeaLogo from '@app/assets/extlogos/lunasea.svg';
import NtfyLogo from '@app/assets/extlogos/ntfy.svg';
import PushbulletLogo from '@app/assets/extlogos/pushbullet.svg';
import PushoverLogo from '@app/assets/extlogos/pushover.svg';
import SlackLogo from '@app/assets/extlogos/slack.svg';
@@ -76,17 +75,6 @@ const SettingsNotifications = ({ children }: SettingsNotificationsProps) => {
route: '/settings/notifications/gotify',
regex: /^\/settings\/notifications\/gotify/,
},
{
text: 'ntfy.sh',
content: (
<span className="flex items-center">
<NtfyLogo className="mr-2 h-4" />
ntfy.sh
</span>
),
route: '/settings/notifications/ntfy',
regex: /^\/settings\/notifications\/ntfy/,
},
{
text: 'LunaSea',
content: (

View File

@@ -8,7 +8,6 @@ import LibraryItem from '@app/components/Settings/LibraryItem';
import SettingsBadge from '@app/components/Settings/SettingsBadge';
import globalMessages from '@app/i18n/globalMessages';
import defineMessages from '@app/utils/defineMessages';
import { isValidURL } from '@app/utils/urlValidationHelper';
import { ArrowDownOnSquareIcon } from '@heroicons/react/24/outline';
import {
ArrowPathIcon,
@@ -192,10 +191,9 @@ const SettingsPlex = ({ onComplete }: SettingsPlexProps) => {
otherwise: Yup.string().nullable(),
}),
tautulliExternalUrl: Yup.string()
.test(
'valid-url',
intl.formatMessage(messages.validationUrl),
isValidURL
.matches(
/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}(\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*))?$/i,
intl.formatMessage(messages.validationUrl)
)
.test(
'no-trailing-slash',

View File

@@ -3,7 +3,6 @@ import SensitiveInput from '@app/components/Common/SensitiveInput';
import type { SonarrTestResponse } from '@app/components/Settings/SettingsServices';
import globalMessages from '@app/i18n/globalMessages';
import defineMessages from '@app/utils/defineMessages';
import { isValidURL } from '@app/utils/urlValidationHelper';
import { Transition } from '@headlessui/react';
import type { SonarrSettings } from '@server/lib/settings';
import axios from 'axios';
@@ -127,10 +126,9 @@ const SonarrModal = ({ onClose, sonarr, onSave }: SonarrModalProps) => {
)
: Yup.number(),
externalUrl: Yup.string()
.test(
'valid-url',
intl.formatMessage(messages.validationApplicationUrl),
isValidURL
.matches(
/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}(\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*))?$/i,
intl.formatMessage(messages.validationApplicationUrl)
)
.test(
'no-trailing-slash',

View File

@@ -208,15 +208,10 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
});
}
const trailerVideo = data.relatedVideos
const trailerUrl = data.relatedVideos
?.filter((r) => r.type === 'Trailer')
.sort((a, b) => a.size - b.size)
.pop();
const trailerUrl =
trailerVideo?.site === 'YouTube' &&
settings.currentSettings.youtubeUrl != ''
? `${settings.currentSettings.youtubeUrl}${trailerVideo?.key}`
: trailerVideo?.url;
.pop()?.url;
if (trailerUrl) {
mediaLinks.push({

View File

@@ -33,14 +33,13 @@ const messages = defineMessages(
const DeviceItem = ({ disablePushNotifications, device }: DeviceItemProps) => {
const intl = useIntl();
const parsedUserAgent = UAParser(device.userAgent);
return (
<div className="relative flex w-full flex-col justify-between overflow-hidden rounded-xl bg-gray-800 py-4 text-gray-400 shadow-md ring-1 ring-gray-700 xl:h-28 xl:flex-row">
<div className="relative flex w-full flex-col justify-between overflow-hidden sm:flex-row">
<div className="relative z-10 flex w-full items-center overflow-hidden pl-4 pr-4 sm:pr-0 xl:w-7/12 2xl:w-2/3">
<div className="relative h-auto w-12 flex-shrink-0 scale-100 transform-gpu overflow-hidden rounded-md transition duration-300 hover:scale-105">
{parsedUserAgent.device.type === 'mobile' ? (
{UAParser(device.userAgent).device.type === 'mobile' ? (
<DevicePhoneMobileIcon />
) : (
<ComputerDesktopIcon />
@@ -57,8 +56,8 @@ const DeviceItem = ({ disablePushNotifications, device }: DeviceItemProps) => {
: 'N/A'}
</div>
<div className="mr-2 min-w-0 truncate text-lg font-bold text-white hover:underline xl:text-xl">
{device.userAgent && parsedUserAgent.device.model
? parsedUserAgent.device.model
{device.userAgent
? UAParser(device.userAgent).device.model
: intl.formatMessage(messages.unknown)}
</div>
</div>
@@ -69,7 +68,7 @@ const DeviceItem = ({ disablePushNotifications, device }: DeviceItemProps) => {
{intl.formatMessage(messages.operatingsystem)}
</span>
<span className="flex truncate text-sm text-gray-300">
{device.userAgent ? parsedUserAgent.os.name : 'N/A'}
{device.userAgent ? UAParser(device.userAgent).os.name : 'N/A'}
</span>
</div>
<div className="card-field">
@@ -77,7 +76,9 @@ const DeviceItem = ({ disablePushNotifications, device }: DeviceItemProps) => {
{intl.formatMessage(messages.browser)}
</span>
<span className="flex truncate text-sm text-gray-300">
{device.userAgent ? parsedUserAgent.browser.name : 'N/A'}
{device.userAgent
? UAParser(device.userAgent).browser.name
: 'N/A'}
</span>
</div>
<div className="card-field">
@@ -85,14 +86,16 @@ const DeviceItem = ({ disablePushNotifications, device }: DeviceItemProps) => {
{intl.formatMessage(messages.engine)}
</span>
<span className="flex truncate text-sm text-gray-300">
{device.userAgent ? parsedUserAgent.engine.name : 'N/A'}
{device.userAgent
? UAParser(device.userAgent).engine.name
: 'N/A'}
</span>
</div>
</div>
</div>
<div className="z-10 mt-4 flex w-full flex-col justify-center space-y-2 pl-4 pr-4 xl:mt-0 xl:w-96 xl:items-end xl:pl-0">
<ConfirmButton
onClick={() => disablePushNotifications(device.endpoint)}
onClick={() => disablePushNotifications(device.p256dh)}
confirmText={intl.formatMessage(globalMessages.areyousure)}
className="w-full"
>

View File

@@ -113,7 +113,7 @@ const UserWebPushSettings = () => {
// Unsubscribes from the push manager
// Deletes/disables corresponding push subscription from database
const disablePushNotifications = async (endpoint?: string) => {
const disablePushNotifications = async (p256dh?: string) => {
if ('serviceWorker' in navigator && user?.id) {
navigator.serviceWorker.getRegistration('/sw.js').then((registration) => {
registration?.pushManager
@@ -122,21 +122,17 @@ const UserWebPushSettings = () => {
const parsedSub = JSON.parse(JSON.stringify(subscription));
await axios.delete(
`/api/v1/user/${user.id}/pushSubscription/${encodeURIComponent(
endpoint ?? parsedSub.endpoint
)}`
`/api/v1/user/${user?.id}/pushSubscription/${
p256dh ? p256dh : parsedSub.keys.p256dh
}`
);
if (
subscription &&
(endpoint === parsedSub.endpoint || !endpoint)
) {
if (subscription && (p256dh === parsedSub.keys.p256dh || !p256dh)) {
subscription.unsubscribe();
setWebPushEnabled(false);
}
addToast(
intl.formatMessage(
endpoint
p256dh
? messages.subscriptiondeleted
: messages.webpushhasbeendisabled
),
@@ -149,7 +145,7 @@ const UserWebPushSettings = () => {
.catch(function () {
addToast(
intl.formatMessage(
endpoint
p256dh
? messages.subscriptiondeleteerror
: messages.disablingwebpusherror
),
@@ -180,17 +176,12 @@ const UserWebPushSettings = () => {
const parsedKey = JSON.parse(JSON.stringify(subscription));
const currentUserPushSub =
await axios.get<UserPushSubscription>(
`/api/v1/user/${
user.id
}/pushSubscription/${encodeURIComponent(
parsedKey.endpoint
)}`
`/api/v1/user/${user.id}/pushSubscription/${parsedKey.keys.p256dh}`
);
if (currentUserPushSub.data.endpoint !== parsedKey.endpoint) {
if (currentUserPushSub.data.p256dh !== parsedKey.keys.p256dh) {
return;
}
setWebPushEnabled(true);
} else {
setWebPushEnabled(false);

View File

@@ -160,12 +160,9 @@ const UserProfile = () => {
<dd className="mt-1 text-3xl font-semibold text-white">
<Link
href={
currentHasPermission(
[Permission.MANAGE_REQUESTS, Permission.REQUEST_VIEW],
{ type: 'or' }
)
? `/users/${user?.id}/requests?filter=all`
: '/requests'
user.id === currentUser?.id
? '/profile/requests?filter=all'
: `/users/${user?.id}/requests?filter=all`
}
>
{intl.formatNumber(user.requestCount)}
@@ -296,12 +293,9 @@ const UserProfile = () => {
<div className="slider-header">
<Link
href={
currentHasPermission(
[Permission.MANAGE_REQUESTS, Permission.REQUEST_VIEW],
{ type: 'or' }
)
? `/users/${user?.id}/requests?filter=all`
: '/requests'
user.id === currentUser?.id
? '/profile/requests?filter=all'
: `/users/${user?.id}/requests?filter=all`
}
className="slider-title"
>

View File

@@ -13,7 +13,6 @@ const defaultSettings = {
applicationTitle: 'Jellyseerr',
applicationUrl: '',
hideAvailable: false,
hideBlacklisted: false,
localLogin: true,
mediaServerLogin: true,
movie4kEnabled: false,
@@ -30,7 +29,6 @@ const defaultSettings = {
locale: 'en',
emailEnabled: false,
newPlexLogin: true,
youtubeUrl: '',
};
export const SettingsContext = React.createContext<SettingsContextProps>({

View File

@@ -1,7 +1,6 @@
import { MediaStatus } from '@server/constants/media';
import useSWRInfinite from 'swr/infinite';
import useSettings from './useSettings';
import { Permission, useUser } from './useUser';
export interface BaseSearchResult<T> {
page: number;
@@ -54,10 +53,9 @@ const useDiscover = <
>(
endpoint: string,
options?: O,
{ hideAvailable = true, hideBlacklisted = true } = {}
{ hideAvailable = true } = {}
): DiscoverResult<T, S> => {
const settings = useSettings();
const { hasPermission } = useUser();
const { data, error, size, setSize, isValidating, mutate } = useSWRInfinite<
BaseSearchResult<T> & S
>(
@@ -122,23 +120,10 @@ const useDiscover = <
);
}
if (
settings.currentSettings.hideBlacklisted &&
hideBlacklisted &&
hasPermission(Permission.MANAGE_BLACKLIST)
) {
titles = titles.filter(
(i) =>
(i.mediaType === 'movie' || i.mediaType === 'tv') &&
i.mediaInfo?.status !== MediaStatus.BLACKLISTED
);
}
const isEmpty = !isLoadingInitialData && titles?.length === 0;
const isReachingEnd =
isEmpty ||
(!!data && (data[data?.length - 1]?.results.length ?? 0) < 20) ||
(!!data && (data[data?.length - 1]?.totalResults ?? 0) <= size * 20) ||
(!!data && (data[data?.length - 1]?.totalResults ?? 0) < 41);
return {

View File

@@ -256,6 +256,8 @@
"components.PersonDetails.birthdate": "ولد في {birthdate}",
"components.PersonDetails.crewmember": "عضو",
"components.PersonDetails.lifespan": "{birthdate} - {deathdate}",
"components.PlexLoginButton.signingin": "تسجيل دخول…",
"components.PlexLoginButton.signinwithplex": "تسجيل دخول",
"components.QuotaSelector.days": "{count, plural, one {يوم} other {أيام}}",
"components.QuotaSelector.movieRequests": "{quotaLimit} <quotaUnits>{movies} كل {quotaDays} {days}</quotaUnits>",
"components.QuotaSelector.movies": "{count, plural, one {فيلم} other {أفلام}}",
@@ -1031,6 +1033,7 @@
"i18n.collection": "تجميعة",
"components.RequestBlock.approve": "الموافقة على الطلب",
"components.RequestBlock.requestedby": "تم الطلب من قبل",
"components.Settings.SettingsMain.csrfProtection": "تفعيل حماية CSRF",
"components.Settings.SettingsMain.generalsettingsDescription": "ضبط الإعدادات العامة والإفتراضية بأوفرسيرر.",
"components.StatusChecker.appUpdated": "{applicationTitle} تم التحديث",
"components.TitleCard.cleardata": "محو البيانات",
@@ -1094,6 +1097,7 @@
"components.DownloadBlock.formattedTitle": "{title}: موسم {seasonNumber} حلقة {episodeNumber}",
"components.TvDetails.reportissue": "الإبلاغ عن مشكلةْ",
"components.TvDetails.rtaudiencescore": "تقييم الجمهور من موقع Rotten Tomatoes",
"components.Settings.SettingsMain.trustProxyTip": "السماح لأوفرسيرر بتسجيل عناوين IP خلف بروكسي",
"components.Discover.DiscoverMovies.discovermovies": "أفلام",
"components.Discover.DiscoverMovies.sortPopularityAsc": "الشعبية تصاعديا",
"components.Discover.DiscoverMovies.sortPopularityDesc": "الشعبية تنازلياً",
@@ -1137,9 +1141,12 @@
"components.RequestList.RequestItem.tmdbid": "المعرّف الخاص بموقع TMDB",
"components.RequestModal.requestseries4ktitle": "طلب مسلسل بجودة فور كي",
"components.Settings.SettingsMain.cacheImages": "تفعيل تخزين الملتقطات والصور",
"components.Settings.SettingsMain.csrfProtectionHoverTip": "لا تقم بتفعيل هذا الخيار إلا إذا كنت تعيّ ماتقوم به!",
"components.Settings.SettingsMain.csrfProtectionTip": "إعداد خارجي بمفتاح API بصلاحية القراءة فقط (هذا الخيار يتطلب إتصال مُشفر HTTP)",
"components.Settings.SettingsMain.generalsettings": "إعدادات عامة",
"components.Settings.SettingsMain.locale": "لغة العرض",
"components.Settings.SettingsMain.toastSettingsSuccess": "تم حفظ الإعدادات!",
"components.Settings.SettingsMain.trustProxy": "تفعيل دعم البروكسي",
"components.StatusChecker.appUpdatedDescription": "الرجاء النقر على الزر بالإسفل لإعادة تحميل الصفحة.",
"components.AirDateBadge.airedrelative": "عُرضت {relativeTime}",
"components.Discover.DiscoverMovies.activefilters": "{count, plural, one {# الفلتر المُفعّل } other {# الفلاتر المفعلة}}",

View File

@@ -190,7 +190,7 @@
"components.PermissionEdit.requestTvDescription": "Дайте разрешение за изпращане на заявки за не-4K сериали.",
"components.PermissionEdit.autoapproveSeriesDescription": "Гарантиране на автоматично одобрение за заявки на 4K филми.",
"components.Settings.Notifications.NotificationsPushover.validationAccessTokenRequired": "Трябва да предоставите валиден токен за приложение",
"components.Settings.RadarrModal.baseUrl": "Базов URL адрес",
"components.Settings.RadarrModal.baseUrl": "URL Base",
"components.Discover.FilterSlideover.keywords": "Ключови думи",
"components.Discover.tvgenres": "Жанрове сериали",
"components.Settings.Notifications.NotificationsWebhook.webhookUrl": "Webhook URL",
@@ -234,7 +234,7 @@
"components.PermissionEdit.viewrequests": "Преглед на заявките",
"components.RequestCard.failedretry": "Нещо се обърка при повторен опит за заявка.",
"components.PermissionEdit.requestMovies": "Заявка за филми",
"components.RequestModal.QuotaDisplay.quotaLinkUser": "Можете да прегледате обобщение на ограниченията на заявки от потребителя на неговата <ProfileLink>профилна страница</ProfileLink>.",
"components.RequestModal.QuotaDisplay.quotaLinkUser": "Можете да прегледате обобщение на ограниченията на заявки от потребителя на неговата <Profile Link>профилна страница</Profile Link>.",
"components.Discover.StudioSlider.studios": "Студия",
"components.ManageSlideOver.manageModalRequests": "Заявки",
"components.NotificationTypeSelector.issuecreatedDescription": "Изпращайте известия при докладване на проблеми.",
@@ -436,7 +436,7 @@
"components.RequestButton.viewrequest4k": "Преглед на 4К заявка",
"components.Settings.RadarrModal.edit4kradarr": "Редактирай 4К Radarr сървър",
"components.PermissionEdit.request4k": "Заявка 4K",
"components.RequestModal.QuotaDisplay.quotaLink": "Можете да прегледате обобщение на ограниченията на вашите заявки на вашата <ProfileLink>профилна страница</ProfileLink>.",
"components.RequestModal.QuotaDisplay.quotaLink": "Можете да прегледате обобщение на ограниченията на вашите заявки на вашата <Profile Link>профилна страница</Profile Link>.",
"components.Discover.plexwatchlist": "Вашият Plex списък за гледане",
"components.ResetPassword.confirmpassword": "Потвърди парола",
"components.Discover.FilterSlideover.tmdbuserscore": "TMDB потребителска оценка",
@@ -473,7 +473,7 @@
"components.Settings.Notifications.NotificationsLunaSea.settingsFailed": "Настройките за известяване на LunaSea не успяха да бъдат запазени.",
"components.Settings.Notifications.pgpPassword": "PGP Парола",
"components.RequestModal.QuotaDisplay.requiredquotaUser": "Този потребител трябва да има най-малко <strong>{seasons}</strong> {seasons, plural, one {заявка за сезон} other {заявки за сезони}} оставащи, за да изпрати заявка за този сериал.",
"components.Settings.Notifications.NotificationsWebhook.authheader": "Хедър за удостоверяване",
"components.Settings.Notifications.NotificationsWebhook.authheader": "Authorization Header",
"components.PermissionEdit.request4kTvDescription": "Дайте разрешение за изпращане на заявки за 4K сериали.",
"components.ManageSlideOver.markavailable": "Маркирайте като наличен",
"components.Selector.showless": "Покажи по-малко",
@@ -482,7 +482,7 @@
"components.Settings.SettingsAbout.totalmedia": "Общо медия",
"components.RegionSelector.regionServerDefault": "По подразбиране ({region})",
"components.PermissionEdit.request4kMovies": "Заявка за 4K филми",
"components.RequestButton.approve4krequests": "Одобрете {requestCount, plural, one {4K заявка} other {{requestCount} 4K Заявки}}",
"components.RequestButton.approve4krequests": "Одобрете {requestCount, plural, one {4K заявка} other {{requestCount} 4K заявки}}",
"components.Discover.FilterSlideover.releaseDate": "Дата на излизане",
"components.Settings.Notifications.webhookUrl": "Webhook URL",
"components.RequestModal.errorediting": "Нещо се обърка при редактирането на заявката.",
@@ -509,9 +509,10 @@
"components.RequestModal.QuotaDisplay.allowedRequests": "Имате право да заявявате <strong>{limit}</strong> {type} на всеки <strong>{days}</strong> дни.",
"components.PermissionEdit.autorequestMoviesDescription": "Дайте разрешение за автоматично изпращане на заявки за не-4K филми чрез Plex Списък за гледане.",
"components.NotificationTypeSelector.usermediadeclinedDescription": "Получавайте известие, когато заявките ви за медия бъдат отхвърлени.",
"components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {промяна} other {промени}} назад",
"components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {commit} other {commits}} behind",
"components.ResetPassword.resetpassword": "Нулиране на паролата ви",
"components.Settings.Notifications.smtpHost": "SMTP Host",
"components.PlexLoginButton.signingin": "Вписване…",
"components.NotificationTypeSelector.mediaAutoApprovedDescription": "Изпращайте известия, когато потребителите изпращат нови медийни заявки, които се одобряват автоматично.",
"components.Discover.FilterSlideover.runtime": "Времетраене",
"components.Settings.SettingsAbout.githubdiscussions": "Дискусии в GitHub",
@@ -579,7 +580,7 @@
"components.PermissionEdit.autoapproveMovies": "Автоматично одобряване на филми",
"components.PermissionEdit.viewissuesDescription": "Дайте разрешение за преглед на медийни проблеми, докладвани от други потребители.",
"components.Settings.Notifications.validationPgpPrivateKey": "Трябва да предоставите валиден PGP частен ключ",
"components.RequestList.RequestItem.tvdbid": "Идентификатор за TheTVDB",
"components.RequestList.RequestItem.tvdbid": "TheTVDB ID",
"components.ManageSlideOver.markallseasonsavailable": "Маркирайте всички сезони като налични",
"components.Settings.Notifications.botUsernameTip": "Позволете на потребителите също да започнат чат с вашия бот и да конфигурират свои собствени известия",
"components.Settings.RadarrModal.loadingrootfolders": "Основните папки се зареждат…",
@@ -606,7 +607,7 @@
"components.MovieDetails.MovieCast.fullcast": "Пълен актьорски състав",
"components.Settings.SettingsAbout.runningDevelop": "Вие изпълнявате версия <code>develop</code> на Overseerr, която се препоръчва само за тези, които допринасят за разработката или помагат при тестване на последните версии.",
"components.Settings.RadarrModal.externalUrl": "Външен URL адрес",
"components.Settings.Notifications.NotificationsWebhook.customJson": "JSON съдържание",
"components.Settings.Notifications.NotificationsWebhook.customJson": "JSON Payload",
"components.RequestBlock.edit": "Редакция на заявка",
"components.Discover.FilterSlideover.runtimeText": "{minValue}-{maxValue} минути времетраене",
"components.Settings.Notifications.NotificationsGotify.toastGotifyTestFailed": "Неуспешно изпращане на тестово известие към Gotify.",
@@ -660,7 +661,7 @@
"components.Settings.RadarrModal.hostname": "Име на хост или IP адрес",
"components.RequestModal.requestCancel": "Заявката за <strong>{title}</strong> е анулирана.",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Устройство по подразбиране",
"components.RequestCard.tvdbid": "Идентификатор за TheTVDB",
"components.RequestCard.tvdbid": "TheTVDB ID",
"components.Settings.Notifications.toastDiscordTestSuccess": "Известието за тест към Discord е изпратено!",
"components.NotificationTypeSelector.mediafailedDescription": "Изпращайте известия, когато медийните заявки не могат да бъдат добавени към Radarr или Sonarr.",
"components.RequestModal.requestmovietitle": "Заявка за филм",
@@ -680,6 +681,7 @@
"components.Settings.Notifications.NotificationsWebhook.resetPayload": "Нулиране до първоначално",
"components.RequestModal.QuotaDisplay.notenoughseasonrequests": "Не остават достатъчно заявки за сезона",
"components.RequestModal.requestseasons4k": "Заявете {seasonCount} {seasonCount, plural, one {сезон} other {сезони}} в 4К",
"components.PlexLoginButton.signinwithplex": "Впиши се",
"components.RequestModal.pendingrequest": "Изчакваща заявка",
"components.Settings.Notifications.NotificationsSlack.webhookUrl": "Webhook URL",
"components.Settings.Notifications.NotificationsWebhook.toastWebhookTestSending": "Изпраща се известие за тест чрез Webhook…",
@@ -761,11 +763,12 @@
"i18n.all": "Всичко",
"components.Settings.SettingsUsers.toastSettingsSuccess": "Потребителските настройки са запазени успешно!",
"components.Settings.notificationsettings": "Настройки за известията",
"components.Settings.SettingsLogs.logsDescription": "Можете също да видите тези лог файлове директно чрез <code>stdout</code> или в <code>{appDataPath}/logs/jellyseerr.log</code>.",
"components.Settings.SettingsLogs.logsDescription": "Можете също да видите тези лог файлове директно чрез <code>stdout</code> или в <code>{appDataPath}/logs/overseerr.log</code>.",
"components.TvDetails.episodeCount": "{episodeCount, plural, one {# епизод} other {# епизоди}}",
"components.UserProfile.UserSettings.UserGeneralSettings.discordId": "ID на потребител в Discord",
"components.UserProfile.UserSettings.UserGeneralSettings.discordId": "Discord User ID",
"components.TvDetails.firstAirDate": "Първа дата за ефир",
"pages.errormessagewithcode": "{statusCode} - {error}",
"components.Settings.SettingsMain.trustProxy": "Активирайте поддръжката на прокси",
"components.UserList.validationEmail": "Трябва да предоставите валиден имейл адрес",
"components.UserProfile.UserSettings.UserPasswordChange.confirmpassword": "Потвърди парола",
"components.Settings.SettingsLogs.logs": "Лог файлове",
@@ -839,7 +842,7 @@
"components.Settings.SonarrModal.editsonarr": "Редактирай Sonarr сървър",
"components.Settings.addradarr": "Добавяне на нов Radarr сървър",
"components.Settings.notrunning": "Не работи",
"components.Settings.urlBase": "Базов URL адрес",
"components.Settings.urlBase": "URL Base",
"components.Settings.SonarrModal.rootfolder": "Основна папка",
"components.Settings.SonarrModal.apiKey": "API ключ",
"components.UserList.userssaved": "Потребителските права са запазени успешно!",
@@ -932,11 +935,12 @@
"components.Settings.SonarrModal.server4k": "4K сървър",
"components.Settings.SettingsLogs.resumeLogs": "Продължи",
"components.UserList.accounttype": "Тип",
"components.Settings.webAppUrl": "URL адрес на <WebAppLink>уеб приложението</WebAppLink>",
"components.Settings.webAppUrl": "<WebAppLink>Web App</WebAppLink> URL",
"components.TvDetails.manageseries": "Управление на сериали",
"components.UserProfile.UserSettings.UserNotificationSettings.discordsettingsfailed": "Настройките за известяване към Discord не успяха да бъдат запазени.",
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSetOwnAccount": "Вашият акаунт в момента няма зададена парола. Конфигурирайте парола по-долу, за да разрешите влизане като „локален потребител“, използвайки своя имейл адрес.",
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "Нова честота",
"components.Settings.SettingsMain.csrfProtection": "Активиране на CSRF защита",
"components.UserList.created": "Присъединиха",
"components.Settings.currentlibrary": "Текуща библиотека: {name}",
"i18n.resolved": "Разрешен",
@@ -972,6 +976,7 @@
"components.Settings.plex": "Plex",
"components.UserProfile.UserSettings.UserGeneralSettings.plexuser": "Plex потребител",
"components.Settings.SonarrModal.create4ksonarr": "Добавяне на нов 4K Sonarr сървър",
"components.Settings.SettingsMain.trustProxyTip": "Позволете на Overseerr да регистрира коректно клиентските IP адреси зад прокси",
"components.Settings.SonarrModal.selectLanguageProfile": "Изберете езиков профил",
"components.Settings.SettingsLogs.message": "Съобщение",
"components.Settings.SettingsMain.generalsettings": "Общи настройки",
@@ -1121,6 +1126,7 @@
"components.Settings.SonarrModal.validationBaseUrlLeadingSlash": "Базовият URL адрес трябва да има водеща наклонена черта",
"components.Settings.serverpresetRefreshing": "Сървърите се получават…",
"components.Settings.SonarrModal.testFirstLanguageProfiles": "Тествайте връзката за зареждане на езикови профили",
"components.Settings.SettingsMain.csrfProtectionHoverTip": "НЕ активирайте тази настройка, освен ако не разбирате какво правите!",
"i18n.request4k": "Заявка в 4K",
"components.Settings.SettingsJobsCache.jobcancelled": "{jobname} е отменено.",
"components.UserProfile.seriesrequest": "Заявки за сериали",
@@ -1135,7 +1141,7 @@
"components.Setup.setup": "Настройване",
"components.UserProfile.emptywatchlist": "Мултимедията, добавена към вашия <PlexWatchlistSupportLink>списък за гледане в Plex</PlexWatchlistSupportLink>, ще се появи тук.",
"components.Settings.enablessl": "Използвай SSL",
"components.Settings.SettingsUsers.localLoginTip": "Позволете на потребителите да влизат, като използват своя имейл адрес и парола",
"components.Settings.SettingsUsers.localLoginTip": "Позволете на потребителите да влизат, като използват своя имейл адрес и парола, вместо Plex OAuth",
"components.Settings.noDefaultNon4kServer": "Ако имате само един сървър {serverType} както за съдържание, което не е 4K, така и за 4K (или ако изтегляте само 4K съдържание), вашият сървър {serverType} трябва <strong>ДА НЕ БЪДЕ</strong> обозначен като 4K сървър.",
"components.UserList.nouserstoimport": "Няма Plex потребители за импортиране.",
"components.UserProfile.ProfileHeader.profile": "Виж профил",
@@ -1149,7 +1155,7 @@
"components.Settings.SettingsJobsCache.jobsDescription": "Overseerr изпълнява определени задачи по поддръжката като редовно планирани задачи, но те също могат да бъдат ръчно задействани по-долу. Ръчното изпълнение на задание няма да промени неговия график.",
"components.Settings.SonarrModal.animeTags": "Етикети за аниме",
"components.UserProfile.UserSettings.UserNotificationSettings.pgpPublicKeyTip": "Кодирай имейлите използвайки <OpenPgpLink>OpenPGP</OpenPgpLink>",
"components.Settings.SonarrModal.baseUrl": "Базов URL адрес",
"components.Settings.SonarrModal.baseUrl": "URL Base",
"components.UserProfile.UserSettings.UserGeneralSettings.originallanguageTip": "Филтрирайте съдържанието по оригинален език",
"components.Settings.toastPlexConnectingSuccess": "Връзката с Plex е установена успешно!",
"components.UserProfile.UserSettings.menuGeneralSettings": "Общ",
@@ -1188,7 +1194,7 @@
"components.UserProfile.UserSettings.UserPasswordChange.validationConfirmPassword": "Трябва да потвърдите новата парола",
"components.UserList.usercreatedfailedexisting": "Предоставеният имейл адрес вече се използва от друг потребител.",
"components.UserProfile.UserSettings.UserGeneralSettings.owner": "Собственик",
"components.TitleCard.tvdbid": "Идентификатор за TheTVDB",
"components.TitleCard.tvdbid": "TheTVDB ID",
"components.Settings.serverRemote": "отдалечен",
"components.UserProfile.UserSettings.menuChangePass": "Парола",
"i18n.experimental": "Експериментален",
@@ -1211,6 +1217,7 @@
"components.UserList.importedfromplex": "<strong>{userCount}</strong> Plex {userCount, plural, one {потребител} other {потребители}} импортиран(и) успешно!",
"i18n.status": "Статус",
"components.Settings.SonarrModal.ssl": "Използвай SSL",
"components.Settings.SettingsMain.csrfProtectionTip": "Задаване на външен API достъп само за четене (изисква HTTPS)",
"components.TvDetails.originallanguage": "Оригинален език",
"components.Settings.SettingsJobsCache.download-sync-reset": "Нулиране на синхронизирането на изтеглянията",
"components.UserList.usercreatedfailed": "Нещо се обърка при създаването на потребителя.",
@@ -1219,56 +1226,5 @@
"components.Settings.menuJobs": "Задания и кеш",
"components.Settings.SettingsUsers.newPlexLogin": "Активиране на ново влизане в Plex",
"components.UserProfile.UserSettings.UserNotificationSettings.discordsettingssaved": "Настройките за известяване към Discord са запазени успешно!",
"i18n.settings": "Настройки",
"components.Login.back": "Обратно",
"component.BlacklistBlock.blacklistdate": "Дата на добаване в черния списък",
"components.Discover.FilterSlideover.status": "Статус",
"components.Layout.Sidebar.blacklist": "Черен списък",
"components.Layout.UserWarnings.emailInvalid": "Невалиден имейл адрес.",
"components.Layout.UserWarnings.emailRequired": "Трябва да предоставите имейл адрес.",
"components.Blacklist.blacklistNotFoundError": "<strong>{title}</strong> не е в черния списък.",
"components.Blacklist.blacklistdate": "дата",
"components.DiscoverTvUpcoming.upcomingtv": "Предстоящи сериали",
"components.Login.credentialerror": "Въведено неправилно име или парола.",
"components.Blacklist.mediaTmdbId": "TMDB идентификатор",
"components.Blacklist.mediaType": "Тип",
"components.Layout.UserWarnings.passwordRequired": "Необхода е парола.",
"components.Login.adminerror": "Трябва да използвате администраторски акаунт при вписване.",
"component.BlacklistBlock.blacklistedby": "Добавено от",
"component.BlacklistModal.blacklisting": "Добавяне в черния списък",
"components.Blacklist.blacklistSettingsDescription": "Управления на медия в черния списък.",
"components.Blacklist.blacklistedby": "{date} от {user}",
"components.Blacklist.blacklistsettings": "Настройки на черния списък",
"components.Blacklist.mediaName": "Заглавие",
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* Това ще премахне необратимо този/тази {mediaType} от {arr}, заедно с всички свързани файлове.",
"components.Login.noadminerror": "На сървъра не е открит администратор.",
"components.Login.validationemailformat": "Изисква се валиден имейл адрес",
"components.Login.username": "Потребителско име",
"components.Login.validationhostformat": "Изисква се валиден URL адрес",
"components.Login.validationHostnameRequired": "Трябва да въведете валидно име на хост или IP адрес",
"components.Login.validationUrlBaseTrailingSlash": "Базовият URL адрес не трябва да завършва с наклонена черта",
"components.Login.validationhostrequired": "Изисква се {mediaServerName} URL адрес",
"components.Login.description": "Тъй като това е първото Ви влизане в {applicationName}, трябва да добавите валиден имейл адрес.",
"components.Login.emailtooltip": "Не е необходимо имейл адресът да бъде свързан с вашия {mediaServerName} сървър.",
"components.Login.enablessl": "Използвай SSL",
"components.Login.hostname": "{mediaServerName} URL",
"components.Login.initialsignin": "Свързване",
"components.Login.initialsigningin": "Установява се връзка…",
"components.Login.invalidurlerror": "Не може да се осъществи връзка със сървъра {mediaServerName}.",
"components.Login.loginwithapp": "Влез със {appName}",
"components.Login.orsigninwith": "Или влез със",
"components.Login.port": "Порт",
"components.Login.save": "Добави",
"components.Login.servertype": "Тип на сървъра",
"components.Login.signinwithjellyfin": "Използвай своя {mediaServerName} акаунт",
"components.Login.title": "Добави имейл",
"components.Login.urlBase": "Основен URL",
"components.Login.validationEmailFormat": "Невалиден имейл адрес",
"components.Login.validationEmailRequired": "Трябва да въведете имейл адрес",
"components.Login.validationPortRequired": "Трябва да въведете валиден номер на порт",
"components.Login.validationUrlBaseLeadingSlash": "Базовият URL адрес трявба да започва със наклонена черта",
"components.Login.validationUrlTrailingSlash": "URL адресът не трябва да завършва с наклонена черта",
"components.Login.validationservertyperequired": "Моля изберете тип на сървъра",
"components.Login.validationusernamerequired": "Изисква се потребителско име",
"components.Login.saving": "Добавяне…"
"i18n.settings": "Настройки"
}

View File

@@ -74,8 +74,10 @@
"components.RequestBlock.requestoverrides": "Anul·lacions de sol·licituds",
"components.RequestBlock.profilechanged": "Perfil de qualitat",
"components.RegionSelector.regionServerDefault": "Predeterminada ({Region})",
"components.PlexLoginButton.signinwithplex": "Inicieu la sessió",
"components.RegionSelector.regionDefault": "Totes les regions",
"components.QuotaSelector.unlimited": "Il·limitat",
"components.PlexLoginButton.signingin": "S'està iniciant la sessió…",
"components.PersonDetails.lifespan": "{birthdate} {deathdate}",
"components.PersonDetails.crewmember": "Equip",
"components.PersonDetails.birthdate": "Nascut/da {birthdate}",
@@ -1179,9 +1181,12 @@
"components.Discover.FilterSlideover.streamingservices": "Serveis en streaming",
"components.Discover.FilterSlideover.studio": "Estudi",
"components.Discover.FilterSlideover.to": "A",
"components.Settings.SettingsMain.csrfProtection": "Habilitar la protecció CSRF",
"components.Settings.SettingsMain.general": "General",
"components.Settings.SettingsMain.generalsettings": "Configuració general",
"components.Settings.SettingsMain.cacheImages": "Activar la memòria cau d'imatges",
"components.Settings.SettingsMain.csrfProtectionHoverTip": "NO activis aquesta configuració tret que entenguis el que estàs fent!",
"components.Settings.SettingsMain.csrfProtectionTip": "Establir l'accés a l'API extern a només de lectura (requereix HTTPS)",
"components.Settings.SettingsMain.generalsettingsDescription": "Configuració global i predeterminada per a Jellyseerr.",
"components.Settings.SettingsMain.hideAvailable": "Amagar el contingut disponible",
"components.Settings.SettingsMain.apikey": "Clau API",
@@ -1203,6 +1208,8 @@
"components.Settings.SettingsMain.partialRequestsEnabled": "Permet sol·licituds parcials de sèries",
"components.Settings.SettingsMain.toastSettingsSuccess": "La configuració s'ha desat correctament!",
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "L'URL no ha d'acabar amb una barra inclinada final",
"components.Settings.SettingsMain.trustProxy": "Habilitar la compatibilitat amb proxy",
"components.Settings.SettingsMain.trustProxyTip": "Permetre a Overserr registrar correctament la IP del client darrere d'un proxy",
"components.Settings.SettingsMain.validationApplicationTitle": "Has de proporcionar un títol d'aplicació",
"components.Settings.SettingsMain.validationApplicationUrl": "Has de proporcionar un URL vàlid",
"components.StatusBadge.seasonepisodenumber": "S{seasonNumber}E{episodeNumber}",

View File

@@ -117,6 +117,8 @@
"components.RequestBlock.profilechanged": "Profil kvality",
"components.RegionSelector.regionServerDefault": "Výchozí ({region})",
"components.RegionSelector.regionDefault": "Všechny regiony",
"components.PlexLoginButton.signinwithplex": "Přihlásit se",
"components.PlexLoginButton.signingin": "Přihlašování…",
"components.PersonDetails.birthdate": "Narozen {birthdate}",
"components.PersonDetails.ascharacter": "jako {character}",
"components.PermissionEdit.viewrequests": "Zobrazit žádosti",
@@ -1187,6 +1189,9 @@
"components.Settings.SettingsMain.applicationurl": "Adresa URL aplikace",
"components.Settings.SettingsMain.cacheImages": "Povolení ukládání obrázků do mezipaměti",
"components.Settings.SettingsMain.cacheImagesTip": "Ukládání obrázků z externích zdrojů do mezipaměti (vyžaduje značné množství místa na disku)",
"components.Settings.SettingsMain.csrfProtection": "Povolit ochranu CSRF",
"components.Settings.SettingsMain.csrfProtectionHoverTip": "Toto nastavení NEPOVOLUJTE, pokud nerozumíte tomu, co děláte!",
"components.Settings.SettingsMain.csrfProtectionTip": "Nastavení externího přístupu k rozhraní API pouze pro čtení (vyžaduje protokol HTTPS)",
"components.Settings.SettingsMain.general": "Obecné",
"components.Settings.SettingsMain.generalsettings": "Obecná nastavení",
"components.Settings.SettingsMain.generalsettingsDescription": "Konfigurace globálních a výchozích nastavení pro Jellyseerr.",
@@ -1195,6 +1200,7 @@
"components.Settings.SettingsMain.originallanguage": "Objevte jazyk",
"components.Settings.SettingsMain.originallanguageTip": "Filtrování obsahu podle původního jazyka",
"components.Settings.SettingsMain.partialRequestsEnabled": "Povolení požadavků na částečné série",
"components.Settings.SettingsMain.trustProxyTip": "Umožnit Jellyseerru správně registrovat klientské IP adresy za proxy serverem",
"components.Settings.SettingsJobsCache.imagecachecount": "Obrázky v mezipaměti",
"components.Settings.SettingsJobsCache.imagecache": "Vyrovnávací paměť obrázků",
"components.Settings.SettingsJobsCache.imagecacheDescription": "Pokud je tato funkce povolena v nastavení, bude služba Jellyseerr proxy serverem a ukládat do mezipaměti obrázky z předem nakonfigurovaných externích zdrojů. Cached images are saved into your config folder. You can find the files in <code>{appDataPath}/cache/images</code>.",
@@ -1202,6 +1208,7 @@
"components.Settings.SettingsMain.toastApiKeyFailure": "Při generování nového klíče API se něco pokazilo.",
"components.Settings.SettingsMain.toastSettingsFailure": "Při ukládání nastavení se něco pokazilo.",
"components.Settings.SettingsMain.toastSettingsSuccess": "Nastavení úspěšně uloženo!",
"components.Settings.SettingsMain.trustProxy": "Povolení podpory proxy serveru",
"components.Settings.SettingsJobsCache.image-cache-cleanup": "Čištění mezipaměti obrázků",
"components.StatusBadge.seasonepisodenumber": "S{seasonNumber}E{episodeNumber}",
"components.Selector.searchKeywords": "Klíčová slova pro vyhledávání…",
@@ -1247,6 +1254,7 @@
"components.Blacklist.blacklistdate": "datum",
"components.Blacklist.mediaName": "Jméno",
"components.MovieDetails.watchlistDeleted": "<strong>{title}</strong> úspěšně odstraněno ze seznamu sledování!",
"components.Settings.SettingsMain.validationProxyPort": "Musíte poskytnout platný port",
"components.Settings.Notifications.validationWebhookRoleId": "Musíte poskytnout platné ID Discord role",
"components.Blacklist.blacklistedby": "{date} uživatelem {user}",
"components.Layout.UserWarnings.passwordRequired": "Heslo je povinné.",
@@ -1305,9 +1313,16 @@
"components.Settings.SettingsJobsCache.jellyfin-full-scan": "Kompletní sken knihoven Jellyfin",
"components.Settings.SettingsJobsCache.plex-refresh-token": "Obnovení Plex tokenu",
"components.Settings.SettingsMain.discoverRegionTip": "Filtrovat obsah podle dostupnosti v regionu",
"components.Settings.SettingsMain.proxyEnabled": "HTTP(S) proxy",
"components.Settings.SettingsMain.proxySsl": "Používat SSL pro proxy",
"components.Settings.SettingsMain.proxyPort": "Port proxy",
"components.Settings.SettingsMain.proxyPassword": "Heslo proxy",
"components.Settings.SettingsMain.proxyUser": "Uživatelské jméno proxy",
"components.Settings.SettingsMain.streamingRegion": "Streamovací region",
"components.Settings.SettingsMain.streamingRegionTip": "Zobrazit streamovací služby podle dostupnosti v regionu",
"components.Settings.SettingsMain.discoverRegion": "Region objevování",
"components.Settings.SettingsMain.proxyBypassLocalAddresses": "Obcházet proxy pro lokální adresy",
"components.Settings.SettingsMain.proxyHostname": "Hostitelské jméno proxy",
"components.Settings.apiKey": "API klíč",
"components.Settings.invalidurlerror": "Nelze se připojit k {mediaServerName} serveru.",
"components.Settings.jellyfinForgotPasswordUrl": "URL pro zapomenuté heslo",

View File

@@ -99,6 +99,8 @@
"components.PersonDetails.alsoknownas": "Også Kendt Som: {names}",
"components.PersonDetails.appearsin": "Medvirket i",
"components.PersonDetails.crewmember": "Besætningsmedlem",
"components.PlexLoginButton.signingin": "Logger Ind…",
"components.PlexLoginButton.signinwithplex": "Log Ind",
"components.QuotaSelector.movieRequests": "{quotaLimit} <quotaUnits>{movies} per {quotaDays} {days}</quotaUnits>",
"components.QuotaSelector.seasons": "{count, plural, one {sæson} other {sæsoner}}",
"components.QuotaSelector.unlimited": "Ubegrænset",
@@ -1121,7 +1123,9 @@
"components.Discover.PlexWatchlistSlider.emptywatchlist": "Medier føjet til din <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> vises her.",
"components.Discover.resetwarning": "Nulstil alle skydere til standard. Dette vil også slette eventuelle brugerdefinerede skydere!",
"components.Settings.SettingsMain.cacheImagesTip": "Cache eksterne billeder (anvender en betydelig mængde diskplads)",
"components.Settings.SettingsMain.csrfProtection": "Aktivér CSRF Beskyttelse",
"components.Settings.SettingsMain.generalsettings": "Generelle Indstillinger",
"components.Settings.SettingsMain.csrfProtectionTip": "Sæt ekstern API-adgang til skrivebeskyttet (kræver HTTPS)",
"components.Settings.SettingsMain.toastApiKeySuccess": "Ny API-nøgle er blevet genereret!",
"components.Settings.SettingsMain.toastSettingsFailure": "Noget gik galt da indstillingerne skulle gemmes.",
"components.Settings.SettingsMain.toastSettingsSuccess": "Indstillingerne er blevet gemt!",
@@ -1150,11 +1154,14 @@
"components.Discover.tvgenres": "Seriegenrer",
"components.Discover.updatefailed": "Noget gik galt med at nulstille indstillingerne for Discover-tilpasning.",
"components.Discover.updatesuccess": "Opdaterede Discover-tilpasningsindstillinger.",
"components.Settings.SettingsMain.csrfProtectionHoverTip": "Du må IKKE aktivere denne indstilling, medmindre du ved, hvad du gør!",
"components.Settings.SettingsMain.general": "Generelt",
"components.Settings.SettingsMain.generalsettingsDescription": "Konfigurér global- og standardindstillinger for Jellyseerr.",
"components.Settings.SettingsMain.hideAvailable": "Skjul Tilgængelige Medier",
"components.Settings.SettingsMain.partialRequestsEnabled": "Tillad delvise serieanmodninger",
"components.Settings.SettingsMain.toastApiKeyFailure": "Noget gik galt under genereringen af en nye API-nøgle.",
"components.Settings.SettingsMain.trustProxy": "Aktivér Proxy-understøttelse",
"components.Settings.SettingsMain.trustProxyTip": "Tillad Jellyseerr at registrere klienters IP addresser korrekt bag en proxy",
"components.Settings.SettingsMain.validationApplicationTitle": "Du skal angive en applikationstitel",
"components.Settings.SettingsMain.validationApplicationUrl": "Du skal angive en gyldig URL",
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "URL'en må ikke afsluttes med en skråstreg",

View File

@@ -12,26 +12,26 @@
"components.Discover.DiscoverStudio.studioMovies": "{studio}-Filme",
"components.Discover.DiscoverTvGenre.genreSeries": "{genre}-Serien",
"components.Discover.DiscoverTvLanguage.languageSeries": "Serien auf {language}",
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Deine Merkliste",
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Deine Beobachtungsliste",
"components.Discover.DiscoverWatchlist.watchlist": "Plex Merkliste",
"components.Discover.MovieGenreList.moviegenres": "Film-Genres",
"components.Discover.MovieGenreSlider.moviegenres": "Film-Genres",
"components.Discover.MovieGenreList.moviegenres": "Filmgenres",
"components.Discover.MovieGenreSlider.moviegenres": "Filmgenres",
"components.Discover.NetworkSlider.networks": "Sender",
"components.Discover.StudioSlider.studios": "Filmstudio",
"components.Discover.TvGenreList.seriesgenres": "Serien-Genres",
"components.Discover.TvGenreSlider.tvgenres": "Serien-Genres",
"components.Discover.TvGenreList.seriesgenres": "Seriengenres",
"components.Discover.TvGenreSlider.tvgenres": "Seriengenres",
"components.Discover.discover": "Entdecken",
"components.Discover.emptywatchlist": "Hier erscheinen deine zur <PlexWatchlistSupportLink>Plex Merkliste</PlexWatchlistSupportLink> hinzugefügten Medien.",
"components.Discover.plexwatchlist": "Deine Merkliste",
"components.Discover.emptywatchlist": "Hier erscheinen deine zur <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> hinzugefügte Medien.",
"components.Discover.plexwatchlist": "Deine Watchlist",
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Kürzlich hinzugefügt",
"components.Discover.popularmovies": "Beliebte Filme",
"components.Discover.populartv": "Beliebte Serien",
"components.Discover.recentlyAdded": "Kürzlich hinzugefügt",
"components.Discover.recentrequests": "Bisherige Anfragen",
"components.Discover.recentrequests": "Vorherige Anfragen",
"components.Discover.trending": "Trends",
"components.Discover.upcoming": "Demnächst erscheinende Filme",
"components.Discover.upcomingmovies": "Demnächst erscheinende Filme",
"components.Discover.upcomingtv": "Demnächst erscheinende Serien",
"components.Discover.upcoming": "Kommende Filme",
"components.Discover.upcomingmovies": "Kommende Filme",
"components.Discover.upcomingtv": "Kommende Serien",
"components.DownloadBlock.estimatedtime": "Geschätzte {time}",
"components.DownloadBlock.formattedTitle": "{title}: Staffel {seasonNumber} Episode {episodeNumber}",
"components.IssueDetails.IssueComment.areyousuredelete": "Soll dieser Kommentar wirklich gelöscht werden?",
@@ -108,7 +108,7 @@
"components.IssueModal.issueVideo": "Video",
"components.LanguageSelector.languageServerDefault": "Standard ({language})",
"components.LanguageSelector.originalLanguageDefault": "Alle Sprachen",
"components.Layout.LanguagePicker.displaylanguage": "Anzeigesprache",
"components.Layout.LanguagePicker.displaylanguage": "Sprache darstellen",
"components.Layout.SearchInput.searchPlaceholder": "Nach Filmen und Serien suchen",
"components.Layout.Sidebar.dashboard": "Entdecken",
"components.Layout.Sidebar.issues": "Probleme",
@@ -125,23 +125,23 @@
"components.Layout.VersionStatus.outofdate": "Veraltet",
"components.Layout.VersionStatus.streamdevelop": "Jellyseerr Entwicklung",
"components.Layout.VersionStatus.streamstable": "Jellyseerr stabil",
"components.Login.email": "E-Mail Adresse",
"components.Login.email": "E-Mail-Adresse",
"components.Login.forgotpassword": "Passwort vergessen?",
"components.Login.loginerror": "Beim Anmelden ist etwas schief gelaufen.",
"components.Login.password": "Passwort",
"components.Login.signin": "Anmelden",
"components.Login.signingin": "Anmelden…",
"components.Login.signingin": "Anmelden …",
"components.Login.signinheader": "Anmelden um fortzufahren",
"components.Login.signinwithoverseerr": "Verwende dein {applicationTitle}-Konto",
"components.Login.signinwithplex": "Benutze dein Plex-Konto",
"components.Login.validationemailrequired": "Du musst eine gültige E-Mail Adresse angeben",
"components.Login.validationemailrequired": "Du musst eine gültige E-Mail-Adresse angeben",
"components.Login.validationpasswordrequired": "Du musst ein Passwort angeben",
"components.ManageSlideOver.alltime": "Gesamte Zeit",
"components.ManageSlideOver.downloadstatus": "Downloads",
"components.ManageSlideOver.manageModalAdvanced": "Erweitert",
"components.ManageSlideOver.manageModalAdvanced": "Fortgeschrittene",
"components.ManageSlideOver.manageModalClearMedia": "Daten löschen",
"components.ManageSlideOver.manageModalClearMediaWarning": "* Dadurch werden alle Daten für diesen {mediaType} unwiderruflich entfernt, einschließlich aller Anfragen. Wenn dieses Element in deiner {mediaServerName}-Bibliothek existiert, werden die Medieninformationen beim nächsten Scan neu erstellt.",
"components.ManageSlideOver.manageModalIssues": "Offene Probleme",
"components.ManageSlideOver.manageModalIssues": "Problem eröffnen",
"components.ManageSlideOver.manageModalMedia": "Medien",
"components.ManageSlideOver.manageModalMedia4k": "4K Medien",
"components.ManageSlideOver.manageModalNoRequests": "Keine Anfragen.",
@@ -172,7 +172,7 @@
"components.MovieDetails.originaltitle": "Originaltitel",
"components.MovieDetails.overview": "Übersicht",
"components.MovieDetails.overviewunavailable": "Übersicht nicht verfügbar.",
"components.MovieDetails.physicalrelease": "DVD/Bluray-Veröffentlichung",
"components.MovieDetails.physicalrelease": "DVD/Bluray-Veröffentlichungen",
"components.MovieDetails.productioncountries": "Produktions {countryCount, plural, one {Land} other {Länder}}",
"components.MovieDetails.recommendations": "Empfehlungen",
"components.MovieDetails.releasedate": "{releaseCount, plural, one {Veröffentlichungstermin} other {Veröffentlichungstermine}}",
@@ -195,7 +195,7 @@
"components.NotificationTypeSelector.adminissueresolvedDescription": "Sende eine Benachrichtigung, wenn andere Benutzer Kommentare zu Themen abgeben.",
"components.NotificationTypeSelector.issuecomment": "Problem Kommentar",
"components.NotificationTypeSelector.issuecommentDescription": "Sende eine Benachrichtigungen, wenn Probleme neue Kommentare erhalten.",
"components.NotificationTypeSelector.issuecreated": "Problem gemeldet",
"components.NotificationTypeSelector.issuecreated": "Gemeldetes Problem",
"components.NotificationTypeSelector.issuecreatedDescription": "Senden eine Benachrichtigungen, wenn Probleme gemeldet werden.",
"components.NotificationTypeSelector.issuereopened": "Problem wiedereröffnet",
"components.NotificationTypeSelector.issuereopenedDescription": "Sende eine Benachrichtigung, wenn Probleme wieder geöffnet werden.",
@@ -205,8 +205,8 @@
"components.NotificationTypeSelector.mediaAutoApprovedDescription": "Sende eine Benachrichtigung, wenn das angeforderte Medium automatisch genehmigt wird.",
"components.NotificationTypeSelector.mediaapproved": "Anfrage genehmigt",
"components.NotificationTypeSelector.mediaapprovedDescription": "Sende Benachrichtigungen, wenn angeforderte Medien manuell genehmigt wurden.",
"components.NotificationTypeSelector.mediaautorequested": "Anfrage automatisch übermittelt",
"components.NotificationTypeSelector.mediaautorequestedDescription": "Erhalten eine Benachrichtigung, wenn neue Medienanfragen für Objekte auf deiner Merkliste automatisch übermittelt werden.",
"components.NotificationTypeSelector.mediaautorequested": "Automatisch übermittelte Anfrage",
"components.NotificationTypeSelector.mediaautorequestedDescription": "Erhalten eine Benachrichtigung, wenn neue Medienanfragen für Objekte auf deiner Watchlist automatisch übermittelt werden.",
"components.NotificationTypeSelector.mediaavailable": "Anfrage verfügbar",
"components.NotificationTypeSelector.mediaavailableDescription": "Sendet Benachrichtigungen, wenn angeforderte Medien verfügbar werden.",
"components.NotificationTypeSelector.mediadeclined": "Anfrage abgelehnt",
@@ -216,16 +216,16 @@
"components.NotificationTypeSelector.mediarequested": "Anfrage in Bearbeitung",
"components.NotificationTypeSelector.mediarequestedDescription": "Sende Benachrichtigungen, wenn neue Medien angefordert wurden und auf Genehmigung warten.",
"components.NotificationTypeSelector.notificationTypes": "Benachrichtigungstypen",
"components.NotificationTypeSelector.userissuecommentDescription": "Sende eine Benachrichtigung, wenn dein Problem neue Kommentare erhält.",
"components.NotificationTypeSelector.userissuecommentDescription": "Sende eine Benachrichtigung, wenn andere Benutzer Kommentare zu Problemen abgeben.",
"components.NotificationTypeSelector.userissuecreatedDescription": "Lassen dich benachrichtigen, wenn andere Benutzer Probleme melden.",
"components.NotificationTypeSelector.userissuereopenedDescription": "Sende eine Benachrichtigung, wenn die von dir gemeldeten Probleme wieder geöffnet werden.",
"components.NotificationTypeSelector.userissueresolvedDescription": "Sende eine Benachrichtigung, wenn dein Problem gelöst wurde.",
"components.NotificationTypeSelector.userissueresolvedDescription": "Sende eine Benachrichtigung, wenn andere Benutzer Kommentare zu Problemen abgeben.",
"components.NotificationTypeSelector.usermediaAutoApprovedDescription": "Werde benachrichtigt, wenn andere Nutzer Medien anfordern, welche automatisch angenommen werden.",
"components.NotificationTypeSelector.usermediaapprovedDescription": "Werde benachrichtigt, wenn deine Medienanfrage angenommen wurde.",
"components.NotificationTypeSelector.usermediaavailableDescription": "Sende eine Benachrichtigung, wenn deine Medienanfragen verfügbar sind.",
"components.NotificationTypeSelector.usermediaapprovedDescription": "Werde benachrichtigt, wenn Ihre Medienanfrage angenommen wurde.",
"components.NotificationTypeSelector.usermediaavailableDescription": "Sende eine Benachrichtigung, wenn Ihre Medienanfragen verfügbar sind.",
"components.NotificationTypeSelector.usermediadeclinedDescription": "Werde benachrichtigt, wenn deine Medienanfrage abgelehnt wurde.",
"components.NotificationTypeSelector.usermediafailedDescription": "Werde benachrichtigt, wenn die angeforderten Medien bei der Hinzufügung zu Radarr oder Sonarr fehlschlagen.",
"components.NotificationTypeSelector.usermediarequestedDescription": "Werde benachrichtigt, wenn andere Nutzer eine Medie anfordern, welches eine Genehmigung erfordert.",
"components.NotificationTypeSelector.usermediarequestedDescription": "Werde benachrichtigt, wenn andere Nutzer ein Medium anfordern, welches eine Genehmigung erfordert.",
"components.PermissionEdit.admin": "Admin",
"components.PermissionEdit.adminDescription": "Voller Administratorzugriff. Umgeht alle anderen Rechteabfragen.",
"components.PermissionEdit.advancedrequest": "Erweiterte Anfragen",
@@ -242,19 +242,19 @@
"components.PermissionEdit.autoapproveMoviesDescription": "Autorisierung der automatischen Freigabe von Anfragen für nicht-4K-Filme.",
"components.PermissionEdit.autoapproveSeries": "Automatische Genehmigung von Serien",
"components.PermissionEdit.autoapproveSeriesDescription": "Autorisierung der automatischen Freigabe von Anfragen für nicht-4K-Serien.",
"components.PermissionEdit.autorequest": "Automatische Anfrage aus Plex-Merkliste",
"components.PermissionEdit.autorequestDescription": "Autorisierung zur automatischen Anfrage von Nicht-4K-Medien über die Plex Merkliste.",
"components.PermissionEdit.autorequest": "Automatische Anfrage",
"components.PermissionEdit.autorequestDescription": "Autorisierung zur automatischen Anfrage von Nicht-4K-Medien über die Plex Watchlist.",
"components.PermissionEdit.autorequestMovies": "Filme automatisch anfragen",
"components.PermissionEdit.autorequestMoviesDescription": "Autorisierung zur automatischen Anfrage von Nicht-4K-Medien über die Plex Merkliste.",
"components.PermissionEdit.autorequestSeries": "Serien automatisch anfragen",
"components.PermissionEdit.autorequestSeriesDescription": "Autorisierung der automatischen Anfrage von Nicht-4K-Serien über die Plex Merkliste.",
"components.PermissionEdit.autorequestMoviesDescription": "Autorisierung zur automatischen Anfrage von Nicht-4K-Medien über die Plex Watchlist.",
"components.PermissionEdit.autorequestSeries": "Auto-Anfrage-Serien",
"components.PermissionEdit.autorequestSeriesDescription": "Autorisierung der automatischen Anfrage von Nicht-4K-Serien über die Plex Watchlist.",
"components.PermissionEdit.createissues": "Probleme melden",
"components.PermissionEdit.createissuesDescription": "Autorisierung zur Meldung von Medienproblemen.",
"components.PermissionEdit.manageissues": "Probleme verwalten",
"components.PermissionEdit.manageissuesDescription": "Autorisierung zur Verwaltung von Medienproblemen.",
"components.PermissionEdit.managerequests": "Anfragen verwalten",
"components.PermissionEdit.managerequestsDescription": "Autorisierung zur Verwaltung von Medienanfragen. Alle Anfragen, die von einem Benutzer mit dieser Berechtigung gestellt werden, werden automatisch genehmigt.",
"components.PermissionEdit.request": "Anfragen senden",
"components.PermissionEdit.request": "Anfrage",
"components.PermissionEdit.request4k": "4K anfragen",
"components.PermissionEdit.request4kDescription": "Autorisierung zur Anfrage von Medien in 4K.",
"components.PermissionEdit.request4kMovies": "4K Filme anfragen",
@@ -274,15 +274,17 @@
"components.PermissionEdit.viewrecentDescription": "Autorisierung zur Anzeige der Liste der kürzlich hinzugefügten Medien.",
"components.PermissionEdit.viewrequests": "Anfragen anzeigen",
"components.PermissionEdit.viewrequestsDescription": "Autorisierung zur Anzeige der von anderen Benutzern eingereichten Medienanfragen.",
"components.PermissionEdit.viewwatchlists": "{mediaServerName} Merklisten anzeigen",
"components.PermissionEdit.viewwatchlistsDescription": "Autorisierung zur Anzeige von {mediaServerName} Merklisten anderer Benutzer.",
"components.PermissionEdit.viewwatchlists": "{mediaServerName} Watchlists anzeigen",
"components.PermissionEdit.viewwatchlistsDescription": "Autorisierung zur Anzeige von {mediaServerName} Watchlists anderer Benutzer.",
"components.PersonDetails.alsoknownas": "Auch bekannt unter: {names}",
"components.PersonDetails.appearsin": "Auftritte",
"components.PersonDetails.ascharacter": "als {character}",
"components.PersonDetails.birthdate": "Geboren am {birthdate}",
"components.PersonDetails.crewmember": "Crew",
"components.PersonDetails.lifespan": "{birthdate} {deathdate}",
"components.QuotaSelector.days": "{count, plural, one {Tag} other {Tage}}",
"components.PlexLoginButton.signingin": "Anmeldung läuft ",
"components.PlexLoginButton.signinwithplex": "Anmelden",
"components.QuotaSelector.days": "{count, plural, one {tag} other {tage}}",
"components.QuotaSelector.movieRequests": "{quotaLimit} <quotaUnits>{movies} pro {quotaDays} {days}</quotaUnits>",
"components.QuotaSelector.movies": "{count, plural, one {Film} other {Filme}}",
"components.QuotaSelector.seasons": "{count, plural, one {Staffel} other {Staffeln}}",
@@ -303,14 +305,14 @@
"components.RequestBlock.rootfolder": "Stammordner",
"components.RequestBlock.seasons": "{seasonCount, plural, one {Staffel} other {Staffeln}}",
"components.RequestBlock.server": "Zielserver",
"components.RequestButton.approve4krequests": "Genehmige {requestCount, plural, one {4K Anfrage} other {{requestCount} 4K Anfragen}}",
"components.RequestButton.approve4krequests": "Genehmige {requestCount, plural, one {4K Anfrage} other {{requestCount} 4K Requests}}",
"components.RequestButton.approverequest": "Anfrage genehmigen",
"components.RequestButton.approverequest4k": "4K Anfrage genehmigen",
"components.RequestButton.approverequests": "Genehmige {requestCount, plural, one {Anfrage} other {{requestCount} Anfragen}}",
"components.RequestButton.decline4krequests": "Lehne {requestCount, plural, one {4K Anfrage} other {{requestCount} 4K Anfragen}} ab",
"components.RequestButton.approverequests": "Genehmige {requestCount, plural, one {Anfrage} other {{requestCount} Requests}}",
"components.RequestButton.decline4krequests": "Lehne {requestCount, plural, one {4K Anfrage} other {{requestCount} 4K Requests}} ab",
"components.RequestButton.declinerequest": "Anfrage ablehnen",
"components.RequestButton.declinerequest4k": "4K Anfrage ablehnen",
"components.RequestButton.declinerequests": "Lehne {requestCount, plural, one {Anfrage} other {{requestCount} Anfragen}} ab",
"components.RequestButton.declinerequests": "Lehne {requestCount, plural, one {Anfrage} other {{requestCount} Requests}} ab",
"components.RequestButton.requestmore": "Mehr anfragen",
"components.RequestButton.requestmore4k": "Mehr in 4K anfragen",
"components.RequestButton.viewrequest": "Anfrage anzeigen",
@@ -374,7 +376,7 @@
"components.RequestModal.autoapproval": "Automatische Genehmigung",
"components.RequestModal.cancel": "Anfrage abbrechen",
"components.RequestModal.edit": "Anfrage bearbeiten",
"components.RequestModal.errorediting": "Beim bearbeiten der Anfrage ist etwas schief gelaufen.",
"components.RequestModal.errorediting": "Beim Bearbeiten der Anfrage ist etwas schief gelaufen.",
"components.RequestModal.numberofepisodes": "Anzahl der Folgen",
"components.RequestModal.pending4krequest": "Ausstehende 4K Anfrage",
"components.RequestModal.pendingapproval": "Deine Anfrage steht noch aus.",
@@ -402,15 +404,15 @@
"components.RequestModal.selectmovies": "Wähle Film(e)",
"components.RequestModal.selectseason": "Staffel(n) Auswählen",
"components.ResetPassword.confirmpassword": "Passwort bestätigen",
"components.ResetPassword.email": "E-Mail Adresse",
"components.ResetPassword.email": "E-Mail-Adresse",
"components.ResetPassword.emailresetlink": "Wiederherstellungs-Link per E-Mail senden",
"components.ResetPassword.gobacklogin": "Zurück zur Anmeldeseite",
"components.ResetPassword.password": "Passwort",
"components.ResetPassword.passwordreset": "Passwort zurücksetzen",
"components.ResetPassword.requestresetlinksuccessmessage": "Ein Link zum Zurücksetzen des Passworts wird an die angegebene E-Mail Adresse gesendet, wenn sie einem gültigen Benutzer zugeordnet ist.",
"components.ResetPassword.requestresetlinksuccessmessage": "Ein Link zum Zurücksetzen des Passworts wird an die angegebene E-Mail-Adresse gesendet, wenn sie einem gültigen Benutzer zugeordnet ist.",
"components.ResetPassword.resetpassword": "Passwort zurücksetzen",
"components.ResetPassword.resetpasswordsuccessmessage": "Passwort wurde erfolgreich zurückgesetzt!",
"components.ResetPassword.validationemailrequired": "Du musst eine gültige E-Mail Adresse angeben",
"components.ResetPassword.validationemailrequired": "Du musst eine gültige E-Mail-Adresse angeben",
"components.ResetPassword.validationpasswordmatch": "Passwörter müssen übereinstimmen",
"components.ResetPassword.validationpasswordminchars": "Passwort ist zu kurz; es sollte mindestens 8 Zeichen lang sein",
"components.ResetPassword.validationpasswordrequired": "Du musst ein Passwort angeben",
@@ -437,7 +439,7 @@
"components.Settings.Notifications.NotificationsLunaSea.toastLunaSeaTestSending": "LunaSea Test Benachrichtigung wird gesendet…",
"components.Settings.Notifications.NotificationsLunaSea.toastLunaSeaTestSuccess": "LunaSea Test Benachrichtigung gesendet!",
"components.Settings.Notifications.NotificationsLunaSea.validationTypes": "Sie müssen mindestens einen Benachrichtigungstypen auswählen",
"components.Settings.Notifications.NotificationsLunaSea.validationWebhookUrl": "Geben sie eine gültige URL an",
"components.Settings.Notifications.NotificationsLunaSea.validationWebhookUrl": "Geben sie eine valide URL an",
"components.Settings.Notifications.NotificationsLunaSea.webhookUrl": "Webhook URL",
"components.Settings.Notifications.NotificationsLunaSea.webhookUrlTip": "Deine Benutzer oder Geräte basierende <LunaSeaLink>Benachrichtigungs-Webhook URL</LunaSeaLink>",
"components.Settings.Notifications.NotificationsPushbullet.accessToken": "Zugangstoken",
@@ -462,15 +464,15 @@
"components.Settings.Notifications.NotificationsPushover.userToken": "Benutzer- oder Gruppenschlüssel",
"components.Settings.Notifications.NotificationsPushover.userTokenTip": "Ihr 30-stelliger <UsersGroupsLink>Nutzer oder Gruppen Identifikator</UsersGroupsLink>",
"components.Settings.Notifications.NotificationsPushover.validationAccessTokenRequired": "Du musst ein gültiges Anwendungstoken angeben",
"components.Settings.Notifications.NotificationsPushover.validationTypes": "Du musst mindestens einen Benachrichtigungstypen auswählen",
"components.Settings.Notifications.NotificationsPushover.validationUserTokenRequired": "Du musst einen gültigen Benutzer-/Gruppenschlüssel angeben",
"components.Settings.Notifications.NotificationsPushover.validationTypes": "Sie müssen mindestens einen Benachrichtigungstypen auswählen",
"components.Settings.Notifications.NotificationsPushover.validationUserTokenRequired": "Sie müssen einen gültigen Benutzer-/Gruppenschlüssel angeben",
"components.Settings.Notifications.NotificationsSlack.agentenabled": "Agent aktivieren",
"components.Settings.Notifications.NotificationsSlack.slacksettingsfailed": "Slack-Benachrichtigungseinstellungen konnten nicht gespeichert werden.",
"components.Settings.Notifications.NotificationsSlack.slacksettingssaved": "Slack-Benachrichtigungseinstellungen erfolgreich gespeichert!",
"components.Settings.Notifications.NotificationsSlack.toastSlackTestFailed": "Slack Test Benachrichtigung fehlgeschlagen.",
"components.Settings.Notifications.NotificationsSlack.toastSlackTestSending": "Slack Test Benachrichtigung wird gesendet…",
"components.Settings.Notifications.NotificationsSlack.toastSlackTestSuccess": "Slack Test Benachrichtigung gesendet!",
"components.Settings.Notifications.NotificationsSlack.validationTypes": "Du musst mindestens einen Benachrichtigungstypen auswählen",
"components.Settings.Notifications.NotificationsSlack.validationTypes": "Sie müssen mindestens einen Benachrichtigungstypen auswählen",
"components.Settings.Notifications.NotificationsSlack.validationWebhookUrl": "Du musst eine gültige URL angeben",
"components.Settings.Notifications.NotificationsSlack.webhookUrl": "Webhook URL",
"components.Settings.Notifications.NotificationsSlack.webhookUrlTip": "Erstelle eine <WebhookLink>Eingehende Webhook</WebhookLink> integration",
@@ -491,7 +493,7 @@
"components.Settings.Notifications.NotificationsWebhook.toastWebhookTestSending": "Webhook Test Benachrichtigung wird gesendet…",
"components.Settings.Notifications.NotificationsWebhook.toastWebhookTestSuccess": "Webhook Test Benachrichtigung gesendet!",
"components.Settings.Notifications.NotificationsWebhook.validationJsonPayloadRequired": "Du musst einen gültigen JSON-Inhalt angeben",
"components.Settings.Notifications.NotificationsWebhook.validationTypes": "Du musst mindestens einen Benachrichtigungstypen auswählen",
"components.Settings.Notifications.NotificationsWebhook.validationTypes": "Sie müssen mindestens einen Benachrichtigungstypen auswählen",
"components.Settings.Notifications.NotificationsWebhook.validationWebhookUrl": "Du musst eine gültige URL angeben",
"components.Settings.Notifications.NotificationsWebhook.webhookUrl": "Webhook-URL",
"components.Settings.Notifications.NotificationsWebhook.webhooksettingsfailed": "Webhook-Benachrichtigungseinstellungen konnten nicht gespeichert werden.",
@@ -544,7 +546,7 @@
"components.Settings.Notifications.validationEmail": "Du musst eine gültige E-Mail-Adresse angeben",
"components.Settings.Notifications.validationPgpPassword": "Ein PGP-Passwort muss angeben werden",
"components.Settings.Notifications.validationPgpPrivateKey": "Ein gültiger privater PGP-Schlüssel muss angeben werden",
"components.Settings.Notifications.validationSmtpHostRequired": "Du musst einen gültigen Hostnamen oder IP-Adresse angeben",
"components.Settings.Notifications.validationSmtpHostRequired": "Du musst einen gültigen Hostnamen oder eine gültige IP-Adresse angeben",
"components.Settings.Notifications.validationSmtpPortRequired": "Du musst einen gültigen Port angeben",
"components.Settings.Notifications.validationTypes": "Es muss mindestens ein Benachrichtigungstyp ausgewählt werden",
"components.Settings.Notifications.validationUrl": "Du musst eine gültige URL angeben",
@@ -555,18 +557,18 @@
"components.Settings.RadarrModal.apiKey": "API-Schlüssel",
"components.Settings.RadarrModal.baseUrl": "Basis-URL",
"components.Settings.RadarrModal.create4kradarr": "Neuen 4K Radarr Server hinzufügen",
"components.Settings.RadarrModal.createradarr": "Neuen Radarr Server hinzufügen",
"components.Settings.RadarrModal.createradarr": "Neuen Radarr-Server hinzufügen",
"components.Settings.RadarrModal.default4kserver": "Standard 4K Server",
"components.Settings.RadarrModal.defaultserver": "Standardserver",
"components.Settings.RadarrModal.edit4kradarr": "4K Radarr Server bearbeiten",
"components.Settings.RadarrModal.editradarr": "Radarr Server bearbeiten",
"components.Settings.RadarrModal.editradarr": "Radarr-Server bearbeiten",
"components.Settings.RadarrModal.enableSearch": "Automatische Suche aktivieren",
"components.Settings.RadarrModal.externalUrl": "Externe URL",
"components.Settings.RadarrModal.hostname": "Hostname oder IP-Adresse",
"components.Settings.RadarrModal.inCinemas": "Im Kino",
"components.Settings.RadarrModal.loadingTags": "Lade Tags…",
"components.Settings.RadarrModal.loadingprofiles": "Qualitätsprofile werden geladen…",
"components.Settings.RadarrModal.loadingrootfolders": "Stammordner werden geladen…",
"components.Settings.RadarrModal.loadingprofiles": "Qualitätsprofile werden geladen …",
"components.Settings.RadarrModal.loadingrootfolders": "Stammordner werden geladen …",
"components.Settings.RadarrModal.minimumAvailability": "Mindestverfügbarkeit",
"components.Settings.RadarrModal.notagoptions": "Keine Tags.",
"components.Settings.RadarrModal.port": "Port",
@@ -592,7 +594,7 @@
"components.Settings.RadarrModal.validationApplicationUrlTrailingSlash": "Die URL darf nicht mit einem abschließenden Schrägstrich enden",
"components.Settings.RadarrModal.validationBaseUrlLeadingSlash": "Die URL-Basis muss einen vorangestellten Schrägstrich enthalten",
"components.Settings.RadarrModal.validationBaseUrlTrailingSlash": "Die Basis-URL darf nicht mit einem Schrägstrich enden",
"components.Settings.RadarrModal.validationHostnameRequired": "Es muss ein gültiger Hostname oder IP-Adresse angegeben werden",
"components.Settings.RadarrModal.validationHostnameRequired": "Es muss ein gültiger Hostname oder eine IP-Adresse angegeben werden",
"components.Settings.RadarrModal.validationMinimumAvailabilityRequired": "Du musst eine Mindestverfügbarkeit auswählen",
"components.Settings.RadarrModal.validationNameRequired": "Du musst einen Servernamen angeben",
"components.Settings.RadarrModal.validationPortRequired": "Du musst einen Port angeben",
@@ -607,16 +609,16 @@
"components.Settings.SettingsAbout.Releases.viewongithub": "Auf GitHub anzeigen",
"components.Settings.SettingsAbout.about": "Über",
"components.Settings.SettingsAbout.appDataPath": "Datenverzeichnis",
"components.Settings.SettingsAbout.betawarning": "Das ist eine BETA Software. Einige Funktionen könnten nicht richtig/stabil funktionieren. Bitte sämtliche Fehler auf GitHub melden!",
"components.Settings.SettingsAbout.betawarning": "Dies ist eine BETA Software. Einige Funktionen könnten nicht funktionieren oder nicht stabil funktionieren. Bitte auf GitHub alle Fehler melden!",
"components.Settings.SettingsAbout.documentation": "Dokumentation",
"components.Settings.SettingsAbout.gettingsupport": "Hilfe erhalten",
"components.Settings.SettingsAbout.githubdiscussions": "GitHub-Diskussionen",
"components.Settings.SettingsAbout.helppaycoffee": "Unterstütze das Projekt mit einem Kaffee",
"components.Settings.SettingsAbout.helppaycoffee": "Hilf uns Kaffee zu bezahlen",
"components.Settings.SettingsAbout.outofdate": "Veraltet",
"components.Settings.SettingsAbout.overseerrinformation": "Über Jellyseerr",
"components.Settings.SettingsAbout.preferredmethod": "Bevorzugt",
"components.Settings.SettingsAbout.runningDevelop": "Sie benutzen den Branch<code>develop</code> von Jellyseerr, welcher nur für Entwickler, bzw. \"Bleeding-Edge\" Tests empfohlen wird.",
"components.Settings.SettingsAbout.supportoverseerr": "Unterstütze Overseerr",
"components.Settings.SettingsAbout.supportoverseerr": "Unterstütze Jellyseerr",
"components.Settings.SettingsAbout.timezone": "Zeitzone",
"components.Settings.SettingsAbout.totalmedia": "Medien insgesamt",
"components.Settings.SettingsAbout.totalrequests": "Anfragen insgesamt",
@@ -625,16 +627,16 @@
"components.Settings.SettingsJobsCache.cache": "Cache",
"components.Settings.SettingsJobsCache.cacheDescription": "Zur Leistungsoptimierung und um unnötige Anfragen zu minimieren, speichert Jellyseerr Anfragen zwischen.",
"components.Settings.SettingsJobsCache.cacheflushed": "{cachename} Cache geleert.",
"components.Settings.SettingsJobsCache.cachehits": "Cache-Treffer",
"components.Settings.SettingsJobsCache.cachehits": "Treffer",
"components.Settings.SettingsJobsCache.cachekeys": "Schlüssel insgesamt",
"components.Settings.SettingsJobsCache.cacheksize": "Schlüsselgröße",
"components.Settings.SettingsJobsCache.cachemisses": "Cache-Fehlzugriff",
"components.Settings.SettingsJobsCache.cachemisses": "Verfehlte",
"components.Settings.SettingsJobsCache.cachename": "Cache Name",
"components.Settings.SettingsJobsCache.cachevsize": "Wertgröße",
"components.Settings.SettingsJobsCache.canceljob": "Aufgabe abbrechen",
"components.Settings.SettingsJobsCache.command": "Befehl",
"components.Settings.SettingsJobsCache.download-sync": "Download Synchronisierung",
"components.Settings.SettingsJobsCache.download-sync-reset": "Download Synchronisierung Zurücksetzen",
"components.Settings.SettingsJobsCache.download-sync-reset": "Download Synchronisierung Zurücksetzung",
"components.Settings.SettingsJobsCache.editJobSchedule": "Job ändern",
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "Aktuelle Häufigkeit",
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "Häufigkeit",
@@ -660,7 +662,7 @@
"components.Settings.SettingsJobsCache.nextexecution": "Nächste Ausführung",
"components.Settings.SettingsJobsCache.plex-full-scan": "Vollständiger Plex Bibliotheken Scan",
"components.Settings.SettingsJobsCache.plex-recently-added-scan": "Scan der zuletzt hinzugefügten Plex Medien",
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Plex Merklisten Sync",
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Plex-Watchlist Sync",
"components.Settings.SettingsJobsCache.process": "Prozess",
"components.Settings.SettingsJobsCache.radarr-scan": "Radarr Scan",
"components.Settings.SettingsJobsCache.runnow": "Jetzt ausführen",
@@ -677,7 +679,7 @@
"components.Settings.SettingsLogs.level": "Schweregrad",
"components.Settings.SettingsLogs.logDetails": "Protokolldetails",
"components.Settings.SettingsLogs.logs": "Protokolle",
"components.Settings.SettingsLogs.logsDescription": "Du kannst diese Protokolle auch direkt über <code>stdout</code> oder in <code>{appDataPath}/logs/jellyseerr.log</code> anzeigen.",
"components.Settings.SettingsLogs.logsDescription": "Du kannst diese Protokolle auch direkt über <code>stdout</code> oder in <code>{appDataPath}/logs/overseerr.log</code> anzeigen.",
"components.Settings.SettingsLogs.message": "Nachricht",
"components.Settings.SettingsLogs.pauseLogs": "Pause",
"components.Settings.SettingsLogs.resumeLogs": "Fortsetzen",
@@ -685,11 +687,11 @@
"components.Settings.SettingsLogs.time": "Zeitstempel",
"components.Settings.SettingsLogs.viewdetails": "Details anzeigen",
"components.Settings.SettingsUsers.defaultPermissions": "Standardberechtigungen",
"components.Settings.SettingsUsers.defaultPermissionsTip": "Initiale Berechtigungen neuem Nutzer zugewiesen",
"components.Settings.SettingsUsers.defaultPermissionsTip": "Iniziale Berechtigungen für neue Nutzer",
"components.Settings.SettingsUsers.localLogin": "Lokale Anmeldung aktivieren",
"components.Settings.SettingsUsers.localLoginTip": "Nutzer dürfen sich mit ihrer E-Mail-Adresse und Passwort anmelden",
"components.Settings.SettingsUsers.movieRequestLimitLabel": "Globales Filmanfragen-Limit",
"components.Settings.SettingsUsers.newPlexLogin": "Aktiviere neue {mediaServerName} Anmeldung",
"components.Settings.SettingsUsers.localLoginTip": "Berechtigt Nutzer sich über E-Mail und Passwort einzuloggen, statt Plex OAuth",
"components.Settings.SettingsUsers.movieRequestLimitLabel": "Globales Filmanfragenlimit",
"components.Settings.SettingsUsers.newPlexLogin": "Aktiviere neuen {mediaServerName} Log-In",
"components.Settings.SettingsUsers.newPlexLoginTip": "Erlaube {mediaServerName} Nutzer Log-In, ohne diese zuerst importieren zu müssen",
"components.Settings.SettingsUsers.toastSettingsFailure": "Beim Speichern der Einstellungen ist ein Fehler aufgetreten.",
"components.Settings.SettingsUsers.toastSettingsSuccess": "Benutzereinstellungen erfolgreich gespeichert!",
@@ -709,15 +711,15 @@
"components.Settings.SonarrModal.default4kserver": "Standard 4K Server",
"components.Settings.SonarrModal.defaultserver": "Standardserver",
"components.Settings.SonarrModal.edit4ksonarr": "4K Sonarr Server bearbeiten",
"components.Settings.SonarrModal.editsonarr": "Sonarr Server bearbeiten",
"components.Settings.SonarrModal.editsonarr": "Sonarr-Server bearbeiten",
"components.Settings.SonarrModal.enableSearch": "Automatische Suche aktivieren",
"components.Settings.SonarrModal.externalUrl": "Externe URL",
"components.Settings.SonarrModal.hostname": "Hostname oder IP-Adresse",
"components.Settings.SonarrModal.languageprofile": "Sprachprofil",
"components.Settings.SonarrModal.loadingTags": "Lade Tags…",
"components.Settings.SonarrModal.loadinglanguageprofiles": "Sprachprofile werden geladen…",
"components.Settings.SonarrModal.loadingprofiles": "Qualitätsprofile werden geladen…",
"components.Settings.SonarrModal.loadingrootfolders": "Stammordner werden geladen…",
"components.Settings.SonarrModal.loadinglanguageprofiles": "Sprachprofile werden geladen …",
"components.Settings.SonarrModal.loadingprofiles": "Qualitätsprofile werden geladen …",
"components.Settings.SonarrModal.loadingrootfolders": "Stammordner werden geladen …",
"components.Settings.SonarrModal.notagoptions": "Keine Tags.",
"components.Settings.SonarrModal.port": "Port",
"components.Settings.SonarrModal.qualityprofile": "Qualitätsprofil",
@@ -743,16 +745,16 @@
"components.Settings.SonarrModal.validationApplicationUrlTrailingSlash": "Die URL darf nicht mit einem abschließenden Schrägstrich enden",
"components.Settings.SonarrModal.validationBaseUrlLeadingSlash": "Die Basis-URL muss einen führenden Schrägstrich haben",
"components.Settings.SonarrModal.validationBaseUrlTrailingSlash": "Die Basis-URL darf nicht mit einem abschließenden Schrägstrich enden",
"components.Settings.SonarrModal.validationHostnameRequired": "Du musst einen Hostnamen oder IP-Adresse angeben",
"components.Settings.SonarrModal.validationHostnameRequired": "Du musst einen Hostnamen oder eine IP-Adresse angeben",
"components.Settings.SonarrModal.validationLanguageProfileRequired": "Du musst ein Qualitätsprofil auswählen",
"components.Settings.SonarrModal.validationNameRequired": "Du musst einen Servernamen angeben",
"components.Settings.SonarrModal.validationPortRequired": "Du musst einen Port angeben",
"components.Settings.SonarrModal.validationProfileRequired": "Du musst ein Qualitätsprofil auswählen",
"components.Settings.SonarrModal.validationRootFolderRequired": "Du musst einen Stammordner auswählen",
"components.Settings.activeProfile": "Aktives Profil",
"components.Settings.addradarr": "Radarr Server hinzufügen",
"components.Settings.addradarr": "Radarr-Server hinzufügen",
"components.Settings.address": "Adresse",
"components.Settings.addsonarr": "Sonarr Server hinzufügen",
"components.Settings.addsonarr": "Sonarr-Server hinzufügen",
"components.Settings.advancedTooltip": "Bei falscher Konfiguration dieser Einstellung, kann dies zu einer Funktionsstörung führen",
"components.Settings.cancelscan": "Durchsuchung abbrechen",
"components.Settings.copied": "API-Schlüssel in die Zwischenablage kopiert.",
@@ -788,12 +790,12 @@
"components.Settings.notificationsettings": "Benachrichtigungseinstellungen",
"components.Settings.notrunning": "Nicht aktiv",
"components.Settings.plex": "Plex",
"components.Settings.plexlibraries": "Plex Bibliotheken",
"components.Settings.plexlibrariesDescription": "Die Bibliotheken, welche Jellyseerr nach Titeln durchsucht. Richte deine Plex Verbindungseinstellungen ein und speichere sie. Sollten keine aufgelistet sein, klicke auf die Schaltfläche weiter unten.",
"components.Settings.plexsettings": "Plex Einstellungen",
"components.Settings.plexlibraries": "Plex-Bibliotheken",
"components.Settings.plexlibrariesDescription": "Die Bibliotheken, welche Jellyseerr nach Titeln durchsucht. Richte deine Plex Verbindungseinstellungen ein und speichere sie. Sollten keine aufgelistet sein, klicke auf den Button weiter unten.",
"components.Settings.plexsettings": "Plex-Einstellungen",
"components.Settings.plexsettingsDescription": "Konfiguriere die Einstellungen deines Plex Servers. Jellyseerr durchsucht deine Plex Bibliotheken zur Feststellung der verfügbaren Inhalte.",
"components.Settings.port": "Port",
"components.Settings.radarrsettings": "Radarr Einstellungen",
"components.Settings.radarrsettings": "Radarr-Einstellungen",
"components.Settings.restartrequiredTooltip": "Jellyseerr muss neu gestartet werden, damit Änderungen angewendet werden können",
"components.Settings.scan": "Bibliotheken synchronisieren",
"components.Settings.scanning": "Synchronisieren…",
@@ -801,29 +803,29 @@
"components.Settings.serverRemote": "entfernt",
"components.Settings.serverSecure": "Sicher",
"components.Settings.serverpreset": "Server",
"components.Settings.serverpresetLoad": "Klicke auf die Schaltfläche, um verfügbare Server zu laden",
"components.Settings.serverpresetLoad": "Drück den Knopf, um verfügbare Server zu laden",
"components.Settings.serverpresetManualMessage": "Manuelle Konfiguration",
"components.Settings.serverpresetRefreshing": "Rufe Server ab…",
"components.Settings.serverpresetRefreshing": "Rufe Server ab …",
"components.Settings.serviceSettingsDescription": "Konfiguriere unten deine {serverType}-Server. Du kannst mehrere {serverType}-Server verbinden, aber nur zwei davon können als Standard markiert werden (ein Nicht-4K- und ein 4K-Server). Administratoren können den Server überschreiben, auf dem neue Anfragen vor der Genehmigung verarbeitet werden.",
"components.Settings.services": "Dienste",
"components.Settings.services": "Dienstleistungen",
"components.Settings.settingUpPlexDescription": "Um Plex einzurichten, können die Daten manuell eintragen oder einen Server ausgewählt werden, welcher von <RegisterPlexTVLink>plex.tv</RegisterPlexTVLink> abgerufen wurde. Drück den Knopf rechts neben dem Dropdown-Menü, um die Liste der verfügbaren Server abzurufen.",
"components.Settings.sonarrsettings": "Sonarr Einstellungen",
"components.Settings.sonarrsettings": "Sonarr-Einstellungen",
"components.Settings.ssl": "SSL",
"components.Settings.startscan": "Durchsuchung starten",
"components.Settings.tautulliApiKey": "API-Schlüssel",
"components.Settings.tautulliSettings": "Tautulli Einstellungen",
"components.Settings.tautulliSettingsDescription": "Optionale Einstellungen für den Tautulli-Server konfigurieren. Jellyseerr holt die Überwachungsdaten für Ihre Plex-Medien von Tautulli.",
"components.Settings.toastPlexConnecting": "Versuche mit Plex zu verbinden…",
"components.Settings.toastPlexConnecting": "Versuche mit Plex zu verbinden …",
"components.Settings.toastPlexConnectingFailure": "Verbindung zu Plex fehlgeschlagen.",
"components.Settings.toastPlexConnectingSuccess": "Plex Verbindung erfolgreich hergestellt!",
"components.Settings.toastPlexRefresh": "Abrufen der Serverliste von Plex…",
"components.Settings.toastPlexRefreshFailure": "Fehler beim Abrufen der Plex Serverliste.",
"components.Settings.toastPlexRefreshSuccess": "Plex Serverliste erfolgreich abgerufen!",
"components.Settings.toastTautulliSettingsFailure": "Beim Speichern der Tautulli Einstellungen ist etwas schief gegangen.",
"components.Settings.toastTautulliSettingsSuccess": "Tautulli Einstellungen erfolgreich gespeichert!",
"components.Settings.toastPlexConnectingSuccess": "Plex-Verbindung erfolgreich hergestellt!",
"components.Settings.toastPlexRefresh": "Abrufen der Serverliste von Plex …",
"components.Settings.toastPlexRefreshFailure": "Fehler beim Abrufen der Plex-Serverliste.",
"components.Settings.toastPlexRefreshSuccess": "Plex-Serverliste erfolgreich abgerufen!",
"components.Settings.toastTautulliSettingsFailure": "Beim Speichern der Tautulli-Einstellungen ist etwas schief gegangen.",
"components.Settings.toastTautulliSettingsSuccess": "Tautulli-Einstellungen erfolgreich gespeichert!",
"components.Settings.urlBase": "URL-Basis",
"components.Settings.validationApiKey": "Die Angabe eines API-Schlüssels ist erforderlich",
"components.Settings.validationHostnameRequired": "Ein gültiger Hostnamen oder IP-Adresse muss angeben werden",
"components.Settings.validationHostnameRequired": "Ein gültiger Hostnamen oder eine IP-Adresse muss angeben werden",
"components.Settings.validationPortRequired": "Du musst einen gültigen Port angeben",
"components.Settings.validationUrl": "Die Angabe einer gültigen URL ist erforderlich",
"components.Settings.validationUrlBaseLeadingSlash": "Die URL-Basis muss einen Schrägstrich enthalten",
@@ -836,7 +838,7 @@
"components.Setup.configureservices": "Dienste konfigurieren",
"components.Setup.continue": "Fortfahren",
"components.Setup.finish": "Konfiguration beenden",
"components.Setup.finishing": "Fertigstellung…",
"components.Setup.finishing": "Fertigstellung …",
"components.Setup.setup": "Einrichtung",
"components.Setup.signinMessage": "Melde dich zunächst an",
"components.Setup.welcome": "Willkommen bei Jellyseerr",
@@ -866,7 +868,7 @@
"components.TvDetails.episodeRuntimeMinutes": "{runtime} Minuten",
"components.TvDetails.firstAirDate": "Erstausstrahlung",
"components.TvDetails.manageseries": "Serie verwalten",
"components.TvDetails.network": "{networkCount, plural, one {Netzwerk} other {Netzwerke}}",
"components.TvDetails.network": "{networkCount, plural, one {Anbieter} other {Anbieter}}",
"components.TvDetails.nextAirDate": "Nächstes Sendedatum",
"components.TvDetails.originallanguage": "Originalsprache",
"components.TvDetails.originaltitle": "Originaltitel",
@@ -899,15 +901,15 @@
"components.UserList.deleteconfirm": "Möchtest du diesen Benutzer wirklich löschen? Alle seine Anfragendaten werden dauerhaft entfernt.",
"components.UserList.deleteuser": "Benutzer löschen",
"components.UserList.edituser": "Benutzerberechtigungen Bearbeiten",
"components.UserList.email": "E-Mail Adresse",
"components.UserList.importedfromplex": "<strong>{userCount}</strong> Plex {userCount, Plural, one {Benutzer} other {Benutzer}} erfolgreich importiert!",
"components.UserList.email": "E-Mail-Adresse",
"components.UserList.importedfromplex": "<strong>{userCount}</strong> {userCount, Plural, ein {Benutzer} other {Benutzer}} Plex-Benutzer erfolgreich importiert!",
"components.UserList.importfrommediaserver": "{mediaServerName}-Benutzer importieren",
"components.UserList.importfromplex": "Plex Benutzer importieren",
"components.UserList.importfromplexerror": "Beim Importieren von Plex Benutzern ist etwas schief gelaufen.",
"components.UserList.importfromplex": "Plex-Benutzer importieren",
"components.UserList.importfromplexerror": "Beim Importieren von Plex-Benutzern ist etwas schief gelaufen.",
"components.UserList.localLoginDisabled": "Die Einstellung <strong>Lokale Anmeldung aktivieren</strong> ist derzeit deaktiviert.",
"components.UserList.localuser": "Lokaler Benutzer",
"components.UserList.newplexsigninenabled": "Die Einstellung <strong>Aktiviere neuen Plex Log-In</strong> ist derzeit aktiviert. Plex-Benutzer mit Bibliothekszugang müssen nicht importiert werden, um sich anmelden zu können.",
"components.UserList.nouserstoimport": "Es gibt keine zu importierenden Plex Benutzer.",
"components.UserList.nouserstoimport": "Es gibt keine zu importierenden Plex-Benutzer.",
"components.UserList.owner": "Besitzer",
"components.UserList.password": "Passwort",
"components.UserList.passwordinfodescription": "Konfiguriere eine Anwendungs-URL und aktiviere E-Mail-Benachrichtigungen, um die automatische Kennwortgenerierung zu ermöglichen.",
@@ -923,9 +925,9 @@
"i18n.experimental": "Experimentell",
"components.UserList.userssaved": "Benutzerberechtigungen erfolgreich gespeichert!",
"i18n.advanced": "Erweitert",
"components.UserList.validationEmail": "E-Mail Adresse benötigt",
"components.UserList.validationEmail": "E-Mail-Adresse benötigt",
"components.UserList.users": "Benutzer",
"components.UserProfile.recentrequests": "Bisherige Anfragen",
"components.UserProfile.recentrequests": "Kürzliche Anfragen",
"components.UserProfile.UserSettings.menuPermissions": "Berechtigungen",
"components.UserProfile.UserSettings.menuNotifications": "Benachrichtigungen",
"components.UserProfile.UserSettings.menuGeneralSettings": "Allgemein",
@@ -936,11 +938,11 @@
"components.UserProfile.UserSettings.UserPasswordChange.validationNewPasswordLength": "Passwort ist zu kurz; es sollte mindestens 8 Zeichen lang sein",
"components.UserProfile.UserSettings.UserPasswordChange.validationNewPassword": "Du musst ein neues Passwort angeben",
"components.UserProfile.UserSettings.UserPasswordChange.validationCurrentPassword": "Du musst dein aktuelles Passwort angeben",
"components.UserProfile.UserSettings.UserPasswordChange.validationConfirmPasswordSame": "Das Passwort muss übereinstimmen",
"components.UserProfile.UserSettings.UserPasswordChange.validationConfirmPasswordSame": "Passwörter mussen übereinstimmen",
"components.UserProfile.UserSettings.UserPasswordChange.validationConfirmPassword": "Du musst das neue Passwort bestätigen",
"components.UserProfile.UserSettings.UserPasswordChange.toastSettingsSuccess": "Passwort erfolgreich geändert!",
"components.UserProfile.UserSettings.UserPasswordChange.toastSettingsFailure": "Beim Speichern des Passworts ist ein Fehler aufgetreten.",
"components.UserProfile.UserSettings.UserPasswordChange.password": "Passwort ändern",
"components.UserProfile.UserSettings.UserPasswordChange.password": "Passwort",
"components.UserProfile.UserSettings.UserPasswordChange.newpassword": "Neues Passwort",
"components.UserProfile.UserSettings.UserPasswordChange.currentpassword": "Aktuelles Passwort",
"components.UserProfile.UserSettings.UserPasswordChange.confirmpassword": "Passwort bestätigen",
@@ -948,7 +950,7 @@
"components.UserProfile.UserSettings.UserNotificationSettings.discordId": "Benutzer-ID",
"components.UserProfile.UserSettings.UserGeneralSettings.toastSettingsSuccess": "Einstellungen erfolgreich gespeichert!",
"components.UserProfile.UserSettings.UserGeneralSettings.toastSettingsFailure": "Beim Speichern der Einstellungen ist etwas schief gelaufen.",
"components.UserProfile.UserSettings.UserGeneralSettings.plexuser": "Plex Benutzer",
"components.UserProfile.UserSettings.UserGeneralSettings.plexuser": "Plex-Benutzer",
"components.UserProfile.UserSettings.UserGeneralSettings.localuser": "Lokaler Benutzer",
"components.UserProfile.UserSettings.UserGeneralSettings.generalsettings": "Allgemeine Einstellungen",
"components.UserProfile.UserSettings.UserGeneralSettings.displayName": "Anzeigename",
@@ -960,14 +962,14 @@
"components.UserProfile.UserSettings.UserGeneralSettings.regionTip": "Filtere Inhalte nach regionaler Verfügbarkeit",
"components.UserProfile.UserSettings.UserGeneralSettings.region": "Region Entdecken",
"components.UserProfile.UserSettings.UserGeneralSettings.originallanguageTip": "Filtere Inhalte nach Originalsprache",
"components.UserProfile.UserSettings.UserGeneralSettings.originallanguage": "Sprache des Bereiches \"Entdecken\"",
"components.UserProfile.UserSettings.UserGeneralSettings.originallanguage": "Sprache Entdecken",
"components.UserProfile.UserSettings.UserPasswordChange.nopermissionDescription": "Sie haben keine Berechtigung, das Kennwort dieses Benutzers zu ändern.",
"components.UserProfile.UserSettings.UserGeneralSettings.user": "Benutzer",
"components.UserProfile.UserSettings.UserGeneralSettings.role": "Rolle",
"components.UserProfile.UserSettings.UserGeneralSettings.owner": "Besitzer",
"components.UserProfile.UserSettings.UserGeneralSettings.admin": "Admin",
"components.UserProfile.UserSettings.UserGeneralSettings.accounttype": "Kontotyp",
"i18n.loading": "Lade…",
"i18n.loading": "Lade …",
"components.UserProfile.UserSettings.UserNotificationSettings.validationTelegramChatId": "Du musst eine gültige Chat-ID angeben",
"components.UserProfile.UserSettings.UserNotificationSettings.telegramChatIdTipLong": "<TelegramBotLink>Starte einen Chat</TelegramBotLink>, füge <GetIdBotLink>@get_id_bot</GetIdBotLink> hinzu, und führe den Befehl <code>/my_id</code> aus",
"components.UserProfile.UserSettings.UserNotificationSettings.telegramChatId": "Chat-ID",
@@ -975,8 +977,8 @@
"components.UserProfile.UserSettings.UserNotificationSettings.sendSilently": "Lautlos senden",
"components.UserProfile.ProfileHeader.userid": "Benutzer-ID: {userid}",
"components.UserProfile.ProfileHeader.joindate": "Mitglied seit dem {joindate}",
"components.UserProfile.UserSettings.unauthorizedDescription": "Du hast keine Berechtigung, die Einstellungen dieses Benutzers zu ändern.",
"components.UserProfile.UserSettings.UserPermissions.unauthorizedDescription": "Du kannst deine eigenen Berechtigungen nicht ändern.",
"components.UserProfile.UserSettings.unauthorizedDescription": "Sie haben keine Berechtigung, die Einstellungen dieses Benutzers zu ändern.",
"components.UserProfile.UserSettings.UserPermissions.unauthorizedDescription": "Sie können Ihre eigenen Berechtigungen nicht ändern.",
"pages.errormessagewithcode": "{statusCode} - {error}",
"pages.somethingwentwrong": "Etwas ist schief gelaufen",
"pages.serviceunavailable": "Dienst nicht verfügbar",
@@ -993,14 +995,14 @@
"i18n.testing": "Testen…",
"i18n.test": "Test",
"i18n.status": "Status",
"i18n.showingresults": "Zeige <strong>{from}</strong> bis <strong>{to}</strong> von <strong>{total}</strong> Ergebnisse",
"i18n.showingresults": "Zeige <strong>{from}</strong> bis <strong>{to}</strong> von <strong>{total}</strong> Ergebnissen",
"i18n.saving": "Speichern…",
"i18n.save": "Änderungen speichern",
"i18n.retrying": "Wiederholen…",
"i18n.resultsperpage": "Zeige {pageSize} Ergebnisse pro Seite",
"i18n.requesting": "Anfordern…",
"i18n.request4k": "In 4K anfragen",
"i18n.previous": "Zurück",
"i18n.previous": "Bisherige",
"i18n.notrequested": "Nicht Angefragt",
"i18n.noresults": "Keine Ergebnisse.",
"i18n.next": "Weiter",
@@ -1031,72 +1033,77 @@
"components.UserProfile.UserSettings.UserGeneralSettings.seriesrequestlimit": "Serienanfragenlimit",
"components.UserProfile.UserSettings.UserGeneralSettings.movierequestlimit": "Filmanfragenlimit",
"components.UserProfile.UserSettings.UserGeneralSettings.enableOverride": "Überschreibe globales Limit",
"components.UserList.usercreatedfailedexisting": "Die angegebene E-Mail Adresse wird bereits von einem anderen Benutzer verwendet.",
"components.UserList.usercreatedfailedexisting": "Die angegebene E-Mail-Adresse wird bereits von einem anderen Benutzer verwendet.",
"components.UserProfile.UserSettings.UserGeneralSettings.languageDefault": "Standard ({language})",
"components.UserProfile.UserSettings.UserNotificationSettings.webpush": "Web Push",
"components.UserProfile.UserSettings.UserGeneralSettings.applanguage": "Anzeigesprache",
"components.UserProfile.UserSettings.UserGeneralSettings.discordId": "Discord Benutzer ID",
"components.UserProfile.UserSettings.UserGeneralSettings.discordIdTip": "Die <FindDiscordIdLink>mehrstellige ID-Nummer</FindDiscordIdLink> deines Discord-Accounts",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "Filme automatisch aus Plex-Merkliste anfragen",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "Automatisch Filme aus deiner <PlexWatchlistSupportLink>Plex Merkliste</PlexWatchlistSupportLink> anfordern",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Serien automatisch aus Plex-Merkliste anfragen",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "Automatisch Serien aus deiner <PlexWatchlistSupportLink>Plex Merkliste</PlexWatchlistSupportLink> anfragen",
"components.UserProfile.UserSettings.UserGeneralSettings.validationDiscordId": "Du musst eine gültige Discord Benutzer ID angeben",
"components.UserProfile.UserSettings.UserGeneralSettings.applanguage": "Sprache darstellen",
"components.UserProfile.UserSettings.UserGeneralSettings.discordId": "Discord User ID",
"components.UserProfile.UserSettings.UserGeneralSettings.discordIdTip": "Die <FindDiscordIdLink>mehrstellige ID-Nummer</FindDiscordIdLink> Deines Discord-Accounts",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "Filme automatisch anfragen",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "Automatisch Filme auf deiner <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> anfordern",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Serien automatisch anfragen",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "Automatisch Serien auf deiner <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> anfragen",
"components.UserProfile.UserSettings.UserGeneralSettings.validationDiscordId": "Du musst eine gültige Discord User ID angeben",
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletAccessToken": "Zugangs-Token",
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletAccessTokenTip": "Erstelle ein Token aus deinen <PushbulletSettingsLink>Kontoeinstellungen</PushbulletSettingsLink>",
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletsettingsfailed": "Die Einstellungen für Pushbullet-Benachrichtigungen konnten nicht gespeichert werden.",
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletsettingssaved": "Pushbullet-Benachrichtigungseinstellungen erfolgreich gespeichert!",
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverApplicationToken": "Anwendungs API-Token",
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverApplicationTokenTip": "<ApplicationRegistrationLink>Registriere eine Anwendung</ApplicationRegistrationLink> zur Verwendung mit {applicationTitle}",
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverApplicationToken": "Anwendungs-API-Token",
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverApplicationTokenTip": "<ApplicationRegistrationLink>Register eine Anwendung</ApplicationRegistrationLink> zur Verwendung mit {applicationTitle}",
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverUserKey": "Benutzer- oder Gruppenschlüssel",
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverUserKeyTip": "Die 30-stellige <UsersGroupsLink>Benutzer- oder Gruppenkennung</UsersGroupsLink>",
"components.UserProfile.UserSettings.UserNotificationSettings.pushoversettingsfailed": "Die Einstellungen für die Pushover-Benachrichtigung konnten nicht gespeichert werden.",
"components.UserProfile.UserSettings.UserNotificationSettings.pushoversettingssaved": "Pushover-Benachrichtigungseinstellungen erfolgreich gespeichert!",
"components.UserProfile.UserSettings.UserNotificationSettings.validationPushbulletAccessToken": "Ein Zugriffstoken muss angegeben werden",
"components.UserProfile.UserSettings.UserNotificationSettings.validationPushoverApplicationToken": "Du musst einen gültigen Anwendungs-Token angeben",
"components.UserProfile.UserSettings.UserNotificationSettings.validationPushoverApplicationToken": "Sie müssen ein gültiges Anwendungs-Token angeben",
"components.UserProfile.UserSettings.UserNotificationSettings.validationPushoverUserKey": "Du musst einen gültigen Benutzer- oder Gruppenschlüssel angeben",
"i18n.resolved": "Gelöst",
"i18n.importing": "Importieren…",
"i18n.import": "Importieren",
"components.UserProfile.recentlywatched": "Kürzlich angesehen",
"i18n.restartRequired": "Neustart erforderlich",
"components.UserProfile.emptywatchlist": "Hier erscheinen deine zur <PlexWatchlistSupportLink>Plex Merkliste</PlexWatchlistSupportLink> hinzugefügte Medien.",
"components.UserProfile.plexwatchlist": "Plex Merkliste",
"components.UserProfile.emptywatchlist": "Hier erscheinen deine zur <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> hinzugefügte Medien.",
"components.UserProfile.plexwatchlist": "Plex Watchlist",
"components.Discover.DiscoverTvKeyword.keywordSeries": "{keywordTitle} Serien",
"components.Discover.moviegenres": "Film Genre",
"components.Discover.studios": "Studios",
"components.Discover.tmdbmoviegenre": "TMDB Film Genre",
"components.Discover.tmdbtvgenre": "TMDB Serien Genre",
"components.Discover.tmdbtvkeyword": "TMDB Serien Stichwort",
"components.Discover.tmdbtvkeyword": "TMDB Serien Keyword",
"components.Discover.tvgenres": "Serien Genre",
"components.Settings.SettingsMain.apikey": "API-Schlüssel",
"components.Settings.SettingsMain.csrfProtection": "Aktivere CSRF Schutz",
"components.Settings.SettingsMain.applicationTitle": "Anwendungstitel",
"components.Settings.SettingsMain.csrfProtectionTip": "Limitiere externen API Zugriff auf Lese-Operationen (erfordert HTTPS)",
"components.Settings.SettingsMain.general": "Allgemein",
"components.Settings.SettingsMain.generalsettings": "Allgemeine Einstellungen",
"components.Settings.SettingsMain.locale": "Anzeigesprache",
"components.Settings.SettingsMain.hideAvailable": "Verfügbare Medien ausblenden",
"components.Settings.SettingsMain.toastApiKeySuccess": "Neuer API Schlüssel erfolgreich generiert!",
"components.Settings.SettingsMain.validationApplicationUrl": "Du musst eine valide URL angeben",
"components.Settings.SettingsMain.trustProxy": "Proxyunterstützung aktivieren",
"components.Settings.SettingsMain.validationApplicationUrl": "Du musst eine valide URL spezifizieren",
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "Die URL darf nicht mit einem Slash \"/\" enden",
"components.Discover.DiscoverMovieKeyword.keywordMovies": "{keywordTitle} Filme",
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Deine Merkliste",
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Deine Watchlist",
"components.Discover.tmdbsearch": "TMDB Suche",
"components.Settings.SettingsMain.toastApiKeyFailure": "Etwas ist schiefgelaufen während der Generierung eines neuen API Schlüssels.",
"components.Settings.SettingsMain.toastSettingsSuccess": "Einstellungen erfolgreich gespeichert!",
"components.Discover.tmdbmoviekeyword": "TMDB Film Stichwort",
"components.Settings.SettingsMain.validationApplicationTitle": "Du musst einen Anwendungstitel angeben",
"components.Discover.PlexWatchlistSlider.emptywatchlist": "Medien in deiner <PlexWatchlistSupportLink>Plex Merkliste</PlexWatchlistSupportLink> erscheinen hier.",
"components.Discover.tmdbmoviekeyword": "TMDB Film Keyword",
"components.Settings.SettingsMain.validationApplicationTitle": "Du musst einen Anwendungstitel spezifizieren",
"components.Discover.PlexWatchlistSlider.emptywatchlist": "Medien in deiner <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> erscheinen hier.",
"components.Settings.SettingsMain.cacheImagesTip": "Cache extern gehostete Bilder (erfordert eine beträchtliche Menge an Speicherplatz)",
"components.Settings.SettingsMain.csrfProtectionHoverTip": "Aktiviere diese Einstellung nur wenn du weißt was du tust!",
"components.Discover.networks": "Sender",
"components.Discover.tmdbstudio": "TMDB Studio",
"components.Settings.SettingsMain.applicationurl": "Anwendung URL",
"components.Settings.SettingsMain.cacheImages": "Bild-Caching aktivieren",
"components.Settings.SettingsMain.generalsettingsDescription": "Globale- und Standardeinstellungen für Jellyseerr konfigurieren.",
"components.Settings.SettingsMain.originallanguage": "Sprache des Bereiches \"Entdecken\"",
"components.Settings.SettingsMain.originallanguage": "\"Entdecken\" Sprache",
"components.Settings.SettingsMain.partialRequestsEnabled": "Teilweise Serienanfragen zulassen",
"components.Settings.SettingsMain.toastSettingsFailure": "Beim Speichern der Einstellungen ist ein Fehler aufgetreten.",
"components.Discover.tmdbnetwork": "TMDB Sender",
"components.Settings.SettingsMain.originallanguageTip": "Inhalt nach Originalsprache filtern",
"components.Settings.SettingsMain.trustProxyTip": "Erlaube Jellyseerr die Client-IP-Adressen hinter einem Proxy korrekt zu erfassen",
"components.Discover.CreateSlider.addSlider": "Slider hinzufügen",
"components.Discover.CreateSlider.addcustomslider": "Benutzerdefinierten Slider erstellen",
"components.Discover.CreateSlider.addfail": "Neuer Slider konnte nicht erstellt werden.",
@@ -1110,22 +1117,22 @@
"components.Discover.CreateSlider.nooptions": "Keine Ergebnisse.",
"components.Discover.CreateSlider.providetmdbgenreid": "Hinterlege eine TMDB Genre ID",
"components.Discover.CreateSlider.providetmdbkeywordid": "Hinterlege eine TMDB Keyword ID",
"components.Discover.CreateSlider.providetmdbnetwork": "Hinterlege eine TMDB Netzwerk ID",
"components.Discover.CreateSlider.providetmdbnetwork": "Hinterlege eine TMDB Network ID",
"components.Discover.CreateSlider.providetmdbsearch": "Geben Sie eine Suchanfrage an",
"components.Discover.CreateSlider.validationTitlerequired": "Du musst einen Titel eingeben.",
"components.Discover.DiscoverSliderEdit.remove": "Entfernen",
"components.Discover.DiscoverSliderEdit.deletefail": "Slider konnte nicht gelöscht werden.",
"components.Discover.DiscoverSliderEdit.deletesuccess": "Slider erfolgreich entfernt.",
"components.Discover.DiscoverMovies.discovermovies": "Filme",
"components.Discover.DiscoverMovies.sortReleaseDateAsc": "Erscheinungsdatum (aufsteigend)",
"components.Discover.DiscoverMovies.sortReleaseDateDesc": "Erscheinungsdatum (absteigend)",
"components.Discover.DiscoverMovies.sortTitleAsc": "Titel (A-Z) (aufsteigend)",
"components.Discover.DiscoverMovies.sortTitleDesc": "Titel (Z-A) (absteigend)",
"components.Discover.DiscoverMovies.sortReleaseDateAsc": "Erscheinungsdatum Aufsteigend",
"components.Discover.DiscoverMovies.sortReleaseDateDesc": "Erscheinungsdatum Absteigend",
"components.Discover.DiscoverMovies.sortTitleAsc": "Titel (A-Z) Aufsteigend",
"components.Discover.DiscoverMovies.sortTitleDesc": "Titel (Z-A) Absteigend",
"components.Discover.DiscoverTv.discovertv": "Serien",
"components.Discover.DiscoverTv.sortFirstAirDateDesc": "Erstausstrahlung (absteigend)",
"components.Discover.DiscoverTv.sortFirstAirDateAsc": "Erstausstrahlung (aufsteigend)",
"components.Discover.DiscoverTv.sortPopularityAsc": "Beliebtheit (aufsteigend)",
"components.Discover.DiscoverTv.sortPopularityDesc": "Beliebtheit (absteigend)",
"components.Discover.DiscoverTv.sortFirstAirDateDesc": "Erstausstrahlung (Absteigend)",
"components.Discover.DiscoverTv.sortFirstAirDateAsc": "Erstausstrahlung (Aufsteigend)",
"components.Discover.DiscoverTv.sortPopularityAsc": "Beliebtheit (Aufsteigend)",
"components.Discover.DiscoverTv.sortPopularityDesc": "Beliebtheit (Absteigend)",
"components.Discover.CreateSlider.slidernameplaceholder": "Name des Slider",
"components.Settings.SettingsJobsCache.availability-sync": "Medienverfügbarkeit Sync",
"components.Discover.FilterSlideover.activefilters": "{count, plural, one {# Aktiver Filter} other {# Aktive Filter}}",
@@ -1144,22 +1151,22 @@
"components.Discover.CreateSlider.starttyping": "Start der Suche durch Tippen.",
"components.Discover.CreateSlider.validationDatarequired": "Du musst einen Datenwert angeben.",
"components.Discover.DiscoverSliderEdit.enable": "Sichtbarkeit umschalten",
"components.Discover.customizediscover": "Entdecken anpassen",
"components.Discover.resetfailed": "Beim Zurücksetzen der Entdecken-Einstellungen ist etwas schief gelaufen.",
"components.Discover.customizediscover": "Discover anpassen",
"components.Discover.resetfailed": "Beim Zurücksetzen der Entdecken-Einstellungen ist etwas schief gegangen.",
"components.Discover.resetsuccess": "Die Entdecken-Einstellungen wurden erfolgreich zurückgesetzt.",
"components.Discover.stopediting": "Bearbeitung stoppen",
"components.Discover.resettodefault": "Zurücksetzen auf Standard",
"components.Discover.resetwarning": "Setzt alle Slider auf die Standardwerte zurück. Dadurch werden auch alle benutzerdefinierten Slider gelöscht!",
"components.Discover.DiscoverMovies.activefilters": "{count, plural, one {# Aktiver Filter} other {# Aktive Filter}}",
"components.Discover.DiscoverMovies.sortPopularityAsc": "Beliebtheit (aufsteigend)",
"components.Discover.DiscoverMovies.sortPopularityDesc": "Beliebtheit (absteigend)",
"components.Discover.DiscoverMovies.sortTmdbRatingAsc": "TMDB-Bewertung (aufsteigend)",
"components.Discover.DiscoverMovies.sortTmdbRatingDesc": "TMDB-Bewertung (absteigend)",
"components.Discover.DiscoverMovies.sortPopularityAsc": "Beliebtheit aufsteigend",
"components.Discover.DiscoverMovies.sortPopularityDesc": "Beliebtheit absteigend",
"components.Discover.DiscoverMovies.sortTmdbRatingAsc": "TMDB-Bewertung aufsteigend",
"components.Discover.DiscoverMovies.sortTmdbRatingDesc": "TMDB-Bewertung Absteigend",
"components.Discover.DiscoverTv.activefilters": "{count, plural, one {# Aktiver Filter} other {# Aktive Filter}}",
"components.Discover.DiscoverTv.sortTitleAsc": "Titel (A-Z) (aufsteigend)",
"components.Discover.DiscoverTv.sortTitleDesc": "Titel (Z-A) (absteigend)",
"components.Discover.DiscoverTv.sortTmdbRatingAsc": "TMDB-Bewertung (aufsteigend)",
"components.Discover.DiscoverTv.sortTmdbRatingDesc": "TMDB-Bewertung (absteigend)",
"components.Discover.DiscoverTv.sortTitleAsc": "Titel (A-Z) Aufsteigend",
"components.Discover.DiscoverTv.sortTitleDesc": "Titel (Z-A) Absteigend",
"components.Discover.DiscoverTv.sortTmdbRatingAsc": "TMDB-Bewertung aufsteigend",
"components.Discover.DiscoverTv.sortTmdbRatingDesc": "TMDB-Bewertung Absteigend",
"components.Discover.FilterSlideover.clearfilters": "Aktive Filter löschen",
"components.Discover.FilterSlideover.filters": "Filter",
"components.Discover.FilterSlideover.firstAirDate": "Datum der Erstausstrahlung",
@@ -1181,7 +1188,7 @@
"components.Discover.tmdbmoviestreamingservices": "TMDB Film-Streaming-Dienste",
"components.Discover.tmdbtvstreamingservices": "TMDB TV-Streaming-Dienste",
"i18n.collection": "Sammlung",
"components.Discover.FilterSlideover.tmdbuservotecount": "Anzahl an TMDB-Benutzerbewertungen",
"components.Discover.FilterSlideover.tmdbuservotecount": "Anzahl an TMDB Benutzerbewertungen",
"components.Settings.RadarrModal.tagRequestsInfo": "Füge automatisch ein Tag hinzu mit der ID und dem Namen des anfordernden Nutzers",
"components.MovieDetails.imdbuserscore": "IMDB Nutzer Bewertung",
"components.Settings.SonarrModal.tagRequests": "Tag Anforderungen",
@@ -1189,13 +1196,13 @@
"components.Settings.SonarrModal.tagRequestsInfo": "Füge automatisch einen zusätzlichen Tag mit der ID & Namen des anfordernden Nutzers",
"components.Layout.UserWarnings.passwordRequired": "Ein Passwort ist erforderlich.",
"components.Login.description": "Da du dich zum ersten Mal bei {applicationName} anmeldest, musst du eine gültige E-Mail-Adresse angeben.",
"components.Layout.UserWarnings.emailRequired": "E-Mail Adresse ist erforderlich.",
"components.Layout.UserWarnings.emailInvalid": "E-Mail Adresse ist nicht gültig.",
"components.Layout.UserWarnings.emailRequired": "E-Mail ist erforderlich.",
"components.Layout.UserWarnings.emailInvalid": "E-Mail ist nicht valide.",
"components.Login.credentialerror": "Der Benutzername oder das Passwort ist falsch.",
"components.Login.emailtooltip": "Die Adresse muss nicht mit Ihrer {mediaServerName}-Instanz verbunden sein.",
"components.Login.initialsignin": "Verbinde",
"components.Login.initialsigningin": "Verbinden…",
"components.Login.save": "Hinzufügen",
"components.Login.save": "hinzufügen",
"components.Login.saving": "Hinzufügen…",
"components.Login.signinwithjellyfin": "Verwende dein {mediaServerName} Konto",
"components.Login.title": "E-Mail hinzufügen",
@@ -1226,9 +1233,9 @@
"components.Setup.signin": "Anmelden",
"components.Setup.signinWithJellyfin": "Gib deine Jellyfin Daten ein",
"components.Setup.signinWithPlex": "Gib deine Plex Daten ein",
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> Erfolgreich aus der Merkliste entfernt!",
"components.TitleCard.watchlistError": "Ein Fehler ist aufgetreten. Bitte versuche es erneut.",
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong> erfolgreich zur Merkliste hinzugefügt!",
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> Erfolgreich von der Beobachtungsliste entfernt!",
"components.TitleCard.watchlistError": "Etwas ist schief gelaufen, versuche es noch einmal.",
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong> erfolgreich zur Beobachtungsliste hinzugefügt!",
"components.TvDetails.play": "Wiedergabe auf {mediaServerName}",
"components.TvDetails.play4k": "4K abspielen auf {mediaServerName}",
"components.UserList.importfromJellyfin": "Importieren von {mediaServerName} Benutzern",
@@ -1251,21 +1258,21 @@
"i18n.open": "Offen",
"i18n.pending": "Ausstehend",
"i18n.processing": "Verarbeitung",
"i18n.request": "Anfrage senden",
"i18n.request": "Anfrage",
"i18n.requested": "Angefragt",
"i18n.retry": "Wiederholen",
"i18n.tvshows": "Serie",
"i18n.unavailable": "Nicht verfügbar",
"pages.oops": "Hoppla",
"pages.oops": "Huch!",
"components.MovieDetails.openradarr": "Film in Radarr öffnen",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Gerätestandard",
"components.Settings.RadarrModal.tagRequests": "Tag-Anfragen",
"components.Settings.SettingsAbout.supportjellyseerr": "Unterstütze Jellyseerr",
"components.Settings.SettingsAbout.supportjellyseerr": "Jellyseerr unterstützen",
"components.Settings.jellyfinSettingsDescription": "Konfiguriere optional die internen und externen Endpunkte für deinen {mediaServerName} Server. In den meisten Fällen ist die externe URL eine andere als die interne URL. Für die Anmeldung bei {mediaServerName} kann auch eine benutzerdefinierte URL zum Zurücksetzen des Passworts festgelegt werden, falls du auf eine andere Seite zum Zurücksetzen des Passworts umleiten möchtest. Du kannst auch selber einen API Key für Jellyfin anlegen, was bisher automatisch geschah.",
"components.Settings.jellyfinSettingsFailure": "Beim Speichern der Einstellungen von {mediaServerName} ist ein Fehler aufgetreten.",
"components.Settings.manualscanDescriptionJellyfin": "Normalerweise wird dieser Vorgang nur einmal alle 24 Stunden durchgeführt. Jellyseerr wird die kürzlich hinzugefügten Bibliotheken deines {mediaServerName} Servers aggressiver überprüfen. Wenn dies das erste Mal ist, dass du Jellyseerr konfigurierst, wird ein einmaliger vollständiger manueller Bibliotheks-Scan empfohlen!",
"components.Settings.save": "Änderungen speichern",
"components.Settings.Notifications.userEmailRequired": "Benutzer E-Mail erforderlich",
"components.Settings.Notifications.userEmailRequired": "Benutzer-E-Mail erforderlich",
"components.Settings.Notifications.NotificationsPushover.sound": "Benachrichtigungston",
"components.Settings.SonarrModal.seriesType": "TV-Serie Typ",
"components.Settings.jellyfinlibrariesDescription": "Die Bibliotheken {mediaServerName} werden nach Titeln durchsucht. Klicke auf die Schaltfläche unten, wenn keine Bibliotheken aufgelistet sind.",
@@ -1275,34 +1282,34 @@
"components.UserProfile.UserSettings.UserGeneralSettings.save": "Änderungen speichern",
"i18n.available": "Verfügbar",
"i18n.cancel": "Abbrechen",
"components.TitleCard.addToWatchList": "Zur Merkliste hinzufügen",
"components.TitleCard.watchlistCancel": "Merkliste für <strong>{title}</strong> entfernt.",
"components.TitleCard.addToWatchList": "Zur Beobachtungsliste hinzufügen",
"components.TitleCard.watchlistCancel": "Überwachungsliste für <strong>{title}</strong> abgebrochen.",
"components.UserList.usercreatedsuccess": "Benutzer erfolgreich angelegt!",
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* Dadurch wird dieser {mediaType} unwiderruflich aus {arr} entfernt, einschließlich aller Dateien.",
"components.UserList.importedfromJellyfin": "<strong>{userCount}</strong> {mediaServerName} {userCount, plural, one {Benutzer} other {Benutzer}} erfolgreich importiert!",
"components.UserList.importedfromJellyfin": "<strong>{userCount}</strong> {mediaServerName} {userCount, plural, one {user} other {users}} erfolgreich importiert!",
"components.UserList.validationpasswordminchars": "Das Passwort ist zu kurz; es sollte mindestens 8 Zeichen lang sein",
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Gerätestandard",
"i18n.approve": "Genehmigen",
"i18n.partiallyavailable": "Teilweise verfügbar",
"components.UserList.newJellyfinsigninenabled": "Die Einstellung <strong>Aktiviere neuen {mediaServerName} Sign-In</strong> ist derzeit aktiviert. {mediaServerName}-Benutzer mit Bibliothekszugang müssen nicht importiert werden, um sich anmelden zu können.",
"components.UserList.newJellyfinsigninenabled": "Die Einstellung <strong>Enable New {mediaServerName} Sign-In</strong> ist derzeit aktiviert. {mediaServerName}-Benutzer mit Bibliothekszugang müssen nicht importiert werden, um sich anmelden zu können.",
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Benachrichtigungston",
"components.UserProfile.UserSettings.UserNotificationSettings.webpushsettingsfailed": "Die Einstellungen für Web-Push-Benachrichtigungen konnten nicht gespeichert werden.",
"components.UserProfile.localWatchlist": "Merkliste von {username}",
"components.UserProfile.localWatchlist": "Beobachtungsliste von {username}",
"i18n.approved": "Genehmigt",
"pages.returnHome": "Zurück zur Startseite",
"pages.returnHome": "Zurück nach Hause",
"components.Discover.FilterSlideover.status": "Status",
"components.UserList.username": "Benutzername",
"components.Login.adminerror": "Du musst einen Adminaccount für den Zugang benutzen.",
"components.MovieDetails.watchlistError": "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.",
"components.MovieDetails.watchlistError": "Da ist was schief gelaufen - bitte versuche es noch einmal.",
"components.RequestList.RequestItem.profileName": "Profil",
"components.Selector.searchStatus": "Status auswählen...",
"components.Settings.invalidurlerror": "Es kann keine Verbindung zu {mediaServerName} hergestellt werden.",
"components.Settings.jellyfinSyncFailedGenericError": "Es trat ein unbekannter Fehler während der Bibliothekssynchronisation auf",
"components.UserList.validationUsername": "Du musst einen Benutzernamen angeben",
"components.UserProfile.UserSettings.UserGeneralSettings.validationemailrequired": "E-Mail Adresse benötigt",
"components.UserProfile.UserSettings.UserGeneralSettings.validationemailrequired": "Email benötigt",
"components.Login.invalidurlerror": "Es kann keine Verbindung zu {mediaServerName} hergestellt werden.",
"components.MovieDetails.removefromwatchlist": "Von der Merkliste entfernen",
"components.TvDetails.watchlistDeleted": "<strong>{title}</strong> erfolgreich aus der Merkliste entfernt!",
"components.MovieDetails.removefromwatchlist": "Von der Watchlist entfernen",
"components.TvDetails.watchlistDeleted": "<strong>{title}</strong> erfolgreich aus der Watchlist entfernt!",
"components.Login.back": "Zurück",
"components.Login.servertype": "Servertyp",
"components.Login.validationHostnameRequired": "Du musst eine gültige IP-Adresse oder einen gültigen Hostnamen angeben",
@@ -1310,10 +1317,10 @@
"components.Login.validationUrlBaseLeadingSlash": "Der URL muss ein Slash vorangestellt sein",
"components.Login.validationUrlBaseTrailingSlash": "Die URL-Basis darf nicht auf einem Slash enden",
"components.Login.validationUrlTrailingSlash": "Die URL darf nicht auf einem Slash enden",
"components.Login.validationservertyperequired": "Bitte wähle einen Servertyp",
"components.MovieDetails.addtowatchlist": "Zur Merkliste hinzufügen",
"components.MovieDetails.watchlistDeleted": "<strong>{title}</strong> erfolgreich aus der Merkliste entfernt!",
"components.MovieDetails.watchlistSuccess": "<strong>{title}</strong> erfolgreich zur Merkliste hinzugefügt!",
"components.Login.validationservertyperequired": "Bitte wähle einen Servertypen",
"components.MovieDetails.addtowatchlist": "Zur Watchlist hinzufügen",
"components.MovieDetails.watchlistDeleted": "<strong>{title}</strong> erfolgreich aus der Watchlist entfernt!",
"components.MovieDetails.watchlistSuccess": "<strong>{title}</strong> erfolgreich zur Watchlist hinzugefügt!",
"components.Selector.canceled": "Abgebrochen",
"components.Selector.ended": "Beendet",
"components.Selector.inProduction": "In Produktion",
@@ -1325,14 +1332,14 @@
"components.Setup.configjellyfin": "Jellyfin konfigurieren",
"components.Setup.configplex": "Plex konfigurieren",
"components.Setup.servertype": "Servertyp auswählen",
"components.Setup.signinWithEmby": "Emby Daten eintragen",
"components.Setup.signinWithEmby": "Emby-Daten eintragen",
"components.Setup.subtitle": "Leg los, indem du einen Medienserver auswählst",
"components.StatusBadge.seasonnumber": "S{seasonNumber}",
"components.TvDetails.addtowatchlist": "Zur Merkliste hinzufügen",
"components.TvDetails.removefromwatchlist": "Von der Merkliste entfernen",
"components.TvDetails.watchlistError": "Ein Fehler ist aufgetreten. Bitte versuche es erneut.",
"components.TvDetails.watchlistSuccess": "<strong>{title}</strong> erfolgreich zur Merkliste hinzugefügt!",
"components.UserProfile.UserSettings.UserGeneralSettings.validationemailformat": "Gültige E-Mail Adresse benötigt",
"components.TvDetails.addtowatchlist": "Zur Watchlist hinzufügen",
"components.TvDetails.removefromwatchlist": "Von der Watchlist entfernen",
"components.TvDetails.watchlistError": "Da lief etwas falsch, versuch es noch einmal.",
"components.TvDetails.watchlistSuccess": "<strong>{title}</strong> erfolgreich zur Watchlist hinzugefügt!",
"components.UserProfile.UserSettings.UserGeneralSettings.validationemailformat": "Gültige email benötigt",
"components.Login.hostname": "{mediaServerName} URL",
"components.Login.port": "Port",
"components.Login.urlBase": "URL-Basis",
@@ -1346,13 +1353,14 @@
"components.Settings.SettingsMain.discoverRegion": "Region entdecken",
"components.Blacklist.blacklistNotFoundError": "<strong>{title}</strong> ist nicht auf der Sperrliste.",
"components.PermissionEdit.manageblacklist": "Sperrliste verwalten",
"components.Settings.SettingsJobsCache.plex-refresh-token": "Plex Refresh Token",
"components.Settings.SettingsJobsCache.plex-refresh-token": "Jellyfin Refresh Token",
"components.UserProfile.UserSettings.UserGeneralSettings.discoverRegion": "Region entdecken",
"i18n.blacklistDuplicateError": "<strong>{title}</strong> wurde bereits auf die Sperrliste gesetzt.",
"components.Settings.Notifications.validationWebhookRoleId": "Du musst eine gültige Discord Rollen-ID angeben",
"components.Settings.Notifications.validationWebhookRoleId": "Sie müssen eine gültige Discord Rollen-ID angeben",
"components.Settings.Notifications.webhookRoleIdTip": "Die Rollen ID, die in der Webhook Nachricht erwähnt werden soll. Leer lassen, um Erwähnungen zu deaktivieren",
"i18n.addToBlacklist": "Zur Sperrliste hinzufügen",
"components.PermissionEdit.blacklistedItemsDescription": "Autorisierung zum Sperren von Medien.",
"components.Settings.SettingsMain.proxyBypassFilterTip": "Verwenden Sie ',' als Trennzeichen und '*.' als Platzhalter für Subdomains",
"components.Settings.SettingsMain.streamingRegion": "Streaming Region",
"i18n.removeFromBlacklistSuccess": "<strong>{title}</strong> wurde erfolgreich von der Sperrliste entfernt.",
"components.UserProfile.UserSettings.UserGeneralSettings.streamingRegion": "Streaming Region",
@@ -1375,115 +1383,25 @@
"components.Settings.Notifications.webhookRoleId": "Benachrichtigung Rollen ID",
"components.Settings.SettingsJobsCache.usersavatars": "Avatare der Nutzer",
"components.Settings.SettingsMain.discoverRegionTip": "Inhalte nach regionaler Verfügbarkeit filtern",
"components.Settings.SettingsMain.proxyBypassLocalAddresses": "Proxy für lokale Adressen umgehen",
"components.Settings.SettingsMain.proxyEnabled": "HTTP(S) Proxy",
"components.Settings.SettingsMain.proxyHostname": "Proxy Hostname",
"components.Settings.SettingsMain.proxyPassword": "Proxy Passwort",
"components.Settings.SettingsMain.proxyPort": "Proxy Port",
"components.Settings.SettingsMain.proxySsl": "SSL für Proxy verwenden",
"components.Settings.SettingsMain.proxyUser": "Proxy Benutzername",
"components.Settings.SettingsMain.proxyBypassFilter": "vom Proxy ignorierte Adressen",
"components.Settings.SettingsMain.streamingRegionTip": "Streaming Seiten nach regionaler Verfügbarkeit anzeigen",
"components.Settings.SettingsMain.validationProxyPort": "Sie müssen einen gültigen Port angeben",
"components.Settings.apiKey": "API-Schlüssel",
"components.Settings.tip": "Tipp",
"components.UserProfile.UserSettings.UserGeneralSettings.discoverRegionTip": "Inhalte nach regionaler Verfügbarkeit filtern",
"components.UserProfile.UserSettings.UserGeneralSettings.toastSettingsFailureEmail": "Diese E-Mail ist bereits vergeben!",
"components.UserProfile.UserSettings.UserGeneralSettings.toastSettingsFailureEmailEmpty": "Ein anderer Benutzer hat bereits diesen Benutzernamen. Sie müssen eine E-Mail festlegen",
"i18n.blacklist": "Sperrliste",
"i18n.blacklistError": "Etwas ist schief gelaufen, versuche es noch einmal.",
"i18n.blacklistError": "Etwas ist schief gelaufen, versuchen Sie es noch einmal.",
"i18n.blacklistSuccess": "<strong>{title}</strong> wurde erfolgreich auf die Sperrliste gesetzt.",
"i18n.blacklisted": "Gesperrt",
"i18n.removefromBlacklist": "Von der Sperrliste entfernen",
"i18n.specials": "Besonderheiten",
"components.Settings.SettingsNetwork.trustProxyTip": "Erlaube Jellyseerr die Client-IP-Adressen hinter einem Proxy zu registrieren",
"components.DiscoverTvUpcoming.upcomingtv": "Demnächst erscheinende Serien",
"components.Login.loginwithapp": "Einloggen bei {appName}",
"components.Settings.OverrideRuleModal.rootfolder": "Stammverzeichnis",
"components.UserProfile.UserSettings.menuLinkedAccounts": "Verknüpfte Konten",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.deleteFailed": "Verknüpftes Konto kann nicht gelöscht werden.",
"components.UserProfile.UserSettings.LinkJellyfinModal.usernameRequired": "Sie müssen einen Benutzernamen angeben",
"components.Setup.librarieserror": "Validierung fehlgeschlagen. Bitte schalte die Bibliotheken erneut um, um fortzufahren.",
"components.Settings.SettingsNetwork.proxyBypassFilterTip": "Verwende ',' als Trennzeichen und '*.' als Platzhalter für Subdomains",
"components.Settings.OverrideRuleModal.settingsDescription": "Gibt an, welche Einstellungen geändert werden, wenn die oben genannten Bedingungen erfüllt sind.",
"components.Settings.SettingsUsers.mediaServerLogin": "Aktiviere {mediaServerName} Anmeldung",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.plexErrorExists": "Dieses Konto ist bereits mit einem Plex Benutzer verknüpft",
"components.UserProfile.UserSettings.LinkJellyfinModal.description": "Geben Sie Ihre {mediaServerName}-Anmeldeinformationen ein, um Ihr Konto mit {applicationName} zu verknüpfen.",
"components.Settings.SettingsNetwork.networkDisclaimer": "Anstelle dieser Einstellungen sollten Netzwerkparameter aus Ihrem Container/System verwendet werden. Weitere Informationen finden Sie in den {docs}.",
"components.Selector.searchUsers": "Benutzer auswählen…",
"components.Settings.overrideRules": "Override-Regeln",
"components.Settings.Notifications.messageThreadId": "Thread-/Themen-ID",
"components.Settings.OverrideRuleModal.conditions": "Bedingungen",
"components.Settings.OverrideRuleTile.settings": "Einstellungen",
"components.Login.noadminerror": "Kein Admin-Benutzer auf dem Server gefunden.",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.plexErrorUnauthorized": "Mit Ihren Anmeldeinformationen kann keine Verbindung zu Plex hergestellt werden",
"components.UserProfile.UserSettings.LinkJellyfinModal.errorUnknown": "Ein unbekannter Fehler ist aufgetreten",
"components.Settings.addrule": "Neue Override-Regel",
"components.Login.orsigninwith": "Oder anmelden mit",
"components.Settings.OverrideRuleModal.create": "Regel erstellen",
"components.Settings.OverrideRuleModal.createrule": "Neue Override-Regel",
"components.Settings.OverrideRuleModal.editrule": "Bearbeite Override-Regel",
"components.Settings.OverrideRuleModal.genres": "Genre",
"components.Settings.OverrideRuleModal.keywords": "Schlüsselwörter",
"components.Settings.OverrideRuleModal.languages": "Sprachen",
"components.Settings.OverrideRuleModal.notagoptions": "Keine Tags.",
"components.Settings.OverrideRuleModal.ruleCreated": "Override-Regel erfolgreich erstellt!",
"components.Settings.OverrideRuleModal.ruleUpdated": "Override-Regel erfolgreich bearbeitet!",
"components.Settings.OverrideRuleModal.selectRootFolder": "Stammverzeichnis wählen",
"components.Settings.OverrideRuleModal.selectService": "Service auswählen",
"components.Settings.OverrideRuleModal.selecttags": "Tags auswählen",
"components.Settings.OverrideRuleTile.users": "Benutzer",
"components.Settings.OverrideRuleTile.tags": "Tags",
"components.Settings.OverrideRuleTile.rootfolder": "Stammverzeichnis",
"components.Settings.OverrideRuleTile.language": "Sprache",
"components.Settings.OverrideRuleTile.keywords": "Schlüsselwörter",
"components.Settings.OverrideRuleTile.genre": "Genre",
"components.Settings.OverrideRuleTile.conditions": "Bedingungen",
"components.Settings.OverrideRuleModal.users": "Benutzer",
"components.Settings.OverrideRuleModal.tags": "Tags",
"components.Settings.OverrideRuleModal.settings": "Einstellungen",
"components.Settings.OverrideRuleModal.serviceDescription": "Wende diese Regel auf den ausgewählten Dienst an.",
"components.Settings.OverrideRuleModal.service": "Dienst",
"components.Settings.SettingsMain.enableSpecialEpisodes": "Anfragen zu Spezial-Episoden zulassen",
"components.Settings.SettingsNetwork.advancedNetworkSettings": "Erweiterte Netzwerkeinstellungen",
"components.Settings.SettingsNetwork.csrfProtectionHoverTip": "Aktivieren Sie diese Einstellung NICHT, wenn Sie nicht wissen, was Sie tun!",
"components.Settings.SettingsNetwork.docs": "Dokumentation/Hilfe",
"components.Settings.SettingsNetwork.networksettings": "Netzwerkeinstellungen",
"components.Settings.SettingsNetwork.networksettingsDescription": "Konfiguriere die Netzwerkeinstellungen deiner Jellyseerr-Instanz.",
"components.Settings.SettingsNetwork.toastSettingsSuccess": "Einstellungen erfolgreich gespeichert!",
"components.Settings.SettingsNetwork.trustProxy": "Aktiviere Proxy-Unterstützung",
"components.Settings.SettingsNetwork.validationProxyPort": "Sie müssen einen gültigen Port angeben",
"components.Settings.SettingsUsers.atLeastOneAuth": "Es muss mindestens eine Authentifizierungsmethode ausgewählt werden.",
"components.Settings.SettingsUsers.loginMethods": "Anmeldemethoden",
"components.Settings.SettingsUsers.loginMethodsTip": "Anmeldemethoden für Benutzer konfigurieren.",
"components.Settings.SettingsUsers.mediaServerLoginTip": "Benutzern erlauben, sich mit ihrem {mediaServerName}-Konto anzumelden",
"components.Settings.SettingsNetwork.csrfProtection": "Aktiviere CSRF-Schutz",
"components.Settings.SettingsNetwork.csrfProtectionTip": "Externen API-Zugriff auf schreibgeschützt setzen (erfordert HTTPS)",
"components.Settings.SettingsNetwork.forceIpv4First": "Erzwinge IPv4-Auflösung zuerst",
"components.Settings.SettingsNetwork.forceIpv4FirstTip": "Erzwinge, dass Jellyseerr zuerst IPv4-Adressen anstelle von IPv6 auflöst",
"components.Settings.SettingsNetwork.toastSettingsFailure": "Beim Speichern der Einstellungen ist ein Fehler aufgetreten.",
"components.Settings.SettingsNetwork.proxyUser": "Proxy Benutzername",
"components.Settings.SettingsNetwork.proxySsl": "Benutze SSL für Proxy",
"components.Settings.SettingsNetwork.proxyPort": "Proxy Port",
"components.Settings.SettingsNetwork.proxyPassword": "Proxy Passwort",
"components.Settings.SettingsNetwork.proxyHostname": "Proxy Hostname",
"components.Settings.SettingsNetwork.proxyEnabled": "HTTP(S) Proxy",
"components.Settings.SettingsNetwork.proxyBypassLocalAddresses": "Proxy für lokale Adressen umgehen",
"components.Settings.SettingsNetwork.proxyBypassFilter": "Vom Proxy ignorierte Adressen",
"components.Settings.SettingsNetwork.network": "Netzwerk",
"components.Settings.menuNetwork": "Netzwerk",
"components.UserProfile.UserSettings.LinkJellyfinModal.username": "Benutzername",
"components.UserProfile.UserSettings.LinkJellyfinModal.title": "{mediaServerName}-Konto verknüpfen",
"components.UserProfile.UserSettings.LinkJellyfinModal.saving": "Hinzufügen…",
"components.UserProfile.UserSettings.LinkJellyfinModal.passwordRequired": "Sie müssen ein Passwort angeben",
"components.UserProfile.UserSettings.LinkJellyfinModal.password": "Passwort",
"components.UserProfile.UserSettings.LinkJellyfinModal.errorUnauthorized": "Mit Ihren Anmeldeinformationen kann keine Verbindung zu {mediaServerName} hergestellt werden",
"components.UserProfile.UserSettings.LinkJellyfinModal.errorExists": "Dieses Konto ist bereits mit einem {applicationName}-Benutzer verknüpft",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.noPermissionDescription": "Sie sind nicht berechtigt, die verknüpften Konten dieses Benutzers zu ändern.",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.noLinkedAccounts": "Sie haben keine externen Konten mit Ihrem Konto verknüpft.",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.linkedAccountsHint": "Diese externen Konten sind mit Ihrem {applicationName}-Konto verknüpft.",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.linkedAccounts": "Verknüpfte Konten",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.errorUnknown": "Ein unbekannter Fehler ist aufgetreten",
"components.Settings.overrideRulesDescription": "Überschreibungsregeln ermöglichen es dir, Eigenschaften festzulegen, die ersetzt werden, wenn eine Anforderung der Regel entspricht.",
"components.UserProfile.UserSettings.UserNotificationSettings.validationTelegramMessageThreadId": "Die Thread/Themen ID muss eine positive volle Zahl sein",
"components.UserProfile.UserSettings.UserNotificationSettings.telegramMessageThreadId": "Thread/Themen ID",
"components.UserProfile.UserSettings.UserNotificationSettings.telegramMessageThreadIdTip": "Wenn in deinem Gruppenchat Themen aktiviert sind, kannst du hier die ID des Threads/Themas angeben",
"components.Settings.Notifications.validationMessageThreadId": "Die Thread-/Themen-ID muss eine positive volle Zahl sein",
"components.Settings.Notifications.messageThreadIdTip": "Wenn in deinem Gruppenchat Themen aktiviert sind, kannst du hier die ID des Threads/Themas angeben",
"components.Settings.OverrideRuleModal.qualityprofile": "Qualitätsprofil",
"components.Settings.OverrideRuleModal.selectQualityProfile": "Qualitätsprofil auswählen",
"components.Settings.OverrideRuleTile.qualityprofile": "Qualitätsprofil",
"components.Settings.OverrideRuleModal.conditionsDescription": "Gib Bedingungen an, bevor die Parameteränderungen angewendet werden. Jedes Feld muss validiert werden, damit die Regeln angewendet werden (UND-Betrieb). Ein Feld gilt als verifiziert, wenn eine dieser Eigenschaften übereinstimmt (ODER Betrieb).",
"components.UserProfile.UserSettings.LinkJellyfinModal.save": "Link"
"i18n.specials": "Besonderheiten"
}

View File

@@ -221,6 +221,8 @@
"components.RequestBlock.requestoverrides": "Παρακάμψεις των Αιτημάτων",
"components.RequestBlock.profilechanged": "Προφίλ Ποιότητας",
"components.RegionSelector.regionDefault": "Όλες οι Περιοχές",
"components.PlexLoginButton.signinwithplex": "Σύνδεση",
"components.PlexLoginButton.signingin": "Συνδέεται …",
"components.PersonDetails.crewmember": "Συνεργείο",
"components.PersonDetails.appearsin": "Εμφανίσεις",
"components.PersonDetails.alsoknownas": "Επίσης Γνωστός/ή ως: {names}",
@@ -828,6 +830,7 @@
"components.Settings.Notifications.NotificationsGotify.validationTypes": "Πρέπει να επιλέξετε τουλάχιστον έναν τύπο ειδοποιήσεων",
"components.Settings.Notifications.NotificationsGotify.validationUrlTrailingSlash": "Ο σύνδεσμος δε μπορεί να τελειώνει σε κάθετο",
"components.Settings.SettingsMain.applicationTitle": "Τίτλος εφαρμογής",
"components.Settings.SettingsMain.trustProxy": "Ενεργοποίηση Proxy",
"components.StatusBadge.playonplex": "Αναπαραγωγή στο Plex",
"components.TvDetails.rtaudiencescore": "Βαθμολογία κοινού Rotten Tomatoes",
"components.TvDetails.tmdbuserscore": "Βαθμολογία χρηστών TMDB",
@@ -838,6 +841,7 @@
"components.Settings.SettingsJobsCache.jobScheduleEditFailed": "Κάτι πήγε στραβά με την αποθήκευση της εργασίας.",
"components.Settings.SettingsMain.cacheImages": "Ενεργοποίηση caching εικόνων",
"components.Settings.SettingsMain.cacheImagesTip": "Κάνε cache εικόνες από εξωτερικές πηγές (απαιτεί πολύ αποθηκευτικό χώρο στο δίσκο)",
"components.Settings.SettingsMain.csrfProtectionTip": "Ορισμός εξωτερικής πρόσβασης API σε read-only (απαιτεί HTTPS)",
"components.Settings.SettingsMain.general": "Γενικά",
"components.Settings.SettingsMain.generalsettingsDescription": "Διαμόρφωση των γενικών και προεπιλεγμένων ρυθμίσεων για το Jellyseerr.",
"components.Settings.SettingsMain.toastSettingsFailure": "Κάτι πήγε στραβά κατά την αποθήκευση των ρυθμίσεων.",
@@ -1052,6 +1056,8 @@
"components.AirDateBadge.airsrelative": "Θα προβληθεί σε {relativeTime}",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorSeconds": "Κάθε {jobScheduleSeconds, plural, one {second} other {{jobScheduleSeconds} seconds}}",
"components.Settings.SettingsJobsCache.imagecachesize": "Συνολικό μέγεθος cache",
"components.Settings.SettingsMain.csrfProtectionHoverTip": "ΜΗΝ ενεργοποιήσετε αυτή τη ρύθμιση εάν δε γνωρίζετε τι κάνετε!",
"components.Settings.SettingsMain.trustProxyTip": "Επιτρέψτε στο Overseer να καταχωρήσει διευθύνσεις IP τερματικών πίσω από proxy",
"components.Settings.SettingsMain.validationApplicationTitle": "Πρέπει να δώσετε έναν τίτλο εφαρμογής",
"components.Settings.advancedTooltip": "Λανθασμένη παραμετροποίηση αυτή της ρύθμισης μπορεί να οδηγήσει σε διακοπή της λειτουργίας",
"components.Settings.experimentalTooltip": "Η ενεργοποίηση αυτής της ρύθμισης μπορεί να οδηγήσει σε απρόσμενη συμπεριφορά της εφαρμογής",
@@ -1087,6 +1093,7 @@
"components.Settings.SettingsJobsCache.editJobScheduleSelectorHours": "Κάθε {jobScheduleHours, plural, one {hour} other {{jobScheduleHours} hours}}",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "Κάθε {jobScheduleMinutes, plural, one {minute} other {{jobScheduleMinutes} minutes}}",
"components.Settings.SettingsJobsCache.imagecacheDescription": "Όταν είναι ενεργοποιημένο στις ρυθμίσεις, το Jellyseerr θα κάνει proxy και cache εικόνες από προκαθορισμένες εξωτερικές πηγές. Οι εικόνες που έχουν γίνει cached θα αποθηκευτούν στον φάκελο των αρχείων. Μπορείτε να βρείτε τα αρχεία στο <code>{appDataPath}/cache/images</code>.",
"components.Settings.SettingsMain.csrfProtection": "Ενεργοποίηση προστασίας CSRF",
"components.Settings.SettingsMain.locale": "Γλώσσα εμφάνισης",
"components.Settings.SettingsMain.originallanguageTip": "Φιλτράρετε το περιεχόμενο με βάση τη πρωτότυπη γλώσσα",
"components.Settings.SettingsMain.partialRequestsEnabled": "Επιτρέψτε τις αιτήσεων σειρών μερικώς",

View File

@@ -76,7 +76,6 @@
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Your Watchlist",
"components.Discover.DiscoverWatchlist.watchlist": "Plex Watchlist",
"components.Discover.FilterSlideover.activefilters": "{count, plural, one {# Active Filter} other {# Active Filters}}",
"components.Discover.FilterSlideover.certification": "Content Rating",
"components.Discover.FilterSlideover.clearfilters": "Clear Active Filters",
"components.Discover.FilterSlideover.filters": "Filters",
"components.Discover.FilterSlideover.firstAirDate": "First Air Date",
@@ -584,13 +583,6 @@
"components.ResetPassword.validationpasswordrequired": "You must provide a password",
"components.Search.search": "Search",
"components.Search.searchresults": "Search Results",
"components.Selector.CertificationSelector.errorLoading": "Failed to load certifications",
"components.Selector.CertificationSelector.maxRating": "Maximum rating",
"components.Selector.CertificationSelector.minRating": "Minimum rating",
"components.Selector.CertificationSelector.noOptions": "No options available",
"components.Selector.CertificationSelector.selectCertification": "Select a certification",
"components.Selector.CertificationSelector.selectCountry": "Select a country",
"components.Selector.CertificationSelector.starttyping": "Starting typing to search.",
"components.Selector.canceled": "Canceled",
"components.Selector.ended": "Ended",
"components.Selector.inProduction": "In Production",
@@ -632,22 +624,6 @@
"components.Settings.Notifications.NotificationsLunaSea.validationWebhookUrl": "You must provide a valid URL",
"components.Settings.Notifications.NotificationsLunaSea.webhookUrl": "Webhook URL",
"components.Settings.Notifications.NotificationsLunaSea.webhookUrlTip": "Your user- or device-based <LunaSeaLink>notification webhook URL</LunaSeaLink>",
"components.Settings.Notifications.NotificationsNtfy.agentenabled": "Enable Agent",
"components.Settings.Notifications.NotificationsNtfy.ntfysettingsfailed": "Ntfy notification settings failed to save.",
"components.Settings.Notifications.NotificationsNtfy.ntfysettingssaved": "Ntfy notification settings saved successfully!",
"components.Settings.Notifications.NotificationsNtfy.password": "Password",
"components.Settings.Notifications.NotificationsNtfy.toastNtfyTestFailed": "Ntfy test notification failed to send.",
"components.Settings.Notifications.NotificationsNtfy.toastNtfyTestSending": "Sending ntfy test notification…",
"components.Settings.Notifications.NotificationsNtfy.toastNtfyTestSuccess": "Ntfy test notification sent!",
"components.Settings.Notifications.NotificationsNtfy.token": "Token",
"components.Settings.Notifications.NotificationsNtfy.tokenAuth": "Token authentication",
"components.Settings.Notifications.NotificationsNtfy.topic": "Topic",
"components.Settings.Notifications.NotificationsNtfy.url": "Server root URL",
"components.Settings.Notifications.NotificationsNtfy.username": "Username",
"components.Settings.Notifications.NotificationsNtfy.usernamePasswordAuth": "Username + Password authentication",
"components.Settings.Notifications.NotificationsNtfy.validationNtfyTopic": "You must provide a topic",
"components.Settings.Notifications.NotificationsNtfy.validationNtfyUrl": "You must provide a valid URL",
"components.Settings.Notifications.NotificationsNtfy.validationTypes": "You must select at least one notification type",
"components.Settings.Notifications.NotificationsPushbullet.accessToken": "Access Token",
"components.Settings.Notifications.NotificationsPushbullet.accessTokenTip": "Create a token from your <PushbulletSettingsLink>Account Settings</PushbulletSettingsLink>",
"components.Settings.Notifications.NotificationsPushbullet.agentEnabled": "Enable Agent",
@@ -959,9 +935,6 @@
"components.Settings.SettingsMain.generalsettings": "General Settings",
"components.Settings.SettingsMain.generalsettingsDescription": "Configure global and default settings for Jellyseerr.",
"components.Settings.SettingsMain.hideAvailable": "Hide Available Media",
"components.Settings.SettingsMain.hideAvailableTip": "Hide available media from the discover pages but not search results",
"components.Settings.SettingsMain.hideBlacklisted": "Hide Blacklisted Items",
"components.Settings.SettingsMain.hideBlacklistedTip": "Hide blacklisted items from discover pages for all users with the \"Manage Blacklist\" permission",
"components.Settings.SettingsMain.locale": "Display Language",
"components.Settings.SettingsMain.originallanguage": "Discover Language",
"components.Settings.SettingsMain.originallanguageTip": "Filter content by original language",
@@ -975,16 +948,10 @@
"components.Settings.SettingsMain.validationApplicationTitle": "You must provide an application title",
"components.Settings.SettingsMain.validationApplicationUrl": "You must provide a valid URL",
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "URL must not end in a trailing slash",
"components.Settings.SettingsMain.validationUrl": "You must provide a valid URL",
"components.Settings.SettingsMain.validationUrlTrailingSlash": "URL must not end in a trailing slash",
"components.Settings.SettingsMain.youtubeUrl": "YouTube URL",
"components.Settings.SettingsMain.youtubeUrlTip": "Base URL for YouTube videos if a self-hosted YouTube instance is used.",
"components.Settings.SettingsNetwork.csrfProtection": "Enable CSRF Protection",
"components.Settings.SettingsNetwork.csrfProtectionHoverTip": "Do NOT enable this setting unless you understand what you are doing!",
"components.Settings.SettingsNetwork.csrfProtectionTip": "Set external API access to read-only (requires HTTPS)",
"components.Settings.SettingsNetwork.docs": "documentation",
"components.Settings.SettingsNetwork.forceIpv4First": "Force IPv4 Resolution First",
"components.Settings.SettingsNetwork.forceIpv4FirstTip": "Force Jellyseerr to resolve IPv4 addresses first instead of IPv6",
"components.Settings.SettingsNetwork.network": "Network",
"components.Settings.SettingsNetwork.networkDisclaimer": "Network parameters from your container/system should be used instead of these settings. See the {docs} for more information.",
"components.Settings.SettingsNetwork.networksettings": "Network Settings",

View File

@@ -319,6 +319,8 @@
"i18n.experimental": "Experimental",
"components.Login.signingin": "Iniciando sesión…",
"components.Login.signin": "Iniciar Sesión",
"components.PlexLoginButton.signinwithplex": "Iniciar Sesión",
"components.PlexLoginButton.signingin": "Iniciando sesión…",
"components.Login.signinwithplex": "Usa tu cuenta de Plex",
"components.Login.signinheader": "Inicia sesión para continuar",
"components.PermissionEdit.request4k": "Solicitar 4K",
@@ -696,8 +698,8 @@
"components.RequestCard.mediaerror": "{mediaType} No Encontrado",
"components.RequestCard.deleterequest": "Borrar Solicitud",
"components.NotificationTypeSelector.notificationTypes": "Tipos de Notificación",
"components.Layout.VersionStatus.streamstable": "Jellyseerr (Estable)",
"components.Layout.VersionStatus.streamdevelop": "Jellyseer (Desarrollo)",
"components.Layout.VersionStatus.streamstable": "Overseer (Estable)",
"components.Layout.VersionStatus.streamdevelop": "Overseer (Desarrollo)",
"components.Layout.VersionStatus.outofdate": "Desactualizado",
"components.UserList.autogeneratepasswordTip": "Envía por email una contraseña al usuario generada por el servidor",
"i18n.retrying": "Reintentando…",
@@ -1047,6 +1049,7 @@
"components.Settings.Notifications.enableMentions": "Activar menciones",
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "Frecuencia actual",
"components.Settings.SettingsJobsCache.imagecachesize": "Tamaño total de la caché",
"components.Settings.SettingsMain.csrfProtectionTip": "Configurar el acceso a la API externa como sólo lectura (requiere HTTPS)",
"components.Settings.SettingsJobsCache.imagecachecount": "Imágenes en caché",
"components.Settings.SettingsMain.general": "General",
"components.Settings.SettingsMain.generalsettings": "Configuración general",
@@ -1117,12 +1120,14 @@
"components.Settings.SettingsMain.apikey": "Clave API",
"components.Settings.SettingsMain.applicationurl": "URL de la aplicación",
"components.Settings.SettingsMain.cacheImages": "Activar el caché de imágenes",
"components.Settings.SettingsMain.csrfProtectionHoverTip": "¡NO active esta opción a menos que sepa lo que está haciendo!",
"components.Settings.SettingsMain.originallanguage": "Idioma en Descubre",
"components.Settings.SettingsMain.locale": "Idioma de visualización",
"components.Settings.SettingsMain.originallanguageTip": "Filtrar contenidos por idioma original",
"components.Settings.SettingsMain.partialRequestsEnabled": "Permitir Solicitudes Parciales de Series",
"components.Settings.SettingsMain.toastApiKeyFailure": "Algo ha ido mal al generar una nueva clave API.",
"components.Settings.SettingsMain.toastApiKeySuccess": "¡Nueva clave API generada con éxito!",
"components.Settings.SettingsMain.trustProxy": "Activar la compatibilidad con proxy",
"components.Settings.advancedTooltip": "Una configuración incorrecta de este parámetro puede afectar a la funcionalidad",
"components.Settings.restartrequiredTooltip": "Jellyseerr debe reiniciarse para que los cambios en esta configuración surtan efecto",
"components.TvDetails.seasonnumber": "Temporada {seasonNumber}",
@@ -1156,7 +1161,9 @@
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Sincronización de la lista de seguimiento de Plex",
"components.Settings.SettingsMain.applicationTitle": "Titulo de la aplicación",
"components.Settings.SettingsMain.cacheImagesTip": "Almacenamiento en caché de imágenes de origen externo (requiere una cantidad significativa de espacio en disco)",
"components.Settings.SettingsMain.csrfProtection": "Activar la protección CSRF",
"components.Settings.SettingsMain.toastSettingsSuccess": "¡Ajustes guardados correctamente!",
"components.Settings.SettingsMain.trustProxyTip": "Permite a Overserr registrar correctamente la IP del cliente detrás de un proxy",
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "La URL no debe terminar con una barra al final",
"components.Settings.tautulliSettingsDescription": "Opcionalmente configure los ajustes para su servidor Tautulli. Jellyseerr obtiene de Tautulli los datos del historial de visionado de los medios de Plex.",
"components.TitleCard.tvdbid": "Identificador de TheTVDB",
@@ -1289,32 +1296,5 @@
"components.Settings.manualscanJellyfin": "Escanear Libreria Manualmente",
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> Eliminado correctamente de la lista de seguimiento!",
"components.UserList.newJellyfinsigninenabled": "La configuración <strong>Habilitar nuevo inicio de sesión de {mediaServerName}</strong> está actualmente habilitada. Los usuarios de {mediaServerName} con acceso a la biblioteca no necesitan ser importados para poder iniciar sesión.",
"components.UserProfile.localWatchlist": "Lista de seguimiento de {username}",
"components.Layout.Sidebar.blacklist": "Lista negra",
"components.Login.urlBase": "Base de la URL",
"components.Blacklist.blacklistNotFoundError": "<strong>{title}</strong> no esta en la lista negra.",
"components.Discover.FilterSlideover.status": "Estatus",
"components.Login.servertype": "Tipo de servidor",
"components.DiscoverTvUpcoming.upcomingtv": "Series próximas",
"components.Login.hostname": "URL de {mediaServerName}",
"components.Login.back": "Volver atrás",
"components.Login.adminerror": "Debes usar una cuenta de administrador para iniciar sesión.",
"components.Login.enablessl": "Ultilizar SSL",
"components.Login.invalidurlerror": "No se ha podido conectar con el servidor de {mediaServerName}.",
"components.Login.loginwithapp": "Iniciar sesión con {appName}",
"components.Login.noadminerror": "No se ha encontrado un usuario administrativo en el servidor.",
"components.Login.orsigninwith": "O inicia sesión con",
"components.Login.port": "Puerto",
"components.Login.validationHostnameRequired": "Debes proveer un nombre de host o dirección IP válida",
"components.Login.validationPortRequired": "Debes proveer un número de puerto válido",
"components.Blacklist.blacklistSettingsDescription": "Gestionar contenido en la lista negra.",
"components.Blacklist.blacklistdate": "Fecha",
"components.Blacklist.blacklistedby": "{date} por {user}",
"components.Blacklist.blacklistsettings": "Configuración de la lista negra",
"components.Blacklist.mediaName": "Nombre",
"components.Blacklist.mediaTmdbId": "Id de tmdb",
"components.Blacklist.mediaType": "Tipo",
"component.BlacklistBlock.blacklistdate": "Fecha de inclusión en la lista negra",
"component.BlacklistBlock.blacklistedby": "Puesto en la lista negra por",
"component.BlacklistModal.blacklisting": "Añadiendo a la lista negra"
"components.UserProfile.localWatchlist": "Lista de seguimiento de {username}"
}

View File

@@ -319,6 +319,8 @@
"i18n.experimental": "Experimental",
"components.Login.signingin": "Iniciando sesión…",
"components.Login.signin": "Iniciar Sesión",
"components.PlexLoginButton.signinwithplex": "Iniciar Sesión",
"components.PlexLoginButton.signingin": "Iniciando sesión…",
"components.Login.signinwithplex": "Usa tu cuenta de Plex",
"components.Login.signinheader": "Inicia sesión para continuar",
"components.PermissionEdit.request4k": "Solicitar 4K",
@@ -1047,6 +1049,7 @@
"components.Settings.Notifications.enableMentions": "Activar menciones",
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "Frecuencia actual",
"components.Settings.SettingsJobsCache.imagecachesize": "Tamaño total de la caché",
"components.Settings.SettingsMain.csrfProtectionTip": "Configurar el acceso a la API externa como sólo lectura (requiere HTTPS)",
"components.Settings.SettingsJobsCache.imagecachecount": "Imágenes en caché",
"components.Settings.SettingsMain.general": "General",
"components.Settings.SettingsMain.generalsettings": "Configuración general",
@@ -1117,12 +1120,14 @@
"components.Settings.SettingsMain.apikey": "Clave API",
"components.Settings.SettingsMain.applicationurl": "URL de la aplicación",
"components.Settings.SettingsMain.cacheImages": "Activar el caché de imágenes",
"components.Settings.SettingsMain.csrfProtectionHoverTip": "¡NO active esta opción a menos que sepa lo que está haciendo!",
"components.Settings.SettingsMain.originallanguage": "Idioma en Descubre",
"components.Settings.SettingsMain.locale": "Idioma de visualización",
"components.Settings.SettingsMain.originallanguageTip": "Filtrar contenidos por idioma original",
"components.Settings.SettingsMain.partialRequestsEnabled": "Permitir Solicitudes Parciales de Series",
"components.Settings.SettingsMain.toastApiKeyFailure": "Algo ha ido mal al generar una nueva clave API.",
"components.Settings.SettingsMain.toastApiKeySuccess": "¡Nueva clave API generada con éxito!",
"components.Settings.SettingsMain.trustProxy": "Activar la compatibilidad con proxy",
"components.Settings.advancedTooltip": "Una configuración incorrecta de este parámetro puede afectar a la funcionalidad",
"components.Settings.restartrequiredTooltip": "Jellyseerr debe reiniciarse para que los cambios en esta configuración surtan efecto",
"components.TvDetails.seasonnumber": "Temporada {seasonNumber}",
@@ -1156,7 +1161,9 @@
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Sincronización de la lista de seguimiento de Plex",
"components.Settings.SettingsMain.applicationTitle": "Titulo de la aplicación",
"components.Settings.SettingsMain.cacheImagesTip": "Almacenamiento en caché de imágenes de origen externo (requiere una cantidad significativa de espacio en disco)",
"components.Settings.SettingsMain.csrfProtection": "Activar la protección CSRF",
"components.Settings.SettingsMain.toastSettingsSuccess": "¡Ajustes guardados correctamente!",
"components.Settings.SettingsMain.trustProxyTip": "Permite a Overserr registrar correctamente la IP del cliente detrás de un proxy",
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "La URL no debe terminar con una barra al final",
"components.Settings.tautulliSettingsDescription": "Opcionalmente configure los ajustes para su servidor Tautulli. Jellyseerr obtiene de Tautulli los datos del historial de visionado de los medios de Plex.",
"components.TitleCard.tvdbid": "Identificador de TheTVDB",

View File

@@ -354,6 +354,8 @@
"components.PermissionEdit.viewrequests": "Ikusi eskaerak",
"components.PersonDetails.ascharacter": "{character} gisa",
"components.PersonDetails.birthdate": "{birthdate}(e)an jaiota",
"components.PlexLoginButton.signingin": "Saioa hasten…",
"components.PlexLoginButton.signinwithplex": "Hasi saioa",
"components.RequestBlock.approve": "Onartu eskaera",
"components.RequestBlock.decline": "Ukatu eskaera",
"components.RequestBlock.delete": "Ezabatu eskaera",
@@ -450,7 +452,8 @@
"components.Settings.Notifications.chatIdTip": "Hasi txat bat zure bot-arekin, gehitu <GetIdBotLink>@get_id_bot</GetIdBotLink> eta egin <code>/my_id</code> komandoa",
"components.Settings.Notifications.encryptionTip": "Kasu gehienetan, TLS inplizituak 465 portua eta STARTTLSk 587 portua erabiltzen dute",
"components.Settings.RadarrModal.tagRequestsInfo": "Gehitu etiketa gehigarri bat automatikoki eskaeraren erabiltzaile ID eta erabiltzaile-izenarekin",
"components.Settings.SettingsLogs.logsDescription": "Erregistro horiek zuzenean ikus ditzakezu <code>stdout</code> edo <code>{appDataPath}/logs/jellyseerr.log</code> bidez.",
"components.Settings.SettingsLogs.logsDescription": "Erregistro horiek zuzenean ikus ditzakezu <code>stdout</code> edo <code>{appDataPath}/logs/overseerr.log</code> bidez.",
"components.Settings.SettingsMain.proxyBypassFilterTip": "Erabili ',' banatzaile eta '*.' komodin gisa azpidominioetarako",
"components.Settings.SonarrModal.tagRequestsInfo": "Gehitu etiketa gehigarri bat automatikoki eskaeraren erabiltzaile ID eta erabiltzaile-izenarekin",
"components.Settings.restartrequiredTooltip": "Jellyseerr berrabiarazi egin behar da aldaketa hauek indarrean jartzeko",
"components.UserList.passwordinfodescription": "Konfiguratu aplikazioaren URL bat eta gaitu posta elektronikoko jakinarazpenak pasahitz sortze automatikoa ahalbidetzeko.",
@@ -459,6 +462,7 @@
"components.Discover.resetwarning": "Berrezarri kontrol irristari guztiak modu lehenetsira. Honek kontrol irristari pertsonalizatuak ere ezabatuko ditu!",
"components.RequestModal.QuotaDisplay.quotaLink": "Zure eskaera-mugen laburpena ikus dezakezu zure <ProfileLink>profil-orrian</ProfileLink>.",
"components.Settings.Notifications.NotificationsWebPush.httpsRequirement": "Web push jakinarazpenak jasotzeko, Jellyseerr HTTPS bidez zerbitzatu behar da.",
"components.Settings.SettingsMain.csrfProtectionHoverTip": "Ez ezazu konfigurazio hau gaitu ez badakizun zer egiten ari zaren!",
"components.Discover.DiscoverMovies.activefilters": "{count, plural, one {Gaitutako iragazki #} other {Gaitutako # iragazki}}",
"components.Discover.DiscoverTv.activefilters": "{count, plural, one {Gaitutako iragazki #} other {Gaitutako # iragazki}}",
"components.Discover.FilterSlideover.activefilters": "{count, plural, one {Gaitutako iragazki #} other {Gaitutako # iragazki}}",
@@ -474,6 +478,7 @@
"components.ResetPassword.validationpasswordminchars": "Pasahitza laburregia da; gutxienez 8 karaktere izan beharko lituzke",
"components.Settings.Notifications.botUsernameTip": "Baimendu erabiltzaileei zure bot-ekin txat bat hasi eta jakinarazpenak konfiguratzen",
"components.Settings.SettingsMain.cacheImagesTip": "Kanpotik ateratako irudiak cacheatu (biltegi kantitate handia behar du)",
"components.Settings.SettingsMain.trustProxyTip": "Onartu Jellyseerr proxy baten atzean dauden bezeroen IP helbideak ondo erregistratzea",
"components.Settings.jellyfinlibrariesDescription": "{mediaServerName}-(e)k eskaneatzen dituen liburutegiak. Egin klik beheko botoian liburutegirik zerrendatzen ez bada.",
"components.Settings.scanbackground": "Eskaneatzea atzeko planoan egongo da. Bitartean konfigurazio prozesua jarraitu dezakezu.",
"components.UserList.usercreatedfailedexisting": "Emandako helbide elektronikoa dagoeneko beste erabiltzaile batek darabil.",
@@ -482,7 +487,7 @@
"components.UserProfile.UserSettings.UserPasswordChange.nopermissionDescription": "Ez duzu baimenik erabiltzaile honen pasahitza aldatzeko.",
"components.UserProfile.UserSettings.unauthorizedDescription": "Ez duzu baimenik erabiltzaile honen ezarpenak aldatzeko.",
"components.UserProfile.UserSettings.UserPasswordChange.validationNewPasswordLength": "Pasahitza laburregia da; gutxienez 8 karaktere izan beharko lituzke",
"components.Settings.SettingsUsers.localLoginTip": "Baimendu erabiltzaileei haien helbide elektronikoa eta pasahitza erabiliz saioa hasten",
"components.Settings.SettingsUsers.localLoginTip": "Baimendu erabiltzaileei haien helbide elektronikoa eta pasahitza erabiliz saioa hasten, {mediaServerName}-(r)en OAuth ordez",
"components.RequestModal.QuotaDisplay.allowedRequestsUser": "Erabiltzaile honek <strong> {limit} </strong> {type} eskaera egin ditzake <strong>{days}</strong> egunero.",
"components.RequestModal.QuotaDisplay.quotaLinkUser": "Erabiltzailearen eskaera-mugen laburpena ikus dezakezu <ProfileLink> profil orrian</ProfileLink>.",
"components.RequestModal.requestmovies4k": "Eskatu {count} {count, plural, one {film} other {film}} 4K-n",
@@ -517,6 +522,7 @@
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "{jobScheduleMinutes, plural, one {minute} other {{jobScheduleMinutes} minutes}}",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorSeconds": "{jobScheduleSeconds, plural, one {second} other {{jobScheduleSeconds} seconds}}",
"components.Settings.SettingsMain.toastApiKeyFailure": "Zerbait gaizki joan da API gako berria sortzean.",
"components.Settings.SettingsMain.csrfProtectionTip": "Ezarri kanpoko API sarbidea irakurtzeko soilik (HTTPS behar du)",
"components.Settings.SettingsUsers.newPlexLoginTip": "Onartu {mediaServerName} erabiltzaileak saioa hastea inportatu gabe",
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "URLak ez du barra batean amaitu behar",
"components.Settings.SonarrModal.validationBaseUrlTrailingSlash": "URLa ez du amaierako barra batean amaitu behar",
@@ -785,7 +791,7 @@
"components.NotificationTypeSelector.issuecreatedDescription": "Bidali jakinarazpenak intzidentziak sortzen direnean.",
"components.NotificationTypeSelector.issuereopenedDescription": "Bidali jakinarazpenak intzidentziak berriro irekitzen direnean.",
"components.NotificationTypeSelector.issueresolvedDescription": "Bidali jakinarazpenak intzidentziak konpontzen direnean.",
"components.MovieDetails.watchlistError": "Zerbait gaizki joan da. Mesedez, saiatu berriro.",
"components.MovieDetails.watchlistError": "Zerbait gaizki joan da, saiatu berriro.",
"components.MovieDetails.play4k": "Ikusi 4K-n {mediaServerName}-(e)n",
"components.MovieDetails.rtaudiencescore": "Rotten Tomatoes audientzia puntuazioa",
"components.MovieDetails.play": "Ikusi {mediaServerName}-(e)n",
@@ -1047,16 +1053,27 @@
"components.Settings.SettingsMain.toastSettingsFailure": "Zerbait gaizki joan da ezarpenak gordetzean.",
"components.Settings.SettingsMain.discoverRegionTip": "Iragazi edukia eskualdeko eskuragarritasunarengatik",
"components.Settings.SettingsMain.originallanguageTip": "Iragazi edukia iturrizko hizkuntzarengatik",
"components.Settings.SettingsMain.proxyBypassLocalAddresses": "Saihestu proxya helbide lokaletarako",
"components.Settings.SettingsMain.partialRequestsEnabled": "Baimendu telesailen eskaera partzialak",
"components.Settings.SettingsMain.proxySsl": "Erabili SSL proxyrako",
"components.Settings.SettingsMain.cacheImages": "Gaitu irudien cachea",
"components.Settings.SettingsMain.csrfProtection": "Gaitu CSRF babesa",
"components.Settings.SettingsMain.hideAvailable": "Ezkutatu eskuragarri dagoen multimedia",
"components.Settings.SettingsMain.proxyBypassFilter": "Proxyak ezikusitako helbideak",
"components.Settings.SettingsMain.trustProxy": "Gaitu proxy onarpena",
"components.Settings.SettingsMain.discoverRegion": "Aurkitu eskualdea",
"components.Settings.SettingsMain.generalsettings": "Ezarpen orokorrak",
"components.Settings.SettingsMain.locale": "Bistaratzeko hizkuntza",
"components.Settings.SettingsMain.originallanguage": "Aurkitu hizkuntza",
"components.Settings.SettingsMain.proxyEnabled": "HTTP(S) Proxya",
"components.Settings.SettingsMain.proxyHostname": "Proxy ostalari-izena",
"components.Settings.SettingsMain.proxyPassword": "Proxy pasahitza",
"components.Settings.SettingsMain.proxyPort": "Proxy ataka",
"components.Settings.SettingsMain.proxyUser": "Proxy erabiltzaile-izena",
"components.Settings.SettingsMain.streamingRegion": "Streaming eskualdea",
"components.Settings.SettingsMain.validationApplicationTitle": "Aplikazioaren izenburu bat eman behar duzu",
"components.Settings.SettingsMain.validationApplicationUrl": "Baliozko URL bat eman behar duzu",
"components.Settings.SettingsMain.validationProxyPort": "Baliozko ataka bat eman behar duzu",
"components.Settings.SettingsUsers.defaultPermissionsTip": "Erabiltzaile berrie ematen zaizkien hasierako baimenak",
"components.Settings.SettingsUsers.movieRequestLimitLabel": "Film eskaera muga globala",
"components.Settings.SettingsUsers.newPlexLogin": "Gaitu {mediaServerName} saio hasiera berria",
@@ -1174,7 +1191,7 @@
"components.Settings.toastPlexRefreshSuccess": "Plex zerbitzarien zerrenda ondo lortu da!",
"components.Settings.toastTautulliSettingsSuccess": "Tautulli ezarpenak ondo gorde dira!",
"components.TvDetails.network": "{networkCount, plural, one {Sare} other {Sare}}",
"components.TitleCard.watchlistError": "Zerbait gaizki joan da. Mesedez, saiatu berriro.",
"components.TitleCard.watchlistError": "Zerbait gaizki joan da, saiatu berriro.",
"components.TitleCard.watchlistCancel": "<strong>{title}</strong>-(r)en jarraipen-zerrenda utzita.",
"components.Setup.welcome": "Ongi etorri Jellyseerr-era",
"components.StatusBadge.openinarr": "Ireki {arr}-en",
@@ -1198,7 +1215,7 @@
"components.TvDetails.manageseries": "Kudeatu telesailak",
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> jarraipen zerrendatik ondo kendu da!",
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong> jarraipen zerrendara ondo gehitu da!",
"components.TvDetails.watchlistError": "Zerbait gaizki joan da. Mesedez, saiatu berriro.",
"components.TvDetails.watchlistError": "Zerbait gaizki joan da, saiatu berriro.",
"components.TvDetails.play4k": "Ikusi 4K-n {mediaServerName}-(e)n",
"components.TvDetails.rtaudiencescore": "Rotten Tomatoes audientzia puntuazioa",
"components.TvDetails.play": "Ikusi {mediaServerName}-(e)n",
@@ -1317,7 +1334,7 @@
"components.UserProfile.totalrequests": "Eskaera guztiak",
"components.UserProfile.UserSettings.UserPermissions.toastSettingsSuccess": "Baimenak ondo gorde dira!",
"i18n.blacklistDuplicateError": "<strong>{title}</strong> zerrenda beltzean dago jada.",
"i18n.blacklistError": "Zerbait gaizki joan da. Mesedez, saiatu berriro.",
"i18n.blacklistError": "Zerbait gaizki joan da, saiatu berriro.",
"i18n.resultsperpage": "Erakutsi {pageSize} emaitza orri bakoitzean",
"i18n.blacklistSuccess": "<strong>{title}</strong> zerrenda beltzera gehitu da.",
"i18n.areyousure": "Ziur zaude?",
@@ -1386,104 +1403,5 @@
"components.Settings.SettingsMain.toastApiKeySuccess": "API gako berria ondo sortu da!",
"components.TvDetails.episodeRuntime": "Atalaren iraupena",
"components.Settings.Notifications.NotificationsGotify.gotifysettingssaved": "Gotify jakinarazpenen ezarpenak ondo gorde dira!",
"components.Settings.Notifications.NotificationsLunaSea.settingsSaved": "LunaSea jakinarazpenen ezarpenak ondo gorde dira!",
"components.Settings.OverrideRuleModal.qualityprofile": "Kalitate profila",
"components.Settings.OverrideRuleModal.selectRootFolder": "Hautatu erro-karpeta",
"components.DiscoverTvUpcoming.upcomingtv": "Hurrengo telesailak",
"components.Login.loginwithapp": "Hasi saioa {appName}(r)ekin",
"components.Login.noadminerror": "Ez da administratzaile erabiltzailerik aurkitu zerbitzarian.",
"components.Login.orsigninwith": "Edo hasi saioa honekin",
"components.Selector.searchUsers": "Hautatu erabiltzaileak…",
"components.Settings.OverrideRuleModal.conditions": "Baldintzak",
"components.Settings.OverrideRuleModal.rootfolder": "Erro-karpeta",
"components.Settings.OverrideRuleModal.selectService": "Hautatu zerbitzua",
"components.Settings.OverrideRuleModal.selecttags": "Hautatu etiketak",
"components.Settings.OverrideRuleModal.service": "Zerbitzua",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.plexErrorExists": "Kontu hau dagoeneko Plex erabiltzaile batera lotuta dago",
"components.Settings.overrideRulesDescription": "Gainidatze-arauek eskaera bat arauarekin bat datorrenean ordezkatuko diren propietateak zehazteko aukera ematen dute.",
"components.Settings.SettingsUsers.mediaServerLoginTip": "Eman erabiltzaileei {mediaServerName} kontua erabiliz saioa hasteko aukera",
"components.UserProfile.UserSettings.LinkJellyfinModal.errorUnauthorized": "Ezin da {mediaServerName}era konektatu zure kredentzialak erabiliz",
"components.UserProfile.UserSettings.LinkJellyfinModal.errorUnknown": "Errore ezezaguna gertatu da",
"components.Settings.OverrideRuleModal.createrule": "Gainidazte arau berria",
"components.UserProfile.UserSettings.UserNotificationSettings.telegramMessageThreadIdTip": "Zure taldeko txatak gaiak gaituta baditu, hari/gai baten ID bat zehaztu dezakezu hemen",
"components.UserProfile.UserSettings.LinkJellyfinModal.title": "Lotu {mediaServerName} kontua",
"components.Settings.OverrideRuleModal.keywords": "Gako-hitzak",
"components.Settings.OverrideRuleModal.conditionsDescription": "Parametro-aldaketak aplikatu aurretik baldintzak zehazten ditu. Eremu bakoitza balioztatu behar da aplikatu beharreko arauetarako (AND eragiketa). Eremu bat egiaztatutzat hartzen da propietateetariko bat, bat badatorren (OR eragiketa).",
"components.Settings.Notifications.messageThreadIdTip": "Zure taldeko txatak gaiak gaituta baditu, hari/gai baten ID bat zehaztu dezakezu hemen",
"components.Settings.Notifications.validationMessageThreadId": "Hari/gaiaren IDa zenbaki oso positiboa izan behar da",
"components.Settings.Notifications.messageThreadId": "Hari/Gai ID",
"components.Settings.OverrideRuleTile.tags": "Etiketak",
"components.Settings.OverrideRuleModal.users": "Erabiltzaileak",
"components.Settings.OverrideRuleTile.conditions": "Baldintzak",
"components.Settings.SettingsNetwork.networkDisclaimer": "Ezarpen hauen ordez zure edukiontzi/sistemako sare-parametroak erabili behar dira. Ikusi {docs} informazio gehiagorako.",
"components.Settings.OverrideRuleModal.settingsDescription": "Goiko baldintzak betetzen direnean zein ezarpen aldatuko diren zehazten du.",
"components.Settings.SettingsNetwork.csrfProtectionHoverTip": "EZ ezazu ezarpen hau gaitu egiten ari zarena ez badakizu!",
"components.Settings.SettingsNetwork.forceIpv4FirstTip": "Behartu Jellyseerr IPv4 helbideak konpontzera IPv6ren ordez",
"components.Settings.SettingsNetwork.csrfProtectionTip": "Ezarri kanpoko API sarbidea irakurtzeko soilik (HTTPS behar du)",
"components.Settings.OverrideRuleModal.serviceDescription": "Aplikatu arau hau hautatutako zerbitzura.",
"components.Settings.SettingsNetwork.networksettingsDescription": "Konfiguratu sare ezarpenak zure Jellyseerr instantziarako.",
"components.Settings.OverrideRuleModal.ruleCreated": "Gainidazte araua behar bezala sortu da!",
"components.Settings.OverrideRuleModal.ruleUpdated": "Gainidazte araua ondo eguneratu da!",
"components.Settings.SettingsMain.enableSpecialEpisodes": "Baimendu atal berezien eskaerak",
"components.Settings.SettingsNetwork.forceIpv4First": "Behartu IPv4 ebazpena lehen",
"components.Settings.OverrideRuleModal.editrule": "Editatu gainidazte araua",
"components.Settings.OverrideRuleModal.selectQualityProfile": "Hautatu kalitate profila",
"components.Settings.SettingsNetwork.advancedNetworkSettings": "Sare ezarpen aurreratuak",
"components.Settings.SettingsNetwork.csrfProtection": "Gaitu CSRF babesa",
"components.Settings.OverrideRuleModal.create": "Sortu araua",
"components.Settings.OverrideRuleModal.notagoptions": "Etiketarik ez.",
"components.Settings.OverrideRuleTile.qualityprofile": "Kalitate profila",
"components.Settings.OverrideRuleTile.rootfolder": "Erro-karpeta",
"components.Settings.SettingsNetwork.networksettings": "Sare ezarpenak",
"components.Settings.OverrideRuleModal.genres": "Generoak",
"components.Settings.OverrideRuleModal.languages": "Hizkuntzak",
"components.Settings.OverrideRuleModal.settings": "Ezarpenak",
"components.Settings.OverrideRuleModal.tags": "Etiketak",
"components.Settings.OverrideRuleTile.genre": "Generoa",
"components.Settings.OverrideRuleTile.keywords": "Gako-hitzak",
"components.Settings.OverrideRuleTile.language": "Hizkuntza",
"components.Settings.OverrideRuleTile.settings": "Ezarpenak",
"components.Settings.OverrideRuleTile.users": "Erabiltzaileak",
"components.Settings.SettingsNetwork.docs": "dokumentazioa",
"components.Settings.SettingsNetwork.network": "Sarea",
"components.Settings.SettingsNetwork.proxyBypassFilterTip": "Erabili ',' banatzaile gisa eta '*.' azpidomeinuetarako komodin gisa",
"components.Settings.SettingsNetwork.trustProxyTip": "Baimendu Jellyseerr-i bezeroen IP helbideak behar bezala erregistratzea proxy baten atzean",
"components.UserProfile.UserSettings.LinkJellyfinModal.description": "Sartu zure {mediaServerName} kredentzialak zure kontua {applicationName}-rekin lotzeko.",
"components.Setup.librarieserror": "Baliozkotzeak huts egin du. Mesedez, aldatu liburutegiak berriro jarraitzeko.",
"components.UserProfile.UserSettings.LinkJellyfinModal.errorExists": "Kontu hau dagoeneko {applicationName} erabiltzaile batekin lotuta dago",
"components.Settings.SettingsUsers.atLeastOneAuth": "Gutxienez autentifikazio metodo bat hautatu behar da.",
"components.Settings.SettingsNetwork.toastSettingsFailure": "Zerbait gaizki joan da ezarpenak gordetzean.",
"components.Settings.SettingsNetwork.validationProxyPort": "Baliozko ataka bat eman behar duzu",
"components.Settings.SettingsNetwork.proxyBypassLocalAddresses": "Saihestu proxya helbide lokaletarako",
"components.Settings.SettingsUsers.loginMethodsTip": "Konfiguratu saio hasiera metodoak erabiltzaileentzat.",
"components.UserProfile.UserSettings.LinkJellyfinModal.passwordRequired": "Pasahitza eman behar duzu",
"components.UserProfile.UserSettings.LinkJellyfinModal.usernameRequired": "Erabiltzaile-izena eman behar duzu",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.deleteFailed": "Ezin da lotutako kontua ezabatu.",
"components.Settings.SettingsNetwork.proxySsl": "Erabili SSL proxyrako",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.errorUnknown": "Errore ezezaguna gertatu da",
"components.Settings.SettingsNetwork.proxyBypassFilter": "Proxy ezikusitako helbideak",
"components.Settings.SettingsNetwork.toastSettingsSuccess": "Ezarpenak ondo gorde dira!",
"components.Settings.SettingsNetwork.trustProxy": "Gaitu proxy euskarria",
"components.Settings.SettingsUsers.mediaServerLogin": "Gaitu {mediaServerName} saio hasiera",
"components.Settings.addrule": "Gainidazte arau berria",
"components.Settings.SettingsNetwork.proxyEnabled": "HTTP(S) proxia",
"components.Settings.SettingsNetwork.proxyHostname": "Proxi ostalari-izena",
"components.Settings.SettingsNetwork.proxyPassword": "Proxy pasahitza",
"components.Settings.SettingsNetwork.proxyPort": "Proxy ataka",
"components.Settings.SettingsNetwork.proxyUser": "Proxy erabiltzaile-izena",
"components.Settings.SettingsUsers.loginMethods": "Saio-hasiera metodoak",
"components.Settings.overrideRules": "Gainidazte arauak",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.linkedAccounts": "Lotutako kontuak",
"components.Settings.menuNetwork": "Sarea",
"components.UserProfile.UserSettings.LinkJellyfinModal.password": "Pasahitza",
"components.UserProfile.UserSettings.LinkJellyfinModal.save": "Lotu",
"components.UserProfile.UserSettings.LinkJellyfinModal.saving": "Gehitzen…",
"components.UserProfile.UserSettings.LinkJellyfinModal.username": "Erabiltzaile-izena",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.noLinkedAccounts": "Ez duzu kanpoko konturik zure kontura lotuta.",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.noPermissionDescription": "Ez duzu erabiltzaile honen lotutako kontuak aldatzeko baimenik.",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.linkedAccountsHint": "Kanpoko kontu hauek zure {applicationName} kontuarekin lotuta daude.",
"components.UserProfile.UserSettings.UserNotificationSettings.validationTelegramMessageThreadId": "Hari/gaiaren IDa zenbaki oso positiboa izan behar da",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.plexErrorUnauthorized": "Ezin da Plexera konektatu zure kredentzialak erabiliz",
"components.UserProfile.UserSettings.UserNotificationSettings.telegramMessageThreadId": "Hari/Gai ID",
"components.UserProfile.UserSettings.menuLinkedAccounts": "Lotutako kontuak"
"components.Settings.Notifications.NotificationsLunaSea.settingsSaved": "LunaSea jakinarazpenen ezarpenak ondo gorde dira!"
}

View File

@@ -118,7 +118,7 @@
"components.Discover.tvgenres": "Séries par genres",
"components.Discover.upcoming": "Films à venir",
"components.Discover.upcomingmovies": "Films à venir",
"components.Layout.SearchInput.searchPlaceholder": "Rechercher un film ou une série",
"components.Layout.SearchInput.searchPlaceholder": "Rechercher films et séries",
"components.Layout.Sidebar.dashboard": "Découvrir",
"components.Layout.Sidebar.requests": "Demandes",
"components.Layout.Sidebar.settings": "Paramètres",
@@ -267,11 +267,11 @@
"i18n.movies": "Films",
"i18n.partiallyavailable": "Partiellement disponible",
"i18n.pending": "En attente",
"i18n.processing": "En cours de traitement",
"i18n.processing": "En traitement",
"i18n.tvshows": "Séries",
"i18n.unavailable": "Indisponible",
"pages.oops": "Oups",
"pages.returnHome": "Retourner à l'accueil",
"pages.returnHome": "Retourner à l'acceuil",
"components.TvDetails.TvCast.fullseriescast": "Casting complet de la série",
"components.MovieDetails.MovieCast.fullcast": "Casting complet",
"components.Settings.Notifications.emailsettingssaved": "Paramètres de notification par e-mail enregistrés avec succès !",
@@ -364,7 +364,7 @@
"components.Settings.Notifications.NotificationsPushover.agentenabled": "Activer l'agent",
"components.Settings.Notifications.NotificationsPushover.accessToken": "Jeton API d'application",
"components.RequestList.sortModified": "Dernière modification",
"components.RequestList.sortAdded": "Plus récentes",
"components.RequestList.sortAdded": "Plus récent",
"components.RequestList.showallrequests": "Afficher toutes les demandes",
"components.StatusBadge.status4k": "{status} en 4K",
"components.Settings.Notifications.NotificationsWebhook.webhooksettingssaved": "Paramètres de notification Webhook enregistrés avec succès !",
@@ -401,8 +401,8 @@
"components.UserList.autogeneratepassword": "Générer automatiquement le mot de passe",
"components.UserList.passwordinfodescription": "Configurez l'URL de l'application ainsi que les notifications par e-mail pour permettre la génération automatique de mots de passe.",
"components.UserList.email": "Adresse e-mail",
"components.Login.validationpasswordrequired": "Vous devez renseigner un mot de passe",
"components.Login.validationemailrequired": "Vous devez fournir un e-mail valide",
"components.Login.validationpasswordrequired": "Vous devez renseigner un mot de passe.",
"components.Login.validationemailrequired": "Vous devez fournir un e-mail valide.",
"components.Login.signinwithoverseerr": "Utilisez votre compte {applicationTitle}",
"components.Login.password": "Mot de passe",
"components.Login.loginerror": "Une erreur s'est produite lors de la tentative de connexion.",
@@ -430,9 +430,11 @@
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Nous n'avons pas pu associer cette série automatiquement. Veuillez sélectionner l'association correcte dans la liste ci-dessous.",
"components.Login.signinwithplex": "Utilisez votre compte Plex",
"components.Login.signin": "Connexion",
"components.Login.signinheader": "Connectez-vous pour continuer",
"components.Login.signinheader": "Connectez-vous pour continuer.",
"components.Login.signingin": "Connexion en cours…",
"components.Settings.notificationAgentSettingsDescription": "Configurer et activer les agents de notification.",
"components.PlexLoginButton.signinwithplex": "Se connecter",
"components.PlexLoginButton.signingin": "Connexion en cours…",
"components.UserList.userssaved": "Les permissions d'utilisateur ont été enregistrées avec succès !",
"components.UserList.bulkedit": "Modification en masse",
"components.PermissionEdit.usersDescription": "Autorise à gérer les utilisateurs. Les utilisateurs avec cette autorisation ne peuvent pas modifier les utilisateurs dotés de privilèges d'administrateur ni les accorder.",
@@ -603,9 +605,9 @@
"components.UserProfile.UserSettings.UserPasswordChange.nopermissionDescription": "Vous n'avez l'autorisation de modifier le mot de passe de cet utilisateur.",
"components.UserProfile.UserSettings.UserGeneralSettings.user": "Utilisateur",
"components.UserProfile.UserSettings.UserGeneralSettings.role": "Rôle",
"components.UserProfile.UserSettings.UserGeneralSettings.owner": "Administrateur",
"components.UserProfile.UserSettings.UserGeneralSettings.owner": "Propriétaire",
"components.UserProfile.UserSettings.UserGeneralSettings.admin": "Admin",
"components.UserList.owner": "Administrateur",
"components.UserList.owner": "Propriétaire",
"components.UserProfile.UserSettings.UserGeneralSettings.accounttype": "Type de compte",
"components.UserList.accounttype": "Type de compte",
"components.Settings.SettingsJobsCache.unknownJob": "Tâche inconnue",
@@ -627,7 +629,7 @@
"components.Settings.SettingsJobsCache.sonarr-scan": "Scan de Sonarr",
"components.Settings.SettingsJobsCache.radarr-scan": "Scan de Radarr",
"components.Settings.SettingsJobsCache.plex-recently-added-scan": "Scan des ajouts récents Plex",
"components.Settings.SettingsJobsCache.plex-full-scan": "Scan complet des bibliothèques Plex",
"components.Settings.SettingsJobsCache.plex-full-scan": "Scan complet des bibliothèques Plex.",
"components.Settings.Notifications.validationUrl": "Vous devez fournir une URL valide",
"components.Settings.Notifications.botAvatarUrl": "L'URL de l'avatar de votre Bot",
"components.Settings.SettingsUsers.userSettingsDescription": "Configurer les paramètres généraux et par défaut de l'utilisateur.",
@@ -707,7 +709,7 @@
"components.RequestModal.QuotaDisplay.seasonlimit": "{limit, plural, one {saison} other {saisons}}",
"components.LanguageSelector.originalLanguageDefault": "Toutes les langues",
"components.LanguageSelector.languageServerDefault": "({language}) par défaut",
"i18n.tvshow": "Série",
"i18n.tvshow": "Séries",
"i18n.test": "Tester",
"i18n.save": "Sauvegarder les changements",
"i18n.request4k": "Demander en 4K",
@@ -758,7 +760,7 @@
"components.RequestModal.AdvancedRequester.selecttags": "Sélectionner les tags",
"components.RequestModal.AdvancedRequester.notagoptions": "Aucun tag.",
"components.UserProfile.UserSettings.UserNotificationSettings.pgpPublicKeyTip": "Chiffrer les emails en utilisant <OpenPgpLink>OpenPGP</OpenPgpLink>",
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSetOwnAccount": "Votre compte na actuellement aucun mot de passe. Configurez un mot de passe ci-dessous pour activer la connexion en tant qu \"utilisateur local\" en utilisant votre adresse e-mail.",
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSetOwnAccount": "Votre compte na actuellement pas de mot de passe. Configurez un mot de passe ci-dessous pour activer la connexion en tant qu \"utilisateur local\" en utilisant votre adresse e-mail.",
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSet": "Ce compte utilisateur na actuellement pas de mot de passe. Configurez un mot de passe ci-dessous pour permettre à ce compte de se connecter en tant \"quutilisateur local.\"",
"components.UserProfile.UserSettings.UserNotificationSettings.validationPgpPublicKey": "Vous devez fournir une clé publique PGP valide",
"components.UserProfile.UserSettings.UserNotificationSettings.telegramsettingssaved": "Paramètres de notification Telegram enregistrés avec succès !",
@@ -865,7 +867,7 @@
"components.Settings.is4k": "4K",
"components.Settings.SettingsUsers.newPlexLoginTip": "Autoriser les utilisateurs de {mediaServerName} à se connecter sans être d'abord importés",
"components.Settings.SettingsUsers.newPlexLogin": "Autoriser nouvelle connexion {mediaServerName}",
"components.Settings.SettingsUsers.localLoginTip": "Permettre aux utilisateurs de se connecter en utilisant leur adresse e-mail et leur mot de passe, au lieu de {mediaServerName} OAuth",
"components.Settings.SettingsUsers.localLoginTip": "Autoriser les utilisateurs à se connecter en utilisant leur adresse e-mail et leur mot de passe, au lieu de {mediaServerName} OAuth",
"components.Settings.SettingsUsers.defaultPermissionsTip": "Autorisations par défaut attribuées aux nouveaux utilisateurs",
"components.Settings.Notifications.webhookUrlTip": "Créez une <DiscordWebhookLink>intégration de webhook</DiscordWebhookLink> dans votre serveur",
"components.Settings.Notifications.validationTypes": "Vous devez sélectionner au moins un type de notification",
@@ -1134,8 +1136,8 @@
"components.Login.title": "Ajouter un e-mail",
"components.Login.username": "Nom d'utilisateur",
"components.Login.validationEmailFormat": "E-mail invalide",
"components.Login.validationEmailRequired": "Vous devez fournir un e-mail",
"components.Login.validationemailformat": "Vous devez fournir un e-mail valide",
"components.Login.validationEmailRequired": "Vous devez fournir un e-mail.",
"components.Login.validationemailformat": "Vous devez fournir un e-mail valide.",
"components.Login.validationhostformat": "URL valide requise",
"components.Login.validationhostrequired": "{mediaServerName} URL requise",
"components.Login.validationusernamerequired": "Nom d'utilisateur requis",
@@ -1183,6 +1185,8 @@
"components.TvDetails.Season.noepisodes": "Liste des épisodes non disponible.",
"components.StatusBadge.seasonepisodenumber": "S{seasonNumber}E{episodeNumber}",
"components.RequestCard.unknowntitle": "Titre inconnu",
"components.Settings.SettingsMain.csrfProtectionHoverTip": "NACTIVEZ PAS ce paramètre si vous ne comprenez pas ce que vous faites !",
"components.Settings.SettingsMain.csrfProtection": "Activez la protection CSRF",
"components.Settings.SettingsMain.locale": "Langue d'affichage",
"components.Settings.SettingsMain.toastApiKeySuccess": "Nouvelle clé d'API générée avec succès !",
"components.Settings.SettingsMain.toastApiKeyFailure": "Un problème est survenu lors de la génération de la nouvelle clé d'API.",
@@ -1193,6 +1197,7 @@
"components.Settings.SettingsMain.applicationurl": "URL de l'application",
"components.Settings.SettingsMain.cacheImages": "Activer la mise en cache d'image",
"components.Settings.SettingsMain.cacheImagesTip": "Met en cache localement et utilise des images optimisées (nécessite une quantité considérable d'espace disque)",
"components.Settings.SettingsMain.csrfProtectionTip": "Mettre l'accès à l'API externe en lecture seule (nécessite HTTPS)",
"components.Settings.SettingsMain.general": "Général",
"components.Settings.SettingsMain.generalsettings": "Paramètres généraux",
"components.Settings.SettingsMain.toastSettingsSuccess": "Paramètres sauvegardés avec succès !",
@@ -1212,6 +1217,8 @@
"components.Selector.searchStudios": "Recherchez un ou plusieurs studios…",
"components.Settings.SettingsMain.generalsettingsDescription": "Configurer les paramètres généraux et par défaut pour Jellyseerr.",
"components.Settings.SettingsMain.originallanguage": "Langue à découvrir",
"components.Settings.SettingsMain.trustProxy": "Activer la prise en charge proxy",
"components.Settings.SettingsMain.trustProxyTip": "Permettre à Jellyseerr d'enregistrer correctement les adresses IP des clients derrière un proxy",
"components.Settings.SettingsMain.partialRequestsEnabled": "Permettre les demandes partielles des séries",
"components.Selector.nooptions": "Aucun résultat.",
"components.Layout.Sidebar.browsetv": "Séries",
@@ -1228,8 +1235,8 @@
"components.IssueModal.issueVideo": "Vidéo",
"components.Settings.Notifications.NotificationsPushover.sound": "Son de notification",
"components.Settings.jellyfinSettings": "Paramètres {mediaServerName}",
"components.Settings.jellyfinSettingsFailure": "Un problème est survenu lors de l'enregistrement des paramètres de {mediaServerName}.",
"components.Settings.jellyfinSettingsSuccess": "Les paramètres de {mediaServerName} ont été sauvegardés avec succès !",
"components.Settings.jellyfinSettingsFailure": "Une erreur est survenue lors de l'enregistrement des paramètres pour {mediaServerName}.",
"components.Settings.jellyfinSettingsSuccess": "Les paramètres pour {mediaServerName} ont été enregistrés avec succès!",
"components.Settings.jellyfinlibraries": "Bibliothèques {mediaServerName}",
"components.Settings.jellyfinlibrariesDescription": "Les bibliothèques de {mediaServerName} sont en cours d'analyse. Cliquez sur le bouton ci-dessous si aucune bibliothèque n'est répertoriée.",
"components.Settings.jellyfinsettings": "Paramètres {mediaServerName}",
@@ -1245,7 +1252,7 @@
"components.StatusBadge.playonplex": "Lire sur {mediaServerName}",
"components.TitleCard.addToWatchList": "Ajouter à la liste de surveillance",
"components.TitleCard.watchlistCancel": "Watchlist pour <strong>{title}</strong> annulée.",
"components.TitleCard.watchlistError": "Un problème est survenu. Veuillez réessayer.",
"components.TitleCard.watchlistError": "Une erreur est survenue. Veuillez réessayer.",
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong> a été ajouté à votre watchlist avec succès !",
"components.TvDetails.Season.somethingwentwrong": "Une erreur est survenue lors de la récupération des données de la saison.",
"components.TvDetails.manageseries": "Gérer les séries",
@@ -1264,11 +1271,11 @@
"components.UserProfile.plexwatchlist": "Watchlist Plex",
"components.Settings.syncJellyfin": "Synchroniser les bibliothèques",
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> a été retiré de votre watchlist avec succès !",
"components.IssueModal.issueSubtitles": "Sous-titres",
"components.IssueModal.issueSubtitles": "Sous-titre",
"components.Login.emailtooltip": "L'adresse ne nécessite pas d'être associée avec votre instance {mediaServerName}.",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Appareil par défaut",
"components.Settings.Notifications.userEmailRequired": "Exiger l'adresse e-mail de l'utilisateur",
"components.Settings.SettingsAbout.supportjellyseerr": "Soutenir Jellyseerr",
"components.Settings.Notifications.userEmailRequired": "E-mail utilisateur requis",
"components.Settings.SettingsAbout.supportjellyseerr": "Soutenez Jellyseerr",
"components.Settings.SettingsJobsCache.jellyfin-full-scan": "Scan complet des bibliothèques Jellyfin",
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Scan des ajouts récents aux bibliothèques Jellyfin",
"components.Settings.SonarrModal.animeSeriesType": "Type de série anime",
@@ -1294,11 +1301,11 @@
"components.MovieDetails.removefromwatchlist": "Supprimer de la liste de surveillance",
"components.Login.adminerror": "Vous devez utiliser un compte administrateur pour vous connecter.",
"components.MovieDetails.addtowatchlist": "Ajouter à la liste de surveillance",
"components.MovieDetails.watchlistDeleted": "<strong>{title}</strong> a bien été supprimé de la liste de suivi !",
"components.MovieDetails.watchlistDeleted": "<strong>{title}</strong> Supprimé de la liste de surveillance avec succès!",
"components.Login.validationUrlBaseTrailingSlash": "L'URL de base ne doit pas se terminer par une barre oblique finale",
"components.RequestList.RequestItem.profileName": "Profil",
"components.UserProfile.UserSettings.UserGeneralSettings.validationemailformat": "Email valide requis",
"components.TvDetails.watchlistDeleted": "<strong>{title}</strong> a bien été supprimé de la liste de suivi !",
"components.TvDetails.watchlistDeleted": "<strong>{title}</strong> Supprimé de la liste de surveillance avec succès!",
"components.TvDetails.addtowatchlist": "Ajouter à la liste de surveillance",
"components.Login.enablessl": "Utilise SSL",
"components.Login.hostname": "URL de {mediaServerName}",
@@ -1308,16 +1315,16 @@
"components.Login.validationPortRequired": "Vous devez fournir un numéro de port valide",
"components.Login.validationUrlBaseLeadingSlash": "L'URL de base doit avoir une barre oblique initiale",
"components.Login.validationUrlTrailingSlash": "L'URL ne doit pas se terminer par une barre oblique finale",
"components.MovieDetails.watchlistError": "Une erreur s'est produite. Merci de réessayez.",
"components.MovieDetails.watchlistSuccess": "<strong>{title}</strong> a bien été ajouté à la liste de suivi !",
"components.MovieDetails.watchlistError": "Une erreur s'est produite, réessayez.",
"components.MovieDetails.watchlistSuccess": "<strong>{title}</strong> a été ajouté à la liste de surveillance avec succès!",
"components.Settings.invalidurlerror": "Impossible de se connecter au serveur {mediaServerName}.",
"components.Settings.jellyfinForgotPasswordUrl": "URL de mot de passe oublié",
"components.Settings.jellyfinSyncFailedAutomaticGroupedFolders": "L'authentification personnalisée avec le regroupement automatique de bibliothèques n'est pas prise en charge",
"components.Settings.jellyfinSyncFailedGenericError": "Une erreur s'est produite lors de la synchronisation des bibliothèques",
"components.Settings.jellyfinSyncFailedNoLibrariesFound": "Aucune bibliothèque n'a été trouvée",
"components.TvDetails.removefromwatchlist": "Supprimer de la liste de surveillance",
"components.TvDetails.watchlistError": "Un problème est survenu. Veuillez réessayer.",
"components.TvDetails.watchlistSuccess": "<strong>{title}</strong> a bien été ajouté à la liste de suivi !",
"components.TvDetails.watchlistError": "Une erreur s'est produite, réessayez.",
"components.TvDetails.watchlistSuccess": "<strong>{title}</strong> a été ajouté à la liste de surveillance avec succès!",
"components.UserList.username": "Nom d'utilisateur",
"components.UserList.validationUsername": "Vous devez fournir un nom d'utilisateur",
"components.UserProfile.UserSettings.UserGeneralSettings.validationemailrequired": "Email requis",
@@ -1341,7 +1348,7 @@
"components.StatusBadge.seasonnumber": "S{seasonNumber}",
"components.Discover.FilterSlideover.status": "Statut",
"components.Blacklist.mediaType": "Type",
"components.Blacklist.mediaTmdbId": "Identifiant tmdb",
"components.Blacklist.mediaTmdbId": "tmdb Id",
"components.Blacklist.blacklistdate": "date",
"components.Blacklist.blacklistedby": "{date} par {user}",
"components.Blacklist.mediaName": "Nom",
@@ -1354,11 +1361,12 @@
"components.Layout.Sidebar.blacklist": "Liste noire",
"components.PermissionEdit.viewblacklistedItems": "Voir les médias dans la liste noire.",
"i18n.blacklistDuplicateError": "<strong>{title}</strong> est déjà dans la liste noire.",
"i18n.blacklistError": "Un problème est survenu. Veuillez réessayer.",
"i18n.blacklistError": "Une erreur s'est produite, réessayez.",
"components.PermissionEdit.blacklistedItems": "Ajouter le média à la liste noire.",
"components.Settings.Notifications.validationWebhookRoleId": "Vous devez fournir un identifiant Discord valide",
"components.Settings.SettingsMain.discoverRegion": "Pays à découvrir",
"components.PermissionEdit.manageblacklistDescription": "Accorder la permission de gérer la liste noire.",
"components.Settings.SettingsMain.proxyPassword": "Mot de passe du proxy",
"components.RequestList.RequestItem.removearr": "Supprimer de {arr}",
"components.Settings.SettingsMain.streamingRegionTip": "Afficher les sites de streaming par disponibilité dans les pays",
"components.UserProfile.UserSettings.UserGeneralSettings.streamingRegionTip": "Afficher les sites de streaming par disponibilité régionale",
@@ -1368,7 +1376,16 @@
"components.RequestList.sortDirection": "Inverser la direction du tri",
"components.Settings.SettingsJobsCache.usersavatars": "Avatars des utilisateurs",
"components.Settings.SettingsMain.discoverRegionTip": "Filtrer le contenu par disponibilité dans les pays",
"components.Settings.SettingsMain.proxyBypassFilterTip": "Utilisez ',' comme séparateur et '*.' comme caractère générique pour les sous-domaines",
"components.Settings.SettingsMain.proxyEnabled": "Proxy HTTP(S)",
"components.Settings.SettingsMain.proxyHostname": "Nom d'hôte du proxy",
"components.Settings.SettingsMain.proxyPort": "Port du proxy",
"components.Settings.SettingsMain.proxySsl": "Utiliser SSL pour le proxy",
"components.Settings.SettingsMain.proxyUser": "Nom d'utilisateur du proxy",
"components.Settings.SettingsMain.streamingRegion": "Pays de diffusion",
"components.Settings.SettingsMain.proxyBypassLocalAddresses": "Contourner le proxy pour les adresses locales",
"components.Settings.SettingsMain.proxyBypassFilter": "Adresses proxy ignorées",
"components.Settings.SettingsMain.validationProxyPort": "Vous devez fournir un port valide",
"components.Settings.apiKey": "Clé API",
"components.Settings.scanbackground": "L'analyse s'exécutera en arrière-plan. Vous pouvez poursuivre la configuration en attendant.",
"components.UserProfile.UserSettings.UserGeneralSettings.discoverRegion": "Pays à découvrir",
@@ -1386,104 +1403,5 @@
"components.Settings.Notifications.webhookRoleIdTip": "L'ID à mentionner dans le message du webhook. Laissez ce champ vide pour désactiver les mentions",
"components.Settings.Notifications.webhookRoleId": "ID de rôle de notification",
"components.Settings.SettingsJobsCache.plex-refresh-token": "Rafraîchir le token Plex",
"components.Settings.tip": "Conseil",
"components.Login.loginwithapp": "Se connecter avec {appName}",
"components.Settings.SettingsNetwork.network": "Réseau",
"components.Settings.OverrideRuleModal.genres": "Genres",
"components.Settings.SettingsNetwork.csrfProtectionHoverTip": "N'activez pas ce paramètre à moins que vous ne compreniez ce que vous faites !",
"components.Settings.OverrideRuleModal.selectQualityProfile": "Choisir le profil de qualité",
"components.Settings.OverrideRuleModal.selectRootFolder": "Choisir le dossier racine",
"components.Settings.SettingsNetwork.networksettings": "Paramètres réseau",
"components.Settings.SettingsNetwork.advancedNetworkSettings": "Paramètres réseau avancés",
"components.DiscoverTvUpcoming.upcomingtv": "Séries à venir",
"components.Login.noadminerror": "Aucun compte administrateur trouvé sur ce serveur.",
"components.Login.orsigninwith": "Ou se connecter avec",
"components.Settings.OverrideRuleModal.keywords": "Mots clés",
"components.Settings.OverrideRuleModal.qualityprofile": "Profil de qualité",
"components.Settings.OverrideRuleModal.rootfolder": "Dossier racine",
"components.Settings.OverrideRuleModal.selectService": "Choisir le service",
"components.Settings.OverrideRuleModal.settings": "Paramètres",
"components.Settings.OverrideRuleModal.selecttags": "Choisir les étiquettes",
"components.Settings.OverrideRuleModal.tags": "Étiquettes",
"components.Settings.OverrideRuleModal.users": "Utilisateurs",
"components.Settings.OverrideRuleTile.genre": "Genre",
"components.Settings.OverrideRuleTile.keywords": "Mots clés",
"components.Settings.OverrideRuleTile.qualityprofile": "Profil de qualité",
"components.Settings.OverrideRuleTile.rootfolder": "Dossier racine",
"components.Settings.OverrideRuleTile.settings": "Paramètres",
"components.Settings.OverrideRuleTile.tags": "Étiquettes",
"components.Settings.OverrideRuleTile.users": "Utilisateurs",
"components.Settings.SettingsNetwork.docs": "documentation",
"components.Selector.searchUsers": "Sélectionner un utilisateur…",
"components.Settings.SettingsNetwork.networkDisclaimer": "Les paramètres réseau de votre conteneur/système doivent être utilisés à la place de ces paramètres. Consultez la documentation pour plus d'informations.",
"components.Settings.SettingsMain.enableSpecialEpisodes": "Autoriser les demandes d'épisodes spéciaux",
"components.Settings.SettingsUsers.loginMethods": "Méthodes de connexion",
"components.Settings.menuNetwork": "Réseau",
"components.Settings.SettingsUsers.mediaServerLoginTip": "Autoriser les utilisateurs à se connecter en utilisant leur compte {mediaServerName}",
"components.UserProfile.UserSettings.LinkJellyfinModal.description": "Saisissez vos informations de connexion à {mediaServerName} pour lier votre compte à {applicationName}.",
"components.UserProfile.UserSettings.UserNotificationSettings.telegramMessageThreadId": "ID du fil de discussion",
"components.Setup.librarieserror": "La validation a échoué. Veuillez réactiver les bibliothèques pour continuer.",
"components.Settings.Notifications.messageThreadId": "ID du fil de discussion",
"components.Settings.overrideRulesDescription": "Les règles de substitution vous permettent de spécifier les propriétés qui seront remplacées si une demande correspond à la règle.",
"components.Settings.Notifications.messageThreadIdTip": "Si votre discussion de groupe prend en charge les fils de discussion, vous pouvez spécifier son identifiant ici",
"components.Settings.SettingsUsers.atLeastOneAuth": "Au moins une méthode d'authentification doit être sélectionnée.",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.linkedAccountsHint": "Ces comptes externes sont liés à votre compte {applicationName}.",
"components.UserProfile.UserSettings.UserNotificationSettings.telegramMessageThreadIdTip": "Si votre discussion de groupe prend en charge les fils de discussion, vous pouvez spécifier son identifiant ici",
"components.Settings.OverrideRuleModal.conditionsDescription": "Spécifie les conditions avant d'appliquer les modifications des paramètres. Chaque champ doit être validé pour que les règles s'appliquent (opération ET). Un champ est considéré comme vérifié si l'une de ses propriétés correspond (opération OU).",
"components.Settings.SettingsNetwork.toastSettingsFailure": "Un problème s'est produit lors de l'enregistrement des paramètres.",
"components.UserProfile.UserSettings.LinkJellyfinModal.errorUnauthorized": "Impossible de se connecter à {mediaServerName} en utilisant vos informations de connexion",
"components.UserProfile.UserSettings.LinkJellyfinModal.passwordRequired": "Vous devez fournir un mot de passe",
"components.Settings.addrule": "Nouvelle règle de substitution",
"components.Settings.Notifications.validationMessageThreadId": "L'identifiant du fil de discussion doit être un nombre entier positif",
"components.Settings.OverrideRuleModal.conditions": "Conditions",
"components.Settings.OverrideRuleModal.languages": "Langues",
"components.Settings.OverrideRuleModal.notagoptions": "Pas de tag.",
"components.Settings.OverrideRuleModal.editrule": "Modifier la règle de substitution",
"components.Settings.OverrideRuleModal.ruleCreated": "La règle de substitution a été créée avec succès !",
"components.Settings.OverrideRuleModal.ruleUpdated": "La règle de substitution a été mise à jour avec succès !",
"components.Settings.OverrideRuleModal.service": "Service",
"components.Settings.OverrideRuleModal.serviceDescription": "Appliquer cette règle au service sélectionné.",
"components.Settings.OverrideRuleModal.settingsDescription": "Spécifie les paramètres qui seront modifiés lorsque les conditions ci-dessus sont remplies.",
"components.Settings.OverrideRuleTile.conditions": "Conditions",
"components.Settings.OverrideRuleTile.language": "Langue",
"components.Settings.SettingsNetwork.csrfProtection": "Activer la protection CSRF",
"components.Settings.SettingsNetwork.csrfProtectionTip": "Définir l'accès à l'API externe en lecture seule (nécessite HTTPS)",
"components.Settings.SettingsNetwork.forceIpv4First": "Forcer la résolution IPv4 en premier",
"components.Settings.SettingsNetwork.forceIpv4FirstTip": "Forcer Jellyseerr à résoudre d'abord les adresses IPv4 au lieu d'IPv6",
"components.Settings.SettingsNetwork.networksettingsDescription": "Configurez les paramètres réseau de votre instance Jellyseerr.",
"components.Settings.SettingsNetwork.proxyBypassFilter": "Adresses ignorées par le proxy",
"components.Settings.SettingsNetwork.proxyBypassFilterTip": "Utilisez ',' comme séparateur et '*' comme wildcard pour les sous-domaines",
"components.Settings.SettingsNetwork.proxyBypassLocalAddresses": "Contourner le proxy pour les adresses locales",
"components.Settings.SettingsNetwork.proxyEnabled": "Proxy HTTP(S)",
"components.Settings.SettingsNetwork.proxyHostname": "Nom d'hôte du proxy",
"components.Settings.SettingsNetwork.proxyPassword": "Mot de passe du proxy",
"components.Settings.SettingsNetwork.proxyPort": "Port du proxy",
"components.Settings.SettingsNetwork.proxySsl": "Utiliser SSL pour le proxy",
"components.Settings.SettingsNetwork.proxyUser": "Nom d'utilisateur du proxy",
"components.Settings.SettingsNetwork.toastSettingsSuccess": "Les paramètres ont été enregistrés avec succès !",
"components.Settings.SettingsNetwork.trustProxy": "Activer la prise en charge du proxy",
"components.Settings.SettingsNetwork.trustProxyTip": "Permettre à Jellyseerr d'enregistrer correctement les adresses IP des clients derrière un proxy",
"components.Settings.SettingsNetwork.validationProxyPort": "Vous devez indiquer un port valide",
"components.Settings.SettingsUsers.loginMethodsTip": "Configurer les méthodes de connexion pour les utilisateurs.",
"components.Settings.SettingsUsers.mediaServerLogin": "Activer la connexion à {mediaServerName}",
"components.Settings.overrideRules": "Règles de substitution",
"components.UserProfile.UserSettings.LinkJellyfinModal.errorExists": "Ce compte est déjà lié à un utilisateur {applicationName}",
"components.UserProfile.UserSettings.LinkJellyfinModal.errorUnknown": "Une erreur inconnue est survenue",
"components.UserProfile.UserSettings.LinkJellyfinModal.password": "Mot de passe",
"components.UserProfile.UserSettings.LinkJellyfinModal.save": "Lien",
"components.UserProfile.UserSettings.LinkJellyfinModal.saving": "Ajout en cours…",
"components.UserProfile.UserSettings.LinkJellyfinModal.title": "Lier le compte {mediaServerName}",
"components.UserProfile.UserSettings.LinkJellyfinModal.username": "Nom d'utilisateur",
"components.UserProfile.UserSettings.LinkJellyfinModal.usernameRequired": "Vous devez fournir un nom d'utilisateur",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.deleteFailed": "Impossible de supprimer le compte associé.",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.errorUnknown": "Une erreur inconnue est survenue",
"components.UserProfile.UserSettings.UserNotificationSettings.validationTelegramMessageThreadId": "L'identifiant du fil de discussion doit être un nombre entier positif",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.linkedAccounts": "Comptes liés",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.noLinkedAccounts": "Vous n'avez pas de comptes externes liés à votre compte.",
"components.UserProfile.UserSettings.menuLinkedAccounts": "Comptes liés",
"components.Settings.OverrideRuleModal.create": "Créer une règle",
"components.Settings.OverrideRuleModal.createrule": "Nouvelle règle de remplacement",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.noPermissionDescription": "Vous n'avez pas la permission de modifier les comptes liés de cet utilisateur.",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.plexErrorExists": "Ce compte est déjà lié à un utilisateur Plex",
"components.UserProfile.UserSettings.UserLinkedAccountsSettings.plexErrorUnauthorized": "Impossible de se connecter à Plex en utilisant vos identifiants"
"components.Settings.tip": "Conseil"
}

View File

@@ -76,7 +76,7 @@
"components.Layout.Sidebar.users": "משתמשים",
"components.Layout.UserDropdown.myprofile": "פרופיל",
"components.Layout.UserDropdown.settings": "הגדרות",
"components.Layout.VersionStatus.streamdevelop": "Jellyseerr פיתוח",
"components.Layout.VersionStatus.streamdevelop": "פיתוח Jellyseerr",
"components.AirDateBadge.airedrelative": "שודר ב-{relativeTime}",
"components.Discover.NetworkSlider.networks": "רשתות שידור",
"components.Discover.discover": "לגלות",
@@ -222,7 +222,7 @@
"components.Discover.tvgenres": "ז'אנרים של סדרות",
"components.Discover.updatefailed": "משהו השתבש במהלך עדכון הגדרות של גילוי.",
"components.Discover.updatesuccess": "הגדרות הגילוי התעדכנו.",
"components.IssueList.IssueItem.seasons": "{seasonCount, plural, one {עונה} other {עונות}}",
"components.IssueList.IssueItem.seasons": "{seasonCount, plural, one {Season} other {Seasons}}",
"components.Layout.Sidebar.browsetv": "סדרות",
"components.Layout.UserWarnings.emailRequired": "דרושה כתובת מייל.",
"components.Layout.UserWarnings.passwordRequired": "דרושה סיסמה.",
@@ -283,13 +283,13 @@
"components.MovieDetails.showless": "הראה פחות",
"components.MovieDetails.showmore": "הראה יותר",
"components.MovieDetails.streamingproviders": "זמין כעת ב",
"components.MovieDetails.studio": "{studioCount, plural, one {אולפן} other {אולפנים}}",
"components.MovieDetails.studio": "{studioCount, plural, one {Studio} other {Studios}}",
"components.Discover.moviegenres": "ז'אנרים של סרטים",
"components.Discover.resetfailed": "משהו השתבש, מאפס את ההתאמה האישית בגילוי.",
"components.Discover.resetwarning": "מאפס את כל המחוונים, זה ימחק כל מחוון מותאם אישית!",
"components.Discover.tmdbtvstreamingservices": "רשתות צפייה של סדרות בTMDB",
"components.DownloadBlock.formattedTitle": "{title}: עונה {seasonNumber} פרק {episodeNumber}",
"components.IssueList.IssueItem.episodes": "{episodeCount, plural, one {פרק} other {פרקים}}",
"components.IssueList.IssueItem.episodes": "{episodeCount, plural, one {Episode} other {Episodes}}",
"components.Layout.Sidebar.browsemovies": "סרטים",
"components.Layout.UserWarnings.emailInvalid": "כתובת מייל אינה תקינה.",
"components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {commit} other {commits}} מאחור",
@@ -297,11 +297,11 @@
"components.Login.validationhostformat": "נדרש קישור תקין",
"components.ManageSlideOver.manageModalClearMediaWarning": "* כל הנתונים שלך ל-{mediaType}, כולל בקשות, ימחקו. אם זה קיים בספרייה של {mediaServerName}, זה יצור אותה מחדש בסריקה הבאה.",
"components.ManageSlideOver.markallseasons4kavailable": "סמן את כל העונות כזמינות ב-4K",
"components.ManageSlideOver.plays": "<strong>{playCount, number}</strong> {playCount, plural, one {הפעל} other {הפעלות}}",
"components.ManageSlideOver.plays": "<strong>{playCount, number}</strong> {playCount, plural, one {play} other {plays}}",
"components.MovieDetails.managemovie": "נהל סרט",
"components.MovieDetails.overviewunavailable": "סקירה לא זמינה.",
"components.MovieDetails.productioncountries": "נוצר ב-{countryCount, plural, one {Country} other {Countries}}",
"components.MovieDetails.releasedate": "{releaseCount, plural, one {תאריך השקה} other {תאריכי השקה}}",
"components.MovieDetails.releasedate": "{releaseCount, plural, one {Release Date} other {Release Dates}}",
"components.MovieDetails.reportissue": "דווח על תקלה",
"components.MovieDetails.similar": "כותרים דומים",
"components.Login.emailtooltip": "הכתובת אינה צריכה להיות משוייכת ל-{mediaServerName}.",
@@ -334,7 +334,7 @@
"components.NotificationTypeSelector.mediafailed": "עיבוד הבקשה נכשל",
"components.NotificationTypeSelector.mediarequested": "בקשה ממתינה לאישור",
"components.NotificationTypeSelector.mediarequestedDescription": "קבלת התראות כאשר משתמשים פותחים בקשות מדיה שדורשות אישור.",
"components.NotificationTypeSelector.userissuecreatedDescription": "קבלת התראות כאשר משתמשים אחרים מדווחים על תקלות.",
"components.NotificationTypeSelector.userissuecreatedDescription": "קבלת התראות כאשר משתמשים אחרים מדווחים על תקלות",
"components.PermissionEdit.admin": "מנהל",
"components.PermissionEdit.adminDescription": "גישת מנהל מלאה. עוקף את כל ההרשאות שסומנו.",
"components.PermissionEdit.advancedrequest": "בקשות מתקדמות",
@@ -342,9 +342,9 @@
"components.PermissionEdit.autoapprove": "אישור אוטומטי",
"components.PermissionEdit.autoapprove4k": "אישור אוטומטי של 4K",
"components.PermissionEdit.autoapprove4kMovies": "אישור אוטומטי סרטי 4K",
"components.PermissionEdit.autoapprove4kMoviesDescription": "אישור אוטומטי של בקשות לסרטים 4K.",
"components.PermissionEdit.autoapprove4kMoviesDescription": "אישור אוטומטי של בקשות לסרטים 4K",
"components.PermissionEdit.autoapprove4kSeries": "אישור אוטומטי של סדרות 4K",
"components.PermissionEdit.autoapproveDescription": "אישור אוטומטי של בקשות לסדרות ברזולוציית נמוכה מ-4K.",
"components.PermissionEdit.autoapproveDescription": "אישור אוטומטי של בקשות לסדרות ברזולוציית נמוכה מ-4K",
"components.PermissionEdit.autoapproveMovies": "אישור סרטים אוטומטי",
"components.PermissionEdit.autoapproveMoviesDescription": "אישור בקשות סרטים אוטומטי (ללא 4K).",
"components.PermissionEdit.autoapproveSeries": "אישור סדרות אוטומטי",
@@ -352,321 +352,7 @@
"components.NotificationTypeSelector.mediafailedDescription": "קבלת התראות כאשר יש כשל בהוספת בקשות מדיה אל Radarr או Sonarr",
"components.NotificationTypeSelector.notificationTypes": "סוגי התראות",
"components.NotificationTypeSelector.userissuecommentDescription": "קבלת התראות כאשר תקלות שדיווחת מקבלות תגובות חדשות.",
"components.PermissionEdit.autoapprove4kDescription": "אישור אוטומטי של בקשות מדיה 4K.",
"components.PermissionEdit.autoapprove4kSeriesDescription": "אישור אוטומטי של בקשות לסדרות ברזולוציית 4K.",
"components.PermissionEdit.autoapproveSeriesDescription": "אישור בקשות סדרות אוטומטי (ללא 4K).",
"component.BlacklistBlock.blacklistdate": "תאריך חסימה",
"components.Login.hostname": "{mediaServerName} כתובת URL",
"components.Login.validationHostnameRequired": "עליך להזין שם מארח או כתובת IP תקינה",
"components.Login.validationUrlBaseTrailingSlash": "בסיס ה-URL לא יכול להסתיים בסלאש",
"components.MovieDetails.watchlistSuccess": "<strong>{title}</strong> נוסף לרשימת הצפייה בהצלחה!",
"components.NotificationTypeSelector.usermediaAutoApprovedDescription": "קבלת התראות כאשר משתמשים אחרים מגישים בקשות מדיה חדשות אשר מאושרות אוטומטית.",
"components.PermissionEdit.createissuesDescription": "הענקת גישה לדווח על בעיות מדיה.",
"components.PermissionEdit.usersDescription": "הענקת גישה לניהול משתמשים. משתמשים עם גישה זאת לא יכולים לשנות משתמשים עם הרשאות מנהל או להעניק הרשאות מנהל.",
"components.QuotaSelector.tvRequests": "{quotaLimit} <quotaUnits>{seasons} לכל {quotaDays} {days}</quotaUnits>",
"components.RequestBlock.languageprofile": "פרופיל שפה",
"components.RequestList.RequestItem.failedretry": "משהו השתבש בעת ניסוי שליחת הבקשה מחדש.",
"components.RequestModal.AdvancedRequester.animenote": "* סדרה זו היא אנימה.",
"components.RequestModal.QuotaDisplay.quotaLink": "ניתן לראות סיכום של מגבלת הבקשות שלך ב<ProfileLink>דף הפרופיל</ProfileLink> שלך.",
"components.RequestModal.QuotaDisplay.quotaLinkUser": "ניתן לראות סיכום של מגבלת הבקשות של משתמש זה ב<ProfileLink>דף הפרופיל</ProfileLink> שלו.",
"components.RequestModal.requestmovies4k": "בקשת {count} {count, plural, one {סרט} other {סרטים}} ב-4K",
"components.Settings.Notifications.NotificationsPushover.accessTokenTip": "<ApplicationRegistrationLink>רשימת יישום</ApplicationRegistrationLink> בשביל שימוש עם Jellyseerr",
"component.BlacklistBlock.blacklistedby": "נחסם על ידי",
"components.NotificationTypeSelector.usermediarequestedDescription": "קבלת התראות כאשר משתמשים אחרים מגישים בקשות מדיה חדשות שדורשות אישור.",
"components.PermissionEdit.autorequestMovies": "בקשת סרטים אוטומטית",
"components.PermissionEdit.autorequestMoviesDescription": "הענקת גישה לשליחה אוטומטית של סרטים שאינם 4K בעזרת רשימת הצפייה של Plex.",
"components.PermissionEdit.managerequestsDescription": "הענקת גישה לניהול בקשות מדיה. כל הבקשות שנעשות על ידי משתמש עם גישה זאת יאושרו אוטומטית.",
"components.PermissionEdit.requestMoviesDescription": "הענקת גישה לשליחת בקשות לסרטים שאינם 4K.",
"components.PermissionEdit.viewrequestsDescription": "הענקת גישה לצפות בבקשות מדיה שנשלחו על ידי משתמשים אחרים.",
"components.RequestBlock.lastmodifiedby": "שונה לאחרונה על ידי",
"components.RequestButton.approverequests": "אישור {requestCount, plural, one {בקשה} other {{requestCount} בקשות}}",
"components.RequestCard.failedretry": "משהו השתבש בעת ניסוי שליחת הבקשה מחדש.",
"components.RequestModal.requestCancel": "בקשה ל-<strong>{title}</strong> בוטלה.",
"components.RequestModal.selectseason": "בחירת עונה/ות",
"components.ResetPassword.requestresetlinksuccessmessage": "קישור לאיפוס סיסמה יישלח לכתובת המייל שסופקה אם היא קשורה למשתמש תקין.",
"components.Selector.canceled": "בוטל",
"components.Selector.ended": "נגמר",
"components.Selector.searchStudios": "חיפוש אולפנים…",
"components.Settings.Notifications.NotificationsGotify.validationTokenRequired": "עליך לספק אסימון יישום",
"components.Settings.Notifications.NotificationsLunaSea.agentenabled": "הפעל סוכן",
"components.Settings.Notifications.NotificationsSlack.slacksettingsfailed": "הגדרות ההתראות של Slack נכשלו להישמר.",
"components.Settings.Notifications.NotificationsSlack.validationWebhookUrl": "עליך לספק כתובת URL תקינה",
"components.Layout.Sidebar.blacklist": "רשימת חסימות",
"components.Login.back": "חזרה",
"components.PermissionEdit.viewissuesDescription": "הענקת גישה לראות בעיות מדיה שדווחו על ידי משתמשים אחרים.",
"components.RequestButton.viewrequest4k": "צפייה בבקשת 4K",
"components.RequestModal.QuotaDisplay.allowedRequests": "מותר לך לבקש <strong>{limit}</strong> {type} כל <strong>{days}</strong> ימים.",
"components.RequestModal.QuotaDisplay.requiredquotaUser": "על משתמש זה להיות עם לפחות <strong>{seasons}</strong> {seasons, plural, one {בקשת עונה} other {בקשות עונה}} שנותרו כדי לשלוח בקשה עבור סדרה זו.",
"components.RequestModal.pending4krequest": "בקשת 4K ממתינה",
"components.RequestModal.requestedited": "בקשה עבור <strong>{title}</strong> נערכה בהצלחה!",
"components.Settings.Notifications.NotificationsGotify.gotifysettingsfailed": "הגדרות ההתראות של Gotify נכשלו להישמר.",
"components.Settings.Notifications.NotificationsLunaSea.validationWebhookUrl": "עליך לספק כתובת URL תקינה",
"components.Settings.Notifications.NotificationsPushbullet.toastPushbulletTestSending": "שולח התראת בדיקה של Pushbullet…",
"components.Settings.Notifications.NotificationsPushover.userTokenTip": "<UsersGroupsLink>מזהה המשתמש או הקבוצה</UsersGroupsLink> בעל ה-30 תווים שלך",
"components.Login.adminerror": "עליך להשתמש בחשבון מנהל בשביל להתחבר.",
"components.NotificationTypeSelector.userissueresolvedDescription": "קבלת התראות כאשר הבעיות שדיווחת נפתרות.",
"components.Discover.FilterSlideover.status": "סטטוס",
"components.PermissionEdit.blacklistedItemsDescription": "הענקת גישה לחסימת מדיה.",
"components.RequestBlock.seasons": "{seasonCount, plural, one {עונה} other {עונות}}",
"components.RequestModal.errorediting": "משהו השתבש בזמן עריכת הבקשה.",
"components.ResetPassword.validationpasswordrequired": "יש לספק סיסמה",
"components.Selector.inProduction": "בהפקה",
"components.Selector.pilot": "פרק דוגמה",
"components.Settings.Notifications.NotificationsLunaSea.settingsSaved": "הגדרות ההתראות של LunaSea נשמרו בהצלחה!",
"components.Settings.Notifications.NotificationsPushbullet.accessTokenTip": "יצירת אסימון מתוך <PushbulletSettingsLink>הגדרות המשתמש</PushbulletSettingsLink> שלך",
"components.Settings.Notifications.NotificationsPushbullet.validationAccessTokenRequired": "עליך לספק אסימון גישה",
"components.PermissionEdit.manageblacklistDescription": "הענקת גישה לניהול מדיה חסומה.",
"components.PersonDetails.appearsin": "מופעים",
"components.RequestCard.tmdbid": "מזהה TMDB",
"components.DiscoverTvUpcoming.upcomingtv": "סדרות שיצאו בקרוב",
"components.Login.enablessl": "השתמש ב-SSL",
"components.Login.invalidurlerror": "לא ניתן להתחבר לשרת {mediaServerName}.",
"components.Login.loginwithapp": "התחברות עם {appName}",
"components.Login.noadminerror": "לא נמצא חשבון מנהל בשרת.",
"components.Login.orsigninwith": "או התחברות עם",
"components.Login.port": "פורט",
"components.Login.servertype": "סוג שרת",
"components.Login.urlBase": "בסיס URL",
"components.Login.validationPortRequired": "עליך להזין מספר פורט תקין",
"components.Login.validationUrlBaseLeadingSlash": "בסיס ה-URL חייב להתחיל בסלאש",
"components.Login.validationUrlTrailingSlash": "ה-URL לא יכול להסתיים בסלאש",
"components.Login.validationservertyperequired": "אנא בחר סוג שרת",
"components.MovieDetails.addtowatchlist": "הוספה לרשימת הצפייה",
"components.MovieDetails.removefromwatchlist": "הסרה מרשימת הצפייה",
"components.MovieDetails.watchlistDeleted": "<strong>{title}</strong> נמחק מרשימת הצפייה בהצלחה!",
"components.MovieDetails.watchlistError": "משהו השתבש. אנא נסה שוב.",
"components.NotificationTypeSelector.usermediaapprovedDescription": "קבלת התראות שבקשות המדיה שלך מאושרות.",
"components.NotificationTypeSelector.usermediaavailableDescription": "קבלת התראות כאשר בקשות המדיה שלך הופכות לזמינות.",
"components.NotificationTypeSelector.usermediadeclinedDescription": "קבלת התראות כאשר בקשות המדיה שלך נדחות.",
"components.NotificationTypeSelector.usermediafailedDescription": "קבלת התראות כאשר בקשות מדיה נכשלות להתווסף ל-Radarr או Sonarr.",
"components.PermissionEdit.autorequestDescription": "הענקת גישה לשליחה אוטומטית של בקשות מדיה שאינה 4K בעזרת רשימת הצפייה של Plex.",
"components.PermissionEdit.autorequestSeries": "בקשת סדרות אוטומטית",
"components.PermissionEdit.autorequestSeriesDescription": "הענקת גישה לשליחה אוטומטית של סדרות שאינן 4K בעזרת רשימת הצפייה של Plex.",
"components.PermissionEdit.createissues": "דיווח על בעיות",
"components.PermissionEdit.manageblacklist": "ניהול רשימת חסימה",
"components.PermissionEdit.manageissues": "ניהול בעיות",
"components.PermissionEdit.manageissuesDescription": "הענקת גישה לניהול בעיות מדיה.",
"components.PermissionEdit.managerequests": "ניהול בקשות",
"components.PermissionEdit.request": "בקשה",
"components.PermissionEdit.request4k": "בקשת 4K",
"components.PermissionEdit.request4kDescription": "הענקת גישה לשליחת בקשות למדיה 4K.",
"components.PermissionEdit.request4kMovies": "בקשת סרטי 4K",
"components.PermissionEdit.request4kMoviesDescription": "הענקת גישה לשליחת בקשות לסרטי 4K.",
"components.PermissionEdit.request4kTvDescription": "הענקת גישה לשליחת בקשות לסדרות 4K.",
"components.PermissionEdit.request4kTv": "בקשת סדרות 4K",
"components.PermissionEdit.requestDescription": "הענקת גישה לשליחת בקשות למדיה שאינה 4K.",
"components.PermissionEdit.requestMovies": "בקשת סרטים",
"components.PermissionEdit.requestTv": "בקשת סדרה",
"components.PermissionEdit.requestTvDescription": "הענקת גישה לשליחת בקשות לסדרות שאינן 4K.",
"components.PermissionEdit.users": "ניהול משתמשים",
"components.PermissionEdit.viewblacklistedItems": "צפייה במדיה חסומה.",
"components.PermissionEdit.viewblacklistedItemsDescription": "הענקת גישה לצפייה במדיה חסומה.",
"components.PermissionEdit.viewissues": "צפייה בבעיות",
"components.PermissionEdit.viewrecent": "צפייה בנוסף לאחרונה",
"components.PermissionEdit.viewrecentDescription": "הענקת גישה לצפייה ברשימת המדיה שנוספה לאחרונה.",
"components.PermissionEdit.viewrequests": "צפייה בבקשות",
"components.PermissionEdit.viewwatchlists": "צפייה ברשימות הצפייה של {mediaServerName}",
"components.PermissionEdit.viewwatchlistsDescription": "הענקת גישה לצפות ברשימות הצפייה של משתמשים אחרים ב-{mediaServerName}.",
"components.QuotaSelector.movieRequests": "{quotaLimit} <quotaUnits>{movies} לכל {quotaDays} {days}</quotaUnits>",
"components.QuotaSelector.seasons": "{count, plural, one {עונה} other {עונות}}",
"components.QuotaSelector.unlimited": "אין-סופי",
"components.RegionSelector.regionDefault": "כל האזורים",
"components.RegionSelector.regionServerDefault": "ברירת מחדל ({region})",
"components.RequestBlock.approve": "אישור בקשה",
"components.RequestBlock.decline": "דחיית בקשה",
"components.RequestBlock.delete": "מחיקת בקשה",
"components.RequestBlock.edit": "עריכת בקשה",
"components.RequestBlock.profilechanged": "פרופיל איכות",
"components.RequestBlock.requestdate": "תאריך בקשה",
"components.RequestBlock.requestedby": "התבקש על ידי",
"components.RequestBlock.requestoverrides": "עקיפות בקשה",
"components.RequestBlock.rootfolder": "תיקיית שורש",
"components.RequestBlock.server": "שרת יעד",
"components.RequestButton.approve4krequests": "אישור {requestCount, plural, one {בקשת 4K} other {{requestCount} בקשות 4K}}",
"components.RequestButton.approverequest": "אישור בקשה",
"components.RequestButton.approverequest4k": "אישור בקשת 4K",
"components.RequestButton.decline4krequests": "דחיית {requestCount, plural, one {בקשת 4K} other {{requestCount} בקשות 4K}}",
"components.RequestButton.declinerequest": "דחיית בקשה",
"components.RequestButton.declinerequest4k": "דחיית בקשת 4K",
"components.RequestButton.declinerequests": "דחיית {requestCount, plural, one {בקשה} other {{requestCount} בקשות}}",
"components.RequestButton.requestmore": "בקש/י עוד",
"components.RequestButton.requestmore4k": "בקש/י עוד ב-4K",
"components.RequestButton.viewrequest": "צפייה בבקשה",
"components.RequestCard.approverequest": "אישור בקשה",
"components.RequestCard.cancelrequest": "ביטול בקשה",
"components.RequestCard.declinerequest": "דחיית בקשה",
"components.RequestCard.deleterequest": "מחיקת בקשה",
"components.RequestCard.editrequest": "עריכת בקשה",
"components.RequestCard.mediaerror": "{mediaType} לא נמצא",
"components.RequestCard.seasons": "{seasonCount, plural, one {עונה} other {עונות}}",
"components.RequestCard.tvdbid": "מזהה TheTVDB",
"components.RequestCard.unknowntitle": "כותרת לא ידועה",
"components.RequestList.RequestItem.cancelRequest": "ביטול בקשה",
"components.RequestList.RequestItem.deleterequest": "מחיקת בקשה",
"components.RequestList.RequestItem.editrequest": "עריכת בקשה",
"components.RequestList.RequestItem.mediaerror": "{mediaType} לא נמצא",
"components.RequestList.RequestItem.modified": "שונה",
"components.RequestList.RequestItem.modifieduserdate": "{date} על ידי {user}",
"components.RequestList.RequestItem.profileName": "פרופיל",
"components.RequestList.RequestItem.removearr": "הסרה מ-{arr}",
"components.RequestList.RequestItem.requested": "התבקש",
"components.RequestList.RequestItem.requesteddate": "התבקש",
"components.RequestList.RequestItem.seasons": "{seasonCount, plural, one {עונה} other {עונות}}",
"components.RequestList.RequestItem.tmdbid": "מזהה TMDB",
"components.RequestList.RequestItem.tvdbid": "מזהה TheTVDB",
"components.RequestList.RequestItem.unknowntitle": "כותרת לא ידועה",
"components.RequestList.requests": "בקשות",
"components.RequestList.showallrequests": "הצגת כל הבקשות",
"components.RequestList.sortAdded": "הכי עדכני",
"components.RequestList.sortDirection": "החלפת כיוון מיון",
"components.RequestModal.AdvancedRequester.advancedoptions": "מתקדם",
"components.RequestModal.AdvancedRequester.default": "{name} (ברירת מחדל)",
"components.RequestModal.AdvancedRequester.destinationserver": "שרת יעד",
"components.RequestModal.AdvancedRequester.folder": "{path} ({space})",
"components.RequestModal.AdvancedRequester.languageprofile": "פרופיל שפה",
"components.RequestModal.AdvancedRequester.notagoptions": "אין תגים.",
"components.RequestModal.AdvancedRequester.qualityprofile": "פרופיל איכות",
"components.RequestModal.AdvancedRequester.requestas": "בקשה בתור",
"components.RequestModal.AdvancedRequester.rootfolder": "תיקיית שורש",
"components.RequestModal.AdvancedRequester.selecttags": "בחירת תגים",
"components.RequestModal.AdvancedRequester.tags": "תגים",
"components.RequestModal.QuotaDisplay.allowedRequestsUser": "מותר למשתמש זה לבקש <strong>{limit}</strong> {type} כל <strong>{days}</strong> ימים.",
"components.RequestModal.QuotaDisplay.movielimit": "{limit, plural, one {סרט} other {סרטים}}",
"components.RequestModal.QuotaDisplay.notenoughseasonrequests": "אין מספיק בקשות עונות שנותרו",
"components.RequestModal.QuotaDisplay.requestsremaining": "{remaining, plural, =0 {No} other {<strong>#</strong>}} {type} {remaining, plural, one {בקשה} other {בקשות}} נותרו",
"components.RequestModal.QuotaDisplay.requiredquota": "עליך להיות עם לפחות <strong>{seasons}</strong> {seasons, plural, one {בקשת עונה} other {בקשות עונה}} שנותרו כדי לשלוח בקשה עבור סדרה זו.",
"components.RequestModal.QuotaDisplay.season": "עונה",
"components.RequestModal.QuotaDisplay.seasonlimit": "{limit, plural, one {עונה} other {עונות}}",
"components.RequestModal.SearchByNameModal.nomatches": "לא הצלחנו למצוא התאמה עבור סדרה זו.",
"components.RequestModal.SearchByNameModal.notvdbiddescription": "לא הצלחנו להתאים אוטומטית את הסדרה הזו. אנא בחר/י את ההתאמה הנכונה למטה.",
"components.RequestModal.alreadyrequested": "התבקש כבר",
"components.RequestModal.approve": "אישור בקשה",
"components.RequestModal.autoapproval": "אישור אוטומטי",
"components.RequestModal.cancel": "ביטול בקשה",
"components.RequestModal.edit": "עריכת בקשה",
"components.RequestList.sortModified": "עודכן לאחרונה",
"components.RequestModal.numberofepisodes": "# של פרקים",
"components.RequestModal.pendingapproval": "בקשתך מחכה לאישור.",
"components.RequestModal.pendingrequest": "בקשה ממתינה",
"components.RequestModal.requestApproved": "בקשה ל-<strong>{title}</strong> אושרה!",
"components.RequestModal.requestSuccess": "<strong>{title}</strong> התבקשה בהצלחה!",
"components.RequestModal.requestadmin": "בקשה זו תאושר אוטומטית.",
"components.RequestModal.requestcancelled": "בקשה עבור <strong>{title}</strong> בוטלה.",
"components.RequestModal.requestcollection4ktitle": "אוסף בקשות ב-4K",
"components.RequestModal.requestcollectiontitle": "אוסף בקשות",
"components.RequestModal.requesterror": "משהו השתבש בזמן שליחת הבקשה.",
"components.RequestModal.requestfrom": "הבקשה של {username} מחכה לאישור.",
"components.RequestModal.requestmovie4ktitle": "בקשת סרט ב-4K",
"components.RequestModal.requestmovies": "בקשת {count} {count, plural, one {סרט} other {סרטים}}",
"components.RequestModal.requestmovietitle": "בקשת סרט",
"components.RequestModal.requestseasons": "בקשת {seasonCount} {seasonCount, plural, one {עונה} other {עונות}}",
"components.RequestModal.requestseasons4k": "בקשת {seasonCount} {seasonCount, plural, one {עונה} other {עונות}} ב-4K",
"components.RequestModal.requestseries4ktitle": "בקשת סדרה ב-4K",
"components.RequestModal.requestseriestitle": "בקשת סדרה",
"components.RequestModal.season": "עונה",
"components.RequestModal.seasonnumber": "עונה {number}",
"components.RequestModal.selectmovies": "בחירת סרט/ים",
"components.ResetPassword.confirmpassword": "אישור סיסמה",
"components.ResetPassword.email": "כתובת מייל",
"components.ResetPassword.emailresetlink": "קישור לשחזור מייל",
"components.ResetPassword.gobacklogin": "חזרה לדף ההתחברות",
"components.ResetPassword.password": "סיסמה",
"components.ResetPassword.passwordreset": "איפוס סיסמה",
"components.ResetPassword.resetpassword": "איפוס סיסמתך",
"components.ResetPassword.resetpasswordsuccessmessage": "סיסמה אופסה בהצלחה!",
"components.ResetPassword.validationemailrequired": "יש לספק כתובת מייל חוקית",
"components.ResetPassword.validationpasswordmatch": "הסיסמאות חייבות להתאים",
"components.ResetPassword.validationpasswordminchars": "הסיסמה קצרה מדי; צריך להיות מינימום של 8 תווים",
"components.Search.search": "חיפוש",
"components.Search.searchresults": "תוצאות חיפוש",
"components.Selector.nooptions": "אין תוצאות.",
"components.Selector.planned": "מתוכנן",
"components.Selector.returningSeries": "סדרה חוזרת",
"components.Selector.searchGenres": "בחירת ז'נרים…",
"components.Selector.searchKeywords": "חיפוש מילות מפתח…",
"components.Selector.searchStatus": "בחירת סטטוס...",
"components.Selector.searchUsers": "בחירת משתמשים…",
"components.Selector.showless": "הראה פחות",
"components.Selector.showmore": "הראה יותר",
"components.Selector.starttyping": "התחל להזין כדי לחפש.",
"components.Settings.Notifications.NotificationsGotify.agentenabled": "הפעל סוכן",
"components.Settings.Notifications.NotificationsGotify.gotifysettingssaved": "הגדרות ההתראות של Gotify נשמרו בהצלחה!",
"components.Settings.Notifications.NotificationsGotify.toastGotifyTestFailed": "התראת הבדיקה של Gotify נכשלה להשלח.",
"components.Settings.Notifications.NotificationsGotify.toastGotifyTestSending": "שולח התראת בדיקה של Gotify…",
"components.Settings.Notifications.NotificationsGotify.toastGotifyTestSuccess": "התראת הבדיקה של Gotify נשלחה!",
"components.Settings.Notifications.NotificationsLunaSea.profileName": "שם פרופיל",
"components.Settings.Notifications.NotificationsLunaSea.profileNameTip": "רק דרוש אם הפרופיל <code>default</code> לא בשימוש",
"components.Settings.Notifications.NotificationsLunaSea.settingsFailed": "הגדרות ההתראות של LunaSea נכשלו להישמר.",
"components.Settings.Notifications.NotificationsLunaSea.toastLunaSeaTestFailed": "התראת הבדיקה של LunaSea נכשלה להשלח.",
"components.Settings.Notifications.NotificationsLunaSea.toastLunaSeaTestSending": "שולח התראת בדיקה של LunaSea…",
"components.Settings.Notifications.NotificationsLunaSea.toastLunaSeaTestSuccess": "התראת הבדיקה של LunaSea נשלחה!",
"components.Settings.Notifications.NotificationsLunaSea.validationTypes": "עליך לבחור לפחות סוג התראות אחד",
"components.Settings.Notifications.NotificationsLunaSea.webhookUrl": "URL של ה-Webhook",
"components.Settings.Notifications.NotificationsPushbullet.accessToken": "אסימון גישה",
"components.Settings.Notifications.NotificationsPushbullet.agentEnabled": "הפעל סוכן",
"components.Settings.Notifications.NotificationsPushbullet.channelTag": "תג ערוץ",
"components.Settings.Notifications.NotificationsPushbullet.pushbulletSettingsFailed": "הגדרות ההתראות של Pushbullet נכשלו להישמר.",
"components.Settings.Notifications.NotificationsPushbullet.pushbulletSettingsSaved": "הגדרות ההתראות של Pushbullet נשמרו בהצלחה!",
"components.Settings.Notifications.NotificationsPushbullet.toastPushbulletTestFailed": "התראת הבדיקה של Pushbullet נכשלה להשלח.",
"components.Settings.Notifications.NotificationsPushbullet.toastPushbulletTestSuccess": "התראת הבדיקה של Pushbullet נשלחה!",
"components.Settings.Notifications.NotificationsPushbullet.validationTypes": "עליך לבחור לפחות סוג התראה אחד",
"components.Settings.Notifications.NotificationsPushover.toastPushoverTestFailed": "התראת הבדיקה של Pushover נכשלה להשלח.",
"components.Settings.Notifications.NotificationsPushover.toastPushoverTestSending": "שולח התראת בדיקה של Pushover…",
"components.Settings.Notifications.NotificationsPushover.toastPushoverTestSuccess": "התראת הבדיקה של Pushover נשלחה!",
"components.Settings.Notifications.NotificationsPushover.userToken": "מפתח משתמש או קבוצה",
"components.Settings.Notifications.NotificationsPushover.validationAccessTokenRequired": "עליך לספק אסימון יישום תקין",
"components.Settings.Notifications.NotificationsPushover.validationTypes": "עליך לבחור לפחות סוג התראה אחד",
"components.Settings.Notifications.NotificationsPushover.validationUserTokenRequired": "עליך לספק משתמש או מפתח קבוצה תקין",
"components.Settings.Notifications.NotificationsSlack.agentenabled": "הפעל סוכן",
"components.Settings.Notifications.NotificationsSlack.slacksettingssaved": "הגדרות ההתראות של Slack נשמרו בהצלחה!",
"components.Settings.Notifications.NotificationsSlack.toastSlackTestFailed": "התראת הבדיקה של Slack נכשלה להשלח.",
"components.Settings.Notifications.NotificationsSlack.toastSlackTestSending": "שולח התראת בדיקה של Slack…",
"components.Settings.Notifications.NotificationsSlack.toastSlackTestSuccess": "התראת הבדיקה של Slack נשלחה!",
"components.Settings.Notifications.NotificationsSlack.validationTypes": "עליך לבחור לפחות סוג התראה אחד",
"components.Settings.Notifications.NotificationsSlack.webhookUrl": "URL של ה-Webhook",
"component.BlacklistModal.blacklisting": "חסימה",
"components.Blacklist.blacklistNotFoundError": "<strong>{title}</strong> לא חסום.",
"components.Blacklist.blacklistSettingsDescription": "ניהול מדיה חסומה.",
"components.Blacklist.blacklistdate": "תאריך",
"components.Blacklist.blacklistedby": "{date} על ידי {user}",
"components.Blacklist.blacklistsettings": "הגדרות חסימה",
"components.Blacklist.mediaName": "שם",
"components.Blacklist.mediaTmdbId": "מזהה tmdb",
"components.Blacklist.mediaType": "סוג",
"components.PermissionEdit.blacklistedItems": "חסימת מדיה.",
"components.PersonDetails.alsoknownas": "גם ידוע בתור: {names}",
"components.PersonDetails.ascharacter": "בתור {character}",
"components.PersonDetails.birthdate": "נולד/ה ב-{birthdate}",
"components.PersonDetails.crewmember": "צוות",
"components.PersonDetails.lifespan": "{birthdate} {deathdate}",
"components.QuotaSelector.days": "{count, plural, one {יום} other {ימים}}",
"components.QuotaSelector.movies": "{count, plural, one {סרט} other {סרטים}}",
"components.RequestModal.QuotaDisplay.movie": "סרט",
"components.Settings.Notifications.NotificationsGotify.token": "אסימון יישום",
"components.Settings.Notifications.NotificationsGotify.url": "כתובת URL של שרת",
"components.Settings.Notifications.NotificationsGotify.validationTypes": "עליך לבחור לפחות סוג התראות אחד",
"components.Settings.Notifications.NotificationsGotify.validationUrlRequired": "עליך לספק כתובת URL תקינה",
"components.Settings.Notifications.NotificationsGotify.validationUrlTrailingSlash": "על כתובת ה-URL לא להסתיים בסלאש",
"components.Settings.Notifications.NotificationsPushover.accessToken": "אסימון API של היישום",
"components.Settings.Notifications.NotificationsPushover.agentenabled": "הפעל סוכן",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "ברירת המחדל של המכשיר",
"components.Settings.Notifications.NotificationsPushover.pushoversettingsfailed": "הגדרות ההתראות של Pushover נכשלו להישמר.",
"components.Settings.Notifications.NotificationsPushover.pushoversettingssaved": "הגדרות ההתראות של Pushover נשמרו בהצלחה!",
"components.Settings.Notifications.NotificationsPushover.sound": "צליל התראה",
"components.Settings.Notifications.NotificationsWebhook.resetPayload": "איפוס לברירת מחדל",
"components.Settings.Notifications.NotificationsLunaSea.webhookUrlTip": "<LunaSeaLink>קישור Webhook להתראות</LunaSeaLink> מבוסס מכשיר או משתמש",
"components.Settings.Notifications.NotificationsWebhook.agentenabled": "הפעל סוכן",
"components.Settings.Notifications.NotificationsWebhook.authheader": "כותרת עליונה של הרשאות",
"components.Settings.Notifications.NotificationsWebhook.customJson": "מטען JSON",
"components.Settings.Notifications.NotificationsWebhook.resetPayloadSuccess": "מטען JSON התאפס בהצלחה!",
"components.Settings.Notifications.NotificationsWebhook.toastWebhookTestSuccess": "התראת הבדיקה של ה-Webhook נשלחה!",
"components.Settings.Notifications.NotificationsWebhook.validationJsonPayloadRequired": "עליך לספק מטען JSON תקין",
"components.Settings.Notifications.NotificationsWebhook.validationTypes": "עליך לבחור לפחות סוג התראה אחד",
"components.Settings.Notifications.NotificationsWebhook.validationWebhookUrl": "עליך לספק כתובת URL תקינה",
"components.Settings.Notifications.NotificationsWebhook.webhookUrl": "URL של ה-Webhook",
"components.Settings.Notifications.NotificationsWebhook.webhooksettingsfailed": "הגדרות ההתראות של ה-Webhook נכשלו להשמר.",
"components.Settings.Notifications.NotificationsWebhook.webhooksettingssaved": "הגדרות ההתראות של ה-Webhook נשמרו בהצלחה!",
"components.Settings.Notifications.NotificationsWebPush.agentenabled": "הפעל סוכן",
"components.Settings.Notifications.NotificationsWebhook.toastWebhookTestFailed": "התראת הבדיקה של ה-Webhook נכשלה להשלח.",
"components.Settings.Notifications.NotificationsWebhook.toastWebhookTestSending": "שולח התראת בדיקה של ה-Webhook…"
"components.PermissionEdit.autoapprove4kDescription": "אישור אוטומטי של בקשות מדיה 4K",
"components.PermissionEdit.autoapprove4kSeriesDescription": "אישור אוטומטי של בקשות לסדרות ברזולוציית 4K",
"components.PermissionEdit.autoapproveSeriesDescription": "אישור בקשות סדרות אוטומטי (ללא 4K)."
}

View File

@@ -539,6 +539,8 @@
"components.PersonDetails.appearsin": "Nastupanja",
"components.PersonDetails.ascharacter": "kao {character}",
"components.PersonDetails.lifespan": "{birthdate} {deathdate}",
"components.PlexLoginButton.signingin": "Prijava…",
"components.PlexLoginButton.signinwithplex": "Prijavi se",
"components.QuotaSelector.unlimited": "Neograničeno",
"components.RegionSelector.regionDefault": "Sve regije",
"components.RegionSelector.regionServerDefault": "Zadano ({region})",
@@ -1186,6 +1188,7 @@
"components.Discover.tmdbnetwork": "TMDB mreža",
"components.Settings.SettingsMain.applicationTitle": "Naslov programa",
"components.Settings.SettingsMain.originallanguage": "Jezik otkrivanja",
"components.Settings.SettingsMain.csrfProtection": "Aktiviraj CSRF zaštitu",
"components.Discover.tmdbstudio": "TMDB studio",
"components.Settings.SettingsMain.generalsettings": "Opće postavke",
"components.MovieDetails.imdbuserscore": "IMDB ocjena korisnika",
@@ -1200,19 +1203,23 @@
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Zvuk obavijesti",
"components.Discover.resettodefault": "Resetiraj na zadane vrijednosti",
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Zadane postavke uređaja",
"components.Settings.SettingsMain.trustProxy": "Aktiviraj proxy podršku",
"components.Settings.SettingsMain.toastSettingsSuccess": "Postavke su uspješno spremljene!",
"i18n.collection": "Zbirka",
"components.Settings.SettingsMain.originallanguageTip": "Filtriraj sadržaj po izvornom jeziku",
"components.Settings.SettingsMain.cacheImagesTip": "Predmemoriraj slike eksternih izvora (zahtijeva značajnu količinu memorije na disku)",
"components.Settings.SettingsJobsCache.availability-sync": "Sinkronizacija dostupnosti medija",
"components.Settings.SettingsMain.trustProxyTip": "Dopusti Overseerru da ispravno registrira IP adrese klijenata iza proxyja",
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "URL ne smije završiti s kosom crtom",
"components.Settings.SonarrModal.animeSeriesType": "Vrsta anime serije",
"components.Settings.SettingsMain.generalsettingsDescription": "Konfiguriraj globalne i zadane postavke za Overseerr.",
"components.Settings.SettingsMain.toastApiKeySuccess": "Novi API ključ je uspješno generiran!",
"components.Settings.SonarrModal.seriesType": "Vrsta serije",
"components.Settings.SettingsMain.csrfProtectionHoverTip": "NEMOJ aktivirati ovu postavku ako ne razumiješ što radiš!",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Zadane postavke uređaja",
"components.Settings.SettingsMain.validationApplicationUrl": "Moraš navesti valjani URL",
"components.Settings.SettingsMain.validationApplicationTitle": "Moraš navesti naslov programa",
"components.Settings.SettingsMain.csrfProtectionTip": "Postavi eksterni API pristup u samo-za-čitanje (zahtijeva HTTPS)",
"components.Discover.resetwarning": "Vrati sve klizače na zadane postavke. To će također izbrisati sve prilagođene klizače!",
"components.Settings.SonarrModal.tagRequestsInfo": "Automatski dodaj dodatnu oznaku s korisničkim ID-om i prikaznim imenom podnositelja zahtjeva",
"components.Settings.RadarrModal.tagRequestsInfo": "Automatski dodaj dodatnu oznaku s korisničkim ID-om i prikaznim imenom podnositelja zahtjeva",

View File

@@ -21,6 +21,8 @@
"components.RequestBlock.seasons": "{seasonCount, plural, one {Season} other {Seasons}}",
"components.RequestBlock.rootfolder": "Root könyvtár",
"components.RequestBlock.requestoverrides": "Kérés felülbírálások",
"components.PlexLoginButton.signinwithplex": "Bejelentkezés",
"components.PlexLoginButton.signingin": "Bejelentkezés…",
"components.PersonDetails.crewmember": "Stáb",
"components.PersonDetails.ascharacter": "mint {character}",
"components.PersonDetails.appearsin": "Szerepel a következőkben",

View File

@@ -405,6 +405,8 @@
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Non siamo riusciti a trovare una corrispondenza per questa serie. Seleziona la corrispondenza corretta dall'elenco seguente.",
"components.RequestModal.AdvancedRequester.requestas": "Richiedi come",
"components.RequestModal.AdvancedRequester.languageprofile": "Profilo lingua",
"components.PlexLoginButton.signinwithplex": "Accedi",
"components.PlexLoginButton.signingin": "Accesso in corso…",
"components.PermissionEdit.viewrequestsDescription": "Concede il permesso di visualizzare le richieste di altri utenti.",
"components.PermissionEdit.viewrequests": "Visualizza le richieste",
"components.PermissionEdit.usersDescription": "Concede il permesso di gestire gli utenti. Gli utenti con questo permesso non possono modificare gli utenti con privilegio di Amministratore, o concederlo.",
@@ -1083,6 +1085,7 @@
"components.Selector.starttyping": "Inizia a digitare per cercare.",
"components.Settings.SettingsMain.apikey": "Chiave API",
"components.Settings.SettingsMain.applicationTitle": "Titolo applicazione",
"components.Settings.SettingsMain.csrfProtection": "Abilita protezione CSRF",
"components.Settings.SettingsMain.generalsettings": "Impostazioni generali",
"components.Settings.SettingsMain.hideAvailable": "Nascondi media disponibili",
"components.Settings.SettingsMain.locale": "Lingua interfaccia",
@@ -1202,6 +1205,8 @@
"components.Settings.SettingsJobsCache.jellyfin-full-scan": "Scansione completa della libreria Jellyfin",
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Scansione degli elementi aggiunti di recente di Jellyfin",
"components.Settings.SettingsMain.cacheImages": "Abilita la cache delle immagini",
"components.Settings.SettingsMain.csrfProtectionHoverTip": "NON abilitare questa impostazione a meno che tu non sappia cosa stai facendo!",
"components.Settings.SettingsMain.csrfProtectionTip": "Imposta l'accesso all'API esterna in sola lettura (richiede HTTPS)",
"components.Settings.SettingsMain.general": "General",
"components.Login.credentialerror": "Il nome utente o la password sono errati.",
"components.Login.initialsigningin": "Connessione in corso…",

View File

@@ -238,6 +238,7 @@
"components.Discover.discover": "ホーム",
"components.CollectionDetails.requestcollection4k": "4K のコレクションをリクエスト",
"components.AppDataWarning.dockerVolumeMissingDescription": "<code>{appDataPath}</code> ボリュームマウントが正しく構成されていませんでした。コンテナーが停止または再起動されると、すべてのデータが消去されます。",
"components.PlexLoginButton.signingin": "ログイン中…",
"components.Login.signingin": "ログイン中…",
"components.UserProfile.UserSettings.UserPermissions.toastSettingsFailure": "設定保存中に問題が発生しました。",
"components.UserProfile.UserSettings.UserGeneralSettings.toastSettingsFailure": "設定保存中に問題が発生しました。",
@@ -250,6 +251,7 @@
"components.ResetPassword.validationemailrequired": "有効なメールアドレスを入力してください",
"components.Settings.Notifications.validationEmail": "有効なメールアドレスを入力してください",
"components.UserList.validationEmail": "有効なメールアドレスを入力してください",
"components.PlexLoginButton.signinwithplex": "ログイン",
"components.ResetPassword.email": "メールアドレス",
"components.UserList.email": "メールアドレス",
"components.Settings.Notifications.NotificationsPushbullet.agentEnabled": "エージェントを有効にする",

View File

@@ -365,6 +365,7 @@
"components.Settings.SettingsLogs.logs": "로그",
"components.Settings.SettingsLogs.logsDescription": "로그는 <code>stdout</code> 또는 <code>{appDataPath}/logs/overseerr.log</code> 통해 직접 볼 수도 있습니다.",
"components.Settings.SettingsLogs.showall": "전체 로그 보기",
"components.Settings.SettingsMain.csrfProtectionHoverTip": "무엇을 하고 있는지 이해하지 못한다면 이 설정을 활성화하지 마십시오!",
"components.Settings.SettingsMain.general": "일반",
"components.Settings.SettingsMain.validationApplicationUrl": "유효한 URL을 입력해야 합니다",
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "URL은 슬래시로 끝나서는 안 됩니다",
@@ -719,6 +720,8 @@
"components.PermissionEdit.viewrequestsDescription": "다른 사용자가 제출한 미디어 요청을 볼 수 있는 권한을 부여합니다.",
"components.PersonDetails.ascharacter": "{character} 역",
"components.QuotaSelector.days": "{count, plural, one {일} other {일}}",
"components.PlexLoginButton.signingin": "로그인 중…",
"components.PlexLoginButton.signinwithplex": "로그인",
"components.RegionSelector.regionServerDefault": "기본 ({region})",
"components.QuotaSelector.tvRequests": "{quotaLimit} <quotaUnits>{시즌} 당 {quotaDays} {일}</quotaUnits>",
"components.RequestBlock.lastmodifiedby": "최종 수정자",
@@ -830,6 +833,8 @@
"components.Settings.SettingsLogs.pauseLogs": "일시중지",
"components.Settings.SettingsMain.originallanguageTip": "원작 언어로 콘텐츠 필터링",
"components.Settings.SettingsMain.partialRequestsEnabled": "부분 시리즈 요청 허용",
"components.Settings.SettingsMain.trustProxy": "프록시 지원 활성화",
"components.Settings.SettingsMain.trustProxyTip": "프록시 뒤에서 클라이언트 IP 주소를 정확하게 등록하도록 Jellyseerr에 허용",
"components.Settings.SettingsUsers.localLoginTip": "사용자가 Plex OAuth 대신 이메일 주소와 암호를 사용하여 로그인하도록 허용",
"components.Settings.SettingsUsers.movieRequestLimitLabel": "전역 영화 요청 제한",
"components.Settings.SettingsUsers.toastSettingsSuccess": "사용자 설정이 성공적으로 저장되었습니다!",
@@ -1042,6 +1047,7 @@
"components.Settings.Notifications.agentenabled": "에이전트 활성화",
"components.Settings.Notifications.emailsender": "발신자 주소",
"components.Settings.Notifications.botAPI": "봇 인증 토큰",
"components.Settings.SettingsMain.csrfProtectionTip": "외부 API 액세스를 읽기 전용으로 설정 (HTTPS 필요)",
"components.Settings.SettingsMain.toastApiKeySuccess": "새 API 키가 성공적으로 생성되었습니다!",
"components.Settings.Notifications.toastDiscordTestFailed": "Discord 테스트 알림을 보내지 못했습니다.",
"components.Settings.Notifications.toastDiscordTestSending": "Discord 테스트 알림을 보내는 중…",
@@ -1091,6 +1097,7 @@
"components.Settings.SettingsMain.apikey": "API 키",
"components.Settings.SettingsMain.cacheImagesTip": "외부 소스 이미지 캐시 (상당한 디스크 공간 필요)",
"components.Settings.SettingsMain.applicationTitle": "애플리케이션 이름",
"components.Settings.SettingsMain.csrfProtection": "CSRF 보호 활성화",
"components.Settings.SettingsMain.hideAvailable": "사용 가능한 미디어 숨기기",
"components.Settings.SettingsMain.locale": "표시 언어",
"components.Settings.SettingsMain.generalsettings": "일반 설정",

View File

@@ -63,6 +63,7 @@
"components.PermissionEdit.request": "Rezervuoti",
"components.PersonDetails.crewmember": "Komanda",
"components.PersonDetails.appearsin": "Vaidino",
"components.PlexLoginButton.signingin": "Prisijungiama…",
"components.QuotaSelector.unlimited": "Neriboti",
"components.RequestButton.viewrequest": "Peržiūrėti rezervacijas",
"components.RequestCard.deleterequest": "Šalinti rezervacijas",
@@ -188,6 +189,7 @@
"components.PersonDetails.ascharacter": "kaip {character}",
"components.PersonDetails.alsoknownas": "Žinomas kaip: {names}",
"components.PersonDetails.lifespan": "{birthdate} {deathdate}",
"components.PlexLoginButton.signinwithplex": "Prisijungti",
"components.QuotaSelector.days": "{count, plural, one {diena} other {dienos}}",
"components.RequestBlock.seasons": "{seasonCount, plural, one {Sezonas} other {Sezonai}}",
"components.RequestButton.requestmore": "Rezervuoti daugiau",

View File

@@ -281,6 +281,8 @@
"components.RequestBlock.profilechanged": "Kvalitetsprofil",
"components.RegionSelector.regionServerDefault": "Standard {{region}}",
"components.RegionSelector.regionDefault": "Alle Regioner",
"components.PlexLoginButton.signinwithplex": "Logg inn",
"components.PlexLoginButton.signingin": "Logger inn…",
"components.PersonDetails.lifespan": "{birthdate} {deathdate}",
"components.PersonDetails.crewmember": "Stab",
"components.PersonDetails.birthdate": "Født {birthdate}",
@@ -821,8 +823,8 @@
"components.Settings.SettingsJobsCache.jobScheduleEditSaved": "Oppgaven ble endret!",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorHours": "Hver {jobScheduleHours}. time",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "Hvert {jobScheduleMinutes}. minutt",
"components.Settings.SettingsUsers.localLoginTip": "Tilllat brukere å logge på med e-postadresse og passord, istedenfor med {mediaServerName} OAuth",
"components.Settings.SettingsUsers.newPlexLoginTip": "Tillat {mediaServerName} brukere å logge inn uten å være importert på forhånd",
"components.Settings.SettingsUsers.localLoginTip": "Tilllat brukere å logge på med kun E-postadresse og passord istedenfor med Plex OAuth",
"components.Settings.SettingsUsers.newPlexLoginTip": "Tillat Plex brukere å logge inn uten å være importert på forhånd",
"components.Settings.SonarrModal.validationApplicationUrl": "Du må oppgi en gyldig nettadresse",
"components.Settings.SonarrModal.validationBaseUrlTrailingSlash": "Base URL kan ikke slutte med en skråstrek",
"components.Settings.mediaTypeMovie": "film",
@@ -894,7 +896,7 @@
"components.Settings.Notifications.encryptionNone": "Ingen",
"components.UserProfile.UserSettings.UserNotificationSettings.telegramsettingsfailed": "Kunne ikke lagre instillingene for Telegram.",
"components.UserProfile.UserSettings.UserNotificationSettings.telegramChatId": "Chat ID",
"components.Settings.SettingsUsers.newPlexLogin": "Aktiver ny {mediaServerName}-pålogging",
"components.Settings.SettingsUsers.newPlexLogin": "Aktiver \"Plex Sign-In\" for nye brukere",
"components.Settings.SonarrModal.enableSearch": "Aktiver Automagisk Søk",
"components.Settings.notificationAgentSettingsDescription": "Konfigurer og aktiver varslingstjenester.",
"components.UserList.autogeneratepasswordTip": "Send et automagisk generet passord til bruken på E-post",
@@ -1000,25 +1002,25 @@
"components.RequestCard.tmdbid": "TMDB ID",
"components.RequestCard.tvdbid": "TheTVDB ID",
"components.StatusChecker.appUpdatedDescription": "Vennligst klikk her for å laste applikasjonen på nytt.",
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Din Visningsliste",
"components.Discover.plexwatchlist": "Din Visningsliste",
"components.NotificationTypeSelector.mediaautorequestedDescription": " varsler når nye medieforspørsler automatisk sendes inn for elementer på Din Visningsliste.",
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Din Plex Watchlist",
"components.Discover.plexwatchlist": "Din Plex Watchlist",
"components.NotificationTypeSelector.mediaautorequestedDescription": "Bli varslet når nytt matriale fra diin Plex Watchlist blir automagisk forespurt.",
"components.PermissionEdit.autorequestSeries": "Forespør Serier Automagisk",
"components.PermissionEdit.autorequestMoviesDescription": "Gi tilgang til å automatisk sende film forespørsler som ikke er i 4K via Din Visningsliste.",
"components.PermissionEdit.autorequestMoviesDescription": "Gi tilgang til å automagisk sende film forespørsler som ikke er i 4K via Plex Watchlist.",
"components.PermissionEdit.autorequest": "Auto-Forespørsel",
"components.PermissionEdit.autorequestDescription": "Gi tilgang til å automatisk sende forespørsler som ikke er i 4K via Din Plex Visningsliste.",
"components.PermissionEdit.autorequestDescription": "Gi tilgang til å automagisk sende forespørsler som ikke er i 4K via Plex Watchlist.",
"components.PermissionEdit.autorequestMovies": "Forespør Serier Automagisk",
"components.Discover.DiscoverWatchlist.watchlist": "Plex Visningsliste",
"components.Discover.DiscoverWatchlist.watchlist": "Plex Watchlist",
"components.MovieDetails.managemovie": "Administrer Film",
"components.MovieDetails.reportissue": "Rapporter Avvik",
"components.NotificationTypeSelector.mediaautorequested": "Forespørsel Automagisk Forespurt",
"components.PermissionEdit.autorequestSeriesDescription": "Gi tilgang til å automatisk sende serie forespørsler som ikke er i 4K via Din Visningsliste.",
"components.PermissionEdit.autorequestSeriesDescription": "Gi tilgang til å automagisk sende serie forespørsler som ikke er i 4K via Plex Watchlist.",
"components.Settings.SettingsLogs.viewdetails": "Vis Detaljer",
"components.AirDateBadge.airedrelative": "Sendt {relativeTime}",
"components.AirDateBadge.airsrelative": "Sendes {relativeTime}",
"components.MovieDetails.rtaudiencescore": "Publikumspoeng for Rotten Tomatoes",
"components.PermissionEdit.viewwatchlists": "Vis Visningsliste",
"components.PermissionEdit.viewwatchlistsDescription": "Gi tilgang til å vise andre brukere sin Visningsliste.",
"components.PermissionEdit.viewwatchlists": "Vis Plex Watchlist",
"components.PermissionEdit.viewwatchlistsDescription": "Gi tilgang til å vise andre brukere sin Plex Watchlist.",
"components.RequestBlock.requestdate": "Tidspunkt for Forespørsel",
"components.RequestBlock.requestedby": "Forespurt av",
"components.RequestCard.approverequest": "Godkjenn Forespørsel",
@@ -1041,13 +1043,13 @@
"components.TitleCard.cleardata": "Fjern all Info",
"components.TitleCard.tmdbid": "TMDb ID",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "Forespør Filmer Automagisk",
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Synkronisering av Plex Visningsliste",
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Synkronisering av Plex-Watchlist",
"components.Settings.restartrequiredTooltip": "Jellyseerr må startes på nytt for at de nye innstillingene skal tre i kraft",
"components.TvDetails.reportissue": "Rapporter Avvik",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "Automagisk forespør serier som ligger på <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink>",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Forespør Serier Automagisk",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "Automagisk forespør filmer som ligger på <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink>",
"components.UserProfile.plexwatchlist": "Plex Visningsliste",
"components.UserProfile.plexwatchlist": "Plex Watchlist",
"components.RequestList.RequestItem.tvdbid": "TheTVDb ID",
"components.StatusChecker.restartRequiredDescription": "Start tjeneren på nytt for å ta i bruk de nye innstillingene.",
"components.StatusChecker.restartRequired": "Omstart av tjener nødvendig",
@@ -1076,80 +1078,5 @@
"components.Discover.emptywatchlist": "Matriale som du legger til via <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> vil dukke opp her.",
"components.UserProfile.emptywatchlist": "Matriale som du legger til via <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> vil dukke opp her.",
"components.RequestModal.SearchByNameModal.nomatches": "Vi klarte ikke å koble denne serien med et søkbart treff.",
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "Nåværende frekvens",
"components.Settings.SettingsMain.generalsettings": "Generelle Innstillinger",
"components.Layout.UserWarnings.emailInvalid": "E-postadressen er ugyldig.",
"components.Layout.UserWarnings.emailRequired": "En e-postadresse er påkrevd.",
"components.Layout.UserWarnings.passwordRequired": "Et passord er påkrevd.",
"components.Settings.SettingsMain.general": "Generell",
"components.UserProfile.UserSettings.UserGeneralSettings.toastSettingsFailureEmail": "Denne e-postadressen er allerede i bruk!",
"components.Discover.DiscoverSliderEdit.deletefail": "Feil ved sletting av skyveknappen.",
"components.Discover.DiscoverTv.sortTitleAsc": "Tittel (A-Å) Stigende",
"components.Discover.FilterSlideover.originalLanguage": "Originalspråk",
"components.TitleCard.watchlistError": "Noe gikk galt, prøv på nytt.",
"components.Blacklist.blacklistNotFoundError": "<strong>{title}</strong> er ikke svartelistet.",
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Nylig Lagt Til",
"components.MovieDetails.addtowatchlist": "Legg til i Visningsliste",
"components.Discover.CreateSlider.addSlider": "Legg til Skyveknapp",
"components.Discover.resetwarning": "Tilbakestill alle skyveknapper til standardinnstillinger. Dette sletter også egendefinerte skyveknapper!",
"components.Layout.Sidebar.browsetv": "Serier",
"components.Discover.CreateSlider.providetmdbsearch": "Angi et søkeord",
"components.Settings.SettingsAbout.supportjellyseerr": "Støtt Jellyseerr",
"components.Discover.DiscoverMovies.sortPopularityAsc": "Populæritet Stigende",
"components.UserProfile.localWatchlist": "{username}'s Visningsliste",
"components.Discover.FilterSlideover.releaseDate": "Utgivelsesdato",
"components.Layout.Sidebar.blacklist": "Svarteliste",
"components.Layout.Sidebar.browsemovies": "Filmer",
"components.Settings.SettingsMain.validationApplicationTitle": "Du må oppgi en applikasjonstittel",
"components.TitleCard.addToWatchList": "Legg til i Visningsliste",
"components.TvDetails.watchlistError": "Noe gikk galt, prøv på nytt.",
"components.Discover.CreateSlider.addcustomslider": "Lag Egendefinert Skyveknapp",
"components.Discover.CreateSlider.addfail": "Feil ved opprettelse av ny skyveknapp.",
"components.Discover.CreateSlider.editSlider": "Rediger Skyveknapp",
"components.Discover.FilterSlideover.keywords": "Nøkkelord",
"components.Discover.resettodefault": "Tilbakestill til standard",
"components.Login.username": "Brukernavn",
"components.MovieDetails.removefromwatchlist": "Fjern fra Visningsliste",
"components.MovieDetails.watchlistError": "Noe gikk galt, prøv på nytt.",
"components.Settings.SettingsMain.applicationTitle": "Applikasjonstittel",
"components.TvDetails.addtowatchlist": "Legg til i Visningsliste",
"components.TvDetails.removefromwatchlist": "Fjern Fra Visningsliste",
"components.UserList.importfrommediaserver": "Importer {mediaServerName} Brukere",
"components.Blacklist.blacklistSettingsDescription": "Administrer svartelistede medier.",
"components.Blacklist.blacklistdate": "dato",
"components.Blacklist.blacklistedby": "{date} av {user}",
"components.Blacklist.blacklistsettings": "Innstillinger for Svarteliste",
"components.Blacklist.mediaName": "Navn",
"components.Discover.CreateSlider.editfail": "Feil ved redigering av skyveknapp.",
"components.Discover.CreateSlider.nooptions": "Ingen treff.",
"components.Discover.CreateSlider.searchGenres": "Søk i sjangre…",
"components.Discover.CreateSlider.searchKeywords": "Søk etter nøkkelord…",
"components.Discover.CreateSlider.starttyping": "Begynn å skrive for å søke.",
"components.Discover.CreateSlider.validationTitlerequired": "Du må oppgi en tittel.",
"components.Discover.DiscoverMovieKeyword.keywordMovies": "{keywordTitle} Filmer",
"components.Discover.DiscoverMovies.discovermovies": "Filmer",
"components.Discover.DiscoverMovies.sortPopularityDesc": "Populæritet Fallende",
"components.Discover.DiscoverMovies.sortReleaseDateAsc": "Utgivelsesdato Stigende",
"components.Discover.DiscoverMovies.sortReleaseDateDesc": "Utgivelsesdato Fallende",
"components.Discover.DiscoverMovies.sortTitleAsc": "Tittel (A-Å) Stigende",
"components.Discover.DiscoverMovies.sortTitleDesc": "Tittel (A-Å) Fallende",
"components.Discover.DiscoverMovies.sortTmdbRatingAsc": "TMDB-vurdering Stigende",
"components.Discover.DiscoverMovies.sortTmdbRatingDesc": "TMDB-vurdering Fallende",
"components.Discover.DiscoverSliderEdit.deletesuccess": "Sletting av skyveknappen var vellykket.",
"components.Discover.DiscoverSliderEdit.remove": "Fjern",
"components.Discover.DiscoverTv.discovertv": "Serier",
"components.Discover.DiscoverTv.sortFirstAirDateAsc": "Første sendingsdato Stigende",
"components.Discover.DiscoverTv.sortFirstAirDateDesc": "Første sendingsdato Fallende",
"components.Discover.DiscoverTv.sortPopularityAsc": "Populæritet Stigende",
"components.Discover.DiscoverTv.sortPopularityDesc": "Populæritet Fallende",
"components.Discover.DiscoverTv.sortTitleDesc": "Tittel (A-Å) Fallende",
"components.Discover.DiscoverTv.sortTmdbRatingAsc": "TMDB-vurdering Stigende",
"components.Discover.DiscoverTv.sortTmdbRatingDesc": "TMDB-vurdering Fallende",
"components.Discover.DiscoverTvKeyword.keywordSeries": "{keywordTitle} Serier",
"components.Discover.FilterSlideover.clearfilters": "Tøm Aktive Filtre",
"components.Discover.FilterSlideover.filters": "Filtre",
"components.Discover.FilterSlideover.firstAirDate": "Første Sendingsdato",
"components.Discover.FilterSlideover.from": "Fra",
"components.Discover.FilterSlideover.genres": "Sjangere",
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Din Visningsliste"
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "Nåværende frekvens"
}

Some files were not shown because too many files have changed in this diff Show More