Compare commits

...

13 Commits

Author SHA1 Message Date
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
46 changed files with 458 additions and 115 deletions

View File

@@ -9,7 +9,7 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '1.12.0'
majorVersion: '1.12.1'
minorVersion: $[counter('minorVersion', 1)]
prowlarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(prowlarrVersion)'

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

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

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

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

@@ -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",
@@ -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",
@@ -351,11 +351,11 @@
"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 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,15 +363,15 @@
"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 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": "Afegeix una connexió",
"NotificationStatusAllClientHealthCheckMessage": "Totes les llistes no estan disponibles a causa d'errors",
"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",
@@ -410,5 +410,18 @@
"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"
"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"
}

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

@@ -337,7 +337,7 @@
"SearchTypes": "Suchtyp",
"Security": "Sicherheit",
"Seeders": "Seeders",
"SelectAll": "Alles auswählen",
"SelectAll": "Alle wählen",
"SemiPrivate": "Halbprivat",
"SendAnonymousUsageData": "Sende anonyme Nutzungsdaten",
"SetTags": "Tags festlegen",

View File

@@ -200,7 +200,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",
@@ -248,7 +248,7 @@
"HomePage": "Home Page",
"Host": "Host",
"Hostname": "Hostname",
"Id": "Id",
"Id": "ID",
"IgnoredAddresses": "Ignored Addresses",
"IllRestartLater": "I'll restart later",
"Implementation": "Implementation",
@@ -266,6 +266,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}",
@@ -279,7 +280,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

@@ -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",
@@ -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",
@@ -496,8 +496,24 @@
"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 indexador",
"EnableRssHelpText": "Habilitar feed RSS para el indexador",
"days": "días",
"ElapsedTime": "Tiempo transcurrido",
"GrabTitle": "Capturar título"
"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

@@ -5,7 +5,7 @@
"MovieIndexScrollTop": "Elokuvakirjasto: vieritä ylös",
"Apply": "Käytä",
"ClientPriority": "Lataustyökalun painotus",
"IndexerPriorityHelpText": "Tietolähteen painotus, 1 50 (korkein-alin). 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",
@@ -38,7 +38,7 @@
"History": "Historia",
"MIA": "Puuttuu",
"New": "Uutta",
"PageSizeHelpText": "Sivulla näytettävien kohteiden määrä",
"PageSizeHelpText": "Sivukohtainen kohdemäärä.",
"Proxy": "Välityspalvelin",
"ProxyBypassFilterHelpText": "Käytä erottimena ',' ja '*.' jokerimerkkinä aliverkkotunnuksille (esim. www.esimerkki.fi,*.esimerkki.fi)",
"Reddit": "Reddit",
@@ -70,17 +70,17 @@
"YesCancel": "Kyllä, peru",
"NoTagsHaveBeenAddedYet": "Tunnisteita ei ole vielä lisätty.",
"ApplyTags": "Tunnistetoimenpide",
"Authentication": "Todennus",
"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",
"InteractiveSearch": "Manuaalihaku",
"Interval": "Ajoitus",
"KeyboardShortcuts": "Pikanäppäimet",
"LastWriteTime": "Edellinen tallennusaika",
@@ -173,9 +173,9 @@
"UnableToLoadNotifications": "Kytkentöjen lataus epäonnistui.",
"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",
"ConnectionLost": "Ei yhteyttä",
"DeleteDownloadClientMessageText": "Haluatko varmasti poistaa lataustyökalun \"{name}\"?",
"DeleteTagMessageText": "Haluatko varmasti poistaa tunnisteen \"{label}\"?",
"Discord": "Discord",
@@ -186,14 +186,14 @@
"EventType": "Tapahtuman tyyppi",
"Exception": "Poikkeus",
"FeatureRequests": "Kehitysehdotukset",
"Grabbed": "Siepattu",
"Grabbed": "Kaapattu",
"IgnoredAddresses": "Ohitetut osoitteet",
"IllRestartLater": "Käynnistän uudelleen myöhemmin",
"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",
@@ -226,7 +226,7 @@
"Backups": "Varmuuskopiot",
"BeforeUpdate": "Ennen päivitystä",
"BindAddress": "Sidososoite",
"Branch": "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",
@@ -236,12 +236,12 @@
"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 \"{name}\"?",
@@ -251,8 +251,8 @@
"DownloadClientStatusCheckSingleClientMessage": "Lataustyökaluja ei ole ongelmien vuoksi käytettävissä: {0}",
"EditIndexer": "Muokkaa tietolähdettä",
"EnableAutomaticSearch": "Käytä automaattihakua",
"EnableInteractiveSearch": "Käytä vuorovaikutteista hakua",
"EnableInteractiveSearchHelpText": "Profiilia käytetään vuorovaikutteisen haun yhteydessä.",
"EnableInteractiveSearch": "Käytä manuaalihakua",
"EnableInteractiveSearchHelpText": "Profiilia käytetään manuaalihakuun.",
"EnableSSL": "SSL-salaus",
"EnableSslHelpText": " Käyttöönotto vaatii uudelleenkäynnistyksen järjestelmänvavojan oikeuksilla.",
"Error": "Virhe",
@@ -266,7 +266,7 @@
"General": "Yleiset",
"GeneralSettings": "Yleiset asetukset",
"GeneralSettingsSummary": "Portti, SSL-salaus, käyttäjänimi ja salasana, välityspalvelin, analytiikka ja päivitykset.",
"Grabs": "Sieppaukset",
"Grabs": "Kaappaukset",
"Health": "Terveys",
"Level": "Taso",
"HealthNoIssues": "Kokoonpanossasi ei ole ongelmia",
@@ -309,7 +309,7 @@
"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 välitä sieppaus suoraan {appName}-välityksen sijaan.",
"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",
@@ -326,7 +326,7 @@
"SettingsIndexerLoggingHelpText": "Kirjaa tarkempia tietoja tietolähteiden toiminnasta, mukaanlukien vastaukset",
"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",
"SearchIndexers": "Etsi tietolähteistä",
@@ -352,7 +352,7 @@
"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",
@@ -363,7 +363,7 @@
"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",
@@ -386,9 +386,9 @@
"QueryOptions": "Kyselyasetukset",
"TvSearch": "Etsi televisiosarjoja",
"Filters": "Suodattimet",
"OnGrab": "Kun julkaisu siepataan",
"OnGrab": "Kun julkaisu kaapataan",
"OnHealthIssue": "Kun havaitaan kuntoon liittyvä ongelma",
"HistoryCleanupDaysHelpText": "Poista automaattinen tyhjennys käytöstä asettamalla arvoksi '0'.",
"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",
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent-tiedon ilmoitti sovellus, joka kommunikoi API:n kanssa",
@@ -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",
@@ -440,7 +440,7 @@
"ElapsedTime": "Kulunut aika",
"EnabledRedirected": "Kulunut, uudelleenohjattu",
"Ended": "Päättyi",
"GrabTitle": "Sieppaa nimike",
"GrabTitle": "Kaappaa nimike",
"LastExecution": "Edellinen suoritus",
"LastDuration": "Edellinen kesto",
"NextExecution": "Seuraava suoritus",
@@ -453,7 +453,7 @@
"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",
@@ -499,15 +499,15 @@
"DisabledForLocalAddresses": "Ei käytetä 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 käynnistettävä uudelleen.",
"IndexerDownloadClientHelpText": "Määritä tämän tietolähteen kanssa käytettävä lataustyökalu",
"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 siepataan",
"OnGrabHelpText": "Kun julkaisu kaapataan",
"ManageDownloadClients": "Hallitse lataustyökaluja",
"NoDownloadClientsFound": "Lataustyökaluja ei löytynyt",
"CountDownloadClientsSelected": "{count} lataustyökalu(a) on valittu",
@@ -527,5 +527,21 @@
"DownloadClientQbittorrentSettingsContentLayout": "Sisällön asettelu",
"EditIndexerImplementation": "Muokataan tietolähdettä - {implementationName}",
"AuthenticationRequiredUsernameHelpTextWarning": "Syötä uusi käyttäjätunnus",
"DefaultNameCopiedProfile": "{name} - Kopioi"
"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ä salasana",
"AuthenticationMethod": "Tunnistautumistapa",
"Clone": "Monista",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Vahvista uusi salasana",
"EditApplicationImplementation": "Muokataan kytköstä - {implementationName}",
"AddApplicationImplementation": "Lisätään kytköstä - {implementationName}",
"InvalidUILanguage": "Käytöliittymän kielivalinta on virheellinen. Korjaa se ja tallenna asetukset.",
"SeedRatio": "Jakosuhde",
"SeedTime": "Jakoaika",
"days": "päivää"
}

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",
@@ -601,5 +601,6 @@
"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"
}

View File

@@ -517,5 +517,12 @@
"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"
"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

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

@@ -481,5 +481,6 @@
"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."
"AuthenticationRequiredWarning": "Om toegang zonder authenticatie te voorkomen vereist {appName} nu verificatie. Je kan dit optioneel uitschakelen voor lokale adressen.",
"Episode": "aflevering"
}

View File

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

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

@@ -108,5 +108,18 @@
"AddConnection": "新增連接",
"AddConnectionImplementation": "新增連接 - {implementationName}",
"AddDownloadClientImplementation": "新增下載用戶端 - {implementationName}",
"AddIndexerImplementation": "新增索引 - {implementationName}"
"AddIndexerImplementation": "新增索引 - {implementationName}",
"UnableToAddANewAppProfilePleaseTryAgain": "無法加入新的條件,請重新嘗試。",
"UnableToAddANewApplicationPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
"UnableToAddANewDownloadClientPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
"UnableToAddANewIndexerPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
"UnableToAddANewIndexerProxyPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
"AddApplicationImplementation": "新增連接 - {implementationName}",
"AddIndexerProxyImplementation": "新增索引 - {implementationName}",
"EditConnectionImplementation": "新增連接 - {implementationName}",
"EditDownloadClientImplementation": "新增下載用戶端 - {implementationName}",
"UnableToAddANewNotificationPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
"EditIndexerImplementation": "新增索引 - {implementationName}",
"EditApplicationImplementation": "新增連接 - {implementationName}",
"EditIndexerProxyImplementation": "新增索引 - {implementationName}"
}

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

@@ -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": {