Compare commits

..

75 Commits

Author SHA1 Message Date
Mark McDowall
48b9f0a07a Fixed: Reprocessing items that were previously blocked during importing
(cherry picked from commit bce848facf8aeaeac6a1d59c92941d00589034a4)
2024-06-26 16:48:48 +00:00
Mark McDowall
a6db8bfe0e New: Ignore Deluge torrents without a title
(cherry picked from commit a0d29331341320268552660658b949179c963793)
2024-06-26 02:46:53 +03:00
Bogdan
2033d7e411 Fixed: Exclude invalid releases from Newznab and Torznab parsers
(cherry picked from commit fb060730c7d52cd342484dc68595698a9430df7b)
2024-06-26 02:46:39 +03:00
dependabot[bot]
4a04e54ceb Bump ws from 7.5.9 to 7.5.10
Bumps [ws](https://github.com/websockets/ws) from 7.5.9 to 7.5.10.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/7.5.9...7.5.10)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-23 22:41:14 +03:00
Bogdan
d57a9ab9b0 Bump version to 0.3.30 2024-06-23 21:53:58 +03:00
dependabot[bot]
d333204194 Bump braces from 3.0.2 to 3.0.3
Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3.
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)

---
updated-dependencies:
- dependency-name: braces
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-11 15:07:54 +03:00
Servarr
c3676f8d33 Automated API Docs update 2024-06-11 15:03:22 +03:00
Bogdan
932356be61 Ignore Grabbed from API docs
Run application in docs.sh specific to platform

(cherry picked from commit c331c8bd119fa9f85a53e96db04f541b2d90bbd3)

Closes #3515
2024-06-11 14:14:57 +03:00
servarr[bot]
5b1b2a2d67 Fixed: Improve error messaging if config file isn't formatted correctly 2024-06-11 14:05:24 +03:00
Bogdan
c362e8c467 Fixed: Ignore case when resolving indexer by name in release push
(cherry picked from commit a90ab1a8fd50126d7f60eaa684eac1e0cd98e2b7)
2024-06-11 14:02:24 +03:00
Bogdan
67c00a8cc7 Fixed: Ignore case for name validation in providers
(cherry picked from commit 0edc5ba99a15c5f80305b387a053f35fc3f6e51b)
2024-06-11 14:02:04 +03:00
Bogdan
27a086dfff Bump version to 0.3.29 2024-06-09 12:58:59 +03:00
sillock1
8ee0df9c65 Fixed: Trimming slashes from UrlBase when using environment variable 2024-06-06 14:47:25 +03:00
sillock1
da30b55902 New: Optionally use Environment Variables for settings in config.xml 2024-06-06 14:47:25 +03:00
Servarr
c7226fc85f Automated API Docs update 2024-06-06 12:27:57 +03:00
Mark McDowall
84f22dbadc New: Require password confirmation when setting or changing password
(cherry picked from commit b248163df598dc611ee919d525eb7357256d73d5)

Closes #3089
2024-06-06 11:46:54 +03:00
Mark McDowall
06a53ef9ca New: Authentication is now required
(cherry picked from commit d3018fb5015af26a897281f0e892b706cdb6e821)

Closes #1807
Closes #2878
Closes #2873
2024-06-06 11:46:48 +03:00
Mark McDowall
b5ef0cda1e New: Setting to disable authentication for local addresses
(cherry picked from commit b154b00c6156512e7fbd0a2c4833c116a74f23ca)

Closes #1804
Closes #2077
2024-06-06 11:44:37 +03:00
Weblate
1b1290efac Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Dani Talens <databio@gmail.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Lizandra Candido da Silva <lizandra.c.s@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Yi Cao <caoyi06@qq.com>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: mm519897405 <baiya@vip.qq.com>
Co-authored-by: r0bertreh <Robert.reh@live.de>
Co-authored-by: topnew <sznetim@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/bg/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/da/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/el/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/he/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/hi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/hr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/id/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ja/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/sk/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/sv/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/th/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/uk/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/vi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/zh_CN/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/zh_TW/
Translation: Servarr/Readarr
2024-06-03 09:15:48 +03:00
Bogdan
dcbc3ea3f8 Update the wanted section for missing and cutoff unmet
(cherry picked from commit 9b4ff657af41e67aeb5866ee3056f1a8f2a901ea)
2024-05-22 03:20:10 +03:00
Bogdan
9a7b2cb818 Fix Goodreads test 2024-05-19 19:33:19 +03:00
Bogdan
f9cba39f0a Ignore metadata tests temporarily 2024-05-19 19:33:19 +03:00
Bogdan
6b6ff4fe76 New: Link to "Why Searches Could be Failing" wiki section 2024-05-19 19:33:19 +03:00
Bogdan
05d0fe2da6 Bump version to 0.3.28 2024-05-13 15:31:57 +03:00
Bogdan
7aab2b49e2 Bump Npgsql to 7.0.7 2024-05-13 15:26:43 +03:00
Weblate
8887df92ed Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dani Talens <databio@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Michael5564445 <michaelvelosk@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/uk/
Translation: Servarr/Readarr
2024-05-10 14:05:03 +03:00
Bogdan
9ee651d6c0 Refactor PasswordInput to use type password
(cherry picked from commit c7c1e3ac9e5bffd4d92298fed70916e3808613fd)
2024-05-10 14:04:07 +03:00
Bogdan
5544e169a6 Use number input for seed ratio
(cherry picked from commit 1eddf3a152fae04142263c02a3e3b317ff2feeb2)

Plus translations

Closes #3470
2024-05-10 01:37:15 +03:00
Bogdan
11d83165e5 Fixed: Notifications with only On Rename enabled 2024-05-10 01:34:57 +03:00
Bogdan
9e6d1c581c Fixed: Parsing long downloading/seeding values from Transmission
(cherry picked from commit 8360dd7a7bab1dfb49a40aae382b47e9253d9fd1)
2024-05-09 05:50:16 +03:00
Weblate
66e20a0aec Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Michael5564445 <michaelvelosk@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/uk/
Translation: Servarr/Readarr
2024-05-05 12:35:40 +03:00
Bogdan
e639b36283 Fixed: Indexer flags for torrent release pushes
(cherry picked from commit 47ba002806fe2c2004a649aa193ae318343a84e4)
2024-05-05 12:35:12 +03:00
Mark McDowall
c9f4fb141f Forward X-Forwarded-Host header
(cherry picked from commit 3fbe4361386e9fb8dafdf82ad9f00f02bec746cc)
2024-05-05 12:35:02 +03:00
Bogdan
29a43fc2fd Bump version to 0.3.27 2024-05-05 12:34:33 +03:00
Bogdan
f9454b5b5a Fixed: Initialize databases after app folder migrations
Co-authored-by: Mark McDowall <mark@mcdowall.ca>
2024-05-05 01:06:47 +03:00
Bogdan
9aa6d47349 Use newer Node.js task for in pipelines 2024-04-29 14:42:15 +03:00
Bogdan
e09946d946 Fixed: Limit titles in task name to 10 authors
(cherry picked from commit c81ae6546118e954e481894d0b3fa6e9a20359c7)

Closes #3449
2024-04-28 13:55:18 +03:00
Stevie Robinson
c9c5429120 New: Don't initially select 0 byte files in Interactive Import
(cherry picked from commit 04bd535cfca5e25c6a2d5417c6f18d5bf5180f67)

Closes #3448
2024-04-28 13:54:19 +03:00
Mark McDowall
ed7bd6c66d Fixed: Improve paths longer than 256 on Windows failing to hardlink
(cherry picked from commit a97fbcc40a6247bf59678425cf460588fd4dbecd)
2024-04-28 13:52:17 +03:00
Christopher
c88fe7cae8 New: Remove qBitorrent torrents that reach inactive seeding time
(cherry picked from commit d738035fed859eb475051f3df494b9c975a42e82)
2024-04-28 13:52:05 +03:00
Bogdan
68642579d0 Bump version to 0.3.26 2024-04-28 12:58:25 +03:00
Weblate
f061d70d38 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Fara <faraindahhh@gmail.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Mailme Dashite <mailmedashite@protonmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: maodun96 <435795439@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/id/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/zh_CN/
Translation: Servarr/Readarr
2024-04-27 21:13:42 +03:00
Bogdan
fd4a609f51 Fixed: Retrying download on not suppressed HTTP errors 2024-04-27 21:09:36 +03:00
Bogdan
9957f734a5 Database corruption message linking to wiki 2024-04-25 11:30:34 +03:00
Bogdan
695b8b2ae1 Bump dotnet to 6.0.29 2024-04-22 09:32:41 +03:00
Bogdan
420824b279 Convert createTagsSelector to typescript 2024-04-21 12:48:48 +03:00
Servarr
badc2567c3 Automated API Docs update 2024-04-21 12:44:49 +03:00
Bogdan
c8c81927d9 Fixed: Re-testing edited providers will forcibly test them
(cherry picked from commit e9662544621b2d1fb133ff9d96d0eb20b8198725)

Closes #3432
2024-04-21 12:36:52 +03:00
Josh McKinney
f9df843789 Add dev container workspace
Allows the linting and style settings for the frontend to be applied even when you load the main repo as a workspace

(cherry picked from commit d6278fced49b26be975c3a6039b38a94f700864b)

Closes #3428
2024-04-21 12:34:01 +03:00
Bogdan
3cd39d4ee8 Bump frontend dependencies 2024-04-21 12:30:55 +03:00
Bogdan
8a39ef4c56 Bump version to 0.3.25 2024-04-21 09:17:25 +03:00
Bogdan
ba1195fc1b Fixed: Skip move when source and destination are the same
Co-authored-by: Qstick <qstick@gmail.com>
2024-04-20 18:00:00 +03:00
Bogdan
7656142db4 Bump SixLabors.ImageSharp to 3.1.4 2024-04-19 08:03:01 +03:00
Weblate
74c3b45ef8 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Altair <villagermd@outlook.com>
Co-authored-by: Ano10 <arnaudthommeray+github@ik.me>
Co-authored-by: Gandrushka <andrew.pyndyk@gmail.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Jacopo Luca Maria Latrofa <jacopo.latrofa@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: toeiazarothis <patrickdealmeida89000@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/uk/
Translation: Servarr/Readarr
2024-04-18 20:00:38 +03:00
Josh McKinney
f7368d3d09 Add DevContainer, VSCode config and extensions.json
(cherry picked from commit 5061dc4b5e5ea9925740496a5939a1762788b793)

Closes #3414
2024-04-14 08:35:27 +03:00
Bogdan
5d8e2300f2 Bump version to 0.3.24 2024-04-14 08:26:42 +03:00
Weblate
1fb54c0da5 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: myrad2267 <myrad2267@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ar/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/bg/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/da/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/he/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ro/
Translation: Servarr/Readarr
2024-04-10 02:22:54 +03:00
Bogdan
5a9a6e593b New: Detect shfs mounts in disk space
(cherry picked from commit 1aef91041e404f76f278f430e4e53140fb125792)
2024-04-10 02:22:17 +03:00
Qstick
2d5fc655c0 Added table identifier to OrderBy to avoid column ambiguity on joins
Co-Authored-By: Richard <1252123+kharenis@users.noreply.github.com>

(cherry picked from commit c57ceac4debf7419be84096f997ba7b75c906586)
2024-04-08 18:47:02 +03:00
Bogdan
cfcc9a5856 Bump version to 0.3.23 2024-04-07 07:58:18 +03:00
Stevie Robinson
8c9555f82e New: Informational text on Custom Formats modal
(cherry picked from commit 238ba85f0a2639608d9890292dfe0b96c0212f10)

Closes #3405
2024-04-06 16:47:46 +03:00
Cuki
ee20ba1811 Fixed: Use widely supported display mode for PWA
(cherry picked from commit 1562d3bae3002947f9e428321d2b162ad69c3309)
2024-04-06 16:45:17 +03:00
Mark McDowall
4cf1215cfa Fixed: Cleanse BHD RSS key in log files
(cherry picked from commit 60ee7cc716d344fc904fa6fb28f7be0386ae710d)
2024-04-06 16:45:00 +03:00
Mark McDowall
a8ab099177 Fixed: Sending ntfy.sh notifications with unicode characters
(cherry picked from commit a169ebff2adda5c8585c6aae6249b1c1f7c12264)
2024-04-06 16:44:45 +03:00
Servarr
50af8a12d4 Automated API Docs update 2024-04-06 06:56:02 +03:00
Weblate
510c39c5d8 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Michael5564445 <michaelvelosk@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/uk/
Translation: Servarr/Readarr
2024-04-06 06:19:30 +03:00
Bogdan
dd4a0121f2 Fixed: Migrations running on newer versions of SQLite 2024-04-06 06:18:29 +03:00
Mark McDowall
4fb62c072a Fixed: Task with removed author causing error
(cherry picked from commit fc6494c569324c839debdb1d08dde23b8f1b8d76)

Closes #3376
2024-03-28 11:22:01 +02:00
Louis R
2b100d0f72 Fixed: Exceptions when checking for routable IPv4 addresses
(cherry picked from commit 060b789bc6f10f667795697eb536d4bd3851da49)
2024-03-28 11:19:16 +02:00
Weblate
abfdc44f92 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Casselluu <jack10193@163.com>
Co-authored-by: CharlesEnard <charles.enard@gmail.com>
Co-authored-by: Dani Talens <databio@gmail.com>
Co-authored-by: Jason54 <jason54700.jg@gmail.com>
Co-authored-by: Stanislav <prekop3@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: shimmyx <shimmygodx@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/sk/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/zh_CN/
Translation: Servarr/Readarr
2024-03-28 11:06:09 +02:00
Bogdan
6e76f9966a New: Allow HEAD requests to ping endpoint
(cherry picked from commit 7353fe479dbb8d0dab76993ebed92d48e1b05524)
2024-03-28 11:05:17 +02:00
Stevie Robinson
2b6ceab9d4 Fixed: Handling torrents with relative path in rTorrent
(cherry picked from commit 35d0e6a6f806c68756450a7d199600d7fb49d6c5)
2024-03-28 11:05:05 +02:00
Bogdan
b636729960 New: Advanced settings toggle in import list, notification and download client modals
(cherry picked from commit 13c925b3418d1d48ec041e3d97ab51aaf2b8977a)
2024-03-28 11:04:53 +02:00
Carlos Gustavo Sarmiento
8af8366575 Fixed: qBittorrent not correctly handling retention during testing
(cherry picked from commit 588372fd950fc85f5e9a4275fbcb423b247ed0ee)
2024-03-28 11:04:41 +02:00
Bogdan
1d31e9b9d9 Bump version to 0.3.22 2024-03-24 17:46:11 +02:00
146 changed files with 5144 additions and 2450 deletions

View File

@@ -0,0 +1,13 @@
// This file is used to open the backend and frontend in the same workspace, which is necessary as
// the frontend has vscode settings that are distinct from the backend
{
"folders": [
{
"path": ".."
},
{
"path": "../frontend"
}
],
"settings": {}
}

View File

@@ -0,0 +1,19 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/dotnet
{
"name": "Readarr",
"image": "mcr.microsoft.com/devcontainers/dotnet:1-6.0",
"features": {
"ghcr.io/devcontainers/features/node:1": {
"nodeGypDependencies": true,
"version": "16",
"nvmVersion": "latest"
}
},
"forwardPorts": [8787],
"customizations": {
"vscode": {
"extensions": ["esbenp.prettier-vscode"]
}
}
}

12
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for more information:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
# https://containers.dev/guide/dependabot
version: 2
updates:
- package-ecosystem: "devcontainers"
directory: "/"
schedule:
interval: weekly

1
.gitignore vendored
View File

@@ -125,6 +125,7 @@ coverage*.xml
coverage*.json
setup/Output/
*.~is
.mono
# .NET Core
project.lock.json

7
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,7 @@
{
"recommendations": [
"esbenp.prettier-vscode",
"ms-dotnettools.csdevkit",
"ms-vscode-remote.remote-containers"
]
}

26
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,26 @@
{
"version": "0.2.0",
"configurations": [
{
// Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes
// For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md
"name": "Run Readarr",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build dotnet",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/_output/net6.0/Readarr",
"args": [],
"cwd": "${workspaceFolder}",
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
"console": "integratedTerminal",
"stopAtEntry": false
},
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach"
}
]
}

44
.vscode/tasks.json vendored Normal file
View File

@@ -0,0 +1,44 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "build dotnet",
"command": "dotnet",
"type": "process",
"args": [
"msbuild",
"-restore",
"${workspaceFolder}/src/Readarr.sln",
"-p:GenerateFullPaths=true",
"-p:Configuration=Debug",
"-p:Platform=Posix",
"-consoleloggerparameters:NoSummary;ForceNoAlign"
],
"problemMatcher": "$msCompile"
},
{
"label": "publish",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/src/Readarr.sln",
"-property:GenerateFullPaths=true",
"-consoleloggerparameters:NoSummary;ForceNoAlign"
],
"problemMatcher": "$msCompile"
},
{
"label": "watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"run",
"--project",
"${workspaceFolder}/src/Readarr.sln"
],
"problemMatcher": "$msCompile"
}
]
}

View File

@@ -9,13 +9,13 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '0.3.21'
majorVersion: '0.3.30'
minorVersion: $[counter('minorVersion', 1)]
readarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(readarrVersion)'
sentryOrg: 'servarr'
sentryUrl: 'https://sentry.servarr.com'
dotnetVersion: '6.0.417'
dotnetVersion: '6.0.421'
nodeVersion: '20.X'
innoVersion: '6.2.0'
windowsImage: 'windows-2022'
@@ -166,10 +166,10 @@ stages:
pool:
vmImage: $(imageName)
steps:
- task: NodeTool@0
- task: UseNode@1
displayName: Set Node.js version
inputs:
versionSpec: $(nodeVersion)
version: $(nodeVersion)
- checkout: self
submodules: true
fetchDepth: 1
@@ -1075,10 +1075,10 @@ stages:
pool:
vmImage: $(imageName)
steps:
- task: NodeTool@0
- task: UseNode@1
displayName: Set Node.js version
inputs:
versionSpec: $(nodeVersion)
version: $(nodeVersion)
- checkout: self
submodules: true
fetchDepth: 1

14
docs.sh
View File

@@ -1,3 +1,7 @@
#!/bin/bash
set -e
FRAMEWORK="net6.0"
PLATFORM=$1
if [ "$PLATFORM" = "Windows" ]; then
@@ -21,15 +25,21 @@ slnFile=src/Readarr.sln
platform=Posix
if [ "$PLATFORM" = "Windows" ]; then
application=Readarr.Console.dll
else
application=Readarr.dll
fi
dotnet clean $slnFile -c Debug
dotnet clean $slnFile -c Release
dotnet msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p:RuntimeIdentifiers=$RUNTIME -t:PublishAllRids
dotnet new tool-manifest
dotnet tool install --version 6.5.0 Swashbuckle.AspNetCore.Cli
dotnet tool install --version 6.6.2 Swashbuckle.AspNetCore.Cli
dotnet tool run swagger tofile --output ./src/Readarr.Api.V1/openapi.json "$outputFolder/net6.0/$RUNTIME/Readarr.console.dll" v1 &
dotnet tool run swagger tofile --output ./src/Readarr.Api.V1/openapi.json "$outputFolder/$FRAMEWORK/$RUNTIME/$application" v1 &
sleep 45

View File

@@ -1,5 +0,0 @@
.input {
composes: input from '~Components/Form/TextInput.css';
font-family: $passwordFamily;
}

View File

@@ -1,7 +1,5 @@
import PropTypes from 'prop-types';
import React from 'react';
import TextInput from './TextInput';
import styles from './PasswordInput.css';
// Prevent a user from copying (or cutting) the password from the input
function onCopy(e) {
@@ -13,17 +11,14 @@ function PasswordInput(props) {
return (
<TextInput
{...props}
type="password"
onCopy={onCopy}
/>
);
}
PasswordInput.propTypes = {
className: PropTypes.string.isRequired
};
PasswordInput.defaultProps = {
className: styles.input
...TextInput.props
};
export default PasswordInput;

View File

@@ -4,6 +4,7 @@ import AppUpdatedModalConnector from 'App/AppUpdatedModalConnector';
import ColorImpairedContext from 'App/ColorImpairedContext';
import ConnectionLostModalConnector from 'App/ConnectionLostModalConnector';
import SignalRConnector from 'Components/SignalRConnector';
import AuthenticationRequiredModal from 'FirstRun/AuthenticationRequiredModal';
import locationShape from 'Helpers/Props/Shapes/locationShape';
import PageHeader from './Header/PageHeader';
import PageSidebar from './Sidebar/PageSidebar';
@@ -75,6 +76,7 @@ class Page extends Component {
isSmallScreen,
isSidebarVisible,
enableColorImpairedMode,
authenticationEnabled,
onSidebarToggle,
onSidebarVisibleChange
} = this.props;
@@ -108,6 +110,10 @@ class Page extends Component {
isOpen={this.state.isConnectionLostModalOpen}
onModalClose={this.onConnectionLostModalClose}
/>
<AuthenticationRequiredModal
isOpen={!authenticationEnabled}
/>
</div>
</ColorImpairedContext.Provider>
);
@@ -123,6 +129,7 @@ Page.propTypes = {
isUpdated: PropTypes.bool.isRequired,
isDisconnected: PropTypes.bool.isRequired,
enableColorImpairedMode: PropTypes.bool.isRequired,
authenticationEnabled: PropTypes.bool.isRequired,
onResize: PropTypes.func.isRequired,
onSidebarToggle: PropTypes.func.isRequired,
onSidebarVisibleChange: PropTypes.func.isRequired

View File

@@ -18,6 +18,7 @@ import {
import { fetchStatus } from 'Store/Actions/systemActions';
import { fetchTags } from 'Store/Actions/tagActions';
import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector';
import createSystemStatusSelector from 'Store/Selectors/createSystemStatusSelector';
import ErrorPage from './ErrorPage';
import LoadingPage from './LoadingPage';
import Page from './Page';
@@ -153,18 +154,21 @@ function createMapStateToProps() {
selectErrors,
selectAppProps,
createDimensionsSelector(),
createSystemStatusSelector(),
(
enableColorImpairedMode,
isPopulated,
errors,
app,
dimensions
dimensions,
systemStatus
) => {
return {
...app,
...errors,
isPopulated,
isSmallScreen: dimensions.isSmallScreen,
authenticationEnabled: systemStatus.authentication !== 'none',
enableColorImpairedMode
};
}

View File

@@ -253,7 +253,7 @@ class SignalRConnector extends Component {
handleWantedCutoff = (body) => {
if (body.action === 'updated') {
this.props.dispatchUpdateItem({
section: 'cutoffUnmet',
section: 'wanted.cutoffUnmet',
updateOnly: true,
...body.resource
});
@@ -263,7 +263,7 @@ class SignalRConnector extends Component {
handleWantedMissing = (body) => {
if (body.action === 'updated') {
this.props.dispatchUpdateItem({
section: 'missing',
section: 'wanted.missing',
updateOnly: true,
...body.resource
});

View File

@@ -25,14 +25,3 @@
font-family: 'Ubuntu Mono';
src: url('UbuntuMono-Regular.eot?#iefix&v=1.3.0') format('embedded-opentype'), url('UbuntuMono-Regular.woff?v=1.3.0') format('woff'), url('UbuntuMono-Regular.ttf?v=1.3.0') format('truetype');
}
/*
* text-security-disc
*/
@font-face {
font-weight: normal;
font-style: normal;
font-family: 'text-security-disc';
src: url('text-security-disc.woff?v=1.3.0') format('woff'), url('text-security-disc.ttf?v=1.3.0') format('truetype');
}

View File

@@ -15,5 +15,5 @@
"start_url": "../../../../",
"theme_color": "#3a3f51",
"background_color": "#3a3f51",
"display": "minimal-ui"
"display": "standalone"
}

View File

@@ -0,0 +1,34 @@
import PropTypes from 'prop-types';
import React from 'react';
import Modal from 'Components/Modal/Modal';
import { sizes } from 'Helpers/Props';
import AuthenticationRequiredModalContentConnector from './AuthenticationRequiredModalContentConnector';
function onModalClose() {
// No-op
}
function AuthenticationRequiredModal(props) {
const {
isOpen
} = props;
return (
<Modal
size={sizes.MEDIUM}
isOpen={isOpen}
closeOnBackgroundClick={false}
onModalClose={onModalClose}
>
<AuthenticationRequiredModalContentConnector
onModalClose={onModalClose}
/>
</Modal>
);
}
AuthenticationRequiredModal.propTypes = {
isOpen: PropTypes.bool.isRequired
};
export default AuthenticationRequiredModal;

View File

@@ -0,0 +1,5 @@
.authRequiredAlert {
composes: alert from '~Components/Alert.css';
margin-bottom: 20px;
}

View File

@@ -1,7 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'input': string;
'authRequiredAlert': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -0,0 +1,170 @@
import PropTypes from 'prop-types';
import React, { useEffect, useRef } from 'react';
import Alert from 'Components/Alert';
import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import SpinnerButton from 'Components/Link/SpinnerButton';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import ModalBody from 'Components/Modal/ModalBody';
import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes, kinds } from 'Helpers/Props';
import { authenticationMethodOptions, authenticationRequiredOptions } from 'Settings/General/SecuritySettings';
import translate from 'Utilities/String/translate';
import styles from './AuthenticationRequiredModalContent.css';
function onModalClose() {
// No-op
}
function AuthenticationRequiredModalContent(props) {
const {
isPopulated,
error,
isSaving,
settings,
onInputChange,
onSavePress,
dispatchFetchStatus
} = props;
const {
authenticationMethod,
authenticationRequired,
username,
password,
passwordConfirmation
} = settings;
const authenticationEnabled = authenticationMethod && authenticationMethod.value !== 'none';
const didMount = useRef(false);
useEffect(() => {
if (!isSaving && didMount.current) {
dispatchFetchStatus();
}
didMount.current = true;
}, [isSaving, dispatchFetchStatus]);
return (
<ModalContent
showCloseButton={false}
onModalClose={onModalClose}
>
<ModalHeader>
{translate('AuthenticationRequired')}
</ModalHeader>
<ModalBody>
<Alert
className={styles.authRequiredAlert}
kind={kinds.WARNING}
>
{translate('AuthenticationRequiredWarning')}
</Alert>
{
isPopulated && !error ?
<div>
<FormGroup>
<FormLabel>{translate('AuthenticationMethod')}</FormLabel>
<FormInputGroup
type={inputTypes.SELECT}
name="authenticationMethod"
values={authenticationMethodOptions}
helpText={translate('AuthenticationMethodHelpText')}
helpTextWarning={authenticationMethod.value === 'none' ? translate('AuthenticationMethodHelpTextWarning') : undefined}
helpLink="https://wiki.servarr.com/readarr/faq#forced-authentication"
onChange={onInputChange}
{...authenticationMethod}
/>
</FormGroup>
<FormGroup>
<FormLabel>{translate('AuthenticationRequired')}</FormLabel>
<FormInputGroup
type={inputTypes.SELECT}
name="authenticationRequired"
values={authenticationRequiredOptions}
helpText={translate('AuthenticationRequiredHelpText')}
onChange={onInputChange}
{...authenticationRequired}
/>
</FormGroup>
<FormGroup>
<FormLabel>{translate('Username')}</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
name="username"
onChange={onInputChange}
helpTextWarning={username?.value ? undefined : translate('AuthenticationRequiredUsernameHelpTextWarning')}
{...username}
/>
</FormGroup>
<FormGroup>
<FormLabel>{translate('Password')}</FormLabel>
<FormInputGroup
type={inputTypes.PASSWORD}
name="password"
onChange={onInputChange}
helpTextWarning={password?.value ? undefined : translate('AuthenticationRequiredPasswordHelpTextWarning')}
{...password}
/>
</FormGroup>
<FormGroup>
<FormLabel>{translate('PasswordConfirmation')}</FormLabel>
<FormInputGroup
type={inputTypes.PASSWORD}
name="passwordConfirmation"
onChange={onInputChange}
helpTextWarning={passwordConfirmation?.value ? undefined : translate('AuthenticationRequiredPasswordConfirmationHelpTextWarning')}
{...passwordConfirmation}
/>
</FormGroup>
</div> :
null
}
{
!isPopulated && !error ? <LoadingIndicator /> : null
}
</ModalBody>
<ModalFooter>
<SpinnerButton
kind={kinds.PRIMARY}
isSpinning={isSaving}
isDisabled={!authenticationEnabled}
onPress={onSavePress}
>
{translate('Save')}
</SpinnerButton>
</ModalFooter>
</ModalContent>
);
}
AuthenticationRequiredModalContent.propTypes = {
isPopulated: PropTypes.bool.isRequired,
error: PropTypes.object,
isSaving: PropTypes.bool.isRequired,
saveError: PropTypes.object,
settings: PropTypes.object.isRequired,
onInputChange: PropTypes.func.isRequired,
onSavePress: PropTypes.func.isRequired,
dispatchFetchStatus: PropTypes.func.isRequired
};
export default AuthenticationRequiredModalContent;

View File

@@ -0,0 +1,86 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { clearPendingChanges } from 'Store/Actions/baseActions';
import { fetchGeneralSettings, saveGeneralSettings, setGeneralSettingsValue } from 'Store/Actions/settingsActions';
import { fetchStatus } from 'Store/Actions/systemActions';
import createSettingsSectionSelector from 'Store/Selectors/createSettingsSectionSelector';
import AuthenticationRequiredModalContent from './AuthenticationRequiredModalContent';
const SECTION = 'general';
function createMapStateToProps() {
return createSelector(
createSettingsSectionSelector(SECTION),
(sectionSettings) => {
return {
...sectionSettings
};
}
);
}
const mapDispatchToProps = {
dispatchClearPendingChanges: clearPendingChanges,
dispatchSetGeneralSettingsValue: setGeneralSettingsValue,
dispatchSaveGeneralSettings: saveGeneralSettings,
dispatchFetchGeneralSettings: fetchGeneralSettings,
dispatchFetchStatus: fetchStatus
};
class AuthenticationRequiredModalContentConnector extends Component {
//
// Lifecycle
componentDidMount() {
this.props.dispatchFetchGeneralSettings();
}
componentWillUnmount() {
this.props.dispatchClearPendingChanges({ section: `settings.${SECTION}` });
}
//
// Listeners
onInputChange = ({ name, value }) => {
this.props.dispatchSetGeneralSettingsValue({ name, value });
};
onSavePress = () => {
this.props.dispatchSaveGeneralSettings();
};
//
// Render
render() {
const {
dispatchClearPendingChanges,
dispatchFetchGeneralSettings,
dispatchSetGeneralSettingsValue,
dispatchSaveGeneralSettings,
...otherProps
} = this.props;
return (
<AuthenticationRequiredModalContent
{...otherProps}
onInputChange={this.onInputChange}
onSavePress={this.onSavePress}
/>
);
}
}
AuthenticationRequiredModalContentConnector.propTypes = {
dispatchClearPendingChanges: PropTypes.func.isRequired,
dispatchFetchGeneralSettings: PropTypes.func.isRequired,
dispatchSetGeneralSettingsValue: PropTypes.func.isRequired,
dispatchSaveGeneralSettings: PropTypes.func.isRequired,
dispatchFetchStatus: PropTypes.func.isRequired
};
export default connect(createMapStateToProps, mapDispatchToProps)(AuthenticationRequiredModalContentConnector);

View File

@@ -47,14 +47,16 @@ class InteractiveImportRow extends Component {
author,
book,
foreignEditionId,
quality
quality,
size
} = this.props;
if (
author &&
book != null &&
foreignEditionId &&
quality
quality &&
size > 0
) {
this.props.onSelectedChange({ id, value: true });
}

View File

@@ -1,5 +1,6 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import TextInput from 'Components/Form/TextInput';
import Icon from 'Components/Icon';
import Button from 'Components/Link/Button';
@@ -7,7 +8,7 @@ import Link from 'Components/Link/Link';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
import { icons } from 'Helpers/Props';
import { icons, kinds } from 'Helpers/Props';
import getErrorMessage from 'Utilities/Object/getErrorMessage';
import translate from 'Utilities/String/translate';
import AddNewAuthorSearchResultConnector from './Author/AddNewAuthorSearchResultConnector';
@@ -127,9 +128,16 @@ class AddNewItem extends Component {
!isFetching && !!error ?
<div className={styles.message}>
<div className={styles.helpText}>
Failed to load search results, please try again.
{translate('FailedLoadingSearchResults')}
</div>
<Alert kind={kinds.WARNING}>{getErrorMessage(error)}</Alert>
<div>
<Link to="https://wiki.servarr.com/readarr/troubleshooting#invalid-response-received-from-metadata-api">
{translate('WhySearchesCouldBeFailing')}
</Link>
</div>
<div>{getErrorMessage(error)}</div>
</div> : null
}

View File

@@ -1,5 +1,6 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import Card from 'Components/Card';
import FieldSet from 'Components/FieldSet';
import Form from 'Components/Form/Form';
@@ -150,6 +151,11 @@ class EditCustomFormatModalContent extends Component {
</Form>
<FieldSet legend={translate('Conditions')}>
<Alert kind={kinds.INFO}>
<div>
{translate('CustomFormatsSettingsTriggerInfo')}
</div>
</Alert>
<div className={styles.customFormats}>
{
specifications.map((tag) => {

View File

@@ -15,6 +15,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes, kinds, sizes } from 'Helpers/Props';
import AdvancedSettingsButton from 'Settings/AdvancedSettingsButton';
import translate from 'Utilities/String/translate';
import styles from './EditDownloadClientModalContent.css';
@@ -37,6 +38,7 @@ class EditDownloadClientModalContent extends Component {
onModalClose,
onSavePress,
onTestPress,
onAdvancedSettingsPress,
onDeleteDownloadClientPress,
...otherProps
} = this.props;
@@ -205,6 +207,12 @@ class EditDownloadClientModalContent extends Component {
</Button>
}
<AdvancedSettingsButton
advancedSettings={advancedSettings}
onAdvancedSettingsPress={onAdvancedSettingsPress}
showLabel={false}
/>
<SpinnerErrorButton
isSpinning={isTesting}
error={saveError}
@@ -245,6 +253,7 @@ EditDownloadClientModalContent.propTypes = {
onModalClose: PropTypes.func.isRequired,
onSavePress: PropTypes.func.isRequired,
onTestPress: PropTypes.func.isRequired,
onAdvancedSettingsPress: PropTypes.func.isRequired,
onDeleteDownloadClientPress: PropTypes.func
};

View File

@@ -2,7 +2,13 @@ import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { saveDownloadClient, setDownloadClientFieldValue, setDownloadClientValue, testDownloadClient } from 'Store/Actions/settingsActions';
import {
saveDownloadClient,
setDownloadClientFieldValue,
setDownloadClientValue,
testDownloadClient,
toggleAdvancedSettings
} from 'Store/Actions/settingsActions';
import createProviderSettingsSelector from 'Store/Selectors/createProviderSettingsSelector';
import EditDownloadClientModalContent from './EditDownloadClientModalContent';
@@ -23,7 +29,8 @@ const mapDispatchToProps = {
setDownloadClientValue,
setDownloadClientFieldValue,
saveDownloadClient,
testDownloadClient
testDownloadClient,
toggleAdvancedSettings
};
class EditDownloadClientModalContentConnector extends Component {
@@ -56,6 +63,10 @@ class EditDownloadClientModalContentConnector extends Component {
this.props.testDownloadClient({ id: this.props.id });
};
onAdvancedSettingsPress = () => {
this.props.toggleAdvancedSettings();
};
//
// Render
@@ -65,6 +76,7 @@ class EditDownloadClientModalContentConnector extends Component {
{...this.props}
onSavePress={this.onSavePress}
onTestPress={this.onTestPress}
onAdvancedSettingsPress={this.onAdvancedSettingsPress}
onInputChange={this.onInputChange}
onFieldChange={this.onFieldChange}
/>
@@ -82,6 +94,7 @@ EditDownloadClientModalContentConnector.propTypes = {
setDownloadClientFieldValue: PropTypes.func.isRequired,
saveDownloadClient: PropTypes.func.isRequired,
testDownloadClient: PropTypes.func.isRequired,
toggleAdvancedSettings: PropTypes.func.isRequired,
onModalClose: PropTypes.func.isRequired
};

View File

@@ -11,16 +11,69 @@ import ConfirmModal from 'Components/Modal/ConfirmModal';
import { icons, inputTypes, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
const authenticationMethodOptions = [
{ key: 'none', value: 'None' },
{ key: 'basic', value: 'Basic (Browser Popup)' },
{ key: 'forms', value: 'Forms (Login Page)' }
export const authenticationMethodOptions = [
{
key: 'none',
get value() {
return translate('None');
},
isDisabled: true
},
{
key: 'external',
get value() {
return translate('External');
},
isHidden: true
},
{
key: 'basic',
get value() {
return translate('AuthBasic');
}
},
{
key: 'forms',
get value() {
return translate('AuthForm');
}
}
];
export const authenticationRequiredOptions = [
{
key: 'enabled',
get value() {
return translate('Enabled');
}
},
{
key: 'disabledForLocalAddresses',
get value() {
return translate('DisabledForLocalAddresses');
}
}
];
const certificateValidationOptions = [
{ key: 'enabled', value: 'Enabled' },
{ key: 'disabledForLocalAddresses', value: 'Disabled for Local Addresses' },
{ key: 'disabled', value: 'Disabled' }
{
key: 'enabled',
get value() {
return translate('Enabled');
}
},
{
key: 'disabledForLocalAddresses',
get value() {
return translate('DisabledForLocalAddresses');
}
},
{
key: 'disabled',
get value() {
return translate('Disabled');
}
}
];
class SecuritySettings extends Component {
@@ -68,8 +121,10 @@ class SecuritySettings extends Component {
const {
authenticationMethod,
authenticationRequired,
username,
password,
passwordConfirmation,
apiKey,
certificateValidation
} = settings;
@@ -79,26 +134,40 @@ class SecuritySettings extends Component {
return (
<FieldSet legend={translate('Security')}>
<FormGroup>
<FormLabel>
{translate('Authentication')}
</FormLabel>
<FormLabel>{translate('Authentication')}</FormLabel>
<FormInputGroup
type={inputTypes.SELECT}
name="authenticationMethod"
values={authenticationMethodOptions}
helpText={translate('AuthenticationMethodHelpText')}
helpTextWarning={translate('AuthenticationRequiredWarning')}
onChange={onInputChange}
{...authenticationMethod}
/>
</FormGroup>
{
authenticationEnabled &&
authenticationEnabled ?
<FormGroup>
<FormLabel>
{translate('Username')}
</FormLabel>
<FormLabel>{translate('AuthenticationRequired')}</FormLabel>
<FormInputGroup
type={inputTypes.SELECT}
name="authenticationRequired"
values={authenticationRequiredOptions}
helpText={translate('AuthenticationRequiredHelpText')}
onChange={onInputChange}
{...authenticationRequired}
/>
</FormGroup> :
null
}
{
authenticationEnabled ?
<FormGroup>
<FormLabel>{translate('Username')}</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
@@ -106,15 +175,14 @@ class SecuritySettings extends Component {
onChange={onInputChange}
{...username}
/>
</FormGroup>
</FormGroup> :
null
}
{
authenticationEnabled &&
authenticationEnabled ?
<FormGroup>
<FormLabel>
{translate('Password')}
</FormLabel>
<FormLabel>{translate('Password')}</FormLabel>
<FormInputGroup
type={inputTypes.PASSWORD}
@@ -122,19 +190,33 @@ class SecuritySettings extends Component {
onChange={onInputChange}
{...password}
/>
</FormGroup>
</FormGroup> :
null
}
{
authenticationEnabled ?
<FormGroup>
<FormLabel>{translate('PasswordConfirmation')}</FormLabel>
<FormInputGroup
type={inputTypes.PASSWORD}
name="passwordConfirmation"
onChange={onInputChange}
{...passwordConfirmation}
/>
</FormGroup> :
null
}
<FormGroup>
<FormLabel>
{translate('APIKey')}
</FormLabel>
<FormLabel>{translate('ApiKey')}</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
name="apiKey"
readOnly={true}
helpTextWarning={translate('ApiKeyHelpTextWarning')}
helpTextWarning={translate('RestartRequiredHelpTextWarning')}
buttons={[
<ClipboardButton
key="copy"
@@ -160,9 +242,7 @@ class SecuritySettings extends Component {
</FormGroup>
<FormGroup>
<FormLabel>
{translate('CertificateValidation')}
</FormLabel>
<FormLabel>{translate('CertificateValidation')}</FormLabel>
<FormInputGroup
type={inputTypes.SELECT}

View File

@@ -20,6 +20,7 @@ import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import Popover from 'Components/Tooltip/Popover';
import { icons, inputTypes, kinds, tooltipPositions } from 'Helpers/Props';
import AdvancedSettingsButton from 'Settings/AdvancedSettingsButton';
import formatShortTimeSpan from 'Utilities/Date/formatShortTimeSpan';
import translate from 'Utilities/String/translate';
import styles from './EditImportListModalContent.css';
@@ -66,6 +67,7 @@ function EditImportListModalContent(props) {
onModalClose,
onSavePress,
onTestPress,
onAdvancedSettingsPress,
onDeleteImportListPress,
showMetadataProfile,
...otherProps
@@ -332,6 +334,12 @@ function EditImportListModalContent(props) {
</Button>
}
<AdvancedSettingsButton
advancedSettings={advancedSettings}
onAdvancedSettingsPress={onAdvancedSettingsPress}
showLabel={false}
/>
<SpinnerErrorButton
isSpinning={isTesting}
error={saveError}
@@ -372,6 +380,7 @@ EditImportListModalContent.propTypes = {
onModalClose: PropTypes.func.isRequired,
onSavePress: PropTypes.func.isRequired,
onTestPress: PropTypes.func.isRequired,
onAdvancedSettingsPress: PropTypes.func.isRequired,
onDeleteImportListPress: PropTypes.func
};

View File

@@ -2,7 +2,13 @@ import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { saveImportList, setImportListFieldValue, setImportListValue, testImportList } from 'Store/Actions/settingsActions';
import {
saveImportList,
setImportListFieldValue,
setImportListValue,
testImportList,
toggleAdvancedSettings
} from 'Store/Actions/settingsActions';
import createProviderSettingsSelector from 'Store/Selectors/createProviderSettingsSelector';
import EditImportListModalContent from './EditImportListModalContent';
@@ -25,7 +31,8 @@ const mapDispatchToProps = {
setImportListValue,
setImportListFieldValue,
saveImportList,
testImportList
testImportList,
toggleAdvancedSettings
};
class EditImportListModalContentConnector extends Component {
@@ -58,6 +65,10 @@ class EditImportListModalContentConnector extends Component {
this.props.testImportList({ id: this.props.id });
};
onAdvancedSettingsPress = () => {
this.props.toggleAdvancedSettings();
};
//
// Render
@@ -67,6 +78,7 @@ class EditImportListModalContentConnector extends Component {
{...this.props}
onSavePress={this.onSavePress}
onTestPress={this.onTestPress}
onAdvancedSettingsPress={this.onAdvancedSettingsPress}
onInputChange={this.onInputChange}
onFieldChange={this.onFieldChange}
/>
@@ -84,6 +96,7 @@ EditImportListModalContentConnector.propTypes = {
setImportListFieldValue: PropTypes.func.isRequired,
saveImportList: PropTypes.func.isRequired,
testImportList: PropTypes.func.isRequired,
toggleAdvancedSettings: PropTypes.func.isRequired,
onModalClose: PropTypes.func.isRequired
};

View File

@@ -14,6 +14,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes, kinds } from 'Helpers/Props';
import AdvancedSettingsButton from 'Settings/AdvancedSettingsButton';
import translate from 'Utilities/String/translate';
import NotificationEventItems from './NotificationEventItems';
import styles from './EditNotificationModalContent.css';
@@ -32,6 +33,7 @@ function EditNotificationModalContent(props) {
onModalClose,
onSavePress,
onTestPress,
onAdvancedSettingsPress,
onDeleteNotificationPress,
...otherProps
} = props;
@@ -140,6 +142,12 @@ function EditNotificationModalContent(props) {
</Button>
}
<AdvancedSettingsButton
advancedSettings={advancedSettings}
onAdvancedSettingsPress={onAdvancedSettingsPress}
showLabel={false}
/>
<SpinnerErrorButton
isSpinning={isTesting}
error={saveError}
@@ -179,6 +187,7 @@ EditNotificationModalContent.propTypes = {
onModalClose: PropTypes.func.isRequired,
onSavePress: PropTypes.func.isRequired,
onTestPress: PropTypes.func.isRequired,
onAdvancedSettingsPress: PropTypes.func.isRequired,
onDeleteNotificationPress: PropTypes.func
};

View File

@@ -2,7 +2,13 @@ import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { saveNotification, setNotificationFieldValue, setNotificationValue, testNotification } from 'Store/Actions/settingsActions';
import {
saveNotification,
setNotificationFieldValue,
setNotificationValue,
testNotification,
toggleAdvancedSettings
} from 'Store/Actions/settingsActions';
import createProviderSettingsSelector from 'Store/Selectors/createProviderSettingsSelector';
import EditNotificationModalContent from './EditNotificationModalContent';
@@ -23,7 +29,8 @@ const mapDispatchToProps = {
setNotificationValue,
setNotificationFieldValue,
saveNotification,
testNotification
testNotification,
toggleAdvancedSettings
};
class EditNotificationModalContentConnector extends Component {
@@ -56,6 +63,10 @@ class EditNotificationModalContentConnector extends Component {
this.props.testNotification({ id: this.props.id });
};
onAdvancedSettingsPress = () => {
this.props.toggleAdvancedSettings();
};
//
// Render
@@ -65,6 +76,7 @@ class EditNotificationModalContentConnector extends Component {
{...this.props}
onSavePress={this.onSavePress}
onTestPress={this.onTestPress}
onAdvancedSettingsPress={this.onAdvancedSettingsPress}
onInputChange={this.onInputChange}
onFieldChange={this.onFieldChange}
/>
@@ -82,6 +94,7 @@ EditNotificationModalContentConnector.propTypes = {
setNotificationFieldValue: PropTypes.func.isRequired,
saveNotification: PropTypes.func.isRequired,
testNotification: PropTypes.func.isRequired,
toggleAdvancedSettings: PropTypes.func.isRequired,
onModalClose: PropTypes.func.isRequired
};

View File

@@ -1,8 +1,11 @@
import $ from 'jquery';
import _ from 'lodash';
import createAjaxRequest from 'Utilities/createAjaxRequest';
import getProviderState from 'Utilities/State/getProviderState';
import { set } from '../baseActions';
const abortCurrentRequests = {};
let lastTestData = null;
export function createCancelTestProviderHandler(section) {
return function(getState, payload, dispatch) {
@@ -17,10 +20,25 @@ function createTestProviderHandler(section, url) {
return function(getState, payload, dispatch) {
dispatch(set({ section, isTesting: true }));
const testData = getProviderState(payload, getState, section);
const {
queryParams = {},
...otherPayload
} = payload;
const testData = getProviderState({ ...otherPayload }, getState, section);
const params = { ...queryParams };
// If the user is re-testing the same provider without changes
// force it to be tested.
if (_.isEqual(testData, lastTestData)) {
params.forceTest = true;
}
lastTestData = testData;
const ajaxOptions = {
url: `${url}/test`,
url: `${url}/test?${$.param(params, true)}`,
method: 'POST',
contentType: 'application/json',
dataType: 'json',
@@ -32,6 +50,8 @@ function createTestProviderHandler(section, url) {
abortCurrentRequests[section] = abortRequest;
request.done((data) => {
lastTestData = null;
dispatch(set({
section,
isTesting: false,

View File

@@ -1,12 +1,21 @@
import { createSelector } from 'reselect';
import AppState from 'App/State/AppState';
import Author from 'Author/Author';
function createMultiAuthorsSelector(authorIds: number[]) {
return createSelector(
(state: AppState) => state.authors.itemMap,
(state: AppState) => state.authors.items,
(itemMap, allAuthors) => {
return authorIds.map((authorId) => allAuthors[itemMap[authorId]]);
return authorIds.reduce((acc: Author[], authorId) => {
const author = allAuthors[itemMap[authorId]];
if (author) {
acc.push(author);
}
return acc;
}, []);
}
);
}

View File

@@ -1,8 +1,9 @@
import { createSelector } from 'reselect';
import AppState from 'App/State/AppState';
function createTagsSelector() {
return createSelector(
(state) => state.tags.items,
(state: AppState) => state.tags.items,
(tags) => {
return tags;
}

View File

@@ -2,7 +2,6 @@ module.exports = {
// Families
defaultFontFamily: 'Roboto, "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif',
monoSpaceFontFamily: '"Ubuntu Mono", Menlo, Monaco, Consolas, "Courier New", monospace;',
passwordFamily: 'text-security-disc',
// Sizes
extraSmallFontSize: '11px',

View File

@@ -6,6 +6,22 @@ import createMultiAuthorsSelector from 'Store/Selectors/createMultiAuthorsSelect
import translate from 'Utilities/String/translate';
import styles from './QueuedTaskRowNameCell.css';
function formatTitles(titles: string[]) {
if (!titles) {
return null;
}
if (titles.length > 11) {
return (
<span title={titles.join(', ')}>
{titles.slice(0, 10).join(', ')}, {titles.length - 10} more
</span>
);
}
return <span>{titles.join(', ')}</span>;
}
export interface QueuedTaskRowNameCellProps {
commandName: string;
body: CommandBody;
@@ -32,7 +48,7 @@ export default function QueuedTaskRowNameCell(
<span className={styles.commandName}>
{commandName}
{sortedAuthors.length ? (
<span> - {sortedAuthors.map((a) => a.authorName).join(', ')}</span>
<span> - {formatTitles(sortedAuthors.map((a) => a.authorName))}</span>
) : null}
</span>

View File

@@ -33,9 +33,9 @@
"@microsoft/signalr": "6.0.25",
"@sentry/browser": "7.51.2",
"@sentry/integrations": "7.51.2",
"@types/node": "18.16.16",
"@types/react": "18.2.7",
"@types/react-dom": "18.2.4",
"@types/node": "18.19.31",
"@types/react": "18.2.79",
"@types/react-dom": "18.2.25",
"ansi-colors": "4.1.3",
"classnames": "2.3.2",
"clipboard": "2.0.11",
@@ -84,44 +84,44 @@
"redux-thunk": "2.3.0",
"reselect": "4.1.8",
"stacktrace-js": "2.0.2",
"typescript": "4.9.5"
"typescript": "5.1.6"
},
"devDependencies": {
"@babel/core": "7.22.11",
"@babel/eslint-parser": "7.22.11",
"@babel/plugin-proposal-export-default-from": "7.22.5",
"@babel/core": "7.24.4",
"@babel/eslint-parser": "7.24.1",
"@babel/plugin-proposal-export-default-from": "7.24.1",
"@babel/plugin-syntax-dynamic-import": "7.8.3",
"@babel/preset-env": "7.22.15",
"@babel/preset-react": "7.22.5",
"@babel/preset-typescript": "7.22.11",
"@types/lodash": "4.14.197",
"@types/react-lazyload": "3.2.1",
"@babel/preset-env": "7.24.4",
"@babel/preset-react": "7.24.1",
"@babel/preset-typescript": "7.24.1",
"@types/lodash": "4.14.195",
"@types/react-lazyload": "3.2.0",
"@types/redux-actions": "2.6.2",
"@typescript-eslint/eslint-plugin": "6.5.0",
"@typescript-eslint/parser": "6.5.0",
"@typescript-eslint/eslint-plugin": "6.21.0",
"@typescript-eslint/parser": "6.21.0",
"autoprefixer": "10.4.14",
"babel-loader": "9.1.3",
"babel-plugin-inline-classnames": "2.0.1",
"babel-plugin-transform-react-remove-prop-types": "0.4.24",
"core-js": "3.32.1",
"core-js": "3.37.0",
"css-loader": "6.8.1",
"css-modules-typescript-loader": "4.0.1",
"eslint": "8.44.0",
"eslint-config-prettier": "8.8.0",
"eslint": "8.57.0",
"eslint-config-prettier": "8.10.0",
"eslint-plugin-filenames": "1.3.2",
"eslint-plugin-import": "2.27.5",
"eslint-plugin-import": "2.29.1",
"eslint-plugin-json": "3.1.0",
"eslint-plugin-prettier": "4.2.1",
"eslint-plugin-react": "7.32.2",
"eslint-plugin-react": "7.34.1",
"eslint-plugin-react-hooks": "4.6.0",
"eslint-plugin-simple-import-sort": "10.0.0",
"eslint-plugin-simple-import-sort": "12.1.0",
"file-loader": "6.2.0",
"filemanager-webpack-plugin": "8.0.0",
"fork-ts-checker-webpack-plugin": "8.0.0",
"html-webpack-plugin": "5.5.3",
"loader-utils": "^3.2.1",
"mini-css-extract-plugin": "2.7.6",
"postcss": "8.4.31",
"postcss": "8.4.38",
"postcss-color-function": "4.1.0",
"postcss-loader": "7.3.0",
"postcss-mixins": "9.0.4",

View File

@@ -139,16 +139,46 @@
</Otherwise>
</Choose>
<!--
Set architecture to RuntimeInformation.ProcessArchitecture if not specified -->
<Choose>
<When Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture)' == 'X64'">
<PropertyGroup>
<Architecture>x64</Architecture>
</PropertyGroup>
</When>
<When Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture)' == 'X86'">
<PropertyGroup>
<Architecture>x86</Architecture>
</PropertyGroup>
</When>
<When Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture)' == 'Arm64'">
<PropertyGroup>
<Architecture>arm64</Architecture>
</PropertyGroup>
</When>
<When Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture)' == 'Arm'">
<PropertyGroup>
<Architecture>arm</Architecture>
</PropertyGroup>
</When>
<Otherwise>
<PropertyGroup>
<Architecture></Architecture>
</PropertyGroup>
</Otherwise>
</Choose>
<PropertyGroup Condition="'$(IsWindows)' == 'true' and
'$(RuntimeIdentifier)' == ''">
<_UsingDefaultRuntimeIdentifier>true</_UsingDefaultRuntimeIdentifier>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<RuntimeIdentifier>win-$(Architecture)</RuntimeIdentifier>
</PropertyGroup>
<PropertyGroup Condition="'$(IsLinux)' == 'true' and
'$(RuntimeIdentifier)' == ''">
<_UsingDefaultRuntimeIdentifier>true</_UsingDefaultRuntimeIdentifier>
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
<RuntimeIdentifier>linux-$(Architecture)</RuntimeIdentifier>
</PropertyGroup>
<PropertyGroup Condition="'$(IsOSX)' == 'true' and

View File

@@ -3,7 +3,7 @@
<ItemGroup>
<PackageVersion Include="AutoFixture" Version="4.17.0" />
<PackageVersion Include="coverlet.collector" Version="3.0.4-preview.27.ge7cb7c3b40" PrivateAssets="all" />
<PackageVersion Include="Dapper" Version="2.0.123" />
<PackageVersion Include="Dapper" Version="2.0.151" />
<PackageVersion Include="DryIoc.dll" Version="5.4.3" />
<PackageVersion Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" />
<PackageVersion Include="Equ" Version="2.3.0" />
@@ -17,13 +17,13 @@
<PackageVersion Include="ImpromptuInterface" Version="7.0.1" />
<PackageVersion Include="LazyCache" Version="2.4.0" />
<PackageVersion Include="Mailkit" Version="3.6.0" />
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.25" />
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.29" />
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="6.0.1" />
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="6.0.1" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
<PackageVersion Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="6.0.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.4.1" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
<PackageVersion Include="Microsoft.Win32.Registry" Version="5.0.0" />
<PackageVersion Include="Mono.Posix.NETStandard" Version="5.20.1.34-servarr22" />
<PackageVersion Include="Moq" Version="4.17.2" />
@@ -33,9 +33,9 @@
<PackageVersion Include="NLog.Extensions.Logging" Version="5.2.3" />
<PackageVersion Include="NLog" Version="5.1.4" />
<PackageVersion Include="NLog.Targets.Syslog" Version="7.0.0" />
<PackageVersion Include="Npgsql" Version="7.0.6" />
<PackageVersion Include="Npgsql" Version="7.0.7" />
<PackageVersion Include="NUnit3TestAdapter" Version="4.2.1" />
<PackageVersion Include="NUnit" Version="3.13.3" />
<PackageVersion Include="NUnit" Version="3.14.0" />
<PackageVersion Include="NunitXml.TestLogger" Version="3.0.117" />
<PackageVersion Include="PdfSharpCore" Version="1.3.32" />
<PackageVersion Include="RestSharp.Serializers.SystemTextJson" Version="106.15.0" />
@@ -44,9 +44,10 @@
<PackageVersion Include="Selenium.WebDriver.ChromeDriver" Version="91.0.4472.10100" />
<PackageVersion Include="Sentry" Version="3.31.0" />
<PackageVersion Include="SharpZipLib" Version="1.4.2" />
<PackageVersion Include="SixLabors.ImageSharp" Version="3.1.3" />
<PackageVersion Include="SixLabors.ImageSharp" Version="3.1.4" />
<PackageVersion Include="StyleCop.Analyzers" Version="1.1.118" />
<PackageVersion Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.5.0" />
<PackageVersion Include="Swashbuckle.AspNetCore.Annotations" Version="6.6.2" />
<PackageVersion Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" />
<PackageVersion Include="System.Buffers" Version="4.5.1" />
<PackageVersion Include="System.Configuration.ConfigurationManager" Version="6.0.1" />
<PackageVersion Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />

View File

@@ -46,7 +46,7 @@ namespace NzbDrone.Automation.Test
_runner = new NzbDroneRunner(LogManager.GetCurrentClassLogger(), null);
_runner.KillAll();
_runner.Start();
_runner.Start(true);
driver.Url = "http://localhost:8787";

View File

@@ -1,10 +1,12 @@
using System.Collections.Generic;
using FluentAssertions;
using Microsoft.Extensions.Options;
using Moq;
using NUnit.Framework;
using NzbDrone.Common.Disk;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Options;
using NzbDrone.Core.Authentication;
using NzbDrone.Core.Configuration;
using NzbDrone.Test.Common;
@@ -43,6 +45,26 @@ namespace NzbDrone.Common.Test
Mocker.GetMock<IDiskProvider>()
.Setup(v => v.WriteAllText(configFile, It.IsAny<string>()))
.Callback<string, string>((p, t) => _configFileContents = t);
Mocker.GetMock<IOptions<AuthOptions>>()
.Setup(v => v.Value)
.Returns(new AuthOptions());
Mocker.GetMock<IOptions<AppOptions>>()
.Setup(v => v.Value)
.Returns(new AppOptions());
Mocker.GetMock<IOptions<ServerOptions>>()
.Setup(v => v.Value)
.Returns(new ServerOptions());
Mocker.GetMock<IOptions<LogOptions>>()
.Setup(v => v.Value)
.Returns(new LogOptions());
Mocker.GetMock<IOptions<UpdateOptions>>()
.Setup(v => v.Value)
.Returns(new UpdateOptions());
}
[Test]

View File

@@ -19,6 +19,8 @@ namespace NzbDrone.Common.Test.InstrumentationTests
[TestCase(@"https://baconbits.org/feeds.php?feed=torrents_tv&user=12345&auth=2b51db35e1910123321025a12b9933d2&passkey=mySecret&authkey=2b51db35e1910123321025a12b9933d2")]
[TestCase(@"http://127.0.0.1:9117/dl/indexername?jackett_apikey=flwjiefewklfjacketmySecretsdfldskjfsdlk&path=we0re9f0sdfbase64sfdkfjsdlfjk&file=The+Torrent+File+Name.torrent")]
[TestCase(@"http://nzb.su/getnzb/2b51db35e1912ffc138825a12b9933d2.nzb&i=37292&r=2b51db35e1910123321025a12b9933d2")]
[TestCase(@"https://b-hd.me/torrent/download/auto.343756.is1t1pl127p1sfwur8h4kgyhg1wcsn05")]
[TestCase(@"https://b-hd.me/torrent/download/a-slug-in-the-url.343756.is1t1pl127p1sfwur8h4kgyhg1wcsn05")]
// NzbGet
[TestCase(@"{ ""Name"" : ""ControlUsername"", ""Value"" : ""mySecret"" }, { ""Name"" : ""ControlPassword"", ""Value"" : ""mySecret"" }, ")]

View File

@@ -10,6 +10,7 @@ using NUnit.Framework;
using NzbDrone.Common.Composition.Extensions;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Instrumentation.Extensions;
using NzbDrone.Common.Options;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.Datastore.Extensions;
using NzbDrone.Core.Lifecycle;
@@ -33,6 +34,11 @@ namespace NzbDrone.Common.Test
container.RegisterInstance(new Mock<IHostLifetime>().Object);
container.RegisterInstance(new Mock<IOptions<PostgresOptions>>().Object);
container.RegisterInstance(new Mock<IOptions<AppOptions>>().Object);
container.RegisterInstance(new Mock<IOptions<AuthOptions>>().Object);
container.RegisterInstance(new Mock<IOptions<ServerOptions>>().Object);
container.RegisterInstance(new Mock<IOptions<LogOptions>>().Object);
container.RegisterInstance(new Mock<IOptions<UpdateOptions>>().Object);
var serviceProvider = container.GetServiceProvider();
serviceProvider.GetRequiredService<IAppFolderFactory>().Register();

View File

@@ -10,6 +10,7 @@ using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using NLog;
using NzbDrone.Common.Cache;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http.Proxy;
@@ -31,11 +32,14 @@ namespace NzbDrone.Common.Http.Dispatchers
private readonly ICached<System.Net.Http.HttpClient> _httpClientCache;
private readonly ICached<CredentialCache> _credentialCache;
private readonly Logger _logger;
public ManagedHttpDispatcher(IHttpProxySettingsProvider proxySettingsProvider,
ICreateManagedWebProxy createManagedWebProxy,
ICertificateValidationService certificateValidationService,
IUserAgentBuilder userAgentBuilder,
ICacheManager cacheManager)
ICacheManager cacheManager,
Logger logger)
{
_proxySettingsProvider = proxySettingsProvider;
_createManagedWebProxy = createManagedWebProxy;
@@ -44,6 +48,8 @@ namespace NzbDrone.Common.Http.Dispatchers
_httpClientCache = cacheManager.GetCache<System.Net.Http.HttpClient>(typeof(ManagedHttpDispatcher), "httpclient");
_credentialCache = cacheManager.GetCache<CredentialCache>(typeof(ManagedHttpDispatcher), "credentialcache");
_logger = logger;
}
public async Task<HttpResponse> GetResponseAsync(HttpRequest request, CookieContainer cookies)
@@ -251,19 +257,27 @@ namespace NzbDrone.Common.Http.Dispatchers
return _credentialCache.Get("credentialCache", () => new CredentialCache());
}
private static bool HasRoutableIPv4Address()
private bool HasRoutableIPv4Address()
{
// Get all IPv4 addresses from all interfaces and return true if there are any with non-loopback addresses
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
try
{
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
return networkInterfaces.Any(ni =>
ni.OperationalStatus == OperationalStatus.Up &&
ni.GetIPProperties().UnicastAddresses.Any(ip =>
ip.Address.AddressFamily == AddressFamily.InterNetwork &&
!IPAddress.IsLoopback(ip.Address)));
return networkInterfaces.Any(ni =>
ni.OperationalStatus == OperationalStatus.Up &&
ni.GetIPProperties().UnicastAddresses.Any(ip =>
ip.Address.AddressFamily == AddressFamily.InterNetwork &&
!IPAddress.IsLoopback(ip.Address)));
}
catch (Exception e)
{
_logger.Debug(e, "Caught exception while GetAllNetworkInterfaces assuming IPv4 connectivity: {0}", e.Message);
return true;
}
}
private static async ValueTask<Stream> onConnect(SocketsHttpConnectionContext context, CancellationToken cancellationToken)
private async ValueTask<Stream> onConnect(SocketsHttpConnectionContext context, CancellationToken cancellationToken)
{
// Until .NET supports an implementation of Happy Eyeballs (https://tools.ietf.org/html/rfc8305#section-2), let's make IPv4 fallback work in a simple way.
// This issue is being tracked at https://github.com/dotnet/runtime/issues/26177 and expected to be fixed in .NET 6.
@@ -287,7 +301,9 @@ namespace NzbDrone.Common.Http.Dispatchers
catch
{
// Do not retry IPv6 if a routable IPv4 address is available, otherwise continue to attempt IPv6 connections.
useIPv6 = !HasRoutableIPv4Address();
var routableIPv4 = HasRoutableIPv4Address();
_logger.Info("IPv4 is available: {0}, IPv6 will be {1}", routableIPv4, routableIPv4 ? "disabled" : "left enabled");
useIPv6 = !routableIPv4;
}
finally
{

View File

@@ -18,6 +18,7 @@ namespace NzbDrone.Common.Instrumentation
new (@"/fetch/[a-z0-9]{32}/(?<secret>[a-z0-9]{32})", RegexOptions.Compiled),
new (@"getnzb.*?(?<=\?|&)(r)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"\b(\w*)?(_?(?<!use|get_)token|username|passwo?rd)=(?<secret>[^&=]+?)(?= |&|$|;)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"-hd.me/torrent/[a-z0-9-]\.[0-9]+\.(?<secret>[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Trackers Announce Keys; Designed for Qbit Json; should work for all in theory
new (@"announce(\.php)?(/|%2f|%3fpasskey%3d)(?<secret>[a-z0-9]{16,})|(?<secret>[a-z0-9]{16,})(/|%2f)announce", RegexOptions.Compiled | RegexOptions.IgnoreCase),

View File

@@ -0,0 +1,8 @@
namespace NzbDrone.Common.Options;
public class AppOptions
{
public string InstanceName { get; set; }
public string Theme { get; set; }
public bool? LaunchBrowser { get; set; }
}

View File

@@ -0,0 +1,9 @@
namespace NzbDrone.Common.Options;
public class AuthOptions
{
public string ApiKey { get; set; }
public bool? Enabled { get; set; }
public string Method { get; set; }
public string Required { get; set; }
}

View File

@@ -0,0 +1,14 @@
namespace NzbDrone.Common.Options;
public class LogOptions
{
public string Level { get; set; }
public bool? FilterSentryEvents { get; set; }
public int? Rotate { get; set; }
public bool? Sql { get; set; }
public string ConsoleLevel { get; set; }
public bool? AnalyticsEnabled { get; set; }
public string SyslogServer { get; set; }
public int? SyslogPort { get; set; }
public string SyslogLevel { get; set; }
}

View File

@@ -0,0 +1,12 @@
namespace NzbDrone.Common.Options;
public class ServerOptions
{
public string UrlBase { get; set; }
public string BindAddress { get; set; }
public int? Port { get; set; }
public bool? EnableSsl { get; set; }
public int? SslPort { get; set; }
public string SslCertPath { get; set; }
public string SslCertPassword { get; set; }
}

View File

@@ -0,0 +1,9 @@
namespace NzbDrone.Common.Options;
public class UpdateOptions
{
public string Mechanism { get; set; }
public bool? Automatically { get; set; }
public string ScriptPath { get; set; }
public string Branch { get; set; }
}

View File

@@ -108,7 +108,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
Subject.Definition.Settings.As<QBittorrentSettings>().RecentTvPriority = (int)QBittorrentPriority.First;
}
protected void GivenGlobalSeedLimits(float maxRatio, int maxSeedingTime = -1, QBittorrentMaxRatioAction maxRatioAction = QBittorrentMaxRatioAction.Pause)
protected void GivenGlobalSeedLimits(float maxRatio, int maxSeedingTime = -1, int maxInactiveSeedingTime = -1, QBittorrentMaxRatioAction maxRatioAction = QBittorrentMaxRatioAction.Pause)
{
Mocker.GetMock<IQBittorrentProxy>()
.Setup(s => s.GetConfig(It.IsAny<QBittorrentSettings>()))
@@ -118,7 +118,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
MaxRatio = maxRatio,
MaxRatioEnabled = maxRatio >= 0,
MaxSeedingTime = maxSeedingTime,
MaxSeedingTimeEnabled = maxSeedingTime >= 0
MaxSeedingTimeEnabled = maxSeedingTime >= 0,
MaxInactiveSeedingTime = maxInactiveSeedingTime,
MaxInactiveSeedingTimeEnabled = maxInactiveSeedingTime >= 0
});
}
@@ -610,7 +612,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
float ratio = 0.1f,
float ratioLimit = -2,
int seedingTime = 1,
int seedingTimeLimit = -2)
int seedingTimeLimit = -2,
int inactiveSeedingTimeLimit = -2,
long lastActivity = -1)
{
var torrent = new QBittorrentTorrent
{
@@ -624,7 +628,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
SavePath = "",
Ratio = ratio,
RatioLimit = ratioLimit,
SeedingTimeLimit = seedingTimeLimit
SeedingTimeLimit = seedingTimeLimit,
InactiveSeedingTimeLimit = inactiveSeedingTimeLimit,
LastActivity = lastActivity == -1 ? DateTimeOffset.UtcNow.ToUnixTimeSeconds() : lastActivity
};
GivenTorrents(new List<QBittorrentTorrent>() { torrent });
@@ -738,6 +744,50 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
item.CanMoveFiles.Should().BeFalse();
}
[Test]
public void should_not_be_removable_and_should_not_allow_move_files_if_max_inactive_seedingtime_reached_and_not_paused()
{
GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 20);
GivenCompletedTorrent("uploading", ratio: 2.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds());
var item = Subject.GetItems().Single();
item.CanBeRemoved.Should().BeFalse();
item.CanMoveFiles.Should().BeFalse();
}
[Test]
public void should_be_removable_and_should_allow_move_files_if_max_inactive_seedingtime_reached_and_paused()
{
GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 20);
GivenCompletedTorrent("pausedUP", ratio: 2.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds());
var item = Subject.GetItems().Single();
item.CanBeRemoved.Should().BeTrue();
item.CanMoveFiles.Should().BeTrue();
}
[Test]
public void should_be_removable_and_should_allow_move_files_if_overridden_max_inactive_seedingtime_reached_and_paused()
{
GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 40);
GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 20, inactiveSeedingTimeLimit: 10, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(15)).ToUnixTimeSeconds());
var item = Subject.GetItems().Single();
item.CanBeRemoved.Should().BeTrue();
item.CanMoveFiles.Should().BeTrue();
}
[Test]
public void should_not_be_removable_if_overridden_max_inactive_seedingtime_not_reached_and_paused()
{
GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 20);
GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 30, inactiveSeedingTimeLimit: 40, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(30)).ToUnixTimeSeconds());
var item = Subject.GetItems().Single();
item.CanBeRemoved.Should().BeFalse();
item.CanMoveFiles.Should().BeFalse();
}
[Test]
public void should_be_removable_and_should_allow_move_files_if_max_seedingtime_reached_but_ratio_not_and_paused()
{
@@ -749,6 +799,17 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
item.CanMoveFiles.Should().BeTrue();
}
[Test]
public void should_be_removable_and_should_allow_move_files_if_max_inactive_seedingtime_reached_but_ratio_not_and_paused()
{
GivenGlobalSeedLimits(2.0f, maxInactiveSeedingTime: 20);
GivenCompletedTorrent("pausedUP", ratio: 1.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds());
var item = Subject.GetItems().Single();
item.CanBeRemoved.Should().BeTrue();
item.CanMoveFiles.Should().BeTrue();
}
[Test]
public void should_not_fetch_details_twice()
{

View File

@@ -27,7 +27,7 @@ namespace NzbDrone.Core.Test.Framework
Mocker.SetConstant<IHttpProxySettingsProvider>(new HttpProxySettingsProvider(Mocker.Resolve<ConfigService>()));
Mocker.SetConstant<ICreateManagedWebProxy>(new ManagedWebProxyFactory(Mocker.Resolve<CacheManager>()));
Mocker.SetConstant<ICertificateValidationService>(new X509CertificateValidationService(Mocker.Resolve<ConfigService>(), TestLogger));
Mocker.SetConstant<IHttpDispatcher>(new ManagedHttpDispatcher(Mocker.Resolve<IHttpProxySettingsProvider>(), Mocker.Resolve<ICreateManagedWebProxy>(), Mocker.Resolve<ICertificateValidationService>(), Mocker.Resolve<UserAgentBuilder>(), Mocker.Resolve<CacheManager>()));
Mocker.SetConstant<IHttpDispatcher>(new ManagedHttpDispatcher(Mocker.Resolve<IHttpProxySettingsProvider>(), Mocker.Resolve<ICreateManagedWebProxy>(), Mocker.Resolve<ICertificateValidationService>(), Mocker.Resolve<UserAgentBuilder>(), Mocker.Resolve<CacheManager>(), TestLogger));
Mocker.SetConstant<IHttpClient>(new HttpClient(Array.Empty<IHttpRequestInterceptor>(), Mocker.Resolve<CacheManager>(), Mocker.Resolve<RateLimitService>(), Mocker.Resolve<IHttpDispatcher>(), TestLogger));
Mocker.SetConstant<IReadarrCloudRequestBuilder>(new ReadarrCloudRequestBuilder());
Mocker.SetConstant<IMetadataRequestBuilder>(Mocker.Resolve<MetadataRequestBuilder>());

View File

@@ -13,7 +13,7 @@ using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.MetadataSource.Goodreads
{
[TestFixture]
[Ignore("Waiting for metadata to be back again", Until = "2024-05-15 00:00:00Z")]
[Ignore("Waiting for metadata to be back again", Until = "2024-08-15 00:00:00Z")]
public class BookInfoProxyFixture : CoreTest<BookInfoProxy>
{
private MetadataProfile _metadataProfile;

View File

@@ -15,7 +15,7 @@ using NzbDrone.Test.Common;
namespace NzbDrone.Core.Test.MetadataSource.Goodreads
{
[TestFixture]
[Ignore("Waiting for metadata to be back again", Until = "2024-05-15 00:00:00Z")]
[Ignore("Waiting for metadata to be back again", Until = "2024-08-15 00:00:00Z")]
public class BookInfoProxySearchFixture : CoreTest<BookInfoProxy>
{
[SetUp]

View File

@@ -38,7 +38,7 @@ namespace NzbDrone.Core.Test.MetadataSource.Goodreads
ExceptionVerification.IgnoreWarns();
}
[TestCase("Harry Potter and the sorcerer's stone a detailed summary", 61800696)]
[TestCase("Harry Potter and the sorcerer's stone a detailed summary", 72245296)]
[TestCase("B0192CTMYG", 61209488)]
[TestCase("9780439554930", 48517161)]
public void successful_book_search(string title, int expected)

View File

@@ -0,0 +1,8 @@
namespace NzbDrone.Core.Authentication
{
public enum AuthenticationRequiredType
{
Enabled = 0,
DisabledForLocalAddresses = 1
}
}

View File

@@ -1,9 +1,10 @@
namespace NzbDrone.Core.Authentication
namespace NzbDrone.Core.Authentication
{
public enum AuthenticationType
{
None = 0,
Basic = 1,
Forms = 2
Forms = 2,
External = 3
}
}

View File

@@ -1,6 +1,7 @@
using System.IO;
using NLog;
using NzbDrone.Common.Disk;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Instrumentation.Extensions;
using NzbDrone.Core.Books.Commands;
using NzbDrone.Core.Books.Events;
@@ -55,6 +56,12 @@ namespace NzbDrone.Core.Books
_logger.ProgressInfo("Moving {0} from '{1}' to '{2}'", author.Name, sourcePath, destinationPath);
}
if (sourcePath.PathEquals(destinationPath))
{
_logger.ProgressInfo("{0} is already in the specified location '{1}'.", author, destinationPath);
return;
}
try
{
_rootFolderWatchingService.ReportFileSystemChangeBeginning(sourcePath, destinationPath);

View File

@@ -9,6 +9,7 @@ using NzbDrone.Common.Cache;
using NzbDrone.Common.Disk;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Options;
using NzbDrone.Core.Authentication;
using NzbDrone.Core.Configuration.Events;
using NzbDrone.Core.Datastore;
@@ -32,6 +33,7 @@ namespace NzbDrone.Core.Configuration
bool EnableSsl { get; }
bool LaunchBrowser { get; }
AuthenticationType AuthenticationMethod { get; }
AuthenticationRequiredType AuthenticationRequired { get; }
bool AnalyticsEnabled { get; }
string LogLevel { get; }
string ConsoleLogLevel { get; }
@@ -69,6 +71,11 @@ namespace NzbDrone.Core.Configuration
private readonly IDiskProvider _diskProvider;
private readonly ICached<string> _cache;
private readonly PostgresOptions _postgresOptions;
private readonly AuthOptions _authOptions;
private readonly AppOptions _appOptions;
private readonly ServerOptions _serverOptions;
private readonly UpdateOptions _updateOptions;
private readonly LogOptions _logOptions;
private readonly string _configFile;
@@ -78,13 +85,23 @@ namespace NzbDrone.Core.Configuration
ICacheManager cacheManager,
IEventAggregator eventAggregator,
IDiskProvider diskProvider,
IOptions<PostgresOptions> postgresOptions)
IOptions<PostgresOptions> postgresOptions,
IOptions<AuthOptions> authOptions,
IOptions<AppOptions> appOptions,
IOptions<ServerOptions> serverOptions,
IOptions<UpdateOptions> updateOptions,
IOptions<LogOptions> logOptions)
{
_cache = cacheManager.GetCache<string>(GetType());
_eventAggregator = eventAggregator;
_diskProvider = diskProvider;
_configFile = appFolderInfo.GetConfigPath();
_postgresOptions = postgresOptions.Value;
_authOptions = authOptions.Value;
_appOptions = appOptions.Value;
_serverOptions = serverOptions.Value;
_updateOptions = updateOptions.Value;
_logOptions = logOptions.Value;
}
public Dictionary<string, object> GetConfigDictionary()
@@ -140,7 +157,7 @@ namespace NzbDrone.Core.Configuration
{
const string defaultValue = "*";
var bindAddress = GetValue("BindAddress", defaultValue);
var bindAddress = _serverOptions.BindAddress ?? GetValue("BindAddress", defaultValue);
if (string.IsNullOrWhiteSpace(bindAddress))
{
return defaultValue;
@@ -150,19 +167,19 @@ namespace NzbDrone.Core.Configuration
}
}
public int Port => GetValueInt("Port", 8787);
public int Port => _serverOptions.Port ?? GetValueInt("Port", 8787);
public int SslPort => GetValueInt("SslPort", 6868);
public int SslPort => _serverOptions.SslPort ?? GetValueInt("SslPort", 6868);
public bool EnableSsl => GetValueBoolean("EnableSsl", false);
public bool EnableSsl => _serverOptions.EnableSsl ?? GetValueBoolean("EnableSsl", false);
public bool LaunchBrowser => GetValueBoolean("LaunchBrowser", true);
public bool LaunchBrowser => _appOptions.LaunchBrowser ?? GetValueBoolean("LaunchBrowser", true);
public string ApiKey
{
get
{
var apiKey = GetValue("ApiKey", GenerateApiKey());
var apiKey = _authOptions.ApiKey ?? GetValue("ApiKey", GenerateApiKey());
if (apiKey.IsNullOrWhiteSpace())
{
@@ -178,7 +195,7 @@ namespace NzbDrone.Core.Configuration
{
get
{
var enabled = GetValueBoolean("AuthenticationEnabled", false, false);
var enabled = _authOptions.Enabled ?? GetValueBoolean("AuthenticationEnabled", false, false);
if (enabled)
{
@@ -186,17 +203,24 @@ namespace NzbDrone.Core.Configuration
return AuthenticationType.Basic;
}
return GetValueEnum("AuthenticationMethod", AuthenticationType.None);
return Enum.TryParse<AuthenticationType>(_authOptions.Method, out var enumValue)
? enumValue
: GetValueEnum("AuthenticationMethod", AuthenticationType.None);
}
}
public bool AnalyticsEnabled => GetValueBoolean("AnalyticsEnabled", true, persist: false);
public AuthenticationRequiredType AuthenticationRequired =>
Enum.TryParse<AuthenticationRequiredType>(_authOptions.Required, out var enumValue)
? enumValue
: GetValueEnum("AuthenticationRequired", AuthenticationRequiredType.Enabled);
public bool AnalyticsEnabled => _logOptions.AnalyticsEnabled ?? GetValueBoolean("AnalyticsEnabled", true, persist: false);
// TODO: Change back to "master" for the first stable release
public string Branch => GetValue("Branch", "develop").ToLowerInvariant();
public string Branch => _updateOptions.Branch ?? GetValue("Branch", "develop").ToLowerInvariant();
public string LogLevel => GetValue("LogLevel", "info");
public string ConsoleLogLevel => GetValue("ConsoleLogLevel", string.Empty, persist: false);
public string LogLevel => _logOptions.Level ?? GetValue("LogLevel", "info").ToLowerInvariant();
public string ConsoleLogLevel => _logOptions.ConsoleLevel ?? GetValue("ConsoleLogLevel", string.Empty, persist: false);
public string PostgresHost => _postgresOptions?.Host ?? GetValue("PostgresHost", string.Empty, persist: false);
public string PostgresUser => _postgresOptions?.User ?? GetValue("PostgresUser", string.Empty, persist: false);
@@ -206,18 +230,18 @@ namespace NzbDrone.Core.Configuration
public string PostgresCacheDb => _postgresOptions?.CacheDb ?? GetValue("PostgresCacheDb", "readarr-cache", persist: false);
public int PostgresPort => (_postgresOptions?.Port ?? 0) != 0 ? _postgresOptions.Port : GetValueInt("PostgresPort", 5432, persist: false);
public string Theme => GetValue("Theme", "auto", persist: false);
public bool LogSql => GetValueBoolean("LogSql", false, persist: false);
public int LogRotate => GetValueInt("LogRotate", 50, persist: false);
public bool FilterSentryEvents => GetValueBoolean("FilterSentryEvents", true, persist: false);
public string SslCertPath => GetValue("SslCertPath", "");
public string SslCertPassword => GetValue("SslCertPassword", "");
public string Theme => _appOptions.Theme ?? GetValue("Theme", "auto", persist: false);
public bool LogSql => _logOptions.Sql ?? GetValueBoolean("LogSql", false, persist: false);
public int LogRotate => _logOptions.Rotate ?? GetValueInt("LogRotate", 50, persist: false);
public bool FilterSentryEvents => _logOptions.FilterSentryEvents ?? GetValueBoolean("FilterSentryEvents", true, persist: false);
public string SslCertPath => _serverOptions.SslCertPath ?? GetValue("SslCertPath", "");
public string SslCertPassword => _serverOptions.SslCertPassword ?? GetValue("SslCertPassword", "");
public string UrlBase
{
get
{
var urlBase = GetValue("UrlBase", "").Trim('/');
var urlBase = (_serverOptions.UrlBase ?? GetValue("UrlBase", "")).Trim('/');
if (urlBase.IsNullOrWhiteSpace())
{
@@ -229,19 +253,22 @@ namespace NzbDrone.Core.Configuration
}
public string UiFolder => BuildInfo.IsDebug ? Path.Combine("..", "UI") : "UI";
public string InstanceName => GetValue("InstanceName", BuildInfo.AppName);
public string InstanceName => _appOptions.InstanceName ?? GetValue("InstanceName", BuildInfo.AppName);
public bool UpdateAutomatically => GetValueBoolean("UpdateAutomatically", false, false);
public bool UpdateAutomatically => _updateOptions.Automatically ?? GetValueBoolean("UpdateAutomatically", false, false);
public UpdateMechanism UpdateMechanism => GetValueEnum("UpdateMechanism", UpdateMechanism.BuiltIn, false);
public UpdateMechanism UpdateMechanism =>
Enum.TryParse<UpdateMechanism>(_updateOptions.Mechanism, out var enumValue)
? enumValue
: GetValueEnum("UpdateMechanism", UpdateMechanism.BuiltIn, false);
public string UpdateScriptPath => GetValue("UpdateScriptPath", "", false);
public string UpdateScriptPath => _updateOptions.ScriptPath ?? GetValue("UpdateScriptPath", "", false);
public string SyslogServer => GetValue("SyslogServer", "", persist: false);
public string SyslogServer => _logOptions.SyslogServer ?? GetValue("SyslogServer", "", persist: false);
public int SyslogPort => GetValueInt("SyslogPort", 514, persist: false);
public int SyslogPort => _logOptions.SyslogPort ?? GetValueInt("SyslogPort", 514, persist: false);
public string SyslogLevel => GetValue("SyslogLevel", LogLevel, false).ToLowerInvariant();
public string SyslogLevel => _logOptions.SyslogLevel ?? GetValue("SyslogLevel", LogLevel, persist: false).ToLowerInvariant();
public int GetValueInt(string key, int defaultValue, bool persist = true)
{
@@ -377,13 +404,21 @@ namespace NzbDrone.Core.Configuration
throw new InvalidConfigFileException($"{_configFile} is corrupt. Please delete the config file and Readarr will recreate it.");
}
return XDocument.Parse(_diskProvider.ReadAllText(_configFile));
var xDoc = XDocument.Parse(_diskProvider.ReadAllText(_configFile));
var config = xDoc.Descendants(CONFIG_ELEMENT_NAME).ToList();
if (config.Count != 1)
{
throw new InvalidConfigFileException($"{_configFile} is invalid. Please delete the config file and Readarr will recreate it.");
}
return xDoc;
}
var xDoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
xDoc.Add(new XElement(CONFIG_ELEMENT_NAME));
var newXDoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
newXDoc.Add(new XElement(CONFIG_ELEMENT_NAME));
return xDoc;
return newXDoc;
}
}
catch (XmlException ex)

View File

@@ -455,7 +455,7 @@ namespace NzbDrone.Core.Datastore
var sortKey = TableMapping.Mapper.GetSortKey(pagingSpec.SortKey);
var sortDirection = pagingSpec.SortDirection == SortDirection.Descending ? "DESC" : "ASC";
var pagingOffset = Math.Max(pagingSpec.Page - 1, 0) * pagingSpec.PageSize;
builder.OrderBy($"\"{sortKey}\" {sortDirection} LIMIT {pagingSpec.PageSize} OFFSET {pagingOffset}");
builder.OrderBy($"\"{sortKey.Table ?? _table}\".\"{sortKey.Column}\" {sortDirection} LIMIT {pagingSpec.PageSize} OFFSET {pagingOffset}");
return queryFunc(builder).ToList();
}

View File

@@ -16,12 +16,12 @@ namespace NzbDrone.Core.Datastore
}
public CorruptDatabaseException(string message, Exception innerException, params object[] args)
: base(message, innerException, args)
: base(innerException, message, args)
{
}
public CorruptDatabaseException(string message, Exception innerException)
: base(message, innerException)
: base(innerException, message)
{
}
}

View File

@@ -327,10 +327,6 @@ namespace NzbDrone.Core.Datastore.Migration
.WithColumn("Label").AsString().NotNullable()
.WithColumn("Filters").AsString().NotNullable();
IfDatabase("sqlite").Create.Index().OnTable("Books").OnColumn("AuthorId");
IfDatabase("sqlite").Create.Index().OnTable("Books").OnColumn("AuthorId").Ascending()
.OnColumn("ReleaseDate").Ascending();
Delete.Index().OnTable("History").OnColumn("BookId");
Create.Index().OnTable("History").OnColumn("BookId").Ascending()
.OnColumn("Date").Descending();

View File

@@ -8,9 +8,6 @@ namespace NzbDrone.Core.Datastore.Migration
{
protected override void MainDbUpgrade()
{
IfDatabase("sqlite").Delete.Index().OnTable("Books").OnColumn("AuthorId");
IfDatabase("sqlite").Delete.Index().OnTable("Books").OnColumns("AuthorId", "ReleaseDate");
Create.Index().OnTable("Editions").OnColumn("BookId");
}
}

View File

@@ -91,33 +91,28 @@ namespace NzbDrone.Core.Datastore
return true;
}
public string GetSortKey(string sortKey)
public (string Table, string Column) GetSortKey(string sortKey)
{
string table = null;
if (sortKey.Contains('.'))
{
var split = sortKey.Split('.');
if (split.Length != 2)
if (split.Length == 2)
{
return sortKey;
table = split[0];
sortKey = split[1];
}
table = split[0];
sortKey = split[1];
}
if (table != null && !TableMap.Values.Contains(table, StringComparer.OrdinalIgnoreCase))
if (table != null)
{
return sortKey;
table = TableMap.Values.FirstOrDefault(x => x.Equals(table, StringComparison.OrdinalIgnoreCase)) ?? table;
}
if (!_allowedOrderBy.Contains(sortKey))
{
return sortKey;
}
sortKey = _allowedOrderBy.FirstOrDefault(x => x.Equals(sortKey, StringComparison.OrdinalIgnoreCase)) ?? sortKey;
return _allowedOrderBy.First(x => x.Equals(sortKey, StringComparison.OrdinalIgnoreCase));
return (table, sortKey);
}
}

View File

@@ -122,14 +122,23 @@ namespace NzbDrone.Core.Download.Clients.Deluge
}
var items = new List<DownloadClientItem>();
var ignoredCount = 0;
foreach (var torrent in torrents)
{
if (torrent.Hash == null)
// Silently ignore torrents with no hash
if (torrent.Hash.IsNullOrWhiteSpace())
{
continue;
}
// Ignore torrents without a name, but track to log a single warning for all invalid torrents.
if (torrent.Name.IsNullOrWhiteSpace())
{
ignoredCount++;
continue;
}
var item = new DownloadClientItem();
item.DownloadId = torrent.Hash.ToUpper();
item.Title = torrent.Name;
@@ -187,6 +196,11 @@ namespace NzbDrone.Core.Download.Clients.Deluge
items.Add(item);
}
if (ignoredCount > 0)
{
_logger.Warn("{0} torrent(s) were ignored becuase they did not have a title, check Deluge and remove any invalid torrents");
}
return items;
}

View File

@@ -388,16 +388,20 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
}
}
var minimumRetention = 60 * 24 * 14;
return new DownloadClientInfo
{
IsLocalhost = Settings.Host == "127.0.0.1" || Settings.Host == "localhost",
OutputRootFolders = new List<OsPath> { _remotePathMappingService.RemapRemoteToLocal(Settings.Host, destDir) },
RemovesCompletedDownloads = (config.MaxRatioEnabled || (config.MaxSeedingTimeEnabled && config.MaxSeedingTime < minimumRetention)) && (config.MaxRatioAction == QBittorrentMaxRatioAction.Remove || config.MaxRatioAction == QBittorrentMaxRatioAction.DeleteFiles)
RemovesCompletedDownloads = RemovesCompletedDownloads(config)
};
}
private bool RemovesCompletedDownloads(QBittorrentPreferences config)
{
var minimumRetention = 60 * 24 * 14; // 14 days in minutes
return (config.MaxRatioEnabled || (config.MaxSeedingTimeEnabled && config.MaxSeedingTime < minimumRetention)) && (config.MaxRatioAction == QBittorrentMaxRatioAction.Remove || config.MaxRatioAction == QBittorrentMaxRatioAction.DeleteFiles);
}
protected override void Test(List<ValidationFailure> failures)
{
failures.AddIfNotNull(TestConnection());
@@ -447,7 +451,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
// Complain if qBittorrent is configured to remove torrents on max ratio
var config = Proxy.GetConfig(Settings);
if ((config.MaxRatioEnabled || config.MaxSeedingTimeEnabled) && (config.MaxRatioAction == QBittorrentMaxRatioAction.Remove || config.MaxRatioAction == QBittorrentMaxRatioAction.DeleteFiles))
if (RemovesCompletedDownloads(config))
{
return new NzbDroneValidationFailure(string.Empty, "qBittorrent is configured to remove torrents when they reach their Share Ratio Limit")
{
@@ -619,7 +623,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
}
}
if (HasReachedSeedingTimeLimit(torrent, config))
if (HasReachedSeedingTimeLimit(torrent, config) || HasReachedInactiveSeedingTimeLimit(torrent, config))
{
return true;
}
@@ -691,6 +695,26 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
return false;
}
protected bool HasReachedInactiveSeedingTimeLimit(QBittorrentTorrent torrent, QBittorrentPreferences config)
{
long inactiveSeedingTimeLimit;
if (torrent.InactiveSeedingTimeLimit >= 0)
{
inactiveSeedingTimeLimit = torrent.InactiveSeedingTimeLimit * 60;
}
else if (torrent.InactiveSeedingTimeLimit == -2 && config.MaxInactiveSeedingTimeEnabled)
{
inactiveSeedingTimeLimit = config.MaxInactiveSeedingTime * 60;
}
else
{
return false;
}
return DateTimeOffset.UtcNow.ToUnixTimeSeconds() - torrent.LastActivity > inactiveSeedingTimeLimit;
}
protected void FetchTorrentDetails(QBittorrentTorrent torrent)
{
var torrentProperties = Proxy.GetTorrentProperties(torrent.Hash, Settings);

View File

@@ -28,6 +28,12 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
[JsonProperty(PropertyName = "max_seeding_time")]
public long MaxSeedingTime { get; set; } // Get the global share time limit in minutes
[JsonProperty(PropertyName = "max_inactive_seeding_time_enabled")]
public bool MaxInactiveSeedingTimeEnabled { get; set; } // True if share inactive time limit is enabled
[JsonProperty(PropertyName = "max_inactive_seeding_time")]
public long MaxInactiveSeedingTime { get; set; } // Get the global share inactive time limit in minutes
[JsonProperty(PropertyName = "max_ratio_act")]
public QBittorrentMaxRatioAction MaxRatioAction { get; set; } // Action performed when a torrent reaches the maximum share ratio.

View File

@@ -37,6 +37,12 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
[JsonProperty(PropertyName = "seeding_time_limit")] // Per torrent seeding time limit (-2 = use global, -1 = unlimited)
public long SeedingTimeLimit { get; set; } = -2;
[JsonProperty(PropertyName = "inactive_seeding_time_limit")] // Per torrent inactive seeding time limit (-2 = use global, -1 = unlimited)
public long InactiveSeedingTimeLimit { get; set; } = -2;
[JsonProperty(PropertyName = "last_activity")] // Timestamp in unix seconds when a chunk was last downloaded/uploaded
public long LastActivity { get; set; }
}
public class QBittorrentTorrentProperties

View File

@@ -11,8 +11,8 @@ namespace NzbDrone.Core.Download.Clients.Transmission
public bool IsFinished { get; set; }
public long Eta { get; set; }
public TransmissionTorrentStatus Status { get; set; }
public int SecondsDownloading { get; set; }
public int SecondsSeeding { get; set; }
public long SecondsDownloading { get; set; }
public long SecondsSeeding { get; set; }
public string ErrorString { get; set; }
public long DownloadedEver { get; set; }
public long UploadedEver { get; set; }

View File

@@ -137,12 +137,14 @@ namespace NzbDrone.Core.Download.Clients.RTorrent
// Ignore torrents with an empty path
if (torrent.Path.IsNullOrWhiteSpace())
{
_logger.Warn("Torrent '{0}' has an empty download path and will not be processed. Adjust this to an absolute path in rTorrent", torrent.Name);
continue;
}
if (torrent.Path.StartsWith("."))
{
throw new DownloadClientException("Download paths must be absolute. Please specify variable \"directory\" in rTorrent.");
_logger.Warn("Torrent '{0}' has a download path starting with '.' and will not be processed. Adjust this to an absolute path in rTorrent", torrent.Name);
continue;
}
var item = new DownloadClientItem();

View File

@@ -32,6 +32,7 @@ namespace NzbDrone.Core.Download
{
{ Result.HasHttpServerError: true } => PredicateResult.True(),
{ Result.StatusCode: HttpStatusCode.RequestTimeout } => PredicateResult.True(),
{ Exception: HttpException { Response.HasHttpServerError: true } } => PredicateResult.True(),
_ => PredicateResult.False()
},
Delay = TimeSpan.FromSeconds(3),

View File

@@ -62,8 +62,8 @@ namespace NzbDrone.Core.Download
public void Check(TrackedDownload trackedDownload)
{
// Only process tracked downloads that are still downloading
if (trackedDownload.State != TrackedDownloadState.Downloading)
// Only process tracked downloads that are still downloading or import is blocked (if they fail after attempting to be processed)
if (trackedDownload.State != TrackedDownloadState.Downloading && trackedDownload.State != TrackedDownloadState.ImportBlocked)
{
return;
}

View File

@@ -115,7 +115,7 @@ namespace NzbDrone.Core.Download.TrackedDownloads
{
var trackedDownload = _trackedDownloadService.TrackDownload((DownloadClientDefinition)downloadClient.Definition, downloadItem);
if (trackedDownload != null && trackedDownload.State == TrackedDownloadState.Downloading)
if (trackedDownload is { State: TrackedDownloadState.Downloading or TrackedDownloadState.ImportBlocked })
{
_failedDownloadService.Check(trackedDownload);
_completedDownloadService.Check(trackedDownload);

View File

@@ -68,16 +68,17 @@ namespace NzbDrone.Core.Indexers.Newznab
protected override bool PostProcess(IndexerResponse indexerResponse, List<XElement> items, List<ReleaseInfo> releases)
{
var enclosureTypes = items.SelectMany(GetEnclosures).Select(v => v.Type).Distinct().ToArray();
if (enclosureTypes.Any() && enclosureTypes.Intersect(PreferredEnclosureMimeTypes).Empty())
{
if (enclosureTypes.Intersect(TorrentEnclosureMimeTypes).Any())
{
_logger.Warn("{0} does not contain {1}, found {2}, did you intend to add a Torznab indexer?", indexerResponse.Request.Url, NzbEnclosureMimeType, enclosureTypes[0]);
return false;
}
else
{
_logger.Warn("{1} does not contain {1}, found {2}.", indexerResponse.Request.Url, NzbEnclosureMimeType, enclosureTypes[0]);
}
_logger.Warn("{0} does not contain {1}, found {2}.", indexerResponse.Request.Url, NzbEnclosureMimeType, enclosureTypes[0]);
}
return true;

View File

@@ -268,26 +268,26 @@ namespace NzbDrone.Core.Indexers
protected virtual RssEnclosure[] GetEnclosures(XElement item)
{
var enclosures = item.Elements("enclosure")
.Select(v =>
{
try
{
return new RssEnclosure
{
Url = v.Attribute("url")?.Value,
Type = v.Attribute("type")?.Value,
Length = v.Attribute("length")?.Value?.ParseInt64() ?? 0
};
}
catch (Exception e)
{
_logger.Warn(e, "Failed to get enclosure for: {0}", item.Title());
}
.Select(v =>
{
try
{
return new RssEnclosure
{
Url = v.Attribute("url")?.Value,
Type = v.Attribute("type")?.Value,
Length = v.Attribute("length")?.Value?.ParseInt64() ?? 0
};
}
catch (Exception ex)
{
_logger.Warn(ex, "Failed to get enclosure for: {0}", item.Title());
}
return null;
})
.Where(v => v != null)
.ToArray();
return null;
})
.Where(v => v != null)
.ToArray();
return enclosures;
}

View File

@@ -48,10 +48,10 @@ namespace NzbDrone.Core.Indexers
public class SeedCriteriaSettings
{
[FieldDefinition(0, Type = FieldType.Textbox, Label = "Seed Ratio", HelpText = "The ratio a torrent should reach before stopping, empty is download client's default. Ratio should be at least 1.0 and follow the indexers rules")]
[FieldDefinition(0, Type = FieldType.Number, Label = "IndexerSettingsSeedRatio", HelpText = "IndexerSettingsSeedRatioHelpText")]
public double? SeedRatio { get; set; }
[FieldDefinition(1, Type = FieldType.Textbox, Label = "Seed Time", Unit = "minutes", HelpText = "The time a torrent should be seeded before stopping, empty is download client's default", Advanced = true)]
[FieldDefinition(1, Type = FieldType.Number, Label = "IndexerSettingsSeedTime", Unit = "minutes", HelpText = "IndexerSettingsSeedTimeHelpText", Advanced = true)]
public int? SeedTime { get; set; }
[FieldDefinition(2, Type = FieldType.Textbox, Label = "Discography Seed Time", Unit = "minutes", HelpText = "The time a torrent should be seeded before stopping, empty is download client's default", Advanced = true)]

View File

@@ -59,16 +59,17 @@ namespace NzbDrone.Core.Indexers.Torznab
protected override bool PostProcess(IndexerResponse indexerResponse, List<XElement> items, List<ReleaseInfo> releases)
{
var enclosureTypes = items.SelectMany(GetEnclosures).Select(v => v.Type).Distinct().ToArray();
if (enclosureTypes.Any() && enclosureTypes.Intersect(PreferredEnclosureMimeTypes).Empty())
{
if (enclosureTypes.Intersect(UsenetEnclosureMimeTypes).Any())
{
_logger.Warn("{0} does not contain {1}, found {2}, did you intend to add a Newznab indexer?", indexerResponse.Request.Url, TorrentEnclosureMimeType, enclosureTypes[0]);
return false;
}
else
{
_logger.Warn("{1} does not contain {1}, found {2}.", indexerResponse.Request.Url, TorrentEnclosureMimeType, enclosureTypes[0]);
}
_logger.Warn("{0} does not contain {1}, found {2}.", indexerResponse.Request.Url, TorrentEnclosureMimeType, enclosureTypes[0]);
}
return true;

View File

@@ -636,5 +636,7 @@
"ListsSettingsSummary": "القوائم",
"SelectDropdown": "'تحديد...",
"SelectQuality": "حدد الجودة",
"CustomFilter": "مرشحات مخصصة"
"CustomFilter": "مرشحات مخصصة",
"IndexerFlags": "أعلام المفهرس",
"InteractiveSearchModalHeader": "بحث تفاعلي"
}

View File

@@ -636,5 +636,8 @@
"SelectDropdown": "„Изберете ...",
"SelectQuality": "Изберете Качество",
"CustomFilter": "Персонализирани филтри",
"RemoveQueueItemConfirmation": "Наистина ли искате да премахнете {0} елемент {1} от опашката?"
"RemoveQueueItemConfirmation": "Наистина ли искате да премахнете {0} елемент {1} от опашката?",
"IndexerFlags": "Индексиращи знамена",
"InteractiveSearchModalHeader": "Интерактивно търсене",
"FailedLoadingSearchResults": "Неуспешно зареждане на резултатите от търсенето, моля, опитайте отново."
}

View File

@@ -432,7 +432,7 @@
"SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "RSS no és compatible amb aquest indexador",
"SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "S'utilitzarà quan es realitzin cerques automàtiques mitjançant la interfície d'usuari o per Radarr",
"CutoffHelpText": "Un cop s'assoleixi aquesta qualitat, Radarr ja no baixarà pel·lícules",
"ResetAPIKeyMessageText": "Esteu segur que voleu restablir la clau de l'API?",
"ResetAPIKeyMessageText": "Esteu segur que voleu restablir la clau API?",
"PropersAndRepacks": "Propietats i Repacks",
"RemotePathMappingCheckFolderPermissions": "Radarr pot veure però no accedir al directori de descàrregues {0}. Error de permisos probable.",
"RescanAuthorFolderAfterRefresh": "Torna a escanejar la carpeta de pel·lícules després de l'actualització",
@@ -443,7 +443,7 @@
"TheAuthorFolderAndAllOfItsContentWillBeDeleted": "La carpeta de pel·lícules '{0}' i tot el seu contingut es suprimiran.",
"UrlBaseHelpTextWarning": "Cal reiniciar perquè tingui efecte",
"ApplicationURL": "URL de l'aplicació",
"ApplicationUrlHelpText": "URL extern d'aquesta aplicació, inclòs http(s)://, port i URL base",
"ApplicationUrlHelpText": "URL extern de l'aplicació, inclòs http(s)://, port i URL base",
"BackupFolderHelpText": "Els camins relatius estaran sota el directori AppData del Radarr",
"CancelMessageText": "Esteu segur que voleu cancel·lar aquesta tasca pendent?",
"ChownGroupHelpTextWarning": "Això només funciona si l'usuari que executa Radarr és el propietari del fitxer. És millor assegurar-se que el client de descàrrega utilitza el mateix grup que Radarr.",
@@ -564,13 +564,13 @@
"SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "La cerca no és compatible amb aquest indexador",
"UnableToAddANewMetadataProfilePleaseTryAgain": "No es pot afegir un perfil de qualitat nou, torneu-ho a provar.",
"RequiredPlaceHolder": "Afegeix una nova restricció",
"20MinutesTwenty": "60 minuts: {0}",
"20MinutesTwenty": "20 minuts: {0}",
"AlternateTitles": "Títols alternatius",
"AnalyticsEnabledHelpText": "Envieu informació anònima d'ús i errors als servidors de Radarr. Això inclou informació sobre el vostre navegador, quines pàgines Radarr WebUI feu servir, informes d'errors, així com el sistema operatiu i la versió del temps d'execució. Utilitzarem aquesta informació per prioritzar les funcions i les correccions d'errors.",
"AnalyticsEnabledHelpTextWarning": "Cal reiniciar perquè tingui efecte",
"AuthenticationMethodHelpText": "Requereix nom d'usuari i contrasenya per accedir al radar",
"CalendarWeekColumnHeaderHelpText": "Es mostra a sobre de cada columna quan la setmana és la visualització activa",
"45MinutesFourtyFive": "60 minuts: {0}",
"45MinutesFourtyFive": "45 minuts: {0}",
"60MinutesSixty": "60 minuts: {0}",
"BindAddressHelpTextWarning": "Cal reiniciar perquè tingui efecte",
"BookIsDownloading": "La pel·lícula s'està baixant",
@@ -658,11 +658,11 @@
"Activity": "Activitat",
"AddNew": "Afegeix nou",
"ApplyTagsHelpTextReplace": "Substitució: substituïu les etiquetes per les etiquetes introduïdes (no introduïu cap etiqueta per a esborrar totes les etiquetes)",
"ApplyTagsHelpTextRemove": "Eliminar: elimina les etiquetes introduïdes",
"ApplyTagsHelpTextRemove": "Eliminació: elimina les etiquetes introduïdes",
"BlocklistReleases": "Llista de llançaments bloquejats",
"AutoAdd": "Afegeix automàticament",
"Backup": "Còpia de seguretat",
"ApplyTagsHelpTextAdd": "Afegeix: afegeix les etiquetes a la llista d'etiquetes existent",
"ApplyTagsHelpTextAdd": "Afegiment: afegeix les etiquetes a la llista d'etiquetes existent",
"DeleteSelectedIndexersMessageText": "Esteu segur que voleu suprimir {count} indexador(s) seleccionat(s)?",
"DeleteSelectedIndexers": "Suprimeix l'indexador(s)",
"DeleteRemotePathMappingMessageText": "Esteu segur que voleu suprimir aquesta assignació de camins remots?",
@@ -691,5 +691,86 @@
"Ui": "Interfície",
"Other": "Altres",
"AutoRedownloadFailedFromInteractiveSearch": "Tornar a baixar baixades fallades des de la cerca interactiva",
"AutoRedownloadFailed": "Tornar a baixar les baixades fallades"
"AutoRedownloadFailed": "Tornar a baixar les baixades fallades",
"BlocklistAndSearch": "Llista de bloqueig i cerca",
"BlocklistAndSearchHint": "Comença una cerca per reemplaçar després d'haver bloquejat",
"ClickToChangeIndexerFlags": "Feu clic per canviar els indicadors de l'indexador",
"CustomFormatsSpecificationFlag": "Bandera",
"CustomFormatsSpecificationRegularExpression": "Expressió regular",
"CustomFormatsSpecificationRegularExpressionHelpText": "El format personalitzat RegEx no distingeix entre majúscules i minúscules",
"BlocklistAndSearchMultipleHint": "Comença una cerca per reemplaçar després d'haver bloquejat",
"BlocklistMultipleOnlyHint": "Afegeix a la llista de bloqueig sense cercar substituts",
"BlocklistOnlyHint": "Afegir a la llista de bloqueig sense cercar substituts",
"BlocklistOnly": "Sols afegir a la llista de bloqueig",
"ChangeCategory": "Canvia categoria",
"ChangeCategoryMultipleHint": "Canvia les baixades a la \"Categoria post-importació\" des del client de descàrrega",
"ChangeCategoryHint": "Canvia la baixada a la \"Categoria post-importació\" des del client de descàrrega",
"CustomFilter": "Filtres personalitzats",
"DoNotBlocklist": "No afegiu a la llista de bloqueig",
"DoNotBlocklistHint": "Elimina sense afegir a la llista de bloqueig",
"ConnectionSettingsUrlBaseHelpText": "Afegeix un prefix a l'URL {connectionName}, com ara {url}",
"DownloadClientDelugeSettingsDirectory": "Directori de baixada",
"DownloadClientDelugeSettingsDirectoryCompleted": "Directori al qual es mou quan s'hagi completat",
"DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Ubicació opcional de les baixades completades, deixeu-lo en blanc per utilitzar la ubicació predeterminada de Deluge",
"DownloadClientDelugeSettingsDirectoryHelpText": "Ubicació opcional de les baixades completades, deixeu-lo en blanc per utilitzar la ubicació predeterminada de Deluge",
"WhatsNew": "Novetats",
"SelectDropdown": "Seleccioneu...",
"NoCutoffUnmetItems": "No hi ha elements de tall no assolits",
"ApplyTagsHelpTextHowToApplyAuthors": "Com aplicar etiquetes a les pel·lícules seleccionades",
"DeleteConditionMessageText": "Esteu segur que voleu suprimir la condició '{name}'?",
"NoChange": "Cap canvi",
"SetTags": "Estableix etiquetes",
"NoResultsFound": "Sense resultats",
"Author": "Autor",
"ResetQualityDefinitions": "Restableix les definicions de qualitat",
"Small": "Petita",
"TotalSpace": "Espai total",
"BlocklistReleaseHelpText": "Impedeix que {appName} torni a capturar aquesta versió automàticament",
"CatalogNumber": "número de catàleg",
"LastWriteTime": "La darrera hora d'escriptura",
"NextExecution": "Propera execució",
"RemoveCompleted": "S'ha eliminat",
"SelectReleaseGroup": "Seleccioneu grup de llançament",
"CountDownloadClientsSelected": "{count} client(s) de baixada seleccionat(s)",
"Authors": "Autor",
"FreeSpace": "Espai lliure",
"ExtraFileExtensionsHelpText": "Llista separada per comes de fitxers addicionals per importar (.nfo s'importarà com a .nfo-orig)",
"BypassIfAboveCustomFormatScore": "Ometre si està per sobre de la puntuació de format personalitzada",
"BypassIfAboveCustomFormatScoreHelpText": "Habiliteu l'omissió quan la versió tingui una puntuació superior a la puntuació mínima per al format personalitzat",
"RedownloadFailed": "Tornar a baixar les baixades fallades",
"ExistingTag": "Etiqueta existent",
"RemoveFailed": "Ha fallat l'eliminació",
"ImportLists": "llista d'importació",
"RemovingTag": "S'està eliminant l'etiqueta",
"ApiKeyValidationHealthCheckMessage": "Actualitzeu la vostra clau de l'API perquè tingui almenys {length} caràcters. Podeu fer-ho mitjançant la configuració o el fitxer de configuració",
"ExtraFileExtensionsHelpTextsExamples": "Exemples: '.sub, .nfo' o 'sub,nfo'",
"SourceTitle": "Títol de la font",
"NoEventsFound": "No s'han trobat esdeveniments",
"InteractiveSearchModalHeader": "Cerca interactiva",
"NotificationStatusSingleClientHealthCheckMessage": "Llistes no disponibles a causa d'errors: {0}",
"Medium": "Suport",
"RecentChanges": "Canvis recents",
"Rejections": "Rebutjats",
"StatusEndedContinuing": "Continua",
"DeleteBookFileMessageText": "Esteu segur que voleu suprimir '{path}'?",
"DownloadClientTagHelpText": "Utilitzeu aquest indexador només per a pel·lícules amb almenys una etiqueta coincident. Deixeu-ho en blanc per utilitzar-ho amb totes les pel·lícules.",
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "El client de baixada {downloadClientName} està configurat per eliminar les baixades completades. Això pot provocar que les baixades s'eliminin del vostre client abans que {1} pugui importar-les.",
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Cerqueu i intenteu baixar automàticament una versió diferent quan es trobi una versió fallida a la cerca interactiva",
"FailedLoadingSearchResults": "No s'han pogut carregar els resultats de la cerca, torneu-ho a provar.",
"IndexerFlags": "Indicadors de l'indexador",
"Large": "Gran",
"LastDuration": "Darrera durada",
"LastExecution": "Darrere execució",
"Library": "Biblioteca",
"ListsSettingsSummary": "llista d'importació",
"Loading": "Carregant",
"MinimumCustomFormatScoreHelpText": "Puntuació mínima de format personalitzada necessaria per a evitar el retard del protocol preferit",
"ProfilesSettingsSummary": "Perfils de qualitat, idioma, retard i llançament",
"RemoveDownloadsAlert": "La configuració d'eliminació s'ha mogut a la configuració del client de baixada a la taula anterior.",
"RemoveQueueItemConfirmation": "Esteu segur que voleu eliminar '{sourceTitle}' de la cua?",
"RemoveSelectedItem": "Elimina l'element seleccionat",
"RemoveSelectedItems": "Elimina els elements seleccionats",
"RemoveSelectedItemsQueueMessageText": "Esteu segur que voleu eliminar {0} de la cua?",
"SelectQuality": "Seleccioneu Qualitat",
"SomeResultsAreHiddenByTheAppliedFilter": "Alguns resultats estan ocults pel filtre aplicat"
}

View File

@@ -691,5 +691,8 @@
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Automaticky vyhledat a pokusit se o stažení jiného vydání, pokud bylo neúspěšné vydání zachyceno z interaktivního vyhledávání",
"SelectDropdown": "'Vybrat...",
"CustomFilter": "Vlastní filtry",
"SelectQuality": "Vyberte kvalitu"
"SelectQuality": "Vyberte kvalitu",
"IndexerFlags": "Příznaky indexeru",
"InteractiveSearchModalHeader": "Interaktivní vyhledávání",
"FailedLoadingSearchResults": "Výsledky vyhledávání se nepodařilo načíst, zkuste to prosím znovu."
}

View File

@@ -644,5 +644,12 @@
"CustomFilter": "Bruger Tilpassede Filtere",
"SelectDropdown": "'Vælg...",
"SelectQuality": "Vælg Kvalitet",
"ApplyChanges": "Anvend ændringer"
"ApplyChanges": "Anvend ændringer",
"Series": "Serie",
"IndexerFlags": "Indexer Flag",
"InteractiveSearchModalHeader": "Interaktiv søgning",
"Theme": "Tema",
"Publisher": "Udgiver",
"CatalogNumber": "katalognummer",
"FailedLoadingSearchResults": "Kunne ikke indlæse søgeresultater. Prøv igen."
}

View File

@@ -9,7 +9,7 @@
"About": "Über",
"AddListExclusion": "Listenausschluss hinzufügen",
"AddingTag": "Tag hinzufügen",
"AgeWhenGrabbed": "Alter (zum Zeitpunkt der Entführung)",
"AgeWhenGrabbed": "Alter (bei Erfassung)",
"AlreadyInYourLibrary": "Bereits in Ihrer Bibliothek",
"AlternateTitles": "Alternative Titel",
"Analytics": "Analysen",
@@ -61,7 +61,7 @@
"CreateEmptyAuthorFoldersHelpText": "Leere Filmordner für fehlende Filme beim Scan erstellen",
"CreateGroup": "Gruppe erstellen",
"CutoffHelpText": "Sobald diese Qualität erreicht wird, werden keine neuen Releases erfasst",
"CutoffUnmet": " Schwelle nicht erreicht",
"CutoffUnmet": "Schwelle nicht erreicht",
"DatabaseMigration": "DB Migration",
"Dates": "Termine",
"DelayProfile": "Verzögerungsprofil",
@@ -69,24 +69,24 @@
"DelayingDownloadUntilInterp": "Download verzögern bis {0} um {1}",
"Delete": "Löschen",
"DeleteBackup": "Sicherung löschen",
"DeleteBackupMessageText": "Sind Sie sicher, dass Sie die Sicherung „{name}“ löschen möchten?",
"DeleteBackupMessageText": "Soll das Backup '{name}' wirklich gelöscht werden?",
"DeleteDelayProfile": "Verzögerungsprofil löschen",
"DeleteDelayProfileMessageText": "Sind Sie sicher, dass Sie dieses Verzögerungsprofil löschen möchten?",
"DeleteDownloadClient": "Download-Client löschen",
"DeleteDownloadClientMessageText": "Sind Sie sicher, dass Sie den Download-Client {name} löschen möchten?",
"DeleteDownloadClientMessageText": "Bist du sicher, dass du den Download Client '{name}' wirklich löschen willst?",
"DeleteEmptyFolders": "Leere Ordner löschen",
"DeleteEmptyFoldersHelpText": "Lösche leere Autorordner während des Scans oder wenn Buchdateien gelöscht werden",
"DeleteImportListMessageText": "Sind Sie sicher, dass Sie die Liste {name}“ löschen möchten?",
"DeleteImportListMessageText": "Bist du sicher, dass du die Liste '{name}' wirklich löschen willst?",
"DeleteIndexer": "Indexer löschen",
"DeleteIndexerMessageText": "Sind Sie sicher, dass Sie den Indexer {name}“ löschen möchten?",
"DeleteMetadataProfileMessageText": "Qualitätsprofil '{0}' wirklich löschen?",
"DeleteIndexerMessageText": "Bist du sicher, dass du den Indexer '{name}' wirklich löschen willst?",
"DeleteMetadataProfileMessageText": "Bist du sicher, dass du das Qualitätsprofil '{name}' wirklich löschen willst?",
"DeleteNotification": "Benachrichtigung löschen",
"DeleteNotificationMessageText": "Sind Sie sicher, dass Sie die Benachrichtigung {name}“ löschen möchten?",
"DeleteNotificationMessageText": "Bist du sicher, dass du die Benachrichtigung '{name}' wirklich löschen willst?",
"DeleteQualityProfile": "Qualitätsprofil löschen",
"DeleteQualityProfileMessageText": "Sind Sie sicher, dass Sie das Qualitätsprofil {name}“ löschen möchten?",
"DeleteQualityProfileMessageText": "Bist du sicher, dass du das Qualitätsprofil '{name}' wirklich löschen willst?",
"DeleteReleaseProfile": "Release-Profil löschen",
"DeleteReleaseProfileMessageText": "Bist du sicher, dass du dieses Release-Profil löschen willst?",
"DeleteRootFolderMessageText": "Indexer '{0}' wirklich löschen?",
"DeleteRootFolderMessageText": "Bist du sicher, dass du den Root-Ordner '{name}' wirklich löschen willst?",
"DeleteSelectedBookFiles": "Ausgewählte Filmdateien löschen",
"DeleteSelectedBookFilesMessageText": "Ausgewählte Filme wirklich löschen?",
"DeleteTag": "Tag löschen",
@@ -274,7 +274,7 @@
"RemoveCompletedDownloadsHelpText": "Importierte Downloads aus dem Downloader Verlauf entfernen",
"RemoveFailedDownloadsHelpText": "Fehlgeschlagene Downloads aus dem Downloader Verlauf entfernen",
"RemoveFilter": "Filter entfernen",
"RemoveFromDownloadClient": "Vom Download-Client entfernen",
"RemoveFromDownloadClient": "Aus dem Download Client entfernen",
"RemoveFromQueue": "Aus der Warteschlage entfernen",
"RemoveHelpTextWarning": "Dies wird den Download und alle bereits heruntergeladenen Dateien aus dem Downloader entfernen.",
"RemoveSelected": "Auswahl entfernen",
@@ -464,7 +464,7 @@
"DownloadClientCheckDownloadingToRoot": "Download-Client {0} legt Downloads im Stammordner {1} ab. Sie sollten nicht in einen Stammordner herunterladen.",
"Series": "Serien",
"Publisher": "Herausgeber",
"MaintenanceRelease": "Wartung: Fehlerbehebung und andere Verbesserungen. Siehe Github Commit History für weitere Details",
"MaintenanceRelease": "Maintenance Release: Fehlerbehebungen und andere Verbesserungen. Siehe Github Commit Verlauf für weitere Details",
"LogRotation": "Logrotation",
"LogRotateHelpText": "Max. Anzahl der zu behaltenden Logdateien",
"Label": "Label",
@@ -606,7 +606,7 @@
"OnImportFailureHelpText": "Bei fehlgeschlagenem Import",
"OnReleaseImport": "Bei Veröffentlichungsimport",
"OnReleaseImportHelpText": "Bei Veröffentlichungsimport",
"OnRename": "Bei Umbenennen",
"OnRename": "Bei Umbenennung",
"PastDaysHelpText": "Tage für iCal-Feed, um in die Vergangenheit zu schauen",
"PathHelpTextWarning": "Dies muss ein anderes Verzeichnis sein als das, in dem der Download Client die Dateien ablegt",
"ReleaseProfiles": "Veröffentlichungsprofile",
@@ -705,7 +705,7 @@
"SelectedCountAuthorsSelectedInterp": "{0} Künstler ausgewählt",
"SizeLimit": "Grössenlimit",
"TheBooksFilesWillBeDeleted": "Die Dateien des Albums werden gelöscht.",
"MediaManagement": "Medien",
"MediaManagement": "Medienverwaltung",
"Metadata": "Metadaten",
"MountCheckMessage": "Der Einhängepunkt, welcher einen Filmpfad enthält, ist schreibgeschützt eingehängt: ",
"OnBookFileDelete": "Bei Filmdatei löschen",
@@ -875,7 +875,7 @@
"CustomFormatSettings": "Einstellungen für eigene Formate",
"DataFutureBooks": "Überwachung von Alben die noch nicht veröffentlicht wurden",
"DeleteCustomFormat": "Benutzerdefiniertes Format löschen",
"DeleteCustomFormatMessageText": "Bist du sicher, dass du das eigene Format '{0}' löschen willst?",
"DeleteCustomFormatMessageText": "Bist du sicher, dass du das benutzerdefinierte Format '{name}' wirklich löschen willst?",
"IncludeCustomFormatWhenRenamingHelpText": "In {Custom Formats} umbennenungs Format",
"ResetTitles": "Titel zurücksetzen",
"UnableToLoadCustomFormats": "Eigene Formate konnten nicht geladen werden",
@@ -931,13 +931,13 @@
"RemoveFailed": "Fehlgeschlagene entfernen",
"RemoveCompleted": "Abgeschlossene entfernen",
"ApplyChanges": "Änderungen anwenden",
"ApplyTagsHelpTextAdd": "Hinzufügen: Fügen Sie die Tags der vorhandenen Tag-Liste hinzu",
"ApplyTagsHelpTextHowToApplyImportLists": "So wenden Sie Tags auf die ausgewählten Importlisten an",
"ApplyTagsHelpTextHowToApplyIndexers": "So wenden Sie Tags auf die ausgewählten Indexer an",
"ApplyTagsHelpTextAdd": "Hinzufügen: Füge Tags zu den bestehenden Tags hinzu",
"ApplyTagsHelpTextHowToApplyImportLists": "Wie Tags den selektierten Importlisten hinzugefügt werden können",
"ApplyTagsHelpTextHowToApplyIndexers": "Wie Tags zu den selektierten Indexern hinzugefügt werden können",
"AutomaticAdd": "Automatisch hinzufügen",
"ApplyTagsHelpTextRemove": "Entfernen: Die eingegebenen Tags entfernen",
"ApplyTagsHelpTextReplace": "Ersetzen: Ersetzen Sie die Tags durch die eingegebenen Tags (geben Sie keine Tags ein, um alle Tags zu löschen).",
"ApplyTagsHelpTextHowToApplyDownloadClients": "So wenden Sie Tags auf die ausgewählten Download-Clients an",
"ApplyTagsHelpTextRemove": "Entfernen: Entferne die hinterlegten Tags",
"ApplyTagsHelpTextReplace": "Ersetzen: Ersetze die Tags mit den eingegebenen Tags (keine Tags eingeben um alle Tags zu löschen)",
"ApplyTagsHelpTextHowToApplyDownloadClients": "Wie Tags zu den selektierten Downloadclients hinzugefügt werden können",
"CountIndexersSelected": "{0} Indexer ausgewählt",
"DeleteSelectedDownloadClients": "Lösche Download Client(s)",
"DeleteSelectedDownloadClientsMessageText": "Sind Sie sicher, dass Sie {count} ausgewählte Download-Clients löschen möchten?",
@@ -988,7 +988,7 @@
"Clone": "Klonen",
"AutomaticUpdatesDisabledDocker": "Automatische Updates werden bei Verwendung des Docker-Update-Mechanismus nicht direkt unterstützt. Sie müssen das Container-Image außerhalb von {appName} aktualisieren oder ein Skript verwenden",
"AutoAdd": "Automatisch hinzufügen",
"WouldYouLikeToRestoreBackup": "Möchten Sie die Sicherung „{name} wiederherstellen?",
"WouldYouLikeToRestoreBackup": "Willst du das Backup '{name}' wiederherstellen?",
"Unmonitored": "Nicht beobachtet",
"Retention": "Aufbewahrung ( Retention )",
"ClickToChangeIndexerFlags": "Klicken, um Indexer-Flags zu ändern",
@@ -998,5 +998,58 @@
"BlocklistMultipleOnlyHint": "Der Sperrliste hinzufügen, ohne nach Alternativen zu suchen",
"BlocklistOnly": "Nur der Sperrliste hinzufügen",
"BlocklistOnlyHint": "Der Sperrliste hinzufügen, ohne nach Alternative zu suchen",
"ChangeCategory": "Kategorie wechseln"
"ChangeCategory": "Kategorie wechseln",
"TagIsNotUsedAndCanBeDeleted": "Tag wird nicht benutzt und kann gelöscht werden",
"ExtraFileExtensionsHelpText": "Kommaseparierte Liste von Dateiendungen die als Extra Dateien importiert werden sollen ( .nfo wird in .nfo-orig umbenannt )",
"DeleteImportListExclusion": "Importlisten Ausschluss löschen",
"IndexerFlags": "Indexer-Flags",
"CountAuthorsSelected": "{selectedCount} Künstler ausgewählt",
"ExtraFileExtensionsHelpTextsExamples": "Vorschläge: sub, nfo, srt, jpg",
"DownloadClient": "Downloader",
"ShowMonitoredHelpText": "Beobachtungsstatus unter dem Plakat anzeigen",
"CountDownloadClientsSelected": "{count} Download-Client(s) ausgewählt",
"CountImportListsSelected": "{selectedCount} Künstler ausgewählt",
"CustomFormatsSpecificationRegularExpression": "Regulären Ausdruck",
"DeleteImportListExclusionMessageText": "Bist du sicher, dass du diesen Importlisten Ausschluss löschen willst?",
"CustomFilter": "Benutzerdefinierter Filter",
"AutoRedownloadFailed": "Erneuter Download fehlgeschlagen",
"SourceTitle": "Quellentitel",
"Tags": "Tags",
"DownloadClientDelugeSettingsDirectoryHelpText": "Optionaler Speicherort für Downloads. Lassen Sie das Feld leer, um den standardmäßigen rTorrent-Speicherort zu verwenden",
"ErrorLoadingContent": "Beim Laden des Eintrags ist ein Fehler aufgetreten",
"BypassIfAboveCustomFormatScore": "Umgehen, wenn über dem Wert des benutzerdefinierten Formats liegt",
"BypassIfAboveCustomFormatScoreHelpText": "Aktivieren Sie die Umgehung, wenn die Veröffentlichung einen Wert hat, der höher ist als der konfigurierte Mindestwert für das benutzerdefinierte Format",
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Der Download-Client {downloadClientName} ist so eingestellt, dass abgeschlossene Downloads entfernt werden. Dies kann dazu führen, dass Downloads von Ihrem Client entfernt werden, bevor {appName} sie importieren kann.",
"AutoRedownloadFailedFromInteractiveSearch": "Erneuter Download aus Interaktiver Suche fehlgeschlagen",
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Suchen Sie automatisch nach einer anderen Version und versuchen Sie, sie herunterzuladen, wenn eine fehlerhafte Version aus der interaktiven Suche ausgewählt wurde",
"FailedLoadingSearchResults": "Die Suchergebnisse konnten nicht geladen werden. Bitte versuchen Sie es erneut.",
"InteractiveSearchModalHeader": "Interaktive Suche",
"MinimumCustomFormatScoreHelpText": "Mindestwert für benutzerdefiniertes Format, der erforderlich ist, um Verzögerungen für das bevorzugte Protokoll zu umgehen",
"Rejections": "Ablehnungen",
"RemoveQueueItemConfirmation": "Bist du sicher, dass du {0} Einträge aus der Warteschlange entfernen willst?",
"SelectDropdown": "Auswählen...",
"SelectQuality": "Qualität auswählen",
"SelectReleaseGroup": "Wähle Release-Gruppe",
"ShowMonitored": "Beobachtete anzeigen",
"DeleteSelected": "Markierte löschen",
"Bookshelf": "Bücherregal",
"BypassIfHighestQualityHelpText": "Umgehen der Verzögerung, wenn die Freigabe die höchste aktivierte Qualität im Qualitätsprofil hat",
"CustomFormatsSpecificationFlag": "Markierung",
"DeleteFormat": "Formatierung löschen",
"CustomFormatsSpecificationRegularExpressionHelpText": "Benutzerdefiniertes Format RegEx ist nicht groß-/kleinschreibungssensitiv",
"IndexerDownloadClientHealthCheckMessage": "Indexer mit ungültigen Downloader: {0}.",
"AuthorProgressBarText": "{availableBookCount} / {bookCount} (Gesamt: {totalBookCount}, Dateien: {bookFileCount})",
"BookProgressBarText": "{bookCount} / {totalBookCount} (Dateien: {bookFileCount})",
"ChangeCategoryHint": "Änderung des Downloads in die 'Post-Import-Kategorie' vom Download-Client",
"ChangeCategoryMultipleHint": "Änderung der Downloads in die 'Post-Import-Kategorie' vom Download-Client",
"DoNotBlocklist": "Nicht Sperren",
"DoNotBlocklistHint": "Entfernen ohne Sperren",
"CustomFormatsSettingsTriggerInfo": "Ein Eigenes Format wird auf eine Veröffentlichung oder Datei angewandt, wenn sie mindestens einer der verschiedenen ausgewählten Bedingungen entspricht.",
"ConnectionSettingsUrlBaseHelpText": "Fügt ein Präfix zur {connectionName} URL hinzu, z. B. {url}",
"DownloadClientDelugeSettingsDirectory": "Download Verzeichnis",
"DownloadClientDelugeSettingsDirectoryCompleted": "Verschieben, wenn Verzeichnis abgeschlossen",
"IgnoreDownloadHint": "Hält {appName} von der weiteren Verarbeitung dieses Downloads ab",
"IgnoreDownloads": "Downloads ignorieren",
"IgnoreDownload": "Download ignorieren",
"IgnoreDownloadsHint": "Hindert {appName}, diese Downloads weiter zu verarbeiten"
}

View File

@@ -993,5 +993,18 @@
"AppUpdated": "{appName} Ενημερώθηκε",
"AppUpdatedVersion": "ξαναφορτωθεί",
"AutoAdd": "Προσθήκη",
"ErrorLoadingContent": "Υπήρξε ένα σφάλμα κατά τη φόρτωση του αρχείου"
"ErrorLoadingContent": "Υπήρξε ένα σφάλμα κατά τη φόρτωση του αρχείου",
"ExtraFileExtensionsHelpTextsExamples": "Παραδείγματα: «.sub, .nfo» ή «sub, nfo»",
"IndexerFlags": "Σημαίες ευρετηρίου",
"InteractiveSearchModalHeader": "Διαδραστική αναζήτηση",
"ExtraFileExtensionsHelpText": "Λίστα πρόσθετων αρχείων που διαχωρίζονται με κόμμα για εισαγωγή (το .nfo θα εισαχθεί ως .nfo-orig)",
"CustomFilter": "Custom Φιλτρα",
"DeleteSelected": "Διαγραφή επιλεγμένων",
"SourceTitle": "Τίτλος πηγής",
"AutoRedownloadFailed": "Η λήψη απέτυχε",
"FailedLoadingSearchResults": "Αποτυχία φόρτωσης αποτελεσμάτων αναζήτησης, δοκιμάστε ξανά.",
"RemoveQueueItemConfirmation": "Είστε σίγουροι πως θέλετε να διαγράψετε {0} αντικείμενα από την ουρά;",
"SelectDropdown": "'Επιλέγω...",
"SelectQuality": "Επιλέξτε Ποιότητα",
"SelectReleaseGroup": "Επιλέξτε Ομάδα έκδοσης"
}

View File

@@ -2,7 +2,6 @@
"20MinutesTwenty": "20 Minutes: {0}",
"45MinutesFourtyFive": "45 Minutes: {0}",
"60MinutesSixty": "60 Minutes: {0}",
"APIKey": "API Key",
"ASIN": "ASIN",
"About": "About",
"Actions": "Actions",
@@ -33,7 +32,7 @@
"AnalyticsEnabledHelpText": "Send anonymous usage and error information to Readarr's servers. This includes information on your browser, which Readarr WebUI pages you use, error reporting as well as OS and runtime version. We will use this information to prioritize features and bug fixes.",
"AnalyticsEnabledHelpTextWarning": "Requires restart to take effect",
"AnyEditionOkHelpText": "Readarr will automatically switch to the edition best matching downloaded files",
"ApiKeyHelpTextWarning": "Requires restart to take effect",
"ApiKey": "API Key",
"ApiKeyValidationHealthCheckMessage": "Please update your API key to be at least {0} characters long. You can do this via settings or the config file",
"AppDataDirectory": "AppData Directory",
"AppDataLocationHealthCheckMessage": "Updating will not be possible to prevent deleting AppData on Update",
@@ -51,8 +50,18 @@
"ApplyTagsHelpTextRemove": "Remove: Remove the entered tags",
"ApplyTagsHelpTextReplace": "Replace: Replace the tags with the entered tags (enter no tags to clear all tags)",
"AudioFileMetadata": "Write Metadata to Audio Files",
"AuthBasic": "Basic (Browser Popup)",
"AuthForm": "Forms (Login Page)",
"Authentication": "Authentication",
"AuthenticationMethodHelpText": "Require Username and Password to access Readarr",
"AuthenticationMethod": "Authentication Method",
"AuthenticationMethodHelpText": "Require Username and Password to access {appName}",
"AuthenticationMethodHelpTextWarning": "Please select a valid authentication method",
"AuthenticationRequired": "Authentication Required",
"AuthenticationRequiredHelpText": "Change which requests authentication is required for. Do not change unless you understand the risks.",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirm new password",
"AuthenticationRequiredPasswordHelpTextWarning": "Enter a new password",
"AuthenticationRequiredUsernameHelpTextWarning": "Enter a new username",
"AuthenticationRequiredWarning": "To prevent remote access without authentication, {appName} now requires authentication to be enabled. You can optionally disable authentication from local addresses.",
"Author": "Author",
"AuthorClickToChangeBook": "Click to change book",
"AuthorEditor": "Author Editor",
@@ -193,6 +202,7 @@
"CustomFormatScore": "Custom Format Score",
"CustomFormatSettings": "Custom Format Settings",
"CustomFormats": "Custom Formats",
"CustomFormatsSettingsTriggerInfo": "A Custom Format will be applied to a release or file when it matches at least one of each of the different condition types chosen.",
"CustomFormatsSpecificationFlag": "Flag",
"CustomFormatsSpecificationRegularExpression": "Regular Expression",
"CustomFormatsSpecificationRegularExpressionHelpText": "Custom Format RegEx is Case Insensitive",
@@ -276,6 +286,7 @@
"DetailedProgressBarHelpText": "Show text on progress bar",
"Development": "Development",
"Disabled": "Disabled",
"DisabledForLocalAddresses": "Disabled for Local Addresses",
"DiscCount": "Disc Count",
"DiscNumber": "Disc Number",
"DiskSpace": "Disk Space",
@@ -330,6 +341,7 @@
"EnableRssHelpText": "Will be used when Readarr periodically looks for releases via RSS Sync",
"EnableSSL": "Enable SSL",
"EnableSslHelpText": " Requires restart running as administrator to take effect",
"Enabled": "Enabled",
"EnabledHelpText": "Check to enable release profile",
"Ended": "Ended",
"EndedAllBooksDownloaded": "Ended (All books downloaded)",
@@ -344,9 +356,11 @@
"ExistingTag": "Existing tag",
"ExistingTagsScrubbed": "Existing tags scrubbed",
"ExportCustomFormat": "Export Custom Format",
"External": "External",
"ExtraFileExtensionsHelpText": "Comma separated list of extra files to import (.nfo will be imported as .nfo-orig)",
"ExtraFileExtensionsHelpTextsExamples": "Examples: '.sub, .nfo' or 'sub,nfo'",
"FailedDownloadHandling": "Failed Download Handling",
"FailedLoadingSearchResults": "Failed to load search results, please try again.",
"FailedToLoadQueue": "Failed to load Queue",
"FileDateHelpText": "Change file date on import/rescan",
"FileDetails": "File Details",
@@ -455,6 +469,10 @@
"IndexerSearchCheckNoAvailableIndexersMessage": "All search-capable indexers are temporarily unavailable due to recent indexer errors",
"IndexerSearchCheckNoInteractiveMessage": "No indexers available with Interactive Search enabled, Readarr will not provide any interactive search results",
"IndexerSettings": "Indexer Settings",
"IndexerSettingsSeedRatio": "Seed Ratio",
"IndexerSettingsSeedRatioHelpText": "The ratio a torrent should reach before stopping, empty uses the download client's default. Ratio should be at least 1.0 and follow the indexers rules",
"IndexerSettingsSeedTime": "Seed Time",
"IndexerSettingsSeedTimeHelpText": "The time a torrent should be seeded before stopping, empty uses the download client's default",
"IndexerStatusCheckAllClientMessage": "All indexers are unavailable due to failures",
"IndexerStatusCheckSingleClientMessage": "Indexers unavailable due to failures: {0}",
"IndexerTagsHelpText": "Only use this indexer for authors with at least one matching tag. Leave blank to use with all authors.",
@@ -673,6 +691,7 @@
"PageSize": "Page Size",
"PageSizeHelpText": "Number of items to show on each page",
"Password": "Password",
"PasswordConfirmation": "Password Confirmation",
"PasswordHelpText": "Calibre content server password",
"PastDays": "Past Days",
"PastDaysHelpText": "Days for iCal feed to look into the past",
@@ -1068,6 +1087,7 @@
"WatchRootFoldersForFileChanges": "Watch Root Folders for file changes",
"WeekColumnHeader": "Week Column Header",
"WhatsNew": "What's New?",
"WhySearchesCouldBeFailing": "Click here to find out why searches could be failing",
"WouldYouLikeToRestoreBackup": "Would you like to restore the backup '{name}'?",
"WriteAudioTags": "Tag Audio Files with Metadata",
"WriteAudioTagsScrub": "Scrub Existing Tags",

View File

@@ -1,6 +1,6 @@
{
"ApiKeyHelpTextWarning": "Requiere reiniciar para que surta efecto",
"DeleteRootFolderMessageText": "¿Está seguro de querer eliminar la carpeta raíz '{0}'?",
"DeleteRootFolderMessageText": "¿Estás seguro que quieres eliminar la carpeta raíz '{name}'?",
"LoadingBooksFailed": "La carga de los archivos ha fallado",
"ProxyUsernameHelpText": "Solo necesitas introducir un usuario y contraseña si se requiere alguno. De otra forma déjalos en blanco.",
"SslPortHelpTextWarning": "Requiere reiniciar para que surta efecto",
@@ -14,24 +14,24 @@
"60MinutesSixty": "60 Minutos: {0}",
"APIKey": "Clave API",
"About": "Acerca de",
"AddListExclusion": "Agregar Lista de Exclusión",
"AddListExclusion": "Añadir lista de exclusión",
"AddingTag": "Añadir etiqueta",
"AgeWhenGrabbed": "Antigüedad (cuando se añadió)",
"AlreadyInYourLibrary": "Ya en tu biblioteca",
"AlternateTitles": "Titulos alternativos",
"Analytics": "Analíticas",
"AnalyticsEnabledHelpText": "Envíe información anónima de uso y error a los servidores de Radarr. Esto incluye información sobre su navegador, qué páginas de Radarr WebUI utiliza, informes de errores, así como el sistema operativo y la versión en tiempo de ejecución. Usaremos esta información para priorizar funciones y correcciones de errores.",
"AnalyticsEnabledHelpText": "Envía información anónima de uso y error a los servidores de Readarr. Esto incluye información sobre tu navegador, qué páginas de la interfaz web de Readarr utilizas, informes de errores así como el sistema operativo y la versión en tiempo de ejecución. Usaremos esta información para priorizar funciones y correcciones de errores.",
"AnalyticsEnabledHelpTextWarning": "Requiere reiniciar para que surta efecto",
"AppDataDirectory": "Directorio AppData",
"ApplyTags": "Aplicar Etiquetas",
"45MinutesFourtyFive": "45 Minutos: {0}",
"Authentication": "Autenticación",
"AuthenticationMethodHelpText": "Requerir nombre de usuario y contraseña para acceder Radarr",
"AuthenticationMethodHelpText": "Requiere usuario y contraseña para acceder a Readarr",
"AuthorClickToChangeBook": "Clic para cambiar la película",
"AutoRedownloadFailedHelpText": "Buscar e intentar descargar automáticamente una versión diferente",
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Las películas eliminadas del disco son automáticamente desmonitorizadas en Radarr",
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Los libros eliminados del disco se dejan de monitorizar automáticamente en Readarr",
"Automatic": "Automático",
"BackupFolderHelpText": "Las rutas relativas estarán en el directorio AppData de Radarr",
"BackupFolderHelpText": "Las rutas relativas estarán bajo el directorio AppData de Readarr",
"BackupNow": "Hacer copia de seguridad ahora",
"BackupRetentionHelpText": "Las copias de seguridad automáticas anteriores al período de retención serán borradas automáticamente",
"Backups": "Copias de seguridad",
@@ -51,20 +51,20 @@
"ChangeHasNotBeenSavedYet": "El cambio aún no se ha guardado",
"ChmodFolder": "Carpeta chmod",
"ChmodFolderHelpText": "Octal, aplicado durante la importación / cambio de nombre a carpetas y archivos multimedia (sin bits de ejecución)",
"ChmodFolderHelpTextWarning": "Esto solo funciona si el usuario que ejecuta Radarr es el propietario del archivo. Es mejor asegurarse de que el cliente de descarga establezca los permisos correctamente.",
"ChmodFolderHelpTextWarning": "Esto solo funciona si el usuario que ejecuta Readarr es el propietario del archivo. Es mejor asegurarse de que el cliente de descarga establezca los permisos correctamente.",
"ChownGroupHelpText": "Nombre del grupo o gid. Utilice gid para sistemas de archivos remotos.",
"ChownGroupHelpTextWarning": "Esto solo funciona si el usuario que ejecuta Radarr es el propietario del archivo. Es mejor asegurarse de que el cliente de descarga use el mismo grupo que Radarr.",
"ChownGroupHelpTextWarning": "Esto solo funciona si el usuario que ejecuta Readarr es el propietario del archivo. Es mejor asegurarse de que el cliente de descarga use el mismo grupo que Readarr.",
"Clear": "Borrar",
"ClickToChangeQuality": "Clic para cambiar la calidad",
"Columns": "Columnas",
"ConnectSettings": "Conectar Ajustes",
"Connections": "Conexiones",
"CopyUsingHardlinksHelpText": "Usar Hardlinks al intentar copiar ficheros de los torrents que siguen seedeando",
"CopyUsingHardlinksHelpTextWarning": "Ocasionalmente, los archivos blqoueados impiden renombrar los archivos que siguen seedeando. Puedes desactivar el seedeo temporalmete y usar la función de renombrado de Radarr como alternativa.",
"CopyUsingHardlinksHelpText": "Los enlaces duros permiten a Readarr importar los torrents que están sembrando a las carpetas de series sin tomar espacio de disco adicional o copiar los contenidos enteros del archivo. Los enlaces duros solo funcionarán si el origen y el destino están en el mismo volumen",
"CopyUsingHardlinksHelpTextWarning": "Ocasionalmente, los archivos bloqueados impiden renombrar los archivos que están siendo sembrados. Puedes deshabilitar temporalmente la siembra y usar la función de renombrado de Readarr como alternativa.",
"CreateEmptyAuthorFoldersHelpText": "Crear carpetas de películas que faltan durante la exploración del disco",
"CreateGroup": "Crear grupo",
"CutoffHelpText": "Una vez que se alcanze esta calidad, Radarr no descargará películas",
"CutoffUnmet": "Umbrales no alcanzados",
"CutoffHelpText": "Una vez que se alcance esta calidad, Readarr dejará de descargar libros",
"CutoffUnmet": "Límite no alcanzado",
"DatabaseMigration": "Migración de la base de datos",
"Dates": "Fechas",
"DelayProfile": "Perfil de retardo",
@@ -82,15 +82,15 @@
"DeleteImportListExclusion": "Eliminar exclusión de listas de importación",
"DeleteImportListExclusionMessageText": "¿Está seguro de que desea eliminar esta exclusión de la lista de importación?",
"DeleteImportListMessageText": "Seguro que quieres eliminar la lista '{name}'?",
"DeleteIndexer": "Borrar Indexer",
"DeleteIndexerMessageText": "Seguro que quieres eliminar el indexer '{name}'?",
"DeleteIndexer": "Borrar indexador",
"DeleteIndexerMessageText": "¿Estás seguro que quieres eliminar el indexador '{name}'?",
"DeleteMetadataProfileMessageText": "¿Seguro que quieres eliminar el perfil de metadatos '{name}'?",
"DeleteNotification": "Borrar Notificacion",
"DeleteNotificationMessageText": "¿Seguro que quieres eliminar la notificación '{name}'?",
"DeleteQualityProfile": "Borrar perfil de calidad",
"DeleteQualityProfileMessageText": "¿Seguro que quieres eliminar el perfil de calidad {name}?",
"DeleteReleaseProfile": "Borrar perfil de estreno",
"DeleteReleaseProfileMessageText": "Está seguro que quieres borrar este perfil de retraso?",
"DeleteReleaseProfile": "Eliminar perfil de lanzamiento",
"DeleteReleaseProfileMessageText": "¿Estás seguro que quieres eliminar este perfil de lanzamiento?",
"DeleteSelectedBookFiles": "Borrar Archivos Seleccionados",
"DeleteSelectedBookFilesMessageText": "Seguro que quieres eliminar el archivo de la película seleccionada?",
"DeleteTag": "Eliminar Etiqueta",
@@ -134,8 +134,8 @@
"Fixed": "Arreglado",
"Folder": "Carpeta",
"Folders": "Carpetas",
"ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Para más información individual de los gestores de descarga, haz clic en los botones de información.",
"ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "Para más información individual sobre los indexers, haz clic en los botones de información.",
"ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Para más información en los clientes de descarga individuales, pulsa en los botones de información.",
"ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "Para obtener más información sobre indexadores individuales, pulsa en los botones de información.",
"ForMoreInformationOnTheIndividualListsClickOnTheInfoButtons": "Para más información individual sobre las listas de importación, haz clic en los botones de información.",
"GeneralSettings": "Opciones generales",
"Global": "Global",
@@ -143,17 +143,17 @@
"Grab": "Capturar",
"GrabID": "Capturar ID",
"GrabRelease": "Capturar lanzamiento",
"GrabReleaseMessageText": "Radarr no pudo determinar para qué película es este lanzamiento. Radarr no podrá importar este lanzamiento automáticamente. Quieres descargar {0}?",
"GrabReleaseMessageText": "Readarr no pudo determinar para qué autor y libro era este lanzamiento. Readarr tal vez no pueda importar automáticamente este lanzamiento . ¿Quieres capturar '{0}'?",
"GrabSelected": "Capturar seleccionado",
"HasPendingChangesNoChanges": "Sin Cambios",
"HasPendingChangesSaveChanges": "Guardar Cambios",
"History": "Historial",
"Host": "Host",
"Hostname": "Nombre de host",
"ICalFeed": "Feed de iCal",
"ICalFeed": "Canal de iCal",
"ICalHttpUrlHelpText": "Copia esta URL a tu gestor(es) o haz click en subscribir si tu navegador soporta webcal",
"ICalLink": "Enlace de iCal",
"IconForCutoffUnmet": "Icono para Umbrales no alcanzados",
"IconForCutoffUnmet": "Icono de límite no alcanzado",
"IconTooltip": "Programado",
"IgnoredAddresses": "Ignorar direcciones",
"IgnoredHelpText": "Este lanzamiento será rechazado si contiene uno ó más de estos términos (mayúsculas ó minúsculas)",
@@ -165,18 +165,18 @@
"ImportedTo": "Importar a",
"Importing": "Importando",
"IncludeHealthWarningsHelpText": "Incluir Alertas de Salud",
"IncludeUnknownAuthorItemsHelpText": "Mostrar items sin ninguna película en la cola, esto incluye películas renombradas o cualquier otra cosa en la categoría de Radarr",
"IncludeUnmonitored": "Incluir sin monitorizar",
"IncludeUnknownAuthorItemsHelpText": "Mostrar elementos sin un autor en la cola. Esto podría incluir autores eliminados, libros o cualquier otra cosa en la categoría de Readarr",
"IncludeUnmonitored": "Incluir no monitorizadas",
"Indexer": "Indexador",
"IndexerPriority": "Prioridad del indexador",
"IndexerSettings": "Ajustes de Indexador",
"IndexerSettings": "Opciones del indexador",
"Indexers": "Indexadores",
"Interval": "Intervalo",
"IsCutoffCutoff": "Corte",
"IsCutoffCutoff": "Límite",
"IsCutoffUpgradeUntilThisQualityIsMetOrExceeded": "Actualizar hasta que se alcance o supere esta calidad",
"IsTagUsedCannotBeDeletedWhileInUse": "No se puede eliminar estando en uso",
"Language": "Idioma",
"LaunchBrowserHelpText": " Abrir un navegador web e ir a la página de inicio de Radarr al arrancar la app.",
"LaunchBrowserHelpText": " Abrir un navegador web e ir a la página de inicio de Readarr al iniciar la aplicación.",
"LoadingBookFilesFailed": "La carga de los archivos ha fallado",
"Local": "Local",
"LogFiles": "Archivos de Registro",
@@ -190,7 +190,7 @@
"MarkAsFailedMessageText": "Seguro que quieres marcar '{0}' como fallida?",
"MaximumLimits": "Límites máximos",
"MaximumSize": "Tamaño máximo",
"MaximumSizeHelpText": "Tamaño máximo de un lanzamiento para ser importado en MB. Ajustar a cero para ilimitado",
"MaximumSizeHelpText": "Tamaño máximo para que un lanzamiento sea capturado en MB. Establecer a cero para establecerlo a ilimitado.",
"Mechanism": "Mecanismo",
"MediaInfo": "Información de medios",
"MediaManagementSettings": "Opciones de gestión de medios",
@@ -211,7 +211,7 @@
"NamingSettings": "Opciones de nombrado",
"New": "Nuevo",
"NoBackupsAreAvailable": "No hay copias de seguridad disponibles",
"NoHistory": "Sin historia",
"NoHistory": "Sin historial.",
"NoLeaveIt": "No, déjalo",
"NoLimitForAnyRuntime": "No hay límites para ningún tiempo de ejecución",
"NoLogFiles": "No hay archivos de registro",
@@ -257,8 +257,8 @@
"RSSSync": "Sincronizar RSS",
"RSSSyncInterval": "Intervalo de Sincronización de RSS",
"ReadTheWikiForMoreInformation": "Lee la Wiki para más información",
"ReadarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "Radarr soporta cualquier indexer que utilice el estandar Newznab, como también cualquiera de los indexers listados debajo.",
"ReadarrTags": "Etiquetas de Radarr",
"ReadarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "Readarr soporta cualquier indexador que utilice el estándar Newznab, así como los otros indexadores listados debajo.",
"ReadarrTags": "Etiquetas de Readarr",
"Real": "Real",
"Reason": "Razón",
"RecycleBinCleanupDaysHelpText": "Ajustar a 0 para desactivar la limpieza automática",
@@ -286,19 +286,19 @@
"RemoveTagExistingTag": "Etiqueta existente",
"RemoveTagRemovingTag": "Eliminando etiqueta",
"RemovedFromTaskQueue": "Eliminar de la cola de tareas",
"RenameBooksHelpText": "Radarr usará el nombre del archivo si el renombrado está deshabilitado",
"RenameBooksHelpText": "Readarr usará el nombre de archivo existente si el renombrado está deshabilitado",
"Reorder": "Reordenar",
"ReplaceIllegalCharacters": "Reemplazar caracteres ilegales",
"RequiredHelpText": "El comunicado debe contener al menos uno de estos términos (no distingue entre mayúsculas y minúsculas)",
"RequiredHelpText": "Esta condición {0} debe coincidir con el formato personalizado para aplicarse. De otro modo una simple coincidencia {0} es suficiente.",
"RequiredPlaceHolder": "Añadir nueva restricción",
"RescanAfterRefreshHelpTextWarning": "Radarr no detectará los cambios automáticamente en los ficheros si no se ajusta a 'Siempre'",
"RescanAuthorFolderAfterRefresh": "Reescanear la Carpeta de Películas después de Actualizar",
"RescanAfterRefreshHelpTextWarning": "Readarr no detectará automáticamente los cambios de archivos cuando no se establezca en 'Siempre'",
"RescanAuthorFolderAfterRefresh": "Volver a escanear la carpeta de autor después de refrescar",
"Reset": "Reiniciar",
"ResetAPIKey": "Restablecer clave API",
"ResetAPIKeyMessageText": "¿Estás seguro que quieres restablecer tu clave API?",
"Restart": "Reiniciar",
"RestartNow": "Reiniciar ahora",
"RestartReadarr": "Reiniciar Radarr",
"RestartReadarr": "Reiniciar Readarr",
"Restore": "Restaurar",
"RestoreBackup": "Restaurar copia de seguridad",
"Result": "Resultado",
@@ -324,7 +324,7 @@
"SetPermissionsLinuxHelpTextWarning": "Si no estás seguro qué configuraciones hacer, no las cambies.",
"Settings": "Ajustes",
"ShortDateFormat": "Formato de fecha breve",
"ShowCutoffUnmetIconHelpText": "Mostrar el icono para los ficheros cuando no se ha alcanzado el corte",
"ShowCutoffUnmetIconHelpText": "Muestra un icono para archivos cuando el límite no haya sido alcanzado",
"ShowMonitored": "Mostrar monitorizado",
"ShowMonitoredHelpText": "Muestra el estado monitorizado bajo el póster",
"ShowPath": "Mostrar ruta",
@@ -338,14 +338,14 @@
"ShownAboveEachColumnWhenWeekIsTheActiveView": "Mostrado sobre cada columna cuando la vista activa es semana",
"Size": " Tamaño",
"SkipFreeSpaceCheck": "Saltar comprobación de espacio libre",
"SkipFreeSpaceCheckWhenImportingHelpText": "Usar cuando Radarr no pueda detectar el espacio disponible en la carpeta de películas",
"SkipFreeSpaceCheckWhenImportingHelpText": "Se usa cuando Readarr no pueda detectar el espacio disponible en tu carpeta raíz de autores",
"SorryThatAuthorCannotBeFound": "Lo siento, no he encontrado esa película.",
"SorryThatBookCannotBeFound": "Lo siento, no he encontrado esa película.",
"Source": "Fuente",
"SourcePath": "Ruta de la fuente",
"SslCertPasswordHelpText": "Contraseña para el archivo pfx",
"SslCertPasswordHelpText": "Contraseña para archivo pfx",
"SslCertPasswordHelpTextWarning": "Requiere reiniciar para que surta efecto",
"SslCertPathHelpText": "Ruta al archivo pfx",
"SslCertPathHelpText": "Ruta del archivo pfx",
"StandardBookFormat": "Formato de Película Estándar",
"StartTypingOrSelectAPathBelow": "Comienza a escribir o selecciona una ruta debajo",
"StartupDirectory": "Directorio de Arranque",
@@ -354,9 +354,9 @@
"Style": "Estilo",
"SuccessMyWorkIsDoneNoFilesToRename": "Éxito! Mi trabajo está hecho, no hay archivos pendientes de renombrar.",
"SuccessMyWorkIsDoneNoFilesToRetag": "Éxito! Mi trabajo está hecho, no hay archivos pendientes de renombrar.",
"SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "RSS no son soportadas por este indexer",
"SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "Buscar no está soportado por este indexer",
"SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "Se usará cuando las búsquedas automáticas se realicen desde el UI o por Radarr",
"SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "No se soporta RSS con este indexador",
"SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "No se soporta la búsqueda con este indexador",
"SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "Se usará cuando las búsquedas automáticas se realicen desde la interfaz o por Readarr",
"SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Se usará cuando se utilice la búsqueda interactiva",
"TagIsNotUsedAndCanBeDeleted": "La etiqueta no se usa y puede ser borrada",
"Tasks": "Tareas",
@@ -364,7 +364,7 @@
"TestAllClients": "Probar todos los clientes",
"TestAllIndexers": "Probar todos los indexadores",
"TestAllLists": "Probar todas las listas",
"ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Se aplicará a todos los indexers, por favor sigue las reglas de los mismos",
"ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Se aplicará a todos los indexadores, por favor sigue las reglas de los mismos",
"TimeFormat": "Formato de hora",
"Title": "Título",
"TorrentDelay": "Retraso de torrent",
@@ -372,13 +372,13 @@
"Torrents": "Torrents",
"TotalFileSize": "Tamaño total de archivo",
"UILanguage": "Lenguaje de UI",
"UILanguageHelpText": "Lenguaje que Radarr usara para el UI",
"UILanguageHelpText": "Idioma que Readarr usará para la interfaz",
"UILanguageHelpTextWarning": "Recargar el Navegador",
"UISettings": "Ajustes del UI",
"URLBase": "URL Base",
"URLBase": "URL base",
"UnableToAddANewDownloadClientPleaseTryAgain": "No se ha podido añadir un nuevo gestor de descargas, prueba otra vez.",
"UnableToAddANewImportListExclusionPleaseTryAgain": "No se ha podido añadir una nueva lista de exclusión, prueba otra vez.",
"UnableToAddANewIndexerPleaseTryAgain": "No se ha podido añadir un nuevo indexer, prueba otra vez.",
"UnableToAddANewIndexerPleaseTryAgain": "No se pudo añadir un nuevo indexador, por favor inténtalo de nuevo.",
"UnableToAddANewListPleaseTryAgain": "No se ha podido añadir una nueva lista, prueba otra vez.",
"UnableToAddANewMetadataProfilePleaseTryAgain": "No se ha podido añadir un nuevo perfil de calidad, prueba otra vez.",
"UnableToAddANewNotificationPleaseTryAgain": "No se ha podido añadir una nueva notificación, prueba otra vez.",
@@ -390,9 +390,9 @@
"UnableToLoadDownloadClientOptions": "No se han podido cargar las opciones del gestor de descargas",
"UnableToLoadDownloadClients": "No se puden cargar los gestores de descargas",
"UnableToLoadGeneralSettings": "No se han podido cargar los ajustes Generales",
"UnableToLoadHistory": "No se ha podido cargar la historia",
"UnableToLoadHistory": "No se ha podido cargar el historial.",
"UnableToLoadImportListExclusions": "No se pueden cargas las Excluidas de la Lista",
"UnableToLoadIndexerOptions": "No se han podido cargar las opciones del indexer",
"UnableToLoadIndexerOptions": "No se pudo cargar las opciones del indexador",
"UnableToLoadIndexers": "No se pueden cargar los indexadores",
"UnableToLoadLists": "No se pueden cargar las Listas",
"UnableToLoadMediaManagementSettings": "No se han podido cargar los ajustes de Manipulación multimedia",
@@ -410,10 +410,10 @@
"UnableToLoadUISettings": "No se han podido cargar los ajustes de UI",
"Ungroup": "Sin agrupar",
"Unmonitored": "Sin monitorizar",
"UnmonitoredHelpText": "Incluir las peliculas no monitoreadas en el feed de iCal",
"UnmonitoredHelpText": "Incluir los libros sin monitorizar en el canal de iCal",
"UpdateAll": "Actualizar Todo",
"UpdateAutomaticallyHelpText": "Descargar e instalar actualizaciones automáticamente. Todavía puedes instalar desde Sistema: Actualizaciones",
"UpdateMechanismHelpText": "Usar el actualizador de Radarr o un script",
"UpdateMechanismHelpText": "Usar el actualizador integrado de Readarr o un script",
"UpdateScriptPathHelpText": "Ruta a un script personalizado que toma un paquete de actualización extraído y gestiona el resto del proceso de actualización",
"Updates": "Actualizaciones",
"UpgradeAllowedHelpText": "Si está desactivado las calidades no serán actualizadas",
@@ -425,7 +425,7 @@
"UsenetDelay": "Retraso de usenet",
"UsenetDelayHelpText": "Retraso en minutos a esperar antes de capturar un lanzamiento desde usenet",
"Username": "Usuario",
"UsingExternalUpdateMechanismBranchToUseToUpdateReadarr": "Qué rama usar para actualizar Radarr",
"UsingExternalUpdateMechanismBranchToUseToUpdateReadarr": "Rama a utilizar para actualizar Readarr",
"UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "Rama usada por el mecanismo de actualización externo",
"Version": "Versión",
"WeekColumnHeader": "Cabecera de columna de semana",
@@ -434,7 +434,7 @@
"20MinutesTwenty": "20 Minutos: {0}",
"DownloadClientCheckDownloadingToRoot": "El cliente de descargas {0} coloca las descargas en la carpeta raíz {1}. No debe descargar a una carpeta raíz.",
"MaintenanceRelease": "Lanzamiento de mantenimiento: Corrección de errores y otras mejoras. Ver historial de commits de Github para mas detalle",
"ReplaceIllegalCharactersHelpText": "Reemplazar caracteres ilegales. Si está desactivado, Radarr los eliminará si no",
"ReplaceIllegalCharactersHelpText": "Reemplaza caracteres ilegales. Si está desactivado, en su lugar Readarr los eliminará",
"Actions": "Acciones",
"Today": "Hoy",
"ReleaseTitle": "Título de lanzamiento",
@@ -453,7 +453,7 @@
"Time": "Tiempo",
"UnableToLoadBlocklist": "No se han podido cargar las bloqueadas",
"Level": "Nivel",
"ReleaseBranchCheckOfficialBranchMessage": "Las versión {0} no es una versión válida de Radarr, no recibirás actualizaciones",
"ReleaseBranchCheckOfficialBranchMessage": "La rama {0} no es una rama de lanzamiento de Readarr válida, no recibirás actualizaciones",
"Blocklist": "Lista de bloqueos",
"BlocklistRelease": "Lista de bloqueos de lanzamiento",
"CreateEmptyAuthorFolders": "Crear carpetas de películas vacías",
@@ -464,7 +464,7 @@
"RescanAfterRefreshHelpText": "Reescanear la carpeta de películas después de actualizar la película",
"ShowUnknownAuthorItems": "Mostrar Elementos Desconocidos",
"UnselectAll": "Desmarcar todo",
"UpdateSelected": "Actualizar Seleccionadas",
"UpdateSelected": "Actualizar seleccionados",
"Wanted": "Buscado",
"AllAuthorBooks": "Todos los libros del autor",
"AllExpandedCollapseAll": "Cerrar todo",
@@ -508,16 +508,16 @@
"MetadataProfile": "perfil de metadatos",
"MetadataProfiles": "perfil de metadatos",
"Publisher": "Editor",
"ReadarrSupportsAnyDownloadClient": "Radarr es compatible con muchos clientes de descarga de Torrent y Usenet populares.",
"ReadarrSupportsAnyDownloadClient": "Readarr soporta muchos clientes populares de descarga torrent y usenet.",
"RootFolderCheckMultipleMessage": "Varias carpetas de origen no existen: {0}",
"Save": "Guardar",
"Series": "Series",
"SettingsRemotePathMappingLocalPath": "Ruta Local",
"SettingsRemotePathMappingLocalPathHelpText": "La ruta que Radarr tiene que usar para acceder a la ruta remota localmente",
"SettingsRemotePathMappingLocalPathHelpText": "La ruta que Readarr debería usar para acceder localmente a la ruta remota",
"SettingsRemotePathMappingRemotePath": "Ruta Remota",
"SettingsRemotePathMappingRemotePathHelpText": "Ruta de origen al directorio al que accede el Gestor de Descargas",
"TimeLeft": "Tiempo restante",
"DownloadClientCheckUnableToCommunicateMessage": "Incapaz de comunicarse con {0}.",
"DownloadClientCheckUnableToCommunicateMessage": "No se pudo comunicar con {0}.",
"IndexerPriorityHelpText": "Prioridad del Indexador de 1 (la más alta) a 50 (la más baja). Por defecto: 25. Usada para desempatar lanzamientos iguales cuando se capturan, Readarr seguirá usando todos los indexadores habilitados para Sincronización de RSS y Búsqueda.",
"Monitor": "Monitorizar",
"MountCheckMessage": "El punto de montaje que contiene la ruta de una película es de read-only: ",
@@ -527,13 +527,13 @@
"UpdateCheckStartupTranslocationMessage": "No se puede instalar la actualización porque la carpeta de arranque '{0}' está en una carpeta de \"App Translocation\".",
"UpdateCheckUINotWritableMessage": "No se puede instalar la actualización porque la carpeta UI '{0}' no tiene permisos de escritura para el usuario '{1}'.",
"Disabled": "Deshabilitado",
"DownloadClientStatusCheckSingleClientMessage": "Gestores de descargas no disponibles debido a errores: {0}",
"DownloadClientStatusCheckSingleClientMessage": "Clientes de descargas no disponibles debido a errores: {0}",
"ImportMechanismHealthCheckMessage": "Activar Manipulación de Descargas Completadas",
"IndexerLongTermStatusCheckAllClientMessage": "Ningún indexer está disponible por errores durando más de 6 horas",
"IndexerLongTermStatusCheckSingleClientMessage": "Indexers no disponible por errores durando más de 6 horas: {0}",
"IndexerRssHealthCheckNoAvailableIndexers": "Todos los indexers capaces de RSS están temporalmente desactivados debido a errores recientes con el indexer",
"IndexerSearchCheckNoInteractiveMessage": "No hay Indexers con Búsqueda Interactiva activada, Readarr no obtendrá ningún resultado en las búsquedas",
"IndexerStatusCheckSingleClientMessage": "Indexadores no disponibles debido a errores: {indexerNames}",
"IndexerLongTermStatusCheckAllClientMessage": "Ningún indexador está disponible debido a errores durante más de 6 horas",
"IndexerLongTermStatusCheckSingleClientMessage": "Ningún indexador disponible debido a errores durante más de 6 horas: {0}",
"IndexerRssHealthCheckNoAvailableIndexers": "Todos los indexadores con capacidad de RSS no están disponibles temporalmente debido a errores recientes con el indexador",
"IndexerSearchCheckNoInteractiveMessage": "Ningún indexador disponible con búsqueda interactiva habilitada, Readarr no proporcionará ningún resultado de búsqueda interactivo",
"IndexerStatusCheckSingleClientMessage": "Indexadores no disponibles debido a errores: {0}",
"OnBookFileDeleteForUpgrade": "En archivo de película Eliminar para actualizar",
"OnBookFileDeleteForUpgradeHelpText": "En archivo de película Eliminar para actualizar",
"OnBookFileDeleteHelpText": "Al eliminar archivo de película",
@@ -546,10 +546,10 @@
"Queued": "Encolado",
"QueueIsEmpty": "La cola está vacía",
"RefreshAndScan": "Actualizar y Escanear",
"RestartReloadNote": "Nota: Radarr se reiniciará y recargará automáticamente la IU durante el proceso de restauración.",
"RestartReloadNote": "Nota: Readarr se reiniciará automáticamente y recargará la interfaz durante el proceso de restauración.",
"RootFolderCheckSingleMessage": "La carpeta de origen no existe: {0}",
"SearchFiltered": "Buscar Filtradas",
"DownloadClientStatusCheckAllClientMessage": "Los gestores de descargas no están disponibles debido a errores",
"DownloadClientStatusCheckAllClientMessage": "Los clientes de descargas no están disponibles debido a errores",
"FailedToLoadQueue": "No se pudo cargar la cola",
"GeneralSettingsSummary": "Puerto, SSL, usuario/contraseña, proxy, analíticas y actualizaciones",
"ProxyCheckResolveIpMessage": "No se pudo resolver la dirección IP del Host Proxy configurado {0}",
@@ -557,20 +557,20 @@
"Connect": "Conectar",
"ConnectSettingsSummary": "Notificaciones, conexiones a servidores/reproductores y scripts personalizados",
"CouldntFindAnyResultsForTerm": "No se pudieron encontrar resultados para '{0}'",
"DownloadClientCheckNoneAvailableMessage": "Ningún gestor de descargas disponible",
"DownloadClientCheckNoneAvailableMessage": "Ningún cliente de descarga disponible",
"General": "General",
"IndexerRssHealthCheckNoIndexers": "No hay indexers disponibles con sincronización RSS activada, Radarr no capturará nuevos estrenos automáticamente",
"IndexerSearchCheckNoAutomaticMessage": "No hay indexers con Búsqueda Automática disponibles, Radarr no dará ningún resultado de búsquedas automáticas",
"IndexerSearchCheckNoAvailableIndexersMessage": "Todos los indexers están temporalmente inactivos debido a errores recientes con ellos",
"IndexerRssHealthCheckNoIndexers": "No hay indexadores disponibles con sincronización RSS habilitada, Readarr no capturará nuevos lanzamientos automáticamente",
"IndexerSearchCheckNoAutomaticMessage": "No hay indexadores disponibles con búsqueda automática habilitada, Readarr no proporcionará ningún resultado de búsqueda automática",
"IndexerSearchCheckNoAvailableIndexersMessage": "Todos los indexadores con capacidad de búsqueda no están disponibles temporalmente debido a errores recientes de indexador",
"IndexerStatusCheckAllClientMessage": "Todos los indexadores no están disponibles debido a errores",
"Label": "Etiqueta",
"MissingFromDisk": "Radarr no pudo encontrar el archivo en el disco, por lo que el archivo fue desvinculado de la película en la base de datos",
"RemotePathMappingCheckDownloadPermissions": "Radarr puede ver pero no acceder a la película descargada {0}. Probablemente sea un error de permisos.",
"RemotePathMappingCheckFolderPermissions": "Radarr puede ver pero no acceder al directorio de descarga {0}. Probablemente sea un error de permisos.",
"RemotePathMappingCheckFilesGenericPermissions": "El cliente de descarga {0} informó de la existencia de archivos en {1} pero Radarr no puede ver este directorio. Es posible que tenga que ajustar los permisos de la carpeta.",
"RemotePathMappingCheckGenericPermissions": "El cliente de descarga {0} coloca las descargas en {1} pero Radarr no puede ver este directorio. Es posible que tenga que ajustar los permisos de la carpeta.",
"RemotePathMappingCheckImportFailed": "Radarr no pudo importar una película. Comprueba los detalles en tus registros.",
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent proporcionado por la aplicación llamó a la API",
"MissingFromDisk": "Readarr no pudo encontrar el archivo en el disco, por lo que el archivo fue desvinculado del libro en la base de datos",
"RemotePathMappingCheckDownloadPermissions": "Readarr puede ver pero no acceder al libro descargado {0}. Probablemente sea un error de permisos.",
"RemotePathMappingCheckFolderPermissions": "Readarr puede ver pero no acceder al directorio de descarga {0}. Probablemente sea un error de permisos.",
"RemotePathMappingCheckFilesGenericPermissions": "El cliente de descarga {0} informó de la existencia de archivos en {1} pero Readarr no puede ver este directorio. Puede que tengas que ajustar los permisos de la carpeta.",
"RemotePathMappingCheckGenericPermissions": "El cliente de descarga {0} coloca las descargas en {1} pero Readarr no puede ver este directorio. Puede que tengas que ajustar los permisos de la carpeta.",
"RemotePathMappingCheckImportFailed": "Readarr falló al importar un libro. Comprueba tus registros para más detalles.",
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent proporcionado por la aplicación que llamó a la API",
"WriteTagsNo": "Nunca",
"FileWasDeletedByUpgrade": "Se eliminó el archivo para importar una actualización",
"IndexersSettingsSummary": "Indexadores y restricciones de lanzamiento",
@@ -583,21 +583,21 @@
"Database": "Base de datos",
"ManualImportSelectEdition": "Importar Manualmente - Seleccionar Película",
"ImportListExclusions": "Importar lista de exclusiones",
"ChooseImportMethod": "Elegir Modo de Importación",
"ClickToChangeReleaseGroup": "Clic para cambiar el grupo de lanzamiento",
"ChooseImportMethod": "Elegir método de importación",
"ClickToChangeReleaseGroup": "Pulsa para cambiar el grupo de lanzamiento",
"HardlinkCopyFiles": "Enlace permanente/Copiar archivos",
"MoveFiles": "Mover archivos",
"OnApplicationUpdate": "Al actualizar la aplicación",
"OnApplicationUpdateHelpText": "Al Actualizar La Aplicación",
"BypassIfHighestQuality": "Pasar sí es la calidad más alta",
"CustomFormatScore": "Puntuación de Formato personalizado",
"BypassIfHighestQuality": "Ignorar si es la calidad más alta",
"CustomFormatScore": "Puntuación de formato personalizado",
"MinimumCustomFormatScore": "Puntuación mínima de formato personalizado",
"Conditions": "Condiciones",
"CopyToClipboard": "Copiar al portapapeles",
"CustomFormat": "Formatos Personalizados",
"CustomFormat": "Formato personalizado",
"CustomFormats": "Formatos personalizados",
"DeleteCustomFormat": "Eliminar Formato Personalizado",
"DeleteFormatMessageText": "¿Está seguro de que desea eliminar la etiqueta de formato {0}?",
"DeleteCustomFormat": "Eliminar formato personalizado",
"DeleteFormatMessageText": "¿Estás seguro que quieres eliminar la etiqueta de formato '{0}'?",
"Formats": "Formatos",
"IncludeCustomFormatWhenRenamingHelpText": "Incluir en el formato de renombrado {Formatos Propios}",
"MinFormatScoreHelpText": "Puntuación mínima del formato propio permitida para descargar",
@@ -607,18 +607,18 @@
"UnableToLoadCustomFormats": "No se pueden cargar los Formatos Propios",
"Theme": "Tema",
"ThemeHelpText": "Cambiar el tema de la interfaz de la aplicación, el tema 'Auto' usará el tema de tu sistema para establecer el modo luminoso u oscuro. Inspirado por Theme.Park",
"CustomFormatSettings": "Ajustes de Formatos Propios",
"CutoffFormatScoreHelpText": "Una vez alcanzada esta puntuación del formato propio Radarr dejará de descargar películas",
"DeleteCustomFormatMessageText": "Seguro que quieres eliminar el indexer '{name}'?",
"CustomFormatSettings": "Ajustes de formato personalizado",
"CutoffFormatScoreHelpText": "Una vez alcanzada la puntuación del formato personalizado Readarr dejará de capturar lanzamientos de libros",
"DeleteCustomFormatMessageText": "¿Estás seguro que quieres eliminar el formato personalizado '{name}'?",
"ExportCustomFormat": "Exportar formato personalizado",
"ResetTitles": "Restablecer títulos",
"UpgradesAllowed": "Actualizaciones permitidas",
"EnableRssHelpText": "Se utilizará cuando Radarr busque periódicamente publicaciones a través de RSS Sync",
"EnableRssHelpText": "Se utilizará cuando Readarr busque periódicamente lanzamientos a través de la sincronización RSS",
"IndexerTagsHelpText": "Solo utilizar este indexador para películas que coincidan con al menos una etiqueta. Déjelo en blanco para utilizarlo con todas las películas.",
"ImportListMissingRoot": "Falta la capeta raíz para las listas: {0}",
"ImportListMultipleMissingRoots": "Múltiples carpetas raíz faltan para las listas de importación: {0}",
"IndexerDownloadClientHelpText": "Especifica qué cliente de descarga es usado para capturas desde este indexador",
"HiddenClickToShow": "Oculto, click para mostrar",
"HiddenClickToShow": "Oculto, pulsa para mostrar",
"HideAdvanced": "Ocultar avanzado",
"ShowAdvanced": "Mostrar avanzado",
"ShownClickToHide": "Mostrado, haz clic para ocultar",
@@ -627,7 +627,7 @@
"ReplaceWithSpaceDashSpace": "Reemplazar por espacio en la barra espaciadora",
"DeleteRemotePathMapping": "Borrar mapeo de ruta remota",
"BlocklistReleases": "Lista de bloqueos de lanzamientos",
"DeleteConditionMessageText": "Seguro que quieres eliminar la etiqueta '{0}'?",
"DeleteConditionMessageText": "¿Estás seguro que quieres eliminar la condición '{name}'?",
"Negated": "Anulado",
"RemoveSelectedItem": "Eliminar elemento seleccionado",
"RemoveSelectedItemBlocklistMessageText": "¿Está seguro de que desea eliminar los elementos seleccionados de la lista negra?",
@@ -637,10 +637,10 @@
"Required": "Solicitado",
"ResetQualityDefinitions": "Restablecer definiciones de calidad",
"ResetQualityDefinitionsMessageText": "¿Estás seguro que quieres restablecer las definiciones de calidad?",
"BlocklistReleaseHelpText": "Evita que Radarr vuelva a capturar esta película automáticamente",
"BlocklistReleaseHelpText": "Evita que Readarr vuelva a capturar automáticamente estos archivos de nuevo",
"NoEventsFound": "Ningún evento encontrado",
"ApplyTagsHelpTextHowToApplyAuthors": "Cómo añadir etiquetas a las películas seleccionadas",
"DeleteSelectedIndexersMessageText": "¿Está seguro de querer eliminar {count} indexador(es) seleccionado(s)?",
"DeleteSelectedIndexersMessageText": "¿Estás seguro que quieres eliminar {count} indexador(es) seleccionado(s)?",
"Yes": "Sí",
"RedownloadFailed": "La descarga ha fallado",
"RemoveCompleted": "Eliminar completado",
@@ -652,11 +652,11 @@
"ApplyTagsHelpTextHowToApplyIndexers": "Cómo aplicar etiquetas a los indexadores seleccionados",
"ApplyTagsHelpTextRemove": "Eliminar: Elimina las etiquetas introducidas",
"ApplyTagsHelpTextReplace": "Reemplazar: Sustituye las etiquetas por las introducidas (introduce \"no tags\" para borrar todas las etiquetas)",
"DeleteSelectedDownloadClients": "Borrar Cliente de Descarga(s)",
"DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {count} cliente(s) de descarga seleccionado(s)?",
"DeleteSelectedImportListsMessageText": "Seguro que quieres eliminar {count} lista(s) de importación seleccionada(s)?",
"DeleteSelectedIndexers": "Borrar indexer(s)",
"DownloadClientTagHelpText": "Solo utilizar este indexador para películas que coincidan con al menos una etiqueta. Déjelo en blanco para utilizarlo con todas las películas.",
"DeleteSelectedDownloadClients": "Borrar cliente(s) de descarga",
"DeleteSelectedDownloadClientsMessageText": "¿Estás seguro que quieres eliminar {count} cliente(s) de descarga seleccionado(s)?",
"DeleteSelectedImportListsMessageText": "¿Estás seguro que quieres eliminar {count} lista(s) de importación seleccionada(s)?",
"DeleteSelectedIndexers": "Borrar indexador(es)",
"DownloadClientTagHelpText": "Utiliza solo este cliente de descarga para autores con al menos una etiqueta coincidente. Déjalo en blanco para utilizarlo con todos los autores.",
"ExistingTag": "Etiquetas existentes",
"No": "No",
"NoChange": "Sin cambio",
@@ -672,9 +672,9 @@
"Clone": "Clonar",
"CloneCondition": "Clonar Condición",
"ApplyChanges": "Aplicar Cambios",
"CountDownloadClientsSelected": "{0} cliente(s) de descarga seleccionado(s)",
"CountImportListsSelected": "{0} lista(s) de importación seleccionada(s)",
"CountIndexersSelected": "{0} indexador(es) seleccionado(s)",
"CountDownloadClientsSelected": "{selectedCount} cliente(s) de descarga seleccionado(s)",
"CountImportListsSelected": "{selectedCount} lista(s) de importación seleccionada(s)",
"CountIndexersSelected": "{selectedCount} indexador(es) seleccionado(s)",
"DeleteCondition": "Eliminar Condición",
"DeleteSelectedImportLists": "Eliminar Lista(s) de Importación",
"EditSelectedDownloadClients": "Editar Clientes de Descarga Seleccionados",
@@ -685,7 +685,7 @@
"ListWillRefreshEveryInterp": "La lista será refrescada cada {0}",
"Activity": "Actividad",
"Location": "Ubicación",
"Ui": "UI",
"Ui": "Interfaz",
"AddNew": "Añadir Nuevo",
"Backup": "Copia de seguridad",
"ManageClients": "Gestionar Clientes",
@@ -696,12 +696,12 @@
"TotalSpace": "Espacio Total",
"IndexerDownloadClientHealthCheckMessage": "Indexadores con clientes de descarga inválidos: {0}.",
"ManageImportLists": "Gestionar Listas de Importación",
"ConnectionLostToBackend": "{appName} ha perdido su conexión con el backend y tendrá que ser recargado para recuperar su funcionalidad.",
"ConnectionLostToBackend": "{appName} ha perdido su conexión con el backend y tendrá que ser recargado para restaurar su funcionalidad.",
"NotificationStatusSingleClientHealthCheckMessage": "Listas no disponibles debido a errores: {0}",
"NotificationStatusAllClientHealthCheckMessage": "Las notificaciones no están disponibles debido a fallos",
"NotificationStatusAllClientHealthCheckMessage": "Las notificaciones no están disponibles debido a errores",
"ReleaseProfiles": "Perfiles de lanzamiento",
"Small": "Pequeño",
"DeleteImportList": "Eliminar Lista(s) de Importación",
"DeleteImportList": "Eliminar lista de importación",
"Large": "Grande",
"Library": "Biblioteca",
"SomeResultsAreHiddenByTheAppliedFilter": "Algunos resultados están ocultos por el filtro aplicado",
@@ -710,16 +710,16 @@
"LastExecution": "Última Ejecución",
"LastWriteTime": "Última Fecha de Escritura",
"ConnectionLost": "Conexión perdida",
"ConnectionLostReconnect": "{appName} intentará conectarse automáticamente, o puede hacer clic en recargar abajo.",
"ConnectionLostReconnect": "{appName} intentará conectarse automáticamente, o puedes pulsar en recargar abajo.",
"NextExecution": "Siguiente ejecución",
"NoResultsFound": "Ningún resultado encontrado",
"RecentChanges": "Cambios recientes",
"WhatsNew": "Que es lo nuevo?",
"WhatsNew": "¿Qué hay nuevo?",
"Loading": "Cargando",
"Events": "Eventos",
"Medium": "Mediano",
"AllResultsAreHiddenByTheAppliedFilter": "Todos los resultados están ocultos por el filtro aplicado",
"CatalogNumber": "número de catálogo",
"CatalogNumber": "Número de catálogo",
"Authors": "Autores",
"AuthorEditor": "Editor de Autor",
"Author": "Autor",
@@ -744,33 +744,33 @@
"Book": "Libro",
"AutomaticallySwitchEdition": "Cambiar edición automáticamente",
"BookNaming": "Nombrado de libros",
"Books": "Libro",
"Books": "Libros",
"NoHistoryBlocklist": "Sin historial de la lista de bloqueos",
"WouldYouLikeToRestoreBackup": "Te gustaria restaurar la copia de seguridad '{name}'?",
"IsShowingMonitoredUnmonitorSelected": "Monitorizar Seleccionados",
"CloneCustomFormat": "Clonar formato personalizado",
"MinimumCustomFormatScoreHelpText": "Puntuación mínima de formato personalizado necesaria para evitar el retraso del protocolo preferido",
"BypassIfAboveCustomFormatScore": "Omitir si está por encima de la puntuación del formato personalizado",
"BypassIfAboveCustomFormatScore": "Ignorar si está por encima de la puntuación del formato personalizado",
"BypassIfAboveCustomFormatScoreHelpText": "Habilitar ignorar cuando la versión tenga una puntuación superior a la puntuación mínima configurada para el formato personalizado",
"IsShowingMonitoredMonitorSelected": "Monitorizar Seleccionados",
"ClientPriority": "Prioridad del Cliente",
"ColonReplacement": "Reemplazar dos puntos",
"CloneProfile": "Clonar Perfil",
"Close": "Cerrar",
"CloneIndexer": "Clonar Indexer",
"CloneIndexer": "Clonar indexador",
"CompletedDownloadHandling": "Manipulación de descargas completas",
"EnableProfile": "Habilitar perfil",
"ListsSettingsSummary": "lista de importación",
"ExtraFileExtensionsHelpText": "Lista de archivos adicionales separados por coma para importar (.nfo será importado como .nfo-orig)",
"ExtraFileExtensionsHelpTextsExamples": "Ejemplos: '.sub, .nfo' o 'sub,nfo'",
"ImportLists": "Importar listas",
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "El cliente de descarga {downloadClientName} esta configurado para eliminar las descargas completadas. Esto puede causar que las descargas sean eliminadas del cliente antes que {1} las pueda importar.",
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "El cliente de descarga {downloadClientName} está configurado para eliminar las descargas completadas. Esto puede causar que las descargas sean eliminadas de tu cliente antes de que {1} pueda importarlas.",
"Continuing": "Continua",
"DownloadClientQbittorrentSettingsContentLayout": "Diseño del contenido",
"InvalidUILanguage": "Su interfaz de usuario está configurada en un idioma no válido, corríjalo y guarde la configuración",
"NoCutoffUnmetItems": "Sin objetos sin condiciones de corte incumplidas",
"NoCutoffUnmetItems": "Ningún elemento con límite no alcanzado",
"StatusEndedContinuing": "Continua",
"ChownGroup": "Cambiar grupo propietario",
"ChownGroup": "chown grupo",
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Si usar el diseño de contenido configurado de qBittorrent, el diseño original del torrent o siempre crear una subcarpeta (qBittorrent 4.3.2+)",
"CustomFormatsSpecificationRegularExpression": "Expresión regular",
"ErrorLoadingContent": "Hubo un error cargando este contenido",
@@ -803,19 +803,19 @@
"NoImportListsFound": "Ninguna lista de importación encontrada",
"Monitoring": "Monitorizando",
"NoMissingItems": "No hay elementos faltantes",
"DefaultMetadataProfileIdHelpText": "Perfil de metadatos predeterminado para los artistas detectados en esta carpeta",
"MetadataProfileIdHelpText": "Los elementos de la lista del Perfil de Calidad se añadirán con",
"DefaultQualityProfileIdHelpText": "Perfil de calidad predeterminado para los artistas detectados en esta carpeta",
"ContinuingAllBooksDownloaded": "Continúa (Todas las pistas descargadas)",
"DataListMonitorAll": "Supervisar los artistas y todos los álbumes de cada artista incluido en la lista de importación",
"DefaultMetadataProfileIdHelpText": "Perfil de metadatos predeterminado para los autores detectados en esta carpeta",
"MetadataProfileIdHelpText": "Los elementos de la lista del perfil de metadatos que deberían ser añadidos",
"DefaultQualityProfileIdHelpText": "Perfil de calidad predeterminado para los autores detectados en esta carpeta",
"ContinuingAllBooksDownloaded": "Continúa (Todos los libros descargados)",
"DataListMonitorAll": "Monitoriza los autores y todos los álbumes de cada artista incluido en la lista de importación",
"MetadataSettingsSummary": "Crea archivos de metadatos cuando los episodios son importados o las series son refrescadas",
"MonitoredAuthorIsUnmonitored": "El artista no está vigilado",
"SearchForAllCutoffUnmetBooks": "Buscar todos los episodios en Umbrales no alcanzados",
"ConsoleLogLevel": "Nivel de Registro de la Consola",
"DataMissingBooks": "Monitoriza episodios que no tienen archivos o que no se han emitido aún",
"SearchForAllCutoffUnmetBooks": "Buscar todos los libros con límites no alcanzados",
"ConsoleLogLevel": "Nivel de registro de consola",
"DataMissingBooks": "Monitoriza libros que no tienen archivos o que no se han lanzado aún",
"EnabledHelpText": "Señalar para habilitar el perfil de lanzamiento",
"FilterAnalyticsEvents": "Filtrar Eventos Analíticos",
"FilterSentryEventsHelpText": "Filtrar eventos de error de usuario conocidos para que no se envíen como Análisis",
"FilterAnalyticsEvents": "Filtrar eventos analíticos",
"FilterSentryEventsHelpText": "Filtrar eventos de error de usuario conocidos para que no se envíen como Analíticas",
"RootFolderPathHelpText": "Los elementos de la lista de carpetas raíz se añadirán a",
"StatusEndedDeceased": "Fallecido",
"LogRotateHelpText": "Número máximo de archivos de registro que se guardan en la carpeta de registros",
@@ -823,9 +823,9 @@
"QualityProfileIdHelpText": "Los elementos de la lista del Perfil de Calidad se añadirán con",
"SelectDropdown": "Seleccionar...",
"CollapseMultipleBooksHelpText": "Colapsar varios álbumes que salen el mismo día",
"ContinuingNoAdditionalBooksAreExpected": "No se esperan álbumes adicionales",
"DefaultMonitorOptionHelpText": "Qué álbumes se deben supervisar en la adición inicial para los artistas detectados en esta carpeta",
"CustomFilter": "Filtros personalizados",
"ContinuingNoAdditionalBooksAreExpected": "No se esperan libros adicionales",
"DefaultMonitorOptionHelpText": "Qué libros deberían ser monitorizados en la adición inicial para los autores detectados en esta carpeta",
"CustomFilter": "Filtro personalizado",
"LabelIsRequired": "Se requiere etiqueta",
"RemoveQueueItemConfirmation": "¿Estás seguro que quieres eliminar '{sourceTitle}' de la cola?",
"SelectQuality": "Seleccionar calidad",
@@ -845,5 +845,248 @@
"RemoveMultipleFromDownloadClientHint": "Elimina descargas y archivos del cliente de descarga",
"RemoveQueueItem": "Eliminar - {sourceTitle}",
"RemoveQueueItemRemovalMethodHelpTextWarning": "'Eliminar del cliente de descarga' eliminará la descarga y el archivo(s) del cliente de descarga.",
"RemoveQueueItemsRemovalMethodHelpTextWarning": "'Eliminar del cliente de descarga' eliminará las descargas y los archivos del cliente de descarga."
"RemoveQueueItemsRemovalMethodHelpTextWarning": "'Eliminar del cliente de descarga' eliminará las descargas y los archivos del cliente de descarga.",
"EndedAllBooksDownloaded": "FInalizado (Todos los libros descargados)",
"ClickToChangeIndexerFlags": "Pulsa para cambiar los indicadores del indexador",
"CustomFormatsSpecificationFlag": "Indicador",
"IndexerFlags": "Indicadores del indexador",
"NotificationsSettingsUpdateMapPathsFrom": "Mapear rutas desde",
"NotificationsSettingsUpdateMapPathsFromHelpText": "Ruta de {appName}, usado para modificar rutas de series cuando {serviceName} ve la ubicación de ruta de biblioteca de forma distinta a {appName} (Requiere 'Actualizar biblioteca')",
"NotificationsSettingsUpdateMapPathsTo": "Mapear rutas a",
"NotificationsSettingsUpdateMapPathsToHelpText": "Ruta de {appName}, usado para modificar rutas de series cuando {serviceName} ve la ubicación de ruta de biblioteca de forma distinta a {appName} (Requiere 'Actualizar biblioteca')",
"NotificationsSettingsUseSslHelpText": "Conectar a {serviceName} sobre HTTPS en vez de HTTP",
"Rejections": "Rechazados",
"SelectIndexerFlags": "Seleccionar indicadores del indexador",
"RecycleBinUnableToWriteHealthCheck": "No se pudo escribir en la carpeta configurada de la papelera de reciclaje: {path}. Asegúrate de que esta ruta existe y es modificable por el usuario que ejecuta {appName}",
"SearchForAllMissingBooks": "Buscar todos los episodios perdidos",
"IndexerIdHelpText": "Especifica a qué indexador se aplica el perfil",
"ProfilesSettingsSummary": "Perfiles de calidad, de retraso de idioma y de lanzamiento",
"DataExistingBooks": "Monitoriza libros que no tienen archivos o que no se han lanzado aún",
"MonitoredAuthorIsMonitored": "El artista no está vigilado",
"RemotePathMappingsInfo": "Los mapeos de ruta remota son muy raramente solicitados, si {appName} y tu cliente de descarga están en el mismo sistema es mejor coincidir sus rutas. Para más información consulta la [wiki]({wikiLink}).",
"ShowBannersHelpText": "Muestra carteles en lugar de nombres",
"DefaultTagsHelpText": "Etiquetas predeterminadas de Readarr para los autores detectados en esta carpeta",
"UseSSL": "Usar SSL",
"SetIndexerFlags": "Establecer indicadores del indexador",
"NotificationsPlexSettingsAuthenticateWithPlexTv": "Autenticar con Plex.tv",
"NotificationsSettingsUpdateLibrary": "Actualizar biblioteca",
"ConnectionSettingsUrlBaseHelpText": "Añade un prefijo a la url {connectionName}, como {url}",
"DownloadClientDelugeSettingsDirectory": "Directorio de descarga",
"DownloadClientDelugeSettingsDirectoryCompleted": "Directorio al que mover cuando se complete",
"DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Ubicación opcional a la que mover las descargas completadas, dejar en blanco para usar la ubicación predeterminada de Deluge",
"DownloadClientDelugeSettingsDirectoryHelpText": "Ubicación opcional en la que poner las descargas, dejar en blanco para usar la ubicación predeterminada de Deluge",
"InteractiveSearchModalHeader": "Búsqueda interactiva",
"NotificationsPlexSettingsAuthToken": "Token de autenticación",
"CustomFormatsSettingsTriggerInfo": "Un formato personalizado será aplicado al lanzamiento o archivo cuando coincida con al menos uno de los diferentes tipos de condición elegidos.",
"ShouldSearchHelpText": "Buscar indexadores para elementos añadido recientemente. Usar con precaución en listas largas.",
"ShowTitleHelpText": "Mostrar nombre de autor debajo del póster",
"SkipBooksWithNoISBNOrASIN": "Saltar libros sin ISBN o ASIN",
"UnableToLoadMetadataProviderSettings": "No se pudo cargar las opciones del proveedor de metadatos",
"LoadingEditionsFailed": "La carga de ediciones falló",
"MetadataSourceHelpText": "Fuente de metadatos alternativa (Dejar en blanco para el valor predeterminado)",
"MinPagesHelpText": "Ignorar libros con menos páginas que estas",
"MonitorNewBooks": "Monitorizar nuevos libros",
"MonitorNewItems": "Monitorizar nuevos libros",
"NoTagsHaveBeenAddedYet": "Ninguna etiqueta ha sido añadida aún. Añade etiquetas a enlaces de autores con perfiles de retraso, restricciones o notificaciones. Pulsa en {0} para descubrir más acerca de las etiquetas en Readarr.",
"OnBookRetagHelpText": "En libro reetiquetado",
"OnDownloadFailureHelpText": "En fallo de descarga",
"PathHelpTextWarning": "Debe ser diferente al directorio donde tu cliente de descarga pone los archivos",
"TrackNumber": "Número de pista",
"WriteTagsSync": "Todos los archivos; mantener sincronizados con Goodreads",
"LatestBook": "El último libro",
"CollapseMultipleBooks": "Colapsar múltiples libros",
"DataListMonitorNone": "No monitorizar autores o libros",
"Iso639-3": "Códigos de idioma ISO 639-3, o 'nulo', separados por coma",
"MinPopularityHelpText": "Popularidad es la media de valoraciones * número de votos",
"DeleteSelected": "Eliminar seleccionados",
"IsExpandedShowFileInfo": "Mostrar información de archivo",
"MassBookSearchWarning": "¿Estás seguro que quieres llevar a cabo una búsqueda masiva para {0} libros?",
"MonitorNewItemsHelpText": "Qué nuevos libros deberían ser monitorizados",
"NewBooks": "Nuevos libros",
"OnImportFailureHelpText": "En fallo de importación",
"ShowBookCount": "Mostrar recuento de libros",
"CalibreOutputFormat": "Formato de salida de Calibre",
"CalibreUrlBase": "Url base de Calibre",
"CalibreSettings": "Opciones de Calibre",
"CalibreUsername": "Usuario de Calibre",
"SearchForNewItems": "Buscar nuevos elementos",
"SearchForMonitoredBooks": "Buscar libros monitorizados",
"SeriesNumber": "Número de series",
"ShouldMonitorHelpText": "Monitoriza nuevos autores y libros añadidos desde esta lista",
"ShowLastBook": "Mostrar último libro",
"UseSslHelpText": "Usa SSL para conectarse al servidor de contenido de Calibre",
"Development": "Desarrollo",
"DiscNumber": "Número de disco",
"DownloadPropersAndRepacksHelpTexts2": "Usar 'No preferir' para ordenar por puntuación de palabra preferida sobre propers/repacks",
"DiscCount": "Recuento de disco",
"ImportListSettings": "Opciones generales de lista de importación",
"DataFutureBooks": "Monitoriza libros que no hayan sido lanzados aún",
"EditBook": "Editar libro",
"EnableAutomaticAddHelpText": "Añadir autor/libros a Readarr cuando las sincronizaciones sean llevadas a cabo a través de la interfaz o por Readarr",
"ExistingBooks": "Libros existentes",
"FilesTotal": "Archivos ({0})",
"IgnoreDeletedBooks": "Ignorar libros borrados",
"MinimumPages": "Páginas mínimas",
"SearchBook": "Buscar libro",
"SeriesTotal": "Series ({0})",
"MassBookSearch": "Búsqueda masiva de libros",
"MinimumPopularity": "Popularidad mínima",
"MonitorBook": "Monitorizar libro",
"MusicBrainzRecordingID": "ID de grabación de MusicBrainz",
"NETCore": ".NET Core",
"WriteAudioTags": "Etiquetar archivos de audio con metadatos",
"PastDays": "Días pasados",
"WriteTagsAll": "Todos los archivos; solo importación inicial",
"ReadarrSupportsMultipleListsForImportingBooksAndAuthorsIntoTheDatabase": "Readarr soporta múltiples listas para importar libros y autores en la base de datos.",
"ConvertToFormat": "Convertir a formato",
"DataNone": "Ningún libro será monitorizado",
"NameFirstLast": "Primer nombre, último nombre",
"OnAuthorDelete": "En autor borrado",
"WriteTagsNew": "Solo para nuevas descargas",
"EmbedMetadataHelpText": "Decir a Calibre que escriba los metadatos en el archivo de libro actual",
"FutureDaysHelpText": "Días para que el canal de iCal busque en el futuro",
"ImportFailures": "Importar fallos",
"LibraryHelpText": "Nombre de la biblioteca del servidor de contenido de Calibre. Dejar en blanco para el valor predeterminado.",
"PreviewRetag": "Vista previa de reetiquetado",
"FutureBooks": "Libros futuros",
"ISBN": "ISBN",
"IsCalibreLibraryHelpText": "Usar el servidor de contenido de Calibre para manipular bibliotecas",
"DeleteBookFile": "Borrar archivo de libro",
"EditList": "Editar lista",
"HasMonitoredBooksNoMonitoredBooksForThisAuthor": "Libros no monitorizados para este autor",
"IgnoredMetaHelpText": "Los libros serán ignorados si contienen uno o más de los siguientes términos (insensible a mayúsculas)",
"IsExpandedHideBooks": "Esconder libros",
"LogSQL": "Registro SQL",
"MusicbrainzId": "ID de MusicBrainz",
"OnBookTagUpdate": "En actualización de etiqueta de libro",
"PasswordHelpText": "Contraseña del servidor de contenido de Calibre",
"OnAuthorAddedHelpText": "En autor añadido",
"ShouldMonitorExistingHelpText": "Monitoriza automáticamente libros en esta lista que ya están en Readarr",
"UrlBaseHelpText": "Añade un prefijo a la url de Calibre, p. ej. http://[host]:[puerto]/[urlBase]",
"TotalBookCountBooksTotalBookFileCountBooksWithFilesInterp": "{0} libros en total. {1} libros con archivos.",
"UseCalibreContentServer": "Usar el servidor de contenido de Calibre",
"ContinuingMoreBooksAreExpected": "Se esperan más libros",
"DataAllBooks": "Monitorizar todos los libros",
"IsInUseCantDeleteAMetadataProfileThatIsAttachedToAnAuthorOrImportList": "No se puede eliminar un perfil de metadatos que está enlazado a un autor o a una lista de importación",
"MetadataConsumers": "Consumidores de metadatos",
"MonitorExistingBooks": "Monitorizar libros existentes",
"UpdateCovers": "Actualizar cubiertas",
"UpdateCoversHelpText": "Establece las cubiertas de libros en Calibre para que coincidan en Readarr",
"SkipRedownloadHelpText": "Evita que Readarr intente descargar lanzamientos alternativos para los elementos borrados",
"EntityName": "Nombre de entidad",
"CalibreLibrary": "Biblioteca de Calibre",
"DeleteMetadataProfile": "Eliminar el perfil de metadatos",
"PathHelpText": "Carpeta raíz que contiene tu biblitoteca de libros",
"ForeignIdHelpText": "La ID de Musicbrainz del autor/libro a excluir",
"HostHelpText": "Host del servidor de contenido de Calibre",
"MetadataProviderSource": "Fuente del proveedor de metadatos",
"MonitorAuthor": "Monitorizar autor",
"MusicBrainzAuthorID": "ID de autor de MusicBrainz",
"RefreshBook": "Refrescar libro",
"RefreshInformation": "Refrescar información",
"RenameBooks": "Renombrar libros",
"EditAuthor": "Editar autor",
"EditionsHelpText": "Cambiar edición para este libro",
"ShouldMonitorExisting": "Monitorizar libros existentes",
"EmbedMetadataInBookFiles": "Metadatos incrustados en archivos de libro",
"ExistingTagsScrubbed": "Etiquetas existentes borradas",
"GoToAuthorListing": "Ir al listado de autor",
"MusicBrainzReleaseID": "ID de lanzamiento de MusicBrainz",
"SpecificBook": "Libro específico",
"BookTitle": "Título de libro",
"CalibreContentServer": "Servidor de contenido de Calibre",
"CalibreHost": "Host de Calibre",
"BypassIfHighestQualityHelpText": "Evita el retardo cuando el lanzamiento tiene la calidad más alta habilitada en el perfil de calidad",
"DeleteFilesHelpText": "Elimina los archivos del libro y carpeta del autor",
"FutureDays": "Días futuros",
"SearchBoxPlaceHolder": "P. ej. Guerra y Paz, goodreads:656, isbn:067003469X, asin: B00JCDK5ME",
"MissingBooks": "Libros perdidos",
"MissingBooksAuthorNotMonitored": "Libros perdidos (Autor no monitorizado)",
"SendMetadataToCalibre": "Enviar metadatos a Calibre",
"SkipSecondarySeriesBooks": "Saltar libros de series secundarias",
"DataNewBooks": "Monitoriza libros nuevos lanzados después del libro más nuevo existente",
"DataNewNone": "No monitorizar ningún libro nuevo",
"WriteMetadataTags": "Escribir etiquetas de metadatos",
"IndexerIdHelpTextWarning": "Usar un indexador específico con palabras preferidas puede provocar que se capturen lanzamientos duplicados",
"IsInUseCantDeleteAQualityProfileThatIsAttachedToAnAuthorOrImportList": "No se puede eliminar un perfil de calidad que está enlazado a un autor o a una lista de importación",
"NoName": "No mostrar nombre",
"OnBookDelete": "En libro borrado",
"PortHelpText": "Puerto del servidor de contenido de Calibre",
"WriteAudioTagsScrub": "Limpiar las etiquetas existentes",
"SetReadarrTags": "Establecer etiquetas de Readarr",
"ForeignId": "ID foránea",
"BooksTotal": "Libros ({0})",
"CalibreMetadata": "Metadatos de Calibre",
"CalibreNotCalibreWeb": "Readarr puede interconectarse con el servidor de contenido de Calibre. No puede usar Calibre web, que es software no relacionado.",
"OnDownloadFailure": "En fallo de descarga",
"SkipPartBooksAndSets": "Saltar partes y conjuntos de libros",
"FilterAuthor": "Filtrar autor",
"FilterPlaceHolder": "Filtrar libro",
"ImportListSpecificSettings": "Opciones específicas de lista de importación",
"ItsEasyToAddANewAuthorOrBookJustStartTypingTheNameOfTheItemYouWantToAdd": "Es fácil añadir un nuevo autor o libro empezando a escribir solo el nombre del elemento que quieras añadir",
"ManualDownload": "Descarga manual",
"MissingBooksAuthorMonitored": "Libros perdidos (Autor monitorizado)",
"MonitoredHelpText": "Readarr buscará y descargará el libro",
"MusicBrainzBookID": "ID de libro de MusicBrainz",
"MusicBrainzTrackID": "ID de pista de MusicBrainz",
"OnAuthorDeleteHelpText": "En autor borrado",
"OnBookDeleteHelpText": "En libro borrado",
"OnReleaseImport": "En importación de lanzamiento",
"OnReleaseImportHelpText": "En importación de lanzamiento",
"OnImportFailure": "En fallo de importación",
"OutputFormatHelpText": "Pregunta opcionalmente a Calibre para que convierta a otros formatos al importar. Lista separada por coma.",
"PastDaysHelpText": "Días para que el canal de iCal busque en el pasado",
"ShowName": "Mostrar nombre",
"SkipBooksWithMissingReleaseDate": "Saltar libros con fechas de lanzamientos faltantes",
"TheFollowingFilesWillBeDeleted": "Los siguientes archivos serán eliminados:",
"UpdatingIsDisabledInsideADockerContainerUpdateTheContainerImageInstead": "Actualizar se encuentra deshabilitado en un contenedor docker. Actualiza la imagen del contenedor en su lugar.",
"WriteAudioTagsScrubHelp": "Borra las etiquetas existentes de los archivos, dejando solo aquellas añadidas por Readarr.",
"ExistingItems": "Elementos existentes",
"AuthorProgressBarText": "{availableBookCount} / {bookCount} (Total: {totalBookCount}, Archivos: {bookFileCount})",
"BookProgressBarText": "{bookCount} / {totalBookCount} (Archivos: {bookFileCount})",
"SelectBook": "Seleccionar libro",
"FileDetails": "Detalles de archivo",
"Bookshelf": "Estantería",
"DataFirstBook": "Monitorizar el primer libro. El resto de libros serán ignorados",
"DataListMonitorSpecificBook": "Monitoriza autores, pero solo monitoriza libros explícitamente incluidos en la lista",
"TagsHelpText": "Se aplica a autores con al menos una etiqueta coincidente. Dejar en blanco para aplicar a todos los autores",
"CalibreContentServerText": "Usar un servidor de contenido de Calibre (no Calibre web) permite a Readarr añadir libros a tu biblioteca de Calibre y disparar las conversiones entre formatos",
"TooManyBooks": "¿Libros perdidos o demasiados de ellos? Modifica o crea uno nuevo",
"IfYouDontAddAnImportListExclusionAndTheAuthorHasAMetadataProfileOtherThanNoneThenThisBookMayBeReaddedDuringTheNextAuthorRefresh": "Si no añades una exclusión de lista de importación y el autor tiene un perfil de metadatos distinto de 'Ninguno', entonces este libro puede ser de nuevo añadido durante el siguiente refresco de autor.",
"MonitoringOptionsHelpText": "Qué libros deberían ser monitorizados una vez el autor sea añadido (ajuste único)",
"DataLatestBook": "Monitoriza el último libro y futuros libros",
"DataNewAllBooks": "Monitorizar todos los libros nuevos",
"DefaultReadarrTags": "Etiquetas predeterminadas de Readarr",
"DeleteFormat": "Eliminar formato",
"FirstBook": "Primer libro",
"HideBooks": "Esconder libros",
"IsExpandedHideFileInfo": "Esconder información de archivo",
"IsExpandedShowBooks": "Mostrar libros",
"LogSqlHelpText": "Registra todas las peticiones SQL de Readarr",
"NameLastFirst": "Último nombre, primer nombre",
"NameStyle": "Estilo de nombre de autor",
"RefreshAuthor": "Refrescar autor",
"SelectEdition": "Seleccionar edición",
"SelectedCountAuthorsSelectedInterp": "{0} autor(es) seleccionado(s)",
"TagsSettingsSummary": "Gestionar autor, perfil, restricción y etiquetas de notificación",
"TheBooksFilesWillBeDeleted": "Los archivos del libro serán eliminados.",
"TrackTitle": "Título de pista",
"UsernameHelpText": "Usuario del servidor de contenido de Calibre",
"WatchLibraryForChangesHelpText": "Vuelve a escanear automáticamente cuando los archivos cambien en una carpeta raíz",
"WatchRootFoldersForFileChanges": "Supervisar las carpetas raíz para cambios de archivos",
"WriteBookTagsHelpTextWarning": "Seleccionar 'Todos los archivos' alterará los archivos existentes cuando son importados.",
"MonitorBookExistingOnlyWarning": "Esto es un ajuste único de la configuración monitorizada para cada libro. Utiliza la opción debajo de Autor/Editar para controlar lo que ocurre con los libros recién añadidos",
"UnmappedFiles": "Archivos sin mapear",
"CountAuthorsSelected": "{selectedCount} autor(es) seleccionados",
"CalibreOutputProfile": "Perfil de salida de Calibre",
"CalibrePassword": "Contraseña de Calibre",
"CalibrePort": "Puerto de Calibre",
"InteractiveSearchModalHeaderBookAuthor": "Búsqueda interactiva - {bookTitle} por {authorName}",
"OnAuthorAdded": "En autor añadido",
"IndexerSettingsSeedRatio": "Ratio de sembrado",
"IndexerSettingsSeedRatioHelpText": "El ratio que un torrent debería alcanzar antes de parar, vacío usa el predeterminado del cliente de descarga. El ratio debería ser al menos 1.0 y seguir las reglas de los indexadores",
"IndexerSettingsSeedTime": "Tiempo de sembrado",
"IndexerSettingsSeedTimeHelpText": "El tiempo que un torrent debería ser sembrado antes de parar, vacío usa el predeterminado del cliente de descarga",
"FailedLoadingSearchResults": "Error al cargar los resultados de la busqueda, prueba otra vez.",
"WhySearchesCouldBeFailing": "Pulsa aquí para descubrir por qué las búsquedas podrían estar fallando"
}

View File

@@ -50,7 +50,7 @@
"ChownGroupHelpText": "Ryhmän nimi tai GID. Käytä GID:tä etätiedostojärjestelmille.",
"ChownGroupHelpTextWarning": "Toimii vain, jos {appName}in suorittava käyttäjä on tiedoston omistaja. On parempi varmistaa, että lataustyökalu käyttää samaa ryhmää kuin {appName}.",
"Clear": "Tyhjennä",
"ClickToChangeQuality": "Vaihda laatua klikkaamalla",
"ClickToChangeQuality": "Vaihda laatua painamalla tästä",
"ClientPriority": "Lataustyökalun painotus",
"CloneIndexer": "Monista tietolähde",
"CloneProfile": "Monista profiili",
@@ -204,7 +204,7 @@
"MinimumLimits": "Vähimmäisrajoitukset",
"Missing": "Puuttuu",
"Mode": "Tila",
"Monitored": "Valvotut",
"Monitored": "Valvonta",
"MoreInfo": "Lisätietoja",
"MustContain": "Täytyy sisältää",
"MustNotContain": "Ei voi sisältää",
@@ -801,10 +801,10 @@
"ImportListMultipleMissingRoots": "Useita tuontilistojen juurikansioita puuttuu: {0}",
"IndexerDownloadClientHelpText": "Määritä tämän tietolähteen kanssa käytettävä lataustyökalu.",
"IndexerTagsHelpText": "Tietolähdettä käytetään vain vähintään yhdellä täsmäävällä tunnisteella merkityille kirjailijoille. Käytä kaikille jättämällä tyhjäksi.",
"HiddenClickToShow": "Piilotettu, näytä painalla",
"HiddenClickToShow": "Piilotettu, näytä painamalla tästä",
"HideAdvanced": "Piilota lisäasetukset",
"ShowAdvanced": "Näytä lisäasetukset",
"ShownClickToHide": "Näkyvissä, piilota painamalla",
"ShownClickToHide": "Näytetään, piilota painamalla tästä",
"ColonReplacement": "Kaksoispisteen korvaus",
"ReplaceWithDash": "Korvaa yhdysmerkillä",
"ReplaceWithSpaceDash": "Korvaa yhdistelmällä \"välilyönti yhdysmerkki\"",
@@ -983,12 +983,37 @@
"SelectQuality": "Valitse laatu",
"BlocklistAndSearch": "Estolista ja haku",
"IgnoreDownloads": "Ohita lataukset",
"CustomFilter": "Omat suodattimet",
"CustomFilter": "Oma suodatin",
"DashOrSpaceDashDependingOnName": "Yhdysmerkki tai välilyönti nimen perusteella",
"DoNotBlocklist": "Älä estä",
"IgnoreDownload": "Ohita lataus",
"RemoveQueueItem": "Poistetaan - {sourceTitle}",
"RemoveQueueItemConfirmation": "Haluatko varmasti poistaa kohteen \"{sourceTitle}\" jonosta?",
"SelectReleaseGroup": "Aseta julkaisuryhmä",
"BlocklistOnly": "Vain esto"
"BlocklistOnly": "Vain esto",
"IndexerFlags": "Tietolähteen liput",
"NotificationsSettingsUpdateMapPathsFrom": "Kohdista sijainnit lähteeseen",
"NotificationsSettingsUpdateMapPathsFromHelpText": "{appName}-sijainti, jonka mukaisesti sarjasijainteja muutetaan kun {serviceName} näkee kirjastosijainnin eri tavalla kuin {appName} (vaatii \"Päivitä kirjasto\" -asetuksen).",
"NotificationsSettingsUpdateMapPathsTo": "Kohdista sijainnit kohteeseen",
"NotificationsSettingsUpdateMapPathsToHelpText": "{serviceName}-sijainti, jonka mukaisesti sarjasijainteja muutetaan kun {serviceName} näkee kirjastosijainnin eri tavalla kuin {appName} (vaatii \"Päivitä kirjasto\" -asetuksen).",
"NotificationsSettingsUseSslHelpText": "Muodosta yhteys sovellukseen {serviceName} SSL-protokollan välityksellä.",
"Rejections": "Hylkäykset",
"NotificationsSettingsUpdateLibrary": "Päivitä kirjasto",
"ConnectionSettingsUrlBaseHelpText": "Lisää etuliite lataustuökalun {clientName} URL-osoitteeseen, kuten {url}.",
"DownloadClientDelugeSettingsDirectoryHelpText": "Valinnainen latuasten tallennussijainti. Käytä Aria2-oletusta jättämällä tyhjäksi.",
"InteractiveSearchModalHeader": "Manuaalihaku",
"NotificationsPlexSettingsAuthToken": "Todennustunniste",
"NotificationsPlexSettingsAuthenticateWithPlexTv": "Plex.tv-tunnistautuminen",
"ClickToChangeIndexerFlags": "Vaihda tietolähteen lippuja painamalla tästä",
"CustomFormatsSpecificationFlag": "Lippu",
"SelectIndexerFlags": "Valitse tietolähteen liput",
"SetIndexerFlags": "Aseta tietolähteen liput",
"LabelIsRequired": "Nimi on pakollinen",
"IndexerSettingsSeedRatio": "Jakosuhde",
"DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Valinnainen latuasten tallennussijainti. Käytä Aria2-oletusta jättämällä tyhjäksi.",
"IndexerSettingsSeedRatioHelpText": "Suhde, joka torrentin tulee saavuttaa ennen sen pysäytystä. Käytä lataustyökalun oletusta jättämällä tyhjäksi. Suhteen tulisi olla ainakin 1.0 ja noudattaa tietolähteen sääntöjä.",
"IndexerSettingsSeedTime": "Jakoaika",
"IndexerSettingsSeedTimeHelpText": "Aika, joka torrentia tulee jakaa ennen sen pysäytystä. Käytä lataustyökalun oletusta jättämällä tyhjäksi.",
"FailedLoadingSearchResults": "Hakutulosten lataus epäonnistui. Yritä uudelleen.",
"WhySearchesCouldBeFailing": "Selvitä miksi haku saattaa epäonnistua painamalla tästä"
}

View File

@@ -3,7 +3,7 @@
"45MinutesFourtyFive": "45 Minutes : {0}",
"60MinutesSixty": "60 Minutes : {0}",
"APIKey": "Clé API",
"About": "Tagalog",
"About": "À propos",
"AddListExclusion": "Ajouter une liste d'exclusion",
"BindAddressHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
"ApiKeyHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
@@ -112,7 +112,7 @@
"DiskSpace": "Espace disque",
"DownloadClient": "Client de téléchargement",
"DownloadClientSettings": "Télécharger les paramètres client",
"DownloadClients": "Clients de télécharg.",
"DownloadClients": "Clients de téléchargement",
"DownloadFailedCheckDownloadClientForMoreDetails": "Téléchargement échoué : voir le client de téléchargement pour plus de détails",
"DownloadFailedInterp": "Échec du téléchargement : {0}",
"DownloadPropersAndRepacksHelpTexts1": "S'il faut ou non mettre à niveau automatiquement vers Propres/Repacks",
@@ -484,9 +484,9 @@
"AppDataLocationHealthCheckMessage": "La mise à jour ne sera pas possible afin empêcher la suppression de AppData lors de la mise à jour",
"IndexerPriorityHelpText": "Priorité de l'indexeur de 1 (la plus élevée) à 50 (la plus basse). Par défaut : 25. Utilisé pour départager les versions lors des téléchargements. Readarr continuera d'utiliser tous les indexeurs activés pour les synchro RSS et les recherches.",
"Duration": "Durée",
"RemotePathMappingCheckBadDockerPath": "Vous utilisez docker ; le client de téléchargement {0} enregistre les téléchargements dans {1} mais ce n'est pas un chemin valide. Vérifiez vos paramètres de dossier distant et les paramètres de votre client de téléchargement.",
"RemotePathMappingCheckBadDockerPath": "Vous utilisez docker ; le client de téléchargement {0} enregistre les téléchargements dans {1} mais ce n'est pas un chemin {2} valide. Vérifiez vos mappages de chemins distants et les paramètres de votre client de téléchargement.",
"RemotePathMappingCheckDockerFolderMissing": "Vous utilisez docker; {0} enregistre les téléchargements dans {1} mais ce dossier n'est pas présent dans ce conteneur. Vérifiez vos paramètres de dossier distant et les paramètres de votre conteneur docker.",
"RemotePathMappingCheckFilesBadDockerPath": "Vous utilisez docker; {0} signifie les téléchargement dans {1} mais ce n'est pas un dossier valide. Vérifiez vos paramètres de dossier distant et les paramètres de votre client de téléchargement.",
"RemotePathMappingCheckFilesBadDockerPath": "Vous utilisez docker ; le client de téléchargement {0} a signalé des fichiers dans {1} mais ce n'est pas un chemin {2} valide. Vérifiez vos mappages de chemins distants et les paramètres de votre client de téléchargement.",
"RemotePathMappingCheckFilesWrongOSPath": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais il ne s'agit pas d'un chemin {2} valide. Vérifiez les paramètres de votre client de téléchargement.",
"RemotePathMappingCheckLocalFolderMissing": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais ce chemin ne semble pas exister. Vérifiez vos paramètres de chemins distants.",
"RemotePathMappingCheckRemoteDownloadClient": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais ce chemin ne semble pas exister. Vérifiez vos paramètres de chemins distants.",
@@ -518,7 +518,7 @@
"SearchFiltered": "Chercher les filtrés",
"SettingsRemotePathMappingLocalPath": "Chemin local",
"UpdateAvailable": "Une nouvelle mise à jour est disponible",
"DownloadClientsSettingsSummary": "Clients de téléchargement, gestion des téléchargements et mappages de chemins distants",
"DownloadClientsSettingsSummary": "Clients de téléchargement, gestion des téléchargements et mappages de chemins d'accès à distance",
"DownloadClientStatusCheckAllClientMessage": "Aucun client de téléchargement n'est disponible en raison d'échecs",
"ImportListStatusCheckAllClientMessage": "Toutes les listes ne sont pas disponibles en raison d'échecs",
"ImportMechanismHealthCheckMessage": "Activer la gestion des téléchargements terminés",
@@ -540,7 +540,7 @@
"FileWasDeletedByUpgrade": "Le fichier à été supprimé pour importer une version supérieure",
"Filters": "Filtres",
"General": "Général",
"GeneralSettingsSummary": "Port, SSL/TLS, nom d'utilisateur/mot de passe, proxy, analyses et mises à jour",
"GeneralSettingsSummary": "Port, SSL, nom d'utilisateur/mot de passe, proxy, analyses et mises à jour",
"HealthNoIssues": "Aucun problème avec votre configuration",
"ImportListStatusCheckSingleClientMessage": "Listes indisponibles en raison d'échecs: {0}",
"IndexerLongTermStatusCheckAllClientMessage": "Tous les indexeurs sont indisponibles en raison d'échecs de plus de 6 heures",
@@ -552,7 +552,7 @@
"OnBookFileDeleteForUpgrade": "À la suppression du fichier vidéo pour mise à niveau",
"OnBookFileDeleteForUpgradeHelpText": "À la suppression du fichier vidéo pour mise à niveau",
"OnBookFileDeleteHelpText": "À la suppression d'un fichier vidéo",
"OnGrab": "À saisir",
"OnGrab": "Lors de la saisie",
"OnHealthIssue": "Sur la question de la santé",
"OnRename": "Au renommage",
"ProxyCheckBadRequestMessage": "Échec du test du proxy. StatusCode: {0}",
@@ -809,7 +809,7 @@
"MinimumPopularity": "Popularité minimum",
"NoHistoryBlocklist": "Pas d'historique de liste noire",
"AppUpdatedVersion": "{appName} a été mis à jour vers la version `{version}`, pour profiter des derniers changements, vous devrez relancer {appName}",
"IndexerDownloadClientHealthCheckMessage": "Indexeurs avec des clients de téléchargement invalides : {0].",
"IndexerDownloadClientHealthCheckMessage": "Indexeurs avec des clients de téléchargement invalides : {0}.",
"MonitoringOptions": "Options de surveillance",
"OnDownloadFailure": "En cas d'échec de téléchargement",
"RootFolderPathHelpText": "Les éléments de la liste du dossier racine seront ajoutés à",
@@ -970,5 +970,31 @@
"DownloadClientDelugeSettingsDirectoryHelpText": "Emplacement dans lequel placer les téléchargements (facultatif), laissez vide pour utiliser l'emplacement Deluge par défaut",
"LabelIsRequired": "L'étiquette est requise",
"NotificationsSettingsUpdateMapPathsFromHelpText": "Chemin d'accès {appName}, utilisé pour modifier les chemins d'accès aux séries lorsque {serviceName} voit l'emplacement du chemin d'accès à la bibliothèque différemment de {appName} (Nécessite 'Mettre à jour la bibliothèque')",
"NotificationsSettingsUpdateMapPathsToHelpText": "Chemin {serviceName}, utilisé pour modifier les chemins des séries quand {serviceName} voit un chemin d'emplacement de bibliothèque différemment de {appName} (nécessite 'Mise à jour bibliothèque')"
"NotificationsSettingsUpdateMapPathsToHelpText": "Chemin {serviceName}, utilisé pour modifier les chemins des séries quand {serviceName} voit un chemin d'emplacement de bibliothèque différemment de {appName} (nécessite 'Mise à jour bibliothèque')",
"ClickToChangeIndexerFlags": "Cliquez pour changer les drapeaux de l'indexeur",
"CustomFormatsSpecificationFlag": "Drapeau",
"EditAuthor": "Éditer l'auteur",
"EditBook": "Modifier le livre",
"EditList": "Modifier la liste",
"AuthorProgressBarText": "{availableBookCount} / {bookCount} (Total: {totalBookCount}, Fichiers : {bookFileCount})",
"BookProgressBarText": "{bookCount} / {totalBookCount} (Fichiers : {bookFileCount})",
"CustomFormatsSettingsTriggerInfo": "Un format personnalisé sera appliqué à une version ou à un fichier lorsqu'il correspond à au moins un de chacun des différents types de conditions choisis.",
"IndexerFlags": "Drapeaux de l'indexeur",
"Rejections": "Rejets",
"SelectIndexerFlags": "Sélectionner les drapeaux de l'indexeur",
"SetIndexerFlags": "Définir les drapeaux de l'indexeur",
"NotificationsPlexSettingsAuthToken": "Jeton d'authentification",
"NotificationsPlexSettingsAuthenticateWithPlexTv": "S'authentifier avec Plex.tv",
"NotificationsSettingsUpdateLibrary": "Mettre à jour la bibliothèque",
"NotificationsSettingsUpdateMapPathsFrom": "Mapper les chemins depuis",
"NotificationsSettingsUseSslHelpText": "Se connecter à {serviceName} en HTTPS plutôt qu'en HTTP",
"NotificationsSettingsUpdateMapPathsTo": "Mapper les chemins vers",
"InteractiveSearchModalHeader": "Recherche interactive",
"FailedLoadingSearchResults": "Échec du chargement des résultats de recherche, veuillez réessayer.",
"MonitoredAuthorIsMonitored": "Artiste non surveillé",
"IndexerSettingsSeedRatio": "Ratio d'envoie",
"IndexerSettingsSeedRatioHelpText": "Le ratio qu'un torrent doit atteindre avant de s'arrêter, vide utilise la valeur par défaut du client de téléchargement. Le ratio doit être d'au moins 1.0 et suivre les règles des indexeurs",
"IndexerSettingsSeedTime": "Temps d'envoie",
"IndexerSettingsSeedTimeHelpText": "Durée pendant laquelle un torrent doit être envoyé avant de s'arrêter, vide utilise la valeur par défaut du client de téléchargement",
"WhySearchesCouldBeFailing": "Cliquez ici pour savoir pourquoi les recherches pourraient échouer"
}

View File

@@ -665,5 +665,8 @@
"CustomFilter": "מסננים מותאמים אישית",
"RemoveQueueItemConfirmation": "האם אתה בטוח שברצונך להסיר את {0} פריט {1} מהתור?",
"SourceTitle": "כותרת מקור",
"AutoRedownloadFailed": "הורדה נכשלה"
"AutoRedownloadFailed": "הורדה נכשלה",
"IndexerFlags": "אינדקס דגלים",
"InteractiveSearchModalHeader": "חיפוש אינטראקטיבי",
"FailedLoadingSearchResults": "טעינת תוצאות החיפוש נכשלה, נסה שוב."
}

View File

@@ -583,5 +583,59 @@
"RemoveSelectedItemBlocklistMessageText": "क्या आप वाकई चयनित आइटम को ब्लैकलिस्ट से हटाना चाहते हैं?",
"RemoveSelectedItemQueueMessageText": "क्या आप वाकई {0} आइटम {1} को कतार से हटाना चाहते हैं?",
"RemoveSelectedItemsQueueMessageText": "क्या आप वाकई {0} आइटम {1} को कतार से हटाना चाहते हैं?",
"NoEventsFound": "कोई घटना नहीं मिली"
"NoEventsFound": "कोई घटना नहीं मिली",
"ApplyTagsHelpTextHowToApplyAuthors": "चयनित फिल्मों के लिए टैग कैसे लागू करें",
"DeleteSelectedDownloadClients": "डाउनलोड क्लाइंट हटाएं",
"ExistingTag": "मौजूदा टैग",
"Events": "आयोजन",
"LastDuration": "lastDuration",
"NextExecution": "अगला निष्पादन",
"Yes": "हाँ",
"Small": "छोटा",
"InteractiveSearchModalHeader": "इंटरएक्टिव खोज",
"ExtraFileExtensionsHelpText": "आयात करने के लिए कोमा ने अतिरिक्त फ़ाइलों की सूची अलग कर दी (.nfo को .nfo- मूल के रूप में आयात किया जाएगा)",
"ExtraFileExtensionsHelpTextsExamples": "उदाहरण: '.sub, .nfo' या 'सब, nfo'",
"ConnectionLost": "संपर्क टूट गया",
"RecentChanges": "हाल में हुए बदलाव",
"ApplyTagsHelpTextAdd": "जोड़ें: टैग की मौजूदा सूची में टैग जोड़ें",
"No": "नहीं",
"System": "प्रणाली",
"SetTags": "टैग सेट करें",
"DeleteSelectedIndexers": "अनुक्रमणिका हटाएं",
"Activity": "गतिविधि",
"AddNew": "नया जोड़ें",
"Medium": "मध्यम",
"Backup": "बैकअप",
"ConnectionLostReconnect": "Radarr अपने आप कनेक्ट होने का प्रयास करेगा, या आप नीचे पुनः लोड कर सकते हैं।",
"RemoveQueueItemConfirmation": "क्या आप वाकई {0} आइटम {1} को कतार से हटाना चाहते हैं?",
"CustomFilter": "कस्टम फ़िल्टर",
"AutoRedownloadFailed": "डाउनलोड विफल",
"SourceTitle": "स्रोत शीर्षक",
"FreeSpace": "खाली जगह",
"ImportLists": "सूचियों",
"ListsSettingsSummary": "सूचियों",
"Location": "स्थान",
"SomeResultsAreHiddenByTheAppliedFilter": "कुछ परिणाम लागू फ़िल्टर द्वारा छिपे हुए हैं",
"TotalSpace": "कुल स्थान",
"WhatsNew": "नया क्या है?",
"ApplyTagsHelpTextHowToApplyDownloadClients": "चयनित फिल्मों के लिए टैग कैसे लागू करें",
"ApplyTagsHelpTextHowToApplyImportLists": "चयनित फिल्मों के लिए टैग कैसे लागू करें",
"ApplyTagsHelpTextRemove": "निकालें: दर्ज किए गए टैग निकालें",
"ApplyTagsHelpTextReplace": "प्रतिस्थापित करें: दर्ज किए गए टैगों के साथ टैग बदलें (सभी टैग्स को खाली करने के लिए कोई टैग दर्ज न करें)",
"AllResultsAreHiddenByTheAppliedFilter": "सभी परिणाम लागू फ़िल्टर द्वारा छिपे हुए हैं",
"ApplyTagsHelpTextHowToApplyIndexers": "चयनित फिल्मों के लिए टैग कैसे लागू करें",
"FailedLoadingSearchResults": "खोज परिणाम लोड करने में विफल, कृपया पुनः प्रयास करें।",
"IndexerFlags": "इंडेक्स फ्लैग",
"Large": "विशाल",
"LastExecution": "अंतिम निष्पादन",
"LastWriteTime": "अंतिम समय लिखें",
"NoChange": "कोई परिवर्तन नहीं होता है",
"NoResultsFound": "कोई परिणाम नहीं मिला",
"NotificationStatusAllClientHealthCheckMessage": "सभी सूचियाँ विफल होने के कारण अनुपलब्ध हैं",
"NotificationStatusSingleClientHealthCheckMessage": "विफलताओं के कारण अनुपलब्ध सूची: {0}",
"RedownloadFailed": "डाउनलोड विफल",
"RemovingTag": "टैग हटाना",
"SelectDropdown": "'चुनते हैं..।",
"SelectQuality": "गुणवत्ता का चयन करें",
"Ui": "यूआई"
}

View File

@@ -178,5 +178,21 @@
"UseProxy": "Koristi proxy",
"RemoveFilter": "Ukloni filter",
"Name": "Ime",
"Version": "Verzija"
"Version": "Verzija",
"ListsSettingsSummary": "Lista",
"ImportLists": "Lista",
"ImportListExclusions": "Dodaj na Listu Isključenja",
"Activity": "Aktivnost",
"AddNew": "Dodaj Novo",
"DeleteImportListExclusion": "Dodaj na Listu Isključenja",
"Events": "Događaj",
"Backup": "Sigurnosna kopija",
"AllResultsAreHiddenByTheAppliedFilter": "Svi rezultati su skriveni zbog primjenjenog filtera",
"HasPendingChangesSaveChanges": "Spremi izmjene",
"Library": "Biblioteka",
"RemoveQueueItemConfirmation": "Jeste li sigurni da želite izbrisati stavku {0} iz reda?",
"Size": " Veličina",
"SomeResultsAreHiddenByTheAppliedFilter": "Svi rezultati su skriveni zbog primjenjenog filtera",
"System": "Sustav",
"Ui": "Korisničko sučelje"
}

View File

@@ -1049,5 +1049,16 @@
"RemoveQueueItemRemovalMethod": "Eltávolítási módszer",
"RemoveQueueItemRemovalMethodHelpTextWarning": "Az „Eltávolítás a letöltési kliensből” eltávolítja a letöltést és a fájl(oka)t a letöltési kliensből.",
"RemoveQueueItemsRemovalMethodHelpTextWarning": "Az „Eltávolítás a letöltési kliensből” eltávolítja a letöltéseket és a fájlokat a letöltési kliensből.",
"OnAuthorAdded": "A szerző hozzáadva"
"OnAuthorAdded": "A szerző hozzáadva",
"DashOrSpaceDashDependingOnName": "Dash vagy Space Dash névtől függően",
"Rejections": "Elutasítások",
"BlocklistAndSearchHint": "Indítsa el a csere keresését a tiltólistázás után",
"DownloadClientDelugeSettingsDirectoryHelpText": "Választható hely a letöltések elhelyezéséhez, hagyja üresen az alapértelmezett Aria2 hely használatához",
"FailedLoadingSearchResults": "Nem sikerült betölteni a keresési eredményeket, próbálkozzon újra.",
"CustomFilter": "Egyedi Szűrők",
"IndexerFlags": "Indexer Zászló",
"InteractiveSearchModalHeader": "Interaktív Keresés",
"SelectDropdown": "Válassz...",
"SelectQuality": "Minőség kiválasztása",
"SelectReleaseGroup": "Release csoport kiválasztása"
}

View File

@@ -85,5 +85,12 @@
"Refresh": "Muat Ulang",
"ConnectionLostToBackend": "Koneksi {appName} telah terputus dari backend dan perlu dimuat ulang untuk dipulihkan.",
"ApplyChanges": "Terapkan Perubahan",
"History": "Riwayat"
"History": "Riwayat",
"20MinutesTwenty": "Indonesia",
"UnableToLoadTheCalendar": "Tidak dapat memuat kalender",
"CouldntFindAnyResultsForTerm": "Tidak ditemukan hasil untuk '{term}'",
"RedownloadFailed": "Pengunduhan Ulang Gagal",
"ConnectSettingsSummary": "Notifikasi, koneksi ke server/pemutar media, dan script khusus",
"AutoRedownloadFailed": "Pengunduhan Ulang Gagal",
"StatusEndedContinuing": "Berlanjut"
}

View File

@@ -728,5 +728,42 @@
"ConnectionLost": "Connessione Persa",
"AppUpdated": "{appName} Aggiornato",
"AllResultsAreHiddenByTheAppliedFilter": "Tutti i risultati sono nascosti dal filtro applicato",
"AutoRedownloadFailed": "Download fallito"
"AutoRedownloadFailed": "Download fallito",
"AddListExclusion": "Aggiungi elenco esclusioni",
"Location": "Posizione",
"ListsSettingsSummary": "Liste",
"RecentChanges": "Cambiamenti recenti",
"IndexerFlags": "Flags dell'Indicizzatore",
"ExtraFileExtensionsHelpText": "Liste di file Extra da importare separate da virgola (.nfo saranno importate come .nfo-orig)",
"ExtraFileExtensionsHelpTextsExamples": "Esempi: '.sub, .nfo' or 'sub,nfo'",
"Large": "Grande",
"LastDuration": "Ultima Durata",
"LastExecution": "Ultima esecuzione",
"System": "Sistema",
"TotalSpace": "Spazio Totale",
"LastWriteTime": "Orario di Ultima Scrittura",
"NotificationStatusSingleClientHealthCheckMessage": "Applicazioni non disponibili a causa di errori: {0}",
"Small": "Piccolo",
"Events": "Eventi",
"FreeSpace": "Spazio Libero",
"ConnectionLostToBackend": "Radarr ha perso la connessione al backend e dovrà essere ricaricato per ripristinare la funzionalità.",
"NoResultsFound": "nessun risultato trovato",
"SourceTitle": "Titolo Sorgente",
"NextExecution": "Prossima esecuzione",
"SelectDropdown": "'Selezionare...",
"AppUpdatedVersion": "{appName} è stato aggiornato alla versione `{version}`, per vedere le modifiche devi ricaricare {appName}",
"ConnectionLostReconnect": "Radarr cercherà di connettersi automaticamente, oppure clicca su ricarica qui sotto.",
"CustomFilter": "Filtri Personalizzati",
"FailedLoadingSearchResults": "Caricamento dei risultati della ricerca fallito, prova ancora.",
"ImportLists": "Liste",
"InteractiveSearchModalHeader": "Ricerca interattiva",
"Library": "Libreria",
"Medium": "medio",
"NotificationStatusAllClientHealthCheckMessage": "Tutte le applicazioni non sono disponibili a causa di errori",
"ReleaseProfiles": "profilo release",
"RemoveQueueItemConfirmation": "Sei sicuro di voler rimuovere {0} dalla coda?",
"SelectQuality": "Seleziona qualità",
"SomeResultsAreHiddenByTheAppliedFilter": "Tutti i risultati sono nascosti dai filtri applicati",
"Ui": "Interfaccia",
"WhatsNew": "Cosa c'è di nuovo?"
}

View File

@@ -634,5 +634,8 @@
"CustomFilter": "カスタムフィルター",
"RemoveQueueItemConfirmation": "キューから{0}アイテム{1}を削除してもよろしいですか?",
"SourceTitle": "ソースタイトル",
"AutoRedownloadFailed": "ダウンロードに失敗しました"
"AutoRedownloadFailed": "ダウンロードに失敗しました",
"FailedLoadingSearchResults": "検索結果の読み込みに失敗しました。もう一度お試しください。",
"IndexerFlags": "インデクサフラグ",
"InteractiveSearchModalHeader": "インタラクティブ検索"
}

View File

@@ -625,5 +625,8 @@
"RemoveQueueItemConfirmation": "대기열에서 {0} 항목 {1}을 제거하시겠습니까?",
"SelectQuality": "품질 선택",
"SourceTitle": "소스 제목",
"AutoRedownloadFailed": "다운로드 실패함"
"AutoRedownloadFailed": "다운로드 실패함",
"InteractiveSearchModalHeader": "대화형 검색",
"IndexerFlags": "인덱서 플래그",
"FailedLoadingSearchResults": "검색 결과를 불러오지 못했습니다. 다시 시도하십시오."
}

View File

@@ -655,5 +655,78 @@
"ChownGroup": "chown groep",
"AutomaticUpdatesDisabledDocker": "Automatische updates zijn niet ondersteund wanneer je het docker update mechanisme gebruikt. Je dient de container image up te daten buiten {appName} om of een script te gebruiken",
"ChangeCategory": "Verander categorie",
"WouldYouLikeToRestoreBackup": "Wilt u de back-up {name} herstellen?"
"WouldYouLikeToRestoreBackup": "Wilt u de back-up {name} herstellen?",
"Required": "Benodigd",
"RemoveSelectedItemsQueueMessageText": "Weet je zeker dat je {0} van de wachtrij wilt verwijderen?",
"BlocklistReleaseHelpText": "Voorkom dat {appName} deze release nogmaals automatisch ophaalt",
"DeleteRemotePathMapping": "Bewerk Externe Pad Verwijzing",
"Negated": "Genegeerd",
"No": "Nee",
"NoChange": "Geen Wijziging",
"ApplyTagsHelpTextHowToApplyAuthors": "Hoe tags toe te passen op de geselecteerd films",
"CountDownloadClientsSelected": "{count} download client(s) geselecteerd",
"DeleteConditionMessageText": "Bent u zeker dat u de lijst '{name}' wilt verwijderen?",
"FreeSpace": "Vrije Ruimte",
"ImportLists": "importlijst",
"TotalSpace": "Totale Ruimte",
"CatalogNumber": "catalogusnummer",
"NotificationStatusAllClientHealthCheckMessage": "Alle applicaties onbeschikbaar door fouten",
"RemovingTag": "Tag verwijderen",
"Yes": "Ja",
"DeleteSelectedDownloadClients": "Verwijder Downloader",
"IndexerFlags": "Indexeerder Flags",
"InteractiveSearchModalHeader": "Interactief Zoeken",
"RemoveFailedDownloads": "Verwijder mislukte downloads",
"ResetQualityDefinitions": "Reset kwaliteitsdefinities",
"SomeResultsAreHiddenByTheAppliedFilter": "Sommige resultaten zijn verborgen door de aangebrachte filter",
"DownloadClientTagHelpText": "Gebruik deze indexer alleen voor films met ten minste één overeenkomende tag. Laat leeg om te gebruiken met alle films.",
"Events": "Gebeurtenissen",
"Loading": "Laden",
"BlocklistReleases": "Uitgave op blokkeerlijst zetten",
"RemoveFailed": "Verwijderen mislukt",
"RemoveSelectedItem": "Verwijder geselecteerde item",
"DeleteSelectedIndexers": "Verwijder Indexeerder",
"ExistingTag": "Bestaande tag",
"ConnectionLost": "Verbinding Onderbroken",
"LastDuration": "Laatste Looptijd",
"Medium": "Gemiddeld",
"NoEventsFound": "Geen gebeurtenissen gevonden",
"RedownloadFailed": "Opnieuw downloaden mislukt",
"NoResultsFound": "Geen resultaten gevonden",
"EnableRssHelpText": "Wordt gebruikt wanneer {appName} periodiek zoekt naar uitgaven via RSS synchronisatie",
"Location": "Locatie",
"RecentChanges": "Recente wijzigingen",
"CustomFilter": "Aangepaste Filters",
"ErrorLoadingContent": "Er ging iets fout bij het laden van dit item",
"SourceTitle": "Bron Titel",
"FailedLoadingSearchResults": "Fout bij laden van zoek resultaten, probeer het opnieuw.",
"Large": "Groot",
"System": "Systeem",
"ExtraFileExtensionsHelpText": "Komma gescheiden lijst met extra bestanden om te importeren (.nfo zal als .nfo-orig worden geïmporteerd)",
"ExtraFileExtensionsHelpTextsExamples": "Voorbeelden: '.sub, .nfo' of 'sub,nfo'",
"ConnectionLostReconnect": "Radarr zal automatisch proberen te verbinden, of u kunt hieronder op herladen klikken.",
"ConnectionLostToBackend": "Radarr heeft zijn verbinding met de backend verloren en zal moeten worden herladen om de functionaliteit te kunnen herstellen.",
"AutoRedownloadFailed": "Opnieuw downloaden mislukt",
"AutoRedownloadFailedFromInteractiveSearch": "Opnieuw downloaden mislukt vanuit interactief zoeken",
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Zoek en download automatisch een andere release als een release vanuit interactief zoeken mislukt is",
"LastExecution": "Laatste Uitvoering",
"LastWriteTime": "Laatste Modificatietijd",
"Library": "Bibliotheek",
"ListsSettingsSummary": "importlijst",
"NextExecution": "Volgende uitvoering",
"NotificationStatusSingleClientHealthCheckMessage": "Applicaties onbeschikbaar door fouten",
"RecycleBinUnableToWriteHealthCheck": "Kan niet schrijven naar prullenbak: {path}. Zorg dat dit pad bestaat en schrijfbaar is voor de gebruiker waaronder {appName} draait",
"ReleaseProfiles": "releaseprofiel",
"RemoveCompletedDownloads": "Verwijder voltooide downloads",
"RemoveDownloadsAlert": "De verwijderopties zijn verplaatst naar de opties voor de individuele downloadprogramma's in de tabel hierboven.",
"RemoveQueueItemConfirmation": "Weet je zeker dat je {0} van de wachtrij wilt verwijderen?",
"RemoveSelectedItems": "Verwijder geselecteerde items",
"SelectDropdown": "'Selecteer...",
"SelectQuality": "Selecteer Kwaliteit",
"SelectReleaseGroup": "Selecteer Release Groep",
"SetTags": "Tags Toepassen",
"Small": "Klein",
"Theme": "Thema",
"Ui": "Gebruikersinterface",
"WhatsNew": "Wat is er nieuw?"
}

View File

@@ -676,5 +676,17 @@
"Backup": "Kopia zapasowa",
"AllResultsAreHiddenByTheAppliedFilter": "Wszystkie wyniki są ukrywane przez zastosowany filtr",
"ExtraFileExtensionsHelpText": "Rozdzielana przecinkami lista dodatkowych plików do zaimportowania (.nfo zostanie zaimportowane jako .nfo-orig)",
"ExtraFileExtensionsHelpTextsExamples": "Przykłady: „.sub, .nfo” lub „sub, nfo”"
"ExtraFileExtensionsHelpTextsExamples": "Przykłady: „.sub, .nfo” lub „sub, nfo”",
"ListsSettingsSummary": "Listy",
"IndexerFlags": "Flagi indeksujące",
"RemoveQueueItemConfirmation": "Czy na pewno chcesz usunąć elementy ({0}) z kolejki?",
"CustomFilter": "Filtry niestandardowe",
"SourceTitle": "Tytuł źródłowy",
"AutoRedownloadFailed": "Pobieranie nie udane",
"FailedLoadingSearchResults": "Nie udało się załadować wyników wyszukiwania, spróbuj ponownie.",
"ImportLists": "Listy",
"InteractiveSearchModalHeader": "Wyszukiwanie interaktywne",
"SelectDropdown": "Wybierz...",
"SelectQuality": "Wybierz Jakość",
"SelectReleaseGroup": "Wybierz grupę wydającą"
}

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