From 26e4dcad655138e5c456532a7a75b4dd6d9a0de5 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 19 Jan 2025 17:14:44 +0200 Subject: [PATCH 01/82] Bump version to 1.30.2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 53c0783f8..d4a2ec0b4 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.30.1' + majorVersion: '1.30.2' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From ed5120811677961e273c7ad81eb79e70a02f3083 Mon Sep 17 00:00:00 2001 From: Steel City Phantom Date: Wed, 9 Oct 2024 19:41:07 -0400 Subject: [PATCH 02/82] Auto-detect building on macOS ARM (cherry picked from commit 64122b4cfb3bf53bdbf5c924baee5e1b0814501a) --- src/Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index e161b9952..ce3672c38 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -221,7 +221,7 @@ <_UsingDefaultRuntimeIdentifier>true - osx-x64 + osx-$(Architecture) From 37610eec4069720e55c5783b67630eba1ea887f5 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 22 Jan 2025 19:44:49 +0200 Subject: [PATCH 03/82] Fixed: (TorrentDay) Improved error message for expired cookies --- .../Indexers/Definitions/TorrentDay.cs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/TorrentDay.cs b/src/NzbDrone.Core/Indexers/Definitions/TorrentDay.cs index 9371c8aa0..aa02c4578 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/TorrentDay.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/TorrentDay.cs @@ -7,6 +7,7 @@ using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Annotations; using NzbDrone.Core.Configuration; +using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.Indexers.Settings; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Messaging.Events; @@ -52,7 +53,7 @@ namespace NzbDrone.Core.Indexers.Definitions public override IParseIndexerResponse GetParser() { - return new TorrentDayParser(Settings, Capabilities.Categories); + return new TorrentDayParser(Settings, Capabilities.Categories, _logger); } protected override IDictionary GetCookies() @@ -228,15 +229,29 @@ namespace NzbDrone.Core.Indexers.Definitions { private readonly TorrentDaySettings _settings; private readonly IndexerCapabilitiesCategories _categories; + private readonly Logger _logger; - public TorrentDayParser(TorrentDaySettings settings, IndexerCapabilitiesCategories categories) + public TorrentDayParser(TorrentDaySettings settings, IndexerCapabilitiesCategories categories, Logger logger) { _settings = settings; _categories = categories; + _logger = logger; } public IList ParseResponse(IndexerResponse indexerResponse) { + if (indexerResponse.HttpResponse.HasHttpRedirect) + { + _logger.Warn("Redirected to {0} from indexer request", indexerResponse.HttpResponse.RedirectUrl); + + if (indexerResponse.HttpResponse.RedirectUrl.ContainsIgnoreCase("/login.php")) + { + throw new IndexerException(indexerResponse, "We are being redirected to the login page. Most likely your session expired or was killed. Recheck your cookie and try testing the indexer."); + } + + throw new IndexerException(indexerResponse, "Redirected to {0} from indexer request", indexerResponse.HttpResponse.RedirectUrl); + } + var torrentInfos = new List(); var rows = JsonConvert.DeserializeObject(indexerResponse.Content); From 6d2d49f7bd1c3a30a4b5b1e192ab323426b819bc Mon Sep 17 00:00:00 2001 From: bakerboy448 <55419169+bakerboy448@users.noreply.github.com> Date: Wed, 22 Jan 2025 18:36:03 -0600 Subject: [PATCH 04/82] Fixed: (PTP) Filtering non-freeleech releases when using Freeleech Only Co-authored-by: Bogdan --- .../PassThePopcorn/PassThePopcornParser.cs | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs index 997ba97e0..e08536162 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs @@ -56,6 +56,19 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn { foreach (var torrent in result.Torrents) { + // skip non-freeleech results when freeleech only is set + var downloadVolumeFactor = torrent.FreeleechType?.ToUpperInvariant() switch + { + "FREELEECH" => 0, + "HALF LEECH" => 0.5, + _ => 1 + }; + + if (_settings.FreeleechOnly && downloadVolumeFactor != 0.0) + { + continue; + } + var id = torrent.Id; var title = torrent.ReleaseName; @@ -94,12 +107,7 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn ImdbId = result.ImdbId.IsNotNullOrWhiteSpace() ? int.Parse(result.ImdbId) : 0, Scene = torrent.Scene, IndexerFlags = flags, - DownloadVolumeFactor = torrent.FreeleechType?.ToUpperInvariant() switch - { - "FREELEECH" => 0, - "HALF LEECH" => 0.5, - _ => 1 - }, + DownloadVolumeFactor = downloadVolumeFactor, UploadVolumeFactor = 1, MinimumRatio = 1, MinimumSeedTime = 345600, From d8354408a4ef98d271cecdf5e0c5fc65cc9b5255 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 23 Jan 2025 15:17:21 +0200 Subject: [PATCH 05/82] Update categories for AnimeTorrents Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> --- src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs b/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs index 7ba07ab80..120fd690d 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs @@ -119,6 +119,7 @@ namespace NzbDrone.Core.Indexers.Definitions caps.Categories.AddCategoryMapping(17, NewznabStandardCategory.BooksComics, "Doujinshi"); caps.Categories.AddCategoryMapping(18, NewznabStandardCategory.BooksComics, "Doujinshi 18+"); caps.Categories.AddCategoryMapping(19, NewznabStandardCategory.Audio, "OST"); + caps.Categories.AddCategoryMapping(20, NewznabStandardCategory.AudioAudiobook, "Audiobooks"); return caps; } From e15e57329e1b2449ed25cbf0bc91bdd666ea5fbc Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 23 Jan 2025 15:19:10 +0200 Subject: [PATCH 06/82] Update categories for XSpeeds Co-authored-by: Garfield69 --- src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs b/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs index 381441434..72d4f1c2b 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/XSpeeds.cs @@ -121,8 +121,15 @@ public class XSpeeds : TorrentIndexerBase caps.Categories.AddCategoryMapping(112, NewznabStandardCategory.MoviesOther, "Anime Movies"); caps.Categories.AddCategoryMapping(111, NewznabStandardCategory.MoviesOther, "Anime TV"); caps.Categories.AddCategoryMapping(150, NewznabStandardCategory.PC, "Apps"); - caps.Categories.AddCategoryMapping(80, NewznabStandardCategory.AudioAudiobook, "Audiobooks"); - caps.Categories.AddCategoryMapping(48, NewznabStandardCategory.Books, "Books Magazines"); + caps.Categories.AddCategoryMapping(156, NewznabStandardCategory.TV, "AV1"); + caps.Categories.AddCategoryMapping(156, NewznabStandardCategory.Movies, "AV1"); + caps.Categories.AddCategoryMapping(159, NewznabStandardCategory.Movies, "Movie Boxsets AV1"); + caps.Categories.AddCategoryMapping(158, NewznabStandardCategory.Movies, "Movies AV1"); + caps.Categories.AddCategoryMapping(157, NewznabStandardCategory.TV, "TV AV1"); + caps.Categories.AddCategoryMapping(160, NewznabStandardCategory.TV, "TV Boxsets AV1"); + caps.Categories.AddCategoryMapping(153, NewznabStandardCategory.Books, "Books"); + caps.Categories.AddCategoryMapping(154, NewznabStandardCategory.AudioAudiobook, "Audiobooks"); + caps.Categories.AddCategoryMapping(155, NewznabStandardCategory.Books, "Books & Magazines"); caps.Categories.AddCategoryMapping(68, NewznabStandardCategory.MoviesOther, "Cams/TS"); caps.Categories.AddCategoryMapping(140, NewznabStandardCategory.TVDocumentary, "Documentary"); caps.Categories.AddCategoryMapping(10, NewznabStandardCategory.MoviesDVD, "DVDR"); @@ -154,6 +161,7 @@ public class XSpeeds : TorrentIndexerBase caps.Categories.AddCategoryMapping(146, NewznabStandardCategory.MoviesSD, "Movies SD"); caps.Categories.AddCategoryMapping(13, NewznabStandardCategory.Audio, "Music"); caps.Categories.AddCategoryMapping(135, NewznabStandardCategory.AudioLossless, "Music/FLAC"); + caps.Categories.AddCategoryMapping(151, NewznabStandardCategory.Audio, "Karaoke"); caps.Categories.AddCategoryMapping(136, NewznabStandardCategory.Audio, "Music Boxset"); caps.Categories.AddCategoryMapping(148, NewznabStandardCategory.AudioVideo, "Music Videos"); caps.Categories.AddCategoryMapping(9, NewznabStandardCategory.Other, "Other"); From b463a3f54be2416ef88831364d02cd298573dcfc Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 23 Jan 2025 15:22:36 +0200 Subject: [PATCH 07/82] Update categories for RuTracker Co-authored-by: Garfield69 --- src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs b/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs index 26a5a42de..79244b6b2 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs @@ -933,6 +933,8 @@ namespace NzbDrone.Core.Indexers.Definitions caps.Categories.AddCategoryMapping(1224, NewznabStandardCategory.AudioLossless, "|- Авторская песня (lossless)"); caps.Categories.AddCategoryMapping(1225, NewznabStandardCategory.AudioMP3, "|- Авторская песня (lossy)"); caps.Categories.AddCategoryMapping(1226, NewznabStandardCategory.Audio, "|- Менестрели и ролевики (lossy и lossless)"); + caps.Categories.AddCategoryMapping(782, NewznabStandardCategory.Audio, "Лейбл- и сцен-паки. Неофициальные сборники и ремастеринги. AI-музыка"); + caps.Categories.AddCategoryMapping(577, NewznabStandardCategory.Audio, "|- AI-Music - музыка ИИ, нейросетей (lossy и lossless)"); caps.Categories.AddCategoryMapping(1842, NewznabStandardCategory.AudioLossless, "Label Packs (lossless)"); caps.Categories.AddCategoryMapping(1648, NewznabStandardCategory.AudioMP3, "Label packs, Scene packs (lossy)"); caps.Categories.AddCategoryMapping(134, NewznabStandardCategory.AudioLossless, "|- Неофициальные сборники и ремастеринги (lossless)"); From 8ac68240adf67acb0fee53abe168e4ad57a30f6f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 23 Jan 2025 16:42:41 +0200 Subject: [PATCH 08/82] Revert "Improve error message on non-JSON responses for Nebulance" This reverts commit 2c3621d25e1f4e67abeed6fefa160f114e5096a3. --- src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs index 731c96bb5..dcc26338e 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Nebulance.cs @@ -240,6 +240,8 @@ namespace NzbDrone.Core.Indexers.Definitions public IList ParseResponse(IndexerResponse indexerResponse) { + var torrentInfos = new List(); + if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK) { STJson.TryDeserialize>(indexerResponse.HttpResponse.Content, out var errorResponse); @@ -247,13 +249,6 @@ namespace NzbDrone.Core.Indexers.Definitions throw new IndexerException(indexerResponse, "Unexpected response status '{0}' code from indexer request: {1}", indexerResponse.HttpResponse.StatusCode, errorResponse?.Result?.Error?.Message ?? "Check the logs for more information."); } - if (!indexerResponse.HttpResponse.Headers.ContentType.Contains(HttpAccept.Json.Value)) - { - throw new IndexerException(indexerResponse, "Unexpected response header {0} from indexer request, expected {1}", indexerResponse.HttpResponse.Headers.ContentType, HttpAccept.Json.Value); - } - - var torrentInfos = new List(); - JsonRpcResponse jsonResponse; try From 1f7ac7d7d608959126b2ec5441638ed37ebb48e3 Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 24 Jan 2025 11:18:24 +0000 Subject: [PATCH 09/82] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: HanaO00 Co-authored-by: Lizandra Candido da Silva Co-authored-by: Oskari Lavinto Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/fi.json | 44 +++++++++---------- src/NzbDrone.Core/Localization/Core/fr.json | 2 +- .../Localization/Core/pt_BR.json | 20 ++++----- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 74a5e7a50..0f63479f7 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -25,7 +25,7 @@ "SettingsTimeFormat": "Kellonajan esitys", "Message": "Viesti", "Seeders": "Jakajat", - "TestAll": "Kaikkien testaus", + "TestAll": "Koesta kaikki", "AddDownloadClient": "Lisää latauspalvelu", "CustomFilters": "Omat suodattimet", "DeleteTag": "Poista tunniste", @@ -122,7 +122,7 @@ "TagsSettingsSummary": "Täältä näet kaikki tunnisteet käyttökohteineen ja voit poistaa käyttämättömät tunnisteet.", "Tasks": "Tehtävät", "Test": "Testaa", - "TestAllClients": "Koesta latauspalvelut", + "TestAllClients": "Koesta palvelut", "Time": "Aika", "Title": "Nimike", "Tomorrow": "Huomenna", @@ -130,11 +130,11 @@ "Torrents": "Torrentit", "Type": "Tyyppi", "UILanguage": "Käyttöliittymän kieli", - "UnableToAddANewApplicationPleaseTryAgain": "Uuden sovelluksen lisäys epäonnistui. Yritä uudelleen.", + "UnableToAddANewApplicationPleaseTryAgain": "Virhe lisättäessä sovellusta. Yritä uudelleen.", "UnableToAddANewIndexerPleaseTryAgain": "Uuden hakupalvelun lisääminen epäonnistui. Yritä uudelleen.", - "UnableToAddANewIndexerProxyPleaseTryAgain": "Uuden tiedonhaun välityspalvelimen lisäys epäonnistui. Yritä uudelleen.", - "BackupsLoadError": "Varmuuskopioinnin lataus epäonnistui", - "DownloadClientsLoadError": "Latauspalveluiden lataus epäonnistui", + "UnableToAddANewIndexerProxyPleaseTryAgain": "Virhe lisättäessä tiedonhaun välityspalvelinta. Yritä uudelleen.", + "BackupsLoadError": "Virhe ladattaessa varmuuskopioita.", + "DownloadClientsLoadError": "Virhe ladattaessa latauspalveluita.", "UnableToLoadGeneralSettings": "Yleisasetusten lataus epäonnistui", "UpdateAutomaticallyHelpText": "Lataa ja asenna päivitykset automaattisesti. Voit myös edelleen suorittaa asennuksen järjestelmäasetusten päivitykset-osiosta.", "Added": "Lisäysaika", @@ -168,10 +168,10 @@ "Sort": "Järjestys", "UnableToAddANewDownloadClientPleaseTryAgain": "Latauspalvelun lisääminen epäonnistui. Yritä uudelleen.", "AppDataLocationHealthCheckMessage": "Päivityksiä ei sallita, jotta AppData-kansion poistaminen päivityksen yhteydessä voidaan estää", - "UnableToLoadHistory": "Historian lataus epäonnistui", - "UnableToLoadNotifications": "Ilmoituspalveluiden lataus epäonnistui", - "UnableToLoadTags": "Tunnisteiden lataus epäonnistui", - "UnableToLoadUISettings": "Käyttöliittymäasetusten lataus epäonnistui", + "UnableToLoadHistory": "Virhe ladattaessa historiaa.", + "UnableToLoadNotifications": "Virhe ladattaessa ilmoituspalveluita.", + "UnableToLoadTags": "Virhe ladattaessa tunnisteita.", + "UnableToLoadUISettings": "Virhe ladattaessa käyttöliittymäasetuksia.", "UnsavedChanges": "Muutoksia ei ole tallennettu", "Yesterday": "Eilen", "ConnectionLost": "Yhteys menetettiin", @@ -209,7 +209,7 @@ "TableOptions": "Taulukkonäkymän asetukset", "TableOptionsColumnsMessage": "Valitse näytettävät sarakkeet ja niiden järjestys", "TagsHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille hakupalveluille.", - "UnableToAddANewAppProfilePleaseTryAgain": "Uuden sovellusprofiilin lisäys epäonnistui. Yritä uudelleen.", + "UnableToAddANewAppProfilePleaseTryAgain": "Virhe lisättäessä sovellusprofiilia. Yritä uudelleen.", "UnableToAddANewNotificationPleaseTryAgain": "Ilmoituspalvelun lisääminen epäonnistui. Yritä uudelleen.", "Version": "Versio", "View": "Näkymä", @@ -232,7 +232,7 @@ "Cancel": "Peruuta", "CancelPendingTask": "Haluatko varmasti perua odottavan tehtävän?", "CertificateValidation": "Varmenteen vahvistus", - "CertificateValidationHelpText": "Muuta HTTPS-varmennevahvistuksen tarkkuutta. Älä muuta, jollet ymmärrä tähän liittyviä riskejä.", + "CertificateValidationHelpText": "Määritä HTTPS-varmennevahvistuksen tiukkuus. Älä muuta, jos et ymmärrä riskejä.", "ChangeHasNotBeenSavedYet": "Muutosta ei ole vielä tallennettu", "Clear": "Tyhjennä", "CloneProfile": "Monista profiili", @@ -324,7 +324,7 @@ "UISettingsSummary": "Kalenterin, päiväyksen ja kellonajan sekä kielen ja heikentyneelle värinäölle sopivan tilan asetukset.", "SettingsIndexerLoggingHelpText": "Kirjaa tarkempia tietoja hakupalveluiden toiminnasta, mukaanlukien vastaukset", "IndexerTagsHelpText": "Tunnisteilla voit kohdistaa tiedonhaun välityspalvelimia ja määrittää mihin sovelluksiin ne synkronoidaan.", - "UnableToLoadAppProfiles": "Sovellusprofiilien lataus epäonnistui", + "UnableToLoadAppProfiles": "Virhe ladattaessa sovellusprofiileja.", "AppProfileSelectHelpText": "Sovellusprofiilieilla määritetään hakupalvelulle sovellussynkronoinnin yhteydessä aktivoitavat hakutavat (RSS/automaatti/manuaali).", "IndexerQuery": "Hakupalvelukysely", "IndexerRss": "Hakupalvelun RSS", @@ -338,8 +338,8 @@ "SyncLevel": "Synkronoinnin laajuus", "SyncLevelAddRemove": "Vain lisäys/poisto: Kun {appName}in hakupalveluita lisätään tai poistetaan, päivittyy myös tämä etäsovellus.", "SyncAppIndexers": "Synkronoi sovelluksiin", - "TestAllApps": "Testaa kaikki sovellukset", - "UnableToLoadIndexerProxies": "Tiedonhaun välityspalvelinten lataus epäonnistui", + "TestAllApps": "Koesta sovellukset", + "UnableToLoadIndexerProxies": "Virhe ladattaessa tiedonhaun välityspalvelimia.", "AddedToDownloadClient": "Julkaisu lisättiin latauspalveluun", "AddNewIndexer": "Lisää uusi hakupalvelu", "AddToDownloadClient": "Lisää julkaisu latauspalveluun", @@ -374,7 +374,7 @@ "Notifications": "Ilmoituspalvelut", "NotificationTriggersHelpText": "Valitse ilmoituksen laukaisevat tapahtumat.", "Stats": "Tilastot", - "UnableToLoadDevelopmentSettings": "Kehittäjäasetusten lataus epäonnistui", + "UnableToLoadDevelopmentSettings": "Virhe ladattaessa kehittäjäasetuksia.", "AppSettingsSummary": "Sovellukset ja asetukset, joilla määritetään miten {appName} viestii PVR-sovellustesi kanssa.", "Privacy": "Yksityisyys", "NetCore": ".NET", @@ -389,7 +389,7 @@ "OnHealthIssue": "Vakausongelmat", "HistoryCleanupDaysHelpText": "Poista automaattinen tyhjennys käytöstä asettamalla arvoksi 0.", "HistoryCleanupDaysHelpTextWarning": "Tässä määritettyä aikaa vanhemmat tiedostot poistetaan automaattisesti roskakorista pysyvästi.", - "TestAllIndexers": "Koesta hakupalvelut", + "TestAllIndexers": "Koesta palvelut", "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent-tiedon ilmoitti rajapinnan kanssa viestinyt sovellus.", "Categories": "Kategoriat", "Database": "Tietokanta", @@ -402,7 +402,7 @@ "Proxies": "Välityspalvelimet", "Public": "Julkinen", "SemiPrivate": "Osittain yksityinen", - "ApplicationsLoadError": "Sovelluslistan lataus epäonnistui", + "ApplicationsLoadError": "Virhe ladattaessa sovelluslistaa.", "Url": "URL", "Website": "Verkkosivusto", "IndexerNoDefinitionCheckHealthCheckMessage": "Hakupalveluiden määritykset puuttuvat, eivätkä ne toimi: {indexerNames}. Poista tai lisää ne {appName}iin uudelleen.", @@ -412,7 +412,7 @@ "GrabReleases": "Kaappaa julkaisu(t)", "Link": "Linkki", "SearchTypes": "Etsittävät tyypit", - "UnableToLoadIndexers": "Hakupalveluiden lataus epäonnistui", + "UnableToLoadIndexers": "Virhe ladattaessa hakupalveluita.", "Yes": "Kyllä", "MappedDrivesRunningAsService": "Yhdistetyt verkkoasemat eivät ole käytettävissä kun sovellus suoritetaan Windows-palveluna. Saat lisätietoja UKK:sta.", "No": "Ei", @@ -501,7 +501,7 @@ "TotalIndexerSuccessfulGrabs": "Onnistuneiden hakupalvelukaappausten kokonaismäärä", "AppUpdated": "{appName} on päivitetty", "AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on käynnistettävä uudelleen.", - "IndexerDownloadClientHelpText": "Määritä {appName}issa tästä hakupalvelusta tehdyille kaappauksille käytettävä latauspalvelu.", + "IndexerDownloadClientHelpText": "Määritä {appName}in käyttöliittymässä tästä hakupalvelusta kaapattaessa käytettävä latauspalvelu.", "AuthenticationRequiredWarning": "Etäkäytön estämiseksi ilman tunnistautumista {appName} vaatii nyt tunnistautumisen käyttöönoton. Paikallisilta osoitteilta se voidaan valinnaisesti poistaa käytöstä.", "TotalGrabs": "Kaappausten kokonaismäärä", "AddDownloadClientImplementation": "Lisätään latauspalvelua – {implementationName}", @@ -556,7 +556,7 @@ "Implementation": "Toteutus", "IndexerCategories": "Hakupalvelukategoriat", "IndexerStatus": "Hakupalvelun tila", - "ManageApplications": "Hallitse sovelluksia", + "ManageApplications": "Sovellusten hallinta", "NewznabUrl": "Newznab URL", "PackSeedTime": "Paketin jakoaika", "PackSeedTimeHelpText": "Aika, joka koostepaketin (kuten sarjan tuotantokauden tai esittäjän diskografian) sisältävää torrentia tulee jakaa. Käytä sovelluksen oletusta jättämällä tyhjäksi.", @@ -668,7 +668,7 @@ "DownloadClientFreeboxSettingsPortHelpText": "Freebox-liittymän portti. Oletus on {port}.", "DownloadClientPneumaticSettingsNzbFolder": "NZB-kansio", "DownloadClientQbittorrentSettingsSequentialOrder": "Peräkkäinen järjestys", - "CustomFilter": "Mukautettu suodatin", + "CustomFilter": "Oma suodatin", "DownloadClientFreeboxSettingsAppIdHelpText": "Freebox-rajapinnan käyttöoikeutta määritettäessä käytettävä App ID -sovellustunniste.", "DownloadClientFreeboxSettingsAppToken": "Sovellustietue", "DownloadClientNzbgetSettingsAddPausedHelpText": "Tämä vaatii vähintään NzbGetin version 16.0.", diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index b156ce10a..34fb107a9 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -384,7 +384,7 @@ "HistoryCleanupDaysHelpTextWarning": "Les fichiers dans la corbeille plus anciens que le nombre de jours sélectionné seront nettoyés automatiquement", "OnGrab": "Récupéré à la sortie", "OnHealthIssue": "Lors de problème de santé", - "TestAllIndexers": "Testez tous les indexeurs", + "TestAllIndexers": "Tester tous les indexeurs", "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent fourni par l'application qui a appelé l'API", "Database": "Base de données", "HistoryCleanup": "Nettoyage de l'historique", diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 25d1187a4..5ba6e6764 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -126,7 +126,7 @@ "DownloadClientStatusAllClientHealthCheckMessage": "Todos os clientes de download estão indisponíveis devido a falhas", "DownloadClientStatusSingleClientHealthCheckMessage": "Clientes de download indisponíveis devido a falhas: {downloadClientNames}", "DownloadClients": "Clientes de download", - "DownloadClientsSettingsSummary": "Configuração de clientes de download para integração com a pesquisa da interface do usuário do {appName}", + "DownloadClientsSettingsSummary": "Configuração de clientes de download para integração com a pesquisa da interface do {appName}", "Duration": "Duração", "Edit": "Editar", "EditIndexer": "Editar Indexador", @@ -204,7 +204,7 @@ "IndexerNoDefinitionCheckHealthCheckMessage": "Os indexadores não têm definição e não funcionarão: {indexerNames}. Remova e (ou) adicione novamente ao {appName}.", "IndexerObsoleteCheckMessage": "Os seguintes indexadores são obsoletos ou foram atualizados: {0}. Remova-os e/ou adicione-os novamente ao {appName}", "IndexerPriority": "Prioridade do indexador", - "IndexerPriorityHelpText": "Prioridade do Indexador de 1 (mais alta) a 50 (mais baixa). Padrão: 25.", + "IndexerPriorityHelpText": "Prioridade do indexador, de 1 (mais alta) a 50 (mais baixa). Padrão: 25.", "IndexerProxies": "Proxies do Indexador", "IndexerProxy": "Proxy do Indexador", "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Todos os proxies estão indisponíveis devido a falhas", @@ -248,7 +248,7 @@ "MassEditor": "Editor em Massa", "Mechanism": "Mecanismo", "Message": "Mensagem", - "MinimumSeeders": "Mínimo de Seeders", + "MinimumSeeders": "Mínimo de semeadores", "MinimumSeedersHelpText": "Semeadores mínimos exigidos pelo aplicativo para o indexador baixar", "Mode": "Modo", "More": "Mais", @@ -513,7 +513,7 @@ "DeleteSelectedDownloadClients": "Excluir cliente(s) de download", "DeleteSelectedDownloadClientsMessageText": "Tem certeza de que deseja excluir o(s) {count} cliente(s) de download selecionado(s)?", "DeleteSelectedIndexersMessageText": "Tem certeza de que deseja excluir o(s) {count} indexador(es) selecionado(s)?", - "DownloadClientPriorityHelpText": "Priorizar vários clientes de download. Usamos um rodízio para clientes com a mesma prioridade.", + "DownloadClientPriorityHelpText": "Priorizar vários clientes de download. Usamos uma distribuição equilibrada para clientes com a mesma prioridade.", "EditSelectedDownloadClients": "Editar clientes de download selecionados", "EditSelectedIndexers": "Editar indexadores selecionados", "ManageDownloadClients": "Gerenciar clientes de download", @@ -538,10 +538,10 @@ "PackSeedTime": "Tempo de Semente do Pacote", "PackSeedTimeHelpText": "A hora em que um torrent de pacote (temporada ou discografia) deve ser propagado antes de parar, vazio é o padrão do aplicativo", "QueryType": "Tipo de consulta", - "SeedTime": "Tempo de Semeação", + "SeedTime": "Tempo de semeadura", "SearchAllIndexers": "Pesquisar todos os indexadores", "SearchCountIndexers": "Pesquisar {count} indexador(es)", - "SeedRatio": "Proporção de sementes", + "SeedRatio": "Proporção de semeadura", "SeedRatioHelpText": "A proporção que um torrent deve atingir antes de parar, vazio é o padrão do aplicativo", "SeedTimeHelpText": "O tempo que um torrent deve ser propagado antes de parar, vazio é o padrão do aplicativo", "SelectedCountOfCountReleases": "{selectedCount} de {itemCount} lançamentos selecionados", @@ -611,7 +611,7 @@ "NotificationsEmailSettingsUseEncryptionHelpText": "Se preferir usar criptografia se configurado no servidor, usar sempre criptografia via SSL (somente porta 465) ou StartTLS (qualquer outra porta) ou nunca usar criptografia", "NotificationsEmailSettingsUseEncryption": "Usar Criptografia", "IndexerHDBitsSettingsPasskeyHelpText": "Chave de Acesso dos Detalhes do Usuário", - "IndexerSettingsPasskey": "Chave de Acesso", + "IndexerSettingsPasskey": "Chave de acesso", "IndexerAlphaRatioSettingsExcludeSceneHelpText": "Excluir lançamentos SCENE dos resultados", "IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Pesquisar lançamentos freeleech somente", "IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Pesquisar lançamentos freeleech somente", @@ -632,7 +632,7 @@ "IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Pesquisar lançamentos por nomes de grupos", "IndexerHDBitsSettingsCodecs": "Codecs", "IndexerHDBitsSettingsMediumsHelpText": "se não for especificado, todas as opções serão usadas.", - "IndexerHDBitsSettingsOriginsHelpText": "se não for especificado, todas as opções serão usadas.", + "IndexerHDBitsSettingsOriginsHelpText": "Se não for especificado, todas as opções serão usadas.", "IndexerHDBitsSettingsUseFilenames": "Usar nomes de arquivos", "IndexerHDBitsSettingsUsernameHelpText": "Nome de Usuário do Site", "IndexerHDBitsSettingsMediums": "Meios", @@ -652,7 +652,7 @@ "IndexerSettingsApiUser": "Usuário da API", "IndexerSettingsBaseUrl": "URL Base", "IndexerSettingsCookie": "Cookie", - "IndexerSettingsCookieHelpText": "Cookie do Site", + "IndexerSettingsCookieHelpText": "Cookie do site", "IndexerSettingsFreeleechOnly": "Só Freeleech", "IndexerSettingsGrabLimit": "Limite de Captura", "IndexerSettingsGrabLimitHelpText": "O número máximo de capturas conforme especificado pela respectiva unidade que {appName} permitirá ao site", @@ -744,7 +744,7 @@ "Mixed": "Misturado", "Donate": "Doar", "ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Sincronizar Lista de Bloqueio de Hashes de Torrents Rejeitados Enquanto Baixando", - "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Se um torrent for bloqueado por hash, pode não ser rejeitado corretamente durante o RSS/Pesquisa de alguns indexadores. Ativar isso permitirá que ele seja rejeitado após o torrent ser capturado, mas antes de ser enviado ao cliente.", + "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Se um torrent for bloqueado por hash, pode não ser rejeitado corretamente durante a Sincronização RSS/Pesquisa em alguns indexadores. Ativar isso permitirá que ele seja rejeitado após obter o torrent, mas antes de enviar ao cliente.", "ClickToChangeQueryOptions": "Clique para alterar as opções de consulta", "IndexerMTeamTpSettingsApiKeyHelpText": "Chave API do Site (Encontrada no Painel de Controle do Usuário => Segurança => Laboratório)", "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Pesquise apenas lançamentos freeleech", From f0540a5f8b95a6fac68166947aeb6c07214870e7 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 24 Jan 2025 17:33:38 +0200 Subject: [PATCH 10/82] Bump version to 1.31.0 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index d4a2ec0b4..9113e9dea 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.30.2' + majorVersion: '1.31.0' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 22834a852a4643b00fe98b7ee1550d129a03f710 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 29 Jan 2025 18:39:22 +0200 Subject: [PATCH 11/82] Fixed: TV search with tmdbid for Newznab and Torznab --- .../Indexers/Definitions/Newznab/NewznabRequestGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabRequestGenerator.cs index f9ab56128..ad3f48b07 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Newznab/NewznabRequestGenerator.cs @@ -128,7 +128,7 @@ namespace NzbDrone.Core.Indexers.Newznab parameters.Set("tvdbid", searchCriteria.TvdbId.Value.ToString()); } - if (searchCriteria.TmdbId.HasValue && capabilities.TvSearchTvdbAvailable) + if (searchCriteria.TmdbId.HasValue && capabilities.TvSearchTmdbAvailable) { parameters.Set("tmdbid", searchCriteria.TmdbId.Value.ToString()); } From 979db70e6851e1a3501394193722a97d2367d46a Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 2 Feb 2025 12:47:52 +0200 Subject: [PATCH 12/82] Bump version to 1.31.1 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 9113e9dea..15e63d064 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.31.0' + majorVersion: '1.31.1' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 08b4eddbc53c8ae0a3025cfe41072031c44874c5 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 2 Feb 2025 08:33:23 +0000 Subject: [PATCH 13/82] Multiple Translations updated by Weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ignore-downstream Co-authored-by: Mailme Dashite Co-authored-by: Oskari Lavinto Co-authored-by: Weblate Co-authored-by: marapavelka Co-authored-by: 宿命 <331874545@qq.com> Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/cs.json | 103 ++++++++++-- src/NzbDrone.Core/Localization/Core/de.json | 158 ++++++++++++++++-- src/NzbDrone.Core/Localization/Core/fi.json | 6 +- .../Localization/Core/zh_CN.json | 15 +- 4 files changed, 251 insertions(+), 31 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 48fb9848c..2ac6af341 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -23,7 +23,7 @@ "ProxyType": "Typ serveru proxy", "Reddit": "Reddit", "ErrorLoadingContents": "Chyba při načítání obsahu", - "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Všechny indexery nejsou k dispozici z důvodu selhání po dobu delší než 6 hodin", + "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Všechny indexery jsou nedostupné z důvodu selhání déle než 6 hodin", "RemovedFromTaskQueue": "Odebráno z fronty úkolů", "ResetAPIKey": "Resetovat klíč API", "SSLCertPassword": "Heslo SSL Cert", @@ -52,10 +52,10 @@ "IncludeHealthWarningsHelpText": "Včetně varování ohledně zdraví", "Indexer": "Indexer", "IndexerFlags": "Příznaky indexeru", - "IndexerPriority": "Priorita indexování", - "IndexerPriorityHelpText": "Priorita indexování od 1 (nejvyšší) do 50 (nejnižší). Výchozí: 25.", + "IndexerPriority": "Priorita indexeru", + "IndexerPriorityHelpText": "Priorita indexeru od 1 (Nejvyšší) do 50 (Nejnižší). Výchozí: 25.", "Indexers": "Indexery", - "IndexerStatusAllUnavailableHealthCheckMessage": "Všechny indexery nejsou k dispozici z důvodu selhání", + "IndexerStatusAllUnavailableHealthCheckMessage": "Všechny indexery jsou nedostupné z důvodu selhání", "LastWriteTime": "Čas posledního zápisu", "Level": "Úroveň", "LogLevel": "Úroveň protokolu", @@ -73,8 +73,8 @@ "ApiKey": "Klíč API", "AppDataDirectory": "Adresář AppData", "AppDataLocationHealthCheckMessage": "Aktualizace nebude možná, aby se zabránilo odstranění AppData při aktualizaci", - "ApplicationStatusCheckAllClientMessage": "Všechny aplikace jsou nedostupné z důvodu poruch", - "ApplicationStatusCheckSingleClientMessage": "Aplikace nedostupné z důvodu poruch: {0}", + "ApplicationStatusCheckAllClientMessage": "Všechny aplikace jsou nedostupné z důvodu selhání", + "ApplicationStatusCheckSingleClientMessage": "Aplikace nedostupné z důvodu selhání: {0}", "Apply": "Použít", "Branch": "Větev", "BranchUpdate": "Větev použitá k aktualizaci {appName}u", @@ -105,7 +105,7 @@ "Tasks": "Úkoly", "Test": "Test", "UnableToLoadTags": "Značky nelze načíst", - "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Všechny indexery nejsou k dispozici z důvodu selhání", + "IndexerProxyStatusAllUnavailableHealthCheckMessage": "Všechny proxy indexerů jsou nedostupné z důvodu selhání", "ApplyTags": "Použít štítky", "MoreInfo": "Více informací", "System": "Systém", @@ -183,7 +183,7 @@ "BypassProxyForLocalAddresses": "Obcházení proxy serveru pro místní adresy", "DeleteIndexerProxyMessageText": "Opravdu chcete odstranit proxy indexeru ‚{name}‘?", "DeleteTag": "Odstranit štítek", - "IndexerProxyStatusUnavailableHealthCheckMessage": "Indexery nedostupné z důvodu selhání: {indexerProxyNames}", + "IndexerProxyStatusUnavailableHealthCheckMessage": "Proxy indexerů nedostupné z důvodu selhání: {indexerProxyNames}", "Name": "název", "New": "Nový", "Protocol": "Protokol", @@ -265,7 +265,7 @@ "Exception": "Výjimka", "ExistingTag": "Stávající štítek", "IllRestartLater": "Restartuji později", - "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexery nedostupné z důvodu selhání po dobu delší než 6 hodin: {indexerNames}", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexery nedostupné z důvodu selhání déle než 6 hodin: {indexerNames}", "IndexerStatusUnavailableHealthCheckMessage": "Indexery nedostupné z důvodu selhání: {indexerNames}", "SettingsTimeFormat": "Časový formát", "ShowAdvanced": "Zobrazit pokročilé", @@ -320,8 +320,8 @@ "UnableToLoadIndexers": "Nelze načíst indexery", "Yes": "Ano", "GrabReleases": "Získat vydání", - "ApplicationLongTermStatusCheckSingleClientMessage": "Aplikace nedostupné z důvodu poruchy po dobu delší než 6 hodin: {0}", - "ApplicationLongTermStatusCheckAllClientMessage": "Všechny aplikace jsou z důvodu poruchy nedostupné déle než 6 hodin", + "ApplicationLongTermStatusCheckSingleClientMessage": "Aplikace nedostupné z důvodu selhání déle než 6 hodin: {0}", + "ApplicationLongTermStatusCheckAllClientMessage": "Všechny aplikace jsou nedostupné z důvodu selhání déle než 6 hodin", "Ended": "Ukončeno", "LastDuration": "lastDuration", "LastExecution": "Poslední poprava", @@ -370,8 +370,8 @@ "Artist": "Umělec", "EditIndexerImplementation": "Upravit indexer - {implementationName}", "Episode": "Epizoda", - "NotificationStatusAllClientHealthCheckMessage": "Všechny seznamy nejsou k dispozici z důvodu selhání", - "NotificationStatusSingleClientHealthCheckMessage": "Seznamy nejsou k dispozici z důvodu selhání: {notificationNames}", + "NotificationStatusAllClientHealthCheckMessage": "Všechna oznámení jsou nedostupná z důvodu selhání", + "NotificationStatusSingleClientHealthCheckMessage": "Oznámení nedostupná z důvodu selhání: {notificationNames}", "Application": "Aplikace", "AppUpdatedVersion": "{appName} byl aktualizován na verzi `{version}`, abyste získali nejnovější změny, musíte znovu načíst {appName}", "Encoding": "Kódování", @@ -409,7 +409,7 @@ "days": "dnů", "Id": "ID", "CountApplicationsSelected": "{count} vybraných aplikací", - "IndexerHDBitsSettingsCodecs": "Kodek", + "IndexerHDBitsSettingsCodecs": "Kodeky", "IndexerHDBitsSettingsMediums": "Střední", "Directory": "Adresář", "CustomFilter": "Vlastní filtr", @@ -558,5 +558,78 @@ "IndexerSettingsAppsMinimumSeeders": "Minimální počet seederů aplikací", "UsenetBlackholeNzbFolder": "Složka Nzb", "SearchIndexers": "Hledat indexery", - "IndexerSettingsAppsMinimumSeedersHelpText": "Minimální počet seederů požadovaných aplikacemi pro indexer, výchozí hodnota synchronizačního profilu je prázdná" + "IndexerSettingsAppsMinimumSeedersHelpText": "Minimální počet seederů požadovaných aplikacemi pro indexer, výchozí hodnota synchronizačního profilu je prázdná", + "IndexerProxy": "Proxy indexeru", + "IndexerBeyondHDSettingsRssKeyHelpText": "Klíč RSS ze stránky (Naleznete v Moje zabezpečení => Klíč RSS)", + "IndexerHDBitsSettingsCodecsHelpText": "Pokud není zadáno, použijí se všechny možnosti.", + "IndexerHDBitsSettingsUsernameHelpText": "Uživatelské jméno stránky", + "IndexerAvistazSettingsUsernameHelpTextWarning": "Rozhraní API v tomto indexeru mohou používat pouze hodnosti člen a vyšší.", + "IndexerBeyondHDSettingsApiKeyHelpText": "Klíč API ze stránky (Naleznete v Moje zabezpečení => Klíč API)", + "IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání", + "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání", + "IndexerProxies": "Proxy indexeru", + "IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání", + "IndexerHistoryLoadError": "Chyba při načítání historie indexeru", + "IndexerId": "ID indexeru", + "IndexerNoDefinitionCheckHealthCheckMessage": "Indexery nemají žádnou definici a nebudou fungovat: {indexerNames}. Odeberte je a (nebo) znovu přidejte do {appName}.", + "IndexerAlphaRatioSettingsExcludeSceneHelpText": "Vyloučit vydání SCENE z výsledků", + "IndexerAlreadySetup": "Alespoň jedna instance indexeru je již nastavena", + "IndexerAvistazSettingsPasswordHelpText": "Heslo stránky", + "IndexerAvistazSettingsPidHelpText": "PID ze stránky Můj účet nebo Můj profil", + "IndexerAvistazSettingsUsernameHelpText": "Uživatelské jméno stránky", + "IndexerBeyondHDSettingsLimitedOnly": "Pouze omezené", + "IndexerBeyondHDSettingsLimitedOnlyHelpText": "Hledat pouze freeleech (Omezené nahrávání)", + "IndexerCategories": "Kategorie indexeru", + "IndexerDisabled": "Indexer zakázán", + "IndexerDownloadClientHealthCheckMessage": "Indexery s neplatnými klienty pro stahování: {indexerNames}.", + "IndexerDownloadClientHelpText": "Určete, který klient pro stahování se použije pro grabování v rámci {appName} z tohoto indexeru", + "IndexerFailureRate": "Míra selhání indexeru", + "IndexerFileListSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání", + "IndexerFileListSettingsPasskeyHelpText": "Přístupový klíč stránky (Jedná se o alfanumerický řetězec v url adrese trackeru zobrazené v klientovi pro stahování)", + "IndexerGazelleGamesSettingsApiKeyHelpText": "Klíč API ze stránky (Naleznete v Nastavení => Nastavení přístupu)", + "IndexerGazelleGamesSettingsSearchGroupNames": "Hledat názvy skupin", + "IndexerHDBitsSettingsFreeleechOnlyHelpText": "Zobrazit pouze freeleech vydání", + "IndexerHDBitsSettingsOriginsHelpText": "Pokud není zadáno, použijí se všechny možnosti.", + "IndexerHDBitsSettingsUseFilenames": "Použít názvy souborů", + "IndexerHealthCheckNoIndexers": "Nejsou povoleny žádné indexery, {appName} nevrátí výsledky vyhledávání", + "IndexerIPTorrentsSettingsCookieUserAgent": "Uživatelský agent cookie", + "IndexerIPTorrentsSettingsCookieUserAgentHelpText": "Uživatelský agent přidružený cookie použitý z prohlížeče", + "IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání", + "IndexerNebulanceSettingsApiKeyHelpText": "Klíč API z Nastavení uživatele > Klíče API. Klíč musí mít oprávnění Seznam a Stáhnout", + "IndexerNewznabSettingsAdditionalParametersHelpText": "Dodatečné parametry Newznab", + "IndexerNewznabSettingsApiKeyHelpText": "Klíč API stránky", + "IndexerObsoleteCheckMessage": "Indexery jsou zastaralé nebo byly aktualizovány: {0}. Odeberte je a (nebo) znovu přidejte do {appName}", + "IndexerOrpheusSettingsApiKeyHelpText": "Klíč API ze stránky (Naleznete v Nastavení => Nastavení přístupu)", + "IndexerPassThePopcornSettingsApiUserHelpText": "Tato nastavení naleznete v nastavení zabezpečení PassThePopcorn (Upravit profil > Zabezpečení).", + "IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání", + "IndexerRedactedSettingsApiKeyHelpText": "Klíč API ze stránky (Naleznete v Nastavení => Nastavení přístupu)", + "IndexerRss": "RSS indexeru", + "LastFailure": "Poslední selhání", + "IndexerSettingsAdditionalParameters": "Dodatečné parametry", + "IndexerSettingsApiPath": "Cesta k API", + "IndexerSettingsApiUser": "Uživatel API", + "IndexerAuth": "Ověření indexeru", + "IndexerInfo": "Informace o indexeru", + "IndexerName": "Název indexeru", + "IndexerDetails": "Podrobnosti indexeru", + "IndexerHDBitsSettingsPasskeyHelpText": "Přístupový klíč z Podrobnosti o uživateli", + "IndexerQuery": "Dotaz na indexer", + "IndexerAlphaRatioSettingsExcludeScene": "Vyloučit SCENE", + "IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání", + "IndexerBeyondHDSettingsSearchTypes": "Hledat typy", + "IndexerBeyondHDSettingsSearchTypesHelpText": "Vyberte typy vydání, které vás zajímají. Pokud není vybrán žádný, použijí se všechny možnosti.", + "IndexerFileListSettingsUsernameHelpText": "Uživatelské jméno stránky", + "IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Musí mít oprávnění Uživatel a Torrenty", + "IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Hledat vydání podle názvů skupin", + "IndexerHDBitsSettingsMediumsHelpText": "Pokud není zadáno, použijí se všechny možnosti.", + "IndexerHDBitsSettingsUseFilenamesHelpText": "Zaškrtněte tuto možnost, pokud chcete používat názvy souborů torrentů jako názvy vydání", + "IndexerNewznabSettingsVipExpirationHelpText": "Zadejte datum (rrrr-mm-dd) pro vypršení VIP nebo prázdné, {appName} bude upozorňovat 1 týden před vypršením VIP", + "IndexerNzbIndexSettingsApiKeyHelpText": "Klíč API stránky", + "IndexerPassThePopcornSettingsApiKeyHelpText": "Klíč API stránky", + "IndexerMTeamTpSettingsApiKeyHelpText": "Klíč API ze stránky (Naleznete v Uživatelský ovládací panel => Zabezpečení => Laboratoř)", + "IndexerPassThePopcornSettingsGoldenPopcornOnly": "Pouze Golden Popcorn", + "IndexerPassThePopcornSettingsGoldenPopcornOnlyHelpText": "Hledat pouze vydání Golden Popcorn", + "IndexerSettingsApiPathHelpText": "Cesta k api, obvykle {url}", + "IndexerAvistazSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání", + "InitialFailure": "Úvodní selhání" } diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 1e2c052f2..b07ede40b 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -87,13 +87,13 @@ "Delete": "Löschen", "DeleteAppProfile": "App-Profil löschen", "DeleteApplication": "Applikation löschen", - "DeleteApplicationMessageText": "Wirklich die Applikation '{0}' löschen?", + "DeleteApplicationMessageText": "Bist du sicher, dass du die Anwendung „{name}“ löschen möchtest?", "DeleteBackup": "Sicherung löschen", "DeleteBackupMessageText": "Soll das Backup '{name}' wirklich gelöscht werden?", "DeleteDownloadClient": "Download-Client löschen", "DeleteDownloadClientMessageText": "Bist du sicher, dass du den Download Client '{name}' wirklich löschen willst?", "DeleteIndexerProxy": "Indexer Proxy löschen", - "DeleteIndexerProxyMessageText": "Tag '{0}' wirklich löschen?", + "DeleteIndexerProxyMessageText": "Bist du sicher, dass du den Indexer-Proxy „{name}“ löschen möchtest?", "DeleteNotification": "Benachrichtigung löschen", "DeleteNotificationMessageText": "Bist du sicher, dass du die Benachrichtigung '{name}' wirklich löschen willst?", "DeleteTag": "Tag löschen", @@ -165,7 +165,7 @@ "HomePage": "Hauptseite", "Host": "Host", "Hostname": "Hostname", - "Id": "Id", + "Id": "ID", "IgnoredAddresses": "Ignorierte Adressen", "IllRestartLater": "Später neustarten", "IncludeHealthWarningsHelpText": "Zustandswarnung", @@ -193,7 +193,7 @@ "IndexerSite": "Indexer-Seite", "IndexerStatusAllUnavailableHealthCheckMessage": "Alle Indexer sind aufgrund von Fehlern nicht verfügbar", "IndexerStatusUnavailableHealthCheckMessage": "Indexer nicht verfügbar aufgrund von Fehlern: {indexerNames}", - "IndexerTagsHelpText": "Benutze Tags, um Indexer-Proxies zu spezifizieren, mit welchen Apps der Indexer synchronisiert oder um Indexer zu organisieren.", + "IndexerTagsHelpText": "Verwende Tags, um Indexer-Proxys oder die Apps, mit denen der Indexer synchronisiert wird, anzugeben.", "IndexerVipExpiredHealthCheckMessage": "Die VIP Indexer Vorteile sind abgelaufen: {indexerNames}", "IndexerVipExpiringHealthCheckMessage": "Die Indexer VIP Vorteile verfallen bald: {indexerNames}", "Indexers": "Indexer", @@ -254,7 +254,7 @@ "Ok": "Ok", "OnApplicationUpdate": "Bei Anwendungsaktualisierung", "OnApplicationUpdateHelpText": "Bei Anwendungsaktualisierung", - "OnGrab": "Bei Erfassung", + "OnGrab": "Bei Release-Grabs", "OnHealthIssue": "Bei Gesundheitsproblem", "OnHealthIssueHelpText": "Zustandsproblem", "OpenBrowserOnStart": "Browser beim Start öffnen", @@ -276,7 +276,7 @@ "Privacy": "Privatsphäre", "Private": "Privat", "Protocol": "Protokoll", - "ProwlarrSupportsAnyDownloadClient": "Jeder Downloader der den Newznab-Standard verwendet oder unten aufgelistet ist wird untertützt.", + "ProwlarrSupportsAnyDownloadClient": "{appName} unterstützt jeden der unten aufgeführten Download-Clients.", "ProwlarrSupportsAnyIndexer": "{appName} unterstützt alle Indexer, welcher den Newznab/Torznab Standard implementiert (verwende 'Generic Newznab' (für Usenet) oder 'Generic Torznab' (für Torrents)) und darüber hinaus viele weitere Indexer. Wählen Sie im Folgenden Ihren Indexer aus der Liste.", "Proxies": "Proxies", "Proxy": "Proxy", @@ -395,7 +395,7 @@ "TestAllClients": "Prüfe alle Clients", "TestAllIndexers": "Prüfe alle Indexer", "OnLatestVersion": "Die neueste Version von {appName} ist bereits installiert", - "ThemeHelpText": "Ändere das UI-Theme der Anwendung. Das 'Auto'-Theme verwendet dein Betriebssystem-Theme, um den hellen oder dunklen Modus einzustellen. Inspiriert von {0}", + "ThemeHelpText": "Ändere das UI-Design der Anwendung, das 'Auto'-Design verwendet das Betriebssystem-Design, um den Hell- oder Dunkelmodus festzulegen. Inspiriert von {inspiredBy}.", "Time": "Zeit", "Title": "Titel", "Today": "Heute", @@ -406,7 +406,7 @@ "Type": "Typ", "UI": "Oberfläche", "UILanguage": "Oberflächen Sprache ( UI Language )", - "UILanguageHelpText": "Sprache für die gesamte Oberfläche", + "UILanguageHelpText": "Sprache, die {appName} für die Benutzeroberfläche verwenden wird", "UILanguageHelpTextWarning": "Webseite muss neu geladen werden", "UISettings": "Benutzeroberflächen Einstellungen", "UISettingsSummary": "Optionen für Datum, Sprache und Farbbeinträchtigungen", @@ -461,7 +461,7 @@ "ApplyChanges": "Änderungen anwenden", "CountIndexersSelected": "{count} Indexer ausgewählt", "DeleteSelectedDownloadClients": "Lösche Download Client(s)", - "DeleteSelectedApplicationsMessageText": "Indexer '{0}' wirklich löschen?", + "DeleteSelectedApplicationsMessageText": "Bist du sicher, dass du {count} ausgewählte Anwendung(en) löschen möchtest?", "DeleteSelectedDownloadClientsMessageText": "Sind Sie sicher, dass Sie {count} ausgewählte Download-Clients löschen möchten?", "DeleteSelectedIndexersMessageText": "Sind Sie sicher, dass Sie {count} ausgewählte(n) Indexer löschen möchten?", "EditSelectedDownloadClients": "Ausgewählte Download Clienten bearbeiten", @@ -518,7 +518,7 @@ "ActiveApps": "Aktive Apps", "ActiveIndexers": "Aktive Indexer", "AppsMinimumSeeders": "Apps Mindestanzahl von Seedern", - "ApplicationTagsHelpText": "Synchronisiere Indexer für diese Anwendung die keine passenden Tags oder mindestens 1 passendes Tag haben", + "ApplicationTagsHelpText": "Indexer mit dieser Anwendung synchronisieren, die mindestens einen übereinstimmenden Tag haben. Wenn hier keine Tags aufgeführt sind, wird kein Indexer aufgrund seiner Tags von der Synchronisierung ausgeschlossen.", "ApplicationTagsHelpTextWarning": "Tags sollten mit Vorsicht verwendet werden, da sie ungewollte Effekte haben können. Eine Anwendung mit einem Tag synchronisiert nur Indexer die den Gleichen Tag haben.", "AddApplicationImplementation": "Anwendung hinzufügen - {implementationName}", "AddConnectionImplementation": "Verbindung hinzufügen - {implementationName}", @@ -670,5 +670,141 @@ "SeedRatio": "Seed-Verhältnis", "SeedTime": "Seed-Zeit", "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Wenn ein Torrent durch einen Hash blockiert wird, wird er möglicherweise nicht korrekt abgelehnt während RSS/Recherche für einige Indexer. Diese Option aktiviert die Ablehnung des Torrents nach dem Abrufen, aber bevor er an den Client gesendet wird.", - "IndexerHDBitsSettingsOriginsHelpText": "Wenn nicht angegeben, werden alle Optionen verwendet." + "IndexerHDBitsSettingsOriginsHelpText": "Wenn nicht angegeben, werden alle Optionen verwendet.", + "IndexerSettingsGrabLimit": "Grab-Limit", + "IndexerBeyondHDSettingsLimitedOnlyHelpText": "Nur nach Freeleech suchen (Begrenztes UL)", + "IndexerFileListSettingsPasskeyHelpText": "Site Passkey (Dies ist die alphanumerische Zeichenfolge in der Tracker-URL, die in deinem Download-Client angezeigt wird)", + "IndexerIPTorrentsSettingsCookieUserAgent": "Cookie-Benutzer-Agent", + "DownloadClientSettingsDefaultCategorySubFolderHelpText": "Standard-Fallback-Kategorie, wenn für eine Veröffentlichung keine zugeordnete Kategorie existiert. Das Hinzufügen einer für {appName} spezifischen Kategorie vermeidet Konflikte mit nicht verwandten {appName}-Downloads. Die Verwendung einer Kategorie ist optional, aber dringend empfohlen. Eine [Kategorie]-Unterverzeichnis wird im Ausgabeverzeichnis erstellt.", + "IndexerBeyondHDSettingsRssKeyHelpText": "RSS-Schlüssel von der Website (zu finden unter Mein Sicherheitsbereich => RSS-Schlüssel)", + "IndexerHDBitsSettingsUseFilenamesHelpText": "Aktiviere diese Option, wenn du Torrent-Dateinamen als Releasetitel verwenden möchtest", + "IndexerSettingsAppsMinimumSeedersHelpText": "Minimale benötigte Seeder von den Anwendungen, damit der Indexer greifen kann; leer ist die Standardeinstellung des Sync-Profils", + "IndexerGazelleGamesSettingsApiKeyHelpText": "API-Schlüssel von der Seite (Zu finden unter Einstellungen => Zugriffseinstellungen)", + "IndexerPassThePopcornSettingsApiUserHelpText": "Diese Einstellungen findest du in deinen PassThePopcorn-Sicherheitseinstellungen (Profil bearbeiten > Sicherheit).", + "IndexerSettingsQueryLimitHelpText": "Die maximale Anzahl an Queries, die {appName} der Seite gemäß der jeweiligen Einheit erlauben wird", + "IndexerRedactedSettingsApiKeyHelpText": "API-Schlüssel von der Seite (Zu finden unter Einstellungen => Zugriffseinstellungen)", + "IndexerSettingsQueryLimit": "Query Limit", + "PackSeedTimeHelpText": "Die Zeit, die ein Pack (Season oder Diskographie)-Torrent gesät werden soll, bevor er gestoppt wird. Leer ist die Standardeinstellung der App", + "TotalIndexerSuccessfulGrabs": "Gesamtanzahl erfolgreicher Indexer-Suchanfragen", + "ProwlarrDownloadClientsInAppOnlyAlert": "Download-Clients sind nur für In-App-Suchen in {appName} und synchronisieren sich nicht mit Apps. Es sind keine Pläne vorgesehen, eine solche Funktionalität hinzuzufügen.", + "TotalUserAgentGrabs": "Gesamtanzahl der User-Agent-Grabs", + "DefaultCategory": "Standardkategorie", + "IndexerDownloadClientHelpText": "Gib an, welcher Download-Client für Grab-Vorgänge, die innerhalb von {appName} von diesem Indexer durchgeführt werden, verwendet wird", + "IndexerHistoryLoadError": "Fehler beim Laden der Indexer-Historie", + "IndexerNzbIndexSettingsApiKeyHelpText": "Website-API-Key", + "IndexerPassThePopcornSettingsApiKeyHelpText": "Website-API-Key", + "IndexerPassThePopcornSettingsGoldenPopcornOnlyHelpText": "Sucher nur Golden Popcorn Releases", + "IndexerSettingsCookieHelpText": "Website Cookie", + "IndexerSettingsPackSeedTimeIndexerHelpText": "Die Zeit, die ein Pack (Season oder Diskographie)-Torrent gesät werden soll, bevor er gestoppt wird. Leer ist die Standardeinstellung der App", + "SearchAllIndexers": "Alle Indexer durchsuchen", + "SearchCountIndexers": "Suche {count} Indexer(s)", + "SeedTimeHelpText": "Die Zeit, die ein Torrent gesät werden soll, bevor er gestoppt wird. Leer ist die Standardeinstellung der App", + "IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Suche nur Freeleech-Releases", + "IndexerNewznabSettingsVipExpirationHelpText": "Gib das Datum (yyyy-mm-dd) für das VIP-Ablaufdatum ein oder lasse es leer, {appName} benachrichtigt eine Woche vor Ablauf des VIP", + "ProxyValidationUnableToConnect": "Kann nicht mit dem Proxy verbunden werden: {exceptionMessage}. Überprüfe das Protokoll rund um diesen Fehler für Details", + "IndexerId": "Indexer ID", + "OnGrabHelpText": "Bei Release Grab", + "AuthQueries": "Authentifizierungsanfragen", + "PackSeedTime": "Pack-Seed-Zeit", + "DeleteSelectedApplications": "Ausgewählte Anwendungen löschen", + "DownloadClientSettingsDefaultCategoryHelpText": "Standard-Fallback-Kategorie, wenn für eine Veröffentlichung keine zugeordnete Kategorie existiert. Das Hinzufügen einer für {appName} spezifischen Kategorie vermeidet Konflikte mit nicht verwandten {appName}-Downloads. Die Verwendung einer Kategorie ist optional, aber dringend empfohlen.", + "FoundCountReleases": "{itemCount} Veröffentlichungen gefunden", + "IncludeManualGrabsHelpText": "Manuelle Abrufe, die innerhalb von {appName} gemacht wurden, einbeziehen", + "IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Nur nach Freeleech-Veröffentlichungen suchen", + "IndexerBeyondHDSettingsApiKeyHelpText": "API-Schlüssel von der Website (zu finden in „Meine Sicherheit“ => „API-Schlüssel“)", + "IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Nur nach Freeleech-Releases suchen", + "IndexerBeyondHDSettingsRefundOnlyHelpText": "Nur nach Rückerstattungen suchen", + "IndexerDisabled": "Indexer deaktiviert", + "IndexerFileListSettingsFreeleechOnlyHelpText": "Suche nur Freeleech-Releases", + "IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Suche Veröffentlichungen nach Gruppennamen", + "IndexerNebulanceSettingsApiKeyHelpText": "API-Schlüssel aus den Benutzereinstellungen > API-Schlüssel. Der Schlüssel muss List- und Download-Berechtigungen haben", + "IndexerSettingsGrabLimitHelpText": "Die maximale Anzahl an Grabs, die {appName} der Seite erlauben wird, wie von der jeweiligen Einheit festgelegt", + "IndexerSettingsLimitsUnit": "Limits-Einheit", + "IndexerSettingsLimitsUnitHelpText": "Die Zeiteinheit zur Berechnung der Limits pro Indexer", + "IndexerStatus": "Indexer Status", + "LastFailure": "Letzter Fehler", + "ManageApplications": "Applikationen verwalten", + "NoApplicationsFound": "Keine Applikationen gefunden", + "NoIndexerCategories": "Keine Kategorien für diesen Indexer gefunden", + "NoIndexerHistory": "Keine Historie für diesen Indexer gefunden", + "Open": "Offen", + "OverrideAndAddToDownloadClient": "Überschreiben und zum Download-Client hinzufügen", + "PreferMagnetUrl": "Magnet URL bevorzugen", + "PreferMagnetUrlHelpText": "Wenn aktiviert, wird dieser Indexer die Verwendung von Magnet-URLs für Grabs bevorzugen, mit Rückfall auf Torrent-Links", + "RssQueries": "RSS Anfragen", + "TotalHostGrabs": "Gesamtanzahl der Host-Grabs", + "TotalHostQueries": "Gesamtanzahl der Host-Suchanfragen", + "SeedRatioHelpText": "Das Verhältnis, das ein Torrent erreichen sollte, bevor er gestoppt wird. Leer ist die Standardeinstellung der App", + "AverageGrabs": "Durchschnittliche Abrufe", + "AverageQueries": "Durchschnittliche Anfragen", + "SelectedCountOfCountReleases": "Ausgewählt {selectedCount} von {itemCount} Releases", + "NewznabUrl": "Newznab Url", + "QueryType": "Abfragetyp", + "DisabledUntil": "Deaktiviert bis", + "MappedCategories": "Zuordnete Kategorien", + "AreYouSureYouWantToDeleteIndexer": "Bist du sicher, dass du „{name}“ aus {appName} löschen möchtest?", + "TotalIndexerQueries": "Gesamtanzahl der Indexer-Suchanfragen", + "ProwlarrDownloadClientsAlert": "Wenn du beabsichtigst, direkt innerhalb von {appName} zu suchen, musst du Download-Clients hinzufügen. Andernfalls musst du sie hier nicht hinzufügen. Für Suchen aus deinen Apps werden stattdessen die dort konfigurierten Download-Clients verwendet.", + "AppsMinimumSeedersHelpText": "Mindestanzahl an Seedern, die von der Anwendung für den Indexer erforderlich ist, um herunterzuladen. Leer bedeutet, dass das Standardprofil der Synchronisierung verwendet wird", + "CountIndexersAvailable": "{count} Indexer verfügbar", + "DeleteClientCategory": "Download-Client-Kategorie löschen", + "DeleteSelectedIndexer": "Ausgewählten Indexer löschen", + "TotalGrabs": "Gesamtanzahl der Grabs", + "DownloadClientCategory": "Download-Client-Kategorie", + "EditCategory": "Kategorie bearbeiten", + "IndexerSettingsApiUser": "API Benutzer", + "RssFeed": "RSS Feed", + "InitialFailure": "Initialer Fehler", + "ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Blockierte Torrent-Hashes beim Abrufen synchron ablehnen", + "DeleteSelectedIndexers": "Ausgewählte Indexer löschen", + "IndexerHDBitsSettingsPasskeyHelpText": "Passkey aus den Benutzerdetails", + "IndexerSettingsPasskey": "Pass Key", + "ClickToChangeQueryOptions": "Klicken, um Abfrageoptionen zu ändern", + "IndexerCategories": "Indexer-Kategorien", + "SearchQueries": "Suchanfragen", + "IndexerAlphaRatioSettingsExcludeScene": "SCENE ausschließen", + "IndexerAlphaRatioSettingsExcludeSceneHelpText": "SCENE-Veröffentlichungen aus den Ergebnissen ausschließen", + "IndexerBeyondHDSettingsRefundOnly": "Nur Rückerstattung", + "IndexerFileListSettingsUsernameHelpText": "Website-Benutzername", + "IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Muss Benutzer- und Torrents-Berechtigungen haben", + "IndexerHDBitsSettingsFreeleechOnlyHelpText": "Zeige nur Freeleech-Releases", + "IndexerHDBitsSettingsUsernameHelpText": "Webseite-Benutzername", + "IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Suche nur Freeleech-Releases", + "IndexerNewznabSettingsApiKeyHelpText": "Website API Key", + "IndexerOrpheusSettingsApiKeyHelpText": "API-Schlüssel von der Seite (Zu finden unter Einstellungen => Zugriffseinstellungen)", + "IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "Suche nur Freeleech-Releases", + "IndexerTorrentSyndikatSettingsApiKeyHelpText": "Website-API-Schlüssel", + "AreYouSureYouWantToDeleteCategory": "Bist du sicher, dass du die zugeordnete Kategorie löschen möchtest?", + "DownloadClientSettingsPriorityItemHelpText": "Priorität, die beim Abrufen von Elementen verwendet werden soll", + "GoToApplication": "Zur Anwendung gehen", + "HistoryDetails": "Historie-Details", + "IndexerBeyondHDSettingsLimitedOnly": "Nur begrenzt", + "IndexerHDBitsSettingsOrigins": "Ursprünge", + "IndexerHDBitsSettingsUseFilenames": "Verwende Dateinamen", + "IndexerIPTorrentsSettingsCookieUserAgentHelpText": "User-Agent, der mit dem Cookie aus dem Browser verwendet wird", + "IndexerNewznabSettingsAdditionalParametersHelpText": "Zusätzliche Newznab-Parameter", + "IndexerSettingsPackSeedTime": "Pack-Seed-Zeit", + "IndexerSettingsRssKey": "RSS Schlüssel", + "IndexerMTeamTpSettingsApiKeyHelpText": "API-Schlüssel von der Seite (Zu finden im Benutzersteuerungsfeld => Sicherheit => Labor)", + "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Suche nur Freeleech-Releases", + "IndexerSettingsFreeleechOnly": "Nur Freeleech", + "IndexerSettingsPreferMagnetUrl": "Magnet-URL bevorzugen", + "IndexerSettingsPreferMagnetUrlHelpText": "Wenn aktiviert, bevorzugt dieser Indexer die Verwendung von Magnet-URLs für Grabs mit Rückfall auf Torrent-Links", + "TorznabUrl": "Torznab Url", + "IndexerPassThePopcornSettingsGoldenPopcornOnly": "Nur Golden Popcorn", + "IndexerSettingsBaseUrl": "Basis Url", + "IndexerAvistazSettingsFreeleechOnlyHelpText": "Nur nach Freeleech-Veröffentlichungen suchen", + "IndexerAvistazSettingsPasswordHelpText": "Website-Passwort", + "IndexerAvistazSettingsPidHelpText": "PID aus der „Mein Konto“- oder „Mein Profil“-Seite", + "IndexerAvistazSettingsUsernameHelpText": "Website-Benutzername", + "IndexerAvistazSettingsUsernameHelpTextWarning": "Nur Mitglieder mit Rang „Mitglied“ und höher können die API auf diesem Indexer nutzen.", + "IndexerBeyondHDSettingsRewindOnly": "Nur zurückspulen", + "IndexerBeyondHDSettingsRewindOnlyHelpText": "Nur Rückwärtssuche", + "IndexerBeyondHDSettingsSearchTypesHelpText": "Wähle die Arten von Veröffentlichungen aus, die dich interessieren. Wenn keine ausgewählt sind, werden alle Optionen verwendet.", + "IndexerFailureRate": "Indexer-Fehlerrate", + "IndexerGazelleGamesSettingsSearchGroupNames": "Suche Gruppennamen", + "IndexerSettingsBaseUrlHelpText": "Wähle die Basis-Url aus, die {appName} für Anfragen an die Seite verwenden soll", + "RepeatSearch": "Suche wiederholen", + "AverageResponseTimesMs": "Durchschnittliche Indexer-Antwortzeiten (ms)", + "BasicSearch": "Einfache Suche" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 0f63479f7..27730aeee 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -88,7 +88,7 @@ "Logs": "Lokitiedot", "Mechanism": "Mekanismi", "Name": "Nimi", - "NoLinks": "Ei linkkejä", + "NoLinks": "Kytköksiä ei ole", "Peers": "Vertaiset", "Presets": "Esiasetukset", "Priority": "Painotus", @@ -121,7 +121,7 @@ "TagIsNotUsedAndCanBeDeleted": "Tunniste ei ole käytössä ja voidaan poistaa.", "TagsSettingsSummary": "Täältä näet kaikki tunnisteet käyttökohteineen ja voit poistaa käyttämättömät tunnisteet.", "Tasks": "Tehtävät", - "Test": "Testaa", + "Test": "Koesta", "TestAllClients": "Koesta palvelut", "Time": "Aika", "Title": "Nimike", @@ -369,7 +369,7 @@ "EnableRssHelpText": "Käytä hakupalvelulle RSS-syötettä.", "DeleteApplication": "Poista sovellus", "DeleteAppProfile": "Poista sovellusprofiili", - "IndexerProxies": "Tiedonhaun välityspalvelimet", + "IndexerProxies": "Hakupalveluiden välityspalvelimet", "IndexerAuth": "Hakupalvelun todennus", "Notifications": "Ilmoituspalvelut", "NotificationTriggersHelpText": "Valitse ilmoituksen laukaisevat tapahtumat.", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 8e67403f0..9400b9b04 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -16,7 +16,7 @@ "Added": "添加日期", "AddedToDownloadClient": "发布已添加档案到客户端", "AddingTag": "添加标签", - "Age": "年龄", + "Age": "寿命", "All": "全部", "AllIndexersHiddenDueToFilter": "由于应用了筛选器,所有索引器都被隐藏。", "Analytics": "分析", @@ -735,5 +735,16 @@ "PreviouslyInstalled": "上次安装", "FailedToFetchSettings": "设置同步失败", "DownloadClientSettingsPriorityItemHelpText": "抓取内容时优先使用", - "IndexerAlphaRatioSettingsExcludeScene": "排除场景" + "IndexerAlphaRatioSettingsExcludeScene": "排除场景", + "IndexerAlphaRatioSettingsExcludeSceneHelpText": "从结果中排除场景版本", + "IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "只搜索免费发布", + "IndexerBeyondHDSettingsFreeleechOnlyHelpText": "只搜索免费发布", + "IndexerBeyondHDSettingsLimitedOnly": "仅限", + "IndexerBeyondHDSettingsApiKeyHelpText": "来自网站的API密钥(在我的安全 => API密钥)", + "IndexerAvistazSettingsFreeleechOnlyHelpText": "只搜索免费发布", + "IndexerAvistazSettingsPasswordHelpText": "网站密码", + "IndexerAvistazSettingsPidHelpText": "我的帐户或个人资料页的PID", + "IndexerAvistazSettingsUsernameHelpText": "网站用户名", + "IndexerAvistazSettingsUsernameHelpTextWarning": "只有成员级别及以上才能使用此索引器上的API。", + "IndexerBeyondHDSettingsLimitedOnlyHelpText": "仅限免费搜索(有限UL)" } From e6901506a0fb1a9de0422bdeb8d6c43e631e303c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 2 Feb 2025 17:44:31 +0200 Subject: [PATCH 14/82] Fixed: (IPTorrents) Cleanup languages between brackets when possible --- src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs b/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs index d000c8206..d77c26935 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/IPTorrents.cs @@ -403,10 +403,13 @@ namespace NzbDrone.Core.Indexers.Definitions private static string CleanTitle(string title) { - // drop invalid chars that seems to have cropped up in some titles. #6582 + // Drop invalid chars that seems to have cropped up in some titles. #6582 title = Regex.Replace(title, @"[\u0000-\u0008\u000A-\u001F\u0100-\uFFFF]", string.Empty, RegexOptions.Compiled); title = Regex.Replace(title, @"[\(\[\{]REQ(UEST(ED)?)?[\)\]\}]", string.Empty, RegexOptions.Compiled | RegexOptions.IgnoreCase); + // Drop languages between brackets conflicting with anime release group parsing + title = Regex.Replace(title, @"^\[[a-z0-9 ._-]+\][-._ ](?.*-[a-z0-9]+)$", "${title}", RegexOptions.Compiled | RegexOptions.IgnoreCase); + return title.Trim(' ', '-', ':'); } } From d1846fde615f939a2bb41e2445a5aea6174997bc Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Mon, 2 Sep 2024 15:21:34 +0300 Subject: [PATCH 15/82] New: (Myanonamouse) Prevent downloads without FL tokens Co-authored-by: Kalon Shannon-Innes <mav@hotmail.com.au> --- ...42_myanonamouse_freeleech_wedge_options.cs | 60 +++++++++++++ .../Indexers/Definitions/MyAnonamouse.cs | 85 +++++++++++++------ 2 files changed, 121 insertions(+), 24 deletions(-) create mode 100644 src/NzbDrone.Core/Datastore/Migration/042_myanonamouse_freeleech_wedge_options.cs diff --git a/src/NzbDrone.Core/Datastore/Migration/042_myanonamouse_freeleech_wedge_options.cs b/src/NzbDrone.Core/Datastore/Migration/042_myanonamouse_freeleech_wedge_options.cs new file mode 100644 index 000000000..5a93488d5 --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/042_myanonamouse_freeleech_wedge_options.cs @@ -0,0 +1,60 @@ +using System.Collections.Generic; +using System.Data; +using Dapper; +using FluentMigrator; +using Newtonsoft.Json.Linq; +using NzbDrone.Common.Serializer; +using NzbDrone.Core.Datastore.Migration.Framework; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(042)] + public class myanonamouse_freeleech_wedge_options : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Execute.WithConnection(MigrateIndexersToWedgeOptions); + } + + private void MigrateIndexersToWedgeOptions(IDbConnection conn, IDbTransaction tran) + { + var updated = new List<object>(); + + using (var cmd = conn.CreateCommand()) + { + cmd.Transaction = tran; + cmd.CommandText = "SELECT \"Id\", \"Settings\" FROM \"Indexers\" WHERE \"Implementation\" = 'MyAnonamouse'"; + + using (var reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + var id = reader.GetInt32(0); + var settings = Json.Deserialize<JObject>(reader.GetString(1)); + + if (settings.ContainsKey("freeleech") && settings.Value<JToken>("freeleech").Type == JTokenType.Boolean) + { + var optionValue = settings.Value<bool>("freeleech") switch + { + true => 2, // Required + _ => 0 // Never + }; + + settings.Remove("freeleech"); + settings.Add("useFreeleechWedge", optionValue); + } + + updated.Add(new + { + Id = id, + Settings = settings.ToJson() + }); + } + } + } + + var updateSql = "UPDATE \"Indexers\" SET \"Settings\" = @Settings WHERE \"Id\" = @Id"; + conn.Execute(updateSql, updated, transaction: tran); + } + } +} diff --git a/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs b/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs index d2b2f8d1a..9b9dde8b3 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs @@ -16,6 +16,7 @@ using NzbDrone.Common.Http; using NzbDrone.Common.Serializer; using NzbDrone.Core.Annotations; using NzbDrone.Core.Configuration; +using NzbDrone.Core.Exceptions; using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.Indexers.Settings; using NzbDrone.Core.IndexerSearch.Definitions; @@ -36,8 +37,8 @@ namespace NzbDrone.Core.Indexers.Definitions public override bool SupportsPagination => true; public override int PageSize => 100; public override IndexerCapabilities Capabilities => SetCapabilities(); + private readonly ICacheManager _cacheManager; - private static readonly Regex TorrentIdRegex = new Regex(@"tor/download.php\?tid=(?<id>\d+)$"); public MyAnonamouse(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger, ICacheManager cacheManager) : base(httpClient, eventAggregator, indexerStatusService, configService, logger) @@ -59,39 +60,62 @@ namespace NzbDrone.Core.Indexers.Definitions { var downloadLink = link.RemoveQueryParam("canUseToken"); - if (Settings.Freeleech && bool.TryParse(link.GetQueryParam("canUseToken"), out var canUseToken) && canUseToken) + if (Settings.UseFreeleechWedge is (int)MyAnonamouseFreeleechWedgeAction.Preferred or (int)MyAnonamouseFreeleechWedgeAction.Required && + bool.TryParse(link.GetQueryParam("canUseToken"), out var canUseToken) && canUseToken) { - _logger.Debug("Attempting to use freeleech token for {0}", downloadLink.AbsoluteUri); + _logger.Debug("Attempting to use freeleech wedge for {0}", downloadLink.AbsoluteUri); - var idMatch = TorrentIdRegex.Match(downloadLink.AbsoluteUri); - if (idMatch.Success) + if (int.TryParse(link.GetQueryParam("tid"), out var torrentId) && torrentId > 0) { - var id = int.Parse(idMatch.Groups["id"].Value); var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds(); var freeleechUrl = Settings.BaseUrl + $"json/bonusBuy.php/{timestamp}"; - var freeleechRequest = new HttpRequestBuilder(freeleechUrl) + var freeleechRequestBuilder = new HttpRequestBuilder(freeleechUrl) + .Accept(HttpAccept.Json) .AddQueryParam("spendtype", "personalFL") - .AddQueryParam("torrentid", id) - .AddQueryParam("timestamp", timestamp.ToString()) - .Build(); + .AddQueryParam("torrentid", torrentId) + .AddQueryParam("timestamp", timestamp.ToString()); - var indexerReq = new IndexerRequest(freeleechRequest); - var response = await FetchIndexerResponse(indexerReq).ConfigureAwait(false); - var resource = Json.Deserialize<MyAnonamouseBuyPersonalFreeleechResponse>(response.Content); + freeleechRequestBuilder.LogResponseContent = true; + + var cookies = GetCookies(); + + if (cookies != null && cookies.Any()) + { + freeleechRequestBuilder.SetCookies(Cookies); + } + + var freeleechRequest = freeleechRequestBuilder.Build(); + + var freeleechResponse = await _httpClient.ExecuteProxiedAsync(freeleechRequest, Definition).ConfigureAwait(false); + + var resource = Json.Deserialize<MyAnonamouseBuyPersonalFreeleechResponse>(freeleechResponse.Content); if (resource.Success) { - _logger.Debug("Successfully to used freeleech token for torrentid {0}", id); + _logger.Debug("Successfully used freeleech wedge for torrentid {0}.", torrentId); + } + else if (resource.Error.IsNotNullOrWhiteSpace() && resource.Error.ContainsIgnoreCase("This is already a personal freeleech")) + { + _logger.Debug("{0} is already a personal freeleech, continuing downloading: {1}", torrentId, resource.Error); } else { - _logger.Debug("Failed to use freeleech token: {0}", resource.Error); + _logger.Warn("Failed to purchase freeleech wedge for {0}: {1}", torrentId, resource.Error); + + if (Settings.UseFreeleechWedge == (int)MyAnonamouseFreeleechWedgeAction.Preferred) + { + _logger.Debug("'Use Freeleech Wedge' option set to preferred, continuing downloading: '{0}'", downloadLink.AbsoluteUri); + } + else + { + throw new ReleaseUnavailableException($"Failed to buy freeleech wedge and 'Use Freeleech Wedge' is set to required, aborting download: '{downloadLink.AbsoluteUri}'"); + } } } else { - _logger.Debug("Could not get torrent id from link {0}, skipping freeleech", downloadLink.AbsoluteUri); + _logger.Warn("Could not get torrent id from link {0}, skipping use of freeleech wedge.", downloadLink.AbsoluteUri); } } @@ -535,7 +559,7 @@ namespace NzbDrone.Core.Indexers.Definitions .CombinePath("/tor/download.php") .AddQueryParam("tid", torrentId); - if (_settings.Freeleech && canUseToken) + if (_settings.UseFreeleechWedge is (int)MyAnonamouseFreeleechWedgeAction.Preferred or (int)MyAnonamouseFreeleechWedgeAction.Required && canUseToken) { url = url.AddQueryParam("canUseToken", "true"); } @@ -592,6 +616,7 @@ namespace NzbDrone.Core.Indexers.Definitions SearchInSeries = false; SearchInFilenames = false; SearchLanguages = Array.Empty<int>(); + UseFreeleechWedge = (int)MyAnonamouseFreeleechWedgeAction.Never; } [FieldDefinition(2, Type = FieldType.Textbox, Label = "Mam Id", HelpText = "Mam Session Id (Created Under Preferences -> Security)")] @@ -600,21 +625,21 @@ namespace NzbDrone.Core.Indexers.Definitions [FieldDefinition(3, Type = FieldType.Select, Label = "Search Type", SelectOptions = typeof(MyAnonamouseSearchType), HelpText = "Specify the desired search type")] public int SearchType { get; set; } - [FieldDefinition(4, Type = FieldType.Checkbox, Label = "Use Freeleech Wedges", HelpText = "Use freeleech wedges to make grabbed torrents personal freeleech")] - public bool Freeleech { get; set; } - - [FieldDefinition(5, Type = FieldType.Checkbox, Label = "Search in description", HelpText = "Search text in the description")] + [FieldDefinition(4, Type = FieldType.Checkbox, Label = "Search in description", HelpText = "Search text in the description")] public bool SearchInDescription { get; set; } - [FieldDefinition(6, Type = FieldType.Checkbox, Label = "Search in series", HelpText = "Search text in the series")] + [FieldDefinition(5, Type = FieldType.Checkbox, Label = "Search in series", HelpText = "Search text in the series")] public bool SearchInSeries { get; set; } - [FieldDefinition(7, Type = FieldType.Checkbox, Label = "Search in filenames", HelpText = "Search text in the filenames")] + [FieldDefinition(6, Type = FieldType.Checkbox, Label = "Search in filenames", HelpText = "Search text in the filenames")] public bool SearchInFilenames { get; set; } - [FieldDefinition(8, Type = FieldType.Select, Label = "Search Languages", SelectOptions = typeof(MyAnonamouseSearchLanguages), HelpText = "Specify the desired languages. If unspecified, all options are used.")] + [FieldDefinition(7, Type = FieldType.Select, Label = "Search Languages", SelectOptions = typeof(MyAnonamouseSearchLanguages), HelpText = "Specify the desired languages. If unspecified, all options are used.")] public IEnumerable<int> SearchLanguages { get; set; } + [FieldDefinition(8, Type = FieldType.Select, Label = "Use Freeleech Wedges", SelectOptions = typeof(MyAnonamouseFreeleechWedgeAction), HelpText = "Use freeleech wedges to make grabbed torrents personal freeleech")] + public int UseFreeleechWedge { get; set; } + public override NzbDroneValidationResult Validate() { return new NzbDroneValidationResult(Validator.Validate(this)); @@ -834,6 +859,18 @@ namespace NzbDrone.Core.Indexers.Definitions Other = 47, } + public enum MyAnonamouseFreeleechWedgeAction + { + [FieldOption(Label = "Never", Hint = "Do not buy as freeleech")] + Never = 0, + + [FieldOption(Label = "Preferred", Hint = "Buy and use wedge if possible")] + Preferred = 1, + + [FieldOption(Label = "Required", Hint = "Abort download if unable to buy wedge")] + Required = 2, + } + public class MyAnonamouseTorrent { public int Id { get; set; } From 0d3d27e46ff74bfc4ca244c254580f523fbdb900 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Fri, 24 Jan 2025 23:50:06 +0200 Subject: [PATCH 16/82] Fixed: (HDB) Use release name for full discs and XXX content --- src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs index b157aaf9b..ff6692407 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs @@ -102,7 +102,8 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits private string GetTitle(TorrentQueryResponse item) { - return _settings.UseFilenames && item.FileName.IsNotNullOrWhiteSpace() + // Use release name for XXX content and full discs + return item.TypeCategory != 7 && item.TypeMedium != 1 && _settings.UseFilenames && item.FileName.IsNotNullOrWhiteSpace() ? item.FileName.Replace(".torrent", "", StringComparison.InvariantCultureIgnoreCase) : item.Name; } From 12ff612775605de1b9fa33f62b89887819d08e82 Mon Sep 17 00:00:00 2001 From: zodihax <gerund-frugal-0m@icloud.com> Date: Mon, 3 Feb 2025 17:03:40 +0100 Subject: [PATCH 17/82] Fixed: (NorBits) Added main categories to avoid invalid releases (#2337) NorBits also has these main categories in addition to the already configured sub-categories. This PR adds these main categories. Prowlarr often return 0 query results even when there are query results, this is probably caused by all the results only having a main category (for instance "TV") and no sub-categories. `|Warn|NorBits|Invalid Release: '<redacted>' from indexer: NorBits. No categories provided.` --- src/NzbDrone.Core/Indexers/Definitions/NorBits.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs index 096199880..4e61110ca 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs @@ -129,16 +129,19 @@ public class NorBits : TorrentIndexerBase<NorBitsSettings> } }; + caps.Categories.AddCategoryMapping("main_cat[]=1", NewznabStandardCategory.Movies, "Filmer"); caps.Categories.AddCategoryMapping("main_cat[]=1&sub2_cat[]=49", NewznabStandardCategory.MoviesUHD, "Filmer - UHD-2160p"); caps.Categories.AddCategoryMapping("main_cat[]=1&sub2_cat[]=19", NewznabStandardCategory.MoviesHD, "Filmer - HD-1080p/i"); caps.Categories.AddCategoryMapping("main_cat[]=1&sub2_cat[]=20", NewznabStandardCategory.MoviesHD, "Filmer - HD-720p"); caps.Categories.AddCategoryMapping("main_cat[]=1&sub2_cat[]=22", NewznabStandardCategory.MoviesSD, "Filmer - SD"); + caps.Categories.AddCategoryMapping("main_cat[]=2", NewznabStandardCategory.TV, "TV"); caps.Categories.AddCategoryMapping("main_cat[]=2&sub2_cat[]=49", NewznabStandardCategory.TVUHD, "TV - UHD-2160p"); caps.Categories.AddCategoryMapping("main_cat[]=2&sub2_cat[]=19", NewznabStandardCategory.TVHD, "TV - HD-1080p/i"); caps.Categories.AddCategoryMapping("main_cat[]=2&sub2_cat[]=20", NewznabStandardCategory.TVHD, "TV - HD-720p"); caps.Categories.AddCategoryMapping("main_cat[]=2&sub2_cat[]=22", NewznabStandardCategory.TVSD, "TV - SD"); caps.Categories.AddCategoryMapping("main_cat[]=3", NewznabStandardCategory.PC, "Programmer"); caps.Categories.AddCategoryMapping("main_cat[]=4", NewznabStandardCategory.Console, "Spill"); + caps.Categories.AddCategoryMapping("main_cat[]=5", NewznabStandardCategory.Audio, "Musikk"); caps.Categories.AddCategoryMapping("main_cat[]=5&sub2_cat[]=42", NewznabStandardCategory.AudioMP3, "Musikk - 192"); caps.Categories.AddCategoryMapping("main_cat[]=5&sub2_cat[]=43", NewznabStandardCategory.AudioMP3, "Musikk - 256"); caps.Categories.AddCategoryMapping("main_cat[]=5&sub2_cat[]=44", NewznabStandardCategory.AudioMP3, "Musikk - 320"); @@ -146,6 +149,7 @@ public class NorBits : TorrentIndexerBase<NorBitsSettings> caps.Categories.AddCategoryMapping("main_cat[]=5&sub2_cat[]=46", NewznabStandardCategory.AudioLossless, "Musikk - Lossless"); caps.Categories.AddCategoryMapping("main_cat[]=6", NewznabStandardCategory.Books, "Tidsskrift"); caps.Categories.AddCategoryMapping("main_cat[]=7", NewznabStandardCategory.AudioAudiobook, "Lydbøker"); + caps.Categories.AddCategoryMapping("main_cat[]=8", NewznabStandardCategory.AudioVideo, "Musikkvideoer"); caps.Categories.AddCategoryMapping("main_cat[]=8&sub2_cat[]=19", NewznabStandardCategory.AudioVideo, "Musikkvideoer - HD-1080p/i"); caps.Categories.AddCategoryMapping("main_cat[]=8&sub2_cat[]=20", NewznabStandardCategory.AudioVideo, "Musikkvideoer - HD-720p"); caps.Categories.AddCategoryMapping("main_cat[]=8&sub2_cat[]=22", NewznabStandardCategory.AudioVideo, "Musikkvideoer - SD"); From 887c262589769e5408ee2dc4fd044d5d3c63ec9e Mon Sep 17 00:00:00 2001 From: zodihax <gerund-frugal-0m@icloud.com> Date: Wed, 5 Feb 2025 11:55:53 +0100 Subject: [PATCH 18/82] Update release category selector for NorBits (#2338) --- src/NzbDrone.Core/Indexers/Definitions/NorBits.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs index 4e61110ca..067f94077 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs @@ -287,8 +287,8 @@ public class NorBitsParser : IParseIndexerResponse var title = qDetails?.GetAttribute("title").Trim(); var details = _settings.BaseUrl + qDetails?.GetAttribute("href").TrimStart('/'); - var mainCategory = row.QuerySelector("td:nth-of-type(1) > div > a[href*=\"main_cat[]\"]")?.GetAttribute("href")?.Split('?').Last(); - var secondCategory = row.QuerySelector("td:nth-of-type(1) > div > a[href*=\"sub2_cat[]\"]")?.GetAttribute("href")?.Split('?').Last(); + var mainCategory = row.QuerySelector("td:nth-of-type(1) > a[href*=\"main_cat[]\"]")?.GetAttribute("href")?.Split('?').Last(); + var secondCategory = row.QuerySelector("td:nth-of-type(1) > a[href*=\"sub2_cat[]\"]")?.GetAttribute("href")?.Split('?').Last(); var categoryList = new[] { mainCategory, secondCategory }; var cat = string.Join("&", categoryList.Where(c => !string.IsNullOrWhiteSpace(c))); From 56b9da16cfb67cf45b346e810097cd305c3e80f5 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Wed, 5 Feb 2025 19:24:36 +0200 Subject: [PATCH 19/82] Fix release category selector on all themes for NorBits Co-authored-by: Garfield69 <garfield69@outlook.com> --- src/NzbDrone.Core/Indexers/Definitions/NorBits.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs index 067f94077..4287f515f 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs @@ -287,8 +287,8 @@ public class NorBitsParser : IParseIndexerResponse var title = qDetails?.GetAttribute("title").Trim(); var details = _settings.BaseUrl + qDetails?.GetAttribute("href").TrimStart('/'); - var mainCategory = row.QuerySelector("td:nth-of-type(1) > a[href*=\"main_cat[]\"]")?.GetAttribute("href")?.Split('?').Last(); - var secondCategory = row.QuerySelector("td:nth-of-type(1) > a[href*=\"sub2_cat[]\"]")?.GetAttribute("href")?.Split('?').Last(); + var mainCategory = row.QuerySelector("td:nth-of-type(1) a[href*=\"main_cat[]\"]")?.GetAttribute("href")?.Split('?').Last(); + var secondCategory = row.QuerySelector("td:nth-of-type(1) a[href*=\"sub2_cat[]\"]")?.GetAttribute("href")?.Split('?').Last(); var categoryList = new[] { mainCategory, secondCategory }; var cat = string.Join("&", categoryList.Where(c => !string.IsNullOrWhiteSpace(c))); From a036e0fc37e633176a2aef3c389bca81d8425ec6 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Wed, 5 Feb 2025 19:42:32 +0200 Subject: [PATCH 20/82] Fixed: (MAM) Updated property name for user class --- src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs b/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs index 9b9dde8b3..b045b16a8 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs @@ -584,8 +584,11 @@ namespace NzbDrone.Core.Indexers.Definitions _logger.Debug("Fetching user data: {0}", request.Url.FullUri); var response = _httpClient.ExecuteProxied(request, _definition); + var jsonResponse = JsonConvert.DeserializeObject<MyAnonamouseUserDataResponse>(response.Content); + _logger.Trace("Current user class: '{0}'", jsonResponse.UserClass); + return jsonResponse.UserClass?.Trim(); }, TimeSpan.FromHours(1)); @@ -912,7 +915,7 @@ namespace NzbDrone.Core.Indexers.Definitions public class MyAnonamouseUserDataResponse { - [JsonProperty(PropertyName = "class")] + [JsonProperty(PropertyName = "classname")] public string UserClass { get; set; } } } From 43c988d9514b360cd169fba20441bf8e6b375348 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Wed, 5 Feb 2025 19:49:41 +0200 Subject: [PATCH 21/82] Fixed: (MAM) Use the latest cookies on release download --- src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs b/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs index b045b16a8..e8ab9980b 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs @@ -82,7 +82,7 @@ namespace NzbDrone.Core.Indexers.Definitions if (cookies != null && cookies.Any()) { - freeleechRequestBuilder.SetCookies(Cookies); + freeleechRequestBuilder.SetCookies(cookies); } var freeleechRequest = freeleechRequestBuilder.Build(); From 3a4de9cca12f1c8432391cd151ca25c71c40c0f1 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Wed, 5 Feb 2025 19:59:48 +0200 Subject: [PATCH 22/82] Fixed: (MAM) Continue downloading if attempting to buy personal FL for VIP release --- src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs b/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs index e8ab9980b..dad8fe8e8 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/MyAnonamouse.cs @@ -95,6 +95,10 @@ namespace NzbDrone.Core.Indexers.Definitions { _logger.Debug("Successfully used freeleech wedge for torrentid {0}.", torrentId); } + else if (resource.Error.IsNotNullOrWhiteSpace() && resource.Error.ContainsIgnoreCase("This Torrent is VIP")) + { + _logger.Debug("{0} is already VIP, continuing downloading: {1}", torrentId, resource.Error); + } else if (resource.Error.IsNotNullOrWhiteSpace() && resource.Error.ContainsIgnoreCase("This is already a personal freeleech")) { _logger.Debug("{0} is already a personal freeleech, continuing downloading: {1}", torrentId, resource.Error); From a12381fb1d07ab81d8af4c0ed02aba5763bace52 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Wed, 5 Feb 2025 20:06:51 +0200 Subject: [PATCH 23/82] Cleanse "rsskey" from logs --- .../InstrumentationTests/CleanseLogMessageFixture.cs | 1 + src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs b/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs index 857834d3f..9e2b31d87 100644 --- a/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs +++ b/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs @@ -30,6 +30,7 @@ namespace NzbDrone.Common.Test.InstrumentationTests [TestCase(@"https://anthelion.me/api.php?api_key=2b51db35e1910123321025a12b9933d2&o=json&t=movie&q=&tmdb=&imdb=&cat=&limit=100&offset=0")] [TestCase(@"https://avistaz.to/api/v1/jackett/auth: username=mySecret&password=mySecret&pid=mySecret")] [TestCase(@"https://www.sharewood.tv/api/2b51db35e1910123321025a12b9933d2/last-torrents")] + [TestCase(@"https://example.org/rss/torrents?rsskey=2b51db35e1910123321025a12b9933d2&search=")] // Indexer and Download Client Responses diff --git a/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs b/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs index e4b4384b2..393d6613a 100644 --- a/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs +++ b/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs @@ -10,7 +10,7 @@ namespace NzbDrone.Common.Instrumentation private static readonly Regex[] CleansingRules = { // Url - new (@"(?<=[?&: ;])(apikey|api_key|(?:(?:access|api)[-_]?)?token|pass(?:key|wd)?|auth|authkey|user|u?id|api|[a-z_]*apikey|account|pid|pwd)=(?<secret>[^&=""]+?)(?=[ ""&=]|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase), + new (@"(?<=[?&: ;])(apikey|api_key|(?:(?:access|api)[-_]?)?token|pass(?:key|wd)?|auth|authkey|rsskey|user|u?id|api|[a-z_]*apikey|account|pid|pwd)=(?<secret>[^&=""]+?)(?=[ ""&=]|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase), new (@"(?<=[?& ;])[^=]*?(_?(?<!use|get_)token|username|passwo?rd)=(?<secret>[^&=]+?)(?= |&|$|;)", RegexOptions.Compiled | RegexOptions.IgnoreCase), new (@"rss(24h)?\.torrentleech\.org/(?!rss)(?<secret>[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase), new (@"torrentleech\.org/rss/download/[0-9]+/(?<secret>[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase), From 147e732c9ca7a4c289d4f6386f1277650e11f15b Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Thu, 6 Feb 2025 00:36:13 +0200 Subject: [PATCH 24/82] Building docs on ARM Co-authored-by: Mark McDowall <mark@mcdowall.ca> --- docs.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs.sh b/docs.sh index ccfde87a7..ab084b61b 100755 --- a/docs.sh +++ b/docs.sh @@ -3,15 +3,16 @@ set -e FRAMEWORK="net6.0" PLATFORM=$1 +ARCHITECTURE="${2:-x64}" if [ "$PLATFORM" = "Windows" ]; then - RUNTIME="win-x64" + RUNTIME="win-$ARCHITECTURE" elif [ "$PLATFORM" = "Linux" ]; then - RUNTIME="linux-x64" + RUNTIME="linux-$ARCHITECTURE" elif [ "$PLATFORM" = "Mac" ]; then - RUNTIME="osx-x64" + RUNTIME="osx-$ARCHITECTURE" else - echo "Platform must be provided as first arguement: Windows, Linux or Mac" + echo "Platform must be provided as first argument: Windows, Linux or Mac" exit 1 fi From e101129cff942dd7156657627347b6a00b1c1579 Mon Sep 17 00:00:00 2001 From: Weblate <noreply@weblate.org> Date: Fri, 7 Feb 2025 06:33:24 +0000 Subject: [PATCH 25/82] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Marius Nechifor <flm.marius@gmail.com> Co-authored-by: Weblate <noreply-mt-weblate@weblate.org> Co-authored-by: Weblate <noreply@weblate.org> Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fa/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/bg.json | 13 ++++++++++++- src/NzbDrone.Core/Localization/Core/ca.json | 3 ++- src/NzbDrone.Core/Localization/Core/cs.json | 4 +++- src/NzbDrone.Core/Localization/Core/fa.json | 5 ++++- src/NzbDrone.Core/Localization/Core/ko.json | 6 +++++- src/NzbDrone.Core/Localization/Core/ro.json | 12 ++++++++++-- src/NzbDrone.Core/Localization/Core/zh_CN.json | 9 ++++++++- 7 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index b1a0d993f..35327a3a9 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -376,5 +376,16 @@ "ActiveIndexers": "Активни индиксатори", "AddApplication": "добави приложение", "Season": "Причина", - "CurrentlyInstalled": "Понастоящем инсталиран" + "CurrentlyInstalled": "Понастоящем инсталиран", + "DownloadClientSettingsAddPaused": "Добави на пауза", + "Encoding": "Кодиране", + "Episode": "епизод", + "Applications": "Приложения", + "Publisher": "Издател", + "Id": "ИН", + "Theme": "Тема", + "Label": "Етикет", + "Categories": "Категории", + "Album": "албум", + "Artist": "изпълнител" } diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 608973a41..342411047 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -500,5 +500,6 @@ "UpdateAppDirectlyLoadError": "No es pot actualitzar {appName} directament,", "WouldYouLikeToRestoreBackup": "Voleu restaurar la còpia de seguretat '{name}'?", "InstallLatest": "Instal·la l'últim", - "CurrentlyInstalled": "Instal·lat actualment" + "CurrentlyInstalled": "Instal·lat actualment", + "DownloadClientSettingsAddPaused": "Afegeix pausats" } diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 2ac6af341..89f8d9fd1 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -631,5 +631,7 @@ "IndexerPassThePopcornSettingsGoldenPopcornOnlyHelpText": "Hledat pouze vydání Golden Popcorn", "IndexerSettingsApiPathHelpText": "Cesta k api, obvykle {url}", "IndexerAvistazSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání", - "InitialFailure": "Úvodní selhání" + "InitialFailure": "Úvodní selhání", + "IndexerTorrentSyndikatSettingsApiKeyHelpText": "Klíč API stránky", + "SearchTypes": "Hledat typy" } diff --git a/src/NzbDrone.Core/Localization/Core/fa.json b/src/NzbDrone.Core/Localization/Core/fa.json index 0967ef424..2839af8c0 100644 --- a/src/NzbDrone.Core/Localization/Core/fa.json +++ b/src/NzbDrone.Core/Localization/Core/fa.json @@ -1 +1,4 @@ -{} +{ + "ApiKey": "کلید API", + "NetCore": ".NET" +} diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 7bbae2162..bb90922eb 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -417,5 +417,9 @@ "UsenetBlackholeNzbFolder": "Nzb 폴더", "UseSsl": "SSL 사용", "TorrentBlackholeTorrentFolder": "토렌트 폴더", - "DownloadClientPneumaticSettingsNzbFolder": "Nzb 폴더" + "DownloadClientPneumaticSettingsNzbFolder": "Nzb 폴더", + "UserAgentProvidedByTheAppThatCalledTheAPI": "API를 호출한 앱에서 제공하는 사용자 에이전트", + "days": "일", + "minutes": "분", + "Author": "저작자" } diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 928835b58..2385c5ddf 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -444,7 +444,7 @@ "DisabledForLocalAddresses": "Dezactivat pentru adresele locale", "None": "Nici unul", "ResetAPIKeyMessageText": "Sigur doriți să vă resetați cheia API?", - "AddApplicationImplementation": "Adăugați aplicație - {implementareName}", + "AddApplicationImplementation": "Adăugați aplicație - {implementationName}", "AddCategory": "Adăugați categorie", "AddConnection": "Adăugați conexiune", "AddConnectionImplementation": "Adăugați conexiune - {implementationName}", @@ -491,5 +491,13 @@ "Stats": "Status", "CurrentlyInstalled": "În prezent instalat", "Mixed": "Fix", - "Season": "Motiv" + "Season": "Motiv", + "ActiveIndexers": "Indexatorii activi", + "Any": "Oricare", + "AdvancedSettingsShownClickToHide": "Setări avansate afișate, click pentru a le ascunde", + "AdvancedSettingsHiddenClickToShow": "Setări avansate ascunse, click pentru afișare", + "ApiKeyValidationHealthCheckMessage": "Te rugăm să actualizezi cheia API astfel încât să aibă cel puțin {length} caractere. Poți face acest lucru din setări sau din fișierul de configurare", + "AddToDownloadClient": "Adaugă versiunea în clientul de descărcare", + "AddSyncProfile": "Adaugă profil de sincronizare", + "AddedToDownloadClient": "Versiune adăugată în client" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 9400b9b04..830cdbda6 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -746,5 +746,12 @@ "IndexerAvistazSettingsPidHelpText": "我的帐户或个人资料页的PID", "IndexerAvistazSettingsUsernameHelpText": "网站用户名", "IndexerAvistazSettingsUsernameHelpTextWarning": "只有成员级别及以上才能使用此索引器上的API。", - "IndexerBeyondHDSettingsLimitedOnlyHelpText": "仅限免费搜索(有限UL)" + "IndexerBeyondHDSettingsLimitedOnlyHelpText": "仅限免费搜索(有限UL)", + "IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "只搜索免费发布", + "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "只搜索免费发布", + "IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "只搜索免费发布", + "IndexerHDBitsSettingsUsernameHelpText": "网站用户名", + "IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "只搜索免费发布", + "IndexerFileListSettingsFreeleechOnlyHelpText": "只搜索免费发布", + "IndexerFileListSettingsUsernameHelpText": "网站用户名" } From 4df8fc02f1720cac683bc747b244360f0cf2dc2b Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sun, 9 Feb 2025 17:51:35 +0200 Subject: [PATCH 26/82] Bump version to 1.31.2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 15e63d064..a0efed9a7 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.31.1' + majorVersion: '1.31.2' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 44bdff8b8fdb2fbdb07788ee884650b71f53e378 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Wed, 12 Feb 2025 15:50:29 +0200 Subject: [PATCH 27/82] Minor cleanup for AnimeTorrents --- .../Indexers/Definitions/AnimeTorrents.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs b/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs index 120fd690d..9ce2eb525 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs @@ -292,7 +292,7 @@ namespace NzbDrone.Core.Indexers.Definitions var qTitleLink = row.QuerySelector("td:nth-of-type(2) a:nth-of-type(1)"); var title = qTitleLink?.TextContent.Trim(); - // If we search an get no results, we still get a table just with no info. + // If we search and get no results, we still get a table just with no info. if (title.IsNullOrWhiteSpace()) { break; @@ -307,6 +307,8 @@ namespace NzbDrone.Core.Indexers.Definitions var connections = row.QuerySelector("td:nth-of-type(8)").TextContent.Trim().Split('/', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); var seeders = ParseUtil.CoerceInt(connections[0]); + var leechers = ParseUtil.CoerceInt(connections[1]); + var grabs = ParseUtil.CoerceInt(connections[2]); var categoryLink = row.QuerySelector("td:nth-of-type(1) a")?.GetAttribute("href") ?? string.Empty; var categoryId = ParseUtil.GetArgumentFromQueryString(categoryLink, "cat"); @@ -328,17 +330,17 @@ namespace NzbDrone.Core.Indexers.Definitions PublishDate = publishedDate, Size = ParseUtil.GetBytes(row.QuerySelector("td:nth-of-type(6)").TextContent.Trim()), Seeders = seeders, - Peers = ParseUtil.CoerceInt(connections[1]) + seeders, - Grabs = ParseUtil.CoerceInt(connections[2]), + Peers = leechers + seeders, + Grabs = grabs, DownloadVolumeFactor = downloadVolumeFactor, UploadVolumeFactor = 1, Genres = row.QuerySelectorAll("td:nth-of-type(2) a.tortags").Select(t => t.TextContent.Trim()).ToList() }; - var uLFactorImg = row.QuerySelector("img[alt*=\"x Multiplier Torrent\"]"); - if (uLFactorImg != null) + var uploadFactor = row.QuerySelector("img[alt*=\"x Multiplier Torrent\"]")?.GetAttribute("alt"); + if (uploadFactor != null) { - release.UploadVolumeFactor = ParseUtil.CoerceDouble(uLFactorImg.GetAttribute("alt").Split('x')[0]); + release.UploadVolumeFactor = ParseUtil.CoerceDouble(uploadFactor.Split('x')[0]); } releaseInfos.Add(release); @@ -361,7 +363,7 @@ namespace NzbDrone.Core.Indexers.Definitions [FieldDefinition(4, Label = "Freeleech Only", Type = FieldType.Checkbox, HelpText = "Show freeleech torrents only")] public bool FreeleechOnly { get; set; } - [FieldDefinition(5, Label = "Downloadable Only", Type = FieldType.Checkbox, HelpText = "Search downloadable torrents only (enable this only if your account class is Newbie)")] + [FieldDefinition(5, Label = "Downloadable Only", Type = FieldType.Checkbox, HelpText = "Search downloadable torrents only (enable this only if your account class is Newbie)", Advanced = true)] public bool DownloadableOnly { get; set; } } } From 8672129d5a98cac9b591535aa0a63ac64df2766e Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Wed, 12 Feb 2025 15:51:48 +0200 Subject: [PATCH 28/82] Fixed: (AnimeTorrents) Switched to cookies login --- .../Indexers/Definitions/AnimeTorrents.cs | 52 +++++-------------- 1 file changed, 12 insertions(+), 40 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs b/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs index 9ce2eb525..14b64979b 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text.RegularExpressions; -using System.Threading.Tasks; using AngleSharp.Html.Parser; using NLog; using NzbDrone.Common.Extensions; @@ -44,46 +43,19 @@ namespace NzbDrone.Core.Indexers.Definitions return new AnimeTorrentsParser(Settings, Capabilities.Categories); } - protected override async Task DoLogin() - { - UpdateCookies(null, null); - - var loginUrl = Settings.BaseUrl + "login.php"; - - var loginPage = await ExecuteAuth(new HttpRequest(loginUrl)); - - var requestBuilder = new HttpRequestBuilder(loginUrl) - { - LogResponseContent = true, - AllowAutoRedirect = true - }; - - var authLoginRequest = requestBuilder - .Post() - .SetCookies(loginPage.GetCookies()) - .AddFormParameter("username", Settings.Username) - .AddFormParameter("password", Settings.Password) - .AddFormParameter("form", "login") - .AddFormParameter("rememberme[]", "1") - .SetHeader("Content-Type", "application/x-www-form-urlencoded") - .SetHeader("Referer", loginUrl) - .Build(); - - var response = await ExecuteAuth(authLoginRequest); - - if (response.Content == null || !response.Content.Contains("logout.php")) - { - throw new IndexerAuthException("AnimeTorrents authentication failed"); - } - - UpdateCookies(response.GetCookies(), DateTime.Now.AddDays(30)); - - _logger.Debug("AnimeTorrents authentication succeeded"); - } - protected override bool CheckIfLoginNeeded(HttpResponse httpResponse) { - return httpResponse.Content.Contains("Access Denied!") || httpResponse.Content.Contains("login.php"); + if (httpResponse.Content.Contains("Access Denied!") || httpResponse.Content.Contains("login.php")) + { + throw new IndexerAuthException("AnimeTorrents authentication with cookies failed."); + } + + return false; + } + + protected override IDictionary<string, string> GetCookies() + { + return CookieUtil.CookieHeaderToDictionary(Settings.Cookie); } private IndexerCapabilities SetCapabilities() @@ -352,7 +324,7 @@ namespace NzbDrone.Core.Indexers.Definitions public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; } } - public class AnimeTorrentsSettings : UserPassTorrentBaseSettings + public class AnimeTorrentsSettings : CookieTorrentBaseSettings { public AnimeTorrentsSettings() { From d6e8d89be4daa73fb9d43bcd969622dc66d918e8 Mon Sep 17 00:00:00 2001 From: zodihax <gerund-frugal-0m@icloud.com> Date: Wed, 12 Feb 2025 18:27:09 +0100 Subject: [PATCH 29/82] Fixed: (NorBits) Update release category parsing (#2342) Co-authored-by: Bogdan <mynameisbogdan@users.noreply.github.com> --- .../Indexers/Definitions/NorBits.cs | 35 +++++-------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs index 4287f515f..990cf3d68 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs @@ -130,29 +130,13 @@ public class NorBits : TorrentIndexerBase<NorBitsSettings> }; caps.Categories.AddCategoryMapping("main_cat[]=1", NewznabStandardCategory.Movies, "Filmer"); - caps.Categories.AddCategoryMapping("main_cat[]=1&sub2_cat[]=49", NewznabStandardCategory.MoviesUHD, "Filmer - UHD-2160p"); - caps.Categories.AddCategoryMapping("main_cat[]=1&sub2_cat[]=19", NewznabStandardCategory.MoviesHD, "Filmer - HD-1080p/i"); - caps.Categories.AddCategoryMapping("main_cat[]=1&sub2_cat[]=20", NewznabStandardCategory.MoviesHD, "Filmer - HD-720p"); - caps.Categories.AddCategoryMapping("main_cat[]=1&sub2_cat[]=22", NewznabStandardCategory.MoviesSD, "Filmer - SD"); caps.Categories.AddCategoryMapping("main_cat[]=2", NewznabStandardCategory.TV, "TV"); - caps.Categories.AddCategoryMapping("main_cat[]=2&sub2_cat[]=49", NewznabStandardCategory.TVUHD, "TV - UHD-2160p"); - caps.Categories.AddCategoryMapping("main_cat[]=2&sub2_cat[]=19", NewznabStandardCategory.TVHD, "TV - HD-1080p/i"); - caps.Categories.AddCategoryMapping("main_cat[]=2&sub2_cat[]=20", NewznabStandardCategory.TVHD, "TV - HD-720p"); - caps.Categories.AddCategoryMapping("main_cat[]=2&sub2_cat[]=22", NewznabStandardCategory.TVSD, "TV - SD"); caps.Categories.AddCategoryMapping("main_cat[]=3", NewznabStandardCategory.PC, "Programmer"); caps.Categories.AddCategoryMapping("main_cat[]=4", NewznabStandardCategory.Console, "Spill"); caps.Categories.AddCategoryMapping("main_cat[]=5", NewznabStandardCategory.Audio, "Musikk"); - caps.Categories.AddCategoryMapping("main_cat[]=5&sub2_cat[]=42", NewznabStandardCategory.AudioMP3, "Musikk - 192"); - caps.Categories.AddCategoryMapping("main_cat[]=5&sub2_cat[]=43", NewznabStandardCategory.AudioMP3, "Musikk - 256"); - caps.Categories.AddCategoryMapping("main_cat[]=5&sub2_cat[]=44", NewznabStandardCategory.AudioMP3, "Musikk - 320"); - caps.Categories.AddCategoryMapping("main_cat[]=5&sub2_cat[]=45", NewznabStandardCategory.AudioMP3, "Musikk - VBR"); - caps.Categories.AddCategoryMapping("main_cat[]=5&sub2_cat[]=46", NewznabStandardCategory.AudioLossless, "Musikk - Lossless"); caps.Categories.AddCategoryMapping("main_cat[]=6", NewznabStandardCategory.Books, "Tidsskrift"); caps.Categories.AddCategoryMapping("main_cat[]=7", NewznabStandardCategory.AudioAudiobook, "Lydbøker"); caps.Categories.AddCategoryMapping("main_cat[]=8", NewznabStandardCategory.AudioVideo, "Musikkvideoer"); - caps.Categories.AddCategoryMapping("main_cat[]=8&sub2_cat[]=19", NewznabStandardCategory.AudioVideo, "Musikkvideoer - HD-1080p/i"); - caps.Categories.AddCategoryMapping("main_cat[]=8&sub2_cat[]=20", NewznabStandardCategory.AudioVideo, "Musikkvideoer - HD-720p"); - caps.Categories.AddCategoryMapping("main_cat[]=8&sub2_cat[]=22", NewznabStandardCategory.AudioVideo, "Musikkvideoer - SD"); caps.Categories.AddCategoryMapping("main_cat[]=40", NewznabStandardCategory.AudioOther, "Podcasts"); return caps; @@ -281,20 +265,17 @@ public class NorBitsParser : IParseIndexerResponse foreach (var row in rows) { - var link = _settings.BaseUrl + row.QuerySelector("td:nth-of-type(2) > a[href*=\"download.php?id=\"]")?.GetAttribute("href").TrimStart('/'); + var link = _settings.BaseUrl + row.QuerySelector("td:nth-of-type(2) > a[href*=\"download.php?id=\"]")?.GetAttribute("href")?.TrimStart('/'); var qDetails = row.QuerySelector("td:nth-of-type(2) > a[href*=\"details.php?id=\"]"); - var title = qDetails?.GetAttribute("title").Trim(); - var details = _settings.BaseUrl + qDetails?.GetAttribute("href").TrimStart('/'); + var title = qDetails?.GetAttribute("title")?.Trim(); + var details = _settings.BaseUrl + qDetails?.GetAttribute("href")?.TrimStart('/'); - var mainCategory = row.QuerySelector("td:nth-of-type(1) a[href*=\"main_cat[]\"]")?.GetAttribute("href")?.Split('?').Last(); - var secondCategory = row.QuerySelector("td:nth-of-type(1) a[href*=\"sub2_cat[]\"]")?.GetAttribute("href")?.Split('?').Last(); + var catQuery = row.QuerySelector("td:nth-of-type(1) a[href*=\"main_cat[]\"]")?.GetAttribute("href")?.Split('?').Last().Split('&', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + var category = catQuery?.FirstOrDefault(x => x.StartsWith("main_cat[]=", StringComparison.OrdinalIgnoreCase)); - var categoryList = new[] { mainCategory, secondCategory }; - var cat = string.Join("&", categoryList.Where(c => !string.IsNullOrWhiteSpace(c))); - - var seeders = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(9)").TextContent); - var leechers = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(10)").TextContent); + var seeders = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(9)")?.TextContent); + var leechers = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(10)")?.TextContent); var release = new TorrentInfo { @@ -302,7 +283,7 @@ public class NorBitsParser : IParseIndexerResponse InfoUrl = details, DownloadUrl = link, Title = title, - Categories = _categories.MapTrackerCatToNewznab(cat), + Categories = _categories.MapTrackerCatToNewznab(category), Size = ParseUtil.GetBytes(row.QuerySelector("td:nth-of-type(7)")?.TextContent), Files = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(3) > a")?.TextContent.Trim()), Grabs = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(8)")?.FirstChild?.TextContent.Trim()), From 0f1d647cd7510bb48be01354aeea8edcf88b257d Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sun, 16 Feb 2025 11:50:48 +0200 Subject: [PATCH 30/82] Fixed: (FileList) Download links when passkey contains spaces --- .../Indexers/Definitions/FileList/FileListParser.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs index a15751ab7..b45ddf19b 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs @@ -101,7 +101,7 @@ public class FileListParser : IParseIndexerResponse var url = new HttpUri(_settings.BaseUrl) .CombinePath("/download.php") .AddQueryParam("id", torrentId.ToString()) - .AddQueryParam("passkey", _settings.Passkey); + .AddQueryParam("passkey", _settings.Passkey.Trim()); return url.FullUri; } From 2d584f7eb64eeddb292b60a7cf1cfbf433debc99 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Tue, 18 Feb 2025 02:11:57 +0200 Subject: [PATCH 31/82] New: Support for exclusive indexer flag Co-authored-by: zakkarry <zak@ary.dev> --- .../IndexerTests/HDBitsTests/HDBitsFixture.cs | 8 ++--- .../Indexers/Definitions/BeyondHD.cs | 33 ++++++++++++------ .../Indexers/Definitions/HDBits/HDBits.cs | 7 +++- .../Indexers/Definitions/HDBits/HDBitsApi.cs | 3 ++ .../Indexers/Definitions/HDBits/HDBitsInfo.cs | 9 ----- .../Definitions/HDBits/HDBitsParser.cs | 34 ++++++++++++------- src/NzbDrone.Core/Indexers/IndexerFlag.cs | 1 + 7 files changed, 58 insertions(+), 37 deletions(-) delete mode 100644 src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsInfo.cs diff --git a/src/NzbDrone.Core.Test/IndexerTests/HDBitsTests/HDBitsFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/HDBitsTests/HDBitsFixture.cs index 39d628d79..06326d162 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/HDBitsTests/HDBitsFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/HDBitsTests/HDBitsFixture.cs @@ -26,15 +26,15 @@ namespace NzbDrone.Core.Test.IndexerTests.HDBitsTests [SetUp] public void Setup() { - Subject.Definition = new IndexerDefinition() + Subject.Definition = new IndexerDefinition { Name = "HdBits", - Settings = new HDBitsSettings() { ApiKey = "fakekey" } + Settings = new HDBitsSettings { ApiKey = "fakekey" } }; _movieSearchCriteria = new MovieSearchCriteria { - Categories = new int[] { 2000, 2010 }, + Categories = new[] { 2000, 2010 }, ImdbId = "0076759" }; } @@ -52,7 +52,7 @@ namespace NzbDrone.Core.Test.IndexerTests.HDBitsTests var torrents = (await Subject.Fetch(_movieSearchCriteria)).Releases; torrents.Should().HaveCount(2); - torrents.First().Should().BeOfType<HDBitsInfo>(); + torrents.First().Should().BeOfType<TorrentInfo>(); var first = torrents.First() as TorrentInfo; diff --git a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs index f9194f00a..efa1a667d 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs @@ -55,7 +55,7 @@ namespace NzbDrone.Core.Indexers.Definitions return FilterReleasesByQuery(cleanReleases, searchCriteria).ToList(); } - private IndexerCapabilities SetCapabilities() + private static IndexerCapabilities SetCapabilities() { var caps = new IndexerCapabilities { @@ -69,7 +69,8 @@ namespace NzbDrone.Core.Indexers.Definitions }, Flags = new List<IndexerFlag> { - IndexerFlag.Internal + IndexerFlag.Internal, + IndexerFlag.Exclusive, } }; @@ -275,13 +276,6 @@ namespace NzbDrone.Core.Indexers.Definitions var details = row.InfoUrl; var link = row.DownloadLink; - var flags = new HashSet<IndexerFlag>(); - - if (row.Internal) - { - flags.Add(IndexerFlag.Internal); - } - var release = new TorrentInfo { Title = row.Name, @@ -291,7 +285,7 @@ namespace NzbDrone.Core.Indexers.Definitions Guid = details, Categories = _categories.MapTrackerCatDescToNewznab(row.Category), PublishDate = DateTime.Parse(row.CreatedAt, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal), - IndexerFlags = flags, + IndexerFlags = GetIndexerFlags(row), Size = row.Size, Grabs = row.Grabs, Seeders = row.Seeders, @@ -319,6 +313,23 @@ namespace NzbDrone.Core.Indexers.Definitions .ToArray(); } + private static HashSet<IndexerFlag> GetIndexerFlags(BeyondHDTorrent item) + { + var flags = new HashSet<IndexerFlag>(); + + if (item.Internal) + { + flags.Add(IndexerFlag.Internal); + } + + if (item.Exclusive) + { + flags.Add(IndexerFlag.Exclusive); + } + + return flags; + } + public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; } } @@ -478,6 +489,8 @@ namespace NzbDrone.Core.Indexers.Definitions public bool Limited { get; set; } + public bool Exclusive { get; set; } + public bool Internal { get; set; } } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBits.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBits.cs index 84ea1be25..b4d924511 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBits.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBits.cs @@ -32,7 +32,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits return new HDBitsParser(Settings, Capabilities.Categories); } - private IndexerCapabilities SetCapabilities() + private static IndexerCapabilities SetCapabilities() { var caps = new IndexerCapabilities { @@ -43,6 +43,11 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits MovieSearchParams = new List<MovieSearchParam> { MovieSearchParam.Q, MovieSearchParam.ImdbId + }, + Flags = new List<IndexerFlag> + { + IndexerFlag.Internal, + IndexerFlag.Exclusive, } }; diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsApi.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsApi.cs index c66c6213e..5f8b947ae 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsApi.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsApi.cs @@ -85,6 +85,9 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits [JsonProperty(PropertyName = "type_origin")] public int TypeOrigin { get; set; } + [JsonProperty(PropertyName = "type_exclusive")] + public int TypeExclusive { get; set; } + [JsonProperty(PropertyName = "imdb")] public ImdbInfo ImdbInfo { get; set; } diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsInfo.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsInfo.cs deleted file mode 100644 index 412295abf..000000000 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsInfo.cs +++ /dev/null @@ -1,9 +0,0 @@ -using NzbDrone.Core.Parser.Model; - -namespace NzbDrone.Core.Indexers.Definitions.HDBits -{ - public class HDBitsInfo : TorrentInfo - { - public bool? Internal { get; set; } - } -} diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs index ff6692407..8b0b55319 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDBits/HDBitsParser.cs @@ -62,16 +62,8 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits } var id = result.Id; - var internalRelease = result.TypeOrigin == 1; - var flags = new HashSet<IndexerFlag>(); - - if (internalRelease) - { - flags.Add(IndexerFlag.Internal); - } - - releaseInfos.Add(new HDBitsInfo + releaseInfos.Add(new TorrentInfo { Guid = $"HDBits-{id}", Title = GetTitle(result), @@ -85,21 +77,18 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits Files = (int)result.NumFiles, Peers = result.Leechers + result.Seeders, PublishDate = result.Added.ToUniversalTime(), - Internal = internalRelease, Year = result.ImdbInfo?.Year ?? 0, ImdbId = result.ImdbInfo?.Id ?? 0, TvdbId = result.TvdbInfo?.Id ?? 0, DownloadVolumeFactor = GetDownloadVolumeFactor(result), UploadVolumeFactor = GetUploadVolumeFactor(result), - IndexerFlags = flags + IndexerFlags = GetIndexerFlags(result) }); } return releaseInfos.ToArray(); } - public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; } - private string GetTitle(TorrentQueryResponse item) { // Use release name for XXX content and full discs @@ -108,6 +97,23 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits : item.Name; } + private static HashSet<IndexerFlag> GetIndexerFlags(TorrentQueryResponse item) + { + var flags = new HashSet<IndexerFlag>(); + + if (item.TypeOrigin == 1) + { + flags.Add(IndexerFlag.Internal); + } + + if (item.TypeExclusive == 1) + { + flags.Add(IndexerFlag.Exclusive); + } + + return flags; + } + private double GetDownloadVolumeFactor(TorrentQueryResponse item) { if (item.FreeLeech == "yes") @@ -154,5 +160,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits return url.FullUri; } + + public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; } } } diff --git a/src/NzbDrone.Core/Indexers/IndexerFlag.cs b/src/NzbDrone.Core/Indexers/IndexerFlag.cs index 26a65e96c..cfa3d35de 100644 --- a/src/NzbDrone.Core/Indexers/IndexerFlag.cs +++ b/src/NzbDrone.Core/Indexers/IndexerFlag.cs @@ -63,6 +63,7 @@ namespace NzbDrone.Core.Indexers } public static IndexerFlag Internal => new ("internal", "Uploader is an internal release group"); + public static IndexerFlag Exclusive => new ("exclusive", "An exclusive release that must not be uploaded anywhere else"); public static IndexerFlag FreeLeech => new ("freeleech", "Download doesn't count toward ratio"); public static IndexerFlag NeutralLeech => new ("neutralleech", "Download and upload doesn't count toward ratio"); public static IndexerFlag HalfLeech => new ("halfleech", "Release counts 50% to ratio"); From d5b12cf51a7adf48d4ef5455014c61443a8a01ef Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Tue, 18 Feb 2025 04:00:24 +0200 Subject: [PATCH 32/82] Fixed release guid for SpeedApp --- src/NzbDrone.Core/Indexers/Definitions/SpeedApp/SpeedAppBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/SpeedApp/SpeedAppBase.cs b/src/NzbDrone.Core/Indexers/Definitions/SpeedApp/SpeedAppBase.cs index f0170d868..244a9c286 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SpeedApp/SpeedAppBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SpeedApp/SpeedAppBase.cs @@ -262,7 +262,7 @@ namespace NzbDrone.Core.Indexers.Definitions return jsonResponse.Resource.Select(torrent => new TorrentInfo { - Guid = torrent.Id.ToString(), + Guid = torrent.Url, Title = CleanTitle(torrent.Name), Description = torrent.ShortDescription, Size = torrent.Size, From 59b5d2fc786f5a0fca37d1a191772522f17debcd Mon Sep 17 00:00:00 2001 From: Mark McDowall <mark@mcdowall.ca> Date: Wed, 29 Jan 2025 18:46:19 -0800 Subject: [PATCH 33/82] Fixed: Drop downs flickering in some cases (cherry picked from commit 3b024443c5447b7638a69a99809bf44b2419261f) --- .../src/Components/Form/EnhancedSelectInput.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/frontend/src/Components/Form/EnhancedSelectInput.js b/frontend/src/Components/Form/EnhancedSelectInput.js index 732e10f37..79b1c999c 100644 --- a/frontend/src/Components/Form/EnhancedSelectInput.js +++ b/frontend/src/Components/Form/EnhancedSelectInput.js @@ -20,6 +20,8 @@ import HintedSelectInputSelectedValue from './HintedSelectInputSelectedValue'; import TextInput from './TextInput'; import styles from './EnhancedSelectInput.css'; +const MINIMUM_DISTANCE_FROM_EDGE = 10; + function isArrowKey(keyCode) { return keyCode === keyCodes.UP_ARROW || keyCode === keyCodes.DOWN_ARROW; } @@ -137,18 +139,9 @@ class EnhancedSelectInput extends Component { // Listeners onComputeMaxHeight = (data) => { - const { - top, - bottom - } = data.offsets.reference; - const windowHeight = window.innerHeight; - if ((/^botton/).test(data.placement)) { - data.styles.maxHeight = windowHeight - bottom; - } else { - data.styles.maxHeight = top; - } + data.styles.maxHeight = windowHeight - MINIMUM_DISTANCE_FROM_EDGE; return data; }; @@ -460,6 +453,10 @@ class EnhancedSelectInput extends Component { order: 851, enabled: true, fn: this.onComputeMaxHeight + }, + preventOverflow: { + enabled: true, + boundariesElement: 'viewport' } }} > From 790feed5ab6b26ba25e50a6db81e0504e7823d17 Mon Sep 17 00:00:00 2001 From: Stevie Robinson <stevie.robinson@gmail.com> Date: Wed, 19 Feb 2025 04:23:43 +0100 Subject: [PATCH 34/82] Fixed: Fallback to Instance Name for Discord notifications (cherry picked from commit b99e06acc0a3ecae2857d9225b35424c82c67a2b) --- .../Notifications/Discord/Discord.cs | 154 ++++++++---------- 1 file changed, 67 insertions(+), 87 deletions(-) diff --git a/src/NzbDrone.Core/Notifications/Discord/Discord.cs b/src/NzbDrone.Core/Notifications/Discord/Discord.cs index 9eb41e989..48b93f35d 100644 --- a/src/NzbDrone.Core/Notifications/Discord/Discord.cs +++ b/src/NzbDrone.Core/Notifications/Discord/Discord.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using FluentValidation.Results; using NzbDrone.Common.Extensions; +using NzbDrone.Core.Configuration; using NzbDrone.Core.Notifications.Discord.Payloads; using NzbDrone.Core.Validation; @@ -10,10 +11,12 @@ namespace NzbDrone.Core.Notifications.Discord public class Discord : NotificationBase<DiscordSettings> { private readonly IDiscordProxy _proxy; + private readonly IConfigFileProvider _configFileProvider; - public Discord(IDiscordProxy proxy) + public Discord(IDiscordProxy proxy, IConfigFileProvider configFileProvider) { _proxy = proxy; + _configFileProvider = configFileProvider; } public override string Name => "Discord"; @@ -22,18 +25,18 @@ namespace NzbDrone.Core.Notifications.Discord public override void OnGrab(GrabMessage message) { var embed = new Embed - { - Author = new DiscordAuthor - { - Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author, - IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png" - }, - Title = RELEASE_GRABBED_TITLE, - Description = message.Message, - Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), - Color = message.Successful ? (int)DiscordColors.Success : (int)DiscordColors.Danger, - Fields = new List<DiscordField>() - }; + { + Author = new DiscordAuthor + { + Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author, + IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png" + }, + Title = RELEASE_GRABBED_TITLE, + Description = message.Message, + Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + Color = message.Successful ? (int)DiscordColors.Success : (int)DiscordColors.Danger, + Fields = new List<DiscordField>() + }; foreach (var field in Settings.GrabFields) { @@ -80,81 +83,72 @@ namespace NzbDrone.Core.Notifications.Discord public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) { - var attachments = new List<Embed> - { - new Embed - { - Author = new DiscordAuthor - { - Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author, - IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png" - }, - Title = healthCheck.Source.Name, - Description = healthCheck.Message, - Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), - Color = healthCheck.Type == HealthCheck.HealthCheckResult.Warning ? (int)DiscordColors.Warning : (int)DiscordColors.Danger - } - }; + var embed = new Embed + { + Author = new DiscordAuthor + { + Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author, + IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png" + }, + Title = healthCheck.Source.Name, + Description = healthCheck.Message, + Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + Color = healthCheck.Type == HealthCheck.HealthCheckResult.Warning ? (int)DiscordColors.Warning : (int)DiscordColors.Danger + }; - var payload = CreatePayload(null, attachments); + var payload = CreatePayload(null, new List<Embed> { embed }); _proxy.SendPayload(payload, Settings); } public override void OnHealthRestored(HealthCheck.HealthCheck previousCheck) { - var attachments = new List<Embed> - { - new Embed - { - Author = new DiscordAuthor - { - Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author, - IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png" - }, - Title = "Health Issue Resolved: " + previousCheck.Source.Name, - Description = $"The following issue is now resolved: {previousCheck.Message}", - Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), - Color = (int)DiscordColors.Success - } - }; + var embed = new Embed + { + Author = new DiscordAuthor + { + Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author, + IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png" + }, + Title = "Health Issue Resolved: " + previousCheck.Source.Name, + Description = $"The following issue is now resolved: {previousCheck.Message}", + Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + Color = (int)DiscordColors.Success + }; - var payload = CreatePayload(null, attachments); + var payload = CreatePayload(null, new List<Embed> { embed }); _proxy.SendPayload(payload, Settings); } public override void OnApplicationUpdate(ApplicationUpdateMessage updateMessage) { - var attachments = new List<Embed> - { - new Embed - { - Author = new DiscordAuthor - { - Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author, - IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png" - }, - Title = APPLICATION_UPDATE_TITLE, - Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), - Color = (int)DiscordColors.Standard, - Fields = new List<DiscordField>() - { - new DiscordField() - { - Name = "Previous Version", - Value = updateMessage.PreviousVersion.ToString() - }, - new DiscordField() - { - Name = "New Version", - Value = updateMessage.NewVersion.ToString() - } - }, - } - }; + var embed = new Embed + { + Author = new DiscordAuthor + { + Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author, + IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png" + }, + Title = APPLICATION_UPDATE_TITLE, + Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), + Color = (int)DiscordColors.Standard, + Fields = new List<DiscordField> + { + new () + { + Name = "Previous Version", + Value = updateMessage.PreviousVersion.ToString() + }, + new () + { + Name = "New Version", + Value = updateMessage.NewVersion.ToString() + } + }, + }; - var payload = CreatePayload(null, attachments); + var payload = CreatePayload(null, new List<Embed> { embed }); _proxy.SendPayload(payload, Settings); } @@ -208,19 +202,5 @@ namespace NzbDrone.Core.Notifications.Discord return payload; } - - private static string BytesToString(long byteCount) - { - string[] suf = { "B", "KB", "MB", "GB", "TB", "PB", "EB" }; //Longs run out around EB - if (byteCount == 0) - { - return "0 " + suf[0]; - } - - var bytes = Math.Abs(byteCount); - var place = Convert.ToInt32(Math.Floor(Math.Log(bytes, 1024))); - var num = Math.Round(bytes / Math.Pow(1024, place), 1); - return string.Format("{0} {1}", (Math.Sign(byteCount) * num).ToString(), suf[place]); - } } } From 635e76526a38dd1c28d659c5a71f877e794ac700 Mon Sep 17 00:00:00 2001 From: Mark McDowall <mark@mcdowall.ca> Date: Sun, 16 Feb 2025 19:15:27 -0800 Subject: [PATCH 35/82] Cleanse console log messages (cherry picked from commit 609e964794e17343f63e1ecff3fef323e3d284ff) --- .../Instrumentation/CleansingClefLogLayout.cs | 21 +++++++++++++ .../CleansingConsoleLogLayout.cs | 26 ++++++++++++++++ ...neFileTarget.cs => CleansingFileTarget.cs} | 2 +- .../Instrumentation/NzbDroneLogger.cs | 30 +++++++++++-------- .../Instrumentation/ReconfigureLogging.cs | 8 ++--- 5 files changed, 68 insertions(+), 19 deletions(-) create mode 100644 src/NzbDrone.Common/Instrumentation/CleansingClefLogLayout.cs create mode 100644 src/NzbDrone.Common/Instrumentation/CleansingConsoleLogLayout.cs rename src/NzbDrone.Common/Instrumentation/{NzbDroneFileTarget.cs => CleansingFileTarget.cs} (87%) diff --git a/src/NzbDrone.Common/Instrumentation/CleansingClefLogLayout.cs b/src/NzbDrone.Common/Instrumentation/CleansingClefLogLayout.cs new file mode 100644 index 000000000..f110b96ac --- /dev/null +++ b/src/NzbDrone.Common/Instrumentation/CleansingClefLogLayout.cs @@ -0,0 +1,21 @@ +using System.Text; +using NLog; +using NLog.Layouts.ClefJsonLayout; +using NzbDrone.Common.EnvironmentInfo; + +namespace NzbDrone.Common.Instrumentation; + +public class CleansingClefLogLayout : CompactJsonLayout +{ + protected override void RenderFormattedMessage(LogEventInfo logEvent, StringBuilder target) + { + base.RenderFormattedMessage(logEvent, target); + + if (RuntimeInfo.IsProduction) + { + var result = CleanseLogMessage.Cleanse(target.ToString()); + target.Clear(); + target.Append(result); + } + } +} diff --git a/src/NzbDrone.Common/Instrumentation/CleansingConsoleLogLayout.cs b/src/NzbDrone.Common/Instrumentation/CleansingConsoleLogLayout.cs new file mode 100644 index 000000000..f894a4df5 --- /dev/null +++ b/src/NzbDrone.Common/Instrumentation/CleansingConsoleLogLayout.cs @@ -0,0 +1,26 @@ +using System.Text; +using NLog; +using NLog.Layouts; +using NzbDrone.Common.EnvironmentInfo; + +namespace NzbDrone.Common.Instrumentation; + +public class CleansingConsoleLogLayout : SimpleLayout +{ + public CleansingConsoleLogLayout(string format) + : base(format) + { + } + + protected override void RenderFormattedMessage(LogEventInfo logEvent, StringBuilder target) + { + base.RenderFormattedMessage(logEvent, target); + + if (RuntimeInfo.IsProduction) + { + var result = CleanseLogMessage.Cleanse(target.ToString()); + target.Clear(); + target.Append(result); + } + } +} diff --git a/src/NzbDrone.Common/Instrumentation/NzbDroneFileTarget.cs b/src/NzbDrone.Common/Instrumentation/CleansingFileTarget.cs similarity index 87% rename from src/NzbDrone.Common/Instrumentation/NzbDroneFileTarget.cs rename to src/NzbDrone.Common/Instrumentation/CleansingFileTarget.cs index 84658cf74..f74d1fca4 100644 --- a/src/NzbDrone.Common/Instrumentation/NzbDroneFileTarget.cs +++ b/src/NzbDrone.Common/Instrumentation/CleansingFileTarget.cs @@ -4,7 +4,7 @@ using NLog.Targets; namespace NzbDrone.Common.Instrumentation { - public class NzbDroneFileTarget : FileTarget + public class CleansingFileTarget : FileTarget { protected override void RenderFormattedMessage(LogEventInfo logEvent, StringBuilder target) { diff --git a/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs b/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs index 80793e812..d9fdd5b25 100644 --- a/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs +++ b/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs @@ -3,7 +3,6 @@ using System.Diagnostics; using System.IO; using NLog; using NLog.Config; -using NLog.Layouts.ClefJsonLayout; using NLog.Targets; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Extensions; @@ -13,9 +12,11 @@ namespace NzbDrone.Common.Instrumentation { public static class NzbDroneLogger { - private const string FILE_LOG_LAYOUT = @"${date:format=yyyy-MM-dd HH\:mm\:ss.f}|${level}|${logger}|${message}${onexception:inner=${newline}${newline}[v${assembly-version}] ${exception:format=ToString}${newline}${exception:format=Data}${newline}}"; - public const string ConsoleLogLayout = "[${level}] ${logger}: ${message} ${onexception:inner=${newline}${newline}[v${assembly-version}] ${exception:format=ToString}${newline}${exception:format=Data}${newline}}"; - public static CompactJsonLayout ClefLogLayout = new CompactJsonLayout(); + private const string FileLogLayout = @"${date:format=yyyy-MM-dd HH\:mm\:ss.f}|${level}|${logger}|${message}${onexception:inner=${newline}${newline}[v${assembly-version}] ${exception:format=ToString}${newline}${exception:format=Data}${newline}}"; + private const string ConsoleFormat = "[${level}] ${logger}: ${message} ${onexception:inner=${newline}${newline}[v${assembly-version}] ${exception:format=ToString}${newline}${exception:format=Data}${newline}}"; + + private static readonly CleansingConsoleLogLayout CleansingConsoleLayout = new (ConsoleFormat); + private static readonly CleansingClefLogLayout ClefLogLayout = new (); private static bool _isConfigured; @@ -119,11 +120,7 @@ namespace NzbDrone.Common.Instrumentation ? formatEnumValue : ConsoleLogFormat.Standard; - coloredConsoleTarget.Layout = logFormat switch - { - ConsoleLogFormat.Clef => ClefLogLayout, - _ => ConsoleLogLayout - }; + ConfigureConsoleLayout(coloredConsoleTarget, logFormat); var loggingRule = new LoggingRule("*", level, coloredConsoleTarget); @@ -140,7 +137,7 @@ namespace NzbDrone.Common.Instrumentation private static void RegisterAppFile(IAppFolderInfo appFolderInfo, string name, string fileName, int maxArchiveFiles, LogLevel minLogLevel) { - var fileTarget = new NzbDroneFileTarget(); + var fileTarget = new CleansingFileTarget(); fileTarget.Name = name; fileTarget.FileName = Path.Combine(appFolderInfo.GetLogFolder(), fileName); @@ -153,7 +150,7 @@ namespace NzbDrone.Common.Instrumentation fileTarget.MaxArchiveFiles = maxArchiveFiles; fileTarget.EnableFileDelete = true; fileTarget.ArchiveNumbering = ArchiveNumberingMode.Rolling; - fileTarget.Layout = FILE_LOG_LAYOUT; + fileTarget.Layout = FileLogLayout; var loggingRule = new LoggingRule("*", minLogLevel, fileTarget); @@ -172,7 +169,7 @@ namespace NzbDrone.Common.Instrumentation fileTarget.ConcurrentWrites = false; fileTarget.ConcurrentWriteAttemptDelay = 50; fileTarget.ConcurrentWriteAttempts = 100; - fileTarget.Layout = FILE_LOG_LAYOUT; + fileTarget.Layout = FileLogLayout; var loggingRule = new LoggingRule("*", LogLevel.Trace, fileTarget); @@ -217,6 +214,15 @@ namespace NzbDrone.Common.Instrumentation { return GetLogger(obj.GetType()); } + + public static void ConfigureConsoleLayout(ColoredConsoleTarget target, ConsoleLogFormat format) + { + target.Layout = format switch + { + ConsoleLogFormat.Clef => NzbDroneLogger.ClefLogLayout, + _ => NzbDroneLogger.CleansingConsoleLayout + }; + } } public enum ConsoleLogFormat diff --git a/src/NzbDrone.Core/Instrumentation/ReconfigureLogging.cs b/src/NzbDrone.Core/Instrumentation/ReconfigureLogging.cs index 346b6acf1..ac0cd085b 100644 --- a/src/NzbDrone.Core/Instrumentation/ReconfigureLogging.cs +++ b/src/NzbDrone.Core/Instrumentation/ReconfigureLogging.cs @@ -95,7 +95,7 @@ namespace NzbDrone.Core.Instrumentation private void ReconfigureFile() { - foreach (var target in LogManager.Configuration.AllTargets.OfType<NzbDroneFileTarget>()) + foreach (var target in LogManager.Configuration.AllTargets.OfType<CleansingFileTarget>()) { target.MaxArchiveFiles = _configFileProvider.LogRotate; target.ArchiveAboveSize = _configFileProvider.LogSizeLimit.Megabytes(); @@ -120,11 +120,7 @@ namespace NzbDrone.Core.Instrumentation { var format = _configFileProvider.ConsoleLogFormat; - consoleTarget.Layout = format switch - { - ConsoleLogFormat.Clef => NzbDroneLogger.ClefLogLayout, - _ => NzbDroneLogger.ConsoleLogLayout - }; + NzbDroneLogger.ConfigureConsoleLayout(consoleTarget, format); } } From 328f3c0423511447eb0dac94ba602b009cd54fd0 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sat, 22 Feb 2025 12:55:30 +0200 Subject: [PATCH 36/82] Bump version to 1.32.0 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a0efed9a7..a7dad740e 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.31.2' + majorVersion: '1.32.0' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From b09d4927cc67593518c12ed0d45cff927f1b6c73 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Wed, 26 Feb 2025 03:59:22 +0200 Subject: [PATCH 37/82] Check instance name must contain application name with culture-insensitive --- src/NzbDrone.Core/Configuration/ConfigFileProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs index b9f4f23d2..f4715b203 100644 --- a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs +++ b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs @@ -274,7 +274,7 @@ namespace NzbDrone.Core.Configuration { var instanceName = _appOptions.InstanceName ?? GetValue("InstanceName", BuildInfo.AppName); - if (instanceName.ContainsIgnoreCase(BuildInfo.AppName)) + if (instanceName.Contains(BuildInfo.AppName, StringComparison.OrdinalIgnoreCase)) { return instanceName; } From 53bc97b3be93c5c74da341b56472a6813d2c12c5 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sat, 1 Mar 2025 17:34:58 +0200 Subject: [PATCH 38/82] Fixed: (BeyondHd) Search daily episodes using year-month-day format --- .../Indexers/Definitions/BeyondHD.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs index efa1a667d..33a80f43a 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs @@ -92,7 +92,7 @@ namespace NzbDrone.Core.Indexers.Definitions _capabilities = capabilities; } - private IEnumerable<IndexerRequest> GetPagedRequests(SearchCriteriaBase searchCriteria, string term, string imdbId = null, int tmdbId = 0) + private IEnumerable<IndexerRequest> GetPagedRequests(SearchCriteriaBase searchCriteria, string searchTerm, string imdbId = null, int tmdbId = 0) { var body = new Dictionary<string, object> { @@ -129,9 +129,9 @@ namespace NzbDrone.Core.Indexers.Definitions body.Add("tmdb_id", tmdbId); } - if (term.IsNotNullOrWhiteSpace()) + if (searchTerm.IsNotNullOrWhiteSpace()) { - body.Add("search", term); + body.Add("search", searchTerm.Trim()); } var cats = _capabilities.Categories.MapTorznabCapsToTrackers(searchCriteria.Categories); @@ -199,7 +199,16 @@ namespace NzbDrone.Core.Indexers.Definitions { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetPagedRequests(searchCriteria, searchCriteria.SanitizedTvSearchString, searchCriteria.FullImdbId)); + var searchTerm = searchCriteria.SanitizedTvSearchString; + + if (searchCriteria.Season is > 0 && + searchCriteria.Episode.IsNotNullOrWhiteSpace() && + DateTime.TryParseExact($"{searchCriteria.Season} {searchCriteria.Episode}", "yyyy MM/dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var showDate)) + { + searchTerm = $"{searchCriteria.SanitizedSearchTerm} {showDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)}"; + } + + pageableRequests.Add(GetPagedRequests(searchCriteria, searchTerm, searchCriteria.FullImdbId)); return pageableRequests; } From 46b6124b978e3ecb3a2cd948d4750f08cedc5390 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sun, 2 Mar 2025 12:17:40 +0200 Subject: [PATCH 39/82] Bump version to 1.32.1 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a7dad740e..7480d2763 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.32.0' + majorVersion: '1.32.1' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From f02a6f3e2cdb64763d3e03e5203169c842dbaece Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Mon, 3 Mar 2025 17:16:59 +0200 Subject: [PATCH 40/82] Update timezone offset for AvistaZ trackers --- src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs | 2 +- .../Indexers/Definitions/Avistaz/AvistazParserBase.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs b/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs index 7d9ba3b51..4e1899651 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs @@ -84,6 +84,6 @@ namespace NzbDrone.Core.Indexers.Definitions public class AvistaZParser : AvistazParserBase { - protected override string TimezoneOffset => "+02:00"; + protected override string TimezoneOffset => "+01:00"; } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs index 56cc7a3fe..84e36cf7e 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs @@ -14,7 +14,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz { public class AvistazParserBase : IParseIndexerResponse { - protected virtual string TimezoneOffset => "-04:00"; // Avistaz does not specify a timezone & returns server time + protected virtual string TimezoneOffset => "-05:00"; // Avistaz does not specify a timezone & returns server time private readonly HashSet<string> _hdResolutions = new () { "1080p", "1080i", "720p" }; public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; } diff --git a/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs b/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs index 0933ea6a2..784cc56e4 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs @@ -54,7 +54,7 @@ namespace NzbDrone.Core.Indexers.Definitions { private readonly IndexerCapabilitiesCategories _categories; - protected override string TimezoneOffset => "+02:00"; + protected override string TimezoneOffset => "+01:00"; public ExoticaZParser(IndexerCapabilitiesCategories categories) { From 49268f3b8d0c57775db282445ff1096a0fc22096 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Tue, 4 Mar 2025 13:15:44 +0200 Subject: [PATCH 41/82] Fix timezone offset tests for AvistaZ trackers --- .../IndexerTests/AvistazTests/AvistazFixture.cs | 2 +- .../IndexerTests/AvistazTests/ExoticazFixture.cs | 2 +- .../IndexerTests/AvistazTests/PrivateHDFixture.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/AvistazFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/AvistazFixture.cs index dcabb4dbf..b8f7951d2 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/AvistazFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/AvistazFixture.cs @@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AvistazTests torrentInfo.InfoUrl.Should().Be("https://avistaz.to/torrent/187240-japan-sinks-people-of-hope-2021-s01e05-720p-nf-web-dl-ddp20-x264-seikel"); torrentInfo.CommentUrl.Should().BeNullOrEmpty(); torrentInfo.Indexer.Should().Be(Subject.Definition.Name); - torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-11-14 21:26:21")); + torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-11-14 22:26:21")); torrentInfo.Size.Should().Be(935127615); torrentInfo.InfoHash.Should().Be("a879261d4e6e792402f92401141a21de70d51bf2"); torrentInfo.MagnetUrl.Should().Be(null); diff --git a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/ExoticazFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/ExoticazFixture.cs index fe4ada593..4c4f9f38e 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/ExoticazFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/ExoticazFixture.cs @@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AvistazTests torrentInfo.InfoUrl.Should().Be("https://exoticaz.to/torrent/64040-ssis-419-my-first-experience-is-yua-mikami-from-the-day-i-lost-my-virginity-i-was-devoted-to-sex"); torrentInfo.CommentUrl.Should().BeNullOrEmpty(); torrentInfo.Indexer.Should().Be(Subject.Definition.Name); - torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-06-11 09:04:50")); + torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-06-11 10:04:50")); torrentInfo.Size.Should().Be(7085405541); torrentInfo.InfoHash.Should().Be("asdjfiasdf54asd7f4a2sdf544asdf"); torrentInfo.MagnetUrl.Should().Be(null); diff --git a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/PrivateHDFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/PrivateHDFixture.cs index f0531e9ec..e841659fd 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/PrivateHDFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/PrivateHDFixture.cs @@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AvistazTests torrentInfo.InfoUrl.Should().Be("https://privatehd.to/torrent/78506-godzilla-2014-2160p-uhd-bluray-remux-hdr-hevc-atmos-triton"); torrentInfo.CommentUrl.Should().BeNullOrEmpty(); torrentInfo.Indexer.Should().Be(Subject.Definition.Name); - torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-03-21 04:24:49")); + torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-03-21 05:24:49")); torrentInfo.Size.Should().Be(69914591044); torrentInfo.InfoHash.Should().Be("a879261d4e6e792402f92401141a21de70d51bf2"); torrentInfo.MagnetUrl.Should().Be(null); From 015db4a916865447674fdf356ba9c56cf5361b9c Mon Sep 17 00:00:00 2001 From: Servarr <32001786+ServarrAdmin@users.noreply.github.com> Date: Fri, 7 Mar 2025 03:38:29 -0500 Subject: [PATCH 42/82] Translations update from Servarr Weblate (#2351) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Multiple Translations updated by Weblate ignore-downstream Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_Hans/ Translation: Servarr/Prowlarr Co-authored-by: Weblate <noreply@weblate.org> Co-authored-by: Fixer <ygj59783@zslsz.com> Co-authored-by: Oskari Lavinto <olavinto@protonmail.com> Co-authored-by: Weblate <noreply-mt-weblate@weblate.org> Co-authored-by: wangdj1314 <wangdj@risenenergy.com> Co-authored-by: 葛磊磊 <geleilei198117@163.com> --- src/NzbDrone.Core/Localization/Core/fi.json | 8 ++++---- src/NzbDrone.Core/Localization/Core/ko.json | 4 +++- src/NzbDrone.Core/Localization/Core/zh_CN.json | 3 ++- src/NzbDrone.Core/Localization/Core/zh_Hans.json | 3 ++- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 27730aeee..2db696a8a 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -312,7 +312,7 @@ "FullSync": "Täysi synkronointi", "SyncLevelFull": "Täysi synkronointi: Pitää sovelluksen hakupalvelut täysin synkronoituna. Hakupalveluihin {appName}issa tehdyt muutokset synkronoidaan etäsovelluksen kanssa ja kaikki etäsovelluksessa tehdyt muutokset korvataan seuraavan synkronoinnin yhteydessä.", "EnableIndexer": "Ota hakupalvelu käyttöön", - "FilterPlaceHolder": "Suodata hakupalveluita", + "FilterPlaceHolder": "Suodata palveluita", "IndexerHealthCheckNoIndexers": "Yhtään hakupalvelua ei ole käytössä, eikä {appName} tämän vuoksi löydä tuloksia.", "IndexerObsoleteCheckMessage": "Hakupalvelut ovat poistuneet tai ne ovat muuttuneet: {0}. Poista tai lisää ne {appName}iin uudelleen.", "IndexerProxy": "Tiedonhaun välityspalvelin", @@ -507,7 +507,7 @@ "AddDownloadClientImplementation": "Lisätään latauspalvelua – {implementationName}", "AddIndexerImplementation": "Lisätään hakupalvelua – {implementationName}", "OnGrabHelpText": "Kun julkaisu kaapataan", - "ManageDownloadClients": "Hallitse latauspalveluita", + "ManageDownloadClients": "Hallitse palveluita", "NoDownloadClientsFound": "Latauspalveluita ei löytynyt", "CountDownloadClientsSelected": "{count} latauspalvelu(a) on valittu", "EditSelectedDownloadClients": "Muokkaa valittuja latauspalveluita", @@ -519,7 +519,7 @@ "ApplyChanges": "Toteuta muutokset", "EditSelectedIndexers": "Muokkaa valittuja sisältölähteitä", "NoHistoryFound": "Historiaa ei löytynyt", - "NoIndexersFound": "Hakupalveluita ei löytynyt", + "NoIndexersFound": "Palveluita ei löytynyt", "StopSelecting": "Lopeta valitseminen", "EditConnectionImplementation": "Muokataan ilmoituspalvelua – {implementationName}", "AddConnectionImplementation": "Lisätään ilmoituspavelua – {implementationName}", @@ -556,7 +556,7 @@ "Implementation": "Toteutus", "IndexerCategories": "Hakupalvelukategoriat", "IndexerStatus": "Hakupalvelun tila", - "ManageApplications": "Sovellusten hallinta", + "ManageApplications": "Hallitse sovelluksia", "NewznabUrl": "Newznab URL", "PackSeedTime": "Paketin jakoaika", "PackSeedTimeHelpText": "Aika, joka koostepaketin (kuten sarjan tuotantokauden tai esittäjän diskografian) sisältävää torrentia tulee jakaa. Käytä sovelluksen oletusta jättämällä tyhjäksi.", diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index bb90922eb..17cd81637 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -421,5 +421,7 @@ "UserAgentProvidedByTheAppThatCalledTheAPI": "API를 호출한 앱에서 제공하는 사용자 에이전트", "days": "일", "minutes": "분", - "Author": "저작자" + "Author": "저작자", + "Categories": "카테고리", + "SeedRatio": "종자 비율" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 830cdbda6..41f815655 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -753,5 +753,6 @@ "IndexerHDBitsSettingsUsernameHelpText": "网站用户名", "IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "只搜索免费发布", "IndexerFileListSettingsFreeleechOnlyHelpText": "只搜索免费发布", - "IndexerFileListSettingsUsernameHelpText": "网站用户名" + "IndexerFileListSettingsUsernameHelpText": "网站用户名", + "IndexerBeyondHDSettingsRefundOnlyHelpText": "Search refund only" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_Hans.json b/src/NzbDrone.Core/Localization/Core/zh_Hans.json index 1617e57fb..54e88a350 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_Hans.json +++ b/src/NzbDrone.Core/Localization/Core/zh_Hans.json @@ -2,5 +2,6 @@ "About": "关于", "Add": "添加", "Analytics": "分析", - "Username": "用户名" + "Username": "用户名", + "AcceptConfirmationModal": "中文" } From 32634540412a2efcd6092a042ff0a59319fc27cc Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sun, 9 Mar 2025 11:50:31 +0200 Subject: [PATCH 43/82] Bump version to 1.32.2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 7480d2763..5af617e05 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.32.1' + majorVersion: '1.32.2' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 2c1b4647158ea964d90be1083c3130ce21b512b0 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sat, 8 Mar 2025 22:32:52 +0200 Subject: [PATCH 44/82] New: Recommend against using uTorrent (cherry picked from commit 6d8c3f15b343a24fc31a212463af8ed2b5792508) --- src/NzbDrone.Core/Download/Clients/Aria2/Aria2.cs | 4 +++- .../Download/Clients/Blackhole/TorrentBlackhole.cs | 4 +++- .../Download/Clients/Blackhole/UsenetBlackhole.cs | 4 +++- src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs | 4 +++- .../Clients/DownloadStation/TorrentDownloadStation.cs | 4 +++- .../Clients/DownloadStation/UsenetDownloadStation.cs | 4 +++- src/NzbDrone.Core/Download/Clients/Flood/Flood.cs | 4 +++- .../Clients/FreeboxDownload/TorrentFreeboxDownload.cs | 4 +++- src/NzbDrone.Core/Download/Clients/Hadouken/Hadouken.cs | 4 +++- src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortex.cs | 4 +++- src/NzbDrone.Core/Download/Clients/Nzbget/Nzbget.cs | 6 +++--- src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs | 4 +++- .../Download/Clients/QBittorrent/QBittorrent.cs | 4 +++- src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs | 4 +++- .../Download/Clients/Transmission/Transmission.cs | 4 +++- .../Download/Clients/Transmission/TransmissionBase.cs | 4 +++- src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs | 4 +++- src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs | 4 +++- src/NzbDrone.Core/Download/Clients/uTorrent/UTorrent.cs | 8 +++++++- src/NzbDrone.Core/Download/DownloadClientBase.cs | 4 ++++ src/NzbDrone.Core/Download/TorrentClientBase.cs | 4 +++- src/NzbDrone.Core/Download/UsenetClientBase.cs | 4 +++- src/NzbDrone.Core/Localization/Core/en.json | 1 + 23 files changed, 72 insertions(+), 23 deletions(-) diff --git a/src/NzbDrone.Core/Download/Clients/Aria2/Aria2.cs b/src/NzbDrone.Core/Download/Clients/Aria2/Aria2.cs index ae076c14b..3085dbf63 100644 --- a/src/NzbDrone.Core/Download/Clients/Aria2/Aria2.cs +++ b/src/NzbDrone.Core/Download/Clients/Aria2/Aria2.cs @@ -7,6 +7,7 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Validation; @@ -25,8 +26,9 @@ namespace NzbDrone.Core.Download.Clients.Aria2 ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackhole.cs b/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackhole.cs index f8fd44e97..9e22a7460 100644 --- a/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackhole.cs +++ b/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackhole.cs @@ -8,6 +8,7 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Download.Clients.Blackhole @@ -20,8 +21,9 @@ namespace NzbDrone.Core.Download.Clients.Blackhole ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) { } diff --git a/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackhole.cs b/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackhole.cs index 0f0364e61..0b64150ee 100644 --- a/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackhole.cs +++ b/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackhole.cs @@ -7,6 +7,7 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Configuration; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Download.Clients.Blackhole @@ -16,8 +17,9 @@ namespace NzbDrone.Core.Download.Clients.Blackhole public UsenetBlackhole(IHttpClient httpClient, IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(httpClient, configService, diskProvider, logger) + : base(httpClient, configService, diskProvider, localizationService, logger) { } diff --git a/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs b/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs index ca63ba0e7..90bd6ba1f 100644 --- a/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs +++ b/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs @@ -9,6 +9,7 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Validation; @@ -23,8 +24,9 @@ namespace NzbDrone.Core.Download.Clients.Deluge ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs index 482e86e30..97afe9480 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs @@ -10,6 +10,7 @@ using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Download.Clients.DownloadStation.Proxies; using NzbDrone.Core.Indexers; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.Validation; @@ -33,8 +34,9 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) { _dsInfoProxy = dsInfoProxy; _dsTaskProxySelector = dsTaskProxySelector; diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs index 4661c6518..e78f5f5d2 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs @@ -9,6 +9,7 @@ using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Configuration; using NzbDrone.Core.Download.Clients.DownloadStation.Proxies; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.Validation; @@ -31,8 +32,9 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation IHttpClient httpClient, IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(httpClient, configService, diskProvider, logger) + : base(httpClient, configService, diskProvider, localizationService, logger) { _dsInfoProxy = dsInfoProxy; _dsTaskProxySelector = dsTaskProxySelector; diff --git a/src/NzbDrone.Core/Download/Clients/Flood/Flood.cs b/src/NzbDrone.Core/Download/Clients/Flood/Flood.cs index 845b4fa1c..5d39d7b5f 100644 --- a/src/NzbDrone.Core/Download/Clients/Flood/Flood.cs +++ b/src/NzbDrone.Core/Download/Clients/Flood/Flood.cs @@ -8,6 +8,7 @@ using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Download.Clients.Flood.Models; using NzbDrone.Core.Indexers; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.ThingiProvider; @@ -22,8 +23,9 @@ namespace NzbDrone.Core.Download.Clients.Flood ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Download/Clients/FreeboxDownload/TorrentFreeboxDownload.cs b/src/NzbDrone.Core/Download/Clients/FreeboxDownload/TorrentFreeboxDownload.cs index cec808592..00e7e06b4 100644 --- a/src/NzbDrone.Core/Download/Clients/FreeboxDownload/TorrentFreeboxDownload.cs +++ b/src/NzbDrone.Core/Download/Clients/FreeboxDownload/TorrentFreeboxDownload.cs @@ -6,6 +6,7 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Download.Clients.FreeboxDownload @@ -19,8 +20,9 @@ namespace NzbDrone.Core.Download.Clients.FreeboxDownload ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Download/Clients/Hadouken/Hadouken.cs b/src/NzbDrone.Core/Download/Clients/Hadouken/Hadouken.cs index b5aa1eb06..560c40eb3 100644 --- a/src/NzbDrone.Core/Download/Clients/Hadouken/Hadouken.cs +++ b/src/NzbDrone.Core/Download/Clients/Hadouken/Hadouken.cs @@ -6,6 +6,7 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Validation; @@ -20,8 +21,9 @@ namespace NzbDrone.Core.Download.Clients.Hadouken ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortex.cs b/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortex.cs index e1088780d..a87460d71 100644 --- a/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortex.cs +++ b/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortex.cs @@ -7,6 +7,7 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Configuration; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Validation; @@ -20,8 +21,9 @@ namespace NzbDrone.Core.Download.Clients.NzbVortex IHttpClient httpClient, IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(httpClient, configService, diskProvider, logger) + : base(httpClient, configService, diskProvider, localizationService, logger) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Download/Clients/Nzbget/Nzbget.cs b/src/NzbDrone.Core/Download/Clients/Nzbget/Nzbget.cs index b286bf922..49ada68e6 100644 --- a/src/NzbDrone.Core/Download/Clients/Nzbget/Nzbget.cs +++ b/src/NzbDrone.Core/Download/Clients/Nzbget/Nzbget.cs @@ -10,6 +10,7 @@ using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Configuration; using NzbDrone.Core.Exceptions; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Validation; @@ -18,15 +19,14 @@ namespace NzbDrone.Core.Download.Clients.Nzbget public class Nzbget : UsenetClientBase<NzbgetSettings> { private readonly INzbgetProxy _proxy; - private readonly string[] _successStatus = { "SUCCESS", "NONE" }; - private readonly string[] _deleteFailedStatus = { "HEALTH", "DUPE", "SCAN", "COPY", "BAD" }; public Nzbget(INzbgetProxy proxy, IHttpClient httpClient, IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(httpClient, configService, diskProvider, logger) + : base(httpClient, configService, diskProvider, localizationService, logger) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs b/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs index a0b1e85fd..99f80ab22 100644 --- a/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs +++ b/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs @@ -8,6 +8,7 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; @@ -17,8 +18,9 @@ namespace NzbDrone.Core.Download.Clients.Pneumatic { public Pneumatic(IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(configService, diskProvider, logger) + : base(configService, diskProvider, localizationService, logger) { } diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs index 6555ce6cc..3d1863784 100644 --- a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs @@ -8,6 +8,7 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Validation; @@ -30,8 +31,9 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent IConfigService configService, IDiskProvider diskProvider, ICacheManager cacheManager, + ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) { _proxySelector = proxySelector; diff --git a/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs b/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs index 584e392b2..246262527 100644 --- a/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs +++ b/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs @@ -9,6 +9,7 @@ using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Configuration; using NzbDrone.Core.Exceptions; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Validation; @@ -22,8 +23,9 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd IHttpClient httpClient, IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(httpClient, configService, diskProvider, logger) + : base(httpClient, configService, diskProvider, localizationService, logger) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/Transmission.cs b/src/NzbDrone.Core/Download/Clients/Transmission/Transmission.cs index c62a1f6ff..ad14de894 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/Transmission.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/Transmission.cs @@ -5,6 +5,7 @@ using NLog; using NzbDrone.Common.Disk; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; +using NzbDrone.Core.Localization; namespace NzbDrone.Core.Download.Clients.Transmission { @@ -15,8 +16,9 @@ namespace NzbDrone.Core.Download.Clients.Transmission ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(proxy, torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) + : base(proxy, torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) { } diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs index f5cf1fed9..977e3bfee 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs @@ -6,6 +6,7 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Validation; @@ -20,8 +21,9 @@ namespace NzbDrone.Core.Download.Clients.Transmission ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs b/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs index 79f5df0e4..3b87962bb 100644 --- a/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs +++ b/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs @@ -4,6 +4,7 @@ using NzbDrone.Common.Disk; using NzbDrone.Core.Configuration; using NzbDrone.Core.Download.Clients.Transmission; using NzbDrone.Core.Indexers; +using NzbDrone.Core.Localization; namespace NzbDrone.Core.Download.Clients.Vuze { @@ -16,8 +17,9 @@ namespace NzbDrone.Core.Download.Clients.Vuze ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(proxy, torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) + : base(proxy, torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) { } diff --git a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs index 5218f9ebe..628ebdf52 100644 --- a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs @@ -10,6 +10,7 @@ using NzbDrone.Core.Configuration; using NzbDrone.Core.Download.Clients.rTorrent; using NzbDrone.Core.Exceptions; using NzbDrone.Core.Indexers; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.Validation; @@ -27,8 +28,9 @@ namespace NzbDrone.Core.Download.Clients.RTorrent IConfigService configService, IDiskProvider diskProvider, IRTorrentDirectoryValidator rTorrentDirectoryValidator, + ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) { _proxy = proxy; _rTorrentDirectoryValidator = rTorrentDirectoryValidator; diff --git a/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrent.cs b/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrent.cs index ef12042fb..98ad41eec 100644 --- a/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrent.cs @@ -7,7 +7,9 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.Validation; namespace NzbDrone.Core.Download.Clients.UTorrent @@ -21,8 +23,9 @@ namespace NzbDrone.Core.Download.Clients.UTorrent ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger) + : base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger) { _proxy = proxy; } @@ -72,6 +75,9 @@ namespace NzbDrone.Core.Download.Clients.UTorrent } public override string Name => "uTorrent"; + + public override ProviderMessage Message => new (_localizationService.GetLocalizedString("DownloadClientUTorrentProviderMessage"), ProviderMessageType.Warning); + public override bool SupportsCategories => true; protected override void Test(List<ValidationFailure> failures) diff --git a/src/NzbDrone.Core/Download/DownloadClientBase.cs b/src/NzbDrone.Core/Download/DownloadClientBase.cs index 7659c32a6..9a7da6fd6 100644 --- a/src/NzbDrone.Core/Download/DownloadClientBase.cs +++ b/src/NzbDrone.Core/Download/DownloadClientBase.cs @@ -8,6 +8,7 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.Validation; @@ -19,6 +20,7 @@ namespace NzbDrone.Core.Download { protected readonly IConfigService _configService; protected readonly IDiskProvider _diskProvider; + protected readonly ILocalizationService _localizationService; protected readonly Logger _logger; public abstract string Name { get; } @@ -40,10 +42,12 @@ namespace NzbDrone.Core.Download protected DownloadClientBase(IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) { _configService = configService; _diskProvider = diskProvider; + _localizationService = localizationService; _logger = logger; } diff --git a/src/NzbDrone.Core/Download/TorrentClientBase.cs b/src/NzbDrone.Core/Download/TorrentClientBase.cs index 322cc206b..217e70a31 100644 --- a/src/NzbDrone.Core/Download/TorrentClientBase.cs +++ b/src/NzbDrone.Core/Download/TorrentClientBase.cs @@ -8,6 +8,7 @@ using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Exceptions; using NzbDrone.Core.Indexers; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.ThingiProvider; @@ -24,8 +25,9 @@ namespace NzbDrone.Core.Download ISeedConfigProvider seedConfigProvider, IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(configService, diskProvider, logger) + : base(configService, diskProvider, localizationService, logger) { _torrentFileInfoReader = torrentFileInfoReader; _seedConfigProvider = seedConfigProvider; diff --git a/src/NzbDrone.Core/Download/UsenetClientBase.cs b/src/NzbDrone.Core/Download/UsenetClientBase.cs index ac62359aa..1e85ffbb9 100644 --- a/src/NzbDrone.Core/Download/UsenetClientBase.cs +++ b/src/NzbDrone.Core/Download/UsenetClientBase.cs @@ -5,6 +5,7 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Http; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers; +using NzbDrone.Core.Localization; using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.ThingiProvider; @@ -19,8 +20,9 @@ namespace NzbDrone.Core.Download protected UsenetClientBase(IHttpClient httpClient, IConfigService configService, IDiskProvider diskProvider, + ILocalizationService localizationService, Logger logger) - : base(configService, diskProvider, logger) + : base(configService, diskProvider, localizationService, logger) { _httpClient = httpClient; } diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 5e74f61d0..2565fdf01 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -241,6 +241,7 @@ "DownloadClientStatusSingleClientHealthCheckMessage": "Download clients unavailable due to failures: {downloadClientNames}", "DownloadClientTransmissionSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Transmission location", "DownloadClientTransmissionSettingsUrlBaseHelpText": "Adds a prefix to the {clientName} rpc url, eg {url}, defaults to '{defaultUrl}'", + "DownloadClientUTorrentProviderMessage": "uTorrent has a history of including cryptominers, malware and ads, we strongly encourage you to choose a different client.", "DownloadClients": "Download Clients", "DownloadClientsLoadError": "Unable to load download clients", "DownloadClientsSettingsSummary": "Download clients configuration for integration into {appName} UI search", From 10ea6cd753ae2bdb48cd47063d0f388cc61a72b8 Mon Sep 17 00:00:00 2001 From: Mark McDowall <mark@mcdowall.ca> Date: Sun, 2 Mar 2025 12:32:44 -0800 Subject: [PATCH 45/82] Improve wrapping of text in sidebar (cherry picked from commit f58dfc5605738ebccdd6adc6f1ca2a7843c086b2) --- frontend/src/Components/Page/Sidebar/PageSidebarItem.css | 5 +---- .../src/Components/Page/Sidebar/PageSidebarItem.css.d.ts | 1 - frontend/src/Components/Page/Sidebar/PageSidebarItem.js | 4 +--- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/frontend/src/Components/Page/Sidebar/PageSidebarItem.css b/frontend/src/Components/Page/Sidebar/PageSidebarItem.css index 5e3e3b52c..409062f97 100644 --- a/frontend/src/Components/Page/Sidebar/PageSidebarItem.css +++ b/frontend/src/Components/Page/Sidebar/PageSidebarItem.css @@ -24,6 +24,7 @@ composes: link; padding: 10px 24px; + padding-left: 35px; } .isActiveLink { @@ -41,10 +42,6 @@ text-align: center; } -.noIcon { - margin-left: 25px; -} - .status { float: right; } diff --git a/frontend/src/Components/Page/Sidebar/PageSidebarItem.css.d.ts b/frontend/src/Components/Page/Sidebar/PageSidebarItem.css.d.ts index 77e23c767..5bf0eb815 100644 --- a/frontend/src/Components/Page/Sidebar/PageSidebarItem.css.d.ts +++ b/frontend/src/Components/Page/Sidebar/PageSidebarItem.css.d.ts @@ -8,7 +8,6 @@ interface CssExports { 'isActiveParentLink': string; 'item': string; 'link': string; - 'noIcon': string; 'status': string; } export const cssExports: CssExports; diff --git a/frontend/src/Components/Page/Sidebar/PageSidebarItem.js b/frontend/src/Components/Page/Sidebar/PageSidebarItem.js index 754071c79..8d0e4e790 100644 --- a/frontend/src/Components/Page/Sidebar/PageSidebarItem.js +++ b/frontend/src/Components/Page/Sidebar/PageSidebarItem.js @@ -63,9 +63,7 @@ class PageSidebarItem extends Component { </span> } - <span className={isChildItem ? styles.noIcon : null}> - {typeof title === 'function' ? title() : title} - </span> + {typeof title === 'function' ? title() : title} { !!StatusComponent && From a19b8ea997053e54c9e758b6d8ece06aeaffd9d5 Mon Sep 17 00:00:00 2001 From: Mark McDowall <mark@mcdowall.ca> Date: Sun, 2 Mar 2025 12:35:04 -0800 Subject: [PATCH 46/82] New: Truncate button text Fixes #2352 (cherry picked from commit 093ee5b88db0470426f6132e66a5893e5cf89bab) --- frontend/src/Components/Page/Toolbar/PageToolbarButton.css | 3 +++ frontend/src/Components/Page/Toolbar/PageToolbarButton.js | 1 + 2 files changed, 4 insertions(+) diff --git a/frontend/src/Components/Page/Toolbar/PageToolbarButton.css b/frontend/src/Components/Page/Toolbar/PageToolbarButton.css index 0b6918296..e9a1b666d 100644 --- a/frontend/src/Components/Page/Toolbar/PageToolbarButton.css +++ b/frontend/src/Components/Page/Toolbar/PageToolbarButton.css @@ -22,11 +22,14 @@ display: flex; align-items: center; justify-content: center; + overflow: hidden; height: 24px; } .label { padding: 0 3px; + max-width: 100%; + max-height: 100%; color: var(--toolbarLabelColor); font-size: $extraSmallFontSize; line-height: calc($extraSmallFontSize + 1px); diff --git a/frontend/src/Components/Page/Toolbar/PageToolbarButton.js b/frontend/src/Components/Page/Toolbar/PageToolbarButton.js index c93603aa9..675bdfd02 100644 --- a/frontend/src/Components/Page/Toolbar/PageToolbarButton.js +++ b/frontend/src/Components/Page/Toolbar/PageToolbarButton.js @@ -23,6 +23,7 @@ function PageToolbarButton(props) { isDisabled && styles.isDisabled )} isDisabled={isDisabled || isSpinning} + title={label} {...otherProps} > <Icon From 8a1787bdb6c8e733e79d5a0999230d99f7ac2a79 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sun, 16 Mar 2025 11:42:07 +0200 Subject: [PATCH 47/82] Bump version to 1.33.0 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 5af617e05..863747dc0 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.32.2' + majorVersion: '1.33.0' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From d20b2cc9c01b9d98f8a6b77fbb617e0e74901cc9 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sun, 16 Mar 2025 12:04:49 +0200 Subject: [PATCH 48/82] Bump NLog and Polly --- src/NzbDrone.Common/Prowlarr.Common.csproj | 6 +++--- src/NzbDrone.Core/Prowlarr.Core.csproj | 4 ++-- src/NzbDrone.Host/Prowlarr.Host.csproj | 2 +- src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj | 2 +- src/NzbDrone.Update/Prowlarr.Update.csproj | 2 +- src/NzbDrone.Windows/Prowlarr.Windows.csproj | 2 +- src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj | 2 +- src/Prowlarr.Http/Prowlarr.Http.csproj | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/NzbDrone.Common/Prowlarr.Common.csproj b/src/NzbDrone.Common/Prowlarr.Common.csproj index 359fa8820..b26b024bc 100644 --- a/src/NzbDrone.Common/Prowlarr.Common.csproj +++ b/src/NzbDrone.Common/Prowlarr.Common.csproj @@ -9,9 +9,9 @@ <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" /> <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> - <PackageReference Include="NLog" Version="5.3.4" /> - <PackageReference Include="NLog.Layouts.ClefJsonLayout" Version="1.0.0" /> - <PackageReference Include="NLog.Extensions.Logging" Version="5.3.15" /> + <PackageReference Include="NLog" Version="5.4.0" /> + <PackageReference Include="NLog.Layouts.ClefJsonLayout" Version="1.0.3" /> + <PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" /> <PackageReference Include="Npgsql" Version="7.0.9" /> <PackageReference Include="Sentry" Version="4.0.2" /> <PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" /> diff --git a/src/NzbDrone.Core/Prowlarr.Core.csproj b/src/NzbDrone.Core/Prowlarr.Core.csproj index 5cfd16a41..4b8138cb4 100644 --- a/src/NzbDrone.Core/Prowlarr.Core.csproj +++ b/src/NzbDrone.Core/Prowlarr.Core.csproj @@ -12,7 +12,7 @@ <PackageReference Include="Microsoft.Data.SqlClient" Version="2.1.7" /> <PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" /> <PackageReference Include="Npgsql" Version="7.0.9" /> - <PackageReference Include="Polly" Version="8.5.1" /> + <PackageReference Include="Polly" Version="8.5.2" /> <PackageReference Include="Servarr.FluentMigrator.Runner" Version="3.3.2.9" /> <PackageReference Include="Servarr.FluentMigrator.Runner.Postgres" Version="3.3.2.9" /> <PackageReference Include="Servarr.FluentMigrator.Runner.SQLite" Version="3.3.2.9" /> @@ -20,7 +20,7 @@ <PackageReference Include="System.ServiceModel.Syndication" Version="6.0.0" /> <PackageReference Include="FluentValidation" Version="9.5.4" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> - <PackageReference Include="NLog" Version="5.3.4" /> + <PackageReference Include="NLog" Version="5.4.0" /> <PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" /> <PackageReference Include="System.Text.Json" Version="6.0.10" /> <PackageReference Include="MonoTorrent" Version="2.0.7" /> diff --git a/src/NzbDrone.Host/Prowlarr.Host.csproj b/src/NzbDrone.Host/Prowlarr.Host.csproj index 07fed755c..8dd6d8e61 100644 --- a/src/NzbDrone.Host/Prowlarr.Host.csproj +++ b/src/NzbDrone.Host/Prowlarr.Host.csproj @@ -4,7 +4,7 @@ <OutputType>Library</OutputType> </PropertyGroup> <ItemGroup> - <PackageReference Include="NLog.Extensions.Logging" Version="5.3.15" /> + <PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" /> <PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.0" /> <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" /> <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" /> diff --git a/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj b/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj index d37b95690..b9ccacd9e 100644 --- a/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj +++ b/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj @@ -6,7 +6,7 @@ <PackageReference Include="FluentAssertions" Version="6.11.0" /> <PackageReference Include="FluentValidation" Version="9.5.4" /> <PackageReference Include="Moq" Version="4.17.2" /> - <PackageReference Include="NLog" Version="5.3.4" /> + <PackageReference Include="NLog" Version="5.4.0" /> <PackageReference Include="NUnit" Version="3.14.0" /> <PackageReference Include="RestSharp" Version="106.15.0" /> <PackageReference Include="RestSharp.Serializers.SystemTextJson" Version="106.15.0" /> diff --git a/src/NzbDrone.Update/Prowlarr.Update.csproj b/src/NzbDrone.Update/Prowlarr.Update.csproj index 5570a6f1b..09b95e2f8 100644 --- a/src/NzbDrone.Update/Prowlarr.Update.csproj +++ b/src/NzbDrone.Update/Prowlarr.Update.csproj @@ -6,7 +6,7 @@ <ItemGroup> <PackageReference Include="DryIoc.dll" Version="5.4.3" /> <PackageReference Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" /> - <PackageReference Include="NLog" Version="5.3.4" /> + <PackageReference Include="NLog" Version="5.4.0" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\NzbDrone.Common\Prowlarr.Common.csproj" /> diff --git a/src/NzbDrone.Windows/Prowlarr.Windows.csproj b/src/NzbDrone.Windows/Prowlarr.Windows.csproj index f3baa19dc..4a9f864e5 100644 --- a/src/NzbDrone.Windows/Prowlarr.Windows.csproj +++ b/src/NzbDrone.Windows/Prowlarr.Windows.csproj @@ -4,7 +4,7 @@ <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup> <ItemGroup> - <PackageReference Include="NLog" Version="5.3.4" /> + <PackageReference Include="NLog" Version="5.4.0" /> <PackageReference Include="System.IO.FileSystem.AccessControl" Version="5.0.0" /> </ItemGroup> <ItemGroup> diff --git a/src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj b/src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj index aac0b246f..4371487f2 100644 --- a/src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj +++ b/src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj @@ -4,7 +4,7 @@ </PropertyGroup> <ItemGroup> <PackageReference Include="FluentValidation" Version="9.5.4" /> - <PackageReference Include="NLog" Version="5.3.4" /> + <PackageReference Include="NLog" Version="5.4.0" /> <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" /> </ItemGroup> <ItemGroup> diff --git a/src/Prowlarr.Http/Prowlarr.Http.csproj b/src/Prowlarr.Http/Prowlarr.Http.csproj index 938b722a4..e326e5ed3 100644 --- a/src/Prowlarr.Http/Prowlarr.Http.csproj +++ b/src/Prowlarr.Http/Prowlarr.Http.csproj @@ -5,7 +5,7 @@ <ItemGroup> <PackageReference Include="FluentValidation" Version="9.5.4" /> <PackageReference Include="ImpromptuInterface" Version="7.0.1" /> - <PackageReference Include="NLog" Version="5.3.4" /> + <PackageReference Include="NLog" Version="5.4.0" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\NzbDrone.Core\Prowlarr.Core.csproj" /> From b99e8d0d65217e5085db1b0e6a539d6ae6e54af9 Mon Sep 17 00:00:00 2001 From: Mark McDowall <mark@mcdowall.ca> Date: Tue, 11 Mar 2025 08:41:48 -0700 Subject: [PATCH 49/82] Improve logging when login fails due to CryptographicException (cherry picked from commit 1449941471cbb8885e9298317b9a30f2576d7941) --- .../AuthenticationController.cs | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/Prowlarr.Http/Authentication/AuthenticationController.cs b/src/Prowlarr.Http/Authentication/AuthenticationController.cs index 8bfec4318..05b058895 100644 --- a/src/Prowlarr.Http/Authentication/AuthenticationController.cs +++ b/src/Prowlarr.Http/Authentication/AuthenticationController.cs @@ -1,9 +1,14 @@ using System.Collections.Generic; +using System.IO; using System.Security.Claims; +using System.Security.Cryptography; using System.Threading.Tasks; +using System.Xml; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using NLog; +using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Extensions; using NzbDrone.Core.Authentication; using NzbDrone.Core.Configuration; @@ -16,11 +21,15 @@ namespace Prowlarr.Http.Authentication { private readonly IAuthenticationService _authService; private readonly IConfigFileProvider _configFileProvider; + private readonly IAppFolderInfo _appFolderInfo; + private readonly Logger _logger; - public AuthenticationController(IAuthenticationService authService, IConfigFileProvider configFileProvider) + public AuthenticationController(IAuthenticationService authService, IConfigFileProvider configFileProvider, IAppFolderInfo appFolderInfo, Logger logger) { _authService = authService; _configFileProvider = configFileProvider; + _appFolderInfo = appFolderInfo; + _logger = logger; } [HttpPost("login")] @@ -45,7 +54,23 @@ namespace Prowlarr.Http.Authentication IsPersistent = resource.RememberMe == "on" }; - await HttpContext.SignInAsync(AuthenticationType.Forms.ToString(), new ClaimsPrincipal(new ClaimsIdentity(claims, "Cookies", "user", "identifier")), authProperties); + try + { + await HttpContext.SignInAsync(AuthenticationType.Forms.ToString(), new ClaimsPrincipal(new ClaimsIdentity(claims, "Cookies", "user", "identifier")), authProperties); + } + catch (CryptographicException e) + { + if (e.InnerException is XmlException) + { + _logger.Error(e, "Failed to authenticate user due to corrupt XML. Please remove all XML files from {0} and restart Prowlarr", Path.Combine(_appFolderInfo.AppDataFolder, "asp")); + } + else + { + _logger.Error(e, "Failed to authenticate user. {0}", e.Message); + } + + return Unauthorized(); + } if (returnUrl.IsNullOrWhiteSpace()) { From 5125f256fb8c20b902adafe16530c4792a580d87 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Thu, 20 Mar 2025 20:38:13 +0200 Subject: [PATCH 50/82] Fixed: Priority validation for indexers and download clients --- src/Prowlarr.Api.V1/DownloadClient/DownloadClientController.cs | 2 ++ src/Prowlarr.Api.V1/Indexers/IndexerController.cs | 1 + 2 files changed, 3 insertions(+) diff --git a/src/Prowlarr.Api.V1/DownloadClient/DownloadClientController.cs b/src/Prowlarr.Api.V1/DownloadClient/DownloadClientController.cs index dfaf24a9e..347c7e9c6 100644 --- a/src/Prowlarr.Api.V1/DownloadClient/DownloadClientController.cs +++ b/src/Prowlarr.Api.V1/DownloadClient/DownloadClientController.cs @@ -1,3 +1,4 @@ +using FluentValidation; using NzbDrone.Core.Download; using NzbDrone.SignalR; using Prowlarr.Http; @@ -13,6 +14,7 @@ namespace Prowlarr.Api.V1.DownloadClient public DownloadClientController(IBroadcastSignalRMessage signalRBroadcaster, IDownloadClientFactory downloadClientFactory) : base(signalRBroadcaster, downloadClientFactory, "downloadclient", ResourceMapper, BulkResourceMapper) { + SharedValidator.RuleFor(c => c.Priority).InclusiveBetween(1, 50); } } } diff --git a/src/Prowlarr.Api.V1/Indexers/IndexerController.cs b/src/Prowlarr.Api.V1/Indexers/IndexerController.cs index 6f360a574..07955299d 100644 --- a/src/Prowlarr.Api.V1/Indexers/IndexerController.cs +++ b/src/Prowlarr.Api.V1/Indexers/IndexerController.cs @@ -21,6 +21,7 @@ namespace Prowlarr.Api.V1.Indexers .ValidId() .SetValidator(appProfileExistsValidator); + SharedValidator.RuleFor(c => c.Priority).InclusiveBetween(1, 50); SharedValidator.RuleFor(c => c.DownloadClientId).SetValidator(downloadClientExistsValidator); } } From 27fbd7ef7e7ad8876a744a8bf147549549182a6e Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sat, 22 Mar 2025 12:45:10 +0200 Subject: [PATCH 51/82] Fixed: (RuTracker.org) Improve subtitles removal --- src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs b/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs index 79244b6b2..44f6bae38 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/RuTracker.cs @@ -30,7 +30,7 @@ namespace NzbDrone.Core.Indexers.Definitions "https://rutracker.net/", "https://rutracker.nl/" }; - public override string Description => "RuTracker.org is a Semi-Private Russian torrent site with a thriving file-sharing community"; + public override string Description => "RuTracker.org is a RUSSIAN Semi-Private site with a thriving file-sharing community"; public override string Language => "ru-RU"; public override Encoding Encoding => Encoding.GetEncoding("windows-1251"); public override IndexerPrivacy Privacy => IndexerPrivacy.SemiPrivate; @@ -144,6 +144,7 @@ namespace NzbDrone.Core.Indexers.Definitions SupportsRawSearch = true }; + // Note: When refreshing the categories use the tracker.php page and NOT the search.php page! caps.Categories.AddCategoryMapping(22, NewznabStandardCategory.Movies, "Наше кино"); caps.Categories.AddCategoryMapping(941, NewznabStandardCategory.Movies, "|- Кино СССР"); caps.Categories.AddCategoryMapping(1666, NewznabStandardCategory.Movies, "|- Детские отечественные фильмы"); @@ -1751,7 +1752,7 @@ namespace NzbDrone.Core.Indexers.Definitions title = Regex.Replace(title, @"(\([\p{IsCyrillic}\W]+)\s/\s(.+?)\)", string.Empty, RegexOptions.Compiled | RegexOptions.IgnoreCase); // Remove VO, MVO and DVO from titles - var vo = new Regex(@".VO\s\(.+?\)"); + var vo = new Regex(@"((?:\dx\s)?(?:[A-Z])?VO\s\(.+?\))"); title = vo.Replace(title, string.Empty); // Remove R5 and (R5) from release names @@ -1759,7 +1760,7 @@ namespace NzbDrone.Core.Indexers.Definitions title = r5.Replace(title, "$1"); // Remove Sub languages from release names - title = Regex.Replace(title, @"(\bSub\b.*$|\b[\+]*Sub[\+]*\b)", string.Empty); + title = Regex.Replace(title, @"(\bSub\b[^+]*\b|\b[\+]*Sub[\+]*\b)", string.Empty); } // language fix: all rutracker releases contains russian track From 73ee69563372dc57ed7eba8bb7c05f338319d1f3 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sat, 22 Mar 2025 20:38:58 +0200 Subject: [PATCH 52/82] New: (BeyondHD) Parsing audio and subtitles languages --- src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs index 33a80f43a..3fc4a3328 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs @@ -304,6 +304,8 @@ namespace NzbDrone.Core.Indexers.Definitions UploadVolumeFactor = 1, MinimumRatio = 1, MinimumSeedTime = 172800, // 120 hours + Languages = row.Audios?.Split(",", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList() ?? new List<string>(), + Subs = row.Subtitles?.Split(",", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList() ?? new List<string>(), }; // BHD can return crazy values for tmdb @@ -470,9 +472,13 @@ namespace NzbDrone.Core.Indexers.Definitions [JsonPropertyName("times_completed")] public int Grabs { get; set; } + public int Seeders { get; set; } public int Leechers { get; set; } + public string Audios { get; set; } + public string Subtitles { get; set; } + [JsonPropertyName("created_at")] public string CreatedAt { get; set; } From 758dddd4ad8261a9c948303d4d5811676496e1e6 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sun, 23 Mar 2025 09:45:33 +0200 Subject: [PATCH 53/82] Bump version to 1.33.1 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 863747dc0..b9f35e204 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.33.0' + majorVersion: '1.33.1' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From f4f1b38324e9351c8c96cf231333203579694b30 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Tue, 25 Mar 2025 12:23:12 +0200 Subject: [PATCH 54/82] New: On Grab notifications for CustomScript --- .../CustomScript/CustomScript.cs | 32 +++++++++++++++---- src/NzbDrone.Core/Parser/Model/ReleaseInfo.cs | 1 + 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs index 7ca1dc8fc..04bac39f0 100755 --- a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs +++ b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; +using System.Linq; using FluentValidation.Results; using NLog; using NzbDrone.Common.Disk; @@ -38,7 +39,31 @@ namespace NzbDrone.Core.Notifications.CustomScript public override string Link => "https://wiki.servarr.com/prowlarr/settings#connections"; - public override ProviderMessage Message => new ProviderMessage("Testing will execute the script with the EventType set to Test, ensure your script handles this correctly", ProviderMessageType.Warning); + public override ProviderMessage Message => new ("Testing will execute the script with the EventType set to Test, ensure your script handles this correctly", ProviderMessageType.Warning); + + public override void OnGrab(GrabMessage message) + { + var environmentVariables = new StringDictionary(); + + environmentVariables.Add("Prowlarr_EventType", "Grab"); + environmentVariables.Add("Prowlarr_InstanceName", _configFileProvider.InstanceName); + environmentVariables.Add("Prowlarr_ApplicationUrl", _configService.ApplicationUrl); + environmentVariables.Add("Prowlarr_Release_Title", message.Release.Title); + environmentVariables.Add("Prowlarr_Release_Indexer", message.Release.Indexer ?? string.Empty); + environmentVariables.Add("Prowlarr_Release_Size", message.Release.Size.ToString()); + environmentVariables.Add("Prowlarr_Release_Genres", string.Join("|", message.Release.Genres)); + environmentVariables.Add("Prowlarr_Release_Categories", string.Join("|", message.Release.Categories.Select(f => f.Name))); + environmentVariables.Add("Prowlarr_Release_IndexerFlags", string.Join("|", message.Release.IndexerFlags.Select(f => f.Name))); + environmentVariables.Add("Prowlarr_Release_PublishDate", message.Release.PublishDate.ToUniversalTime().ToString("s") + "Z"); + environmentVariables.Add("Prowlarr_Download_Client", message.DownloadClientName ?? string.Empty); + environmentVariables.Add("Prowlarr_Download_Client_Type", message.DownloadClientType ?? string.Empty); + environmentVariables.Add("Prowlarr_Download_Id", message.DownloadId ?? string.Empty); + environmentVariables.Add("Prowlarr_Source", message.Source ?? string.Empty); + environmentVariables.Add("Prowlarr_Host", message.Host ?? string.Empty); + environmentVariables.Add("Prowlarr_Redirect", message.Redirect.ToString()); + + ExecuteScript(environmentVariables); + } public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) { @@ -130,10 +155,5 @@ namespace NzbDrone.Core.Notifications.CustomScript return processOutput; } - - private bool ValidatePathParent(string possibleParent, string path) - { - return possibleParent.IsParentPath(path); - } } } diff --git a/src/NzbDrone.Core/Parser/Model/ReleaseInfo.cs b/src/NzbDrone.Core/Parser/Model/ReleaseInfo.cs index 7d8c83d50..6f0788607 100644 --- a/src/NzbDrone.Core/Parser/Model/ReleaseInfo.cs +++ b/src/NzbDrone.Core/Parser/Model/ReleaseInfo.cs @@ -9,6 +9,7 @@ namespace NzbDrone.Core.Parser.Model { public ReleaseInfo() { + Genres = new List<string>(); IndexerFlags = new HashSet<IndexerFlag>(); Categories = new List<IndexerCategory>(); Languages = new List<string>(); From 5cbacc01eb83531eaf0aa19b0a665b1b6d73eb0c Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Tue, 25 Mar 2025 12:50:17 +0200 Subject: [PATCH 55/82] Fixed: Publish dates timezone in history details for grabbed releases --- src/NzbDrone.Core/History/HistoryService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/History/HistoryService.cs b/src/NzbDrone.Core/History/HistoryService.cs index 144258272..e78e5d229 100644 --- a/src/NzbDrone.Core/History/HistoryService.cs +++ b/src/NzbDrone.Core/History/HistoryService.cs @@ -224,7 +224,7 @@ namespace NzbDrone.Core.History if (message.Release.PublishDate != DateTime.MinValue) { - history.Data.Add("PublishedDate", message.Release.PublishDate.ToString("s") + "Z"); + history.Data.Add("PublishedDate", message.Release.PublishDate.ToUniversalTime().ToString("s") + "Z"); } _historyRepository.Insert(history); From 5bc5f0e6b8218b6dd3da2ddb342e8a5e7370a52e Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Tue, 25 Mar 2025 12:57:39 +0200 Subject: [PATCH 56/82] New: Categories, genres, indexer flags and publish dates for webhook releases --- .../Notifications/Webhook/WebhookRelease.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/NzbDrone.Core/Notifications/Webhook/WebhookRelease.cs b/src/NzbDrone.Core/Notifications/Webhook/WebhookRelease.cs index 295d62986..ad98e5440 100644 --- a/src/NzbDrone.Core/Notifications/Webhook/WebhookRelease.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/WebhookRelease.cs @@ -1,3 +1,6 @@ +using System; +using System.Collections.Generic; +using System.Linq; using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Notifications.Webhook @@ -13,10 +16,18 @@ namespace NzbDrone.Core.Notifications.Webhook ReleaseTitle = release.Title; Indexer = release.Indexer; Size = release.Size; + Categories = release.Categories.Select(f => f.Name).ToList(); + Genres = release.Genres.ToList(); + IndexerFlags = release.IndexerFlags.Select(f => f.Name).ToHashSet(); + PublishDate = release.PublishDate; } public string ReleaseTitle { get; set; } public string Indexer { get; set; } public long? Size { get; set; } + public List<string> Categories { get; set; } + public List<string> Genres { get; set; } + public HashSet<string> IndexerFlags { get; set; } + public DateTime? PublishDate { get; set; } } } From 023eec0ec062a0e1fac3c45907fdcf1e2222125e Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Tue, 25 Mar 2025 13:04:07 +0200 Subject: [PATCH 57/82] Update timezone offset for PrivateHD and CinemaZ --- .../IndexerTests/AvistazTests/PrivateHDFixture.cs | 2 +- .../Indexers/Definitions/Avistaz/AvistazParserBase.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/PrivateHDFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/PrivateHDFixture.cs index e841659fd..f0531e9ec 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/PrivateHDFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/PrivateHDFixture.cs @@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AvistazTests torrentInfo.InfoUrl.Should().Be("https://privatehd.to/torrent/78506-godzilla-2014-2160p-uhd-bluray-remux-hdr-hevc-atmos-triton"); torrentInfo.CommentUrl.Should().BeNullOrEmpty(); torrentInfo.Indexer.Should().Be(Subject.Definition.Name); - torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-03-21 05:24:49")); + torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-03-21 04:24:49")); torrentInfo.Size.Should().Be(69914591044); torrentInfo.InfoHash.Should().Be("a879261d4e6e792402f92401141a21de70d51bf2"); torrentInfo.MagnetUrl.Should().Be(null); diff --git a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs index 84e36cf7e..56cc7a3fe 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Avistaz/AvistazParserBase.cs @@ -14,7 +14,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz { public class AvistazParserBase : IParseIndexerResponse { - protected virtual string TimezoneOffset => "-05:00"; // Avistaz does not specify a timezone & returns server time + protected virtual string TimezoneOffset => "-04:00"; // Avistaz does not specify a timezone & returns server time private readonly HashSet<string> _hdResolutions = new () { "1080p", "1080i", "720p" }; public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; } From 5c5a163151e6c3c69c9466df5792e6c072c3b457 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Fri, 28 Mar 2025 13:39:19 +0200 Subject: [PATCH 58/82] Fixed: (AnimeBytes) Allow season searching for ONA --- src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs b/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs index cde688637..f45ff4173 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AnimeBytes.cs @@ -232,7 +232,7 @@ namespace NzbDrone.Core.Indexers.Definitions if (queryCats.Any() && searchCriteria is TvSearchCriteria { Season: > 0 }) { // Avoid searching for specials if it's a non-zero season search - queryCats.RemoveAll(cat => cat is "anime[tv_special]" or "anime[ova]" or "anime[ona]" or "anime[dvd_special]" or "anime[bd_special]"); + queryCats.RemoveAll(cat => cat is "anime[tv_special]" or "anime[ova]" or "anime[dvd_special]" or "anime[bd_special]"); } if (queryCats.Any()) From e63ee13d236d2931fa9ded36cb0e3c2e7374a0e4 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sun, 30 Mar 2025 10:30:03 +0300 Subject: [PATCH 59/82] Bump version to 1.33.2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index b9f35e204..de880295f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.33.1' + majorVersion: '1.33.2' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 2b16d93095844ad6a867cfa69042f7398c9f442c Mon Sep 17 00:00:00 2001 From: Weblate <noreply@weblate.org> Date: Tue, 25 Mar 2025 11:04:28 +0000 Subject: [PATCH 60/82] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Alex Mills <alex@alexmills.uk> Co-authored-by: Lizandra Candido da Silva <lizandra.c.s@gmail.com> Co-authored-by: Oskari Lavinto <olavinto@protonmail.com> Co-authored-by: Weblate <noreply-mt-weblate@weblate.org> Co-authored-by: Weblate <noreply@weblate.org> Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fa/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/bg.json | 32 ++++++- src/NzbDrone.Core/Localization/Core/ca.json | 8 +- src/NzbDrone.Core/Localization/Core/cs.json | 7 +- src/NzbDrone.Core/Localization/Core/es.json | 3 +- src/NzbDrone.Core/Localization/Core/fa.json | 11 ++- src/NzbDrone.Core/Localization/Core/fi.json | 8 +- src/NzbDrone.Core/Localization/Core/ko.json | 85 ++++++++++++++++++- .../Localization/Core/nb_NO.json | 3 +- .../Localization/Core/pt_BR.json | 3 +- src/NzbDrone.Core/Localization/Core/tr.json | 3 +- 10 files changed, 150 insertions(+), 13 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index 35327a3a9..913275a68 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -387,5 +387,35 @@ "Label": "Етикет", "Categories": "Категории", "Album": "албум", - "Artist": "изпълнител" + "Artist": "изпълнител", + "AddConnection": "Добави връзка", + "AddConnectionImplementation": "Добави връзка - {implementationName}", + "AddDownloadClientImplementation": "Добави клиент за изтегляне - {implementationName}", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Потвърдете новата парола", + "Default": "Подразбиране", + "Any": "Всеки", + "ApplicationUrlHelpText": "Външният URL адрес на това приложение, включително http(s)://, порт и основно URL", + "Database": "База данни", + "Destination": "Дестинация", + "DownloadClientAriaSettingsDirectoryHelpText": "Незадължително локация за изтеглянията, оставете празно, за да използвате локацията по подразбиране на Aria2", + "DownloadClientDelugeSettingsUrlBaseHelpText": "Добавя префикс към url адреса на deluge json, вижте {url}", + "Directory": "Директория", + "AddIndexerImplementation": "Добави индексатор - {implementationName}", + "AuthenticationRequiredHelpText": "Променете за кои заявки се изисква удостоверяване. Не променяйте, освен ако не разбирате рисковете.", + "AuthenticationRequiredPasswordHelpTextWarning": "Въведете нова парола", + "DownloadClientDownloadStationSettingsDirectoryHelpText": "Незадължителна споделена папка, в която да се поставят изтеглянията, оставете празно, за да използвате местоположението по подразбиране на Download Station", + "DownloadClientFloodSettingsAdditionalTags": "Допълнителни тагове", + "DownloadClientFloodSettingsAdditionalTagsHelpText": "Добавя свойствата на медията като тагове. Напътствията са примери.", + "DownloadClientFloodSettingsTagsHelpText": "Първоначални тагове на изтегляне. За да бъде разпознато едно изтегляне, то трябва да има всички начални тагове. По този начин се избягват конфликти с необвързани с приложение изтегляния.", + "ApplicationURL": "URL адрес на приложението", + "AuthenticationRequired": "Изисква се удостоверяване", + "ApplyChanges": "Прилагане на промените", + "ApiKeyValidationHealthCheckMessage": "Моля, актуализирайте API ключа си така, че да съдържа поне {length} знака. Можете да направите това чрез настройките или конфигурационния файл", + "AppUpdated": "{appName} Актуализиран", + "AppUpdatedVersion": "{appName} е актуализиранa до версия `{version}`, за да получите най-новите промени, ще трябва да презаредите {appName}", + "Donate": "Дарете", + "AddCustomFilter": "Добави персонализиран филтър", + "AuthenticationMethod": "Метод за удостоверяване", + "AuthenticationMethodHelpTextWarning": "Моля, изберете валиден метод за удостоверяване", + "BlackholeFolderHelpText": "Папка, в която {appName} ще съхранява файла {extension}" } diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 342411047..3ff222098 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -501,5 +501,11 @@ "WouldYouLikeToRestoreBackup": "Voleu restaurar la còpia de seguretat '{name}'?", "InstallLatest": "Instal·la l'últim", "CurrentlyInstalled": "Instal·lat actualment", - "DownloadClientSettingsAddPaused": "Afegeix pausats" + "DownloadClientSettingsAddPaused": "Afegeix pausats", + "Install": "Instal·la", + "DownloadClientFloodSettingsAdditionalTags": "Etiquetes addicionals", + "DownloadClientFreeboxSettingsApiUrl": "URL de l'API", + "DownloadClientFreeboxSettingsAppId": "Identificador de l'aplicació", + "PreviouslyInstalled": "Instal·lat anteriorment", + "PasswordConfirmation": "Confirmeu la contrasenya" } diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 89f8d9fd1..64f4be31d 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -633,5 +633,10 @@ "IndexerAvistazSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání", "InitialFailure": "Úvodní selhání", "IndexerTorrentSyndikatSettingsApiKeyHelpText": "Klíč API stránky", - "SearchTypes": "Hledat typy" + "SearchTypes": "Hledat typy", + "NotificationTriggersHelpText": "Vyber, které události mají vyvolat toto upozornění", + "IndexerSettingsBaseUrl": "Základní URL", + "DownloadClientUTorrentProviderMessage": "uTorrent má historii zahrnování kryptoměnových těžařů, malwaru a reklam, důrazně vám doporučujeme zvolit jiného klienta.", + "IndexerSettingsBaseUrlHelpText": "Vyberte, jakou základní URL bude {appName} používat pro požadavky na web", + "IndexerSettingsPackSeedTimeIndexerHelpText": "Doba, po kterou by měl být balíček (sezóna nebo diskografie) torrentu seedován před zastavením, prázdné pole znamená výchozí nastavení aplikace" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 919dd5353..e7981a69e 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -806,5 +806,6 @@ "InstallMajorVersionUpdateMessageLink": "Por favor revisa [{domain}]({url}) para más información.", "FailedToFetchSettings": "Error al recuperar la configuración", "CurrentlyInstalled": "Actualmente instalado", - "PreviouslyInstalled": "Previamente instalado" + "PreviouslyInstalled": "Previamente instalado", + "DownloadClientUTorrentProviderMessage": "uTorrent tiene un amplio historial de incluir criptomineros, malware y publicidad, por lo que recomendamos encarecidamente que elijas un cliente diferente." } diff --git a/src/NzbDrone.Core/Localization/Core/fa.json b/src/NzbDrone.Core/Localization/Core/fa.json index 2839af8c0..c0f9f6513 100644 --- a/src/NzbDrone.Core/Localization/Core/fa.json +++ b/src/NzbDrone.Core/Localization/Core/fa.json @@ -1,4 +1,13 @@ { "ApiKey": "کلید API", - "NetCore": ".NET" + "NetCore": ".NET", + "Add": "افزودن", + "About": "درباره", + "Actions": "اقدامات", + "Docker": "Docker", + "AddConnection": "افزودن پیوند", + "AddConnectionImplementation": "افزودن پیوند - {implementationName}", + "AddDownloadClientImplementation": "افزودن کلاینت دانلود - {implementationName}", + "Torrents": "تورنت ها", + "Usenet": "Usenet" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 2db696a8a..ab235f518 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -34,7 +34,7 @@ "Fixed": "Korjattu", "FocusSearchBox": "Kohdista hakukenttä", "ForMoreInformationOnTheIndividualDownloadClients": "Saat lisätietoja yksittäisistä latauspalveluista painamalla niiden ohessa olevia lisätietopainikkeita.", - "HideAdvanced": "Piilota lisäasetukset", + "HideAdvanced": "Laajenna asetukset", "History": "Historia", "MIA": "Puuttuu", "New": "Uutta", @@ -161,7 +161,7 @@ "SendAnonymousUsageData": "Lähetä nimettömiä käyttötietoja", "SetTags": "Tunnisteiden määritys", "SettingsEnableColorImpairedMode": "Heikentyneen värinäön tila", - "ShowAdvanced": "Näytä lisäasetukset", + "ShowAdvanced": "Supista asetukset", "ShowSearchHelpText": "Näytä hakupainike osoitettaessa.", "Shutdown": "Sammuta", "Size": "Koko", @@ -715,8 +715,8 @@ "UpdaterLogFiles": "Päivittäjän lokitiedostot", "WouldYouLikeToRestoreBackup": "Haluatko palauttaa varmuuskopion \"{name}\"?", "InstallLatest": "Asenna uusin", - "CurrentlyInstalled": "Nyt asennettu", - "PreviouslyInstalled": "Aiemmin asennettu", + "CurrentlyInstalled": "Käytössä oleva versio", + "PreviouslyInstalled": "Aiemmin käytössä ollut versio", "Mixed": "Sekoitettu", "IndexerSettingsAppsMinimumSeeders": "Jakajien vähimmäismäärä", "FailedToFetchSettings": "Asetusten nouto epäonnistui", diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 17cd81637..5a30e0f08 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -423,5 +423,88 @@ "minutes": "분", "Author": "저작자", "Categories": "카테고리", - "SeedRatio": "종자 비율" + "SeedRatio": "종자 비율", + "AuthenticationRequiredHelpText": "필수 인증을 요청하는 변경 사항. 위험을 이해하지 못한다면 변경하지 마세요.", + "DownloadClientFloodSettingsAdditionalTagsHelpText": "미디어의 속성을 태그로 추가합니다. 힌트는 예시입니다.", + "DownloadClientRTorrentSettingsAddStoppedHelpText": "활성화하면 rTorrent에 정지된 상태에서 토런트와 마그넷이 추가됩니다. 마그넷 파일이 손상될 수 있습니다.", + "HealthMessagesInfoBox": "행 끝에 있는 위키 링크(책 아이콘)를 클릭하거나 [로그]({link})를 확인하면 이러한 상태 점검 메시지의 원인에 대한 상세 정보를 찾을 수 있습니다. 이러한 메시지를 해석하는 데 어려움이 있는 경우 아래 링크에서 지원팀에 문의할 수 있습니다.", + "DownloadClientSettingsDestinationHelpText": "다운로드 대상을 수동으로 지정하고 기본값을 사용하려면 비워두세요.", + "DownloadClientSettingsInitialStateHelpText": "{clientName}에 추가된 토런트의 초기 상태", + "IndexerSettingsAdditionalParameters": "매개 변수 추가", + "NoEventsFound": "이벤트가 없음", + "BlackholeFolderHelpText": "{appName}가 {extension} 파일을 저장할 폴더", + "DownloadClientSettingsUrlBaseHelpText": "{clientName} url에 {url}과 같은 접두사를 추가합니다.", + "DownloadClientQbittorrentSettingsContentLayout": "콘텐츠 레이아웃", + "Install": "설치", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "새 비밀번호 확인", + "FailedToFetchSettings": "설정을 가져오는데 실패함", + "Default": "기본값", + "Episode": "에피소드", + "AuthenticationMethod": "인증 방법", + "IndexerSettingsSeedRatio": "시드 비율", + "Destination": "대상", + "DownloadClientFreeboxSettingsAppToken": "앱 토큰", + "Logout": "로그아웃", + "DownloadClientFreeboxSettingsApiUrl": "API 주소", + "IndexerHDBitsSettingsCodecs": "코덱", + "WhatsNew": "새로운 소식?", + "DownloadClientFreeboxSettingsPortHelpText": "Freebox 인터페이스에 액세스하는 데 사용되는 포트, 기본값은 '{port}'", + "DownloadClientPneumaticSettingsStrmFolderHelpText": "이 폴더의 .strm 파일은 드론으로 가져옵니다.", + "DownloadClientQbittorrentSettingsInitialStateHelpText": "qBittorrent에 추가된 토렌트의 초기 상태입니다. 강제 토렌트는 시드 제한을 따르지 않는다는 점에 유의하세요.", + "DownloadClientRTorrentSettingsDirectoryHelpText": "다운로드를 넣을 선택 위치, 기본 rTorrent 위치를 사용하려면 비워두세요.", + "DownloadClientSettingsUseSslHelpText": "{clientName}에 연결할 때 보안 연결을 사용", + "DownloadClientTransmissionSettingsUrlBaseHelpText": "{clientName} rpc URL에 접두사를 추가합니다(예: {url}, 기본값은 '{defaultUrl}')", + "InstallMajorVersionUpdateMessageLink": "상세 내용은 [{domain}]({url})을 확인하세요.", + "ApplicationUrlHelpText": "이 애플리케이션의 외부 URL - http(s)://, port 및 URL 기반 포함", + "Theme": "테마", + "ApplicationURL": "애플리케이션 URL", + "Directory": "디렉토리", + "DownloadClientDownloadStationSettingsDirectoryHelpText": "다운로드를 넣을 공유 폴더(선택 사항). 기본 다운로드 스테이션 위치를 사용하려면 비워두세요.", + "DownloadClientFloodSettingsAdditionalTags": "추가 태그", + "DownloadClientFloodSettingsUrlBaseHelpText": "{url}와 같은 Flood API에 접두사를 추가합니다", + "DownloadClientFreeboxSettingsApiUrlHelpText": "API 버전을 사용하여 Freebox API 기본 URL을 정의하세요, 예를 들어 '{url}', 기본값은 '{defaultApiUrl}')", + "DownloadClientFreeboxSettingsAppId": "앱 ID", + "DownloadClientNzbgetSettingsAddPausedHelpText": "이 옵션을 사용하려면 최소한 NzbGet 버전 16.0이 필요합니다", + "DownloadClientPneumaticSettingsNzbFolderHelpText": "이 폴더는 XBMC에서 접근할 수 있어야 합니다.", + "DownloadClientRTorrentSettingsAddStopped": "중지됨 추가", + "Category": "카테고리", + "DownloadClientTransmissionSettingsDirectoryHelpText": "다운로드를 넣을 위치 (선택 사항), 기본 전송 위치를 사용하려면 비워두세요", + "External": "외부", + "IndexerSettingsSeedRatioHelpText": "토렌드가 멈추기 전에 도달해야 하는 비율, 비어 있을 경우 다운로드 클라이언트의 기본값을 사용합니다. 비율은 최소 1.0이어야 하며 인덱서 규칙을 따라야 합니다", + "IndexerSettingsSeedTimeHelpText": "토렌드가 중지되기 전에 시드되어야 하는 시간, 비어 있을 경우 다운로드 클라이언트의 기본값을 사용합니다", + "InvalidUILanguage": "UI가 잘못된 언어로 설정되어 있습니다, 수정하고 설정을 저장하세요", + "AuthenticationRequired": "인증 필요", + "NotificationsTelegramSettingsIncludeAppNameHelpText": "다른 애플리케이션의 알림을 구분하기 위해 메시지 제목 앞에 {appName}를 접두사로 사용 (선택 사항)", + "PackageVersionInfo": "{packageVersion} by {packageAuthor}", + "Duration": "기간", + "Script": "스크립트", + "SelectDownloadClientModalTitle": "{modalTitle} - 다운로드 클라이언트 선택", + "TheLogLevelDefault": "로그 수준의 기본값은 '정보'이며 [일반 설정](/settings/general)에서 변경할 수 있습니다", + "UpdaterLogFiles": "업데이트 도구 로그 파일", + "CountDownloadClientsSelected": "{count}개의 다운로드 클라이언트를 선택함", + "DefaultNameCopiedProfile": "{name} - 복사", + "DownloadClientDelugeSettingsUrlBaseHelpText": "deluge json url에 접두사를 추가합니다. {url}을(를) 참조하세요", + "FailedToFetchUpdates": "업데이트를 가져오는데 실패함", + "ApplyChanges": "변경 사항 적용", + "Started": "시작됨", + "Database": "데이터베이스", + "PasswordConfirmation": "비밀번호 확인", + "TorrentBlackholeSaveMagnetFiles": "마그넷 파일 저장", + "TorrentBlackholeSaveMagnetFilesExtension": "마그넷 파일 확장자 저장", + "TorrentBlackholeSaveMagnetFilesExtensionHelpText": "마그넷 링크에 사용할 확장자, 기본값은 '.magnet'입니다", + "TorrentBlackholeSaveMagnetFilesHelpText": ".torrent 파일을 사용할 수 없는 경우 마그넷 링크를 저장합니다 (다운로드 클라이언트가 파일에 저장된 마그넷을 지원하는 경우에만 유용함)", + "AuthenticationMethodHelpTextWarning": "유효한 인증 방법을 선택해주세요", + "AuthenticationRequiredPasswordHelpTextWarning": "새로운 비밀번호를 입력하세요", + "AuthenticationRequiredUsernameHelpTextWarning": "새로운 사용자이름을 입력하세요", + "AuthenticationRequiredWarning": "인증 없이 원격 액세스를 방지하기 위해 {appName}은(는) 이제 인증을 활성화해야 합니다. 선택적으로 로컬 주소에서 인증을 비활성화할 수 있습니다.", + "CountIndexersSelected": "{count}개의 인덱서를 선택함", + "Label": "라벨", + "More": "더 보기", + "Donate": "기부하기", + "Menu": "메뉴", + "DownloadClientQbittorrentSettingsContentLayoutHelpText": "qBittorrent의 구성된 콘텐츠 레이아웃을 사용할지, 토런트의 원래 레이아웃을 사용할지, 항상 하위 폴더를 생성할지(qBittorrent 4.3.2+)", + "DownloadClientSettingsAddPaused": "일시 중지 추가", + "SecretToken": "비밀 토큰", + "NoDownloadClientsFound": "다운로드 클라이언트를 찾을 수 없음", + "PrioritySettings": "우선 순위: {0}" } diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json index a01858498..12e1c4557 100644 --- a/src/NzbDrone.Core/Localization/Core/nb_NO.json +++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json @@ -160,5 +160,6 @@ "AptUpdater": "Bruk apt til å installere oppdateringen", "Discord": "Discord", "AddCustomFilter": "Legg til eget filter", - "Clone": "Lukk" + "Clone": "Lukk", + "AddDownloadClientImplementation": "Ny Nedlastingsklient - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 5ba6e6764..43c1f2932 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -806,5 +806,6 @@ "InstallMajorVersionUpdateMessageLink": "Verifique [{domain}]({url}) para obter mais informações.", "FailedToFetchSettings": "Falha ao obter configurações", "CurrentlyInstalled": "Atualmente instalado", - "PreviouslyInstalled": "Instalado anteriormente" + "PreviouslyInstalled": "Instalado anteriormente", + "DownloadClientUTorrentProviderMessage": "O uTorrent tem um histórico de incluir criptomineradores, malware e anúncios, recomendamos que você escolha outro cliente de download." } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index b9a2525f7..0d4af37ac 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -806,5 +806,6 @@ "IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Kullanıcı ve Torrent izinlerine sahip olmalısınız", "IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Grup adlarına göre sürüm ara", "IndexerHealthCheckNoIndexers": "Hiçbir indeksleyici etkinleştirilmedi, {appName} arama sonuçlarını döndürmeyecek", - "QueryType": "Sorgu Türü" + "QueryType": "Sorgu Türü", + "DownloadClientUTorrentProviderMessage": "uTorrent'in kripto para madenciliği, kötü amaçlı yazılım ve reklam içerme geçmişi vardır, bu nedenle farklı bir istemci seçmenizi önemle tavsiye ederiz." } From f6f2a3b00d0c3986f11078deb804e89480f812ff Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Wed, 2 Apr 2025 00:10:40 +0300 Subject: [PATCH 61/82] Bump linux agent to ubuntu-22.04 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index de880295f..1242e4eed 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -19,7 +19,7 @@ variables: nodeVersion: '20.X' innoVersion: '6.2.2' windowsImage: 'windows-2022' - linuxImage: 'ubuntu-20.04' + linuxImage: 'ubuntu-22.04' macImage: 'macOS-13' trigger: From 700862635823004f5abce0845931cfa3068b7a46 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Fri, 4 Apr 2025 21:33:47 +0300 Subject: [PATCH 62/82] Fixed: (PassThePopcorn) Parse volume factors for neutral leech releases --- .../Definitions/PassThePopcorn/PassThePopcornParser.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs index e08536162..7b6fe586e 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs @@ -59,7 +59,7 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn // skip non-freeleech results when freeleech only is set var downloadVolumeFactor = torrent.FreeleechType?.ToUpperInvariant() switch { - "FREELEECH" => 0, + "FREELEECH" or "NEUTRAL LEECH" => 0, "HALF LEECH" => 0.5, _ => 1 }; @@ -91,6 +91,12 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn categories.Add(NewznabStandardCategory.TV); } + var uploadVolumeFactor = torrent.FreeleechType?.ToUpperInvariant() switch + { + "NEUTRAL LEECH" => 0, + _ => 1 + }; + torrentInfos.Add(new TorrentInfo { Guid = $"PassThePopcorn-{id}", @@ -108,7 +114,7 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn Scene = torrent.Scene, IndexerFlags = flags, DownloadVolumeFactor = downloadVolumeFactor, - UploadVolumeFactor = 1, + UploadVolumeFactor = uploadVolumeFactor, MinimumRatio = 1, MinimumSeedTime = 345600, Genres = result.Tags ?? new List<string>(), From 548dedad5c285a407c4bfe79c2f3e4d2f3496606 Mon Sep 17 00:00:00 2001 From: Weblate <noreply@weblate.org> Date: Sun, 6 Apr 2025 09:22:41 +0000 Subject: [PATCH 63/82] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Ste <stefanucciu@gmail.com> Co-authored-by: Weblate <noreply-mt-weblate@weblate.org> Co-authored-by: Weblate <noreply@weblate.org> Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ca.json | 7 ++++++- src/NzbDrone.Core/Localization/Core/cs.json | 3 ++- src/NzbDrone.Core/Localization/Core/fr.json | 3 ++- src/NzbDrone.Core/Localization/Core/ru.json | 3 ++- src/NzbDrone.Core/Localization/Core/uk.json | 10 +++++++++- 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 3ff222098..76350e36a 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -507,5 +507,10 @@ "DownloadClientFreeboxSettingsApiUrl": "URL de l'API", "DownloadClientFreeboxSettingsAppId": "Identificador de l'aplicació", "PreviouslyInstalled": "Instal·lat anteriorment", - "PasswordConfirmation": "Confirmeu la contrasenya" + "PasswordConfirmation": "Confirmeu la contrasenya", + "IndexerHDBitsSettingsOriginsHelpText": "Si no s'especifica, s'utilitzen totes les opcions.", + "MinimumSeeders": "Seeders mínims", + "SeedRatio": "Ràtio de la llavor", + "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Si un torrent està bloquejat per un hash, pot ser que no es rebutgi correctament durant el RSS/Search per a alguns indexadors, habilitant això permetrà que es rebutgi després que s'agafi el torrent, però abans que s'enviï al client.", + "SeedTime": "Temps de la llavor" } diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 64f4be31d..21975a02e 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -638,5 +638,6 @@ "IndexerSettingsBaseUrl": "Základní URL", "DownloadClientUTorrentProviderMessage": "uTorrent má historii zahrnování kryptoměnových těžařů, malwaru a reklam, důrazně vám doporučujeme zvolit jiného klienta.", "IndexerSettingsBaseUrlHelpText": "Vyberte, jakou základní URL bude {appName} používat pro požadavky na web", - "IndexerSettingsPackSeedTimeIndexerHelpText": "Doba, po kterou by měl být balíček (sezóna nebo diskografie) torrentu seedován před zastavením, prázdné pole znamená výchozí nastavení aplikace" + "IndexerSettingsPackSeedTimeIndexerHelpText": "Doba, po kterou by měl být balíček (sezóna nebo diskografie) torrentu seedován před zastavením, prázdné pole znamená výchozí nastavení aplikace", + "PackSeedTimeHelpText": "Doba, po kterou by měl být balíček (sezóna nebo diskografie) torrentu seedován před zastavením, prázdné pole znamená výchozí nastavení aplikace" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 34fb107a9..8768f9c50 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -806,5 +806,6 @@ "IndexerSettingsPreferMagnetUrl": "URL de préférence Magnet", "IndexerPassThePopcornSettingsGoldenPopcornOnly": "Popcorn doré uniquement", "IndexerPassThePopcornSettingsGoldenPopcornOnlyHelpText": "Rechercher uniquement les versions Golden Popcorn", - "IndexerAvistazSettingsUsernameHelpTextWarning": "Seuls les membres de rang et supérieur peuvent utiliser l'API sur cet indexeur." + "IndexerAvistazSettingsUsernameHelpTextWarning": "Seuls les membres de rang et supérieur peuvent utiliser l'API sur cet indexeur.", + "DownloadClientUTorrentProviderMessage": "uTorrent a un historique d'inclusion de cryptomineurs, de logiciels malveillants et de publicités. Nous vous recommandons fortement de choisir un autre client." } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index d396b076e..f31829160 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -806,5 +806,6 @@ "InstallMajorVersionUpdateMessage": "Это обновление установит новую версию, которая может не поддерживаться вашей системой. Вы уверены, что хотите установить это обновление?", "FailedToFetchSettings": "Не удалось загрузить настройки", "CurrentlyInstalled": "Установлено", - "PreviouslyInstalled": "Ранее установленный" + "PreviouslyInstalled": "Ранее установленный", + "DownloadClientUTorrentProviderMessage": "Мы настоятельно советуем не использовать uTorrent, т.к. он известен как программа-шифровальщик и в целом вредоносное ПО." } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index f6390540a..f42bd890b 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -441,5 +441,13 @@ "CurrentlyInstalled": "В даний час встановлено", "Season": "Причина", "Stats": "Статус", - "CountIndexersSelected": "{count} індексер(-и) обрано" + "CountIndexersSelected": "{count} індексер(-и) обрано", + "SeedRatio": "Коефіцієнт роздачі", + "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Якщо торрент заблоковано хешем, він може не бути належним чином відхилений під час RSS/пошуку для деяких індексаторів. Увімкнення цього параметра дозволить відхилити його після захоплення торента, але до його відправки клієнту.", + "MinimumSeeders": "Мінімум сидерів (роздаючих)", + "SeedTime": "Час сидіння", + "Author": "Автор", + "OnHealthRestoredHelpText": "При відновленні стану", + "IndexerHDBitsSettingsOriginsHelpText": "Якщо не вказано, використовуються всі параметри.", + "days": "дні(в)" } From 7cb70716d040e1e5d00c060f05adb416805bae62 Mon Sep 17 00:00:00 2001 From: MrE12345 <78666580+MrE12345@users.noreply.github.com> Date: Sun, 6 Apr 2025 11:43:24 +0200 Subject: [PATCH 64/82] Fixed: (NorBits) Change encoding to UTF8 (#2367) --- src/NzbDrone.Core/Indexers/Definitions/NorBits.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs index 990cf3d68..e989a5c6a 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs @@ -27,7 +27,7 @@ public class NorBits : TorrentIndexerBase<NorBitsSettings> public override string[] IndexerUrls => new[] { "https://norbits.net/" }; public override string Description => "NorBits is a Norwegian Private site for MOVIES / TV / GENERAL"; public override string Language => "nb-NO"; - public override Encoding Encoding => Encoding.GetEncoding("iso-8859-1"); + public override Encoding Encoding => Encoding.UTF8; public override IndexerPrivacy Privacy => IndexerPrivacy.Private; public override IndexerCapabilities Capabilities => SetCapabilities(); From 07711da4e090887eb6540d77d05bc3d3d9d2bc29 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sun, 6 Apr 2025 15:44:25 +0300 Subject: [PATCH 65/82] Bump version to 1.33.3 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 1242e4eed..78b955e67 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.33.2' + majorVersion: '1.33.3' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From de099c6770ae96b12eadd48c1329b05d26568c77 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Mon, 7 Apr 2025 15:58:01 +0300 Subject: [PATCH 66/82] Log delete statements only once --- src/NzbDrone.Core/Datastore/BasicRepository.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Datastore/BasicRepository.cs b/src/NzbDrone.Core/Datastore/BasicRepository.cs index dc76a5a31..796e277b7 100644 --- a/src/NzbDrone.Core/Datastore/BasicRepository.cs +++ b/src/NzbDrone.Core/Datastore/BasicRepository.cs @@ -254,7 +254,7 @@ namespace NzbDrone.Core.Datastore protected void Delete(SqlBuilder builder) { - var sql = builder.AddDeleteTemplate(typeof(TModel)).LogQuery(); + var sql = builder.AddDeleteTemplate(typeof(TModel)); using (var conn = _database.OpenConnection()) { From 8a9518c9c164f0c803b7f7bde6483bf12555f380 Mon Sep 17 00:00:00 2001 From: Mark McDowall <mark@mcdowall.ca> Date: Mon, 31 Mar 2025 19:26:14 -0700 Subject: [PATCH 67/82] Update WikiUrl type in API docs (cherry picked from commit 9bd619ccfe074abe396bbf043a36a5be18a7ba4b) --- src/Prowlarr.Api.V1/Health/HealthResource.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Prowlarr.Api.V1/Health/HealthResource.cs b/src/Prowlarr.Api.V1/Health/HealthResource.cs index 1e2c8ffa5..3f357285d 100644 --- a/src/Prowlarr.Api.V1/Health/HealthResource.cs +++ b/src/Prowlarr.Api.V1/Health/HealthResource.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Linq; -using NzbDrone.Common.Http; using NzbDrone.Core.HealthCheck; using Prowlarr.Http.REST; @@ -11,7 +10,7 @@ namespace Prowlarr.Api.V1.Health public string Source { get; set; } public HealthCheckResult Type { get; set; } public string Message { get; set; } - public HttpUri WikiUrl { get; set; } + public string WikiUrl { get; set; } } public static class HealthResourceMapper @@ -29,7 +28,7 @@ namespace Prowlarr.Api.V1.Health Source = model.Source.Name, Type = model.Type, Message = model.Message, - WikiUrl = model.WikiUrl + WikiUrl = model.WikiUrl.FullUri }; } From 48301055eae8f7efd24dbfdcd1a2b20637f1a506 Mon Sep 17 00:00:00 2001 From: Mark McDowall <mark@mcdowall.ca> Date: Mon, 24 Mar 2025 20:07:15 -0700 Subject: [PATCH 68/82] Fixed: Set output encoding to UTF-8 when running external processes (cherry picked from commit f8e57b09856278a6d0c65f18704e96a33459687d) --- src/NzbDrone.Common/Processes/ProcessProvider.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Common/Processes/ProcessProvider.cs b/src/NzbDrone.Common/Processes/ProcessProvider.cs index 4947e7080..c68207a09 100644 --- a/src/NzbDrone.Common/Processes/ProcessProvider.cs +++ b/src/NzbDrone.Common/Processes/ProcessProvider.cs @@ -6,6 +6,7 @@ using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Linq; +using System.Text; using NLog; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Model; @@ -117,7 +118,9 @@ namespace NzbDrone.Common.Processes UseShellExecute = false, RedirectStandardError = true, RedirectStandardOutput = true, - RedirectStandardInput = true + RedirectStandardInput = true, + StandardOutputEncoding = Encoding.UTF8, + StandardErrorEncoding = Encoding.UTF8 }; if (environmentVariables != null) From fc9dfb0cf7e41a029a92a1f60e2ca109bb2bff3a Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Mon, 7 Apr 2025 15:54:06 +0300 Subject: [PATCH 69/82] Fixed: Disallow tags creation with empty label --- src/Prowlarr.Api.V1/Tags/TagController.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Prowlarr.Api.V1/Tags/TagController.cs b/src/Prowlarr.Api.V1/Tags/TagController.cs index ed3aeebb9..83e9825c9 100644 --- a/src/Prowlarr.Api.V1/Tags/TagController.cs +++ b/src/Prowlarr.Api.V1/Tags/TagController.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using FluentValidation; using Microsoft.AspNetCore.Mvc; using NzbDrone.Core.Datastore.Events; using NzbDrone.Core.Messaging.Events; @@ -20,6 +21,8 @@ namespace Prowlarr.Api.V1.Tags : base(signalRBroadcaster) { _tagService = tagService; + + SharedValidator.RuleFor(c => c.Label).NotEmpty(); } public override TagResource GetResourceById(int id) From 1339373e4344c0d6988f85fd1fb683eabfb0a58e Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Tue, 8 Apr 2025 11:42:21 +0300 Subject: [PATCH 70/82] Bump Selenium.WebDriver.ChromeDriver --- src/NzbDrone.Automation.Test/Prowlarr.Automation.Test.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Automation.Test/Prowlarr.Automation.Test.csproj b/src/NzbDrone.Automation.Test/Prowlarr.Automation.Test.csproj index bb0b5fcc4..78c8b7d0f 100644 --- a/src/NzbDrone.Automation.Test/Prowlarr.Automation.Test.csproj +++ b/src/NzbDrone.Automation.Test/Prowlarr.Automation.Test.csproj @@ -4,7 +4,7 @@ </PropertyGroup> <ItemGroup> <PackageReference Include="Selenium.Support" Version="4.1.0" /> - <PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="99.0.4844.5100" /> + <PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="134.0.6998.16500" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\NzbDrone.Test.Common\Prowlarr.Test.Common.csproj" /> From 6be4203b4134f4c47d08659110cf11e83c85c945 Mon Sep 17 00:00:00 2001 From: Servarr <development@lidarr.audio> Date: Tue, 8 Apr 2025 10:37:59 +0000 Subject: [PATCH 71/82] Automated API Docs update --- src/Prowlarr.Api.V1/openapi.json | 45 ++------------------------------ 1 file changed, 2 insertions(+), 43 deletions(-) diff --git a/src/Prowlarr.Api.V1/openapi.json b/src/Prowlarr.Api.V1/openapi.json index c7fa206e8..35cb7d6a0 100644 --- a/src/Prowlarr.Api.V1/openapi.json +++ b/src/Prowlarr.Api.V1/openapi.json @@ -4739,7 +4739,8 @@ "nullable": true }, "wikiUrl": { - "$ref": "#/components/schemas/HttpUri" + "type": "string", + "nullable": true } }, "additionalProperties": false @@ -4991,48 +4992,6 @@ }, "additionalProperties": false }, - "HttpUri": { - "type": "object", - "properties": { - "fullUri": { - "type": "string", - "nullable": true, - "readOnly": true - }, - "scheme": { - "type": "string", - "nullable": true, - "readOnly": true - }, - "host": { - "type": "string", - "nullable": true, - "readOnly": true - }, - "port": { - "type": "integer", - "format": "int32", - "nullable": true, - "readOnly": true - }, - "path": { - "type": "string", - "nullable": true, - "readOnly": true - }, - "query": { - "type": "string", - "nullable": true, - "readOnly": true - }, - "fragment": { - "type": "string", - "nullable": true, - "readOnly": true - } - }, - "additionalProperties": false - }, "IActionResult": { "type": "object", "additionalProperties": false From c8370c9e00a545ab6b713dae486fd8e1721aaa28 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Wed, 9 Apr 2025 20:59:15 +0300 Subject: [PATCH 72/82] Bump version to 1.34.0 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 78b955e67..7871f712d 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.33.3' + majorVersion: '1.34.0' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 6aefd46cd45544c7509c221b7395bb569fc2720a Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sat, 12 Apr 2025 14:31:29 +0300 Subject: [PATCH 73/82] Fixed: (SecretCinema) Edition not being decoded --- src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs b/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs index ab63387e6..e8d8b1584 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SecretCinema.cs @@ -20,7 +20,7 @@ public class SecretCinema : GazelleBase<GazelleSettings> { public override string Name => "Secret Cinema"; public override string[] IndexerUrls => new[] { "https://secret-cinema.pw/" }; - public override string Description => "A tracker for rare movies."; + public override string Description => "Secret Cinema is a Private ratioless site for rare MOVIES."; public override IndexerPrivacy Privacy => IndexerPrivacy.Private; public override IndexerCapabilities Capabilities => SetCapabilities(); @@ -151,7 +151,7 @@ public class SecretCinemaParser : IParseIndexerResponse if (torrent.RemasterTitle.IsNotNullOrWhiteSpace()) { - release.Title += $" [{torrent.RemasterTitle.Trim()}]"; + release.Title += $" [{WebUtility.HtmlDecode(torrent.RemasterTitle).Trim()}]"; } // Replace media formats with standards From 71937fa44c71d51a7262edaf92ad7e76f85638c4 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sat, 12 Apr 2025 14:33:30 +0300 Subject: [PATCH 74/82] Update timezone offset for FL --- .../IndexerTests/FileListTests/FileListFixture.cs | 2 +- .../Indexers/Definitions/FileList/FileListParser.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs index 3699a9d0c..b6f06d180 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs @@ -55,7 +55,7 @@ namespace NzbDrone.Core.Test.IndexerTests.FileListTests torrentInfo.InfoUrl.Should().Be("https://filelist.io/details.php?id=665873"); torrentInfo.CommentUrl.Should().BeNullOrEmpty(); torrentInfo.Indexer.Should().Be(Subject.Definition.Name); - torrentInfo.PublishDate.Should().Be(DateTime.Parse("2020-01-25 20:20:19")); + torrentInfo.PublishDate.Should().Be(DateTime.Parse("2020-01-25 19:20:19")); torrentInfo.Size.Should().Be(8300512414); torrentInfo.InfoHash.Should().Be(null); torrentInfo.MagnetUrl.Should().Be(null); diff --git a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs index b45ddf19b..6d91d930d 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs @@ -77,7 +77,7 @@ public class FileListParser : IParseIndexerResponse InfoUrl = GetInfoUrl(id), Seeders = row.Seeders, Peers = row.Leechers + row.Seeders, - PublishDate = DateTime.Parse(row.UploadDate + " +0200", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal), + PublishDate = DateTime.Parse(row.UploadDate + " +0300", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal), Description = row.SmallDescription, Genres = row.SmallDescription.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList(), ImdbId = imdbId, From 3287d45661bdbb392777c53f5395a45c8cb28ef9 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sat, 12 Apr 2025 14:42:25 +0300 Subject: [PATCH 75/82] Update timezone offset for AvistaZ trackers --- .../IndexerTests/AvistazTests/AvistazFixture.cs | 2 +- .../IndexerTests/AvistazTests/ExoticazFixture.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs | 2 +- src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/AvistazFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/AvistazFixture.cs index b8f7951d2..dcabb4dbf 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/AvistazFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/AvistazFixture.cs @@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AvistazTests torrentInfo.InfoUrl.Should().Be("https://avistaz.to/torrent/187240-japan-sinks-people-of-hope-2021-s01e05-720p-nf-web-dl-ddp20-x264-seikel"); torrentInfo.CommentUrl.Should().BeNullOrEmpty(); torrentInfo.Indexer.Should().Be(Subject.Definition.Name); - torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-11-14 22:26:21")); + torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-11-14 21:26:21")); torrentInfo.Size.Should().Be(935127615); torrentInfo.InfoHash.Should().Be("a879261d4e6e792402f92401141a21de70d51bf2"); torrentInfo.MagnetUrl.Should().Be(null); diff --git a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/ExoticazFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/ExoticazFixture.cs index 4c4f9f38e..fe4ada593 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/ExoticazFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/AvistazTests/ExoticazFixture.cs @@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AvistazTests torrentInfo.InfoUrl.Should().Be("https://exoticaz.to/torrent/64040-ssis-419-my-first-experience-is-yua-mikami-from-the-day-i-lost-my-virginity-i-was-devoted-to-sex"); torrentInfo.CommentUrl.Should().BeNullOrEmpty(); torrentInfo.Indexer.Should().Be(Subject.Definition.Name); - torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-06-11 10:04:50")); + torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-06-11 09:04:50")); torrentInfo.Size.Should().Be(7085405541); torrentInfo.InfoHash.Should().Be("asdjfiasdf54asd7f4a2sdf544asdf"); torrentInfo.MagnetUrl.Should().Be(null); diff --git a/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs b/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs index 4e1899651..7d9ba3b51 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/AvistaZ.cs @@ -84,6 +84,6 @@ namespace NzbDrone.Core.Indexers.Definitions public class AvistaZParser : AvistazParserBase { - protected override string TimezoneOffset => "+01:00"; + protected override string TimezoneOffset => "+02:00"; } } diff --git a/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs b/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs index 784cc56e4..0933ea6a2 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/ExoticaZ.cs @@ -54,7 +54,7 @@ namespace NzbDrone.Core.Indexers.Definitions { private readonly IndexerCapabilitiesCategories _categories; - protected override string TimezoneOffset => "+01:00"; + protected override string TimezoneOffset => "+02:00"; public ExoticaZParser(IndexerCapabilitiesCategories categories) { From 46f73c51bb4402094d31d8c71c0a964252e2bedf Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sat, 12 Apr 2025 14:54:01 +0300 Subject: [PATCH 76/82] Bump IPAddressRange, Npgsql, System.Text.Json --- src/NzbDrone.Common/Prowlarr.Common.csproj | 14 +++++++------- src/NzbDrone.Core/Prowlarr.Core.csproj | 8 ++++---- src/NzbDrone.Host/Prowlarr.Host.csproj | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/NzbDrone.Common/Prowlarr.Common.csproj b/src/NzbDrone.Common/Prowlarr.Common.csproj index b26b024bc..106890399 100644 --- a/src/NzbDrone.Common/Prowlarr.Common.csproj +++ b/src/NzbDrone.Common/Prowlarr.Common.csproj @@ -5,21 +5,21 @@ </PropertyGroup> <ItemGroup> <PackageReference Include="DryIoc.dll" Version="5.4.3" /> - <PackageReference Include="IPAddressRange" Version="6.1.0" /> - <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" /> - <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" /> + <PackageReference Include="IPAddressRange" Version="6.2.0" /> + <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.2" /> + <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="NLog" Version="5.4.0" /> <PackageReference Include="NLog.Layouts.ClefJsonLayout" Version="1.0.3" /> <PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" /> - <PackageReference Include="Npgsql" Version="7.0.9" /> + <PackageReference Include="Npgsql" Version="7.0.10" /> <PackageReference Include="Sentry" Version="4.0.2" /> <PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" /> <PackageReference Include="SharpZipLib" Version="1.4.2" /> - <PackageReference Include="System.Text.Json" Version="6.0.10" /> - <PackageReference Include="System.ValueTuple" Version="4.5.0" /> + <PackageReference Include="System.Text.Json" Version="6.0.11" /> + <PackageReference Include="System.ValueTuple" Version="4.6.1" /> <PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" /> - <PackageReference Include="System.Configuration.ConfigurationManager" Version="6.0.1" /> + <PackageReference Include="System.Configuration.ConfigurationManager" Version="6.0.2" /> <PackageReference Include="System.IO.FileSystem.AccessControl" Version="5.0.0" /> <PackageReference Include="System.Runtime.Loader" Version="4.3.0" /> <PackageReference Include="System.ServiceProcess.ServiceController" Version="6.0.1" /> diff --git a/src/NzbDrone.Core/Prowlarr.Core.csproj b/src/NzbDrone.Core/Prowlarr.Core.csproj index 4b8138cb4..d3f7656be 100644 --- a/src/NzbDrone.Core/Prowlarr.Core.csproj +++ b/src/NzbDrone.Core/Prowlarr.Core.csproj @@ -8,21 +8,21 @@ <PackageReference Include="Diacritical.Net" Version="1.0.4" /> <PackageReference Include="MailKit" Version="4.8.0" /> <PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="6.0.35" /> - <PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0" /> + <PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.3.0" /> <PackageReference Include="Microsoft.Data.SqlClient" Version="2.1.7" /> <PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" /> - <PackageReference Include="Npgsql" Version="7.0.9" /> + <PackageReference Include="Npgsql" Version="7.0.10" /> <PackageReference Include="Polly" Version="8.5.2" /> <PackageReference Include="Servarr.FluentMigrator.Runner" Version="3.3.2.9" /> <PackageReference Include="Servarr.FluentMigrator.Runner.Postgres" Version="3.3.2.9" /> <PackageReference Include="Servarr.FluentMigrator.Runner.SQLite" Version="3.3.2.9" /> - <PackageReference Include="System.Memory" Version="4.6.0" /> + <PackageReference Include="System.Memory" Version="4.6.3" /> <PackageReference Include="System.ServiceModel.Syndication" Version="6.0.0" /> <PackageReference Include="FluentValidation" Version="9.5.4" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="NLog" Version="5.4.0" /> <PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" /> - <PackageReference Include="System.Text.Json" Version="6.0.10" /> + <PackageReference Include="System.Text.Json" Version="6.0.11" /> <PackageReference Include="MonoTorrent" Version="2.0.7" /> <PackageReference Include="YamlDotNet" Version="13.1.1" /> <PackageReference Include="AngleSharp" Version="1.2.0" /> diff --git a/src/NzbDrone.Host/Prowlarr.Host.csproj b/src/NzbDrone.Host/Prowlarr.Host.csproj index 8dd6d8e61..f302e9cbe 100644 --- a/src/NzbDrone.Host/Prowlarr.Host.csproj +++ b/src/NzbDrone.Host/Prowlarr.Host.csproj @@ -5,8 +5,8 @@ </PropertyGroup> <ItemGroup> <PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" /> - <PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.0" /> - <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" /> + <PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.1" /> + <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.3" /> <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" /> <PackageReference Include="DryIoc.dll" Version="5.4.3" /> <PackageReference Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" /> From 4ba72ea7f3e00cd63e1265e1e35ffc25b7d8f3dc Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sat, 12 Apr 2025 14:54:56 +0300 Subject: [PATCH 77/82] Bump Swashbuckle to 7.3.2 --- docs.sh | 2 +- src/NzbDrone.Host/Prowlarr.Host.csproj | 2 +- src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs.sh b/docs.sh index ab084b61b..38b0e0fbc 100755 --- a/docs.sh +++ b/docs.sh @@ -38,7 +38,7 @@ 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.6.2 Swashbuckle.AspNetCore.Cli +dotnet tool install --version 7.3.2 Swashbuckle.AspNetCore.Cli dotnet tool run swagger tofile --output ./src/Prowlarr.Api.V1/openapi.json "$outputFolder/$FRAMEWORK/$RUNTIME/$application" v1 & diff --git a/src/NzbDrone.Host/Prowlarr.Host.csproj b/src/NzbDrone.Host/Prowlarr.Host.csproj index f302e9cbe..12bd5168e 100644 --- a/src/NzbDrone.Host/Prowlarr.Host.csproj +++ b/src/NzbDrone.Host/Prowlarr.Host.csproj @@ -7,7 +7,7 @@ <PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" /> <PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.1" /> <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.3" /> - <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" /> + <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="7.3.2" /> <PackageReference Include="DryIoc.dll" Version="5.4.3" /> <PackageReference Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" /> </ItemGroup> diff --git a/src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj b/src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj index 4371487f2..15684b0fe 100644 --- a/src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj +++ b/src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj @@ -5,7 +5,7 @@ <ItemGroup> <PackageReference Include="FluentValidation" Version="9.5.4" /> <PackageReference Include="NLog" Version="5.4.0" /> - <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" /> + <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="7.3.2" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\NzbDrone.Core\Prowlarr.Core.csproj" /> From 075fd24f96b7759b6459529a1c252f2e62aa5132 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sat, 12 Apr 2025 16:17:13 +0300 Subject: [PATCH 78/82] Downgrade Microsoft.AspNetCore.WebUtilities --- src/NzbDrone.Core/Prowlarr.Core.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Prowlarr.Core.csproj b/src/NzbDrone.Core/Prowlarr.Core.csproj index d3f7656be..3f70dd577 100644 --- a/src/NzbDrone.Core/Prowlarr.Core.csproj +++ b/src/NzbDrone.Core/Prowlarr.Core.csproj @@ -8,7 +8,7 @@ <PackageReference Include="Diacritical.Net" Version="1.0.4" /> <PackageReference Include="MailKit" Version="4.8.0" /> <PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="6.0.35" /> - <PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.3.0" /> + <PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0" /> <PackageReference Include="Microsoft.Data.SqlClient" Version="2.1.7" /> <PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" /> <PackageReference Include="Npgsql" Version="7.0.10" /> From 362f3fe22382220ec1478c8f2eef4c6a0e847d63 Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sun, 13 Apr 2025 09:48:04 +0300 Subject: [PATCH 79/82] Bump version to 1.34.1 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 7871f712d..1f79a65ec 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.34.0' + majorVersion: '1.34.1' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 0322d70d6342af8437257986e5c2666564625e6c Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sun, 20 Apr 2025 11:08:04 +0300 Subject: [PATCH 80/82] Fixed: Handle 307 and 308 redirects for indexer download requests --- src/NzbDrone.Core/Indexers/HttpIndexerBase.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs index fde23c691..4a8014c63 100644 --- a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs @@ -250,7 +250,11 @@ namespace NzbDrone.Core.Indexers { var response = await _httpClient.ExecuteProxiedAsync(request, Definition); - if (response.StatusCode is HttpStatusCode.MovedPermanently or HttpStatusCode.Found or HttpStatusCode.SeeOther) + if (response.StatusCode is HttpStatusCode.MovedPermanently + or HttpStatusCode.Found + or HttpStatusCode.SeeOther + or HttpStatusCode.TemporaryRedirect + or HttpStatusCode.PermanentRedirect) { var autoRedirectChain = new List<string> { request.Url.ToString() }; From 356d07ef3405aab357f9216d5abe30f7819c854e Mon Sep 17 00:00:00 2001 From: Bogdan <mynameisbogdan@users.noreply.github.com> Date: Sun, 20 Apr 2025 22:30:15 +0300 Subject: [PATCH 81/82] Bump version to 1.35.0 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 1f79a65ec..dc667e803 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -9,7 +9,7 @@ variables: testsFolder: './_tests' yarnCacheFolder: $(Pipeline.Workspace)/.yarn nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages - majorVersion: '1.34.1' + majorVersion: '1.35.0' minorVersion: $[counter('minorVersion', 1)] prowlarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' From 0b3a5c9bc41f5fa550bb487e9ac661496aa64b63 Mon Sep 17 00:00:00 2001 From: Weblate <noreply@weblate.org> Date: Tue, 8 Apr 2025 09:33:29 +0000 Subject: [PATCH 82/82] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Hugoren Martinako <aumpfbahn@gmail.com> Co-authored-by: Oskari Lavinto <olavinto@protonmail.com> Co-authored-by: Weblate <noreply@weblate.org> Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/ Translation: Servarr/Prowlarr --- src/NzbDrone.Core/Localization/Core/ca.json | 232 +++++++++++++++++++- src/NzbDrone.Core/Localization/Core/fi.json | 4 +- 2 files changed, 232 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 76350e36a..83a720b51 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -484,7 +484,7 @@ "InfoUrl": "URL d'informació", "PublishedDate": "Data de publicació", "Redirected": "Redirecció", - "AllSearchResultsHiddenByFilter": "Tots els resultats estan ocults pel filtre aplicat", + "AllSearchResultsHiddenByFilter": "Tots els resultats estan ocults pel filtre aplicat.", "HealthMessagesInfoBox": "Podeu trobar més informació sobre la causa d'aquests missatges de comprovació de salut fent clic a l'enllaç wiki (icona del llibre) al final de la fila o consultant els vostres [registres]({link}). Si teniu problemes per a interpretar aquests missatges, podeu posar-vos en contacte amb el nostre suport als enllaços següents.", "AptUpdater": "Utilitzeu apt per a instal·lar l'actualització", "DockerUpdater": "actualitzeu el contenidor Docker per a rebre l'actualització", @@ -512,5 +512,233 @@ "MinimumSeeders": "Seeders mínims", "SeedRatio": "Ràtio de la llavor", "ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Si un torrent està bloquejat per un hash, pot ser que no es rebutgi correctament durant el RSS/Search per a alguns indexadors, habilitant això permetrà que es rebutgi després que s'agafi el torrent, però abans que s'enviï al client.", - "SeedTime": "Temps de la llavor" + "SeedTime": "Temps de la llavor", + "DefaultCategory": "Categoria predeterminada", + "IndexerVipExpiredHealthCheckMessage": "Els beneficis VIP de l'indexador han caducat: {indexerNames}", + "MassEditor": "Editor de masses", + "NoSearchResultsFound": "No s'han trobat resultats de cerca, proveu de realitzar una nova cerca a continuació.", + "NotSupported": "No suportat", + "OverrideAndAddToDownloadClient": "Sobreescriu i afegeix al client de baixada", + "PackSeedTime": "Temps de la llavor del paquet", + "SearchAllIndexers": "Cerca tots els indexadors", + "SearchIndexers": "Cerca indexadors", + "SeedTimeHelpText": "L'hora en què un torrent s'ha de sembrar abans d'aturar-se, buit és el predeterminat de l'aplicació", + "SettingsIndexerLogging": "Registre de l'indexador millorat", + "TotalIndexerSuccessfulGrabs": "Indexador total correcte", + "BookSearch": "Cerca de llibres", + "ClearHistoryMessageText": "Esteu segur que voleu netejar tot l'historial de {appName}?", + "IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech", + "ClearHistory": "Neteja l'historial", + "IndexerTorrentSyndikatSettingsApiKeyHelpText": "Clau de l'API del lloc", + "IndexerGazelleGamesSettingsApiKeyHelpText": "Clau API del lloc (trobada a Configuració => Accés)", + "IndexerBeyondHDSettingsRssKeyHelpText": "Clau RSS del lloc (trobada a Seguretat => Clau RSS)", + "ApplicationsLoadError": "No s'ha pogut carregar la llista d'aplicacions", + "BookSearchTypes": "Tipus de cerca de llibres", + "DownloadClientCategory": "Baixa la categoria del client", + "IndexerAuth": "Autor de l'indexador", + "IndexerBeyondHDSettingsLimitedOnly": "Només limitat", + "IndexerBeyondHDSettingsRefundOnly": "Només el reemborsament", + "IndexerBeyondHDSettingsRefundOnlyHelpText": "Cerca només el reemborsament", + "IndexerBeyondHDSettingsRewindOnlyHelpText": "Cerca només el rebobinat", + "IndexerBeyondHDSettingsSearchTypes": "Tipus de cerca", + "IndexerBeyondHDSettingsSearchTypesHelpText": "Seleccioneu els tipus de llançaments que us interessin. Si no hi ha cap seleccionat, s'utilitzen totes les opcions.", + "IndexerDownloadClientHelpText": "Especifiqueu quin client de baixada s'utilitza per a les captures fetes a {appName} des d'aquest indexador", + "IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Ha de tenir permisos d'usuari i torrents", + "IndexerGazelleGamesSettingsSearchGroupNames": "Cerca noms de grup", + "IndexerHDBitsSettingsFreeleechOnlyHelpText": "Mostra només els llançaments de freeleech", + "IndexerHDBitsSettingsUseFilenames": "Utilitza els noms de fitxer", + "IndexerHDBitsSettingsUseFilenamesHelpText": "Marqueu aquesta opció si voleu utilitzar noms de fitxer torrent com a títols de llançament", + "IndexerHDBitsSettingsUsernameHelpText": "Nom d'usuari del lloc", + "IndexerHealthCheckNoIndexers": "No hi ha indexadors activats, {appName} no retornarà els resultats de la cerca", + "IndexerHistoryLoadError": "Error en carregar l'historial de l'indexador", + "IndexerIPTorrentsSettingsCookieUserAgent": "Agent d'usuari de la galeta", + "IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech", + "IndexerInfo": "Informació de l'indexador", + "IndexerNebulanceSettingsApiKeyHelpText": "Clau API de la Configuració de l'usuari . Claus Api. La clau ha de tenir permisos de llista i baixada", + "IndexerNewznabSettingsVipExpirationHelpText": "Data d'entrada (yyyy-mm-dd) per a la caducitat VIP o en blanc, {appName} notificarà 1 setmana des de la caducitat de VIP", + "IndexerNoDefinitionCheckHealthCheckMessage": "Els indexadors no tenen definició i no funcionaran: {indexerNames}. Suprimiu i (o torneu a afegir) a {appName}.", + "IndexerObsoleteCheckMessage": "Els indexadors estan obsolets o s'han actualitzat: {0}. Suprimiu i (o torneu a afegir) a {appName}", + "IndexerPassThePopcornSettingsApiKeyHelpText": "Clau de l'API del lloc", + "IndexerRss": "Indexador RSS", + "IndexerSettingsGrabLimitHelpText": "El nombre màxim de captures especificat per la unitat respectiva que {appName} permetrà al lloc", + "IndexerSettingsPackSeedTimeIndexerHelpText": "L'hora en què un paquet (temporada o discografia) s'ha de sembrar el torrent abans d'aturar-se, buit és el valor predeterminat de l'aplicació", + "IndexerSettingsPreferMagnetUrl": "Prefereix l'URL de l'imant", + "IndexerSettingsPreferMagnetUrlHelpText": "Quan està activat, aquest indexador preferirà l'ús d'URLs magnet per a les captures amb enllaços de reserva a torrents", + "IndexerSettingsQueryLimitHelpText": "El nombre màxim de consultes especificat per la unitat respectiva que {appName} permetrà al lloc", + "InitialFailure": "Fallada inicial", + "NoIndexerCategories": "No s'ha trobat cap categoria per a aquest indexador", + "RepeatSearch": "Cerca repetida", + "SettingsLogRotateHelpText": "Nombre màxim de fitxers de registre a mantenir desats a la carpeta de registres", + "SyncProfile": "Perfil de sincronització", + "TotalUserAgentGrabs": "Total d'agents d'usuari", + "UnableToLoadAppProfiles": "No s'han pogut carregar els perfils de l'aplicació", + "VipExpiration": "Caducitat VIP", + "IndexerOrpheusSettingsApiKeyHelpText": "Clau API del lloc (trobada a Configuració => Accés)", + "IndexerRedactedSettingsApiKeyHelpText": "Clau API del lloc (trobada a Configuració => Accés)", + "ProwlarrSupportsAnyIndexer": "{appName} admet molts indexadors, a més de qualsevol indexador que utilitzi l'estàndard Newznab/Torznab utilitzant 'Generic Newznab' (per usenet) o 'Generic Torznab' (per torrents). Cerca i selecciona el teu indexador des de sota.", + "DownloadClientSettingsDefaultCategorySubFolderHelpText": "Categoria alternativa predeterminada si no hi ha cap categoria assignada per a un llançament. Afegir una categoria específica a {appName} evita conflictes amb baixades no relacionades amb {appName}. L'ús d'una categoria és opcional, però molt recomanable.", + "AppProfileSelectHelpText": "Els perfils d'aplicació s'utilitzen per controlar RSS, la cerca automàtica i la configuració de cerca interactiva en sincronitzar aplicacions", + "AudioSearch": "Cerca d'àudio", + "IndexerSettingsAppsMinimumSeeders": "Aplicacions de cercadors mínims", + "DeleteApplication": "Suprimeix l'aplicació", + "DownloadClientSettingsPriorityItemHelpText": "Prioritat a usar en capturar elements", + "DownloadClientSettingsDefaultCategoryHelpText": "Categoria alternativa predeterminada si no hi ha cap categoria assignada per a un llançament. Afegir una categoria específica a {appName} evita conflictes amb baixades no relacionades amb {appName}. L'ús d'una categoria és opcional, però molt recomanable.", + "EditCategory": "Edita la categoria", + "IndexerQuery": "Consulta de l'indexador", + "IndexerSettingsBaseUrl": "Url base", + "IndexerSettingsCookieHelpText": "Cookie del lloc", + "IndexerSettingsLimitsUnitHelpText": "La unitat de temps per comptar els límits per indexador", + "IndexerSettingsPackSeedTime": "Temps de la llavor del paquet", + "IndexerSite": "Lloc indexador", + "IndexerTagsHelpTextWarning": "Les etiquetes s'han d'utilitzar amb precaució, poden tenir efectes no desitjats. Un indexador amb una etiqueta només sincronitzarà amb aplicacions amb la mateixa etiqueta.", + "IndexerSettingsSummary": "Configura diversos paràmetres globals de l'indexador.", + "ManageApplications": "Gestiona les aplicacions", + "PackSeedTimeHelpText": "L'hora en què un paquet (temporada o discografia) s'ha de sembrar el torrent abans d'aturar-se, buit és el valor predeterminat de l'aplicació", + "PreferMagnetUrl": "Prefereix l'URL de l'imant", + "PreferMagnetUrlHelpText": "Quan està activat, aquest indexador preferirà l'ús d'URLs magnet per a les captures amb enllaços de reserva a torrents", + "ProwlarrDownloadClientsInAppOnlyAlert": "Els clients de baixada només són per a les cerques a l'aplicació {appName} i no sincronitzen amb les aplicacions. No hi ha plans per afegir aquesta funcionalitat.", + "IndexerBeyondHDSettingsRewindOnly": "Només rebobina", + "ProxyValidationUnableToConnect": "No s'ha pogut connectar al servidor intermediari: {exceptionMessage}. Comprova els detalls del registre que envolta aquest error", + "QueryOptions": "Opcions de la consulta", + "TestAllApps": "Prova totes les aplicacions", + "TotalHostQueries": "Total de consultes de l'amfitrió", + "AverageGrabs": "Mitjana d'herba", + "AverageQueries": "Mitjana de consultes", + "FilterPlaceHolder": "Cerca indexadors", + "IndexerBeyondHDSettingsLimitedOnlyHelpText": "Cerca només freeleech (Limited UL)", + "IndexerBeyondHDSettingsApiKeyHelpText": "Clau API del lloc (trobada a Seguretat => Clau API)", + "IndexerSettingsVipExpiration": "Caducitat VIP", + "IndexerVipExpiringHealthCheckMessage": "Els beneficis VIP de l'indexador expiraran aviat: {indexerNames}", + "LastFailure": "Darrera fallada", + "MovieSearch": "Cerca de pel·lícules", + "MovieSearchTypes": "Tipus de cerca de pel·lícules", + "MusicSearchTypes": "Tipus de cerca de música", + "QueryType": "Tipus de consulta", + "RssQueries": "Consultes RSS", + "SyncLevelFull": "Sincronització completa: mantindrà els indexadors d'aquesta aplicació completament sincronitzats. Els canvis fets als indexadors a {appName} se sincronitzen amb aquesta aplicació. Qualsevol canvi fet a indexadors remotament dins d'aquesta aplicació serà anul·lat per {appName} en la següent sincronització.", + "TotalHostGrabs": "Total d'amfitrions", + "TotalQueries": "Total de consultes", + "NoApplicationsFound": "No s'ha trobat cap aplicació", + "SyncProfiles": "Sincronitza els perfils", + "TorznabUrl": "Url Torznab", + "TvSearch": "Cerca de TV", + "DeleteIndexerProxy": "Suprimeix el servidor intermediari de l'indexador", + "DisabledUntil": "Desactivat fins", + "GrabTitle": "Captura el títol", + "SettingsIndexerLoggingHelpText": "Registra dades addicionals de l'indexador", + "SyncLevel": "Nivell de sincronització", + "AdvancedSettingsHiddenClickToShow": "Configuració avançada oculta, feu clic per mostrar", + "AdvancedSettingsShownClickToHide": "Configuració avançada mostrada, feu clic per amagar", + "AppsMinimumSeeders": "Aplicacions de cercadors mínims", + "AppsMinimumSeedersHelpText": "«Mínims filtradors requerits per les Aplicacions perquè l'indexador s'agafi", + "CountIndexersAvailable": "{count} indexador(s) disponible", + "HistoryCleanup": "Neteja de l'historial", + "HistoryDetails": "Detalls de l'historial", + "SettingsFilterSentryEventsHelpText": "Filtra els esdeveniments d'error d'usuari coneguts perquè s'enviïn com a Analytics", + "MappedCategories": "Categories assignades", + "AppSettingsSummary": "Aplicacions i paràmetres per configurar com {appName} interactua amb els vostres programes PVR", + "ConnectSettingsSummary": "Notificacions i scripts personalitzats", + "DeleteClientCategory": "Suprimeix la categoria del client de baixada", + "FullSync": "Sincronització completa", + "IndexerAlreadySetup": "Almenys una instància de l'indexador ja està configurada", + "RawSearchSupported": "S'admet la cerca RAW", + "RssFeed": "Canal RSS", + "SearchTypes": "Tipus de cerca", + "SeedRatioHelpText": "La relació a la qual ha d'arribar un torrent abans d'aturar-se, buida és la predeterminada de l'aplicació", + "SemiPrivate": "Semi-Privada", + "TotalIndexerQueries": "Total de consultes de l'indexador", + "TotalUserAgentQueries": "Total de consultes d'agents d'usuari", + "GoToApplication": "Ves a l'aplicació", + "Url": "Url", + "AreYouSureYouWantToDeleteIndexer": "Esteu segur que voleu suprimir '{name}' de {appName}?", + "AverageResponseTimesMs": "Temps mitjà de resposta de l'indexador (ms)", + "FoundCountReleases": "S'han trobat {itemCount} versions", + "AuthQueries": "Consultes d'Autorització", + "BasicSearch": "Cerca bàsica", + "IndexerName": "Nom de l'indexador", + "IndexerStatus": "Estat de l'indexador", + "IndexerTagsHelpText": "Utilitzeu etiquetes per especificar els intermediaris de l'indexador o a quines aplicacions se sincronitza l'indexador.", + "NewznabUrl": "Url Newznab", + "SearchCountIndexers": "Cerca {count} indexador", + "UnableToLoadDevelopmentSettings": "No s'han pogut carregar els paràmetres de desenvolupament", + "SettingsFilterSentryEvents": "Filtra els esdeveniments d'anàlisi", + "ApplicationTagsHelpText": "Sincronitza els indexadors d'aquesta aplicació que tenen una o més etiquetes coincidents. Si no es llisten etiquetes aquí, llavors no s'impedirà la sincronització d'indexadors a causa de les seves etiquetes.", + "ApplicationTagsHelpTextWarning": "Les etiquetes s'han d'utilitzar amb precaució, poden tenir efectes no desitjats. Una aplicació amb una etiqueta només sincronitzarà amb els indexadors que tinguin la mateixa etiqueta.", + "DeleteSelectedApplications": "Suprimeix les aplicacions seleccionades", + "DownloadClientsSettingsSummary": "Baixa la configuració dels clients per a la integració a la cerca de la interfície d'usuari {appName}", + "ElapsedTime": "Temps transcorregut", + "EnableIndexer": "Habilita l'indexador", + "EnableRssHelpText": "Habilita el canal RSS per a l'indexador", + "IncludeManualGrabsHelpText": "Inclou les notes manuals fetes a {appName}", + "IndexerFailureRate": "Taxa de fallada de l'indexador", + "ProwlarrSupportsAnyDownloadClient": "{appName} admet qualsevol dels clients de baixada que es llisten a continuació.", + "TotalGrabs": "Grabs totals", + "IndexerDetails": "Detalls de l'indexador", + "IndexerPriorityHelpText": "Prioritat de l'indexador des de l'1 (el més alt) fins al 50 (el més oest). Per defecte: 25.", + "IndexerProxy": "Servidor intermediari de l'indexador", + "UISettingsSummary": "Opcions de data, idioma i color defectuoses", + "IndexerCategories": "Categories de l'indexador", + "IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech", + "SearchCapabilities": "Capacitats de cerca", + "SearchType": "Tipus de cerca", + "SettingsLogSql": "Registre Sql", + "SyncLevelAddRemove": "Afegeix i elimina només: quan s'afegeixen o s'eliminen els indexadors de {appName}, s'actualitzarà aquesta aplicació remota.", + "IndexerProxies": "Propis de l'indexador", + "ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Sincronitza les fulles del torrent de la llista de blocs en bloc mentre s'agafa", + "CertificateValidationHelpText": "Canvia l'estricta validació de la certificació HTTPS", + "IndexerDisabled": "Indexador desactivat", + "IndexerFileListSettingsPasskeyHelpText": "Contrasenya del lloc (Aquesta és la cadena alfanumèrica a l'URL del seguidor que es mostra al client de baixada)", + "IndexerSettingsQueryLimit": "Límit de consulta", + "IndexerHDBitsSettingsPasskeyHelpText": "Contrasenya dels detalls de l'usuari", + "IndexerSettingsPasskey": "Clau de pas", + "ClickToChangeQueryOptions": "Feu clic per a canviar les opcions de consulta", + "EnabledRedirected": "Activat, redirigit", + "Parameters": "Paràmetres", + "QueryResults": "Resultats de la consulta", + "RedirectHelpText": "Redirigeix la sol·licitud de baixada entrant per a l'indexador i passa la captura directament en lloc de intermediaris a través de {appName}", + "UnableToLoadIndexerProxies": "No s'han pogut carregar els intermediaris de l'indexador", + "IndexerId": "ID de l'indexador", + "IndexerAlphaRatioSettingsExcludeScene": "Exclou l'escena", + "IndexerAlphaRatioSettingsExcludeSceneHelpText": "Exclou els llançaments d'escenes dels resultats", + "IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech", + "IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech", + "IndexerFileListSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech", + "IndexerFileListSettingsUsernameHelpText": "Nom d'usuari del lloc", + "IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Cerca publicacions per noms de grup", + "IndexerHDBitsSettingsOrigins": "Orígens", + "IndexerIPTorrentsSettingsCookieUserAgentHelpText": "Agent d'usuari associat a la cookie utilitzada des del navegador", + "IndexerNewznabSettingsApiKeyHelpText": "Clau de l'API del lloc", + "IndexerNzbIndexSettingsApiKeyHelpText": "Clau de l'API del lloc", + "IndexerSettingsAppsMinimumSeedersHelpText": "«Mínims filtradors requerits per les Aplicacions perquè l'indexador s'agafi", + "IndexerSettingsFreeleechOnly": "Només Freeleech", + "IndexerSettingsGrabLimit": "Límit de captura", + "IndexerSettingsLimitsUnit": "Unitats de límits", + "IndexerSettingsRssKey": "Clau RSS", + "SelectIndexers": "Selecciona els indexadors", + "SettingsSqlLoggingHelpText": "Registra totes les consultes SQL de {appName}", + "SyncAppIndexers": "Sincronitza els indexadors d'aplicacions", + "AppProfileInUse": "Perfil d'aplicació en ús", + "DeleteAppProfile": "Suprimeix el perfil de l'aplicació", + "TVSearchTypes": "Tipus de cerca de TV", + "IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech", + "IndexerMTeamTpSettingsApiKeyHelpText": "Clau API del Lloc (trobada a Tauler de control de l'usuari => Seguretat => Laboratori)", + "MinimumSeedersHelpText": "Visors mínims requerits per l'aplicació perquè l'indexador s'agafi", + "NoIndexerHistory": "No s'ha trobat cap historial per a aquest indexador", + "SearchQueries": "Cerca consultes", + "SettingsConsoleLogLevel": "Nivell de registre de la consola", + "IndexerPassThePopcornSettingsGoldenPopcornOnly": "Només blat de moro daurat", + "IndexerPassThePopcornSettingsGoldenPopcornOnlyHelpText": "Cerca només els llançaments Golden Popcorn", + "Open": "Obre", + "ProwlarrDownloadClientsAlert": "Si voleu fer cerques directament dins de {appName}, heu d'afegir Clients de Baixades. En cas contrari, no cal afegir-les aquí. Per a les cerques des de les teves Apps, els clients de descàrrega configurats s'utilitzen en el seu lloc.", + "Website": "Lloc web", + "DownloadClientQbittorrentSettingsUseSslHelpText": "Utilitza una connexió segura. Vegeu Opcions -> Interfície web -> 'Utilitza HTTPS en comptes d'HTTP' a qBittorrent.", + "IndexerAvistazSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech", + "IndexerAvistazSettingsPasswordHelpText": "Contrasenya del lloc", + "IndexerAvistazSettingsPidHelpText": "PID de la pàgina del meu compte o del meu perfil", + "IndexerAvistazSettingsUsernameHelpText": "Nom d'usuari del lloc", + "IndexerAvistazSettingsUsernameHelpTextWarning": "Només el rang de membre i superior pot utilitzar l'API en aquest indexador.", + "SelectedCountOfCountReleases": "S'han seleccionat {selectedCount} de les versions {itemCount}", + "SettingsLogRotate": "Rotació del registre", + "AreYouSureYouWantToDeleteCategory": "Esteu segur que voleu suprimir la categoria assignada?", + "Book": "Llibre" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index ab235f518..0236ce555 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -207,7 +207,7 @@ "StartTypingOrSelectAPathBelow": "Aloita kirjoitus tai valitse sijainti alta", "StartupDirectory": "Käynnistyskansio", "TableOptions": "Taulukkonäkymän asetukset", - "TableOptionsColumnsMessage": "Valitse näytettävät sarakkeet ja niiden järjestys", + "TableOptionsColumnsMessage": "Valitse näytettävät sarakkeet ja niiden järjestys.", "TagsHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille hakupalveluille.", "UnableToAddANewAppProfilePleaseTryAgain": "Virhe lisättäessä sovellusprofiilia. Yritä uudelleen.", "UnableToAddANewNotificationPleaseTryAgain": "Ilmoituspalvelun lisääminen epäonnistui. Yritä uudelleen.", @@ -805,6 +805,6 @@ "IndexerPassThePopcornSettingsGoldenPopcornOnly": "Vain \"Golden Popcorn\"", "IndexerPassThePopcornSettingsGoldenPopcornOnlyHelpText": "Etsi vain ns. kultaisella pocornilla merkittyjä julkaisuja.", "IndexerSettingsFreeleechOnly": "Vain \"Freeleech\"", - "IndexerSettingsCookieHelpText": "Jos sivusto vaatii kirjautumisevästeen, se on noudettava selaimen kautta.", + "IndexerSettingsCookieHelpText": "Jos sivusto vaatii kirjautumisevästeen, on se noudettava selaimen avulla.", "IndexerAvistazSettingsPasswordHelpText": "Sivuston salasana" }