Compare commits

...

43 Commits

Author SHA1 Message Date
Weblate
9668e91b21 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dani Talens <databio@gmail.com>
Co-authored-by: Deleted User <noreply+2593@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/
Translation: Servarr/Prowlarr
2024-01-17 23:01:59 +02:00
Bogdan
49857693c0 Fix count in GGn fixture after allowing only torrents 2024-01-17 11:14:00 +02:00
Bogdan
850315ad1c Fixed: (GGn) Improve titles and allow only torrents 2024-01-17 10:45:02 +02:00
Mark McDowall
86124d4319 New: Optional directory setting for Aria2
(cherry picked from commit fd17df0dd03a5feb088c3241a247eac20f0e8c6c)
2024-01-17 07:49:51 +02:00
Bogdan
4f28d583d7 Throw download as failed for invalid magnet links 2024-01-17 07:40:17 +02:00
Stevie Robinson
01f3930211 Sort Custom Filters
(cherry picked from commit e4b5d559df2d5f3d55e16aae5922509e84f31e64)
2024-01-17 07:38:23 +02:00
Weblate
7c7114c87a Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dani Talens <databio@gmail.com>
Co-authored-by: Daniele Prevedello <dprevedello86@gmail.com>
Co-authored-by: DimitriDR <dimitridroeck@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Trooper57 <igorkcs@gmail.com>
Co-authored-by: Watashi <drazy24@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: crayon3shawn <crayon3shawn@gmail.com>
Co-authored-by: hansaudun <hans@n5.no>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
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/it/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_TW/
Translation: Servarr/Prowlarr
2024-01-16 05:11:12 +02:00
Bogdan
ef8e6d774b Fix typo 2024-01-16 05:10:20 +02:00
Bogdan
2960fc37d9 Fixed: (FL) Improve error message for service unavailable 2024-01-16 04:58:17 +02:00
Qstick
8bddf753bb Bump Inno version to 6.2.2
(cherry picked from commit c5992ed944b2d4f2f41a08ac407c0f013da61ea6)

Build report can get sent before installer finished

(cherry picked from commit 60d9aacac64b39fd22d43e8b1ca4641bd60a9b48)
2024-01-14 21:44:58 +02:00
Bogdan
cff24b3fd4 Bump version to 1.12.2 2024-01-14 07:13:34 +02:00
Bogdan
031d81330d Fixed: Filter history by multiple event types in PG 2024-01-12 22:11:45 +02:00
Bogdan
6201b42fbd New: Refresh button for indexer stats 2024-01-12 15:26:32 +02:00
Bogdan
7022054dd7 New: Indexer ID as column
Fixes #1948
2024-01-12 14:58:27 +02:00
ilike2burnthing
c9b663247c Empty Torznab ApiKeyWhiteList 2024-01-12 05:55:09 +02:00
Bogdan
0b0a0cfa5b New: (HDBits) Filter by origins 2024-01-10 22:39:43 +02:00
Weblate
3c0fea8b7c Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Aitzol Garmendia <aitzolgarmendia@gmail.com>
Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Bradley BARBIER <bradley.barbier@outlook.fr>
Co-authored-by: Dani Talens <databio@gmail.com>
Co-authored-by: DimitriDR <dimitridroeck@gmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: RicardoVelaC <ricardovelac@gmail.com>
Co-authored-by: reloxx <reloxx@interia.pl>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/
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/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/id/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ja/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/lv/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_TW/
Translation: Servarr/Prowlarr
2024-01-09 20:59:04 +02:00
Bogdan
ac97952fd7 Fixed: (HDBits) Strip non-word chars from search query
Co-authored-by: Kyle Sanderson <kyle.leet@gmail.com>
2024-01-08 22:24:35 +02:00
Bogdan
c3e40c0564 Log web exceptions in test connection 2024-01-08 21:31:08 +02:00
Servarr
ce615a77c2 Automated API Docs update 2024-01-08 01:29:38 +02:00
Bogdan
0f6dfe389c Fix CS in History 2024-01-08 01:21:44 +02:00
Bogdan
25d94a9286 New: History custom filters
Co-authored-by: Mark McDowall <mark@mcdowall.ca>
2024-01-08 00:53:40 +02:00
Bogdan
52a690b41a Fixed: Filter history by multiple event types 2024-01-07 19:04:22 +02:00
Bogdan
56c8c3d6c6 Bump version to 1.12.1 2024-01-07 11:10:04 +02:00
Weblate
5cee8990b3 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Aitzol Garmendia <aitzolgarmendia@gmail.com>
Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Dani Talens <databio@gmail.com>
Co-authored-by: HuaBing <admin@hbcraft.cn>
Co-authored-by: JJonttuu <oikeaihminen@protonmail.com>
Co-authored-by: Juan Lores <juan.lores@gmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Piotr Komborski <piotr+github@kombor.ski>
Co-authored-by: RicardoVelaC <ricardovelac@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: boan51204 <je.991707@gmail.com>
Co-authored-by: 饶志华 <879467666@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_TW/
Translation: Servarr/Prowlarr
2024-01-05 18:38:00 -06:00
Bogdan
9679e88717 Update end date for RED freeload event 2024-01-04 23:32:37 +02:00
Bogdan
f4203993ba New: (MAM) Book title and author returned in response 2024-01-03 11:29:06 +02:00
Bogdan
4be0715fe3 New: (MAM) Filter releases by Min/Max size 2024-01-03 11:21:40 +02:00
Bogdan
f9c9d4a0e0 Fixed: (GGn) Improve title, timezone, MST, min/max size filters
Hiding torrents of type link
And some minor refactoring around the passkey fetching and parsing.
2024-01-03 10:49:25 +02:00
Weblate
bf47380f7b Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Mario Rodriguez <mario2423@gmail.com>
Co-authored-by: Norbi <kovinor123@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translation: Servarr/Prowlarr
2024-01-01 14:10:25 +02:00
Mark McDowall
e27a46f578 Fixed: Disable SSL on start if certificate path is not set
(cherry picked from commit 4e19fec123900b8ba1252b640f26f2a4983683ff)
2024-01-01 08:07:46 +02:00
Weblate
af4e69f8fb Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dimitri <dimitridroeck@gmail.com>
Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Koch Norbert <kochnorbert@icloud.com>
Co-authored-by: Pietro Ribeiro <xxb1exuv6@mozmail.com>
Co-authored-by: SunStorm <me@sunstorm.rocks>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: chiral-lab <jan.eltner@googlemail.com>
Co-authored-by: chrizl <chrizl@gmail.com>
Co-authored-by: resi23 <x-resistant-x@gmx.de>
Co-authored-by: slammingdeath <sebastianbrudny97@gmail.com>
Co-authored-by: ube <ube@alienautopsy.net>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sv/
Translation: Servarr/Prowlarr
2023-12-31 10:48:13 +02:00
Weblate
1b2106d4f0 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dimitri <dimitridroeck@gmail.com>
Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Koch Norbert <kochnorbert@icloud.com>
Co-authored-by: Pietro Ribeiro <xxb1exuv6@mozmail.com>
Co-authored-by: SunStorm <me@sunstorm.rocks>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: chiral-lab <jan.eltner@googlemail.com>
Co-authored-by: chrizl <chrizl@gmail.com>
Co-authored-by: resi23 <x-resistant-x@gmx.de>
Co-authored-by: slammingdeath <sebastianbrudny97@gmail.com>
Co-authored-by: ube <ube@alienautopsy.net>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sv/
Translation: Servarr/Prowlarr
2023-12-31 10:39:03 +02:00
Weblate
bdfbda3805 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dimitri <dimitridroeck@gmail.com>
Co-authored-by: Koch Norbert <kochnorbert@icloud.com>
Co-authored-by: Pietro Ribeiro <xxb1exuv6@mozmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: chrizl <chrizl@gmail.com>
Co-authored-by: resi23 <x-resistant-x@gmx.de>
Co-authored-by: slammingdeath <sebastianbrudny97@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/
Translation: Servarr/Prowlarr
2023-12-31 07:26:54 +02:00
Stevie Robinson
cb98b10468 Translate fields on the backend
(cherry picked from commit 48b12f5b00429a7cd218d23f0544641b0da62a06)
2023-12-31 07:16:38 +02:00
Mark McDowall
ae1bc8366c New: Add qBittorrent option for Content Layout
(cherry picked from commit 4b22200708ca120cfdcf9cb796be92183adb95d1)
2023-12-31 06:46:16 +02:00
Bogdan
67eeb4373c Fixed: Ignore empty tags when adding items to Flood
(cherry picked from commit 0a5200766ea80fc1c97bfa497cdfed31b9af687f)
2023-12-31 06:39:20 +02:00
Bogdan
9d40a64be4 Bump version to 1.12.0 2023-12-31 06:36:27 +02:00
Bogdan
20cc146d82 Fixed: Don't die when grabbing releases in bulk 2023-12-30 14:40:04 +02:00
Bogdan
8beff32117 Minor cleanup in AudioBookBay 2023-12-25 14:14:22 +02:00
Bogdan
8b7c488173 New: (Discord) Remove size grab field 2023-12-25 14:14:15 +02:00
Bogdan
1dabbc94f8 Fixed: BinSearch removed 2023-12-24 22:44:34 +02:00
Bogdan
52667b979b Bump version to 1.11.4 2023-12-24 09:13:43 +02:00
85 changed files with 1428 additions and 651 deletions

View File

@@ -9,7 +9,7 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '1.11.3'
majorVersion: '1.12.2'
minorVersion: $[counter('minorVersion', 1)]
prowlarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(prowlarrVersion)'
@@ -17,7 +17,7 @@ variables:
sentryUrl: 'https://sentry.servarr.com'
dotnetVersion: '6.0.417'
nodeVersion: '16.X'
innoVersion: '6.2.0'
innoVersion: '6.2.2'
windowsImage: 'windows-2022'
linuxImage: 'ubuntu-20.04'
macImage: 'macOS-11'
@@ -1206,6 +1206,7 @@ stages:
- stage: Report_Out
dependsOn:
- Analyze
- Installer
- Unit_Test
- Integration
- Automation

View File

@@ -254,7 +254,7 @@ InstallInno()
ProgressStart "Installing portable Inno Setup"
rm -rf _inno
curl -s --output innosetup.exe "https://files.jrsoftware.org/is/6/innosetup-${INNOVERSION:-6.2.0}.exe"
curl -s --output innosetup.exe "https://files.jrsoftware.org/is/6/innosetup-${INNOVERSION:-6.2.2}.exe"
mkdir _inno
./innosetup.exe //portable=1 //silent //currentuser //dir=.\\_inno
rm innosetup.exe

View File

@@ -1,4 +1,5 @@
import SortDirection from 'Helpers/Props/SortDirection';
import { FilterBuilderProp } from './AppState';
export interface Error {
responseJSON: {
@@ -20,6 +21,10 @@ export interface PagedAppSectionState {
pageSize: number;
}
export interface AppSectionFilterState<T> {
filterBuilderProps: FilterBuilderProp<T>[];
}
export interface AppSectionSchemaState<T> {
isSchemaFetching: boolean;
isSchemaPopulated: boolean;

View File

@@ -1,8 +1,12 @@
import AppSectionState from 'App/State/AppSectionState';
import AppSectionState, {
AppSectionFilterState,
} from 'App/State/AppSectionState';
import Column from 'Components/Table/Column';
import History from 'typings/History';
interface HistoryAppState extends AppSectionState<History> {
interface HistoryAppState
extends AppSectionState<History>,
AppSectionFilterState<History> {
pageSize: number;
columns: Column[];
}

View File

@@ -7,6 +7,7 @@ import AppProfileFilterBuilderRowValueConnector from './AppProfileFilterBuilderR
import BoolFilterBuilderRowValue from './BoolFilterBuilderRowValue';
import DateFilterBuilderRowValue from './DateFilterBuilderRowValue';
import FilterBuilderRowValueConnector from './FilterBuilderRowValueConnector';
import HistoryEventTypeFilterBuilderRowValue from './HistoryEventTypeFilterBuilderRowValue';
import IndexerFilterBuilderRowValueConnector from './IndexerFilterBuilderRowValueConnector';
import PrivacyFilterBuilderRowValue from './PrivacyFilterBuilderRowValue';
import ProtocolFilterBuilderRowValue from './ProtocolFilterBuilderRowValue';
@@ -58,6 +59,9 @@ function getRowValueConnector(selectedFilterBuilderProp) {
case filterBuilderValueTypes.DATE:
return DateFilterBuilderRowValue;
case filterBuilderValueTypes.HISTORY_EVENT_TYPE:
return HistoryEventTypeFilterBuilderRowValue;
case filterBuilderValueTypes.INDEXER:
return IndexerFilterBuilderRowValueConnector;

View File

@@ -0,0 +1,16 @@
import { FilterBuilderProp } from 'App/State/AppState';
interface FilterBuilderRowOnChangeProps {
name: string;
value: unknown[];
}
interface FilterBuilderRowValueProps {
filterType?: string;
filterValue: string | number | object | string[] | number[] | object[];
selectedFilterBuilderProp: FilterBuilderProp<unknown>;
sectionItem: unknown[];
onChange: (payload: FilterBuilderRowOnChangeProps) => void;
}
export default FilterBuilderRowValueProps;

View File

@@ -0,0 +1,39 @@
import React from 'react';
import translate from 'Utilities/String/translate';
import FilterBuilderRowValue from './FilterBuilderRowValue';
import FilterBuilderRowValueProps from './FilterBuilderRowValueProps';
const EVENT_TYPE_OPTIONS = [
{
id: 1,
get name() {
return translate('Grabbed');
},
},
{
id: 3,
get name() {
return translate('IndexerRss');
},
},
{
id: 2,
get name() {
return translate('IndexerQuery');
},
},
{
id: 4,
get name() {
return translate('IndexerAuth');
},
},
];
function HistoryEventTypeFilterBuilderRowValue(
props: FilterBuilderRowValueProps
) {
return <FilterBuilderRowValue {...props} tagList={EVENT_TYPE_OPTIONS} />;
}
export default HistoryEventTypeFilterBuilderRowValue;

View File

@@ -30,22 +30,24 @@ function CustomFiltersModalContent(props) {
<ModalBody>
{
customFilters.map((customFilter) => {
return (
<CustomFilter
key={customFilter.id}
id={customFilter.id}
label={customFilter.label}
filters={customFilter.filters}
selectedFilterKey={selectedFilterKey}
isDeleting={isDeleting}
deleteError={deleteError}
dispatchSetFilter={dispatchSetFilter}
dispatchDeleteCustomFilter={dispatchDeleteCustomFilter}
onEditPress={onEditCustomFilter}
/>
);
})
customFilters
.sort((a, b) => a.label.localeCompare(b.label))
.map((customFilter) => {
return (
<CustomFilter
key={customFilter.id}
id={customFilter.id}
label={customFilter.label}
filters={customFilter.filters}
selectedFilterKey={selectedFilterKey}
isDeleting={isDeleting}
deleteError={deleteError}
dispatchSetFilter={dispatchSetFilter}
dispatchDeleteCustomFilter={dispatchDeleteCustomFilter}
onEditPress={onEditCustomFilter}
/>
);
})
}
<div className={styles.addButtonContainer}>

View File

@@ -40,18 +40,26 @@ class FilterMenuContent extends Component {
}
{
customFilters.map((filter) => {
return (
<FilterMenuItem
key={filter.id}
filterKey={filter.id}
selectedFilterKey={selectedFilterKey}
onPress={onFilterSelect}
>
{filter.label}
</FilterMenuItem>
);
})
customFilters.length > 0 ?
<MenuItemSeparator /> :
null
}
{
customFilters
.sort((a, b) => a.label.localeCompare(b.label))
.map((filter) => {
return (
<FilterMenuItem
key={filter.id}
filterKey={filter.id}
selectedFilterKey={selectedFilterKey}
onPress={onFilterSelect}
>
{filter.label}
</FilterMenuItem>
);
})
}
{

View File

@@ -2,6 +2,7 @@ export const BOOL = 'bool';
export const BYTES = 'bytes';
export const DATE = 'date';
export const DEFAULT = 'default';
export const HISTORY_EVENT_TYPE = 'historyEventType';
export const INDEXER = 'indexer';
export const PROTOCOL = 'protocol';
export const PRIVACY = 'privacy';

View File

@@ -15,6 +15,7 @@ import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptions
import TablePager from 'Components/Table/TablePager';
import { align, icons, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import HistoryFilterModal from './HistoryFilterModal';
import HistoryOptionsConnector from './HistoryOptionsConnector';
import HistoryRowConnector from './HistoryRowConnector';
@@ -63,6 +64,7 @@ class History extends Component {
columns,
selectedFilterKey,
filters,
customFilters,
totalRecords,
onFilterSelect,
onFirstPagePress,
@@ -108,7 +110,8 @@ class History extends Component {
alignMenu={align.RIGHT}
selectedFilterKey={selectedFilterKey}
filters={filters}
customFilters={[]}
customFilters={customFilters}
filterModalConnectorComponent={HistoryFilterModal}
onFilterSelect={onFilterSelect}
/>
</PageToolbarSection>
@@ -193,8 +196,9 @@ History.propTypes = {
indexersError: PropTypes.object,
items: PropTypes.arrayOf(PropTypes.object).isRequired,
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
selectedFilterKey: PropTypes.string.isRequired,
selectedFilterKey: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
filters: PropTypes.arrayOf(PropTypes.object).isRequired,
customFilters: PropTypes.arrayOf(PropTypes.object).isRequired,
totalRecords: PropTypes.number,
onFilterSelect: PropTypes.func.isRequired,
onFirstPagePress: PropTypes.func.isRequired,

View File

@@ -6,6 +6,7 @@ import * as commandNames from 'Commands/commandNames';
import withCurrentPage from 'Components/withCurrentPage';
import { executeCommand } from 'Store/Actions/commandActions';
import * as historyActions from 'Store/Actions/historyActions';
import { createCustomFiltersSelector } from 'Store/Selectors/createClientSideCollectionSelector';
import createCommandExecutingSelector from 'Store/Selectors/createCommandExecutingSelector';
import { registerPagePopulator, unregisterPagePopulator } from 'Utilities/pagePopulator';
import History from './History';
@@ -14,13 +15,15 @@ function createMapStateToProps() {
return createSelector(
(state) => state.history,
(state) => state.indexers,
createCustomFiltersSelector('history'),
createCommandExecutingSelector(commandNames.CLEAR_HISTORY),
(history, indexers, isHistoryClearing) => {
(history, indexers, customFilters, isHistoryClearing) => {
return {
isIndexersFetching: indexers.isFetching,
isIndexersPopulated: indexers.isPopulated,
indexersError: indexers.error,
isHistoryClearing,
customFilters,
...history
};
}

View File

@@ -0,0 +1,54 @@
import React, { useCallback } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { createSelector } from 'reselect';
import AppState from 'App/State/AppState';
import FilterModal from 'Components/Filter/FilterModal';
import { setHistoryFilter } from 'Store/Actions/historyActions';
function createHistorySelector() {
return createSelector(
(state: AppState) => state.history.items,
(queueItems) => {
return queueItems;
}
);
}
function createFilterBuilderPropsSelector() {
return createSelector(
(state: AppState) => state.history.filterBuilderProps,
(filterBuilderProps) => {
return filterBuilderProps;
}
);
}
interface HistoryFilterModalProps {
isOpen: boolean;
}
export default function HistoryFilterModal(props: HistoryFilterModalProps) {
const sectionItems = useSelector(createHistorySelector());
const filterBuilderProps = useSelector(createFilterBuilderPropsSelector());
const customFilterType = 'history';
const dispatch = useDispatch();
const dispatchSetFilter = useCallback(
(payload: unknown) => {
dispatch(setHistoryFilter(payload));
},
[dispatch]
);
return (
<FilterModal
// TODO: Don't spread all the props
{...props}
sectionItems={sectionItems}
filterBuilderProps={filterBuilderProps}
customFilterType={customFilterType}
dispatchSetFilter={dispatchSetFilter}
/>
);
}

View File

@@ -11,6 +11,12 @@
flex: 0 0 60px;
}
.id {
composes: cell;
flex: 0 0 60px;
}
.sortName {
composes: cell;

View File

@@ -8,6 +8,7 @@ interface CssExports {
'cell': string;
'checkInput': string;
'externalLink': string;
'id': string;
'minimumSeeders': string;
'packSeedTime': string;
'priority': string;

View File

@@ -34,7 +34,7 @@ function IndexerIndexRow(props: IndexerIndexRowProps) {
const { indexerId, columns, isSelectMode, onCloneIndexerPress } = props;
const { indexer, appProfile, status, longDateFormat, timeFormat } =
useSelector(createIndexerIndexItemSelector(props.indexerId));
useSelector(createIndexerIndexItemSelector(indexerId));
const {
id,
@@ -148,12 +148,24 @@ function IndexerIndexRow(props: IndexerIndexRowProps) {
);
}
if (name === 'id') {
return (
<VirtualTableRowCell key={name} className={styles[name]}>
<IndexerTitleLink
indexerId={indexerId}
title={`${indexerId}`}
onCloneIndexerPress={onCloneIndexerPress}
/>
</VirtualTableRowCell>
);
}
if (name === 'sortName') {
return (
<VirtualTableRowCell key={name} className={styles[name]}>
<IndexerTitleLink
indexerId={indexerId}
indexerName={indexerName}
title={indexerName}
onCloneIndexerPress={onCloneIndexerPress}
/>
</VirtualTableRowCell>

View File

@@ -4,6 +4,12 @@
flex: 0 0 60px;
}
.id {
composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 0 0 60px;
}
.sortName {
composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';

View File

@@ -5,6 +5,7 @@ interface CssExports {
'added': string;
'appProfileId': string;
'capabilities': string;
'id': string;
'minimumSeeders': string;
'packSeedTime': string;
'priority': string;

View File

@@ -1,17 +1,16 @@
import PropTypes from 'prop-types';
import React, { useCallback, useState } from 'react';
import Link from 'Components/Link/Link';
import IndexerInfoModal from './Info/IndexerInfoModal';
import styles from './IndexerTitleLink.css';
interface IndexerTitleLinkProps {
indexerName: string;
indexerId: number;
title: string;
onCloneIndexerPress(id: number): void;
}
function IndexerTitleLink(props: IndexerTitleLinkProps) {
const { indexerName, indexerId, onCloneIndexerPress } = props;
const { title, indexerId, onCloneIndexerPress } = props;
const [isIndexerInfoModalOpen, setIsIndexerInfoModalOpen] = useState(false);
@@ -26,7 +25,7 @@ function IndexerTitleLink(props: IndexerTitleLinkProps) {
return (
<div>
<Link className={styles.link} onPress={onIndexerInfoPress}>
{indexerName}
{title}
</Link>
<IndexerInfoModal
@@ -39,8 +38,4 @@ function IndexerTitleLink(props: IndexerTitleLinkProps) {
);
}
IndexerTitleLink.propTypes = {
indexerName: PropTypes.string.isRequired,
};
export default IndexerTitleLink;

View File

@@ -12,8 +12,9 @@ import FilterMenu from 'Components/Menu/FilterMenu';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
import PageToolbar from 'Components/Page/Toolbar/PageToolbar';
import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton';
import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection';
import { align, kinds } from 'Helpers/Props';
import { align, icons, kinds } from 'Helpers/Props';
import {
fetchIndexerStats,
setIndexerStatsFilter,
@@ -194,6 +195,10 @@ function IndexerStats() {
dispatch(fetchIndexerStats());
}, [dispatch]);
const onRefreshPress = useCallback(() => {
dispatch(fetchIndexerStats());
}, [dispatch]);
const onFilterSelect = useCallback(
(value: string) => {
dispatch(setIndexerStatsFilter({ selectedFilterKey: value }));
@@ -219,8 +224,17 @@ function IndexerStats() {
}, 0) ?? 0;
return (
<PageContent>
<PageContent title={translate('Stats')}>
<PageToolbar>
<PageToolbarSection>
<PageToolbarButton
label={translate('Refresh')}
iconName={icons.REFRESH}
isSpinning={isFetching}
onPress={onRefreshPress}
/>
</PageToolbarSection>
<PageToolbarSection alignContent={align.RIGHT} collapseButtons={false}>
<FilterMenu
alignMenu={align.RIGHT}

View File

@@ -285,7 +285,7 @@ class SearchIndex extends Component {
const hasNoIndexer = !totalItems;
return (
<PageContent>
<PageContent title={translate('Search')}>
<PageToolbar>
<PageToolbarSection
alignContent={align.RIGHT}

View File

@@ -6,6 +6,8 @@ import getSectionState from 'Utilities/State/getSectionState';
import { set, updateServerSideCollection } from '../baseActions';
function createFetchServerSideCollectionHandler(section, url, fetchDataAugmenter) {
const [baseSection] = section.split('.');
return function(getState, payload, dispatch) {
dispatch(set({ section, isFetching: true }));
@@ -25,10 +27,13 @@ function createFetchServerSideCollectionHandler(section, url, fetchDataAugmenter
const {
selectedFilterKey,
filters,
customFilters
filters
} = sectionState;
const customFilters = getState().customFilters.items.filter((customFilter) => {
return customFilter.type === section || customFilter.type === baseSection;
});
const selectedFilters = findSelectedFilters(selectedFilterKey, filters, customFilters);
selectedFilters.forEach((filter) => {
@@ -37,7 +42,8 @@ function createFetchServerSideCollectionHandler(section, url, fetchDataAugmenter
const promise = createAjaxRequest({
url,
data
data,
traditional: true
}).request;
promise.done((response) => {

View File

@@ -1,5 +1,5 @@
import { createAction } from 'redux-actions';
import { filterTypes, sortDirections } from 'Helpers/Props';
import { filterBuilderTypes, filterBuilderValueTypes, filterTypes, sortDirections } from 'Helpers/Props';
import { createThunk, handleThunks } from 'Store/thunks';
import createAjaxRequest from 'Utilities/createAjaxRequest';
import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers';
@@ -159,6 +159,27 @@ export const defaultState = {
}
]
}
],
filterBuilderProps: [
{
name: 'eventType',
label: () => translate('EventType'),
type: filterBuilderTypes.EQUAL,
valueType: filterBuilderValueTypes.HISTORY_EVENT_TYPE
},
{
name: 'indexerIds',
label: () => translate('Indexer'),
type: filterBuilderTypes.EQUAL,
valueType: filterBuilderValueTypes.INDEXER
},
{
name: 'successful',
label: () => translate('Successful'),
type: filterBuilderTypes.EQUAL,
valueType: filterBuilderValueTypes.BOOL
}
]
};

View File

@@ -37,12 +37,18 @@ export const defaultState = {
isVisible: true,
isModifiable: false
},
{
name: 'id',
columnLabel: () => translate('IndexerId'),
label: () => translate('Id'),
isSortable: true,
isVisible: false
},
{
name: 'sortName',
label: () => translate('IndexerName'),
isSortable: true,
isVisible: true,
isModifiable: false
isVisible: true
},
{
name: 'protocol',

View File

@@ -74,8 +74,9 @@ export const defaultState = {
valueType: filterBuilderValueTypes.TAG
}
],
selectedFilterKey: 'all',
customFilters: []
selectedFilterKey: 'all'
};
export const persistState = [

View File

@@ -369,8 +369,9 @@ export const actionHandlers = handleThunks({
promise.done((data) => {
dispatch(batchActions([
...data.map((release) => {
...data.map(({ guid }) => {
return updateRelease({
guid,
isGrabbing: false,
isGrabbed: true,
grabError: null

View File

@@ -92,6 +92,10 @@ namespace NzbDrone.Common.Http
{
data = new XElement("base64", Convert.ToBase64String(bytes));
}
else if (value is Dictionary<string, string> d)
{
data = new XElement("struct", d.Select(p => new XElement("member", new XElement("name", p.Key), new XElement("value", p.Value))));
}
else
{
throw new InvalidOperationException($"Unhandled argument type {value.GetType().Name}");

View File

@@ -1,4 +1,5 @@
using System;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Net.Http;
@@ -21,10 +22,10 @@ namespace NzbDrone.Core.Test.IndexerTests.GazelleGamesTests
[SetUp]
public void Setup()
{
Subject.Definition = new IndexerDefinition()
Subject.Definition = new IndexerDefinition
{
Name = "GazelleGames",
Settings = new GazelleGamesSettings() { Apikey = "somekey" }
Settings = new GazelleGamesSettings { Apikey = "somekey" }
};
}
@@ -37,20 +38,20 @@ namespace NzbDrone.Core.Test.IndexerTests.GazelleGamesTests
.Setup(o => o.ExecuteProxiedAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get), Subject.Definition))
.Returns<HttpRequest, IndexerDefinition>((r, d) => Task.FromResult(new HttpResponse(r, new HttpHeader { { "Content-Type", "application/json" } }, new CookieCollection(), recentFeed)));
var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new int[] { 2000 } })).Releases;
var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new[] { 2000 } })).Releases;
releases.Should().HaveCount(1464);
releases.Should().HaveCount(1462);
releases.First().Should().BeOfType<TorrentInfo>();
var torrentInfo = releases.First() as TorrentInfo;
torrentInfo.Title.Should().Be("Microsoft_Flight_Simulator-HOODLUM");
torrentInfo.Title.Should().Be("Microsoft_Flight_Simulator-HOODLUM (2020) [Windows / Multi-Language / Full ISO]");
torrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent);
torrentInfo.DownloadUrl.Should().Be("https://gazellegames.net/torrents.php?action=download&id=303216&authkey=prowlarr&torrent_pass=");
torrentInfo.InfoUrl.Should().Be("https://gazellegames.net/torrents.php?id=84781&torrentid=303216");
torrentInfo.CommentUrl.Should().BeNullOrEmpty();
torrentInfo.Indexer.Should().Be(Subject.Definition.Name);
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-07-25 6:39:11").ToUniversalTime());
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-07-25 06:39:11", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal));
torrentInfo.Size.Should().Be(80077617780);
torrentInfo.InfoHash.Should().Be(null);
torrentInfo.MagnetUrl.Should().Be(null);
@@ -74,7 +75,7 @@ namespace NzbDrone.Core.Test.IndexerTests.GazelleGamesTests
.Setup(o => o.ExecuteProxiedAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get), Subject.Definition))
.Returns<HttpRequest, IndexerDefinition>((r, d) => Task.FromResult(new HttpResponse(r, new HttpHeader { { "Content-Type", "application/json" } }, new CookieCollection(), recentFeed)));
var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new int[] { 2000 } })).Releases;
var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new[] { 2000 } })).Releases;
releases.Should().HaveCount(0);
}

View File

@@ -41,6 +41,23 @@ namespace NzbDrone.Core.Annotations
public string Hint { get; set; }
}
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class FieldTokenAttribute : Attribute
{
public FieldTokenAttribute(TokenField field, string label = "", string token = "", object value = null)
{
Label = label;
Field = field;
Token = token;
Value = value?.ToString();
}
public string Label { get; set; }
public TokenField Field { get; set; }
public string Token { get; set; }
public string Value { get; set; }
}
public class FieldSelectOption
{
public int Value { get; set; }
@@ -82,4 +99,11 @@ namespace NzbDrone.Core.Annotations
ApiKey,
UserName
}
public enum TokenField
{
Label,
HelpText,
HelpTextWarning
}
}

View File

@@ -332,8 +332,8 @@ namespace NzbDrone.Core.Configuration
return;
}
// If SSL is enabled and a cert hash is still in the config file disable SSL
if (EnableSsl && GetValue("SslCertHash", null).IsNotNullOrWhiteSpace())
// If SSL is enabled and a cert hash is still in the config file or cert path is empty disable SSL
if (EnableSsl && (GetValue("SslCertHash", null).IsNotNullOrWhiteSpace() || SslCertPath.IsNullOrWhiteSpace()))
{
SetValue("EnableSsl", false);
}

View File

@@ -2,6 +2,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System.Xml.XPath;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http;
using NzbDrone.Core.Download.Extensions;
@@ -95,8 +96,14 @@ namespace NzbDrone.Core.Download.Clients.Aria2
public string AddUri(Aria2Settings settings, string magnet)
{
var response = ExecuteRequest(settings, "aria2.addUri", GetToken(settings), new List<string> { magnet });
var options = new Dictionary<string, string>();
if (settings.Directory.IsNotNullOrWhiteSpace())
{
options.Add("dir", settings.Directory);
}
var response = ExecuteRequest(settings, "aria2.addUri", GetToken(settings), new List<string> { magnet }, options);
var gid = response.GetStringResponse();
return gid;
@@ -104,8 +111,16 @@ namespace NzbDrone.Core.Download.Clients.Aria2
public string AddTorrent(Aria2Settings settings, byte[] torrent)
{
var response = ExecuteRequest(settings, "aria2.addTorrent", GetToken(settings), torrent);
// Aria2's second parameter is an array of URIs and needs to be sent if options are provided, this satisfies that requirement.
var emptyListOfUris = new List<string>();
var options = new Dictionary<string, string>();
if (settings.Directory.IsNotNullOrWhiteSpace())
{
options.Add("dir", settings.Directory);
}
var response = ExecuteRequest(settings, "aria2.addTorrent", GetToken(settings), torrent, emptyListOfUris, options);
var gid = response.GetStringResponse();
return gid;

View File

@@ -41,6 +41,9 @@ namespace NzbDrone.Core.Download.Clients.Aria2
[FieldDefinition(4, Label = "Secret token", Type = FieldType.Password, Privacy = PrivacyLevel.Password)]
public string SecretToken { get; set; }
[FieldDefinition(5, Label = "Directory", Type = FieldType.Textbox, HelpText = "DownloadClientAriaSettingsDirectoryHelpText")]
public string Directory { get; set; }
public NzbDroneValidationResult Validate()
{
return new NzbDroneValidationResult(Validator.Validate(this));

View File

@@ -4,6 +4,7 @@ using System.Linq;
using FluentValidation.Results;
using NLog;
using NzbDrone.Common.Disk;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Download.Clients.Flood.Models;
using NzbDrone.Core.Indexers;
@@ -56,7 +57,7 @@ namespace NzbDrone.Core.Download.Clients.Flood
}
}
return result;
return result.Where(t => t.IsNotNullOrWhiteSpace());
}
public override string Name => "Flood";

View File

@@ -0,0 +1,9 @@
namespace NzbDrone.Core.Download.Clients.QBittorrent
{
public enum QBittorrentContentLayout
{
Default = 0,
Original = 1,
Subfolder = 2
}
}

View File

@@ -265,6 +265,15 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
{
request.AddFormParameter("firstLastPiecePrio", true);
}
if ((QBittorrentContentLayout)settings.ContentLayout == QBittorrentContentLayout.Original)
{
request.AddFormParameter("contentLayout", "Original");
}
else if ((QBittorrentContentLayout)settings.ContentLayout == QBittorrentContentLayout.Subfolder)
{
request.AddFormParameter("contentLayout", "Subfolder");
}
}
public void SetTorrentSeedingConfiguration(string hash, TorrentSeedConfiguration seedConfiguration, QBittorrentSettings settings)

View File

@@ -62,6 +62,9 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
[FieldDefinition(10, Label = "First and Last First", Type = FieldType.Checkbox, HelpText = "Download first and last pieces first (qBittorrent 4.1.0+)")]
public bool FirstAndLast { get; set; }
[FieldDefinition(13, Label = "DownloadClientQbittorrentSettingsContentLayout", Type = FieldType.Select, SelectOptions = typeof(QBittorrentContentLayout), HelpText = "DownloadClientQbittorrentSettingsContentLayoutHelpText")]
public int ContentLayout { get; set; }
public NzbDroneValidationResult Validate()
{
return new NzbDroneValidationResult(Validator.Validate(this));

View File

@@ -171,9 +171,7 @@ namespace NzbDrone.Core.Download
}
catch (FormatException ex)
{
_logger.Error(ex, "Failed to parse magnetlink for release '{0}': '{1}'", release.Title, magnetUrl);
return null;
throw new ReleaseDownloadException("Failed to parse magnetlink for release '{0}': '{1}'", ex, release.Title, magnetUrl);
}
if (hash != null)

View File

@@ -26,8 +26,7 @@ public class AudioBookBay : TorrentIndexerBase<NoAuthTorrentBaseSettings>
public override string Name => "AudioBook Bay";
public override string[] IndexerUrls => new[]
{
"https://audiobookbay.is/",
"https://audiobookbay.se/"
"https://audiobookbay.is/"
};
public override string[] LegacyUrls => new[]
{
@@ -55,12 +54,14 @@ public class AudioBookBay : TorrentIndexerBase<NoAuthTorrentBaseSettings>
"https://audiobookbay.unblockit.pet/",
"https://audiobookbay.unblockit.ink/",
"https://audiobookbay.unblockit.bio/", // error 502
"https://audiobookbay.li/"
"https://audiobookbay.li/",
"https://audiobookbay.se/" // redirects to .is but has invalid CA
};
public override string Description => "AudioBook Bay (ABB) is a public Torrent Tracker for AUDIOBOOKS";
public override string Language => "en-US";
public override IndexerPrivacy Privacy => IndexerPrivacy.Public;
public override int PageSize => 15;
public override TimeSpan RateLimit => TimeSpan.FromSeconds(5);
public override IndexerCapabilities Capabilities => SetCapabilities();
public AudioBookBay(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger)
@@ -70,7 +71,7 @@ public class AudioBookBay : TorrentIndexerBase<NoAuthTorrentBaseSettings>
public override IIndexerRequestGenerator GetRequestGenerator()
{
return new AudioBookBayRequestGenerator(Settings, Capabilities);
return new AudioBookBayRequestGenerator(Settings);
}
public override IParseIndexerResponse GetParser()
@@ -119,64 +120,7 @@ public class AudioBookBay : TorrentIndexerBase<NoAuthTorrentBaseSettings>
}
};
// Age
caps.Categories.AddCategoryMapping("children", NewznabStandardCategory.AudioAudiobook, "Children");
caps.Categories.AddCategoryMapping("teen-young-adult", NewznabStandardCategory.AudioAudiobook, "Teen & Young Adult");
caps.Categories.AddCategoryMapping("adults", NewznabStandardCategory.AudioAudiobook, "Adults");
// Category
caps.Categories.AddCategoryMapping("postapocalyptic", NewznabStandardCategory.AudioAudiobook, "(Post)apocalyptic");
caps.Categories.AddCategoryMapping("action", NewznabStandardCategory.AudioAudiobook, "Action");
caps.Categories.AddCategoryMapping("adventure", NewznabStandardCategory.AudioAudiobook, "Adventure");
caps.Categories.AddCategoryMapping("art", NewznabStandardCategory.AudioAudiobook, "Art");
caps.Categories.AddCategoryMapping("autobiography-biographies", NewznabStandardCategory.AudioAudiobook, "Autobiography & Biographies");
caps.Categories.AddCategoryMapping("business", NewznabStandardCategory.AudioAudiobook, "Business");
caps.Categories.AddCategoryMapping("computer", NewznabStandardCategory.AudioAudiobook, "Computer");
caps.Categories.AddCategoryMapping("contemporary", NewznabStandardCategory.AudioAudiobook, "Contemporary");
caps.Categories.AddCategoryMapping("crime", NewznabStandardCategory.AudioAudiobook, "Crime");
caps.Categories.AddCategoryMapping("detective", NewznabStandardCategory.AudioAudiobook, "Detective");
caps.Categories.AddCategoryMapping("doctor-who-sci-fi", NewznabStandardCategory.AudioAudiobook, "Doctor Who");
caps.Categories.AddCategoryMapping("education", NewznabStandardCategory.AudioAudiobook, "Education");
caps.Categories.AddCategoryMapping("fantasy", NewznabStandardCategory.AudioAudiobook, "Fantasy");
caps.Categories.AddCategoryMapping("general-fiction", NewznabStandardCategory.AudioAudiobook, "General Fiction");
caps.Categories.AddCategoryMapping("historical-fiction", NewznabStandardCategory.AudioAudiobook, "Historical Fiction");
caps.Categories.AddCategoryMapping("history", NewznabStandardCategory.AudioAudiobook, "History");
caps.Categories.AddCategoryMapping("horror", NewznabStandardCategory.AudioAudiobook, "Horror");
caps.Categories.AddCategoryMapping("humor", NewznabStandardCategory.AudioAudiobook, "Humor");
caps.Categories.AddCategoryMapping("lecture", NewznabStandardCategory.AudioAudiobook, "Lecture");
caps.Categories.AddCategoryMapping("lgbt", NewznabStandardCategory.AudioAudiobook, "LGBT");
caps.Categories.AddCategoryMapping("literature", NewznabStandardCategory.AudioAudiobook, "Literature");
caps.Categories.AddCategoryMapping("litrpg", NewznabStandardCategory.AudioAudiobook, "LitRPG");
caps.Categories.AddCategoryMapping("general-non-fiction", NewznabStandardCategory.AudioAudiobook, "Misc. Non-fiction");
caps.Categories.AddCategoryMapping("mystery", NewznabStandardCategory.AudioAudiobook, "Mystery");
caps.Categories.AddCategoryMapping("paranormal", NewznabStandardCategory.AudioAudiobook, "Paranormal");
caps.Categories.AddCategoryMapping("plays-theater", NewznabStandardCategory.AudioAudiobook, "Plays & Theater");
caps.Categories.AddCategoryMapping("poetry", NewznabStandardCategory.AudioAudiobook, "Poetry");
caps.Categories.AddCategoryMapping("political", NewznabStandardCategory.AudioAudiobook, "Political");
caps.Categories.AddCategoryMapping("radio-productions", NewznabStandardCategory.AudioAudiobook, "Radio Productions");
caps.Categories.AddCategoryMapping("romance", NewznabStandardCategory.AudioAudiobook, "Romance");
caps.Categories.AddCategoryMapping("sci-fi", NewznabStandardCategory.AudioAudiobook, "Sci-Fi");
caps.Categories.AddCategoryMapping("science", NewznabStandardCategory.AudioAudiobook, "Science");
caps.Categories.AddCategoryMapping("self-help", NewznabStandardCategory.AudioAudiobook, "Self-help");
caps.Categories.AddCategoryMapping("spiritual", NewznabStandardCategory.AudioAudiobook, "Spiritual & Religious");
caps.Categories.AddCategoryMapping("sports", NewznabStandardCategory.AudioAudiobook, "Sport & Recreation");
caps.Categories.AddCategoryMapping("suspense", NewznabStandardCategory.AudioAudiobook, "Suspense");
caps.Categories.AddCategoryMapping("thriller", NewznabStandardCategory.AudioAudiobook, "Thriller");
caps.Categories.AddCategoryMapping("true-crime", NewznabStandardCategory.AudioAudiobook, "True Crime");
caps.Categories.AddCategoryMapping("tutorial", NewznabStandardCategory.AudioAudiobook, "Tutorial");
caps.Categories.AddCategoryMapping("westerns", NewznabStandardCategory.AudioAudiobook, "Westerns");
caps.Categories.AddCategoryMapping("zombies", NewznabStandardCategory.AudioAudiobook, "Zombies");
// Category Modifiers
caps.Categories.AddCategoryMapping("anthology", NewznabStandardCategory.AudioAudiobook, "Anthology");
caps.Categories.AddCategoryMapping("bestsellers", NewznabStandardCategory.AudioAudiobook, "Bestsellers");
caps.Categories.AddCategoryMapping("classic", NewznabStandardCategory.AudioAudiobook, "Classic");
caps.Categories.AddCategoryMapping("documentary", NewznabStandardCategory.AudioAudiobook, "Documentary");
caps.Categories.AddCategoryMapping("full-cast", NewznabStandardCategory.AudioAudiobook, "Full Cast");
caps.Categories.AddCategoryMapping("libertarian", NewznabStandardCategory.AudioAudiobook, "Libertarian");
caps.Categories.AddCategoryMapping("military", NewznabStandardCategory.AudioAudiobook, "Military");
caps.Categories.AddCategoryMapping("novel", NewznabStandardCategory.AudioAudiobook, "Novel");
caps.Categories.AddCategoryMapping("short-story", NewznabStandardCategory.AudioAudiobook, "Short Story");
caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.AudioAudiobook);
return caps;
}
@@ -185,12 +129,10 @@ public class AudioBookBay : TorrentIndexerBase<NoAuthTorrentBaseSettings>
public class AudioBookBayRequestGenerator : IIndexerRequestGenerator
{
private readonly NoAuthTorrentBaseSettings _settings;
private readonly IndexerCapabilities _capabilities;
public AudioBookBayRequestGenerator(NoAuthTorrentBaseSettings settings, IndexerCapabilities capabilities)
public AudioBookBayRequestGenerator(NoAuthTorrentBaseSettings settings)
{
_settings = settings;
_capabilities = capabilities;
}
public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria)
@@ -246,8 +188,6 @@ public class AudioBookBayRequestGenerator : IIndexerRequestGenerator
}
yield return new IndexerRequest(new UriBuilder(searchUrl) { Path = "/" }.Uri.AbsoluteUri, HttpAccept.Html);
yield return new IndexerRequest(new UriBuilder(searchUrl) { Path = "/page/2/" }.Uri.AbsoluteUri, HttpAccept.Html);
yield return new IndexerRequest(new UriBuilder(searchUrl) { Path = "/page/3/" }.Uri.AbsoluteUri, HttpAccept.Html);
}
public Func<IDictionary<string, string>> GetCookies { get; set; }
@@ -300,8 +240,7 @@ public class AudioBookBayParser : IParseIndexerResponse
var postInfo = row.QuerySelector("div.postInfo")?.FirstChild?.TextContent.Trim().Replace("\xA0", ";") ?? string.Empty;
var matchCategory = Regex.Match(postInfo, @"Category: (.+)$", RegexOptions.IgnoreCase);
var category = matchCategory.Groups[1].Success ? matchCategory.Groups[1].Value.Split(';', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList() : new List<string>();
var categories = category.SelectMany(_categories.MapTrackerCatDescToNewznab).Distinct().ToList();
var genres = matchCategory.Groups[1].Success ? matchCategory.Groups[1].Value.Split(';', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList() : new List<string>();
var release = new TorrentInfo
{
@@ -309,13 +248,14 @@ public class AudioBookBayParser : IParseIndexerResponse
InfoUrl = infoUrl,
DownloadUrl = infoUrl,
Title = CleanTitle(title),
Categories = categories,
Categories = new List<IndexerCategory> { NewznabStandardCategory.AudioAudiobook },
Size = size,
Seeders = 1,
Peers = 1,
PublishDate = publishDate,
DownloadVolumeFactor = 0,
UploadVolumeFactor = 1
UploadVolumeFactor = 1,
Genres = genres
};
var cover = row.QuerySelector("img[src]")?.GetAttribute("src")?.Trim();

View File

@@ -19,6 +19,7 @@ using NzbDrone.Core.Validation;
namespace NzbDrone.Core.Indexers.Definitions
{
[Obsolete("Site has shutdown")]
public class BinSearch : UsenetIndexerBase<BinSearchSettings>
{
public override string Name => "BinSearch";

View File

@@ -38,3 +38,8 @@ public class FileListTorrent
[JsonPropertyName("small_description")]
public string SmallDescription { get; set; }
}
public class FileListErrorResponse
{
public string Error { get; set; }
}

View File

@@ -28,9 +28,14 @@ public class FileListParser : IParseIndexerResponse
throw new IndexerException(indexerResponse, "Unexpected response status {0} code from indexer request", indexerResponse.HttpResponse.StatusCode);
}
if (indexerResponse.Content.StartsWith("{\"error\"") && STJson.TryDeserialize<FileListErrorResponse>(indexerResponse.Content, out var errorResponse))
{
throw new IndexerException(indexerResponse, "Unexpected response from indexer request: {0}", errorResponse.Error);
}
if (!indexerResponse.HttpResponse.Headers.ContentType.Contains(HttpAccept.Json.Value))
{
throw new IndexerException(indexerResponse, $"Unexpected response header {indexerResponse.HttpResponse.Headers.ContentType} from indexer request, expected {HttpAccept.Json.Value}");
throw new IndexerException(indexerResponse, "Unexpected response header {0} from indexer request, expected {1}", indexerResponse.HttpResponse.Headers.ContentType, HttpAccept.Json.Value);
}
var releaseInfos = new List<ReleaseInfo>();

View File

@@ -1,13 +1,16 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using FluentValidation;
using FluentValidation.Results;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NLog;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http;
using NzbDrone.Common.Serializer;
using NzbDrone.Core.Annotations;
@@ -16,6 +19,7 @@ using NzbDrone.Core.Indexers.Exceptions;
using NzbDrone.Core.Indexers.Settings;
using NzbDrone.Core.IndexerSearch.Definitions;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Parser;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Validation;
@@ -24,7 +28,7 @@ namespace NzbDrone.Core.Indexers.Definitions
public class GazelleGames : TorrentIndexerBase<GazelleGamesSettings>
{
public override string Name => "GazelleGames";
public override string[] IndexerUrls => new string[] { "https://gazellegames.net/" };
public override string[] IndexerUrls => new[] { "https://gazellegames.net/" };
public override string Description => "GazelleGames (GGn) is a Private Torrent Tracker for GAMES";
public override string Language => "en-US";
public override Encoding Encoding => Encoding.UTF8;
@@ -38,7 +42,7 @@ namespace NzbDrone.Core.Indexers.Definitions
public override IIndexerRequestGenerator GetRequestGenerator()
{
return new GazelleGamesRequestGenerator() { Settings = Settings, Capabilities = Capabilities, HttpClient = _httpClient };
return new GazelleGamesRequestGenerator(Settings, Capabilities);
}
public override IParseIndexerResponse GetParser()
@@ -48,14 +52,13 @@ namespace NzbDrone.Core.Indexers.Definitions
private IndexerCapabilities SetCapabilities()
{
var caps = new IndexerCapabilities
{
};
var caps = new IndexerCapabilities();
// Apple
caps.Categories.AddCategoryMapping("Mac", NewznabStandardCategory.ConsoleOther, "Mac");
caps.Categories.AddCategoryMapping("iOS", NewznabStandardCategory.PCMobileiOS, "iOS");
caps.Categories.AddCategoryMapping("Apple Bandai Pippin", NewznabStandardCategory.ConsoleOther, "Apple Bandai Pippin");
caps.Categories.AddCategoryMapping("Apple II", NewznabStandardCategory.ConsoleOther, "Apple II");
// Google
caps.Categories.AddCategoryMapping("Android", NewznabStandardCategory.PCMobileAndroid, "Android");
@@ -78,6 +81,7 @@ namespace NzbDrone.Core.Indexers.Definitions
caps.Categories.AddCategoryMapping("Nintendo GameCube", NewznabStandardCategory.ConsoleOther, "Nintendo GameCube");
caps.Categories.AddCategoryMapping("Pokemon Mini", NewznabStandardCategory.ConsoleOther, "Pokemon Mini");
caps.Categories.AddCategoryMapping("SNES", NewznabStandardCategory.ConsoleOther, "SNES");
caps.Categories.AddCategoryMapping("Switch", NewznabStandardCategory.ConsoleOther, "Switch");
caps.Categories.AddCategoryMapping("Virtual Boy", NewznabStandardCategory.ConsoleOther, "Virtual Boy");
caps.Categories.AddCategoryMapping("Wii", NewznabStandardCategory.ConsoleWii, "Wii");
caps.Categories.AddCategoryMapping("Wii U", NewznabStandardCategory.ConsoleWiiU, "Wii U");
@@ -178,31 +182,62 @@ namespace NzbDrone.Core.Indexers.Definitions
caps.Categories.AddCategoryMapping("Retro - Other", NewznabStandardCategory.ConsoleOther, "Retro - Other");
// special categories (real categories/not platforms)
caps.Categories.AddCategoryMapping("OST", NewznabStandardCategory.AudioOther, "OST");
caps.Categories.AddCategoryMapping("Applications", NewznabStandardCategory.PC0day, "Applications");
caps.Categories.AddCategoryMapping("E-Books", NewznabStandardCategory.BooksEBook, "E-Books");
caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.PCGames, "Games");
caps.Categories.AddCategoryMapping(2, NewznabStandardCategory.PC0day, "Applications");
caps.Categories.AddCategoryMapping(3, NewznabStandardCategory.BooksEBook, "E-Books");
caps.Categories.AddCategoryMapping(4, NewznabStandardCategory.AudioOther, "OST");
return caps;
}
protected override async Task Test(List<ValidationFailure> failures)
{
((GazelleGamesRequestGenerator)GetRequestGenerator()).FetchPasskey();
await base.Test(failures);
await FetchPasskey().ConfigureAwait(false);
await base.Test(failures).ConfigureAwait(false);
}
private async Task FetchPasskey()
{
var request = new HttpRequestBuilder($"{Settings.BaseUrl.Trim().TrimEnd('/')}/api.php")
.Accept(HttpAccept.Json)
.SetHeader("X-API-Key", Settings.Apikey)
.AddQueryParam("request", "quick_user")
.Build();
var indexResponse = await _httpClient.ExecuteAsync(request).ConfigureAwait(false);
var index = Json.Deserialize<GazelleGamesUserResponse>(indexResponse.Content);
if (index == null ||
string.IsNullOrWhiteSpace(index.Status) ||
index.Status != "success" ||
string.IsNullOrWhiteSpace(index.Response.PassKey))
{
throw new IndexerAuthException("Failed to authenticate with GazelleGames.");
}
// Set passkey on settings so it can be used to generate the download URL
Settings.Passkey = index.Response.PassKey;
}
}
public class GazelleGamesRequestGenerator : IIndexerRequestGenerator
{
public GazelleGamesSettings Settings { get; set; }
public IndexerCapabilities Capabilities { get; set; }
public IIndexerHttpClient HttpClient { get; set; }
private readonly GazelleGamesSettings _settings;
private readonly IndexerCapabilities _capabilities;
public GazelleGamesRequestGenerator(GazelleGamesSettings settings, IndexerCapabilities capabilities)
{
_settings = settings;
_capabilities = capabilities;
}
public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria)
{
var pageableRequests = new IndexerPageableRequestChain();
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories)));
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria)));
return pageableRequests;
}
@@ -211,7 +246,7 @@ namespace NzbDrone.Core.Indexers.Definitions
{
var pageableRequests = new IndexerPageableRequestChain();
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories)));
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria)));
return pageableRequests;
}
@@ -220,7 +255,7 @@ namespace NzbDrone.Core.Indexers.Definitions
{
var pageableRequests = new IndexerPageableRequestChain();
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories)));
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria)));
return pageableRequests;
}
@@ -229,7 +264,7 @@ namespace NzbDrone.Core.Indexers.Definitions
{
var pageableRequests = new IndexerPageableRequestChain();
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories)));
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria)));
return pageableRequests;
}
@@ -238,61 +273,72 @@ namespace NzbDrone.Core.Indexers.Definitions
{
var pageableRequests = new IndexerPageableRequestChain();
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories)));
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria)));
return pageableRequests;
}
public void FetchPasskey()
private IEnumerable<IndexerRequest> GetRequest(List<KeyValuePair<string, string>> parameters)
{
// GET on index for the passkey
var request = RequestBuilder().Resource("api.php?request=quick_user").Build();
var indexResponse = HttpClient.Execute(request);
var index = Json.Deserialize<GazelleGamesUserResponse>(indexResponse.Content);
if (index == null ||
string.IsNullOrWhiteSpace(index.Status) ||
index.Status != "success" ||
string.IsNullOrWhiteSpace(index.Response.PassKey))
{
throw new Exception("Failed to authenticate with GazelleGames.");
}
// Set passkey on settings so it can be used to generate the download URL
Settings.Passkey = index.Response.PassKey;
}
private IEnumerable<IndexerRequest> GetRequest(string parameters)
{
var req = RequestBuilder()
.Resource($"api.php?{parameters}")
var request = RequestBuilder()
.Resource($"/api.php?{parameters.GetQueryString()}")
.Build();
yield return new IndexerRequest(req);
yield return new IndexerRequest(request);
}
private HttpRequestBuilder RequestBuilder()
{
return new HttpRequestBuilder($"{Settings.BaseUrl.Trim().TrimEnd('/')}")
return new HttpRequestBuilder($"{_settings.BaseUrl.Trim().TrimEnd('/')}")
.Resource("/api.php")
.Accept(HttpAccept.Json)
.SetHeader("X-API-Key", Settings.Apikey);
.SetHeader("X-API-Key", _settings.Apikey);
}
private string GetBasicSearchParameters(string searchTerm, int[] categories)
private List<KeyValuePair<string, string>> GetBasicSearchParameters(string searchTerm, SearchCriteriaBase searchCriteria)
{
var parameters = "request=search&search_type=torrents&empty_groups=filled&order_by=time&order_way=desc";
if (!string.IsNullOrWhiteSpace(searchTerm))
var parameters = new List<KeyValuePair<string, string>>
{
var searchType = Settings.SearchGroupNames ? "groupname" : "searchstr";
{ "request", "search" },
{ "search_type", "torrents" },
{ "empty_groups", "filled" },
{ "order_by", "time" },
{ "order_way", "desc" }
};
parameters += string.Format("&{1}={0}", searchTerm.Replace(".", " "), searchType);
if (searchTerm.IsNotNullOrWhiteSpace())
{
parameters.Add(
_settings.SearchGroupNames ? "groupname" : "searchstr",
searchTerm.Replace(".", " "));
}
if (categories != null)
if (searchCriteria.Categories != null)
{
foreach (var cat in Capabilities.Categories.MapTorznabCapsToTrackers(categories))
var categoryMappings = _capabilities.Categories
.MapTorznabCapsToTrackers(searchCriteria.Categories)
.Distinct()
.Where(x => !x.IsAllDigits())
.ToList();
categoryMappings.ForEach(category => parameters.Add("artistcheck[]", category));
}
if (searchCriteria.MinSize is > 0)
{
var minSize = searchCriteria.MinSize.Value / 1024L / 1024L;
if (minSize > 0)
{
parameters += string.Format("&artistcheck[]={0}", cat);
parameters.Add("sizesmall", minSize.ToString());
}
}
if (searchCriteria.MaxSize is > 0)
{
var maxSize = searchCriteria.MaxSize.Value / 1024L / 1024L;
if (maxSize > 0)
{
parameters.Add("sizeslarge", maxSize.ToString());
}
}
@@ -329,66 +375,63 @@ namespace NzbDrone.Core.Indexers.Definitions
}
var jsonResponse = new HttpResponse<GazelleGamesResponse>(indexerResponse.HttpResponse);
if (jsonResponse.Resource.Status != "success" ||
string.IsNullOrWhiteSpace(jsonResponse.Resource.Status) ||
jsonResponse.Resource.Response == null)
jsonResponse.Resource.Response is not JObject response)
{
return torrentInfos;
}
Dictionary<string, GazelleGamesGroup> response;
var groups = response.ToObject<Dictionary<int, GazelleGamesGroup>>(JsonSerializer.Create(Json.GetSerializerSettings()));
try
foreach (var group in groups)
{
response = ((JObject)jsonResponse.Resource.Response).ToObject<Dictionary<string, GazelleGamesGroup>>();
}
catch
{
return torrentInfos;
}
foreach (var result in response)
{
Dictionary<string, GazelleGamesTorrent> torrents;
try
{
torrents = ((JObject)result.Value.Torrents).ToObject<Dictionary<string, GazelleGamesTorrent>>();
}
catch
if (group.Value.Torrents is not JObject groupTorrents)
{
continue;
}
if (result.Value.Torrents != null)
var torrents = groupTorrents
.ToObject<Dictionary<int, GazelleGamesTorrent>>(JsonSerializer.Create(Json.GetSerializerSettings()))
.Where(t => t.Value.TorrentType.ToUpperInvariant() == "TORRENT")
.ToList();
var categories = group.Value.Artists
.SelectMany(a => _categories.MapTrackerCatDescToNewznab(a.Name))
.Distinct()
.ToArray();
foreach (var torrent in torrents)
{
var categories = result.Value.Artists.Select(a => a.Name);
var torrentId = torrent.Key;
var infoUrl = GetInfoUrl(group.Key, torrentId);
foreach (var torrent in torrents)
if (categories.Length == 0)
{
var id = int.Parse(torrent.Key);
var infoUrl = GetInfoUrl(result.Key, id);
var release = new TorrentInfo()
{
Guid = infoUrl,
Title = torrent.Value.ReleaseTitle,
Files = torrent.Value.FileCount,
Grabs = torrent.Value.Snatched,
Size = long.Parse(torrent.Value.Size),
DownloadUrl = GetDownloadUrl(id),
InfoUrl = infoUrl,
Seeders = torrent.Value.Seeders,
Categories = _categories.MapTrackerCatDescToNewznab(categories.FirstOrDefault()),
Peers = torrent.Value.Leechers + torrent.Value.Seeders,
PublishDate = torrent.Value.Time.ToUniversalTime(),
DownloadVolumeFactor = torrent.Value.FreeTorrent == GazelleGamesFreeTorrent.FreeLeech || torrent.Value.FreeTorrent == GazelleGamesFreeTorrent.Neutral || torrent.Value.LowSeedFL ? 0 : 1,
UploadVolumeFactor = torrent.Value.FreeTorrent == GazelleGamesFreeTorrent.Neutral ? 0 : 1
};
torrentInfos.Add(release);
categories = _categories.MapTrackerCatToNewznab(torrent.Value.CategoryId.ToString()).ToArray();
}
var release = new TorrentInfo
{
Guid = infoUrl,
InfoUrl = infoUrl,
DownloadUrl = GetDownloadUrl(torrentId),
Title = GetTitle(group.Value, torrent.Value),
Categories = categories,
Files = torrent.Value.FileCount,
Size = long.Parse(torrent.Value.Size),
Grabs = torrent.Value.Snatched,
Seeders = torrent.Value.Seeders,
Peers = torrent.Value.Leechers + torrent.Value.Seeders,
PublishDate = torrent.Value.Time.ToUniversalTime(),
Scene = torrent.Value.Scene == 1,
DownloadVolumeFactor = torrent.Value.FreeTorrent is GazelleGamesFreeTorrent.FreeLeech or GazelleGamesFreeTorrent.Neutral || torrent.Value.LowSeedFL ? 0 : 1,
UploadVolumeFactor = torrent.Value.FreeTorrent == GazelleGamesFreeTorrent.Neutral ? 0 : 1,
MinimumSeedTime = 288000 // Minimum of 3 days and 8 hours (80 hours in total)
};
torrentInfos.Add(release);
}
}
@@ -399,6 +442,54 @@ namespace NzbDrone.Core.Indexers.Definitions
.ToArray();
}
private static string GetTitle(GazelleGamesGroup group, GazelleGamesTorrent torrent)
{
var title = WebUtility.HtmlDecode(torrent.ReleaseTitle);
if (group.Year is > 0 && !title.Contains(group.Year.ToString()))
{
title += $" ({group.Year})";
}
if (torrent.RemasterTitle.IsNotNullOrWhiteSpace())
{
title += $" [{$"{torrent.RemasterTitle} {torrent.RemasterYear}".Trim()}]";
}
var flags = new List<string>
{
$"{torrent.Format} {torrent.Encoding}".Trim()
};
if (group.Artists is { Count: > 0 })
{
flags.AddIfNotNull(group.Artists.Select(a => a.Name).Join(", "));
}
flags.AddIfNotNull(torrent.Language);
flags.AddIfNotNull(torrent.Region);
flags.AddIfNotNull(torrent.Miscellaneous);
if (torrent.Dupable == 1)
{
flags.Add("Trumpable");
}
flags = flags.Where(x => x.IsNotNullOrWhiteSpace()).ToList();
if (flags.Any())
{
title += $" [{string.Join(" / ", flags)}]";
}
if (torrent.GameDoxType.IsNotNullOrWhiteSpace())
{
title += $" [{torrent.GameDoxType.Trim()}]";
}
return title;
}
private string GetDownloadUrl(int torrentId)
{
// AuthKey is required but not checked, just pass in a dummy variable
@@ -413,7 +504,7 @@ namespace NzbDrone.Core.Indexers.Definitions
return url.FullUri;
}
private string GetInfoUrl(string groupId, int torrentId)
private string GetInfoUrl(int groupId, int torrentId)
{
var url = new HttpUri(_settings.BaseUrl)
.CombinePath("/torrents.php")
@@ -444,7 +535,7 @@ namespace NzbDrone.Core.Indexers.Definitions
Passkey = "";
}
[FieldDefinition(2, Label = "API Key", HelpText = "API Key from the Site (Found in Settings => Access Settings), Must have User Permissions", Privacy = PrivacyLevel.ApiKey)]
[FieldDefinition(2, Label = "API Key", HelpText = "API Key from the Site (Found in Settings => Access Settings)", HelpTextWarning = "Must have User and Torrents permissions", Privacy = PrivacyLevel.ApiKey)]
public string Apikey { get; set; }
[FieldDefinition(3, Label = "Search Group Names", Type = FieldType.Checkbox, HelpText = "Search Group Names Only")]
@@ -466,8 +557,9 @@ namespace NzbDrone.Core.Indexers.Definitions
public class GazelleGamesGroup
{
public List<GazelleGamesArtist> Artists { get; set; }
public ReadOnlyCollection<GazelleGamesArtist> Artists { get; set; }
public object Torrents { get; set; }
public int? Year { get; set; }
}
public class GazelleGamesArtist
@@ -478,16 +570,30 @@ namespace NzbDrone.Core.Indexers.Definitions
public class GazelleGamesTorrent
{
public int CategoryId { get; set; }
public string Format { get; set; }
public string Encoding { get; set; }
public string Language { get; set; }
public string Region { get; set; }
public string RemasterYear { get; set; }
public string RemasterTitle { get; set; }
public string ReleaseTitle { get; set; }
public string Miscellaneous { get; set; }
public int Scene { get; set; }
public int Dupable { get; set; }
public DateTime Time { get; set; }
public string TorrentType { get; set; }
public int FileCount { get; set; }
public string Size { get; set; }
public int? Snatched { get; set; }
public int Seeders { get; set; }
public int Leechers { get; set; }
public string ReleaseTitle { get; set; }
public DateTime Time { get; set; }
public int FileCount { get; set; }
public GazelleGamesFreeTorrent FreeTorrent { get; set; }
public bool PersonalFL { get; set; }
public bool LowSeedFL { get; set; }
[JsonProperty("GameDOXType")]
public string GameDoxType { get; set; }
}
public class GazelleGamesUserResponse
@@ -503,9 +609,9 @@ namespace NzbDrone.Core.Indexers.Definitions
public enum GazelleGamesFreeTorrent
{
Normal,
FreeLeech,
Neutral,
Either
Normal = 0,
FreeLeech = 1,
Neutral = 2,
Either = 3
}
}

View File

@@ -17,7 +17,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits
public IEnumerable<int> Category { get; set; }
public IEnumerable<int> Codec { get; set; }
public IEnumerable<int> Medium { get; set; }
public int? Origin { get; set; }
public IEnumerable<int> Origin { get; set; }
[JsonProperty(PropertyName = "imdb")]
public ImdbInfo ImdbInfo { get; set; }

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net.Http;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http;
@@ -26,7 +27,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits
if (imdbId == 0 && searchCriteria.SearchTerm.IsNotNullOrWhiteSpace())
{
query.Search = searchCriteria.SanitizedSearchTerm;
query.Search = Regex.Replace(searchCriteria.SanitizedSearchTerm, "[\\W]+", " ").Trim();
}
if (imdbId != 0)
@@ -122,8 +123,20 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits
query.Username = Settings.Username;
query.Passkey = Settings.ApiKey;
query.Codec = Settings.Codecs.ToArray();
query.Medium = Settings.Mediums.ToArray();
if (Settings.Codecs.Any())
{
query.Codec = Settings.Codecs.ToArray();
}
if (Settings.Mediums.Any())
{
query.Medium = Settings.Mediums.ToArray();
}
if (Settings.Origins.Any())
{
query.Origin = Settings.Origins.ToArray();
}
if (searchCriteria.Categories?.Length > 0)
{

View File

@@ -24,6 +24,7 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits
{
Codecs = Array.Empty<int>();
Mediums = Array.Empty<int>();
Origins = Array.Empty<int>();
FreeleechOnly = false;
UseFilenames = true;
}
@@ -34,16 +35,19 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits
[FieldDefinition(3, Label = "API Key", HelpText = "Site API Key", Privacy = PrivacyLevel.ApiKey)]
public string ApiKey { get; set; }
[FieldDefinition(4, Label = "Codecs", Type = FieldType.Select, SelectOptions = typeof(HdBitsCodec), Advanced = true, HelpText = "If unspecified, all options are used.")]
[FieldDefinition(4, Label = "Codecs", Type = FieldType.Select, SelectOptions = typeof(HdBitsCodec), HelpText = "If unspecified, all options are used.", Advanced = true)]
public IEnumerable<int> Codecs { get; set; }
[FieldDefinition(5, Label = "Mediums", Type = FieldType.Select, SelectOptions = typeof(HdBitsMedium), Advanced = true, HelpText = "If unspecified, all options are used.")]
[FieldDefinition(5, Label = "Mediums", Type = FieldType.Select, SelectOptions = typeof(HdBitsMedium), HelpText = "If unspecified, all options are used.", Advanced = true)]
public IEnumerable<int> Mediums { get; set; }
[FieldDefinition(6, Label = "Freeleech Only", Type = FieldType.Checkbox, Advanced = true, HelpText = "Show freeleech releases only")]
[FieldDefinition(6, Label = "Origins", Type = FieldType.Select, SelectOptions = typeof(HdBitsOrigin), HelpText = "If unspecified, all options are used.", Advanced = true)]
public IEnumerable<int> Origins { get; set; }
[FieldDefinition(7, Label = "Freeleech Only", Type = FieldType.Checkbox, HelpText = "Show freeleech releases only", Advanced = true)]
public bool FreeleechOnly { get; set; }
[FieldDefinition(7, Label = "Use Filenames", Type = FieldType.Checkbox, HelpText = "Check this option if you want to use torrent filenames as release titles")]
[FieldDefinition(8, Label = "Use Filenames", Type = FieldType.Checkbox, HelpText = "Check this option if you want to use torrent filenames as release titles")]
public bool UseFilenames { get; set; }
public override NzbDroneValidationResult Validate()
@@ -79,4 +83,12 @@ namespace NzbDrone.Core.Indexers.Definitions.HDBits
[FieldOption("WEB-DL")]
WebDl = 6
}
public enum HdBitsOrigin
{
[FieldOption("Undefined")]
Undefined = 0,
[FieldOption("Internal")]
Internal = 1
}
}

View File

@@ -244,17 +244,17 @@ namespace NzbDrone.Core.Indexers.Definitions
if (Settings.SearchInDescription)
{
parameters.Add("tor[srchIn][description]", "true");
parameters.Set("tor[srchIn][description]", "true");
}
if (Settings.SearchInSeries)
{
parameters.Add("tor[srchIn][series]", "true");
parameters.Set("tor[srchIn][series]", "true");
}
if (Settings.SearchInFilenames)
{
parameters.Add("tor[srchIn][filenames]", "true");
parameters.Set("tor[srchIn][filenames]", "true");
}
var catList = Capabilities.Categories.MapTorznabCapsToTrackers(searchCriteria.Categories);
@@ -263,13 +263,28 @@ namespace NzbDrone.Core.Indexers.Definitions
var index = 0;
foreach (var cat in catList)
{
parameters.Add("tor[cat][" + index + "]", cat);
parameters.Set("tor[cat][" + index + "]", cat);
index++;
}
}
else
{
parameters.Add("tor[cat][]", "0");
parameters.Set("tor[cat][]", "0");
}
if (searchCriteria.MinSize is > 0)
{
parameters.Set("tor[minSize]", searchCriteria.MinSize.Value.ToString());
}
if (searchCriteria.MaxSize is > 0)
{
parameters.Set("tor[maxSize]", searchCriteria.MaxSize.Value.ToString());
}
if (searchCriteria.MinSize is > 0 || searchCriteria.MaxSize is > 0)
{
parameters.Set("tor[unit]", "1");
}
var searchUrl = Settings.BaseUrl + "tor/js/loadSearchJSONbasic.php";
@@ -394,6 +409,8 @@ namespace NzbDrone.Core.Indexers.Definitions
release.Title = item.Title;
release.Description = item.Description;
release.BookTitle = item.Title;
if (item.AuthorInfo != null)
{
var authorInfo = JsonConvert.DeserializeObject<Dictionary<string, string>>(item.AuthorInfo);
@@ -402,6 +419,7 @@ namespace NzbDrone.Core.Indexers.Definitions
if (author.IsNotNullOrWhiteSpace())
{
release.Title += " by " + author;
release.Author = author;
}
}

View File

@@ -426,7 +426,7 @@ namespace NzbDrone.Core.Indexers.Definitions
[FieldDefinition(3, Label = "Use Freeleech Tokens", Type = FieldType.Checkbox, HelpText = "Use freeleech tokens when available")]
public bool UseFreeleechToken { get; set; }
[FieldDefinition(4, Label = "Freeload Only", Type = FieldType.Checkbox, Advanced = true, HelpTextWarning = "Search freeload torrents only. End date: 6 January 2024, 23:59 UTC.")]
[FieldDefinition(4, Label = "Freeload Only", Type = FieldType.Checkbox, Advanced = true, HelpTextWarning = "Search freeload torrents only. End date: 31 January 2024, 23:59 UTC.")]
public bool FreeloadOnly { get; set; }
public override NzbDroneValidationResult Validate()

View File

@@ -1,3 +1,4 @@
using System;
using System.Linq;
using System.Text.RegularExpressions;
using FluentValidation;
@@ -10,10 +11,7 @@ namespace NzbDrone.Core.Indexers.Torznab
{
public class TorznabSettingsValidator : AbstractValidator<TorznabSettings>
{
private static readonly string[] ApiKeyWhiteList =
{
"hd4free.xyz",
};
private static readonly string[] ApiKeyWhiteList = Array.Empty<string>();
private static bool ShouldHaveApiKey(TorznabSettings settings)
{

View File

@@ -733,7 +733,7 @@ namespace NzbDrone.Core.Indexers
}
catch (WebException webException)
{
_logger.Warn("Unable to connect to indexer.");
_logger.Warn(webException, "Unable to connect to indexer.");
if (webException.Status is WebExceptionStatus.NameResolutionFailure or WebExceptionStatus.ConnectFailure)
{

View File

@@ -1,5 +1,5 @@
{
"Add": "Afegiu",
"Add": "Afegeix",
"Actions": "Accions",
"AcceptConfirmationModal": "Accepta el modal de confirmació",
"About": "Quant a",
@@ -19,7 +19,7 @@
"ScriptPath": "Camí de l'script",
"Search": "Cerca",
"Files": "Fitxers",
"SettingsEnableColorImpairedModeHelpText": "Estil alternat per permetre als usuaris amb problemes de color distingir millor la informació codificada per colors",
"SettingsEnableColorImpairedModeHelpText": "Estil alternat per a permetre als usuaris amb problemes de color distingir millor la informació codificada per colors",
"TagIsNotUsedAndCanBeDeleted": "L'etiqueta no està en ús i es pot suprimir",
"TagsSettingsSummary": "Consulta totes les etiquetes i com s'utilitzen. Les etiquetes no utilitzades es poden eliminar",
"Tasks": "Tasques",
@@ -33,11 +33,11 @@
"AddDownloadClient": "Afegeix un client de descàrrega",
"Added": "Afegit",
"Age": "Edat",
"All": "Tots",
"All": "Tot",
"Analytics": "Anàlisi",
"ApiKey": "Clau API",
"AppDataDirectory": "Directori AppData",
"AppDataLocationHealthCheckMessage": "No es podrà actualitzar per evitar que s'eliminin AppData a l'actualització",
"AppDataLocationHealthCheckMessage": "No es podrà actualitzar per a evitar que s'eliminin AppData a l'actualització",
"Authentication": "Autenticació",
"Torrents": "Torrents",
"Type": "Tipus",
@@ -78,7 +78,7 @@
"Reddit": "Reddit",
"System": "Sistema",
"Username": "Nom d'usuari",
"Duration": "durada",
"Duration": "Durada",
"EditIndexer": "Edita l'indexador",
"EnableAutomaticSearch": "Activa la cerca automàtica",
"Enabled": "Habilitat",
@@ -143,7 +143,7 @@
"SettingsShortDateFormat": "Format de data curta",
"BindAddress": "Adreça d'enllaç",
"Database": "Base de dades",
"Ended": "S'ha acabat",
"Ended": "Acabat",
"SettingsTimeFormat": "Format horari",
"YesCancel": "Si, cancel·la",
"Automatic": "Automàtic",
@@ -170,9 +170,9 @@
"Dates": "Dates",
"DBMigration": "Migració de BD",
"Delete": "Suprimeix",
"DeleteNotificationMessageText": "Esteu segur que voleu suprimir la notificació '{0}'?",
"DeleteNotificationMessageText": "Esteu segur que voleu suprimir la notificació '{name}'?",
"DeleteTag": "Suprimeix l'etiqueta",
"DeleteTagMessageText": "Esteu segur que voleu suprimir l'etiqueta '{0}'?",
"DeleteTagMessageText": "Esteu segur que voleu suprimir l'etiqueta '{label}'?",
"Details": "Detalls",
"Disabled": "Desactivat",
"DownloadClientStatusCheckAllClientMessage": "Tots els clients de descàrrega no estan disponibles a causa d'errors",
@@ -251,7 +251,7 @@
"Level": "Nivell",
"LogFiles": "Fitxers de registre",
"Logging": "Registre",
"MappedDrivesRunningAsService": "Les unitats de xarxa assignades no estan disponibles quan s'executen com a servei de Windows. Si us plau, consulteu les PMF per obtenir més informació",
"MappedDrivesRunningAsService": "Les unitats de xarxa assignades no estan disponibles quan s'executen com a servei de Windows. Si us plau, consulteu les PMF per a obtenir més informació",
"Mechanism": "Mecanisme",
"MIA": "MIA",
"Wiki": "Wiki",
@@ -260,9 +260,9 @@
"Branch": "Branca",
"Connections": "Connexions",
"ConnectSettings": "Configuració de connexió",
"DeleteBackupMessageText": "Esteu segur que voleu suprimir la còpia de seguretat '{0}'?",
"DeleteBackupMessageText": "Esteu segur que voleu suprimir la còpia de seguretat '{name}'?",
"DeleteDownloadClient": "Suprimeix el client de descàrrega",
"DeleteDownloadClientMessageText": "Esteu segur que voleu suprimir el client de baixada '{0}'?",
"DeleteDownloadClientMessageText": "Esteu segur que voleu suprimir el client de baixada '{name}'?",
"Discord": "Discord",
"Docker": "Docker",
"Donations": "Donacions",
@@ -300,10 +300,10 @@
"View": "Visualitza",
"Yesterday": "Ahir",
"ApplicationStatusCheckSingleClientMessage": "Llistes no disponibles a causa d'errors: {0}",
"AnalyticsEnabledHelpText": "Envieu informació anònima d'ús i errors als servidors de {appName}. Això inclou informació sobre el vostre navegador, quines pàgines {appName} WebUI feu servir, informes d'errors, així com el sistema operatiu i la versió del temps d'execució. Utilitzarem aquesta informació per prioritzar les funcions i les correccions d'errors.",
"AnalyticsEnabledHelpText": "Envieu informació anònima d'ús i errors als servidors de {appName}. Això inclou informació sobre el vostre navegador, quines pàgines {appName} WebUI feu servir, informes d'errors, així com el sistema operatiu i la versió de l'entorn d'execució. Utilitzarem aquesta informació per a prioritzar les funcions i les correccions d'errors.",
"HistoryCleanupDaysHelpTextWarning": "Els fitxers de la paperera de reciclatge més antics que el nombre de dies seleccionat es netejaran automàticament",
"UnableToAddANewAppProfilePleaseTryAgain": "No es pot afegir un perfil de qualitat nou, torneu-ho a provar.",
"BackupFolderHelpText": "Els camins relatius estaran sota el directori AppData del {appName}",
"BackupFolderHelpText": "Els camins relatius estaran sota el directori AppData de {appName}",
"AllIndexersHiddenDueToFilter": "Totes les pel·lícules estan ocultes a causa del filtre aplicat.",
"EnableRss": "Activa RSS",
"Grabs": "Captura",
@@ -312,11 +312,11 @@
"Application": "Aplicacions",
"Applications": "Aplicacions",
"ApplicationStatusCheckAllClientMessage": "Totes les llistes no estan disponibles a causa d'errors",
"AuthenticationMethodHelpText": "Requereix nom d'usuari i contrasenya per accedir al radar",
"AuthenticationMethodHelpText": "Es requereix nom d'usuari i contrasenya per a accedir a {appName}",
"ApplicationLongTermStatusCheckAllClientMessage": "Tots els indexadors no estan disponibles a causa d'errors durant més de 6 hores",
"ApplicationLongTermStatusCheckSingleClientMessage": "Els indexadors no estan disponibles a causa d'errors durant més de 6 hores: {0}",
"BindAddressHelpText": "Adreça IP vàlida, localhost o '*' per a totes les interfícies",
"BranchUpdate": "Branca que s'utilitza per actualitzar {appName}",
"BranchUpdate": "Branca que s'utilitza per a actualitzar {appName}",
"Connect": "Notificacions",
"DeleteApplicationMessageText": "Esteu segur que voleu suprimir la notificació '{0}'?",
"DeleteIndexerProxyMessageText": "Esteu segur que voleu suprimir la llista '{0}'?",
@@ -347,15 +347,15 @@
"ApplicationUrlHelpText": "URL extern d'aquesta aplicació, inclòs http(s)://, port i URL base",
"ApplyTagsHelpTextAdd": "Afegeix: afegeix les etiquetes a la llista d'etiquetes existent",
"ApplyTagsHelpTextHowToApplyApplications": "Com aplicar etiquetes a les pel·lícules seleccionades",
"ApplyTagsHelpTextHowToApplyIndexers": "Com aplicar etiquetes a les pel·lícules seleccionades",
"ApplyTagsHelpTextHowToApplyIndexers": "Com aplicar etiquetes als indexadors seleccionats",
"ApplyTagsHelpTextRemove": "Eliminar: elimina les etiquetes introduïdes",
"DeleteSelectedApplicationsMessageText": "Esteu segur que voleu suprimir l'indexador '{0}'?",
"Label": "Etiqueta",
"ApplyTagsHelpTextReplace": "Substituïu: substituïu les etiquetes per les etiquetes introduïdes (no introduïu cap etiqueta per esborrar totes les etiquetes)",
"DeleteSelectedDownloadClients": "Suprimeix el client de descàrrega",
"ApplyTagsHelpTextReplace": "Substitució: substituïu les etiquetes per les etiquetes introduïdes (no introduïu cap etiqueta per a esborrar totes les etiquetes)",
"DeleteSelectedDownloadClients": "Suprimeix el(s) client(s) de baixada",
"Genre": "Gèneres",
"DeleteSelectedDownloadClientsMessageText": "Esteu segur que voleu suprimir l'indexador '{0}'?",
"DeleteSelectedIndexersMessageText": "Esteu segur que voleu suprimir l'indexador '{0}'?",
"DeleteSelectedDownloadClientsMessageText": "Esteu segur que voleu suprimir {count} client(s) de baixada seleccionat(s)?",
"DeleteSelectedIndexersMessageText": "Esteu segur que voleu suprimir {count} indexador(s) seleccionat(s)?",
"DownloadClientPriorityHelpText": "Prioritzeu diversos clients de baixada. S'utilitza round-robin per a clients amb la mateixa prioritat.",
"More": "Més",
"Season": "temporada",
@@ -363,19 +363,67 @@
"Track": "Traça",
"Year": "Any",
"UpdateAvailable": "Nova actualització disponible",
"ConnectionLostReconnect": "Radarr intentarà connectar-se automàticament, o podeu fer clic a recarregar.",
"ConnectionLostToBackend": "Radarr ha perdut la connexió amb el backend i s'haurà de tornar a carregar per restaurar la funcionalitat.",
"ConnectionLostReconnect": "{appName} intentarà connectar-se automàticament, o podeu fer clic a recarregar.",
"ConnectionLostToBackend": "{appName} ha perdut la connexió amb el backend i s'haurà de tornar a carregar per a restaurar la funcionalitat.",
"RecentChanges": "Canvis recents",
"WhatsNew": "Que hi ha de nou?",
"minutes": "Minuts",
"DeleteAppProfileMessageText": "Esteu segur que voleu suprimir el perfil de qualitat {0}",
"NotificationStatusSingleClientHealthCheckMessage": "Llistes no disponibles a causa d'errors: {0}",
"AddConnection": "Edita la col·lecció",
"NotificationStatusAllClientHealthCheckMessage": "Totes les llistes no estan disponibles a causa d'errors",
"AddConnection": "Afegeix una connexió",
"NotificationStatusAllClientHealthCheckMessage": "Totes les notificacions no estan disponibles a causa d'errors",
"AuthBasic": "Basic (finestra emergent del navegador)",
"AuthForm": "Formularis (pàgina d'inici de sessió)",
"DisabledForLocalAddresses": "Desactivat per a adreces locals",
"None": "Cap",
"ResetAPIKeyMessageText": "Esteu segur que voleu restablir la clau de l'API?",
"RestartProwlarr": "Reinicia {appName}"
"RestartProwlarr": "Reinicia {appName}",
"AuthenticationRequired": "Autenticació necessària",
"CountDownloadClientsSelected": "{count} client(s) de baixada seleccionat(s)",
"NoDownloadClientsFound": "No s'han trobat clients de baixada",
"AuthenticationRequiredWarning": "Per a evitar l'accés remot sense autenticació, ara {appName} requereix que l'autenticació estigui activada. Opcionalment, podeu desactivar l'autenticació des d'adreces locals.",
"AppUpdatedVersion": "{appName} s'ha actualitzat a la versió `{version}`, per tal d'obtenir els darrers canvis, haureu de tornar a carregar {appName}",
"AppUpdated": "{appName} Actualitzada",
"ApplyChanges": "Aplica els canvis",
"Implementation": "Implementació",
"OnHealthRestored": "Al resoldre les incidències",
"ManageDownloadClients": "Gestiona els clients de descàrrega",
"AuthenticationRequiredHelpText": "Canvia per a quines sol·licituds cal autenticar. No canvieu tret que entengueu els riscos.",
"CountIndexersSelected": "S'han seleccionat {count} indexador(s)",
"EditDownloadClientImplementation": "Edita el client de baixada - {implementationName}",
"EditIndexerImplementation": "Edita l'indexador - {implementationName}",
"EditSelectedDownloadClients": "Editeu els clients de descàrrega seleccionats",
"EditSelectedIndexers": "Edita els indexadors seleccionats",
"IndexerDownloadClientHealthCheckMessage": "Indexadors amb clients de baixada no vàlids: {0}.",
"AddCustomFilter": "Afegeix un filtre personalitzat",
"AddDownloadClientImplementation": "Afegeix un client de descàrrega - {implementationName}",
"AddIndexerImplementation": "Afegeix un indexador - {implementationName}",
"AddConnectionImplementation": "Afegeix una connexió - {implementationName}",
"InvalidUILanguage": "La vostra IU està configurada en un idioma no vàlid, corregiu-lo i deseu la configuració",
"NoHistoryFound": "No s'ha trobat cap historial",
"NoIndexersFound": "No s'han trobat indexadors",
"OnHealthRestoredHelpText": "Al resoldre les incidències",
"AuthenticationMethod": "Mètode d'autenticació",
"AuthenticationMethodHelpTextWarning": "Seleccioneu un mètode d'autenticació vàlid",
"AuthenticationRequiredPasswordHelpTextWarning": "Introduïu una contrasenya nova",
"DefaultNameCopiedProfile": "{name} - Còpia",
"DownloadClientQbittorrentSettingsContentLayout": "Disseny de contingut",
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Si s'utilitza el disseny de contingut de qBittorrent s'utilitza el disseny original del torrent o es crea una subcarpeta (qBittorrent 4.3.2+)",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmeu la nova contrasenya",
"AuthenticationRequiredUsernameHelpTextWarning": "Introduïu un nom d'usuari nou",
"Categories": "Categories",
"ApiKeyValidationHealthCheckMessage": "Actualitzeu la vostra clau de l'API perquè tingui almenys {length} caràcters. Podeu fer-ho mitjançant la configuració o el fitxer de configuració",
"Episode": "episodi",
"EditApplicationImplementation": "Edita la notificació - {implementationName}",
"EditConnectionImplementation": "Afegeix una connexió - {implementationName}",
"EditIndexerProxyImplementation": "Edita l'indexador - {implementationName}",
"days": "dies",
"Album": "àlbum",
"Artist": "artista",
"AddApplicationImplementation": "Afegeix una condició - {implementationName}",
"AddIndexerProxyImplementation": "Afegeix un indexador - {implementationName}",
"Category": "Categoria",
"Clone": "Clona",
"Yes": "Si",
"No": "No"
}

View File

@@ -405,5 +405,6 @@
"AuthenticationRequiredPasswordHelpTextWarning": "Vložte nové heslo",
"AuthenticationRequiredUsernameHelpTextWarning": "Vložte nové uživatelské jméno",
"AuthenticationMethodHelpTextWarning": "Prosím vyberte platnou metodu ověřování",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Potvrďte nové heslo"
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Potvrďte nové heslo",
"days": "dnů"
}

View File

@@ -17,11 +17,11 @@
"Age": "Alter",
"All": "Alle",
"AllIndexersHiddenDueToFilter": "Alle Indexer sind durch den ausgewählten Filter ausgeblendet.",
"Analytics": "Analytik",
"AnalyticsEnabledHelpText": "Sende anonyme Nutzungs- und Fehlerinformationen an die Server von {appName}. Dazu gehören Informationen über Browser, welche Seiten der {appName}-Weboberfläche aufgerufen wurden, Fehlerberichte sowie Betriebssystem- und Laufzeitversion. Wir werden diese Informationen verwenden, um Funktionen und Fehlerbehebungen zu priorisieren.",
"Analytics": "Analysen",
"AnalyticsEnabledHelpText": "Senden Sie anonyme Nutzungs- und Fehlerinformationen an die Server von {appName}. Dazu gehören Informationen zu Ihrem Browser, welche {appName}-WebUI-Seiten Sie verwenden, Fehlerberichte sowie Betriebssystem- und Laufzeitversion. Wir werden diese Informationen verwenden, um Funktionen und Fehlerbehebungen zu priorisieren.",
"ApiKey": "API-Schlüssel",
"ApiKeyValidationHealthCheckMessage": "Bitte den API Schlüssel korrigieren, dieser muss mindestens {0} Zeichen lang sein. Die Änderung kann über die Einstellungen oder die Konfigurationsdatei erfolgen",
"AppDataDirectory": "AppData Ordner",
"AppDataDirectory": "AppData-Verzeichnis",
"AppDataLocationHealthCheckMessage": "Ein Update ist nicht möglich, um das Löschen von AppData beim Update zu verhindern",
"AppProfileInUse": "App-Profil im Einsatz",
"AppProfileSelectHelpText": "App-Profile werden verwendet, um die Einstellungen für RSS, automatische Suche und interaktive Suche bei der Anwendungssynchronisierung zu steuern",
@@ -33,53 +33,53 @@
"ApplicationStatusCheckSingleClientMessage": "Applikationen wegen folgender Fehler nicht verfügbar: {0}",
"Applications": "Anwendungen",
"Apply": "Anwenden",
"ApplyTags": "Tags setzen",
"ApplyTags": "Schlagworte anwenden",
"Apps": "Anwendungen",
"AudioSearch": "Audio Suche",
"Auth": "Authentifizierung",
"Authentication": "Authentifizierung",
"AuthenticationMethodHelpText": "Für den Zugriff auf {appName} sind Benutzername und Passwort erforderlich",
"AuthenticationMethodHelpText": "Für den Zugriff auf {appName} sind Benutzername und Passwort erforderlich.",
"Automatic": "Automatisch",
"AutomaticSearch": "Automatische Suche",
"Backup": "Backups",
"BackupFolderHelpText": "Relative Pfade befinden sich unter {appName}s AppData Ordner",
"BackupIntervalHelpText": "Intervall zum sichern der Datenbank und Einstellungen",
"Backup": "Sicherung",
"BackupFolderHelpText": "Relative Pfade befinden sich im AppData-Verzeichnis von {appName}",
"BackupIntervalHelpText": "Intervall zwischen automatischen Sicherungen",
"BackupNow": "Jetzt sichern",
"BackupRetentionHelpText": "Automatische Backups, die älter als die Aufbewahrungsfrist sind, werden automatisch gelöscht",
"BackupRetentionHelpText": "Automatische Backups, die älter als der Aufbewahrungszeitraum sind, werden automatisch bereinigt",
"Backups": "Sicherungen",
"BeforeUpdate": "Vor dem Update",
"BindAddress": "Adresse binden",
"BindAddressHelpText": "Gültige IP Adresse oder \"*\" für alle Netzwerke",
"BindAddressHelpText": "Gültige IP-Adresse, localhost oder „*“ für alle Schnittstellen",
"BookSearch": "Buch Suche",
"BookSearchTypes": "Buch-Suchtypen",
"Branch": "Git-Branch",
"Branch": "Branch",
"BranchUpdate": "Verwendeter Branch zur Aktualisierung von {appName}",
"BranchUpdateMechanism": "Git-Branch für den externen Updateablauf",
"BypassProxyForLocalAddresses": "Proxy für lokale Adressen umgehen",
"Cancel": "Abbrechen",
"CancelPendingTask": "Diese laufende Aufgabe wirklich abbrechen?",
"CancelPendingTask": "Möchten Sie diese ausstehende Aufgabe wirklich abbrechen?",
"Categories": "Kategorien",
"Category": "Kategorie",
"CertificateValidation": "Zertifikat Validierung",
"CertificateValidation": "Zertifikatsvalidierung",
"CertificateValidationHelpText": "Ändere wie streng die Validierung der HTTPS-Zertifizierung ist",
"ChangeHasNotBeenSavedYet": "Änderung wurde noch nicht gespeichert",
"Clear": "Leeren",
"ClearHistory": "Verlauf leeren",
"ClearHistoryMessageText": "Wirklich den ganzen {appName} Verlauf löschen?",
"ClientPriority": "Priorität",
"CloneProfile": "Profil kopieren",
"CloneProfile": "Profil klonen",
"Close": "Schließen",
"CloseCurrentModal": "Momentanes Modal schließen",
"Columns": "Spalten",
"Component": "Komponente",
"Connect": "Benachrichtigungen",
"ConnectSettings": "Eintellungen für Verbindungen",
"ConnectSettings": "Verbindungseinstellungen",
"ConnectSettingsSummary": "Benachrichtigungen und eigene Scripte",
"ConnectionLost": "Verbindung unterbrochen",
"Connections": "Verbindungen",
"CouldNotConnectSignalR": "Es konnte keine Verbindung zu SignalR hergestellt werden, die Benutzeroberfläche wird nicht aktualisiert",
"Custom": "Benutzerdefiniert",
"CustomFilters": "Eigene Filter",
"CustomFilters": "Benutzerdefinierte Filter",
"DBMigration": "DB Migration",
"Database": "Datenbank",
"Date": "Datum",
@@ -88,24 +88,24 @@
"DeleteAppProfile": "App-Profil löschen",
"DeleteApplication": "Applikation löschen",
"DeleteApplicationMessageText": "Wirklich die Applikation '{0}' löschen?",
"DeleteBackup": "Backup löschen",
"DeleteBackupMessageText": "Backup '{0}' wirkich löschen?",
"DeleteDownloadClient": "Downloader löschen",
"DeleteDownloadClientMessageText": "Downloader '{0}' wirklich löschen?",
"DeleteBackup": "Sicherung löschen",
"DeleteBackupMessageText": "Sind Sie sicher, dass Sie die Sicherung „{name}“ löschen möchten?",
"DeleteDownloadClient": "Download-Client löschen",
"DeleteDownloadClientMessageText": "Sind Sie sicher, dass Sie den Download-Client „{name}“ löschen möchten?",
"DeleteIndexerProxy": "Indexer Proxy löschen",
"DeleteIndexerProxyMessageText": "Tag '{0}' wirklich löschen?",
"DeleteNotification": "Benachrichtigung löschen",
"DeleteNotificationMessageText": "Benachrichtigung '{0}' wirklich löschen?",
"DeleteNotificationMessageText": "Sind Sie sicher, dass Sie die Benachrichtigung „{name}“ löschen möchten?",
"DeleteTag": "Tag löschen",
"DeleteTagMessageText": "Tag '{0}' wirklich löschen?",
"DeleteTagMessageText": "Sind Sie sicher, dass Sie das Tag „{label}“ löschen möchten?",
"Description": "Beschreibung",
"Details": "Details",
"Details": "Einzelheiten",
"DevelopmentSettings": "Entwicklungseinstellungen",
"Disabled": "Deaktiviert",
"Discord": "Discord",
"Docker": "Docker",
"Donations": "Spenden",
"DownloadClient": "Downloader",
"DownloadClient": "Download Client",
"DownloadClientSettings": "Downloader Einstellungen",
"DownloadClientStatusCheckAllClientMessage": "Alle Download Clients sind aufgrund von Fehlern nicht verfügbar",
"DownloadClientStatusCheckSingleClientMessage": "Download Clients aufgrund von Fehlern nicht verfügbar: {0}",
@@ -307,17 +307,17 @@
"Reload": "Neuladen",
"Remove": "Entfernen",
"RemoveFilter": "Filter entfernen",
"RemovedFromTaskQueue": "Aus der Aufgabenwarteschlage entfernt",
"RemovedFromTaskQueue": "Aus der Aufgabenwarteschlange entfernt",
"RemovingTag": "Tag entfernen",
"Replace": "Ersetzen",
"Reset": "Zurücksetzen",
"ResetAPIKey": "API-Schlüssel zurücksetzen",
"Restart": "Neustarten",
"Restart": "Neu starten",
"RestartNow": "Jetzt neustarten",
"RestartProwlarr": "{appName} Neustarten",
"RestartRequiredHelpTextWarning": "Erfordert einen Neustart",
"RestartRequiredHelpTextWarning": "Erfordert einen Neustart, damit die Aktion wirksam wird",
"Restore": "Wiederherstellen",
"RestoreBackup": "Backup einspielen",
"RestoreBackup": "Sicherung wiederherstellen",
"Result": "Ergebnis",
"Retention": "Aufbewahrung ( Retention )",
"SSLCertPassword": "SSL Zertifikat Passwort",
@@ -339,8 +339,8 @@
"Seeders": "Seeders",
"SelectAll": "Alle wählen",
"SemiPrivate": "Halbprivat",
"SendAnonymousUsageData": "Anonyme Nutzungsdaten übertragen",
"SetTags": "Tags setzen",
"SendAnonymousUsageData": "Sende anonyme Nutzungsdaten",
"SetTags": "Tags festlegen",
"Settings": "Einstellungen",
"SettingsConsoleLogLevel": "Konsolen Log Level",
"SettingsEnableColorImpairedMode": "Farbbeeinträchtigter Modus aktivieren",
@@ -358,7 +358,7 @@
"SettingsShowRelativeDatesHelpText": "Relatives (z.B.: Heute, gestern, etc) oder absolutes Datum anzeigen",
"SettingsSqlLoggingHelpText": "Log alle SQL Abfragen von {appName}",
"SettingsTimeFormat": "Zeitformat",
"ShowAdvanced": "Einfache Ansicht",
"ShowAdvanced": "Erweitert anzeigen",
"ShowSearch": "Suche anzeigen",
"ShowSearchHelpText": "Suchbutton anzeigen beim draufzeigen",
"Shutdown": "Herunterfahren",
@@ -366,7 +366,7 @@
"Sort": "Sortieren",
"Source": "Quelle",
"StartTypingOrSelectAPathBelow": "Eingeben oder unten auswählen",
"Started": "gestartet",
"Started": "Gestartet",
"StartupDirectory": "Start-Verzeichnis",
"Stats": "Statistiken",
"Status": "Status",
@@ -387,13 +387,13 @@
"TagIsNotUsedAndCanBeDeleted": "Tag wird nicht benutzt und kann gelöscht werden",
"Tags": "Tags",
"TagsHelpText": "Wird auf Filme mit mindestens einem passenden Tag angewandt",
"TagsSettingsSummary": "Alle Tags und deren Benutzung anzeigen. Unbenutzte Tags können entfernt werden",
"TagsSettingsSummary": "Sehen Sie sich alle Tags und deren Verwendung an. Nicht verwendete Tags können entfernt werden",
"Tasks": "Aufgaben",
"Test": "Testen",
"TestAll": "Alle testen",
"Test": "Prüfen",
"TestAll": "Alle prüfen",
"TestAllApps": "Alle Apps testen",
"TestAllClients": "Alle testen",
"TestAllIndexers": "Alle testen",
"TestAllClients": "Prüfe alle Clients",
"TestAllIndexers": "Prüfe alle Indexer",
"TheLatestVersionIsAlreadyInstalled": "Die aktuellste Version ist bereits installiert",
"ThemeHelpText": "Ändere das UI-Theme der Anwendung. Das 'Auto'-Theme verwendet dein Betriebssystem-Theme, um den hellen oder dunklen Modus einzustellen. Inspiriert von {0}",
"Time": "Zeit",
@@ -419,7 +419,7 @@
"UnableToAddANewNotificationPleaseTryAgain": "Die neue Benachrichtigung konnte nicht hinzugefügt werden, bitte erneut probieren.",
"UnableToLoadAppProfiles": "App-Profile können nicht geladen werden",
"UnableToLoadApplicationList": "Anwendungsliste kann nicht geladen werden",
"UnableToLoadBackups": "Backups konnten nicht geladen werden",
"UnableToLoadBackups": "Sicherungen können nicht geladen werden",
"UnableToLoadDevelopmentSettings": "Entwicklereinstellungen konnten nicht geladen werden",
"UnableToLoadDownloadClients": "Downloader konnten nicht geladen werden",
"UnableToLoadGeneralSettings": "Allgemeine Einstellungen konnten nicht geladen werden",
@@ -429,41 +429,41 @@
"UnableToLoadNotifications": "Benachrichtigungen konnten nicht geladen werden",
"UnableToLoadTags": "Tags konnten nicht geladen werden",
"UnableToLoadUISettings": "Oberflächen Einstellungen konnten nicht geladen werden",
"UnsavedChanges": "Ungespeicherte Änderungen",
"UnselectAll": "Keine wählen",
"UpdateAutomaticallyHelpText": "Updates automatisch herunteraden und installieren. Es kann weiterhin unter \"System -> Updates\" ein manuelles Update angestoßen werden",
"UnsavedChanges": "Nicht gespeicherte Änderungen",
"UnselectAll": "Alle abwählen",
"UpdateAutomaticallyHelpText": "Updates automatisch herunterladen und installieren. Sie können weiterhin über System: Updates installieren",
"UpdateCheckStartupNotWritableMessage": "Update kann nicht installiert werden, da der Startordner '{0}' vom Benutzer '{1}' nicht beschreibbar ist.",
"UpdateCheckStartupTranslocationMessage": "Update kann nicht installiert werden, da sich der Startordner '{0}' in einem App Translocation-Ordner befindet.",
"UpdateCheckUINotWritableMessage": "Update kann nicht installiert werden, da der Benutzeroberflächenordner '{0}' vom Benutzer '{1}' nicht beschreibbar ist.",
"UpdateMechanismHelpText": "Benutze {appName}'s Built-In Updater oder ein Script",
"UpdateMechanismHelpText": "Verwenden Sie den integrierten Updater von {appName} oder ein Skript",
"UpdateScriptPathHelpText": "Pfad zu einem benutzerdefinierten Skript, das ein extrahiertes Update-Paket übernimmt und den Rest des Update-Prozesses abwickelt",
"Updates": "Updates",
"Uptime": "Laufzeit",
"Updates": "Aktualisierung",
"Uptime": "Betriebszeit",
"Url": "Url",
"UrlBaseHelpText": "Für Reverse-Proxy-Unterstützung. Die Standardeinstellung leer",
"UseProxy": "Proxy benutzen",
"UrlBaseHelpText": "Für die Reverse-Proxy-Unterstützung ist der Standardwert leer",
"UseProxy": "Verwende Proxy",
"Usenet": "Usenet",
"UserAgentProvidedByTheAppThatCalledTheAPI": "UserAgent von der App welcher die API aufgerufen hat",
"Username": "Benutzername",
"Username": "Nutzername",
"Version": "Version",
"View": "Ansicht",
"Warn": "Warnung",
"Warn": "Achtung",
"Website": "Webseite",
"Wiki": "Wiki",
"Yes": "Ja",
"YesCancel": "Ja, abbrechen",
"YesCancel": "Ja Abbrechen",
"Yesterday": "Gestern",
"OnHealthRestoredHelpText": "Bei Wiederherstellung des Zustands",
"OnHealthRestored": "Bei Wiederherstellung des Zustands",
"StopSelecting": "Auswahl stoppen",
"ApplicationURL": "Anwendungs-URL",
"ApplicationUrlHelpText": "Die externe URL der Anwendung inklusive http(s)://, Port und URL-Basis",
"ApplicationUrlHelpText": "Die externe URL dieser Anwendung, einschließlich http(s)://, Port und URL-Basis",
"ApplyChanges": "Änderungen anwenden",
"CountIndexersSelected": "{0} Indexer ausgewählt",
"CountIndexersSelected": "{count} Indexer ausgewählt",
"DeleteSelectedDownloadClients": "Lösche Download Client(s)",
"DeleteSelectedApplicationsMessageText": "Indexer '{0}' wirklich löschen?",
"DeleteSelectedDownloadClientsMessageText": "Indexer '{0}' wirklich löschen?",
"DeleteSelectedIndexersMessageText": "Indexer '{0}' wirklich löschen?",
"DeleteSelectedDownloadClientsMessageText": "Sind Sie sicher, dass Sie {count} ausgewählte Download-Clients löschen möchten?",
"DeleteSelectedIndexersMessageText": "Sind Sie sicher, dass Sie {count} ausgewählte(n) Indexer löschen möchten?",
"EditSelectedDownloadClients": "Ausgewählte Download Clienten bearbeiten",
"Implementation": "Integration",
"ManageDownloadClients": "Verwalte Download Clienten",
@@ -471,11 +471,11 @@
"NoIndexersFound": "Keine Indexer gefunden",
"Theme": "Design",
"Season": "Staffel",
"ApplyTagsHelpTextAdd": "Hinzufügen: Füge neu Tags zu den existierenden Tags hinzu",
"ApplyTagsHelpTextAdd": "Hinzufügen: Fügen Sie die Tags der vorhandenen Tag-Liste hinzu",
"ApplyTagsHelpTextHowToApplyApplications": "Wie werden Tags zu ausgewählten Autoren zugeteilt",
"ApplyTagsHelpTextHowToApplyIndexers": "Wie werden Tags zu ausgewählten Indexern zugeteilt",
"ApplyTagsHelpTextRemove": "Entfernen: Eingegebene Tags entfernen",
"ApplyTagsHelpTextReplace": "Ersetzen: Nur eingegebene Tags übernehmen und vorhandene entfernen( keine Tags eingeben um alle zu entfernen )",
"ApplyTagsHelpTextHowToApplyIndexers": "So wenden Sie Tags auf die ausgewählten Indexer an",
"ApplyTagsHelpTextRemove": "Entfernen: Die eingegebenen Tags entfernen",
"ApplyTagsHelpTextReplace": "Ersetzen: Ersetzen Sie die Tags durch die eingegebenen Tags (geben Sie keine Tags ein, um alle Tags zu löschen).",
"DownloadClientPriorityHelpText": "Priorisiere mehrere Downloader. Rundlauf-Verfahren wird für Downloader mit der gleichen Priorität verwendet.",
"EditSelectedIndexers": "Ausgewähle Indexer bearbeiten",
"SelectIndexers": "Indexer suchen",
@@ -491,20 +491,20 @@
"Artist": "Künstler",
"Author": "Autor",
"Book": "Buch",
"ConnectionLostReconnect": "Radarr wird automatisch versuchen zu verbinden oder klicke unten auf neuladen.",
"ConnectionLostToBackend": "Radarr hat die Verbindung zum Backend verloren und muss neugeladen werden.",
"ConnectionLostReconnect": "{appName} wird versuchen, automatisch eine Verbindung herzustellen, oder Sie können unten auf „Neu laden“ klicken.",
"ConnectionLostToBackend": "{appName} hat die Verbindung zum Backend verloren und muss neu geladen werden, um die Funktionalität wiederherzustellen.",
"RecentChanges": "Kürzliche Änderungen",
"WhatsNew": "Was gibt's Neues?",
"WhatsNew": "Was ist neu?",
"minutes": "Minuten",
"DeleteAppProfileMessageText": "Qualitätsprofil '{0}' wirklich löschen?",
"AddConnection": "Verbindung hinzufügen",
"NotificationStatusAllClientHealthCheckMessage": "Wegen Fehlern sind keine Applikationen verfügbar",
"NotificationStatusSingleClientHealthCheckMessage": "Applikationen wegen folgender Fehler nicht verfügbar: {0}",
"AuthBasic": "Einfach (Browser Popup)",
"AuthForm": "Formular (Login Seite)",
"DisabledForLocalAddresses": "Für Lokale Adressen deaktivieren",
"AuthBasic": "Basis (Browser-Popup)",
"AuthForm": "Formulare (Anmeldeseite)",
"DisabledForLocalAddresses": "Für lokale Adressen deaktiviert",
"None": "Keine",
"ResetAPIKeyMessageText": "Bist du sicher, dass du den API-Schlüssel zurücksetzen willst?",
"ResetAPIKeyMessageText": "Sind Sie sicher, dass Sie Ihren API-Schlüssel zurücksetzen möchten?",
"AddCustomFilter": "Eigenen Filter hinzufügen",
"AddApplication": "Application hinzufügen",
"AddCategory": "Kategorie hinzufügen",
@@ -532,5 +532,15 @@
"AuthenticationRequiredUsernameHelpTextWarning": "Gib einen neuen Benutzernamen ein",
"AuthenticationMethodHelpTextWarning": "Bitte wähle eine gültige Authentifizierungsmethode aus",
"AuthenticationRequiredPasswordHelpTextWarning": "Gib ein neues Passwort ein",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Neues Passwort bestätigen"
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Neues Passwort bestätigen",
"DefaultNameCopiedProfile": "{Name} Kopieren",
"AuthenticationMethod": "Authentifizierungsmethode",
"Clone": "Klonen",
"CountDownloadClientsSelected": "{count} Download-Client(s) ausgewählt",
"EditConnectionImplementation": "Verbindung hinzufügen - {implementationName}",
"EditDownloadClientImplementation": "Download-Client hinzufügen - {implementationName}",
"IndexerTagsHelpTextWarning": "Tags sollten mit Vorsicht verwendet werden, da sie ungewollte Effekte haben können. Eine Anwendung mit einem Tag synchronisiert nur Indexer die den Gleichen Tag haben.",
"EditIndexerImplementation": "Indexer hinzufügen - {implementationName}",
"EditApplicationImplementation": "Anwendung hinzufügen - {implementationName}",
"EditIndexerProxyImplementation": "Indexer Proxy hinzufügen - {implementationName}"
}

View File

@@ -171,8 +171,11 @@
"Docker": "Docker",
"Donations": "Donations",
"DownloadClient": "Download Client",
"DownloadClientAriaSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Aria2 location",
"DownloadClientCategory": "Download Client Category",
"DownloadClientPriorityHelpText": "Prioritize multiple Download Clients. Round-Robin is used for clients with the same priority.",
"DownloadClientQbittorrentSettingsContentLayout": "Content Layout",
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Whether to use qBittorrent's configured content layout, the original layout from the torrent or always create a subfolder (qBittorrent 4.3.2+)",
"DownloadClientSettings": "Download Client Settings",
"DownloadClientStatusCheckAllClientMessage": "All download clients are unavailable due to failures",
"DownloadClientStatusCheckSingleClientMessage": "Download clients unavailable due to failures: {0}",
@@ -198,7 +201,7 @@
"EnableInteractiveSearch": "Enable Interactive Search",
"EnableInteractiveSearchHelpText": "Will be used when interactive search is used",
"EnableRss": "Enable RSS",
"EnableRssHelpText": "Enable Rss feed for Indexer",
"EnableRssHelpText": "Enable RSS feed for Indexer",
"EnableSSL": "Enable SSL",
"EnableSslHelpText": " Requires restart running as administrator to take effect",
"Enabled": "Enabled",
@@ -246,7 +249,7 @@
"HomePage": "Home Page",
"Host": "Host",
"Hostname": "Hostname",
"Id": "Id",
"Id": "ID",
"IgnoredAddresses": "Ignored Addresses",
"IllRestartLater": "I'll restart later",
"Implementation": "Implementation",
@@ -264,6 +267,7 @@
"IndexerFlags": "Indexer Flags",
"IndexerHealthCheckNoIndexers": "No indexers enabled, {appName} will not return search results",
"IndexerHistoryLoadError": "Error loading indexer history",
"IndexerId": "Indexer ID",
"IndexerInfo": "Indexer Info",
"IndexerLongTermStatusCheckAllClientMessage": "All indexers are unavailable due to failures for more than 6 hours",
"IndexerLongTermStatusCheckSingleClientMessage": "Indexers unavailable due to failures for more than 6 hours: {0}",
@@ -277,7 +281,7 @@
"IndexerProxyStatusCheckAllClientMessage": "All proxies are unavailable due to failures",
"IndexerProxyStatusCheckSingleClientMessage": "Proxies unavailable due to failures: {0}",
"IndexerQuery": "Indexer Query",
"IndexerRss": "Indexer Rss",
"IndexerRss": "Indexer RSS",
"IndexerSettingsSummary": "Configure various global Indexer settings including Proxies.",
"IndexerSite": "Indexer Site",
"IndexerStatus": "Indexer Status",

View File

@@ -13,7 +13,7 @@
"DownloadClientStatusCheckSingleClientMessage": "Gestores de descargas no disponibles debido a errores: {0}",
"DownloadClientStatusCheckAllClientMessage": "Los gestores de descargas no están disponibles debido a errores",
"DownloadClients": "Gestores de Descargas",
"Delete": "Borrar",
"Delete": "Eliminar",
"Dates": "Fechas",
"Date": "Fecha",
"CustomFilters": "Filtros Personalizados",
@@ -137,7 +137,7 @@
"DeleteTag": "Borrar Etiqueta",
"DeleteNotification": "Borrar Notificación",
"DeleteDownloadClient": "Borrar Gestor de Descargas",
"DeleteBackup": "Borrar Backup",
"DeleteBackup": "Eliminar copia de seguridad",
"DBMigration": "Migración de DB",
"CloneProfile": "Clonar Perfil",
"ClientPriority": "Prioridad del Cliente",
@@ -320,7 +320,7 @@
"Filters": "Filtros",
"HistoryCleanupDaysHelpText": "Ajustar a 0 para desactivar la limpieza automática",
"HistoryCleanupDaysHelpTextWarning": "Los archivos en la papelera de reciclaje más antiguos que el número de días seleccionado serán limpiados automáticamente",
"OnGrab": "Al Capturar",
"OnGrab": "Al Capturar lanzamiento",
"OnHealthIssue": "En Problema de Salud",
"TestAllIndexers": "Comprobar Todos los Indexers",
"NotificationTriggersHelpText": "Seleccione qué eventos deben activar esta notificación",
@@ -351,7 +351,7 @@
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent proporcionado por la aplicación llamó a la API",
"InstanceName": "Nombre de Instancia",
"InstanceNameHelpText": "Nombre de instancia en pestaña y para nombre de aplicación en Syslog",
"Database": "Base de Datos",
"Database": "Base de datos",
"Duration": "Duración",
"LastDuration": "Duración",
"LastExecution": "Última ejecución",
@@ -373,7 +373,7 @@
"Label": "Etiqueta",
"Theme": "Tema",
"ApplyTagsHelpTextAdd": "Añadir: Añadir a las etiquetas la lista existente de etiquetas",
"DeleteSelectedApplicationsMessageText": "Seguro que quieres eliminar el indexer '{0}'?",
"DeleteSelectedApplicationsMessageText": "¿Estás seguro que quieres eliminar {count} aplicación(es) seleccionada(s)?",
"DeleteSelectedDownloadClients": "Borrar Gestor de Descargas",
"DeleteSelectedIndexersMessageText": "¿Está seguro de querer eliminar {count} indexador(es) seleccionado(s)?",
"DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {count} cliente(s) de descarga seleccionado(s)?",
@@ -426,7 +426,7 @@
"EditIndexerProxyImplementation": "Agregar Condición - { implementationName}",
"AppUpdated": "{appName} Actualizada",
"AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitaras recargar {appName}",
"AddApplicationImplementation": "Agregar Condición - { implementationName}",
"AddApplicationImplementation": "Agregar aplicación - { implementationName}",
"AddConnectionImplementation": "Añadir Conexión - {implementationName}",
"AddIndexerImplementation": "Agregar Condición - { implementationName}",
"AddIndexerProxyImplementation": "Agregar Condición - { implementationName}",
@@ -460,10 +460,10 @@
"DeleteAppProfile": "Eliminar Perfil de Aplicación",
"AddSyncProfile": "Agregar Perfil de Sincronización",
"AppSettingsSummary": "Aplicaciones y configuraciones para determinar como {appName} interactúa con sus programas de PVR",
"AddCategory": "Agregar Categoría",
"AddCategory": "Agregar categoría",
"AppProfileSelectHelpText": "Los perfiles de la aplicación se usan para controlar la configuración por aplicación de RSS, Búsqueda Automática y Búsqueda Interactiva",
"ActiveApps": "Aplicaciones Activas",
"ActiveIndexers": "Indexadores Activos",
"ActiveApps": "Aplicaciones activas",
"ActiveIndexers": "Indexadores activos",
"AudioSearch": "Búsqueda de Música",
"Auth": "Autenticación",
"BasicSearch": "Búsqueda Básica",
@@ -492,5 +492,28 @@
"Id": "Id",
"EditCategory": "Editar categoría",
"EditSyncProfile": "Editar perfil de sincronización",
"EnableIndexer": "Habilitar indexador"
"EnableIndexer": "Habilitar indexador",
"InvalidUILanguage": "Su interfaz de usuario está configurada en un idioma no válido, corríjalo y guarde la configuración",
"DownloadClientQbittorrentSettingsContentLayout": "Diseño del contenido",
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Si usar el diseño de contenido configurado de qBittorrent, el diseño original del torrent o siempre crear una subcarpeta (qBittorrent 4.3.2+)",
"EnableRssHelpText": "Habilitar feed RSS para el indexador",
"days": "días",
"ElapsedTime": "Tiempo transcurrido",
"GrabTitle": "Capturar título",
"SearchAllIndexers": "Buscar en todos los Indexadores",
"Website": "Sitio web",
"Redirect": "Redirección",
"RssQueries": "Consultas RSS",
"SeedRatio": "Ratio de siembra",
"RssFeed": "Feed RSS",
"SearchType": "Tipo de búsqueda",
"RepeatSearch": "Repetir búsqueda",
"SeedRatioHelpText": "El ratio que un torrent debe alcanzar antes de detenerse, si está vacío se usará el valor por defecto",
"SeedTime": "Tiempo de siembra",
"SearchTypes": "Tipos de búsquedas",
"DeleteIndexerProxy": "Eliminar proxy indexador",
"OnGrabHelpText": "Al Capturar lanzamiento",
"SeedTimeHelpText": "El ratio que un torrent debe alcanzar antes de detenerse, si está vacío se usará el valor por defecto",
"IndexerTagsHelpTextWarning": "Las etiquetas deben utilizarse con cuidado, pueden tener efectos involuntarios. Una aplicación con una etiqueta solo sincronizara con Indexadores que tengan la misma etiqueta.",
"TVSearchTypes": "Tipos de búsquedas"
}

View File

@@ -1,11 +1,11 @@
{
"IndexerProxyStatusCheckSingleClientMessage": "Välityspalvelimet eivät ole käytettävissä virheiden vuoksi: {0}",
"Logging": "Kirjaus",
"LogLevel": "Kirjauksen taso",
"Logging": "Lokikirjaus",
"LogLevel": "Lokikirjauksen laajuus",
"MovieIndexScrollTop": "Elokuvakirjasto: vieritä ylös",
"Apply": "Käytä",
"ClientPriority": "Lataustyökalun painotus",
"IndexerPriorityHelpText": "Tietolähteen painotus: 1 (korkein) - 50 (matalin). Oletusarvo on 25. Käytetään muutoin tasaveroisten julkaisujen sieppauspäätökseen. Kaikkia käytössä olevia tietolähteitä käytetään edelleen RSS-synkronointiin ja hakuun.",
"IndexerPriorityHelpText": "Tietolähteen painotus, 1 50 (korkein-alin). Oletusarvo on 25. Käytetään muutoin tasaveroisten julkaisujen kaappauspäätökseen. Kaikkia käytössä olevia tietolähteitä käytetään edelleen RSS-synkronointiin ja hakuun.",
"Manual": "Manuaalinen",
"Add": "Lisää",
"Reload": "Lataa uudelleen",
@@ -25,67 +25,67 @@
"SettingsTimeFormat": "Kellonajan esitys",
"Message": "Viesti",
"Seeders": "Jakajat",
"TestAll": "Testaa kaikki",
"TestAll": "Kaikkien testaus",
"AddDownloadClient": "Lisää lataustyökalu",
"CustomFilters": "Mukautetut suodattimet",
"CustomFilters": "Omat suodattimet",
"DeleteTag": "Poista tunniste",
"EnableRss": "RSS-syöte",
"Filter": "Suodata",
"EnableRss": "Käytä RSS-syötettä",
"Filter": "Suodatus",
"Fixed": "Korjattu",
"FocusSearchBox": "Kohdista hakukenttä",
"ForMoreInformationOnTheIndividualDownloadClients": "Lue lisää lataustyökalusta painamalla 'Lisätietoja'.",
"HideAdvanced": "Piilota edistyneet",
"ForMoreInformationOnTheIndividualDownloadClients": "Saat yksittäisestä lataustyökalusta lisätietoja painamalla sen ohessa olevaa \"Lisätietoja\"-painiketta.",
"HideAdvanced": "Piilota lisäasetukset",
"History": "Historia",
"MIA": "Puuttuu",
"New": "Uusi",
"PageSizeHelpText": "Sivulla näytettävien kohteiden määrä",
"New": "Uutta",
"PageSizeHelpText": "Sivukohtainen kohdemäärä.",
"Proxy": "Välityspalvelin",
"ProxyBypassFilterHelpText": "Käytä erottimena ',' ja '*.' jokerimerkkinä aliverkkotunnuksille (esim. www.esimerkki.fi,*.esimerkki.fi)",
"ProxyBypassFilterHelpText": "Käytä aliverkkotunnusten erottimena pilkkua (,) ja jokerimerkkinä tähteä ja pistettä (*.). Esimerkkejä: www.esimerkki.fi,*.esimerkki.fi.",
"Reddit": "Reddit",
"Refresh": "Päivitä",
"RefreshMovie": "Päivitä elokuva",
"ReleaseBranchCheckOfficialBranchMessage": "'{0}' ei ole kelvollinen {appName}-julkaisuhaara, et saa päivityksiä sen kautta",
"RestartRequiredHelpTextWarning": "Käyttöönotto vaatii uudelleenkäynnistyksen.",
"ReleaseBranchCheckOfficialBranchMessage": "\"{0}\" ei ole kelvollinen {appName}-julkaisuhaara ja tämän vuoksi et saa päivityksiä.",
"RestartRequiredHelpTextWarning": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen.",
"Result": "Tulos",
"Settings": "Asetukset",
"SettingsLongDateFormat": "Pitkän päiväyksen esitys",
"SettingsShortDateFormat": "Lyhyen päiväyksen esitys",
"UnselectAll": "Poista kaikkien valinta",
"UnselectAll": "Tyhjennä valinnat",
"UpdateCheckStartupTranslocationMessage": "Päivitystä ei voi asentaa, koska käynnistyskansio '{0}' sijaitsee 'App Translocation' -kansiossa.",
"UpdateCheckUINotWritableMessage": "Päivitystä ei voi asentaa, koska käyttäjällä '{1}' ei ole kirjoitusoikeutta käyttöliittymäkansioon '{0}'.",
"UpdateMechanismHelpText": "Käytä {appName}in sisäänrakennettua päivitystoimintoa tai omaa komentosarjaasi.",
"UpdateCheckUINotWritableMessage": "Päivityksen asennus ei onnistu, koska käyttäjällä \"{1}\" ei ole kirjoitusoikeutta käyttöliittymäkansioon \"{0}\".",
"UpdateMechanismHelpText": "Käytä {appName}in sisäänrakennettua päivitystoimintoa tai komentosarjaa.",
"Enable": "Käytä",
"UI": "Käyttöliittymä",
"UrlBaseHelpText": "Käänteisen välityspalvelimen tuki (esim. \"http://[host]:[port]/[urlBase]\"). Käytä oletusta jättämällä tyhjäksi.",
"UrlBaseHelpText": "Lisää {appName}in URL-osoitteeseen jälkiliitteen, esim. \"http://[osoite]:[portti]/[URL-perusta]\". Oletusarvo on tyhjä.",
"Usenet": "Usenet",
"BackupNow": "Varmuuskopioi nyt",
"NoBackupsAreAvailable": "Varmuuskopioita ei ole saatavilla",
"UpdateCheckStartupNotWritableMessage": "Päivitystä ei voi asentaa, koska käyttäjällä '{1}' ei ole kirjoitusoikeutta käynnistyskansioon '{0}'.",
"NoBackupsAreAvailable": "Varmuuskopioita ei ole käytettävissä",
"UpdateCheckStartupNotWritableMessage": "Päivitystä ei voida asentaa, koska käyttäjällä \"{1}\" ei ole kirjoitusoikeutta käynnistyskansioon \"{0}\".",
"Updates": "Päivitykset",
"UpdateScriptPathHelpText": "Polku komentosarjaan, joka käsittelee puretun päivitystiedoston ja hoitaa asennuksen loppuosuuden.",
"Uptime": "Käyttöaika",
"URLBase": "URL-perusta",
"UseProxy": "Käytä välityspalvelinta",
"Username": "Käyttäjätunnus",
"YesCancel": "Kyllä, peruuta",
"YesCancel": "Kyllä, peru",
"NoTagsHaveBeenAddedYet": "Tunnisteita ei ole vielä lisätty.",
"ApplyTags": "Tunnistetoimenpide",
"Authentication": "Todennus",
"AuthenticationMethodHelpText": "Vaadi käyttäjätunnus ja salasana {appName}in käyttöön.",
"BindAddressHelpText": "Toimiva IP-osoite, \"localhost\" tai \"*\" (tähti) kaikille verkkoliitännöille.",
"Authentication": "Tunnistautuminen",
"AuthenticationMethodHelpText": "Vaadi {appName}in käyttöön käyttäjätunnus ja salasana.",
"BindAddressHelpText": "Toimiva IP-osoite, localhost tai * (tähti) kaikille verkkoliitännöille.",
"Close": "Sulje",
"DeleteNotification": "Poista kytkentä",
"DeleteNotification": "Poista ilmoitus",
"Docker": "Docker",
"DownloadClient": "Lataustyökalu",
"Language": "Kieli",
"Search": "Haku",
"Details": "Tiedot",
"InteractiveSearch": "Vuorovaikutteinen haku",
"Interval": "Aikaväli",
"InteractiveSearch": "Manuaalihaku",
"Interval": "Ajoitus",
"KeyboardShortcuts": "Pikanäppäimet",
"LastWriteTime": "Viimeisin kirjoitusaika",
"LastWriteTime": "Viimeksi tallennettu",
"LogFiles": "Lokitiedostot",
"LogLevelTraceHelpTextWarning": "Jäljityskirjausta tulisi käyttää vain väliaikaisesti",
"LogLevelTraceHelpTextWarning": "Jäljityskirjausta tulee käyttää vain tilapäisesti.",
"Logs": "Lokitiedot",
"Mechanism": "Mekanismi",
"Name": "Nimi",
@@ -94,14 +94,14 @@
"Presets": "Esiasetukset",
"Priority": "Painotus",
"Protocol": "Protokolla",
"ProxyCheckBadRequestMessage": "Välityspalvelintesti epäonnistui. Tilakoodi: {0}",
"ProxyCheckBadRequestMessage": "Välityspalvelintesti epäonnistui. Tilakoodi: {0}.",
"ProxyCheckFailedToTestMessage": "Välityspalvelintesti epäonnistui: {0}",
"ProxyCheckResolveIpMessage": "Määritetyn välityspalvelimen \"{0}\" IP-osoitteen selvitys epäonnistui.",
"ProxyPasswordHelpText": "Käyttäjätunnus ja salasana tulee syöttää vain tarvittaessa. Muussa tapauksessa jätä kentät tyhjiksi.",
"ProxyPasswordHelpText": "Käyttäjätunnus ja salasana tulee täyttää vain tarvittaessa. Mikäli näitä ei ole, tulee kentät jättää tyhjiksi.",
"ProxyType": "Välityspalvelimen tyyppi",
"ProxyUsernameHelpText": "Käyttäjätunnus ja salasana tulee syöttää vain tarvittaessa. Muussa tapauksessa jätä kentät tyhjiksi.",
"ProxyUsernameHelpText": "Käyttäjätunnus ja salasana tulee täyttää vain tarvittaessa. Mikäli näitä ei ole, tulee kentät jättää tyhjiksi.",
"Queue": "Jono",
"ReadTheWikiForMoreInformation": "Lue lisätietoja Wikistä",
"ReadTheWikiForMoreInformation": "Wikistä löydät lisää tietoja",
"ReleaseStatus": "Julkaisutila",
"RemovedFromTaskQueue": "Poistettu tehtäväjonosta",
"RemoveFilter": "Poista suodatin",
@@ -117,15 +117,15 @@
"Security": "Suojaus",
"SuggestTranslationChange": "Ehdota käännösmuutosta",
"System": "Järjestelmä",
"SystemTimeCheckMessage": "Järjestelmän aika on pielessä yli vuorokauden. Ajoitetut tehtävät eivät luultavasti toimi oikein ennen sen korjausta.",
"SystemTimeCheckMessage": "Järjestelmän ajassa on ainakin vuorokauden heitto eivätkä ajoitetut tehtävät tämän vuoksi toimi oikein ennen kuin se on korjattu.",
"TagCannotBeDeletedWhileInUse": "Tunnistetta ei voi poistaa, koska se on käytössä",
"TagIsNotUsedAndCanBeDeleted": "Tunnistetta ei ole määritetty millekään kohteelle, joten sen voi poistaa.",
"TagsSettingsSummary": "Täältä näet kaikki tunnisteet käyttökohteineen ja voit poistaa sellaiset tunnisteet, joita ei ole määritetty millekään kohteelle.",
"TagsSettingsSummary": "Täältä näet kaikki tunnisteet käyttökohteineen ja voit poistaa käyttämättömät tunnisteet.",
"Tasks": "Tehtävät",
"Test": "Kokeile",
"TestAllClients": "Testaa kaikki lataustyökalut",
"Test": "Testaa",
"TestAllClients": "Lataustyökalujen testaus",
"Time": "Aika",
"Title": "Nimi",
"Title": "Nimike",
"Tomorrow": "Huomenna",
"Torrent": "Torrent",
"Torrents": "Torrentit",
@@ -133,29 +133,29 @@
"UILanguage": "Käyttöliittymän kieli",
"UnableToAddANewApplicationPleaseTryAgain": "Uuden sovelluksen lisäys epäonnistui. Yritä uudelleen.",
"UnableToAddANewIndexerPleaseTryAgain": "Uuden tietolähteen lisäys epäonnistui. Yritä uudelleen.",
"UnableToAddANewIndexerProxyPleaseTryAgain": "Uuden tietolähdevälityspalvelimen lisäys epäonnistui. Yritä uudelleen.",
"UnableToLoadBackups": "Varmuuskopioiden lataus epäonnistui.",
"UnableToLoadDownloadClients": "Lataustyökalujen lataus eonnistui.",
"UnableToAddANewIndexerProxyPleaseTryAgain": "Uuden tiedonhaun välityspalvelimen lisäys epäonnistui. Yritä uudelleen.",
"UnableToLoadBackups": "Varmuuskopioiden lataus epäonnistui",
"UnableToLoadDownloadClients": "Lataustyökalujen lataus ei onistu",
"UnableToLoadGeneralSettings": "Yleisten asetusten lataus epäonnistui.",
"UpdateAutomaticallyHelpText": "Lataa ja asenna päivitykset automaattisesti. Voit edelleen asentaa ne myös lähteestä System:Updates.",
"Added": "Lisätty",
"UpdateAutomaticallyHelpText": "Lataa ja asenna päivitykset automaattisesti. Voit myös edelleen suorittaa asennuksen järjestelmäasetusten päivitykset-osiosta.",
"Added": "Lisäysaika",
"AddIndexer": "Lisää tietolähde",
"AddingTag": "Tunniste lisätään",
"Age": "Ikä",
"All": "Kaikki",
"AllIndexersHiddenDueToFilter": "Aktiivinen suodatin on piilottanut kaikki tietolähteet.",
"Analytics": "Analytiikka",
"AnalyticsEnabledHelpText": "Lähetä nimettömiä käyttö- ja virhetietoja palvelimillemme. Tämä sisältää tietoja selaimestasi, käyttöliittymän sivujen käytöstä, virheraportoinnista, käyttöjärjestelmästä ja suoritusalustasta. Käytämme näitä tietoja ominaisuuksien ja vikakorjausten painotukseen.",
"AnalyticsEnabledHelpText": "Lähetä nimettömiä käyttö- ja virhetietoja {appName}in palvelimille. Tämä sisältää tietoja selaimestasi, käyttöliittymän sivujen käytöstä, virheraportoinnista, käyttöjärjestelmästä ja suoritusalustasta. Käytämme näitä tietoja ominaisuuksien ja vikakorjausten painotukseen.",
"ApiKey": "API-avain",
"AppDataDirectory": "AppData-kansio",
"DBMigration": "Tietokannan siirto",
"Delete": "Poista",
"DeleteIndexerProxyMessageText": "Haluatko varmasti poistaa välityspalvelimen '{0}'?",
"DeleteNotificationMessageText": "Haluatko varmasti poistaa kytkennän '{0}'?",
"DeleteIndexerProxyMessageText": "Haluatko varmasti poistaa tietolähdevälityspalvelimen \"{name}\"?",
"DeleteNotificationMessageText": "Haluatko varmasti poistaa ilmoituspalvelun \"{name}\"?",
"Disabled": "Ei käytössä",
"DownloadClients": "Lataustyökalut",
"DownloadClientSettings": "Lataustyökalujen asetukset",
"DownloadClientStatusCheckAllClientMessage": "Yhtään lataustyökalua ei ole virheiden vuoksi käytettävissä",
"DownloadClientStatusCheckAllClientMessage": "Lataustyökaluja ei ole ongelmien vuoksi käytettävissä",
"Mode": "Tila",
"MoreInfo": "Lisätietoja",
"SelectAll": "Valitse kaikki",
@@ -166,68 +166,68 @@
"ShowSearchHelpText": "Näytä hakupainike osoitettaessa.",
"Shutdown": "Sammuta",
"Size": "Koko",
"Sort": "Järjestä",
"Sort": "Järjestys",
"UnableToAddANewDownloadClientPleaseTryAgain": "Uuden lataustyökalun lisäys epäonnistui. Yitä uudelleen.",
"AppDataLocationHealthCheckMessage": "Päivitystä ei sallita, jotta AppData-kansion poisto päivityksen yhteydessä voidaan estää.",
"AppDataLocationHealthCheckMessage": "Päivityksiä ei sallita, jotta AppData-kansion poistaminen päivityksen yhteydessä voidaan estää.",
"UnableToLoadHistory": "Historian lataus epäonnistui.",
"UnableToLoadNotifications": "Kytkentöjen lataus epäonnistui.",
"UnableToLoadTags": "Tunnisteiden lataus eonnistui.",
"UnableToLoadTags": "Tunnisteiden lataus ei onnistu",
"UnableToLoadUISettings": "Käyttöliittymän asetuksien lataus epäonnistui.",
"UnsavedChanges": "Tallentamattomia muutoksia",
"UnsavedChanges": "Muutoksia ei ole tallennettu",
"Yesterday": "Eilen",
"ConnectionLost": "Yhteys on katkennut",
"DeleteDownloadClientMessageText": "Haluatko varmasti poistaa lataustyökalun '{0}'?",
"DeleteTagMessageText": "Haluatko varmasti poistaa tunnisteen '{0}'?",
"ConnectionLost": "Ei yhteyttä",
"DeleteDownloadClientMessageText": "Haluatko varmasti poistaa lataustyökalun \"{name}\"?",
"DeleteTagMessageText": "Haluatko varmasti poistaa tunnisteen \"{label}\"?",
"Discord": "Discord",
"Donations": "Lahjoitukset",
"Edit": "Muokkaa",
"EnableAutomaticSearchHelpText": "Profiilia käytetään automaattihauille, jotka suoritetaan käyttöliittymästä tai {appName}in toimesta.",
"Enabled": "Käytössä",
"EventType": "Tapahtumatyyppi",
"EventType": "Tapahtuman tyyppi",
"Exception": "Poikkeus",
"FeatureRequests": "Kehitysehdotukset",
"Grabbed": "Siepattu",
"Grabbed": "Kaapattu",
"IgnoredAddresses": "Ohitetut osoitteet",
"IllRestartLater": "Käynnistän uudelleen myöhemmin",
"Info": "Tiedot",
"Info": "Informatiivinen",
"LaunchBrowserHelpText": " Avaa {appName}in verkkokäyttöliittymä verkkoselaimeen sovelluksen käynnistyksen yhteydessä.",
"NoChanges": "Ei muutoksia",
"NoChanges": "Muutoksia ei ole",
"NoLeaveIt": "Ei, anna olla",
"PendingChangesMessage": "On tallentamattomia muutoksia. Haluatko varmasti poistua sivulta?",
"PendingChangesMessage": "Olet tehnyt muutoksia, joita ei ole vielä tallennettu. Haluatko varmasti poistua sivulta?",
"PendingChangesStayReview": "Älä poistu ja tarkista muutokset",
"Save": "Tallenna",
"SaveChanges": "Tallenna muutokset",
"SaveSettings": "Tallenna asetukset",
"Scheduled": "Ajoitettu",
"SettingsEnableColorImpairedModeHelpText": "Vaihtoehtoinen tyyli, joka auttaa erottamaan värikoodatut tiedot paremmin",
"Scheduled": "Ajoitukset",
"SettingsEnableColorImpairedModeHelpText": "Vaihtoehtoinen tyyli, joka auttaa erottamaan värikoodatut tiedot paremmin.",
"SettingsShowRelativeDates": "Suhteellisten päiväysten esitys",
"SettingsShowRelativeDatesHelpText": "Näytä suhteutetut (tänään/eilen/yms.) absoluuttisten sijaan",
"ShowSearch": "Näytä haku",
"Source": "Lähde",
"Source": "Lähdekoodi",
"SSLPort": "SSL-portti",
"StartTypingOrSelectAPathBelow": "Aloita kirjoitus tai valitse sijainti alta",
"StartupDirectory": "Käynnistyskansio",
"TableOptions": "Taulukkoasetukset",
"TableOptions": "Taulukkonäkymän asetukset",
"TableOptionsColumnsMessage": "Valitse näytettävät sarakkeet ja niiden järjestys",
"TagsHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille tietolähteille. Käytä kaikille jättämällä tyhjäksi.",
"UnableToAddANewAppProfilePleaseTryAgain": "Uuden sovellusprofiilin lisäys epäonnistui. Yritä uudelleen.",
"UnableToAddANewNotificationPleaseTryAgain": "Kytkennän lisäys epäonnistui. Yritä uudelleen.",
"Version": "Versio",
"View": "Näytä",
"Warn": "Varoita",
"View": "Näkymä",
"Warn": "Varoitus",
"Wiki": "Wiki",
"Port": "Portti",
"Automatic": "Automaattinen",
"AutomaticSearch": "Automaattihaku",
"Backup": "Varmuuskopio",
"BackupFolderHelpText": "Suhteelliset polut kohdistuvat sovelluksen AppData-kansioon.",
"BackupIntervalHelpText": "Automaattisen varmuuskopioinnin aikaväli",
"BackupRetentionHelpText": "Säilytysjaksoa vanhemmat automaattiset varmuuskopiot poistetaan automaattisesti.",
"Backup": "Varmuuskopiointi",
"BackupFolderHelpText": "Suhteelliset tiedostosijainnit ovat {appName}in AppData-kansiossa.",
"BackupIntervalHelpText": "Tietokannan ja asetusten automaattisen varmuuskopioinnin ajoitus.",
"BackupRetentionHelpText": "Säilytysjaksoa vanhemmat varmuuskopiot siivotaan automaattisesti.",
"Backups": "Varmuuskopiot",
"BeforeUpdate": "Ennen päivitystä",
"BindAddress": "Sidososoite",
"Branch": "Kehityshaara",
"BranchUpdate": "Sovelluksen versiopäivityksiin käytettävä kehityshaara.",
"Branch": "Haara",
"BranchUpdate": "{appName}in versiopäivityksiin käytettävä kehityshaara.",
"BranchUpdateMechanism": "Ulkoisen päivitysratkaisun käyttämä kehityshaara.",
"BypassProxyForLocalAddresses": "Ohjaa paikalliset osoitteet välityspalvelimen ohi",
"Cancel": "Peruuta",
@@ -236,29 +236,29 @@
"CertificateValidationHelpText": "Muuta HTTPS-varmennevahvistuksen tarkkuutta. Älä muuta, jollet ymmärrä tähän liittyviä riskejä.",
"ChangeHasNotBeenSavedYet": "Muutosta ei ole vielä tallennettu",
"Clear": "Tyhjennä",
"CloneProfile": "Kloonaa profiili",
"CloneProfile": "Monista profiili",
"CloseCurrentModal": "Sulje nykyinen ikkuna",
"Columns": "Sarakkeet",
"Component": "Komponentti",
"Connections": "Kytkennät",
"ConnectSettings": "Kytkentöjen asetukset",
"Connections": "Yhteydet",
"ConnectSettings": "Kytkösasetukset",
"CouldNotConnectSignalR": "SignalR-kirjastoa ei tavoitettu, eikä käyttöliittymää päivitetä",
"Custom": "Mukautettu",
"DeleteApplicationMessageText": "Haluatko varmasti poistaa sovelluksen \"{0}\"?",
"DeleteApplicationMessageText": "Haluatko varmasti poistaa sovelluksen \"{name}\"?",
"DeleteBackup": "Poista varmuuskopio",
"DeleteBackupMessageText": "Haluatko varmasti poistaa varmuuskopion '{0}'?",
"DeleteBackupMessageText": "Haluatko varmasti poistaa varmuuskopion \"{name}\"?",
"DeleteDownloadClient": "Poista lataustyökalu",
"DownloadClientStatusCheckSingleClientMessage": "Lataustyökalut eivät ole virheiden vuoksi käytettävissä: {0}",
"DownloadClientStatusCheckSingleClientMessage": "Lataustyökaluja ei ole ongelmien vuoksi käytettävissä: {0}",
"EditIndexer": "Muokkaa tietolähdettä",
"EnableAutomaticSearch": "Automaattihaku",
"EnableInteractiveSearch": "Vuorovaikutteinen haku",
"EnableInteractiveSearchHelpText": "Profiilia käytetään vuorovaikutteisen haun yhteydessä.",
"EnableAutomaticSearch": "Käytä automaattihakua",
"EnableInteractiveSearch": "Käytä manuaalihakua",
"EnableInteractiveSearchHelpText": "Profiilia käytetään manuaalihakuun.",
"EnableSSL": "SSL-salaus",
"EnableSslHelpText": " Käyttöönotto edellyttää uudelleenkäynnistystä järjestelmänvalvojan oikeuksilla.",
"EnableSslHelpText": " Käyttöönotto vaatii uudelleenkäynnistyksen järjestelmänvavojan oikeuksilla.",
"Error": "Virhe",
"ErrorLoadingContents": "Sisällönlatauksen virhe",
"ErrorLoadingContents": "Virhe ladattaessa sisältöjä",
"Events": "Tapahtumat",
"ExistingTag": "Olemassa oleva tunniste",
"ExistingTag": "Tunniste on jo olemassa",
"Failed": "Epäonnistui",
"Filename": "Tiedostonimi",
"Files": "Tiedostot",
@@ -266,10 +266,10 @@
"General": "Yleiset",
"GeneralSettings": "Yleiset asetukset",
"GeneralSettingsSummary": "Portti, SSL-salaus, käyttäjänimi ja salasana, välityspalvelin, analytiikka ja päivitykset.",
"Grabs": "Sieppaukset",
"Health": "Kunto",
"Grabs": "Kaappaukset",
"Health": "Terveys",
"Level": "Taso",
"HealthNoIssues": "Kokoonpanossasi ei ole ongelmia.",
"HealthNoIssues": "Kokoonpanossasi ei ole ongelmia",
"HomePage": "Verkkosivusto",
"Host": "Osoite",
"Hostname": "Osoite",
@@ -283,7 +283,7 @@
"IndexerStatusCheckAllClientMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi",
"IndexerStatusCheckSingleClientMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi: {0}",
"NoChange": "Ei muutosta",
"NoLogFiles": "Ei lokitiedostoja",
"NoLogFiles": "Lokitiedostoja ei ole",
"SSLCertPasswordHelpText": "PFX-tiedoston salasana",
"SSLCertPath": "SSL-varmenteen sijainti",
"SSLCertPathHelpText": "PFX-tiedoston sijainti",
@@ -292,31 +292,31 @@
"NoUpdatesAreAvailable": "Päivityksiä ei ole saatavilla",
"OAuthPopupMessage": "Selaimesi estää ponnahdukset",
"Ok": "Ok",
"OnHealthIssueHelpText": "Kuntoon liittyvä ongelma",
"OnHealthIssueHelpText": "Vakausongelmat",
"OpenBrowserOnStart": "Avaa selain käynnistettäessä",
"OpenThisModal": "Avaa tämä ikkuna",
"Options": "Valinnat",
"PackageVersion": "Pakettiversio",
"Options": "Asetukset",
"PackageVersion": "Paketin versio",
"PageSize": "Sivun koko",
"Password": "Salasana",
"PendingChangesDiscardChanges": "Hylkää muutokset ja poistu",
"PortNumber": "Portti",
"PortNumber": "Portin numero",
"RestoreBackup": "Palauta varmuuskopio",
"Retention": "Säilytys",
"UILanguageHelpText": "Käyttöliittymä näytetään tällä kielellä.",
"UILanguageHelpTextWarning": "Käyttöönotto vaatii selaimen sivupäivityksen.",
"UILanguageHelpText": "{appName}in käyttöliittymän kieli.",
"UILanguageHelpTextWarning": "Selaimen sivupäivitys vaaditaan",
"UISettings": "Käyttöliittymän asetukset",
"DownloadClientsSettingsSummary": "{appName}in käyttöliittymästä suoritettavien hakujen yhteydessä käytettävien lataustyökalujen määritykset.",
"DownloadClientsSettingsSummary": "{appName}in käyttöliittymästä suoritettavien hakujen yhteydessä käytettävät lataustyökalumääritykset.",
"ProwlarrSupportsAnyDownloadClient": "{appName} tukee alla listatuja lataustyökaluja.",
"AddDownloadClientToProwlarr": "Lisäämällä lataustyökalun {appName} voi käynnistää lataukset suoraan käyttöliittymästä manuaalisen haun yhteydessä.",
"RedirectHelpText": "Uudelleenohjaa tietolähteeltä saapuvat latauspyynnöt ja ohjaa sieppaus suoraan sen sijaan, että se välitettäisiin Prowlarin kautta.",
"RedirectHelpText": "Uudelleenohjaa tietolähteeltä saapuvat latauspyynnöt ja välitä kaappaus suoraan välittämättä sitä {appName}in välityksellä.",
"FullSync": "Täysi synkronointi",
"SyncLevelFull": "Täysi synkronointi: Pitää sovelluksen tietolähteet täysin synkronoituna. Tietolähteisiin {appName}issa tehdyt muutokset synkronoidaan etäsovelluksen kanssa ja kaikki etäsovelluksessa tehdyt muutokset korvataan seuraavan synkronoinnin yhteydessä.",
"EnableIndexer": "Tietolähteen tila",
"FilterPlaceHolder": "Suodata tietolähteitä",
"IndexerHealthCheckNoIndexers": "Yhtään tietolähdettä ei ole käytössä, eikä {appName} tämän vuoksi löydä tuloksia.",
"IndexerObsoleteCheckMessage": "Tietolähteet ovat vanhentuneita tai niitä on päivitetty: {0}. Poista ja/tai lisää ne Prowlariin uudelleen.",
"IndexerProxy": "Tietolähteen välityspalvelin",
"IndexerObsoleteCheckMessage": "Tietolähteet ovat poistuneet tai ne ovat muuttuneet: {0}. Poista ja/tai lisää ne {appName}iin uudelleen.",
"IndexerProxy": "Tiedonhaun välityspalvelin",
"IndexerSettingsSummary": "Määritä useita globaaleita tietolähdeasetuksia, kuten välityspalvelimia.",
"IndexerVipCheckExpiringClientMessage": "Tietolähteen VIP-edut erääntyvät pian: {0}",
"ProwlarrSupportsAnyIndexer": "{appName} tukee Newznab- ja Torznab-yhteensopivien tietolähteiden ohella myös useita muita lähteitä vaihtoehdoilla \"Yleinen Newznab\" (Usenetille) ja 'Yleinen Torznab' (torrenteille).",
@@ -324,15 +324,15 @@
"AddIndexerProxy": "Lisää tiedonhaun välityspalvelin",
"UISettingsSummary": "Kalenterin, päiväyksen ja kellonajan sekä kielen ja heikentyneelle värinäölle sopivan tilan asetukset.",
"SettingsIndexerLoggingHelpText": "Kirjaa tarkempia tietoja tietolähteiden toiminnasta, mukaanlukien vastaukset",
"IndexerTagsHelpText": "Tunnisteiden avulla voit määrittää tiedonhaun välityspalvelimet, mihin sovelluksiin tietolähteet synkronoidaan tai yksikertaisesti järjestellä tietolähteitäsi.",
"IndexerTagsHelpText": "Tunnisteilla voit kohdistaa tiedonhaun välityspalvelimia ja määrittää mihin sovelluksiin ne synkronoidaan.",
"UnableToLoadAppProfiles": "Sovellusprofiilien lataus epäonnistui",
"AppProfileSelectHelpText": "Sovellusprofiilieilla määritetään tietolähteelle sovellussynkronoinnin yhteydessä aktivoitavat hakutavat (RSS/automaatti/vuorovaikutteinen).",
"AppProfileSelectHelpText": "Sovellusprofiilieilla määritetään tietolähteelle sovellussynkronoinnin yhteydessä aktivoitavat hakutavat (RSS/automaatti/manuaali).",
"IndexerQuery": "Tietolähteen kysely",
"IndexerRss": "Tietolähteen RSS-syöte",
"IndexerRss": "Tietolähteen RSS",
"SearchIndexers": "Etsi tietolähteistä",
"AddRemoveOnly": "Ainoastaan lisää/poista",
"IndexerVipCheckExpiredClientMessage": "Tietolähteen VIP-edut ovat erääntyneet: {0}",
"MaintenanceRelease": "Huoltojulkaisu: Korjauksia ja muita parannuksia. Lue lisää Githubin historiasta muutoshistoriasta.",
"MaintenanceRelease": "Huoltojulkaisu: korjauksia ja muita parannuksia. Lue lisää Githubin muutoshistoriasta.",
"Query": "Kysely",
"Redirect": "Uudelleenohjaus",
"RestartProwlarr": "Käynnistä {appName} uudelleen",
@@ -340,7 +340,7 @@
"SyncLevelAddRemove": "Vain lisäys/poisto: Kun {appName}in tietolähteitä lisätään tai poistetaan, päivittyy myös etäsovellus.",
"SyncAppIndexers": "Synkronoi tietolähteet",
"TestAllApps": "Testaa kaikki sovellukset",
"UnableToLoadIndexerProxies": "Tietolähdevälityspalvelimien lataus epäonnistui",
"UnableToLoadIndexerProxies": "Tiedonhaun välityspalvelimia ei voitu ladata",
"AddedToDownloadClient": "Julkaisu lisättiin lataustyökaluun",
"AddNewIndexer": "Lisää uusi tietolähde",
"AddToDownloadClient": "Lisää julkaisu lataustyökaluun",
@@ -352,28 +352,28 @@
"SettingsLogRotate": "Lokitiedostojen kierrätys",
"SettingsLogSql": "Kirjaa SQL",
"SettingsSqlLoggingHelpText": "Kirjaa kaikki {appName}in SQL-kyselyt",
"ConnectSettingsSummary": "Ilmoitukset ja omat komentosarjat.",
"ConnectSettingsSummary": "Ilmoitukset, kuten viestintä mediapalvelimille ja soittimille, sekä omat komentosarjat.",
"DevelopmentSettings": "Kehittäjäasetukset",
"Description": "Kuvaus",
"Id": "Tunniste",
"SettingsConsoleLogLevel": "Valvontalokin taso",
"Id": "ID",
"SettingsConsoleLogLevel": "Valvontalokin laajuus",
"SettingsFilterSentryEvents": "Suodata analytiikan tapahtumia",
"SettingsFilterSentryEventsHelpText": "Suodata tunnetut käyttäjävirheet pois analytiikkalähetyksistä",
"Applications": "Sovellukset",
"AppProfileInUse": "Sovellusprofiili on käytössä",
"Apps": "Sovellukset",
"Auth": "Todennus",
"Category": "Luokitus",
"Category": "Kategoria",
"ClearHistory": "Tyhjennä historia",
"ClearHistoryMessageText": "Haluatko varmasti tyhjentää kaiken {appName}-historian?",
"Connect": "Kytkennät",
"EnableRssHelpText": "Tietolähde sisällytetään RSS-syötteeseen.",
"EnableRssHelpText": "Käytä tietolähteelle RSS-syötettä.",
"DeleteApplication": "Poista sovellus",
"DeleteAppProfile": "Poista sovellusprofiili",
"IndexerProxies": "Tietolähteiden välityspalvelimet",
"IndexerProxies": "Tiedonhaun välityspalvelimet",
"IndexerAuth": "Tietolähteen todennus",
"Notifications": "Kytkennät",
"NotificationTriggersHelpText": "Valitse tapahtumat, jotka aiheuttavat ilmoituksen.",
"NotificationTriggersHelpText": "Valitse tämän ilmoituksen laukaisevat tapahtumat.",
"Stats": "Tilastot",
"UnableToLoadDevelopmentSettings": "Kehittäjäasetusten lataus epäonnistui",
"AppSettingsSummary": "Sovellukset ja asetukset, joilla määritetään miten {appName} viestii PVR-sovellustesi kanssa.",
@@ -386,11 +386,11 @@
"QueryOptions": "Kyselyasetukset",
"TvSearch": "Etsi televisiosarjoja",
"Filters": "Suodattimet",
"OnGrab": "Kun elokuva siepataan",
"OnHealthIssue": "Kun havaitaan kuntoon liittyvä ongelma",
"HistoryCleanupDaysHelpText": "Poista automaattinen tyhjennys käytöstä asettamalla arvoksi '0'.",
"OnGrab": "Kun julkaisu kaapataan",
"OnHealthIssue": "Vakausongelmat",
"HistoryCleanupDaysHelpText": "Arvo \"0\" (nolla) poistaa automaattityhjennyksen käytöstä.",
"HistoryCleanupDaysHelpTextWarning": "Tässä määritettyä aikaa vanhemmat tiedostot poistetaan automaattisesti roskakorista pysyvästi.",
"TestAllIndexers": "Testaa tietolähteet",
"TestAllIndexers": "Tietolähteiden testaus",
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent-tiedon ilmoitti sovellus, joka kommunikoi API:n kanssa",
"Categories": "Kategoriat",
"Database": "Tietokanta",
@@ -410,7 +410,7 @@
"Private": "Yksityinen",
"QueryResults": "Kyselyn tulokset",
"Application": "Sovellus",
"GrabReleases": "Sieppaa julkaisu(t)",
"GrabReleases": "Kaappaa julkaisu(t)",
"Link": "Linkki",
"SearchTypes": "Mitä etsitään",
"UnableToLoadIndexers": "Tietolähteiden lataus epäonnistui",
@@ -434,18 +434,18 @@
"AddSyncProfile": "Lisää synkronointiprofiili",
"EditSyncProfile": "Muokkaa synkronointiprofiilia",
"InstanceName": "Instanssin nimi",
"InstanceNameHelpText": "Instanssin nimi välilehdellä ja järjestelmälokissa",
"ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasu. \"Automaattinen\" vaihtaa vaalean ja tumman tilan välillä järjestelmän teeman mukaan. Innoittanut Theme.Park.",
"InstanceNameHelpText": "Instanssin nimi välilehdellä ja järjestelmälokissa.",
"ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasua. \"Automaattinen\" vaihtaa vaalean ja tumman tilan välillä järjestelmän teeman mukaan. Innoittanut Theme.Park.",
"Duration": "Kesto",
"ElapsedTime": "Kulunut aika",
"EnabledRedirected": "Kulunut, uudelleenohjattu",
"Ended": "Päättynyt",
"GrabTitle": "Sieppaa nimike",
"GrabTitle": "Kaappaa nimike",
"LastExecution": "Edellinen suoritus",
"LastDuration": "Edellinen kesto",
"NextExecution": "Seuraava suoritus",
"Parameters": "Parametrit",
"Queued": "Jonossa",
"Queued": "Lisätty jonoon",
"Started": "Alkoi",
"ApplicationLongTermStatusCheckAllClientMessage": "Sovellukset eivät ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi.",
"ApplicationLongTermStatusCheckSingleClientMessage": "Sovellukset eivät ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi: {0}",
@@ -453,30 +453,30 @@
"DeleteClientCategory": "Poista lataustyökalukategoria",
"DownloadClientCategory": "Lataustyökalukategoria",
"MappedCategories": "Kartoitetut kategoriat",
"AuthenticationRequired": "Todennus vaaditaan",
"AuthenticationRequired": "Vaadi tunnistautuminen",
"Remove": "Poista",
"Replace": "Korvaa",
"TheLatestVersionIsAlreadyInstalled": "{appName}in uusin versio on jo asennettu",
"ApplicationURL": "Sovelluksen URL-osoite",
"ApplicationUrlHelpText": "Sovelluksen ulkoinen URL-osoite, johon sisältyy http(s)://, portti ja URL-perusta.",
"Track": "Jäljitys",
"CountIndexersSelected": "{0} valittua tietolähdettä",
"DeleteSelectedDownloadClients": "Poista lataustyökalu",
"DeleteSelectedApplicationsMessageText": "Haluatko varmasti poistaa tietolähteen '{0}'?",
"DeleteSelectedDownloadClientsMessageText": "Haluatko varmasti poistaa tietolähteen '{0}'?",
"DeleteSelectedIndexersMessageText": "Haluatko varmasti poistaa tietolähteen '{0}'?",
"ApplicationURL": "Sovelluksen URL",
"ApplicationUrlHelpText": "Tämän sovelluksen ulkoinen URL-osoite, johon sisältyy http(s)://, portti ja URL-perusta.",
"Track": "Valvo",
"CountIndexersSelected": "{count} tietolähde(ttä) on valittu",
"DeleteSelectedDownloadClients": "Poista lataustyökalu(t)",
"DeleteSelectedApplicationsMessageText": "Haluatko varmasti poistaa {count} valit(un/tua) sovellu(sta/ksen)?",
"DeleteSelectedDownloadClientsMessageText": "Haluatko varmasti poistaa {count} valit(n/tua) lataustyökalu(n/a)?",
"DeleteSelectedIndexersMessageText": "Haluatko varmasti poistaa {count} valit(un/tua) tietoläh(teen/dettä)?",
"Publisher": "Julkasija",
"SelectIndexers": "Etsi tietolähteistä",
"SelectIndexers": "Valitse tietolähteet",
"Year": "Vuosi",
"Genre": "Tyylilajit",
"Genre": "Lajityyppi",
"More": "Lisää",
"Season": "Kausi",
"ApplyTagsHelpTextAdd": " 'Lisää' syötetyt tunnisteet aiempiin tunnisteisiin",
"ApplyTagsHelpTextHowToApplyApplications": "Tunnistetoimenpiteiden selitykset:",
"ApplyTagsHelpTextHowToApplyIndexers": "Tunnisteisiin kohdistettavat toimenpiteet:",
"ApplyTagsHelpTextRemove": "- \"Poista\" tyhjentää syötetyt tunnisteet.",
"ApplyTagsHelpTextReplace": "- \"Korvaa\" nykyiset tunnisteet syötetyillä tai tyhjennä kaikki tunnisteet jättämällä tyhjäksi.",
"DownloadClientPriorityHelpText": "Tietolähteen painotus: 1 (korkein) - 50 (matalin). Oletusarvo on 25. Käytetään muutoin tasaveroisten julkaisujen sieppauspäätökseen. Kaikkia käytössä olevia tietolähteitä käytetään edelleen RSS-synkronointiin ja hakuun.",
"ApplyTagsHelpTextAdd": " \"Lisää\" syötetyt tunnisteet aiempiin tunnisteisiin",
"ApplyTagsHelpTextHowToApplyApplications": "Tunnisteiden käyttäminen valituille sovelluksille",
"ApplyTagsHelpTextHowToApplyIndexers": "Tunnisteiden käyttö valituissa tietolähteissä",
"ApplyTagsHelpTextRemove": "- \"Poista\" tyhjentää syötetyt tunnisteet",
"ApplyTagsHelpTextReplace": "- \"Korvaa\" nykyiset tunnisteet syötetyillä tai tyhjennä kaikki tunnisteet jättämällä tyhjäksi",
"DownloadClientPriorityHelpText": "Määritä useiden lataustyökalujen painotus. Tasaveroiset lataajat erotetaan Round-Robin-tekniikalla.",
"Album": "Albumi",
"Artist": "Esittäjä",
"Author": "Kirjailija",
@@ -485,24 +485,124 @@
"Episode": "Jakso",
"Label": "Tunniste",
"Theme": "Teema",
"ConnectionLostReconnect": "{appName} pyrkii ajoittain muodostamaan yhteyden automaattisesti tai sitä voidaan yrittää manuaalisesti painamalla alta \"Lataa uudelleen\".",
"DeleteAppProfileMessageText": "Haluatko varmasti poistaa laatuprofiilin '{0}'?",
"RecentChanges": "Viimeaikaiset muutokset",
"WhatsNew": "Mikä on uutta?",
"ConnectionLostToBackend": "{appName} kadotti yhteyden taustajärjestelmään ja käytettävyyden palauttamiseksi se on ladattava uudelleen.",
"minutes": "Minuuttia",
"ConnectionLostReconnect": "{appName} pyrkii ajoittain muodostamaan yhteyden automaattisesti tai voit painaa alta \"Lataa uudelleen\".",
"DeleteAppProfileMessageText": "Haluatko varmasti poistaa sovellusprofiilin \"{name}\"?",
"RecentChanges": "Viimeisimmät muutokset",
"WhatsNew": "Mi uutta?",
"ConnectionLostToBackend": "{appName} kadotti yhteyden taustajärjestelmään ja se on käynnistettävä uudelleen.",
"minutes": "minuuttia",
"AddConnection": "Lisää yhteys",
"NotificationStatusAllClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi",
"NotificationStatusSingleClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi: {0}",
"AuthBasic": "Perus (selaimen ponnahdus)",
"NotificationStatusAllClientHealthCheckMessage": "Kaikki ilmoitukset eivät ole ongelmien vuoksi käytettävissä",
"NotificationStatusSingleClientHealthCheckMessage": "Ilmoitukset eivät ole ongelmien vuoksi käytettävissä: {0}",
"AuthBasic": "Perus (ponnahdusikkuna)",
"AuthForm": "Lomake (kirjautumissivu)",
"DisabledForLocalAddresses": "Ei käytetä paikallisille osoittelle",
"DisabledForLocalAddresses": "Ei käytössä paikallisille osoitteille",
"None": "Ei mitään",
"ResetAPIKeyMessageText": "Haluatko varmasti uudistaa API-avaimesi?",
"TotalIndexerSuccessfulGrabs": "Onnistuneiden tietolähdesieppausten kokonaismäärä",
"TotalIndexerSuccessfulGrabs": "Onnistuneiden tietolähdekaappausten kokonaismäärä",
"AppUpdated": "{appName} on päivitetty",
"AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on ladattava uudelleen.",
"IndexerDownloadClientHelpText": "Määritä tämän tietolähteen kanssa käytettävä lataustyökalu",
"AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on käynnistettävä uudelleen.",
"IndexerDownloadClientHelpText": "Määritä tämän tietolähteen kanssa käytettävä lataustyökalu.",
"AuthenticationRequiredWarning": "Etäkäytön estämiseksi ilman tunnistautumista {appName} vaatii nyt todennuksen käyttöönoton. Todennus voidaan poistaa käytöstä paikallisille osoitteille.",
"TotalGrabs": "Sieppausten kokonaismäärä"
"TotalGrabs": "Kaappausten kokonaismäärä",
"AddDownloadClientImplementation": "Lisäätään lataustyökalua - {implementationName}",
"AddIndexerImplementation": "Lisätään tietolähdettä - {implementationName}",
"OnGrabHelpText": "Kun julkaisu kaapataan",
"ManageDownloadClients": "Hallitse lataustyökaluja",
"NoDownloadClientsFound": "Lataustyökaluja ei löytynyt",
"CountDownloadClientsSelected": "{count} lataustyökalu(a) on valittu",
"EditSelectedDownloadClients": "Muokkaa valittuja lataustyökaluja",
"IndexerDownloadClientHealthCheckMessage": "Tietolähteet virheellisillä lataustyökaluilla: {0}.",
"AddIndexerProxyImplementation": "Lisää tiedonhaun välityspalvelin - {implementationName}",
"EditIndexerProxyImplementation": "Muokkaa tiedonhaun välityspalvelinta - {implementationName}",
"EditDownloadClientImplementation": "Muokataan lataustyökalua - {implementationName}",
"AddCustomFilter": "Lisää oma suodatin",
"ApplyChanges": "Toteuta muutokset",
"EditSelectedIndexers": "Muokkaa valittuja sisältölähteitä",
"NoHistoryFound": "Historiaa ei löytynyt",
"NoIndexersFound": "Tietolähteitä ei löytynyt",
"StopSelecting": "Lopeta valitseminen",
"EditConnectionImplementation": "Muokataan kytköstä - {implementationName}",
"AddConnectionImplementation": "Lisätään kytköstä - {implementationName}",
"DownloadClientQbittorrentSettingsContentLayout": "Sisällön rakenne",
"EditIndexerImplementation": "Muokataan tietolähdettä - {implementationName}",
"AuthenticationRequiredUsernameHelpTextWarning": "Syötä uusi käyttäjätunnus",
"DefaultNameCopiedProfile": "{name} - Kopioi",
"AppsMinimumSeedersHelpText": "Sovellusten edellyttämä tietolähteestä kaapattavien kohteiden jakajien (seed) vähimmäismäärä. Jos tyhjä, käytetään synkronointiprofiilin oletusta.",
"TotalHostGrabs": "Isännän kaappausten kokonaismäärä",
"IncludeManualGrabsHelpText": "Sisällytä {appName}in käyttöliittymästä tehdyt manuaalikaappaukset.",
"AuthenticationRequiredHelpText": "Valitse mitkä pyynnöt vaativat tunnistautumisen. Älä muuta, jos et ymmärrä riskejä.",
"TotalUserAgentGrabs": "Käyttäjäagentin kaappausten kokonaismäärä",
"AuthenticationMethodHelpTextWarning": "Valitse sopiva tunnistautumistapa",
"AuthenticationRequiredPasswordHelpTextWarning": "Syötä uusi salasana",
"AuthenticationMethod": "Tunnistautumistapa",
"Clone": "Monista",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Vahvista uusi salasana",
"EditApplicationImplementation": "Muokataan sovellusta - {implementationName}",
"AddApplicationImplementation": "Lisätään sovellusta - {implementationName}",
"InvalidUILanguage": "Käytöliittymän kielivalinta on virheellinen. Korjaa se ja tallenna asetukset.",
"SeedRatio": "Jakosuhde",
"SeedTime": "Jakoaika",
"days": "päivää",
"HistoryDetails": "Historiatiedot",
"IndexerDisabled": "Tietolähde ei ole käytössä",
"AdvancedSettingsShownClickToHide": "Lisäasetukset näytetään, piilota painamalla tästä",
"AdvancedSettingsHiddenClickToShow": "Lisäasetukset on piilotettu, näytä painamalla tästä",
"AppsMinimumSeeders": "Sovellusten vähimmäisjakajat",
"BasicSearch": "Perushaku",
"CountApplicationsSelected": "{count} sovellus(ta) on valittu",
"DeleteSelectedApplications": "Poista valitut sovellukset",
"DeleteSelectedIndexer": "Poista valittu tietolähde",
"DeleteSelectedIndexers": "Poista valitut tietolähteet",
"Implementation": "Toteutus",
"IndexerCategories": "Tietolähdekategoriat",
"IndexerStatus": "Tietolähteen tila",
"ManageApplications": "Hallitse sovelluksia",
"NewznabUrl": "Newznab URL",
"PackSeedTime": "Koosteen jakoaika",
"PackSeedTimeHelpText": "Aika, joka koostepaketin (kuten sarjan tuotantokauden tai esittäjän diskografian) sisältävää torrentia tulee jakaa. Käytä sovelluksen oletusta jättämällä tyhjäksi.",
"QueryType": "Kyselyn tyyppi",
"SearchAllIndexers": "Etsi kaikista tietolähteistä",
"SeedRatioHelpText": "Jakosuhde, joka torrentin tulee saavuttaa ennen sen pysäytystä. Käytä sovelluksen oletusta jättämällä tyhjäksi.",
"TorznabUrl": "Torznab URL",
"ApiKeyValidationHealthCheckMessage": "Muuta API-avaimesi ainakin {0} merkin pituiseksi. Voit tehdä tämän asetuksista tai muokkaamalla asetustiedostoa.",
"OnHealthRestored": "Terveystilan vakautuessa",
"OnHealthRestoredHelpText": "Terveystilan vakautuessa",
"TotalHostQueries": "Isännän kyselyiden kokonaismäärä",
"TotalIndexerQueries": "Tietolähteen kyselyiden kokonaismäärä",
"GoToApplication": "Siirry sovellukseen",
"AreYouSureYouWantToDeleteIndexer": "Haluatko varmasti poistaa tietolähteen \"{name}\" sovelluksesta {appName}?",
"AuthQueries": "Todennuskyselyt",
"ApplicationTagsHelpText": "Sovellukseen synkronoidaan joko tunnisteettomat tietolähteet tai vastaavilla tunnisteilla merkityt tietolähteet.",
"ApplicationTagsHelpTextWarning": "Tunnisteita tulee käyttää harkiten, koska niillä voi olla odottamattomia vaikutuksia. Tunnisteella merkittyyn sovellukseen synkronoidaan vain samalla tunnisteella merkityt tietolähteet.",
"AverageResponseTimesMs": "Tietolähteiden keskimääräiset vasteajat (ms)",
"CountIndexersAvailable": "{count} tietolähde(ttä) on käytettävissä",
"FoundCountReleases": "Löytyi {itemCount} julkaisua",
"IndexerTagsHelpTextWarning": "Tunnisteita tulee käyttää harkiten, koska niillä voi olla odottamattomia vaikutuksia. Tunnisteella merkitty tietolähde synkronoidaan vain samalla tunnisteella merkittyyn sovellukseen.",
"LastFailure": "Edellinen virhe",
"SelectedCountOfCountReleases": "Valittu {selectedCount}/{itemCount} julkaisua",
"TotalQueries": "Kyselyiden kokonaismäärä",
"RssFeed": "RSS-syöte",
"VipExpiration": "VIP-erääntyy",
"DisabledUntil": "Poistettu käytöstä kunnes",
"AddApplication": "Lisää sovellus",
"AddCategory": "Lisää kategoria",
"EditCategory": "Muokkaa kategoriaa",
"IndexerId": "Tietolähteen ID",
"ActiveIndexers": "Aktiiviset tietolähteet",
"NoIndexerCategories": "Tietolähteelle ei löytynyt kategorioita",
"ActiveApps": "Aktiiviset sovellukset",
"NoIndexerHistory": "Tietolähteelle ei löytynyt historiaa",
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Määrittää käytetäänkö qBittorrentista määritettyä rakennetta, torrentin alkuperäistä rakennetta vai luodaanko uusi alikansio (qBittorrent 4.3.2+).",
"External": "Ulkoinen",
"IndexerFailureRate": "Tietolähteen virhetaajuus",
"IndexerHistoryLoadError": "Virhe ladattaessa tietolähteen historiaa",
"InitialFailure": "Alkuperäinen virhe",
"PasswordConfirmation": "Salasanan vahvistus",
"RepeatSearch": "Toista haku",
"SearchCountIndexers": "Etsi {count} tietolähteestä",
"SearchQueries": "Hakukyselyt",
"SeedTimeHelpText": "Aika, joka torrentia tulee jakaa ennen sen pysäytystä. Käytä sovelluksen oletusta jättämällä tyhjäksi.",
"RssQueries": "RSS-kyselyt",
"TotalUserAgentQueries": "Käyttäjäagentin kyselyiden kokonaismäärä"
}

View File

@@ -12,7 +12,7 @@
"Events": "Événements",
"Edit": "Modifier",
"DownloadClientStatusCheckAllClientMessage": "Aucun client de téléchargement n'est disponible en raison d'échecs",
"DownloadClients": "Clients de téléchargement",
"DownloadClients": "Clients de télécharg.",
"Dates": "Dates",
"Date": "Date",
"Delete": "Supprimer",
@@ -28,14 +28,14 @@
"About": "À propos",
"IndexerStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison d'échecs : {0}",
"DownloadClientStatusCheckSingleClientMessage": "Clients de Téléchargement indisponibles en raison d'échecs: {0}",
"SetTags": "Définir des balises",
"SetTags": "Définir des étiquettes",
"ReleaseStatus": "Statut de la version",
"UpdateCheckUINotWritableMessage": "Impossible d'installer la mise à jour car le dossier d'interface utilisateur '{0}' n'est pas accessible en écriture par l'utilisateur '{1}'.",
"UpdateCheckStartupTranslocationMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{0}' se trouve dans un dossier App Translocation.",
"UpdateCheckStartupNotWritableMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{0}' n'est pas accessible en écriture par l'utilisateur '{1}'.",
"UnselectAll": "Tout désélectionner",
"UISettingsSummary": "Date, langue, et perceptions des couleurs",
"TagsSettingsSummary": "Voir toutes les balises et comment elles sont utilisées. Les balises inutilisées peuvent être supprimées",
"TagsSettingsSummary": "Voir toutes les étiquettes et comment elles sont utilisées. Les étiquettes inutilisées peuvent être supprimées",
"Style": "Style",
"Status": "État",
"Sort": "Trier",
@@ -107,7 +107,7 @@
"Reload": "Recharger",
"Peers": "Peers",
"PageSize": "Pagination",
"Ok": "Ok",
"Ok": "OK",
"OAuthPopupMessage": "Les pop-ups sont bloquées par votre navigateur",
"Name": "Nom",
"Message": "Message",
@@ -158,7 +158,7 @@
"Enable": "Activer",
"DownloadClientSettings": "Télécharger les paramètres client",
"Docker": "Docker",
"DeleteTag": "Supprimer le tag",
"DeleteTag": "Supprimer l'étiquette",
"DeleteNotification": "Supprimer la notification",
"DeleteDownloadClient": "Supprimer le client de téléchargement",
"DeleteBackup": "Supprimer la sauvegarde",
@@ -482,7 +482,7 @@
"Author": "Auteur",
"AverageResponseTimesMs": "Temps de réponse moyen des indexeurs (ms)",
"IndexerFailureRate": "Taux d'échec de l'indexeur",
"Label": "Label",
"Label": "Libel",
"More": "Plus",
"Publisher": "Éditeur",
"Season": "Saison",
@@ -595,11 +595,13 @@
"AuthenticationRequiredUsernameHelpTextWarning": "Saisir un nouveau nom d'utilisateur",
"Clone": "Cloner",
"PackSeedTime": "Temps de Seed",
"ApplicationTagsHelpText": "Synchroniser les indexeurs avec cette application qui n'ont aucune balise ou qui ont une ou plusieurs balises correspondantes",
"ApplicationTagsHelpText": "Synchroniser les indexeurs avec cette application qui n'ont aucune étiquette ou qui ont une ou plusieurs étiquettes correspondantes",
"OnHealthRestored": "Sur la santé restaurée",
"OnHealthRestoredHelpText": "Sur la santé restaurée",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmer le nouveau mot de passe",
"PasswordConfirmation": "Confirmation du mot de passe",
"NoIndexerCategories": "Aucune catégorie disponible pour cet indexeur",
"InvalidUILanguage": "Votre interface utilisateur est définie sur une langue non valide, corrigez-la et enregistrez vos paramètres"
"InvalidUILanguage": "Votre interface utilisateur est définie sur une langue non valide, corrigez-la et enregistrez vos paramètres",
"DownloadClientQbittorrentSettingsContentLayout": "Disposition du contenu",
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Utiliser la disposition du contenu configurée par qBittorrent, la disposition originale du torrent ou toujours créer un sous-dossier (qBittorrent 4.3.2+)"
}

View File

@@ -1,7 +1,7 @@
{
"About": "Névjegy",
"Analytics": "Analitika",
"AddIndexer": "Indexer hozzáadása",
"AddIndexer": "Indexe hozzáadása",
"AddingTag": "Címke hozzáadása",
"Error": "Hiba",
"DeleteTag": "Címke Törlése",
@@ -9,7 +9,7 @@
"EnableAutomaticSearch": "Engedélyezd az Automatikus Keresést",
"Enable": "Aktiválás",
"EditIndexer": "Indexer Szerkesztése",
"Edit": "Szerkesztés",
"Edit": "szerkeszt",
"DownloadClientStatusCheckSingleClientMessage": "Letöltőkliens hiba miatt nem elérhető: {0}",
"DownloadClientStatusCheckAllClientMessage": "Az összes letöltőkliens elérhetetlen, hiba miatt",
"DownloadClientsSettingsSummary": "Letöltőkliens konfigurációja a {appName} felhasználói felület keresésbe történő integráláshoz",
@@ -17,15 +17,15 @@
"DownloadClients": "Letöltőkliensek",
"DownloadClient": "Letöltési Kliens",
"Docker": "Docker",
"Disabled": "Letiltott",
"Details": "Részletek",
"Disabled": "Tiltva",
"Details": "részletek",
"DeleteTagMessageText": "Biztosan törlöd a(z) „{0}” címkét?",
"DeleteNotificationMessageText": "Biztosan törlöd a(z) „{0}” értesítést?",
"DeleteNotification": "Értesítés Törlése",
"DeleteDownloadClientMessageText": "Biztosan törlöd a(z) „{0}” letöltő klienst?",
"DeleteDownloadClient": "Letöltőkliens Törlése",
"DeleteBackupMessageText": "Biztosan törlöd a(z) „{0}” biztonsági mentést?",
"DeleteBackup": "Biztonsági Mentés Törlése",
"DeleteDownloadClient": "Letöltőkliens törlése",
"DeleteBackupMessageText": "Biztosan törli a '{name}' biztonsági mentést?",
"DeleteBackup": "Biztonsági Mentés törlése",
"Delete": "Törlés",
"DBMigration": "DB Migráció",
"Dates": "Dátumok",
@@ -46,7 +46,7 @@
"ChangeHasNotBeenSavedYet": "A változások még nem lettek elmentve",
"CertificateValidationHelpText": "Módosítsa a HTTPS tanúsítás szigorúságát",
"CertificateValidation": "Tanúsítvány érvényesítése",
"CancelPendingTask": "Biztosan törlöd ezt a függőben lévő feladatot?",
"CancelPendingTask": "Biztosan törölni szeretné ezt a függőben lévő feladatot?",
"Cancel": "Mégse",
"BypassProxyForLocalAddresses": "Proxy megkerülése a helyi hálózatos címekhez",
"BranchUpdateMechanism": "A külső frissítési mechanizmus által használt ágazat",
@@ -54,13 +54,13 @@
"Branch": "Ágazat",
"BindAddressHelpText": "Érvényes IP-cím, localhost vagy '*' minden interfészhez",
"BindAddress": "Kapcsolási Cím",
"BeforeUpdate": "Alkalmazásfrissítés előtt",
"BeforeUpdate": "Frissítés előtt",
"Backups": "Biztonsági mentések",
"BackupRetentionHelpText": "A megőrzési idől régebbi automatikus biztonsági másolatok automatikusan törlésre kerülnek",
"BackupNow": "Biztonsági Mentés Most",
"BackupIntervalHelpText": "Időeltérés a biztonsági mentések között",
"BackupRetentionHelpText": "A megőrzési időszaknál régebbi automatikus biztonsági másolatok automatikusan törlődnek",
"BackupNow": "Biztonsági Mentés",
"BackupIntervalHelpText": "Az automatikus biztonsági mentések közötti időköz",
"BackupFolderHelpText": "Az elérési útvonalak a {appName} AppData könyvtárában lesznek",
"Backup": "Biztonsági Mentés",
"Backup": "biztonsági mentés",
"AutomaticSearch": "Automatikus keresés",
"Automatic": "Automatikus",
"AnalyticsEnabledHelpText": "Küldjön névtelen használati és hibainformációkat a {appName} szervereire. Ez magában foglalja a böngészőjéről szóló információkat, mely {appName} WebUI oldalakat használja, a hibajelentést, valamint az operációs rendszer adatait. Ezeket az információkat a funkciók és a hibajavítások rangsorolására használjuk fel.",
@@ -71,12 +71,12 @@
"ApiKey": "API Kulcs",
"All": "Összes",
"AcceptConfirmationModal": "Változás Megerősítése",
"Apply": "Alkalmazás",
"Apply": "Alkamaz",
"AppDataLocationHealthCheckMessage": "A frissítés nem lehetséges anélkül hogy az AppData ne törlődjön",
"AppDataDirectory": "AppData Mappa",
"AppDataDirectory": "AppData Könyvtár",
"Added": "Hozzáadva",
"Actions": "Teendők",
"History": "Történet",
"History": "Előzmény",
"HideAdvanced": "Haladó Elrejtése",
"HealthNoIssues": "Nincs hiba a konfigurációval",
"Health": "Állapot",
@@ -84,11 +84,11 @@
"ForMoreInformationOnTheIndividualDownloadClients": "Ha többet szeretnél megtudni a különböző letöltési kliensekről, kattints az információs gombokra.",
"Folder": "Mappa",
"FocusSearchBox": "Fókusz Keresőmező",
"Fixed": "Kijavítva",
"Fixed": "Rögzített",
"FilterPlaceHolder": "Filmek Keresése",
"Filter": "Szűrő",
"Files": "Fájl",
"Filename": "Fájlnév",
"Filename": "Fájl név",
"Failed": "Sikertelen",
"ExistingTag": "Meglévő Címke",
"Exception": "Kivétel",
@@ -136,7 +136,7 @@
"Save": "Mentés",
"RSSIsNotSupportedWithThisIndexer": "Az RSS nem támogatott ezzel az indexerrel",
"Retention": "Visszatartás",
"Result": "Eredmények",
"Result": "Eredmény",
"RestoreBackup": "Biztonsági mentés visszaállítása",
"Restore": "Visszaállítás",
"RestartRequiredHelpTextWarning": "Újraindítás szükséges a hatálybalépéshez",
@@ -177,7 +177,7 @@
"PageSizeHelpText": "Az egyes oldalakon megjelenítendő elemek száma",
"PageSize": "Oldal mérete",
"PackageVersion": "Csomagverzió",
"Options": "Opciók",
"Options": "Lehetőségek",
"OpenThisModal": "Nyissa meg ezt a modált",
"OpenBrowserOnStart": "Indításkor nyissa meg a böngészőt",
"OnHealthIssueHelpText": "Állapotprobléma",
@@ -200,9 +200,9 @@
"MIA": "MIA",
"Message": "Üzenet",
"Mechanism": "Mechanizmus",
"Manual": "Manuális",
"Manual": "Kézi",
"MaintenanceRelease": "Karbantartási frissítés: hibajavítások és egyéb fejlesztések. További részletekért lásd: Github Commit History",
"Logs": "Logok",
"Logs": "Naplók",
"LogLevelTraceHelpTextWarning": "A nyomkövetést csak ideiglenesen szabad engedélyezni",
"LogLevel": "Log Szint",
"Logging": "Loggolás",
@@ -239,13 +239,13 @@
"Title": "Cím",
"Time": "Idő",
"TestAllClients": "Összes kliens tesztelése",
"TestAll": "Összes tesztelése",
"TestAll": "Összes Tesztelése",
"Test": "Teszt",
"Tasks": "Feladatok",
"TagsSettingsSummary": "Tekintse meg az összes címkét és azok használatát. A használatlan címkék eltávolíthatók",
"TagsHelpText": "Legalább egy megfelelő címkével rendelkező filmekre vonatkozik",
"Tags": "Címkék",
"TagIsNotUsedAndCanBeDeleted": "A címkét nincs használatban, és törölhető",
"TagIsNotUsedAndCanBeDeleted": "A címke nincs használatban, törölhető",
"TagCannotBeDeletedWhileInUse": "Használat közben nem törölhető",
"TableOptionsColumnsMessage": "Válasszd ki, mely oszlopok legyenek láthatóak, és milyen sorrendben jelenjenek meg",
"SystemTimeCheckMessage": "A rendszeridő több mint 1 napja nem frissült. Előfordulhat, hogy az ütemezett feladatok az idő kijavításáig nem futnak megfelelően",
@@ -257,7 +257,7 @@
"Indexer": "Indexelő",
"IncludeHealthWarningsHelpText": "Tartalmazza a Állapot Figyelmeztetéseket",
"IllRestartLater": "Később Újraindítom",
"IgnoredAddresses": "Ignorált Címek",
"IgnoredAddresses": "Ignorált címek",
"YesCancel": "Igen, Mégsem",
"Warn": "Figyelmeztet",
"View": "Nézet",
@@ -280,7 +280,7 @@
"UnableToLoadUISettings": "Nem sikerült betölteni a felhasználói felület beállításait",
"UnableToLoadTags": "Nem sikerült betölteni a címkéket",
"UnableToLoadNotifications": "Nem sikerült betölteni az Értesítéseket",
"TableOptions": "Táblázat beállításai",
"TableOptions": "Táblázat Beállítások",
"ShowSearch": "Keresés(ek) megjelenítése",
"SetTags": "Címkék beállítása",
"NotificationTriggers": "Értesítés(ek) kiváltója",
@@ -332,7 +332,7 @@
"AppProfileSelectHelpText": "Az alkalmazásprofilok az RSS vezérlésére szolgálnak, Automatikus keresés és Interaktív keresés beállításai az alkalmazás szinkronizálásakor",
"UnableToAddANewApplicationPleaseTryAgain": "Nem lehet új alkalmazást hozzáadni, próbálkozzon újra.",
"UnableToAddANewAppProfilePleaseTryAgain": "Nem lehet új alkalmazásprofilt hozzáadni, próbálkozzon újra.",
"AddDownloadClient": "Letöltőkliens hozzáadása",
"AddDownloadClient": "Letöltési kliens hozzáadása",
"Applications": "Alkalmazások",
"AppProfileInUse": "Használatban lévő alkalmazásprofil",
"Apps": "Appok",
@@ -466,9 +466,9 @@
"ApplyChanges": "Változások alkalmazása",
"ApplyTagsHelpTextReplace": "Csere: Cserélje ki a címkéket a beírt címkékre (az összes címke törléséhez ne adjon meg címkéket)",
"EditSelectedIndexers": "Kiválasztott indexelők szerkesztése",
"ApplyTagsHelpTextAdd": "Hozzáadás: Új címkék hozzáadása a meglévő címkékhez",
"ApplyTagsHelpTextAdd": "Hozzáadás: Adja hozzá a címkéket a meglévő címkék listájához",
"ApplyTagsHelpTextHowToApplyApplications": "Hogyan adjunk hozzá címkéket a kiválasztott filmhez",
"ApplyTagsHelpTextHowToApplyIndexers": "Hogyan adjunk hozzá címkéket a kiválasztott filmhez",
"ApplyTagsHelpTextHowToApplyIndexers": "Címkék alkalmazása a kiválasztott indexelőkre",
"ApplyTagsHelpTextRemove": "Eltávolítás: Távolítsa el a beírt címkéket",
"CountIndexersSelected": "{0} Indexelő(k) kiválasztva",
"DeleteSelectedDownloadClients": "Letöltőkliens Törlése",
@@ -494,14 +494,35 @@
"WhatsNew": "Mi az újdonság?",
"ConnectionLostToBackend": "A Radarr elvesztette kapcsolatát a háttérrendszerrel, a funkciók helyreállításához frissíts.",
"minutes": "percek",
"AddConnection": "Gyűjtemény módosítása",
"AddConnection": "Csatlakozás hozzáadása",
"NotificationStatusAllClientHealthCheckMessage": "Összes alkalmazás elérhetetlen hiba miatt",
"NotificationStatusSingleClientHealthCheckMessage": "Az alkalmazás nem áll rendelkezésre az alábbi hibák miatt: {0}",
"AuthBasic": "Alap (Böngésző felugró ablak)",
"AuthForm": "Felhasználó (Bejelentkezési oldal)",
"AuthBasic": "Alap (böngésző előugró ablak)",
"AuthForm": "Űrlapok (bejelentkezési oldal)",
"DisabledForLocalAddresses": "Letiltva a helyi címeknél",
"None": "Nincs",
"ResetAPIKeyMessageText": "Biztos hogy vissza szeretnéd állítani az API-Kulcsod?",
"AuthenticationRequiredPasswordHelpTextWarning": "Adjon meg új jelszót",
"AuthenticationRequiredUsernameHelpTextWarning": "Adjon meg új felhasználónevet"
"AuthenticationRequiredUsernameHelpTextWarning": "Adjon meg új felhasználónevet",
"AppUpdated": "{appName} frissítve",
"AddApplication": "Alkalmazás hozzáadása",
"AddCustomFilter": "Egyéni szűrő hozzáadása",
"Clone": "Klón",
"Implementation": "Végrehajtás",
"AddConnectionImplementation": "Csatlakozás hozzáadása - {implementationName}",
"AddDownloadClientImplementation": "Letöltési kliens hozzáadása {implementationName}",
"AddIndexerImplementation": "Indexelő hozzáadása - {implementationName}",
"ActiveApps": "Aktív alkalmazások",
"ActiveIndexers": "Indexerek",
"AuthenticationMethod": "Hitelesítési Módszer",
"AuthenticationMethodHelpTextWarning": "Kérjük, válasszon érvényes hitelesítési módot",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Erősítsd meg az új jelszót",
"DefaultNameCopiedProfile": "{name} - Másolat",
"EditConnectionImplementation": "Csatlakozás hozzáadása - {megvalósítás neve}",
"EditIndexerProxyImplementation": "Indexelő hozzáadása - {megvalósítás neve}",
"AddApplicationImplementation": "Csatlakozás hozzáadása - {implementationName}",
"AddIndexerProxyImplementation": "Indexelő hozzáadása - {implementationName}",
"EditIndexerImplementation": "Indexelő hozzáadása - {megvalósítás neve}",
"EditApplicationImplementation": "Csatlakozás hozzáadása - {megvalósítás neve}",
"EditDownloadClientImplementation": "Letöltési kliens hozzáadása {megvalósítási név}"
}

View File

@@ -78,5 +78,8 @@
"AuthenticationRequiredPasswordHelpTextWarning": "Masukkan sandi baru",
"AuthenticationRequiredUsernameHelpTextWarning": "Masukkan nama pengguna baru",
"AuthenticationRequiredWarning": "Untuk mencegah akses jarak jauh tanpa autentikasi, {appName} kini mewajibkan pengaktifkan autentikasi. Kamu dapat menonaktifkan autentikasi dari jaringan lokal.",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Konfirmasi sandi baru"
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Konfirmasi sandi baru",
"days": "hari",
"minutes": "menit",
"Link": "Tautan"
}

View File

@@ -17,7 +17,7 @@
"Grabbed": "Preso",
"Clear": "Cancella",
"AppDataLocationHealthCheckMessage": "L'aggiornamento non sarà possibile per evitare la cancellazione di AppData durante l'aggiornamento",
"Analytics": "Analitica",
"Analytics": "Statistiche",
"Added": "Aggiunto",
"About": "Info",
"Updates": "Aggiornamenti",
@@ -76,7 +76,7 @@
"Date": "Data",
"CustomFilters": "Filtri Personalizzati",
"Connect": "Notifiche",
"Connections": "Collegamenti",
"Connections": "Connessioni",
"ConnectSettingsSummary": "Notifiche e script personalizzati",
"BackupNow": "Esegui backup ora",
"Backup": "Backup",
@@ -84,28 +84,28 @@
"Actions": "Azioni",
"Age": "Età",
"Close": "Chiudi",
"CloneProfile": "Clona il Profilo",
"ClientPriority": "Priorità del Client",
"CloneProfile": "Copia Profilo",
"ClientPriority": "Priorità Client",
"ChangeHasNotBeenSavedYet": "Il cambio non è stato ancora salvato",
"CertificateValidationHelpText": "Cambia quanto è rigorosa la convalida del certificato HTTPS",
"CertificateValidation": "Convalida del Certificato",
"Cancel": "Annulla",
"BypassProxyForLocalAddresses": "Evita il Proxy per gli Indirizzi Locali",
"Branch": "Ramo",
"BindAddressHelpText": "Indirizzo IP valido, localhost o '*' per tutte le interfacce di rete",
"BindAddress": "Indirizzo di Bind",
"BindAddressHelpText": "Indirizzi IP validi, localhost o '*' per tutte le interfacce",
"BindAddress": "Indirizzo di Ascolto",
"Backups": "Backups",
"BackupRetentionHelpText": "I backup automatici più vecchi del periodo di conservazione verranno eliminati automaticamente",
"BackupIntervalHelpText": "Intervallo tra i backup automatici",
"BackupRetentionHelpText": "I backup più vecchi del periodo specificato saranno cancellati automaticamente",
"BackupIntervalHelpText": "Intervallo fra i backup automatici",
"BackupFolderHelpText": "I percorsi relativi saranno nella cartella AppData di {appName}",
"Automatic": "Automatico",
"AuthenticationMethodHelpText": "Richiedi Nome Utente e Password per accedere a {appName}",
"AuthenticationMethodHelpText": "Inserisci Username e Password per accedere a {appName}",
"Authentication": "Autenticazione",
"ApplyTags": "Applica Etichette",
"Apply": "Applica",
"AppDataDirectory": "Cartella AppData",
"ApiKey": "Chiave API",
"AnalyticsEnabledHelpText": "Invia informazioni anonime sull'uso e sugli errori ai server di {appName}. Questo include informazioni sul tuo browser, quali pagine della WebUI di {appName} utilizzi, la segnalazione di errori così come il sistema operativo e la versione di runtime. Useremo queste informazioni per dare priorità alle funzionalità e alle correzioni dei bug.",
"AnalyticsEnabledHelpText": "Inviare informazioni anonime sull'utilizzo e sugli errori ai server di {appName}. Ciò include informazioni sul tuo browser, quali pagine dell'interfaccia di {appName} usi, la segnalazione di errori così come la versione del sistema operativo e del runtime. Utilizzeremo queste informazioni per dare priorità alle nuove funzioni e alle correzioni di bug.",
"Warn": "Attenzione",
"Type": "Tipo",
"Title": "Titolo",
@@ -136,11 +136,11 @@
"DownloadClientSettings": "Impostazioni del Client di Download",
"Docker": "Docker",
"DeleteTag": "Elimina Etichetta",
"DeleteNotification": "Cancella la Notifica",
"DeleteDownloadClient": "Cancella il Client di Download",
"DeleteNotification": "Cancella Notifica",
"DeleteDownloadClient": "Cancella Client di Download",
"DeleteBackup": "Cancella Backup",
"DBMigration": "Migrazione DB",
"ConnectSettings": "Impostazioni di Connessione",
"ConnectSettings": "Impostazioni Collegamento",
"ConnectionLost": "Connessione Persa",
"Component": "Componente",
"Columns": "Colonne",
@@ -222,7 +222,7 @@
"DeleteTagMessageText": "Sei sicuro di voler eliminare l'etichetta '{0}'?",
"DeleteNotificationMessageText": "Sei sicuro di voler eliminare la notifica '{0}'?",
"DeleteDownloadClientMessageText": "Sei sicuro di voler eliminare il client di download '{0}'?",
"BeforeUpdate": "Prima di aggiornare",
"BeforeUpdate": "Prima dell'aggiornamento",
"Usenet": "Usenet",
"Uptime": "Tempo di attività",
"YesCancel": "Si, Cancella",
@@ -232,7 +232,7 @@
"UrlBaseHelpText": "Per il supporto al reverse proxy, di default è vuoto",
"URLBase": "Base Url",
"UpdateScriptPathHelpText": "Percorso verso uno script personalizzato che prende un pacchetto di aggiornamento estratto e gestisce il resto del processo di aggiornamento",
"UpdateMechanismHelpText": "Usa l'aggiornamento integrato in {appName} o uno script",
"UpdateMechanismHelpText": "Usa il sistema di aggiornamento interno di {appName} o uno script",
"UpdateAutomaticallyHelpText": "Scarica e installa automaticamente gli aggiornamenti. Sarai comunque in grado in installarli da Sistema: Aggiornamenti",
"UnsavedChanges": "Modifiche non salvate",
"UnableToLoadUISettings": "Impossibile caricare le impostazioni interfaccia",
@@ -293,7 +293,7 @@
"EnableIndexer": "Abilita Indicizzatore",
"AddNewIndexer": "Aggiungi nuovo Indicizzatore",
"IndexerAuth": "Autenticazione dell'Indicizzatore",
"AddDownloadClient": "Aggiungi Downloader",
"AddDownloadClient": "Aggiungi Client di Download",
"Category": "Categoria",
"ClearHistory": "Cancella cronologia",
"ClearHistoryMessageText": "Sei sicuro di voler cancellare tutta la cronologia di {appName}?",
@@ -451,8 +451,8 @@
"Started": "Iniziato",
"AreYouSureYouWantToDeleteCategory": "Vuoi davvero cancellare la categoria mappata?",
"AuthenticationRequired": "Autenticazione richiesta",
"AuthenticationRequiredHelpText": "Cambia a quali richieste l'autenticazione verrà richiesta. Non cambiare se non comprendi i rischi.",
"AuthenticationRequiredWarning": "Per impedire accessi remoti senza autenticazione, {appName} ora richiede che l'autenticazione venga attivata. Puoi disattivare l'autenticazione per indirizzi privati.",
"AuthenticationRequiredHelpText": "Cambia a quali richieste l'autenticazione verrà chiesta. Non cambiare se non comprendi i rischi.",
"AuthenticationRequiredWarning": "Per prevenire accessi remoti non autorizzati, {appName} da ora richiede che l'autenticazione sia abilitata. Opzionalmente puoi disabilitare l'autenticazione per gli indirizzi di rete locali.",
"DeleteClientCategory": "Cancella categoria del client di download",
"DownloadClientCategory": "Categoria client di download",
"MappedCategories": "Categorie mappate",
@@ -498,9 +498,22 @@
"AddConnection": "Aggiungi Connessione",
"NotificationStatusAllClientHealthCheckMessage": "Tutte le applicazioni non sono disponibili a causa di errori",
"NotificationStatusSingleClientHealthCheckMessage": "Applicazioni non disponibili a causa di errori: {0}",
"AuthForm": "Moduli (Pagina di Accesso)",
"AuthForm": "Form (Pagina di Login)",
"DisabledForLocalAddresses": "Disabilitato per Indirizzi Locali",
"None": "Nessuna",
"ResetAPIKeyMessageText": "Sei sicuro di voler reimpostare la tua chiave API?",
"AuthBasic": "Base (Popup del Browser)"
"AuthBasic": "Base (Popup del Browser)",
"EditSelectedDownloadClients": "Modifica i Client di Download Selezionati",
"AppUpdated": "{appName} Aggiornato",
"AddCustomFilter": "Aggiungi Filtro Personalizzato",
"AddConnectionImplementation": "Aggiungi Connessione - {implementationName}",
"AddDownloadClientImplementation": "Aggiungi un Client di Download - {implementationName}",
"AddIndexerImplementation": "Aggiungi indicizzatore - {implementationName}",
"AuthenticationRequiredUsernameHelpTextWarning": "Inserisci username",
"AuthenticationMethod": "Metodo di Autenticazione",
"AuthenticationMethodHelpTextWarning": "Selezione un metodo di autenticazione valido",
"AuthenticationRequiredPasswordHelpTextWarning": "Inserisci la nuova password",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Conferma la nuova password",
"Clone": "Copia",
"DefaultNameCopiedProfile": "{name} - Copia"
}

View File

@@ -352,5 +352,6 @@
"AuthForm": "フォーム(ログインページ)",
"DisabledForLocalAddresses": "ローカルアドレスでは無効",
"None": "なし",
"ResetAPIKeyMessageText": "APIキーをリセットしてもよろしいですか"
"ResetAPIKeyMessageText": "APIキーをリセットしてもよろしいですか",
"RestartProwlarr": "{appName}を再起動します"
}

View File

@@ -352,5 +352,6 @@
"DisabledForLocalAddresses": "로컬 주소에 대해 비활성화됨",
"None": "없음",
"ResetAPIKeyMessageText": "API 키를 재설정하시겠습니까?",
"StopSelecting": "선택 취소"
"StopSelecting": "선택 취소",
"RestartProwlarr": "{appName} 다시 시작"
}

View File

@@ -5,5 +5,16 @@
"Add": "Pievienot",
"AddDownloadClient": "Pievienot Lejupielādes Klientu",
"AddConnection": "Pievienot Savienojumu",
"AddConnectionImplementation": "Pievienot Savienojumu - {implementationName}"
"AddConnectionImplementation": "Pievienot Savienojumu - {implementationName}",
"New": "Jauns",
"Connect": "Paziņojumi",
"Notification": "Paziņojumi",
"Notifications": "Paziņojumi",
"EditConnectionImplementation": "Pievienot Savienojumu - {implementationName}",
"EditIndexerImplementation": "Pievienot Nosacījumu - {implementationName}",
"EditApplicationImplementation": "Pievienot Savienojumu - {implementationName}",
"AddIndexerImplementation": "Pievienot Nosacījumu - {implementationName}",
"AddIndexerProxyImplementation": "Pievienot Nosacījumu - {implementationName}",
"AddApplicationImplementation": "Pievienot Savienojumu - {implementationName}",
"EditIndexerProxyImplementation": "Pievienot Nosacījumu - {implementationName}"
}

View File

@@ -1,5 +1,5 @@
{
"Add": "Legge til",
"Add": "Legg til",
"AddDownloadClient": "Legg til nedlastingsklient",
"Added": "La til",
"AddingTag": "Legger til tag",

View File

@@ -452,8 +452,8 @@
"NotificationStatusSingleClientHealthCheckMessage": "Applicaties onbeschikbaar door fouten",
"AddConnection": "Voeg connectie toe",
"NotificationStatusAllClientHealthCheckMessage": "Alle applicaties onbeschikbaar door fouten",
"AuthBasic": "Basis (Browser Pop-up)",
"AuthForm": "Formulier (Login Pagina)",
"AuthBasic": "Basic (Browser Pop-up)",
"AuthForm": "Formulier (inlogpagina)",
"DisabledForLocalAddresses": "Uitgeschakeld voor lokale adressen",
"None": "Geen",
"ResetAPIKeyMessageText": "Bent u zeker dat u uw API-sleutel wilt resetten?",
@@ -476,5 +476,11 @@
"EditIndexerProxyImplementation": "Indexeerder toevoegen - {implementationName}",
"AuthenticationMethod": "Authenticatiemethode",
"AuthenticationRequired": "Verificatie vereist",
"AuthenticationMethodHelpTextWarning": "Selecteer een geldige verificatie methode"
"AuthenticationMethodHelpTextWarning": "Selecteer een geldige verificatie methode",
"AuthenticationRequiredHelpText": "Pas aan welke requests verificatie nodig hebben. Pas niets aan als je de risico's niet begrijpt.",
"AuthenticationRequiredPasswordHelpTextWarning": "Voer een nieuw wachtwoord in",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Bevestig het nieuwe wachtwoord",
"AuthenticationRequiredUsernameHelpTextWarning": "Voeg een nieuwe gebruikersnaam in",
"AuthenticationRequiredWarning": "Om toegang zonder authenticatie te voorkomen vereist {appName} nu verificatie. Je kan dit optioneel uitschakelen voor lokale adressen.",
"Episode": "aflevering"
}

View File

@@ -6,7 +6,7 @@
"Analytics": "Analityka",
"All": "Wszystkie",
"Added": "Dodane",
"Actions": "Aktywności",
"Actions": "Akcje",
"About": "O",
"Logging": "Logowanie",
"EnableSslHelpText": " Wymaga ponownego uruchomienia jako administrator, aby odniosło skutek",
@@ -22,7 +22,7 @@
"Automatic": "Automatyczny",
"ApplyTags": "Zastosuj tagi",
"BackupIntervalHelpText": "Odstęp czasu między automatycznymi kopiami zapasowymi",
"Close": "Blisko",
"Close": "Zamknij",
"CloseCurrentModal": "Zamknij bieżący tryb",
"Delete": "Usunąć",
"Discord": "Niezgoda",
@@ -54,7 +54,7 @@
"ApiKey": "Klucz API",
"UI": "UI",
"AcceptConfirmationModal": "Zaakceptuj tryb potwierdzenia",
"AddIndexer": "Dodaj indeksator",
"AddIndexer": "Dodaj indekser",
"AddingTag": "Dodawanie tagu",
"Age": "Wiek",
"CertificateValidationHelpText": "Zmień ścisłą walidację certyfikatu HTTPS",
@@ -375,5 +375,7 @@
"None": "Żaden",
"AuthBasic": "Podstawowe (wyskakujące okienko przeglądarki)",
"ResetAPIKeyMessageText": "Czy na pewno chcesz zresetować swój klucz API?",
"RestartProwlarr": "Zrestartuj {appName}"
"RestartProwlarr": "Zrestartuj {appName}",
"AddConnectionImplementation": "Dodaj Connection - {implementationName}",
"AddDownloadClientImplementation": "Dodaj klienta pobierania - {implementationName}"
}

View File

@@ -120,7 +120,7 @@
"Clear": "Limpar",
"Cancel": "Cancelar",
"BackupNow": "Criar cópia de segurança",
"Backup": "Cópia de segurança",
"Backup": "Backup",
"Apply": "Aplicar",
"Analytics": "Análises",
"All": "Todos",
@@ -181,7 +181,7 @@
"BindAddressHelpText": "Endereço de IP válido, localhost ou \"*\" para todas as interfaces",
"BindAddress": "Endereço de vínculo",
"Backups": "Cópias de segurança",
"BackupFolderHelpText": "Caminhos relativos estarão na pasta AppData do {appName}",
"BackupFolderHelpText": "Caminhos relativos estarão no diretório AppData do {appName}",
"BackupIntervalHelpText": "Intervalo entre cópias de segurança automáticas",
"BackupRetentionHelpText": "Cópias de segurança automáticas anteriores ao período de retenção serão eliminadas automaticamente",
"ClientPriority": "Prioridade do cliente",
@@ -472,5 +472,8 @@
"EditSelectedDownloadClients": "Editar Clientes de Transferência Selecionados",
"Album": "álbum",
"Artist": "artista",
"DefaultNameCopiedProfile": "{name} - Copiar"
"DefaultNameCopiedProfile": "{name} - Copiar",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmar nova senha",
"AdvancedSettingsHiddenClickToShow": "Definições avançadas ocultas, clique para mostrar",
"AddCategory": "Adicionar Categoria"
}

View File

@@ -110,7 +110,7 @@
"DeleteIndexerProxyMessageText": "Tem certeza de que deseja excluir o proxy do indexador '{name}'?",
"DeleteNotification": "Excluir notificação",
"DeleteNotificationMessageText": "Tem certeza de que deseja excluir a notificação '{name}'?",
"DeleteTag": "Excluir tag",
"DeleteTag": "Excluir Etiqueta",
"DeleteTagMessageText": "Tem certeza de que deseja excluir a tag '{label}'?",
"Description": "Descrição",
"Details": "Detalhes",
@@ -139,7 +139,7 @@
"EnableInteractiveSearch": "Ativar pesquisa interativa",
"EnableInteractiveSearchHelpText": "Será usado com a pesquisa interativa",
"EnableRss": "Habilitar RSS",
"EnableRssHelpText": "Habilitar feed RSS para o indexador",
"EnableRssHelpText": "Habilitar feed RSS para indexador",
"EnableSSL": "Habilitar SSL",
"EnableSslHelpText": " Requer a reinicialização com a execução como administrador para fazer efeito",
"Enabled": "Habilitado",
@@ -601,5 +601,8 @@
"NoIndexerCategories": "Nenhuma categoria encontrada para este indexador",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirme a nova senha",
"PasswordConfirmation": "Confirmação Da Senha",
"InvalidUILanguage": "Sua UI está definida com um idioma inválido, corrija-a e salve suas configurações"
"InvalidUILanguage": "Sua UI está definida com um idioma inválido, corrija-a e salve suas configurações",
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Seja para usar o layout de conteúdo configurado do qBittorrent, o layout original do torrent ou sempre criar uma subpasta (qBittorrent 4.3.2+)",
"DownloadClientQbittorrentSettingsContentLayout": "Layout de Conteúdo",
"IndexerId": "ID do Indexador"
}

View File

@@ -419,5 +419,6 @@
"AuthenticationMethod": "Способ авторизации",
"AuthenticationRequiredPasswordHelpTextWarning": "Введите новый пароль",
"AuthenticationRequiredUsernameHelpTextWarning": "Введите новое имя пользователя",
"RestartProwlarr": "Перезапустить {appName}"
"RestartProwlarr": "Перезапустить {appName}",
"AuthenticationRequiredWarning": "Чтобы предотвратить удаленный доступ без авторизации, {appName} теперь требует, чтобы авторизация была включена. При желании вы можете отключить авторизацию с локальных адресов."
}

View File

@@ -13,10 +13,10 @@
"Filter": "Filter",
"Files": "Filer",
"Events": "Händelser",
"Edit": "Redigera",
"Edit": "Ändra",
"DownloadClientStatusCheckSingleClientMessage": "Otillgängliga nedladdningsklienter på grund av misslyckade anslutningsförsök: {0}",
"DownloadClientStatusCheckAllClientMessage": "Samtliga nedladdningsklienter är otillgängliga på grund av misslyckade anslutningsförsök",
"DownloadClients": "Nedladdningsklienter",
"DownloadClients": "Nerladdningsklienter",
"Delete": "Radera",
"Dates": "Datum",
"Date": "Datum",
@@ -196,7 +196,7 @@
"IncludeHealthWarningsHelpText": "Inkludera hälsovarningar",
"IndexerFlags": "Indexerflaggor",
"AddDownloadClient": "Lägg till nedladdningsklient",
"AddIndexer": "Lägg till indexerare",
"AddIndexer": "Lägg till index",
"AddingTag": "Lägg till tagg",
"Enabled": "Aktiverad",
"Exception": "Undantag",
@@ -394,7 +394,7 @@
"No": "Nej",
"ApplicationLongTermStatusCheckAllClientMessage": "Alla indexerare är inte tillgängliga på grund av fel i mer än 6 timmar",
"ApplicationLongTermStatusCheckSingleClientMessage": "Indexatorer är inte tillgängliga på grund av misslyckanden i mer än sex timmar: {0}",
"Duration": "Tid",
"Duration": "Längd",
"Ended": "Avslutad",
"LastDuration": "lastDuration",
"LastExecution": "Senaste avrättningen",
@@ -437,5 +437,6 @@
"AuthForm": "Blanketter (inloggningssida)",
"DisabledForLocalAddresses": "Inaktiverad för lokala adresser",
"None": "Ingen",
"ResetAPIKeyMessageText": "Är du säker på att du vill nollställa din API-nyckel?"
"ResetAPIKeyMessageText": "Är du säker på att du vill nollställa din API-nyckel?",
"AddCustomFilter": "Lägg till anpassat filter"
}

View File

@@ -360,5 +360,14 @@
"Categories": "Kategoriler",
"Application": "Uygulamalar",
"Episode": "bölüm",
"AddConnection": "Bağlantı Ekle"
"AddConnection": "Bağlantı Ekle",
"AddApplicationImplementation": "Koşul Ekle - {implementationName}",
"AddIndexerImplementation": "Koşul Ekle - {implementationName}",
"AddIndexerProxyImplementation": "Koşul Ekle - {implementationName}",
"EditConnectionImplementation": "Koşul Ekle - {implementationName}",
"AddConnectionImplementation": "Koşul Ekle - {implementationName}",
"RestartProwlarr": "{appName}'ı yeniden başlatın",
"EditApplicationImplementation": "Koşul Ekle - {implementationName}",
"EditIndexerImplementation": "Koşul Ekle - {implementationName}",
"EditIndexerProxyImplementation": "Koşul Ekle - {implementationName}"
}

View File

@@ -368,5 +368,13 @@
"DisabledForLocalAddresses": "Відключено для локальних адрес",
"None": "Жодного",
"ResetAPIKeyMessageText": "Ви впевнені, що хочете скинути свій ключ API?",
"AddConnection": "Редагувати колекцію"
"AddConnection": "Редагувати колекцію",
"RestartProwlarr": "Перезавантажити {appName}",
"EditApplicationImplementation": "Додати умому",
"EditConnectionImplementation": "Додати умому",
"EditIndexerImplementation": "Додати умому",
"AddConnectionImplementation": "Додати умому",
"AddApplicationImplementation": "Додати умому",
"AddIndexerImplementation": "Додати умому",
"AddIndexerProxyImplementation": "Додати умому"
}

View File

@@ -495,7 +495,7 @@
"ApplyTagsHelpTextAdd": "添加: 添加标签至已有的标签列表中",
"CountDownloadClientsSelected": "已选择 {count} 个下载客户端",
"CountIndexersSelected": "已选择 {count} 个索引器",
"DeleteSelectedDownloadClientsMessageText": "您确定要删除{count}选定的下载客户端吗?",
"DeleteSelectedDownloadClientsMessageText": "您确定要删除 {count}选定的下载客户端吗?",
"DeleteSelectedIndexersMessageText": "您确定要删除{count}选定的索引器吗?",
"EditSelectedDownloadClients": "编辑选定的下载客户端",
"Implementation": "执行",
@@ -600,5 +600,8 @@
"PackSeedTime": "做种时间",
"PasswordConfirmation": "确认密码",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "确认新密码",
"InvalidUILanguage": "语言"
"InvalidUILanguage": "您的UI设置为无效语言请纠正并保存设置",
"NoIndexerCategories": "没有找到此索引器的分类",
"DownloadClientQbittorrentSettingsContentLayout": "内容布局",
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "是否使用 qBittorrent 配置的内容布局使用种子的原始布局或始终创建子文件夹qBittorrent 4.3.2+"
}

View File

@@ -104,5 +104,26 @@
"AppDataDirectory": "AppData 路徑",
"Applications": "應用程式",
"AuthBasic": "基礎(瀏覽器彈出視窗)",
"AuthForm": "表單(登入頁面)"
"AuthForm": "表單(登入頁面)",
"AddConnection": "新增連接",
"AddConnectionImplementation": "新增連接 - {implementationName}",
"AddDownloadClientImplementation": "新增下載用戶端 - {implementationName}",
"AddIndexerImplementation": "新增索引 - {implementationName}",
"UnableToAddANewAppProfilePleaseTryAgain": "無法加入新的條件,請重新嘗試。",
"UnableToAddANewApplicationPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
"UnableToAddANewDownloadClientPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
"UnableToAddANewIndexerPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
"UnableToAddANewIndexerProxyPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
"AddApplicationImplementation": "新增連接 - {implementationName}",
"AddIndexerProxyImplementation": "新增索引 - {implementationName}",
"EditConnectionImplementation": "新增連接 - {implementationName}",
"EditDownloadClientImplementation": "新增下載用戶端 - {implementationName}",
"UnableToAddANewNotificationPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
"EditIndexerImplementation": "新增索引 - {implementationName}",
"EditApplicationImplementation": "新增連接 - {implementationName}",
"EditIndexerProxyImplementation": "新增索引 - {implementationName}",
"ApplyTagsHelpTextAdd": "加入:將標籤加入已存在的標籤清單",
"AppUpdated": "{appName}已更新",
"AppUpdatedVersion": "重新載入",
"ApplyChanges": "應用"
}

View File

@@ -65,11 +65,6 @@ namespace NzbDrone.Core.Notifications.Discord
discordField.Name = "Host";
discordField.Value = message.Host ?? string.Empty;
break;
case DiscordGrabFieldType.Size:
discordField.Name = "Size";
discordField.Value = BytesToString(message.Release.Size.GetValueOrDefault(0));
discordField.Inline = true;
break;
}
if (discordField.Name.IsNotNullOrWhiteSpace() && discordField.Value.IsNotNullOrWhiteSpace())

View File

@@ -7,7 +7,6 @@ namespace NzbDrone.Core.Notifications.Discord
DownloadClient,
GrabTrigger,
Source,
Host,
Size
Host
}
}

View File

@@ -26,8 +26,7 @@ namespace NzbDrone.Core.Notifications.Discord
(int)DiscordGrabFieldType.DownloadClient,
(int)DiscordGrabFieldType.GrabTrigger,
(int)DiscordGrabFieldType.Source,
(int)DiscordGrabFieldType.Host,
(int)DiscordGrabFieldType.Size
(int)DiscordGrabFieldType.Host
};
}

View File

@@ -24,6 +24,7 @@ using NzbDrone.Common.Instrumentation;
using NzbDrone.Common.Instrumentation.Extensions;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Datastore.Extensions;
using Prowlarr.Http.ClientSchema;
using PostgresOptions = NzbDrone.Core.Datastore.PostgresOptions;
namespace NzbDrone.Host
@@ -147,6 +148,8 @@ namespace NzbDrone.Host
.AddNzbDroneLogger()
.AddDatabase()
.AddStartupContext(context);
SchemaBuilder.Initialize(c);
})
.ConfigureServices(services =>
{

View File

@@ -1,4 +1,5 @@
using Prowlarr.Api.V1.Indexers;
using System.Collections.Generic;
using Prowlarr.Api.V1.Indexers;
using RestSharp;
namespace NzbDrone.Integration.Test.Client
@@ -9,5 +10,11 @@ namespace NzbDrone.Integration.Test.Client
: base(restClient, apiKey)
{
}
public List<IndexerResource> Schema()
{
var request = BuildRequest("/schema");
return Get<List<IndexerResource>>(request);
}
}
}

View File

@@ -1,13 +1,14 @@
using System;
using System.Linq;
using System.Threading;
using NLog;
using NUnit.Framework;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.Datastore.Migration.Framework;
using NzbDrone.Core.Indexers.Definitions.FileList;
using NzbDrone.Core.Indexers.Newznab;
using NzbDrone.Test.Common;
using NzbDrone.Test.Common.Datastore;
using Prowlarr.Http.ClientSchema;
namespace NzbDrone.Integration.Test
{
@@ -49,16 +50,19 @@ namespace NzbDrone.Integration.Test
{
WaitForCompletion(() => Tasks.All().SelectList(x => x.TaskName).Contains("CheckHealth"), 20000);
Indexers.Post(new Prowlarr.Api.V1.Indexers.IndexerResource
var indexer = Indexers.Schema().FirstOrDefault(i => i.Implementation == nameof(Newznab));
if (indexer == null)
{
Enable = false,
ConfigContract = nameof(FileListSettings),
Implementation = nameof(FileList),
Name = "NewznabTest",
Protocol = Core.Indexers.DownloadProtocol.Usenet,
AppProfileId = 1,
Fields = SchemaBuilder.ToSchema(new FileListSettings())
});
throw new NullReferenceException("Expected valid indexer schema, found null");
}
indexer.Enable = false;
indexer.ConfigContract = nameof(NewznabSettings);
indexer.Implementation = nameof(Newznab);
indexer.Name = "NewznabTest";
indexer.Protocol = Core.Indexers.DownloadProtocol.Usenet;
indexer.AppProfileId = 1;
// Change Console Log Level to Debug so we get more details.
var config = HostConfig.Get(1);

View File

@@ -23,6 +23,8 @@ namespace NzbDrone.Test.Common.AutoMoq
SetupAutoMoqer(CreateTestContainer(new Container()));
}
public IContainer Container => _container;
public virtual T Resolve<T>()
{
var result = _container.Resolve<T>();

View File

@@ -1,6 +1,9 @@
using System.Collections.Generic;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Core.Annotations;
using NzbDrone.Core.Localization;
using NzbDrone.Test.Common;
using Prowlarr.Http.ClientSchema;
@@ -9,6 +12,16 @@ namespace NzbDrone.Api.Test.ClientSchemaTests
[TestFixture]
public class SchemaBuilderFixture : TestBase
{
[SetUp]
public void Setup()
{
Mocker.GetMock<ILocalizationService>()
.Setup(s => s.GetLocalizedString(It.IsAny<string>(), It.IsAny<Dictionary<string, object>>()))
.Returns<string, Dictionary<string, object>>((s, d) => s);
SchemaBuilder.Initialize(Mocker.Container);
}
[Test]
public void should_return_field_for_every_property()
{

View File

@@ -22,15 +22,14 @@ namespace Prowlarr.Api.V1.History
[HttpGet]
[Produces("application/json")]
public PagingResource<HistoryResource> GetHistory([FromQuery] PagingRequestResource paging, int? eventType, bool? successful, string downloadId)
public PagingResource<HistoryResource> GetHistory([FromQuery] PagingRequestResource paging, [FromQuery(Name = "eventType")] int[] eventTypes, bool? successful, string downloadId, [FromQuery] int[] indexerIds = null)
{
var pagingResource = new PagingResource<HistoryResource>(paging);
var pagingSpec = pagingResource.MapToPagingSpec<HistoryResource, NzbDrone.Core.History.History>("date", SortDirection.Descending);
if (eventType.HasValue)
if (eventTypes != null && eventTypes.Any())
{
var filterValue = (HistoryEventType)eventType.Value;
pagingSpec.FilterExpressions.Add(v => v.EventType == filterValue);
pagingSpec.FilterExpressions.Add(v => eventTypes.Contains((int)v.EventType));
}
if (successful.HasValue)
@@ -44,7 +43,12 @@ namespace Prowlarr.Api.V1.History
pagingSpec.FilterExpressions.Add(h => h.DownloadId == downloadId);
}
return pagingSpec.ApplyToPage(_historyService.Paged, MapToResource);
if (indexerIds != null && indexerIds.Any())
{
pagingSpec.FilterExpressions.Add(h => indexerIds.Contains(h.IndexerId));
}
return pagingSpec.ApplyToPage(h => _historyService.Paged(pagingSpec), MapToResource);
}
[HttpGet("since")]

View File

@@ -9,6 +9,7 @@ using NLog;
using NzbDrone.Common.Cache;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Download;
using NzbDrone.Core.Download.Clients;
using NzbDrone.Core.Exceptions;
using NzbDrone.Core.Indexers;
using NzbDrone.Core.IndexerSearch;
@@ -54,7 +55,7 @@ namespace Prowlarr.Api.V1.Search
[HttpPost]
[Consumes("application/json")]
[Produces("application/json")]
public ActionResult<ReleaseResource> GrabRelease(ReleaseResource release)
public async Task<ActionResult<ReleaseResource>> GrabRelease(ReleaseResource release)
{
ValidateResource(release);
@@ -73,11 +74,12 @@ namespace Prowlarr.Api.V1.Search
try
{
_downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect, null).GetAwaiter().GetResult();
await _downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect, null);
}
catch (ReleaseDownloadException ex)
{
_logger.Error(ex, "Getting release from indexer failed");
throw new NzbDroneClientException(HttpStatusCode.Conflict, "Getting release from indexer failed");
}
@@ -87,12 +89,16 @@ namespace Prowlarr.Api.V1.Search
[HttpPost("bulk")]
[Consumes("application/json")]
[Produces("application/json")]
public ActionResult<ReleaseResource> GrabReleases(List<ReleaseResource> releases)
public async Task<ActionResult<ReleaseResource>> GrabReleases(List<ReleaseResource> releases)
{
releases.ForEach(release => ValidateResource(release));
var source = Request.GetSource();
var host = Request.GetHostName();
var groupedReleases = releases.GroupBy(r => r.IndexerId);
var grabbedReleases = new List<ReleaseResource>();
var groupedReleases = releases.GroupBy(r => r.IndexerId).ToList();
foreach (var indexerReleases in groupedReleases)
{
@@ -100,22 +106,42 @@ namespace Prowlarr.Api.V1.Search
foreach (var release in indexerReleases)
{
ValidateResource(release);
var releaseInfo = _remoteReleaseCache.Find(GetCacheKey(release));
if (releaseInfo == null)
{
_logger.Error("Couldn't find requested release in cache, cache timeout probably expired.");
continue;
}
try
{
_downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect, null).GetAwaiter().GetResult();
await _downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect, null);
}
catch (ReleaseDownloadException ex)
{
_logger.Error(ex, "Getting release from indexer failed");
continue;
}
catch (DownloadClientException ex)
{
_logger.Error(ex, "Failed to send grabbed release to download client");
continue;
}
grabbedReleases.Add(release);
}
}
return Ok(releases);
if (!grabbedReleases.Any())
{
throw new NzbDroneClientException(HttpStatusCode.BadRequest, "Failed to grab any release");
}
return Ok(grabbedReleases);
}
[HttpGet]

View File

@@ -1468,8 +1468,11 @@
"name": "eventType",
"in": "query",
"schema": {
"type": "integer",
"format": "int32"
"type": "array",
"items": {
"type": "integer",
"format": "int32"
}
}
},
{
@@ -1485,6 +1488,17 @@
"schema": {
"type": "string"
}
},
{
"name": "indexerIds",
"in": "query",
"schema": {
"type": "array",
"items": {
"type": "integer",
"format": "int32"
}
}
}
],
"responses": {

View File

@@ -3,17 +3,25 @@ using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text.Json;
using DryIoc;
using NzbDrone.Common.EnsureThat;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Reflection;
using NzbDrone.Common.Serializer;
using NzbDrone.Core.Annotations;
using NzbDrone.Core.Localization;
namespace Prowlarr.Http.ClientSchema
{
public static class SchemaBuilder
{
private static Dictionary<Type, FieldMapping[]> _mappings = new Dictionary<Type, FieldMapping[]>();
private static ILocalizationService _localizationService;
public static void Initialize(IContainer container)
{
_localizationService = container.Resolve<ILocalizationService>();
}
public static List<Field> ToSchema(object model)
{
@@ -93,13 +101,27 @@ namespace Prowlarr.Http.ClientSchema
if (propertyInfo.PropertyType.IsSimpleType())
{
var fieldAttribute = property.Item2;
var label = fieldAttribute.Label.IsNotNullOrWhiteSpace()
? _localizationService.GetLocalizedString(fieldAttribute.Label,
GetTokens(type, fieldAttribute.Label, TokenField.Label))
: fieldAttribute.Label;
var helpText = fieldAttribute.HelpText.IsNotNullOrWhiteSpace()
? _localizationService.GetLocalizedString(fieldAttribute.HelpText,
GetTokens(type, fieldAttribute.Label, TokenField.HelpText))
: fieldAttribute.HelpText;
var helpTextWarning = fieldAttribute.HelpTextWarning.IsNotNullOrWhiteSpace()
? _localizationService.GetLocalizedString(fieldAttribute.HelpTextWarning,
GetTokens(type, fieldAttribute.Label, TokenField.HelpTextWarning))
: fieldAttribute.HelpTextWarning;
var field = new Field
{
Name = prefix + GetCamelCaseName(propertyInfo.Name),
Label = fieldAttribute.Label,
Label = label,
Unit = fieldAttribute.Unit,
HelpText = fieldAttribute.HelpText,
HelpTextWarning = fieldAttribute.HelpTextWarning,
HelpText = helpText,
HelpTextWarning = helpTextWarning,
HelpLink = fieldAttribute.HelpLink,
Order = fieldAttribute.Order,
Advanced = fieldAttribute.Advanced,
@@ -158,6 +180,24 @@ namespace Prowlarr.Http.ClientSchema
.ToArray();
}
private static Dictionary<string, object> GetTokens(Type type, string label, TokenField field)
{
var tokens = new Dictionary<string, object>();
foreach (var propertyInfo in type.GetProperties())
{
foreach (var attribute in propertyInfo.GetCustomAttributes(true))
{
if (attribute is FieldTokenAttribute fieldTokenAttribute && fieldTokenAttribute.Field == field && fieldTokenAttribute.Label == label)
{
tokens.Add(fieldTokenAttribute.Token, fieldTokenAttribute.Value);
}
}
}
return tokens;
}
private static List<SelectOption> GetSelectOptions(Type selectOptions)
{
if (selectOptions.IsEnum)