diff --git a/README.md b/README.md
index e8c60546a..6d196feee 100644
--- a/README.md
+++ b/README.md
@@ -78,6 +78,6 @@ Thank you to [
{
- 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'
}
}}
>
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 {
}
-
- {typeof title === 'function' ? title() : title}
-
+ {typeof title === 'function' ? title() : title}
{
!!StatusComponent &&
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}
>
-
+
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.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)
diff --git a/src/NzbDrone.Common/Prowlarr.Common.csproj b/src/NzbDrone.Common/Prowlarr.Common.csproj
index 359fa8820..106890399 100644
--- a/src/NzbDrone.Common/Prowlarr.Common.csproj
+++ b/src/NzbDrone.Common/Prowlarr.Common.csproj
@@ -5,21 +5,21 @@
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
+
+
-
+
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.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();
+ torrents.First().Should().BeOfType();
var first = torrents.First() as TorrentInfo;
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;
}
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())
{
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
{
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 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/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);
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())
diff --git a/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs b/src/NzbDrone.Core/Indexers/Definitions/AnimeTorrents.cs
index 120fd690d..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 GetCookies()
+ {
+ return CookieUtil.CookieHeaderToDictionary(Settings.Cookie);
}
private IndexerCapabilities SetCapabilities()
@@ -292,7 +264,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 +279,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 +302,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);
@@ -350,7 +324,7 @@ namespace NzbDrone.Core.Indexers.Definitions
public Action, DateTime?> CookiesUpdater { get; set; }
}
- public class AnimeTorrentsSettings : UserPassTorrentBaseSettings
+ public class AnimeTorrentsSettings : CookieTorrentBaseSettings
{
public AnimeTorrentsSettings()
{
@@ -361,7 +335,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; }
}
}
diff --git a/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs b/src/NzbDrone.Core/Indexers/Definitions/BeyondHD.cs
index f9194f00a..3fc4a3328 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.Internal
+ IndexerFlag.Internal,
+ IndexerFlag.Exclusive,
}
};
@@ -91,7 +92,7 @@ namespace NzbDrone.Core.Indexers.Definitions
_capabilities = capabilities;
}
- private IEnumerable GetPagedRequests(SearchCriteriaBase searchCriteria, string term, string imdbId = null, int tmdbId = 0)
+ private IEnumerable GetPagedRequests(SearchCriteriaBase searchCriteria, string searchTerm, string imdbId = null, int tmdbId = 0)
{
var body = new Dictionary
{
@@ -128,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);
@@ -198,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;
}
@@ -275,13 +285,6 @@ namespace NzbDrone.Core.Indexers.Definitions
var details = row.InfoUrl;
var link = row.DownloadLink;
- var flags = new HashSet();
-
- if (row.Internal)
- {
- flags.Add(IndexerFlag.Internal);
- }
-
var release = new TorrentInfo
{
Title = row.Name,
@@ -291,7 +294,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,
@@ -301,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(),
+ Subs = row.Subtitles?.Split(",", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList() ?? new List(),
};
// BHD can return crazy values for tmdb
@@ -319,6 +324,23 @@ namespace NzbDrone.Core.Indexers.Definitions
.ToArray();
}
+ private static HashSet GetIndexerFlags(BeyondHDTorrent item)
+ {
+ var flags = new HashSet();
+
+ if (item.Internal)
+ {
+ flags.Add(IndexerFlag.Internal);
+ }
+
+ if (item.Exclusive)
+ {
+ flags.Add(IndexerFlag.Exclusive);
+ }
+
+ return flags;
+ }
+
public Action, DateTime?> CookiesUpdater { get; set; }
}
@@ -450,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; }
@@ -478,6 +504,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/Cardigann/CardigannBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs
index 6abdd710e..9e2c6e06b 100644
--- a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs
+++ b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs
@@ -8,6 +8,7 @@ using System.Text;
using System.Text.RegularExpressions;
using AngleSharp.Dom;
using Microsoft.AspNetCore.WebUtilities;
+using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NLog;
using NzbDrone.Common.Extensions;
@@ -214,19 +215,19 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
if (selector.Selector != null)
{
var selectorSelector = ApplyGoTemplateText(selector.Selector.TrimStart('.'), variables);
- selectorSelector = JsonParseFieldSelector(parentObj, selectorSelector);
+ var fieldSelector = JsonParseFieldSelector(parentObj, selectorSelector);
JToken selection = null;
- if (selectorSelector != null)
+ if (fieldSelector != null)
{
- selection = parentObj.SelectToken(selectorSelector);
+ selection = parentObj.SelectToken(fieldSelector);
}
if (selection == null)
{
if (required)
{
- throw new Exception(string.Format("Selector \"{0}\" didn't match {1}", selectorSelector, parentObj.ToString()));
+ throw new Exception($"Selector \"{selectorSelector}\" didn't match {parentObj.ToString(Formatting.None)}");
}
return null;
@@ -234,7 +235,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
if (selection.Type is JTokenType.Array)
{
- // turn this json array into a comma delimited string
+ // turn this json array into a comma-delimited string
var valueArray = selection.Value();
value = string.Join(",", valueArray);
}
@@ -259,7 +260,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
{
if (required)
{
- throw new Exception($"None of the case selectors \"{string.Join(",", selector.Case)}\" matched {parentObj}");
+ throw new Exception($"None of the case selectors \"{string.Join(",", selector.Case)}\" matched {parentObj.ToString(Formatting.None)}");
}
return null;
diff --git a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs
index 28be1c3e5..4b96e25ed 100644
--- a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs
+++ b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs
@@ -105,7 +105,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
}
catch (Exception ex)
{
- _logger.Trace(ex, "Failed to parse JSON rows count.");
+ _logger.Debug(ex, "Failed to parse JSON rows count.");
}
}
diff --git a/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs b/src/NzbDrone.Core/Indexers/Definitions/FileList/FileListParser.cs
index a15751ab7..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,
@@ -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;
}
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.Q, MovieSearchParam.ImdbId
+ },
+ Flags = new List
+ {
+ 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();
-
- 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, 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 GetIndexerFlags(TorrentQueryResponse item)
+ {
+ var flags = new HashSet();
+
+ 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, DateTime?> CookiesUpdater { get; set; }
}
}
diff --git a/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs b/src/NzbDrone.Core/Indexers/Definitions/NorBits.cs
index 4287f515f..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
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();
@@ -130,29 +130,13 @@ public class NorBits : TorrentIndexerBase
};
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()),
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(),
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
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
{
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
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,
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 { request.Url.ToString() };
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");
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())
+ foreach (var target in LogManager.Configuration.AllTargets.OfType())
{
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);
}
}
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..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ó",
@@ -501,5 +501,244 @@
"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",
+ "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",
+ "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/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json
index 89f8d9fd1..21975a02e 100644
--- a/src/NzbDrone.Core/Localization/Core/cs.json
+++ b/src/NzbDrone.Core/Localization/Core/cs.json
@@ -633,5 +633,11 @@
"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",
+ "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/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",
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 27730aeee..0236ce555 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",
@@ -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.",
@@ -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.",
@@ -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",
@@ -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"
}
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/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json
index bb90922eb..5a30e0f08 100644
--- a/src/NzbDrone.Core/Localization/Core/ko.json
+++ b/src/NzbDrone.Core/Localization/Core/ko.json
@@ -421,5 +421,90 @@
"UserAgentProvidedByTheAppThatCalledTheAPI": "API를 호출한 앱에서 제공하는 사용자 에이전트",
"days": "일",
"minutes": "분",
- "Author": "저작자"
+ "Author": "저작자",
+ "Categories": "카테고리",
+ "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/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/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."
}
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": "дні(в)"
}
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": "中文"
}
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/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
{
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()
- };
+ {
+ 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()
+ };
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