mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2026-04-17 21:44:48 -04:00
Compare commits
46 Commits
v1.30.1.49
...
v1.32.2.49
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a19b8ea997 | ||
|
|
10ea6cd753 | ||
|
|
2c1b464715 | ||
|
|
3263454041 | ||
|
|
015db4a916 | ||
|
|
49268f3b8d | ||
|
|
f02a6f3e2c | ||
|
|
46b6124b97 | ||
|
|
53bc97b3be | ||
|
|
b09d4927cc | ||
|
|
328f3c0423 | ||
|
|
635e76526a | ||
|
|
790feed5ab | ||
|
|
59b5d2fc78 | ||
|
|
d5b12cf51a | ||
|
|
2d584f7eb6 | ||
|
|
0f1d647cd7 | ||
|
|
d6e8d89be4 | ||
|
|
8672129d5a | ||
|
|
44bdff8b8f | ||
|
|
4df8fc02f1 | ||
|
|
e101129cff | ||
|
|
147e732c9c | ||
|
|
a12381fb1d | ||
|
|
3a4de9cca1 | ||
|
|
43c988d951 | ||
|
|
a036e0fc37 | ||
|
|
56b9da16cf | ||
|
|
887c262589 | ||
|
|
12ff612775 | ||
|
|
0d3d27e46f | ||
|
|
d1846fde61 | ||
|
|
e6901506a0 | ||
|
|
08b4eddbc5 | ||
|
|
979db70e68 | ||
|
|
22834a852a | ||
|
|
f0540a5f8b | ||
|
|
1f7ac7d7d6 | ||
|
|
8ac68240ad | ||
|
|
b463a3f54b | ||
|
|
e15e57329e | ||
|
|
d8354408a4 | ||
|
|
6d2d49f7bd | ||
|
|
37610eec40 | ||
|
|
ed51208116 | ||
|
|
26e4dcad65 |
@@ -9,7 +9,7 @@ variables:
|
||||
testsFolder: './_tests'
|
||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||
majorVersion: '1.30.1'
|
||||
majorVersion: '1.32.2'
|
||||
minorVersion: $[counter('minorVersion', 1)]
|
||||
prowlarrVersion: '$(majorVersion).$(minorVersion)'
|
||||
buildName: '$(Build.SourceBranchName).$(prowlarrVersion)'
|
||||
|
||||
9
docs.sh
9
docs.sh
@@ -3,15 +3,16 @@ set -e
|
||||
|
||||
FRAMEWORK="net6.0"
|
||||
PLATFORM=$1
|
||||
ARCHITECTURE="${2:-x64}"
|
||||
|
||||
if [ "$PLATFORM" = "Windows" ]; then
|
||||
RUNTIME="win-x64"
|
||||
RUNTIME="win-$ARCHITECTURE"
|
||||
elif [ "$PLATFORM" = "Linux" ]; then
|
||||
RUNTIME="linux-x64"
|
||||
RUNTIME="linux-$ARCHITECTURE"
|
||||
elif [ "$PLATFORM" = "Mac" ]; then
|
||||
RUNTIME="osx-x64"
|
||||
RUNTIME="osx-$ARCHITECTURE"
|
||||
else
|
||||
echo "Platform must be provided as first arguement: Windows, Linux or Mac"
|
||||
echo "Platform must be provided as first argument: Windows, Linux or Mac"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
@@ -20,6 +20,8 @@ import HintedSelectInputSelectedValue from './HintedSelectInputSelectedValue';
|
||||
import TextInput from './TextInput';
|
||||
import styles from './EnhancedSelectInput.css';
|
||||
|
||||
const MINIMUM_DISTANCE_FROM_EDGE = 10;
|
||||
|
||||
function isArrowKey(keyCode) {
|
||||
return keyCode === keyCodes.UP_ARROW || keyCode === keyCodes.DOWN_ARROW;
|
||||
}
|
||||
@@ -137,18 +139,9 @@ class EnhancedSelectInput extends Component {
|
||||
// Listeners
|
||||
|
||||
onComputeMaxHeight = (data) => {
|
||||
const {
|
||||
top,
|
||||
bottom
|
||||
} = data.offsets.reference;
|
||||
|
||||
const windowHeight = window.innerHeight;
|
||||
|
||||
if ((/^botton/).test(data.placement)) {
|
||||
data.styles.maxHeight = windowHeight - bottom;
|
||||
} else {
|
||||
data.styles.maxHeight = top;
|
||||
}
|
||||
data.styles.maxHeight = windowHeight - MINIMUM_DISTANCE_FROM_EDGE;
|
||||
|
||||
return data;
|
||||
};
|
||||
@@ -460,6 +453,10 @@ class EnhancedSelectInput extends Component {
|
||||
order: 851,
|
||||
enabled: true,
|
||||
fn: this.onComputeMaxHeight
|
||||
},
|
||||
preventOverflow: {
|
||||
enabled: true,
|
||||
boundariesElement: 'viewport'
|
||||
}
|
||||
}}
|
||||
>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ interface CssExports {
|
||||
'isActiveParentLink': string;
|
||||
'item': string;
|
||||
'link': string;
|
||||
'noIcon': string;
|
||||
'status': string;
|
||||
}
|
||||
export const cssExports: CssExports;
|
||||
|
||||
@@ -63,9 +63,7 @@ class PageSidebarItem extends Component {
|
||||
</span>
|
||||
}
|
||||
|
||||
<span className={isChildItem ? styles.noIcon : null}>
|
||||
{typeof title === 'function' ? title() : title}
|
||||
</span>
|
||||
{typeof title === 'function' ? title() : title}
|
||||
|
||||
{
|
||||
!!StatusComponent &&
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -23,6 +23,7 @@ function PageToolbarButton(props) {
|
||||
isDisabled && styles.isDisabled
|
||||
)}
|
||||
isDisabled={isDisabled || isSpinning}
|
||||
title={label}
|
||||
{...otherProps}
|
||||
>
|
||||
<Icon
|
||||
|
||||
@@ -221,7 +221,7 @@
|
||||
<PropertyGroup Condition="'$(IsOSX)' == 'true' and
|
||||
'$(RuntimeIdentifier)' == ''">
|
||||
<_UsingDefaultRuntimeIdentifier>true</_UsingDefaultRuntimeIdentifier>
|
||||
<RuntimeIdentifier>osx-x64</RuntimeIdentifier>
|
||||
<RuntimeIdentifier>osx-$(Architecture)</RuntimeIdentifier>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -30,6 +30,7 @@ namespace NzbDrone.Common.Test.InstrumentationTests
|
||||
[TestCase(@"https://anthelion.me/api.php?api_key=2b51db35e1910123321025a12b9933d2&o=json&t=movie&q=&tmdb=&imdb=&cat=&limit=100&offset=0")]
|
||||
[TestCase(@"https://avistaz.to/api/v1/jackett/auth: username=mySecret&password=mySecret&pid=mySecret")]
|
||||
[TestCase(@"https://www.sharewood.tv/api/2b51db35e1910123321025a12b9933d2/last-torrents")]
|
||||
[TestCase(@"https://example.org/rss/torrents?rsskey=2b51db35e1910123321025a12b9933d2&search=")]
|
||||
|
||||
// Indexer and Download Client Responses
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace NzbDrone.Common.Instrumentation
|
||||
private static readonly Regex[] CleansingRules =
|
||||
{
|
||||
// Url
|
||||
new (@"(?<=[?&: ;])(apikey|api_key|(?:(?:access|api)[-_]?)?token|pass(?:key|wd)?|auth|authkey|user|u?id|api|[a-z_]*apikey|account|pid|pwd)=(?<secret>[^&=""]+?)(?=[ ""&=]|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
new (@"(?<=[?&: ;])(apikey|api_key|(?:(?:access|api)[-_]?)?token|pass(?:key|wd)?|auth|authkey|rsskey|user|u?id|api|[a-z_]*apikey|account|pid|pwd)=(?<secret>[^&=""]+?)(?=[ ""&=]|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
new (@"(?<=[?& ;])[^=]*?(_?(?<!use|get_)token|username|passwo?rd)=(?<secret>[^&=]+?)(?= |&|$|;)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
new (@"rss(24h)?\.torrentleech\.org/(?!rss)(?<secret>[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
new (@"torrentleech\.org/rss/download/[0-9]+/(?<secret>[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
{
|
||||
@@ -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
|
||||
|
||||
@@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AvistazTests
|
||||
torrentInfo.InfoUrl.Should().Be("https://avistaz.to/torrent/187240-japan-sinks-people-of-hope-2021-s01e05-720p-nf-web-dl-ddp20-x264-seikel");
|
||||
torrentInfo.CommentUrl.Should().BeNullOrEmpty();
|
||||
torrentInfo.Indexer.Should().Be(Subject.Definition.Name);
|
||||
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-11-14 21:26:21"));
|
||||
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-11-14 22:26:21"));
|
||||
torrentInfo.Size.Should().Be(935127615);
|
||||
torrentInfo.InfoHash.Should().Be("a879261d4e6e792402f92401141a21de70d51bf2");
|
||||
torrentInfo.MagnetUrl.Should().Be(null);
|
||||
|
||||
@@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AvistazTests
|
||||
torrentInfo.InfoUrl.Should().Be("https://exoticaz.to/torrent/64040-ssis-419-my-first-experience-is-yua-mikami-from-the-day-i-lost-my-virginity-i-was-devoted-to-sex");
|
||||
torrentInfo.CommentUrl.Should().BeNullOrEmpty();
|
||||
torrentInfo.Indexer.Should().Be(Subject.Definition.Name);
|
||||
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-06-11 09:04:50"));
|
||||
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-06-11 10:04:50"));
|
||||
torrentInfo.Size.Should().Be(7085405541);
|
||||
torrentInfo.InfoHash.Should().Be("asdjfiasdf54asd7f4a2sdf544asdf");
|
||||
torrentInfo.MagnetUrl.Should().Be(null);
|
||||
|
||||
@@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AvistazTests
|
||||
torrentInfo.InfoUrl.Should().Be("https://privatehd.to/torrent/78506-godzilla-2014-2160p-uhd-bluray-remux-hdr-hevc-atmos-triton");
|
||||
torrentInfo.CommentUrl.Should().BeNullOrEmpty();
|
||||
torrentInfo.Indexer.Should().Be(Subject.Definition.Name);
|
||||
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-03-21 04:24:49"));
|
||||
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-03-21 05:24:49"));
|
||||
torrentInfo.Size.Should().Be(69914591044);
|
||||
torrentInfo.InfoHash.Should().Be("a879261d4e6e792402f92401141a21de70d51bf2");
|
||||
torrentInfo.MagnetUrl.Should().Be(null);
|
||||
|
||||
@@ -26,15 +26,15 @@ namespace NzbDrone.Core.Test.IndexerTests.HDBitsTests
|
||||
[SetUp]
|
||||
public void Setup()
|
||||
{
|
||||
Subject.Definition = new IndexerDefinition()
|
||||
Subject.Definition = new IndexerDefinition
|
||||
{
|
||||
Name = "HdBits",
|
||||
Settings = new HDBitsSettings() { ApiKey = "fakekey" }
|
||||
Settings = new HDBitsSettings { ApiKey = "fakekey" }
|
||||
};
|
||||
|
||||
_movieSearchCriteria = new MovieSearchCriteria
|
||||
{
|
||||
Categories = new int[] { 2000, 2010 },
|
||||
Categories = new[] { 2000, 2010 },
|
||||
ImdbId = "0076759"
|
||||
};
|
||||
}
|
||||
@@ -52,7 +52,7 @@ namespace NzbDrone.Core.Test.IndexerTests.HDBitsTests
|
||||
var torrents = (await Subject.Fetch(_movieSearchCriteria)).Releases;
|
||||
|
||||
torrents.Should().HaveCount(2);
|
||||
torrents.First().Should().BeOfType<HDBitsInfo>();
|
||||
torrents.First().Should().BeOfType<TorrentInfo>();
|
||||
|
||||
var first = torrents.First() as TorrentInfo;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using Dapper;
|
||||
using FluentMigrator;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NzbDrone.Common.Serializer;
|
||||
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||
|
||||
namespace NzbDrone.Core.Datastore.Migration
|
||||
{
|
||||
[Migration(042)]
|
||||
public class myanonamouse_freeleech_wedge_options : NzbDroneMigrationBase
|
||||
{
|
||||
protected override void MainDbUpgrade()
|
||||
{
|
||||
Execute.WithConnection(MigrateIndexersToWedgeOptions);
|
||||
}
|
||||
|
||||
private void MigrateIndexersToWedgeOptions(IDbConnection conn, IDbTransaction tran)
|
||||
{
|
||||
var updated = new List<object>();
|
||||
|
||||
using (var cmd = conn.CreateCommand())
|
||||
{
|
||||
cmd.Transaction = tran;
|
||||
cmd.CommandText = "SELECT \"Id\", \"Settings\" FROM \"Indexers\" WHERE \"Implementation\" = 'MyAnonamouse'";
|
||||
|
||||
using (var reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
var id = reader.GetInt32(0);
|
||||
var settings = Json.Deserialize<JObject>(reader.GetString(1));
|
||||
|
||||
if (settings.ContainsKey("freeleech") && settings.Value<JToken>("freeleech").Type == JTokenType.Boolean)
|
||||
{
|
||||
var optionValue = settings.Value<bool>("freeleech") switch
|
||||
{
|
||||
true => 2, // Required
|
||||
_ => 0 // Never
|
||||
};
|
||||
|
||||
settings.Remove("freeleech");
|
||||
settings.Add("useFreeleechWedge", optionValue);
|
||||
}
|
||||
|
||||
updated.Add(new
|
||||
{
|
||||
Id = id,
|
||||
Settings = settings.ToJson()
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var updateSql = "UPDATE \"Indexers\" SET \"Settings\" = @Settings WHERE \"Id\" = @Id";
|
||||
conn.Execute(updateSql, updated, transaction: tran);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Exceptions;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.Validation;
|
||||
|
||||
@@ -18,15 +19,14 @@ namespace NzbDrone.Core.Download.Clients.Nzbget
|
||||
public class Nzbget : UsenetClientBase<NzbgetSettings>
|
||||
{
|
||||
private readonly INzbgetProxy _proxy;
|
||||
private readonly string[] _successStatus = { "SUCCESS", "NONE" };
|
||||
private readonly string[] _deleteFailedStatus = { "HEALTH", "DUPE", "SCAN", "COPY", "BAD" };
|
||||
|
||||
public Nzbget(INzbgetProxy proxy,
|
||||
IHttpClient httpClient,
|
||||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
ILocalizationService localizationService,
|
||||
Logger logger)
|
||||
: base(httpClient, configService, diskProvider, logger)
|
||||
: base(httpClient, configService, diskProvider, localizationService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -7,7 +7,9 @@ using NzbDrone.Common.Disk;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.ThingiProvider;
|
||||
using NzbDrone.Core.Validation;
|
||||
|
||||
namespace NzbDrone.Core.Download.Clients.UTorrent
|
||||
@@ -21,8 +23,9 @@ namespace NzbDrone.Core.Download.Clients.UTorrent
|
||||
ISeedConfigProvider seedConfigProvider,
|
||||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
ILocalizationService localizationService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, logger)
|
||||
: base(torrentFileInfoReader, seedConfigProvider, configService, diskProvider, localizationService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
@@ -72,6 +75,9 @@ namespace NzbDrone.Core.Download.Clients.UTorrent
|
||||
}
|
||||
|
||||
public override string Name => "uTorrent";
|
||||
|
||||
public override ProviderMessage Message => new (_localizationService.GetLocalizedString("DownloadClientUTorrentProviderMessage"), ProviderMessageType.Warning);
|
||||
|
||||
public override bool SupportsCategories => true;
|
||||
|
||||
protected override void Test(List<ValidationFailure> failures)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,6 @@ using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using AngleSharp.Html.Parser;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Extensions;
|
||||
@@ -44,46 +43,19 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
return new AnimeTorrentsParser(Settings, Capabilities.Categories);
|
||||
}
|
||||
|
||||
protected override async Task DoLogin()
|
||||
{
|
||||
UpdateCookies(null, null);
|
||||
|
||||
var loginUrl = Settings.BaseUrl + "login.php";
|
||||
|
||||
var loginPage = await ExecuteAuth(new HttpRequest(loginUrl));
|
||||
|
||||
var requestBuilder = new HttpRequestBuilder(loginUrl)
|
||||
{
|
||||
LogResponseContent = true,
|
||||
AllowAutoRedirect = true
|
||||
};
|
||||
|
||||
var authLoginRequest = requestBuilder
|
||||
.Post()
|
||||
.SetCookies(loginPage.GetCookies())
|
||||
.AddFormParameter("username", Settings.Username)
|
||||
.AddFormParameter("password", Settings.Password)
|
||||
.AddFormParameter("form", "login")
|
||||
.AddFormParameter("rememberme[]", "1")
|
||||
.SetHeader("Content-Type", "application/x-www-form-urlencoded")
|
||||
.SetHeader("Referer", loginUrl)
|
||||
.Build();
|
||||
|
||||
var response = await ExecuteAuth(authLoginRequest);
|
||||
|
||||
if (response.Content == null || !response.Content.Contains("logout.php"))
|
||||
{
|
||||
throw new IndexerAuthException("AnimeTorrents authentication failed");
|
||||
}
|
||||
|
||||
UpdateCookies(response.GetCookies(), DateTime.Now.AddDays(30));
|
||||
|
||||
_logger.Debug("AnimeTorrents authentication succeeded");
|
||||
}
|
||||
|
||||
protected override bool CheckIfLoginNeeded(HttpResponse httpResponse)
|
||||
{
|
||||
return httpResponse.Content.Contains("Access Denied!") || httpResponse.Content.Contains("login.php");
|
||||
if (httpResponse.Content.Contains("Access Denied!") || httpResponse.Content.Contains("login.php"))
|
||||
{
|
||||
throw new IndexerAuthException("AnimeTorrents authentication with cookies failed.");
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
protected override IDictionary<string, string> GetCookies()
|
||||
{
|
||||
return CookieUtil.CookieHeaderToDictionary(Settings.Cookie);
|
||||
}
|
||||
|
||||
private IndexerCapabilities SetCapabilities()
|
||||
@@ -119,6 +91,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
caps.Categories.AddCategoryMapping(17, NewznabStandardCategory.BooksComics, "Doujinshi");
|
||||
caps.Categories.AddCategoryMapping(18, NewznabStandardCategory.BooksComics, "Doujinshi 18+");
|
||||
caps.Categories.AddCategoryMapping(19, NewznabStandardCategory.Audio, "OST");
|
||||
caps.Categories.AddCategoryMapping(20, NewznabStandardCategory.AudioAudiobook, "Audiobooks");
|
||||
|
||||
return caps;
|
||||
}
|
||||
@@ -291,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;
|
||||
@@ -306,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");
|
||||
@@ -327,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);
|
||||
@@ -349,7 +324,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; }
|
||||
}
|
||||
|
||||
public class AnimeTorrentsSettings : UserPassTorrentBaseSettings
|
||||
public class AnimeTorrentsSettings : CookieTorrentBaseSettings
|
||||
{
|
||||
public AnimeTorrentsSettings()
|
||||
{
|
||||
@@ -360,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; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,6 +84,6 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
public class AvistaZParser : AvistazParserBase
|
||||
{
|
||||
protected override string TimezoneOffset => "+02:00";
|
||||
protected override string TimezoneOffset => "+01:00";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
|
||||
{
|
||||
public class AvistazParserBase : IParseIndexerResponse
|
||||
{
|
||||
protected virtual string TimezoneOffset => "-04:00"; // Avistaz does not specify a timezone & returns server time
|
||||
protected virtual string TimezoneOffset => "-05:00"; // Avistaz does not specify a timezone & returns server time
|
||||
private readonly HashSet<string> _hdResolutions = new () { "1080p", "1080i", "720p" };
|
||||
|
||||
public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; }
|
||||
|
||||
@@ -55,7 +55,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
return FilterReleasesByQuery(cleanReleases, searchCriteria).ToList();
|
||||
}
|
||||
|
||||
private IndexerCapabilities SetCapabilities()
|
||||
private static IndexerCapabilities SetCapabilities()
|
||||
{
|
||||
var caps = new IndexerCapabilities
|
||||
{
|
||||
@@ -69,7 +69,8 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
},
|
||||
Flags = new List<IndexerFlag>
|
||||
{
|
||||
IndexerFlag.Internal
|
||||
IndexerFlag.Internal,
|
||||
IndexerFlag.Exclusive,
|
||||
}
|
||||
};
|
||||
|
||||
@@ -91,7 +92,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
_capabilities = capabilities;
|
||||
}
|
||||
|
||||
private IEnumerable<IndexerRequest> GetPagedRequests(SearchCriteriaBase searchCriteria, string term, string imdbId = null, int tmdbId = 0)
|
||||
private IEnumerable<IndexerRequest> GetPagedRequests(SearchCriteriaBase searchCriteria, string searchTerm, string imdbId = null, int tmdbId = 0)
|
||||
{
|
||||
var body = new Dictionary<string, object>
|
||||
{
|
||||
@@ -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<IndexerFlag>();
|
||||
|
||||
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,
|
||||
@@ -319,6 +322,23 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
private static HashSet<IndexerFlag> GetIndexerFlags(BeyondHDTorrent item)
|
||||
{
|
||||
var flags = new HashSet<IndexerFlag>();
|
||||
|
||||
if (item.Internal)
|
||||
{
|
||||
flags.Add(IndexerFlag.Internal);
|
||||
}
|
||||
|
||||
if (item.Exclusive)
|
||||
{
|
||||
flags.Add(IndexerFlag.Exclusive);
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; }
|
||||
}
|
||||
|
||||
@@ -478,6 +498,8 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
public bool Limited { get; set; }
|
||||
|
||||
public bool Exclusive { get; set; }
|
||||
|
||||
public bool Internal { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
private readonly IndexerCapabilitiesCategories _categories;
|
||||
|
||||
protected override string TimezoneOffset => "+02:00";
|
||||
protected override string TimezoneOffset => "+01:00";
|
||||
|
||||
public ExoticaZParser(IndexerCapabilitiesCategories categories)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits
|
||||
return new HDBitsParser(Settings, Capabilities.Categories);
|
||||
}
|
||||
|
||||
private IndexerCapabilities SetCapabilities()
|
||||
private static IndexerCapabilities SetCapabilities()
|
||||
{
|
||||
var caps = new IndexerCapabilities
|
||||
{
|
||||
@@ -43,6 +43,11 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits
|
||||
MovieSearchParams = new List<MovieSearchParam>
|
||||
{
|
||||
MovieSearchParam.Q, MovieSearchParam.ImdbId
|
||||
},
|
||||
Flags = new List<IndexerFlag>
|
||||
{
|
||||
IndexerFlag.Internal,
|
||||
IndexerFlag.Exclusive,
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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; }
|
||||
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
|
||||
namespace NzbDrone.Core.Indexers.Definitions.HDBits
|
||||
{
|
||||
public class HDBitsInfo : TorrentInfo
|
||||
{
|
||||
public bool? Internal { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -62,16 +62,8 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits
|
||||
}
|
||||
|
||||
var id = result.Id;
|
||||
var internalRelease = result.TypeOrigin == 1;
|
||||
|
||||
var flags = new HashSet<IndexerFlag>();
|
||||
|
||||
if (internalRelease)
|
||||
{
|
||||
flags.Add(IndexerFlag.Internal);
|
||||
}
|
||||
|
||||
releaseInfos.Add(new HDBitsInfo
|
||||
releaseInfos.Add(new TorrentInfo
|
||||
{
|
||||
Guid = $"HDBits-{id}",
|
||||
Title = GetTitle(result),
|
||||
@@ -85,28 +77,43 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits
|
||||
Files = (int)result.NumFiles,
|
||||
Peers = result.Leechers + result.Seeders,
|
||||
PublishDate = result.Added.ToUniversalTime(),
|
||||
Internal = internalRelease,
|
||||
Year = result.ImdbInfo?.Year ?? 0,
|
||||
ImdbId = result.ImdbInfo?.Id ?? 0,
|
||||
TvdbId = result.TvdbInfo?.Id ?? 0,
|
||||
DownloadVolumeFactor = GetDownloadVolumeFactor(result),
|
||||
UploadVolumeFactor = GetUploadVolumeFactor(result),
|
||||
IndexerFlags = flags
|
||||
IndexerFlags = GetIndexerFlags(result)
|
||||
});
|
||||
}
|
||||
|
||||
return releaseInfos.ToArray();
|
||||
}
|
||||
|
||||
public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; }
|
||||
|
||||
private string GetTitle(TorrentQueryResponse item)
|
||||
{
|
||||
return _settings.UseFilenames && item.FileName.IsNotNullOrWhiteSpace()
|
||||
// Use release name for XXX content and full discs
|
||||
return item.TypeCategory != 7 && item.TypeMedium != 1 && _settings.UseFilenames && item.FileName.IsNotNullOrWhiteSpace()
|
||||
? item.FileName.Replace(".torrent", "", StringComparison.InvariantCultureIgnoreCase)
|
||||
: item.Name;
|
||||
}
|
||||
|
||||
private static HashSet<IndexerFlag> GetIndexerFlags(TorrentQueryResponse item)
|
||||
{
|
||||
var flags = new HashSet<IndexerFlag>();
|
||||
|
||||
if (item.TypeOrigin == 1)
|
||||
{
|
||||
flags.Add(IndexerFlag.Internal);
|
||||
}
|
||||
|
||||
if (item.TypeExclusive == 1)
|
||||
{
|
||||
flags.Add(IndexerFlag.Exclusive);
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
private double GetDownloadVolumeFactor(TorrentQueryResponse item)
|
||||
{
|
||||
if (item.FreeLeech == "yes")
|
||||
@@ -153,5 +160,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits
|
||||
|
||||
return url.FullUri;
|
||||
}
|
||||
|
||||
public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -403,10 +403,13 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
private static string CleanTitle(string title)
|
||||
{
|
||||
// drop invalid chars that seems to have cropped up in some titles. #6582
|
||||
// Drop invalid chars that seems to have cropped up in some titles. #6582
|
||||
title = Regex.Replace(title, @"[\u0000-\u0008\u000A-\u001F\u0100-\uFFFF]", string.Empty, RegexOptions.Compiled);
|
||||
title = Regex.Replace(title, @"[\(\[\{]REQ(UEST(ED)?)?[\)\]\}]", string.Empty, RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
// Drop languages between brackets conflicting with anime release group parsing
|
||||
title = Regex.Replace(title, @"^\[[a-z0-9 ._-]+\][-._ ](?<title>.*-[a-z0-9]+)$", "${title}", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
return title.Trim(' ', '-', ':');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ using NzbDrone.Common.Http;
|
||||
using NzbDrone.Common.Serializer;
|
||||
using NzbDrone.Core.Annotations;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Exceptions;
|
||||
using NzbDrone.Core.Indexers.Exceptions;
|
||||
using NzbDrone.Core.Indexers.Settings;
|
||||
using NzbDrone.Core.IndexerSearch.Definitions;
|
||||
@@ -36,8 +37,8 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
public override bool SupportsPagination => true;
|
||||
public override int PageSize => 100;
|
||||
public override IndexerCapabilities Capabilities => SetCapabilities();
|
||||
|
||||
private readonly ICacheManager _cacheManager;
|
||||
private static readonly Regex TorrentIdRegex = new Regex(@"tor/download.php\?tid=(?<id>\d+)$");
|
||||
|
||||
public MyAnonamouse(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger, ICacheManager cacheManager)
|
||||
: base(httpClient, eventAggregator, indexerStatusService, configService, logger)
|
||||
@@ -59,39 +60,66 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var downloadLink = link.RemoveQueryParam("canUseToken");
|
||||
|
||||
if (Settings.Freeleech && bool.TryParse(link.GetQueryParam("canUseToken"), out var canUseToken) && canUseToken)
|
||||
if (Settings.UseFreeleechWedge is (int)MyAnonamouseFreeleechWedgeAction.Preferred or (int)MyAnonamouseFreeleechWedgeAction.Required &&
|
||||
bool.TryParse(link.GetQueryParam("canUseToken"), out var canUseToken) && canUseToken)
|
||||
{
|
||||
_logger.Debug("Attempting to use freeleech token for {0}", downloadLink.AbsoluteUri);
|
||||
_logger.Debug("Attempting to use freeleech wedge for {0}", downloadLink.AbsoluteUri);
|
||||
|
||||
var idMatch = TorrentIdRegex.Match(downloadLink.AbsoluteUri);
|
||||
if (idMatch.Success)
|
||||
if (int.TryParse(link.GetQueryParam("tid"), out var torrentId) && torrentId > 0)
|
||||
{
|
||||
var id = int.Parse(idMatch.Groups["id"].Value);
|
||||
var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
|
||||
var freeleechUrl = Settings.BaseUrl + $"json/bonusBuy.php/{timestamp}";
|
||||
|
||||
var freeleechRequest = new HttpRequestBuilder(freeleechUrl)
|
||||
var freeleechRequestBuilder = new HttpRequestBuilder(freeleechUrl)
|
||||
.Accept(HttpAccept.Json)
|
||||
.AddQueryParam("spendtype", "personalFL")
|
||||
.AddQueryParam("torrentid", id)
|
||||
.AddQueryParam("timestamp", timestamp.ToString())
|
||||
.Build();
|
||||
.AddQueryParam("torrentid", torrentId)
|
||||
.AddQueryParam("timestamp", timestamp.ToString());
|
||||
|
||||
var indexerReq = new IndexerRequest(freeleechRequest);
|
||||
var response = await FetchIndexerResponse(indexerReq).ConfigureAwait(false);
|
||||
var resource = Json.Deserialize<MyAnonamouseBuyPersonalFreeleechResponse>(response.Content);
|
||||
freeleechRequestBuilder.LogResponseContent = true;
|
||||
|
||||
var cookies = GetCookies();
|
||||
|
||||
if (cookies != null && cookies.Any())
|
||||
{
|
||||
freeleechRequestBuilder.SetCookies(cookies);
|
||||
}
|
||||
|
||||
var freeleechRequest = freeleechRequestBuilder.Build();
|
||||
|
||||
var freeleechResponse = await _httpClient.ExecuteProxiedAsync(freeleechRequest, Definition).ConfigureAwait(false);
|
||||
|
||||
var resource = Json.Deserialize<MyAnonamouseBuyPersonalFreeleechResponse>(freeleechResponse.Content);
|
||||
|
||||
if (resource.Success)
|
||||
{
|
||||
_logger.Debug("Successfully to used freeleech token for torrentid {0}", id);
|
||||
_logger.Debug("Successfully used freeleech wedge for torrentid {0}.", torrentId);
|
||||
}
|
||||
else if (resource.Error.IsNotNullOrWhiteSpace() && resource.Error.ContainsIgnoreCase("This Torrent is VIP"))
|
||||
{
|
||||
_logger.Debug("{0} is already VIP, continuing downloading: {1}", torrentId, resource.Error);
|
||||
}
|
||||
else if (resource.Error.IsNotNullOrWhiteSpace() && resource.Error.ContainsIgnoreCase("This is already a personal freeleech"))
|
||||
{
|
||||
_logger.Debug("{0} is already a personal freeleech, continuing downloading: {1}", torrentId, resource.Error);
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.Debug("Failed to use freeleech token: {0}", resource.Error);
|
||||
_logger.Warn("Failed to purchase freeleech wedge for {0}: {1}", torrentId, resource.Error);
|
||||
|
||||
if (Settings.UseFreeleechWedge == (int)MyAnonamouseFreeleechWedgeAction.Preferred)
|
||||
{
|
||||
_logger.Debug("'Use Freeleech Wedge' option set to preferred, continuing downloading: '{0}'", downloadLink.AbsoluteUri);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new ReleaseUnavailableException($"Failed to buy freeleech wedge and 'Use Freeleech Wedge' is set to required, aborting download: '{downloadLink.AbsoluteUri}'");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.Debug("Could not get torrent id from link {0}, skipping freeleech", downloadLink.AbsoluteUri);
|
||||
_logger.Warn("Could not get torrent id from link {0}, skipping use of freeleech wedge.", downloadLink.AbsoluteUri);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -535,7 +563,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
.CombinePath("/tor/download.php")
|
||||
.AddQueryParam("tid", torrentId);
|
||||
|
||||
if (_settings.Freeleech && canUseToken)
|
||||
if (_settings.UseFreeleechWedge is (int)MyAnonamouseFreeleechWedgeAction.Preferred or (int)MyAnonamouseFreeleechWedgeAction.Required && canUseToken)
|
||||
{
|
||||
url = url.AddQueryParam("canUseToken", "true");
|
||||
}
|
||||
@@ -560,8 +588,11 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
_logger.Debug("Fetching user data: {0}", request.Url.FullUri);
|
||||
|
||||
var response = _httpClient.ExecuteProxied(request, _definition);
|
||||
|
||||
var jsonResponse = JsonConvert.DeserializeObject<MyAnonamouseUserDataResponse>(response.Content);
|
||||
|
||||
_logger.Trace("Current user class: '{0}'", jsonResponse.UserClass);
|
||||
|
||||
return jsonResponse.UserClass?.Trim();
|
||||
},
|
||||
TimeSpan.FromHours(1));
|
||||
@@ -592,6 +623,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
SearchInSeries = false;
|
||||
SearchInFilenames = false;
|
||||
SearchLanguages = Array.Empty<int>();
|
||||
UseFreeleechWedge = (int)MyAnonamouseFreeleechWedgeAction.Never;
|
||||
}
|
||||
|
||||
[FieldDefinition(2, Type = FieldType.Textbox, Label = "Mam Id", HelpText = "Mam Session Id (Created Under Preferences -> Security)")]
|
||||
@@ -600,21 +632,21 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
[FieldDefinition(3, Type = FieldType.Select, Label = "Search Type", SelectOptions = typeof(MyAnonamouseSearchType), HelpText = "Specify the desired search type")]
|
||||
public int SearchType { get; set; }
|
||||
|
||||
[FieldDefinition(4, Type = FieldType.Checkbox, Label = "Use Freeleech Wedges", HelpText = "Use freeleech wedges to make grabbed torrents personal freeleech")]
|
||||
public bool Freeleech { get; set; }
|
||||
|
||||
[FieldDefinition(5, Type = FieldType.Checkbox, Label = "Search in description", HelpText = "Search text in the description")]
|
||||
[FieldDefinition(4, Type = FieldType.Checkbox, Label = "Search in description", HelpText = "Search text in the description")]
|
||||
public bool SearchInDescription { get; set; }
|
||||
|
||||
[FieldDefinition(6, Type = FieldType.Checkbox, Label = "Search in series", HelpText = "Search text in the series")]
|
||||
[FieldDefinition(5, Type = FieldType.Checkbox, Label = "Search in series", HelpText = "Search text in the series")]
|
||||
public bool SearchInSeries { get; set; }
|
||||
|
||||
[FieldDefinition(7, Type = FieldType.Checkbox, Label = "Search in filenames", HelpText = "Search text in the filenames")]
|
||||
[FieldDefinition(6, Type = FieldType.Checkbox, Label = "Search in filenames", HelpText = "Search text in the filenames")]
|
||||
public bool SearchInFilenames { get; set; }
|
||||
|
||||
[FieldDefinition(8, Type = FieldType.Select, Label = "Search Languages", SelectOptions = typeof(MyAnonamouseSearchLanguages), HelpText = "Specify the desired languages. If unspecified, all options are used.")]
|
||||
[FieldDefinition(7, Type = FieldType.Select, Label = "Search Languages", SelectOptions = typeof(MyAnonamouseSearchLanguages), HelpText = "Specify the desired languages. If unspecified, all options are used.")]
|
||||
public IEnumerable<int> SearchLanguages { get; set; }
|
||||
|
||||
[FieldDefinition(8, Type = FieldType.Select, Label = "Use Freeleech Wedges", SelectOptions = typeof(MyAnonamouseFreeleechWedgeAction), HelpText = "Use freeleech wedges to make grabbed torrents personal freeleech")]
|
||||
public int UseFreeleechWedge { get; set; }
|
||||
|
||||
public override NzbDroneValidationResult Validate()
|
||||
{
|
||||
return new NzbDroneValidationResult(Validator.Validate(this));
|
||||
@@ -834,6 +866,18 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
Other = 47,
|
||||
}
|
||||
|
||||
public enum MyAnonamouseFreeleechWedgeAction
|
||||
{
|
||||
[FieldOption(Label = "Never", Hint = "Do not buy as freeleech")]
|
||||
Never = 0,
|
||||
|
||||
[FieldOption(Label = "Preferred", Hint = "Buy and use wedge if possible")]
|
||||
Preferred = 1,
|
||||
|
||||
[FieldOption(Label = "Required", Hint = "Abort download if unable to buy wedge")]
|
||||
Required = 2,
|
||||
}
|
||||
|
||||
public class MyAnonamouseTorrent
|
||||
{
|
||||
public int Id { get; set; }
|
||||
@@ -875,7 +919,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
public class MyAnonamouseUserDataResponse
|
||||
{
|
||||
[JsonProperty(PropertyName = "class")]
|
||||
[JsonProperty(PropertyName = "classname")]
|
||||
public string UserClass { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -240,6 +240,8 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
public IList<ReleaseInfo> ParseResponse(IndexerResponse indexerResponse)
|
||||
{
|
||||
var torrentInfos = new List<ReleaseInfo>();
|
||||
|
||||
if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK)
|
||||
{
|
||||
STJson.TryDeserialize<JsonRpcResponse<NebulanceErrorResponse>>(indexerResponse.HttpResponse.Content, out var errorResponse);
|
||||
@@ -247,13 +249,6 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
throw new IndexerException(indexerResponse, "Unexpected response status '{0}' code from indexer request: {1}", indexerResponse.HttpResponse.StatusCode, errorResponse?.Result?.Error?.Message ?? "Check the logs for more information.");
|
||||
}
|
||||
|
||||
if (!indexerResponse.HttpResponse.Headers.ContentType.Contains(HttpAccept.Json.Value))
|
||||
{
|
||||
throw new IndexerException(indexerResponse, "Unexpected response header {0} from indexer request, expected {1}", indexerResponse.HttpResponse.Headers.ContentType, HttpAccept.Json.Value);
|
||||
}
|
||||
|
||||
var torrentInfos = new List<ReleaseInfo>();
|
||||
|
||||
JsonRpcResponse<NebulanceResponse> jsonResponse;
|
||||
|
||||
try
|
||||
|
||||
@@ -128,7 +128,7 @@ namespace NzbDrone.Core.Indexers.Newznab
|
||||
parameters.Set("tvdbid", searchCriteria.TvdbId.Value.ToString());
|
||||
}
|
||||
|
||||
if (searchCriteria.TmdbId.HasValue && capabilities.TvSearchTvdbAvailable)
|
||||
if (searchCriteria.TmdbId.HasValue && capabilities.TvSearchTmdbAvailable)
|
||||
{
|
||||
parameters.Set("tmdbid", searchCriteria.TmdbId.Value.ToString());
|
||||
}
|
||||
|
||||
@@ -129,26 +129,14 @@ public class NorBits : TorrentIndexerBase<NorBitsSettings>
|
||||
}
|
||||
};
|
||||
|
||||
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&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[]=1", NewznabStandardCategory.Movies, "Filmer");
|
||||
caps.Categories.AddCategoryMapping("main_cat[]=2", NewznabStandardCategory.TV, "TV");
|
||||
caps.Categories.AddCategoryMapping("main_cat[]=3", NewznabStandardCategory.PC, "Programmer");
|
||||
caps.Categories.AddCategoryMapping("main_cat[]=4", NewznabStandardCategory.Console, "Spill");
|
||||
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[]=5", NewznabStandardCategory.Audio, "Musikk");
|
||||
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&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[]=8", NewznabStandardCategory.AudioVideo, "Musikkvideoer");
|
||||
caps.Categories.AddCategoryMapping("main_cat[]=40", NewznabStandardCategory.AudioOther, "Podcasts");
|
||||
|
||||
return caps;
|
||||
@@ -277,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) > div > a[href*=\"main_cat[]\"]")?.GetAttribute("href")?.Split('?').Last();
|
||||
var secondCategory = row.QuerySelector("td:nth-of-type(1) > div > a[href*=\"sub2_cat[]\"]")?.GetAttribute("href")?.Split('?').Last();
|
||||
var 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
|
||||
{
|
||||
@@ -298,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()),
|
||||
|
||||
@@ -56,6 +56,19 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
|
||||
{
|
||||
foreach (var torrent in result.Torrents)
|
||||
{
|
||||
// skip non-freeleech results when freeleech only is set
|
||||
var downloadVolumeFactor = torrent.FreeleechType?.ToUpperInvariant() switch
|
||||
{
|
||||
"FREELEECH" => 0,
|
||||
"HALF LEECH" => 0.5,
|
||||
_ => 1
|
||||
};
|
||||
|
||||
if (_settings.FreeleechOnly && downloadVolumeFactor != 0.0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var id = torrent.Id;
|
||||
var title = torrent.ReleaseName;
|
||||
|
||||
@@ -94,12 +107,7 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
|
||||
ImdbId = result.ImdbId.IsNotNullOrWhiteSpace() ? int.Parse(result.ImdbId) : 0,
|
||||
Scene = torrent.Scene,
|
||||
IndexerFlags = flags,
|
||||
DownloadVolumeFactor = torrent.FreeleechType?.ToUpperInvariant() switch
|
||||
{
|
||||
"FREELEECH" => 0,
|
||||
"HALF LEECH" => 0.5,
|
||||
_ => 1
|
||||
},
|
||||
DownloadVolumeFactor = downloadVolumeFactor,
|
||||
UploadVolumeFactor = 1,
|
||||
MinimumRatio = 1,
|
||||
MinimumSeedTime = 345600,
|
||||
|
||||
@@ -933,6 +933,8 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
caps.Categories.AddCategoryMapping(1224, NewznabStandardCategory.AudioLossless, "|- Авторская песня (lossless)");
|
||||
caps.Categories.AddCategoryMapping(1225, NewznabStandardCategory.AudioMP3, "|- Авторская песня (lossy)");
|
||||
caps.Categories.AddCategoryMapping(1226, NewznabStandardCategory.Audio, "|- Менестрели и ролевики (lossy и lossless)");
|
||||
caps.Categories.AddCategoryMapping(782, NewznabStandardCategory.Audio, "Лейбл- и сцен-паки. Неофициальные сборники и ремастеринги. AI-музыка");
|
||||
caps.Categories.AddCategoryMapping(577, NewznabStandardCategory.Audio, "|- AI-Music - музыка ИИ, нейросетей (lossy и lossless)");
|
||||
caps.Categories.AddCategoryMapping(1842, NewznabStandardCategory.AudioLossless, "Label Packs (lossless)");
|
||||
caps.Categories.AddCategoryMapping(1648, NewznabStandardCategory.AudioMP3, "Label packs, Scene packs (lossy)");
|
||||
caps.Categories.AddCategoryMapping(134, NewznabStandardCategory.AudioLossless, "|- Неофициальные сборники и ремастеринги (lossless)");
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -7,6 +7,7 @@ using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Annotations;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Indexers.Exceptions;
|
||||
using NzbDrone.Core.Indexers.Settings;
|
||||
using NzbDrone.Core.IndexerSearch.Definitions;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
@@ -52,7 +53,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
public override IParseIndexerResponse GetParser()
|
||||
{
|
||||
return new TorrentDayParser(Settings, Capabilities.Categories);
|
||||
return new TorrentDayParser(Settings, Capabilities.Categories, _logger);
|
||||
}
|
||||
|
||||
protected override IDictionary<string, string> GetCookies()
|
||||
@@ -228,15 +229,29 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
private readonly TorrentDaySettings _settings;
|
||||
private readonly IndexerCapabilitiesCategories _categories;
|
||||
private readonly Logger _logger;
|
||||
|
||||
public TorrentDayParser(TorrentDaySettings settings, IndexerCapabilitiesCategories categories)
|
||||
public TorrentDayParser(TorrentDaySettings settings, IndexerCapabilitiesCategories categories, Logger logger)
|
||||
{
|
||||
_settings = settings;
|
||||
_categories = categories;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public IList<ReleaseInfo> ParseResponse(IndexerResponse indexerResponse)
|
||||
{
|
||||
if (indexerResponse.HttpResponse.HasHttpRedirect)
|
||||
{
|
||||
_logger.Warn("Redirected to {0} from indexer request", indexerResponse.HttpResponse.RedirectUrl);
|
||||
|
||||
if (indexerResponse.HttpResponse.RedirectUrl.ContainsIgnoreCase("/login.php"))
|
||||
{
|
||||
throw new IndexerException(indexerResponse, "We are being redirected to the login page. Most likely your session expired or was killed. Recheck your cookie and try testing the indexer.");
|
||||
}
|
||||
|
||||
throw new IndexerException(indexerResponse, "Redirected to {0} from indexer request", indexerResponse.HttpResponse.RedirectUrl);
|
||||
}
|
||||
|
||||
var torrentInfos = new List<TorrentInfo>();
|
||||
|
||||
var rows = JsonConvert.DeserializeObject<dynamic>(indexerResponse.Content);
|
||||
|
||||
@@ -121,8 +121,15 @@ public class XSpeeds : TorrentIndexerBase<XSpeedsSettings>
|
||||
caps.Categories.AddCategoryMapping(112, NewznabStandardCategory.MoviesOther, "Anime Movies");
|
||||
caps.Categories.AddCategoryMapping(111, NewznabStandardCategory.MoviesOther, "Anime TV");
|
||||
caps.Categories.AddCategoryMapping(150, NewznabStandardCategory.PC, "Apps");
|
||||
caps.Categories.AddCategoryMapping(80, NewznabStandardCategory.AudioAudiobook, "Audiobooks");
|
||||
caps.Categories.AddCategoryMapping(48, NewznabStandardCategory.Books, "Books Magazines");
|
||||
caps.Categories.AddCategoryMapping(156, NewznabStandardCategory.TV, "AV1");
|
||||
caps.Categories.AddCategoryMapping(156, NewznabStandardCategory.Movies, "AV1");
|
||||
caps.Categories.AddCategoryMapping(159, NewznabStandardCategory.Movies, "Movie Boxsets AV1");
|
||||
caps.Categories.AddCategoryMapping(158, NewznabStandardCategory.Movies, "Movies AV1");
|
||||
caps.Categories.AddCategoryMapping(157, NewznabStandardCategory.TV, "TV AV1");
|
||||
caps.Categories.AddCategoryMapping(160, NewznabStandardCategory.TV, "TV Boxsets AV1");
|
||||
caps.Categories.AddCategoryMapping(153, NewznabStandardCategory.Books, "Books");
|
||||
caps.Categories.AddCategoryMapping(154, NewznabStandardCategory.AudioAudiobook, "Audiobooks");
|
||||
caps.Categories.AddCategoryMapping(155, NewznabStandardCategory.Books, "Books & Magazines");
|
||||
caps.Categories.AddCategoryMapping(68, NewznabStandardCategory.MoviesOther, "Cams/TS");
|
||||
caps.Categories.AddCategoryMapping(140, NewznabStandardCategory.TVDocumentary, "Documentary");
|
||||
caps.Categories.AddCategoryMapping(10, NewznabStandardCategory.MoviesDVD, "DVDR");
|
||||
@@ -154,6 +161,7 @@ public class XSpeeds : TorrentIndexerBase<XSpeedsSettings>
|
||||
caps.Categories.AddCategoryMapping(146, NewznabStandardCategory.MoviesSD, "Movies SD");
|
||||
caps.Categories.AddCategoryMapping(13, NewznabStandardCategory.Audio, "Music");
|
||||
caps.Categories.AddCategoryMapping(135, NewznabStandardCategory.AudioLossless, "Music/FLAC");
|
||||
caps.Categories.AddCategoryMapping(151, NewznabStandardCategory.Audio, "Karaoke");
|
||||
caps.Categories.AddCategoryMapping(136, NewznabStandardCategory.Audio, "Music Boxset");
|
||||
caps.Categories.AddCategoryMapping(148, NewznabStandardCategory.AudioVideo, "Music Videos");
|
||||
caps.Categories.AddCategoryMapping(9, NewznabStandardCategory.Other, "Other");
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -95,7 +95,7 @@ namespace NzbDrone.Core.Instrumentation
|
||||
|
||||
private void ReconfigureFile()
|
||||
{
|
||||
foreach (var target in LogManager.Configuration.AllTargets.OfType<NzbDroneFileTarget>())
|
||||
foreach (var target in LogManager.Configuration.AllTargets.OfType<CleansingFileTarget>())
|
||||
{
|
||||
target.MaxArchiveFiles = _configFileProvider.LogRotate;
|
||||
target.ArchiveAboveSize = _configFileProvider.LogSizeLimit.Megabytes();
|
||||
@@ -120,11 +120,7 @@ namespace NzbDrone.Core.Instrumentation
|
||||
{
|
||||
var format = _configFileProvider.ConsoleLogFormat;
|
||||
|
||||
consoleTarget.Layout = format switch
|
||||
{
|
||||
ConsoleLogFormat.Clef => NzbDroneLogger.ClefLogLayout,
|
||||
_ => NzbDroneLogger.ConsoleLogLayout
|
||||
};
|
||||
NzbDroneLogger.ConfigureConsoleLayout(consoleTarget, format);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -376,5 +376,16 @@
|
||||
"ActiveIndexers": "Активни индиксатори",
|
||||
"AddApplication": "добави приложение",
|
||||
"Season": "Причина",
|
||||
"CurrentlyInstalled": "Понастоящем инсталиран"
|
||||
"CurrentlyInstalled": "Понастоящем инсталиран",
|
||||
"DownloadClientSettingsAddPaused": "Добави на пауза",
|
||||
"Encoding": "Кодиране",
|
||||
"Episode": "епизод",
|
||||
"Applications": "Приложения",
|
||||
"Publisher": "Издател",
|
||||
"Id": "ИН",
|
||||
"Theme": "Тема",
|
||||
"Label": "Етикет",
|
||||
"Categories": "Категории",
|
||||
"Album": "албум",
|
||||
"Artist": "изпълнител"
|
||||
}
|
||||
|
||||
@@ -500,5 +500,6 @@
|
||||
"UpdateAppDirectlyLoadError": "No es pot actualitzar {appName} directament,",
|
||||
"WouldYouLikeToRestoreBackup": "Voleu restaurar la còpia de seguretat '{name}'?",
|
||||
"InstallLatest": "Instal·la l'últim",
|
||||
"CurrentlyInstalled": "Instal·lat actualment"
|
||||
"CurrentlyInstalled": "Instal·lat actualment",
|
||||
"DownloadClientSettingsAddPaused": "Afegeix pausats"
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
"ProxyType": "Typ serveru proxy",
|
||||
"Reddit": "Reddit",
|
||||
"ErrorLoadingContents": "Chyba při načítání obsahu",
|
||||
"IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Všechny indexery nejsou k dispozici z důvodu selhání po dobu delší než 6 hodin",
|
||||
"IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Všechny indexery jsou nedostupné z důvodu selhání déle než 6 hodin",
|
||||
"RemovedFromTaskQueue": "Odebráno z fronty úkolů",
|
||||
"ResetAPIKey": "Resetovat klíč API",
|
||||
"SSLCertPassword": "Heslo SSL Cert",
|
||||
@@ -52,10 +52,10 @@
|
||||
"IncludeHealthWarningsHelpText": "Včetně varování ohledně zdraví",
|
||||
"Indexer": "Indexer",
|
||||
"IndexerFlags": "Příznaky indexeru",
|
||||
"IndexerPriority": "Priorita indexování",
|
||||
"IndexerPriorityHelpText": "Priorita indexování od 1 (nejvyšší) do 50 (nejnižší). Výchozí: 25.",
|
||||
"IndexerPriority": "Priorita indexeru",
|
||||
"IndexerPriorityHelpText": "Priorita indexeru od 1 (Nejvyšší) do 50 (Nejnižší). Výchozí: 25.",
|
||||
"Indexers": "Indexery",
|
||||
"IndexerStatusAllUnavailableHealthCheckMessage": "Všechny indexery nejsou k dispozici z důvodu selhání",
|
||||
"IndexerStatusAllUnavailableHealthCheckMessage": "Všechny indexery jsou nedostupné z důvodu selhání",
|
||||
"LastWriteTime": "Čas posledního zápisu",
|
||||
"Level": "Úroveň",
|
||||
"LogLevel": "Úroveň protokolu",
|
||||
@@ -73,8 +73,8 @@
|
||||
"ApiKey": "Klíč API",
|
||||
"AppDataDirectory": "Adresář AppData",
|
||||
"AppDataLocationHealthCheckMessage": "Aktualizace nebude možná, aby se zabránilo odstranění AppData při aktualizaci",
|
||||
"ApplicationStatusCheckAllClientMessage": "Všechny aplikace jsou nedostupné z důvodu poruch",
|
||||
"ApplicationStatusCheckSingleClientMessage": "Aplikace nedostupné z důvodu poruch: {0}",
|
||||
"ApplicationStatusCheckAllClientMessage": "Všechny aplikace jsou nedostupné z důvodu selhání",
|
||||
"ApplicationStatusCheckSingleClientMessage": "Aplikace nedostupné z důvodu selhání: {0}",
|
||||
"Apply": "Použít",
|
||||
"Branch": "Větev",
|
||||
"BranchUpdate": "Větev použitá k aktualizaci {appName}u",
|
||||
@@ -105,7 +105,7 @@
|
||||
"Tasks": "Úkoly",
|
||||
"Test": "Test",
|
||||
"UnableToLoadTags": "Značky nelze načíst",
|
||||
"IndexerProxyStatusAllUnavailableHealthCheckMessage": "Všechny indexery nejsou k dispozici z důvodu selhání",
|
||||
"IndexerProxyStatusAllUnavailableHealthCheckMessage": "Všechny proxy indexerů jsou nedostupné z důvodu selhání",
|
||||
"ApplyTags": "Použít štítky",
|
||||
"MoreInfo": "Více informací",
|
||||
"System": "Systém",
|
||||
@@ -183,7 +183,7 @@
|
||||
"BypassProxyForLocalAddresses": "Obcházení proxy serveru pro místní adresy",
|
||||
"DeleteIndexerProxyMessageText": "Opravdu chcete odstranit proxy indexeru ‚{name}‘?",
|
||||
"DeleteTag": "Odstranit štítek",
|
||||
"IndexerProxyStatusUnavailableHealthCheckMessage": "Indexery nedostupné z důvodu selhání: {indexerProxyNames}",
|
||||
"IndexerProxyStatusUnavailableHealthCheckMessage": "Proxy indexerů nedostupné z důvodu selhání: {indexerProxyNames}",
|
||||
"Name": "název",
|
||||
"New": "Nový",
|
||||
"Protocol": "Protokol",
|
||||
@@ -265,7 +265,7 @@
|
||||
"Exception": "Výjimka",
|
||||
"ExistingTag": "Stávající štítek",
|
||||
"IllRestartLater": "Restartuji později",
|
||||
"IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexery nedostupné z důvodu selhání po dobu delší než 6 hodin: {indexerNames}",
|
||||
"IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexery nedostupné z důvodu selhání déle než 6 hodin: {indexerNames}",
|
||||
"IndexerStatusUnavailableHealthCheckMessage": "Indexery nedostupné z důvodu selhání: {indexerNames}",
|
||||
"SettingsTimeFormat": "Časový formát",
|
||||
"ShowAdvanced": "Zobrazit pokročilé",
|
||||
@@ -320,8 +320,8 @@
|
||||
"UnableToLoadIndexers": "Nelze načíst indexery",
|
||||
"Yes": "Ano",
|
||||
"GrabReleases": "Získat vydání",
|
||||
"ApplicationLongTermStatusCheckSingleClientMessage": "Aplikace nedostupné z důvodu poruchy po dobu delší než 6 hodin: {0}",
|
||||
"ApplicationLongTermStatusCheckAllClientMessage": "Všechny aplikace jsou z důvodu poruchy nedostupné déle než 6 hodin",
|
||||
"ApplicationLongTermStatusCheckSingleClientMessage": "Aplikace nedostupné z důvodu selhání déle než 6 hodin: {0}",
|
||||
"ApplicationLongTermStatusCheckAllClientMessage": "Všechny aplikace jsou nedostupné z důvodu selhání déle než 6 hodin",
|
||||
"Ended": "Ukončeno",
|
||||
"LastDuration": "lastDuration",
|
||||
"LastExecution": "Poslední poprava",
|
||||
@@ -370,8 +370,8 @@
|
||||
"Artist": "Umělec",
|
||||
"EditIndexerImplementation": "Upravit indexer - {implementationName}",
|
||||
"Episode": "Epizoda",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Všechny seznamy nejsou k dispozici z důvodu selhání",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Seznamy nejsou k dispozici z důvodu selhání: {notificationNames}",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Všechna oznámení jsou nedostupná z důvodu selhání",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Oznámení nedostupná z důvodu selhání: {notificationNames}",
|
||||
"Application": "Aplikace",
|
||||
"AppUpdatedVersion": "{appName} byl aktualizován na verzi `{version}`, abyste získali nejnovější změny, musíte znovu načíst {appName}",
|
||||
"Encoding": "Kódování",
|
||||
@@ -409,7 +409,7 @@
|
||||
"days": "dnů",
|
||||
"Id": "ID",
|
||||
"CountApplicationsSelected": "{count} vybraných aplikací",
|
||||
"IndexerHDBitsSettingsCodecs": "Kodek",
|
||||
"IndexerHDBitsSettingsCodecs": "Kodeky",
|
||||
"IndexerHDBitsSettingsMediums": "Střední",
|
||||
"Directory": "Adresář",
|
||||
"CustomFilter": "Vlastní filtr",
|
||||
@@ -558,5 +558,80 @@
|
||||
"IndexerSettingsAppsMinimumSeeders": "Minimální počet seederů aplikací",
|
||||
"UsenetBlackholeNzbFolder": "Složka Nzb",
|
||||
"SearchIndexers": "Hledat indexery",
|
||||
"IndexerSettingsAppsMinimumSeedersHelpText": "Minimální počet seederů požadovaných aplikacemi pro indexer, výchozí hodnota synchronizačního profilu je prázdná"
|
||||
"IndexerSettingsAppsMinimumSeedersHelpText": "Minimální počet seederů požadovaných aplikacemi pro indexer, výchozí hodnota synchronizačního profilu je prázdná",
|
||||
"IndexerProxy": "Proxy indexeru",
|
||||
"IndexerBeyondHDSettingsRssKeyHelpText": "Klíč RSS ze stránky (Naleznete v Moje zabezpečení => Klíč RSS)",
|
||||
"IndexerHDBitsSettingsCodecsHelpText": "Pokud není zadáno, použijí se všechny možnosti.",
|
||||
"IndexerHDBitsSettingsUsernameHelpText": "Uživatelské jméno stránky",
|
||||
"IndexerAvistazSettingsUsernameHelpTextWarning": "Rozhraní API v tomto indexeru mohou používat pouze hodnosti člen a vyšší.",
|
||||
"IndexerBeyondHDSettingsApiKeyHelpText": "Klíč API ze stránky (Naleznete v Moje zabezpečení => Klíč API)",
|
||||
"IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání",
|
||||
"IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání",
|
||||
"IndexerProxies": "Proxy indexeru",
|
||||
"IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání",
|
||||
"IndexerHistoryLoadError": "Chyba při načítání historie indexeru",
|
||||
"IndexerId": "ID indexeru",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Indexery nemají žádnou definici a nebudou fungovat: {indexerNames}. Odeberte je a (nebo) znovu přidejte do {appName}.",
|
||||
"IndexerAlphaRatioSettingsExcludeSceneHelpText": "Vyloučit vydání SCENE z výsledků",
|
||||
"IndexerAlreadySetup": "Alespoň jedna instance indexeru je již nastavena",
|
||||
"IndexerAvistazSettingsPasswordHelpText": "Heslo stránky",
|
||||
"IndexerAvistazSettingsPidHelpText": "PID ze stránky Můj účet nebo Můj profil",
|
||||
"IndexerAvistazSettingsUsernameHelpText": "Uživatelské jméno stránky",
|
||||
"IndexerBeyondHDSettingsLimitedOnly": "Pouze omezené",
|
||||
"IndexerBeyondHDSettingsLimitedOnlyHelpText": "Hledat pouze freeleech (Omezené nahrávání)",
|
||||
"IndexerCategories": "Kategorie indexeru",
|
||||
"IndexerDisabled": "Indexer zakázán",
|
||||
"IndexerDownloadClientHealthCheckMessage": "Indexery s neplatnými klienty pro stahování: {indexerNames}.",
|
||||
"IndexerDownloadClientHelpText": "Určete, který klient pro stahování se použije pro grabování v rámci {appName} z tohoto indexeru",
|
||||
"IndexerFailureRate": "Míra selhání indexeru",
|
||||
"IndexerFileListSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání",
|
||||
"IndexerFileListSettingsPasskeyHelpText": "Přístupový klíč stránky (Jedná se o alfanumerický řetězec v url adrese trackeru zobrazené v klientovi pro stahování)",
|
||||
"IndexerGazelleGamesSettingsApiKeyHelpText": "Klíč API ze stránky (Naleznete v Nastavení => Nastavení přístupu)",
|
||||
"IndexerGazelleGamesSettingsSearchGroupNames": "Hledat názvy skupin",
|
||||
"IndexerHDBitsSettingsFreeleechOnlyHelpText": "Zobrazit pouze freeleech vydání",
|
||||
"IndexerHDBitsSettingsOriginsHelpText": "Pokud není zadáno, použijí se všechny možnosti.",
|
||||
"IndexerHDBitsSettingsUseFilenames": "Použít názvy souborů",
|
||||
"IndexerHealthCheckNoIndexers": "Nejsou povoleny žádné indexery, {appName} nevrátí výsledky vyhledávání",
|
||||
"IndexerIPTorrentsSettingsCookieUserAgent": "Uživatelský agent cookie",
|
||||
"IndexerIPTorrentsSettingsCookieUserAgentHelpText": "Uživatelský agent přidružený cookie použitý z prohlížeče",
|
||||
"IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání",
|
||||
"IndexerNebulanceSettingsApiKeyHelpText": "Klíč API z Nastavení uživatele > Klíče API. Klíč musí mít oprávnění Seznam a Stáhnout",
|
||||
"IndexerNewznabSettingsAdditionalParametersHelpText": "Dodatečné parametry Newznab",
|
||||
"IndexerNewznabSettingsApiKeyHelpText": "Klíč API stránky",
|
||||
"IndexerObsoleteCheckMessage": "Indexery jsou zastaralé nebo byly aktualizovány: {0}. Odeberte je a (nebo) znovu přidejte do {appName}",
|
||||
"IndexerOrpheusSettingsApiKeyHelpText": "Klíč API ze stránky (Naleznete v Nastavení => Nastavení přístupu)",
|
||||
"IndexerPassThePopcornSettingsApiUserHelpText": "Tato nastavení naleznete v nastavení zabezpečení PassThePopcorn (Upravit profil > Zabezpečení).",
|
||||
"IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání",
|
||||
"IndexerRedactedSettingsApiKeyHelpText": "Klíč API ze stránky (Naleznete v Nastavení => Nastavení přístupu)",
|
||||
"IndexerRss": "RSS indexeru",
|
||||
"LastFailure": "Poslední selhání",
|
||||
"IndexerSettingsAdditionalParameters": "Dodatečné parametry",
|
||||
"IndexerSettingsApiPath": "Cesta k API",
|
||||
"IndexerSettingsApiUser": "Uživatel API",
|
||||
"IndexerAuth": "Ověření indexeru",
|
||||
"IndexerInfo": "Informace o indexeru",
|
||||
"IndexerName": "Název indexeru",
|
||||
"IndexerDetails": "Podrobnosti indexeru",
|
||||
"IndexerHDBitsSettingsPasskeyHelpText": "Přístupový klíč z Podrobnosti o uživateli",
|
||||
"IndexerQuery": "Dotaz na indexer",
|
||||
"IndexerAlphaRatioSettingsExcludeScene": "Vyloučit SCENE",
|
||||
"IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání",
|
||||
"IndexerBeyondHDSettingsSearchTypes": "Hledat typy",
|
||||
"IndexerBeyondHDSettingsSearchTypesHelpText": "Vyberte typy vydání, které vás zajímají. Pokud není vybrán žádný, použijí se všechny možnosti.",
|
||||
"IndexerFileListSettingsUsernameHelpText": "Uživatelské jméno stránky",
|
||||
"IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Musí mít oprávnění Uživatel a Torrenty",
|
||||
"IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Hledat vydání podle názvů skupin",
|
||||
"IndexerHDBitsSettingsMediumsHelpText": "Pokud není zadáno, použijí se všechny možnosti.",
|
||||
"IndexerHDBitsSettingsUseFilenamesHelpText": "Zaškrtněte tuto možnost, pokud chcete používat názvy souborů torrentů jako názvy vydání",
|
||||
"IndexerNewznabSettingsVipExpirationHelpText": "Zadejte datum (rrrr-mm-dd) pro vypršení VIP nebo prázdné, {appName} bude upozorňovat 1 týden před vypršením VIP",
|
||||
"IndexerNzbIndexSettingsApiKeyHelpText": "Klíč API stránky",
|
||||
"IndexerPassThePopcornSettingsApiKeyHelpText": "Klíč API stránky",
|
||||
"IndexerMTeamTpSettingsApiKeyHelpText": "Klíč API ze stránky (Naleznete v Uživatelský ovládací panel => Zabezpečení => Laboratoř)",
|
||||
"IndexerPassThePopcornSettingsGoldenPopcornOnly": "Pouze Golden Popcorn",
|
||||
"IndexerPassThePopcornSettingsGoldenPopcornOnlyHelpText": "Hledat pouze vydání Golden Popcorn",
|
||||
"IndexerSettingsApiPathHelpText": "Cesta k api, obvykle {url}",
|
||||
"IndexerAvistazSettingsFreeleechOnlyHelpText": "Hledat pouze freeleech vydání",
|
||||
"InitialFailure": "Úvodní selhání",
|
||||
"IndexerTorrentSyndikatSettingsApiKeyHelpText": "Klíč API stránky",
|
||||
"SearchTypes": "Hledat typy"
|
||||
}
|
||||
|
||||
@@ -87,13 +87,13 @@
|
||||
"Delete": "Löschen",
|
||||
"DeleteAppProfile": "App-Profil löschen",
|
||||
"DeleteApplication": "Applikation löschen",
|
||||
"DeleteApplicationMessageText": "Wirklich die Applikation '{0}' löschen?",
|
||||
"DeleteApplicationMessageText": "Bist du sicher, dass du die Anwendung „{name}“ löschen möchtest?",
|
||||
"DeleteBackup": "Sicherung löschen",
|
||||
"DeleteBackupMessageText": "Soll das Backup '{name}' wirklich gelöscht werden?",
|
||||
"DeleteDownloadClient": "Download-Client löschen",
|
||||
"DeleteDownloadClientMessageText": "Bist du sicher, dass du den Download Client '{name}' wirklich löschen willst?",
|
||||
"DeleteIndexerProxy": "Indexer Proxy löschen",
|
||||
"DeleteIndexerProxyMessageText": "Tag '{0}' wirklich löschen?",
|
||||
"DeleteIndexerProxyMessageText": "Bist du sicher, dass du den Indexer-Proxy „{name}“ löschen möchtest?",
|
||||
"DeleteNotification": "Benachrichtigung löschen",
|
||||
"DeleteNotificationMessageText": "Bist du sicher, dass du die Benachrichtigung '{name}' wirklich löschen willst?",
|
||||
"DeleteTag": "Tag löschen",
|
||||
@@ -165,7 +165,7 @@
|
||||
"HomePage": "Hauptseite",
|
||||
"Host": "Host",
|
||||
"Hostname": "Hostname",
|
||||
"Id": "Id",
|
||||
"Id": "ID",
|
||||
"IgnoredAddresses": "Ignorierte Adressen",
|
||||
"IllRestartLater": "Später neustarten",
|
||||
"IncludeHealthWarningsHelpText": "Zustandswarnung",
|
||||
@@ -193,7 +193,7 @@
|
||||
"IndexerSite": "Indexer-Seite",
|
||||
"IndexerStatusAllUnavailableHealthCheckMessage": "Alle Indexer sind aufgrund von Fehlern nicht verfügbar",
|
||||
"IndexerStatusUnavailableHealthCheckMessage": "Indexer nicht verfügbar aufgrund von Fehlern: {indexerNames}",
|
||||
"IndexerTagsHelpText": "Benutze Tags, um Indexer-Proxies zu spezifizieren, mit welchen Apps der Indexer synchronisiert oder um Indexer zu organisieren.",
|
||||
"IndexerTagsHelpText": "Verwende Tags, um Indexer-Proxys oder die Apps, mit denen der Indexer synchronisiert wird, anzugeben.",
|
||||
"IndexerVipExpiredHealthCheckMessage": "Die VIP Indexer Vorteile sind abgelaufen: {indexerNames}",
|
||||
"IndexerVipExpiringHealthCheckMessage": "Die Indexer VIP Vorteile verfallen bald: {indexerNames}",
|
||||
"Indexers": "Indexer",
|
||||
@@ -254,7 +254,7 @@
|
||||
"Ok": "Ok",
|
||||
"OnApplicationUpdate": "Bei Anwendungsaktualisierung",
|
||||
"OnApplicationUpdateHelpText": "Bei Anwendungsaktualisierung",
|
||||
"OnGrab": "Bei Erfassung",
|
||||
"OnGrab": "Bei Release-Grabs",
|
||||
"OnHealthIssue": "Bei Gesundheitsproblem",
|
||||
"OnHealthIssueHelpText": "Zustandsproblem",
|
||||
"OpenBrowserOnStart": "Browser beim Start öffnen",
|
||||
@@ -276,7 +276,7 @@
|
||||
"Privacy": "Privatsphäre",
|
||||
"Private": "Privat",
|
||||
"Protocol": "Protokoll",
|
||||
"ProwlarrSupportsAnyDownloadClient": "Jeder Downloader der den Newznab-Standard verwendet oder unten aufgelistet ist wird untertützt.",
|
||||
"ProwlarrSupportsAnyDownloadClient": "{appName} unterstützt jeden der unten aufgeführten Download-Clients.",
|
||||
"ProwlarrSupportsAnyIndexer": "{appName} unterstützt alle Indexer, welcher den Newznab/Torznab Standard implementiert (verwende 'Generic Newznab' (für Usenet) oder 'Generic Torznab' (für Torrents)) und darüber hinaus viele weitere Indexer. Wählen Sie im Folgenden Ihren Indexer aus der Liste.",
|
||||
"Proxies": "Proxies",
|
||||
"Proxy": "Proxy",
|
||||
@@ -395,7 +395,7 @@
|
||||
"TestAllClients": "Prüfe alle Clients",
|
||||
"TestAllIndexers": "Prüfe alle Indexer",
|
||||
"OnLatestVersion": "Die neueste Version von {appName} ist bereits installiert",
|
||||
"ThemeHelpText": "Ändere das UI-Theme der Anwendung. Das 'Auto'-Theme verwendet dein Betriebssystem-Theme, um den hellen oder dunklen Modus einzustellen. Inspiriert von {0}",
|
||||
"ThemeHelpText": "Ändere das UI-Design der Anwendung, das 'Auto'-Design verwendet das Betriebssystem-Design, um den Hell- oder Dunkelmodus festzulegen. Inspiriert von {inspiredBy}.",
|
||||
"Time": "Zeit",
|
||||
"Title": "Titel",
|
||||
"Today": "Heute",
|
||||
@@ -406,7 +406,7 @@
|
||||
"Type": "Typ",
|
||||
"UI": "Oberfläche",
|
||||
"UILanguage": "Oberflächen Sprache ( UI Language )",
|
||||
"UILanguageHelpText": "Sprache für die gesamte Oberfläche",
|
||||
"UILanguageHelpText": "Sprache, die {appName} für die Benutzeroberfläche verwenden wird",
|
||||
"UILanguageHelpTextWarning": "Webseite muss neu geladen werden",
|
||||
"UISettings": "Benutzeroberflächen Einstellungen",
|
||||
"UISettingsSummary": "Optionen für Datum, Sprache und Farbbeinträchtigungen",
|
||||
@@ -461,7 +461,7 @@
|
||||
"ApplyChanges": "Änderungen anwenden",
|
||||
"CountIndexersSelected": "{count} Indexer ausgewählt",
|
||||
"DeleteSelectedDownloadClients": "Lösche Download Client(s)",
|
||||
"DeleteSelectedApplicationsMessageText": "Indexer '{0}' wirklich löschen?",
|
||||
"DeleteSelectedApplicationsMessageText": "Bist du sicher, dass du {count} ausgewählte Anwendung(en) löschen möchtest?",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Sind Sie sicher, dass Sie {count} ausgewählte Download-Clients löschen möchten?",
|
||||
"DeleteSelectedIndexersMessageText": "Sind Sie sicher, dass Sie {count} ausgewählte(n) Indexer löschen möchten?",
|
||||
"EditSelectedDownloadClients": "Ausgewählte Download Clienten bearbeiten",
|
||||
@@ -518,7 +518,7 @@
|
||||
"ActiveApps": "Aktive Apps",
|
||||
"ActiveIndexers": "Aktive Indexer",
|
||||
"AppsMinimumSeeders": "Apps Mindestanzahl von Seedern",
|
||||
"ApplicationTagsHelpText": "Synchronisiere Indexer für diese Anwendung die keine passenden Tags oder mindestens 1 passendes Tag haben",
|
||||
"ApplicationTagsHelpText": "Indexer mit dieser Anwendung synchronisieren, die mindestens einen übereinstimmenden Tag haben. Wenn hier keine Tags aufgeführt sind, wird kein Indexer aufgrund seiner Tags von der Synchronisierung ausgeschlossen.",
|
||||
"ApplicationTagsHelpTextWarning": "Tags sollten mit Vorsicht verwendet werden, da sie ungewollte Effekte haben können. Eine Anwendung mit einem Tag synchronisiert nur Indexer die den Gleichen Tag haben.",
|
||||
"AddApplicationImplementation": "Anwendung hinzufügen - {implementationName}",
|
||||
"AddConnectionImplementation": "Verbindung hinzufügen - {implementationName}",
|
||||
@@ -670,5 +670,141 @@
|
||||
"SeedRatio": "Seed-Verhältnis",
|
||||
"SeedTime": "Seed-Zeit",
|
||||
"ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Wenn ein Torrent durch einen Hash blockiert wird, wird er möglicherweise nicht korrekt abgelehnt während RSS/Recherche für einige Indexer. Diese Option aktiviert die Ablehnung des Torrents nach dem Abrufen, aber bevor er an den Client gesendet wird.",
|
||||
"IndexerHDBitsSettingsOriginsHelpText": "Wenn nicht angegeben, werden alle Optionen verwendet."
|
||||
"IndexerHDBitsSettingsOriginsHelpText": "Wenn nicht angegeben, werden alle Optionen verwendet.",
|
||||
"IndexerSettingsGrabLimit": "Grab-Limit",
|
||||
"IndexerBeyondHDSettingsLimitedOnlyHelpText": "Nur nach Freeleech suchen (Begrenztes UL)",
|
||||
"IndexerFileListSettingsPasskeyHelpText": "Site Passkey (Dies ist die alphanumerische Zeichenfolge in der Tracker-URL, die in deinem Download-Client angezeigt wird)",
|
||||
"IndexerIPTorrentsSettingsCookieUserAgent": "Cookie-Benutzer-Agent",
|
||||
"DownloadClientSettingsDefaultCategorySubFolderHelpText": "Standard-Fallback-Kategorie, wenn für eine Veröffentlichung keine zugeordnete Kategorie existiert. Das Hinzufügen einer für {appName} spezifischen Kategorie vermeidet Konflikte mit nicht verwandten {appName}-Downloads. Die Verwendung einer Kategorie ist optional, aber dringend empfohlen. Eine [Kategorie]-Unterverzeichnis wird im Ausgabeverzeichnis erstellt.",
|
||||
"IndexerBeyondHDSettingsRssKeyHelpText": "RSS-Schlüssel von der Website (zu finden unter Mein Sicherheitsbereich => RSS-Schlüssel)",
|
||||
"IndexerHDBitsSettingsUseFilenamesHelpText": "Aktiviere diese Option, wenn du Torrent-Dateinamen als Releasetitel verwenden möchtest",
|
||||
"IndexerSettingsAppsMinimumSeedersHelpText": "Minimale benötigte Seeder von den Anwendungen, damit der Indexer greifen kann; leer ist die Standardeinstellung des Sync-Profils",
|
||||
"IndexerGazelleGamesSettingsApiKeyHelpText": "API-Schlüssel von der Seite (Zu finden unter Einstellungen => Zugriffseinstellungen)",
|
||||
"IndexerPassThePopcornSettingsApiUserHelpText": "Diese Einstellungen findest du in deinen PassThePopcorn-Sicherheitseinstellungen (Profil bearbeiten > Sicherheit).",
|
||||
"IndexerSettingsQueryLimitHelpText": "Die maximale Anzahl an Queries, die {appName} der Seite gemäß der jeweiligen Einheit erlauben wird",
|
||||
"IndexerRedactedSettingsApiKeyHelpText": "API-Schlüssel von der Seite (Zu finden unter Einstellungen => Zugriffseinstellungen)",
|
||||
"IndexerSettingsQueryLimit": "Query Limit",
|
||||
"PackSeedTimeHelpText": "Die Zeit, die ein Pack (Season oder Diskographie)-Torrent gesät werden soll, bevor er gestoppt wird. Leer ist die Standardeinstellung der App",
|
||||
"TotalIndexerSuccessfulGrabs": "Gesamtanzahl erfolgreicher Indexer-Suchanfragen",
|
||||
"ProwlarrDownloadClientsInAppOnlyAlert": "Download-Clients sind nur für In-App-Suchen in {appName} und synchronisieren sich nicht mit Apps. Es sind keine Pläne vorgesehen, eine solche Funktionalität hinzuzufügen.",
|
||||
"TotalUserAgentGrabs": "Gesamtanzahl der User-Agent-Grabs",
|
||||
"DefaultCategory": "Standardkategorie",
|
||||
"IndexerDownloadClientHelpText": "Gib an, welcher Download-Client für Grab-Vorgänge, die innerhalb von {appName} von diesem Indexer durchgeführt werden, verwendet wird",
|
||||
"IndexerHistoryLoadError": "Fehler beim Laden der Indexer-Historie",
|
||||
"IndexerNzbIndexSettingsApiKeyHelpText": "Website-API-Key",
|
||||
"IndexerPassThePopcornSettingsApiKeyHelpText": "Website-API-Key",
|
||||
"IndexerPassThePopcornSettingsGoldenPopcornOnlyHelpText": "Sucher nur Golden Popcorn Releases",
|
||||
"IndexerSettingsCookieHelpText": "Website Cookie",
|
||||
"IndexerSettingsPackSeedTimeIndexerHelpText": "Die Zeit, die ein Pack (Season oder Diskographie)-Torrent gesät werden soll, bevor er gestoppt wird. Leer ist die Standardeinstellung der App",
|
||||
"SearchAllIndexers": "Alle Indexer durchsuchen",
|
||||
"SearchCountIndexers": "Suche {count} Indexer(s)",
|
||||
"SeedTimeHelpText": "Die Zeit, die ein Torrent gesät werden soll, bevor er gestoppt wird. Leer ist die Standardeinstellung der App",
|
||||
"IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Suche nur Freeleech-Releases",
|
||||
"IndexerNewznabSettingsVipExpirationHelpText": "Gib das Datum (yyyy-mm-dd) für das VIP-Ablaufdatum ein oder lasse es leer, {appName} benachrichtigt eine Woche vor Ablauf des VIP",
|
||||
"ProxyValidationUnableToConnect": "Kann nicht mit dem Proxy verbunden werden: {exceptionMessage}. Überprüfe das Protokoll rund um diesen Fehler für Details",
|
||||
"IndexerId": "Indexer ID",
|
||||
"OnGrabHelpText": "Bei Release Grab",
|
||||
"AuthQueries": "Authentifizierungsanfragen",
|
||||
"PackSeedTime": "Pack-Seed-Zeit",
|
||||
"DeleteSelectedApplications": "Ausgewählte Anwendungen löschen",
|
||||
"DownloadClientSettingsDefaultCategoryHelpText": "Standard-Fallback-Kategorie, wenn für eine Veröffentlichung keine zugeordnete Kategorie existiert. Das Hinzufügen einer für {appName} spezifischen Kategorie vermeidet Konflikte mit nicht verwandten {appName}-Downloads. Die Verwendung einer Kategorie ist optional, aber dringend empfohlen.",
|
||||
"FoundCountReleases": "{itemCount} Veröffentlichungen gefunden",
|
||||
"IncludeManualGrabsHelpText": "Manuelle Abrufe, die innerhalb von {appName} gemacht wurden, einbeziehen",
|
||||
"IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Nur nach Freeleech-Veröffentlichungen suchen",
|
||||
"IndexerBeyondHDSettingsApiKeyHelpText": "API-Schlüssel von der Website (zu finden in „Meine Sicherheit“ => „API-Schlüssel“)",
|
||||
"IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Nur nach Freeleech-Releases suchen",
|
||||
"IndexerBeyondHDSettingsRefundOnlyHelpText": "Nur nach Rückerstattungen suchen",
|
||||
"IndexerDisabled": "Indexer deaktiviert",
|
||||
"IndexerFileListSettingsFreeleechOnlyHelpText": "Suche nur Freeleech-Releases",
|
||||
"IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Suche Veröffentlichungen nach Gruppennamen",
|
||||
"IndexerNebulanceSettingsApiKeyHelpText": "API-Schlüssel aus den Benutzereinstellungen > API-Schlüssel. Der Schlüssel muss List- und Download-Berechtigungen haben",
|
||||
"IndexerSettingsGrabLimitHelpText": "Die maximale Anzahl an Grabs, die {appName} der Seite erlauben wird, wie von der jeweiligen Einheit festgelegt",
|
||||
"IndexerSettingsLimitsUnit": "Limits-Einheit",
|
||||
"IndexerSettingsLimitsUnitHelpText": "Die Zeiteinheit zur Berechnung der Limits pro Indexer",
|
||||
"IndexerStatus": "Indexer Status",
|
||||
"LastFailure": "Letzter Fehler",
|
||||
"ManageApplications": "Applikationen verwalten",
|
||||
"NoApplicationsFound": "Keine Applikationen gefunden",
|
||||
"NoIndexerCategories": "Keine Kategorien für diesen Indexer gefunden",
|
||||
"NoIndexerHistory": "Keine Historie für diesen Indexer gefunden",
|
||||
"Open": "Offen",
|
||||
"OverrideAndAddToDownloadClient": "Überschreiben und zum Download-Client hinzufügen",
|
||||
"PreferMagnetUrl": "Magnet URL bevorzugen",
|
||||
"PreferMagnetUrlHelpText": "Wenn aktiviert, wird dieser Indexer die Verwendung von Magnet-URLs für Grabs bevorzugen, mit Rückfall auf Torrent-Links",
|
||||
"RssQueries": "RSS Anfragen",
|
||||
"TotalHostGrabs": "Gesamtanzahl der Host-Grabs",
|
||||
"TotalHostQueries": "Gesamtanzahl der Host-Suchanfragen",
|
||||
"SeedRatioHelpText": "Das Verhältnis, das ein Torrent erreichen sollte, bevor er gestoppt wird. Leer ist die Standardeinstellung der App",
|
||||
"AverageGrabs": "Durchschnittliche Abrufe",
|
||||
"AverageQueries": "Durchschnittliche Anfragen",
|
||||
"SelectedCountOfCountReleases": "Ausgewählt {selectedCount} von {itemCount} Releases",
|
||||
"NewznabUrl": "Newznab Url",
|
||||
"QueryType": "Abfragetyp",
|
||||
"DisabledUntil": "Deaktiviert bis",
|
||||
"MappedCategories": "Zuordnete Kategorien",
|
||||
"AreYouSureYouWantToDeleteIndexer": "Bist du sicher, dass du „{name}“ aus {appName} löschen möchtest?",
|
||||
"TotalIndexerQueries": "Gesamtanzahl der Indexer-Suchanfragen",
|
||||
"ProwlarrDownloadClientsAlert": "Wenn du beabsichtigst, direkt innerhalb von {appName} zu suchen, musst du Download-Clients hinzufügen. Andernfalls musst du sie hier nicht hinzufügen. Für Suchen aus deinen Apps werden stattdessen die dort konfigurierten Download-Clients verwendet.",
|
||||
"AppsMinimumSeedersHelpText": "Mindestanzahl an Seedern, die von der Anwendung für den Indexer erforderlich ist, um herunterzuladen. Leer bedeutet, dass das Standardprofil der Synchronisierung verwendet wird",
|
||||
"CountIndexersAvailable": "{count} Indexer verfügbar",
|
||||
"DeleteClientCategory": "Download-Client-Kategorie löschen",
|
||||
"DeleteSelectedIndexer": "Ausgewählten Indexer löschen",
|
||||
"TotalGrabs": "Gesamtanzahl der Grabs",
|
||||
"DownloadClientCategory": "Download-Client-Kategorie",
|
||||
"EditCategory": "Kategorie bearbeiten",
|
||||
"IndexerSettingsApiUser": "API Benutzer",
|
||||
"RssFeed": "RSS Feed",
|
||||
"InitialFailure": "Initialer Fehler",
|
||||
"ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Blockierte Torrent-Hashes beim Abrufen synchron ablehnen",
|
||||
"DeleteSelectedIndexers": "Ausgewählte Indexer löschen",
|
||||
"IndexerHDBitsSettingsPasskeyHelpText": "Passkey aus den Benutzerdetails",
|
||||
"IndexerSettingsPasskey": "Pass Key",
|
||||
"ClickToChangeQueryOptions": "Klicken, um Abfrageoptionen zu ändern",
|
||||
"IndexerCategories": "Indexer-Kategorien",
|
||||
"SearchQueries": "Suchanfragen",
|
||||
"IndexerAlphaRatioSettingsExcludeScene": "SCENE ausschließen",
|
||||
"IndexerAlphaRatioSettingsExcludeSceneHelpText": "SCENE-Veröffentlichungen aus den Ergebnissen ausschließen",
|
||||
"IndexerBeyondHDSettingsRefundOnly": "Nur Rückerstattung",
|
||||
"IndexerFileListSettingsUsernameHelpText": "Website-Benutzername",
|
||||
"IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Muss Benutzer- und Torrents-Berechtigungen haben",
|
||||
"IndexerHDBitsSettingsFreeleechOnlyHelpText": "Zeige nur Freeleech-Releases",
|
||||
"IndexerHDBitsSettingsUsernameHelpText": "Webseite-Benutzername",
|
||||
"IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Suche nur Freeleech-Releases",
|
||||
"IndexerNewznabSettingsApiKeyHelpText": "Website API Key",
|
||||
"IndexerOrpheusSettingsApiKeyHelpText": "API-Schlüssel von der Seite (Zu finden unter Einstellungen => Zugriffseinstellungen)",
|
||||
"IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "Suche nur Freeleech-Releases",
|
||||
"IndexerTorrentSyndikatSettingsApiKeyHelpText": "Website-API-Schlüssel",
|
||||
"AreYouSureYouWantToDeleteCategory": "Bist du sicher, dass du die zugeordnete Kategorie löschen möchtest?",
|
||||
"DownloadClientSettingsPriorityItemHelpText": "Priorität, die beim Abrufen von Elementen verwendet werden soll",
|
||||
"GoToApplication": "Zur Anwendung gehen",
|
||||
"HistoryDetails": "Historie-Details",
|
||||
"IndexerBeyondHDSettingsLimitedOnly": "Nur begrenzt",
|
||||
"IndexerHDBitsSettingsOrigins": "Ursprünge",
|
||||
"IndexerHDBitsSettingsUseFilenames": "Verwende Dateinamen",
|
||||
"IndexerIPTorrentsSettingsCookieUserAgentHelpText": "User-Agent, der mit dem Cookie aus dem Browser verwendet wird",
|
||||
"IndexerNewznabSettingsAdditionalParametersHelpText": "Zusätzliche Newznab-Parameter",
|
||||
"IndexerSettingsPackSeedTime": "Pack-Seed-Zeit",
|
||||
"IndexerSettingsRssKey": "RSS Schlüssel",
|
||||
"IndexerMTeamTpSettingsApiKeyHelpText": "API-Schlüssel von der Seite (Zu finden im Benutzersteuerungsfeld => Sicherheit => Labor)",
|
||||
"IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Suche nur Freeleech-Releases",
|
||||
"IndexerSettingsFreeleechOnly": "Nur Freeleech",
|
||||
"IndexerSettingsPreferMagnetUrl": "Magnet-URL bevorzugen",
|
||||
"IndexerSettingsPreferMagnetUrlHelpText": "Wenn aktiviert, bevorzugt dieser Indexer die Verwendung von Magnet-URLs für Grabs mit Rückfall auf Torrent-Links",
|
||||
"TorznabUrl": "Torznab Url",
|
||||
"IndexerPassThePopcornSettingsGoldenPopcornOnly": "Nur Golden Popcorn",
|
||||
"IndexerSettingsBaseUrl": "Basis Url",
|
||||
"IndexerAvistazSettingsFreeleechOnlyHelpText": "Nur nach Freeleech-Veröffentlichungen suchen",
|
||||
"IndexerAvistazSettingsPasswordHelpText": "Website-Passwort",
|
||||
"IndexerAvistazSettingsPidHelpText": "PID aus der „Mein Konto“- oder „Mein Profil“-Seite",
|
||||
"IndexerAvistazSettingsUsernameHelpText": "Website-Benutzername",
|
||||
"IndexerAvistazSettingsUsernameHelpTextWarning": "Nur Mitglieder mit Rang „Mitglied“ und höher können die API auf diesem Indexer nutzen.",
|
||||
"IndexerBeyondHDSettingsRewindOnly": "Nur zurückspulen",
|
||||
"IndexerBeyondHDSettingsRewindOnlyHelpText": "Nur Rückwärtssuche",
|
||||
"IndexerBeyondHDSettingsSearchTypesHelpText": "Wähle die Arten von Veröffentlichungen aus, die dich interessieren. Wenn keine ausgewählt sind, werden alle Optionen verwendet.",
|
||||
"IndexerFailureRate": "Indexer-Fehlerrate",
|
||||
"IndexerGazelleGamesSettingsSearchGroupNames": "Suche Gruppennamen",
|
||||
"IndexerSettingsBaseUrlHelpText": "Wähle die Basis-Url aus, die {appName} für Anfragen an die Seite verwenden soll",
|
||||
"RepeatSearch": "Suche wiederholen",
|
||||
"AverageResponseTimesMs": "Durchschnittliche Indexer-Antwortzeiten (ms)",
|
||||
"BasicSearch": "Einfache Suche"
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -1 +1,4 @@
|
||||
{}
|
||||
{
|
||||
"ApiKey": "کلید API",
|
||||
"NetCore": ".NET"
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
"SettingsTimeFormat": "Kellonajan esitys",
|
||||
"Message": "Viesti",
|
||||
"Seeders": "Jakajat",
|
||||
"TestAll": "Kaikkien testaus",
|
||||
"TestAll": "Koesta kaikki",
|
||||
"AddDownloadClient": "Lisää latauspalvelu",
|
||||
"CustomFilters": "Omat suodattimet",
|
||||
"DeleteTag": "Poista tunniste",
|
||||
@@ -88,7 +88,7 @@
|
||||
"Logs": "Lokitiedot",
|
||||
"Mechanism": "Mekanismi",
|
||||
"Name": "Nimi",
|
||||
"NoLinks": "Ei linkkejä",
|
||||
"NoLinks": "Kytköksiä ei ole",
|
||||
"Peers": "Vertaiset",
|
||||
"Presets": "Esiasetukset",
|
||||
"Priority": "Painotus",
|
||||
@@ -121,8 +121,8 @@
|
||||
"TagIsNotUsedAndCanBeDeleted": "Tunniste ei ole käytössä ja voidaan poistaa.",
|
||||
"TagsSettingsSummary": "Täältä näet kaikki tunnisteet käyttökohteineen ja voit poistaa käyttämättömät tunnisteet.",
|
||||
"Tasks": "Tehtävät",
|
||||
"Test": "Testaa",
|
||||
"TestAllClients": "Koesta latauspalvelut",
|
||||
"Test": "Koesta",
|
||||
"TestAllClients": "Koesta palvelut",
|
||||
"Time": "Aika",
|
||||
"Title": "Nimike",
|
||||
"Tomorrow": "Huomenna",
|
||||
@@ -130,11 +130,11 @@
|
||||
"Torrents": "Torrentit",
|
||||
"Type": "Tyyppi",
|
||||
"UILanguage": "Käyttöliittymän kieli",
|
||||
"UnableToAddANewApplicationPleaseTryAgain": "Uuden sovelluksen lisäys epäonnistui. Yritä uudelleen.",
|
||||
"UnableToAddANewApplicationPleaseTryAgain": "Virhe lisättäessä sovellusta. Yritä uudelleen.",
|
||||
"UnableToAddANewIndexerPleaseTryAgain": "Uuden hakupalvelun lisääminen epäonnistui. Yritä uudelleen.",
|
||||
"UnableToAddANewIndexerProxyPleaseTryAgain": "Uuden tiedonhaun välityspalvelimen lisäys epäonnistui. Yritä uudelleen.",
|
||||
"BackupsLoadError": "Varmuuskopioinnin lataus epäonnistui",
|
||||
"DownloadClientsLoadError": "Latauspalveluiden lataus epäonnistui",
|
||||
"UnableToAddANewIndexerProxyPleaseTryAgain": "Virhe lisättäessä tiedonhaun välityspalvelinta. Yritä uudelleen.",
|
||||
"BackupsLoadError": "Virhe ladattaessa varmuuskopioita.",
|
||||
"DownloadClientsLoadError": "Virhe ladattaessa latauspalveluita.",
|
||||
"UnableToLoadGeneralSettings": "Yleisasetusten lataus epäonnistui",
|
||||
"UpdateAutomaticallyHelpText": "Lataa ja asenna päivitykset automaattisesti. Voit myös edelleen suorittaa asennuksen järjestelmäasetusten päivitykset-osiosta.",
|
||||
"Added": "Lisäysaika",
|
||||
@@ -168,10 +168,10 @@
|
||||
"Sort": "Järjestys",
|
||||
"UnableToAddANewDownloadClientPleaseTryAgain": "Latauspalvelun lisääminen epäonnistui. Yritä uudelleen.",
|
||||
"AppDataLocationHealthCheckMessage": "Päivityksiä ei sallita, jotta AppData-kansion poistaminen päivityksen yhteydessä voidaan estää",
|
||||
"UnableToLoadHistory": "Historian lataus epäonnistui",
|
||||
"UnableToLoadNotifications": "Ilmoituspalveluiden lataus epäonnistui",
|
||||
"UnableToLoadTags": "Tunnisteiden lataus epäonnistui",
|
||||
"UnableToLoadUISettings": "Käyttöliittymäasetusten lataus epäonnistui",
|
||||
"UnableToLoadHistory": "Virhe ladattaessa historiaa.",
|
||||
"UnableToLoadNotifications": "Virhe ladattaessa ilmoituspalveluita.",
|
||||
"UnableToLoadTags": "Virhe ladattaessa tunnisteita.",
|
||||
"UnableToLoadUISettings": "Virhe ladattaessa käyttöliittymäasetuksia.",
|
||||
"UnsavedChanges": "Muutoksia ei ole tallennettu",
|
||||
"Yesterday": "Eilen",
|
||||
"ConnectionLost": "Yhteys menetettiin",
|
||||
@@ -209,7 +209,7 @@
|
||||
"TableOptions": "Taulukkonäkymän asetukset",
|
||||
"TableOptionsColumnsMessage": "Valitse näytettävät sarakkeet ja niiden järjestys",
|
||||
"TagsHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille hakupalveluille.",
|
||||
"UnableToAddANewAppProfilePleaseTryAgain": "Uuden sovellusprofiilin lisäys epäonnistui. Yritä uudelleen.",
|
||||
"UnableToAddANewAppProfilePleaseTryAgain": "Virhe lisättäessä sovellusprofiilia. Yritä uudelleen.",
|
||||
"UnableToAddANewNotificationPleaseTryAgain": "Ilmoituspalvelun lisääminen epäonnistui. Yritä uudelleen.",
|
||||
"Version": "Versio",
|
||||
"View": "Näkymä",
|
||||
@@ -232,7 +232,7 @@
|
||||
"Cancel": "Peruuta",
|
||||
"CancelPendingTask": "Haluatko varmasti perua odottavan tehtävän?",
|
||||
"CertificateValidation": "Varmenteen vahvistus",
|
||||
"CertificateValidationHelpText": "Muuta HTTPS-varmennevahvistuksen tarkkuutta. Älä muuta, jollet ymmärrä tähän liittyviä riskejä.",
|
||||
"CertificateValidationHelpText": "Määritä HTTPS-varmennevahvistuksen tiukkuus. Älä muuta, jos et ymmärrä riskejä.",
|
||||
"ChangeHasNotBeenSavedYet": "Muutosta ei ole vielä tallennettu",
|
||||
"Clear": "Tyhjennä",
|
||||
"CloneProfile": "Monista profiili",
|
||||
@@ -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",
|
||||
@@ -324,7 +324,7 @@
|
||||
"UISettingsSummary": "Kalenterin, päiväyksen ja kellonajan sekä kielen ja heikentyneelle värinäölle sopivan tilan asetukset.",
|
||||
"SettingsIndexerLoggingHelpText": "Kirjaa tarkempia tietoja hakupalveluiden toiminnasta, mukaanlukien vastaukset",
|
||||
"IndexerTagsHelpText": "Tunnisteilla voit kohdistaa tiedonhaun välityspalvelimia ja määrittää mihin sovelluksiin ne synkronoidaan.",
|
||||
"UnableToLoadAppProfiles": "Sovellusprofiilien lataus epäonnistui",
|
||||
"UnableToLoadAppProfiles": "Virhe ladattaessa sovellusprofiileja.",
|
||||
"AppProfileSelectHelpText": "Sovellusprofiilieilla määritetään hakupalvelulle sovellussynkronoinnin yhteydessä aktivoitavat hakutavat (RSS/automaatti/manuaali).",
|
||||
"IndexerQuery": "Hakupalvelukysely",
|
||||
"IndexerRss": "Hakupalvelun RSS",
|
||||
@@ -338,8 +338,8 @@
|
||||
"SyncLevel": "Synkronoinnin laajuus",
|
||||
"SyncLevelAddRemove": "Vain lisäys/poisto: Kun {appName}in hakupalveluita lisätään tai poistetaan, päivittyy myös tämä etäsovellus.",
|
||||
"SyncAppIndexers": "Synkronoi sovelluksiin",
|
||||
"TestAllApps": "Testaa kaikki sovellukset",
|
||||
"UnableToLoadIndexerProxies": "Tiedonhaun välityspalvelinten lataus epäonnistui",
|
||||
"TestAllApps": "Koesta sovellukset",
|
||||
"UnableToLoadIndexerProxies": "Virhe ladattaessa tiedonhaun välityspalvelimia.",
|
||||
"AddedToDownloadClient": "Julkaisu lisättiin latauspalveluun",
|
||||
"AddNewIndexer": "Lisää uusi hakupalvelu",
|
||||
"AddToDownloadClient": "Lisää julkaisu latauspalveluun",
|
||||
@@ -369,12 +369,12 @@
|
||||
"EnableRssHelpText": "Käytä hakupalvelulle RSS-syötettä.",
|
||||
"DeleteApplication": "Poista sovellus",
|
||||
"DeleteAppProfile": "Poista sovellusprofiili",
|
||||
"IndexerProxies": "Tiedonhaun välityspalvelimet",
|
||||
"IndexerProxies": "Hakupalveluiden välityspalvelimet",
|
||||
"IndexerAuth": "Hakupalvelun todennus",
|
||||
"Notifications": "Ilmoituspalvelut",
|
||||
"NotificationTriggersHelpText": "Valitse ilmoituksen laukaisevat tapahtumat.",
|
||||
"Stats": "Tilastot",
|
||||
"UnableToLoadDevelopmentSettings": "Kehittäjäasetusten lataus epäonnistui",
|
||||
"UnableToLoadDevelopmentSettings": "Virhe ladattaessa kehittäjäasetuksia.",
|
||||
"AppSettingsSummary": "Sovellukset ja asetukset, joilla määritetään miten {appName} viestii PVR-sovellustesi kanssa.",
|
||||
"Privacy": "Yksityisyys",
|
||||
"NetCore": ".NET",
|
||||
@@ -389,7 +389,7 @@
|
||||
"OnHealthIssue": "Vakausongelmat",
|
||||
"HistoryCleanupDaysHelpText": "Poista automaattinen tyhjennys käytöstä asettamalla arvoksi 0.",
|
||||
"HistoryCleanupDaysHelpTextWarning": "Tässä määritettyä aikaa vanhemmat tiedostot poistetaan automaattisesti roskakorista pysyvästi.",
|
||||
"TestAllIndexers": "Koesta hakupalvelut",
|
||||
"TestAllIndexers": "Koesta palvelut",
|
||||
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent-tiedon ilmoitti rajapinnan kanssa viestinyt sovellus.",
|
||||
"Categories": "Kategoriat",
|
||||
"Database": "Tietokanta",
|
||||
@@ -402,7 +402,7 @@
|
||||
"Proxies": "Välityspalvelimet",
|
||||
"Public": "Julkinen",
|
||||
"SemiPrivate": "Osittain yksityinen",
|
||||
"ApplicationsLoadError": "Sovelluslistan lataus epäonnistui",
|
||||
"ApplicationsLoadError": "Virhe ladattaessa sovelluslistaa.",
|
||||
"Url": "URL",
|
||||
"Website": "Verkkosivusto",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Hakupalveluiden määritykset puuttuvat, eivätkä ne toimi: {indexerNames}. Poista tai lisää ne {appName}iin uudelleen.",
|
||||
@@ -412,7 +412,7 @@
|
||||
"GrabReleases": "Kaappaa julkaisu(t)",
|
||||
"Link": "Linkki",
|
||||
"SearchTypes": "Etsittävät tyypit",
|
||||
"UnableToLoadIndexers": "Hakupalveluiden lataus epäonnistui",
|
||||
"UnableToLoadIndexers": "Virhe ladattaessa hakupalveluita.",
|
||||
"Yes": "Kyllä",
|
||||
"MappedDrivesRunningAsService": "Yhdistetyt verkkoasemat eivät ole käytettävissä kun sovellus suoritetaan Windows-palveluna. Saat lisätietoja UKK:sta.",
|
||||
"No": "Ei",
|
||||
@@ -501,13 +501,13 @@
|
||||
"TotalIndexerSuccessfulGrabs": "Onnistuneiden hakupalvelukaappausten kokonaismäärä",
|
||||
"AppUpdated": "{appName} on päivitetty",
|
||||
"AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on käynnistettävä uudelleen.",
|
||||
"IndexerDownloadClientHelpText": "Määritä {appName}issa tästä hakupalvelusta tehdyille kaappauksille käytettävä latauspalvelu.",
|
||||
"IndexerDownloadClientHelpText": "Määritä {appName}in käyttöliittymässä tästä hakupalvelusta kaapattaessa käytettävä latauspalvelu.",
|
||||
"AuthenticationRequiredWarning": "Etäkäytön estämiseksi ilman tunnistautumista {appName} vaatii nyt tunnistautumisen käyttöönoton. Paikallisilta osoitteilta se voidaan valinnaisesti poistaa käytöstä.",
|
||||
"TotalGrabs": "Kaappausten kokonaismäärä",
|
||||
"AddDownloadClientImplementation": "Lisätään latauspalvelua – {implementationName}",
|
||||
"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}",
|
||||
@@ -668,7 +668,7 @@
|
||||
"DownloadClientFreeboxSettingsPortHelpText": "Freebox-liittymän portti. Oletus on {port}.",
|
||||
"DownloadClientPneumaticSettingsNzbFolder": "NZB-kansio",
|
||||
"DownloadClientQbittorrentSettingsSequentialOrder": "Peräkkäinen järjestys",
|
||||
"CustomFilter": "Mukautettu suodatin",
|
||||
"CustomFilter": "Oma suodatin",
|
||||
"DownloadClientFreeboxSettingsAppIdHelpText": "Freebox-rajapinnan käyttöoikeutta määritettäessä käytettävä App ID -sovellustunniste.",
|
||||
"DownloadClientFreeboxSettingsAppToken": "Sovellustietue",
|
||||
"DownloadClientNzbgetSettingsAddPausedHelpText": "Tämä vaatii vähintään NzbGetin version 16.0.",
|
||||
|
||||
@@ -384,7 +384,7 @@
|
||||
"HistoryCleanupDaysHelpTextWarning": "Les fichiers dans la corbeille plus anciens que le nombre de jours sélectionné seront nettoyés automatiquement",
|
||||
"OnGrab": "Récupéré à la sortie",
|
||||
"OnHealthIssue": "Lors de problème de santé",
|
||||
"TestAllIndexers": "Testez tous les indexeurs",
|
||||
"TestAllIndexers": "Tester tous les indexeurs",
|
||||
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent fourni par l'application qui a appelé l'API",
|
||||
"Database": "Base de données",
|
||||
"HistoryCleanup": "Nettoyage de l'historique",
|
||||
|
||||
@@ -417,5 +417,11 @@
|
||||
"UsenetBlackholeNzbFolder": "Nzb 폴더",
|
||||
"UseSsl": "SSL 사용",
|
||||
"TorrentBlackholeTorrentFolder": "토렌트 폴더",
|
||||
"DownloadClientPneumaticSettingsNzbFolder": "Nzb 폴더"
|
||||
"DownloadClientPneumaticSettingsNzbFolder": "Nzb 폴더",
|
||||
"UserAgentProvidedByTheAppThatCalledTheAPI": "API를 호출한 앱에서 제공하는 사용자 에이전트",
|
||||
"days": "일",
|
||||
"minutes": "분",
|
||||
"Author": "저작자",
|
||||
"Categories": "카테고리",
|
||||
"SeedRatio": "종자 비율"
|
||||
}
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
"DownloadClientStatusAllClientHealthCheckMessage": "Todos os clientes de download estão indisponíveis devido a falhas",
|
||||
"DownloadClientStatusSingleClientHealthCheckMessage": "Clientes de download indisponíveis devido a falhas: {downloadClientNames}",
|
||||
"DownloadClients": "Clientes de download",
|
||||
"DownloadClientsSettingsSummary": "Configuração de clientes de download para integração com a pesquisa da interface do usuário do {appName}",
|
||||
"DownloadClientsSettingsSummary": "Configuração de clientes de download para integração com a pesquisa da interface do {appName}",
|
||||
"Duration": "Duração",
|
||||
"Edit": "Editar",
|
||||
"EditIndexer": "Editar Indexador",
|
||||
@@ -204,7 +204,7 @@
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Os indexadores não têm definição e não funcionarão: {indexerNames}. Remova e (ou) adicione novamente ao {appName}.",
|
||||
"IndexerObsoleteCheckMessage": "Os seguintes indexadores são obsoletos ou foram atualizados: {0}. Remova-os e/ou adicione-os novamente ao {appName}",
|
||||
"IndexerPriority": "Prioridade do indexador",
|
||||
"IndexerPriorityHelpText": "Prioridade do Indexador de 1 (mais alta) a 50 (mais baixa). Padrão: 25.",
|
||||
"IndexerPriorityHelpText": "Prioridade do indexador, de 1 (mais alta) a 50 (mais baixa). Padrão: 25.",
|
||||
"IndexerProxies": "Proxies do Indexador",
|
||||
"IndexerProxy": "Proxy do Indexador",
|
||||
"IndexerProxyStatusAllUnavailableHealthCheckMessage": "Todos os proxies estão indisponíveis devido a falhas",
|
||||
@@ -248,7 +248,7 @@
|
||||
"MassEditor": "Editor em Massa",
|
||||
"Mechanism": "Mecanismo",
|
||||
"Message": "Mensagem",
|
||||
"MinimumSeeders": "Mínimo de Seeders",
|
||||
"MinimumSeeders": "Mínimo de semeadores",
|
||||
"MinimumSeedersHelpText": "Semeadores mínimos exigidos pelo aplicativo para o indexador baixar",
|
||||
"Mode": "Modo",
|
||||
"More": "Mais",
|
||||
@@ -513,7 +513,7 @@
|
||||
"DeleteSelectedDownloadClients": "Excluir cliente(s) de download",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Tem certeza de que deseja excluir o(s) {count} cliente(s) de download selecionado(s)?",
|
||||
"DeleteSelectedIndexersMessageText": "Tem certeza de que deseja excluir o(s) {count} indexador(es) selecionado(s)?",
|
||||
"DownloadClientPriorityHelpText": "Priorizar vários clientes de download. Usamos um rodízio para clientes com a mesma prioridade.",
|
||||
"DownloadClientPriorityHelpText": "Priorizar vários clientes de download. Usamos uma distribuição equilibrada para clientes com a mesma prioridade.",
|
||||
"EditSelectedDownloadClients": "Editar clientes de download selecionados",
|
||||
"EditSelectedIndexers": "Editar indexadores selecionados",
|
||||
"ManageDownloadClients": "Gerenciar clientes de download",
|
||||
@@ -538,10 +538,10 @@
|
||||
"PackSeedTime": "Tempo de Semente do Pacote",
|
||||
"PackSeedTimeHelpText": "A hora em que um torrent de pacote (temporada ou discografia) deve ser propagado antes de parar, vazio é o padrão do aplicativo",
|
||||
"QueryType": "Tipo de consulta",
|
||||
"SeedTime": "Tempo de Semeação",
|
||||
"SeedTime": "Tempo de semeadura",
|
||||
"SearchAllIndexers": "Pesquisar todos os indexadores",
|
||||
"SearchCountIndexers": "Pesquisar {count} indexador(es)",
|
||||
"SeedRatio": "Proporção de sementes",
|
||||
"SeedRatio": "Proporção de semeadura",
|
||||
"SeedRatioHelpText": "A proporção que um torrent deve atingir antes de parar, vazio é o padrão do aplicativo",
|
||||
"SeedTimeHelpText": "O tempo que um torrent deve ser propagado antes de parar, vazio é o padrão do aplicativo",
|
||||
"SelectedCountOfCountReleases": "{selectedCount} de {itemCount} lançamentos selecionados",
|
||||
@@ -611,7 +611,7 @@
|
||||
"NotificationsEmailSettingsUseEncryptionHelpText": "Se preferir usar criptografia se configurado no servidor, usar sempre criptografia via SSL (somente porta 465) ou StartTLS (qualquer outra porta) ou nunca usar criptografia",
|
||||
"NotificationsEmailSettingsUseEncryption": "Usar Criptografia",
|
||||
"IndexerHDBitsSettingsPasskeyHelpText": "Chave de Acesso dos Detalhes do Usuário",
|
||||
"IndexerSettingsPasskey": "Chave de Acesso",
|
||||
"IndexerSettingsPasskey": "Chave de acesso",
|
||||
"IndexerAlphaRatioSettingsExcludeSceneHelpText": "Excluir lançamentos SCENE dos resultados",
|
||||
"IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Pesquisar lançamentos freeleech somente",
|
||||
"IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Pesquisar lançamentos freeleech somente",
|
||||
@@ -632,7 +632,7 @@
|
||||
"IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Pesquisar lançamentos por nomes de grupos",
|
||||
"IndexerHDBitsSettingsCodecs": "Codecs",
|
||||
"IndexerHDBitsSettingsMediumsHelpText": "se não for especificado, todas as opções serão usadas.",
|
||||
"IndexerHDBitsSettingsOriginsHelpText": "se não for especificado, todas as opções serão usadas.",
|
||||
"IndexerHDBitsSettingsOriginsHelpText": "Se não for especificado, todas as opções serão usadas.",
|
||||
"IndexerHDBitsSettingsUseFilenames": "Usar nomes de arquivos",
|
||||
"IndexerHDBitsSettingsUsernameHelpText": "Nome de Usuário do Site",
|
||||
"IndexerHDBitsSettingsMediums": "Meios",
|
||||
@@ -652,7 +652,7 @@
|
||||
"IndexerSettingsApiUser": "Usuário da API",
|
||||
"IndexerSettingsBaseUrl": "URL Base",
|
||||
"IndexerSettingsCookie": "Cookie",
|
||||
"IndexerSettingsCookieHelpText": "Cookie do Site",
|
||||
"IndexerSettingsCookieHelpText": "Cookie do site",
|
||||
"IndexerSettingsFreeleechOnly": "Só Freeleech",
|
||||
"IndexerSettingsGrabLimit": "Limite de Captura",
|
||||
"IndexerSettingsGrabLimitHelpText": "O número máximo de capturas conforme especificado pela respectiva unidade que {appName} permitirá ao site",
|
||||
@@ -744,7 +744,7 @@
|
||||
"Mixed": "Misturado",
|
||||
"Donate": "Doar",
|
||||
"ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Sincronizar Lista de Bloqueio de Hashes de Torrents Rejeitados Enquanto Baixando",
|
||||
"ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Se um torrent for bloqueado por hash, pode não ser rejeitado corretamente durante o RSS/Pesquisa de alguns indexadores. Ativar isso permitirá que ele seja rejeitado após o torrent ser capturado, mas antes de ser enviado ao cliente.",
|
||||
"ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Se um torrent for bloqueado por hash, pode não ser rejeitado corretamente durante a Sincronização RSS/Pesquisa em alguns indexadores. Ativar isso permitirá que ele seja rejeitado após obter o torrent, mas antes de enviar ao cliente.",
|
||||
"ClickToChangeQueryOptions": "Clique para alterar as opções de consulta",
|
||||
"IndexerMTeamTpSettingsApiKeyHelpText": "Chave API do Site (Encontrada no Painel de Controle do Usuário => Segurança => Laboratório)",
|
||||
"IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Pesquise apenas lançamentos freeleech",
|
||||
|
||||
@@ -444,7 +444,7 @@
|
||||
"DisabledForLocalAddresses": "Dezactivat pentru adresele locale",
|
||||
"None": "Nici unul",
|
||||
"ResetAPIKeyMessageText": "Sigur doriți să vă resetați cheia API?",
|
||||
"AddApplicationImplementation": "Adăugați aplicație - {implementareName}",
|
||||
"AddApplicationImplementation": "Adăugați aplicație - {implementationName}",
|
||||
"AddCategory": "Adăugați categorie",
|
||||
"AddConnection": "Adăugați conexiune",
|
||||
"AddConnectionImplementation": "Adăugați conexiune - {implementationName}",
|
||||
@@ -491,5 +491,13 @@
|
||||
"Stats": "Status",
|
||||
"CurrentlyInstalled": "În prezent instalat",
|
||||
"Mixed": "Fix",
|
||||
"Season": "Motiv"
|
||||
"Season": "Motiv",
|
||||
"ActiveIndexers": "Indexatorii activi",
|
||||
"Any": "Oricare",
|
||||
"AdvancedSettingsShownClickToHide": "Setări avansate afișate, click pentru a le ascunde",
|
||||
"AdvancedSettingsHiddenClickToShow": "Setări avansate ascunse, click pentru afișare",
|
||||
"ApiKeyValidationHealthCheckMessage": "Te rugăm să actualizezi cheia API astfel încât să aibă cel puțin {length} caractere. Poți face acest lucru din setări sau din fișierul de configurare",
|
||||
"AddToDownloadClient": "Adaugă versiunea în clientul de descărcare",
|
||||
"AddSyncProfile": "Adaugă profil de sincronizare",
|
||||
"AddedToDownloadClient": "Versiune adăugată în client"
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"Added": "添加日期",
|
||||
"AddedToDownloadClient": "发布已添加档案到客户端",
|
||||
"AddingTag": "添加标签",
|
||||
"Age": "年龄",
|
||||
"Age": "寿命",
|
||||
"All": "全部",
|
||||
"AllIndexersHiddenDueToFilter": "由于应用了筛选器,所有索引器都被隐藏。",
|
||||
"Analytics": "分析",
|
||||
@@ -735,5 +735,24 @@
|
||||
"PreviouslyInstalled": "上次安装",
|
||||
"FailedToFetchSettings": "设置同步失败",
|
||||
"DownloadClientSettingsPriorityItemHelpText": "抓取内容时优先使用",
|
||||
"IndexerAlphaRatioSettingsExcludeScene": "排除场景"
|
||||
"IndexerAlphaRatioSettingsExcludeScene": "排除场景",
|
||||
"IndexerAlphaRatioSettingsExcludeSceneHelpText": "从结果中排除场景版本",
|
||||
"IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "只搜索免费发布",
|
||||
"IndexerBeyondHDSettingsFreeleechOnlyHelpText": "只搜索免费发布",
|
||||
"IndexerBeyondHDSettingsLimitedOnly": "仅限",
|
||||
"IndexerBeyondHDSettingsApiKeyHelpText": "来自网站的API密钥(在我的安全 => API密钥)",
|
||||
"IndexerAvistazSettingsFreeleechOnlyHelpText": "只搜索免费发布",
|
||||
"IndexerAvistazSettingsPasswordHelpText": "网站密码",
|
||||
"IndexerAvistazSettingsPidHelpText": "我的帐户或个人资料页的PID",
|
||||
"IndexerAvistazSettingsUsernameHelpText": "网站用户名",
|
||||
"IndexerAvistazSettingsUsernameHelpTextWarning": "只有成员级别及以上才能使用此索引器上的API。",
|
||||
"IndexerBeyondHDSettingsLimitedOnlyHelpText": "仅限免费搜索(有限UL)",
|
||||
"IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "只搜索免费发布",
|
||||
"IndexerMTeamTpSettingsFreeleechOnlyHelpText": "只搜索免费发布",
|
||||
"IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "只搜索免费发布",
|
||||
"IndexerHDBitsSettingsUsernameHelpText": "网站用户名",
|
||||
"IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "只搜索免费发布",
|
||||
"IndexerFileListSettingsFreeleechOnlyHelpText": "只搜索免费发布",
|
||||
"IndexerFileListSettingsUsernameHelpText": "网站用户名",
|
||||
"IndexerBeyondHDSettingsRefundOnlyHelpText": "Search refund only"
|
||||
}
|
||||
|
||||
@@ -2,5 +2,6 @@
|
||||
"About": "关于",
|
||||
"Add": "添加",
|
||||
"Analytics": "分析",
|
||||
"Username": "用户名"
|
||||
"Username": "用户名",
|
||||
"AcceptConfirmationModal": "中文"
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using FluentValidation.Results;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Notifications.Discord.Payloads;
|
||||
using NzbDrone.Core.Validation;
|
||||
|
||||
@@ -10,10 +11,12 @@ namespace NzbDrone.Core.Notifications.Discord
|
||||
public class Discord : NotificationBase<DiscordSettings>
|
||||
{
|
||||
private readonly IDiscordProxy _proxy;
|
||||
private readonly IConfigFileProvider _configFileProvider;
|
||||
|
||||
public Discord(IDiscordProxy proxy)
|
||||
public Discord(IDiscordProxy proxy, IConfigFileProvider configFileProvider)
|
||||
{
|
||||
_proxy = proxy;
|
||||
_configFileProvider = configFileProvider;
|
||||
}
|
||||
|
||||
public override string Name => "Discord";
|
||||
@@ -22,18 +25,18 @@ namespace NzbDrone.Core.Notifications.Discord
|
||||
public override void OnGrab(GrabMessage message)
|
||||
{
|
||||
var embed = new Embed
|
||||
{
|
||||
Author = new DiscordAuthor
|
||||
{
|
||||
Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author,
|
||||
IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png"
|
||||
},
|
||||
Title = RELEASE_GRABBED_TITLE,
|
||||
Description = message.Message,
|
||||
Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"),
|
||||
Color = message.Successful ? (int)DiscordColors.Success : (int)DiscordColors.Danger,
|
||||
Fields = new List<DiscordField>()
|
||||
};
|
||||
{
|
||||
Author = new DiscordAuthor
|
||||
{
|
||||
Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author,
|
||||
IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png"
|
||||
},
|
||||
Title = RELEASE_GRABBED_TITLE,
|
||||
Description = message.Message,
|
||||
Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"),
|
||||
Color = message.Successful ? (int)DiscordColors.Success : (int)DiscordColors.Danger,
|
||||
Fields = new List<DiscordField>()
|
||||
};
|
||||
|
||||
foreach (var field in Settings.GrabFields)
|
||||
{
|
||||
@@ -80,81 +83,72 @@ namespace NzbDrone.Core.Notifications.Discord
|
||||
|
||||
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
|
||||
{
|
||||
var attachments = new List<Embed>
|
||||
{
|
||||
new Embed
|
||||
{
|
||||
Author = new DiscordAuthor
|
||||
{
|
||||
Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author,
|
||||
IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png"
|
||||
},
|
||||
Title = healthCheck.Source.Name,
|
||||
Description = healthCheck.Message,
|
||||
Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"),
|
||||
Color = healthCheck.Type == HealthCheck.HealthCheckResult.Warning ? (int)DiscordColors.Warning : (int)DiscordColors.Danger
|
||||
}
|
||||
};
|
||||
var embed = new Embed
|
||||
{
|
||||
Author = new DiscordAuthor
|
||||
{
|
||||
Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author,
|
||||
IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png"
|
||||
},
|
||||
Title = healthCheck.Source.Name,
|
||||
Description = healthCheck.Message,
|
||||
Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"),
|
||||
Color = healthCheck.Type == HealthCheck.HealthCheckResult.Warning ? (int)DiscordColors.Warning : (int)DiscordColors.Danger
|
||||
};
|
||||
|
||||
var payload = CreatePayload(null, attachments);
|
||||
var payload = CreatePayload(null, new List<Embed> { embed });
|
||||
|
||||
_proxy.SendPayload(payload, Settings);
|
||||
}
|
||||
|
||||
public override void OnHealthRestored(HealthCheck.HealthCheck previousCheck)
|
||||
{
|
||||
var attachments = new List<Embed>
|
||||
{
|
||||
new Embed
|
||||
{
|
||||
Author = new DiscordAuthor
|
||||
{
|
||||
Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author,
|
||||
IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png"
|
||||
},
|
||||
Title = "Health Issue Resolved: " + previousCheck.Source.Name,
|
||||
Description = $"The following issue is now resolved: {previousCheck.Message}",
|
||||
Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"),
|
||||
Color = (int)DiscordColors.Success
|
||||
}
|
||||
};
|
||||
var embed = new Embed
|
||||
{
|
||||
Author = new DiscordAuthor
|
||||
{
|
||||
Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author,
|
||||
IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png"
|
||||
},
|
||||
Title = "Health Issue Resolved: " + previousCheck.Source.Name,
|
||||
Description = $"The following issue is now resolved: {previousCheck.Message}",
|
||||
Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"),
|
||||
Color = (int)DiscordColors.Success
|
||||
};
|
||||
|
||||
var payload = CreatePayload(null, attachments);
|
||||
var payload = CreatePayload(null, new List<Embed> { embed });
|
||||
|
||||
_proxy.SendPayload(payload, Settings);
|
||||
}
|
||||
|
||||
public override void OnApplicationUpdate(ApplicationUpdateMessage updateMessage)
|
||||
{
|
||||
var attachments = new List<Embed>
|
||||
{
|
||||
new Embed
|
||||
{
|
||||
Author = new DiscordAuthor
|
||||
{
|
||||
Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author,
|
||||
IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png"
|
||||
},
|
||||
Title = APPLICATION_UPDATE_TITLE,
|
||||
Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"),
|
||||
Color = (int)DiscordColors.Standard,
|
||||
Fields = new List<DiscordField>()
|
||||
{
|
||||
new DiscordField()
|
||||
{
|
||||
Name = "Previous Version",
|
||||
Value = updateMessage.PreviousVersion.ToString()
|
||||
},
|
||||
new DiscordField()
|
||||
{
|
||||
Name = "New Version",
|
||||
Value = updateMessage.NewVersion.ToString()
|
||||
}
|
||||
},
|
||||
}
|
||||
};
|
||||
var embed = new Embed
|
||||
{
|
||||
Author = new DiscordAuthor
|
||||
{
|
||||
Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author,
|
||||
IconUrl = "https://raw.githubusercontent.com/Prowlarr/Prowlarr/develop/Logo/256.png"
|
||||
},
|
||||
Title = APPLICATION_UPDATE_TITLE,
|
||||
Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"),
|
||||
Color = (int)DiscordColors.Standard,
|
||||
Fields = new List<DiscordField>
|
||||
{
|
||||
new ()
|
||||
{
|
||||
Name = "Previous Version",
|
||||
Value = updateMessage.PreviousVersion.ToString()
|
||||
},
|
||||
new ()
|
||||
{
|
||||
Name = "New Version",
|
||||
Value = updateMessage.NewVersion.ToString()
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
var payload = CreatePayload(null, attachments);
|
||||
var payload = CreatePayload(null, new List<Embed> { embed });
|
||||
|
||||
_proxy.SendPayload(payload, Settings);
|
||||
}
|
||||
@@ -208,19 +202,5 @@ namespace NzbDrone.Core.Notifications.Discord
|
||||
|
||||
return payload;
|
||||
}
|
||||
|
||||
private static string BytesToString(long byteCount)
|
||||
{
|
||||
string[] suf = { "B", "KB", "MB", "GB", "TB", "PB", "EB" }; //Longs run out around EB
|
||||
if (byteCount == 0)
|
||||
{
|
||||
return "0 " + suf[0];
|
||||
}
|
||||
|
||||
var bytes = Math.Abs(byteCount);
|
||||
var place = Convert.ToInt32(Math.Floor(Math.Log(bytes, 1024)));
|
||||
var num = Math.Round(bytes / Math.Pow(1024, place), 1);
|
||||
return string.Format("{0} {1}", (Math.Sign(byteCount) * num).ToString(), suf[place]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user