mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2026-03-09 15:20:01 -04:00
Compare commits
55 Commits
v2.0.4.513
...
sql-fallba
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ab4d80faa6 | ||
|
|
a2afcff6df | ||
|
|
e4fb36e08f | ||
|
|
ff22fdf7d3 | ||
|
|
b3d46465ae | ||
|
|
eb57d20545 | ||
|
|
775b716c0f | ||
|
|
f7f3648dac | ||
|
|
c669048767 | ||
|
|
c282e4bef8 | ||
|
|
574721bfb5 | ||
|
|
3c7575b58e | ||
|
|
93d8f81750 | ||
|
|
364c7c9c7e | ||
|
|
54af7fd3d0 | ||
|
|
e6bc7fa062 | ||
|
|
98608e75a6 | ||
|
|
160320f3a2 | ||
|
|
c9baaf634e | ||
|
|
8bf2f68abe | ||
|
|
9434091912 | ||
|
|
2f7d821d45 | ||
|
|
471c9910a0 | ||
|
|
98ff2f5cb6 | ||
|
|
4d9982872a | ||
|
|
ae9326480e | ||
|
|
624cbd548f | ||
|
|
f5f98e4f53 | ||
|
|
8585dd447e | ||
|
|
dfffb3aa4e | ||
|
|
7eb2d956cf | ||
|
|
8da493dbaf | ||
|
|
f17cf6144f | ||
|
|
1b3adc4529 | ||
|
|
389f049a8b | ||
|
|
99b0fcd750 | ||
|
|
516b09ca91 | ||
|
|
770fd64013 | ||
|
|
f67c672ec7 | ||
|
|
80425f5ea4 | ||
|
|
758cae3f40 | ||
|
|
fbf4ff6777 | ||
|
|
98ee9c1703 | ||
|
|
c537e94f0f | ||
|
|
9e5dd2a2e6 | ||
|
|
f601ff98a2 | ||
|
|
540fafdebf | ||
|
|
532bffe772 | ||
|
|
bf80f7916c | ||
|
|
2f6a9dfffb | ||
|
|
94477e9cf9 | ||
|
|
52e21b3dfc | ||
|
|
cb4cc81ad0 | ||
|
|
7ada036480 | ||
|
|
f1c9ba40c4 |
13
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
13
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -4,11 +4,18 @@ labels: ['Type: Bug', 'Status: Needs Triage']
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Is there an existing issue for this?
|
||||
label: I attest that there is not an existing issue for this?
|
||||
description: Please search to see if an open or closed issue already exists for the bug you encountered. If a bug exists and is closed note that it may only be fixed in an unstable branch.
|
||||
options:
|
||||
- label: I have searched the existing open and closed issues
|
||||
required: true
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: I attest this is not related to a Cardigann YML Indexer.
|
||||
description: Please search to see if this is for a tracker [that is yml-based (Cardigann)](https://github.com/Prowlarr/indexers) these are synced to Prowlarr/Indexers from Jackett/Jackett.
|
||||
options:
|
||||
- label: I confirm this is not related to a Cardigann YML Indexer
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Current Behavior
|
||||
@@ -73,8 +80,8 @@ body:
|
||||
required: true
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Trace Logs have been provided as applicable. Reports may be closed if the required logs are not provided.
|
||||
label: I attest that Trace Logs have been provided as applicable. Reports will be closed if the required logs are not provided.
|
||||
description: Trace logs are generally required for all bug reports and contain `trace`. Info logs are invalid for bug reports and do not contain `debug` nor `trace`
|
||||
options:
|
||||
- label: I have read and followed the steps in the wiki link above and provided the required trace logs - the logs contain `trace` - that are relevant and show this issue.
|
||||
- label: I attest that I have read and followed the steps in the wiki link above and provided the required trace logs - the logs contain `trace` - that are relevant and show this issue.
|
||||
required: true
|
||||
|
||||
@@ -9,7 +9,7 @@ variables:
|
||||
testsFolder: './_tests'
|
||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||
majorVersion: '2.0.4'
|
||||
majorVersion: '2.3.0'
|
||||
minorVersion: $[counter('minorVersion', 1)]
|
||||
prowlarrVersion: '$(majorVersion).$(minorVersion)'
|
||||
buildName: '$(Build.SourceBranchName).$(prowlarrVersion)'
|
||||
@@ -1158,7 +1158,7 @@ stages:
|
||||
extraProperties: |
|
||||
sonar.exclusions=**/obj/**,**/*.dll,**/NzbDrone.Core.Test/Files/**/*,./frontend/**,**/ExternalModules/**,./src/Libraries/**
|
||||
sonar.coverage.exclusions=**/Prowlarr.Api.V1/**/*
|
||||
sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml
|
||||
sonar.cs.cobertura.reportsPaths=$(Build.SourcesDirectory)/CoverageResults/**/coverage.cobertura.xml
|
||||
sonar.cs.nunit.reportsPaths=$(Build.SourcesDirectory)/TestResult.xml
|
||||
- bash: |
|
||||
./build.sh --backend -f net8.0 -r win-x64
|
||||
@@ -1170,10 +1170,11 @@ stages:
|
||||
- task: reportgenerator@5
|
||||
displayName: Generate Coverage Report
|
||||
inputs:
|
||||
reports: '$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml'
|
||||
reports: '$(Build.SourcesDirectory)/CoverageResults/**/coverage.cobertura.xml'
|
||||
targetdir: '$(Build.SourcesDirectory)/CoverageResults/combined'
|
||||
reporttypes: 'HtmlInline_AzurePipelines;Cobertura;Badges'
|
||||
publishCodeCoverageResults: true
|
||||
sourcedirs: src
|
||||
|
||||
- stage: Report_Out
|
||||
dependsOn:
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
.modal {
|
||||
position: relative;
|
||||
display: flex;
|
||||
max-width: 90%;
|
||||
max-height: 90%;
|
||||
border-radius: 6px;
|
||||
opacity: 1;
|
||||
|
||||
56
frontend/src/Helpers/Hooks/useTheme.ts
Normal file
56
frontend/src/Helpers/Hooks/useTheme.ts
Normal file
@@ -0,0 +1,56 @@
|
||||
import { useEffect, useState } from 'react';
|
||||
import { useSelector } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import AppState from 'App/State/AppState';
|
||||
import themes from 'Styles/Themes';
|
||||
|
||||
function createThemeSelector() {
|
||||
return createSelector(
|
||||
(state: AppState) => state.settings.ui.item.theme || window.Prowlarr.theme,
|
||||
(theme) => theme
|
||||
);
|
||||
}
|
||||
|
||||
const useTheme = () => {
|
||||
const selectedTheme = useSelector(createThemeSelector());
|
||||
const [resolvedTheme, setResolvedTheme] = useState(selectedTheme);
|
||||
|
||||
useEffect(() => {
|
||||
if (selectedTheme !== 'auto') {
|
||||
setResolvedTheme(selectedTheme);
|
||||
return;
|
||||
}
|
||||
|
||||
const applySystemTheme = () => {
|
||||
setResolvedTheme(
|
||||
window.matchMedia('(prefers-color-scheme: dark)').matches
|
||||
? 'dark'
|
||||
: 'light'
|
||||
);
|
||||
};
|
||||
|
||||
applySystemTheme();
|
||||
|
||||
window
|
||||
.matchMedia('(prefers-color-scheme: dark)')
|
||||
.addEventListener('change', applySystemTheme);
|
||||
|
||||
return () => {
|
||||
window
|
||||
.matchMedia('(prefers-color-scheme: dark)')
|
||||
.removeEventListener('change', applySystemTheme);
|
||||
};
|
||||
}, [selectedTheme]);
|
||||
|
||||
return resolvedTheme;
|
||||
};
|
||||
|
||||
export default useTheme;
|
||||
|
||||
export const useThemeColor = (color: string) => {
|
||||
const theme = useTheme();
|
||||
const themeVariables = themes[theme];
|
||||
|
||||
// @ts-expect-error - themeVariables is a string indexable type
|
||||
return themeVariables[color];
|
||||
};
|
||||
@@ -33,6 +33,7 @@
|
||||
|
||||
.scroller {
|
||||
flex: 1 1 auto;
|
||||
min-height: 400px;
|
||||
}
|
||||
|
||||
.filterRow {
|
||||
@@ -57,29 +58,68 @@
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.filtersToggle {
|
||||
display: none;
|
||||
align-items: center;
|
||||
margin-bottom: 10px;
|
||||
padding: 8px 12px;
|
||||
border: 1px solid var(--borderColor);
|
||||
border-radius: 4px;
|
||||
background: transparent;
|
||||
color: var(--textColor);
|
||||
font-size: 14px;
|
||||
cursor: pointer;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.filtersToggle:hover {
|
||||
background-color: var(--hoverBackgroundColor);
|
||||
}
|
||||
|
||||
@media only screen and (max-width: $breakpointSmall) {
|
||||
.filterInput {
|
||||
margin-bottom: 5px;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.alert {
|
||||
.notice {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.filtersToggle {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.filterRow {
|
||||
display: block;
|
||||
margin-bottom: 10px;
|
||||
padding: 10px;
|
||||
border: 1px solid var(--borderColor);
|
||||
border-radius: 4px;
|
||||
background-color: var(--cardBackgroundColor);
|
||||
}
|
||||
|
||||
.filterRowCollapsed {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.filterContainer {
|
||||
margin-right: 0;
|
||||
margin-bottom: 5px;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.filterContainer:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.scroller {
|
||||
margin-right: -30px;
|
||||
margin-bottom: -30px;
|
||||
margin-left: -30px;
|
||||
margin-right: -15px;
|
||||
margin-bottom: -15px;
|
||||
margin-left: -15px;
|
||||
min-height: 300px;
|
||||
}
|
||||
|
||||
.modalBody {
|
||||
padding: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,8 @@ interface CssExports {
|
||||
'filterInput': string;
|
||||
'filterLabel': string;
|
||||
'filterRow': string;
|
||||
'filterRowCollapsed': string;
|
||||
'filtersToggle': string;
|
||||
'indexers': string;
|
||||
'modalBody': string;
|
||||
'modalFooter': string;
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import classNames from 'classnames';
|
||||
import { some } from 'lodash';
|
||||
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
||||
import { useDispatch, useSelector } from 'react-redux';
|
||||
@@ -7,6 +8,7 @@ import Alert from 'Components/Alert';
|
||||
import EnhancedSelectInput from 'Components/Form/EnhancedSelectInput';
|
||||
import NewznabCategorySelectInputConnector from 'Components/Form/NewznabCategorySelectInputConnector';
|
||||
import TextInput from 'Components/Form/TextInput';
|
||||
import Icon from 'Components/Icon';
|
||||
import Button from 'Components/Link/Button';
|
||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||
import ModalBody from 'Components/Modal/ModalBody';
|
||||
@@ -16,7 +18,7 @@ import ModalHeader from 'Components/Modal/ModalHeader';
|
||||
import Scroller from 'Components/Scroller/Scroller';
|
||||
import Table from 'Components/Table/Table';
|
||||
import TableBody from 'Components/Table/TableBody';
|
||||
import { kinds, scrollDirections } from 'Helpers/Props';
|
||||
import { icons, kinds, scrollDirections } from 'Helpers/Props';
|
||||
import Indexer, { IndexerCategory } from 'Indexer/Indexer';
|
||||
import {
|
||||
fetchIndexerSchema,
|
||||
@@ -152,6 +154,7 @@ function AddIndexerModalContent(props: AddIndexerModalContentProps) {
|
||||
const [filterLanguages, setFilterLanguages] = useState<string[]>([]);
|
||||
const [filterPrivacyLevels, setFilterPrivacyLevels] = useState<string[]>([]);
|
||||
const [filterCategories, setFilterCategories] = useState<number[]>([]);
|
||||
const [isFiltersCollapsed, setIsFiltersCollapsed] = useState(true);
|
||||
|
||||
useEffect(
|
||||
() => {
|
||||
@@ -196,6 +199,10 @@ function AddIndexerModalContent(props: AddIndexerModalContentProps) {
|
||||
[setFilterCategories]
|
||||
);
|
||||
|
||||
const handleToggleFilters = useCallback(() => {
|
||||
setIsFiltersCollapsed(!isFiltersCollapsed);
|
||||
}, [isFiltersCollapsed]);
|
||||
|
||||
const onIndexerSelect = useCallback(
|
||||
({
|
||||
implementation,
|
||||
@@ -322,7 +329,17 @@ function AddIndexerModalContent(props: AddIndexerModalContentProps) {
|
||||
onChange={onFilterChange}
|
||||
/>
|
||||
|
||||
<div className={styles.filterRow}>
|
||||
<Button className={styles.filtersToggle} onPress={handleToggleFilters}>
|
||||
<Icon name={isFiltersCollapsed ? icons.EXPAND : icons.COLLAPSE} />
|
||||
{translate('Filters')}
|
||||
</Button>
|
||||
|
||||
<div
|
||||
className={classNames(
|
||||
styles.filterRow,
|
||||
isFiltersCollapsed && styles.filterRowCollapsed
|
||||
)}
|
||||
>
|
||||
<div className={styles.filterContainer}>
|
||||
<label className={styles.filterLabel}>
|
||||
{translate('Protocol')}
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
|
||||
<Deterministic Condition="$(AssemblyVersion.EndsWith('*'))">False</Deterministic>
|
||||
|
||||
<PathMap>$(MSBuildProjectDirectory)=./$(MSBuildProjectName)/</PathMap>
|
||||
<PathMap>$(MSBuildThisFileDirectory)=./</PathMap>
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- Set the AssemblyConfiguration attribute for projects -->
|
||||
@@ -123,14 +123,11 @@
|
||||
|
||||
<!-- Standard testing packages -->
|
||||
<ItemGroup Condition="'$(TestProject)'=='true'">
|
||||
<PackageReference Include="coverlet.collector" Version="6.0.4" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
|
||||
<PackageReference Include="NUnit" Version="3.14.0" />
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
|
||||
<PackageReference Include="NunitXml.TestLogger" Version="3.0.131" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition="'$(TestProject)'=='true' and '$(TargetFramework)'=='net8.0'">
|
||||
<PackageReference Include="coverlet.collector" Version="3.0.4-preview.27.ge7cb7c3b40" />
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="5.1.0" />
|
||||
<PackageReference Include="NunitXml.TestLogger" Version="3.1.20" />
|
||||
</ItemGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(ProwlarrProject)'=='true' and '$(EnableAnalyzers)'=='false'">
|
||||
|
||||
@@ -5,8 +5,6 @@
|
||||
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
|
||||
<add key="dotnet-bsd-crossbuild" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/dotnet-bsd-crossbuild/nuget/v3/index.json" />
|
||||
<add key="Mono.Posix.NETStandard" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/Mono.Posix.NETStandard/nuget/v3/index.json" />
|
||||
<add key="SQLite" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/SQLite/nuget/v3/index.json" />
|
||||
<add key="coverlet-nightly" value="https://pkgs.dev.azure.com/Servarr/coverlet/_packaging/coverlet-nightly/nuget/v3/index.json" />
|
||||
<add key="FluentMigrator" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/FluentMigrator/nuget/v3/index.json" />
|
||||
</packageSources>
|
||||
</configuration>
|
||||
|
||||
@@ -14,7 +14,6 @@ namespace NzbDrone.Common.Composition
|
||||
static AssemblyLoader()
|
||||
{
|
||||
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ContainerResolveEventHandler);
|
||||
RegisterSQLiteResolver();
|
||||
}
|
||||
|
||||
public static IList<Assembly> Load(IList<string> assemblyNames)
|
||||
@@ -23,6 +22,10 @@ namespace NzbDrone.Common.Composition
|
||||
toLoad.Add("Prowlarr.Common");
|
||||
toLoad.Add(OsInfo.IsWindows ? "Prowlarr.Windows" : "Prowlarr.Mono");
|
||||
|
||||
var toRegisterResolver = new List<string> { "System.Data.SQLite" };
|
||||
toRegisterResolver.AddRange(assemblyNames.Intersect(new[] { "Prowlarr.Core" }));
|
||||
RegisterNativeResolver(toRegisterResolver);
|
||||
|
||||
var startupPath = AppDomain.CurrentDomain.BaseDirectory;
|
||||
|
||||
return toLoad
|
||||
@@ -43,27 +46,46 @@ namespace NzbDrone.Common.Composition
|
||||
return AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyPath);
|
||||
}
|
||||
|
||||
public static void RegisterSQLiteResolver()
|
||||
public static void RegisterNativeResolver(IEnumerable<string> assemblyNames)
|
||||
{
|
||||
// This ensures we look for sqlite3 using libsqlite3.so.0 on Linux and not libsqlite3.so which
|
||||
// is less likely to exist.
|
||||
var sqliteAssembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(
|
||||
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "System.Data.SQLite.dll"));
|
||||
foreach (var name in assemblyNames)
|
||||
{
|
||||
// This ensures we look for sqlite3 using libsqlite3.so.0 on Linux and not libsqlite3.so which
|
||||
// is less likely to exist.
|
||||
var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(
|
||||
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"{name}.dll"));
|
||||
|
||||
try
|
||||
{
|
||||
NativeLibrary.SetDllImportResolver(sqliteAssembly, LoadSqliteNativeLib);
|
||||
}
|
||||
catch (InvalidOperationException)
|
||||
{
|
||||
// This can only be set once per assembly
|
||||
// Catch required for NzbDrone.Host tests
|
||||
try
|
||||
{
|
||||
NativeLibrary.SetDllImportResolver(assembly, LoadNativeLib);
|
||||
}
|
||||
catch (InvalidOperationException)
|
||||
{
|
||||
// This can only be set once per assembly
|
||||
// Catch required for NzbDrone.Host tests
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static IntPtr LoadSqliteNativeLib(string libraryName, Assembly assembly, DllImportSearchPath? dllImportSearchPath)
|
||||
private static IntPtr LoadNativeLib(string libraryName, Assembly assembly, DllImportSearchPath? dllImportSearchPath)
|
||||
{
|
||||
var mappedName = OsInfo.IsLinux && libraryName == "sqlite3" ? "libsqlite3.so.0" : libraryName;
|
||||
ArgumentException.ThrowIfNullOrWhiteSpace(libraryName);
|
||||
|
||||
var mappedName = libraryName;
|
||||
|
||||
if (libraryName is "sqlite3" or "e_sqlite3")
|
||||
{
|
||||
if (OsInfo.IsLinux)
|
||||
{
|
||||
if (NativeLibrary.TryLoad(libraryName, assembly, dllImportSearchPath, out var libHandle))
|
||||
{
|
||||
return libHandle;
|
||||
}
|
||||
|
||||
mappedName = "libsqlite3.so.0";
|
||||
}
|
||||
}
|
||||
|
||||
return NativeLibrary.Load(mappedName, assembly, dllImportSearchPath);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<PackageReference Include="IPAddressRange" Version="6.2.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.1" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
|
||||
<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" />
|
||||
@@ -16,9 +16,11 @@
|
||||
<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="8.0.5" />
|
||||
<PackageReference Include="SourceGear.sqlite3" Version="3.50.4.2" />
|
||||
<PackageReference Include="System.Data.SQLite" Version="2.0.2" />
|
||||
<PackageReference Include="System.Private.Uri" Version="4.3.2" />
|
||||
<PackageReference Include="System.Text.Json" Version="8.0.6" />
|
||||
<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="8.0.1" />
|
||||
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="5.0.0" />
|
||||
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
|
||||
|
||||
@@ -15,24 +15,24 @@ namespace NzbDrone.Core.Test.Http
|
||||
return new HttpProxySettings(ProxyType.Socks5, "localhost", 8080, "*.httpbin.org,google.com,172.16.0.0/12", true, null, null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_bypass_proxy()
|
||||
[TestCase("http://eu.httpbin.org/get")]
|
||||
[TestCase("http://google.com/get")]
|
||||
[TestCase("http://localhost:8654/get")]
|
||||
[TestCase("http://172.21.0.1:8989/api/v3/indexer/schema")]
|
||||
public void should_bypass_proxy(string url)
|
||||
{
|
||||
var settings = GetProxySettings();
|
||||
|
||||
Subject.ShouldProxyBeBypassed(settings, new HttpUri("http://eu.httpbin.org/get")).Should().BeTrue();
|
||||
Subject.ShouldProxyBeBypassed(settings, new HttpUri("http://google.com/get")).Should().BeTrue();
|
||||
Subject.ShouldProxyBeBypassed(settings, new HttpUri("http://localhost:8654/get")).Should().BeTrue();
|
||||
Subject.ShouldProxyBeBypassed(settings, new HttpUri("http://172.21.0.1:8989/api/v3/indexer/schema")).Should().BeTrue();
|
||||
Subject.ShouldProxyBeBypassed(settings, new HttpUri(url)).Should().BeTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_not_bypass_proxy()
|
||||
[TestCase("http://bing.com/get")]
|
||||
[TestCase("http://172.3.0.1:8989/api/v3/indexer/schema")]
|
||||
public void should_not_bypass_proxy(string url)
|
||||
{
|
||||
var settings = GetProxySettings();
|
||||
|
||||
Subject.ShouldProxyBeBypassed(settings, new HttpUri("http://bing.com/get")).Should().BeFalse();
|
||||
Subject.ShouldProxyBeBypassed(settings, new HttpUri("http://172.3.0.1:8989/api/v3/indexer/schema")).Should().BeFalse();
|
||||
Subject.ShouldProxyBeBypassed(settings, new HttpUri(url)).Should().BeFalse();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -140,7 +140,7 @@ namespace NzbDrone.Core.Test.IndexerTests.BroadcastheNetTests
|
||||
query.Tvrage.Should().BeNull();
|
||||
query.Search.Should().BeNull();
|
||||
query.Category.Should().Be("Episode");
|
||||
query.Name.Should().Be("2023.01.03");
|
||||
query.Name.Should().Be("2023.01.03%");
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -275,7 +275,7 @@ namespace NzbDrone.Core.Test.IndexerTests.BroadcastheNetTests
|
||||
query.Tvrage.Should().BeNull();
|
||||
query.Search.Should().Be("The%Late%Show%with%Stephen%Colbert");
|
||||
query.Category.Should().Be("Episode");
|
||||
query.Name.Should().Be("2023.01.03");
|
||||
query.Name.Should().Be("2023.01.03%");
|
||||
}
|
||||
|
||||
private static BroadcastheNetTorrentQuery ParseTorrentQueryFromRequest(HttpRequest httpRequest)
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Dapper" Version="2.1.66" />
|
||||
<PackageReference Include="NBuilder" Version="6.1.0" />
|
||||
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
|
||||
<PackageReference Include="YamlDotNet" Version="16.3.0" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -1,13 +1,18 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Data.SQLite;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using Dapper;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Instrumentation;
|
||||
using NzbDrone.Core.Datastore.Events;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
using Polly;
|
||||
using Polly.Retry;
|
||||
|
||||
namespace NzbDrone.Core.Datastore
|
||||
{
|
||||
@@ -40,12 +45,31 @@ namespace NzbDrone.Core.Datastore
|
||||
public class BasicRepository<TModel> : IBasicRepository<TModel>
|
||||
where TModel : ModelBase, new()
|
||||
{
|
||||
private static readonly ILogger Logger = NzbDroneLogger.GetLogger(typeof(BasicRepository<TModel>));
|
||||
|
||||
private readonly IEventAggregator _eventAggregator;
|
||||
private readonly PropertyInfo _keyProperty;
|
||||
private readonly List<PropertyInfo> _properties;
|
||||
private readonly string _updateSql;
|
||||
private readonly string _insertSql;
|
||||
|
||||
private static ResiliencePipeline RetryStrategy => new ResiliencePipelineBuilder()
|
||||
.AddRetry(new RetryStrategyOptions
|
||||
{
|
||||
ShouldHandle = new PredicateBuilder().Handle<SQLiteException>(ex => ex.ResultCode == SQLiteErrorCode.Busy),
|
||||
Delay = TimeSpan.FromMilliseconds(100),
|
||||
MaxRetryAttempts = 3,
|
||||
BackoffType = DelayBackoffType.Exponential,
|
||||
UseJitter = true,
|
||||
OnRetry = args =>
|
||||
{
|
||||
Logger.Warn(args.Outcome.Exception, "Failed writing to database. Retry #{0}", args.AttemptNumber);
|
||||
|
||||
return default;
|
||||
}
|
||||
})
|
||||
.Build();
|
||||
|
||||
protected readonly IDatabase _database;
|
||||
protected readonly string _table;
|
||||
|
||||
@@ -186,7 +210,9 @@ namespace NzbDrone.Core.Datastore
|
||||
private TModel Insert(IDbConnection connection, IDbTransaction transaction, TModel model)
|
||||
{
|
||||
SqlBuilderExtensions.LogQuery(_insertSql, model);
|
||||
var multi = connection.QueryMultiple(_insertSql, model, transaction);
|
||||
|
||||
var multi = RetryStrategy.Execute(static (state, _) => state.connection.QueryMultiple(state._insertSql, state.model, state.transaction), (connection, _insertSql, model, transaction));
|
||||
|
||||
var multiRead = multi.Read();
|
||||
var id = (int)(multiRead.First().id ?? multiRead.First().Id);
|
||||
_keyProperty.SetValue(model, id);
|
||||
@@ -383,7 +409,7 @@ namespace NzbDrone.Core.Datastore
|
||||
|
||||
SqlBuilderExtensions.LogQuery(sql, model);
|
||||
|
||||
connection.Execute(sql, model, transaction: transaction);
|
||||
RetryStrategy.Execute(static (state, _) => state.connection.Execute(state.sql, state.model, transaction: state.transaction), (connection, sql, model, transaction));
|
||||
}
|
||||
|
||||
private void UpdateFields(IDbConnection connection, IDbTransaction transaction, IList<TModel> models, List<PropertyInfo> propertiesToUpdate)
|
||||
@@ -395,7 +421,7 @@ namespace NzbDrone.Core.Datastore
|
||||
SqlBuilderExtensions.LogQuery(sql, model);
|
||||
}
|
||||
|
||||
connection.Execute(sql, models, transaction: transaction);
|
||||
RetryStrategy.Execute(static (state, _) => state.connection.Execute(state.sql, state.models, transaction: state.transaction), (connection, sql, models, transaction));
|
||||
}
|
||||
|
||||
protected virtual SqlBuilder PagedBuilder() => Builder();
|
||||
|
||||
@@ -424,8 +424,8 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
}
|
||||
catch (HttpException ex)
|
||||
{
|
||||
_logger.Debug("qbitTorrent authentication failed.");
|
||||
if (ex.Response.StatusCode == HttpStatusCode.Forbidden)
|
||||
_logger.Debug(ex, "qbitTorrent authentication failed.");
|
||||
if (ex.Response.StatusCode is HttpStatusCode.Unauthorized or HttpStatusCode.Forbidden)
|
||||
{
|
||||
throw new DownloadClientAuthenticationException("Failed to authenticate with qBittorrent.", ex);
|
||||
}
|
||||
@@ -437,9 +437,9 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
throw new DownloadClientUnavailableException("Failed to connect to qBittorrent, please check your settings.", ex);
|
||||
}
|
||||
|
||||
if (response.Content != "Ok.")
|
||||
// returns "Fails." on bad login
|
||||
if (response.Content.IsNotNullOrWhiteSpace() && response.Content != "Ok.")
|
||||
{
|
||||
// returns "Fails." on bad login
|
||||
_logger.Debug("qbitTorrent authentication failed.");
|
||||
throw new DownloadClientAuthenticationException("Failed to authenticate with qBittorrent.");
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet
|
||||
else if (DateTime.TryParseExact($"{searchCriteria.Season} {searchCriteria.Episode}", "yyyy MM/dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var showDate))
|
||||
{
|
||||
// Daily Episode
|
||||
parameters.Name = showDate.ToString("yyyy.MM.dd", CultureInfo.InvariantCulture);
|
||||
parameters.Name = showDate.ToString("yyyy.MM.dd", CultureInfo.InvariantCulture) + "%";
|
||||
parameters.Category = "Episode";
|
||||
pageableRequests.Add(GetPagedRequests(parameters, btnResults, btnOffset));
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using NLog;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Indexers.Definitions.Gazelle;
|
||||
@@ -5,6 +6,7 @@ using NzbDrone.Core.Messaging.Events;
|
||||
|
||||
namespace NzbDrone.Core.Indexers.Definitions;
|
||||
|
||||
[Obsolete("Moved to YML for Cardigann")]
|
||||
public class CGPeers : GazelleBase<GazelleSettings>
|
||||
{
|
||||
public override string Name => "CGPeers";
|
||||
|
||||
@@ -426,6 +426,12 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
|
||||
{
|
||||
((TorrentInfo)c).InfoHash = MagnetLinkBuilder.GetInfoHashFromMagnet(((TorrentInfo)c).MagnetUrl);
|
||||
}
|
||||
|
||||
// Add Internal flag if description starts with Internal
|
||||
if (c.Description.IsNotNullOrWhiteSpace() && c.Description.StartsWith("Internal"))
|
||||
{
|
||||
c.IndexerFlags.Add(IndexerFlag.Internal);
|
||||
}
|
||||
});
|
||||
|
||||
_logger.Trace("Cardigann ({0}): Got {1} releases", _definition.Id, releases.Count);
|
||||
|
||||
@@ -11,10 +11,17 @@ namespace NzbDrone.Core.Indexers.Definitions.FileList;
|
||||
public class FileList : TorrentIndexerBase<FileListSettings>
|
||||
{
|
||||
public override string Name => "FileList.io";
|
||||
public override string[] IndexerUrls => new[] { "https://filelist.io/" };
|
||||
public override string[] IndexerUrls => new[]
|
||||
{
|
||||
"https://filelist.io/",
|
||||
"https://thefl.org/",
|
||||
};
|
||||
public override string[] LegacyUrls => new[]
|
||||
{
|
||||
"https://filelist.io",
|
||||
"https://filelist.ro/",
|
||||
"http://filelist.ro/",
|
||||
"http://flro.org/",
|
||||
"https://flro.org/"
|
||||
};
|
||||
public override string Description => "FileList (FL) is a ROMANIAN Private Torrent Tracker for 0DAY / GENERAL";
|
||||
@@ -105,6 +112,7 @@ public class FileList : TorrentIndexerBase<FileListSettings>
|
||||
caps.Categories.AddCategoryMapping(27, NewznabStandardCategory.TVUHD, "Seriale 4K");
|
||||
caps.Categories.AddCategoryMapping(28, NewznabStandardCategory.MoviesForeign, "RO Dubbed");
|
||||
caps.Categories.AddCategoryMapping(28, NewznabStandardCategory.TVForeign, "RO Dubbed");
|
||||
caps.Categories.AddCategoryMapping(31, NewznabStandardCategory.TVForeign, "K-Drama");
|
||||
|
||||
return caps;
|
||||
}
|
||||
|
||||
@@ -100,7 +100,7 @@ namespace NzbDrone.Core.Indexers.Newznab
|
||||
yield return GetDefinition("Miatrix", GetSettings("https://www.miatrix.com"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 });
|
||||
yield return GetDefinition("Newz69", GetSettings("https://newz69.keagaming.com"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 });
|
||||
yield return GetDefinition("NinjaCentral", GetSettings("https://ninjacentral.co.za"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 });
|
||||
yield return GetDefinition("Nzb.su", GetSettings("https://api.nzb.su"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 });
|
||||
yield return GetDefinition("Nzb.life", GetSettings("https://api.nzb.life"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 });
|
||||
yield return GetDefinition("NZBCat", GetSettings("https://nzb.cat"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000 });
|
||||
yield return GetDefinition("NZBFinder", GetSettings("https://nzbfinder.ws"), categories: new[] { 2000, 3000, 5000, 6000, 7000 });
|
||||
yield return GetDefinition("NZBgeek", GetSettings("https://api.nzbgeek.info"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 });
|
||||
|
||||
@@ -9,10 +9,10 @@ namespace NzbDrone.Core.Indexers.Newznab
|
||||
{
|
||||
public class NewznabSettingsValidator : AbstractValidator<NewznabSettings>
|
||||
{
|
||||
private static readonly string[] ApiKeyWhiteList =
|
||||
private static readonly string[] ApiKeyAllowList =
|
||||
{
|
||||
"nzbs.org",
|
||||
"nzb.su",
|
||||
"nzb.life",
|
||||
"dognzb.cr",
|
||||
"nzbplanet.net",
|
||||
"nzbid.org",
|
||||
@@ -22,7 +22,7 @@ namespace NzbDrone.Core.Indexers.Newznab
|
||||
|
||||
private static bool ShouldHaveApiKey(NewznabSettings settings)
|
||||
{
|
||||
return settings.BaseUrl != null && ApiKeyWhiteList.Any(c => settings.BaseUrl.ToLowerInvariant().Contains(c));
|
||||
return settings.BaseUrl != null && ApiKeyAllowList.Any(c => settings.BaseUrl.ToLowerInvariant().Contains(c));
|
||||
}
|
||||
|
||||
private static readonly Regex AdditionalParametersRegex = new Regex(@"(&.+?\=.+?)+", RegexOptions.Compiled);
|
||||
|
||||
@@ -35,6 +35,16 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
|
||||
throw new RequestLimitReachedException(indexerResponse, "PTP Query Limit Reached. Please try again later.");
|
||||
}
|
||||
|
||||
if (httpResponse.StatusCode == HttpStatusCode.TooManyRequests && indexerResponse.Content.Contains("We are not a TV indexer"))
|
||||
{
|
||||
throw new IndexerException(indexerResponse, "Invalid indexer request: We are not a TV indexer", HttpStatusCode.BadRequest);
|
||||
}
|
||||
|
||||
if (httpResponse.StatusCode == HttpStatusCode.TooManyRequests)
|
||||
{
|
||||
throw new RequestLimitReachedException(indexerResponse, "PTP Request Limit Reached. Please try again later.");
|
||||
}
|
||||
|
||||
throw new IndexerException(indexerResponse, $"Unexpected response status {indexerResponse.HttpResponse.StatusCode} code from indexer request");
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.IndexerSearch.Definitions;
|
||||
@@ -115,6 +116,7 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
|
||||
var request = new IndexerRequest(searchUrl, HttpAccept.Json);
|
||||
request.HttpRequest.Headers.Add("ApiUser", _settings.APIUser);
|
||||
request.HttpRequest.Headers.Add("ApiKey", _settings.APIKey);
|
||||
request.HttpRequest.SuppressHttpErrorStatusCodes = new[] { HttpStatusCode.TooManyRequests };
|
||||
|
||||
yield return request;
|
||||
}
|
||||
|
||||
@@ -23,7 +23,8 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
public override string Name => "RevolutionTT";
|
||||
|
||||
public override string[] IndexerUrls => new[] { "https://revolutiontt.me/" };
|
||||
public override string[] IndexerUrls => new[] { "https://revott.me/" };
|
||||
public override string[] LegacyUrls => new[] { "https://revolutiontt.me/" };
|
||||
public override string Description => "The Revolution has begun";
|
||||
private string LoginUrl => Settings.BaseUrl + "takelogin.php";
|
||||
public override IndexerPrivacy Privacy => IndexerPrivacy.Private;
|
||||
|
||||
@@ -1541,7 +1541,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
if (season != 0)
|
||||
{
|
||||
searchString += " Сезон: " + season;
|
||||
searchString += " ТВ | Сезон: " + season;
|
||||
}
|
||||
|
||||
parameters.Set("nm", searchString);
|
||||
@@ -1712,6 +1712,8 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
private readonly Regex _tvTitleRusSeasonRegex = new(@"Сезон\s*[:]*\s+(\d+(?:-\d+)?)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
private readonly Regex _tvTitleRusEpisodeOfRegex = new(@"(?:Серии|Эпизод|Выпуски)+\s*[:]*\s+(\d+(?:-\d+)?)\s*из\s*([\w?])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
private readonly Regex _tvTitleRusEpisodeRegex = new(@"(?:Серии|Эпизод|Выпуски)+\s*[:]*\s+(\d+(?:-\d+)?)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
private readonly Regex _tvTitleRusSeasonAnimeRegex = new(@"ТВ[-]*(?:(\d+))", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
private readonly Regex _tvTitleRusEpisodeAnimeOfRegex = new(@"\[(\d+(\+\d+)?)\s+из\s+(\d+(\+\d+)?)\]", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
public string Parse(string title,
|
||||
ICollection<IndexerCategory> categories,
|
||||
@@ -1736,6 +1738,8 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
title = _tvTitleRusSeasonRegex.Replace(title, "S$1");
|
||||
title = _tvTitleRusEpisodeOfRegex.Replace(title, "E$1 of $2");
|
||||
title = _tvTitleRusEpisodeRegex.Replace(title, "E$1");
|
||||
title = _tvTitleRusSeasonAnimeRegex.Replace(title, "S$1");
|
||||
title = _tvTitleRusEpisodeAnimeOfRegex.Replace(title, "E$1 of $3");
|
||||
}
|
||||
else if (IsAnyMovieCategory(categories))
|
||||
{
|
||||
@@ -1749,7 +1753,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
// rutracker movies titles look like: russian name / english name (russian director / english director) other stuff
|
||||
// Ирландец / The Irishman (Мартин Скорсезе / Martin Scorsese) [2019, США, криминал, драма, биография, WEB-DL 1080p] Dub (Пифагор) + MVO (Jaskier) + AVO (Юрий Сербин) + Sub Rus, Eng + Original Eng
|
||||
// this part should be removed: (Мартин Скорсезе / Martin Scorsese)
|
||||
title = Regex.Replace(title, @"(\([\p{IsCyrillic}\W]+)\s/\s(.+?)\)", string.Empty, RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
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(@"((?:\dx\s)?(?:[A-Z])?VO\s\(.+?\))");
|
||||
|
||||
@@ -27,7 +27,8 @@ namespace NzbDrone.Core.Indexers.Definitions;
|
||||
public class Shazbat : TorrentIndexerBase<ShazbatSettings>
|
||||
{
|
||||
public override string Name => "Shazbat";
|
||||
public override string[] IndexerUrls => new[] { "https://www.shazbat.tv/" };
|
||||
public override string[] IndexerUrls => new[] { "https://www.shazbat.tube/" };
|
||||
public override string[] LegacyUrls => new[] { "https://www.shazbat.tv/" };
|
||||
public override string Description => "Shazbat is a PRIVATE Torrent Tracker with highly curated TV content";
|
||||
public override string Language => "en-US";
|
||||
public override Encoding Encoding => Encoding.UTF8;
|
||||
|
||||
@@ -448,11 +448,11 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
private readonly Regex _tvTitleMultipleSeasonsRegex = new(@"(?:Сезон|Seasons?)\s*[:]*\s+(\d+-\d+)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
private readonly Regex _tvTitleUkrSeasonEpisodeOfRegex = new(@"Сезон\s*[:]*\s+(\d+).+(?:Серії|Серія|Серій|Епізод)+\s*[:]*\s+(\d+(?:-\d+)?)\s*з\s*([\w?])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
private readonly Regex _tvTitleUkrSeasonEpisodeRegex = new(@"Сезон\s*[:]*\s+(\d+).+(?:Серії|Серія|Серій|Епізод)+\s*[:]*\s+(\d+(?:-\d+)?)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
private readonly Regex _tvTitleUkrSeasonEpisodeOfRegex = new(@"Сезон\s*[:]*\s+(\d+).+(?:Серії|Серія|Серій|Епізоди?)+\s*[:]*\s+(\d+(?:-\d+)?)\s*з\s*([\w?])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
private readonly Regex _tvTitleUkrSeasonEpisodeRegex = new(@"Сезон\s*[:]*\s+(\d+).+(?:Серії|Серія|Серій|Епізоди?)+\s*[:]*\s+(\d+(?:-\d+)?)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
private readonly Regex _tvTitleUkrSeasonRegex = new(@"Сезон\s*[:]*\s+(\d+)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
private readonly Regex _tvTitleUkrEpisodeOfRegex = new(@"(?:Серії|Серія|Серій|Епізод)+\s*[:]*\s+(\d+(?:-\d+)?)\s*з\s*([\w?])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
private readonly Regex _tvTitleUkrEpisodeRegex = new(@"(?:Серії|Серія|Серій|Епізод)+\s*[:]*\s+(\d+(?:-\d+)?)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
private readonly Regex _tvTitleUkrEpisodeOfRegex = new(@"(?:Серії|Серія|Серій|Епізоди?)+\s*[:]*\s+(\d+(?:-\d+)?)\s*з\s*([\w?])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
private readonly Regex _tvTitleUkrEpisodeRegex = new(@"(?:Серії|Серія|Серій|Епізоди?)+\s*[:]*\s+(\d+(?:-\d+)?)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
private readonly Regex _tvTitleEngSeasonEpisodeOfRegex = new(@"Season\s*[:]*\s+(\d+).+(?:Episodes?)+\s*[:]*\s+(\d+(?:-\d+)?)\s*of\s*([\w?])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
private readonly Regex _tvTitleEngSeasonEpisodeRegex = new(@"Season\s*[:]*\s+(\d+).+(?:Episodes?)+\s*[:]*\s+(\d+(?:-\d+)?)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
@@ -506,7 +506,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
title = Regex.Replace(title, @"[\[\(]\s*[\)\]]", "", RegexOptions.Compiled);
|
||||
|
||||
title = title.Trim(' ', '&', ',', '.', '!', '?', '+', '-', '_', '|', '/', '\\', ':');
|
||||
title = title.Trim(' ', '&', ',', '.', '!', '?', '+', '-', '_', '|', '/', '\\', ':', ';', 'ʼ', '`');
|
||||
|
||||
// replace multiple spaces with a single space
|
||||
title = Regex.Replace(title, @"\s+", " ");
|
||||
@@ -521,7 +521,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
private static string MoveFirstTagsToEndOfReleaseTitle(string input)
|
||||
{
|
||||
var output = input;
|
||||
var output = input.Trim(' ', '&', ',', '.', '!', '?', '+', '-', '_', '|', '/', '\\', ':', ';', 'ʼ', '`');
|
||||
foreach (var findTagsRegex in FindTagsInTitlesRegexList)
|
||||
{
|
||||
var expectedIndex = 0;
|
||||
|
||||
@@ -11,11 +11,11 @@ namespace NzbDrone.Core.Indexers.Torznab
|
||||
{
|
||||
public class TorznabSettingsValidator : AbstractValidator<TorznabSettings>
|
||||
{
|
||||
private static readonly string[] ApiKeyWhiteList = Array.Empty<string>();
|
||||
private static readonly string[] ApiKeyAllowList = Array.Empty<string>();
|
||||
|
||||
private static bool ShouldHaveApiKey(TorznabSettings settings)
|
||||
{
|
||||
return settings.BaseUrl != null && ApiKeyWhiteList.Any(c => settings.BaseUrl.ToLowerInvariant().Contains(c));
|
||||
return settings.BaseUrl != null && ApiKeyAllowList.Any(c => settings.BaseUrl.ToLowerInvariant().Contains(c));
|
||||
}
|
||||
|
||||
private static readonly Regex AdditionalParametersRegex = new Regex(@"(&.+?\=.+?)+", RegexOptions.Compiled);
|
||||
|
||||
@@ -503,14 +503,14 @@ namespace NzbDrone.Core.Indexers
|
||||
catch (IndexerAuthException ex)
|
||||
{
|
||||
_indexerStatusService.RecordFailure(Definition.Id);
|
||||
_logger.Warn(ex, "Invalid Credentials for {0} {1}", this, url);
|
||||
_logger.Warn(ex, "Invalid Credentials for {0} [{1}]", this, url);
|
||||
}
|
||||
catch (CloudFlareProtectionException ex)
|
||||
{
|
||||
result.Queries.Add(new IndexerQueryResult { Response = ex.Response });
|
||||
_indexerStatusService.RecordFailure(Definition.Id);
|
||||
ex.WithData("FeedUrl", url);
|
||||
_logger.Error(ex, "Cloudflare protection detected for {0}, Flaresolverr may be required.", this);
|
||||
_logger.Error(ex, "Cloudflare protection detected for [{0}], Flaresolverr may be required.", this);
|
||||
}
|
||||
catch (IndexerException ex)
|
||||
{
|
||||
@@ -521,18 +521,18 @@ namespace NzbDrone.Core.Indexers
|
||||
catch (HttpRequestException ex)
|
||||
{
|
||||
_indexerStatusService.RecordFailure(Definition.Id);
|
||||
_logger.Warn(ex, "Unable to connect to indexer, please check your DNS settings and ensure IPv6 is working or disabled. {0}", url);
|
||||
_logger.Warn(ex, "Unable to connect to indexer [{0}]. This is typically caused by DNS/SSL issues. Check DNS settings, ensure IPv6 is working or disabled, and consider using different DNS servers or a VPN. See: 'https://wiki.servarr.com/prowlarr/troubleshooting#dns-ssl-connection-issues'", url);
|
||||
}
|
||||
catch (TaskCanceledException ex)
|
||||
{
|
||||
_indexerStatusService.RecordFailure(Definition.Id);
|
||||
_logger.Warn(ex, "Unable to connect to indexer, possibly due to a timeout. {0}", url);
|
||||
_logger.Warn(ex, "Unable to connect to indexer, possibly due to a timeout. [{0}]", url);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_indexerStatusService.RecordFailure(Definition.Id);
|
||||
ex.WithData("FeedUrl", url);
|
||||
_logger.Error(ex, "An error occurred while processing indexer feed. {0}", url);
|
||||
_logger.Error(ex, "An error occurred while processing indexer feed. [{0}]", url);
|
||||
}
|
||||
|
||||
result.Releases = CleanupReleases(releases, searchCriteria);
|
||||
@@ -816,7 +816,7 @@ namespace NzbDrone.Core.Indexers
|
||||
{
|
||||
_logger.Warn(ex, "Unable to connect to indexer");
|
||||
|
||||
return new NzbDroneValidationFailure(string.Empty, "Unable to connect to indexer, please check your DNS settings and ensure IPv6 is working or disabled. " + ex.Message)
|
||||
return new NzbDroneValidationFailure(string.Empty, "Unable to connect to indexer. This is typically caused by DNS/SSL issues. Check DNS settings, ensure IPv6 is working or disabled, consider using different DNS servers, or try a VPN/proxy if needed. See: 'https://wiki.servarr.com/prowlarr/troubleshooting#dns-ssl-connection-issues' " + ex.Message)
|
||||
{
|
||||
DetailedDescription = ex.InnerException?.Message
|
||||
};
|
||||
|
||||
@@ -491,7 +491,7 @@
|
||||
"EnableRssHelpText": "Povolit kanál RSS pro indexer",
|
||||
"DeleteApplication": "Odstranit aplikaci",
|
||||
"DeleteSelectedApplications": "Odstranit vybrané aplikace",
|
||||
"DeleteSelectedIndexers": "Odstranit vybrané indexery",
|
||||
"DeleteSelectedIndexers": "Smazat vybrané indexery",
|
||||
"DevelopmentSettings": "Nastavení pro vývoj",
|
||||
"DisabledUntil": "Zakázáno do",
|
||||
"DownloadClientCategory": "Kategorie klienta pro stahování",
|
||||
@@ -639,5 +639,10 @@
|
||||
"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"
|
||||
"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",
|
||||
"OnApplicationUpdateHelpText": "Při aktualizaci aplikace",
|
||||
"SeedTime": "Doba sdílení",
|
||||
"OnHealthRestoredHelpText": "Při obnovení zdraví",
|
||||
"SeedRatio": "Poměr sdílení",
|
||||
"ThemeHelpText": "Změnit motiv UI, možnost „Auto“ kopíruje nastavení OS pro výběr tmavého nebo světlého režimu. Inspirováno {inspiredBy}."
|
||||
}
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
"FullSync": "Volledige synchronisatie",
|
||||
"General": "Algemeen",
|
||||
"GeneralSettings": "Algemene Instellingen",
|
||||
"GeneralSettingsSummary": "Poort, SSL, gebruikersnaam/wachtwoord, proxy, statistieken en updates",
|
||||
"GeneralSettingsSummary": "Poort, SSL, gebruikersnaam/wachtwoord, proxy, analytics en updates",
|
||||
"GrabReleases": "Uitgave Ophalen",
|
||||
"Grabbed": "Opgehaalde",
|
||||
"Grabs": "Gegrepen",
|
||||
@@ -662,5 +662,13 @@
|
||||
"DownloadClientFloodSettingsTagsHelpText": "Initiële tags van een download. Om herkend te worden, moet een download alle initiële tags hebben. Dit voorkomt conflicten met niet-gerelateerde downloads.",
|
||||
"IndexerNewznabSettingsVipExpirationHelpText": "Voer de datum in (jjjj-mm-dd) voor VIP-vervaldatum of laat leeg. {appName} zal 1 week voor het verstrijken van de VIP-periode een melding geven",
|
||||
"DownloadClientSettingsDefaultCategorySubFolderHelpText": "Standaard fallback-categorie als er geen gekoppelde categorie bestaat voor een release. Het toevoegen van een categorie specifiek voor {appName} voorkomt conflicten met niet-gerelateerde downloads die niet van {appName} zijn. Het gebruik van een categorie is optioneel, maar wordt sterk aanbevolen. Er wordt een [categorie]-submap aangemaakt in de uitvoermap.",
|
||||
"IndexerPassThePopcornSettingsApiUserHelpText": "Deze instellingen vind je in je PassThePopcorn beveiligingsinstellingen (Profiel bewerken > Beveiliging)."
|
||||
"IndexerPassThePopcornSettingsApiUserHelpText": "Deze instellingen vind je in je PassThePopcorn beveiligingsinstellingen (Profiel bewerken > Beveiliging).",
|
||||
"IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Doorzoek alleen freeleech releases",
|
||||
"UsenetBlackholeNzbFolder": "Nzb map",
|
||||
"IndexerSettingsAppsMinimumSeedersHelpText": "Minimum aantal vereiste seeders door de applicaties voordat de indexer iets ophaalt. Leeg laten gebruikt de standaardwaarde van het synchronisatieprofiel",
|
||||
"IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Doorzoek alleen freeleech releases",
|
||||
"IndexerTorrentSyndikatSettingsApiKeyHelpText": "Site API-sleutel",
|
||||
"SearchTypes": "Zoek types",
|
||||
"IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Doorzoek alleen freeleech releases",
|
||||
"IndexerAvistazSettingsFreeleechOnlyHelpText": "Doorzoek alleen freeleech releases"
|
||||
}
|
||||
|
||||
@@ -17,15 +17,15 @@
|
||||
"TableOptionsColumnsMessage": "Wybierz, które kolumny są widoczne i w jakiej kolejności się pojawiają",
|
||||
"BeforeUpdate": "Przed aktualizacją",
|
||||
"BindAddress": "Adres powiązania",
|
||||
"BranchUpdate": "Oddział do użycia do aktualizacji {appName}",
|
||||
"BranchUpdate": "Gałąź do wykorzystania w aktualizacji {appName}",
|
||||
"Cancel": "Anuluj",
|
||||
"Automatic": "Automatyczny",
|
||||
"ApplyTags": "Zastosuj tagi",
|
||||
"BackupIntervalHelpText": "Odstęp czasu między automatycznymi kopiami zapasowymi",
|
||||
"Close": "Zamknij",
|
||||
"CloseCurrentModal": "Zamknij bieżący tryb",
|
||||
"Delete": "Usunąć",
|
||||
"Discord": "Niezgoda",
|
||||
"Delete": "Usuń",
|
||||
"Discord": "Discord",
|
||||
"Edit": "Edytować",
|
||||
"EnableAutomaticSearchHelpText": "Będzie używany, gdy automatyczne wyszukiwania są wykonywane przez interfejs użytkownika lub przez {appName}",
|
||||
"KeyboardShortcuts": "Skróty klawiszowe",
|
||||
@@ -50,14 +50,14 @@
|
||||
"TagCannotBeDeletedWhileInUse": "Nie można usunąć, gdy jest używany",
|
||||
"UnselectAll": "Odznacz wszystko",
|
||||
"Usenet": "Usenet",
|
||||
"AllIndexersHiddenDueToFilter": "Wszystkie filmy są ukryte ze względu na zastosowany filtr.",
|
||||
"AllIndexersHiddenDueToFilter": "Wszystkie indeksery są ukryte ze względu na zastosowany filtr.",
|
||||
"ApiKey": "Klucz API",
|
||||
"UI": "UI",
|
||||
"AcceptConfirmationModal": "Zaakceptuj tryb potwierdzenia",
|
||||
"AddIndexer": "Dodaj indekser",
|
||||
"AddingTag": "Dodawanie tagu",
|
||||
"Age": "Wiek",
|
||||
"CertificateValidationHelpText": "Zmień ścisłą walidację certyfikatu HTTPS",
|
||||
"CertificateValidationHelpText": "Zmień jak rygorystyczna jest walidacja certyfikatu HTTPS",
|
||||
"ChangeHasNotBeenSavedYet": "Zmiana nie została jeszcze zapisana",
|
||||
"DownloadClient": "Pobierz klienta",
|
||||
"Exception": "Wyjątek",
|
||||
@@ -68,7 +68,7 @@
|
||||
"AppDataDirectory": "Katalog AppData",
|
||||
"AutomaticSearch": "Automatyczne wyszukiwanie",
|
||||
"Branch": "Gałąź",
|
||||
"Connections": "Znajomości",
|
||||
"Connections": "Połączenia",
|
||||
"ConnectSettings": "Ustawienia połączenia",
|
||||
"CouldNotConnectSignalR": "Nie można połączyć się z SignalR, interfejs użytkownika nie zostanie zaktualizowany",
|
||||
"EnableInteractiveSearchHelpText": "Będzie używany, gdy używane jest wyszukiwanie interaktywne",
|
||||
@@ -94,16 +94,16 @@
|
||||
"UnableToLoadNotifications": "Nie można załadować powiadomień",
|
||||
"UpdateUiNotWritableHealthCheckMessage": "Nie można zainstalować aktualizacji, ponieważ użytkownik „{userName}” nie ma prawa zapisu w folderze interfejsu użytkownika „{uiFolder}”.",
|
||||
"UseProxy": "Użyj proxy",
|
||||
"DeleteIndexerProxyMessageText": "Czy na pewno chcesz usunąć tag „{0}”?",
|
||||
"DeleteNotificationMessageText": "Czy na pewno chcesz usunąć powiadomienie „{0}”?",
|
||||
"DeleteIndexerProxyMessageText": "Czy na pewno chcesz usunąć proxy indeksera '{name}'?",
|
||||
"DeleteNotificationMessageText": "Czy na pewno chcesz usunąć powiadomienie '{name}'?",
|
||||
"EnableSSL": "Włącz SSL",
|
||||
"Error": "Błąd",
|
||||
"ErrorLoadingContents": "Błąd podczas ładowania treści",
|
||||
"Events": "Wydarzenia",
|
||||
"SettingsLongDateFormat": "Format długiej daty",
|
||||
"AnalyticsEnabledHelpText": "Wysyłaj anonimowe informacje o użytkowaniu i błędach do serwerów {appName}. Obejmuje to informacje o Twojej przeglądarce, z których stron {appName} WebUI używasz, raportowanie błędów, a także wersję systemu operacyjnego i środowiska wykonawczego. Wykorzystamy te informacje, aby nadać priorytet funkcjom i poprawkom błędów.",
|
||||
"ApplicationStatusCheckAllClientMessage": "Wszystkie listy są niedostępne z powodu błędów",
|
||||
"ApplicationStatusCheckSingleClientMessage": "Listy niedostępne z powodu błędów: {0}",
|
||||
"AnalyticsEnabledHelpText": "Wysyłaj anonimowe informacje o użytkowaniu i błędach do serwerów {appName}. Obejmuje to informacje o Twojej przeglądarce, których stron interfejsu webowego {appName} używasz, raportowanie błędów, a także wersję systemu operacyjnego i środowiska wykonawczego. Wykorzystamy te informacje, aby nadać priorytet funkcjom i poprawkom błędów.",
|
||||
"ApplicationStatusCheckAllClientMessage": "Wszystkie aplikacje są niedostępne z powodu błędów",
|
||||
"ApplicationStatusCheckSingleClientMessage": "Aplikacje niedostępne z powodu błędów: {0}",
|
||||
"Apply": "Zastosuj",
|
||||
"Authentication": "Autoryzacja",
|
||||
"AuthenticationMethodHelpText": "Wymagaj nazwy użytkownika i hasła, aby uzyskać dostęp do {appName}",
|
||||
@@ -118,18 +118,18 @@
|
||||
"CloneProfile": "Klonuj profil",
|
||||
"Component": "Składnik",
|
||||
"ConnectionLost": "Utracono połączenie",
|
||||
"Custom": "Zwyczaj",
|
||||
"Custom": "Niestandardowe",
|
||||
"Date": "Data",
|
||||
"Dates": "Daktyle",
|
||||
"Dates": "Daty",
|
||||
"DatabaseMigration": "Migracja bazy danych",
|
||||
"DeleteApplicationMessageText": "Czy na pewno chcesz usunąć powiadomienie „{0}”?",
|
||||
"DeleteApplicationMessageText": "Czy na pewno chcesz usunąć aplikację '{name}'?",
|
||||
"DeleteBackup": "Usuń kopię zapasową",
|
||||
"DeleteBackupMessageText": "Czy na pewno chcesz usunąć kopię zapasową „{name}”?",
|
||||
"DeleteBackupMessageText": "Czy na pewno chcesz usunąć kopię zapasową '{name}'?",
|
||||
"DeleteDownloadClient": "Usuń klienta pobierania",
|
||||
"DeleteDownloadClientMessageText": "Czy na pewno chcesz usunąć klienta pobierania „{name}”?",
|
||||
"DeleteDownloadClientMessageText": "Czy na pewno chcesz usunąć klienta pobierania '{name}'?",
|
||||
"DeleteNotification": "Usuń powiadomienie",
|
||||
"Disabled": "Wyłączone",
|
||||
"Docker": "Doker",
|
||||
"Docker": "Docker",
|
||||
"DownloadClientStatusSingleClientHealthCheckMessage": "Klienci pobierania niedostępni z powodu błędów: {downloadClientNames}",
|
||||
"EditIndexer": "Edytuj indeksator",
|
||||
"Enable": "Włączyć",
|
||||
@@ -146,7 +146,7 @@
|
||||
"FocusSearchBox": "Zaznacz pole wyszukiwania",
|
||||
"Folder": "Teczka",
|
||||
"ForMoreInformationOnTheIndividualDownloadClients": "Aby uzyskać więcej informacji na temat poszczególnych klientów pobierania, kliknij przyciski informacyjne.",
|
||||
"General": "Generał",
|
||||
"General": "Ogólne",
|
||||
"GeneralSettings": "Ustawienia główne",
|
||||
"GeneralSettingsSummary": "Port, SSL, nazwa użytkownika / hasło, proxy, analizy i aktualizacje",
|
||||
"Grabbed": "Złapał",
|
||||
@@ -250,7 +250,7 @@
|
||||
"Title": "Tytuł",
|
||||
"Today": "Dzisiaj",
|
||||
"Tomorrow": "Jutro",
|
||||
"Torrent": "Torrenty",
|
||||
"Torrent": "Torrent",
|
||||
"Torrents": "Torrenty",
|
||||
"Type": "Rodzaj",
|
||||
"UILanguageHelpText": "Język, którego {appName} będzie używać w interfejsie użytkownika",
|
||||
@@ -276,10 +276,10 @@
|
||||
"UrlBaseHelpText": "W przypadku obsługi zwrotnego proxy wartość domyślna jest pusta",
|
||||
"Username": "Nazwa Użytkownika",
|
||||
"DeleteTag": "Usuń tag",
|
||||
"DeleteTagMessageText": "Czy na pewno chcesz usunąć tag „{0}”?",
|
||||
"Details": "Detale",
|
||||
"DeleteTagMessageText": "Czy na pewno chcesz usunąć tag '{label}'?",
|
||||
"Details": "Szczegóły",
|
||||
"Donations": "Darowizny",
|
||||
"DownloadClients": "Pobierz klientów",
|
||||
"DownloadClients": "Klienci pobierania",
|
||||
"DownloadClientSettings": "Pobierz ustawienia klienta",
|
||||
"IncludeHealthWarningsHelpText": "Uwzględnij ostrzeżenia zdrowotne",
|
||||
"Indexer": "Indeksator",
|
||||
@@ -290,7 +290,7 @@
|
||||
"Health": "Zdrowie",
|
||||
"InteractiveSearch": "Wyszukiwanie interaktywne",
|
||||
"Version": "Wersja",
|
||||
"Warn": "Ostrzec",
|
||||
"Warn": "Ostrzeż",
|
||||
"Wiki": "Wiki",
|
||||
"YesCancel": "Tak, anuluj",
|
||||
"Yesterday": "Wczoraj",
|
||||
@@ -310,7 +310,7 @@
|
||||
"HistoryCleanupDaysHelpTextWarning": "Pliki w koszu starsze niż wybrana liczba dni zostaną automatycznie wyczyszczone",
|
||||
"Filters": "Filtr",
|
||||
"HistoryCleanupDaysHelpText": "Ustaw na 0, aby wyłączyć automatyczne czyszczenie",
|
||||
"OnGrab": "Na Grab",
|
||||
"OnGrab": "Zgarnięcie na premierę",
|
||||
"OnHealthIssue": "W kwestii zdrowia",
|
||||
"TestAllIndexers": "Przetestuj wszystkie indeksatory",
|
||||
"GrabReleases": "Grab Release",
|
||||
@@ -327,7 +327,7 @@
|
||||
"OnApplicationUpdateHelpText": "Przy aktualizacji aplikacji",
|
||||
"Database": "Baza danych",
|
||||
"NotificationTriggersHelpText": "Wybierz zdarzenia, które mają uruchamiać to powiadomienie",
|
||||
"ApplicationLongTermStatusCheckSingleClientMessage": "Indeksatory niedostępne z powodu błędów przez ponad 6 godzin: {0}",
|
||||
"ApplicationLongTermStatusCheckSingleClientMessage": "Aplikacje niedostępne z powodu błędów przez ponad 6 godzin: {0}",
|
||||
"Duration": "Czas trwania",
|
||||
"Ended": "Zakończone",
|
||||
"LastDuration": "Ostatni czas trwania",
|
||||
@@ -336,39 +336,39 @@
|
||||
"Queued": "W kolejce",
|
||||
"Started": "Rozpoczęto",
|
||||
"Encoding": "Kodowanie",
|
||||
"Application": "Aplikacje",
|
||||
"Application": "Aplikacja",
|
||||
"Applications": "Aplikacje",
|
||||
"ApplicationLongTermStatusCheckAllClientMessage": "Wszystkie indeksatory są niedostępne z powodu awarii przez ponad 6 godzin",
|
||||
"ApplicationLongTermStatusCheckAllClientMessage": "Wszystkie aplikacje są niedostępne z powodu awarii przez ponad 6 godzin",
|
||||
"Remove": "Usunąć",
|
||||
"Replace": "Zastąpić",
|
||||
"OnLatestVersion": "Najnowsza wersja {appName} jest już zainstalowana",
|
||||
"ApplicationURL": "Link do aplikacji",
|
||||
"ApplicationUrlHelpText": "Zewnętrzny URL tej aplikacji zawierający http(s)://, port i adres URL",
|
||||
"ApplicationUrlHelpText": "Zewnętrzny link tej aplikacji zawierający http(s)://, port i adres URL",
|
||||
"ApplyTagsHelpTextAdd": "Dodaj: dodaj tagi do istniejącej listy tagów",
|
||||
"ApplyTagsHelpTextHowToApplyApplications": "Jak zastosować tagi do wybranych filmów",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Jak zastosować tagi do wybranych indeksatorów",
|
||||
"DeleteSelectedApplicationsMessageText": "Czy na pewno chcesz usunąć indeksator „{0}”?",
|
||||
"DeleteSelectedDownloadClients": "Usuń klienta pobierania",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Czy na pewno chcesz usunąć indeksator „{0}”?",
|
||||
"ApplyTagsHelpTextHowToApplyApplications": "Jak zastosować tagi do wybranych aplikacji",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Jak zastosować tagi do wybranych indekserów",
|
||||
"DeleteSelectedApplicationsMessageText": "Czy na pewno chcesz usunąć {count} wybranych aplikacji?",
|
||||
"DeleteSelectedDownloadClients": "Usuń klienta/ów pobierania",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Czy na pewno chcesz usunąć {count} wybranych klientów pobierania?",
|
||||
"Year": "Rok",
|
||||
"More": "Jeszcze",
|
||||
"ApplyTagsHelpTextRemove": "Usuń: usuń wprowadzone tagi",
|
||||
"ApplyTagsHelpTextReplace": "Zastąp: Zastąp tagi wprowadzonymi tagami (nie wprowadzaj tagów, aby usunąć wszystkie tagi)",
|
||||
"DeleteSelectedIndexersMessageText": "Czy na pewno chcesz usunąć indeksator „{0}”?",
|
||||
"DownloadClientPriorityHelpText": "Nadaj priorytet wielu klientom pobierania. W przypadku klientów o tym samym priorytecie używane jest działanie okrężne.",
|
||||
"DeleteSelectedIndexersMessageText": "Czy na pewno chcesz usunąć {count} wybranych indekserów?",
|
||||
"DownloadClientPriorityHelpText": "Nadaj priorytet wielu klientom pobierania. W przypadku klientów o tym samym priorytecie używany jest system kołowy (\"każdy na każdego\").",
|
||||
"Track": "Ślad",
|
||||
"UpdateAvailableHealthCheckMessage": "Dostępna jest aktualizacja: {version}",
|
||||
"Genre": "Gatunki",
|
||||
"ApplyChanges": "Zastosuj zmiany",
|
||||
"ApiKeyValidationHealthCheckMessage": "Zaktualizuj swój klucz API aby był długi na co najmniej {length} znaków. Możesz to zrobić poprzez ustawienia lub plik konfiguracyjny",
|
||||
"DeleteAppProfileMessageText": "Czy na pewno chcesz usunąć profil jakości '{0}'?",
|
||||
"ConnectionLostReconnect": "Radarr spróbuje połączyć się automatycznie lub możesz kliknąć przycisk przeładuj poniżej.",
|
||||
"DeleteAppProfileMessageText": "Czy na pewno chcesz usunąć profil aplikacji '{name}'?",
|
||||
"ConnectionLostReconnect": "{appName} spróbuje połączyć się automatycznie, możesz też kliknąć przycisk przeładuj poniżej.",
|
||||
"RecentChanges": "Ostatnie zmiany",
|
||||
"WhatsNew": "Co nowego?",
|
||||
"ConnectionLostToBackend": "Radarr utracił połączenie z silnikiem programu, aby przywrócić funkcjonalność musi zostać zrestartowany.",
|
||||
"ConnectionLostToBackend": "{appName} utracił połączenie z silnikiem programu, aby przywrócić funkcjonalność musi zostać zrestartowany.",
|
||||
"minutes": "Minuty",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Listy niedostępne z powodu błędów: {notificationNames}",
|
||||
"AddConnection": "Edytuj kolekcję",
|
||||
"AddConnection": "Edytuj połączenie",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Wszystkie listy są niedostępne z powodu błędów",
|
||||
"AuthForm": "Formularze (strona logowania)",
|
||||
"DisabledForLocalAddresses": "Wyłączone dla adresów lokalnych",
|
||||
@@ -376,14 +376,14 @@
|
||||
"AuthBasic": "Podstawowe (wyskakujące okienko przeglądarki)",
|
||||
"ResetAPIKeyMessageText": "Czy na pewno chcesz zresetować swój klucz API?",
|
||||
"RestartProwlarr": "Zrestartuj {appName}",
|
||||
"AddConnectionImplementation": "Dodaj Connection - {implementationName}",
|
||||
"AddConnectionImplementation": "Dodaj połączenie - {implementationName}",
|
||||
"AddDownloadClientImplementation": "Dodaj klienta pobierania - {implementationName}",
|
||||
"CountApplicationsSelected": "Wybrane kolekcje: {0}",
|
||||
"CountApplicationsSelected": "Wybrane aplikacje: {count}",
|
||||
"EditDownloadClientImplementation": "Dodaj klienta pobierania - {implementationName}",
|
||||
"Id": "Identyfikator",
|
||||
"AddApplicationImplementation": "Dodaj Connection - {implementationName}",
|
||||
"AddIndexerImplementation": "Dodaj indeks - {implementationName}",
|
||||
"AddIndexerProxyImplementation": "Dodaj condition - {implementationName}",
|
||||
"AddApplicationImplementation": "Dodaj aplikację - {implementationName}",
|
||||
"AddIndexerImplementation": "Dodaj indekser - {implementationName}",
|
||||
"AddIndexerProxyImplementation": "Dodaj proxy indeksera - {implementationName}",
|
||||
"EditConnectionImplementation": "Dodaj Connection - {implementationName}",
|
||||
"EditApplicationImplementation": "Dodaj Connection - {implementationName}",
|
||||
"EditIndexerImplementation": "Dodaj condition - {implementationName}",
|
||||
@@ -392,26 +392,26 @@
|
||||
"Directory": "Folder",
|
||||
"IndexerHDBitsSettingsCodecs": "Kodek",
|
||||
"ProxyValidationBadRequest": "Nie udało się przetestować serwera proxy. StatusCode: {statusCode}",
|
||||
"CustomFilter": "Filtry niestandardowe",
|
||||
"CustomFilter": "Filtr niestandardowy",
|
||||
"GrabRelease": "Pobierz Wydanie",
|
||||
"Script": "Scenariusz",
|
||||
"BuiltIn": "Wbudowany",
|
||||
"PublishedDate": "Data publikacji",
|
||||
"AllSearchResultsHiddenByFilter": "Wszystkie wyniki są ukrywane przez zastosowany filtr",
|
||||
"AllSearchResultsHiddenByFilter": "Wszystkie wyniki są ukryte przez zastosowany filtr.",
|
||||
"AppUpdated": "{appName} Zaktualizowany",
|
||||
"AppUpdatedVersion": "{appName} został zaktualizowany do wersji `{version}`, by uzyskać nowe zmiany należy przeładować {appName}",
|
||||
"AddCustomFilter": "Dodaj niestandardowy filtr",
|
||||
"AuthenticationMethodHelpTextWarning": "Wybierz prawidłową metodę autoryzacji",
|
||||
"Any": "Dowolny",
|
||||
"AuthenticationMethod": "Metoda Autoryzacji",
|
||||
"AuthenticationRequired": "Wymagana Autoryzacja",
|
||||
"AuthenticationMethod": "Metoda autoryzacji",
|
||||
"AuthenticationRequired": "Wymagana autoryzacja",
|
||||
"Categories": "Kategorie",
|
||||
"Label": "Etykieta",
|
||||
"Notification": "Powiadomienia",
|
||||
"Season": "Sezon",
|
||||
"Theme": "Motyw",
|
||||
"Artist": "artysta",
|
||||
"Album": "album",
|
||||
"Artist": "Artysta",
|
||||
"Album": "Album",
|
||||
"Connect": "Powiadomienia",
|
||||
"Episode": "odcinek",
|
||||
"Notifications": "Powiadomienia",
|
||||
@@ -423,10 +423,389 @@
|
||||
"RestartReloadNote": "Uwaga: {appName} automatycznie uruchomi się ponownie i przeładuje interfejs użytkownika podczas procesu przywracania.",
|
||||
"UpdateAppDirectlyLoadError": "Nie można bezpośrednio zaktualizować {appName},",
|
||||
"AptUpdater": "Użyj apt, aby zainstalować aktualizację",
|
||||
"DockerUpdater": "zaktualizuj kontener Dockera, aby otrzymać aktualizację",
|
||||
"DockerUpdater": "Zaktualizuj kontener Dockera, aby otrzymać aktualizację",
|
||||
"InstallLatest": "Zainstaluj najnowsze",
|
||||
"Clone": "Zamknij",
|
||||
"Clone": "Sklonuj",
|
||||
"Stats": "Status",
|
||||
"CurrentlyInstalled": "Aktualnie zainstalowane",
|
||||
"Mixed": "Naprawiony"
|
||||
"Mixed": "Naprawiony",
|
||||
"IndexerRss": "RSS indeksera",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Potwierdź nowe hasło",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Wprowadź nową nazwę użytkownika",
|
||||
"AverageQueries": "Średnie wyszukiwania",
|
||||
"BasicSearch": "Podstawowe wyszukiwanie",
|
||||
"BookSearchTypes": "Typy wyszukiwania książek",
|
||||
"DeleteAppProfile": "Usuń profil aplikacji",
|
||||
"DeleteApplication": "Usuń aplikację",
|
||||
"DeleteSelectedIndexers": "Usuń wybrane indeksery",
|
||||
"DownloadClientRTorrentSettingsUrlPath": "Ścieżka URL",
|
||||
"HistoryCleanup": "Czyszczenie historii",
|
||||
"NoIndexerCategories": "Nie znaleziono kategorii dla tego indeksera",
|
||||
"Open": "Otwarty",
|
||||
"PrioritySettings": "Priorytet: {priority}",
|
||||
"SemiPrivate": "Półprywatny",
|
||||
"MinimumSeeders": "Minimalni seederzy",
|
||||
"IndexerVipExpiredHealthCheckMessage": "Przywileje indeksera VIP się wyczerpały: {indexerNames}",
|
||||
"IndexerVipExpiringHealthCheckMessage": "Przywileje indeksera VIP wkrótce się wyczerpią: {indexerNames}",
|
||||
"BlackholeFolderHelpText": "Folder, w którym {appName} będzie przechowywać plik {extension}",
|
||||
"DefaultCategory": "Domyślna kategoria",
|
||||
"DefaultNameCopiedProfile": "{name} - Kopia",
|
||||
"DownloadClientDelugeSettingsUrlBaseHelpText": "Dodaj prefiks do url json deluge, sprawdź {url}",
|
||||
"Destination": "Lokalizacja docelowa",
|
||||
"DownloadClientFreeboxSettingsAppTokenHelpText": "Token aplikacji otrzymany podczas tworzenia dostępu do Freebox API ('app_token')",
|
||||
"DownloadClientPneumaticSettingsStrmFolder": "Folder Strm",
|
||||
"DownloadClientSettingsAddPaused": "Dodaj zapauzowany",
|
||||
"DownloadClientSettingsDestinationHelpText": "Ręczne precyzowanie lokalizacji docelowej pobierań, zostaw puste aby korzystać z domyślnej",
|
||||
"DownloadClientSettingsInitialStateHelpText": "Stan początkowy torrentów dodanych do {clientName}",
|
||||
"DownloadClientSettingsPriorityItemHelpText": "Priorytet podczas zgarniania pozycji",
|
||||
"IndexerBeyondHDSettingsLimitedOnly": "Tylko limitowany",
|
||||
"IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "Szukaj tylko premier freeleech",
|
||||
"IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Szukaj tylko premier freeleech",
|
||||
"IndexerSettingsGrabLimit": "Limit zgarnięć",
|
||||
"IndexerSettingsQueryLimit": "Limit wyszukiwania",
|
||||
"IndexerSettingsPasskey": "Sekretny klucz",
|
||||
"TotalHostQueries": "Całkowite wyszukiwania hosta",
|
||||
"Query": "Wyszukiwanie",
|
||||
"TotalIndexerQueries": "Całkowite wyszukiwania indeksera",
|
||||
"UnableToLoadAppProfiles": "Nie można załadować profili aplikacji",
|
||||
"ActiveApps": "Aktywne aplikacje",
|
||||
"ActiveIndexers": "Aktywne indeksery",
|
||||
"AdvancedSettingsShownClickToHide": "Zaawansowane ustawienia widoczne, kliknij aby ukryć",
|
||||
"AppSettingsSummary": "Aplikacje i ustawienia do konfiguracji jak {appName} współpracuje z Twoimi programami PVR",
|
||||
"Author": "Autor",
|
||||
"ApplicationsLoadError": "Nie można załadować listy aplikacji",
|
||||
"DownloadClientAriaSettingsDirectoryHelpText": "Opcjonalna lokalizacja dla pobrań, pozostaw puste jeżeli chcesz używać domyślnej lokalizacji Aria2",
|
||||
"EditSyncProfile": "Edytuj profil synchronizacji",
|
||||
"ManageClients": "Zarządzaj klientami",
|
||||
"PreferMagnetUrl": "Preferuj linki magnet",
|
||||
"InstallMajorVersionUpdate": "Instaluj aktualizację",
|
||||
"VipExpiration": "Wygaśnięcie VIPa",
|
||||
"days": "dni",
|
||||
"QueryOptions": "Opcje wyszukiwania",
|
||||
"DownloadClientFloodSettingsUrlBaseHelpText": "Dodaj prefiks do Flood API, taki jak {url}",
|
||||
"DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Pobierz pierwszy i ostatni fragment pierwszymi (qBittorrent 4.1.0+)",
|
||||
"DownloadClientQbittorrentSettingsUseSslHelpText": "Używaj bezpiecznego połączenia. Sprawdź Opcje -> Interfejs webowy -> 'Używaj HTTPS zamiast HTTP' w qBittorrent.",
|
||||
"DownloadClientRTorrentSettingsAddStopped": "Dodaj zatrzymany",
|
||||
"IndexerNzbIndexSettingsApiKeyHelpText": "Klucz API strony",
|
||||
"Redirected": "Przekierowany",
|
||||
"SeedTime": "Czas seedowania",
|
||||
"FailedToFetchSettings": "Nie udało się uzyskać ustawień",
|
||||
"IndexerBeyondHDSettingsSearchTypes": "Rodzaje wyszukiwania",
|
||||
"IndexerBeyondHDSettingsApiKeyHelpText": "Klucz API ze strony (do znalezienia w Moje Bezpieczeństwo => Klucz API)",
|
||||
"IndexerSettingsAdditionalParameters": "Dodatkowe parametry",
|
||||
"IndexerRedactedSettingsApiKeyHelpText": "Klucz API ze strony (do znalezienia w Ustawienia => Ustawienia Dostępu)",
|
||||
"IndexerSettingsGrabLimitHelpText": "Maksymalna liczba zgarnięć zdefiniowana przez odpowiadającą jednostkę, którą {appName} dopuści do strony",
|
||||
"Logout": "Wyloguj się",
|
||||
"LogFilesLocation": "Logi znajdują się w: {location}",
|
||||
"InstallMajorVersionUpdateMessageLink": "Więcej informacji: [{domain}]({url}).",
|
||||
"LabelIsRequired": "Etykieta jest wymagana",
|
||||
"NotificationsEmailSettingsUseEncryptionHelpText": "Czy: preferować korzystanie z szyfrowania jeśli jest skonfigurowane na serwerze; zawsze używać szyfrowanie przez SSL (tylko port 465) lub StartTLS (każdy inny port); nigdy nie korzystać z szyfrowania",
|
||||
"OverrideGrabModalTitle": "Nadpisz i zgarnij - {title}",
|
||||
"OverrideAndAddToDownloadClient": "Nadpisz i dodaj do klienta pobierania",
|
||||
"Proxies": "Proxy",
|
||||
"RawSearchSupported": "Wspieranie surowych wyszukiwań",
|
||||
"TorznabUrl": "Link Torznab",
|
||||
"TotalGrabs": "Całkowite zgarnięcia",
|
||||
"TorrentBlackholeTorrentFolder": "Folder torrenta",
|
||||
"TorrentBlackholeSaveMagnetFilesExtension": "Zapisz rozszerzenie plików magnet",
|
||||
"UpdaterLogFiles": "Pliki logów aktualizatora",
|
||||
"WouldYouLikeToRestoreBackup": "Czy chcesz przywrócić kopię zapasową '{name}'?",
|
||||
"Default": "Domyślne",
|
||||
"ManualGrab": "Ręczne zgarnięcie",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Indeksery są niezdefiniowane i nie będą działać: {indexerNames}. Usuń i/lub dodaj je ponownie do {appName}.",
|
||||
"AppsMinimumSeeders": "Minimum seederów dla aplikacji",
|
||||
"HistoryDetails": "Szczegóły historii",
|
||||
"InfoUrl": "Info URL",
|
||||
"InvalidUILanguage": "Twój interfejs użytkownika ma ustawiony nieprawidłowy język, popraw go i zapisz swoje ustawienia",
|
||||
"LastFailure": "Ostatni błąd",
|
||||
"AverageGrabs": "Średnie zgarnięcia",
|
||||
"IndexerSettingsFreeleechOnly": "Tylko freeleech",
|
||||
"UseSsl": "Używaj SSL",
|
||||
"DeleteSelectedApplications": "Usuń wybrane aplikacje",
|
||||
"DownloadClientDownloadStationSettingsDirectoryHelpText": "Opcjonalny udostępniony folder dla pobrań, pozostaw puste aby korzystać z domyślnej lokalizacji stacji pobierań",
|
||||
"DownloadClientFloodSettingsAdditionalTags": "Dodatkowe tagi",
|
||||
"DownloadClientFloodSettingsAdditionalTagsHelpText": "Dodaje atrybuty mediów jako tagi. Podpowiedzi są przykładami.",
|
||||
"DownloadClientFreeboxSettingsApiUrl": "Link API",
|
||||
"DownloadClientFreeboxSettingsAppIdHelpText": "ID aplikacji przypisane podczas tworzenia dostępu do Freebox API ('app_id')",
|
||||
"DownloadClientFreeboxSettingsAppToken": "Token aplikacji",
|
||||
"DownloadClientPneumaticSettingsNzbFolderHelpText": "Ten folder musi być dostępny z XBMC",
|
||||
"DownloadClientPneumaticSettingsStrmFolderHelpText": "Pliki .strm w tym folderze będą importowane przez drone",
|
||||
"DownloadClientQbittorrentSettingsContentLayout": "Układ zawartości",
|
||||
"DownloadClientRTorrentSettingsDirectoryHelpText": "Opcjonalna lokalizacja do umieszczenia pobierań, pozostaw puste aby używać domyślnej lokalizacji rTorrenta",
|
||||
"DownloadClientSettingsUseSslHelpText": "Użyj bezpiecznego połączenia podczas łączenia się z {clientName}",
|
||||
"DownloadClientSettingsUrlBaseHelpText": "Dodaje prefiks to linka {clientName}, np. {url}",
|
||||
"FullSync": "Pełna synchronizacja",
|
||||
"IndexerProxies": "Proxy indeksera",
|
||||
"ManageApplications": "Zarządzaj aplikacjami",
|
||||
"IndexerSettingsApiUser": "Użytkonik API",
|
||||
"IndexerSettingsCookieHelpText": "Ciasteczko na stronie",
|
||||
"IndexerSettingsRssKey": "Klucz RSS",
|
||||
"IndexerSettingsLimitsUnit": "Jednostka limitów",
|
||||
"IndexerNewznabSettingsAdditionalParametersHelpText": "Dodatkowe parametry Newznab",
|
||||
"IndexerPassThePopcornSettingsApiKeyHelpText": "Klucz API strony",
|
||||
"IndexerSettingsPackSeedTime": "Czas seedowania paczki",
|
||||
"IndexerTorrentSyndikatSettingsApiKeyHelpText": "Klucz API strony",
|
||||
"IndexerHistoryLoadError": "Błąd podczas ładowania historii indekserów",
|
||||
"IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Szukaj tylko premier freeleech",
|
||||
"IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Szukaj premier wg nazw grup",
|
||||
"IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Musisz mieć pozwolenia użytkownika i torrentów",
|
||||
"IndexerHDBitsSettingsOriginsHelpText": "Jeżeli nie sprecyzowano, wszystkie opcje są wykorzystywane.",
|
||||
"IndexerIPTorrentsSettingsCookieUserAgentHelpText": "User-Agent powiązany z ciasteczkiem z przeglądarki",
|
||||
"IndexerPassThePopcornSettingsApiUserHelpText": "Te ustawienia znajdują się w ustawieniach bezpieczeństwa PassThePopcorn (Edit Profile => Security).",
|
||||
"IndexerBeyondHDSettingsSearchTypesHelpText": "Wybierz rodzaje premier, które Cię interesują. Jeżeli żadne nie są wybrane, wszystkie opcje będą użyte.",
|
||||
"IndexerSettingsPackSeedTimeIndexerHelpText": "Czas przez jaki paczka (sezon lub dyskografia) powinna być seedowana przed zatrzymaniem, puste = wartość domyślna aplikacji",
|
||||
"InstallMajorVersionUpdateMessage": "Ta aktualizacja zainstaluje nową dużą wersję i może nie być kompatybilna z Twoim systemem. Jesteś pewien, że chcesz ją kontynuować?",
|
||||
"NoHistoryFound": "Nie znaleziono historii",
|
||||
"NoApplicationsFound": "Nie znaleziono aplikacji",
|
||||
"StopSelecting": "Przestań wybierać",
|
||||
"SeedRatio": "Stosunek seedów",
|
||||
"SettingsIndexerLogging": "Rozszerzone logi indeksera",
|
||||
"SyncAppIndexers": "Synchronizuj indeksery aplikacji",
|
||||
"SettingsLogSql": "SQL logów",
|
||||
"PackSeedTime": "Czas seedowania paczki",
|
||||
"PackageVersionInfo": "{packageVersion} od {packageAuthor}",
|
||||
"SettingsIndexerLoggingHelpText": "Zapisuj dodatkowe logi danych indekserów zawierające odpowiedzi",
|
||||
"RedirectHelpText": "Przekieruj przychodzące żądania pobierania dla indeksera i przekaż zgarnięcie bezpośrednio zamiast proxowania żądania przez {appName}",
|
||||
"ProwlarrDownloadClientsAlert": "Jeżeli planujesz wyszukiwać bezpośrednio w {appName}, potrzebujesz dodać klientów pobierania. W innym przypadku nie musisz tego robić. Dla wyszukiwań w Twoich aplikacjach, klienci pobierania tam skonfigurowani będą użytkowani.",
|
||||
"TestAllApps": "Testuj wszystkie aplikacje",
|
||||
"TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Jakiego rozszerzenia używać do linków magnet, domyślnie '.magnet'",
|
||||
"TorrentBlackholeSaveMagnetFilesHelpText": "Zapisz link magnet jeśli plik .torrent nie jest dostępny (przydatne tylko, jeżeli klient pobierania oferuje zapisywanie magnetów jako pliku)",
|
||||
"SyncLevelFull": "Pełna synchronizacja: będzie utrzymwać indeksery tej aplikacji w pełni zsynchronizowane. Zmiany na indekserach w {appName} są potem synchronizowane do tej aplikacji. Każda zmiana dokonywana zdalnie w tej aplikacji będzie nadpisana przez {appName} przy następnej synchronizacji.",
|
||||
"LogSizeLimit": "Limit rozmiaru logów",
|
||||
"DownloadClientSettingsDefaultCategorySubFolderHelpText": "Domyślna kategoria zapasowa jeżeli nie ma zmapowanej kategorii dla premiery. Dodawanie kategorii wyjątkowej dla {appName} pomaga uniknąć konfliktów z niezwiązanymi pobraniami spoza {appName}. Korzystanie z kategorii jest opcjonalne, ale mocno rekomendowane.",
|
||||
"AverageResponseTimesMs": "Średni czas reakcji indeksera (ms)",
|
||||
"Book": "Książka",
|
||||
"EnableRssHelpText": "Włącz",
|
||||
"FoundCountReleases": "Znaleziono {itemCount} premier",
|
||||
"AudioSearch": "Wyszukiwanie audio",
|
||||
"AreYouSureYouWantToDeleteCategory": "Czy na pewno chcesz usunąć zmapowaną kategorię?",
|
||||
"Category": "Kategoria",
|
||||
"ClearHistory": "Wyczyść historię",
|
||||
"Apps": "Aplikacje",
|
||||
"AddRemoveOnly": "Tylko dodawanie i usuwanie",
|
||||
"IndexerProxy": "Proxy indeksera",
|
||||
"IndexerQuery": "Wyszukiwanie indekserów",
|
||||
"Redirect": "Przekieruj",
|
||||
"InitialFailure": "Początkowy błąd",
|
||||
"AddNewIndexer": "Dodaj nowy indekser",
|
||||
"AddToDownloadClient": "Dodaj premierę do klienta pobrań",
|
||||
"Public": "Publiczny",
|
||||
"ElapsedTime": "Upłynęło czasu",
|
||||
"EnabledRedirected": "Włączony, Przekierowany",
|
||||
"SyncLevel": "Poziom synchronizacji",
|
||||
"DeleteIndexerProxy": "Usuń proxy indeksera",
|
||||
"AdvancedSettingsHiddenClickToShow": "Zaawansowane ustawienia ukryte, kliknij aby pokazać",
|
||||
"CountIndexersSelected": "Wybrane indeksery: {count}",
|
||||
"DeleteSelectedIndexer": "Usuń wybrany indekser",
|
||||
"FilterPlaceHolder": "Szukaj indekserów",
|
||||
"ManageDownloadClients": "Zarządzaj klientami pobierania",
|
||||
"NewznabUrl": "Link Newznab",
|
||||
"QueryType": "Rodzaj wyszukiwania",
|
||||
"SearchTypes": "Rodzaje wyszukiwania",
|
||||
"SeedRatioHelpText": "Stosunek jaki torrent powinien osiągnąć przed zatrzymaniem, puste to wartość domyślna aplikacji",
|
||||
"SelectedCountOfCountReleases": "Wybrano {selectedCount} z {itemCount} premier",
|
||||
"IndexerSite": "Strona indeksera",
|
||||
"EnableIndexer": "Włącz indekser",
|
||||
"IndexerFailureRate": "Częstotliwość awarii indeksera",
|
||||
"MovieSearchTypes": "Rodzaje wyszukiwań filmów",
|
||||
"MovieSearch": "Wyszukiwanie filmów",
|
||||
"OnHealthRestored": "Na przywrócone zdrowie",
|
||||
"RssFeed": "Kanał RSS",
|
||||
"SettingsConsoleLogLevel": "Poziom logów konsoli",
|
||||
"AddIndexerProxy": "Dodaj proxy indeksera",
|
||||
"GrabTitle": "Zgarnij tytuł",
|
||||
"GoToApplication": "Idź do aplikacji",
|
||||
"Implementation": "Wdrożenie",
|
||||
"NoDownloadClientsFound": "Nie znaleziono klientów pobierania",
|
||||
"SearchAllIndexers": "Przeszukaj wszystkie indeksery",
|
||||
"MusicSearchTypes": "Rodzaje wyszukiwań muzyki",
|
||||
"SettingsFilterSentryEventsHelpText": "Odfiltrowuj znane zdarzenia błędów użytkownika przed wysłaniem jako danych analitycznych",
|
||||
"IndexerCategories": "Kategorie indeksera",
|
||||
"SettingsLogRotate": "Rotacja logów",
|
||||
"UISettingsSummary": "Data, język i opcje dla osób z zaburzeniami widzenia",
|
||||
"Website": "Strona internetowa",
|
||||
"AreYouSureYouWantToDeleteIndexer": "Czy na pewno chcesz usunąć '{name}' z {appName}?",
|
||||
"AuthQueries": "Kwerendy autentykacji",
|
||||
"RssQueries": "Wyszukiwania RSS",
|
||||
"SearchQueries": "Szukaj w wyszukiwaniach",
|
||||
"NotificationsTelegramSettingsIncludeAppName": "Umieść {appName} w tytule",
|
||||
"SettingsSqlLoggingHelpText": "Zapisuj logi wszystkich kwerend SQL z {appName}",
|
||||
"DownloadClientsSettingsSummary": "Konfiguracja klientów pobierania dla integracji z interfejsem wyszukiwania {appName}",
|
||||
"IndexerInfo": "Informacje o indekserze",
|
||||
"IndexerObsoleteCheckMessage": "Indeksery są przestarzałe albo zostały zaktualizowane: {0}. Usuń lub dodaj je ponownie do {appName}",
|
||||
"IndexerAlreadySetup": "Co najmniej jedna instancja indeksera już działa",
|
||||
"IndexerDisabled": "Indekser wyłączony",
|
||||
"NoIndexersFound": "Nie znaleziono indekserów",
|
||||
"TotalHostGrabs": "Całkowite zgarnięcia hosta",
|
||||
"ProwlarrDownloadClientsInAppOnlyAlert": "Klienci pobierania są tylko dla wyszukiwań wewnątrz {appName} i nie synchronizują się z aplikacjami. Nie ma planów, aby dodać taką funkcjonalność.",
|
||||
"QueryResults": "Wyniki wyszukiwania",
|
||||
"SecretToken": "Sekretny token",
|
||||
"Url": "URL",
|
||||
"AddSyncProfile": "Dodaj profil synchronizacji",
|
||||
"DevelopmentSettings": "Ustawienia programistyczne",
|
||||
"TVSearchTypes": "Rodzaje wyszukiwań seriali",
|
||||
"NotificationsEmailSettingsUseEncryption": "Używaj szyfrowania",
|
||||
"OnGrabHelpText": "Zgarnij na premierę",
|
||||
"SearchCapabilities": "Możliwości wyszukiwania",
|
||||
"SettingsLogRotateHelpText": "Maksymalna liczba plików logów do zachowania w folderze",
|
||||
"SearchCountIndexers": "Przeszukaj {count} indekserów",
|
||||
"SyncLevelAddRemove": "Tylko dodawanie i usuwanie: kiedy indeksery są dodawane lub usuwane z {appName}, zaktualizuje ona tą zdalną aplikację.",
|
||||
"TotalUserAgentGrabs": "Całkowite zgarnięcia User Agenta",
|
||||
"SyncProfile": "Synchronizuj profil",
|
||||
"IndexerDownloadClientHealthCheckMessage": "Indeksery z nieprawidłowymi klientami pobierania: {indexerNames}.",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Wprowadź nowe hasło",
|
||||
"ApplicationTagsHelpText": "Synchronizuj indeksery mające jeden lub więcej pasujących tagów do tej aplikacji. Jeżeli nie ma tu wypisanych tagów, wtedy żaden indekser nie będzie blokowany przed synchronizacją.",
|
||||
"External": "Zewnętrzny",
|
||||
"DownloadClientFreeboxSettingsApiUrlHelpText": "Zdefiniuj bazowy link API Freebox z wersją API, np. '{url}, domyślna wartość to '{defaultApiUrl}'",
|
||||
"DownloadClientFreeboxSettingsAppId": "ID aplikacji",
|
||||
"DownloadClientFreeboxSettingsPortHelpText": "Port używany przez interfejs Freeboxa, domyślnie '{port}'",
|
||||
"DownloadClientNzbgetSettingsAddPausedHelpText": "Ta opcja wymaga NzbGet w wersji minimum 16.0",
|
||||
"DownloadClientPneumaticSettingsNzbFolder": "Folder Nzb",
|
||||
"DownloadClientQbittorrentSettingsSequentialOrder": "Porządek sekwencyjny",
|
||||
"DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Pobieraj w porządku sekwencyjnym (qBittorrent 4.1.0+)",
|
||||
"DownloadClientTransmissionSettingsUrlBaseHelpText": "Dodaje prefiks przed url RPC {clientName}, np. {url} domyślnie zmienia się na '{defaultUrl}'",
|
||||
"SettingsFilterSentryEvents": "Filtruj zdarzenia analityczne",
|
||||
"IncludeManualGrabsHelpText": "Dołącz ręczne zgarnięcia z {appName}",
|
||||
"IndexerBeyondHDSettingsRewindOnly": "Tylko przewinięcia",
|
||||
"IndexerFileListSettingsUsernameHelpText": "Nazwa użytkownika na stronie",
|
||||
"IndexerGazelleGamesSettingsSearchGroupNames": "Szukaj nazw grup",
|
||||
"IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Szukaj tylko premier freeleech",
|
||||
"TotalQueries": "Całkowite wyszukiwania",
|
||||
"IndexerNewznabSettingsVipExpirationHelpText": "Wprowadź datę (RRRR-MM-DD) wygaśnięcia VIPa lub puste, {appName} poinformuje Cię tydzień przed jego wyczerpaniem",
|
||||
"Menu": "Menu",
|
||||
"MassEditor": "Masowe edytowanie",
|
||||
"IndexerStatus": "Status indeksera",
|
||||
"NoIndexerHistory": "Nie znaleziono historii dla tego indeksera",
|
||||
"NoSearchResultsFound": "Brak wyników wyszukiwania, spróbuj wykonać nowe wyszukiwanie poniżej.",
|
||||
"PackSeedTimeHelpText": "Czas przez jaki paczka (sezon lub dyskografia) powinna być seedowana przed zatrzymaniem, puste = wartość domyślna aplikacji",
|
||||
"Parameters": "Parametry",
|
||||
"SelectIndexers": "Wybierz indeksery",
|
||||
"TotalUserAgentQueries": "Całkowite wyszukiwania User Agenta",
|
||||
"AddApplication": "Dodaj aplikację",
|
||||
"Privacy": "Prywatność",
|
||||
"Private": "Prywatny",
|
||||
"AddedToDownloadClient": "Premiera dodana do klienta",
|
||||
"SyncProfiles": "Synchronizuj profile",
|
||||
"DisabledUntil": "Wyłączone do",
|
||||
"TorrentBlackholeSaveMagnetFiles": "Zapisz pliki magnet",
|
||||
"UnableToLoadDevelopmentSettings": "Nie można załadować ustawień programistycznych",
|
||||
"ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Odrzucaj synchronizację zablokowanych hashów torrenta podczas zgarniania",
|
||||
"Auth": "Autentykacja",
|
||||
"BookSearch": "Wyszukiwanie książek",
|
||||
"ClearHistoryMessageText": "Czy na pewno chcesz wyczyścić całą historię {appName}?",
|
||||
"DownloadClientFreeboxSettingsHostHelpText": "Nazwa lub IP hosta Freeboxa, domyślnie '{url}' (zadziała tylko w tej samej sieci)",
|
||||
"EditSelectedIndexers": "Edytuj wybrane indeksery",
|
||||
"IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Szukaj tylko premier freeleech",
|
||||
"IndexerDetails": "Szczegóły indeksera",
|
||||
"IndexerGazelleGamesSettingsApiKeyHelpText": "Klucz API ze strony (do znalezienia w Ustawienia => Ustawienia Dostępu)",
|
||||
"OnHealthRestoredHelpText": "Na przywrócone zdrowie",
|
||||
"TvSearch": "Wyszukiwanie seriali",
|
||||
"AuthenticationRequiredHelpText": "Wymagana jest zmiana, która żąda autoryzacji. Nie zatwierdzaj jej jeśli nie jesteś świadomy ryzyka.",
|
||||
"AppProfileInUse": "Używany profil aplikacji",
|
||||
"ProwlarrSupportsAnyDownloadClient": "{appName} wspiera każdy z poniższych klientów pobierania.",
|
||||
"AddCategory": "Dodaj kategorię",
|
||||
"ClickToChangeQueryOptions": "Kliknij aby zmienić opcje wyszukiwania",
|
||||
"CountDownloadClientsSelected": "Wybrani klienci pobierania: {count}",
|
||||
"CountIndexersAvailable": "Dostępne indeksery: {count}",
|
||||
"Description": "Opis",
|
||||
"Donate": "Wesprzyj finansowo",
|
||||
"DownloadClientCategory": "Kategoria klienta pobierania",
|
||||
"EditCategory": "Edytuj kategorię",
|
||||
"EditSelectedDownloadClients": "Edytuj wybranych klientów pobierania",
|
||||
"DownloadClientTransmissionSettingsDirectoryHelpText": "Opcjonalna lokalizacja pobierań, zostaw puste aby użyć domyślnej lokalizacji Transmission",
|
||||
"IndexerBeyondHDSettingsRefundOnly": "Tylko zwroty",
|
||||
"IndexerBeyondHDSettingsRssKeyHelpText": "Klucz RSS ze strony (do znalezienia w Moje Bezpieczeństwo => Klucz RSS)",
|
||||
"IndexerBeyondHDSettingsRewindOnlyHelpText": "Szukaj tylko przewinięć",
|
||||
"IndexerFileListSettingsPasskeyHelpText": "Sekretny klucz strony (alfanumeryczny ciąg w URL trackera w kliencie pobierań)",
|
||||
"IndexerDownloadClientHelpText": "Sprecyzuj jaki klient pobierania jest używany do zgarnięć wewnątrz {appName} z tego indeksera",
|
||||
"IndexerHDBitsSettingsCodecsHelpText": "Jeżeli niesprecyzowano wszystkie opcje są wykorzystywane.",
|
||||
"IndexerHDBitsSettingsUseFilenamesHelpText": "Zaznacz tą opcję jeżeli chcesz używać nazwy plików torrenta jako nazwy premier",
|
||||
"IndexerHDBitsSettingsUsernameHelpText": "Nazwa użytkownika na stronie",
|
||||
"IndexerAlphaRatioSettingsExcludeSceneHelpText": "Wyklucz premiery SCENE z wyników",
|
||||
"IndexerIPTorrentsSettingsCookieUserAgent": "User-Agent ciasteczka",
|
||||
"IndexerBeyondHDSettingsRefundOnlyHelpText": "Szukaj tylko zwrotów",
|
||||
"IndexerAlphaRatioSettingsExcludeScene": "Wyklucz SCENE",
|
||||
"IndexerHDBitsSettingsMediumsHelpText": "Jeżeli nie sprecyzowano, wszystkie opcje są wykorzystywane.",
|
||||
"IndexerHDBitsSettingsOrigins": "Pochodzenie",
|
||||
"IndexerSettingsApiPath": "Ścieżka API",
|
||||
"IndexerSettingsSeedTime": "Czas seedowania",
|
||||
"IndexerSettingsSummary": "Skonfiguruj różne ustawienia globalne indeksera włączając proxy.",
|
||||
"IndexerTagsHelpText": "Użyj tagów to sprecyzowania proxy indeksera lub z jakimi aplikacjami indekser się synchronizuje.",
|
||||
"IndexerSettingsPreferMagnetUrl": "Preferuj linki magnet",
|
||||
"IndexerSettingsPreferMagnetUrlHelpText": "Kiedy włączone, ten indekser będzie preferował wykorzystanie linków magnet dla zgarnięć, z bezpiecznikiem linków torrent",
|
||||
"IndexerSettingsVipExpiration": "Wygaśnięcie VIPa",
|
||||
"IndexerSettingsAppsMinimumSeedersHelpText": "Minimalna liczba seederów wymagana przez aplikacje, żeby indekser zgarnął premierę, puste oznacza domyślną wartość profilu synchronizacji",
|
||||
"IndexerSettingsApiPathHelpText": "Ścieżka do API, zwykle {url}",
|
||||
"IndexerSettingsBaseUrlHelpText": "Wybierz jaki podstawowy URL {appName} będzie wykorzystywać dla żądań do strony",
|
||||
"IndexerPassThePopcornSettingsGoldenPopcornOnlyHelpText": "Szukaj tylko premier Złotego Popcornu",
|
||||
"IndexerPassThePopcornSettingsGoldenPopcornOnly": "Tylko Złoty Popcorn",
|
||||
"IndexerSettingsCookie": "Ciasteczko",
|
||||
"IndexerSettingsBaseUrl": "Podstawowy URL",
|
||||
"IndexerSettingsLimitsUnitHelpText": "Jednostka czasu do obliczania limitów na indekser",
|
||||
"PasswordConfirmation": "Potwierdzenie hasła",
|
||||
"IndexerSettingsSeedRatio": "Stosunek seedów",
|
||||
"IndexerAvistazSettingsUsernameHelpText": "Nazwa użytkownika",
|
||||
"IndexerOrpheusSettingsApiKeyHelpText": "Klucz API ze strony (do znalezienia w Ustawienia => Ustawienia Dostępu)",
|
||||
"IndexerNewznabSettingsApiKeyHelpText": "Klucz API strony",
|
||||
"IndexerAvistazSettingsPasswordHelpText": "Hasło na stronie",
|
||||
"IndexerAvistazSettingsPidHelpText": "PID ze strony Moje Konto lub Mój Profil",
|
||||
"IndexerAvistazSettingsFreeleechOnlyHelpText": "Szukaj tylko premier freeleech",
|
||||
"IndexerAvistazSettingsUsernameHelpTextWarning": "Tylko ranga członka lub wyższa może używać API z tym indekserem",
|
||||
"SearchType": "Rodzaj wyszukiwania",
|
||||
"ProxyValidationUnableToConnect": "Nie można połączyć się z proxy: {exceptionMessage}. Sprawdź logi tego błędu by poznać więcej szczegółów",
|
||||
"UsenetBlackholeNzbFolder": "Folder Nzb",
|
||||
"XmlRpcPath": "Ścieżka RPC XML",
|
||||
"AddDownloadClientToProwlarr": "Dodanie klienta pobierania pozwoli {appName} wysyłać premiery bezpośrednio z interfejsu użytkownika podczas ręcznego wyszukiwania.",
|
||||
"DownloadClientQbittorrentSettingsFirstAndLastFirst": "Pierwszy i ostatni pierwszym",
|
||||
"FailedToFetchUpdates": "Nie udało się uzyskać aktualizacji",
|
||||
"SeedTimeHelpText": "Jak długo torrent powinien być seedowany przed zatrzymaniem, puste to wartość domyślna aplikacji",
|
||||
"TheLogLevelDefault": "Wartość domyślna poziomu logów to 'Debug' i może być zmieniona w [Ogólnych ustawieniach](/settings/general)",
|
||||
"AppProfileSelectHelpText": "Profile aplikacji są wykorzystywane do kontroli RSS oraz ustawień automatycznego i interaktywnego wyszukiwania podczas synchronizacji",
|
||||
"IndexerMTeamTpSettingsApiKeyHelpText": "Klucz API ze strony (do znalezienia w Panel kontrolny użytkownika => Bezpieczeństwo => Laboratorium)",
|
||||
"IndexerNebulanceSettingsApiKeyHelpText": "Klucz API z Ustawień użytkownika => Kluczy API. Klucz musi mieć pozwolenia listowania i pobierania",
|
||||
"DownloadClientRTorrentSettingsAddStoppedHelpText": "Włączenie doda torrenty i magnety do rTorrenta w zatrzymanym stanie. To może uszkodzić pliki magnet.",
|
||||
"DownloadClientRTorrentSettingsUrlPathHelpText": "Ścieżka do punktu końcowego XMLRPC, sprawdź {url}. Zwykle jest to RPC2 lub [ścieżka do ruTorrenta]{url2} podczas korzystania z ruTorrenta.",
|
||||
"IndexerAuth": "Autoryzacja indeksera",
|
||||
"ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Jeżeli torrent jest zablokowany przez hasha może zostać nieprawidłowo odrzucony podczas RSS/Szukania przez niektóre indeksery, włączenie tej opcji pozwoli na jego odrzucenie po zgarnięciu, ale przed wysłaniem do klienta.",
|
||||
"ApplicationTagsHelpTextWarning": "Tagi powinny być używane ostrożnie, ponieważ mogą powodować niezamierzone efekty. Aplikacja z tagiem będzie synchronizowała się tylko z indekserem posiadającym taki sam tag.",
|
||||
"IndexerId": "ID indeksera",
|
||||
"IndexerHDBitsSettingsUseFilenames": "Używaj nazw plików",
|
||||
"SelectDownloadClientModalTitle": "{modalTitle} - wybierz klienta pobierania",
|
||||
"ProwlarrSupportsAnyIndexer": "{appName} wspiera wiele indekserów oprócz każdego indeksera, który używa standardu Newznab/Torznab korzystając z 'Generycznego Newznaba' (dla usenetu) lub 'Generycznego Torznaba' (dla torrentów). Znajdź i wybierz swój indexer poniżej.",
|
||||
"DeleteClientCategory": "Usuń kategorię klienta pobierania",
|
||||
"IndexerName": "Nazwa indeksera",
|
||||
"RepeatSearch": "Powtórz wyszukiwanie",
|
||||
"AppsMinimumSeedersHelpText": "Minimum seederów wymaganych przez Aplikacje, żeby indekser zgarnął pobieranie, puste pole oznacza domyślną wartość z profilu synchronizacji",
|
||||
"ConnectSettingsSummary": "Powiadomienia i dodatkowe skrypty",
|
||||
"IndexerBeyondHDSettingsLimitedOnlyHelpText": "Szukaj tylko freeleech (limitowany UL)",
|
||||
"NotificationsTelegramSettingsIncludeAppNameHelpText": "Opcjonalny tytuł wiadomości poprzedzającej z {appName} by rozróżnić powiadomienia z różnych aplikacji",
|
||||
"DownloadClientFloodSettingsTagsHelpText": "Początkowe tagi pobierania. Aby zostać rozpoznanym, pobieranie musi mieć wszystkie początkowe tagi. To pozwala na uniknięcie konfliktów z niepowiązanymi pobraniami.",
|
||||
"Install": "Instaluj",
|
||||
"PreviouslyInstalled": "Poprzednio zainstalowany",
|
||||
"IndexerHDBitsSettingsFreeleechOnlyHelpText": "Pokaż tylko premiery freeleech",
|
||||
"UnableToLoadIndexerProxies": "Nie można załadować proxy indekserów",
|
||||
"IndexerHealthCheckNoIndexers": "Nie włączono indekserów, {appName} nie zwróci wyników wyszukiwania.",
|
||||
"IndexerTagsHelpTextWarning": "Tagi powinny być używane ostrożni, ponieważ mogą powodować nieplanowane efekty. Indekser z tagiem będzie synchronizował się tylko z aplikacjami z tym samym tagiem.",
|
||||
"AuthenticationRequiredWarning": "Aby zapobiec nieautoryzowanemu dostępowi zdalnemu, {appName} wymaga, aby autoryzacja była włączona. Możesz ją opcjonalnie wyłączyć dla lokalnych adresów.",
|
||||
"NotSupported": "Nie wspierany",
|
||||
"IndexerHDBitsSettingsPasskeyHelpText": "Tajny klucz ze szczegółów użytkownika",
|
||||
"IndexerFileListSettingsFreeleechOnlyHelpText": "Szukaj tylko premier freeleech",
|
||||
"IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Szukaj tylko premier freeleech",
|
||||
"LogSizeLimitHelpText": "Maksymalny rozmiar pliku logów (MB) przed archiwizacją. Domyślnie 1 MB.",
|
||||
"IndexerSettingsQueryLimitHelpText": "Maksymalna liczba wyszukiwań zdefiniowana przez odpowiadającą jednostkę, którą {appName} dopuści do strony",
|
||||
"PreferMagnetUrlHelpText": "Kiedy włączone, ten indekser będzie preferował wykorzystanie linków magnet dla zgarnięć, z bezpiecznikiem linków torrent",
|
||||
"DownloadClientQbittorrentSettingsInitialStateHelpText": "Początkowy stan torrentów dodanych do qBittorrent. Zwróć uwagę, że wymuszone torrenty nie podlegają ograniczeniom seedowania",
|
||||
"MappedCategories": "Zmapowane kategorie",
|
||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Czy używać skonfigurowanego układu zawartości qBittorrent, oryginalnego układu z torrenta czy zawsze tworzyć podfolder (qBittorrent 4.3.2+)",
|
||||
"IndexerSettingsAppsMinimumSeeders": "Minimum seederów aplikacji",
|
||||
"TotalIndexerSuccessfulGrabs": "Całkowite udane zgarnięcia indeksera",
|
||||
"MinimumSeedersHelpText": "Minimalni seederzy wymagani przez aplikację, żeby indekser zgarnął",
|
||||
"SearchIndexers": "Szukaj indekserów",
|
||||
"DownloadClientSettingsInitialState": "Podstawowy stan",
|
||||
"IndexerSettingsSeedRatioHelpText": "Stosunek jaki torrent powinien osiągnać przed zatrzymaniem, puste = wartość domyślna klienta pobierania. Stosunek powinien wynosić co najmniej 1.0 i podlegać zasadom indeksera",
|
||||
"IndexerSettingsSeedTimeHelpText": "Czas przez jaki torrent powinien być seedowany przed zatrzymaniem, zostaw puste by używać domyślnej wartości klienta pobierania",
|
||||
"DownloadClientUTorrentProviderMessage": "uTorrent ma długą historię z kopaczami krypto, malware i reklamami, bardzo mocno zachęcamy do korzystania z innego klienta.",
|
||||
"ThemeHelpText": "Zmień motyw interfejsu użytkownika aplikacji, 'Auto' motyw będzie używał motywu Twojego systemu operacyjnego aby ustawić tryb Jasny lub Ciemny. Zainspirowane przez {inspiredBy}.",
|
||||
"DownloadClientSettingsDefaultCategoryHelpText": "Domyślna kategoria zapasowa jeżeli nie ma zmapowanej kategorii dla premiery. Dodawanie kategorii wyjątkowej dla {appName} pomaga uniknąć konfliktów z niezwiązanymi pobraniami spoza {appName}. Korzystanie z kategorii jest opcjonalne, ale mocno rekomendowane.",
|
||||
"HealthMessagesInfoBox": "Więcej informacji o tych komunikatach sprawdzania żywotności znajdziesz klikając w ikonkę książki (link do wiki) na końcu wiersza lub sprawdzając [logi]({link}). Jeżeli masz problem z interpretacją tych komunikatów, możesz zgłosić się do naszego wsparcie, pod linkami poniżej."
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
"Album": "專輯",
|
||||
"Authentication": "認證",
|
||||
"AutomaticSearch": "自動搜尋",
|
||||
"BackupFolderHelpText": "相對路徑將位於Radarr的AppData目錄下",
|
||||
"BackupFolderHelpText": "相對路徑將位於 {appName} 的 AppData 目錄下",
|
||||
"BackupNow": "馬上備份",
|
||||
"BackupRetentionHelpText": "超過保留期的自動備份將被自動清理",
|
||||
"BindAddress": "綁定地址(Bind Address)",
|
||||
@@ -75,7 +75,7 @@
|
||||
"Theme": "主題",
|
||||
"ApiKeyValidationHealthCheckMessage": "請將您的API金鑰更新為至少{length}個字元長。您可以通過設定或配置文件進行此操作。",
|
||||
"AppDataLocationHealthCheckMessage": "為了避免在更新過程中刪除AppData,將無法進行更新。",
|
||||
"AuthenticationMethodHelpText": "需要使用者名稱和密碼來存取Radarr",
|
||||
"AuthenticationMethodHelpText": "需要使用者名稱和密碼才能存取 {appName}",
|
||||
"Backup": "備份",
|
||||
"Enable": "啟用",
|
||||
"Grabs": "抓取",
|
||||
@@ -99,7 +99,7 @@
|
||||
"Seeders": "種子",
|
||||
"Settings": "設定",
|
||||
"DownloadClients": "下載用戶端",
|
||||
"AnalyticsEnabledHelpText": "將使用和錯誤資訊匿名傳送至Radarr的伺服器。這些資訊包括您的瀏覽器資訊、使用的Radarr WebUI頁面、錯誤報告,以及作業系統和執行時版本。我們將使用這些資訊來優先處理功能和錯誤修復。",
|
||||
"AnalyticsEnabledHelpText": "傳送匿名使用和錯誤資訊到 {appName} 的伺服器。這包括您的瀏覽器資訊、您使用的 {appName} WebUI 頁面、錯誤報告以及作業系統和執行階段版本。我們將使用這些資訊來優先處理功能和錯誤修正。",
|
||||
"ApiKey": "API 金鑰",
|
||||
"AppDataDirectory": "AppData 路徑",
|
||||
"Applications": "應用程式",
|
||||
@@ -135,7 +135,7 @@
|
||||
"IndexerHDBitsSettingsCodecs": "編解碼器",
|
||||
"Directory": "目錄",
|
||||
"BuiltIn": "內建的",
|
||||
"AllSearchResultsHiddenByFilter": "根據所使用的篩選器已將所有結果隱藏",
|
||||
"AllSearchResultsHiddenByFilter": "根據所使用的篩選器已將所有結果隱藏。",
|
||||
"AptUpdater": "使用apt安裝更新",
|
||||
"Discord": "Discord",
|
||||
"Any": "任何",
|
||||
|
||||
@@ -6,23 +6,23 @@
|
||||
<PackageReference Include="AngleSharp.Xml" Version="1.0.0" />
|
||||
<PackageReference Include="Dapper" Version="2.1.66" />
|
||||
<PackageReference Include="Diacritical.Net" Version="1.0.4" />
|
||||
<PackageReference Include="MailKit" Version="4.12.1" />
|
||||
<PackageReference Include="MailKit" Version="4.14.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="8.0.16" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="8.0.16" />
|
||||
<PackageReference Include="Microsoft.Data.SqlClient" Version="6.0.2" />
|
||||
<PackageReference Include="Microsoft.Data.SqlClient" Version="6.1.1" />
|
||||
<PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" />
|
||||
<PackageReference Include="Npgsql" Version="9.0.3" />
|
||||
<PackageReference Include="Polly" Version="8.6.0" />
|
||||
<PackageReference Include="Polly" Version="8.6.4" />
|
||||
<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.Drawing.Common" Version="8.0.19" />
|
||||
<PackageReference Include="System.Memory" Version="4.6.3" />
|
||||
<PackageReference Include="System.ServiceModel.Syndication" Version="8.0.0" />
|
||||
<PackageReference Include="FluentValidation" Version="9.5.4" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.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="8.0.5" />
|
||||
<PackageReference Include="System.Text.Json" Version="8.0.6" />
|
||||
<PackageReference Include="MonoTorrent" Version="2.0.7" />
|
||||
<PackageReference Include="YamlDotNet" Version="16.3.0" />
|
||||
<PackageReference Include="AngleSharp" Version="1.3.0" />
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using DryIoc;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
@@ -31,6 +32,7 @@ using Prowlarr.Http.ClientSchema;
|
||||
using Prowlarr.Http.ErrorManagement;
|
||||
using Prowlarr.Http.Frontend;
|
||||
using Prowlarr.Http.Middleware;
|
||||
using IPNetwork = Microsoft.AspNetCore.HttpOverrides.IPNetwork;
|
||||
using LogLevel = Microsoft.Extensions.Logging.LogLevel;
|
||||
|
||||
namespace NzbDrone.Host
|
||||
@@ -59,8 +61,9 @@ namespace NzbDrone.Host
|
||||
services.Configure<ForwardedHeadersOptions>(options =>
|
||||
{
|
||||
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost;
|
||||
options.KnownNetworks.Clear();
|
||||
options.KnownProxies.Clear();
|
||||
options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("10.0.0.0"), 8));
|
||||
options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("172.16.0.0"), 12));
|
||||
options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("192.168.0.0"), 16));
|
||||
});
|
||||
|
||||
services.AddRouting(options => options.LowercaseUrls = true);
|
||||
|
||||
@@ -51,7 +51,7 @@ namespace NzbDrone.Test.Common.AutoMoq
|
||||
|
||||
if (behavior != MockBehavior.Default && mock.Behavior == MockBehavior.Default)
|
||||
{
|
||||
throw new InvalidOperationException("Unable to change be behaviour of a an existing mock.");
|
||||
throw new InvalidOperationException("Unable to change be behaviour of an existing mock.");
|
||||
}
|
||||
|
||||
return mock;
|
||||
@@ -139,7 +139,7 @@ namespace NzbDrone.Test.Common.AutoMoq
|
||||
|
||||
LoadPlatformLibrary();
|
||||
|
||||
AssemblyLoader.RegisterSQLiteResolver();
|
||||
AssemblyLoader.RegisterNativeResolver(new[] { "System.Data.SQLite", "Prowlarr.Core" });
|
||||
}
|
||||
|
||||
private Mock<T> TheRegisteredMockForThisType<T>(Type type)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<DataCollectors>
|
||||
<DataCollector friendlyName="XPlat code coverage">
|
||||
<Configuration>
|
||||
<Format>opencover</Format>
|
||||
<Format>cobertura</Format>
|
||||
<Exclude>[Prowlarr.*.Test]*,[Prowlarr.Test.*]*,[Prowlarr.Api*]*</Exclude>
|
||||
</Configuration>
|
||||
</DataCollector>
|
||||
|
||||
Reference in New Issue
Block a user