Compare commits

..

64 Commits

Author SHA1 Message Date
bakerboy448
20b82146ac New: Deprecate Readarr 2025-10-30 23:41:08 -05:00
bakerboy448
e4fb36e08f Bump to 2.3.0 2025-10-30 05:51:48 -05:00
Mark McDowall
ff22fdf7d3 Set known networks to RFC 1918 ranges during startup
(cherry picked from commit d10107739b9ed6a50165e5dd1dfae15c7e8aea56)
2025-10-29 23:42:00 +00:00
Polgonite
b3d46465ae Fixed: qBittorrent /login API success check 2025-10-29 17:59:58 -05:00
bakerboy448
eb57d20545 Bump to 2.2.0 2025-10-25 14:42:07 -05:00
bakerboy448
775b716c0f Fixed:(RuTracker) fix for Anime S01nd Episode N of N or N+N of N+N
Based on Jackett 5b712189fc55470dc94b56ea0d764e123e2dc432
2025-10-20 18:19:42 -05:00
bakerboy448
f7f3648dac Bump to 2.1.5 2025-10-13 19:42:22 -05:00
Bogdan
c669048767 Bump System.Data.SQLite, MailKit, Microsoft.Data.SqlClient, Newtonsoft.Json and Polly
(cherry picked from commit 86282d621b3edcbf3582d6321de8be4172d37ed2)
2025-10-05 12:18:14 -05:00
Bogdan
c282e4bef8 Pin System.Private.Uri to 4.3.2
(cherry picked from commit e0180e397d90db01e8cee0ee38419eb0b6bce989)
2025-10-05 12:18:14 -05:00
bakerboy448
574721bfb5 Bump to 2.1.4 2025-10-05 12:18:07 -05:00
bakerboy448
3c7575b58e fixup! Pin System.Drawing.Common to 8.0 (#2514) 2025-10-02 10:36:03 -05:00
Bogdan
93d8f81750 Fix code coverage on CI 2025-10-02 10:31:48 -05:00
Bogdan
364c7c9c7e Avoid rewriting file names in builds
Signed-off-by: bakerboy448 <55419169+bakerboy448@users.noreply.github.com>
2025-10-02 10:31:48 -05:00
Bogdan
54af7fd3d0 Bump coverlet.collector to official 6.0.4
Bump NUnit3TestAdapter to 5.1.0
Bump NunitXml.TestLogger to 3.1.20
2025-10-02 10:31:48 -05:00
bakerboy448
e6bc7fa062 Pin System.Drawing.Common to 8.0 (#2514) 2025-10-02 09:36:12 -05:00
bakerboy448
98608e75a6 Fixup theme selector App name 2025-10-01 10:21:22 -05:00
Bogdan
160320f3a2 Switch HttpProxySettingsProviderFixture to test cases
(cherry picked from commit 4e8fe6e81b1ac3f53135ad2e2b95d7aae811b87e)
2025-09-30 21:48:50 -05:00
Collin Heist
c9baaf634e Fixed: Prevent modals from overflowing screen width
(cherry picked from commit 6c581b7e3c5c74db350d7ba2aad04f2df77c7671)
2025-09-30 21:46:34 -05:00
Stevie Robinson
8bf2f68abe New: Switch theme automatically on system change
(cherry picked from commit 4904e85887b8455483e509b83abaa2c6517d45a0)
2025-09-30 21:46:32 -05:00
Bogdan
9434091912 New: Retry SQLite writes for database is locked errors
(cherry picked from commit 2e1289b9248a70ce50bde52a66d3a589f3dcb8f5)
2025-09-30 21:46:28 -05:00
Zac Bowling
2f7d821d45 Fixed: (RevolutionTT) New Domain (#2511)
* RevolutionTT switched domains

* fixup!

Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com>

---------

Co-authored-by: bakerboy448 <55419169+bakerboy448@users.noreply.github.com>
Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com>
2025-09-30 20:39:28 -05:00
Bogdan
471c9910a0 Bump System.Data.SQLite to official 2.0.1 2025-09-30 13:24:39 -05:00
Bogdan
98ff2f5cb6 Bump STJson, MailKit and Polly 2025-09-30 13:24:39 -05:00
bakerboy448
4d9982872a New: (PTP) Improve Error Handling 2025-09-30 11:43:56 -05:00
bakerboy448
ae9326480e fixup! New: Move CGPeers to Cardigann 2025-09-30 11:41:57 -05:00
Ryan S
624cbd548f Fixed: (Indexer) Shazbat added new site url
Moved old url to LegacyUrls
2025-09-30 11:28:09 -05:00
bakerboy448
f5f98e4f53 New: Move CGPeers to Cardigann 2025-09-25 09:36:56 -05:00
Weblate
8585dd447e Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Pazuzu6666 <fukscam978@gmail.com>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_TW/
Translation: Servarr/Prowlarr
2025-09-25 09:29:25 -05:00
bakerboy448
dfffb3aa4e Bump to 2.1.3 2025-09-21 14:53:25 -05:00
bakerboy448
7eb2d956cf Bump to 2.1.2 2025-09-14 22:29:17 -05:00
thisaccountwillmakeprs
8da493dbaf Fixed: (BroadcasTheNet) Improve daily episode searching (#2500) 2025-09-13 10:37:29 -05:00
bakerboy448
f17cf6144f docs: Update bug report template for clarity
[skip ci]
2025-09-07 12:23:51 -05:00
bakerboy448
1b3adc4529 docs: Fix typos in bug report template labels and descriptions
[skip ci]
2025-09-07 12:08:30 -05:00
bakerboy448
389f049a8b docs: Update bug report template for clarity and accuracy
[skip ci]
2025-09-07 12:06:05 -05:00
bakerboy448
99b0fcd750 Bump to 2.1.1 2025-09-07 00:27:28 -05:00
bakerboy448
516b09ca91 Fixed: Rename (Newznab) nzb.su to nzb.life
rename ApiKeyWhiteList to ApiKeyAllowList

Co-authored-by: Stevie<stevie.robinson@gmail.com>
2025-09-06 21:15:04 -05:00
bakerboy448
770fd64013 Revert Various
Revert "Fixed: (HttpClient) Increase cookie limit per domain to 100"

This reverts commit f67c672ec7.

Revert "Add exclusive only"

This reverts commit 80425f5ea4.

Revert "GGn Snatched + Pagination"This reverts commit 758cae3f40.

Revert "Fixed: (PassThePopcorn) Generate titles for full discs"

This reverts commit fbf4ff6777.
2025-09-06 10:57:17 -05:00
Bogdan
f67c672ec7 Fixed: (HttpClient) Increase cookie limit per domain to 100 2025-09-06 07:15:05 -05:00
Bogdan
80425f5ea4 Add exclusive only 2025-09-06 07:14:55 -05:00
Bogdan
758cae3f40 GGn Snatched + Pagination 2025-09-06 07:14:43 -05:00
Bogdan
fbf4ff6777 Fixed: (PassThePopcorn) Generate titles for full discs 2025-09-06 07:14:32 -05:00
Bogdan
98ee9c1703 Fixed: Responsive add indexer modal layout filters 2025-09-06 07:14:20 -05:00
bakerboy448
c537e94f0f New: INTERNAL flag support for Cardigann Indexers based on Description 2025-09-05 16:12:03 -05:00
bakerboy448
9e5dd2a2e6 Fixed: (Newznab) nzb.su to nzb.life
Change url for built in defintion
2025-09-03 10:56:22 -05:00
bakerboy448
f601ff98a2 New: (FileList) Add Cat 31 and refresh urls 2025-09-01 14:27:33 -05:00
Weblate
540fafdebf Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Jeremi Florczyk <j.m.florczyk@gmail.com>
Co-authored-by: NanderTGA <nander.roobaert@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Xoores <servarr-35466@xoores.cz>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/
Translation: Servarr/Prowlarr
2025-09-01 14:27:20 -05:00
bakerboy448
532bffe772 Bump to 2.1.0 2025-08-23 15:47:28 -05:00
bakerboy448
bf80f7916c Improve UX of indexer urls error logging 2025-08-21 14:48:05 -05:00
bakerboy448
2f6a9dfffb New: Improve Indexer Connection Failure Messaging (#2473) 2025-08-20 11:25:27 -05:00
Weblate
94477e9cf9 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Jeremi Florczyk <j.m.florczyk@gmail.com>
Co-authored-by: Marcin <ml.cichy@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/
Translation: Servarr/Prowlarr
2025-08-20 11:25:05 -05:00
ilike2burnthing
52e21b3dfc Fixed:(toloka) improve episode regex & trim (#2471)
toloka: improve episode regex & trim
2025-08-18 20:38:22 -05:00
Eugene Shatilo
cb4cc81ad0 Fixed:(RuTracker) corrected regexp for director’s name in the title to cover cases for Russian directors (#2470)
Corrected regexp for rutracker director's name in the title to cover cases for russian directors
2025-08-17 21:51:57 -05:00
bakerboy448
7ada036480 Fixed: Mobile add indexer modal layout (#2464)
* New: Add Indexer Filters are Collapsible

fixes #2431

* Fixed: Rename onToggleFilters to handleToggleFilters

* fix css lint
2025-08-17 21:46:59 -05:00
bakerboy448
f1c9ba40c4 Bump to 2.0.5 2025-08-17 14:43:48 -04:00
Mark McDowall
8664fc095d New: Move auth success logging to debug
Closes #7978
2025-08-11 22:38:25 -05:00
Mark McDowall
23b9973ef7 Don't log debug messages for API key validation
(cherry picked from commit 78ca30d1f81361a2dabaddd0036b764859b858af)
2025-08-11 18:34:24 -05:00
Weblate
d9f1d96e00 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Tim81 <tvdham@hotmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translation: Servarr/Prowlarr
2025-08-11 18:26:34 -05:00
bakerboy448
d9d045a548 Bump version to 2.0.4 2025-08-10 23:24:55 -05:00
Robin Dadswell
c417c41133 Fixed: Saving Newznab indexer when redirect was true 2025-08-05 13:30:21 +01:00
Weblate
d5853735ac Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: ArLab1 <arnaud.laberge@hotmail.com>
Co-authored-by: Oleksii Ilienko <assada.ua@gmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/
Translation: Servarr/Prowlarr
2025-08-05 06:12:08 -05:00
Robin Dadswell
dbc159f536 New: Force all usenet indexers to use Redirection 2025-08-04 10:39:45 +01:00
Robin Dadswell
231cc91f97 New: Updated all newznab indexers to be redirect 2025-08-04 10:39:45 +01:00
Mike Miller
1a075f201c Fixed: (Xpseeds) Update categories (#2458)
Sync with Jackett
2025-08-03 13:12:59 -05:00
bakerboy448
de7f42cf30 Bump version to 2.0.3 2025-07-23 08:50:43 -05:00
57 changed files with 1256 additions and 194 deletions

View File

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

View File

@@ -9,7 +9,7 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '2.0.2'
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:

View File

@@ -19,6 +19,7 @@
.modal {
position: relative;
display: flex;
max-width: 90%;
max-height: 90%;
border-radius: 6px;
opacity: 1;

View 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];
};

View File

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

View File

@@ -7,6 +7,8 @@ interface CssExports {
'filterInput': string;
'filterLabel': string;
'filterRow': string;
'filterRowCollapsed': string;
'filtersToggle': string;
'indexers': string;
'modalBody': string;
'modalFooter': string;

View File

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

View File

@@ -1,14 +1,18 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Label from 'Components/Label';
import Button from 'Components/Link/Button';
import Link from 'Components/Link/Link';
import Menu from 'Components/Menu/Menu';
import MenuContent from 'Components/Menu/MenuContent';
import { sizes } from 'Helpers/Props';
import { kinds, sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import AddApplicationPresetMenuItem from './AddApplicationPresetMenuItem';
import styles from './AddApplicationItem.css';
const DEPRECATED_APPLICATIONS = ['Readarr'];
const OBSOLETE_APPLICATIONS = [];
class AddApplicationItem extends Component {
//
@@ -36,6 +40,8 @@ class AddApplicationItem extends Component {
} = this.props;
const hasPresets = !!presets && !!presets.length;
const isDeprecated = DEPRECATED_APPLICATIONS.includes(implementation);
const isObsolete = OBSOLETE_APPLICATIONS.includes(implementation);
return (
<div
@@ -49,6 +55,24 @@ class AddApplicationItem extends Component {
<div className={styles.overlay}>
<div className={styles.name}>
{implementationName}
{
isDeprecated &&
<Label
kind={kinds.WARNING}
title={translate('DeprecatedApplicationMessage', { applicationName: implementationName })}
>
{translate('Deprecated')}
</Label>
}
{
isObsolete &&
<Label
kind={kinds.DANGER}
title={translate('ObsoleteApplicationMessage', { applicationName: implementationName })}
>
{translate('Obsolete')}
</Label>
}
</div>
<div className={styles.actions}>

View File

@@ -10,6 +10,9 @@ import translate from 'Utilities/String/translate';
import EditApplicationModalConnector from './EditApplicationModalConnector';
import styles from './Application.css';
const DEPRECATED_APPLICATIONS = ['Readarr'];
const OBSOLETE_APPLICATIONS = [];
class Application extends Component {
//
@@ -61,10 +64,13 @@ class Application extends Component {
syncLevel,
fields,
tags,
tagList
tagList,
implementation
} = this.props;
const applicationUrl = fields.find((field) => field.name === 'baseUrl')?.value;
const isDeprecated = DEPRECATED_APPLICATIONS.includes(implementation);
const isObsolete = OBSOLETE_APPLICATIONS.includes(implementation);
return (
<Card
@@ -88,6 +94,26 @@ class Application extends Component {
}
</div>
{
isDeprecated &&
<Label
kind={kinds.WARNING}
title={translate('DeprecatedApplicationMessage', { applicationName: implementation })}
>
{translate('Deprecated')}
</Label>
}
{
isObsolete &&
<Label
kind={kinds.DANGER}
title={translate('ObsoleteApplicationMessage', { applicationName: implementation })}
>
{translate('Obsolete')}
</Label>
}
{
syncLevel === 'addOnly' &&
<Label kind={kinds.WARNING}>
@@ -141,6 +167,7 @@ class Application extends Component {
Application.propTypes = {
id: PropTypes.number.isRequired,
name: PropTypes.string.isRequired,
implementation: PropTypes.string.isRequired,
enable: PropTypes.bool.isRequired,
syncLevel: PropTypes.string.isRequired,
fields: PropTypes.arrayOf(PropTypes.object).isRequired,

View File

@@ -39,6 +39,9 @@ const syncLevelOptions = [
}
];
const DEPRECATED_APPLICATIONS = ['Readarr'];
const OBSOLETE_APPLICATIONS = [];
function EditApplicationModalContent(props) {
const {
advancedSettings,
@@ -60,6 +63,7 @@ function EditApplicationModalContent(props) {
const {
id,
implementation,
implementationName,
name,
syncLevel,
@@ -68,6 +72,9 @@ function EditApplicationModalContent(props) {
message
} = item;
const isDeprecated = DEPRECATED_APPLICATIONS.includes(implementation);
const isObsolete = OBSOLETE_APPLICATIONS.includes(implementation);
return (
<ModalContent onModalClose={onModalClose}>
<ModalHeader>
@@ -90,6 +97,28 @@ function EditApplicationModalContent(props) {
{
!isFetching && !error &&
<Form {...otherProps}>
{
isDeprecated &&
<Alert
className={styles.message}
kind={kinds.WARNING}
>
<div>{translate('DeprecatedApplicationTitle', { applicationName: implementationName })}</div>
<div>{translate('DeprecatedApplicationMessage', { applicationName: implementationName })}</div>
</Alert>
}
{
isObsolete &&
<Alert
className={styles.message}
kind={kinds.DANGER}
>
<div>{translate('ObsoleteApplicationTitle', { applicationName: implementationName })}</div>
<div>{translate('ObsoleteApplicationMessage', { applicationName: implementationName })}</div>
</Alert>
}
{
!!message &&
<Alert

View File

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

View File

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

View File

@@ -202,6 +202,7 @@ namespace NzbDrone.Common.Instrumentation
c.ForLogger("Microsoft.*").WriteToNil(LogLevel.Warn);
c.ForLogger("Microsoft.Hosting.Lifetime*").WriteToNil(LogLevel.Info);
c.ForLogger("Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware").WriteToNil(LogLevel.Fatal);
c.ForLogger("Prowlarr.Http.Authentication.ApiKeyAuthenticationHandler").WriteToNil(LogLevel.Info);
});
}

View File

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

View File

@@ -0,0 +1,192 @@
using System;
using System.Linq;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.Datastore.Migration;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.Datastore.Migration
{
[TestFixture]
public class newznab_indexers_enable_redirectFixture : MigrationTest<newznab_indexers_enable_redirect>
{
[Test]
public void should_update_redirect_setting_to_true_if_false()
{
var db = WithMigrationTestDb(c =>
{
c.Insert.IntoTable("Indexers").Row(new
{
Id = 1,
Name = "Test",
Implementation = "Newznab",
Settings = "{\"baseUrl\":\"https://example.com\",\"apiKey\":\"testapikey\"}",
ConfigContract = "NewznabSettings",
Enable = true,
Priority = 1,
Added = System.DateTime.UtcNow,
Redirect = false,
AppProfileId = 1,
Tags = "[]",
DownloadClientId = 0
});
});
var items = db.Query<IndexerDefinition043>("SELECT * FROM \"Indexers\"");
items.Should().HaveCount(1);
items.First().Implementation.Should().Be("Newznab");
items.First().Redirect.Should().BeTrue(); // Validate Redirect is updated
}
[Test]
public void should_not_change_redirect_setting_if_already_true()
{
var db = WithMigrationTestDb(c =>
{
c.Insert.IntoTable("Indexers").Row(new
{
Id = 1,
Name = "Test",
Implementation = "Newznab",
Settings = "{\"baseUrl\":\"https://example.com\",\"apiKey\":\"testapikey\"}",
ConfigContract = "NewznabSettings",
Enable = true,
Priority = 2,
Added = System.DateTime.UtcNow,
Redirect = true,
AppProfileId = 1,
Tags = "[]",
DownloadClientId = 0
});
});
var items = db.Query<IndexerDefinition043>("SELECT * FROM \"Indexers\"");
items.Should().HaveCount(1);
items.First().Implementation.Should().Be("Newznab");
items.First().Redirect.Should().BeTrue(); // Validate Redirect remains true
}
[Test]
public void should_not_affect_non_newznab_indexers()
{
var db = WithMigrationTestDb(c =>
{
c.Insert.IntoTable("Indexers").Row(new
{
Id = 1,
Name = "Test",
Implementation = "OtherIndexer",
Settings = "{\"baseUrl\":\"https://otherindexer.com\"}",
ConfigContract = "OtherIndexerSettings",
Enable = true,
Priority = 3,
Added = System.DateTime.UtcNow,
Redirect = false,
AppProfileId = 1,
Tags = "[]",
DownloadClientId = 0
});
});
var items = db.Query<IndexerDefinition043>("SELECT * FROM \"Indexers\"");
items.Should().HaveCount(1);
items.First().Implementation.Should().Be("OtherIndexer");
items.First().Redirect.Should().BeFalse(); // Validate Redirect is not changed
}
[Test]
public void should_handle_multiple_indexers()
{
var db = WithMigrationTestDb(c =>
{
c.Insert.IntoTable("Indexers").Row(new
{
Id = 1,
Name = "Test 1",
Implementation = "Newznab",
Settings = "{\"baseUrl\":\"https://example1.com\",\"apiKey\":\"testapikey1\"}",
ConfigContract = "NewznabSettings",
Enable = true,
Priority = 4,
Added = System.DateTime.UtcNow,
Redirect = false,
AppProfileId = 1,
Tags = "[]",
DownloadClientId = 0
});
c.Insert.IntoTable("Indexers").Row(new
{
Id = 2,
Name = "Test 2",
Implementation = "Newznab",
Settings = "{\"baseUrl\":\"https://example2.com\",\"apiKey\":\"testapikey2\"}",
ConfigContract = "NewznabSettings",
Enable = true,
Priority = 5,
Added = System.DateTime.UtcNow,
Redirect = false,
AppProfileId = 1,
Tags = "[]",
DownloadClientId = 0
});
c.Insert.IntoTable("Indexers").Row(new
{
Id = 3,
Name = "Test 3",
Implementation = "Newznab",
Settings = "{\"baseUrl\":\"https://example3.com\",\"apiKey\":\"testapikey3\"}",
ConfigContract = "NewznabSettings",
Enable = true,
Priority = 6,
Added = System.DateTime.UtcNow,
Redirect = true,
AppProfileId = 1,
Tags = "[]",
DownloadClientId = 0
});
c.Insert.IntoTable("Indexers").Row(new
{
Id = 4,
Name = "Test 4",
Implementation = "OtherIndexer",
Settings = "{\"baseUrl\":\"https://otherindexer.com\"}",
ConfigContract = "OtherIndexerSettings",
Enable = true,
Priority = 7,
Added = System.DateTime.UtcNow,
Redirect = false,
AppProfileId = 1,
Tags = "[]",
DownloadClientId = 0
});
});
var items = db.Query<IndexerDefinition043>("SELECT * FROM \"Indexers\"");
items.Should().HaveCount(4);
items.First(i => i.Id == 1).Redirect.Should().BeTrue(); // Validate Redirect is updated
items.First(i => i.Id == 2).Redirect.Should().BeTrue(); // Validate Redirect is updated
items.First(i => i.Id == 3).Redirect.Should().BeTrue(); // Validate Redirect remains true
items.First(i => i.Id == 4).Redirect.Should().BeFalse(); // Validate Redirect is not changed
}
}
public class IndexerDefinition043
{
public int Id { get; set; }
public string Name { get; set; }
public string Implementation { get; set; }
public string Settings { get; set; }
public string ConfigContract { get; set; }
public bool Enable { get; set; }
public int Priority { get; set; }
public DateTime Added { get; set; }
public bool Redirect { get; set; }
public int AppProfileId { get; set; }
public string Tags { get; set; }
public int DownloadClientId { get; set; }
}
}

View File

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

View File

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

View File

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

View File

@@ -159,7 +159,7 @@ namespace NzbDrone.Core.Applications.Lidarr
case HttpStatusCode.BadRequest:
if (ex.Response.Content.Contains("Query successful, but no results in the configured categories were returned from your indexer.", StringComparison.InvariantCultureIgnoreCase))
{
_logger.Warn(ex, "No Results in configured categories. See FAQ Entry: Prowlarr will not sync X Indexer to App");
_logger.Warn(ex, "No Results in configured categories. See FAQ Entry: https://wiki.servarr.com/prowlarr/faq#prowlarr-will-not-sync-x-indexer-to-app");
break;
}

View File

@@ -172,7 +172,7 @@ namespace NzbDrone.Core.Applications.Radarr
case HttpStatusCode.BadRequest:
if (ex.Response.Content.Contains("Query successful, but no results in the configured categories were returned from your indexer.", StringComparison.InvariantCultureIgnoreCase))
{
_logger.Warn(ex, "No Results in configured categories. See FAQ Entry: Prowlarr will not sync X Indexer to App");
_logger.Warn(ex, "No Results in configured categories. See FAQ Entry: https://wiki.servarr.com/prowlarr/faq#prowlarr-will-not-sync-x-indexer-to-app");
break;
}

View File

@@ -14,6 +14,7 @@ using NzbDrone.Core.Indexers;
namespace NzbDrone.Core.Applications.Readarr
{
[Obsolete("Readarr is deprecated and will be removed in a future version")]
public class Readarr : ApplicationBase<ReadarrSettings>
{
public override string Name => "Readarr";

View File

@@ -146,7 +146,7 @@ namespace NzbDrone.Core.Applications.Readarr
case HttpStatusCode.BadRequest:
if (ex.Response.Content.Contains("Query successful, but no results in the configured categories were returned from your indexer.", StringComparison.InvariantCultureIgnoreCase))
{
_logger.Warn(ex, "No Results in configured categories. See FAQ Entry: Prowlarr will not sync X Indexer to App");
_logger.Warn(ex, "No Results in configured categories. See FAQ Entry: https://wiki.servarr.com/prowlarr/faq#prowlarr-will-not-sync-x-indexer-to-app");
break;
}

View File

@@ -159,7 +159,7 @@ namespace NzbDrone.Core.Applications.Sonarr
case HttpStatusCode.BadRequest:
if (ex.Response.Content.Contains("Query successful, but no results in the configured categories were returned from your indexer.", StringComparison.InvariantCultureIgnoreCase))
{
_logger.Warn(ex, "No Results in configured categories. See FAQ Entry: Prowlarr will not sync X Indexer to App");
_logger.Warn(ex, "No Results in configured categories. See FAQ Entry: https://wiki.servarr.com/prowlarr/faq#prowlarr-will-not-sync-x-indexer-to-app");
break;
}

View File

@@ -144,7 +144,7 @@ namespace NzbDrone.Core.Applications.Whisparr
case HttpStatusCode.BadRequest:
if (ex.Response.Content.Contains("Query successful, but no results in the configured categories were returned from your indexer.", StringComparison.InvariantCultureIgnoreCase))
{
_logger.Warn(ex, "No Results in configured categories. See FAQ Entry: Prowlarr will not sync X Indexer to App");
_logger.Warn(ex, "No Results in configured categories. See FAQ Entry: https://wiki.servarr.com/prowlarr/faq#prowlarr-will-not-sync-x-indexer-to-app");
break;
}

View File

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

View File

@@ -0,0 +1,22 @@
using System.Data;
using Dapper;
using FluentMigrator;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(043)]
public class newznab_indexers_enable_redirect : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
Execute.WithConnection(UpdateNewznabRedirectSetting);
}
private void UpdateNewznabRedirectSetting(IDbConnection conn, IDbTransaction tran)
{
var updateSql = "UPDATE \"Indexers\" SET \"Redirect\" = @Redirect WHERE \"Implementation\" = 'Newznab' AND \"Redirect\" = false";
conn.Execute(updateSql, new { Redirect = true }, transaction: tran);
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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\(.+?\))");

View File

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

View File

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

View File

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

View File

@@ -121,53 +121,49 @@ public class XSpeeds : TorrentIndexerBase<XSpeedsSettings>
caps.Categories.AddCategoryMapping(112, NewznabStandardCategory.MoviesOther, "Anime Movies");
caps.Categories.AddCategoryMapping(111, NewznabStandardCategory.MoviesOther, "Anime TV");
caps.Categories.AddCategoryMapping(150, NewznabStandardCategory.PC, "Apps");
caps.Categories.AddCategoryMapping(156, NewznabStandardCategory.TV, "AV1");
caps.Categories.AddCategoryMapping(156, NewznabStandardCategory.Movies, "AV1");
caps.Categories.AddCategoryMapping(159, NewznabStandardCategory.Movies, "Movie Boxsets AV1");
caps.Categories.AddCategoryMapping(158, NewznabStandardCategory.Movies, "Movies AV1");
caps.Categories.AddCategoryMapping(157, NewznabStandardCategory.TV, "TV AV1");
caps.Categories.AddCategoryMapping(160, NewznabStandardCategory.TV, "TV Boxsets AV1");
caps.Categories.AddCategoryMapping(153, NewznabStandardCategory.Books, "Books");
caps.Categories.AddCategoryMapping(154, NewznabStandardCategory.AudioAudiobook, "Audiobooks");
caps.Categories.AddCategoryMapping(155, NewznabStandardCategory.Books, "Books & Magazines");
caps.Categories.AddCategoryMapping(154, NewznabStandardCategory.AudioAudiobook, "Books Audiobooks");
caps.Categories.AddCategoryMapping(155, NewznabStandardCategory.Books, "Books eBooks & Magazines");
caps.Categories.AddCategoryMapping(68, NewznabStandardCategory.MoviesOther, "Cams/TS");
caps.Categories.AddCategoryMapping(140, NewznabStandardCategory.TVDocumentary, "Documentary");
caps.Categories.AddCategoryMapping(10, NewznabStandardCategory.MoviesDVD, "DVDR");
caps.Categories.AddCategoryMapping(109, NewznabStandardCategory.MoviesBluRay, "Bluray Disc");
caps.Categories.AddCategoryMapping(109, NewznabStandardCategory.MoviesBluRay, "DVDR Bluray Disc");
caps.Categories.AddCategoryMapping(131, NewznabStandardCategory.TVSport, "Fighting");
caps.Categories.AddCategoryMapping(134, NewznabStandardCategory.TVSport, "Fighting/Boxing");
caps.Categories.AddCategoryMapping(133, NewznabStandardCategory.TVSport, "Fighting/MMA");
caps.Categories.AddCategoryMapping(132, NewznabStandardCategory.TVSport, "Fighting/Wrestling");
caps.Categories.AddCategoryMapping(134, NewznabStandardCategory.TVSport, "Fighting Boxing");
caps.Categories.AddCategoryMapping(133, NewznabStandardCategory.TVSport, "Fighting MMA");
caps.Categories.AddCategoryMapping(132, NewznabStandardCategory.TVSport, "Fighting Wrestling");
caps.Categories.AddCategoryMapping(72, NewznabStandardCategory.MoviesForeign, "Foreign");
caps.Categories.AddCategoryMapping(116, NewznabStandardCategory.TVForeign, "Foreign Boxsets");
caps.Categories.AddCategoryMapping(114, NewznabStandardCategory.MoviesForeign, "Foreign Movies");
caps.Categories.AddCategoryMapping(115, NewznabStandardCategory.TVForeign, "Foreign TV");
caps.Categories.AddCategoryMapping(103, NewznabStandardCategory.ConsoleOther, "Games Console");
caps.Categories.AddCategoryMapping(105, NewznabStandardCategory.ConsoleOther, "Games Console/Nintendo");
caps.Categories.AddCategoryMapping(104, NewznabStandardCategory.ConsolePS4, "Games Console/Playstation");
caps.Categories.AddCategoryMapping(106, NewznabStandardCategory.ConsoleXBox, "Games Console/XBOX");
caps.Categories.AddCategoryMapping(105, NewznabStandardCategory.ConsoleOther, "Games Console Nintendo");
caps.Categories.AddCategoryMapping(104, NewznabStandardCategory.ConsolePS4, "Games Console Playstation");
caps.Categories.AddCategoryMapping(106, NewznabStandardCategory.ConsoleXBox, "Games Console XBOX");
caps.Categories.AddCategoryMapping(6, NewznabStandardCategory.PCGames, "Games PC");
caps.Categories.AddCategoryMapping(108, NewznabStandardCategory.PC, "Games PC/Linux");
caps.Categories.AddCategoryMapping(107, NewznabStandardCategory.PCMac, "Games PC/Mac");
caps.Categories.AddCategoryMapping(108, NewznabStandardCategory.PC, "Games PC Linux");
caps.Categories.AddCategoryMapping(107, NewznabStandardCategory.PCMac, "Games PC Mac");
caps.Categories.AddCategoryMapping(11, NewznabStandardCategory.Movies, "Movie Boxsets");
caps.Categories.AddCategoryMapping(118, NewznabStandardCategory.MoviesUHD, "Movie Boxsets/Boxset 4K");
caps.Categories.AddCategoryMapping(143, NewznabStandardCategory.MoviesHD, "Movie Boxsets/Boxset HD");
caps.Categories.AddCategoryMapping(119, NewznabStandardCategory.MoviesHD, "Movie Boxsets/Boxset HEVC");
caps.Categories.AddCategoryMapping(144, NewznabStandardCategory.MoviesSD, "Movie Boxsets/Boxset SD");
caps.Categories.AddCategoryMapping(118, NewznabStandardCategory.MoviesUHD, "Movie Boxsets 4K");
caps.Categories.AddCategoryMapping(162, NewznabStandardCategory.MoviesHD, "Movie Boxsets AV1");
caps.Categories.AddCategoryMapping(143, NewznabStandardCategory.MoviesHD, "Movie Boxsets HD");
caps.Categories.AddCategoryMapping(119, NewznabStandardCategory.MoviesHD, "Movie Boxsets HEVC");
caps.Categories.AddCategoryMapping(144, NewznabStandardCategory.MoviesSD, "Movie Boxsets SD");
caps.Categories.AddCategoryMapping(12, NewznabStandardCategory.Movies, "Movies");
caps.Categories.AddCategoryMapping(117, NewznabStandardCategory.MoviesUHD, "Movies 4K");
caps.Categories.AddCategoryMapping(163, NewznabStandardCategory.MoviesHD, "Movies AV1");
caps.Categories.AddCategoryMapping(145, NewznabStandardCategory.MoviesHD, "Movies HD");
caps.Categories.AddCategoryMapping(100, NewznabStandardCategory.MoviesHD, "Movies HEVC");
caps.Categories.AddCategoryMapping(146, NewznabStandardCategory.MoviesSD, "Movies SD");
caps.Categories.AddCategoryMapping(13, NewznabStandardCategory.Audio, "Music");
caps.Categories.AddCategoryMapping(135, NewznabStandardCategory.AudioLossless, "Music/FLAC");
caps.Categories.AddCategoryMapping(151, NewznabStandardCategory.Audio, "Karaoke");
caps.Categories.AddCategoryMapping(135, NewznabStandardCategory.AudioLossless, "Music FLAC");
caps.Categories.AddCategoryMapping(151, NewznabStandardCategory.Audio, "Music Karaoke");
caps.Categories.AddCategoryMapping(136, NewznabStandardCategory.Audio, "Music Boxset");
caps.Categories.AddCategoryMapping(148, NewznabStandardCategory.AudioVideo, "Music Videos");
caps.Categories.AddCategoryMapping(9, NewznabStandardCategory.Other, "Other");
caps.Categories.AddCategoryMapping(125, NewznabStandardCategory.Other, "Other/Pictures");
caps.Categories.AddCategoryMapping(54, NewznabStandardCategory.TVOther, "Soaps");
caps.Categories.AddCategoryMapping(83, NewznabStandardCategory.TVOther, "Specials");
caps.Categories.AddCategoryMapping(125, NewznabStandardCategory.Other, "Other Pictures");
caps.Categories.AddCategoryMapping(54, NewznabStandardCategory.TVOther, "Other Soaps");
caps.Categories.AddCategoryMapping(83, NewznabStandardCategory.TVOther, "Other Specials");
caps.Categories.AddCategoryMapping(139, NewznabStandardCategory.TV, "TOTM (Freeleech)");
caps.Categories.AddCategoryMapping(138, NewznabStandardCategory.TV, "TOTW (x2 upload)");
caps.Categories.AddCategoryMapping(139, NewznabStandardCategory.Movies, "TOTM (Freeleech)");
@@ -177,16 +173,18 @@ public class XSpeeds : TorrentIndexerBase<XSpeedsSettings>
caps.Categories.AddCategoryMapping(86, NewznabStandardCategory.TVSport, "Sports/MotorSports");
caps.Categories.AddCategoryMapping(89, NewznabStandardCategory.TVSport, "Sports/Olympics");
caps.Categories.AddCategoryMapping(126, NewznabStandardCategory.TV, "TV");
caps.Categories.AddCategoryMapping(149, NewznabStandardCategory.TV, "TV Specials");
caps.Categories.AddCategoryMapping(127, NewznabStandardCategory.TVUHD, "TV 4K");
caps.Categories.AddCategoryMapping(164, NewznabStandardCategory.TVHD, "TV AV1");
caps.Categories.AddCategoryMapping(129, NewznabStandardCategory.TVHD, "TV HD");
caps.Categories.AddCategoryMapping(130, NewznabStandardCategory.TVHD, "TV HEVC");
caps.Categories.AddCategoryMapping(128, NewznabStandardCategory.TVSD, "TV SD");
caps.Categories.AddCategoryMapping(149, NewznabStandardCategory.TV, "TV Specials");
caps.Categories.AddCategoryMapping(21, NewznabStandardCategory.TVSD, "TV Boxsets");
caps.Categories.AddCategoryMapping(120, NewznabStandardCategory.TVUHD, "Boxset TV 4K");
caps.Categories.AddCategoryMapping(76, NewznabStandardCategory.TVHD, "Boxset TV HD");
caps.Categories.AddCategoryMapping(97, NewznabStandardCategory.TVHD, "Boxset TV HEVC");
caps.Categories.AddCategoryMapping(147, NewznabStandardCategory.TVSD, "Boxset TV SD");
caps.Categories.AddCategoryMapping(120, NewznabStandardCategory.TVUHD, "TV Boxset 4K");
caps.Categories.AddCategoryMapping(165, NewznabStandardCategory.TVUHD, "TV Boxset AV1");
caps.Categories.AddCategoryMapping(76, NewznabStandardCategory.TVHD, "TV Boxset HD");
caps.Categories.AddCategoryMapping(97, NewznabStandardCategory.TVHD, "TV Boxset HEVC");
caps.Categories.AddCategoryMapping(147, NewznabStandardCategory.TVSD, "TV Boxset SD");
return caps;
}

View File

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

View File

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

View File

@@ -538,6 +538,12 @@
"NotificationsTelegramSettingsIncludeAppName": "Include {appName} in Title",
"NotificationsTelegramSettingsIncludeAppNameHelpText": "Optionally prefix message title with {appName} to differentiate notifications from different applications",
"OAuthPopupMessage": "Pop-ups are being blocked by your browser",
"Obsolete": "Obsolete",
"ObsoleteApplicationMessage": "{applicationName} is obsolete and has been removed",
"ObsoleteApplicationTitle": "{applicationName} is Obsolete",
"Deprecated": "Deprecated",
"DeprecatedApplicationMessage": "{applicationName} is deprecated and will be removed in a future version",
"DeprecatedApplicationTitle": "{applicationName} is Deprecated",
"Ok": "Ok",
"OnApplicationUpdate": "On Application Update",
"OnApplicationUpdateHelpText": "On Application Update",

View File

@@ -668,7 +668,7 @@
"DownloadClientFreeboxSettingsPortHelpText": "Freebox-liittymän portti. Oletus on {port}.",
"DownloadClientPneumaticSettingsNzbFolder": "NZB-kansio",
"DownloadClientQbittorrentSettingsSequentialOrder": "Peräkkäinen järjestys",
"CustomFilter": "Oma suodatin",
"CustomFilter": "Mukautettu suodatin",
"DownloadClientFreeboxSettingsAppIdHelpText": "Freebox-rajapinnan käyttöoikeutta määritettäessä käytettävä App ID -sovellustunniste.",
"DownloadClientFreeboxSettingsAppToken": "Sovellustietue",
"DownloadClientNzbgetSettingsAddPausedHelpText": "Tämä vaatii vähintään NzbGetin version 16.0.",

View File

@@ -785,7 +785,7 @@
"Logout": "Se déconnecter",
"NoEventsFound": "Aucun événement trouvé",
"RestartReloadNote": "Remarque : {appName} redémarrera et rechargera automatiquement l'interface utilisateur pendant le processus de restauration.",
"TheLogLevelDefault": "Le niveau de journalisation est par défaut à « Information » et peut être modifié dans les [paramètres généraux](/settings/general)",
"TheLogLevelDefault": "Le niveau de journalisation est par défaut à «Debug» et peut être modifié dans les [paramètres généraux](/settings/general)",
"UpdateAppDirectlyLoadError": "Impossible de mettre à jour directement {appName},",
"UpdaterLogFiles": "Journaux du programme de mise à jour",
"WouldYouLikeToRestoreBackup": "Souhaitez-vous restaurer la sauvegarde « {name} » ?",

View File

@@ -88,13 +88,13 @@
"Delete": "Verwijder",
"DeleteAppProfile": "App-profiel verwijderen",
"DeleteApplication": "Applicatie verwijderen",
"DeleteApplicationMessageText": "Weet u zeker dat u de applicatie '{0}' wilt verwijderen?",
"DeleteApplicationMessageText": "Weet u zeker dat u de applicatie '{name}' wilt verwijderen?",
"DeleteBackup": "Verwijder Backup",
"DeleteBackupMessageText": "Bent u zeker dat u de veiligheidskopie '{name}' wilt verwijderen?",
"DeleteDownloadClient": "Verwijder Downloader",
"DeleteDownloadClientMessageText": "Bent u zeker dat u de downloader '{name}' wilt verwijderen?",
"DeleteIndexerProxy": "Indexeerproxy verwijderen",
"DeleteIndexerProxyMessageText": "Weet u zeker dat u de proxy '{0}' wilt verwijderen?",
"DeleteIndexerProxyMessageText": "Weet u zeker dat u de proxy '{name}' wilt verwijderen?",
"DeleteNotification": "Verwijder Notificatie",
"DeleteNotificationMessageText": "Weet je zeker dat je de notificatie {name} wil verwijderen?",
"DeleteTag": "Verwijder Tag",
@@ -123,7 +123,7 @@
"EnableInteractiveSearch": "Schakel interactief zoeken in",
"EnableInteractiveSearchHelpText": "Zal worden gebruikt wanneer interactief zoeken wordt gebruikt",
"EnableRss": "RSS inschakelen",
"EnableRssHelpText": "Rss-feed voor Indexer inschakelen",
"EnableRssHelpText": "RSS-feed voor Indexeerder inschakelen",
"EnableSSL": "Activeer SSL",
"EnableSslHelpText": " Vereist herstart als administrator om in werking te treden",
"Enabled": "Ingeschakeld",
@@ -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",
@@ -162,7 +162,7 @@
"HomePage": "Startpagina",
"Host": "Host",
"Hostname": "Hostnaam",
"Id": "Id",
"Id": "ID",
"IgnoredAddresses": "Genegeerde Adressen",
"IllRestartLater": "Ik zal later herstarten",
"IncludeHealthWarningsHelpText": "Voeg Gezondheidswaarschuwingen Toe",
@@ -180,7 +180,7 @@
"IndexerProxyStatusAllUnavailableHealthCheckMessage": "Alle proxy's zijn niet beschikbaar vanwege storingen",
"IndexerProxyStatusUnavailableHealthCheckMessage": "Proxy's niet beschikbaar vanwege storingen: {indexerProxyNames}",
"IndexerQuery": "Indexeer zoekopdracht",
"IndexerRss": "Indexeer RSS",
"IndexerRss": "Indexeerder RSS",
"IndexerSettingsSummary": "Configureer verschillende globale Indexer-instellingen, waaronder proxy's.",
"IndexerStatusAllUnavailableHealthCheckMessage": "Alle indexeerders zijn onbeschikbaar wegens fouten",
"IndexerStatusUnavailableHealthCheckMessage": "Indexeerders onbeschikbaar wegens fouten: {indexerNames}",
@@ -426,15 +426,15 @@
"ApplyTagsHelpTextRemove": "Verwijderen: Verwijder de ingevoerde tags",
"ApplyTagsHelpTextReplace": "Vervangen: Vervang de tags met de ingevoerde tags (vul geen tags in om alle tags te wissen)",
"CountIndexersSelected": "{count} Indexer(s) Geselecteerd",
"DeleteSelectedApplicationsMessageText": "Bent u zeker dat u de indexeerder '{0}' wilt verwijderen?",
"DeleteSelectedApplicationsMessageText": "Bent u zeker dat u de indexeerder '{count}' wilt verwijderen?",
"DeleteSelectedDownloadClients": "Verwijder Downloader",
"DeleteSelectedDownloadClientsMessageText": "Bent u zeker dat u de indexeerder '{0}' wilt verwijderen?",
"DeleteSelectedDownloadClientsMessageText": "Bent u zeker dat u de indexeerder '{count}' wilt verwijderen?",
"Season": "Seizoen",
"SelectIndexers": "Zoek indexeerders",
"More": "Meer",
"Theme": "Thema",
"Track": "Spoor",
"DeleteSelectedIndexersMessageText": "Bent u zeker dat u de indexeerder '{0}' wilt verwijderen?",
"DeleteSelectedIndexersMessageText": "Bent u zeker dat u de indexeerder '{count}' wilt verwijderen?",
"DownloadClientPriorityHelpText": "Geef prioriteit aan meerdere downloaders. Round-Robin wordt gebruikt voor downloaders met dezelfde prioriteit.",
"Genre": "Genres",
"Year": "Jaar",
@@ -512,5 +512,163 @@
"Download": "Downloaden",
"InstallLatest": "Installeer Nieuwste Versie",
"CurrentlyInstalled": "Momenteel Geïnstalleerd",
"Mixed": "Opgelost"
"Mixed": "Opgelost",
"AverageQueries": "Gemiddelde Queries",
"AverageGrabs": "Gemiddeld aantal downloads",
"AverageResponseTimesMs": "Gemiddelde Indexer Responsetijden (ms)",
"Book": "Boek",
"CountIndexersAvailable": "{count} indexer(s) beschikbaar",
"Donate": "Doneer",
"DownloadClientFreeboxSettingsHostHelpText": "Hostnaam of IP-adres van de Freebox, standaard '{url}' (werkt alleen als je op hetzelfde netwerk zit)",
"DownloadClientFreeboxSettingsPortHelpText": "Poort die wordt gebruikt om toegang te krijgen tot de Freebox-interface, standaard '{port}'",
"DefaultCategory": "Standaardcategorie",
"DownloadClientRTorrentSettingsUrlPathHelpText": "Pad naar het XMLRPC-eindpunt, zie {url}. Dit is meestal RPC2 of [pad naar ruTorrent]{url2} bij gebruik van ruTorrent.",
"DownloadClientSettingsAddPaused": "Toevoegen gepauzeerd",
"IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "Doorzoek freeleech releases",
"IndexerId": "Indexeerder ID",
"EditCategory": "Categorie bewerken",
"ApplicationsLoadError": "Kan de applicatielijst niet laden",
"DownloadClientAriaSettingsDirectoryHelpText": "Optionele locatie om downloads op te slaan, leeg laten om de standaardlocatie van Aria2 te gebruiken",
"DownloadClientDelugeSettingsUrlBaseHelpText": "Voegt een voorvoegsel toe aan de Deluge JSON-URL, zie {url}",
"FailedToFetchSettings": "Instellingen ophalen mislukt",
"HistoryCleanup": "Geschiedenis opschonen",
"Implementation": "Implementatie",
"IndexerHDBitsSettingsOrigins": "Herkomst",
"IndexerMTeamTpSettingsApiKeyHelpText": "API-sleutel van de site (te vinden in Gebruikerspaneel => Beveiliging => Laboratorium)",
"IndexerFileListSettingsFreeleechOnlyHelpText": "Alleen freeleech-releases doorzoeken",
"Default": "Standaard",
"DownloadClientFloodSettingsUrlBaseHelpText": "Voegt een voorvoegsel toe aan de Flood API, zoals {url}",
"DownloadClientRTorrentSettingsAddStoppedHelpText": "Als je dit inschakelt, worden torrents en magnet-links in rTorrent in een gestopte staat toegevoegd. Dit kan magnet-bestanden laten mislukken.",
"IndexerNoDefinitionCheckHealthCheckMessage": "Indexeerders hebben geen definitie en zullen niet werken: {indexerNames}. Verwijder ze alstublieft en voeg ze opnieuw toe aan {appName}.",
"AppsMinimumSeedersHelpText": "Minimum aantal vereiste seeders door de applicaties voordat de indexer iets ophaalt. Leeg laten gebruikt de standaardwaarde van het synchronisatieprofiel",
"Author": "Auteur",
"BookSearch": "Boek zoeken",
"IndexerSettingsCookieHelpText": "Site Cookie",
"DownloadClientTransmissionSettingsDirectoryHelpText": "Optionele locatie om downloads op te slaan, laat leeg om de standaardlocatie van Transmission te gebruiken",
"DeleteSelectedIndexers": "Verwijder geselecteerde indexeerders",
"Destination": "Bestemming",
"DownloadClientDownloadStationSettingsDirectoryHelpText": "Optionele gedeelde map om downloads in te plaatsen, leeg laten om de standaardlocatie van Download Station te gebruiken",
"DownloadClientFloodSettingsAdditionalTags": "Additionele Tags",
"DownloadClientFreeboxSettingsApiUrl": "API URL",
"DownloadClientFreeboxSettingsApiUrlHelpText": "Stel de basis-URL van de Freebox API in met API-versie, bijvoorbeeld '{url}', standaard is '{defaultApiUrl}'",
"DownloadClientFreeboxSettingsAppId": "App ID",
"DownloadClientFreeboxSettingsAppToken": "App Token",
"DownloadClientNzbgetSettingsAddPausedHelpText": "Deze optie vereist minimaal NzbGet versie 16.0",
"DownloadClientPneumaticSettingsNzbFolder": "Nzb map",
"DownloadClientPneumaticSettingsNzbFolderHelpText": "Deze map moet bereikbaar zijn vanuit XBMC",
"DownloadClientQbittorrentSettingsContentLayout": "Inhoudsindeling",
"DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Download eerste en laatste stukjes eerst (qBittorrent 4.1.0+)",
"DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Download in opeenvolgende volgorde (qBittorrent 4.1.0+)",
"DownloadClientRTorrentSettingsAddStopped": "Toevoegen gestopt",
"DownloadClientRTorrentSettingsDirectoryHelpText": "Optionele locatie om downloads op te slaan, leeg laten om de standaardlocatie van rTorrent te gebruiken",
"DownloadClientRTorrentSettingsUrlPath": "Url pad",
"ElapsedTime": "Verstreken tijd",
"External": "Extern",
"FailedToFetchUpdates": "Updates ophalen mislukt",
"FoundCountReleases": "{itemCount} releases gevonden",
"IndexerAlphaRatioSettingsExcludeSceneHelpText": "SCENE-releases uitsluiten van resultaten",
"IndexerBeyondHDSettingsApiKeyHelpText": "API-sleutel van de site (te vinden onder Mijn Beveiliging => API-sleutel)",
"IndexerBeyondHDSettingsLimitedOnly": "Alleen beperkt",
"IndexerBeyondHDSettingsSearchTypesHelpText": "Selecteer de soorten releases waarin je geïnteresseerd bent. Als er geen selectie is gemaakt, worden alle opties gebruikt.",
"IndexerFileListSettingsPasskeyHelpText": "Site Passkey (Dit is de alfanumerieke reeks in de tracker-URL die in je downloadclient wordt weergegeven)",
"IndexerGazelleGamesSettingsSearchGroupNames": "Zoek groepnamen",
"IndexerIPTorrentsSettingsCookieUserAgent": "Cookie User-Agent",
"IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Doorzoek alleen freeleech releases",
"IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Doorzoek alleen freeleech releases",
"IndexerNewznabSettingsApiKeyHelpText": "Site API-sleutel",
"IndexerRedactedSettingsApiKeyHelpText": "API-sleutel van de site (te vinden onder Instellingen => Toegangsinstellingen)",
"IndexerSettingsFreeleechOnly": "Alleen Freeleech",
"DownloadClientQbittorrentSettingsFirstAndLastFirst": "Eerste en laatste eerst",
"DownloadClientTransmissionSettingsUrlBaseHelpText": "Voegt een voorvoegsel toe aan de {clientName} RPC-URL, bijvoorbeeld {url}, standaard is '{defaultUrl}'",
"AreYouSureYouWantToDeleteCategory": "Weet je zeker dat je de gekoppelde categorie wilt verwijderen?",
"DownloadClientCategory": "Downloadclientcategorie",
"DeleteSelectedIndexer": "Verwijder geselecteerde indexeerder",
"EditSelectedDownloadClients": "Geselecteerde downloadclients bewerken",
"IndexerDownloadClientHelpText": "Geef aan welke downloadclient wordt gebruikt voor downloads die binnen {appName} van deze indexer worden opgehaald",
"GoToApplication": "Ga naar applicatie",
"IndexerName": "Indexeerdernaam",
"AreYouSureYouWantToDeleteIndexer": "Weet je zeker dat je '{name}' uit {appName} wilt verwijderen?",
"AuthQueries": "Autorisatiequeries",
"IndexerAlreadySetup": "Tenminste één instantie van de indexeerder is al ingesteld",
"IndexerCategories": "Indexeerdercategorieën",
"ApplicationTagsHelpText": "Sync indexers met deze applicatie die één of meer overeenkomende tags hebben. Als er hier geen tags worden opgegeven, worden er geen indexers van synchronisatie uitgesloten op basis van hun tags.",
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Of de ingestelde inhoudsindeling van qBittorrent gebruikt moet worden, de originele indeling van de torrent, of altijd een submap moet worden aangemaakt (qBittorrent 4.3.2+)",
"DownloadClientQbittorrentSettingsInitialStateHelpText": "Begintoestand voor torrents die aan qBittorrent worden toegevoegd. Let op: Gedwongen torrents houden zich niet aan seeding-beperkingen",
"DownloadClientQbittorrentSettingsSequentialOrder": "Opeenvolgende volgorde",
"DownloadClientSettingsDestinationHelpText": "Geef handmatig de downloadbestemming op, laat leeg om de standaardlocatie te gebruiken",
"DownloadClientSettingsInitialState": "Initiële staat",
"DownloadClientSettingsUseSslHelpText": "Gebruik een beveiligde verbinding bij het verbinden met {clientName}",
"EnabledRedirected": "Ingeschakeld, Omgeleid",
"HistoryDetails": "Geschiedenis details",
"IndexerHDBitsSettingsUsernameHelpText": "Site Gebruikersnaam",
"IndexerDetails": "Indexeerder details",
"ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Als een torrent wordt geblokkeerd op basis van de hash, kan het zijn dat deze niet correct wordt geweigerd tijdens RSS/Search bij sommige indexers. Als je deze optie inschakelt, wordt de torrent alsnog geweigerd nadat hij is opgehaald, maar voordat hij naar de client wordt gestuurd.",
"BasicSearch": "Basiszoekopdracht",
"DefaultNameCopiedProfile": "{name} - Kopie",
"DeleteClientCategory": "Categorie van downloadclient verwijderen",
"DisabledUntil": "Uitgeschakeld tot",
"DownloadClientFreeboxSettingsAppIdHelpText": "App ID die wordt gegeven bij het aanmaken van toegang tot de Freebox API (bijv. 'app_id')",
"DownloadClientPneumaticSettingsStrmFolder": "Strm Map",
"EditSelectedIndexers": "Geselecteerde indexeerders bewerken",
"GrabTitle": "Grijp Titel",
"IndexerHDBitsSettingsMediumsHelpText": "Als niet gespecificeerd, worden alle opties gebruikt.",
"IndexerHDBitsSettingsUseFilenames": "Gebruik bestandsnamen",
"IndexerHDBitsSettingsPasskeyHelpText": "Passkey vanuit gebruikerdetails",
"ClickToChangeQueryOptions": "Klik om zoekopties te wijzigen",
"DownloadClientFreeboxSettingsAppTokenHelpText": "App token dat wordt verkregen bij het aanmaken van toegang tot de Freebox API (bijv. 'app_token')",
"DownloadClientSettingsInitialStateHelpText": "Begintoestand voor torrents die aan {clientName} worden toegevoegd",
"DownloadClientSettingsPriorityItemHelpText": "Prioriteit om te gebruiken bij het ophalen van items",
"IncludeManualGrabsHelpText": "Handmatige downloads uitgevoerd binnen {appName} meenemen",
"IndexerDisabled": "Indexeerder Uitgeschakeld",
"IndexerDownloadClientHealthCheckMessage": "Indexeerders met ongeldige downloadclients: {indexerNames}.",
"IndexerFailureRate": "Faalpercentage van de indexeerder",
"IndexerFileListSettingsUsernameHelpText": "Site Gebruikersnaam",
"IndexerHDBitsSettingsUseFilenamesHelpText": "Vink deze optie aan als je torrentbestandsnamen als releasetitels wilt gebruiken",
"IndexerHistoryLoadError": "Fout bij het laden van de indexeerder-geschiedenis",
"IndexerInfo": "Indexeerder info",
"IndexerAlphaRatioSettingsExcludeScene": "SCENE uitsluiten",
"IndexerBeyondHDSettingsSearchTypes": "Zoek types",
"IndexerGazelleGamesSettingsApiKeyHelpText": "API-sleutel van de site (te vinden onder Instellingen => Toegangsinstellingen)",
"IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Moet over Gebruikers- en Torrents-machtigingen beschikken",
"IndexerHDBitsSettingsCodecsHelpText": "Als niet gespecificeerd, worden alle opties gebruikt.",
"IndexerIPTorrentsSettingsCookieUserAgentHelpText": "User-Agent die gekoppeld is aan de cookie gebruikt vanuit de browser",
"IndexerNewznabSettingsAdditionalParametersHelpText": "Aanvullende Newznab-parameters",
"IndexerNzbIndexSettingsApiKeyHelpText": "Site API-sleutel",
"IndexerPassThePopcornSettingsApiKeyHelpText": "Site API-sleutel",
"IndexerOrpheusSettingsApiKeyHelpText": "API-sleutel van de site (te vinden onder Instellingen => Toegangsinstellingen)",
"IndexerSettingsBaseUrlHelpText": "Selecteer welke basis-URL {appName} gebruikt voor verzoeken aan de site",
"IndexerSettingsApiPathHelpText": "Pad naar de API, meestal {url}",
"IndexerSettingsApiUser": "API Gebruiker",
"IndexerSettingsBaseUrl": "Basisurl",
"IndexerSettingsCookie": "Cookie",
"IndexerSettingsAdditionalParameters": "Aanvullende parameters",
"IndexerSettingsApiPath": "API pad",
"IndexerAvistazSettingsPidHelpText": "PID van de pagina Mijn Account of Mijn Profiel",
"IndexerAvistazSettingsUsernameHelpText": "Site Gebruikersnaam",
"IndexerAvistazSettingsUsernameHelpTextWarning": "Alleen leden met de rang 'member' of hoger kunnen de API van deze indexeerder gebruiken.",
"IndexerBeyondHDSettingsRssKeyHelpText": "RSS-sleutel van de site (te vinden onder Mijn Beveiliging => RSS-sleutel)",
"IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Zoek releases op groepsnaam",
"IndexerAvistazSettingsPasswordHelpText": "Site Wachtwoord",
"IndexerHDBitsSettingsOriginsHelpText": "Als niet gespecificeerd, worden alle opties gebruikt.",
"ApplicationTagsHelpTextWarning": "Gebruik tags met voorzichtigheid, ze kunnen onbedoelde effecten hebben. Een app met een tag zal alleen synchroniseren met indexers die dezelfde tag hebben.",
"DownloadClientQbittorrentSettingsUseSslHelpText": "Gebruik een beveiligde verbinding. Zie Opties -> Web UI -> 'Gebruik HTTPS in plaats van HTTP' in qBittorrent.",
"DeleteSelectedApplications": "Verwijder geselecteerde applicaties",
"DownloadClientUTorrentProviderMessage": "uTorrent heeft een geschiedenis van het bevatten van cryptominers, malware en advertenties. We raden je sterk aan om een andere client te kiezen.",
"HealthMessagesInfoBox": "Je kunt meer informatie over de oorzaak van deze gezondheidscontroleberichten vinden door op de wiki-link (boekicoon) aan het einde van de rij te klikken, of door je [logboeken]({link}) te bekijken. Als je moeite hebt met het interpreteren van deze berichten, kun je contact opnemen met onze ondersteuning via de onderstaande links",
"IndexerNebulanceSettingsApiKeyHelpText": "API-sleutel te vinden onder Gebruikersinstellingen > API-sleutels. De sleutel moet de machtigingen Lijst en Download hebben",
"DownloadClientFloodSettingsAdditionalTagsHelpText": "Voegt eigenschappen van media toe als tags. Hints zijn voorbeelden.",
"DownloadClientPneumaticSettingsStrmFolderHelpText": ".strm-bestanden in deze map worden geïmporteerd door Drone",
"DownloadClientSettingsDefaultCategoryHelpText": "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 van andere applicaties dan {appName}. Het gebruik van een categorie is optioneel, maar wordt sterk aanbevolen.",
"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).",
"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"
}

View File

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

View File

@@ -547,5 +547,24 @@
"DownloadClientTransmissionSettingsUrlBaseHelpText": "Додає префікс до URL-адреси RPC {clientName}, наприклад {url}, за замовчуванням — '{defaultUrl}'",
"IndexerSettingsSeedRatio": "Коефіцієнт роздачі",
"ManualGrab": "Захват вручну",
"StopSelecting": "Скасувати вибір"
"StopSelecting": "Скасувати вибір",
"ActiveApps": "Активні додатки",
"ActiveIndexers": "Активні індексери",
"AppSettingsSummary": "Застосунки та налаштування для конфігурації взаємодії {appName} з вашими PVR-програмами",
"AppProfileSelectHelpText": "Профілі застосунків використовуються для керування налаштуваннями RSS, автоматичного пошуку та інтерактивного пошуку під час синхронізації застосунку",
"ApplicationTagsHelpText": "Синхронізувати індексатори з цим застосунком, які мають один або кілька відповідних тегів. Якщо тут не вказано жодного тегу, жоден індексатор не буде виключено із синхронізації через свої теги.",
"ApplicationsLoadError": "Не вдалося завантажити список застосунків",
"AddToDownloadClient": "Додати реліз в клієнт завантаження",
"AdvancedSettingsHiddenClickToShow": "Розширені налаштування приховано, натисніть, щоб показати",
"AdvancedSettingsShownClickToHide": "Розширені налаштування відображено, натисніть, щоб приховати",
"AddSyncProfile": "Додати профіль синхронізації",
"AddDownloadClientToProwlarr": "Додавання клієнта завантаження дозволяє {appName} надсилати релізи безпосередньо з інтерфейсу під час ручного пошуку.",
"AddNewIndexer": "Додати новий індексер",
"AddRemoveOnly": "Лише додати та видалити",
"AddedToDownloadClient": "Реліз додано до клієнта",
"Apps": "Застосунки",
"ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Синхронізувати та відхиляти заблоковані за хешем торренти під час збору",
"ApplicationTagsHelpTextWarning": "Теги слід використовувати обережно, оскільки вони можуть мати непередбачувані наслідки. Застосунок із тегом буде синхронізуватися лише з індексаторами, що мають такий самий тег.",
"AddApplication": "Додати додаток",
"AddCategory": "Додати Категорію"
}

View File

@@ -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": "任何",

View File

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

View File

@@ -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
@@ -51,7 +53,7 @@ namespace NzbDrone.Host
b.ClearProviders();
b.SetMinimumLevel(LogLevel.Trace);
b.AddFilter("Microsoft.AspNetCore", LogLevel.Warning);
b.AddFilter("Prowlarr.Http.Authentication", LogLevel.Information);
b.AddFilter("Prowlarr.Http.Authentication.ApiKeyAuthenticationHandler", LogLevel.Information);
b.AddFilter("Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager", LogLevel.Error);
b.AddNLog();
});
@@ -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);

View File

@@ -1,4 +1,6 @@
using System.Collections.Generic;
using FluentValidation;
using FluentValidation.Results;
using NzbDrone.Core.Indexers;
using NzbDrone.Core.Validation;
using NzbDrone.SignalR;
@@ -24,5 +26,21 @@ namespace Prowlarr.Api.V1.Indexers
SharedValidator.RuleFor(c => c.Priority).InclusiveBetween(1, 50);
SharedValidator.RuleFor(c => c.DownloadClientId).SetValidator(downloadClientExistsValidator);
}
protected override void Validate(IndexerDefinition definition, bool includeWarnings)
{
var instance = _providerFactory.GetInstance(definition);
// Ensure Redirect is true for Usenet protocols
if (instance is { Protocol: DownloadProtocol.Usenet, SupportsRedirect: true } && definition is { Redirect: false })
{
throw new ValidationException(new List<ValidationFailure>
{
new("Redirect", "Redirect must be enabled for Usenet indexers")
});
}
base.Validate(definition, includeWarnings);
}
}
}

View File

@@ -262,8 +262,8 @@ namespace NzbDrone.Api.V1.Indexers
throw new BadRequestException("Failed to normalize provided link");
}
// If Indexer is set to download via Redirect then just redirect to the link
if (indexer.SupportsRedirect && indexerDef.Redirect)
// If Indexer is set to download via Redirect then just redirect to the link unless it's a Usenet indexer at which point it forces Redirect.
if (indexer.Protocol == DownloadProtocol.Usenet || (indexer.SupportsRedirect && indexerDef.Redirect))
{
_downloadService.RecordRedirect(unprotectedLink, id, source, host, file);
return RedirectPermanent(unprotectedLink);

View File

@@ -271,7 +271,7 @@ namespace Prowlarr.Api.V1
BroadcastResourceChange(ModelAction.Deleted, message.ProviderId);
}
private void Validate(TProviderDefinition definition, bool includeWarnings)
protected virtual void Validate(TProviderDefinition definition, bool includeWarnings)
{
var validationResult = definition.Settings.Validate();

View File

@@ -77,7 +77,7 @@ namespace Prowlarr.Http.Authentication
private void LogSuccess(HttpRequest context, string username)
{
_authLogger.Info("Auth-Success ip {0} username '{1}'", context.GetRemoteIP(), username);
_authLogger.Debug("Auth-Success ip {0} username '{1}'", context.GetRemoteIP(), username);
}
private void LogLogout(HttpRequest context, string username)

View File

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