mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2026-04-17 21:44:48 -04:00
Compare commits
13 Commits
v1.12.0.41
...
v1.12.1.42
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
031d81330d | ||
|
|
6201b42fbd | ||
|
|
7022054dd7 | ||
|
|
c9b663247c | ||
|
|
0b0a0cfa5b | ||
|
|
3c0fea8b7c | ||
|
|
ac97952fd7 | ||
|
|
c3e40c0564 | ||
|
|
ce615a77c2 | ||
|
|
0f6dfe389c | ||
|
|
25d94a9286 | ||
|
|
52a690b41a | ||
|
|
56c8c3d6c6 |
@@ -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)'
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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[];
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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';
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
|
||||
54
frontend/src/History/HistoryFilterModal.tsx
Normal file
54
frontend/src/History/HistoryFilterModal.tsx
Normal 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}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -11,6 +11,12 @@
|
||||
flex: 0 0 60px;
|
||||
}
|
||||
|
||||
.id {
|
||||
composes: cell;
|
||||
|
||||
flex: 0 0 60px;
|
||||
}
|
||||
|
||||
.sortName {
|
||||
composes: cell;
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ interface CssExports {
|
||||
'cell': string;
|
||||
'checkInput': string;
|
||||
'externalLink': string;
|
||||
'id': string;
|
||||
'minimumSeeders': string;
|
||||
'packSeedTime': string;
|
||||
'priority': string;
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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';
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ interface CssExports {
|
||||
'added': string;
|
||||
'appProfileId': string;
|
||||
'capabilities': string;
|
||||
'id': string;
|
||||
'minimumSeeders': string;
|
||||
'packSeedTime': string;
|
||||
'priority': string;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -285,7 +285,7 @@ class SearchIndex extends Component {
|
||||
const hasNoIndexer = !totalItems;
|
||||
|
||||
return (
|
||||
<PageContent>
|
||||
<PageContent title={translate('Search')}>
|
||||
<PageToolbar>
|
||||
<PageToolbarSection
|
||||
alignContent={align.RIGHT}
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
|
||||
};
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -74,8 +74,9 @@ export const defaultState = {
|
||||
valueType: filterBuilderValueTypes.TAG
|
||||
}
|
||||
],
|
||||
selectedFilterKey: 'all',
|
||||
customFilters: []
|
||||
|
||||
selectedFilterKey: 'all'
|
||||
|
||||
};
|
||||
|
||||
export const persistState = [
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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ů"
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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ää"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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}"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -352,5 +352,6 @@
|
||||
"AuthForm": "フォーム(ログインページ)",
|
||||
"DisabledForLocalAddresses": "ローカルアドレスでは無効",
|
||||
"None": "なし",
|
||||
"ResetAPIKeyMessageText": "APIキーをリセットしてもよろしいですか?"
|
||||
"ResetAPIKeyMessageText": "APIキーをリセットしてもよろしいですか?",
|
||||
"RestartProwlarr": "{appName}を再起動します"
|
||||
}
|
||||
|
||||
@@ -352,5 +352,6 @@
|
||||
"DisabledForLocalAddresses": "로컬 주소에 대해 비활성화됨",
|
||||
"None": "없음",
|
||||
"ResetAPIKeyMessageText": "API 키를 재설정하시겠습니까?",
|
||||
"StopSelecting": "선택 취소"
|
||||
"StopSelecting": "선택 취소",
|
||||
"RestartProwlarr": "{appName} 다시 시작"
|
||||
}
|
||||
|
||||
@@ -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}"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -419,5 +419,6 @@
|
||||
"AuthenticationMethod": "Способ авторизации",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Введите новый пароль",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Введите новое имя пользователя",
|
||||
"RestartProwlarr": "Перезапустить {appName}"
|
||||
"RestartProwlarr": "Перезапустить {appName}",
|
||||
"AuthenticationRequiredWarning": "Чтобы предотвратить удаленный доступ без авторизации, {appName} теперь требует, чтобы авторизация была включена. При желании вы можете отключить авторизацию с локальных адресов."
|
||||
}
|
||||
|
||||
@@ -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}"
|
||||
}
|
||||
|
||||
@@ -368,5 +368,13 @@
|
||||
"DisabledForLocalAddresses": "Відключено для локальних адрес",
|
||||
"None": "Жодного",
|
||||
"ResetAPIKeyMessageText": "Ви впевнені, що хочете скинути свій ключ API?",
|
||||
"AddConnection": "Редагувати колекцію"
|
||||
"AddConnection": "Редагувати колекцію",
|
||||
"RestartProwlarr": "Перезавантажити {appName}",
|
||||
"EditApplicationImplementation": "Додати умому",
|
||||
"EditConnectionImplementation": "Додати умому",
|
||||
"EditIndexerImplementation": "Додати умому",
|
||||
"AddConnectionImplementation": "Додати умому",
|
||||
"AddApplicationImplementation": "Додати умому",
|
||||
"AddIndexerImplementation": "Додати умому",
|
||||
"AddIndexerProxyImplementation": "Додати умому"
|
||||
}
|
||||
|
||||
@@ -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}"
|
||||
}
|
||||
|
||||
@@ -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")]
|
||||
|
||||
@@ -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": {
|
||||
|
||||
Reference in New Issue
Block a user