Compare commits

...

75 commits

Author SHA1 Message Date
blu3
c85f170d41 Bump license year 2025-04-23 11:34:19 +03:00
Bogdan
48a658571b Improve error messaging for not finding JSON selectors in Cardigann 2025-04-21 14:39:22 +03:00
Weblate
0b3a5c9bc4 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Hugoren Martinako <aumpfbahn@gmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translation: Servarr/Prowlarr
2025-04-20 22:30:45 +03:00
Bogdan
356d07ef34
Bump version to 1.35.0 2025-04-20 22:30:15 +03:00
Bogdan
0322d70d63 Fixed: Handle 307 and 308 redirects for indexer download requests 2025-04-20 11:09:08 +03:00
Bogdan
362f3fe223
Bump version to 1.34.1 2025-04-13 09:48:04 +03:00
Bogdan
075fd24f96 Downgrade Microsoft.AspNetCore.WebUtilities 2025-04-12 17:23:45 +03:00
Bogdan
4ba72ea7f3 Bump Swashbuckle to 7.3.2 2025-04-12 14:54:56 +03:00
Bogdan
46f73c51bb Bump IPAddressRange, Npgsql, System.Text.Json 2025-04-12 14:54:01 +03:00
Bogdan
3287d45661 Update timezone offset for AvistaZ trackers 2025-04-12 14:42:25 +03:00
Bogdan
71937fa44c Update timezone offset for FL 2025-04-12 14:33:30 +03:00
Bogdan
6aefd46cd4 Fixed: (SecretCinema) Edition not being decoded 2025-04-12 14:31:29 +03:00
Bogdan
c8370c9e00
Bump version to 1.34.0 2025-04-09 20:59:15 +03:00
Servarr
6be4203b41 Automated API Docs update 2025-04-09 10:29:44 +03:00
Bogdan
1339373e43 Bump Selenium.WebDriver.ChromeDriver 2025-04-08 13:30:56 +03:00
Bogdan
fc9dfb0cf7 Fixed: Disallow tags creation with empty label 2025-04-08 13:30:03 +03:00
Mark McDowall
48301055ea Fixed: Set output encoding to UTF-8 when running external processes
(cherry picked from commit f8e57b09856278a6d0c65f18704e96a33459687d)
2025-04-08 13:29:32 +03:00
Mark McDowall
8a9518c9c1 Update WikiUrl type in API docs
(cherry picked from commit 9bd619ccfe074abe396bbf043a36a5be18a7ba4b)
2025-04-08 13:29:09 +03:00
Bogdan
de099c6770 Log delete statements only once 2025-04-08 13:28:52 +03:00
Bogdan
07711da4e0
Bump version to 1.33.3 2025-04-06 15:44:25 +03:00
MrE12345
7cb70716d0
Fixed: (NorBits) Change encoding to UTF8 (#2367) 2025-04-06 12:43:24 +03:00
Weblate
548dedad5c Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Ste <stefanucciu@gmail.com>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/
Translation: Servarr/Prowlarr
2025-04-06 12:23:27 +03:00
Bogdan
7008626358 Fixed: (PassThePopcorn) Parse volume factors for neutral leech releases 2025-04-04 21:34:10 +03:00
Bogdan
f6f2a3b00d
Bump linux agent to ubuntu-22.04 2025-04-02 00:10:40 +03:00
Weblate
2b16d93095 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Alex Mills <alex@alexmills.uk>
Co-authored-by: Lizandra Candido da Silva <lizandra.c.s@gmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fa/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/
Translation: Servarr/Prowlarr
2025-03-30 10:30:41 +03:00
Bogdan
e63ee13d23
Bump version to 1.33.2 2025-03-30 10:30:03 +03:00
Bogdan
5c5a163151 Fixed: (AnimeBytes) Allow season searching for ONA 2025-03-28 13:39:19 +02:00
Bogdan
023eec0ec0 Update timezone offset for PrivateHD and CinemaZ 2025-03-25 13:04:07 +02:00
Bogdan
5bc5f0e6b8 New: Categories, genres, indexer flags and publish dates for webhook releases 2025-03-25 13:00:53 +02:00
Bogdan
5cbacc01eb Fixed: Publish dates timezone in history details for grabbed releases 2025-03-25 13:00:53 +02:00
Bogdan
f4f1b38324 New: On Grab notifications for CustomScript 2025-03-25 13:00:53 +02:00
Bogdan
758dddd4ad
Bump version to 1.33.1 2025-03-23 09:45:33 +02:00
Bogdan
73ee695633 New: (BeyondHD) Parsing audio and subtitles languages 2025-03-22 21:01:22 +02:00
Bogdan
27fbd7ef7e Fixed: (RuTracker.org) Improve subtitles removal 2025-03-22 12:45:10 +02:00
Bogdan
5125f256fb Fixed: Priority validation for indexers and download clients 2025-03-20 20:38:13 +02:00
Mark McDowall
b99e8d0d65 Improve logging when login fails due to CryptographicException
(cherry picked from commit 1449941471cbb8885e9298317b9a30f2576d7941)
2025-03-16 13:10:09 +02:00
Bogdan
d20b2cc9c0 Bump NLog and Polly 2025-03-16 12:06:32 +02:00
Bogdan
8a1787bdb6
Bump version to 1.33.0 2025-03-16 11:42:07 +02:00
Mark McDowall
a19b8ea997 New: Truncate button text
Fixes #2352

(cherry picked from commit 093ee5b88db0470426f6132e66a5893e5cf89bab)
2025-03-10 20:07:15 +02:00
Mark McDowall
10ea6cd753 Improve wrapping of text in sidebar
(cherry picked from commit f58dfc5605738ebccdd6adc6f1ca2a7843c086b2)
2025-03-10 20:07:15 +02:00
Bogdan
2c1b464715 New: Recommend against using uTorrent
(cherry picked from commit 6d8c3f15b343a24fc31a212463af8ed2b5792508)
2025-03-10 20:07:15 +02:00
Bogdan
3263454041
Bump version to 1.32.2 2025-03-09 11:50:31 +02:00
Servarr
015db4a916
Translations update from Servarr Weblate (#2351)
Multiple Translations updated by Weblate

ignore-downstream







Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_Hans/
Translation: Servarr/Prowlarr

Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: wangdj1314 <wangdj@risenenergy.com>
Co-authored-by: 葛磊磊 <geleilei198117@163.com>
2025-03-07 10:38:29 +02:00
Bogdan
49268f3b8d Fix timezone offset tests for AvistaZ trackers 2025-03-04 13:15:44 +02:00
Bogdan
f02a6f3e2c Update timezone offset for AvistaZ trackers 2025-03-03 17:17:29 +02:00
Bogdan
46b6124b97
Bump version to 1.32.1 2025-03-02 12:17:40 +02:00
Bogdan
53bc97b3be Fixed: (BeyondHd) Search daily episodes using year-month-day format 2025-03-01 17:34:58 +02:00
Bogdan
b09d4927cc Check instance name must contain application name with culture-insensitive 2025-03-01 13:38:34 +02:00
Bogdan
328f3c0423
Bump version to 1.32.0 2025-02-22 12:55:30 +02:00
Mark McDowall
635e76526a Cleanse console log messages
(cherry picked from commit 609e964794e17343f63e1ecff3fef323e3d284ff)
2025-02-19 15:59:34 +02:00
Stevie Robinson
790feed5ab Fixed: Fallback to Instance Name for Discord notifications
(cherry picked from commit b99e06acc0a3ecae2857d9225b35424c82c67a2b)
2025-02-19 15:55:42 +02:00
Mark McDowall
59b5d2fc78 Fixed: Drop downs flickering in some cases
(cherry picked from commit 3b024443c5447b7638a69a99809bf44b2419261f)
2025-02-18 17:09:56 +02:00
Bogdan
d5b12cf51a Fixed release guid for SpeedApp 2025-02-18 04:00:24 +02:00
Bogdan
2d584f7eb6
New: Support for exclusive indexer flag
Co-authored-by: zakkarry <zak@ary.dev>
2025-02-18 02:11:57 +02:00
Bogdan
0f1d647cd7 Fixed: (FileList) Download links when passkey contains spaces 2025-02-16 12:22:44 +02:00
zodihax
d6e8d89be4
Fixed: (NorBits) Update release category parsing (#2342)
Co-authored-by: Bogdan <mynameisbogdan@users.noreply.github.com>
2025-02-12 19:27:09 +02:00
Bogdan
8672129d5a Fixed: (AnimeTorrents) Switched to cookies login 2025-02-12 15:52:22 +02:00
Bogdan
44bdff8b8f Minor cleanup for AnimeTorrents 2025-02-12 15:52:22 +02:00
Bogdan
4df8fc02f1
Bump version to 1.31.2 2025-02-09 17:51:35 +02:00
Weblate
e101129cff Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Marius Nechifor <flm.marius@gmail.com>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fa/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translation: Servarr/Prowlarr
2025-02-07 19:14:29 -06:00
Bogdan
147e732c9c Building docs on ARM
Co-authored-by: Mark McDowall <mark@mcdowall.ca>
2025-02-06 00:36:13 +02:00
Bogdan
a12381fb1d Cleanse "rsskey" from logs 2025-02-05 20:06:51 +02:00
Bogdan
3a4de9cca1 Fixed: (MAM) Continue downloading if attempting to buy personal FL for VIP release 2025-02-05 19:59:48 +02:00
Bogdan
43c988d951 Fixed: (MAM) Use the latest cookies on release download 2025-02-05 19:51:20 +02:00
Bogdan
a036e0fc37 Fixed: (MAM) Updated property name for user class 2025-02-05 19:42:32 +02:00
Bogdan
56b9da16cf Fix release category selector on all themes for NorBits
Co-authored-by: Garfield69 <garfield69@outlook.com>
2025-02-05 19:24:36 +02:00
zodihax
887c262589
Update release category selector for NorBits (#2338) 2025-02-05 12:55:53 +02:00
zodihax
12ff612775
Fixed: (NorBits) Added main categories to avoid invalid releases (#2337)
NorBits also has these main categories in addition to the already configured sub-categories. This PR adds these main categories.

Prowlarr often return 0 query results even when there are query results, this is probably caused by all the results only having a main category (for instance "TV") and no sub-categories.

`|Warn|NorBits|Invalid Release: '<redacted>' from indexer: NorBits. No categories provided.`
2025-02-03 18:03:40 +02:00
Bogdan
0d3d27e46f Fixed: (HDB) Use release name for full discs and XXX content 2025-02-02 18:51:12 +02:00
Bogdan
d1846fde61 New: (Myanonamouse) Prevent downloads without FL tokens
Co-authored-by: Kalon Shannon-Innes <mav@hotmail.com.au>
2025-02-02 17:46:28 +02:00
Bogdan
e6901506a0 Fixed: (IPTorrents) Cleanup languages between brackets when possible 2025-02-02 17:44:31 +02:00
Weblate
08b4eddbc5 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Mailme Dashite <mailmedashite@protonmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: marapavelka <mara.pavelka@gmail.com>
Co-authored-by: 宿命 <331874545@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translation: Servarr/Prowlarr
2025-02-02 16:13:56 +02:00
Bogdan
979db70e68
Bump version to 1.31.1 2025-02-02 12:47:52 +02:00
Bogdan
22834a852a Fixed: TV search with tmdbid for Newznab and Torznab 2025-01-29 18:39:22 +02:00
Bogdan
f0540a5f8b
Bump version to 1.31.0 2025-01-24 17:33:38 +02:00
102 changed files with 1315 additions and 460 deletions

View file

@ -78,6 +78,6 @@ Thank you to [<img src="https://resources.jetbrains.com/storage/products/company
### License
- [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)
- Copyright 2010-2024
- Copyright 2010-2025
Icon Credit - [Box vector created by freepik - www.freepik.com](https://www.freepik.com/vectors/box)

View file

@ -9,7 +9,7 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '1.30.2'
majorVersion: '1.35.0'
minorVersion: $[counter('minorVersion', 1)]
prowlarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(prowlarrVersion)'
@ -19,7 +19,7 @@ variables:
nodeVersion: '20.X'
innoVersion: '6.2.2'
windowsImage: 'windows-2022'
linuxImage: 'ubuntu-20.04'
linuxImage: 'ubuntu-22.04'
macImage: 'macOS-13'
trigger:

11
docs.sh
View file

@ -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
@ -37,7 +38,7 @@ dotnet clean $slnFile -c Release
dotnet msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p:RuntimeIdentifiers=$RUNTIME -t:PublishAllRids
dotnet new tool-manifest
dotnet tool install --version 6.6.2 Swashbuckle.AspNetCore.Cli
dotnet tool install --version 7.3.2 Swashbuckle.AspNetCore.Cli
dotnet tool run swagger tofile --output ./src/Prowlarr.Api.V1/openapi.json "$outputFolder/$FRAMEWORK/$RUNTIME/$application" v1 &

View file

@ -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'
}
}}
>

View file

@ -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;
}

View file

@ -8,7 +8,6 @@ interface CssExports {
'isActiveParentLink': string;
'item': string;
'link': string;
'noIcon': string;
'status': string;
}
export const cssExports: CssExports;

View file

@ -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 &&

View file

@ -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);

View file

@ -23,6 +23,7 @@ function PageToolbarButton(props) {
isDisabled && styles.isDisabled
)}
isDisabled={isDisabled || isSpinning}
title={label}
{...otherProps}
>
<Icon

View file

@ -4,7 +4,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Selenium.Support" Version="4.1.0" />
<PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="99.0.4844.5100" />
<PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="134.0.6998.16500" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Test.Common\Prowlarr.Test.Common.csproj" />

View file

@ -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

View file

@ -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),

View file

@ -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);
}
}
}

View file

@ -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);
}
}
}

View file

@ -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)
{

View file

@ -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

View file

@ -6,6 +6,7 @@ using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using NLog;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Model;
@ -117,7 +118,9 @@ namespace NzbDrone.Common.Processes
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardOutput = true,
RedirectStandardInput = true
RedirectStandardInput = true,
StandardOutputEncoding = Encoding.UTF8,
StandardErrorEncoding = Encoding.UTF8
};
if (environmentVariables != null)

View file

@ -5,21 +5,21 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DryIoc.dll" Version="5.4.3" />
<PackageReference Include="IPAddressRange" Version="6.1.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" />
<PackageReference Include="IPAddressRange" Version="6.2.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.2" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.3" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="NLog" Version="5.3.4" />
<PackageReference Include="NLog.Layouts.ClefJsonLayout" Version="1.0.0" />
<PackageReference Include="NLog.Extensions.Logging" Version="5.3.15" />
<PackageReference Include="Npgsql" Version="7.0.9" />
<PackageReference Include="NLog" Version="5.4.0" />
<PackageReference Include="NLog.Layouts.ClefJsonLayout" Version="1.0.3" />
<PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" />
<PackageReference Include="Npgsql" Version="7.0.10" />
<PackageReference Include="Sentry" Version="4.0.2" />
<PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" />
<PackageReference Include="SharpZipLib" Version="1.4.2" />
<PackageReference Include="System.Text.Json" Version="6.0.10" />
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
<PackageReference Include="System.Text.Json" Version="6.0.11" />
<PackageReference Include="System.ValueTuple" Version="4.6.1" />
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="6.0.1" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="6.0.2" />
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="5.0.0" />
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
<PackageReference Include="System.ServiceProcess.ServiceController" Version="6.0.1" />

View file

@ -55,7 +55,7 @@ namespace NzbDrone.Core.Test.IndexerTests.FileListTests
torrentInfo.InfoUrl.Should().Be("https://filelist.io/details.php?id=665873");
torrentInfo.CommentUrl.Should().BeNullOrEmpty();
torrentInfo.Indexer.Should().Be(Subject.Definition.Name);
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2020-01-25 20:20:19"));
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2020-01-25 19:20:19"));
torrentInfo.Size.Should().Be(8300512414);
torrentInfo.InfoHash.Should().Be(null);
torrentInfo.MagnetUrl.Should().Be(null);

View file

@ -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;

View file

@ -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;
}

View file

@ -254,7 +254,7 @@ namespace NzbDrone.Core.Datastore
protected void Delete(SqlBuilder builder)
{
var sql = builder.AddDeleteTemplate(typeof(TModel)).LogQuery();
var sql = builder.AddDeleteTemplate(typeof(TModel));
using (var conn = _database.OpenConnection())
{

View file

@ -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);
}
}
}

View file

@ -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;
}

View file

@ -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)
{
}

View file

@ -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)
{
}

View file

@ -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;
}

View file

@ -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;

View file

@ -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;

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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)
{
}

View file

@ -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;

View file

@ -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;
}

View file

@ -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)
{
}

View file

@ -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;
}

View file

@ -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)
{
}

View file

@ -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;

View file

@ -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)

View file

@ -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;
}

View file

@ -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;

View file

@ -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;
}

View file

@ -224,7 +224,7 @@ namespace NzbDrone.Core.History
if (message.Release.PublishDate != DateTime.MinValue)
{
history.Data.Add("PublishedDate", message.Release.PublishDate.ToString("s") + "Z");
history.Data.Add("PublishedDate", message.Release.PublishDate.ToUniversalTime().ToString("s") + "Z");
}
_historyRepository.Insert(history);

View file

@ -232,7 +232,7 @@ namespace NzbDrone.Core.Indexers.Definitions
if (queryCats.Any() && searchCriteria is TvSearchCriteria { Season: > 0 })
{
// Avoid searching for specials if it's a non-zero season search
queryCats.RemoveAll(cat => cat is "anime[tv_special]" or "anime[ova]" or "anime[ona]" or "anime[dvd_special]" or "anime[bd_special]");
queryCats.RemoveAll(cat => cat is "anime[tv_special]" or "anime[ova]" or "anime[dvd_special]" or "anime[bd_special]");
}
if (queryCats.Any())

View file

@ -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()
@ -292,7 +264,7 @@ namespace NzbDrone.Core.Indexers.Definitions
var qTitleLink = row.QuerySelector("td:nth-of-type(2) a:nth-of-type(1)");
var title = qTitleLink?.TextContent.Trim();
// If we search an get no results, we still get a table just with no info.
// If we search and get no results, we still get a table just with no info.
if (title.IsNullOrWhiteSpace())
{
break;
@ -307,6 +279,8 @@ namespace NzbDrone.Core.Indexers.Definitions
var connections = row.QuerySelector("td:nth-of-type(8)").TextContent.Trim().Split('/', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
var seeders = ParseUtil.CoerceInt(connections[0]);
var leechers = ParseUtil.CoerceInt(connections[1]);
var grabs = ParseUtil.CoerceInt(connections[2]);
var categoryLink = row.QuerySelector("td:nth-of-type(1) a")?.GetAttribute("href") ?? string.Empty;
var categoryId = ParseUtil.GetArgumentFromQueryString(categoryLink, "cat");
@ -328,17 +302,17 @@ namespace NzbDrone.Core.Indexers.Definitions
PublishDate = publishedDate,
Size = ParseUtil.GetBytes(row.QuerySelector("td:nth-of-type(6)").TextContent.Trim()),
Seeders = seeders,
Peers = ParseUtil.CoerceInt(connections[1]) + seeders,
Grabs = ParseUtil.CoerceInt(connections[2]),
Peers = leechers + seeders,
Grabs = grabs,
DownloadVolumeFactor = downloadVolumeFactor,
UploadVolumeFactor = 1,
Genres = row.QuerySelectorAll("td:nth-of-type(2) a.tortags").Select(t => t.TextContent.Trim()).ToList()
};
var uLFactorImg = row.QuerySelector("img[alt*=\"x Multiplier Torrent\"]");
if (uLFactorImg != null)
var uploadFactor = row.QuerySelector("img[alt*=\"x Multiplier Torrent\"]")?.GetAttribute("alt");
if (uploadFactor != null)
{
release.UploadVolumeFactor = ParseUtil.CoerceDouble(uLFactorImg.GetAttribute("alt").Split('x')[0]);
release.UploadVolumeFactor = ParseUtil.CoerceDouble(uploadFactor.Split('x')[0]);
}
releaseInfos.Add(release);
@ -350,7 +324,7 @@ namespace NzbDrone.Core.Indexers.Definitions
public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; }
}
public class AnimeTorrentsSettings : UserPassTorrentBaseSettings
public class AnimeTorrentsSettings : CookieTorrentBaseSettings
{
public AnimeTorrentsSettings()
{
@ -361,7 +335,7 @@ namespace NzbDrone.Core.Indexers.Definitions
[FieldDefinition(4, Label = "Freeleech Only", Type = FieldType.Checkbox, HelpText = "Show freeleech torrents only")]
public bool FreeleechOnly { get; set; }
[FieldDefinition(5, Label = "Downloadable Only", Type = FieldType.Checkbox, HelpText = "Search downloadable torrents only (enable this only if your account class is Newbie)")]
[FieldDefinition(5, Label = "Downloadable Only", Type = FieldType.Checkbox, HelpText = "Search downloadable torrents only (enable this only if your account class is Newbie)", Advanced = true)]
public bool DownloadableOnly { get; set; }
}
}

View file

@ -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,
@ -301,6 +304,8 @@ namespace NzbDrone.Core.Indexers.Definitions
UploadVolumeFactor = 1,
MinimumRatio = 1,
MinimumSeedTime = 172800, // 120 hours
Languages = row.Audios?.Split(",", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList() ?? new List<string>(),
Subs = row.Subtitles?.Split(",", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList() ?? new List<string>(),
};
// BHD can return crazy values for tmdb
@ -319,6 +324,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; }
}
@ -450,9 +472,13 @@ namespace NzbDrone.Core.Indexers.Definitions
[JsonPropertyName("times_completed")]
public int Grabs { get; set; }
public int Seeders { get; set; }
public int Leechers { get; set; }
public string Audios { get; set; }
public string Subtitles { get; set; }
[JsonPropertyName("created_at")]
public string CreatedAt { get; set; }
@ -478,6 +504,8 @@ namespace NzbDrone.Core.Indexers.Definitions
public bool Limited { get; set; }
public bool Exclusive { get; set; }
public bool Internal { get; set; }
}
}

View file

@ -8,6 +8,7 @@ using System.Text;
using System.Text.RegularExpressions;
using AngleSharp.Dom;
using Microsoft.AspNetCore.WebUtilities;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NLog;
using NzbDrone.Common.Extensions;
@ -214,19 +215,19 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
if (selector.Selector != null)
{
var selectorSelector = ApplyGoTemplateText(selector.Selector.TrimStart('.'), variables);
selectorSelector = JsonParseFieldSelector(parentObj, selectorSelector);
var fieldSelector = JsonParseFieldSelector(parentObj, selectorSelector);
JToken selection = null;
if (selectorSelector != null)
if (fieldSelector != null)
{
selection = parentObj.SelectToken(selectorSelector);
selection = parentObj.SelectToken(fieldSelector);
}
if (selection == null)
{
if (required)
{
throw new Exception(string.Format("Selector \"{0}\" didn't match {1}", selectorSelector, parentObj.ToString()));
throw new Exception($"Selector \"{selectorSelector}\" didn't match {parentObj.ToString(Formatting.None)}");
}
return null;
@ -234,7 +235,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
if (selection.Type is JTokenType.Array)
{
// turn this json array into a comma delimited string
// turn this json array into a comma-delimited string
var valueArray = selection.Value<JArray>();
value = string.Join(",", valueArray);
}
@ -259,7 +260,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
{
if (required)
{
throw new Exception($"None of the case selectors \"{string.Join(",", selector.Case)}\" matched {parentObj}");
throw new Exception($"None of the case selectors \"{string.Join(",", selector.Case)}\" matched {parentObj.ToString(Formatting.None)}");
}
return null;

View file

@ -105,7 +105,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
}
catch (Exception ex)
{
_logger.Trace(ex, "Failed to parse JSON rows count.");
_logger.Debug(ex, "Failed to parse JSON rows count.");
}
}

View file

@ -77,7 +77,7 @@ public class FileListParser : IParseIndexerResponse
InfoUrl = GetInfoUrl(id),
Seeders = row.Seeders,
Peers = row.Leechers + row.Seeders,
PublishDate = DateTime.Parse(row.UploadDate + " +0200", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal),
PublishDate = DateTime.Parse(row.UploadDate + " +0300", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal),
Description = row.SmallDescription,
Genres = row.SmallDescription.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList(),
ImdbId = imdbId,
@ -101,7 +101,7 @@ public class FileListParser : IParseIndexerResponse
var url = new HttpUri(_settings.BaseUrl)
.CombinePath("/download.php")
.AddQueryParam("id", torrentId.ToString())
.AddQueryParam("passkey", _settings.Passkey);
.AddQueryParam("passkey", _settings.Passkey.Trim());
return url.FullUri;
}

View file

@ -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,
}
};

View file

@ -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; }

View file

@ -1,9 +0,0 @@
using NzbDrone.Core.Parser.Model;
namespace NzbDrone.Core.Indexers.Definitions.HDBits
{
public class HDBitsInfo : TorrentInfo
{
public bool? Internal { get; set; }
}
}

View file

@ -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; }
}
}

View file

@ -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(' ', '-', ':');
}
}

View file

@ -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; }
}
}

View file

@ -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());
}

View file

@ -27,7 +27,7 @@ public class NorBits : TorrentIndexerBase<NorBitsSettings>
public override string[] IndexerUrls => new[] { "https://norbits.net/" };
public override string Description => "NorBits is a Norwegian Private site for MOVIES / TV / GENERAL";
public override string Language => "nb-NO";
public override Encoding Encoding => Encoding.GetEncoding("iso-8859-1");
public override Encoding Encoding => Encoding.UTF8;
public override IndexerPrivacy Privacy => IndexerPrivacy.Private;
public override IndexerCapabilities Capabilities => SetCapabilities();
@ -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()),

View file

@ -59,7 +59,7 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
// skip non-freeleech results when freeleech only is set
var downloadVolumeFactor = torrent.FreeleechType?.ToUpperInvariant() switch
{
"FREELEECH" => 0,
"FREELEECH" or "NEUTRAL LEECH" => 0,
"HALF LEECH" => 0.5,
_ => 1
};
@ -91,6 +91,12 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
categories.Add(NewznabStandardCategory.TV);
}
var uploadVolumeFactor = torrent.FreeleechType?.ToUpperInvariant() switch
{
"NEUTRAL LEECH" => 0,
_ => 1
};
torrentInfos.Add(new TorrentInfo
{
Guid = $"PassThePopcorn-{id}",
@ -108,7 +114,7 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
Scene = torrent.Scene,
IndexerFlags = flags,
DownloadVolumeFactor = downloadVolumeFactor,
UploadVolumeFactor = 1,
UploadVolumeFactor = uploadVolumeFactor,
MinimumRatio = 1,
MinimumSeedTime = 345600,
Genres = result.Tags ?? new List<string>(),

View file

@ -30,7 +30,7 @@ namespace NzbDrone.Core.Indexers.Definitions
"https://rutracker.net/",
"https://rutracker.nl/"
};
public override string Description => "RuTracker.org is a Semi-Private Russian torrent site with a thriving file-sharing community";
public override string Description => "RuTracker.org is a RUSSIAN Semi-Private site with a thriving file-sharing community";
public override string Language => "ru-RU";
public override Encoding Encoding => Encoding.GetEncoding("windows-1251");
public override IndexerPrivacy Privacy => IndexerPrivacy.SemiPrivate;
@ -144,6 +144,7 @@ namespace NzbDrone.Core.Indexers.Definitions
SupportsRawSearch = true
};
// Note: When refreshing the categories use the tracker.php page and NOT the search.php page!
caps.Categories.AddCategoryMapping(22, NewznabStandardCategory.Movies, "Наше кино");
caps.Categories.AddCategoryMapping(941, NewznabStandardCategory.Movies, "|- Кино СССР");
caps.Categories.AddCategoryMapping(1666, NewznabStandardCategory.Movies, "|- Детские отечественные фильмы");
@ -1751,7 +1752,7 @@ namespace NzbDrone.Core.Indexers.Definitions
title = Regex.Replace(title, @"(\([\p{IsCyrillic}\W]+)\s/\s(.+?)\)", string.Empty, RegexOptions.Compiled | RegexOptions.IgnoreCase);
// Remove VO, MVO and DVO from titles
var vo = new Regex(@".VO\s\(.+?\)");
var vo = new Regex(@"((?:\dx\s)?(?:[A-Z])?VO\s\(.+?\))");
title = vo.Replace(title, string.Empty);
// Remove R5 and (R5) from release names
@ -1759,7 +1760,7 @@ namespace NzbDrone.Core.Indexers.Definitions
title = r5.Replace(title, "$1");
// Remove Sub languages from release names
title = Regex.Replace(title, @"(\bSub\b.*$|\b[\+]*Sub[\+]*\b)", string.Empty);
title = Regex.Replace(title, @"(\bSub\b[^+]*\b|\b[\+]*Sub[\+]*\b)", string.Empty);
}
// language fix: all rutracker releases contains russian track

View file

@ -20,7 +20,7 @@ public class SecretCinema : GazelleBase<GazelleSettings>
{
public override string Name => "Secret Cinema";
public override string[] IndexerUrls => new[] { "https://secret-cinema.pw/" };
public override string Description => "A tracker for rare movies.";
public override string Description => "Secret Cinema is a Private ratioless site for rare MOVIES.";
public override IndexerPrivacy Privacy => IndexerPrivacy.Private;
public override IndexerCapabilities Capabilities => SetCapabilities();
@ -151,7 +151,7 @@ public class SecretCinemaParser : IParseIndexerResponse
if (torrent.RemasterTitle.IsNotNullOrWhiteSpace())
{
release.Title += $" [{torrent.RemasterTitle.Trim()}]";
release.Title += $" [{WebUtility.HtmlDecode(torrent.RemasterTitle).Trim()}]";
}
// Replace media formats with standards

View file

@ -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,

View file

@ -250,7 +250,11 @@ namespace NzbDrone.Core.Indexers
{
var response = await _httpClient.ExecuteProxiedAsync(request, Definition);
if (response.StatusCode is HttpStatusCode.MovedPermanently or HttpStatusCode.Found or HttpStatusCode.SeeOther)
if (response.StatusCode is HttpStatusCode.MovedPermanently
or HttpStatusCode.Found
or HttpStatusCode.SeeOther
or HttpStatusCode.TemporaryRedirect
or HttpStatusCode.PermanentRedirect)
{
var autoRedirectChain = new List<string> { request.Url.ToString() };

View file

@ -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");

View file

@ -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);
}
}

View file

@ -376,5 +376,46 @@
"ActiveIndexers": "Активни индиксатори",
"AddApplication": "добави приложение",
"Season": "Причина",
"CurrentlyInstalled": "Понастоящем инсталиран"
"CurrentlyInstalled": "Понастоящем инсталиран",
"DownloadClientSettingsAddPaused": "Добави на пауза",
"Encoding": "Кодиране",
"Episode": "епизод",
"Applications": "Приложения",
"Publisher": "Издател",
"Id": "ИН",
"Theme": "Тема",
"Label": "Етикет",
"Categories": "Категории",
"Album": "албум",
"Artist": "изпълнител",
"AddConnection": "Добави връзка",
"AddConnectionImplementation": "Добави връзка - {implementationName}",
"AddDownloadClientImplementation": "Добави клиент за изтегляне - {implementationName}",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Потвърдете новата парола",
"Default": "Подразбиране",
"Any": "Всеки",
"ApplicationUrlHelpText": "Външният URL адрес на това приложение, включително http(s)://, порт и основно URL",
"Database": "База данни",
"Destination": "Дестинация",
"DownloadClientAriaSettingsDirectoryHelpText": "Незадължително локация за изтеглянията, оставете празно, за да използвате локацията по подразбиране на Aria2",
"DownloadClientDelugeSettingsUrlBaseHelpText": "Добавя префикс към url адреса на deluge json, вижте {url}",
"Directory": "Директория",
"AddIndexerImplementation": "Добави индексатор - {implementationName}",
"AuthenticationRequiredHelpText": "Променете за кои заявки се изисква удостоверяване. Не променяйте, освен ако не разбирате рисковете.",
"AuthenticationRequiredPasswordHelpTextWarning": "Въведете нова парола",
"DownloadClientDownloadStationSettingsDirectoryHelpText": "Незадължителна споделена папка, в която да се поставят изтеглянията, оставете празно, за да използвате местоположението по подразбиране на Download Station",
"DownloadClientFloodSettingsAdditionalTags": "Допълнителни тагове",
"DownloadClientFloodSettingsAdditionalTagsHelpText": "Добавя свойствата на медията като тагове. Напътствията са примери.",
"DownloadClientFloodSettingsTagsHelpText": "Първоначални тагове на изтегляне. За да бъде разпознато едно изтегляне, то трябва да има всички начални тагове. По този начин се избягват конфликти с необвързани с приложение изтегляния.",
"ApplicationURL": "URL адрес на приложението",
"AuthenticationRequired": "Изисква се удостоверяване",
"ApplyChanges": "Прилагане на промените",
"ApiKeyValidationHealthCheckMessage": "Моля, актуализирайте API ключа си така, че да съдържа поне {length} знака. Можете да направите това чрез настройките или конфигурационния файл",
"AppUpdated": "{appName} Актуализиран",
"AppUpdatedVersion": "{appName} е актуализиранa до версия `{version}`, за да получите най-новите промени, ще трябва да презаредите {appName}",
"Donate": "Дарете",
"AddCustomFilter": "Добави персонализиран филтър",
"AuthenticationMethod": "Метод за удостоверяване",
"AuthenticationMethodHelpTextWarning": "Моля, изберете валиден метод за удостоверяване",
"BlackholeFolderHelpText": "Папка, в която {appName} ще съхранява файла {extension}"
}

View file

@ -484,7 +484,7 @@
"InfoUrl": "URL d'informació",
"PublishedDate": "Data de publicació",
"Redirected": "Redirecció",
"AllSearchResultsHiddenByFilter": "Tots els resultats estan ocults pel filtre aplicat",
"AllSearchResultsHiddenByFilter": "Tots els resultats estan ocults pel filtre aplicat.",
"HealthMessagesInfoBox": "Podeu trobar més informació sobre la causa d'aquests missatges de comprovació de salut fent clic a l'enllaç wiki (icona del llibre) al final de la fila o consultant els vostres [registres]({link}). Si teniu problemes per a interpretar aquests missatges, podeu posar-vos en contacte amb el nostre suport als enllaços següents.",
"AptUpdater": "Utilitzeu apt per a instal·lar l'actualització",
"DockerUpdater": "actualitzeu el contenidor Docker per a rebre l'actualització",
@ -500,5 +500,245 @@
"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",
"Install": "Instal·la",
"DownloadClientFloodSettingsAdditionalTags": "Etiquetes addicionals",
"DownloadClientFreeboxSettingsApiUrl": "URL de l'API",
"DownloadClientFreeboxSettingsAppId": "Identificador de l'aplicació",
"PreviouslyInstalled": "Instal·lat anteriorment",
"PasswordConfirmation": "Confirmeu la contrasenya",
"IndexerHDBitsSettingsOriginsHelpText": "Si no s'especifica, s'utilitzen totes les opcions.",
"MinimumSeeders": "Seeders mínims",
"SeedRatio": "Ràtio de la llavor",
"ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Si un torrent està bloquejat per un hash, pot ser que no es rebutgi correctament durant el RSS/Search per a alguns indexadors, habilitant això permetrà que es rebutgi després que s'agafi el torrent, però abans que s'enviï al client.",
"SeedTime": "Temps de la llavor",
"DefaultCategory": "Categoria predeterminada",
"IndexerVipExpiredHealthCheckMessage": "Els beneficis VIP de l'indexador han caducat: {indexerNames}",
"MassEditor": "Editor de masses",
"NoSearchResultsFound": "No s'han trobat resultats de cerca, proveu de realitzar una nova cerca a continuació.",
"NotSupported": "No suportat",
"OverrideAndAddToDownloadClient": "Sobreescriu i afegeix al client de baixada",
"PackSeedTime": "Temps de la llavor del paquet",
"SearchAllIndexers": "Cerca tots els indexadors",
"SearchIndexers": "Cerca indexadors",
"SeedTimeHelpText": "L'hora en què un torrent s'ha de sembrar abans d'aturar-se, buit és el predeterminat de l'aplicació",
"SettingsIndexerLogging": "Registre de l'indexador millorat",
"TotalIndexerSuccessfulGrabs": "Indexador total correcte",
"BookSearch": "Cerca de llibres",
"ClearHistoryMessageText": "Esteu segur que voleu netejar tot l'historial de {appName}?",
"IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech",
"ClearHistory": "Neteja l'historial",
"IndexerTorrentSyndikatSettingsApiKeyHelpText": "Clau de l'API del lloc",
"IndexerGazelleGamesSettingsApiKeyHelpText": "Clau API del lloc (trobada a Configuració => Accés)",
"IndexerBeyondHDSettingsRssKeyHelpText": "Clau RSS del lloc (trobada a Seguretat => Clau RSS)",
"ApplicationsLoadError": "No s'ha pogut carregar la llista d'aplicacions",
"BookSearchTypes": "Tipus de cerca de llibres",
"DownloadClientCategory": "Baixa la categoria del client",
"IndexerAuth": "Autor de l'indexador",
"IndexerBeyondHDSettingsLimitedOnly": "Només limitat",
"IndexerBeyondHDSettingsRefundOnly": "Només el reemborsament",
"IndexerBeyondHDSettingsRefundOnlyHelpText": "Cerca només el reemborsament",
"IndexerBeyondHDSettingsRewindOnlyHelpText": "Cerca només el rebobinat",
"IndexerBeyondHDSettingsSearchTypes": "Tipus de cerca",
"IndexerBeyondHDSettingsSearchTypesHelpText": "Seleccioneu els tipus de llançaments que us interessin. Si no hi ha cap seleccionat, s'utilitzen totes les opcions.",
"IndexerDownloadClientHelpText": "Especifiqueu quin client de baixada s'utilitza per a les captures fetes a {appName} des d'aquest indexador",
"IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Ha de tenir permisos d'usuari i torrents",
"IndexerGazelleGamesSettingsSearchGroupNames": "Cerca noms de grup",
"IndexerHDBitsSettingsFreeleechOnlyHelpText": "Mostra només els llançaments de freeleech",
"IndexerHDBitsSettingsUseFilenames": "Utilitza els noms de fitxer",
"IndexerHDBitsSettingsUseFilenamesHelpText": "Marqueu aquesta opció si voleu utilitzar noms de fitxer torrent com a títols de llançament",
"IndexerHDBitsSettingsUsernameHelpText": "Nom d'usuari del lloc",
"IndexerHealthCheckNoIndexers": "No hi ha indexadors activats, {appName} no retornarà els resultats de la cerca",
"IndexerHistoryLoadError": "Error en carregar l'historial de l'indexador",
"IndexerIPTorrentsSettingsCookieUserAgent": "Agent d'usuari de la galeta",
"IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech",
"IndexerInfo": "Informació de l'indexador",
"IndexerNebulanceSettingsApiKeyHelpText": "Clau API de la Configuració de l'usuari . Claus Api. La clau ha de tenir permisos de llista i baixada",
"IndexerNewznabSettingsVipExpirationHelpText": "Data d'entrada (yyyy-mm-dd) per a la caducitat VIP o en blanc, {appName} notificarà 1 setmana des de la caducitat de VIP",
"IndexerNoDefinitionCheckHealthCheckMessage": "Els indexadors no tenen definició i no funcionaran: {indexerNames}. Suprimiu i (o torneu a afegir) a {appName}.",
"IndexerObsoleteCheckMessage": "Els indexadors estan obsolets o s'han actualitzat: {0}. Suprimiu i (o torneu a afegir) a {appName}",
"IndexerPassThePopcornSettingsApiKeyHelpText": "Clau de l'API del lloc",
"IndexerRss": "Indexador RSS",
"IndexerSettingsGrabLimitHelpText": "El nombre màxim de captures especificat per la unitat respectiva que {appName} permetrà al lloc",
"IndexerSettingsPackSeedTimeIndexerHelpText": "L'hora en què un paquet (temporada o discografia) s'ha de sembrar el torrent abans d'aturar-se, buit és el valor predeterminat de l'aplicació",
"IndexerSettingsPreferMagnetUrl": "Prefereix l'URL de l'imant",
"IndexerSettingsPreferMagnetUrlHelpText": "Quan està activat, aquest indexador preferirà l'ús d'URLs magnet per a les captures amb enllaços de reserva a torrents",
"IndexerSettingsQueryLimitHelpText": "El nombre màxim de consultes especificat per la unitat respectiva que {appName} permetrà al lloc",
"InitialFailure": "Fallada inicial",
"NoIndexerCategories": "No s'ha trobat cap categoria per a aquest indexador",
"RepeatSearch": "Cerca repetida",
"SettingsLogRotateHelpText": "Nombre màxim de fitxers de registre a mantenir desats a la carpeta de registres",
"SyncProfile": "Perfil de sincronització",
"TotalUserAgentGrabs": "Total d'agents d'usuari",
"UnableToLoadAppProfiles": "No s'han pogut carregar els perfils de l'aplicació",
"VipExpiration": "Caducitat VIP",
"IndexerOrpheusSettingsApiKeyHelpText": "Clau API del lloc (trobada a Configuració => Accés)",
"IndexerRedactedSettingsApiKeyHelpText": "Clau API del lloc (trobada a Configuració => Accés)",
"ProwlarrSupportsAnyIndexer": "{appName} admet molts indexadors, a més de qualsevol indexador que utilitzi l'estàndard Newznab/Torznab utilitzant 'Generic Newznab' (per usenet) o 'Generic Torznab' (per torrents). Cerca i selecciona el teu indexador des de sota.",
"DownloadClientSettingsDefaultCategorySubFolderHelpText": "Categoria alternativa predeterminada si no hi ha cap categoria assignada per a un llançament. Afegir una categoria específica a {appName} evita conflictes amb baixades no relacionades amb {appName}. L'ús d'una categoria és opcional, però molt recomanable.",
"AppProfileSelectHelpText": "Els perfils d'aplicació s'utilitzen per controlar RSS, la cerca automàtica i la configuració de cerca interactiva en sincronitzar aplicacions",
"AudioSearch": "Cerca d'àudio",
"IndexerSettingsAppsMinimumSeeders": "Aplicacions de cercadors mínims",
"DeleteApplication": "Suprimeix l'aplicació",
"DownloadClientSettingsPriorityItemHelpText": "Prioritat a usar en capturar elements",
"DownloadClientSettingsDefaultCategoryHelpText": "Categoria alternativa predeterminada si no hi ha cap categoria assignada per a un llançament. Afegir una categoria específica a {appName} evita conflictes amb baixades no relacionades amb {appName}. L'ús d'una categoria és opcional, però molt recomanable.",
"EditCategory": "Edita la categoria",
"IndexerQuery": "Consulta de l'indexador",
"IndexerSettingsBaseUrl": "Url base",
"IndexerSettingsCookieHelpText": "Cookie del lloc",
"IndexerSettingsLimitsUnitHelpText": "La unitat de temps per comptar els límits per indexador",
"IndexerSettingsPackSeedTime": "Temps de la llavor del paquet",
"IndexerSite": "Lloc indexador",
"IndexerTagsHelpTextWarning": "Les etiquetes s'han d'utilitzar amb precaució, poden tenir efectes no desitjats. Un indexador amb una etiqueta només sincronitzarà amb aplicacions amb la mateixa etiqueta.",
"IndexerSettingsSummary": "Configura diversos paràmetres globals de l'indexador.",
"ManageApplications": "Gestiona les aplicacions",
"PackSeedTimeHelpText": "L'hora en què un paquet (temporada o discografia) s'ha de sembrar el torrent abans d'aturar-se, buit és el valor predeterminat de l'aplicació",
"PreferMagnetUrl": "Prefereix l'URL de l'imant",
"PreferMagnetUrlHelpText": "Quan està activat, aquest indexador preferirà l'ús d'URLs magnet per a les captures amb enllaços de reserva a torrents",
"ProwlarrDownloadClientsInAppOnlyAlert": "Els clients de baixada només són per a les cerques a l'aplicació {appName} i no sincronitzen amb les aplicacions. No hi ha plans per afegir aquesta funcionalitat.",
"IndexerBeyondHDSettingsRewindOnly": "Només rebobina",
"ProxyValidationUnableToConnect": "No s'ha pogut connectar al servidor intermediari: {exceptionMessage}. Comprova els detalls del registre que envolta aquest error",
"QueryOptions": "Opcions de la consulta",
"TestAllApps": "Prova totes les aplicacions",
"TotalHostQueries": "Total de consultes de l'amfitrió",
"AverageGrabs": "Mitjana d'herba",
"AverageQueries": "Mitjana de consultes",
"FilterPlaceHolder": "Cerca indexadors",
"IndexerBeyondHDSettingsLimitedOnlyHelpText": "Cerca només freeleech (Limited UL)",
"IndexerBeyondHDSettingsApiKeyHelpText": "Clau API del lloc (trobada a Seguretat => Clau API)",
"IndexerSettingsVipExpiration": "Caducitat VIP",
"IndexerVipExpiringHealthCheckMessage": "Els beneficis VIP de l'indexador expiraran aviat: {indexerNames}",
"LastFailure": "Darrera fallada",
"MovieSearch": "Cerca de pel·lícules",
"MovieSearchTypes": "Tipus de cerca de pel·lícules",
"MusicSearchTypes": "Tipus de cerca de música",
"QueryType": "Tipus de consulta",
"RssQueries": "Consultes RSS",
"SyncLevelFull": "Sincronització completa: mantindrà els indexadors d'aquesta aplicació completament sincronitzats. Els canvis fets als indexadors a {appName} se sincronitzen amb aquesta aplicació. Qualsevol canvi fet a indexadors remotament dins d'aquesta aplicació serà anul·lat per {appName} en la següent sincronització.",
"TotalHostGrabs": "Total d'amfitrions",
"TotalQueries": "Total de consultes",
"NoApplicationsFound": "No s'ha trobat cap aplicació",
"SyncProfiles": "Sincronitza els perfils",
"TorznabUrl": "Url Torznab",
"TvSearch": "Cerca de TV",
"DeleteIndexerProxy": "Suprimeix el servidor intermediari de l'indexador",
"DisabledUntil": "Desactivat fins",
"GrabTitle": "Captura el títol",
"SettingsIndexerLoggingHelpText": "Registra dades addicionals de l'indexador",
"SyncLevel": "Nivell de sincronització",
"AdvancedSettingsHiddenClickToShow": "Configuració avançada oculta, feu clic per mostrar",
"AdvancedSettingsShownClickToHide": "Configuració avançada mostrada, feu clic per amagar",
"AppsMinimumSeeders": "Aplicacions de cercadors mínims",
"AppsMinimumSeedersHelpText": "«Mínims filtradors requerits per les Aplicacions perquè l'indexador s'agafi",
"CountIndexersAvailable": "{count} indexador(s) disponible",
"HistoryCleanup": "Neteja de l'historial",
"HistoryDetails": "Detalls de l'historial",
"SettingsFilterSentryEventsHelpText": "Filtra els esdeveniments d'error d'usuari coneguts perquè s'enviïn com a Analytics",
"MappedCategories": "Categories assignades",
"AppSettingsSummary": "Aplicacions i paràmetres per configurar com {appName} interactua amb els vostres programes PVR",
"ConnectSettingsSummary": "Notificacions i scripts personalitzats",
"DeleteClientCategory": "Suprimeix la categoria del client de baixada",
"FullSync": "Sincronització completa",
"IndexerAlreadySetup": "Almenys una instància de l'indexador ja està configurada",
"RawSearchSupported": "S'admet la cerca RAW",
"RssFeed": "Canal RSS",
"SearchTypes": "Tipus de cerca",
"SeedRatioHelpText": "La relació a la qual ha d'arribar un torrent abans d'aturar-se, buida és la predeterminada de l'aplicació",
"SemiPrivate": "Semi-Privada",
"TotalIndexerQueries": "Total de consultes de l'indexador",
"TotalUserAgentQueries": "Total de consultes d'agents d'usuari",
"GoToApplication": "Ves a l'aplicació",
"Url": "Url",
"AreYouSureYouWantToDeleteIndexer": "Esteu segur que voleu suprimir '{name}' de {appName}?",
"AverageResponseTimesMs": "Temps mitjà de resposta de l'indexador (ms)",
"FoundCountReleases": "S'han trobat {itemCount} versions",
"AuthQueries": "Consultes d'Autorització",
"BasicSearch": "Cerca bàsica",
"IndexerName": "Nom de l'indexador",
"IndexerStatus": "Estat de l'indexador",
"IndexerTagsHelpText": "Utilitzeu etiquetes per especificar els intermediaris de l'indexador o a quines aplicacions se sincronitza l'indexador.",
"NewznabUrl": "Url Newznab",
"SearchCountIndexers": "Cerca {count} indexador",
"UnableToLoadDevelopmentSettings": "No s'han pogut carregar els paràmetres de desenvolupament",
"SettingsFilterSentryEvents": "Filtra els esdeveniments d'anàlisi",
"ApplicationTagsHelpText": "Sincronitza els indexadors d'aquesta aplicació que tenen una o més etiquetes coincidents. Si no es llisten etiquetes aquí, llavors no s'impedirà la sincronització d'indexadors a causa de les seves etiquetes.",
"ApplicationTagsHelpTextWarning": "Les etiquetes s'han d'utilitzar amb precaució, poden tenir efectes no desitjats. Una aplicació amb una etiqueta només sincronitzarà amb els indexadors que tinguin la mateixa etiqueta.",
"DeleteSelectedApplications": "Suprimeix les aplicacions seleccionades",
"DownloadClientsSettingsSummary": "Baixa la configuració dels clients per a la integració a la cerca de la interfície d'usuari {appName}",
"ElapsedTime": "Temps transcorregut",
"EnableIndexer": "Habilita l'indexador",
"EnableRssHelpText": "Habilita el canal RSS per a l'indexador",
"IncludeManualGrabsHelpText": "Inclou les notes manuals fetes a {appName}",
"IndexerFailureRate": "Taxa de fallada de l'indexador",
"ProwlarrSupportsAnyDownloadClient": "{appName} admet qualsevol dels clients de baixada que es llisten a continuació.",
"TotalGrabs": "Grabs totals",
"IndexerDetails": "Detalls de l'indexador",
"IndexerPriorityHelpText": "Prioritat de l'indexador des de l'1 (el més alt) fins al 50 (el més oest). Per defecte: 25.",
"IndexerProxy": "Servidor intermediari de l'indexador",
"UISettingsSummary": "Opcions de data, idioma i color defectuoses",
"IndexerCategories": "Categories de l'indexador",
"IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech",
"SearchCapabilities": "Capacitats de cerca",
"SearchType": "Tipus de cerca",
"SettingsLogSql": "Registre Sql",
"SyncLevelAddRemove": "Afegeix i elimina només: quan s'afegeixen o s'eliminen els indexadors de {appName}, s'actualitzarà aquesta aplicació remota.",
"IndexerProxies": "Propis de l'indexador",
"ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Sincronitza les fulles del torrent de la llista de blocs en bloc mentre s'agafa",
"CertificateValidationHelpText": "Canvia l'estricta validació de la certificació HTTPS",
"IndexerDisabled": "Indexador desactivat",
"IndexerFileListSettingsPasskeyHelpText": "Contrasenya del lloc (Aquesta és la cadena alfanumèrica a l'URL del seguidor que es mostra al client de baixada)",
"IndexerSettingsQueryLimit": "Límit de consulta",
"IndexerHDBitsSettingsPasskeyHelpText": "Contrasenya dels detalls de l'usuari",
"IndexerSettingsPasskey": "Clau de pas",
"ClickToChangeQueryOptions": "Feu clic per a canviar les opcions de consulta",
"EnabledRedirected": "Activat, redirigit",
"Parameters": "Paràmetres",
"QueryResults": "Resultats de la consulta",
"RedirectHelpText": "Redirigeix la sol·licitud de baixada entrant per a l'indexador i passa la captura directament en lloc de intermediaris a través de {appName}",
"UnableToLoadIndexerProxies": "No s'han pogut carregar els intermediaris de l'indexador",
"IndexerId": "ID de l'indexador",
"IndexerAlphaRatioSettingsExcludeScene": "Exclou l'escena",
"IndexerAlphaRatioSettingsExcludeSceneHelpText": "Exclou els llançaments d'escenes dels resultats",
"IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech",
"IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech",
"IndexerFileListSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech",
"IndexerFileListSettingsUsernameHelpText": "Nom d'usuari del lloc",
"IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Cerca publicacions per noms de grup",
"IndexerHDBitsSettingsOrigins": "Orígens",
"IndexerIPTorrentsSettingsCookieUserAgentHelpText": "Agent d'usuari associat a la cookie utilitzada des del navegador",
"IndexerNewznabSettingsApiKeyHelpText": "Clau de l'API del lloc",
"IndexerNzbIndexSettingsApiKeyHelpText": "Clau de l'API del lloc",
"IndexerSettingsAppsMinimumSeedersHelpText": "«Mínims filtradors requerits per les Aplicacions perquè l'indexador s'agafi",
"IndexerSettingsFreeleechOnly": "Només Freeleech",
"IndexerSettingsGrabLimit": "Límit de captura",
"IndexerSettingsLimitsUnit": "Unitats de límits",
"IndexerSettingsRssKey": "Clau RSS",
"SelectIndexers": "Selecciona els indexadors",
"SettingsSqlLoggingHelpText": "Registra totes les consultes SQL de {appName}",
"SyncAppIndexers": "Sincronitza els indexadors d'aplicacions",
"AppProfileInUse": "Perfil d'aplicació en ús",
"DeleteAppProfile": "Suprimeix el perfil de l'aplicació",
"TVSearchTypes": "Tipus de cerca de TV",
"IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech",
"IndexerMTeamTpSettingsApiKeyHelpText": "Clau API del Lloc (trobada a Tauler de control de l'usuari => Seguretat => Laboratori)",
"MinimumSeedersHelpText": "Visors mínims requerits per l'aplicació perquè l'indexador s'agafi",
"NoIndexerHistory": "No s'ha trobat cap historial per a aquest indexador",
"SearchQueries": "Cerca consultes",
"SettingsConsoleLogLevel": "Nivell de registre de la consola",
"IndexerPassThePopcornSettingsGoldenPopcornOnly": "Només blat de moro daurat",
"IndexerPassThePopcornSettingsGoldenPopcornOnlyHelpText": "Cerca només els llançaments Golden Popcorn",
"Open": "Obre",
"ProwlarrDownloadClientsAlert": "Si voleu fer cerques directament dins de {appName}, heu d'afegir Clients de Baixades. En cas contrari, no cal afegir-les aquí. Per a les cerques des de les teves Apps, els clients de descàrrega configurats s'utilitzen en el seu lloc.",
"Website": "Lloc web",
"DownloadClientQbittorrentSettingsUseSslHelpText": "Utilitza una connexió segura. Vegeu Opcions -> Interfície web -> 'Utilitza HTTPS en comptes d'HTTP' a qBittorrent.",
"IndexerAvistazSettingsFreeleechOnlyHelpText": "Cerca només els llançaments de freeleech",
"IndexerAvistazSettingsPasswordHelpText": "Contrasenya del lloc",
"IndexerAvistazSettingsPidHelpText": "PID de la pàgina del meu compte o del meu perfil",
"IndexerAvistazSettingsUsernameHelpText": "Nom d'usuari del lloc",
"IndexerAvistazSettingsUsernameHelpTextWarning": "Només el rang de membre i superior pot utilitzar l'API en aquest indexador.",
"SelectedCountOfCountReleases": "S'han seleccionat {selectedCount} de les versions {itemCount}",
"SettingsLogRotate": "Rotació del registre",
"AreYouSureYouWantToDeleteCategory": "Esteu segur que voleu suprimir la categoria assignada?",
"Book": "Llibre"
}

View file

@ -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,86 @@
"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",
"NotificationTriggersHelpText": "Vyber, které události mají vyvolat toto upozornění",
"IndexerSettingsBaseUrl": "Základní URL",
"DownloadClientUTorrentProviderMessage": "uTorrent má historii zahrnování kryptoměnových těžařů, malwaru a reklam, důrazně vám doporučujeme zvolit jiného klienta.",
"IndexerSettingsBaseUrlHelpText": "Vyberte, jakou základní URL bude {appName} používat pro požadavky na web",
"IndexerSettingsPackSeedTimeIndexerHelpText": "Doba, po kterou by měl být balíček (sezóna nebo diskografie) torrentu seedován před zastavením, prázdné pole znamená výchozí nastavení aplikace",
"PackSeedTimeHelpText": "Doba, po kterou by měl být balíček (sezóna nebo diskografie) torrentu seedován před zastavením, prázdné pole znamená výchozí nastavení aplikace"
}

View file

@ -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"
}

View file

@ -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",

View file

@ -806,5 +806,6 @@
"InstallMajorVersionUpdateMessageLink": "Por favor revisa [{domain}]({url}) para más información.",
"FailedToFetchSettings": "Error al recuperar la configuración",
"CurrentlyInstalled": "Actualmente instalado",
"PreviouslyInstalled": "Previamente instalado"
"PreviouslyInstalled": "Previamente instalado",
"DownloadClientUTorrentProviderMessage": "uTorrent tiene un amplio historial de incluir criptomineros, malware y publicidad, por lo que recomendamos encarecidamente que elijas un cliente diferente."
}

View file

@ -1 +1,13 @@
{}
{
"ApiKey": "کلید API",
"NetCore": ".NET",
"Add": "افزودن",
"About": "درباره",
"Actions": "اقدامات",
"Docker": "Docker",
"AddConnection": "افزودن پیوند",
"AddConnectionImplementation": "افزودن پیوند - {implementationName}",
"AddDownloadClientImplementation": "افزودن کلاینت دانلود - {implementationName}",
"Torrents": "تورنت ها",
"Usenet": "Usenet"
}

View file

@ -34,7 +34,7 @@
"Fixed": "Korjattu",
"FocusSearchBox": "Kohdista hakukenttä",
"ForMoreInformationOnTheIndividualDownloadClients": "Saat lisätietoja yksittäisistä latauspalveluista painamalla niiden ohessa olevia lisätietopainikkeita.",
"HideAdvanced": "Piilota lisäasetukset",
"HideAdvanced": "Laajenna asetukset",
"History": "Historia",
"MIA": "Puuttuu",
"New": "Uutta",
@ -88,7 +88,7 @@
"Logs": "Lokitiedot",
"Mechanism": "Mekanismi",
"Name": "Nimi",
"NoLinks": "Ei linkkejä",
"NoLinks": "Kytköksiä ei ole",
"Peers": "Vertaiset",
"Presets": "Esiasetukset",
"Priority": "Painotus",
@ -121,7 +121,7 @@
"TagIsNotUsedAndCanBeDeleted": "Tunniste ei ole käytössä ja voidaan poistaa.",
"TagsSettingsSummary": "Täältä näet kaikki tunnisteet käyttökohteineen ja voit poistaa käyttämättömät tunnisteet.",
"Tasks": "Tehtävät",
"Test": "Testaa",
"Test": "Koesta",
"TestAllClients": "Koesta palvelut",
"Time": "Aika",
"Title": "Nimike",
@ -161,7 +161,7 @@
"SendAnonymousUsageData": "Lähetä nimettömiä käyttötietoja",
"SetTags": "Tunnisteiden määritys",
"SettingsEnableColorImpairedMode": "Heikentyneen värinäön tila",
"ShowAdvanced": "Näytä lisäasetukset",
"ShowAdvanced": "Supista asetukset",
"ShowSearchHelpText": "Näytä hakupainike osoitettaessa.",
"Shutdown": "Sammuta",
"Size": "Koko",
@ -207,7 +207,7 @@
"StartTypingOrSelectAPathBelow": "Aloita kirjoitus tai valitse sijainti alta",
"StartupDirectory": "Käynnistyskansio",
"TableOptions": "Taulukkonäkymän asetukset",
"TableOptionsColumnsMessage": "Valitse näytettävät sarakkeet ja niiden järjestys",
"TableOptionsColumnsMessage": "Valitse näytettävät sarakkeet ja niiden järjestys.",
"TagsHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille hakupalveluille.",
"UnableToAddANewAppProfilePleaseTryAgain": "Virhe lisättäessä sovellusprofiilia. Yritä uudelleen.",
"UnableToAddANewNotificationPleaseTryAgain": "Ilmoituspalvelun lisääminen epäonnistui. Yritä uudelleen.",
@ -312,7 +312,7 @@
"FullSync": "Täysi synkronointi",
"SyncLevelFull": "Täysi synkronointi: Pitää sovelluksen hakupalvelut täysin synkronoituna. Hakupalveluihin {appName}issa tehdyt muutokset synkronoidaan etäsovelluksen kanssa ja kaikki etäsovelluksessa tehdyt muutokset korvataan seuraavan synkronoinnin yhteydessä.",
"EnableIndexer": "Ota hakupalvelu käyttöön",
"FilterPlaceHolder": "Suodata hakupalveluita",
"FilterPlaceHolder": "Suodata palveluita",
"IndexerHealthCheckNoIndexers": "Yhtään hakupalvelua ei ole käytössä, eikä {appName} tämän vuoksi löydä tuloksia.",
"IndexerObsoleteCheckMessage": "Hakupalvelut ovat poistuneet tai ne ovat muuttuneet: {0}. Poista tai lisää ne {appName}iin uudelleen.",
"IndexerProxy": "Tiedonhaun välityspalvelin",
@ -369,7 +369,7 @@
"EnableRssHelpText": "Käytä hakupalvelulle RSS-syötettä.",
"DeleteApplication": "Poista sovellus",
"DeleteAppProfile": "Poista sovellusprofiili",
"IndexerProxies": "Tiedonhaun välityspalvelimet",
"IndexerProxies": "Hakupalveluiden välityspalvelimet",
"IndexerAuth": "Hakupalvelun todennus",
"Notifications": "Ilmoituspalvelut",
"NotificationTriggersHelpText": "Valitse ilmoituksen laukaisevat tapahtumat.",
@ -507,7 +507,7 @@
"AddDownloadClientImplementation": "Lisätään latauspalvelua {implementationName}",
"AddIndexerImplementation": "Lisätään hakupalvelua {implementationName}",
"OnGrabHelpText": "Kun julkaisu kaapataan",
"ManageDownloadClients": "Hallitse latauspalveluita",
"ManageDownloadClients": "Hallitse palveluita",
"NoDownloadClientsFound": "Latauspalveluita ei löytynyt",
"CountDownloadClientsSelected": "{count} latauspalvelu(a) on valittu",
"EditSelectedDownloadClients": "Muokkaa valittuja latauspalveluita",
@ -519,7 +519,7 @@
"ApplyChanges": "Toteuta muutokset",
"EditSelectedIndexers": "Muokkaa valittuja sisältölähteitä",
"NoHistoryFound": "Historiaa ei löytynyt",
"NoIndexersFound": "Hakupalveluita ei löytynyt",
"NoIndexersFound": "Palveluita ei löytynyt",
"StopSelecting": "Lopeta valitseminen",
"EditConnectionImplementation": "Muokataan ilmoituspalvelua {implementationName}",
"AddConnectionImplementation": "Lisätään ilmoituspavelua {implementationName}",
@ -556,7 +556,7 @@
"Implementation": "Toteutus",
"IndexerCategories": "Hakupalvelukategoriat",
"IndexerStatus": "Hakupalvelun tila",
"ManageApplications": "Sovellusten hallinta",
"ManageApplications": "Hallitse sovelluksia",
"NewznabUrl": "Newznab URL",
"PackSeedTime": "Paketin jakoaika",
"PackSeedTimeHelpText": "Aika, joka koostepaketin (kuten sarjan tuotantokauden tai esittäjän diskografian) sisältävää torrentia tulee jakaa. Käytä sovelluksen oletusta jättämällä tyhjäksi.",
@ -715,8 +715,8 @@
"UpdaterLogFiles": "Päivittäjän lokitiedostot",
"WouldYouLikeToRestoreBackup": "Haluatko palauttaa varmuuskopion \"{name}\"?",
"InstallLatest": "Asenna uusin",
"CurrentlyInstalled": "Nyt asennettu",
"PreviouslyInstalled": "Aiemmin asennettu",
"CurrentlyInstalled": "Käytössä oleva versio",
"PreviouslyInstalled": "Aiemmin käytössä ollut versio",
"Mixed": "Sekoitettu",
"IndexerSettingsAppsMinimumSeeders": "Jakajien vähimmäismäärä",
"FailedToFetchSettings": "Asetusten nouto epäonnistui",
@ -805,6 +805,6 @@
"IndexerPassThePopcornSettingsGoldenPopcornOnly": "Vain \"Golden Popcorn\"",
"IndexerPassThePopcornSettingsGoldenPopcornOnlyHelpText": "Etsi vain ns. kultaisella pocornilla merkittyjä julkaisuja.",
"IndexerSettingsFreeleechOnly": "Vain \"Freeleech\"",
"IndexerSettingsCookieHelpText": "Jos sivusto vaatii kirjautumisevästeen, se on noudettava selaimen kautta.",
"IndexerSettingsCookieHelpText": "Jos sivusto vaatii kirjautumisevästeen, on se noudettava selaimen avulla.",
"IndexerAvistazSettingsPasswordHelpText": "Sivuston salasana"
}

View file

@ -806,5 +806,6 @@
"IndexerSettingsPreferMagnetUrl": "URL de préférence Magnet",
"IndexerPassThePopcornSettingsGoldenPopcornOnly": "Popcorn doré uniquement",
"IndexerPassThePopcornSettingsGoldenPopcornOnlyHelpText": "Rechercher uniquement les versions Golden Popcorn",
"IndexerAvistazSettingsUsernameHelpTextWarning": "Seuls les membres de rang et supérieur peuvent utiliser l'API sur cet indexeur."
"IndexerAvistazSettingsUsernameHelpTextWarning": "Seuls les membres de rang et supérieur peuvent utiliser l'API sur cet indexeur.",
"DownloadClientUTorrentProviderMessage": "uTorrent a un historique d'inclusion de cryptomineurs, de logiciels malveillants et de publicités. Nous vous recommandons fortement de choisir un autre client."
}

View file

@ -417,5 +417,94 @@
"UsenetBlackholeNzbFolder": "Nzb 폴더",
"UseSsl": "SSL 사용",
"TorrentBlackholeTorrentFolder": "토렌트 폴더",
"DownloadClientPneumaticSettingsNzbFolder": "Nzb 폴더"
"DownloadClientPneumaticSettingsNzbFolder": "Nzb 폴더",
"UserAgentProvidedByTheAppThatCalledTheAPI": "API를 호출한 앱에서 제공하는 사용자 에이전트",
"days": "일",
"minutes": "분",
"Author": "저작자",
"Categories": "카테고리",
"SeedRatio": "종자 비율",
"AuthenticationRequiredHelpText": "필수 인증을 요청하는 변경 사항. 위험을 이해하지 못한다면 변경하지 마세요.",
"DownloadClientFloodSettingsAdditionalTagsHelpText": "미디어의 속성을 태그로 추가합니다. 힌트는 예시입니다.",
"DownloadClientRTorrentSettingsAddStoppedHelpText": "활성화하면 rTorrent에 정지된 상태에서 토런트와 마그넷이 추가됩니다. 마그넷 파일이 손상될 수 있습니다.",
"HealthMessagesInfoBox": "행 끝에 있는 위키 링크(책 아이콘)를 클릭하거나 [로그]({link})를 확인하면 이러한 상태 점검 메시지의 원인에 대한 상세 정보를 찾을 수 있습니다. 이러한 메시지를 해석하는 데 어려움이 있는 경우 아래 링크에서 지원팀에 문의할 수 있습니다.",
"DownloadClientSettingsDestinationHelpText": "다운로드 대상을 수동으로 지정하고 기본값을 사용하려면 비워두세요.",
"DownloadClientSettingsInitialStateHelpText": "{clientName}에 추가된 토런트의 초기 상태",
"IndexerSettingsAdditionalParameters": "매개 변수 추가",
"NoEventsFound": "이벤트가 없음",
"BlackholeFolderHelpText": "{appName}가 {extension} 파일을 저장할 폴더",
"DownloadClientSettingsUrlBaseHelpText": "{clientName} url에 {url}과 같은 접두사를 추가합니다.",
"DownloadClientQbittorrentSettingsContentLayout": "콘텐츠 레이아웃",
"Install": "설치",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "새 비밀번호 확인",
"FailedToFetchSettings": "설정을 가져오는데 실패함",
"Default": "기본값",
"Episode": "에피소드",
"AuthenticationMethod": "인증 방법",
"IndexerSettingsSeedRatio": "시드 비율",
"Destination": "대상",
"DownloadClientFreeboxSettingsAppToken": "앱 토큰",
"Logout": "로그아웃",
"DownloadClientFreeboxSettingsApiUrl": "API 주소",
"IndexerHDBitsSettingsCodecs": "코덱",
"WhatsNew": "새로운 소식?",
"DownloadClientFreeboxSettingsPortHelpText": "Freebox 인터페이스에 액세스하는 데 사용되는 포트, 기본값은 '{port}'",
"DownloadClientPneumaticSettingsStrmFolderHelpText": "이 폴더의 .strm 파일은 드론으로 가져옵니다.",
"DownloadClientQbittorrentSettingsInitialStateHelpText": "qBittorrent에 추가된 토렌트의 초기 상태입니다. 강제 토렌트는 시드 제한을 따르지 않는다는 점에 유의하세요.",
"DownloadClientRTorrentSettingsDirectoryHelpText": "다운로드를 넣을 선택 위치, 기본 rTorrent 위치를 사용하려면 비워두세요.",
"DownloadClientSettingsUseSslHelpText": "{clientName}에 연결할 때 보안 연결을 사용",
"DownloadClientTransmissionSettingsUrlBaseHelpText": "{clientName} rpc URL에 접두사를 추가합니다(예: {url}, 기본값은 '{defaultUrl}')",
"InstallMajorVersionUpdateMessageLink": "상세 내용은 [{domain}]({url})을 확인하세요.",
"ApplicationUrlHelpText": "이 애플리케이션의 외부 URL - http(s)://, port 및 URL 기반 포함",
"Theme": "테마",
"ApplicationURL": "애플리케이션 URL",
"Directory": "디렉토리",
"DownloadClientDownloadStationSettingsDirectoryHelpText": "다운로드를 넣을 공유 폴더(선택 사항). 기본 다운로드 스테이션 위치를 사용하려면 비워두세요.",
"DownloadClientFloodSettingsAdditionalTags": "추가 태그",
"DownloadClientFloodSettingsUrlBaseHelpText": "{url}와 같은 Flood API에 접두사를 추가합니다",
"DownloadClientFreeboxSettingsApiUrlHelpText": "API 버전을 사용하여 Freebox API 기본 URL을 정의하세요, 예를 들어 '{url}', 기본값은 '{defaultApiUrl}')",
"DownloadClientFreeboxSettingsAppId": "앱 ID",
"DownloadClientNzbgetSettingsAddPausedHelpText": "이 옵션을 사용하려면 최소한 NzbGet 버전 16.0이 필요합니다",
"DownloadClientPneumaticSettingsNzbFolderHelpText": "이 폴더는 XBMC에서 접근할 수 있어야 합니다.",
"DownloadClientRTorrentSettingsAddStopped": "중지됨 추가",
"Category": "카테고리",
"DownloadClientTransmissionSettingsDirectoryHelpText": "다운로드를 넣을 위치 (선택 사항), 기본 전송 위치를 사용하려면 비워두세요",
"External": "외부",
"IndexerSettingsSeedRatioHelpText": "토렌드가 멈추기 전에 도달해야 하는 비율, 비어 있을 경우 다운로드 클라이언트의 기본값을 사용합니다. 비율은 최소 1.0이어야 하며 인덱서 규칙을 따라야 합니다",
"IndexerSettingsSeedTimeHelpText": "토렌드가 중지되기 전에 시드되어야 하는 시간, 비어 있을 경우 다운로드 클라이언트의 기본값을 사용합니다",
"InvalidUILanguage": "UI가 잘못된 언어로 설정되어 있습니다, 수정하고 설정을 저장하세요",
"AuthenticationRequired": "인증 필요",
"NotificationsTelegramSettingsIncludeAppNameHelpText": "다른 애플리케이션의 알림을 구분하기 위해 메시지 제목 앞에 {appName}를 접두사로 사용 (선택 사항)",
"PackageVersionInfo": "{packageVersion} by {packageAuthor}",
"Duration": "기간",
"Script": "스크립트",
"SelectDownloadClientModalTitle": "{modalTitle} - 다운로드 클라이언트 선택",
"TheLogLevelDefault": "로그 수준의 기본값은 '정보'이며 [일반 설정](/settings/general)에서 변경할 수 있습니다",
"UpdaterLogFiles": "업데이트 도구 로그 파일",
"CountDownloadClientsSelected": "{count}개의 다운로드 클라이언트를 선택함",
"DefaultNameCopiedProfile": "{name} - 복사",
"DownloadClientDelugeSettingsUrlBaseHelpText": "deluge json url에 접두사를 추가합니다. {url}을(를) 참조하세요",
"FailedToFetchUpdates": "업데이트를 가져오는데 실패함",
"ApplyChanges": "변경 사항 적용",
"Started": "시작됨",
"Database": "데이터베이스",
"PasswordConfirmation": "비밀번호 확인",
"TorrentBlackholeSaveMagnetFiles": "마그넷 파일 저장",
"TorrentBlackholeSaveMagnetFilesExtension": "마그넷 파일 확장자 저장",
"TorrentBlackholeSaveMagnetFilesExtensionHelpText": "마그넷 링크에 사용할 확장자, 기본값은 '.magnet'입니다",
"TorrentBlackholeSaveMagnetFilesHelpText": ".torrent 파일을 사용할 수 없는 경우 마그넷 링크를 저장합니다 (다운로드 클라이언트가 파일에 저장된 마그넷을 지원하는 경우에만 유용함)",
"AuthenticationMethodHelpTextWarning": "유효한 인증 방법을 선택해주세요",
"AuthenticationRequiredPasswordHelpTextWarning": "새로운 비밀번호를 입력하세요",
"AuthenticationRequiredUsernameHelpTextWarning": "새로운 사용자이름을 입력하세요",
"AuthenticationRequiredWarning": "인증 없이 원격 액세스를 방지하기 위해 {appName}은(는) 이제 인증을 활성화해야 합니다. 선택적으로 로컬 주소에서 인증을 비활성화할 수 있습니다.",
"CountIndexersSelected": "{count}개의 인덱서를 선택함",
"Label": "라벨",
"More": "더 보기",
"Donate": "기부하기",
"Menu": "메뉴",
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "qBittorrent의 구성된 콘텐츠 레이아웃을 사용할지, 토런트의 원래 레이아웃을 사용할지, 항상 하위 폴더를 생성할지(qBittorrent 4.3.2+)",
"DownloadClientSettingsAddPaused": "일시 중지 추가",
"SecretToken": "비밀 토큰",
"NoDownloadClientsFound": "다운로드 클라이언트를 찾을 수 없음",
"PrioritySettings": "우선 순위: {0}"
}

View file

@ -160,5 +160,6 @@
"AptUpdater": "Bruk apt til å installere oppdateringen",
"Discord": "Discord",
"AddCustomFilter": "Legg til eget filter",
"Clone": "Lukk"
"Clone": "Lukk",
"AddDownloadClientImplementation": "Ny Nedlastingsklient - {implementationName}"
}

View file

@ -806,5 +806,6 @@
"InstallMajorVersionUpdateMessageLink": "Verifique [{domain}]({url}) para obter mais informações.",
"FailedToFetchSettings": "Falha ao obter configurações",
"CurrentlyInstalled": "Atualmente instalado",
"PreviouslyInstalled": "Instalado anteriormente"
"PreviouslyInstalled": "Instalado anteriormente",
"DownloadClientUTorrentProviderMessage": "O uTorrent tem um histórico de incluir criptomineradores, malware e anúncios, recomendamos que você escolha outro cliente de download."
}

View file

@ -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"
}

View file

@ -806,5 +806,6 @@
"InstallMajorVersionUpdateMessage": "Это обновление установит новую версию, которая может не поддерживаться вашей системой. Вы уверены, что хотите установить это обновление?",
"FailedToFetchSettings": "Не удалось загрузить настройки",
"CurrentlyInstalled": "Установлено",
"PreviouslyInstalled": "Ранее установленный"
"PreviouslyInstalled": "Ранее установленный",
"DownloadClientUTorrentProviderMessage": "Мы настоятельно советуем не использовать uTorrent, т.к. он известен как программа-шифровальщик и в целом вредоносное ПО."
}

View file

@ -806,5 +806,6 @@
"IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Kullanıcı ve Torrent izinlerine sahip olmalısınız",
"IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Grup adlarına göre sürüm ara",
"IndexerHealthCheckNoIndexers": "Hiçbir indeksleyici etkinleştirilmedi, {appName} arama sonuçlarını döndürmeyecek",
"QueryType": "Sorgu Türü"
"QueryType": "Sorgu Türü",
"DownloadClientUTorrentProviderMessage": "uTorrent'in kripto para madenciliği, kötü amaçlı yazılım ve reklam içerme geçmişi vardır, bu nedenle farklı bir istemci seçmenizi önemle tavsiye ederiz."
}

View file

@ -441,5 +441,13 @@
"CurrentlyInstalled": "В даний час встановлено",
"Season": "Причина",
"Stats": "Статус",
"CountIndexersSelected": "{count} індексер(-и) обрано"
"CountIndexersSelected": "{count} індексер(-и) обрано",
"SeedRatio": "Коефіцієнт роздачі",
"ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Якщо торрент заблоковано хешем, він може не бути належним чином відхилений під час RSS/пошуку для деяких індексаторів. Увімкнення цього параметра дозволить відхилити його після захоплення торента, але до його відправки клієнту.",
"MinimumSeeders": "Мінімум сидерів (роздаючих)",
"SeedTime": "Час сидіння",
"Author": "Автор",
"OnHealthRestoredHelpText": "При відновленні стану",
"IndexerHDBitsSettingsOriginsHelpText": "Якщо не вказано, використовуються всі параметри.",
"days": "дні(в)"
}

View file

@ -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"
}

View file

@ -2,5 +2,6 @@
"About": "关于",
"Add": "添加",
"Analytics": "分析",
"Username": "用户名"
"Username": "用户名",
"AcceptConfirmationModal": "中文"
}

View file

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using FluentValidation.Results;
using NLog;
using NzbDrone.Common.Disk;
@ -38,7 +39,31 @@ namespace NzbDrone.Core.Notifications.CustomScript
public override string Link => "https://wiki.servarr.com/prowlarr/settings#connections";
public override ProviderMessage Message => new ProviderMessage("Testing will execute the script with the EventType set to Test, ensure your script handles this correctly", ProviderMessageType.Warning);
public override ProviderMessage Message => new ("Testing will execute the script with the EventType set to Test, ensure your script handles this correctly", ProviderMessageType.Warning);
public override void OnGrab(GrabMessage message)
{
var environmentVariables = new StringDictionary();
environmentVariables.Add("Prowlarr_EventType", "Grab");
environmentVariables.Add("Prowlarr_InstanceName", _configFileProvider.InstanceName);
environmentVariables.Add("Prowlarr_ApplicationUrl", _configService.ApplicationUrl);
environmentVariables.Add("Prowlarr_Release_Title", message.Release.Title);
environmentVariables.Add("Prowlarr_Release_Indexer", message.Release.Indexer ?? string.Empty);
environmentVariables.Add("Prowlarr_Release_Size", message.Release.Size.ToString());
environmentVariables.Add("Prowlarr_Release_Genres", string.Join("|", message.Release.Genres));
environmentVariables.Add("Prowlarr_Release_Categories", string.Join("|", message.Release.Categories.Select(f => f.Name)));
environmentVariables.Add("Prowlarr_Release_IndexerFlags", string.Join("|", message.Release.IndexerFlags.Select(f => f.Name)));
environmentVariables.Add("Prowlarr_Release_PublishDate", message.Release.PublishDate.ToUniversalTime().ToString("s") + "Z");
environmentVariables.Add("Prowlarr_Download_Client", message.DownloadClientName ?? string.Empty);
environmentVariables.Add("Prowlarr_Download_Client_Type", message.DownloadClientType ?? string.Empty);
environmentVariables.Add("Prowlarr_Download_Id", message.DownloadId ?? string.Empty);
environmentVariables.Add("Prowlarr_Source", message.Source ?? string.Empty);
environmentVariables.Add("Prowlarr_Host", message.Host ?? string.Empty);
environmentVariables.Add("Prowlarr_Redirect", message.Redirect.ToString());
ExecuteScript(environmentVariables);
}
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{
@ -130,10 +155,5 @@ namespace NzbDrone.Core.Notifications.CustomScript
return processOutput;
}
private bool ValidatePathParent(string possibleParent, string path)
{
return possibleParent.IsParentPath(path);
}
}
}

View file

@ -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]);
}
}
}

View file

@ -1,3 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using NzbDrone.Core.Parser.Model;
namespace NzbDrone.Core.Notifications.Webhook
@ -13,10 +16,18 @@ namespace NzbDrone.Core.Notifications.Webhook
ReleaseTitle = release.Title;
Indexer = release.Indexer;
Size = release.Size;
Categories = release.Categories.Select(f => f.Name).ToList();
Genres = release.Genres.ToList();
IndexerFlags = release.IndexerFlags.Select(f => f.Name).ToHashSet();
PublishDate = release.PublishDate;
}
public string ReleaseTitle { get; set; }
public string Indexer { get; set; }
public long? Size { get; set; }
public List<string> Categories { get; set; }
public List<string> Genres { get; set; }
public HashSet<string> IndexerFlags { get; set; }
public DateTime? PublishDate { get; set; }
}
}

View file

@ -9,6 +9,7 @@ namespace NzbDrone.Core.Parser.Model
{
public ReleaseInfo()
{
Genres = new List<string>();
IndexerFlags = new HashSet<IndexerFlag>();
Categories = new List<IndexerCategory>();
Languages = new List<string>();

View file

@ -11,18 +11,18 @@
<PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0" />
<PackageReference Include="Microsoft.Data.SqlClient" Version="2.1.7" />
<PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" />
<PackageReference Include="Npgsql" Version="7.0.9" />
<PackageReference Include="Polly" Version="8.5.1" />
<PackageReference Include="Npgsql" Version="7.0.10" />
<PackageReference Include="Polly" Version="8.5.2" />
<PackageReference Include="Servarr.FluentMigrator.Runner" Version="3.3.2.9" />
<PackageReference Include="Servarr.FluentMigrator.Runner.Postgres" Version="3.3.2.9" />
<PackageReference Include="Servarr.FluentMigrator.Runner.SQLite" Version="3.3.2.9" />
<PackageReference Include="System.Memory" Version="4.6.0" />
<PackageReference Include="System.Memory" Version="4.6.3" />
<PackageReference Include="System.ServiceModel.Syndication" Version="6.0.0" />
<PackageReference Include="FluentValidation" Version="9.5.4" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="NLog" Version="5.3.4" />
<PackageReference Include="NLog" Version="5.4.0" />
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
<PackageReference Include="System.Text.Json" Version="6.0.10" />
<PackageReference Include="System.Text.Json" Version="6.0.11" />
<PackageReference Include="MonoTorrent" Version="2.0.7" />
<PackageReference Include="YamlDotNet" Version="13.1.1" />
<PackageReference Include="AngleSharp" Version="1.2.0" />

View file

@ -4,10 +4,10 @@
<OutputType>Library</OutputType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NLog.Extensions.Logging" Version="5.3.15" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" />
<PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.3" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="7.3.2" />
<PackageReference Include="DryIoc.dll" Version="5.4.3" />
<PackageReference Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" />
</ItemGroup>

View file

@ -6,7 +6,7 @@
<PackageReference Include="FluentAssertions" Version="6.11.0" />
<PackageReference Include="FluentValidation" Version="9.5.4" />
<PackageReference Include="Moq" Version="4.17.2" />
<PackageReference Include="NLog" Version="5.3.4" />
<PackageReference Include="NLog" Version="5.4.0" />
<PackageReference Include="NUnit" Version="3.14.0" />
<PackageReference Include="RestSharp" Version="106.15.0" />
<PackageReference Include="RestSharp.Serializers.SystemTextJson" Version="106.15.0" />

View file

@ -6,7 +6,7 @@
<ItemGroup>
<PackageReference Include="DryIoc.dll" Version="5.4.3" />
<PackageReference Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" />
<PackageReference Include="NLog" Version="5.3.4" />
<PackageReference Include="NLog" Version="5.4.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Common\Prowlarr.Common.csproj" />

View file

@ -4,7 +4,7 @@
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NLog" Version="5.3.4" />
<PackageReference Include="NLog" Version="5.4.0" />
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="5.0.0" />
</ItemGroup>
<ItemGroup>

View file

@ -1,3 +1,4 @@
using FluentValidation;
using NzbDrone.Core.Download;
using NzbDrone.SignalR;
using Prowlarr.Http;
@ -13,6 +14,7 @@ namespace Prowlarr.Api.V1.DownloadClient
public DownloadClientController(IBroadcastSignalRMessage signalRBroadcaster, IDownloadClientFactory downloadClientFactory)
: base(signalRBroadcaster, downloadClientFactory, "downloadclient", ResourceMapper, BulkResourceMapper)
{
SharedValidator.RuleFor(c => c.Priority).InclusiveBetween(1, 50);
}
}
}

View file

@ -1,6 +1,5 @@
using System.Collections.Generic;
using System.Linq;
using NzbDrone.Common.Http;
using NzbDrone.Core.HealthCheck;
using Prowlarr.Http.REST;
@ -11,7 +10,7 @@ namespace Prowlarr.Api.V1.Health
public string Source { get; set; }
public HealthCheckResult Type { get; set; }
public string Message { get; set; }
public HttpUri WikiUrl { get; set; }
public string WikiUrl { get; set; }
}
public static class HealthResourceMapper
@ -29,7 +28,7 @@ namespace Prowlarr.Api.V1.Health
Source = model.Source.Name,
Type = model.Type,
Message = model.Message,
WikiUrl = model.WikiUrl
WikiUrl = model.WikiUrl.FullUri
};
}

View file

@ -21,6 +21,7 @@ namespace Prowlarr.Api.V1.Indexers
.ValidId()
.SetValidator(appProfileExistsValidator);
SharedValidator.RuleFor(c => c.Priority).InclusiveBetween(1, 50);
SharedValidator.RuleFor(c => c.DownloadClientId).SetValidator(downloadClientExistsValidator);
}
}

View file

@ -4,8 +4,8 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="FluentValidation" Version="9.5.4" />
<PackageReference Include="NLog" Version="5.3.4" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" />
<PackageReference Include="NLog" Version="5.4.0" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="7.3.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Core\Prowlarr.Core.csproj" />

View file

@ -1,4 +1,5 @@
using System.Collections.Generic;
using FluentValidation;
using Microsoft.AspNetCore.Mvc;
using NzbDrone.Core.Datastore.Events;
using NzbDrone.Core.Messaging.Events;
@ -20,6 +21,8 @@ namespace Prowlarr.Api.V1.Tags
: base(signalRBroadcaster)
{
_tagService = tagService;
SharedValidator.RuleFor(c => c.Label).NotEmpty();
}
public override TagResource GetResourceById(int id)

View file

@ -4739,7 +4739,8 @@
"nullable": true
},
"wikiUrl": {
"$ref": "#/components/schemas/HttpUri"
"type": "string",
"nullable": true
}
},
"additionalProperties": false
@ -4991,48 +4992,6 @@
},
"additionalProperties": false
},
"HttpUri": {
"type": "object",
"properties": {
"fullUri": {
"type": "string",
"nullable": true,
"readOnly": true
},
"scheme": {
"type": "string",
"nullable": true,
"readOnly": true
},
"host": {
"type": "string",
"nullable": true,
"readOnly": true
},
"port": {
"type": "integer",
"format": "int32",
"nullable": true,
"readOnly": true
},
"path": {
"type": "string",
"nullable": true,
"readOnly": true
},
"query": {
"type": "string",
"nullable": true,
"readOnly": true
},
"fragment": {
"type": "string",
"nullable": true,
"readOnly": true
}
},
"additionalProperties": false
},
"IActionResult": {
"type": "object",
"additionalProperties": false

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