mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2026-04-17 21:44:48 -04:00
Compare commits
43 Commits
v1.11.3.41
...
v1.12.2.42
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9668e91b21 | ||
|
|
49857693c0 | ||
|
|
850315ad1c | ||
|
|
86124d4319 | ||
|
|
4f28d583d7 | ||
|
|
01f3930211 | ||
|
|
7c7114c87a | ||
|
|
ef8e6d774b | ||
|
|
2960fc37d9 | ||
|
|
8bddf753bb | ||
|
|
cff24b3fd4 | ||
|
|
031d81330d | ||
|
|
6201b42fbd | ||
|
|
7022054dd7 | ||
|
|
c9b663247c | ||
|
|
0b0a0cfa5b | ||
|
|
3c0fea8b7c | ||
|
|
ac97952fd7 | ||
|
|
c3e40c0564 | ||
|
|
ce615a77c2 | ||
|
|
0f6dfe389c | ||
|
|
25d94a9286 | ||
|
|
52a690b41a | ||
|
|
56c8c3d6c6 | ||
|
|
5cee8990b3 | ||
|
|
9679e88717 | ||
|
|
f4203993ba | ||
|
|
4be0715fe3 | ||
|
|
f9c9d4a0e0 | ||
|
|
bf47380f7b | ||
|
|
e27a46f578 | ||
|
|
af4e69f8fb | ||
|
|
1b2106d4f0 | ||
|
|
bdfbda3805 | ||
|
|
cb98b10468 | ||
|
|
ae1bc8366c | ||
|
|
67eeb4373c | ||
|
|
9d40a64be4 | ||
|
|
20cc146d82 | ||
|
|
8beff32117 | ||
|
|
8b7c488173 | ||
|
|
1dabbc94f8 | ||
|
|
52667b979b |
@@ -9,7 +9,7 @@ variables:
|
||||
testsFolder: './_tests'
|
||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||
majorVersion: '1.11.3'
|
||||
majorVersion: '1.12.2'
|
||||
minorVersion: $[counter('minorVersion', 1)]
|
||||
prowlarrVersion: '$(majorVersion).$(minorVersion)'
|
||||
buildName: '$(Build.SourceBranchName).$(prowlarrVersion)'
|
||||
@@ -17,7 +17,7 @@ variables:
|
||||
sentryUrl: 'https://sentry.servarr.com'
|
||||
dotnetVersion: '6.0.417'
|
||||
nodeVersion: '16.X'
|
||||
innoVersion: '6.2.0'
|
||||
innoVersion: '6.2.2'
|
||||
windowsImage: 'windows-2022'
|
||||
linuxImage: 'ubuntu-20.04'
|
||||
macImage: 'macOS-11'
|
||||
@@ -1206,6 +1206,7 @@ stages:
|
||||
- stage: Report_Out
|
||||
dependsOn:
|
||||
- Analyze
|
||||
- Installer
|
||||
- Unit_Test
|
||||
- Integration
|
||||
- Automation
|
||||
|
||||
2
build.sh
2
build.sh
@@ -254,7 +254,7 @@ InstallInno()
|
||||
ProgressStart "Installing portable Inno Setup"
|
||||
|
||||
rm -rf _inno
|
||||
curl -s --output innosetup.exe "https://files.jrsoftware.org/is/6/innosetup-${INNOVERSION:-6.2.0}.exe"
|
||||
curl -s --output innosetup.exe "https://files.jrsoftware.org/is/6/innosetup-${INNOVERSION:-6.2.2}.exe"
|
||||
mkdir _inno
|
||||
./innosetup.exe //portable=1 //silent //currentuser //dir=.\\_inno
|
||||
rm innosetup.exe
|
||||
|
||||
@@ -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;
|
||||
@@ -30,22 +30,24 @@ function CustomFiltersModalContent(props) {
|
||||
|
||||
<ModalBody>
|
||||
{
|
||||
customFilters.map((customFilter) => {
|
||||
return (
|
||||
<CustomFilter
|
||||
key={customFilter.id}
|
||||
id={customFilter.id}
|
||||
label={customFilter.label}
|
||||
filters={customFilter.filters}
|
||||
selectedFilterKey={selectedFilterKey}
|
||||
isDeleting={isDeleting}
|
||||
deleteError={deleteError}
|
||||
dispatchSetFilter={dispatchSetFilter}
|
||||
dispatchDeleteCustomFilter={dispatchDeleteCustomFilter}
|
||||
onEditPress={onEditCustomFilter}
|
||||
/>
|
||||
);
|
||||
})
|
||||
customFilters
|
||||
.sort((a, b) => a.label.localeCompare(b.label))
|
||||
.map((customFilter) => {
|
||||
return (
|
||||
<CustomFilter
|
||||
key={customFilter.id}
|
||||
id={customFilter.id}
|
||||
label={customFilter.label}
|
||||
filters={customFilter.filters}
|
||||
selectedFilterKey={selectedFilterKey}
|
||||
isDeleting={isDeleting}
|
||||
deleteError={deleteError}
|
||||
dispatchSetFilter={dispatchSetFilter}
|
||||
dispatchDeleteCustomFilter={dispatchDeleteCustomFilter}
|
||||
onEditPress={onEditCustomFilter}
|
||||
/>
|
||||
);
|
||||
})
|
||||
}
|
||||
|
||||
<div className={styles.addButtonContainer}>
|
||||
|
||||
@@ -40,18 +40,26 @@ class FilterMenuContent extends Component {
|
||||
}
|
||||
|
||||
{
|
||||
customFilters.map((filter) => {
|
||||
return (
|
||||
<FilterMenuItem
|
||||
key={filter.id}
|
||||
filterKey={filter.id}
|
||||
selectedFilterKey={selectedFilterKey}
|
||||
onPress={onFilterSelect}
|
||||
>
|
||||
{filter.label}
|
||||
</FilterMenuItem>
|
||||
);
|
||||
})
|
||||
customFilters.length > 0 ?
|
||||
<MenuItemSeparator /> :
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
customFilters
|
||||
.sort((a, b) => a.label.localeCompare(b.label))
|
||||
.map((filter) => {
|
||||
return (
|
||||
<FilterMenuItem
|
||||
key={filter.id}
|
||||
filterKey={filter.id}
|
||||
selectedFilterKey={selectedFilterKey}
|
||||
onPress={onFilterSelect}
|
||||
>
|
||||
{filter.label}
|
||||
</FilterMenuItem>
|
||||
);
|
||||
})
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
@@ -369,8 +369,9 @@ export const actionHandlers = handleThunks({
|
||||
|
||||
promise.done((data) => {
|
||||
dispatch(batchActions([
|
||||
...data.map((release) => {
|
||||
...data.map(({ guid }) => {
|
||||
return updateRelease({
|
||||
guid,
|
||||
isGrabbing: false,
|
||||
isGrabbed: true,
|
||||
grabError: null
|
||||
|
||||
@@ -92,6 +92,10 @@ namespace NzbDrone.Common.Http
|
||||
{
|
||||
data = new XElement("base64", Convert.ToBase64String(bytes));
|
||||
}
|
||||
else if (value is Dictionary<string, string> d)
|
||||
{
|
||||
data = new XElement("struct", d.Select(p => new XElement("member", new XElement("name", p.Key), new XElement("value", p.Value))));
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidOperationException($"Unhandled argument type {value.GetType().Name}");
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
@@ -21,10 +22,10 @@ namespace NzbDrone.Core.Test.IndexerTests.GazelleGamesTests
|
||||
[SetUp]
|
||||
public void Setup()
|
||||
{
|
||||
Subject.Definition = new IndexerDefinition()
|
||||
Subject.Definition = new IndexerDefinition
|
||||
{
|
||||
Name = "GazelleGames",
|
||||
Settings = new GazelleGamesSettings() { Apikey = "somekey" }
|
||||
Settings = new GazelleGamesSettings { Apikey = "somekey" }
|
||||
};
|
||||
}
|
||||
|
||||
@@ -37,20 +38,20 @@ namespace NzbDrone.Core.Test.IndexerTests.GazelleGamesTests
|
||||
.Setup(o => o.ExecuteProxiedAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get), Subject.Definition))
|
||||
.Returns<HttpRequest, IndexerDefinition>((r, d) => Task.FromResult(new HttpResponse(r, new HttpHeader { { "Content-Type", "application/json" } }, new CookieCollection(), recentFeed)));
|
||||
|
||||
var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new int[] { 2000 } })).Releases;
|
||||
var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new[] { 2000 } })).Releases;
|
||||
|
||||
releases.Should().HaveCount(1464);
|
||||
releases.Should().HaveCount(1462);
|
||||
releases.First().Should().BeOfType<TorrentInfo>();
|
||||
|
||||
var torrentInfo = releases.First() as TorrentInfo;
|
||||
|
||||
torrentInfo.Title.Should().Be("Microsoft_Flight_Simulator-HOODLUM");
|
||||
torrentInfo.Title.Should().Be("Microsoft_Flight_Simulator-HOODLUM (2020) [Windows / Multi-Language / Full ISO]");
|
||||
torrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent);
|
||||
torrentInfo.DownloadUrl.Should().Be("https://gazellegames.net/torrents.php?action=download&id=303216&authkey=prowlarr&torrent_pass=");
|
||||
torrentInfo.InfoUrl.Should().Be("https://gazellegames.net/torrents.php?id=84781&torrentid=303216");
|
||||
torrentInfo.CommentUrl.Should().BeNullOrEmpty();
|
||||
torrentInfo.Indexer.Should().Be(Subject.Definition.Name);
|
||||
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-07-25 6:39:11").ToUniversalTime());
|
||||
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-07-25 06:39:11", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal));
|
||||
torrentInfo.Size.Should().Be(80077617780);
|
||||
torrentInfo.InfoHash.Should().Be(null);
|
||||
torrentInfo.MagnetUrl.Should().Be(null);
|
||||
@@ -74,7 +75,7 @@ namespace NzbDrone.Core.Test.IndexerTests.GazelleGamesTests
|
||||
.Setup(o => o.ExecuteProxiedAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get), Subject.Definition))
|
||||
.Returns<HttpRequest, IndexerDefinition>((r, d) => Task.FromResult(new HttpResponse(r, new HttpHeader { { "Content-Type", "application/json" } }, new CookieCollection(), recentFeed)));
|
||||
|
||||
var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new int[] { 2000 } })).Releases;
|
||||
var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new[] { 2000 } })).Releases;
|
||||
|
||||
releases.Should().HaveCount(0);
|
||||
}
|
||||
|
||||
@@ -41,6 +41,23 @@ namespace NzbDrone.Core.Annotations
|
||||
public string Hint { get; set; }
|
||||
}
|
||||
|
||||
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
|
||||
public class FieldTokenAttribute : Attribute
|
||||
{
|
||||
public FieldTokenAttribute(TokenField field, string label = "", string token = "", object value = null)
|
||||
{
|
||||
Label = label;
|
||||
Field = field;
|
||||
Token = token;
|
||||
Value = value?.ToString();
|
||||
}
|
||||
|
||||
public string Label { get; set; }
|
||||
public TokenField Field { get; set; }
|
||||
public string Token { get; set; }
|
||||
public string Value { get; set; }
|
||||
}
|
||||
|
||||
public class FieldSelectOption
|
||||
{
|
||||
public int Value { get; set; }
|
||||
@@ -82,4 +99,11 @@ namespace NzbDrone.Core.Annotations
|
||||
ApiKey,
|
||||
UserName
|
||||
}
|
||||
|
||||
public enum TokenField
|
||||
{
|
||||
Label,
|
||||
HelpText,
|
||||
HelpTextWarning
|
||||
}
|
||||
}
|
||||
|
||||
@@ -332,8 +332,8 @@ namespace NzbDrone.Core.Configuration
|
||||
return;
|
||||
}
|
||||
|
||||
// If SSL is enabled and a cert hash is still in the config file disable SSL
|
||||
if (EnableSsl && GetValue("SslCertHash", null).IsNotNullOrWhiteSpace())
|
||||
// If SSL is enabled and a cert hash is still in the config file or cert path is empty disable SSL
|
||||
if (EnableSsl && (GetValue("SslCertHash", null).IsNotNullOrWhiteSpace() || SslCertPath.IsNullOrWhiteSpace()))
|
||||
{
|
||||
SetValue("EnableSsl", false);
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Xml.Linq;
|
||||
using System.Xml.XPath;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Download.Extensions;
|
||||
|
||||
@@ -95,8 +96,14 @@ namespace NzbDrone.Core.Download.Clients.Aria2
|
||||
|
||||
public string AddUri(Aria2Settings settings, string magnet)
|
||||
{
|
||||
var response = ExecuteRequest(settings, "aria2.addUri", GetToken(settings), new List<string> { magnet });
|
||||
var options = new Dictionary<string, string>();
|
||||
|
||||
if (settings.Directory.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
options.Add("dir", settings.Directory);
|
||||
}
|
||||
|
||||
var response = ExecuteRequest(settings, "aria2.addUri", GetToken(settings), new List<string> { magnet }, options);
|
||||
var gid = response.GetStringResponse();
|
||||
|
||||
return gid;
|
||||
@@ -104,8 +111,16 @@ namespace NzbDrone.Core.Download.Clients.Aria2
|
||||
|
||||
public string AddTorrent(Aria2Settings settings, byte[] torrent)
|
||||
{
|
||||
var response = ExecuteRequest(settings, "aria2.addTorrent", GetToken(settings), torrent);
|
||||
// Aria2's second parameter is an array of URIs and needs to be sent if options are provided, this satisfies that requirement.
|
||||
var emptyListOfUris = new List<string>();
|
||||
var options = new Dictionary<string, string>();
|
||||
|
||||
if (settings.Directory.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
options.Add("dir", settings.Directory);
|
||||
}
|
||||
|
||||
var response = ExecuteRequest(settings, "aria2.addTorrent", GetToken(settings), torrent, emptyListOfUris, options);
|
||||
var gid = response.GetStringResponse();
|
||||
|
||||
return gid;
|
||||
|
||||
@@ -41,6 +41,9 @@ namespace NzbDrone.Core.Download.Clients.Aria2
|
||||
[FieldDefinition(4, Label = "Secret token", Type = FieldType.Password, Privacy = PrivacyLevel.Password)]
|
||||
public string SecretToken { get; set; }
|
||||
|
||||
[FieldDefinition(5, Label = "Directory", Type = FieldType.Textbox, HelpText = "DownloadClientAriaSettingsDirectoryHelpText")]
|
||||
public string Directory { get; set; }
|
||||
|
||||
public NzbDroneValidationResult Validate()
|
||||
{
|
||||
return new NzbDroneValidationResult(Validator.Validate(this));
|
||||
|
||||
@@ -4,6 +4,7 @@ using System.Linq;
|
||||
using FluentValidation.Results;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Disk;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Download.Clients.Flood.Models;
|
||||
using NzbDrone.Core.Indexers;
|
||||
@@ -56,7 +57,7 @@ namespace NzbDrone.Core.Download.Clients.Flood
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
return result.Where(t => t.IsNotNullOrWhiteSpace());
|
||||
}
|
||||
|
||||
public override string Name => "Flood";
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
{
|
||||
public enum QBittorrentContentLayout
|
||||
{
|
||||
Default = 0,
|
||||
Original = 1,
|
||||
Subfolder = 2
|
||||
}
|
||||
}
|
||||
@@ -265,6 +265,15 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
{
|
||||
request.AddFormParameter("firstLastPiecePrio", true);
|
||||
}
|
||||
|
||||
if ((QBittorrentContentLayout)settings.ContentLayout == QBittorrentContentLayout.Original)
|
||||
{
|
||||
request.AddFormParameter("contentLayout", "Original");
|
||||
}
|
||||
else if ((QBittorrentContentLayout)settings.ContentLayout == QBittorrentContentLayout.Subfolder)
|
||||
{
|
||||
request.AddFormParameter("contentLayout", "Subfolder");
|
||||
}
|
||||
}
|
||||
|
||||
public void SetTorrentSeedingConfiguration(string hash, TorrentSeedConfiguration seedConfiguration, QBittorrentSettings settings)
|
||||
|
||||
@@ -62,6 +62,9 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
[FieldDefinition(10, Label = "First and Last First", Type = FieldType.Checkbox, HelpText = "Download first and last pieces first (qBittorrent 4.1.0+)")]
|
||||
public bool FirstAndLast { get; set; }
|
||||
|
||||
[FieldDefinition(13, Label = "DownloadClientQbittorrentSettingsContentLayout", Type = FieldType.Select, SelectOptions = typeof(QBittorrentContentLayout), HelpText = "DownloadClientQbittorrentSettingsContentLayoutHelpText")]
|
||||
public int ContentLayout { get; set; }
|
||||
|
||||
public NzbDroneValidationResult Validate()
|
||||
{
|
||||
return new NzbDroneValidationResult(Validator.Validate(this));
|
||||
|
||||
@@ -171,9 +171,7 @@ namespace NzbDrone.Core.Download
|
||||
}
|
||||
catch (FormatException ex)
|
||||
{
|
||||
_logger.Error(ex, "Failed to parse magnetlink for release '{0}': '{1}'", release.Title, magnetUrl);
|
||||
|
||||
return null;
|
||||
throw new ReleaseDownloadException("Failed to parse magnetlink for release '{0}': '{1}'", ex, release.Title, magnetUrl);
|
||||
}
|
||||
|
||||
if (hash != null)
|
||||
|
||||
@@ -26,8 +26,7 @@ public class AudioBookBay : TorrentIndexerBase<NoAuthTorrentBaseSettings>
|
||||
public override string Name => "AudioBook Bay";
|
||||
public override string[] IndexerUrls => new[]
|
||||
{
|
||||
"https://audiobookbay.is/",
|
||||
"https://audiobookbay.se/"
|
||||
"https://audiobookbay.is/"
|
||||
};
|
||||
public override string[] LegacyUrls => new[]
|
||||
{
|
||||
@@ -55,12 +54,14 @@ public class AudioBookBay : TorrentIndexerBase<NoAuthTorrentBaseSettings>
|
||||
"https://audiobookbay.unblockit.pet/",
|
||||
"https://audiobookbay.unblockit.ink/",
|
||||
"https://audiobookbay.unblockit.bio/", // error 502
|
||||
"https://audiobookbay.li/"
|
||||
"https://audiobookbay.li/",
|
||||
"https://audiobookbay.se/" // redirects to .is but has invalid CA
|
||||
};
|
||||
public override string Description => "AudioBook Bay (ABB) is a public Torrent Tracker for AUDIOBOOKS";
|
||||
public override string Language => "en-US";
|
||||
public override IndexerPrivacy Privacy => IndexerPrivacy.Public;
|
||||
public override int PageSize => 15;
|
||||
public override TimeSpan RateLimit => TimeSpan.FromSeconds(5);
|
||||
public override IndexerCapabilities Capabilities => SetCapabilities();
|
||||
|
||||
public AudioBookBay(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger)
|
||||
@@ -70,7 +71,7 @@ public class AudioBookBay : TorrentIndexerBase<NoAuthTorrentBaseSettings>
|
||||
|
||||
public override IIndexerRequestGenerator GetRequestGenerator()
|
||||
{
|
||||
return new AudioBookBayRequestGenerator(Settings, Capabilities);
|
||||
return new AudioBookBayRequestGenerator(Settings);
|
||||
}
|
||||
|
||||
public override IParseIndexerResponse GetParser()
|
||||
@@ -119,64 +120,7 @@ public class AudioBookBay : TorrentIndexerBase<NoAuthTorrentBaseSettings>
|
||||
}
|
||||
};
|
||||
|
||||
// Age
|
||||
caps.Categories.AddCategoryMapping("children", NewznabStandardCategory.AudioAudiobook, "Children");
|
||||
caps.Categories.AddCategoryMapping("teen-young-adult", NewznabStandardCategory.AudioAudiobook, "Teen & Young Adult");
|
||||
caps.Categories.AddCategoryMapping("adults", NewznabStandardCategory.AudioAudiobook, "Adults");
|
||||
|
||||
// Category
|
||||
caps.Categories.AddCategoryMapping("postapocalyptic", NewznabStandardCategory.AudioAudiobook, "(Post)apocalyptic");
|
||||
caps.Categories.AddCategoryMapping("action", NewznabStandardCategory.AudioAudiobook, "Action");
|
||||
caps.Categories.AddCategoryMapping("adventure", NewznabStandardCategory.AudioAudiobook, "Adventure");
|
||||
caps.Categories.AddCategoryMapping("art", NewznabStandardCategory.AudioAudiobook, "Art");
|
||||
caps.Categories.AddCategoryMapping("autobiography-biographies", NewznabStandardCategory.AudioAudiobook, "Autobiography & Biographies");
|
||||
caps.Categories.AddCategoryMapping("business", NewznabStandardCategory.AudioAudiobook, "Business");
|
||||
caps.Categories.AddCategoryMapping("computer", NewznabStandardCategory.AudioAudiobook, "Computer");
|
||||
caps.Categories.AddCategoryMapping("contemporary", NewznabStandardCategory.AudioAudiobook, "Contemporary");
|
||||
caps.Categories.AddCategoryMapping("crime", NewznabStandardCategory.AudioAudiobook, "Crime");
|
||||
caps.Categories.AddCategoryMapping("detective", NewznabStandardCategory.AudioAudiobook, "Detective");
|
||||
caps.Categories.AddCategoryMapping("doctor-who-sci-fi", NewznabStandardCategory.AudioAudiobook, "Doctor Who");
|
||||
caps.Categories.AddCategoryMapping("education", NewznabStandardCategory.AudioAudiobook, "Education");
|
||||
caps.Categories.AddCategoryMapping("fantasy", NewznabStandardCategory.AudioAudiobook, "Fantasy");
|
||||
caps.Categories.AddCategoryMapping("general-fiction", NewznabStandardCategory.AudioAudiobook, "General Fiction");
|
||||
caps.Categories.AddCategoryMapping("historical-fiction", NewznabStandardCategory.AudioAudiobook, "Historical Fiction");
|
||||
caps.Categories.AddCategoryMapping("history", NewznabStandardCategory.AudioAudiobook, "History");
|
||||
caps.Categories.AddCategoryMapping("horror", NewznabStandardCategory.AudioAudiobook, "Horror");
|
||||
caps.Categories.AddCategoryMapping("humor", NewznabStandardCategory.AudioAudiobook, "Humor");
|
||||
caps.Categories.AddCategoryMapping("lecture", NewznabStandardCategory.AudioAudiobook, "Lecture");
|
||||
caps.Categories.AddCategoryMapping("lgbt", NewznabStandardCategory.AudioAudiobook, "LGBT");
|
||||
caps.Categories.AddCategoryMapping("literature", NewznabStandardCategory.AudioAudiobook, "Literature");
|
||||
caps.Categories.AddCategoryMapping("litrpg", NewznabStandardCategory.AudioAudiobook, "LitRPG");
|
||||
caps.Categories.AddCategoryMapping("general-non-fiction", NewznabStandardCategory.AudioAudiobook, "Misc. Non-fiction");
|
||||
caps.Categories.AddCategoryMapping("mystery", NewznabStandardCategory.AudioAudiobook, "Mystery");
|
||||
caps.Categories.AddCategoryMapping("paranormal", NewznabStandardCategory.AudioAudiobook, "Paranormal");
|
||||
caps.Categories.AddCategoryMapping("plays-theater", NewznabStandardCategory.AudioAudiobook, "Plays & Theater");
|
||||
caps.Categories.AddCategoryMapping("poetry", NewznabStandardCategory.AudioAudiobook, "Poetry");
|
||||
caps.Categories.AddCategoryMapping("political", NewznabStandardCategory.AudioAudiobook, "Political");
|
||||
caps.Categories.AddCategoryMapping("radio-productions", NewznabStandardCategory.AudioAudiobook, "Radio Productions");
|
||||
caps.Categories.AddCategoryMapping("romance", NewznabStandardCategory.AudioAudiobook, "Romance");
|
||||
caps.Categories.AddCategoryMapping("sci-fi", NewznabStandardCategory.AudioAudiobook, "Sci-Fi");
|
||||
caps.Categories.AddCategoryMapping("science", NewznabStandardCategory.AudioAudiobook, "Science");
|
||||
caps.Categories.AddCategoryMapping("self-help", NewznabStandardCategory.AudioAudiobook, "Self-help");
|
||||
caps.Categories.AddCategoryMapping("spiritual", NewznabStandardCategory.AudioAudiobook, "Spiritual & Religious");
|
||||
caps.Categories.AddCategoryMapping("sports", NewznabStandardCategory.AudioAudiobook, "Sport & Recreation");
|
||||
caps.Categories.AddCategoryMapping("suspense", NewznabStandardCategory.AudioAudiobook, "Suspense");
|
||||
caps.Categories.AddCategoryMapping("thriller", NewznabStandardCategory.AudioAudiobook, "Thriller");
|
||||
caps.Categories.AddCategoryMapping("true-crime", NewznabStandardCategory.AudioAudiobook, "True Crime");
|
||||
caps.Categories.AddCategoryMapping("tutorial", NewznabStandardCategory.AudioAudiobook, "Tutorial");
|
||||
caps.Categories.AddCategoryMapping("westerns", NewznabStandardCategory.AudioAudiobook, "Westerns");
|
||||
caps.Categories.AddCategoryMapping("zombies", NewznabStandardCategory.AudioAudiobook, "Zombies");
|
||||
|
||||
// Category Modifiers
|
||||
caps.Categories.AddCategoryMapping("anthology", NewznabStandardCategory.AudioAudiobook, "Anthology");
|
||||
caps.Categories.AddCategoryMapping("bestsellers", NewznabStandardCategory.AudioAudiobook, "Bestsellers");
|
||||
caps.Categories.AddCategoryMapping("classic", NewznabStandardCategory.AudioAudiobook, "Classic");
|
||||
caps.Categories.AddCategoryMapping("documentary", NewznabStandardCategory.AudioAudiobook, "Documentary");
|
||||
caps.Categories.AddCategoryMapping("full-cast", NewznabStandardCategory.AudioAudiobook, "Full Cast");
|
||||
caps.Categories.AddCategoryMapping("libertarian", NewznabStandardCategory.AudioAudiobook, "Libertarian");
|
||||
caps.Categories.AddCategoryMapping("military", NewznabStandardCategory.AudioAudiobook, "Military");
|
||||
caps.Categories.AddCategoryMapping("novel", NewznabStandardCategory.AudioAudiobook, "Novel");
|
||||
caps.Categories.AddCategoryMapping("short-story", NewznabStandardCategory.AudioAudiobook, "Short Story");
|
||||
caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.AudioAudiobook);
|
||||
|
||||
return caps;
|
||||
}
|
||||
@@ -185,12 +129,10 @@ public class AudioBookBay : TorrentIndexerBase<NoAuthTorrentBaseSettings>
|
||||
public class AudioBookBayRequestGenerator : IIndexerRequestGenerator
|
||||
{
|
||||
private readonly NoAuthTorrentBaseSettings _settings;
|
||||
private readonly IndexerCapabilities _capabilities;
|
||||
|
||||
public AudioBookBayRequestGenerator(NoAuthTorrentBaseSettings settings, IndexerCapabilities capabilities)
|
||||
public AudioBookBayRequestGenerator(NoAuthTorrentBaseSettings settings)
|
||||
{
|
||||
_settings = settings;
|
||||
_capabilities = capabilities;
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria)
|
||||
@@ -246,8 +188,6 @@ public class AudioBookBayRequestGenerator : IIndexerRequestGenerator
|
||||
}
|
||||
|
||||
yield return new IndexerRequest(new UriBuilder(searchUrl) { Path = "/" }.Uri.AbsoluteUri, HttpAccept.Html);
|
||||
yield return new IndexerRequest(new UriBuilder(searchUrl) { Path = "/page/2/" }.Uri.AbsoluteUri, HttpAccept.Html);
|
||||
yield return new IndexerRequest(new UriBuilder(searchUrl) { Path = "/page/3/" }.Uri.AbsoluteUri, HttpAccept.Html);
|
||||
}
|
||||
|
||||
public Func<IDictionary<string, string>> GetCookies { get; set; }
|
||||
@@ -300,8 +240,7 @@ public class AudioBookBayParser : IParseIndexerResponse
|
||||
|
||||
var postInfo = row.QuerySelector("div.postInfo")?.FirstChild?.TextContent.Trim().Replace("\xA0", ";") ?? string.Empty;
|
||||
var matchCategory = Regex.Match(postInfo, @"Category: (.+)$", RegexOptions.IgnoreCase);
|
||||
var category = matchCategory.Groups[1].Success ? matchCategory.Groups[1].Value.Split(';', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList() : new List<string>();
|
||||
var categories = category.SelectMany(_categories.MapTrackerCatDescToNewznab).Distinct().ToList();
|
||||
var genres = matchCategory.Groups[1].Success ? matchCategory.Groups[1].Value.Split(';', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList() : new List<string>();
|
||||
|
||||
var release = new TorrentInfo
|
||||
{
|
||||
@@ -309,13 +248,14 @@ public class AudioBookBayParser : IParseIndexerResponse
|
||||
InfoUrl = infoUrl,
|
||||
DownloadUrl = infoUrl,
|
||||
Title = CleanTitle(title),
|
||||
Categories = categories,
|
||||
Categories = new List<IndexerCategory> { NewznabStandardCategory.AudioAudiobook },
|
||||
Size = size,
|
||||
Seeders = 1,
|
||||
Peers = 1,
|
||||
PublishDate = publishDate,
|
||||
DownloadVolumeFactor = 0,
|
||||
UploadVolumeFactor = 1
|
||||
UploadVolumeFactor = 1,
|
||||
Genres = genres
|
||||
};
|
||||
|
||||
var cover = row.QuerySelector("img[src]")?.GetAttribute("src")?.Trim();
|
||||
|
||||
@@ -19,6 +19,7 @@ using NzbDrone.Core.Validation;
|
||||
|
||||
namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
[Obsolete("Site has shutdown")]
|
||||
public class BinSearch : UsenetIndexerBase<BinSearchSettings>
|
||||
{
|
||||
public override string Name => "BinSearch";
|
||||
|
||||
@@ -38,3 +38,8 @@ public class FileListTorrent
|
||||
[JsonPropertyName("small_description")]
|
||||
public string SmallDescription { get; set; }
|
||||
}
|
||||
|
||||
public class FileListErrorResponse
|
||||
{
|
||||
public string Error { get; set; }
|
||||
}
|
||||
|
||||
@@ -28,9 +28,14 @@ public class FileListParser : IParseIndexerResponse
|
||||
throw new IndexerException(indexerResponse, "Unexpected response status {0} code from indexer request", indexerResponse.HttpResponse.StatusCode);
|
||||
}
|
||||
|
||||
if (indexerResponse.Content.StartsWith("{\"error\"") && STJson.TryDeserialize<FileListErrorResponse>(indexerResponse.Content, out var errorResponse))
|
||||
{
|
||||
throw new IndexerException(indexerResponse, "Unexpected response from indexer request: {0}", errorResponse.Error);
|
||||
}
|
||||
|
||||
if (!indexerResponse.HttpResponse.Headers.ContentType.Contains(HttpAccept.Json.Value))
|
||||
{
|
||||
throw new IndexerException(indexerResponse, $"Unexpected response header {indexerResponse.HttpResponse.Headers.ContentType} from indexer request, expected {HttpAccept.Json.Value}");
|
||||
throw new IndexerException(indexerResponse, "Unexpected response header {0} from indexer request, expected {1}", indexerResponse.HttpResponse.Headers.ContentType, HttpAccept.Json.Value);
|
||||
}
|
||||
|
||||
var releaseInfos = new List<ReleaseInfo>();
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using FluentValidation;
|
||||
using FluentValidation.Results;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Common.Serializer;
|
||||
using NzbDrone.Core.Annotations;
|
||||
@@ -16,6 +19,7 @@ using NzbDrone.Core.Indexers.Exceptions;
|
||||
using NzbDrone.Core.Indexers.Settings;
|
||||
using NzbDrone.Core.IndexerSearch.Definitions;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
using NzbDrone.Core.Parser;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.Validation;
|
||||
|
||||
@@ -24,7 +28,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
public class GazelleGames : TorrentIndexerBase<GazelleGamesSettings>
|
||||
{
|
||||
public override string Name => "GazelleGames";
|
||||
public override string[] IndexerUrls => new string[] { "https://gazellegames.net/" };
|
||||
public override string[] IndexerUrls => new[] { "https://gazellegames.net/" };
|
||||
public override string Description => "GazelleGames (GGn) is a Private Torrent Tracker for GAMES";
|
||||
public override string Language => "en-US";
|
||||
public override Encoding Encoding => Encoding.UTF8;
|
||||
@@ -38,7 +42,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
public override IIndexerRequestGenerator GetRequestGenerator()
|
||||
{
|
||||
return new GazelleGamesRequestGenerator() { Settings = Settings, Capabilities = Capabilities, HttpClient = _httpClient };
|
||||
return new GazelleGamesRequestGenerator(Settings, Capabilities);
|
||||
}
|
||||
|
||||
public override IParseIndexerResponse GetParser()
|
||||
@@ -48,14 +52,13 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
private IndexerCapabilities SetCapabilities()
|
||||
{
|
||||
var caps = new IndexerCapabilities
|
||||
{
|
||||
};
|
||||
var caps = new IndexerCapabilities();
|
||||
|
||||
// Apple
|
||||
caps.Categories.AddCategoryMapping("Mac", NewznabStandardCategory.ConsoleOther, "Mac");
|
||||
caps.Categories.AddCategoryMapping("iOS", NewznabStandardCategory.PCMobileiOS, "iOS");
|
||||
caps.Categories.AddCategoryMapping("Apple Bandai Pippin", NewznabStandardCategory.ConsoleOther, "Apple Bandai Pippin");
|
||||
caps.Categories.AddCategoryMapping("Apple II", NewznabStandardCategory.ConsoleOther, "Apple II");
|
||||
|
||||
// Google
|
||||
caps.Categories.AddCategoryMapping("Android", NewznabStandardCategory.PCMobileAndroid, "Android");
|
||||
@@ -78,6 +81,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
caps.Categories.AddCategoryMapping("Nintendo GameCube", NewznabStandardCategory.ConsoleOther, "Nintendo GameCube");
|
||||
caps.Categories.AddCategoryMapping("Pokemon Mini", NewznabStandardCategory.ConsoleOther, "Pokemon Mini");
|
||||
caps.Categories.AddCategoryMapping("SNES", NewznabStandardCategory.ConsoleOther, "SNES");
|
||||
caps.Categories.AddCategoryMapping("Switch", NewznabStandardCategory.ConsoleOther, "Switch");
|
||||
caps.Categories.AddCategoryMapping("Virtual Boy", NewznabStandardCategory.ConsoleOther, "Virtual Boy");
|
||||
caps.Categories.AddCategoryMapping("Wii", NewznabStandardCategory.ConsoleWii, "Wii");
|
||||
caps.Categories.AddCategoryMapping("Wii U", NewznabStandardCategory.ConsoleWiiU, "Wii U");
|
||||
@@ -178,31 +182,62 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
caps.Categories.AddCategoryMapping("Retro - Other", NewznabStandardCategory.ConsoleOther, "Retro - Other");
|
||||
|
||||
// special categories (real categories/not platforms)
|
||||
caps.Categories.AddCategoryMapping("OST", NewznabStandardCategory.AudioOther, "OST");
|
||||
caps.Categories.AddCategoryMapping("Applications", NewznabStandardCategory.PC0day, "Applications");
|
||||
caps.Categories.AddCategoryMapping("E-Books", NewznabStandardCategory.BooksEBook, "E-Books");
|
||||
caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.PCGames, "Games");
|
||||
caps.Categories.AddCategoryMapping(2, NewznabStandardCategory.PC0day, "Applications");
|
||||
caps.Categories.AddCategoryMapping(3, NewznabStandardCategory.BooksEBook, "E-Books");
|
||||
caps.Categories.AddCategoryMapping(4, NewznabStandardCategory.AudioOther, "OST");
|
||||
|
||||
return caps;
|
||||
}
|
||||
|
||||
protected override async Task Test(List<ValidationFailure> failures)
|
||||
{
|
||||
((GazelleGamesRequestGenerator)GetRequestGenerator()).FetchPasskey();
|
||||
await base.Test(failures);
|
||||
await FetchPasskey().ConfigureAwait(false);
|
||||
|
||||
await base.Test(failures).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
private async Task FetchPasskey()
|
||||
{
|
||||
var request = new HttpRequestBuilder($"{Settings.BaseUrl.Trim().TrimEnd('/')}/api.php")
|
||||
.Accept(HttpAccept.Json)
|
||||
.SetHeader("X-API-Key", Settings.Apikey)
|
||||
.AddQueryParam("request", "quick_user")
|
||||
.Build();
|
||||
|
||||
var indexResponse = await _httpClient.ExecuteAsync(request).ConfigureAwait(false);
|
||||
|
||||
var index = Json.Deserialize<GazelleGamesUserResponse>(indexResponse.Content);
|
||||
|
||||
if (index == null ||
|
||||
string.IsNullOrWhiteSpace(index.Status) ||
|
||||
index.Status != "success" ||
|
||||
string.IsNullOrWhiteSpace(index.Response.PassKey))
|
||||
{
|
||||
throw new IndexerAuthException("Failed to authenticate with GazelleGames.");
|
||||
}
|
||||
|
||||
// Set passkey on settings so it can be used to generate the download URL
|
||||
Settings.Passkey = index.Response.PassKey;
|
||||
}
|
||||
}
|
||||
|
||||
public class GazelleGamesRequestGenerator : IIndexerRequestGenerator
|
||||
{
|
||||
public GazelleGamesSettings Settings { get; set; }
|
||||
public IndexerCapabilities Capabilities { get; set; }
|
||||
public IIndexerHttpClient HttpClient { get; set; }
|
||||
private readonly GazelleGamesSettings _settings;
|
||||
private readonly IndexerCapabilities _capabilities;
|
||||
|
||||
public GazelleGamesRequestGenerator(GazelleGamesSettings settings, IndexerCapabilities capabilities)
|
||||
{
|
||||
_settings = settings;
|
||||
_capabilities = capabilities;
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories)));
|
||||
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria)));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -211,7 +246,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories)));
|
||||
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria)));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -220,7 +255,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories)));
|
||||
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria)));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -229,7 +264,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories)));
|
||||
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria)));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -238,61 +273,72 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories)));
|
||||
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria)));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
public void FetchPasskey()
|
||||
private IEnumerable<IndexerRequest> GetRequest(List<KeyValuePair<string, string>> parameters)
|
||||
{
|
||||
// GET on index for the passkey
|
||||
var request = RequestBuilder().Resource("api.php?request=quick_user").Build();
|
||||
var indexResponse = HttpClient.Execute(request);
|
||||
var index = Json.Deserialize<GazelleGamesUserResponse>(indexResponse.Content);
|
||||
if (index == null ||
|
||||
string.IsNullOrWhiteSpace(index.Status) ||
|
||||
index.Status != "success" ||
|
||||
string.IsNullOrWhiteSpace(index.Response.PassKey))
|
||||
{
|
||||
throw new Exception("Failed to authenticate with GazelleGames.");
|
||||
}
|
||||
|
||||
// Set passkey on settings so it can be used to generate the download URL
|
||||
Settings.Passkey = index.Response.PassKey;
|
||||
}
|
||||
|
||||
private IEnumerable<IndexerRequest> GetRequest(string parameters)
|
||||
{
|
||||
var req = RequestBuilder()
|
||||
.Resource($"api.php?{parameters}")
|
||||
var request = RequestBuilder()
|
||||
.Resource($"/api.php?{parameters.GetQueryString()}")
|
||||
.Build();
|
||||
|
||||
yield return new IndexerRequest(req);
|
||||
yield return new IndexerRequest(request);
|
||||
}
|
||||
|
||||
private HttpRequestBuilder RequestBuilder()
|
||||
{
|
||||
return new HttpRequestBuilder($"{Settings.BaseUrl.Trim().TrimEnd('/')}")
|
||||
return new HttpRequestBuilder($"{_settings.BaseUrl.Trim().TrimEnd('/')}")
|
||||
.Resource("/api.php")
|
||||
.Accept(HttpAccept.Json)
|
||||
.SetHeader("X-API-Key", Settings.Apikey);
|
||||
.SetHeader("X-API-Key", _settings.Apikey);
|
||||
}
|
||||
|
||||
private string GetBasicSearchParameters(string searchTerm, int[] categories)
|
||||
private List<KeyValuePair<string, string>> GetBasicSearchParameters(string searchTerm, SearchCriteriaBase searchCriteria)
|
||||
{
|
||||
var parameters = "request=search&search_type=torrents&empty_groups=filled&order_by=time&order_way=desc";
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(searchTerm))
|
||||
var parameters = new List<KeyValuePair<string, string>>
|
||||
{
|
||||
var searchType = Settings.SearchGroupNames ? "groupname" : "searchstr";
|
||||
{ "request", "search" },
|
||||
{ "search_type", "torrents" },
|
||||
{ "empty_groups", "filled" },
|
||||
{ "order_by", "time" },
|
||||
{ "order_way", "desc" }
|
||||
};
|
||||
|
||||
parameters += string.Format("&{1}={0}", searchTerm.Replace(".", " "), searchType);
|
||||
if (searchTerm.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
parameters.Add(
|
||||
_settings.SearchGroupNames ? "groupname" : "searchstr",
|
||||
searchTerm.Replace(".", " "));
|
||||
}
|
||||
|
||||
if (categories != null)
|
||||
if (searchCriteria.Categories != null)
|
||||
{
|
||||
foreach (var cat in Capabilities.Categories.MapTorznabCapsToTrackers(categories))
|
||||
var categoryMappings = _capabilities.Categories
|
||||
.MapTorznabCapsToTrackers(searchCriteria.Categories)
|
||||
.Distinct()
|
||||
.Where(x => !x.IsAllDigits())
|
||||
.ToList();
|
||||
|
||||
categoryMappings.ForEach(category => parameters.Add("artistcheck[]", category));
|
||||
}
|
||||
|
||||
if (searchCriteria.MinSize is > 0)
|
||||
{
|
||||
var minSize = searchCriteria.MinSize.Value / 1024L / 1024L;
|
||||
if (minSize > 0)
|
||||
{
|
||||
parameters += string.Format("&artistcheck[]={0}", cat);
|
||||
parameters.Add("sizesmall", minSize.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
if (searchCriteria.MaxSize is > 0)
|
||||
{
|
||||
var maxSize = searchCriteria.MaxSize.Value / 1024L / 1024L;
|
||||
if (maxSize > 0)
|
||||
{
|
||||
parameters.Add("sizeslarge", maxSize.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -329,66 +375,63 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
}
|
||||
|
||||
var jsonResponse = new HttpResponse<GazelleGamesResponse>(indexerResponse.HttpResponse);
|
||||
|
||||
if (jsonResponse.Resource.Status != "success" ||
|
||||
string.IsNullOrWhiteSpace(jsonResponse.Resource.Status) ||
|
||||
jsonResponse.Resource.Response == null)
|
||||
jsonResponse.Resource.Response is not JObject response)
|
||||
{
|
||||
return torrentInfos;
|
||||
}
|
||||
|
||||
Dictionary<string, GazelleGamesGroup> response;
|
||||
var groups = response.ToObject<Dictionary<int, GazelleGamesGroup>>(JsonSerializer.Create(Json.GetSerializerSettings()));
|
||||
|
||||
try
|
||||
foreach (var group in groups)
|
||||
{
|
||||
response = ((JObject)jsonResponse.Resource.Response).ToObject<Dictionary<string, GazelleGamesGroup>>();
|
||||
}
|
||||
catch
|
||||
{
|
||||
return torrentInfos;
|
||||
}
|
||||
|
||||
foreach (var result in response)
|
||||
{
|
||||
Dictionary<string, GazelleGamesTorrent> torrents;
|
||||
|
||||
try
|
||||
{
|
||||
torrents = ((JObject)result.Value.Torrents).ToObject<Dictionary<string, GazelleGamesTorrent>>();
|
||||
}
|
||||
catch
|
||||
if (group.Value.Torrents is not JObject groupTorrents)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (result.Value.Torrents != null)
|
||||
var torrents = groupTorrents
|
||||
.ToObject<Dictionary<int, GazelleGamesTorrent>>(JsonSerializer.Create(Json.GetSerializerSettings()))
|
||||
.Where(t => t.Value.TorrentType.ToUpperInvariant() == "TORRENT")
|
||||
.ToList();
|
||||
|
||||
var categories = group.Value.Artists
|
||||
.SelectMany(a => _categories.MapTrackerCatDescToNewznab(a.Name))
|
||||
.Distinct()
|
||||
.ToArray();
|
||||
|
||||
foreach (var torrent in torrents)
|
||||
{
|
||||
var categories = result.Value.Artists.Select(a => a.Name);
|
||||
var torrentId = torrent.Key;
|
||||
var infoUrl = GetInfoUrl(group.Key, torrentId);
|
||||
|
||||
foreach (var torrent in torrents)
|
||||
if (categories.Length == 0)
|
||||
{
|
||||
var id = int.Parse(torrent.Key);
|
||||
|
||||
var infoUrl = GetInfoUrl(result.Key, id);
|
||||
|
||||
var release = new TorrentInfo()
|
||||
{
|
||||
Guid = infoUrl,
|
||||
Title = torrent.Value.ReleaseTitle,
|
||||
Files = torrent.Value.FileCount,
|
||||
Grabs = torrent.Value.Snatched,
|
||||
Size = long.Parse(torrent.Value.Size),
|
||||
DownloadUrl = GetDownloadUrl(id),
|
||||
InfoUrl = infoUrl,
|
||||
Seeders = torrent.Value.Seeders,
|
||||
Categories = _categories.MapTrackerCatDescToNewznab(categories.FirstOrDefault()),
|
||||
Peers = torrent.Value.Leechers + torrent.Value.Seeders,
|
||||
PublishDate = torrent.Value.Time.ToUniversalTime(),
|
||||
DownloadVolumeFactor = torrent.Value.FreeTorrent == GazelleGamesFreeTorrent.FreeLeech || torrent.Value.FreeTorrent == GazelleGamesFreeTorrent.Neutral || torrent.Value.LowSeedFL ? 0 : 1,
|
||||
UploadVolumeFactor = torrent.Value.FreeTorrent == GazelleGamesFreeTorrent.Neutral ? 0 : 1
|
||||
};
|
||||
|
||||
torrentInfos.Add(release);
|
||||
categories = _categories.MapTrackerCatToNewznab(torrent.Value.CategoryId.ToString()).ToArray();
|
||||
}
|
||||
|
||||
var release = new TorrentInfo
|
||||
{
|
||||
Guid = infoUrl,
|
||||
InfoUrl = infoUrl,
|
||||
DownloadUrl = GetDownloadUrl(torrentId),
|
||||
Title = GetTitle(group.Value, torrent.Value),
|
||||
Categories = categories,
|
||||
Files = torrent.Value.FileCount,
|
||||
Size = long.Parse(torrent.Value.Size),
|
||||
Grabs = torrent.Value.Snatched,
|
||||
Seeders = torrent.Value.Seeders,
|
||||
Peers = torrent.Value.Leechers + torrent.Value.Seeders,
|
||||
PublishDate = torrent.Value.Time.ToUniversalTime(),
|
||||
Scene = torrent.Value.Scene == 1,
|
||||
DownloadVolumeFactor = torrent.Value.FreeTorrent is GazelleGamesFreeTorrent.FreeLeech or GazelleGamesFreeTorrent.Neutral || torrent.Value.LowSeedFL ? 0 : 1,
|
||||
UploadVolumeFactor = torrent.Value.FreeTorrent == GazelleGamesFreeTorrent.Neutral ? 0 : 1,
|
||||
MinimumSeedTime = 288000 // Minimum of 3 days and 8 hours (80 hours in total)
|
||||
};
|
||||
|
||||
torrentInfos.Add(release);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -399,6 +442,54 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
private static string GetTitle(GazelleGamesGroup group, GazelleGamesTorrent torrent)
|
||||
{
|
||||
var title = WebUtility.HtmlDecode(torrent.ReleaseTitle);
|
||||
|
||||
if (group.Year is > 0 && !title.Contains(group.Year.ToString()))
|
||||
{
|
||||
title += $" ({group.Year})";
|
||||
}
|
||||
|
||||
if (torrent.RemasterTitle.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
title += $" [{$"{torrent.RemasterTitle} {torrent.RemasterYear}".Trim()}]";
|
||||
}
|
||||
|
||||
var flags = new List<string>
|
||||
{
|
||||
$"{torrent.Format} {torrent.Encoding}".Trim()
|
||||
};
|
||||
|
||||
if (group.Artists is { Count: > 0 })
|
||||
{
|
||||
flags.AddIfNotNull(group.Artists.Select(a => a.Name).Join(", "));
|
||||
}
|
||||
|
||||
flags.AddIfNotNull(torrent.Language);
|
||||
flags.AddIfNotNull(torrent.Region);
|
||||
flags.AddIfNotNull(torrent.Miscellaneous);
|
||||
|
||||
if (torrent.Dupable == 1)
|
||||
{
|
||||
flags.Add("Trumpable");
|
||||
}
|
||||
|
||||
flags = flags.Where(x => x.IsNotNullOrWhiteSpace()).ToList();
|
||||
|
||||
if (flags.Any())
|
||||
{
|
||||
title += $" [{string.Join(" / ", flags)}]";
|
||||
}
|
||||
|
||||
if (torrent.GameDoxType.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
title += $" [{torrent.GameDoxType.Trim()}]";
|
||||
}
|
||||
|
||||
return title;
|
||||
}
|
||||
|
||||
private string GetDownloadUrl(int torrentId)
|
||||
{
|
||||
// AuthKey is required but not checked, just pass in a dummy variable
|
||||
@@ -413,7 +504,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
return url.FullUri;
|
||||
}
|
||||
|
||||
private string GetInfoUrl(string groupId, int torrentId)
|
||||
private string GetInfoUrl(int groupId, int torrentId)
|
||||
{
|
||||
var url = new HttpUri(_settings.BaseUrl)
|
||||
.CombinePath("/torrents.php")
|
||||
@@ -444,7 +535,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
Passkey = "";
|
||||
}
|
||||
|
||||
[FieldDefinition(2, Label = "API Key", HelpText = "API Key from the Site (Found in Settings => Access Settings), Must have User Permissions", Privacy = PrivacyLevel.ApiKey)]
|
||||
[FieldDefinition(2, Label = "API Key", HelpText = "API Key from the Site (Found in Settings => Access Settings)", HelpTextWarning = "Must have User and Torrents permissions", Privacy = PrivacyLevel.ApiKey)]
|
||||
public string Apikey { get; set; }
|
||||
|
||||
[FieldDefinition(3, Label = "Search Group Names", Type = FieldType.Checkbox, HelpText = "Search Group Names Only")]
|
||||
@@ -466,8 +557,9 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
public class GazelleGamesGroup
|
||||
{
|
||||
public List<GazelleGamesArtist> Artists { get; set; }
|
||||
public ReadOnlyCollection<GazelleGamesArtist> Artists { get; set; }
|
||||
public object Torrents { get; set; }
|
||||
public int? Year { get; set; }
|
||||
}
|
||||
|
||||
public class GazelleGamesArtist
|
||||
@@ -478,16 +570,30 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
public class GazelleGamesTorrent
|
||||
{
|
||||
public int CategoryId { get; set; }
|
||||
public string Format { get; set; }
|
||||
public string Encoding { get; set; }
|
||||
public string Language { get; set; }
|
||||
public string Region { get; set; }
|
||||
public string RemasterYear { get; set; }
|
||||
public string RemasterTitle { get; set; }
|
||||
public string ReleaseTitle { get; set; }
|
||||
public string Miscellaneous { get; set; }
|
||||
public int Scene { get; set; }
|
||||
public int Dupable { get; set; }
|
||||
public DateTime Time { get; set; }
|
||||
public string TorrentType { get; set; }
|
||||
public int FileCount { get; set; }
|
||||
public string Size { get; set; }
|
||||
public int? Snatched { get; set; }
|
||||
public int Seeders { get; set; }
|
||||
public int Leechers { get; set; }
|
||||
public string ReleaseTitle { get; set; }
|
||||
public DateTime Time { get; set; }
|
||||
public int FileCount { get; set; }
|
||||
public GazelleGamesFreeTorrent FreeTorrent { get; set; }
|
||||
public bool PersonalFL { get; set; }
|
||||
public bool LowSeedFL { get; set; }
|
||||
|
||||
[JsonProperty("GameDOXType")]
|
||||
public string GameDoxType { get; set; }
|
||||
}
|
||||
|
||||
public class GazelleGamesUserResponse
|
||||
@@ -503,9 +609,9 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
public enum GazelleGamesFreeTorrent
|
||||
{
|
||||
Normal,
|
||||
FreeLeech,
|
||||
Neutral,
|
||||
Either
|
||||
Normal = 0,
|
||||
FreeLeech = 1,
|
||||
Neutral = 2,
|
||||
Either = 3
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -244,17 +244,17 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
if (Settings.SearchInDescription)
|
||||
{
|
||||
parameters.Add("tor[srchIn][description]", "true");
|
||||
parameters.Set("tor[srchIn][description]", "true");
|
||||
}
|
||||
|
||||
if (Settings.SearchInSeries)
|
||||
{
|
||||
parameters.Add("tor[srchIn][series]", "true");
|
||||
parameters.Set("tor[srchIn][series]", "true");
|
||||
}
|
||||
|
||||
if (Settings.SearchInFilenames)
|
||||
{
|
||||
parameters.Add("tor[srchIn][filenames]", "true");
|
||||
parameters.Set("tor[srchIn][filenames]", "true");
|
||||
}
|
||||
|
||||
var catList = Capabilities.Categories.MapTorznabCapsToTrackers(searchCriteria.Categories);
|
||||
@@ -263,13 +263,28 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
var index = 0;
|
||||
foreach (var cat in catList)
|
||||
{
|
||||
parameters.Add("tor[cat][" + index + "]", cat);
|
||||
parameters.Set("tor[cat][" + index + "]", cat);
|
||||
index++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
parameters.Add("tor[cat][]", "0");
|
||||
parameters.Set("tor[cat][]", "0");
|
||||
}
|
||||
|
||||
if (searchCriteria.MinSize is > 0)
|
||||
{
|
||||
parameters.Set("tor[minSize]", searchCriteria.MinSize.Value.ToString());
|
||||
}
|
||||
|
||||
if (searchCriteria.MaxSize is > 0)
|
||||
{
|
||||
parameters.Set("tor[maxSize]", searchCriteria.MaxSize.Value.ToString());
|
||||
}
|
||||
|
||||
if (searchCriteria.MinSize is > 0 || searchCriteria.MaxSize is > 0)
|
||||
{
|
||||
parameters.Set("tor[unit]", "1");
|
||||
}
|
||||
|
||||
var searchUrl = Settings.BaseUrl + "tor/js/loadSearchJSONbasic.php";
|
||||
@@ -394,6 +409,8 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
release.Title = item.Title;
|
||||
release.Description = item.Description;
|
||||
|
||||
release.BookTitle = item.Title;
|
||||
|
||||
if (item.AuthorInfo != null)
|
||||
{
|
||||
var authorInfo = JsonConvert.DeserializeObject<Dictionary<string, string>>(item.AuthorInfo);
|
||||
@@ -402,6 +419,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
if (author.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
release.Title += " by " + author;
|
||||
release.Author = author;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -426,7 +426,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
[FieldDefinition(3, Label = "Use Freeleech Tokens", Type = FieldType.Checkbox, HelpText = "Use freeleech tokens when available")]
|
||||
public bool UseFreeleechToken { get; set; }
|
||||
|
||||
[FieldDefinition(4, Label = "Freeload Only", Type = FieldType.Checkbox, Advanced = true, HelpTextWarning = "Search freeload torrents only. End date: 6 January 2024, 23:59 UTC.")]
|
||||
[FieldDefinition(4, Label = "Freeload Only", Type = FieldType.Checkbox, Advanced = true, HelpTextWarning = "Search freeload torrents only. End date: 31 January 2024, 23:59 UTC.")]
|
||||
public bool FreeloadOnly { get; set; }
|
||||
|
||||
public override NzbDroneValidationResult Validate()
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Add": "Afegiu",
|
||||
"Add": "Afegeix",
|
||||
"Actions": "Accions",
|
||||
"AcceptConfirmationModal": "Accepta el modal de confirmació",
|
||||
"About": "Quant a",
|
||||
@@ -19,7 +19,7 @@
|
||||
"ScriptPath": "Camí de l'script",
|
||||
"Search": "Cerca",
|
||||
"Files": "Fitxers",
|
||||
"SettingsEnableColorImpairedModeHelpText": "Estil alternat per permetre als usuaris amb problemes de color distingir millor la informació codificada per colors",
|
||||
"SettingsEnableColorImpairedModeHelpText": "Estil alternat per a permetre als usuaris amb problemes de color distingir millor la informació codificada per colors",
|
||||
"TagIsNotUsedAndCanBeDeleted": "L'etiqueta no està en ús i es pot suprimir",
|
||||
"TagsSettingsSummary": "Consulta totes les etiquetes i com s'utilitzen. Les etiquetes no utilitzades es poden eliminar",
|
||||
"Tasks": "Tasques",
|
||||
@@ -33,11 +33,11 @@
|
||||
"AddDownloadClient": "Afegeix un client de descàrrega",
|
||||
"Added": "Afegit",
|
||||
"Age": "Edat",
|
||||
"All": "Tots",
|
||||
"All": "Tot",
|
||||
"Analytics": "Anàlisi",
|
||||
"ApiKey": "Clau API",
|
||||
"AppDataDirectory": "Directori AppData",
|
||||
"AppDataLocationHealthCheckMessage": "No es podrà actualitzar per evitar que s'eliminin AppData a l'actualització",
|
||||
"AppDataLocationHealthCheckMessage": "No es podrà actualitzar per a evitar que s'eliminin AppData a l'actualització",
|
||||
"Authentication": "Autenticació",
|
||||
"Torrents": "Torrents",
|
||||
"Type": "Tipus",
|
||||
@@ -78,7 +78,7 @@
|
||||
"Reddit": "Reddit",
|
||||
"System": "Sistema",
|
||||
"Username": "Nom d'usuari",
|
||||
"Duration": "durada",
|
||||
"Duration": "Durada",
|
||||
"EditIndexer": "Edita l'indexador",
|
||||
"EnableAutomaticSearch": "Activa la cerca automàtica",
|
||||
"Enabled": "Habilitat",
|
||||
@@ -143,7 +143,7 @@
|
||||
"SettingsShortDateFormat": "Format de data curta",
|
||||
"BindAddress": "Adreça d'enllaç",
|
||||
"Database": "Base de dades",
|
||||
"Ended": "S'ha acabat",
|
||||
"Ended": "Acabat",
|
||||
"SettingsTimeFormat": "Format horari",
|
||||
"YesCancel": "Si, cancel·la",
|
||||
"Automatic": "Automàtic",
|
||||
@@ -170,9 +170,9 @@
|
||||
"Dates": "Dates",
|
||||
"DBMigration": "Migració de BD",
|
||||
"Delete": "Suprimeix",
|
||||
"DeleteNotificationMessageText": "Esteu segur que voleu suprimir la notificació '{0}'?",
|
||||
"DeleteNotificationMessageText": "Esteu segur que voleu suprimir la notificació '{name}'?",
|
||||
"DeleteTag": "Suprimeix l'etiqueta",
|
||||
"DeleteTagMessageText": "Esteu segur que voleu suprimir l'etiqueta '{0}'?",
|
||||
"DeleteTagMessageText": "Esteu segur que voleu suprimir l'etiqueta '{label}'?",
|
||||
"Details": "Detalls",
|
||||
"Disabled": "Desactivat",
|
||||
"DownloadClientStatusCheckAllClientMessage": "Tots els clients de descàrrega no estan disponibles a causa d'errors",
|
||||
@@ -251,7 +251,7 @@
|
||||
"Level": "Nivell",
|
||||
"LogFiles": "Fitxers de registre",
|
||||
"Logging": "Registre",
|
||||
"MappedDrivesRunningAsService": "Les unitats de xarxa assignades no estan disponibles quan s'executen com a servei de Windows. Si us plau, consulteu les PMF per obtenir més informació",
|
||||
"MappedDrivesRunningAsService": "Les unitats de xarxa assignades no estan disponibles quan s'executen com a servei de Windows. Si us plau, consulteu les PMF per a obtenir més informació",
|
||||
"Mechanism": "Mecanisme",
|
||||
"MIA": "MIA",
|
||||
"Wiki": "Wiki",
|
||||
@@ -260,9 +260,9 @@
|
||||
"Branch": "Branca",
|
||||
"Connections": "Connexions",
|
||||
"ConnectSettings": "Configuració de connexió",
|
||||
"DeleteBackupMessageText": "Esteu segur que voleu suprimir la còpia de seguretat '{0}'?",
|
||||
"DeleteBackupMessageText": "Esteu segur que voleu suprimir la còpia de seguretat '{name}'?",
|
||||
"DeleteDownloadClient": "Suprimeix el client de descàrrega",
|
||||
"DeleteDownloadClientMessageText": "Esteu segur que voleu suprimir el client de baixada '{0}'?",
|
||||
"DeleteDownloadClientMessageText": "Esteu segur que voleu suprimir el client de baixada '{name}'?",
|
||||
"Discord": "Discord",
|
||||
"Docker": "Docker",
|
||||
"Donations": "Donacions",
|
||||
@@ -300,10 +300,10 @@
|
||||
"View": "Visualitza",
|
||||
"Yesterday": "Ahir",
|
||||
"ApplicationStatusCheckSingleClientMessage": "Llistes no disponibles a causa d'errors: {0}",
|
||||
"AnalyticsEnabledHelpText": "Envieu informació anònima d'ús i errors als servidors de {appName}. Això inclou informació sobre el vostre navegador, quines pàgines {appName} WebUI feu servir, informes d'errors, així com el sistema operatiu i la versió del temps d'execució. Utilitzarem aquesta informació per prioritzar les funcions i les correccions d'errors.",
|
||||
"AnalyticsEnabledHelpText": "Envieu informació anònima d'ús i errors als servidors de {appName}. Això inclou informació sobre el vostre navegador, quines pàgines {appName} WebUI feu servir, informes d'errors, així com el sistema operatiu i la versió de l'entorn d'execució. Utilitzarem aquesta informació per a prioritzar les funcions i les correccions d'errors.",
|
||||
"HistoryCleanupDaysHelpTextWarning": "Els fitxers de la paperera de reciclatge més antics que el nombre de dies seleccionat es netejaran automàticament",
|
||||
"UnableToAddANewAppProfilePleaseTryAgain": "No es pot afegir un perfil de qualitat nou, torneu-ho a provar.",
|
||||
"BackupFolderHelpText": "Els camins relatius estaran sota el directori AppData del {appName}",
|
||||
"BackupFolderHelpText": "Els camins relatius estaran sota el directori AppData de {appName}",
|
||||
"AllIndexersHiddenDueToFilter": "Totes les pel·lícules estan ocultes a causa del filtre aplicat.",
|
||||
"EnableRss": "Activa RSS",
|
||||
"Grabs": "Captura",
|
||||
@@ -312,11 +312,11 @@
|
||||
"Application": "Aplicacions",
|
||||
"Applications": "Aplicacions",
|
||||
"ApplicationStatusCheckAllClientMessage": "Totes les llistes no estan disponibles a causa d'errors",
|
||||
"AuthenticationMethodHelpText": "Requereix nom d'usuari i contrasenya per accedir al radar",
|
||||
"AuthenticationMethodHelpText": "Es requereix nom d'usuari i contrasenya per a accedir a {appName}",
|
||||
"ApplicationLongTermStatusCheckAllClientMessage": "Tots els indexadors no estan disponibles a causa d'errors durant més de 6 hores",
|
||||
"ApplicationLongTermStatusCheckSingleClientMessage": "Els indexadors no estan disponibles a causa d'errors durant més de 6 hores: {0}",
|
||||
"BindAddressHelpText": "Adreça IP vàlida, localhost o '*' per a totes les interfícies",
|
||||
"BranchUpdate": "Branca que s'utilitza per actualitzar {appName}",
|
||||
"BranchUpdate": "Branca que s'utilitza per a actualitzar {appName}",
|
||||
"Connect": "Notificacions",
|
||||
"DeleteApplicationMessageText": "Esteu segur que voleu suprimir la notificació '{0}'?",
|
||||
"DeleteIndexerProxyMessageText": "Esteu segur que voleu suprimir la llista '{0}'?",
|
||||
@@ -347,15 +347,15 @@
|
||||
"ApplicationUrlHelpText": "URL extern d'aquesta aplicació, inclòs http(s)://, port i URL base",
|
||||
"ApplyTagsHelpTextAdd": "Afegeix: afegeix les etiquetes a la llista d'etiquetes existent",
|
||||
"ApplyTagsHelpTextHowToApplyApplications": "Com aplicar etiquetes a les pel·lícules seleccionades",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Com aplicar etiquetes a les pel·lícules seleccionades",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Com aplicar etiquetes als indexadors seleccionats",
|
||||
"ApplyTagsHelpTextRemove": "Eliminar: elimina les etiquetes introduïdes",
|
||||
"DeleteSelectedApplicationsMessageText": "Esteu segur que voleu suprimir l'indexador '{0}'?",
|
||||
"Label": "Etiqueta",
|
||||
"ApplyTagsHelpTextReplace": "Substituïu: substituïu les etiquetes per les etiquetes introduïdes (no introduïu cap etiqueta per esborrar totes les etiquetes)",
|
||||
"DeleteSelectedDownloadClients": "Suprimeix el client de descàrrega",
|
||||
"ApplyTagsHelpTextReplace": "Substitució: substituïu les etiquetes per les etiquetes introduïdes (no introduïu cap etiqueta per a esborrar totes les etiquetes)",
|
||||
"DeleteSelectedDownloadClients": "Suprimeix el(s) client(s) de baixada",
|
||||
"Genre": "Gèneres",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Esteu segur que voleu suprimir l'indexador '{0}'?",
|
||||
"DeleteSelectedIndexersMessageText": "Esteu segur que voleu suprimir l'indexador '{0}'?",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Esteu segur que voleu suprimir {count} client(s) de baixada seleccionat(s)?",
|
||||
"DeleteSelectedIndexersMessageText": "Esteu segur que voleu suprimir {count} indexador(s) seleccionat(s)?",
|
||||
"DownloadClientPriorityHelpText": "Prioritzeu diversos clients de baixada. S'utilitza round-robin per a clients amb la mateixa prioritat.",
|
||||
"More": "Més",
|
||||
"Season": "temporada",
|
||||
@@ -363,19 +363,67 @@
|
||||
"Track": "Traça",
|
||||
"Year": "Any",
|
||||
"UpdateAvailable": "Nova actualització disponible",
|
||||
"ConnectionLostReconnect": "Radarr intentarà connectar-se automàticament, o podeu fer clic a recarregar.",
|
||||
"ConnectionLostToBackend": "Radarr ha perdut la connexió amb el backend i s'haurà de tornar a carregar per restaurar la funcionalitat.",
|
||||
"ConnectionLostReconnect": "{appName} intentarà connectar-se automàticament, o podeu fer clic a recarregar.",
|
||||
"ConnectionLostToBackend": "{appName} ha perdut la connexió amb el backend i s'haurà de tornar a carregar per a restaurar la funcionalitat.",
|
||||
"RecentChanges": "Canvis recents",
|
||||
"WhatsNew": "Que hi ha de nou?",
|
||||
"minutes": "Minuts",
|
||||
"DeleteAppProfileMessageText": "Esteu segur que voleu suprimir el perfil de qualitat {0}",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Llistes no disponibles a causa d'errors: {0}",
|
||||
"AddConnection": "Edita la col·lecció",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Totes les llistes no estan disponibles a causa d'errors",
|
||||
"AddConnection": "Afegeix una connexió",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Totes les notificacions no estan disponibles a causa d'errors",
|
||||
"AuthBasic": "Basic (finestra emergent del navegador)",
|
||||
"AuthForm": "Formularis (pàgina d'inici de sessió)",
|
||||
"DisabledForLocalAddresses": "Desactivat per a adreces locals",
|
||||
"None": "Cap",
|
||||
"ResetAPIKeyMessageText": "Esteu segur que voleu restablir la clau de l'API?",
|
||||
"RestartProwlarr": "Reinicia {appName}"
|
||||
"RestartProwlarr": "Reinicia {appName}",
|
||||
"AuthenticationRequired": "Autenticació necessària",
|
||||
"CountDownloadClientsSelected": "{count} client(s) de baixada seleccionat(s)",
|
||||
"NoDownloadClientsFound": "No s'han trobat clients de baixada",
|
||||
"AuthenticationRequiredWarning": "Per a evitar l'accés remot sense autenticació, ara {appName} requereix que l'autenticació estigui activada. Opcionalment, podeu desactivar l'autenticació des d'adreces locals.",
|
||||
"AppUpdatedVersion": "{appName} s'ha actualitzat a la versió `{version}`, per tal d'obtenir els darrers canvis, haureu de tornar a carregar {appName}",
|
||||
"AppUpdated": "{appName} Actualitzada",
|
||||
"ApplyChanges": "Aplica els canvis",
|
||||
"Implementation": "Implementació",
|
||||
"OnHealthRestored": "Al resoldre les incidències",
|
||||
"ManageDownloadClients": "Gestiona els clients de descàrrega",
|
||||
"AuthenticationRequiredHelpText": "Canvia per a quines sol·licituds cal autenticar. No canvieu tret que entengueu els riscos.",
|
||||
"CountIndexersSelected": "S'han seleccionat {count} indexador(s)",
|
||||
"EditDownloadClientImplementation": "Edita el client de baixada - {implementationName}",
|
||||
"EditIndexerImplementation": "Edita l'indexador - {implementationName}",
|
||||
"EditSelectedDownloadClients": "Editeu els clients de descàrrega seleccionats",
|
||||
"EditSelectedIndexers": "Edita els indexadors seleccionats",
|
||||
"IndexerDownloadClientHealthCheckMessage": "Indexadors amb clients de baixada no vàlids: {0}.",
|
||||
"AddCustomFilter": "Afegeix un filtre personalitzat",
|
||||
"AddDownloadClientImplementation": "Afegeix un client de descàrrega - {implementationName}",
|
||||
"AddIndexerImplementation": "Afegeix un indexador - {implementationName}",
|
||||
"AddConnectionImplementation": "Afegeix una connexió - {implementationName}",
|
||||
"InvalidUILanguage": "La vostra IU està configurada en un idioma no vàlid, corregiu-lo i deseu la configuració",
|
||||
"NoHistoryFound": "No s'ha trobat cap historial",
|
||||
"NoIndexersFound": "No s'han trobat indexadors",
|
||||
"OnHealthRestoredHelpText": "Al resoldre les incidències",
|
||||
"AuthenticationMethod": "Mètode d'autenticació",
|
||||
"AuthenticationMethodHelpTextWarning": "Seleccioneu un mètode d'autenticació vàlid",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Introduïu una contrasenya nova",
|
||||
"DefaultNameCopiedProfile": "{name} - Còpia",
|
||||
"DownloadClientQbittorrentSettingsContentLayout": "Disseny de contingut",
|
||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Si s'utilitza el disseny de contingut de qBittorrent s'utilitza el disseny original del torrent o es crea una subcarpeta (qBittorrent 4.3.2+)",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmeu la nova contrasenya",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Introduïu un nom d'usuari nou",
|
||||
"Categories": "Categories",
|
||||
"ApiKeyValidationHealthCheckMessage": "Actualitzeu la vostra clau de l'API perquè tingui almenys {length} caràcters. Podeu fer-ho mitjançant la configuració o el fitxer de configuració",
|
||||
"Episode": "episodi",
|
||||
"EditApplicationImplementation": "Edita la notificació - {implementationName}",
|
||||
"EditConnectionImplementation": "Afegeix una connexió - {implementationName}",
|
||||
"EditIndexerProxyImplementation": "Edita l'indexador - {implementationName}",
|
||||
"days": "dies",
|
||||
"Album": "àlbum",
|
||||
"Artist": "artista",
|
||||
"AddApplicationImplementation": "Afegeix una condició - {implementationName}",
|
||||
"AddIndexerProxyImplementation": "Afegeix un indexador - {implementationName}",
|
||||
"Category": "Categoria",
|
||||
"Clone": "Clona",
|
||||
"Yes": "Si",
|
||||
"No": "No"
|
||||
}
|
||||
|
||||
@@ -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ů"
|
||||
}
|
||||
|
||||
@@ -17,11 +17,11 @@
|
||||
"Age": "Alter",
|
||||
"All": "Alle",
|
||||
"AllIndexersHiddenDueToFilter": "Alle Indexer sind durch den ausgewählten Filter ausgeblendet.",
|
||||
"Analytics": "Analytik",
|
||||
"AnalyticsEnabledHelpText": "Sende anonyme Nutzungs- und Fehlerinformationen an die Server von {appName}. Dazu gehören Informationen über Browser, welche Seiten der {appName}-Weboberfläche aufgerufen wurden, Fehlerberichte sowie Betriebssystem- und Laufzeitversion. Wir werden diese Informationen verwenden, um Funktionen und Fehlerbehebungen zu priorisieren.",
|
||||
"Analytics": "Analysen",
|
||||
"AnalyticsEnabledHelpText": "Senden Sie anonyme Nutzungs- und Fehlerinformationen an die Server von {appName}. Dazu gehören Informationen zu Ihrem Browser, welche {appName}-WebUI-Seiten Sie verwenden, Fehlerberichte sowie Betriebssystem- und Laufzeitversion. Wir werden diese Informationen verwenden, um Funktionen und Fehlerbehebungen zu priorisieren.",
|
||||
"ApiKey": "API-Schlüssel",
|
||||
"ApiKeyValidationHealthCheckMessage": "Bitte den API Schlüssel korrigieren, dieser muss mindestens {0} Zeichen lang sein. Die Änderung kann über die Einstellungen oder die Konfigurationsdatei erfolgen",
|
||||
"AppDataDirectory": "AppData Ordner",
|
||||
"AppDataDirectory": "AppData-Verzeichnis",
|
||||
"AppDataLocationHealthCheckMessage": "Ein Update ist nicht möglich, um das Löschen von AppData beim Update zu verhindern",
|
||||
"AppProfileInUse": "App-Profil im Einsatz",
|
||||
"AppProfileSelectHelpText": "App-Profile werden verwendet, um die Einstellungen für RSS, automatische Suche und interaktive Suche bei der Anwendungssynchronisierung zu steuern",
|
||||
@@ -33,53 +33,53 @@
|
||||
"ApplicationStatusCheckSingleClientMessage": "Applikationen wegen folgender Fehler nicht verfügbar: {0}",
|
||||
"Applications": "Anwendungen",
|
||||
"Apply": "Anwenden",
|
||||
"ApplyTags": "Tags setzen",
|
||||
"ApplyTags": "Schlagworte anwenden",
|
||||
"Apps": "Anwendungen",
|
||||
"AudioSearch": "Audio Suche",
|
||||
"Auth": "Authentifizierung",
|
||||
"Authentication": "Authentifizierung",
|
||||
"AuthenticationMethodHelpText": "Für den Zugriff auf {appName} sind Benutzername und Passwort erforderlich",
|
||||
"AuthenticationMethodHelpText": "Für den Zugriff auf {appName} sind Benutzername und Passwort erforderlich.",
|
||||
"Automatic": "Automatisch",
|
||||
"AutomaticSearch": "Automatische Suche",
|
||||
"Backup": "Backups",
|
||||
"BackupFolderHelpText": "Relative Pfade befinden sich unter {appName}s AppData Ordner",
|
||||
"BackupIntervalHelpText": "Intervall zum sichern der Datenbank und Einstellungen",
|
||||
"Backup": "Sicherung",
|
||||
"BackupFolderHelpText": "Relative Pfade befinden sich im AppData-Verzeichnis von {appName}",
|
||||
"BackupIntervalHelpText": "Intervall zwischen automatischen Sicherungen",
|
||||
"BackupNow": "Jetzt sichern",
|
||||
"BackupRetentionHelpText": "Automatische Backups, die älter als die Aufbewahrungsfrist sind, werden automatisch gelöscht",
|
||||
"BackupRetentionHelpText": "Automatische Backups, die älter als der Aufbewahrungszeitraum sind, werden automatisch bereinigt",
|
||||
"Backups": "Sicherungen",
|
||||
"BeforeUpdate": "Vor dem Update",
|
||||
"BindAddress": "Adresse binden",
|
||||
"BindAddressHelpText": "Gültige IP Adresse oder \"*\" für alle Netzwerke",
|
||||
"BindAddressHelpText": "Gültige IP-Adresse, localhost oder „*“ für alle Schnittstellen",
|
||||
"BookSearch": "Buch Suche",
|
||||
"BookSearchTypes": "Buch-Suchtypen",
|
||||
"Branch": "Git-Branch",
|
||||
"Branch": "Branch",
|
||||
"BranchUpdate": "Verwendeter Branch zur Aktualisierung von {appName}",
|
||||
"BranchUpdateMechanism": "Git-Branch für den externen Updateablauf",
|
||||
"BypassProxyForLocalAddresses": "Proxy für lokale Adressen umgehen",
|
||||
"Cancel": "Abbrechen",
|
||||
"CancelPendingTask": "Diese laufende Aufgabe wirklich abbrechen?",
|
||||
"CancelPendingTask": "Möchten Sie diese ausstehende Aufgabe wirklich abbrechen?",
|
||||
"Categories": "Kategorien",
|
||||
"Category": "Kategorie",
|
||||
"CertificateValidation": "Zertifikat Validierung",
|
||||
"CertificateValidation": "Zertifikatsvalidierung",
|
||||
"CertificateValidationHelpText": "Ändere wie streng die Validierung der HTTPS-Zertifizierung ist",
|
||||
"ChangeHasNotBeenSavedYet": "Änderung wurde noch nicht gespeichert",
|
||||
"Clear": "Leeren",
|
||||
"ClearHistory": "Verlauf leeren",
|
||||
"ClearHistoryMessageText": "Wirklich den ganzen {appName} Verlauf löschen?",
|
||||
"ClientPriority": "Priorität",
|
||||
"CloneProfile": "Profil kopieren",
|
||||
"CloneProfile": "Profil klonen",
|
||||
"Close": "Schließen",
|
||||
"CloseCurrentModal": "Momentanes Modal schließen",
|
||||
"Columns": "Spalten",
|
||||
"Component": "Komponente",
|
||||
"Connect": "Benachrichtigungen",
|
||||
"ConnectSettings": "Eintellungen für Verbindungen",
|
||||
"ConnectSettings": "Verbindungseinstellungen",
|
||||
"ConnectSettingsSummary": "Benachrichtigungen und eigene Scripte",
|
||||
"ConnectionLost": "Verbindung unterbrochen",
|
||||
"Connections": "Verbindungen",
|
||||
"CouldNotConnectSignalR": "Es konnte keine Verbindung zu SignalR hergestellt werden, die Benutzeroberfläche wird nicht aktualisiert",
|
||||
"Custom": "Benutzerdefiniert",
|
||||
"CustomFilters": "Eigene Filter",
|
||||
"CustomFilters": "Benutzerdefinierte Filter",
|
||||
"DBMigration": "DB Migration",
|
||||
"Database": "Datenbank",
|
||||
"Date": "Datum",
|
||||
@@ -88,24 +88,24 @@
|
||||
"DeleteAppProfile": "App-Profil löschen",
|
||||
"DeleteApplication": "Applikation löschen",
|
||||
"DeleteApplicationMessageText": "Wirklich die Applikation '{0}' löschen?",
|
||||
"DeleteBackup": "Backup löschen",
|
||||
"DeleteBackupMessageText": "Backup '{0}' wirkich löschen?",
|
||||
"DeleteDownloadClient": "Downloader löschen",
|
||||
"DeleteDownloadClientMessageText": "Downloader '{0}' wirklich löschen?",
|
||||
"DeleteBackup": "Sicherung löschen",
|
||||
"DeleteBackupMessageText": "Sind Sie sicher, dass Sie die Sicherung „{name}“ löschen möchten?",
|
||||
"DeleteDownloadClient": "Download-Client löschen",
|
||||
"DeleteDownloadClientMessageText": "Sind Sie sicher, dass Sie den Download-Client „{name}“ löschen möchten?",
|
||||
"DeleteIndexerProxy": "Indexer Proxy löschen",
|
||||
"DeleteIndexerProxyMessageText": "Tag '{0}' wirklich löschen?",
|
||||
"DeleteNotification": "Benachrichtigung löschen",
|
||||
"DeleteNotificationMessageText": "Benachrichtigung '{0}' wirklich löschen?",
|
||||
"DeleteNotificationMessageText": "Sind Sie sicher, dass Sie die Benachrichtigung „{name}“ löschen möchten?",
|
||||
"DeleteTag": "Tag löschen",
|
||||
"DeleteTagMessageText": "Tag '{0}' wirklich löschen?",
|
||||
"DeleteTagMessageText": "Sind Sie sicher, dass Sie das Tag „{label}“ löschen möchten?",
|
||||
"Description": "Beschreibung",
|
||||
"Details": "Details",
|
||||
"Details": "Einzelheiten",
|
||||
"DevelopmentSettings": "Entwicklungseinstellungen",
|
||||
"Disabled": "Deaktiviert",
|
||||
"Discord": "Discord",
|
||||
"Docker": "Docker",
|
||||
"Donations": "Spenden",
|
||||
"DownloadClient": "Downloader",
|
||||
"DownloadClient": "Download Client",
|
||||
"DownloadClientSettings": "Downloader Einstellungen",
|
||||
"DownloadClientStatusCheckAllClientMessage": "Alle Download Clients sind aufgrund von Fehlern nicht verfügbar",
|
||||
"DownloadClientStatusCheckSingleClientMessage": "Download Clients aufgrund von Fehlern nicht verfügbar: {0}",
|
||||
@@ -307,17 +307,17 @@
|
||||
"Reload": "Neuladen",
|
||||
"Remove": "Entfernen",
|
||||
"RemoveFilter": "Filter entfernen",
|
||||
"RemovedFromTaskQueue": "Aus der Aufgabenwarteschlage entfernt",
|
||||
"RemovedFromTaskQueue": "Aus der Aufgabenwarteschlange entfernt",
|
||||
"RemovingTag": "Tag entfernen",
|
||||
"Replace": "Ersetzen",
|
||||
"Reset": "Zurücksetzen",
|
||||
"ResetAPIKey": "API-Schlüssel zurücksetzen",
|
||||
"Restart": "Neustarten",
|
||||
"Restart": "Neu starten",
|
||||
"RestartNow": "Jetzt neustarten",
|
||||
"RestartProwlarr": "{appName} Neustarten",
|
||||
"RestartRequiredHelpTextWarning": "Erfordert einen Neustart",
|
||||
"RestartRequiredHelpTextWarning": "Erfordert einen Neustart, damit die Aktion wirksam wird",
|
||||
"Restore": "Wiederherstellen",
|
||||
"RestoreBackup": "Backup einspielen",
|
||||
"RestoreBackup": "Sicherung wiederherstellen",
|
||||
"Result": "Ergebnis",
|
||||
"Retention": "Aufbewahrung ( Retention )",
|
||||
"SSLCertPassword": "SSL Zertifikat Passwort",
|
||||
@@ -339,8 +339,8 @@
|
||||
"Seeders": "Seeders",
|
||||
"SelectAll": "Alle wählen",
|
||||
"SemiPrivate": "Halbprivat",
|
||||
"SendAnonymousUsageData": "Anonyme Nutzungsdaten übertragen",
|
||||
"SetTags": "Tags setzen",
|
||||
"SendAnonymousUsageData": "Sende anonyme Nutzungsdaten",
|
||||
"SetTags": "Tags festlegen",
|
||||
"Settings": "Einstellungen",
|
||||
"SettingsConsoleLogLevel": "Konsolen Log Level",
|
||||
"SettingsEnableColorImpairedMode": "Farbbeeinträchtigter Modus aktivieren",
|
||||
@@ -358,7 +358,7 @@
|
||||
"SettingsShowRelativeDatesHelpText": "Relatives (z.B.: Heute, gestern, etc) oder absolutes Datum anzeigen",
|
||||
"SettingsSqlLoggingHelpText": "Log alle SQL Abfragen von {appName}",
|
||||
"SettingsTimeFormat": "Zeitformat",
|
||||
"ShowAdvanced": "Einfache Ansicht",
|
||||
"ShowAdvanced": "Erweitert anzeigen",
|
||||
"ShowSearch": "Suche anzeigen",
|
||||
"ShowSearchHelpText": "Suchbutton anzeigen beim draufzeigen",
|
||||
"Shutdown": "Herunterfahren",
|
||||
@@ -366,7 +366,7 @@
|
||||
"Sort": "Sortieren",
|
||||
"Source": "Quelle",
|
||||
"StartTypingOrSelectAPathBelow": "Eingeben oder unten auswählen",
|
||||
"Started": "gestartet",
|
||||
"Started": "Gestartet",
|
||||
"StartupDirectory": "Start-Verzeichnis",
|
||||
"Stats": "Statistiken",
|
||||
"Status": "Status",
|
||||
@@ -387,13 +387,13 @@
|
||||
"TagIsNotUsedAndCanBeDeleted": "Tag wird nicht benutzt und kann gelöscht werden",
|
||||
"Tags": "Tags",
|
||||
"TagsHelpText": "Wird auf Filme mit mindestens einem passenden Tag angewandt",
|
||||
"TagsSettingsSummary": "Alle Tags und deren Benutzung anzeigen. Unbenutzte Tags können entfernt werden",
|
||||
"TagsSettingsSummary": "Sehen Sie sich alle Tags und deren Verwendung an. Nicht verwendete Tags können entfernt werden",
|
||||
"Tasks": "Aufgaben",
|
||||
"Test": "Testen",
|
||||
"TestAll": "Alle testen",
|
||||
"Test": "Prüfen",
|
||||
"TestAll": "Alle prüfen",
|
||||
"TestAllApps": "Alle Apps testen",
|
||||
"TestAllClients": "Alle testen",
|
||||
"TestAllIndexers": "Alle testen",
|
||||
"TestAllClients": "Prüfe alle Clients",
|
||||
"TestAllIndexers": "Prüfe alle Indexer",
|
||||
"TheLatestVersionIsAlreadyInstalled": "Die aktuellste Version ist bereits installiert",
|
||||
"ThemeHelpText": "Ändere das UI-Theme der Anwendung. Das 'Auto'-Theme verwendet dein Betriebssystem-Theme, um den hellen oder dunklen Modus einzustellen. Inspiriert von {0}",
|
||||
"Time": "Zeit",
|
||||
@@ -419,7 +419,7 @@
|
||||
"UnableToAddANewNotificationPleaseTryAgain": "Die neue Benachrichtigung konnte nicht hinzugefügt werden, bitte erneut probieren.",
|
||||
"UnableToLoadAppProfiles": "App-Profile können nicht geladen werden",
|
||||
"UnableToLoadApplicationList": "Anwendungsliste kann nicht geladen werden",
|
||||
"UnableToLoadBackups": "Backups konnten nicht geladen werden",
|
||||
"UnableToLoadBackups": "Sicherungen können nicht geladen werden",
|
||||
"UnableToLoadDevelopmentSettings": "Entwicklereinstellungen konnten nicht geladen werden",
|
||||
"UnableToLoadDownloadClients": "Downloader konnten nicht geladen werden",
|
||||
"UnableToLoadGeneralSettings": "Allgemeine Einstellungen konnten nicht geladen werden",
|
||||
@@ -429,41 +429,41 @@
|
||||
"UnableToLoadNotifications": "Benachrichtigungen konnten nicht geladen werden",
|
||||
"UnableToLoadTags": "Tags konnten nicht geladen werden",
|
||||
"UnableToLoadUISettings": "Oberflächen Einstellungen konnten nicht geladen werden",
|
||||
"UnsavedChanges": "Ungespeicherte Änderungen",
|
||||
"UnselectAll": "Keine wählen",
|
||||
"UpdateAutomaticallyHelpText": "Updates automatisch herunteraden und installieren. Es kann weiterhin unter \"System -> Updates\" ein manuelles Update angestoßen werden",
|
||||
"UnsavedChanges": "Nicht gespeicherte Änderungen",
|
||||
"UnselectAll": "Alle abwählen",
|
||||
"UpdateAutomaticallyHelpText": "Updates automatisch herunterladen und installieren. Sie können weiterhin über System: Updates installieren",
|
||||
"UpdateCheckStartupNotWritableMessage": "Update kann nicht installiert werden, da der Startordner '{0}' vom Benutzer '{1}' nicht beschreibbar ist.",
|
||||
"UpdateCheckStartupTranslocationMessage": "Update kann nicht installiert werden, da sich der Startordner '{0}' in einem App Translocation-Ordner befindet.",
|
||||
"UpdateCheckUINotWritableMessage": "Update kann nicht installiert werden, da der Benutzeroberflächenordner '{0}' vom Benutzer '{1}' nicht beschreibbar ist.",
|
||||
"UpdateMechanismHelpText": "Benutze {appName}'s Built-In Updater oder ein Script",
|
||||
"UpdateMechanismHelpText": "Verwenden Sie den integrierten Updater von {appName} oder ein Skript",
|
||||
"UpdateScriptPathHelpText": "Pfad zu einem benutzerdefinierten Skript, das ein extrahiertes Update-Paket übernimmt und den Rest des Update-Prozesses abwickelt",
|
||||
"Updates": "Updates",
|
||||
"Uptime": "Laufzeit",
|
||||
"Updates": "Aktualisierung",
|
||||
"Uptime": "Betriebszeit",
|
||||
"Url": "Url",
|
||||
"UrlBaseHelpText": "Für Reverse-Proxy-Unterstützung. Die Standardeinstellung leer",
|
||||
"UseProxy": "Proxy benutzen",
|
||||
"UrlBaseHelpText": "Für die Reverse-Proxy-Unterstützung ist der Standardwert leer",
|
||||
"UseProxy": "Verwende Proxy",
|
||||
"Usenet": "Usenet",
|
||||
"UserAgentProvidedByTheAppThatCalledTheAPI": "UserAgent von der App welcher die API aufgerufen hat",
|
||||
"Username": "Benutzername",
|
||||
"Username": "Nutzername",
|
||||
"Version": "Version",
|
||||
"View": "Ansicht",
|
||||
"Warn": "Warnung",
|
||||
"Warn": "Achtung",
|
||||
"Website": "Webseite",
|
||||
"Wiki": "Wiki",
|
||||
"Yes": "Ja",
|
||||
"YesCancel": "Ja, abbrechen",
|
||||
"YesCancel": "Ja Abbrechen",
|
||||
"Yesterday": "Gestern",
|
||||
"OnHealthRestoredHelpText": "Bei Wiederherstellung des Zustands",
|
||||
"OnHealthRestored": "Bei Wiederherstellung des Zustands",
|
||||
"StopSelecting": "Auswahl stoppen",
|
||||
"ApplicationURL": "Anwendungs-URL",
|
||||
"ApplicationUrlHelpText": "Die externe URL der Anwendung inklusive http(s)://, Port und URL-Basis",
|
||||
"ApplicationUrlHelpText": "Die externe URL dieser Anwendung, einschließlich http(s)://, Port und URL-Basis",
|
||||
"ApplyChanges": "Änderungen anwenden",
|
||||
"CountIndexersSelected": "{0} Indexer ausgewählt",
|
||||
"CountIndexersSelected": "{count} Indexer ausgewählt",
|
||||
"DeleteSelectedDownloadClients": "Lösche Download Client(s)",
|
||||
"DeleteSelectedApplicationsMessageText": "Indexer '{0}' wirklich löschen?",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Indexer '{0}' wirklich löschen?",
|
||||
"DeleteSelectedIndexersMessageText": "Indexer '{0}' wirklich löschen?",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Sind Sie sicher, dass Sie {count} ausgewählte Download-Clients löschen möchten?",
|
||||
"DeleteSelectedIndexersMessageText": "Sind Sie sicher, dass Sie {count} ausgewählte(n) Indexer löschen möchten?",
|
||||
"EditSelectedDownloadClients": "Ausgewählte Download Clienten bearbeiten",
|
||||
"Implementation": "Integration",
|
||||
"ManageDownloadClients": "Verwalte Download Clienten",
|
||||
@@ -471,11 +471,11 @@
|
||||
"NoIndexersFound": "Keine Indexer gefunden",
|
||||
"Theme": "Design",
|
||||
"Season": "Staffel",
|
||||
"ApplyTagsHelpTextAdd": "Hinzufügen: Füge neu Tags zu den existierenden Tags hinzu",
|
||||
"ApplyTagsHelpTextAdd": "Hinzufügen: Fügen Sie die Tags der vorhandenen Tag-Liste hinzu",
|
||||
"ApplyTagsHelpTextHowToApplyApplications": "Wie werden Tags zu ausgewählten Autoren zugeteilt",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Wie werden Tags zu ausgewählten Indexern zugeteilt",
|
||||
"ApplyTagsHelpTextRemove": "Entfernen: Eingegebene Tags entfernen",
|
||||
"ApplyTagsHelpTextReplace": "Ersetzen: Nur eingegebene Tags übernehmen und vorhandene entfernen( keine Tags eingeben um alle zu entfernen )",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "So wenden Sie Tags auf die ausgewählten Indexer an",
|
||||
"ApplyTagsHelpTextRemove": "Entfernen: Die eingegebenen Tags entfernen",
|
||||
"ApplyTagsHelpTextReplace": "Ersetzen: Ersetzen Sie die Tags durch die eingegebenen Tags (geben Sie keine Tags ein, um alle Tags zu löschen).",
|
||||
"DownloadClientPriorityHelpText": "Priorisiere mehrere Downloader. Rundlauf-Verfahren wird für Downloader mit der gleichen Priorität verwendet.",
|
||||
"EditSelectedIndexers": "Ausgewähle Indexer bearbeiten",
|
||||
"SelectIndexers": "Indexer suchen",
|
||||
@@ -491,20 +491,20 @@
|
||||
"Artist": "Künstler",
|
||||
"Author": "Autor",
|
||||
"Book": "Buch",
|
||||
"ConnectionLostReconnect": "Radarr wird automatisch versuchen zu verbinden oder klicke unten auf neuladen.",
|
||||
"ConnectionLostToBackend": "Radarr hat die Verbindung zum Backend verloren und muss neugeladen werden.",
|
||||
"ConnectionLostReconnect": "{appName} wird versuchen, automatisch eine Verbindung herzustellen, oder Sie können unten auf „Neu laden“ klicken.",
|
||||
"ConnectionLostToBackend": "{appName} hat die Verbindung zum Backend verloren und muss neu geladen werden, um die Funktionalität wiederherzustellen.",
|
||||
"RecentChanges": "Kürzliche Änderungen",
|
||||
"WhatsNew": "Was gibt's Neues?",
|
||||
"WhatsNew": "Was ist neu?",
|
||||
"minutes": "Minuten",
|
||||
"DeleteAppProfileMessageText": "Qualitätsprofil '{0}' wirklich löschen?",
|
||||
"AddConnection": "Verbindung hinzufügen",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Wegen Fehlern sind keine Applikationen verfügbar",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Applikationen wegen folgender Fehler nicht verfügbar: {0}",
|
||||
"AuthBasic": "Einfach (Browser Popup)",
|
||||
"AuthForm": "Formular (Login Seite)",
|
||||
"DisabledForLocalAddresses": "Für Lokale Adressen deaktivieren",
|
||||
"AuthBasic": "Basis (Browser-Popup)",
|
||||
"AuthForm": "Formulare (Anmeldeseite)",
|
||||
"DisabledForLocalAddresses": "Für lokale Adressen deaktiviert",
|
||||
"None": "Keine",
|
||||
"ResetAPIKeyMessageText": "Bist du sicher, dass du den API-Schlüssel zurücksetzen willst?",
|
||||
"ResetAPIKeyMessageText": "Sind Sie sicher, dass Sie Ihren API-Schlüssel zurücksetzen möchten?",
|
||||
"AddCustomFilter": "Eigenen Filter hinzufügen",
|
||||
"AddApplication": "Application hinzufügen",
|
||||
"AddCategory": "Kategorie hinzufügen",
|
||||
@@ -532,5 +532,15 @@
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Gib einen neuen Benutzernamen ein",
|
||||
"AuthenticationMethodHelpTextWarning": "Bitte wähle eine gültige Authentifizierungsmethode aus",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Gib ein neues Passwort ein",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Neues Passwort bestätigen"
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Neues Passwort bestätigen",
|
||||
"DefaultNameCopiedProfile": "{Name} – Kopieren",
|
||||
"AuthenticationMethod": "Authentifizierungsmethode",
|
||||
"Clone": "Klonen",
|
||||
"CountDownloadClientsSelected": "{count} Download-Client(s) ausgewählt",
|
||||
"EditConnectionImplementation": "Verbindung hinzufügen - {implementationName}",
|
||||
"EditDownloadClientImplementation": "Download-Client hinzufügen - {implementationName}",
|
||||
"IndexerTagsHelpTextWarning": "Tags sollten mit Vorsicht verwendet werden, da sie ungewollte Effekte haben können. Eine Anwendung mit einem Tag synchronisiert nur Indexer die den Gleichen Tag haben.",
|
||||
"EditIndexerImplementation": "Indexer hinzufügen - {implementationName}",
|
||||
"EditApplicationImplementation": "Anwendung hinzufügen - {implementationName}",
|
||||
"EditIndexerProxyImplementation": "Indexer Proxy hinzufügen - {implementationName}"
|
||||
}
|
||||
|
||||
@@ -171,8 +171,11 @@
|
||||
"Docker": "Docker",
|
||||
"Donations": "Donations",
|
||||
"DownloadClient": "Download Client",
|
||||
"DownloadClientAriaSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Aria2 location",
|
||||
"DownloadClientCategory": "Download Client Category",
|
||||
"DownloadClientPriorityHelpText": "Prioritize multiple Download Clients. Round-Robin is used for clients with the same priority.",
|
||||
"DownloadClientQbittorrentSettingsContentLayout": "Content Layout",
|
||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Whether to use qBittorrent's configured content layout, the original layout from the torrent or always create a subfolder (qBittorrent 4.3.2+)",
|
||||
"DownloadClientSettings": "Download Client Settings",
|
||||
"DownloadClientStatusCheckAllClientMessage": "All download clients are unavailable due to failures",
|
||||
"DownloadClientStatusCheckSingleClientMessage": "Download clients unavailable due to failures: {0}",
|
||||
@@ -198,7 +201,7 @@
|
||||
"EnableInteractiveSearch": "Enable Interactive Search",
|
||||
"EnableInteractiveSearchHelpText": "Will be used when interactive search is used",
|
||||
"EnableRss": "Enable RSS",
|
||||
"EnableRssHelpText": "Enable Rss feed for Indexer",
|
||||
"EnableRssHelpText": "Enable RSS feed for Indexer",
|
||||
"EnableSSL": "Enable SSL",
|
||||
"EnableSslHelpText": " Requires restart running as administrator to take effect",
|
||||
"Enabled": "Enabled",
|
||||
@@ -246,7 +249,7 @@
|
||||
"HomePage": "Home Page",
|
||||
"Host": "Host",
|
||||
"Hostname": "Hostname",
|
||||
"Id": "Id",
|
||||
"Id": "ID",
|
||||
"IgnoredAddresses": "Ignored Addresses",
|
||||
"IllRestartLater": "I'll restart later",
|
||||
"Implementation": "Implementation",
|
||||
@@ -264,6 +267,7 @@
|
||||
"IndexerFlags": "Indexer Flags",
|
||||
"IndexerHealthCheckNoIndexers": "No indexers enabled, {appName} will not return search results",
|
||||
"IndexerHistoryLoadError": "Error loading indexer history",
|
||||
"IndexerId": "Indexer ID",
|
||||
"IndexerInfo": "Indexer Info",
|
||||
"IndexerLongTermStatusCheckAllClientMessage": "All indexers are unavailable due to failures for more than 6 hours",
|
||||
"IndexerLongTermStatusCheckSingleClientMessage": "Indexers unavailable due to failures for more than 6 hours: {0}",
|
||||
@@ -277,7 +281,7 @@
|
||||
"IndexerProxyStatusCheckAllClientMessage": "All proxies are unavailable due to failures",
|
||||
"IndexerProxyStatusCheckSingleClientMessage": "Proxies unavailable due to failures: {0}",
|
||||
"IndexerQuery": "Indexer Query",
|
||||
"IndexerRss": "Indexer Rss",
|
||||
"IndexerRss": "Indexer RSS",
|
||||
"IndexerSettingsSummary": "Configure various global Indexer settings including Proxies.",
|
||||
"IndexerSite": "Indexer Site",
|
||||
"IndexerStatus": "Indexer Status",
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
"DownloadClientStatusCheckSingleClientMessage": "Gestores de descargas no disponibles debido a errores: {0}",
|
||||
"DownloadClientStatusCheckAllClientMessage": "Los gestores de descargas no están disponibles debido a errores",
|
||||
"DownloadClients": "Gestores de Descargas",
|
||||
"Delete": "Borrar",
|
||||
"Delete": "Eliminar",
|
||||
"Dates": "Fechas",
|
||||
"Date": "Fecha",
|
||||
"CustomFilters": "Filtros Personalizados",
|
||||
@@ -137,7 +137,7 @@
|
||||
"DeleteTag": "Borrar Etiqueta",
|
||||
"DeleteNotification": "Borrar Notificación",
|
||||
"DeleteDownloadClient": "Borrar Gestor de Descargas",
|
||||
"DeleteBackup": "Borrar Backup",
|
||||
"DeleteBackup": "Eliminar copia de seguridad",
|
||||
"DBMigration": "Migración de DB",
|
||||
"CloneProfile": "Clonar Perfil",
|
||||
"ClientPriority": "Prioridad del Cliente",
|
||||
@@ -320,7 +320,7 @@
|
||||
"Filters": "Filtros",
|
||||
"HistoryCleanupDaysHelpText": "Ajustar a 0 para desactivar la limpieza automática",
|
||||
"HistoryCleanupDaysHelpTextWarning": "Los archivos en la papelera de reciclaje más antiguos que el número de días seleccionado serán limpiados automáticamente",
|
||||
"OnGrab": "Al Capturar",
|
||||
"OnGrab": "Al Capturar lanzamiento",
|
||||
"OnHealthIssue": "En Problema de Salud",
|
||||
"TestAllIndexers": "Comprobar Todos los Indexers",
|
||||
"NotificationTriggersHelpText": "Seleccione qué eventos deben activar esta notificación",
|
||||
@@ -351,7 +351,7 @@
|
||||
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent proporcionado por la aplicación llamó a la API",
|
||||
"InstanceName": "Nombre de Instancia",
|
||||
"InstanceNameHelpText": "Nombre de instancia en pestaña y para nombre de aplicación en Syslog",
|
||||
"Database": "Base de Datos",
|
||||
"Database": "Base de datos",
|
||||
"Duration": "Duración",
|
||||
"LastDuration": "Duración",
|
||||
"LastExecution": "Última ejecución",
|
||||
@@ -373,7 +373,7 @@
|
||||
"Label": "Etiqueta",
|
||||
"Theme": "Tema",
|
||||
"ApplyTagsHelpTextAdd": "Añadir: Añadir a las etiquetas la lista existente de etiquetas",
|
||||
"DeleteSelectedApplicationsMessageText": "Seguro que quieres eliminar el indexer '{0}'?",
|
||||
"DeleteSelectedApplicationsMessageText": "¿Estás seguro que quieres eliminar {count} aplicación(es) seleccionada(s)?",
|
||||
"DeleteSelectedDownloadClients": "Borrar Gestor de Descargas",
|
||||
"DeleteSelectedIndexersMessageText": "¿Está seguro de querer eliminar {count} indexador(es) seleccionado(s)?",
|
||||
"DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {count} cliente(s) de descarga seleccionado(s)?",
|
||||
@@ -426,7 +426,7 @@
|
||||
"EditIndexerProxyImplementation": "Agregar Condición - { implementationName}",
|
||||
"AppUpdated": "{appName} Actualizada",
|
||||
"AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitaras recargar {appName}",
|
||||
"AddApplicationImplementation": "Agregar Condición - { implementationName}",
|
||||
"AddApplicationImplementation": "Agregar aplicación - { implementationName}",
|
||||
"AddConnectionImplementation": "Añadir Conexión - {implementationName}",
|
||||
"AddIndexerImplementation": "Agregar Condición - { implementationName}",
|
||||
"AddIndexerProxyImplementation": "Agregar Condición - { implementationName}",
|
||||
@@ -460,10 +460,10 @@
|
||||
"DeleteAppProfile": "Eliminar Perfil de Aplicación",
|
||||
"AddSyncProfile": "Agregar Perfil de Sincronización",
|
||||
"AppSettingsSummary": "Aplicaciones y configuraciones para determinar como {appName} interactúa con sus programas de PVR",
|
||||
"AddCategory": "Agregar Categoría",
|
||||
"AddCategory": "Agregar categoría",
|
||||
"AppProfileSelectHelpText": "Los perfiles de la aplicación se usan para controlar la configuración por aplicación de RSS, Búsqueda Automática y Búsqueda Interactiva",
|
||||
"ActiveApps": "Aplicaciones Activas",
|
||||
"ActiveIndexers": "Indexadores Activos",
|
||||
"ActiveApps": "Aplicaciones activas",
|
||||
"ActiveIndexers": "Indexadores activos",
|
||||
"AudioSearch": "Búsqueda de Música",
|
||||
"Auth": "Autenticación",
|
||||
"BasicSearch": "Búsqueda Básica",
|
||||
@@ -492,5 +492,28 @@
|
||||
"Id": "Id",
|
||||
"EditCategory": "Editar categoría",
|
||||
"EditSyncProfile": "Editar perfil de sincronización",
|
||||
"EnableIndexer": "Habilitar indexador"
|
||||
"EnableIndexer": "Habilitar indexador",
|
||||
"InvalidUILanguage": "Su interfaz de usuario está configurada en un idioma no válido, corríjalo y guarde la configuración",
|
||||
"DownloadClientQbittorrentSettingsContentLayout": "Diseño del contenido",
|
||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Si usar el diseño de contenido configurado de qBittorrent, el diseño original del torrent o siempre crear una subcarpeta (qBittorrent 4.3.2+)",
|
||||
"EnableRssHelpText": "Habilitar feed RSS para el indexador",
|
||||
"days": "días",
|
||||
"ElapsedTime": "Tiempo transcurrido",
|
||||
"GrabTitle": "Capturar título",
|
||||
"SearchAllIndexers": "Buscar en todos los Indexadores",
|
||||
"Website": "Sitio web",
|
||||
"Redirect": "Redirección",
|
||||
"RssQueries": "Consultas RSS",
|
||||
"SeedRatio": "Ratio de siembra",
|
||||
"RssFeed": "Feed RSS",
|
||||
"SearchType": "Tipo de búsqueda",
|
||||
"RepeatSearch": "Repetir búsqueda",
|
||||
"SeedRatioHelpText": "El ratio que un torrent debe alcanzar antes de detenerse, si está vacío se usará el valor por defecto",
|
||||
"SeedTime": "Tiempo de siembra",
|
||||
"SearchTypes": "Tipos de búsquedas",
|
||||
"DeleteIndexerProxy": "Eliminar proxy indexador",
|
||||
"OnGrabHelpText": "Al Capturar lanzamiento",
|
||||
"SeedTimeHelpText": "El ratio que un torrent debe alcanzar antes de detenerse, si está vacío se usará el valor por defecto",
|
||||
"IndexerTagsHelpTextWarning": "Las etiquetas deben utilizarse con cuidado, pueden tener efectos involuntarios. Una aplicación con una etiqueta solo sincronizara con Indexadores que tengan la misma etiqueta.",
|
||||
"TVSearchTypes": "Tipos de búsquedas"
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"IndexerProxyStatusCheckSingleClientMessage": "Välityspalvelimet eivät ole käytettävissä virheiden vuoksi: {0}",
|
||||
"Logging": "Kirjaus",
|
||||
"LogLevel": "Kirjauksen taso",
|
||||
"Logging": "Lokikirjaus",
|
||||
"LogLevel": "Lokikirjauksen laajuus",
|
||||
"MovieIndexScrollTop": "Elokuvakirjasto: vieritä ylös",
|
||||
"Apply": "Käytä",
|
||||
"ClientPriority": "Lataustyökalun painotus",
|
||||
"IndexerPriorityHelpText": "Tietolähteen painotus: 1 (korkein) - 50 (matalin). Oletusarvo on 25. Käytetään muutoin tasaveroisten julkaisujen sieppauspäätökseen. Kaikkia käytössä olevia tietolähteitä käytetään edelleen RSS-synkronointiin ja hakuun.",
|
||||
"IndexerPriorityHelpText": "Tietolähteen painotus, 1– 50 (korkein-alin). Oletusarvo on 25. Käytetään muutoin tasaveroisten julkaisujen kaappauspäätökseen. Kaikkia käytössä olevia tietolähteitä käytetään edelleen RSS-synkronointiin ja hakuun.",
|
||||
"Manual": "Manuaalinen",
|
||||
"Add": "Lisää",
|
||||
"Reload": "Lataa uudelleen",
|
||||
@@ -25,67 +25,67 @@
|
||||
"SettingsTimeFormat": "Kellonajan esitys",
|
||||
"Message": "Viesti",
|
||||
"Seeders": "Jakajat",
|
||||
"TestAll": "Testaa kaikki",
|
||||
"TestAll": "Kaikkien testaus",
|
||||
"AddDownloadClient": "Lisää lataustyökalu",
|
||||
"CustomFilters": "Mukautetut suodattimet",
|
||||
"CustomFilters": "Omat suodattimet",
|
||||
"DeleteTag": "Poista tunniste",
|
||||
"EnableRss": "RSS-syöte",
|
||||
"Filter": "Suodata",
|
||||
"EnableRss": "Käytä RSS-syötettä",
|
||||
"Filter": "Suodatus",
|
||||
"Fixed": "Korjattu",
|
||||
"FocusSearchBox": "Kohdista hakukenttä",
|
||||
"ForMoreInformationOnTheIndividualDownloadClients": "Lue lisää lataustyökalusta painamalla 'Lisätietoja'.",
|
||||
"HideAdvanced": "Piilota edistyneet",
|
||||
"ForMoreInformationOnTheIndividualDownloadClients": "Saat yksittäisestä lataustyökalusta lisätietoja painamalla sen ohessa olevaa \"Lisätietoja\"-painiketta.",
|
||||
"HideAdvanced": "Piilota lisäasetukset",
|
||||
"History": "Historia",
|
||||
"MIA": "Puuttuu",
|
||||
"New": "Uusi",
|
||||
"PageSizeHelpText": "Sivulla näytettävien kohteiden määrä",
|
||||
"New": "Uutta",
|
||||
"PageSizeHelpText": "Sivukohtainen kohdemäärä.",
|
||||
"Proxy": "Välityspalvelin",
|
||||
"ProxyBypassFilterHelpText": "Käytä erottimena ',' ja '*.' jokerimerkkinä aliverkkotunnuksille (esim. www.esimerkki.fi,*.esimerkki.fi)",
|
||||
"ProxyBypassFilterHelpText": "Käytä aliverkkotunnusten erottimena pilkkua (,) ja jokerimerkkinä tähteä ja pistettä (*.). Esimerkkejä: www.esimerkki.fi,*.esimerkki.fi.",
|
||||
"Reddit": "Reddit",
|
||||
"Refresh": "Päivitä",
|
||||
"RefreshMovie": "Päivitä elokuva",
|
||||
"ReleaseBranchCheckOfficialBranchMessage": "'{0}' ei ole kelvollinen {appName}-julkaisuhaara, etkä saa päivityksiä sen kautta",
|
||||
"RestartRequiredHelpTextWarning": "Käyttöönotto vaatii uudelleenkäynnistyksen.",
|
||||
"ReleaseBranchCheckOfficialBranchMessage": "\"{0}\" ei ole kelvollinen {appName}-julkaisuhaara ja tämän vuoksi et saa päivityksiä.",
|
||||
"RestartRequiredHelpTextWarning": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen.",
|
||||
"Result": "Tulos",
|
||||
"Settings": "Asetukset",
|
||||
"SettingsLongDateFormat": "Pitkän päiväyksen esitys",
|
||||
"SettingsShortDateFormat": "Lyhyen päiväyksen esitys",
|
||||
"UnselectAll": "Poista kaikkien valinta",
|
||||
"UnselectAll": "Tyhjennä valinnat",
|
||||
"UpdateCheckStartupTranslocationMessage": "Päivitystä ei voi asentaa, koska käynnistyskansio '{0}' sijaitsee 'App Translocation' -kansiossa.",
|
||||
"UpdateCheckUINotWritableMessage": "Päivitystä ei voi asentaa, koska käyttäjällä '{1}' ei ole kirjoitusoikeutta käyttöliittymäkansioon '{0}'.",
|
||||
"UpdateMechanismHelpText": "Käytä {appName}in sisäänrakennettua päivitystoimintoa tai omaa komentosarjaasi.",
|
||||
"UpdateCheckUINotWritableMessage": "Päivityksen asennus ei onnistu, koska käyttäjällä \"{1}\" ei ole kirjoitusoikeutta käyttöliittymäkansioon \"{0}\".",
|
||||
"UpdateMechanismHelpText": "Käytä {appName}in sisäänrakennettua päivitystoimintoa tai komentosarjaa.",
|
||||
"Enable": "Käytä",
|
||||
"UI": "Käyttöliittymä",
|
||||
"UrlBaseHelpText": "Käänteisen välityspalvelimen tuki (esim. \"http://[host]:[port]/[urlBase]\"). Käytä oletusta jättämällä tyhjäksi.",
|
||||
"UrlBaseHelpText": "Lisää {appName}in URL-osoitteeseen jälkiliitteen, esim. \"http://[osoite]:[portti]/[URL-perusta]\". Oletusarvo on tyhjä.",
|
||||
"Usenet": "Usenet",
|
||||
"BackupNow": "Varmuuskopioi nyt",
|
||||
"NoBackupsAreAvailable": "Varmuuskopioita ei ole saatavilla",
|
||||
"UpdateCheckStartupNotWritableMessage": "Päivitystä ei voi asentaa, koska käyttäjällä '{1}' ei ole kirjoitusoikeutta käynnistyskansioon '{0}'.",
|
||||
"NoBackupsAreAvailable": "Varmuuskopioita ei ole käytettävissä",
|
||||
"UpdateCheckStartupNotWritableMessage": "Päivitystä ei voida asentaa, koska käyttäjällä \"{1}\" ei ole kirjoitusoikeutta käynnistyskansioon \"{0}\".",
|
||||
"Updates": "Päivitykset",
|
||||
"UpdateScriptPathHelpText": "Polku komentosarjaan, joka käsittelee puretun päivitystiedoston ja hoitaa asennuksen loppuosuuden.",
|
||||
"Uptime": "Käyttöaika",
|
||||
"URLBase": "URL-perusta",
|
||||
"UseProxy": "Käytä välityspalvelinta",
|
||||
"Username": "Käyttäjätunnus",
|
||||
"YesCancel": "Kyllä, peruuta",
|
||||
"YesCancel": "Kyllä, peru",
|
||||
"NoTagsHaveBeenAddedYet": "Tunnisteita ei ole vielä lisätty.",
|
||||
"ApplyTags": "Tunnistetoimenpide",
|
||||
"Authentication": "Todennus",
|
||||
"AuthenticationMethodHelpText": "Vaadi käyttäjätunnus ja salasana {appName}in käyttöön.",
|
||||
"BindAddressHelpText": "Toimiva IP-osoite, \"localhost\" tai \"*\" (tähti) kaikille verkkoliitännöille.",
|
||||
"Authentication": "Tunnistautuminen",
|
||||
"AuthenticationMethodHelpText": "Vaadi {appName}in käyttöön käyttäjätunnus ja salasana.",
|
||||
"BindAddressHelpText": "Toimiva IP-osoite, localhost tai * (tähti) kaikille verkkoliitännöille.",
|
||||
"Close": "Sulje",
|
||||
"DeleteNotification": "Poista kytkentä",
|
||||
"DeleteNotification": "Poista ilmoitus",
|
||||
"Docker": "Docker",
|
||||
"DownloadClient": "Lataustyökalu",
|
||||
"Language": "Kieli",
|
||||
"Search": "Haku",
|
||||
"Details": "Tiedot",
|
||||
"InteractiveSearch": "Vuorovaikutteinen haku",
|
||||
"Interval": "Aikaväli",
|
||||
"InteractiveSearch": "Manuaalihaku",
|
||||
"Interval": "Ajoitus",
|
||||
"KeyboardShortcuts": "Pikanäppäimet",
|
||||
"LastWriteTime": "Viimeisin kirjoitusaika",
|
||||
"LastWriteTime": "Viimeksi tallennettu",
|
||||
"LogFiles": "Lokitiedostot",
|
||||
"LogLevelTraceHelpTextWarning": "Jäljityskirjausta tulisi käyttää vain väliaikaisesti",
|
||||
"LogLevelTraceHelpTextWarning": "Jäljityskirjausta tulee käyttää vain tilapäisesti.",
|
||||
"Logs": "Lokitiedot",
|
||||
"Mechanism": "Mekanismi",
|
||||
"Name": "Nimi",
|
||||
@@ -94,14 +94,14 @@
|
||||
"Presets": "Esiasetukset",
|
||||
"Priority": "Painotus",
|
||||
"Protocol": "Protokolla",
|
||||
"ProxyCheckBadRequestMessage": "Välityspalvelintesti epäonnistui. Tilakoodi: {0}",
|
||||
"ProxyCheckBadRequestMessage": "Välityspalvelintesti epäonnistui. Tilakoodi: {0}.",
|
||||
"ProxyCheckFailedToTestMessage": "Välityspalvelintesti epäonnistui: {0}",
|
||||
"ProxyCheckResolveIpMessage": "Määritetyn välityspalvelimen \"{0}\" IP-osoitteen selvitys epäonnistui.",
|
||||
"ProxyPasswordHelpText": "Käyttäjätunnus ja salasana tulee syöttää vain tarvittaessa. Muussa tapauksessa jätä kentät tyhjiksi.",
|
||||
"ProxyPasswordHelpText": "Käyttäjätunnus ja salasana tulee täyttää vain tarvittaessa. Mikäli näitä ei ole, tulee kentät jättää tyhjiksi.",
|
||||
"ProxyType": "Välityspalvelimen tyyppi",
|
||||
"ProxyUsernameHelpText": "Käyttäjätunnus ja salasana tulee syöttää vain tarvittaessa. Muussa tapauksessa jätä kentät tyhjiksi.",
|
||||
"ProxyUsernameHelpText": "Käyttäjätunnus ja salasana tulee täyttää vain tarvittaessa. Mikäli näitä ei ole, tulee kentät jättää tyhjiksi.",
|
||||
"Queue": "Jono",
|
||||
"ReadTheWikiForMoreInformation": "Lue lisätietoja Wikistä",
|
||||
"ReadTheWikiForMoreInformation": "Wikistä löydät lisää tietoja",
|
||||
"ReleaseStatus": "Julkaisutila",
|
||||
"RemovedFromTaskQueue": "Poistettu tehtäväjonosta",
|
||||
"RemoveFilter": "Poista suodatin",
|
||||
@@ -117,15 +117,15 @@
|
||||
"Security": "Suojaus",
|
||||
"SuggestTranslationChange": "Ehdota käännösmuutosta",
|
||||
"System": "Järjestelmä",
|
||||
"SystemTimeCheckMessage": "Järjestelmän aika on pielessä yli vuorokauden. Ajoitetut tehtävät eivät luultavasti toimi oikein ennen sen korjausta.",
|
||||
"SystemTimeCheckMessage": "Järjestelmän ajassa on ainakin vuorokauden heitto eivätkä ajoitetut tehtävät tämän vuoksi toimi oikein ennen kuin se on korjattu.",
|
||||
"TagCannotBeDeletedWhileInUse": "Tunnistetta ei voi poistaa, koska se on käytössä",
|
||||
"TagIsNotUsedAndCanBeDeleted": "Tunnistetta ei ole määritetty millekään kohteelle, joten sen voi poistaa.",
|
||||
"TagsSettingsSummary": "Täältä näet kaikki tunnisteet käyttökohteineen ja voit poistaa sellaiset tunnisteet, joita ei ole määritetty millekään kohteelle.",
|
||||
"TagsSettingsSummary": "Täältä näet kaikki tunnisteet käyttökohteineen ja voit poistaa käyttämättömät tunnisteet.",
|
||||
"Tasks": "Tehtävät",
|
||||
"Test": "Kokeile",
|
||||
"TestAllClients": "Testaa kaikki lataustyökalut",
|
||||
"Test": "Testaa",
|
||||
"TestAllClients": "Lataustyökalujen testaus",
|
||||
"Time": "Aika",
|
||||
"Title": "Nimi",
|
||||
"Title": "Nimike",
|
||||
"Tomorrow": "Huomenna",
|
||||
"Torrent": "Torrent",
|
||||
"Torrents": "Torrentit",
|
||||
@@ -133,29 +133,29 @@
|
||||
"UILanguage": "Käyttöliittymän kieli",
|
||||
"UnableToAddANewApplicationPleaseTryAgain": "Uuden sovelluksen lisäys epäonnistui. Yritä uudelleen.",
|
||||
"UnableToAddANewIndexerPleaseTryAgain": "Uuden tietolähteen lisäys epäonnistui. Yritä uudelleen.",
|
||||
"UnableToAddANewIndexerProxyPleaseTryAgain": "Uuden tietolähdevälityspalvelimen lisäys epäonnistui. Yritä uudelleen.",
|
||||
"UnableToLoadBackups": "Varmuuskopioiden lataus epäonnistui.",
|
||||
"UnableToLoadDownloadClients": "Lataustyökalujen lataus epäonnistui.",
|
||||
"UnableToAddANewIndexerProxyPleaseTryAgain": "Uuden tiedonhaun välityspalvelimen lisäys epäonnistui. Yritä uudelleen.",
|
||||
"UnableToLoadBackups": "Varmuuskopioiden lataus epäonnistui",
|
||||
"UnableToLoadDownloadClients": "Lataustyökalujen lataus ei onistu",
|
||||
"UnableToLoadGeneralSettings": "Yleisten asetusten lataus epäonnistui.",
|
||||
"UpdateAutomaticallyHelpText": "Lataa ja asenna päivitykset automaattisesti. Voit edelleen asentaa ne myös lähteestä System:Updates.",
|
||||
"Added": "Lisätty",
|
||||
"UpdateAutomaticallyHelpText": "Lataa ja asenna päivitykset automaattisesti. Voit myös edelleen suorittaa asennuksen järjestelmäasetusten päivitykset-osiosta.",
|
||||
"Added": "Lisäysaika",
|
||||
"AddIndexer": "Lisää tietolähde",
|
||||
"AddingTag": "Tunniste lisätään",
|
||||
"Age": "Ikä",
|
||||
"All": "Kaikki",
|
||||
"AllIndexersHiddenDueToFilter": "Aktiivinen suodatin on piilottanut kaikki tietolähteet.",
|
||||
"Analytics": "Analytiikka",
|
||||
"AnalyticsEnabledHelpText": "Lähetä nimettömiä käyttö- ja virhetietoja palvelimillemme. Tämä sisältää tietoja selaimestasi, käyttöliittymän sivujen käytöstä, virheraportoinnista, käyttöjärjestelmästä ja suoritusalustasta. Käytämme näitä tietoja ominaisuuksien ja vikakorjausten painotukseen.",
|
||||
"AnalyticsEnabledHelpText": "Lähetä nimettömiä käyttö- ja virhetietoja {appName}in palvelimille. Tämä sisältää tietoja selaimestasi, käyttöliittymän sivujen käytöstä, virheraportoinnista, käyttöjärjestelmästä ja suoritusalustasta. Käytämme näitä tietoja ominaisuuksien ja vikakorjausten painotukseen.",
|
||||
"ApiKey": "API-avain",
|
||||
"AppDataDirectory": "AppData-kansio",
|
||||
"DBMigration": "Tietokannan siirto",
|
||||
"Delete": "Poista",
|
||||
"DeleteIndexerProxyMessageText": "Haluatko varmasti poistaa välityspalvelimen '{0}'?",
|
||||
"DeleteNotificationMessageText": "Haluatko varmasti poistaa kytkennän '{0}'?",
|
||||
"DeleteIndexerProxyMessageText": "Haluatko varmasti poistaa tietolähdevälityspalvelimen \"{name}\"?",
|
||||
"DeleteNotificationMessageText": "Haluatko varmasti poistaa ilmoituspalvelun \"{name}\"?",
|
||||
"Disabled": "Ei käytössä",
|
||||
"DownloadClients": "Lataustyökalut",
|
||||
"DownloadClientSettings": "Lataustyökalujen asetukset",
|
||||
"DownloadClientStatusCheckAllClientMessage": "Yhtään lataustyökalua ei ole virheiden vuoksi käytettävissä",
|
||||
"DownloadClientStatusCheckAllClientMessage": "Lataustyökaluja ei ole ongelmien vuoksi käytettävissä",
|
||||
"Mode": "Tila",
|
||||
"MoreInfo": "Lisätietoja",
|
||||
"SelectAll": "Valitse kaikki",
|
||||
@@ -166,68 +166,68 @@
|
||||
"ShowSearchHelpText": "Näytä hakupainike osoitettaessa.",
|
||||
"Shutdown": "Sammuta",
|
||||
"Size": "Koko",
|
||||
"Sort": "Järjestä",
|
||||
"Sort": "Järjestys",
|
||||
"UnableToAddANewDownloadClientPleaseTryAgain": "Uuden lataustyökalun lisäys epäonnistui. Yitä uudelleen.",
|
||||
"AppDataLocationHealthCheckMessage": "Päivitystä ei sallita, jotta AppData-kansion poisto päivityksen yhteydessä voidaan estää.",
|
||||
"AppDataLocationHealthCheckMessage": "Päivityksiä ei sallita, jotta AppData-kansion poistaminen päivityksen yhteydessä voidaan estää.",
|
||||
"UnableToLoadHistory": "Historian lataus epäonnistui.",
|
||||
"UnableToLoadNotifications": "Kytkentöjen lataus epäonnistui.",
|
||||
"UnableToLoadTags": "Tunnisteiden lataus 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",
|
||||
"DeleteDownloadClientMessageText": "Haluatko varmasti poistaa lataustyökalun '{0}'?",
|
||||
"DeleteTagMessageText": "Haluatko varmasti poistaa tunnisteen '{0}'?",
|
||||
"ConnectionLost": "Ei yhteyttä",
|
||||
"DeleteDownloadClientMessageText": "Haluatko varmasti poistaa lataustyökalun \"{name}\"?",
|
||||
"DeleteTagMessageText": "Haluatko varmasti poistaa tunnisteen \"{label}\"?",
|
||||
"Discord": "Discord",
|
||||
"Donations": "Lahjoitukset",
|
||||
"Edit": "Muokkaa",
|
||||
"EnableAutomaticSearchHelpText": "Profiilia käytetään automaattihauille, jotka suoritetaan käyttöliittymästä tai {appName}in toimesta.",
|
||||
"Enabled": "Käytössä",
|
||||
"EventType": "Tapahtumatyyppi",
|
||||
"EventType": "Tapahtuman tyyppi",
|
||||
"Exception": "Poikkeus",
|
||||
"FeatureRequests": "Kehitysehdotukset",
|
||||
"Grabbed": "Siepattu",
|
||||
"Grabbed": "Kaapattu",
|
||||
"IgnoredAddresses": "Ohitetut osoitteet",
|
||||
"IllRestartLater": "Käynnistän uudelleen myöhemmin",
|
||||
"Info": "Tiedot",
|
||||
"Info": "Informatiivinen",
|
||||
"LaunchBrowserHelpText": " Avaa {appName}in verkkokäyttöliittymä verkkoselaimeen sovelluksen käynnistyksen yhteydessä.",
|
||||
"NoChanges": "Ei muutoksia",
|
||||
"NoChanges": "Muutoksia ei ole",
|
||||
"NoLeaveIt": "Ei, anna olla",
|
||||
"PendingChangesMessage": "On tallentamattomia muutoksia. Haluatko varmasti poistua sivulta?",
|
||||
"PendingChangesMessage": "Olet tehnyt muutoksia, joita ei ole vielä tallennettu. Haluatko varmasti poistua sivulta?",
|
||||
"PendingChangesStayReview": "Älä poistu ja tarkista muutokset",
|
||||
"Save": "Tallenna",
|
||||
"SaveChanges": "Tallenna muutokset",
|
||||
"SaveSettings": "Tallenna asetukset",
|
||||
"Scheduled": "Ajoitettu",
|
||||
"SettingsEnableColorImpairedModeHelpText": "Vaihtoehtoinen tyyli, joka auttaa erottamaan värikoodatut tiedot paremmin",
|
||||
"Scheduled": "Ajoitukset",
|
||||
"SettingsEnableColorImpairedModeHelpText": "Vaihtoehtoinen tyyli, joka auttaa erottamaan värikoodatut tiedot paremmin.",
|
||||
"SettingsShowRelativeDates": "Suhteellisten päiväysten esitys",
|
||||
"SettingsShowRelativeDatesHelpText": "Näytä suhteutetut (tänään/eilen/yms.) absoluuttisten sijaan",
|
||||
"ShowSearch": "Näytä haku",
|
||||
"Source": "Lähde",
|
||||
"Source": "Lähdekoodi",
|
||||
"SSLPort": "SSL-portti",
|
||||
"StartTypingOrSelectAPathBelow": "Aloita kirjoitus tai valitse sijainti alta",
|
||||
"StartupDirectory": "Käynnistyskansio",
|
||||
"TableOptions": "Taulukkoasetukset",
|
||||
"TableOptions": "Taulukkonäkymän asetukset",
|
||||
"TableOptionsColumnsMessage": "Valitse näytettävät sarakkeet ja niiden järjestys",
|
||||
"TagsHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille tietolähteille. Käytä kaikille jättämällä tyhjäksi.",
|
||||
"UnableToAddANewAppProfilePleaseTryAgain": "Uuden sovellusprofiilin lisäys epäonnistui. Yritä uudelleen.",
|
||||
"UnableToAddANewNotificationPleaseTryAgain": "Kytkennän lisäys epäonnistui. Yritä uudelleen.",
|
||||
"Version": "Versio",
|
||||
"View": "Näytä",
|
||||
"Warn": "Varoita",
|
||||
"View": "Näkymä",
|
||||
"Warn": "Varoitus",
|
||||
"Wiki": "Wiki",
|
||||
"Port": "Portti",
|
||||
"Automatic": "Automaattinen",
|
||||
"AutomaticSearch": "Automaattihaku",
|
||||
"Backup": "Varmuuskopio",
|
||||
"BackupFolderHelpText": "Suhteelliset polut kohdistuvat sovelluksen AppData-kansioon.",
|
||||
"BackupIntervalHelpText": "Automaattisen varmuuskopioinnin aikaväli",
|
||||
"BackupRetentionHelpText": "Säilytysjaksoa vanhemmat automaattiset varmuuskopiot poistetaan automaattisesti.",
|
||||
"Backup": "Varmuuskopiointi",
|
||||
"BackupFolderHelpText": "Suhteelliset tiedostosijainnit ovat {appName}in AppData-kansiossa.",
|
||||
"BackupIntervalHelpText": "Tietokannan ja asetusten automaattisen varmuuskopioinnin ajoitus.",
|
||||
"BackupRetentionHelpText": "Säilytysjaksoa vanhemmat varmuuskopiot siivotaan automaattisesti.",
|
||||
"Backups": "Varmuuskopiot",
|
||||
"BeforeUpdate": "Ennen päivitystä",
|
||||
"BindAddress": "Sidososoite",
|
||||
"Branch": "Kehityshaara",
|
||||
"BranchUpdate": "Sovelluksen versiopäivityksiin käytettävä kehityshaara.",
|
||||
"Branch": "Haara",
|
||||
"BranchUpdate": "{appName}in versiopäivityksiin käytettävä kehityshaara.",
|
||||
"BranchUpdateMechanism": "Ulkoisen päivitysratkaisun käyttämä kehityshaara.",
|
||||
"BypassProxyForLocalAddresses": "Ohjaa paikalliset osoitteet välityspalvelimen ohi",
|
||||
"Cancel": "Peruuta",
|
||||
@@ -236,29 +236,29 @@
|
||||
"CertificateValidationHelpText": "Muuta HTTPS-varmennevahvistuksen tarkkuutta. Älä muuta, jollet ymmärrä tähän liittyviä riskejä.",
|
||||
"ChangeHasNotBeenSavedYet": "Muutosta ei ole vielä tallennettu",
|
||||
"Clear": "Tyhjennä",
|
||||
"CloneProfile": "Kloonaa profiili",
|
||||
"CloneProfile": "Monista profiili",
|
||||
"CloseCurrentModal": "Sulje nykyinen ikkuna",
|
||||
"Columns": "Sarakkeet",
|
||||
"Component": "Komponentti",
|
||||
"Connections": "Kytkennät",
|
||||
"ConnectSettings": "Kytkentöjen asetukset",
|
||||
"Connections": "Yhteydet",
|
||||
"ConnectSettings": "Kytkösasetukset",
|
||||
"CouldNotConnectSignalR": "SignalR-kirjastoa ei tavoitettu, eikä käyttöliittymää päivitetä",
|
||||
"Custom": "Mukautettu",
|
||||
"DeleteApplicationMessageText": "Haluatko varmasti poistaa sovelluksen \"{0}\"?",
|
||||
"DeleteApplicationMessageText": "Haluatko varmasti poistaa sovelluksen \"{name}\"?",
|
||||
"DeleteBackup": "Poista varmuuskopio",
|
||||
"DeleteBackupMessageText": "Haluatko varmasti poistaa varmuuskopion '{0}'?",
|
||||
"DeleteBackupMessageText": "Haluatko varmasti poistaa varmuuskopion \"{name}\"?",
|
||||
"DeleteDownloadClient": "Poista lataustyökalu",
|
||||
"DownloadClientStatusCheckSingleClientMessage": "Lataustyökalut eivät ole virheiden vuoksi käytettävissä: {0}",
|
||||
"DownloadClientStatusCheckSingleClientMessage": "Lataustyökaluja ei ole ongelmien vuoksi käytettävissä: {0}",
|
||||
"EditIndexer": "Muokkaa tietolähdettä",
|
||||
"EnableAutomaticSearch": "Automaattihaku",
|
||||
"EnableInteractiveSearch": "Vuorovaikutteinen haku",
|
||||
"EnableInteractiveSearchHelpText": "Profiilia käytetään vuorovaikutteisen haun yhteydessä.",
|
||||
"EnableAutomaticSearch": "Käytä automaattihakua",
|
||||
"EnableInteractiveSearch": "Käytä manuaalihakua",
|
||||
"EnableInteractiveSearchHelpText": "Profiilia käytetään manuaalihakuun.",
|
||||
"EnableSSL": "SSL-salaus",
|
||||
"EnableSslHelpText": " Käyttöönotto edellyttää uudelleenkäynnistystä järjestelmänvalvojan oikeuksilla.",
|
||||
"EnableSslHelpText": " Käyttöönotto vaatii uudelleenkäynnistyksen järjestelmänvavojan oikeuksilla.",
|
||||
"Error": "Virhe",
|
||||
"ErrorLoadingContents": "Sisällönlatauksen virhe",
|
||||
"ErrorLoadingContents": "Virhe ladattaessa sisältöjä",
|
||||
"Events": "Tapahtumat",
|
||||
"ExistingTag": "Olemassa oleva tunniste",
|
||||
"ExistingTag": "Tunniste on jo olemassa",
|
||||
"Failed": "Epäonnistui",
|
||||
"Filename": "Tiedostonimi",
|
||||
"Files": "Tiedostot",
|
||||
@@ -266,10 +266,10 @@
|
||||
"General": "Yleiset",
|
||||
"GeneralSettings": "Yleiset asetukset",
|
||||
"GeneralSettingsSummary": "Portti, SSL-salaus, käyttäjänimi ja salasana, välityspalvelin, analytiikka ja päivitykset.",
|
||||
"Grabs": "Sieppaukset",
|
||||
"Health": "Kunto",
|
||||
"Grabs": "Kaappaukset",
|
||||
"Health": "Terveys",
|
||||
"Level": "Taso",
|
||||
"HealthNoIssues": "Kokoonpanossasi ei ole ongelmia.",
|
||||
"HealthNoIssues": "Kokoonpanossasi ei ole ongelmia",
|
||||
"HomePage": "Verkkosivusto",
|
||||
"Host": "Osoite",
|
||||
"Hostname": "Osoite",
|
||||
@@ -283,7 +283,7 @@
|
||||
"IndexerStatusCheckAllClientMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi",
|
||||
"IndexerStatusCheckSingleClientMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi: {0}",
|
||||
"NoChange": "Ei muutosta",
|
||||
"NoLogFiles": "Ei lokitiedostoja",
|
||||
"NoLogFiles": "Lokitiedostoja ei ole",
|
||||
"SSLCertPasswordHelpText": "PFX-tiedoston salasana",
|
||||
"SSLCertPath": "SSL-varmenteen sijainti",
|
||||
"SSLCertPathHelpText": "PFX-tiedoston sijainti",
|
||||
@@ -292,31 +292,31 @@
|
||||
"NoUpdatesAreAvailable": "Päivityksiä ei ole saatavilla",
|
||||
"OAuthPopupMessage": "Selaimesi estää ponnahdukset",
|
||||
"Ok": "Ok",
|
||||
"OnHealthIssueHelpText": "Kuntoon liittyvä ongelma",
|
||||
"OnHealthIssueHelpText": "Vakausongelmat",
|
||||
"OpenBrowserOnStart": "Avaa selain käynnistettäessä",
|
||||
"OpenThisModal": "Avaa tämä ikkuna",
|
||||
"Options": "Valinnat",
|
||||
"PackageVersion": "Pakettiversio",
|
||||
"Options": "Asetukset",
|
||||
"PackageVersion": "Paketin versio",
|
||||
"PageSize": "Sivun koko",
|
||||
"Password": "Salasana",
|
||||
"PendingChangesDiscardChanges": "Hylkää muutokset ja poistu",
|
||||
"PortNumber": "Portti",
|
||||
"PortNumber": "Portin numero",
|
||||
"RestoreBackup": "Palauta varmuuskopio",
|
||||
"Retention": "Säilytys",
|
||||
"UILanguageHelpText": "Käyttöliittymä näytetään tällä kielellä.",
|
||||
"UILanguageHelpTextWarning": "Käyttöönotto vaatii selaimen sivupäivityksen.",
|
||||
"UILanguageHelpText": "{appName}in käyttöliittymän kieli.",
|
||||
"UILanguageHelpTextWarning": "Selaimen sivupäivitys vaaditaan",
|
||||
"UISettings": "Käyttöliittymän asetukset",
|
||||
"DownloadClientsSettingsSummary": "{appName}in käyttöliittymästä suoritettavien hakujen yhteydessä käytettävien lataustyökalujen määritykset.",
|
||||
"DownloadClientsSettingsSummary": "{appName}in käyttöliittymästä suoritettavien hakujen yhteydessä käytettävät lataustyökalumääritykset.",
|
||||
"ProwlarrSupportsAnyDownloadClient": "{appName} tukee alla listatuja lataustyökaluja.",
|
||||
"AddDownloadClientToProwlarr": "Lisäämällä lataustyökalun {appName} voi käynnistää lataukset suoraan käyttöliittymästä manuaalisen haun yhteydessä.",
|
||||
"RedirectHelpText": "Uudelleenohjaa tietolähteeltä saapuvat latauspyynnöt ja ohjaa sieppaus suoraan sen sijaan, että se välitettäisiin Prowlarin kautta.",
|
||||
"RedirectHelpText": "Uudelleenohjaa tietolähteeltä saapuvat latauspyynnöt ja välitä kaappaus suoraan välittämättä sitä {appName}in välityksellä.",
|
||||
"FullSync": "Täysi synkronointi",
|
||||
"SyncLevelFull": "Täysi synkronointi: Pitää sovelluksen tietolähteet täysin synkronoituna. Tietolähteisiin {appName}issa tehdyt muutokset synkronoidaan etäsovelluksen kanssa ja kaikki etäsovelluksessa tehdyt muutokset korvataan seuraavan synkronoinnin yhteydessä.",
|
||||
"EnableIndexer": "Tietolähteen tila",
|
||||
"FilterPlaceHolder": "Suodata tietolähteitä",
|
||||
"IndexerHealthCheckNoIndexers": "Yhtään tietolähdettä ei ole käytössä, eikä {appName} tämän vuoksi löydä tuloksia.",
|
||||
"IndexerObsoleteCheckMessage": "Tietolähteet ovat vanhentuneita tai niitä on päivitetty: {0}. Poista ja/tai lisää ne Prowlariin uudelleen.",
|
||||
"IndexerProxy": "Tietolähteen välityspalvelin",
|
||||
"IndexerObsoleteCheckMessage": "Tietolähteet ovat poistuneet tai ne ovat muuttuneet: {0}. Poista ja/tai lisää ne {appName}iin uudelleen.",
|
||||
"IndexerProxy": "Tiedonhaun välityspalvelin",
|
||||
"IndexerSettingsSummary": "Määritä useita globaaleita tietolähdeasetuksia, kuten välityspalvelimia.",
|
||||
"IndexerVipCheckExpiringClientMessage": "Tietolähteen VIP-edut erääntyvät pian: {0}",
|
||||
"ProwlarrSupportsAnyIndexer": "{appName} tukee Newznab- ja Torznab-yhteensopivien tietolähteiden ohella myös useita muita lähteitä vaihtoehdoilla \"Yleinen Newznab\" (Usenetille) ja 'Yleinen Torznab' (torrenteille).",
|
||||
@@ -324,15 +324,15 @@
|
||||
"AddIndexerProxy": "Lisää tiedonhaun välityspalvelin",
|
||||
"UISettingsSummary": "Kalenterin, päiväyksen ja kellonajan sekä kielen ja heikentyneelle värinäölle sopivan tilan asetukset.",
|
||||
"SettingsIndexerLoggingHelpText": "Kirjaa tarkempia tietoja tietolähteiden toiminnasta, mukaanlukien vastaukset",
|
||||
"IndexerTagsHelpText": "Tunnisteiden avulla voit määrittää tiedonhaun välityspalvelimet, mihin sovelluksiin tietolähteet synkronoidaan tai yksikertaisesti järjestellä tietolähteitäsi.",
|
||||
"IndexerTagsHelpText": "Tunnisteilla voit kohdistaa tiedonhaun välityspalvelimia ja määrittää mihin sovelluksiin ne synkronoidaan.",
|
||||
"UnableToLoadAppProfiles": "Sovellusprofiilien lataus epäonnistui",
|
||||
"AppProfileSelectHelpText": "Sovellusprofiilieilla määritetään tietolähteelle sovellussynkronoinnin yhteydessä aktivoitavat hakutavat (RSS/automaatti/vuorovaikutteinen).",
|
||||
"AppProfileSelectHelpText": "Sovellusprofiilieilla määritetään tietolähteelle sovellussynkronoinnin yhteydessä aktivoitavat hakutavat (RSS/automaatti/manuaali).",
|
||||
"IndexerQuery": "Tietolähteen kysely",
|
||||
"IndexerRss": "Tietolähteen RSS-syöte",
|
||||
"IndexerRss": "Tietolähteen RSS",
|
||||
"SearchIndexers": "Etsi tietolähteistä",
|
||||
"AddRemoveOnly": "Ainoastaan lisää/poista",
|
||||
"IndexerVipCheckExpiredClientMessage": "Tietolähteen VIP-edut ovat erääntyneet: {0}",
|
||||
"MaintenanceRelease": "Huoltojulkaisu: Korjauksia ja muita parannuksia. Lue lisää Githubin historiasta muutoshistoriasta.",
|
||||
"MaintenanceRelease": "Huoltojulkaisu: korjauksia ja muita parannuksia. Lue lisää Githubin muutoshistoriasta.",
|
||||
"Query": "Kysely",
|
||||
"Redirect": "Uudelleenohjaus",
|
||||
"RestartProwlarr": "Käynnistä {appName} uudelleen",
|
||||
@@ -340,7 +340,7 @@
|
||||
"SyncLevelAddRemove": "Vain lisäys/poisto: Kun {appName}in tietolähteitä lisätään tai poistetaan, päivittyy myös etäsovellus.",
|
||||
"SyncAppIndexers": "Synkronoi tietolähteet",
|
||||
"TestAllApps": "Testaa kaikki sovellukset",
|
||||
"UnableToLoadIndexerProxies": "Tietolähdevälityspalvelimien lataus epäonnistui",
|
||||
"UnableToLoadIndexerProxies": "Tiedonhaun välityspalvelimia ei voitu ladata",
|
||||
"AddedToDownloadClient": "Julkaisu lisättiin lataustyökaluun",
|
||||
"AddNewIndexer": "Lisää uusi tietolähde",
|
||||
"AddToDownloadClient": "Lisää julkaisu lataustyökaluun",
|
||||
@@ -352,28 +352,28 @@
|
||||
"SettingsLogRotate": "Lokitiedostojen kierrätys",
|
||||
"SettingsLogSql": "Kirjaa SQL",
|
||||
"SettingsSqlLoggingHelpText": "Kirjaa kaikki {appName}in SQL-kyselyt",
|
||||
"ConnectSettingsSummary": "Ilmoitukset ja omat komentosarjat.",
|
||||
"ConnectSettingsSummary": "Ilmoitukset, kuten viestintä mediapalvelimille ja soittimille, sekä omat komentosarjat.",
|
||||
"DevelopmentSettings": "Kehittäjäasetukset",
|
||||
"Description": "Kuvaus",
|
||||
"Id": "Tunniste",
|
||||
"SettingsConsoleLogLevel": "Valvontalokin taso",
|
||||
"Id": "ID",
|
||||
"SettingsConsoleLogLevel": "Valvontalokin laajuus",
|
||||
"SettingsFilterSentryEvents": "Suodata analytiikan tapahtumia",
|
||||
"SettingsFilterSentryEventsHelpText": "Suodata tunnetut käyttäjävirheet pois analytiikkalähetyksistä",
|
||||
"Applications": "Sovellukset",
|
||||
"AppProfileInUse": "Sovellusprofiili on käytössä",
|
||||
"Apps": "Sovellukset",
|
||||
"Auth": "Todennus",
|
||||
"Category": "Luokitus",
|
||||
"Category": "Kategoria",
|
||||
"ClearHistory": "Tyhjennä historia",
|
||||
"ClearHistoryMessageText": "Haluatko varmasti tyhjentää kaiken {appName}-historian?",
|
||||
"Connect": "Kytkennät",
|
||||
"EnableRssHelpText": "Tietolähde sisällytetään RSS-syötteeseen.",
|
||||
"EnableRssHelpText": "Käytä tietolähteelle RSS-syötettä.",
|
||||
"DeleteApplication": "Poista sovellus",
|
||||
"DeleteAppProfile": "Poista sovellusprofiili",
|
||||
"IndexerProxies": "Tietolähteiden välityspalvelimet",
|
||||
"IndexerProxies": "Tiedonhaun välityspalvelimet",
|
||||
"IndexerAuth": "Tietolähteen todennus",
|
||||
"Notifications": "Kytkennät",
|
||||
"NotificationTriggersHelpText": "Valitse tapahtumat, jotka aiheuttavat ilmoituksen.",
|
||||
"NotificationTriggersHelpText": "Valitse tämän ilmoituksen laukaisevat tapahtumat.",
|
||||
"Stats": "Tilastot",
|
||||
"UnableToLoadDevelopmentSettings": "Kehittäjäasetusten lataus epäonnistui",
|
||||
"AppSettingsSummary": "Sovellukset ja asetukset, joilla määritetään miten {appName} viestii PVR-sovellustesi kanssa.",
|
||||
@@ -386,11 +386,11 @@
|
||||
"QueryOptions": "Kyselyasetukset",
|
||||
"TvSearch": "Etsi televisiosarjoja",
|
||||
"Filters": "Suodattimet",
|
||||
"OnGrab": "Kun elokuva siepataan",
|
||||
"OnHealthIssue": "Kun havaitaan kuntoon liittyvä ongelma",
|
||||
"HistoryCleanupDaysHelpText": "Poista automaattinen tyhjennys käytöstä asettamalla arvoksi '0'.",
|
||||
"OnGrab": "Kun julkaisu kaapataan",
|
||||
"OnHealthIssue": "Vakausongelmat",
|
||||
"HistoryCleanupDaysHelpText": "Arvo \"0\" (nolla) poistaa automaattityhjennyksen käytöstä.",
|
||||
"HistoryCleanupDaysHelpTextWarning": "Tässä määritettyä aikaa vanhemmat tiedostot poistetaan automaattisesti roskakorista pysyvästi.",
|
||||
"TestAllIndexers": "Testaa tietolähteet",
|
||||
"TestAllIndexers": "Tietolähteiden testaus",
|
||||
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent-tiedon ilmoitti sovellus, joka kommunikoi API:n kanssa",
|
||||
"Categories": "Kategoriat",
|
||||
"Database": "Tietokanta",
|
||||
@@ -410,7 +410,7 @@
|
||||
"Private": "Yksityinen",
|
||||
"QueryResults": "Kyselyn tulokset",
|
||||
"Application": "Sovellus",
|
||||
"GrabReleases": "Sieppaa julkaisu(t)",
|
||||
"GrabReleases": "Kaappaa julkaisu(t)",
|
||||
"Link": "Linkki",
|
||||
"SearchTypes": "Mitä etsitään",
|
||||
"UnableToLoadIndexers": "Tietolähteiden lataus epäonnistui",
|
||||
@@ -434,18 +434,18 @@
|
||||
"AddSyncProfile": "Lisää synkronointiprofiili",
|
||||
"EditSyncProfile": "Muokkaa synkronointiprofiilia",
|
||||
"InstanceName": "Instanssin nimi",
|
||||
"InstanceNameHelpText": "Instanssin nimi välilehdellä ja järjestelmälokissa",
|
||||
"ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasu. \"Automaattinen\" vaihtaa vaalean ja tumman tilan välillä järjestelmän teeman mukaan. Innoittanut Theme.Park.",
|
||||
"InstanceNameHelpText": "Instanssin nimi välilehdellä ja järjestelmälokissa.",
|
||||
"ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasua. \"Automaattinen\" vaihtaa vaalean ja tumman tilan välillä järjestelmän teeman mukaan. Innoittanut Theme.Park.",
|
||||
"Duration": "Kesto",
|
||||
"ElapsedTime": "Kulunut aika",
|
||||
"EnabledRedirected": "Kulunut, uudelleenohjattu",
|
||||
"Ended": "Päättynyt",
|
||||
"GrabTitle": "Sieppaa nimike",
|
||||
"GrabTitle": "Kaappaa nimike",
|
||||
"LastExecution": "Edellinen suoritus",
|
||||
"LastDuration": "Edellinen kesto",
|
||||
"NextExecution": "Seuraava suoritus",
|
||||
"Parameters": "Parametrit",
|
||||
"Queued": "Jonossa",
|
||||
"Queued": "Lisätty jonoon",
|
||||
"Started": "Alkoi",
|
||||
"ApplicationLongTermStatusCheckAllClientMessage": "Sovellukset eivät ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi.",
|
||||
"ApplicationLongTermStatusCheckSingleClientMessage": "Sovellukset eivät ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi: {0}",
|
||||
@@ -453,30 +453,30 @@
|
||||
"DeleteClientCategory": "Poista lataustyökalukategoria",
|
||||
"DownloadClientCategory": "Lataustyökalukategoria",
|
||||
"MappedCategories": "Kartoitetut kategoriat",
|
||||
"AuthenticationRequired": "Todennus vaaditaan",
|
||||
"AuthenticationRequired": "Vaadi tunnistautuminen",
|
||||
"Remove": "Poista",
|
||||
"Replace": "Korvaa",
|
||||
"TheLatestVersionIsAlreadyInstalled": "{appName}in uusin versio on jo asennettu",
|
||||
"ApplicationURL": "Sovelluksen URL-osoite",
|
||||
"ApplicationUrlHelpText": "Sovelluksen ulkoinen URL-osoite, johon sisältyy http(s)://, portti ja URL-perusta.",
|
||||
"Track": "Jäljitys",
|
||||
"CountIndexersSelected": "{0} valittua tietolähdettä",
|
||||
"DeleteSelectedDownloadClients": "Poista lataustyökalu",
|
||||
"DeleteSelectedApplicationsMessageText": "Haluatko varmasti poistaa tietolähteen '{0}'?",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Haluatko varmasti poistaa tietolähteen '{0}'?",
|
||||
"DeleteSelectedIndexersMessageText": "Haluatko varmasti poistaa tietolähteen '{0}'?",
|
||||
"ApplicationURL": "Sovelluksen URL",
|
||||
"ApplicationUrlHelpText": "Tämän sovelluksen ulkoinen URL-osoite, johon sisältyy http(s)://, portti ja URL-perusta.",
|
||||
"Track": "Valvo",
|
||||
"CountIndexersSelected": "{count} tietolähde(ttä) on valittu",
|
||||
"DeleteSelectedDownloadClients": "Poista lataustyökalu(t)",
|
||||
"DeleteSelectedApplicationsMessageText": "Haluatko varmasti poistaa {count} valit(un/tua) sovellu(sta/ksen)?",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Haluatko varmasti poistaa {count} valit(n/tua) lataustyökalu(n/a)?",
|
||||
"DeleteSelectedIndexersMessageText": "Haluatko varmasti poistaa {count} valit(un/tua) tietoläh(teen/dettä)?",
|
||||
"Publisher": "Julkasija",
|
||||
"SelectIndexers": "Etsi tietolähteistä",
|
||||
"SelectIndexers": "Valitse tietolähteet",
|
||||
"Year": "Vuosi",
|
||||
"Genre": "Tyylilajit",
|
||||
"Genre": "Lajityyppi",
|
||||
"More": "Lisää",
|
||||
"Season": "Kausi",
|
||||
"ApplyTagsHelpTextAdd": "– 'Lisää' syötetyt tunnisteet aiempiin tunnisteisiin",
|
||||
"ApplyTagsHelpTextHowToApplyApplications": "Tunnistetoimenpiteiden selitykset:",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Tunnisteisiin kohdistettavat toimenpiteet:",
|
||||
"ApplyTagsHelpTextRemove": "- \"Poista\" tyhjentää syötetyt tunnisteet.",
|
||||
"ApplyTagsHelpTextReplace": "- \"Korvaa\" nykyiset tunnisteet syötetyillä tai tyhjennä kaikki tunnisteet jättämällä tyhjäksi.",
|
||||
"DownloadClientPriorityHelpText": "Tietolähteen painotus: 1 (korkein) - 50 (matalin). Oletusarvo on 25. Käytetään muutoin tasaveroisten julkaisujen sieppauspäätökseen. Kaikkia käytössä olevia tietolähteitä käytetään edelleen RSS-synkronointiin ja hakuun.",
|
||||
"ApplyTagsHelpTextAdd": "– \"Lisää\" syötetyt tunnisteet aiempiin tunnisteisiin",
|
||||
"ApplyTagsHelpTextHowToApplyApplications": "Tunnisteiden käyttäminen valituille sovelluksille",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Tunnisteiden käyttö valituissa tietolähteissä",
|
||||
"ApplyTagsHelpTextRemove": "- \"Poista\" tyhjentää syötetyt tunnisteet",
|
||||
"ApplyTagsHelpTextReplace": "- \"Korvaa\" nykyiset tunnisteet syötetyillä tai tyhjennä kaikki tunnisteet jättämällä tyhjäksi",
|
||||
"DownloadClientPriorityHelpText": "Määritä useiden lataustyökalujen painotus. Tasaveroiset lataajat erotetaan Round-Robin-tekniikalla.",
|
||||
"Album": "Albumi",
|
||||
"Artist": "Esittäjä",
|
||||
"Author": "Kirjailija",
|
||||
@@ -485,24 +485,124 @@
|
||||
"Episode": "Jakso",
|
||||
"Label": "Tunniste",
|
||||
"Theme": "Teema",
|
||||
"ConnectionLostReconnect": "{appName} pyrkii ajoittain muodostamaan yhteyden automaattisesti tai sitä voidaan yrittää manuaalisesti painamalla alta \"Lataa uudelleen\".",
|
||||
"DeleteAppProfileMessageText": "Haluatko varmasti poistaa laatuprofiilin '{0}'?",
|
||||
"RecentChanges": "Viimeaikaiset muutokset",
|
||||
"WhatsNew": "Mikä on uutta?",
|
||||
"ConnectionLostToBackend": "{appName} kadotti yhteyden taustajärjestelmään ja käytettävyyden palauttamiseksi se on ladattava uudelleen.",
|
||||
"minutes": "Minuuttia",
|
||||
"ConnectionLostReconnect": "{appName} pyrkii ajoittain muodostamaan yhteyden automaattisesti tai voit painaa alta \"Lataa uudelleen\".",
|
||||
"DeleteAppProfileMessageText": "Haluatko varmasti poistaa sovellusprofiilin \"{name}\"?",
|
||||
"RecentChanges": "Viimeisimmät muutokset",
|
||||
"WhatsNew": "Mitä uutta?",
|
||||
"ConnectionLostToBackend": "{appName} kadotti yhteyden taustajärjestelmään ja se on käynnistettävä uudelleen.",
|
||||
"minutes": "minuuttia",
|
||||
"AddConnection": "Lisää yhteys",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi: {0}",
|
||||
"AuthBasic": "Perus (selaimen ponnahdus)",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Kaikki ilmoitukset eivät ole ongelmien vuoksi käytettävissä",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Ilmoitukset eivät ole ongelmien vuoksi käytettävissä: {0}",
|
||||
"AuthBasic": "Perus (ponnahdusikkuna)",
|
||||
"AuthForm": "Lomake (kirjautumissivu)",
|
||||
"DisabledForLocalAddresses": "Ei käytetä paikallisille osoittelle",
|
||||
"DisabledForLocalAddresses": "Ei käytössä paikallisille osoitteille",
|
||||
"None": "Ei mitään",
|
||||
"ResetAPIKeyMessageText": "Haluatko varmasti uudistaa API-avaimesi?",
|
||||
"TotalIndexerSuccessfulGrabs": "Onnistuneiden tietolähdesieppausten kokonaismäärä",
|
||||
"TotalIndexerSuccessfulGrabs": "Onnistuneiden tietolähdekaappausten kokonaismäärä",
|
||||
"AppUpdated": "{appName} on päivitetty",
|
||||
"AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on ladattava uudelleen.",
|
||||
"IndexerDownloadClientHelpText": "Määritä tämän tietolähteen kanssa käytettävä lataustyökalu",
|
||||
"AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on käynnistettävä uudelleen.",
|
||||
"IndexerDownloadClientHelpText": "Määritä tämän tietolähteen kanssa käytettävä lataustyökalu.",
|
||||
"AuthenticationRequiredWarning": "Etäkäytön estämiseksi ilman tunnistautumista {appName} vaatii nyt todennuksen käyttöönoton. Todennus voidaan poistaa käytöstä paikallisille osoitteille.",
|
||||
"TotalGrabs": "Sieppausten kokonaismäärä"
|
||||
"TotalGrabs": "Kaappausten kokonaismäärä",
|
||||
"AddDownloadClientImplementation": "Lisäätään lataustyökalua - {implementationName}",
|
||||
"AddIndexerImplementation": "Lisätään tietolähdettä - {implementationName}",
|
||||
"OnGrabHelpText": "Kun julkaisu kaapataan",
|
||||
"ManageDownloadClients": "Hallitse lataustyökaluja",
|
||||
"NoDownloadClientsFound": "Lataustyökaluja ei löytynyt",
|
||||
"CountDownloadClientsSelected": "{count} lataustyökalu(a) on valittu",
|
||||
"EditSelectedDownloadClients": "Muokkaa valittuja lataustyökaluja",
|
||||
"IndexerDownloadClientHealthCheckMessage": "Tietolähteet virheellisillä lataustyökaluilla: {0}.",
|
||||
"AddIndexerProxyImplementation": "Lisää tiedonhaun välityspalvelin - {implementationName}",
|
||||
"EditIndexerProxyImplementation": "Muokkaa tiedonhaun välityspalvelinta - {implementationName}",
|
||||
"EditDownloadClientImplementation": "Muokataan lataustyökalua - {implementationName}",
|
||||
"AddCustomFilter": "Lisää oma suodatin",
|
||||
"ApplyChanges": "Toteuta muutokset",
|
||||
"EditSelectedIndexers": "Muokkaa valittuja sisältölähteitä",
|
||||
"NoHistoryFound": "Historiaa ei löytynyt",
|
||||
"NoIndexersFound": "Tietolähteitä ei löytynyt",
|
||||
"StopSelecting": "Lopeta valitseminen",
|
||||
"EditConnectionImplementation": "Muokataan kytköstä - {implementationName}",
|
||||
"AddConnectionImplementation": "Lisätään kytköstä - {implementationName}",
|
||||
"DownloadClientQbittorrentSettingsContentLayout": "Sisällön rakenne",
|
||||
"EditIndexerImplementation": "Muokataan tietolähdettä - {implementationName}",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Syötä uusi käyttäjätunnus",
|
||||
"DefaultNameCopiedProfile": "{name} - Kopioi",
|
||||
"AppsMinimumSeedersHelpText": "Sovellusten edellyttämä tietolähteestä kaapattavien kohteiden jakajien (seed) vähimmäismäärä. Jos tyhjä, käytetään synkronointiprofiilin oletusta.",
|
||||
"TotalHostGrabs": "Isännän kaappausten kokonaismäärä",
|
||||
"IncludeManualGrabsHelpText": "Sisällytä {appName}in käyttöliittymästä tehdyt manuaalikaappaukset.",
|
||||
"AuthenticationRequiredHelpText": "Valitse mitkä pyynnöt vaativat tunnistautumisen. Älä muuta, jos et ymmärrä riskejä.",
|
||||
"TotalUserAgentGrabs": "Käyttäjäagentin kaappausten kokonaismäärä",
|
||||
"AuthenticationMethodHelpTextWarning": "Valitse sopiva tunnistautumistapa",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Syötä uusi salasana",
|
||||
"AuthenticationMethod": "Tunnistautumistapa",
|
||||
"Clone": "Monista",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Vahvista uusi salasana",
|
||||
"EditApplicationImplementation": "Muokataan sovellusta - {implementationName}",
|
||||
"AddApplicationImplementation": "Lisätään sovellusta - {implementationName}",
|
||||
"InvalidUILanguage": "Käytöliittymän kielivalinta on virheellinen. Korjaa se ja tallenna asetukset.",
|
||||
"SeedRatio": "Jakosuhde",
|
||||
"SeedTime": "Jakoaika",
|
||||
"days": "päivää",
|
||||
"HistoryDetails": "Historiatiedot",
|
||||
"IndexerDisabled": "Tietolähde ei ole käytössä",
|
||||
"AdvancedSettingsShownClickToHide": "Lisäasetukset näytetään, piilota painamalla tästä",
|
||||
"AdvancedSettingsHiddenClickToShow": "Lisäasetukset on piilotettu, näytä painamalla tästä",
|
||||
"AppsMinimumSeeders": "Sovellusten vähimmäisjakajat",
|
||||
"BasicSearch": "Perushaku",
|
||||
"CountApplicationsSelected": "{count} sovellus(ta) on valittu",
|
||||
"DeleteSelectedApplications": "Poista valitut sovellukset",
|
||||
"DeleteSelectedIndexer": "Poista valittu tietolähde",
|
||||
"DeleteSelectedIndexers": "Poista valitut tietolähteet",
|
||||
"Implementation": "Toteutus",
|
||||
"IndexerCategories": "Tietolähdekategoriat",
|
||||
"IndexerStatus": "Tietolähteen tila",
|
||||
"ManageApplications": "Hallitse sovelluksia",
|
||||
"NewznabUrl": "Newznab URL",
|
||||
"PackSeedTime": "Koosteen jakoaika",
|
||||
"PackSeedTimeHelpText": "Aika, joka koostepaketin (kuten sarjan tuotantokauden tai esittäjän diskografian) sisältävää torrentia tulee jakaa. Käytä sovelluksen oletusta jättämällä tyhjäksi.",
|
||||
"QueryType": "Kyselyn tyyppi",
|
||||
"SearchAllIndexers": "Etsi kaikista tietolähteistä",
|
||||
"SeedRatioHelpText": "Jakosuhde, joka torrentin tulee saavuttaa ennen sen pysäytystä. Käytä sovelluksen oletusta jättämällä tyhjäksi.",
|
||||
"TorznabUrl": "Torznab URL",
|
||||
"ApiKeyValidationHealthCheckMessage": "Muuta API-avaimesi ainakin {0} merkin pituiseksi. Voit tehdä tämän asetuksista tai muokkaamalla asetustiedostoa.",
|
||||
"OnHealthRestored": "Terveystilan vakautuessa",
|
||||
"OnHealthRestoredHelpText": "Terveystilan vakautuessa",
|
||||
"TotalHostQueries": "Isännän kyselyiden kokonaismäärä",
|
||||
"TotalIndexerQueries": "Tietolähteen kyselyiden kokonaismäärä",
|
||||
"GoToApplication": "Siirry sovellukseen",
|
||||
"AreYouSureYouWantToDeleteIndexer": "Haluatko varmasti poistaa tietolähteen \"{name}\" sovelluksesta {appName}?",
|
||||
"AuthQueries": "Todennuskyselyt",
|
||||
"ApplicationTagsHelpText": "Sovellukseen synkronoidaan joko tunnisteettomat tietolähteet tai vastaavilla tunnisteilla merkityt tietolähteet.",
|
||||
"ApplicationTagsHelpTextWarning": "Tunnisteita tulee käyttää harkiten, koska niillä voi olla odottamattomia vaikutuksia. Tunnisteella merkittyyn sovellukseen synkronoidaan vain samalla tunnisteella merkityt tietolähteet.",
|
||||
"AverageResponseTimesMs": "Tietolähteiden keskimääräiset vasteajat (ms)",
|
||||
"CountIndexersAvailable": "{count} tietolähde(ttä) on käytettävissä",
|
||||
"FoundCountReleases": "Löytyi {itemCount} julkaisua",
|
||||
"IndexerTagsHelpTextWarning": "Tunnisteita tulee käyttää harkiten, koska niillä voi olla odottamattomia vaikutuksia. Tunnisteella merkitty tietolähde synkronoidaan vain samalla tunnisteella merkittyyn sovellukseen.",
|
||||
"LastFailure": "Edellinen virhe",
|
||||
"SelectedCountOfCountReleases": "Valittu {selectedCount}/{itemCount} julkaisua",
|
||||
"TotalQueries": "Kyselyiden kokonaismäärä",
|
||||
"RssFeed": "RSS-syöte",
|
||||
"VipExpiration": "VIP-erääntyy",
|
||||
"DisabledUntil": "Poistettu käytöstä kunnes",
|
||||
"AddApplication": "Lisää sovellus",
|
||||
"AddCategory": "Lisää kategoria",
|
||||
"EditCategory": "Muokkaa kategoriaa",
|
||||
"IndexerId": "Tietolähteen ID",
|
||||
"ActiveIndexers": "Aktiiviset tietolähteet",
|
||||
"NoIndexerCategories": "Tietolähteelle ei löytynyt kategorioita",
|
||||
"ActiveApps": "Aktiiviset sovellukset",
|
||||
"NoIndexerHistory": "Tietolähteelle ei löytynyt historiaa",
|
||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Määrittää käytetäänkö qBittorrentista määritettyä rakennetta, torrentin alkuperäistä rakennetta vai luodaanko uusi alikansio (qBittorrent 4.3.2+).",
|
||||
"External": "Ulkoinen",
|
||||
"IndexerFailureRate": "Tietolähteen virhetaajuus",
|
||||
"IndexerHistoryLoadError": "Virhe ladattaessa tietolähteen historiaa",
|
||||
"InitialFailure": "Alkuperäinen virhe",
|
||||
"PasswordConfirmation": "Salasanan vahvistus",
|
||||
"RepeatSearch": "Toista haku",
|
||||
"SearchCountIndexers": "Etsi {count} tietolähteestä",
|
||||
"SearchQueries": "Hakukyselyt",
|
||||
"SeedTimeHelpText": "Aika, joka torrentia tulee jakaa ennen sen pysäytystä. Käytä sovelluksen oletusta jättämällä tyhjäksi.",
|
||||
"RssQueries": "RSS-kyselyt",
|
||||
"TotalUserAgentQueries": "Käyttäjäagentin kyselyiden kokonaismäärä"
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
"Events": "Événements",
|
||||
"Edit": "Modifier",
|
||||
"DownloadClientStatusCheckAllClientMessage": "Aucun client de téléchargement n'est disponible en raison d'échecs",
|
||||
"DownloadClients": "Clients de téléchargement",
|
||||
"DownloadClients": "Clients de télécharg.",
|
||||
"Dates": "Dates",
|
||||
"Date": "Date",
|
||||
"Delete": "Supprimer",
|
||||
@@ -28,14 +28,14 @@
|
||||
"About": "À propos",
|
||||
"IndexerStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison d'échecs : {0}",
|
||||
"DownloadClientStatusCheckSingleClientMessage": "Clients de Téléchargement indisponibles en raison d'échecs : {0}",
|
||||
"SetTags": "Définir des balises",
|
||||
"SetTags": "Définir des étiquettes",
|
||||
"ReleaseStatus": "Statut de la version",
|
||||
"UpdateCheckUINotWritableMessage": "Impossible d'installer la mise à jour car le dossier d'interface utilisateur '{0}' n'est pas accessible en écriture par l'utilisateur '{1}'.",
|
||||
"UpdateCheckStartupTranslocationMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{0}' se trouve dans un dossier App Translocation.",
|
||||
"UpdateCheckStartupNotWritableMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{0}' n'est pas accessible en écriture par l'utilisateur '{1}'.",
|
||||
"UnselectAll": "Tout désélectionner",
|
||||
"UISettingsSummary": "Date, langue, et perceptions des couleurs",
|
||||
"TagsSettingsSummary": "Voir toutes les balises et comment elles sont utilisées. Les balises inutilisées peuvent être supprimées",
|
||||
"TagsSettingsSummary": "Voir toutes les étiquettes et comment elles sont utilisées. Les étiquettes inutilisées peuvent être supprimées",
|
||||
"Style": "Style",
|
||||
"Status": "État",
|
||||
"Sort": "Trier",
|
||||
@@ -107,7 +107,7 @@
|
||||
"Reload": "Recharger",
|
||||
"Peers": "Peers",
|
||||
"PageSize": "Pagination",
|
||||
"Ok": "Ok",
|
||||
"Ok": "OK",
|
||||
"OAuthPopupMessage": "Les pop-ups sont bloquées par votre navigateur",
|
||||
"Name": "Nom",
|
||||
"Message": "Message",
|
||||
@@ -158,7 +158,7 @@
|
||||
"Enable": "Activer",
|
||||
"DownloadClientSettings": "Télécharger les paramètres client",
|
||||
"Docker": "Docker",
|
||||
"DeleteTag": "Supprimer le tag",
|
||||
"DeleteTag": "Supprimer l'étiquette",
|
||||
"DeleteNotification": "Supprimer la notification",
|
||||
"DeleteDownloadClient": "Supprimer le client de téléchargement",
|
||||
"DeleteBackup": "Supprimer la sauvegarde",
|
||||
@@ -482,7 +482,7 @@
|
||||
"Author": "Auteur",
|
||||
"AverageResponseTimesMs": "Temps de réponse moyen des indexeurs (ms)",
|
||||
"IndexerFailureRate": "Taux d'échec de l'indexeur",
|
||||
"Label": "Label",
|
||||
"Label": "Libellé",
|
||||
"More": "Plus",
|
||||
"Publisher": "Éditeur",
|
||||
"Season": "Saison",
|
||||
@@ -595,11 +595,13 @@
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Saisir un nouveau nom d'utilisateur",
|
||||
"Clone": "Cloner",
|
||||
"PackSeedTime": "Temps de Seed",
|
||||
"ApplicationTagsHelpText": "Synchroniser les indexeurs avec cette application qui n'ont aucune balise ou qui ont une ou plusieurs balises correspondantes",
|
||||
"ApplicationTagsHelpText": "Synchroniser les indexeurs avec cette application qui n'ont aucune étiquette ou qui ont une ou plusieurs étiquettes correspondantes",
|
||||
"OnHealthRestored": "Sur la santé restaurée",
|
||||
"OnHealthRestoredHelpText": "Sur la santé restaurée",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmer le nouveau mot de passe",
|
||||
"PasswordConfirmation": "Confirmation du mot de passe",
|
||||
"NoIndexerCategories": "Aucune catégorie disponible pour cet indexeur",
|
||||
"InvalidUILanguage": "Votre interface utilisateur est définie sur une langue non valide, corrigez-la et enregistrez vos paramètres"
|
||||
"InvalidUILanguage": "Votre interface utilisateur est définie sur une langue non valide, corrigez-la et enregistrez vos paramètres",
|
||||
"DownloadClientQbittorrentSettingsContentLayout": "Disposition du contenu",
|
||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Utiliser la disposition du contenu configurée par qBittorrent, la disposition originale du torrent ou toujours créer un sous-dossier (qBittorrent 4.3.2+)"
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"About": "Névjegy",
|
||||
"Analytics": "Analitika",
|
||||
"AddIndexer": "Indexer hozzáadása",
|
||||
"AddIndexer": "Indexelő hozzáadása",
|
||||
"AddingTag": "Címke hozzáadása",
|
||||
"Error": "Hiba",
|
||||
"DeleteTag": "Címke Törlése",
|
||||
@@ -9,7 +9,7 @@
|
||||
"EnableAutomaticSearch": "Engedélyezd az Automatikus Keresést",
|
||||
"Enable": "Aktiválás",
|
||||
"EditIndexer": "Indexer Szerkesztése",
|
||||
"Edit": "Szerkesztés",
|
||||
"Edit": "szerkeszt",
|
||||
"DownloadClientStatusCheckSingleClientMessage": "Letöltőkliens hiba miatt nem elérhető: {0}",
|
||||
"DownloadClientStatusCheckAllClientMessage": "Az összes letöltőkliens elérhetetlen, hiba miatt",
|
||||
"DownloadClientsSettingsSummary": "Letöltőkliens konfigurációja a {appName} felhasználói felület keresésbe történő integráláshoz",
|
||||
@@ -17,15 +17,15 @@
|
||||
"DownloadClients": "Letöltőkliensek",
|
||||
"DownloadClient": "Letöltési Kliens",
|
||||
"Docker": "Docker",
|
||||
"Disabled": "Letiltott",
|
||||
"Details": "Részletek",
|
||||
"Disabled": "Tiltva",
|
||||
"Details": "részletek",
|
||||
"DeleteTagMessageText": "Biztosan törlöd a(z) „{0}” címkét?",
|
||||
"DeleteNotificationMessageText": "Biztosan törlöd a(z) „{0}” értesítést?",
|
||||
"DeleteNotification": "Értesítés Törlése",
|
||||
"DeleteDownloadClientMessageText": "Biztosan törlöd a(z) „{0}” letöltő klienst?",
|
||||
"DeleteDownloadClient": "Letöltőkliens Törlése",
|
||||
"DeleteBackupMessageText": "Biztosan törlöd a(z) „{0}” biztonsági mentést?",
|
||||
"DeleteBackup": "Biztonsági Mentés Törlése",
|
||||
"DeleteDownloadClient": "Letöltőkliens törlése",
|
||||
"DeleteBackupMessageText": "Biztosan törli a '{name}' biztonsági mentést?",
|
||||
"DeleteBackup": "Biztonsági Mentés törlése",
|
||||
"Delete": "Törlés",
|
||||
"DBMigration": "DB Migráció",
|
||||
"Dates": "Dátumok",
|
||||
@@ -46,7 +46,7 @@
|
||||
"ChangeHasNotBeenSavedYet": "A változások még nem lettek elmentve",
|
||||
"CertificateValidationHelpText": "Módosítsa a HTTPS tanúsítás szigorúságát",
|
||||
"CertificateValidation": "Tanúsítvány érvényesítése",
|
||||
"CancelPendingTask": "Biztosan törlöd ezt a függőben lévő feladatot?",
|
||||
"CancelPendingTask": "Biztosan törölni szeretné ezt a függőben lévő feladatot?",
|
||||
"Cancel": "Mégse",
|
||||
"BypassProxyForLocalAddresses": "Proxy megkerülése a helyi hálózatos címekhez",
|
||||
"BranchUpdateMechanism": "A külső frissítési mechanizmus által használt ágazat",
|
||||
@@ -54,13 +54,13 @@
|
||||
"Branch": "Ágazat",
|
||||
"BindAddressHelpText": "Érvényes IP-cím, localhost vagy '*' minden interfészhez",
|
||||
"BindAddress": "Kapcsolási Cím",
|
||||
"BeforeUpdate": "Alkalmazásfrissítés előtt",
|
||||
"BeforeUpdate": "Frissítés előtt",
|
||||
"Backups": "Biztonsági mentések",
|
||||
"BackupRetentionHelpText": "A megőrzési időnél régebbi automatikus biztonsági másolatok automatikusan törlésre kerülnek",
|
||||
"BackupNow": "Biztonsági Mentés Most",
|
||||
"BackupIntervalHelpText": "Időeltérés a biztonsági mentések között",
|
||||
"BackupRetentionHelpText": "A megőrzési időszaknál régebbi automatikus biztonsági másolatok automatikusan törlődnek",
|
||||
"BackupNow": "Biztonsági Mentés",
|
||||
"BackupIntervalHelpText": "Az automatikus biztonsági mentések közötti időköz",
|
||||
"BackupFolderHelpText": "Az elérési útvonalak a {appName} AppData könyvtárában lesznek",
|
||||
"Backup": "Biztonsági Mentés",
|
||||
"Backup": "biztonsági mentés",
|
||||
"AutomaticSearch": "Automatikus keresés",
|
||||
"Automatic": "Automatikus",
|
||||
"AnalyticsEnabledHelpText": "Küldjön névtelen használati és hibainformációkat a {appName} szervereire. Ez magában foglalja a böngészőjéről szóló információkat, mely {appName} WebUI oldalakat használja, a hibajelentést, valamint az operációs rendszer adatait. Ezeket az információkat a funkciók és a hibajavítások rangsorolására használjuk fel.",
|
||||
@@ -71,12 +71,12 @@
|
||||
"ApiKey": "API Kulcs",
|
||||
"All": "Összes",
|
||||
"AcceptConfirmationModal": "Változás Megerősítése",
|
||||
"Apply": "Alkalmazás",
|
||||
"Apply": "Alkamaz",
|
||||
"AppDataLocationHealthCheckMessage": "A frissítés nem lehetséges anélkül hogy az AppData ne törlődjön",
|
||||
"AppDataDirectory": "AppData Mappa",
|
||||
"AppDataDirectory": "AppData Könyvtár",
|
||||
"Added": "Hozzáadva",
|
||||
"Actions": "Teendők",
|
||||
"History": "Történet",
|
||||
"History": "Előzmény",
|
||||
"HideAdvanced": "Haladó Elrejtése",
|
||||
"HealthNoIssues": "Nincs hiba a konfigurációval",
|
||||
"Health": "Állapot",
|
||||
@@ -84,11 +84,11 @@
|
||||
"ForMoreInformationOnTheIndividualDownloadClients": "Ha többet szeretnél megtudni a különböző letöltési kliensekről, kattints az információs gombokra.",
|
||||
"Folder": "Mappa",
|
||||
"FocusSearchBox": "Fókusz Keresőmező",
|
||||
"Fixed": "Kijavítva",
|
||||
"Fixed": "Rögzített",
|
||||
"FilterPlaceHolder": "Filmek Keresése",
|
||||
"Filter": "Szűrő",
|
||||
"Files": "Fájl",
|
||||
"Filename": "Fájlnév",
|
||||
"Filename": "Fájl név",
|
||||
"Failed": "Sikertelen",
|
||||
"ExistingTag": "Meglévő Címke",
|
||||
"Exception": "Kivétel",
|
||||
@@ -136,7 +136,7 @@
|
||||
"Save": "Mentés",
|
||||
"RSSIsNotSupportedWithThisIndexer": "Az RSS nem támogatott ezzel az indexerrel",
|
||||
"Retention": "Visszatartás",
|
||||
"Result": "Eredmények",
|
||||
"Result": "Eredmény",
|
||||
"RestoreBackup": "Biztonsági mentés visszaállítása",
|
||||
"Restore": "Visszaállítás",
|
||||
"RestartRequiredHelpTextWarning": "Újraindítás szükséges a hatálybalépéshez",
|
||||
@@ -177,7 +177,7 @@
|
||||
"PageSizeHelpText": "Az egyes oldalakon megjelenítendő elemek száma",
|
||||
"PageSize": "Oldal mérete",
|
||||
"PackageVersion": "Csomagverzió",
|
||||
"Options": "Opciók",
|
||||
"Options": "Lehetőségek",
|
||||
"OpenThisModal": "Nyissa meg ezt a modált",
|
||||
"OpenBrowserOnStart": "Indításkor nyissa meg a böngészőt",
|
||||
"OnHealthIssueHelpText": "Állapotprobléma",
|
||||
@@ -200,9 +200,9 @@
|
||||
"MIA": "MIA",
|
||||
"Message": "Üzenet",
|
||||
"Mechanism": "Mechanizmus",
|
||||
"Manual": "Manuális",
|
||||
"Manual": "Kézi",
|
||||
"MaintenanceRelease": "Karbantartási frissítés: hibajavítások és egyéb fejlesztések. További részletekért lásd: Github Commit History",
|
||||
"Logs": "Logok",
|
||||
"Logs": "Naplók",
|
||||
"LogLevelTraceHelpTextWarning": "A nyomkövetést csak ideiglenesen szabad engedélyezni",
|
||||
"LogLevel": "Log Szint",
|
||||
"Logging": "Loggolás",
|
||||
@@ -239,13 +239,13 @@
|
||||
"Title": "Cím",
|
||||
"Time": "Idő",
|
||||
"TestAllClients": "Összes kliens tesztelése",
|
||||
"TestAll": "Összes tesztelése",
|
||||
"TestAll": "Összes Tesztelése",
|
||||
"Test": "Teszt",
|
||||
"Tasks": "Feladatok",
|
||||
"TagsSettingsSummary": "Tekintse meg az összes címkét és azok használatát. A használatlan címkék eltávolíthatók",
|
||||
"TagsHelpText": "Legalább egy megfelelő címkével rendelkező filmekre vonatkozik",
|
||||
"Tags": "Címkék",
|
||||
"TagIsNotUsedAndCanBeDeleted": "A címkét nincs használatban, és törölhető",
|
||||
"TagIsNotUsedAndCanBeDeleted": "A címke nincs használatban, törölhető",
|
||||
"TagCannotBeDeletedWhileInUse": "Használat közben nem törölhető",
|
||||
"TableOptionsColumnsMessage": "Válasszd ki, mely oszlopok legyenek láthatóak, és milyen sorrendben jelenjenek meg",
|
||||
"SystemTimeCheckMessage": "A rendszeridő több mint 1 napja nem frissült. Előfordulhat, hogy az ütemezett feladatok az idő kijavításáig nem futnak megfelelően",
|
||||
@@ -257,7 +257,7 @@
|
||||
"Indexer": "Indexelő",
|
||||
"IncludeHealthWarningsHelpText": "Tartalmazza a Állapot Figyelmeztetéseket",
|
||||
"IllRestartLater": "Később Újraindítom",
|
||||
"IgnoredAddresses": "Ignorált Címek",
|
||||
"IgnoredAddresses": "Ignorált címek",
|
||||
"YesCancel": "Igen, Mégsem",
|
||||
"Warn": "Figyelmeztet",
|
||||
"View": "Nézet",
|
||||
@@ -280,7 +280,7 @@
|
||||
"UnableToLoadUISettings": "Nem sikerült betölteni a felhasználói felület beállításait",
|
||||
"UnableToLoadTags": "Nem sikerült betölteni a címkéket",
|
||||
"UnableToLoadNotifications": "Nem sikerült betölteni az Értesítéseket",
|
||||
"TableOptions": "Táblázat beállításai",
|
||||
"TableOptions": "Táblázat Beállítások",
|
||||
"ShowSearch": "Keresés(ek) megjelenítése",
|
||||
"SetTags": "Címkék beállítása",
|
||||
"NotificationTriggers": "Értesítés(ek) kiváltója",
|
||||
@@ -332,7 +332,7 @@
|
||||
"AppProfileSelectHelpText": "Az alkalmazásprofilok az RSS vezérlésére szolgálnak, Automatikus keresés és Interaktív keresés beállításai az alkalmazás szinkronizálásakor",
|
||||
"UnableToAddANewApplicationPleaseTryAgain": "Nem lehet új alkalmazást hozzáadni, próbálkozzon újra.",
|
||||
"UnableToAddANewAppProfilePleaseTryAgain": "Nem lehet új alkalmazásprofilt hozzáadni, próbálkozzon újra.",
|
||||
"AddDownloadClient": "Letöltőkliens hozzáadása",
|
||||
"AddDownloadClient": "Letöltési kliens hozzáadása",
|
||||
"Applications": "Alkalmazások",
|
||||
"AppProfileInUse": "Használatban lévő alkalmazásprofil",
|
||||
"Apps": "Appok",
|
||||
@@ -466,9 +466,9 @@
|
||||
"ApplyChanges": "Változások alkalmazása",
|
||||
"ApplyTagsHelpTextReplace": "Csere: Cserélje ki a címkéket a beírt címkékre (az összes címke törléséhez ne adjon meg címkéket)",
|
||||
"EditSelectedIndexers": "Kiválasztott indexelők szerkesztése",
|
||||
"ApplyTagsHelpTextAdd": "Hozzáadás: Új címkék hozzáadása a meglévő címkékhez",
|
||||
"ApplyTagsHelpTextAdd": "Hozzáadás: Adja hozzá a címkéket a meglévő címkék listájához",
|
||||
"ApplyTagsHelpTextHowToApplyApplications": "Hogyan adjunk hozzá címkéket a kiválasztott filmhez",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Hogyan adjunk hozzá címkéket a kiválasztott filmhez",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Címkék alkalmazása a kiválasztott indexelőkre",
|
||||
"ApplyTagsHelpTextRemove": "Eltávolítás: Távolítsa el a beírt címkéket",
|
||||
"CountIndexersSelected": "{0} Indexelő(k) kiválasztva",
|
||||
"DeleteSelectedDownloadClients": "Letöltőkliens Törlése",
|
||||
@@ -494,14 +494,35 @@
|
||||
"WhatsNew": "Mi az újdonság?",
|
||||
"ConnectionLostToBackend": "A Radarr elvesztette kapcsolatát a háttérrendszerrel, a funkciók helyreállításához frissíts.",
|
||||
"minutes": "percek",
|
||||
"AddConnection": "Gyűjtemény módosítása",
|
||||
"AddConnection": "Csatlakozás hozzáadása",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Összes alkalmazás elérhetetlen hiba miatt",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Az alkalmazás nem áll rendelkezésre az alábbi hibák miatt: {0}",
|
||||
"AuthBasic": "Alap (Böngésző felugró ablak)",
|
||||
"AuthForm": "Felhasználó (Bejelentkezési oldal)",
|
||||
"AuthBasic": "Alap (böngésző előugró ablak)",
|
||||
"AuthForm": "Űrlapok (bejelentkezési oldal)",
|
||||
"DisabledForLocalAddresses": "Letiltva a helyi címeknél",
|
||||
"None": "Nincs",
|
||||
"ResetAPIKeyMessageText": "Biztos hogy vissza szeretnéd állítani az API-Kulcsod?",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Adjon meg új jelszót",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Adjon meg új felhasználónevet"
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Adjon meg új felhasználónevet",
|
||||
"AppUpdated": "{appName} frissítve",
|
||||
"AddApplication": "Alkalmazás hozzáadása",
|
||||
"AddCustomFilter": "Egyéni szűrő hozzáadása",
|
||||
"Clone": "Klón",
|
||||
"Implementation": "Végrehajtás",
|
||||
"AddConnectionImplementation": "Csatlakozás hozzáadása - {implementationName}",
|
||||
"AddDownloadClientImplementation": "Letöltési kliens hozzáadása – {implementationName}",
|
||||
"AddIndexerImplementation": "Indexelő hozzáadása - {implementationName}",
|
||||
"ActiveApps": "Aktív alkalmazások",
|
||||
"ActiveIndexers": "Indexerek",
|
||||
"AuthenticationMethod": "Hitelesítési Módszer",
|
||||
"AuthenticationMethodHelpTextWarning": "Kérjük, válasszon érvényes hitelesítési módot",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Erősítsd meg az új jelszót",
|
||||
"DefaultNameCopiedProfile": "{name} - Másolat",
|
||||
"EditConnectionImplementation": "Csatlakozás hozzáadása - {megvalósítás neve}",
|
||||
"EditIndexerProxyImplementation": "Indexelő hozzáadása - {megvalósítás neve}",
|
||||
"AddApplicationImplementation": "Csatlakozás hozzáadása - {implementationName}",
|
||||
"AddIndexerProxyImplementation": "Indexelő hozzáadása - {implementationName}",
|
||||
"EditIndexerImplementation": "Indexelő hozzáadása - {megvalósítás neve}",
|
||||
"EditApplicationImplementation": "Csatlakozás hozzáadása - {megvalósítás neve}",
|
||||
"EditDownloadClientImplementation": "Letöltési kliens hozzáadása – {megvalósítási név}"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
"Grabbed": "Preso",
|
||||
"Clear": "Cancella",
|
||||
"AppDataLocationHealthCheckMessage": "L'aggiornamento non sarà possibile per evitare la cancellazione di AppData durante l'aggiornamento",
|
||||
"Analytics": "Analitica",
|
||||
"Analytics": "Statistiche",
|
||||
"Added": "Aggiunto",
|
||||
"About": "Info",
|
||||
"Updates": "Aggiornamenti",
|
||||
@@ -76,7 +76,7 @@
|
||||
"Date": "Data",
|
||||
"CustomFilters": "Filtri Personalizzati",
|
||||
"Connect": "Notifiche",
|
||||
"Connections": "Collegamenti",
|
||||
"Connections": "Connessioni",
|
||||
"ConnectSettingsSummary": "Notifiche e script personalizzati",
|
||||
"BackupNow": "Esegui backup ora",
|
||||
"Backup": "Backup",
|
||||
@@ -84,28 +84,28 @@
|
||||
"Actions": "Azioni",
|
||||
"Age": "Età",
|
||||
"Close": "Chiudi",
|
||||
"CloneProfile": "Clona il Profilo",
|
||||
"ClientPriority": "Priorità del Client",
|
||||
"CloneProfile": "Copia Profilo",
|
||||
"ClientPriority": "Priorità Client",
|
||||
"ChangeHasNotBeenSavedYet": "Il cambio non è stato ancora salvato",
|
||||
"CertificateValidationHelpText": "Cambia quanto è rigorosa la convalida del certificato HTTPS",
|
||||
"CertificateValidation": "Convalida del Certificato",
|
||||
"Cancel": "Annulla",
|
||||
"BypassProxyForLocalAddresses": "Evita il Proxy per gli Indirizzi Locali",
|
||||
"Branch": "Ramo",
|
||||
"BindAddressHelpText": "Indirizzo IP valido, localhost o '*' per tutte le interfacce di rete",
|
||||
"BindAddress": "Indirizzo di Bind",
|
||||
"BindAddressHelpText": "Indirizzi IP validi, localhost o '*' per tutte le interfacce",
|
||||
"BindAddress": "Indirizzo di Ascolto",
|
||||
"Backups": "Backups",
|
||||
"BackupRetentionHelpText": "I backup automatici più vecchi del periodo di conservazione verranno eliminati automaticamente",
|
||||
"BackupIntervalHelpText": "Intervallo tra i backup automatici",
|
||||
"BackupRetentionHelpText": "I backup più vecchi del periodo specificato saranno cancellati automaticamente",
|
||||
"BackupIntervalHelpText": "Intervallo fra i backup automatici",
|
||||
"BackupFolderHelpText": "I percorsi relativi saranno nella cartella AppData di {appName}",
|
||||
"Automatic": "Automatico",
|
||||
"AuthenticationMethodHelpText": "Richiedi Nome Utente e Password per accedere a {appName}",
|
||||
"AuthenticationMethodHelpText": "Inserisci Username e Password per accedere a {appName}",
|
||||
"Authentication": "Autenticazione",
|
||||
"ApplyTags": "Applica Etichette",
|
||||
"Apply": "Applica",
|
||||
"AppDataDirectory": "Cartella AppData",
|
||||
"ApiKey": "Chiave API",
|
||||
"AnalyticsEnabledHelpText": "Invia informazioni anonime sull'uso e sugli errori ai server di {appName}. Questo include informazioni sul tuo browser, quali pagine della WebUI di {appName} utilizzi, la segnalazione di errori così come il sistema operativo e la versione di runtime. Useremo queste informazioni per dare priorità alle funzionalità e alle correzioni dei bug.",
|
||||
"AnalyticsEnabledHelpText": "Inviare informazioni anonime sull'utilizzo e sugli errori ai server di {appName}. Ciò include informazioni sul tuo browser, quali pagine dell'interfaccia di {appName} usi, la segnalazione di errori così come la versione del sistema operativo e del runtime. Utilizzeremo queste informazioni per dare priorità alle nuove funzioni e alle correzioni di bug.",
|
||||
"Warn": "Attenzione",
|
||||
"Type": "Tipo",
|
||||
"Title": "Titolo",
|
||||
@@ -136,11 +136,11 @@
|
||||
"DownloadClientSettings": "Impostazioni del Client di Download",
|
||||
"Docker": "Docker",
|
||||
"DeleteTag": "Elimina Etichetta",
|
||||
"DeleteNotification": "Cancella la Notifica",
|
||||
"DeleteDownloadClient": "Cancella il Client di Download",
|
||||
"DeleteNotification": "Cancella Notifica",
|
||||
"DeleteDownloadClient": "Cancella Client di Download",
|
||||
"DeleteBackup": "Cancella Backup",
|
||||
"DBMigration": "Migrazione DB",
|
||||
"ConnectSettings": "Impostazioni di Connessione",
|
||||
"ConnectSettings": "Impostazioni Collegamento",
|
||||
"ConnectionLost": "Connessione Persa",
|
||||
"Component": "Componente",
|
||||
"Columns": "Colonne",
|
||||
@@ -222,7 +222,7 @@
|
||||
"DeleteTagMessageText": "Sei sicuro di voler eliminare l'etichetta '{0}'?",
|
||||
"DeleteNotificationMessageText": "Sei sicuro di voler eliminare la notifica '{0}'?",
|
||||
"DeleteDownloadClientMessageText": "Sei sicuro di voler eliminare il client di download '{0}'?",
|
||||
"BeforeUpdate": "Prima di aggiornare",
|
||||
"BeforeUpdate": "Prima dell'aggiornamento",
|
||||
"Usenet": "Usenet",
|
||||
"Uptime": "Tempo di attività",
|
||||
"YesCancel": "Si, Cancella",
|
||||
@@ -232,7 +232,7 @@
|
||||
"UrlBaseHelpText": "Per il supporto al reverse proxy, di default è vuoto",
|
||||
"URLBase": "Base Url",
|
||||
"UpdateScriptPathHelpText": "Percorso verso uno script personalizzato che prende un pacchetto di aggiornamento estratto e gestisce il resto del processo di aggiornamento",
|
||||
"UpdateMechanismHelpText": "Usa l'aggiornamento integrato in {appName} o uno script",
|
||||
"UpdateMechanismHelpText": "Usa il sistema di aggiornamento interno di {appName} o uno script",
|
||||
"UpdateAutomaticallyHelpText": "Scarica e installa automaticamente gli aggiornamenti. Sarai comunque in grado in installarli da Sistema: Aggiornamenti",
|
||||
"UnsavedChanges": "Modifiche non salvate",
|
||||
"UnableToLoadUISettings": "Impossibile caricare le impostazioni interfaccia",
|
||||
@@ -293,7 +293,7 @@
|
||||
"EnableIndexer": "Abilita Indicizzatore",
|
||||
"AddNewIndexer": "Aggiungi nuovo Indicizzatore",
|
||||
"IndexerAuth": "Autenticazione dell'Indicizzatore",
|
||||
"AddDownloadClient": "Aggiungi Downloader",
|
||||
"AddDownloadClient": "Aggiungi Client di Download",
|
||||
"Category": "Categoria",
|
||||
"ClearHistory": "Cancella cronologia",
|
||||
"ClearHistoryMessageText": "Sei sicuro di voler cancellare tutta la cronologia di {appName}?",
|
||||
@@ -451,8 +451,8 @@
|
||||
"Started": "Iniziato",
|
||||
"AreYouSureYouWantToDeleteCategory": "Vuoi davvero cancellare la categoria mappata?",
|
||||
"AuthenticationRequired": "Autenticazione richiesta",
|
||||
"AuthenticationRequiredHelpText": "Cambia a quali richieste l'autenticazione verrà richiesta. Non cambiare se non comprendi i rischi.",
|
||||
"AuthenticationRequiredWarning": "Per impedire accessi remoti senza autenticazione, {appName} ora richiede che l'autenticazione venga attivata. Puoi disattivare l'autenticazione per indirizzi privati.",
|
||||
"AuthenticationRequiredHelpText": "Cambia a quali richieste l'autenticazione verrà chiesta. Non cambiare se non comprendi i rischi.",
|
||||
"AuthenticationRequiredWarning": "Per prevenire accessi remoti non autorizzati, {appName} da ora richiede che l'autenticazione sia abilitata. Opzionalmente puoi disabilitare l'autenticazione per gli indirizzi di rete locali.",
|
||||
"DeleteClientCategory": "Cancella categoria del client di download",
|
||||
"DownloadClientCategory": "Categoria client di download",
|
||||
"MappedCategories": "Categorie mappate",
|
||||
@@ -498,9 +498,22 @@
|
||||
"AddConnection": "Aggiungi Connessione",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Tutte le applicazioni non sono disponibili a causa di errori",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Applicazioni non disponibili a causa di errori: {0}",
|
||||
"AuthForm": "Moduli (Pagina di Accesso)",
|
||||
"AuthForm": "Form (Pagina di Login)",
|
||||
"DisabledForLocalAddresses": "Disabilitato per Indirizzi Locali",
|
||||
"None": "Nessuna",
|
||||
"ResetAPIKeyMessageText": "Sei sicuro di voler reimpostare la tua chiave API?",
|
||||
"AuthBasic": "Base (Popup del Browser)"
|
||||
"AuthBasic": "Base (Popup del Browser)",
|
||||
"EditSelectedDownloadClients": "Modifica i Client di Download Selezionati",
|
||||
"AppUpdated": "{appName} Aggiornato",
|
||||
"AddCustomFilter": "Aggiungi Filtro Personalizzato",
|
||||
"AddConnectionImplementation": "Aggiungi Connessione - {implementationName}",
|
||||
"AddDownloadClientImplementation": "Aggiungi un Client di Download - {implementationName}",
|
||||
"AddIndexerImplementation": "Aggiungi indicizzatore - {implementationName}",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Inserisci username",
|
||||
"AuthenticationMethod": "Metodo di Autenticazione",
|
||||
"AuthenticationMethodHelpTextWarning": "Selezione un metodo di autenticazione valido",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Inserisci la nuova password",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Conferma la nuova password",
|
||||
"Clone": "Copia",
|
||||
"DefaultNameCopiedProfile": "{name} - Copia"
|
||||
}
|
||||
|
||||
@@ -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}"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Add": "Legge til",
|
||||
"Add": "Legg til",
|
||||
"AddDownloadClient": "Legg til nedlastingsklient",
|
||||
"Added": "La til",
|
||||
"AddingTag": "Legger til tag",
|
||||
|
||||
@@ -452,8 +452,8 @@
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Applicaties onbeschikbaar door fouten",
|
||||
"AddConnection": "Voeg connectie toe",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Alle applicaties onbeschikbaar door fouten",
|
||||
"AuthBasic": "Basis (Browser Pop-up)",
|
||||
"AuthForm": "Formulier (Login Pagina)",
|
||||
"AuthBasic": "Basic (Browser Pop-up)",
|
||||
"AuthForm": "Formulier (inlogpagina)",
|
||||
"DisabledForLocalAddresses": "Uitgeschakeld voor lokale adressen",
|
||||
"None": "Geen",
|
||||
"ResetAPIKeyMessageText": "Bent u zeker dat u uw API-sleutel wilt resetten?",
|
||||
@@ -476,5 +476,11 @@
|
||||
"EditIndexerProxyImplementation": "Indexeerder toevoegen - {implementationName}",
|
||||
"AuthenticationMethod": "Authenticatiemethode",
|
||||
"AuthenticationRequired": "Verificatie vereist",
|
||||
"AuthenticationMethodHelpTextWarning": "Selecteer een geldige verificatie methode"
|
||||
"AuthenticationMethodHelpTextWarning": "Selecteer een geldige verificatie methode",
|
||||
"AuthenticationRequiredHelpText": "Pas aan welke requests verificatie nodig hebben. Pas niets aan als je de risico's niet begrijpt.",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Voer een nieuw wachtwoord in",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Bevestig het nieuwe wachtwoord",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Voeg een nieuwe gebruikersnaam in",
|
||||
"AuthenticationRequiredWarning": "Om toegang zonder authenticatie te voorkomen vereist {appName} nu verificatie. Je kan dit optioneel uitschakelen voor lokale adressen.",
|
||||
"Episode": "aflevering"
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"Analytics": "Analityka",
|
||||
"All": "Wszystkie",
|
||||
"Added": "Dodane",
|
||||
"Actions": "Aktywności",
|
||||
"Actions": "Akcje",
|
||||
"About": "O",
|
||||
"Logging": "Logowanie",
|
||||
"EnableSslHelpText": " Wymaga ponownego uruchomienia jako administrator, aby odniosło skutek",
|
||||
@@ -22,7 +22,7 @@
|
||||
"Automatic": "Automatyczny",
|
||||
"ApplyTags": "Zastosuj tagi",
|
||||
"BackupIntervalHelpText": "Odstęp czasu między automatycznymi kopiami zapasowymi",
|
||||
"Close": "Blisko",
|
||||
"Close": "Zamknij",
|
||||
"CloseCurrentModal": "Zamknij bieżący tryb",
|
||||
"Delete": "Usunąć",
|
||||
"Discord": "Niezgoda",
|
||||
@@ -54,7 +54,7 @@
|
||||
"ApiKey": "Klucz API",
|
||||
"UI": "UI",
|
||||
"AcceptConfirmationModal": "Zaakceptuj tryb potwierdzenia",
|
||||
"AddIndexer": "Dodaj indeksator",
|
||||
"AddIndexer": "Dodaj indekser",
|
||||
"AddingTag": "Dodawanie tagu",
|
||||
"Age": "Wiek",
|
||||
"CertificateValidationHelpText": "Zmień ścisłą walidację certyfikatu HTTPS",
|
||||
@@ -375,5 +375,7 @@
|
||||
"None": "Żaden",
|
||||
"AuthBasic": "Podstawowe (wyskakujące okienko przeglądarki)",
|
||||
"ResetAPIKeyMessageText": "Czy na pewno chcesz zresetować swój klucz API?",
|
||||
"RestartProwlarr": "Zrestartuj {appName}"
|
||||
"RestartProwlarr": "Zrestartuj {appName}",
|
||||
"AddConnectionImplementation": "Dodaj Connection - {implementationName}",
|
||||
"AddDownloadClientImplementation": "Dodaj klienta pobierania - {implementationName}"
|
||||
}
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
"Clear": "Limpar",
|
||||
"Cancel": "Cancelar",
|
||||
"BackupNow": "Criar cópia de segurança",
|
||||
"Backup": "Cópia de segurança",
|
||||
"Backup": "Backup",
|
||||
"Apply": "Aplicar",
|
||||
"Analytics": "Análises",
|
||||
"All": "Todos",
|
||||
@@ -181,7 +181,7 @@
|
||||
"BindAddressHelpText": "Endereço de IP válido, localhost ou \"*\" para todas as interfaces",
|
||||
"BindAddress": "Endereço de vínculo",
|
||||
"Backups": "Cópias de segurança",
|
||||
"BackupFolderHelpText": "Caminhos relativos estarão na pasta AppData do {appName}",
|
||||
"BackupFolderHelpText": "Caminhos relativos estarão no diretório AppData do {appName}",
|
||||
"BackupIntervalHelpText": "Intervalo entre cópias de segurança automáticas",
|
||||
"BackupRetentionHelpText": "Cópias de segurança automáticas anteriores ao período de retenção serão eliminadas automaticamente",
|
||||
"ClientPriority": "Prioridade do cliente",
|
||||
@@ -472,5 +472,8 @@
|
||||
"EditSelectedDownloadClients": "Editar Clientes de Transferência Selecionados",
|
||||
"Album": "álbum",
|
||||
"Artist": "artista",
|
||||
"DefaultNameCopiedProfile": "{name} - Copiar"
|
||||
"DefaultNameCopiedProfile": "{name} - Copiar",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmar nova senha",
|
||||
"AdvancedSettingsHiddenClickToShow": "Definições avançadas ocultas, clique para mostrar",
|
||||
"AddCategory": "Adicionar Categoria"
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
"DeleteIndexerProxyMessageText": "Tem certeza de que deseja excluir o proxy do indexador '{name}'?",
|
||||
"DeleteNotification": "Excluir notificação",
|
||||
"DeleteNotificationMessageText": "Tem certeza de que deseja excluir a notificação '{name}'?",
|
||||
"DeleteTag": "Excluir tag",
|
||||
"DeleteTag": "Excluir Etiqueta",
|
||||
"DeleteTagMessageText": "Tem certeza de que deseja excluir a tag '{label}'?",
|
||||
"Description": "Descrição",
|
||||
"Details": "Detalhes",
|
||||
@@ -139,7 +139,7 @@
|
||||
"EnableInteractiveSearch": "Ativar pesquisa interativa",
|
||||
"EnableInteractiveSearchHelpText": "Será usado com a pesquisa interativa",
|
||||
"EnableRss": "Habilitar RSS",
|
||||
"EnableRssHelpText": "Habilitar feed RSS para o indexador",
|
||||
"EnableRssHelpText": "Habilitar feed RSS para indexador",
|
||||
"EnableSSL": "Habilitar SSL",
|
||||
"EnableSslHelpText": " Requer a reinicialização com a execução como administrador para fazer efeito",
|
||||
"Enabled": "Habilitado",
|
||||
@@ -601,5 +601,8 @@
|
||||
"NoIndexerCategories": "Nenhuma categoria encontrada para este indexador",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirme a nova senha",
|
||||
"PasswordConfirmation": "Confirmação Da Senha",
|
||||
"InvalidUILanguage": "Sua UI está definida com um idioma inválido, corrija-a e salve suas configurações"
|
||||
"InvalidUILanguage": "Sua UI está definida com um idioma inválido, corrija-a e salve suas configurações",
|
||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Seja para usar o layout de conteúdo configurado do qBittorrent, o layout original do torrent ou sempre criar uma subpasta (qBittorrent 4.3.2+)",
|
||||
"DownloadClientQbittorrentSettingsContentLayout": "Layout de Conteúdo",
|
||||
"IndexerId": "ID do Indexador"
|
||||
}
|
||||
|
||||
@@ -419,5 +419,6 @@
|
||||
"AuthenticationMethod": "Способ авторизации",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Введите новый пароль",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Введите новое имя пользователя",
|
||||
"RestartProwlarr": "Перезапустить {appName}"
|
||||
"RestartProwlarr": "Перезапустить {appName}",
|
||||
"AuthenticationRequiredWarning": "Чтобы предотвратить удаленный доступ без авторизации, {appName} теперь требует, чтобы авторизация была включена. При желании вы можете отключить авторизацию с локальных адресов."
|
||||
}
|
||||
|
||||
@@ -13,10 +13,10 @@
|
||||
"Filter": "Filter",
|
||||
"Files": "Filer",
|
||||
"Events": "Händelser",
|
||||
"Edit": "Redigera",
|
||||
"Edit": "Ändra",
|
||||
"DownloadClientStatusCheckSingleClientMessage": "Otillgängliga nedladdningsklienter på grund av misslyckade anslutningsförsök: {0}",
|
||||
"DownloadClientStatusCheckAllClientMessage": "Samtliga nedladdningsklienter är otillgängliga på grund av misslyckade anslutningsförsök",
|
||||
"DownloadClients": "Nedladdningsklienter",
|
||||
"DownloadClients": "Nerladdningsklienter",
|
||||
"Delete": "Radera",
|
||||
"Dates": "Datum",
|
||||
"Date": "Datum",
|
||||
@@ -196,7 +196,7 @@
|
||||
"IncludeHealthWarningsHelpText": "Inkludera hälsovarningar",
|
||||
"IndexerFlags": "Indexerflaggor",
|
||||
"AddDownloadClient": "Lägg till nedladdningsklient",
|
||||
"AddIndexer": "Lägg till indexerare",
|
||||
"AddIndexer": "Lägg till index",
|
||||
"AddingTag": "Lägg till tagg",
|
||||
"Enabled": "Aktiverad",
|
||||
"Exception": "Undantag",
|
||||
@@ -394,7 +394,7 @@
|
||||
"No": "Nej",
|
||||
"ApplicationLongTermStatusCheckAllClientMessage": "Alla indexerare är inte tillgängliga på grund av fel i mer än 6 timmar",
|
||||
"ApplicationLongTermStatusCheckSingleClientMessage": "Indexatorer är inte tillgängliga på grund av misslyckanden i mer än sex timmar: {0}",
|
||||
"Duration": "Tid",
|
||||
"Duration": "Längd",
|
||||
"Ended": "Avslutad",
|
||||
"LastDuration": "lastDuration",
|
||||
"LastExecution": "Senaste avrättningen",
|
||||
@@ -437,5 +437,6 @@
|
||||
"AuthForm": "Blanketter (inloggningssida)",
|
||||
"DisabledForLocalAddresses": "Inaktiverad för lokala adresser",
|
||||
"None": "Ingen",
|
||||
"ResetAPIKeyMessageText": "Är du säker på att du vill nollställa din API-nyckel?"
|
||||
"ResetAPIKeyMessageText": "Är du säker på att du vill nollställa din API-nyckel?",
|
||||
"AddCustomFilter": "Lägg till anpassat filter"
|
||||
}
|
||||
|
||||
@@ -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": "Додати умому"
|
||||
}
|
||||
|
||||
@@ -495,7 +495,7 @@
|
||||
"ApplyTagsHelpTextAdd": "添加: 添加标签至已有的标签列表中",
|
||||
"CountDownloadClientsSelected": "已选择 {count} 个下载客户端",
|
||||
"CountIndexersSelected": "已选择 {count} 个索引器",
|
||||
"DeleteSelectedDownloadClientsMessageText": "您确定要删除{count}选定的下载客户端吗?",
|
||||
"DeleteSelectedDownloadClientsMessageText": "您确定要删除 {count} 个选定的下载客户端吗?",
|
||||
"DeleteSelectedIndexersMessageText": "您确定要删除{count}选定的索引器吗?",
|
||||
"EditSelectedDownloadClients": "编辑选定的下载客户端",
|
||||
"Implementation": "执行",
|
||||
@@ -600,5 +600,8 @@
|
||||
"PackSeedTime": "做种时间",
|
||||
"PasswordConfirmation": "确认密码",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "确认新密码",
|
||||
"InvalidUILanguage": "语言"
|
||||
"InvalidUILanguage": "您的UI设置为无效语言,请纠正并保存设置",
|
||||
"NoIndexerCategories": "没有找到此索引器的分类",
|
||||
"DownloadClientQbittorrentSettingsContentLayout": "内容布局",
|
||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "是否使用 qBittorrent 配置的内容布局,使用种子的原始布局或始终创建子文件夹(qBittorrent 4.3.2+)"
|
||||
}
|
||||
|
||||
@@ -104,5 +104,26 @@
|
||||
"AppDataDirectory": "AppData 路徑",
|
||||
"Applications": "應用程式",
|
||||
"AuthBasic": "基礎(瀏覽器彈出視窗)",
|
||||
"AuthForm": "表單(登入頁面)"
|
||||
"AuthForm": "表單(登入頁面)",
|
||||
"AddConnection": "新增連接",
|
||||
"AddConnectionImplementation": "新增連接 - {implementationName}",
|
||||
"AddDownloadClientImplementation": "新增下載用戶端 - {implementationName}",
|
||||
"AddIndexerImplementation": "新增索引 - {implementationName}",
|
||||
"UnableToAddANewAppProfilePleaseTryAgain": "無法加入新的條件,請重新嘗試。",
|
||||
"UnableToAddANewApplicationPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
|
||||
"UnableToAddANewDownloadClientPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
|
||||
"UnableToAddANewIndexerPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
|
||||
"UnableToAddANewIndexerProxyPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
|
||||
"AddApplicationImplementation": "新增連接 - {implementationName}",
|
||||
"AddIndexerProxyImplementation": "新增索引 - {implementationName}",
|
||||
"EditConnectionImplementation": "新增連接 - {implementationName}",
|
||||
"EditDownloadClientImplementation": "新增下載用戶端 - {implementationName}",
|
||||
"UnableToAddANewNotificationPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
|
||||
"EditIndexerImplementation": "新增索引 - {implementationName}",
|
||||
"EditApplicationImplementation": "新增連接 - {implementationName}",
|
||||
"EditIndexerProxyImplementation": "新增索引 - {implementationName}",
|
||||
"ApplyTagsHelpTextAdd": "加入:將標籤加入已存在的標籤清單",
|
||||
"AppUpdated": "{appName}已更新",
|
||||
"AppUpdatedVersion": "重新載入",
|
||||
"ApplyChanges": "應用"
|
||||
}
|
||||
|
||||
@@ -65,11 +65,6 @@ namespace NzbDrone.Core.Notifications.Discord
|
||||
discordField.Name = "Host";
|
||||
discordField.Value = message.Host ?? string.Empty;
|
||||
break;
|
||||
case DiscordGrabFieldType.Size:
|
||||
discordField.Name = "Size";
|
||||
discordField.Value = BytesToString(message.Release.Size.GetValueOrDefault(0));
|
||||
discordField.Inline = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (discordField.Name.IsNotNullOrWhiteSpace() && discordField.Value.IsNotNullOrWhiteSpace())
|
||||
|
||||
@@ -7,7 +7,6 @@ namespace NzbDrone.Core.Notifications.Discord
|
||||
DownloadClient,
|
||||
GrabTrigger,
|
||||
Source,
|
||||
Host,
|
||||
Size
|
||||
Host
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,8 +26,7 @@ namespace NzbDrone.Core.Notifications.Discord
|
||||
(int)DiscordGrabFieldType.DownloadClient,
|
||||
(int)DiscordGrabFieldType.GrabTrigger,
|
||||
(int)DiscordGrabFieldType.Source,
|
||||
(int)DiscordGrabFieldType.Host,
|
||||
(int)DiscordGrabFieldType.Size
|
||||
(int)DiscordGrabFieldType.Host
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ using NzbDrone.Common.Instrumentation;
|
||||
using NzbDrone.Common.Instrumentation.Extensions;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Datastore.Extensions;
|
||||
using Prowlarr.Http.ClientSchema;
|
||||
using PostgresOptions = NzbDrone.Core.Datastore.PostgresOptions;
|
||||
|
||||
namespace NzbDrone.Host
|
||||
@@ -147,6 +148,8 @@ namespace NzbDrone.Host
|
||||
.AddNzbDroneLogger()
|
||||
.AddDatabase()
|
||||
.AddStartupContext(context);
|
||||
|
||||
SchemaBuilder.Initialize(c);
|
||||
})
|
||||
.ConfigureServices(services =>
|
||||
{
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Prowlarr.Api.V1.Indexers;
|
||||
using System.Collections.Generic;
|
||||
using Prowlarr.Api.V1.Indexers;
|
||||
using RestSharp;
|
||||
|
||||
namespace NzbDrone.Integration.Test.Client
|
||||
@@ -9,5 +10,11 @@ namespace NzbDrone.Integration.Test.Client
|
||||
: base(restClient, apiKey)
|
||||
{
|
||||
}
|
||||
|
||||
public List<IndexerResource> Schema()
|
||||
{
|
||||
var request = BuildRequest("/schema");
|
||||
return Get<List<IndexerResource>>(request);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using NLog;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.Datastore;
|
||||
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||
using NzbDrone.Core.Indexers.Definitions.FileList;
|
||||
using NzbDrone.Core.Indexers.Newznab;
|
||||
using NzbDrone.Test.Common;
|
||||
using NzbDrone.Test.Common.Datastore;
|
||||
using Prowlarr.Http.ClientSchema;
|
||||
|
||||
namespace NzbDrone.Integration.Test
|
||||
{
|
||||
@@ -49,16 +50,19 @@ namespace NzbDrone.Integration.Test
|
||||
{
|
||||
WaitForCompletion(() => Tasks.All().SelectList(x => x.TaskName).Contains("CheckHealth"), 20000);
|
||||
|
||||
Indexers.Post(new Prowlarr.Api.V1.Indexers.IndexerResource
|
||||
var indexer = Indexers.Schema().FirstOrDefault(i => i.Implementation == nameof(Newznab));
|
||||
|
||||
if (indexer == null)
|
||||
{
|
||||
Enable = false,
|
||||
ConfigContract = nameof(FileListSettings),
|
||||
Implementation = nameof(FileList),
|
||||
Name = "NewznabTest",
|
||||
Protocol = Core.Indexers.DownloadProtocol.Usenet,
|
||||
AppProfileId = 1,
|
||||
Fields = SchemaBuilder.ToSchema(new FileListSettings())
|
||||
});
|
||||
throw new NullReferenceException("Expected valid indexer schema, found null");
|
||||
}
|
||||
|
||||
indexer.Enable = false;
|
||||
indexer.ConfigContract = nameof(NewznabSettings);
|
||||
indexer.Implementation = nameof(Newznab);
|
||||
indexer.Name = "NewznabTest";
|
||||
indexer.Protocol = Core.Indexers.DownloadProtocol.Usenet;
|
||||
indexer.AppProfileId = 1;
|
||||
|
||||
// Change Console Log Level to Debug so we get more details.
|
||||
var config = HostConfig.Get(1);
|
||||
|
||||
@@ -23,6 +23,8 @@ namespace NzbDrone.Test.Common.AutoMoq
|
||||
SetupAutoMoqer(CreateTestContainer(new Container()));
|
||||
}
|
||||
|
||||
public IContainer Container => _container;
|
||||
|
||||
public virtual T Resolve<T>()
|
||||
{
|
||||
var result = _container.Resolve<T>();
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
using System.Collections.Generic;
|
||||
using FluentAssertions;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.Annotations;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Test.Common;
|
||||
using Prowlarr.Http.ClientSchema;
|
||||
|
||||
@@ -9,6 +12,16 @@ namespace NzbDrone.Api.Test.ClientSchemaTests
|
||||
[TestFixture]
|
||||
public class SchemaBuilderFixture : TestBase
|
||||
{
|
||||
[SetUp]
|
||||
public void Setup()
|
||||
{
|
||||
Mocker.GetMock<ILocalizationService>()
|
||||
.Setup(s => s.GetLocalizedString(It.IsAny<string>(), It.IsAny<Dictionary<string, object>>()))
|
||||
.Returns<string, Dictionary<string, object>>((s, d) => s);
|
||||
|
||||
SchemaBuilder.Initialize(Mocker.Container);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_return_field_for_every_property()
|
||||
{
|
||||
|
||||
@@ -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")]
|
||||
|
||||
@@ -9,6 +9,7 @@ using NLog;
|
||||
using NzbDrone.Common.Cache;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.Download;
|
||||
using NzbDrone.Core.Download.Clients;
|
||||
using NzbDrone.Core.Exceptions;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.IndexerSearch;
|
||||
@@ -54,7 +55,7 @@ namespace Prowlarr.Api.V1.Search
|
||||
[HttpPost]
|
||||
[Consumes("application/json")]
|
||||
[Produces("application/json")]
|
||||
public ActionResult<ReleaseResource> GrabRelease(ReleaseResource release)
|
||||
public async Task<ActionResult<ReleaseResource>> GrabRelease(ReleaseResource release)
|
||||
{
|
||||
ValidateResource(release);
|
||||
|
||||
@@ -73,11 +74,12 @@ namespace Prowlarr.Api.V1.Search
|
||||
|
||||
try
|
||||
{
|
||||
_downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect, null).GetAwaiter().GetResult();
|
||||
await _downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect, null);
|
||||
}
|
||||
catch (ReleaseDownloadException ex)
|
||||
{
|
||||
_logger.Error(ex, "Getting release from indexer failed");
|
||||
|
||||
throw new NzbDroneClientException(HttpStatusCode.Conflict, "Getting release from indexer failed");
|
||||
}
|
||||
|
||||
@@ -87,12 +89,16 @@ namespace Prowlarr.Api.V1.Search
|
||||
[HttpPost("bulk")]
|
||||
[Consumes("application/json")]
|
||||
[Produces("application/json")]
|
||||
public ActionResult<ReleaseResource> GrabReleases(List<ReleaseResource> releases)
|
||||
public async Task<ActionResult<ReleaseResource>> GrabReleases(List<ReleaseResource> releases)
|
||||
{
|
||||
releases.ForEach(release => ValidateResource(release));
|
||||
|
||||
var source = Request.GetSource();
|
||||
var host = Request.GetHostName();
|
||||
|
||||
var groupedReleases = releases.GroupBy(r => r.IndexerId);
|
||||
var grabbedReleases = new List<ReleaseResource>();
|
||||
|
||||
var groupedReleases = releases.GroupBy(r => r.IndexerId).ToList();
|
||||
|
||||
foreach (var indexerReleases in groupedReleases)
|
||||
{
|
||||
@@ -100,22 +106,42 @@ namespace Prowlarr.Api.V1.Search
|
||||
|
||||
foreach (var release in indexerReleases)
|
||||
{
|
||||
ValidateResource(release);
|
||||
|
||||
var releaseInfo = _remoteReleaseCache.Find(GetCacheKey(release));
|
||||
|
||||
if (releaseInfo == null)
|
||||
{
|
||||
_logger.Error("Couldn't find requested release in cache, cache timeout probably expired.");
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
_downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect, null).GetAwaiter().GetResult();
|
||||
await _downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect, null);
|
||||
}
|
||||
catch (ReleaseDownloadException ex)
|
||||
{
|
||||
_logger.Error(ex, "Getting release from indexer failed");
|
||||
|
||||
continue;
|
||||
}
|
||||
catch (DownloadClientException ex)
|
||||
{
|
||||
_logger.Error(ex, "Failed to send grabbed release to download client");
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
grabbedReleases.Add(release);
|
||||
}
|
||||
}
|
||||
|
||||
return Ok(releases);
|
||||
if (!grabbedReleases.Any())
|
||||
{
|
||||
throw new NzbDroneClientException(HttpStatusCode.BadRequest, "Failed to grab any release");
|
||||
}
|
||||
|
||||
return Ok(grabbedReleases);
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -3,17 +3,25 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text.Json;
|
||||
using DryIoc;
|
||||
using NzbDrone.Common.EnsureThat;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Reflection;
|
||||
using NzbDrone.Common.Serializer;
|
||||
using NzbDrone.Core.Annotations;
|
||||
using NzbDrone.Core.Localization;
|
||||
|
||||
namespace Prowlarr.Http.ClientSchema
|
||||
{
|
||||
public static class SchemaBuilder
|
||||
{
|
||||
private static Dictionary<Type, FieldMapping[]> _mappings = new Dictionary<Type, FieldMapping[]>();
|
||||
private static ILocalizationService _localizationService;
|
||||
|
||||
public static void Initialize(IContainer container)
|
||||
{
|
||||
_localizationService = container.Resolve<ILocalizationService>();
|
||||
}
|
||||
|
||||
public static List<Field> ToSchema(object model)
|
||||
{
|
||||
@@ -93,13 +101,27 @@ namespace Prowlarr.Http.ClientSchema
|
||||
if (propertyInfo.PropertyType.IsSimpleType())
|
||||
{
|
||||
var fieldAttribute = property.Item2;
|
||||
|
||||
var label = fieldAttribute.Label.IsNotNullOrWhiteSpace()
|
||||
? _localizationService.GetLocalizedString(fieldAttribute.Label,
|
||||
GetTokens(type, fieldAttribute.Label, TokenField.Label))
|
||||
: fieldAttribute.Label;
|
||||
var helpText = fieldAttribute.HelpText.IsNotNullOrWhiteSpace()
|
||||
? _localizationService.GetLocalizedString(fieldAttribute.HelpText,
|
||||
GetTokens(type, fieldAttribute.Label, TokenField.HelpText))
|
||||
: fieldAttribute.HelpText;
|
||||
var helpTextWarning = fieldAttribute.HelpTextWarning.IsNotNullOrWhiteSpace()
|
||||
? _localizationService.GetLocalizedString(fieldAttribute.HelpTextWarning,
|
||||
GetTokens(type, fieldAttribute.Label, TokenField.HelpTextWarning))
|
||||
: fieldAttribute.HelpTextWarning;
|
||||
|
||||
var field = new Field
|
||||
{
|
||||
Name = prefix + GetCamelCaseName(propertyInfo.Name),
|
||||
Label = fieldAttribute.Label,
|
||||
Label = label,
|
||||
Unit = fieldAttribute.Unit,
|
||||
HelpText = fieldAttribute.HelpText,
|
||||
HelpTextWarning = fieldAttribute.HelpTextWarning,
|
||||
HelpText = helpText,
|
||||
HelpTextWarning = helpTextWarning,
|
||||
HelpLink = fieldAttribute.HelpLink,
|
||||
Order = fieldAttribute.Order,
|
||||
Advanced = fieldAttribute.Advanced,
|
||||
@@ -158,6 +180,24 @@ namespace Prowlarr.Http.ClientSchema
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
private static Dictionary<string, object> GetTokens(Type type, string label, TokenField field)
|
||||
{
|
||||
var tokens = new Dictionary<string, object>();
|
||||
|
||||
foreach (var propertyInfo in type.GetProperties())
|
||||
{
|
||||
foreach (var attribute in propertyInfo.GetCustomAttributes(true))
|
||||
{
|
||||
if (attribute is FieldTokenAttribute fieldTokenAttribute && fieldTokenAttribute.Field == field && fieldTokenAttribute.Label == label)
|
||||
{
|
||||
tokens.Add(fieldTokenAttribute.Token, fieldTokenAttribute.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return tokens;
|
||||
}
|
||||
|
||||
private static List<SelectOption> GetSelectOptions(Type selectOptions)
|
||||
{
|
||||
if (selectOptions.IsEnum)
|
||||
|
||||
Reference in New Issue
Block a user