1
0
mirror of https://github.com/Sonarr/Sonarr.git synced 2026-04-17 21:26:13 -04:00

Compare commits

...

27 Commits

Author SHA1 Message Date
Mark McDowall
7a37f130f9 Bump version to 4.0.2 2024-02-26 20:54:08 -08:00
Mark McDowall
724dd7e733 Clean branch name to remove slashes 2024-02-20 21:23:52 -08:00
Weblate
e1be3b20e9 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: 闫锦彪 <yanjinbiaohere@163.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-02-20 20:20:43 -08:00
Sonarr
2f041f9ec1 Automated API Docs update
ignore-downstream
2024-02-20 20:20:28 -08:00
Mark McDowall
f10ccf587d Don't fail fast for integration tests 2024-02-20 20:12:57 -08:00
Mark McDowall
0242b40eda Use GitHubActionsTestLogger for test reporting 2024-02-20 20:12:57 -08:00
Bogdan
7a768b5d0f New: Indexer flags
Closes #2782
2024-02-20 23:12:45 -05:00
Mark McDowall
a57254640f Upgrade actions/setup-dotnet to v4 2024-02-20 20:10:36 -08:00
Mark McDowall
1a6f45bafd Upgrade actions/checkout to v4 2024-02-20 20:10:36 -08:00
Mark McDowall
c6071f6d81 Upgrade node to 20.11.1 2024-02-20 20:10:36 -08:00
Bogdan
2a47a237d4 Fix typo in log message matching by TVRage ID 2024-02-20 20:10:30 -08:00
Mark McDowall
a7607ac7d6 Fixed: Only match via TV Rage ID if TheTVDB ID is not available
Closes #6517
2024-02-20 20:10:17 -08:00
Mark McDowall
43797b326d New: Parse releases with season and episode numbers separated by a period
Closes #6492
2024-02-20 20:10:09 -08:00
Mark McDowall
5c4f829993 Fixed: Multi-word genres in Auto Tags
Fixed #6488
2024-02-20 20:10:02 -08:00
Bogdan
8dd8c95f36 Fixed: Avoid upgrades for custom formats cut-off already met 2024-02-20 20:09:52 -08:00
Weblate
6f6036a199 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Chaoshuai Lü <lcs@meta.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Magyar <kochnorbert@icloud.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: wgwqd <wgwqd@163.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-02-20 20:08:04 -08:00
Mark McDowall
625e500132 Use 'paths-ignore' instead of 'path' with only negative matches 2024-02-17 22:39:18 -08:00
Weblate
39575b1248 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: David13467 <davidnow00@gmail.com>
Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Hicabi Erdem <bilgi@hicabierdem.com>
Co-authored-by: Lucas <sixagag973@fkcod.com>
Co-authored-by: Magyar <kochnorbert@icloud.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Steve Hansen <steve@hansenconsultancy.be>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: aghus <aghus.m@outlook.com>
Co-authored-by: bai0012 <baicongrui@gmail.com>
Co-authored-by: bogdan-rgb <b.hmelniczky@yandex.ru>
Co-authored-by: savin-msk <ns@a77.io>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-02-13 16:56:10 -08:00
abcasada
f1d343218c Hints for week column and short dates in UI settings
(cherry picked from commit 4558f552820b52bb1f9cd97fdabe03654ce9924a)
2024-02-13 16:47:48 -08:00
Qstick
b0829d5537 Fixed: Correctly persist calendar custom filter selection
ignore-downstream
2024-02-13 16:47:41 -08:00
Bogdan
965e7c22d9 Fixed: Reprocessing multi-language file in Manage Episodes 2024-02-13 16:47:31 -08:00
Bogdan
75535e61d9 Fixed: Reprocessing custom formats for file in Manual Import 2024-02-13 16:47:31 -08:00
Bogdan
c0b17d9345 Show download client ID as hint in select options 2024-02-13 16:46:55 -08:00
Bogdan
84e657482d Improve messaging on indexer specified download client is not available 2024-02-13 16:46:55 -08:00
Bogdan
ed27bcf213 Fixed: Refresh tags state to clear removed tags by housekeeping
(cherry picked from commit 2510f44c25bee6fede27d9fa2b9614176d12cb55)
2024-02-13 16:46:46 -08:00
Bogdan
9ee2fe6f5c Fix typo 2024-02-13 16:46:38 -08:00
Bogdan
d5e19b8c3c Prevent useless builds 2024-02-13 16:46:38 -08:00
98 changed files with 1950 additions and 335 deletions

View File

@@ -27,7 +27,7 @@ runs:
using: 'composite'
steps:
- name: Setup .NET
uses: actions/setup-dotnet@v3
uses: actions/setup-dotnet@v4
- name: Setup Postgres
if: ${{ inputs.use_postgres }}
@@ -77,7 +77,7 @@ runs:
- name: Run tests
shell: bash
run: dotnet test ./_tests/Sonarr.*.Test.dll --filter "${{ inputs.filter }}" --logger "trx;LogFileName=${{ env.RESULTS_NAME }}.trx"
run: dotnet test ./_tests/Sonarr.*.Test.dll --filter "${{ inputs.filter }}" --logger "trx;LogFileName=${{ env.RESULTS_NAME }}.trx" --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true"
- name: Upload Test Results
if: ${{ !cancelled() }}
@@ -85,12 +85,3 @@ runs:
with:
name: results-${{ env.RESULTS_NAME }}
path: TestResults/*.trx
- name: Publish Test Results
uses: phoenix-actions/test-reporting@v12
with:
name: Test Results
output-to: step-summary
path: '*.trx'
reporter: dotnet-trx
working-directory: TestResults

View File

@@ -26,10 +26,10 @@ jobs:
permissions:
contents: write
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Setup dotnet
uses: actions/setup-dotnet@v3
uses: actions/setup-dotnet@v4
id: setup-dotnet
- name: Create openapi.json

View File

@@ -5,9 +5,14 @@ on:
branches:
- develop
- main
paths-ignore:
- 'src/Sonarr.Api.*/openapi.json'
pull_request:
branches:
- develop
paths-ignore:
- 'src/NzbDrone.Core/Localization/Core/**'
- 'src/Sonarr.Api.*/openapi.json'
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
@@ -15,9 +20,9 @@ concurrency:
env:
FRAMEWORK: net6.0
BRANCH: ${{ github.head_ref || github.ref_name }}
RAW_BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
SONARR_MAJOR_VERSION: 4
VERSION: 4.0.1
VERSION: 4.0.2
jobs:
backend:
@@ -28,10 +33,10 @@ jobs:
version: ${{ steps.variables.outputs.version }}
steps:
- name: Check out
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v3
uses: actions/setup-dotnet@v4
- name: Setup Environment Variables
id: variables
@@ -43,6 +48,8 @@ jobs:
echo "SDK_PATH=${{ env.DOTNET_ROOT }}/sdk/${DOTNET_VERSION}" >> "$GITHUB_ENV"
echo "SONARR_VERSION=$SONARR_VERSION" >> "$GITHUB_ENV"
echo "BRANCH=${RAW_BRANCH_NAME/\//-}" >> "$GITHUB_ENV"
echo "framework=${{ env.FRAMEWORK }}" >> "$GITHUB_OUTPUT"
echo "major_version=${{ env.SONARR_MAJOR_VERSION }}" >> "$GITHUB_OUTPUT"
echo "version=$SONARR_VERSION" >> "$GITHUB_OUTPUT"
@@ -102,12 +109,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Volta
uses: volta-cli/action@v4
- name: Yarn Intsall
- name: Yarn Install
run: yarn install
- name: Lint
@@ -144,7 +151,7 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- name: Check out
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Test
uses: ./.github/actions/test
@@ -159,7 +166,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Test
uses: ./.github/actions/test
@@ -173,6 +180,7 @@ jobs:
integration_test:
needs: backend
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
include:
@@ -194,7 +202,7 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- name: Check out
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Test
uses: ./.github/actions/test

View File

@@ -41,7 +41,7 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- name: Check out
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Package
uses: ./.github/actions/package
@@ -60,7 +60,7 @@ jobs:
contents: write
steps:
- name: Check out
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Download release artifacts
uses: actions/download-artifact@v4

View File

@@ -1,41 +0,0 @@
name: Publish Test Results
on:
workflow_run:
workflows: ['Build']
types:
- completed
permissions:
contents: read
actions: read
checks: write
jobs:
report:
if: ${{ github.event.workflow_run.conclusion != 'skipped' && github.event.workflow_run.conclusion != 'cancelled' }}
runs-on: ubuntu-latest
steps:
- name: Check out
uses: actions/checkout@v3
- name: Download Test Reports
uses: actions/download-artifact@v4
with:
path: test-results
pattern: results-*
merge-multiple: true
repository: ${{ github.event.repository.owner.login }}/${{ github.event.repository.name }}
run-id: ${{ github.event.workflow_run.id }}
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Publish Test Results
uses: phoenix-actions/test-reporting@v12
with:
list-suites: failed
list-tests: failed
name: Test Results
only-summary: true
path: '*.trx'
reporter: dotnet-trx
working-directory: test-results

View File

@@ -9,6 +9,7 @@ import DownloadClient from 'typings/DownloadClient';
import ImportList from 'typings/ImportList';
import ImportListOptionsSettings from 'typings/ImportListOptionsSettings';
import Indexer from 'typings/Indexer';
import IndexerFlag from 'typings/IndexerFlag';
import Notification from 'typings/Notification';
import QualityProfile from 'typings/QualityProfile';
import { UiSettings } from 'typings/UiSettings';
@@ -40,19 +41,21 @@ export interface ImportListOptionsSettingsAppState
extends AppSectionItemState<ImportListOptionsSettings>,
AppSectionSaveState {}
export type IndexerFlagSettingsAppState = AppSectionState<IndexerFlag>;
export type LanguageSettingsAppState = AppSectionState<Language>;
export type UiSettingsAppState = AppSectionItemState<UiSettings>;
interface SettingsAppState {
advancedSettings: boolean;
downloadClients: DownloadClientAppState;
importListOptions: ImportListOptionsSettingsAppState;
importLists: ImportListAppState;
indexerFlags: IndexerFlagSettingsAppState;
indexers: IndexerAppState;
languages: LanguageSettingsAppState;
notifications: NotificationAppState;
qualityProfiles: QualityProfilesAppState;
ui: UiSettingsAppState;
importListOptions: ImportListOptionsSettingsAppState;
}
export default SettingsAppState;

View File

@@ -26,7 +26,8 @@ function createMapStateToProps() {
const values = _.map(filteredItems.sort(sortByName), (downloadClient) => {
return {
key: downloadClient.id,
value: downloadClient.name
value: downloadClient.name,
hint: `(${downloadClient.id})`
};
});

View File

@@ -11,6 +11,7 @@ import DownloadClientSelectInputConnector from './DownloadClientSelectInputConne
import EnhancedSelectInput from './EnhancedSelectInput';
import EnhancedSelectInputConnector from './EnhancedSelectInputConnector';
import FormInputHelpText from './FormInputHelpText';
import IndexerFlagsSelectInput from './IndexerFlagsSelectInput';
import IndexerSelectInputConnector from './IndexerSelectInputConnector';
import KeyValueListInput from './KeyValueListInput';
import MonitorEpisodesSelectInput from './MonitorEpisodesSelectInput';
@@ -71,6 +72,9 @@ function getComponent(type) {
case inputTypes.INDEXER_SELECT:
return IndexerSelectInputConnector;
case inputTypes.INDEXER_FLAGS_SELECT:
return IndexerFlagsSelectInput;
case inputTypes.DOWNLOAD_CLIENT_SELECT:
return DownloadClientSelectInputConnector;
@@ -279,6 +283,7 @@ FormInputGroup.propTypes = {
includeNoChange: PropTypes.bool,
includeNoChangeDisabled: PropTypes.bool,
selectedValueOptions: PropTypes.object,
indexerFlags: PropTypes.number,
pending: PropTypes.bool,
errors: PropTypes.arrayOf(PropTypes.object),
warnings: PropTypes.arrayOf(PropTypes.object),

View File

@@ -0,0 +1,62 @@
import React, { useCallback } from 'react';
import { useSelector } from 'react-redux';
import { createSelector } from 'reselect';
import AppState from 'App/State/AppState';
import EnhancedSelectInput from './EnhancedSelectInput';
const selectIndexerFlagsValues = (selectedFlags: number) =>
createSelector(
(state: AppState) => state.settings.indexerFlags,
(indexerFlags) => {
const value = indexerFlags.items.reduce((acc: number[], { id }) => {
// eslint-disable-next-line no-bitwise
if ((selectedFlags & id) === id) {
acc.push(id);
}
return acc;
}, []);
const values = indexerFlags.items.map(({ id, name }) => ({
key: id,
value: name,
}));
return {
value,
values,
};
}
);
interface IndexerFlagsSelectInputProps {
name: string;
indexerFlags: number;
onChange(payload: object): void;
}
function IndexerFlagsSelectInput(props: IndexerFlagsSelectInputProps) {
const { indexerFlags, onChange } = props;
const { value, values } = useSelector(selectIndexerFlagsValues(indexerFlags));
const onChangeWrapper = useCallback(
({ name, value }: { name: string; value: number[] }) => {
const indexerFlags = value.reduce((acc, flagId) => acc + flagId, 0);
onChange({ name, value: indexerFlags });
},
[onChange]
);
return (
<EnhancedSelectInput
{...props}
value={value}
values={values}
onChange={onChangeWrapper}
/>
);
}
export default IndexerFlagsSelectInput;

View File

@@ -91,6 +91,7 @@ class TextTagInputConnector extends Component {
render() {
return (
<TagInput
delimiters={['Tab', 'Enter', ',']}
tagList={[]}
onTagAdd={this.onTagAdd}
onTagDelete={this.onTagDelete}

View File

@@ -6,7 +6,13 @@ import { createSelector } from 'reselect';
import { fetchTranslations, saveDimensions, setIsSidebarVisible } from 'Store/Actions/appActions';
import { fetchCustomFilters } from 'Store/Actions/customFilterActions';
import { fetchSeries } from 'Store/Actions/seriesActions';
import { fetchImportLists, fetchLanguages, fetchQualityProfiles, fetchUISettings } from 'Store/Actions/settingsActions';
import {
fetchImportLists,
fetchIndexerFlags,
fetchLanguages,
fetchQualityProfiles,
fetchUISettings
} from 'Store/Actions/settingsActions';
import { fetchStatus } from 'Store/Actions/systemActions';
import { fetchTags } from 'Store/Actions/tagActions';
import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector';
@@ -51,6 +57,7 @@ const selectIsPopulated = createSelector(
(state) => state.settings.qualityProfiles.isPopulated,
(state) => state.settings.languages.isPopulated,
(state) => state.settings.importLists.isPopulated,
(state) => state.settings.indexerFlags.isPopulated,
(state) => state.system.status.isPopulated,
(state) => state.app.translations.isPopulated,
(
@@ -61,6 +68,7 @@ const selectIsPopulated = createSelector(
qualityProfilesIsPopulated,
languagesIsPopulated,
importListsIsPopulated,
indexerFlagsIsPopulated,
systemStatusIsPopulated,
translationsIsPopulated
) => {
@@ -72,6 +80,7 @@ const selectIsPopulated = createSelector(
qualityProfilesIsPopulated &&
languagesIsPopulated &&
importListsIsPopulated &&
indexerFlagsIsPopulated &&
systemStatusIsPopulated &&
translationsIsPopulated
);
@@ -86,6 +95,7 @@ const selectErrors = createSelector(
(state) => state.settings.qualityProfiles.error,
(state) => state.settings.languages.error,
(state) => state.settings.importLists.error,
(state) => state.settings.indexerFlags.error,
(state) => state.system.status.error,
(state) => state.app.translations.error,
(
@@ -96,6 +106,7 @@ const selectErrors = createSelector(
qualityProfilesError,
languagesError,
importListsError,
indexerFlagsError,
systemStatusError,
translationsError
) => {
@@ -107,6 +118,7 @@ const selectErrors = createSelector(
qualityProfilesError ||
languagesError ||
importListsError ||
indexerFlagsError ||
systemStatusError ||
translationsError
);
@@ -120,6 +132,7 @@ const selectErrors = createSelector(
qualityProfilesError,
languagesError,
importListsError,
indexerFlagsError,
systemStatusError,
translationsError
};
@@ -174,6 +187,9 @@ function createMapDispatchToProps(dispatch, props) {
dispatchFetchImportLists() {
dispatch(fetchImportLists());
},
dispatchFetchIndexerFlags() {
dispatch(fetchIndexerFlags());
},
dispatchFetchUISettings() {
dispatch(fetchUISettings());
},
@@ -213,6 +229,7 @@ class PageConnector extends Component {
this.props.dispatchFetchQualityProfiles();
this.props.dispatchFetchLanguages();
this.props.dispatchFetchImportLists();
this.props.dispatchFetchIndexerFlags();
this.props.dispatchFetchUISettings();
this.props.dispatchFetchStatus();
this.props.dispatchFetchTranslations();
@@ -238,6 +255,7 @@ class PageConnector extends Component {
dispatchFetchQualityProfiles,
dispatchFetchLanguages,
dispatchFetchImportLists,
dispatchFetchIndexerFlags,
dispatchFetchUISettings,
dispatchFetchStatus,
dispatchFetchTranslations,
@@ -278,6 +296,7 @@ PageConnector.propTypes = {
dispatchFetchQualityProfiles: PropTypes.func.isRequired,
dispatchFetchLanguages: PropTypes.func.isRequired,
dispatchFetchImportLists: PropTypes.func.isRequired,
dispatchFetchIndexerFlags: PropTypes.func.isRequired,
dispatchFetchUISettings: PropTypes.func.isRequired,
dispatchFetchStatus: PropTypes.func.isRequired,
dispatchFetchTranslations: PropTypes.func.isRequired,

View File

@@ -0,0 +1,26 @@
import React from 'react';
import { useSelector } from 'react-redux';
import createIndexerFlagsSelector from 'Store/Selectors/createIndexerFlagsSelector';
interface IndexerFlagsProps {
indexerFlags: number;
}
function IndexerFlags({ indexerFlags = 0 }: IndexerFlagsProps) {
const allIndexerFlags = useSelector(createIndexerFlagsSelector);
const flags = allIndexerFlags.items.filter(
// eslint-disable-next-line no-bitwise
(item) => (indexerFlags & item.id) === item.id
);
return flags.length ? (
<ul>
{flags.map((flag, index) => {
return <li key={index}>{flag.name}</li>;
})}
</ul>
) : null;
}
export default IndexerFlags;

View File

@@ -16,6 +16,7 @@ export interface EpisodeFile extends ModelBase {
languages: Language[];
quality: QualityModel;
customFormats: CustomFormat[];
indexerFlags: number;
mediaInfo: MediaInfo;
qualityCutoffNotMet: boolean;
}

View File

@@ -62,6 +62,7 @@ import {
faFileExport as fasFileExport,
faFileInvoice as farFileInvoice,
faFilter as fasFilter,
faFlag as fasFlag,
faFolderOpen as fasFolderOpen,
faForward as fasForward,
faHeart as fasHeart,
@@ -154,6 +155,7 @@ export const FILE_MISSING = fasFileCircleQuestion;
export const FILTER = fasFilter;
export const FINALE_SEASON = fasCirclePause;
export const FINALE_SERIES = fasCircleStop;
export const FLAG = fasFlag;
export const FOOTNOTE = fasAsterisk;
export const FOLDER = farFolder;
export const FOLDER_OPEN = fasFolderOpen;

View File

@@ -12,6 +12,7 @@ export const PASSWORD = 'password';
export const PATH = 'path';
export const QUALITY_PROFILE_SELECT = 'qualityProfileSelect';
export const INDEXER_SELECT = 'indexerSelect';
export const INDEXER_FLAGS_SELECT = 'indexerFlagsSelect';
export const LANGUAGE_SELECT = 'languageSelect';
export const DOWNLOAD_CLIENT_SELECT = 'downloadClientSelect';
export const ROOT_FOLDER_SELECT = 'rootFolderSelect';

View File

@@ -0,0 +1,34 @@
import React from 'react';
import Modal from 'Components/Modal/Modal';
import SelectIndexerFlagsModalContent from './SelectIndexerFlagsModalContent';
interface SelectIndexerFlagsModalProps {
isOpen: boolean;
indexerFlags: number;
modalTitle: string;
onIndexerFlagsSelect(indexerFlags: number): void;
onModalClose(): void;
}
function SelectIndexerFlagsModal(props: SelectIndexerFlagsModalProps) {
const {
isOpen,
indexerFlags,
modalTitle,
onIndexerFlagsSelect,
onModalClose,
} = props;
return (
<Modal isOpen={isOpen} onModalClose={onModalClose}>
<SelectIndexerFlagsModalContent
indexerFlags={indexerFlags}
modalTitle={modalTitle}
onIndexerFlagsSelect={onIndexerFlagsSelect}
onModalClose={onModalClose}
/>
</Modal>
);
}
export default SelectIndexerFlagsModal;

View File

@@ -0,0 +1,7 @@
.modalBody {
composes: modalBody from '~Components/Modal/ModalBody.css';
display: flex;
flex: 1 1 auto;
flex-direction: column;
}

View File

@@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'modalBody': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -0,0 +1,75 @@
import React, { useCallback, useState } from 'react';
import Form from 'Components/Form/Form';
import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import Button from 'Components/Link/Button';
import ModalBody from 'Components/Modal/ModalBody';
import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes, kinds, scrollDirections } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './SelectIndexerFlagsModalContent.css';
interface SelectIndexerFlagsModalContentProps {
indexerFlags: number;
modalTitle: string;
onIndexerFlagsSelect(indexerFlags: number): void;
onModalClose(): void;
}
function SelectIndexerFlagsModalContent(
props: SelectIndexerFlagsModalContentProps
) {
const { modalTitle, onIndexerFlagsSelect, onModalClose } = props;
const [indexerFlags, setIndexerFlags] = useState(props.indexerFlags);
const onIndexerFlagsChange = useCallback(
({ value }: { value: number }) => {
setIndexerFlags(value);
},
[setIndexerFlags]
);
const onIndexerFlagsSelectWrapper = useCallback(() => {
onIndexerFlagsSelect(indexerFlags);
}, [indexerFlags, onIndexerFlagsSelect]);
return (
<ModalContent onModalClose={onModalClose}>
<ModalHeader>
{translate('SetIndexerFlagsModalTitle', { modalTitle })}
</ModalHeader>
<ModalBody
className={styles.modalBody}
scrollDirection={scrollDirections.NONE}
>
<Form>
<FormGroup>
<FormLabel>{translate('IndexerFlags')}</FormLabel>
<FormInputGroup
type={inputTypes.INDEXER_FLAGS_SELECT}
name="indexerFlags"
indexerFlags={indexerFlags}
autoFocus={true}
onChange={onIndexerFlagsChange}
/>
</FormGroup>
</Form>
</ModalBody>
<ModalFooter>
<Button onPress={onModalClose}>{translate('Cancel')}</Button>
<Button kind={kinds.SUCCESS} onPress={onIndexerFlagsSelectWrapper}>
{translate('SetIndexerFlags')}
</Button>
</ModalFooter>
</ModalContent>
);
}
export default SelectIndexerFlagsModalContent;

View File

@@ -29,6 +29,7 @@ import { align, icons, kinds, scrollDirections } from 'Helpers/Props';
import SelectEpisodeModal from 'InteractiveImport/Episode/SelectEpisodeModal';
import { SelectedEpisode } from 'InteractiveImport/Episode/SelectEpisodeModalContent';
import ImportMode from 'InteractiveImport/ImportMode';
import SelectIndexerFlagsModal from 'InteractiveImport/IndexerFlags/SelectIndexerFlagsModal';
import InteractiveImport, {
InteractiveImportCommandOptions,
} from 'InteractiveImport/InteractiveImport';
@@ -71,7 +72,8 @@ type SelectType =
| 'episode'
| 'releaseGroup'
| 'quality'
| 'language';
| 'language'
| 'indexerFlags';
type FilterExistingFiles = 'all' | 'new';
@@ -135,11 +137,21 @@ const COLUMNS = [
isSortable: true,
isVisible: true,
},
{
name: 'indexerFlags',
label: React.createElement(Icon, {
name: icons.FLAG,
title: () => translate('IndexerFlags'),
}),
isSortable: true,
isVisible: true,
},
{
name: 'rejections',
label: React.createElement(Icon, {
name: icons.DANGER,
kind: kinds.DANGER,
title: () => translate('Rejections'),
}),
isSortable: true,
isVisible: true,
@@ -284,8 +296,18 @@ function InteractiveImportModalContent(
}
}
const showIndexerFlags = items.some((item) => item.indexerFlags);
if (!showIndexerFlags) {
const indexerFlagsColumn = result.find((c) => c.name === 'indexerFlags');
if (indexerFlagsColumn) {
indexerFlagsColumn.isVisible = false;
}
}
return result;
}, [showSeries]);
}, [showSeries, items]);
const selectedIds: number[] = useMemo(() => {
return getSelectedIds(selectedState);
@@ -343,6 +365,10 @@ function InteractiveImportModalContent(
key: 'language',
value: translate('SelectLanguage'),
},
{
key: 'indexerFlags',
value: translate('SelectIndexerFlags'),
},
];
if (allowSeriesChange) {
@@ -483,6 +509,7 @@ function InteractiveImportModalContent(
releaseGroup,
quality,
languages,
indexerFlags,
episodeFileId,
} = item;
@@ -532,6 +559,7 @@ function InteractiveImportModalContent(
releaseGroup,
quality,
languages,
indexerFlags,
});
return;
@@ -546,6 +574,7 @@ function InteractiveImportModalContent(
releaseGroup,
quality,
languages,
indexerFlags,
downloadId,
episodeFileId,
});
@@ -742,6 +771,22 @@ function InteractiveImportModalContent(
[selectedIds, dispatch]
);
const onIndexerFlagsSelect = useCallback(
(indexerFlags: number) => {
dispatch(
updateInteractiveImportItems({
ids: selectedIds,
indexerFlags,
})
);
dispatch(reprocessInteractiveImportItems({ ids: selectedIds }));
setSelectModalOpen(null);
},
[selectedIds, dispatch]
);
const orderedSelectedIds = items.reduce((acc: number[], file) => {
if (selectedIds.includes(file.id)) {
acc.push(file.id);
@@ -947,6 +992,14 @@ function InteractiveImportModalContent(
onModalClose={onSelectModalClose}
/>
<SelectIndexerFlagsModal
isOpen={selectModalOpen === 'indexerFlags'}
indexerFlags={0}
modalTitle={modalTitle}
onIndexerFlagsSelect={onIndexerFlagsSelect}
onModalClose={onSelectModalClose}
/>
<ConfirmModal
isOpen={isConfirmDeleteModalOpen}
kind={kinds.DANGER}

View File

@@ -12,9 +12,11 @@ import Episode from 'Episode/Episode';
import EpisodeFormats from 'Episode/EpisodeFormats';
import EpisodeLanguages from 'Episode/EpisodeLanguages';
import EpisodeQuality from 'Episode/EpisodeQuality';
import IndexerFlags from 'Episode/IndexerFlags';
import { icons, kinds, tooltipPositions } from 'Helpers/Props';
import SelectEpisodeModal from 'InteractiveImport/Episode/SelectEpisodeModal';
import { SelectedEpisode } from 'InteractiveImport/Episode/SelectEpisodeModalContent';
import SelectIndexerFlagsModal from 'InteractiveImport/IndexerFlags/SelectIndexerFlagsModal';
import SelectLanguageModal from 'InteractiveImport/Language/SelectLanguageModal';
import SelectQualityModal from 'InteractiveImport/Quality/SelectQualityModal';
import SelectReleaseGroupModal from 'InteractiveImport/ReleaseGroup/SelectReleaseGroupModal';
@@ -41,7 +43,8 @@ type SelectType =
| 'episode'
| 'releaseGroup'
| 'quality'
| 'language';
| 'language'
| 'indexerFlags';
type SelectedChangeProps = SelectStateInputProps & {
hasEpisodeFileId: boolean;
@@ -60,6 +63,7 @@ interface InteractiveImportRowProps {
size: number;
customFormats?: object[];
customFormatScore?: number;
indexerFlags: number;
rejections: Rejection[];
columns: Column[];
episodeFileId?: number;
@@ -84,6 +88,7 @@ function InteractiveImportRow(props: InteractiveImportRowProps) {
size,
customFormats,
customFormatScore,
indexerFlags,
rejections,
isReprocessing,
isSelected,
@@ -100,6 +105,10 @@ function InteractiveImportRow(props: InteractiveImportRowProps) {
() => columns.find((c) => c.name === 'series')?.isVisible ?? false,
[columns]
);
const isIndexerFlagsColumnVisible = useMemo(
() => columns.find((c) => c.name === 'indexerFlags')?.isVisible ?? false,
[columns]
);
const [selectModalOpen, setSelectModalOpen] = useState<SelectType | null>(
null
@@ -306,6 +315,27 @@ function InteractiveImportRow(props: InteractiveImportRowProps) {
[id, dispatch, setSelectModalOpen, selectRowAfterChange]
);
const onSelectIndexerFlagsPress = useCallback(() => {
setSelectModalOpen('indexerFlags');
}, [setSelectModalOpen]);
const onIndexerFlagsSelect = useCallback(
(indexerFlags: number) => {
dispatch(
updateInteractiveImportItem({
id,
indexerFlags,
})
);
dispatch(reprocessInteractiveImportItems({ ids: [id] }));
setSelectModalOpen(null);
selectRowAfterChange();
},
[id, dispatch, setSelectModalOpen, selectRowAfterChange]
);
const seriesTitle = series ? series.title : '';
const isAnime = series?.seriesType === 'anime';
@@ -332,6 +362,7 @@ function InteractiveImportRow(props: InteractiveImportRowProps) {
const showReleaseGroupPlaceholder = isSelected && !releaseGroup;
const showQualityPlaceholder = isSelected && !quality;
const showLanguagePlaceholder = isSelected && !languages;
const showIndexerFlagsPlaceholder = isSelected && !indexerFlags;
return (
<TableRow>
@@ -448,6 +479,28 @@ function InteractiveImportRow(props: InteractiveImportRowProps) {
) : null}
</TableRowCell>
{isIndexerFlagsColumnVisible ? (
<TableRowCellButton
title={translate('ClickToChangeIndexerFlags')}
onPress={onSelectIndexerFlagsPress}
>
{showIndexerFlagsPlaceholder ? (
<InteractiveImportRowCellPlaceholder isOptional={true} />
) : (
<>
{indexerFlags ? (
<Popover
anchor={<Icon name={icons.FLAG} kind={kinds.PRIMARY} />}
title={translate('IndexerFlags')}
body={<IndexerFlags indexerFlags={indexerFlags} />}
position={tooltipPositions.LEFT}
/>
) : null}
</>
)}
</TableRowCellButton>
) : null}
<TableRowCell>
{rejections.length ? (
<Popover
@@ -518,6 +571,14 @@ function InteractiveImportRow(props: InteractiveImportRowProps) {
onLanguagesSelect={onLanguagesSelect}
onModalClose={onSelectModalClose}
/>
<SelectIndexerFlagsModal
isOpen={selectModalOpen === 'indexerFlags'}
indexerFlags={indexerFlags ?? 0}
modalTitle={modalTitle}
onIndexerFlagsSelect={onIndexerFlagsSelect}
onModalClose={onSelectModalClose}
/>
</TableRow>
);
}

View File

@@ -13,6 +13,7 @@ export interface InteractiveImportCommandOptions {
releaseGroup?: string;
quality: QualityModel;
languages: Language[];
indexerFlags: number;
downloadId?: string;
episodeFileId?: number;
}
@@ -31,6 +32,7 @@ interface InteractiveImport extends ModelBase {
episodes: Episode[];
qualityWeight: number;
customFormats: object[];
indexerFlags: number;
rejections: Rejection[];
episodeFileId?: number;
}

View File

@@ -72,6 +72,15 @@ const columns = [
isSortable: true,
isVisible: true
},
{
name: 'indexerFlags',
label: React.createElement(Icon, {
name: icons.FLAG,
title: () => translate('IndexerFlags')
}),
isSortable: true,
isVisible: true
},
{
name: 'rejections',
label: React.createElement(Icon, {

View File

@@ -44,7 +44,8 @@
cursor: default;
}
.rejected {
.rejected,
.indexerFlags {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 50px;

View File

@@ -6,6 +6,7 @@ interface CssExports {
'download': string;
'downloadIcon': string;
'indexer': string;
'indexerFlags': string;
'interactiveIcon': string;
'languages': string;
'manualDownloadContent': string;

View File

@@ -12,6 +12,7 @@ import type DownloadProtocol from 'DownloadClient/DownloadProtocol';
import EpisodeFormats from 'Episode/EpisodeFormats';
import EpisodeLanguages from 'Episode/EpisodeLanguages';
import EpisodeQuality from 'Episode/EpisodeQuality';
import IndexerFlags from 'Episode/IndexerFlags';
import { icons, kinds, tooltipPositions } from 'Helpers/Props';
import Language from 'Language/Language';
import { QualityModel } from 'Quality/Quality';
@@ -98,6 +99,7 @@ interface InteractiveSearchRowProps {
mappedEpisodeNumbers?: number[];
mappedAbsoluteEpisodeNumbers?: number[];
mappedEpisodeInfo: ReleaseEpisode[];
indexerFlags: number;
rejections: string[];
episodeRequested: boolean;
downloadAllowed: boolean;
@@ -139,6 +141,7 @@ function InteractiveSearchRow(props: InteractiveSearchRowProps) {
mappedEpisodeNumbers,
mappedAbsoluteEpisodeNumbers,
mappedEpisodeInfo,
indexerFlags = 0,
rejections = [],
episodeRequested,
downloadAllowed,
@@ -254,10 +257,21 @@ function InteractiveSearchRow(props: InteractiveSearchRowProps) {
customFormats.length
)}
tooltip={<EpisodeFormats formats={customFormats} />}
position={tooltipPositions.BOTTOM}
position={tooltipPositions.LEFT}
/>
</TableRowCell>
<TableRowCell className={styles.indexerFlags}>
{indexerFlags ? (
<Popover
anchor={<Icon name={icons.FLAG} kind={kinds.PRIMARY} />}
title={translate('IndexerFlags')}
body={<IndexerFlags indexerFlags={indexerFlags} />}
position={tooltipPositions.LEFT}
/>
) : null}
</TableRowCell>
<TableRowCell className={styles.rejected}>
{rejections.length ? (
<Popover

View File

@@ -62,3 +62,9 @@
width: 55px;
}
.indexerFlags {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 50px;
}

View File

@@ -6,6 +6,7 @@ interface CssExports {
'customFormatScore': string;
'episodeNumber': string;
'episodeNumberAnime': string;
'indexerFlags': string;
'languages': string;
'monitored': string;
'releaseGroup': string;

View File

@@ -1,22 +1,26 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Icon from 'Components/Icon';
import MonitorToggleButton from 'Components/MonitorToggleButton';
import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellConnector';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableRow from 'Components/Table/TableRow';
import Popover from 'Components/Tooltip/Popover';
import Tooltip from 'Components/Tooltip/Tooltip';
import EpisodeFormats from 'Episode/EpisodeFormats';
import EpisodeNumber from 'Episode/EpisodeNumber';
import EpisodeSearchCellConnector from 'Episode/EpisodeSearchCellConnector';
import EpisodeStatusConnector from 'Episode/EpisodeStatusConnector';
import EpisodeTitleLink from 'Episode/EpisodeTitleLink';
import IndexerFlags from 'Episode/IndexerFlags';
import EpisodeFileLanguageConnector from 'EpisodeFile/EpisodeFileLanguageConnector';
import MediaInfoConnector from 'EpisodeFile/MediaInfoConnector';
import * as mediaInfoTypes from 'EpisodeFile/mediaInfoTypes';
import { tooltipPositions } from 'Helpers/Props';
import { icons, kinds, tooltipPositions } from 'Helpers/Props';
import formatBytes from 'Utilities/Number/formatBytes';
import formatCustomFormatScore from 'Utilities/Number/formatCustomFormatScore';
import formatRuntime from 'Utilities/Number/formatRuntime';
import translate from 'Utilities/String/translate';
import styles from './EpisodeRow.css';
class EpisodeRow extends Component {
@@ -77,6 +81,7 @@ class EpisodeRow extends Component {
releaseGroup,
customFormats,
customFormatScore,
indexerFlags,
alternateTitles,
columns
} = this.props;
@@ -211,7 +216,7 @@ class EpisodeRow extends Component {
customFormats.length
)}
tooltip={<EpisodeFormats formats={customFormats} />}
position={tooltipPositions.BOTTOM}
position={tooltipPositions.LEFT}
/>
</TableRowCell>
);
@@ -322,6 +327,24 @@ class EpisodeRow extends Component {
);
}
if (name === 'indexerFlags') {
return (
<TableRowCell
key={name}
className={styles.indexerFlags}
>
{indexerFlags ? (
<Popover
anchor={<Icon name={icons.FLAG} kind={kinds.PRIMARY} />}
title={translate('IndexerFlags')}
body={<IndexerFlags indexerFlags={indexerFlags} />}
position={tooltipPositions.LEFT}
/>
) : null}
</TableRowCell>
);
}
if (name === 'status') {
return (
<TableRowCell
@@ -381,6 +404,7 @@ EpisodeRow.propTypes = {
releaseGroup: PropTypes.string,
customFormats: PropTypes.arrayOf(PropTypes.object),
customFormatScore: PropTypes.number.isRequired,
indexerFlags: PropTypes.number.isRequired,
mediaInfo: PropTypes.object,
alternateTitles: PropTypes.arrayOf(PropTypes.object).isRequired,
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
@@ -389,7 +413,8 @@ EpisodeRow.propTypes = {
EpisodeRow.defaultProps = {
alternateTitles: [],
customFormats: []
customFormats: [],
indexerFlags: 0
};
export default EpisodeRow;

View File

@@ -1,4 +1,3 @@
/* eslint max-params: 0 */
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import createEpisodeFileSelector from 'Store/Selectors/createEpisodeFileSelector';
@@ -20,6 +19,7 @@ function createMapStateToProps() {
releaseGroup: episodeFile ? episodeFile.releaseGroup : null,
customFormats: episodeFile ? episodeFile.customFormats : [],
customFormatScore: episodeFile ? episodeFile.customFormatScore : 0,
indexerFlags: episodeFile ? episodeFile.indexerFlags : 0,
alternateTitles: series.alternateTitles
};
}

View File

@@ -3,7 +3,7 @@ import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { fetchDelayProfiles, fetchDownloadClients, fetchImportLists, fetchIndexers, fetchNotifications, fetchReleaseProfiles } from 'Store/Actions/settingsActions';
import { fetchTagDetails } from 'Store/Actions/tagActions';
import { fetchTagDetails, fetchTags } from 'Store/Actions/tagActions';
import Tags from './Tags';
function createMapStateToProps() {
@@ -25,6 +25,7 @@ function createMapStateToProps() {
}
const mapDispatchToProps = {
dispatchFetchTags: fetchTags,
dispatchFetchTagDetails: fetchTagDetails,
dispatchFetchDelayProfiles: fetchDelayProfiles,
dispatchFetchImportLists: fetchImportLists,
@@ -41,6 +42,7 @@ class MetadatasConnector extends Component {
componentDidMount() {
const {
dispatchFetchTags,
dispatchFetchTagDetails,
dispatchFetchDelayProfiles,
dispatchFetchImportLists,
@@ -50,6 +52,7 @@ class MetadatasConnector extends Component {
dispatchFetchDownloadClients
} = this.props;
dispatchFetchTags();
dispatchFetchTagDetails();
dispatchFetchDelayProfiles();
dispatchFetchImportLists();
@@ -72,6 +75,7 @@ class MetadatasConnector extends Component {
}
MetadatasConnector.propTypes = {
dispatchFetchTags: PropTypes.func.isRequired,
dispatchFetchTagDetails: PropTypes.func.isRequired,
dispatchFetchDelayProfiles: PropTypes.func.isRequired,
dispatchFetchImportLists: PropTypes.func.isRequired,

View File

@@ -31,19 +31,19 @@ export const firstDayOfWeekOptions = [
];
export const weekColumnOptions = [
{ key: 'ddd M/D', value: 'Tue 3/25' },
{ key: 'ddd MM/DD', value: 'Tue 03/25' },
{ key: 'ddd D/M', value: 'Tue 25/3' },
{ key: 'ddd DD/MM', value: 'Tue 25/03' }
{ key: 'ddd M/D', value: 'Tue 3/25', hint: 'ddd M/D' },
{ key: 'ddd MM/DD', value: 'Tue 03/25', hint: 'ddd MM/DD' },
{ key: 'ddd D/M', value: 'Tue 25/3', hint: 'ddd D/M' },
{ key: 'ddd DD/MM', value: 'Tue 25/03', hint: 'ddd DD/MM' }
];
const shortDateFormatOptions = [
{ key: 'MMM D YYYY', value: 'Mar 25 2014' },
{ key: 'DD MMM YYYY', value: '25 Mar 2014' },
{ key: 'MM/D/YYYY', value: '03/25/2014' },
{ key: 'MM/DD/YYYY', value: '03/25/2014' },
{ key: 'DD/MM/YYYY', value: '25/03/2014' },
{ key: 'YYYY-MM-DD', value: '2014-03-25' }
{ key: 'MMM D YYYY', value: 'Mar 25 2014', hint: 'MMM D YYYY' },
{ key: 'DD MMM YYYY', value: '25 Mar 2014', hint: 'DD MMM YYYY' },
{ key: 'MM/D/YYYY', value: '03/25/2014', hint: 'MM/D/YYYY' },
{ key: 'MM/DD/YYYY', value: '03/25/2014', hint: 'MM/DD/YYYY' },
{ key: 'DD/MM/YYYY', value: '25/03/2014', hint: 'DD/MM/YYYY' },
{ key: 'YYYY-MM-DD', value: '2014-03-25', hint: 'YYYY-MM-DD' }
];
const longDateFormatOptions = [

View File

@@ -0,0 +1,48 @@
import createFetchHandler from 'Store/Actions/Creators/createFetchHandler';
import { createThunk } from 'Store/thunks';
//
// Variables
const section = 'settings.indexerFlags';
//
// Actions Types
export const FETCH_INDEXER_FLAGS = 'settings/indexerFlags/fetchIndexerFlags';
//
// Action Creators
export const fetchIndexerFlags = createThunk(FETCH_INDEXER_FLAGS);
//
// Details
export default {
//
// State
defaultState: {
isFetching: false,
isPopulated: false,
error: null,
items: []
},
//
// Action Handlers
actionHandlers: {
[FETCH_INDEXER_FLAGS]: createFetchHandler(section, '/indexerFlag')
},
//
// Reducers
reducers: {
}
};

View File

@@ -97,7 +97,7 @@ export const persistState = [
'calendar.view',
'calendar.selectedFilterKey',
'calendar.options',
'seriesIndex.customFilters'
'calendar.customFilters'
];
//

View File

@@ -129,6 +129,15 @@ export const defaultState = {
isVisible: false,
isSortable: true
},
{
name: 'indexerFlags',
columnLabel: () => translate('IndexerFlags'),
label: React.createElement(Icon, {
name: icons.FLAG,
title: () => translate('IndexerFlags')
}),
isVisible: false
},
{
name: 'status',
label: () => translate('Status'),

View File

@@ -161,9 +161,12 @@ export const actionHandlers = handleThunks({
const episodeFile = data.find((f) => f.id === id);
props.qualityCutoffNotMet = episodeFile.qualityCutoffNotMet;
props.customFormats = episodeFile.customFormats;
props.customFormatScore = episodeFile.customFormatScore;
props.languages = file.languages;
props.quality = file.quality;
props.releaseGroup = file.releaseGroup;
props.indexerFlags = file.indexerFlags;
return updateItem({
section,

View File

@@ -162,6 +162,7 @@ export const actionHandlers = handleThunks({
quality: item.quality,
languages: item.languages,
releaseGroup: item.releaseGroup,
indexerFlags: item.indexerFlags,
downloadId: item.downloadId
};
});

View File

@@ -1,4 +1,5 @@
import { createAction } from 'redux-actions';
import indexerFlags from 'Store/Actions/Settings/indexerFlags';
import { handleThunks } from 'Store/thunks';
import createHandleActions from './Creators/createHandleActions';
import autoTaggings from './Settings/autoTaggings';
@@ -37,6 +38,7 @@ export * from './Settings/general';
export * from './Settings/importListOptions';
export * from './Settings/importLists';
export * from './Settings/importListExclusions';
export * from './Settings/indexerFlags';
export * from './Settings/indexerOptions';
export * from './Settings/indexers';
export * from './Settings/languages';
@@ -72,6 +74,7 @@ export const defaultState = {
importLists: importLists.defaultState,
importListExclusions: importListExclusions.defaultState,
importListOptions: importListOptions.defaultState,
indexerFlags: indexerFlags.defaultState,
indexerOptions: indexerOptions.defaultState,
indexers: indexers.defaultState,
languages: languages.defaultState,
@@ -116,6 +119,7 @@ export const actionHandlers = handleThunks({
...importLists.actionHandlers,
...importListExclusions.actionHandlers,
...importListOptions.actionHandlers,
...indexerFlags.actionHandlers,
...indexerOptions.actionHandlers,
...indexers.actionHandlers,
...languages.actionHandlers,
@@ -151,6 +155,7 @@ export const reducers = createHandleActions({
...importLists.reducers,
...importListExclusions.reducers,
...importListOptions.reducers,
...indexerFlags.reducers,
...indexerOptions.reducers,
...indexers.reducers,
...languages.reducers,

View File

@@ -0,0 +1,9 @@
import { createSelector } from 'reselect';
import AppState from 'App/State/AppState';
const createIndexerFlagsSelector = createSelector(
(state: AppState) => state.settings.indexerFlags,
(indexerFlags) => indexerFlags
);
export default createIndexerFlagsSelector;

View File

@@ -0,0 +1,6 @@
interface IndexerFlag {
id: number;
name: string;
}
export default IndexerFlag;

View File

@@ -146,7 +146,7 @@
"worker-loader": "3.0.8"
},
"volta": {
"node": "16.17.0",
"node": "20.11.1",
"yarn": "1.22.19"
}
}

View File

@@ -3,6 +3,7 @@
<TargetFrameworks>net6.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="GitHubActionsTestLogger" Version="2.3.3" />
<PackageReference Include="NBuilder" Version="6.1.0" />
</ItemGroup>
<ItemGroup>

View File

@@ -3,6 +3,7 @@
<TargetFrameworks>net6.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="GitHubActionsTestLogger" Version="2.3.3" />
<PackageReference Include="Selenium.Support" Version="3.141.0" />
<PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="111.0.5563.6400" />
</ItemGroup>

View File

@@ -2,6 +2,9 @@
<PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="GitHubActionsTestLogger" Version="2.3.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Host\Sonarr.Host.csproj" />
<ProjectReference Include="..\NzbDrone.Test.Common\Sonarr.Test.Common.csproj" />

View File

@@ -8,6 +8,7 @@ using NUnit.Framework;
using NzbDrone.Common.Disk;
using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.Download;
using NzbDrone.Core.History;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.MediaFiles.EpisodeImport;
using NzbDrone.Core.MediaFiles.Events;
@@ -66,6 +67,10 @@ namespace NzbDrone.Core.Test.MediaFiles.EpisodeImport
.Setup(s => s.UpgradeEpisodeFile(It.IsAny<EpisodeFile>(), It.IsAny<LocalEpisode>(), It.IsAny<bool>()))
.Returns(new EpisodeFileMoveResult());
Mocker.GetMock<IHistoryService>()
.Setup(x => x.FindByDownloadId(It.IsAny<string>()))
.Returns(new List<EpisodeHistory>());
_downloadClientItem = Builder<DownloadClientItem>.CreateNew()
.With(d => d.OutputPath = new OsPath(outputPath))
.Build();

View File

@@ -191,12 +191,23 @@ namespace NzbDrone.Core.Test.ParserTests.ParsingServiceTests
{
GivenParseResultSeriesDoesntMatchSearchCriteria();
Subject.Map(_parsedEpisodeInfo, 10, 10, _singleEpisodeSearchCriteria);
Subject.Map(_parsedEpisodeInfo, 0, 10, _singleEpisodeSearchCriteria);
Mocker.GetMock<ISeriesService>()
.Verify(v => v.FindByTvRageId(It.IsAny<int>()), Times.Once());
}
[Test]
public void should_not_FindByTvRageId_when_search_criteria_and_FindByTitle_matching_fails_and_tvdb_id_is_specified()
{
GivenParseResultSeriesDoesntMatchSearchCriteria();
Subject.Map(_parsedEpisodeInfo, 10, 10, _singleEpisodeSearchCriteria);
Mocker.GetMock<ISeriesService>()
.Verify(v => v.FindByTvRageId(It.IsAny<int>()), Times.Never());
}
[Test]
public void should_use_tvdbid_matching_when_alias_is_found()
{

View File

@@ -166,6 +166,8 @@ namespace NzbDrone.Core.Test.ParserTests
[TestCase("Series Title [HDTV 720p][Cap.101](website.com).mkv", "Series Title", 1, 1)]
[TestCase("Босх: Спадок (S2E1) / Series: Legacy (S2E1) (2023) WEB-DL 1080p Ukr/Eng | sub Eng", "Series: Legacy", 2, 1)]
[TestCase("Босх: Спадок / Series: Legacy / S2E1 of 10 (2023) WEB-DL 1080p Ukr/Eng | sub Eng", "Series: Legacy", 2, 1)]
[TestCase("Titles.s06e01.1999.BDRip.1080p.Ukr.Eng.AC3.Hurtom.TNU.Tenax555", "Titles", 6, 1)]
[TestCase("Titles.s06.01.1999.BDRip.1080p.Ukr.Eng.AC3.Hurtom.TNU.Tenax555", "Titles", 6, 1)]
// [TestCase("", "", 0, 0)]
public void should_parse_single_episode(string postTitle, string title, int seasonNumber, int episodeNumber)

View File

@@ -4,6 +4,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="2.0.123" />
<PackageReference Include="GitHubActionsTestLogger" Version="2.3.3" />
<PackageReference Include="NBuilder" Version="6.1.0" />
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
</ItemGroup>

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.Indexers;
using NzbDrone.Core.Languages;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Qualities;
using NzbDrone.Core.Tv;
@@ -20,6 +21,7 @@ namespace NzbDrone.Core.Blocklisting
public long? Size { get; set; }
public DownloadProtocol Protocol { get; set; }
public string Indexer { get; set; }
public IndexerFlags IndexerFlags { get; set; }
public string Message { get; set; }
public string TorrentInfoHash { get; set; }
public List<Language> Languages { get; set; }

View File

@@ -174,20 +174,25 @@ namespace NzbDrone.Core.Blocklisting
public void Handle(DownloadFailedEvent message)
{
var blocklist = new Blocklist
{
SeriesId = message.SeriesId,
EpisodeIds = message.EpisodeIds,
SourceTitle = message.SourceTitle,
Quality = message.Quality,
Date = DateTime.UtcNow,
PublishedDate = DateTime.Parse(message.Data.GetValueOrDefault("publishedDate")),
Size = long.Parse(message.Data.GetValueOrDefault("size", "0")),
Indexer = message.Data.GetValueOrDefault("indexer"),
Protocol = (DownloadProtocol)Convert.ToInt32(message.Data.GetValueOrDefault("protocol")),
Message = message.Message,
TorrentInfoHash = message.Data.GetValueOrDefault("torrentInfoHash"),
Languages = message.Languages
};
{
SeriesId = message.SeriesId,
EpisodeIds = message.EpisodeIds,
SourceTitle = message.SourceTitle,
Quality = message.Quality,
Date = DateTime.UtcNow,
PublishedDate = DateTime.Parse(message.Data.GetValueOrDefault("publishedDate")),
Size = long.Parse(message.Data.GetValueOrDefault("size", "0")),
Indexer = message.Data.GetValueOrDefault("indexer"),
Protocol = (DownloadProtocol)Convert.ToInt32(message.Data.GetValueOrDefault("protocol")),
Message = message.Message,
TorrentInfoHash = message.Data.GetValueOrDefault("torrentInfoHash"),
Languages = message.Languages
};
if (Enum.TryParse(message.Data.GetValueOrDefault("indexerFlags"), true, out IndexerFlags flags))
{
blocklist.IndexerFlags = flags;
}
_blocklistRepository.Insert(blocklist);
}

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -39,7 +40,8 @@ namespace NzbDrone.Core.CustomFormats
EpisodeInfo = remoteEpisode.ParsedEpisodeInfo,
Series = remoteEpisode.Series,
Size = size,
Languages = remoteEpisode.Languages
Languages = remoteEpisode.Languages,
IndexerFlags = remoteEpisode.Release?.IndexerFlags ?? 0
};
return ParseCustomFormat(input);
@@ -73,7 +75,8 @@ namespace NzbDrone.Core.CustomFormats
EpisodeInfo = episodeInfo,
Series = series,
Size = blocklist.Size ?? 0,
Languages = blocklist.Languages
Languages = blocklist.Languages,
IndexerFlags = blocklist.IndexerFlags
};
return ParseCustomFormat(input);
@@ -84,6 +87,7 @@ namespace NzbDrone.Core.CustomFormats
var parsed = Parser.Parser.ParseTitle(history.SourceTitle);
long.TryParse(history.Data.GetValueOrDefault("size"), out var size);
Enum.TryParse(history.Data.GetValueOrDefault("indexerFlags"), true, out IndexerFlags indexerFlags);
var episodeInfo = new ParsedEpisodeInfo
{
@@ -99,7 +103,8 @@ namespace NzbDrone.Core.CustomFormats
EpisodeInfo = episodeInfo,
Series = series,
Size = size,
Languages = history.Languages
Languages = history.Languages,
IndexerFlags = indexerFlags
};
return ParseCustomFormat(input);
@@ -122,6 +127,7 @@ namespace NzbDrone.Core.CustomFormats
Series = localEpisode.Series,
Size = localEpisode.Size,
Languages = localEpisode.Languages,
IndexerFlags = localEpisode.IndexerFlags,
Filename = Path.GetFileName(localEpisode.Path)
};
@@ -191,6 +197,7 @@ namespace NzbDrone.Core.CustomFormats
Series = series,
Size = episodeFile.Size,
Languages = episodeFile.Languages,
IndexerFlags = episodeFile.IndexerFlags,
Filename = Path.GetFileName(episodeFile.RelativePath)
};

View File

@@ -10,6 +10,7 @@ namespace NzbDrone.Core.CustomFormats
public ParsedEpisodeInfo EpisodeInfo { get; set; }
public Series Series { get; set; }
public long Size { get; set; }
public IndexerFlags IndexerFlags { get; set; }
public List<Language> Languages { get; set; }
public string Filename { get; set; }

View File

@@ -0,0 +1,44 @@
using System;
using FluentValidation;
using NzbDrone.Core.Annotations;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Validation;
namespace NzbDrone.Core.CustomFormats
{
public class IndexerFlagSpecificationValidator : AbstractValidator<IndexerFlagSpecification>
{
public IndexerFlagSpecificationValidator()
{
RuleFor(c => c.Value).NotEmpty();
RuleFor(c => c.Value).Custom((qualityValue, context) =>
{
if (!Enum.IsDefined(typeof(IndexerFlags), qualityValue))
{
context.AddFailure($"Invalid indexer flag condition value: {qualityValue}");
}
});
}
}
public class IndexerFlagSpecification : CustomFormatSpecificationBase
{
private static readonly IndexerFlagSpecificationValidator Validator = new ();
public override int Order => 4;
public override string ImplementationName => "Indexer Flag";
[FieldDefinition(1, Label = "CustomFormatsSpecificationFlag", Type = FieldType.Select, SelectOptions = typeof(IndexerFlags))]
public int Value { get; set; }
protected override bool IsSatisfiedByWithoutNegate(CustomFormatInput input)
{
return input.IndexerFlags.HasFlag((IndexerFlags)Value);
}
public override NzbDroneValidationResult Validate()
{
return new NzbDroneValidationResult(Validator.Validate(this));
}
}
}

View File

@@ -0,0 +1,15 @@
using FluentMigrator;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(202)]
public class add_indexer_flags : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
Alter.Table("Blocklist").AddColumn("IndexerFlags").AsInt32().WithDefaultValue(0);
Alter.Table("EpisodeFiles").AddColumn("IndexerFlags").AsInt32().WithDefaultValue(0);
}
}
}

View File

@@ -46,25 +46,34 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
return false;
}
var qualityRevisionComapre = newQuality?.Revision.CompareTo(currentQuality.Revision);
var qualityRevisionCompare = newQuality?.Revision.CompareTo(currentQuality.Revision);
// Accept unless the user doesn't want to prefer propers, optionally they can
// use preferred words to prefer propers/repacks over non-propers/repacks.
if (downloadPropersAndRepacks != ProperDownloadTypes.DoNotPrefer &&
qualityRevisionComapre > 0)
qualityRevisionCompare > 0)
{
_logger.Debug("New item has a better quality revision, skipping. Existing: {0}. New: {1}", currentQuality, newQuality);
return true;
}
// Reject unless the user does not prefer propers/repacks and it's a revision downgrade.
if (downloadPropersAndRepacks != ProperDownloadTypes.DoNotPrefer &&
qualityRevisionCompare < 0)
{
_logger.Debug("Existing item has a better quality revision, skipping. Existing: {0}. New: {1}", currentQuality, newQuality);
return false;
}
var currentFormatScore = qualityProfile.CalculateCustomFormatScore(currentCustomFormats);
var newFormatScore = qualityProfile.CalculateCustomFormatScore(newCustomFormats);
// Reject unless the user does not prefer propers/repacks and it's a revision downgrade.
if (downloadPropersAndRepacks != ProperDownloadTypes.DoNotPrefer &&
qualityRevisionComapre < 0)
if (qualityProfile.UpgradeAllowed && currentFormatScore >= qualityProfile.CutoffFormatScore)
{
_logger.Debug("Existing item has a better quality revision, skipping. Existing: {0}. New: {1}", currentQuality, newQuality);
_logger.Debug("Existing item meets cut-off for custom formats, skipping. Existing: [{0}] ({1}). Cutoff score: {2}",
currentCustomFormats.ConcatToString(),
currentFormatScore,
qualityProfile.CutoffFormatScore);
return false;
}
@@ -123,7 +132,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
return true;
}
_logger.Debug("Existing item meets cut-off. skipping. Existing: {0}", currentQuality);
_logger.Debug("Existing item meets cut-off, skipping. Existing: {0}", currentQuality);
return false;
}

View File

@@ -59,13 +59,18 @@ namespace NzbDrone.Core.Download
{
var indexer = _indexerFactory.Find(indexerId);
if (indexer != null && indexer.DownloadClientId > 0)
if (indexer is { DownloadClientId: > 0 })
{
var client = availableProviders.SingleOrDefault(d => d.Definition.Id == indexer.DownloadClientId);
if (client == null || (filterBlockedClients && blockedProviders.Contains(client.Definition.Id)))
if (client == null)
{
throw new DownloadClientUnavailableException($"Indexer specified download client is not available");
throw new DownloadClientUnavailableException($"Indexer specified download client does not exist for {indexer.Name}");
}
if (filterBlockedClients && blockedProviders.Contains(client.Definition.Id))
{
throw new DownloadClientUnavailableException($"Indexer specified download client is not available due to recent failures for {indexer.Name}");
}
return client;

View File

@@ -10,6 +10,7 @@ using NzbDrone.Core.Download.History;
using NzbDrone.Core.History;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Parser;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Tv.Events;
@@ -109,10 +110,11 @@ namespace NzbDrone.Core.Download.TrackedDownloads
try
{
var parsedEpisodeInfo = Parser.Parser.ParseTitle(trackedDownload.DownloadItem.Title);
var historyItems = _historyService.FindByDownloadId(downloadItem.DownloadId)
.OrderByDescending(h => h.Date)
.ToList();
.OrderByDescending(h => h.Date)
.ToList();
var parsedEpisodeInfo = Parser.Parser.ParseTitle(trackedDownload.DownloadItem.Title);
if (parsedEpisodeInfo != null)
{
@@ -134,12 +136,11 @@ namespace NzbDrone.Core.Download.TrackedDownloads
var firstHistoryItem = historyItems.First();
var grabbedEvent = historyItems.FirstOrDefault(v => v.EventType == EpisodeHistoryEventType.Grabbed);
trackedDownload.Indexer = grabbedEvent?.Data["indexer"];
trackedDownload.Indexer = grabbedEvent?.Data?.GetValueOrDefault("indexer");
trackedDownload.Added = grabbedEvent?.Date;
if (parsedEpisodeInfo == null ||
trackedDownload.RemoteEpisode == null ||
trackedDownload.RemoteEpisode.Series == null ||
trackedDownload.RemoteEpisode?.Series == null ||
trackedDownload.RemoteEpisode.Episodes.Empty())
{
// Try parsing the original source title and if that fails, try parsing it as a special
@@ -155,6 +156,13 @@ namespace NzbDrone.Core.Download.TrackedDownloads
.Select(h => h.EpisodeId).Distinct());
}
}
if (trackedDownload.RemoteEpisode != null &&
Enum.TryParse(grabbedEvent?.Data?.GetValueOrDefault("indexerFlags"), true, out IndexerFlags flags))
{
trackedDownload.RemoteEpisode.Release ??= new ReleaseInfo();
trackedDownload.RemoteEpisode.Release.IndexerFlags = flags;
}
}
// Calculate custom formats

View File

@@ -169,6 +169,7 @@ namespace NzbDrone.Core.History
history.Data.Add("CustomFormatScore", message.Episode.CustomFormatScore.ToString());
history.Data.Add("SeriesMatchType", message.Episode.SeriesMatchType.ToString());
history.Data.Add("ReleaseSource", message.Episode.ReleaseSource.ToString());
history.Data.Add("IndexerFlags", message.Episode.Release.IndexerFlags.ToString());
if (!message.Episode.ParsedEpisodeInfo.ReleaseHash.IsNullOrWhiteSpace())
{
@@ -201,16 +202,16 @@ namespace NzbDrone.Core.History
foreach (var episode in message.EpisodeInfo.Episodes)
{
var history = new EpisodeHistory
{
EventType = EpisodeHistoryEventType.DownloadFolderImported,
Date = DateTime.UtcNow,
Quality = message.EpisodeInfo.Quality,
SourceTitle = message.ImportedEpisode.SceneName ?? Path.GetFileNameWithoutExtension(message.EpisodeInfo.Path),
SeriesId = message.ImportedEpisode.SeriesId,
EpisodeId = episode.Id,
DownloadId = downloadId,
Languages = message.EpisodeInfo.Languages
};
{
EventType = EpisodeHistoryEventType.DownloadFolderImported,
Date = DateTime.UtcNow,
Quality = message.EpisodeInfo.Quality,
SourceTitle = message.ImportedEpisode.SceneName ?? Path.GetFileNameWithoutExtension(message.EpisodeInfo.Path),
SeriesId = message.ImportedEpisode.SeriesId,
EpisodeId = episode.Id,
DownloadId = downloadId,
Languages = message.EpisodeInfo.Languages
};
history.Data.Add("FileId", message.ImportedEpisode.Id.ToString());
history.Data.Add("DroppedPath", message.EpisodeInfo.Path);
@@ -220,6 +221,7 @@ namespace NzbDrone.Core.History
history.Data.Add("ReleaseGroup", message.EpisodeInfo.ReleaseGroup);
history.Data.Add("CustomFormatScore", message.EpisodeInfo.CustomFormatScore.ToString());
history.Data.Add("Size", message.EpisodeInfo.Size.ToString());
history.Data.Add("IndexerFlags", message.ImportedEpisode.IndexerFlags.ToString());
_historyRepository.Insert(history);
}
@@ -280,6 +282,7 @@ namespace NzbDrone.Core.History
history.Data.Add("Reason", message.Reason.ToString());
history.Data.Add("ReleaseGroup", message.EpisodeFile.ReleaseGroup);
history.Data.Add("Size", message.EpisodeFile.Size.ToString());
history.Data.Add("IndexerFlags", message.EpisodeFile.IndexerFlags.ToString());
_historyRepository.Insert(history);
}
@@ -311,6 +314,7 @@ namespace NzbDrone.Core.History
history.Data.Add("RelativePath", relativePath);
history.Data.Add("ReleaseGroup", message.EpisodeFile.ReleaseGroup);
history.Data.Add("Size", message.EpisodeFile.Size.ToString());
history.Data.Add("IndexerFlags", message.EpisodeFile.IndexerFlags.ToString());
_historyRepository.Insert(history);
}
@@ -323,16 +327,16 @@ namespace NzbDrone.Core.History
foreach (var episodeId in message.EpisodeIds)
{
var history = new EpisodeHistory
{
EventType = EpisodeHistoryEventType.DownloadIgnored,
Date = DateTime.UtcNow,
Quality = message.Quality,
SourceTitle = message.SourceTitle,
SeriesId = message.SeriesId,
EpisodeId = episodeId,
DownloadId = message.DownloadId,
Languages = message.Languages
};
{
EventType = EpisodeHistoryEventType.DownloadIgnored,
Date = DateTime.UtcNow,
Quality = message.Quality,
SourceTitle = message.SourceTitle,
SeriesId = message.SeriesId,
EpisodeId = episodeId,
DownloadId = message.DownloadId,
Languages = message.Languages
};
history.Data.Add("DownloadClient", message.DownloadClientInfo.Type);
history.Data.Add("DownloadClientName", message.DownloadClientInfo.Name);

View File

@@ -81,7 +81,8 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet
Source = torrent.Source,
Container = torrent.Container,
Codec = torrent.Codec,
Resolution = torrent.Resolution
Resolution = torrent.Resolution,
IndexerFlags = GetIndexerFlags(torrent)
};
if (torrent.TvdbID is > 0)
@@ -100,6 +101,24 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet
return results;
}
private static IndexerFlags GetIndexerFlags(BroadcastheNetTorrent item)
{
IndexerFlags flags = 0;
flags |= IndexerFlags.Freeleech;
switch (item.Origin.ToUpperInvariant())
{
case "INTERNAL":
flags |= IndexerFlags.Internal;
break;
case "SCENE":
flags |= IndexerFlags.Scene;
break;
}
return flags;
}
private string CleanReleaseName(string releaseName)
{
return releaseName.Replace("\\", "");

View File

@@ -38,9 +38,7 @@ namespace NzbDrone.Core.Indexers.FileList
{
var id = result.Id;
// if (result.FreeLeech)
torrentInfos.Add(new TorrentInfo()
torrentInfos.Add(new TorrentInfo
{
Guid = $"FileList-{id}",
Title = result.Name,
@@ -50,13 +48,31 @@ namespace NzbDrone.Core.Indexers.FileList
Seeders = result.Seeders,
Peers = result.Leechers + result.Seeders,
PublishDate = result.UploadDate.ToUniversalTime(),
ImdbId = result.ImdbId
ImdbId = result.ImdbId,
IndexerFlags = GetIndexerFlags(result)
});
}
return torrentInfos.ToArray();
}
private static IndexerFlags GetIndexerFlags(FileListTorrent item)
{
IndexerFlags flags = 0;
if (item.FreeLeech)
{
flags |= IndexerFlags.Freeleech;
}
if (item.Internal)
{
flags |= IndexerFlags.Internal;
}
return flags;
}
private string GetDownloadUrl(string torrentId)
{
var url = new HttpUri(_settings.BaseUrl)

View File

@@ -16,6 +16,7 @@ namespace NzbDrone.Core.Indexers.FileList
public uint Files { get; set; }
[JsonProperty(PropertyName = "imdb")]
public string ImdbId { get; set; }
public bool Internal { get; set; }
[JsonProperty(PropertyName = "freeleech")]
public bool FreeLeech { get; set; }
[JsonProperty(PropertyName = "upload_date")]

View File

@@ -49,6 +49,7 @@ namespace NzbDrone.Core.Indexers.HDBits
foreach (var result in queryResults)
{
var id = result.Id;
torrentInfos.Add(new TorrentInfo
{
Guid = $"HDBits-{id}",
@@ -59,13 +60,31 @@ namespace NzbDrone.Core.Indexers.HDBits
InfoUrl = GetInfoUrl(id),
Seeders = result.Seeders,
Peers = result.Leechers + result.Seeders,
PublishDate = result.Added.ToUniversalTime()
PublishDate = result.Added.ToUniversalTime(),
IndexerFlags = GetIndexerFlags(result)
});
}
return torrentInfos.ToArray();
}
private static IndexerFlags GetIndexerFlags(TorrentQueryResponse item)
{
IndexerFlags flags = 0;
if (item.FreeLeech == "yes")
{
flags |= IndexerFlags.Freeleech;
}
if (item.TypeOrigin == 1)
{
flags |= IndexerFlags.Internal;
}
return flags;
}
private string GetDownloadUrl(string torrentId)
{
var url = new HttpUri(_settings.BaseUrl)

View File

@@ -78,8 +78,12 @@ namespace NzbDrone.Core.Indexers.Torznab
{
var torrentInfo = base.ProcessItem(item, releaseInfo) as TorrentInfo;
torrentInfo.TvdbId = GetTvdbId(item);
torrentInfo.TvRageId = GetTvRageId(item);
if (torrentInfo != null)
{
torrentInfo.TvdbId = GetTvdbId(item);
torrentInfo.TvRageId = GetTvRageId(item);
torrentInfo.IndexerFlags = GetFlags(item);
}
return torrentInfo;
}
@@ -214,6 +218,53 @@ namespace NzbDrone.Core.Indexers.Torznab
return base.GetPeers(item);
}
protected IndexerFlags GetFlags(XElement item)
{
IndexerFlags flags = 0;
var downloadFactor = TryGetFloatTorznabAttribute(item, "downloadvolumefactor", 1);
var uploadFactor = TryGetFloatTorznabAttribute(item, "uploadvolumefactor", 1);
if (downloadFactor == 0.5)
{
flags |= IndexerFlags.Halfleech;
}
if (downloadFactor == 0.75)
{
flags |= IndexerFlags.Freeleech25;
}
if (downloadFactor == 0.25)
{
flags |= IndexerFlags.Freeleech75;
}
if (downloadFactor == 0.0)
{
flags |= IndexerFlags.Freeleech;
}
if (uploadFactor == 2.0)
{
flags |= IndexerFlags.DoubleUpload;
}
var tags = TryGetMultipleTorznabAttributes(item, "tag");
if (tags.Any(t => t.EqualsIgnoreCase("internal")))
{
flags |= IndexerFlags.Internal;
}
if (tags.Any(t => t.EqualsIgnoreCase("scene")))
{
flags |= IndexerFlags.Scene;
}
return flags;
}
protected string TryGetTorznabAttribute(XElement item, string key, string defaultValue = "")
{
var attrElement = item.Elements(ns + "attr").FirstOrDefault(e => e.Attribute("name").Value.Equals(key, StringComparison.OrdinalIgnoreCase));
@@ -229,6 +280,13 @@ namespace NzbDrone.Core.Indexers.Torznab
return defaultValue;
}
protected float TryGetFloatTorznabAttribute(XElement item, string key, float defaultValue = 0)
{
var attr = TryGetTorznabAttribute(item, key, defaultValue.ToString());
return float.TryParse(attr, out var result) ? result : defaultValue;
}
protected List<string> TryGetMultipleTorznabAttributes(XElement item, string key)
{
var attrElements = item.Elements(ns + "attr").Where(e => e.Attribute("name").Value.Equals(key, StringComparison.OrdinalIgnoreCase));

View File

@@ -214,6 +214,7 @@
"ClearBlocklist": "Clear blocklist",
"ClearBlocklistMessageText": "Are you sure you want to clear all items from the blocklist?",
"ClickToChangeEpisode": "Click to change episode",
"ClickToChangeIndexerFlags": "Click to change indexer flags",
"ClickToChangeLanguage": "Click to change language",
"ClickToChangeQuality": "Click to change quality",
"ClickToChangeReleaseGroup": "Click to change release group",
@@ -276,6 +277,7 @@
"CustomFormatsLoadError": "Unable to load Custom Formats",
"CustomFormatsSettings": "Custom Formats Settings",
"CustomFormatsSettingsSummary": "Custom Formats and Settings",
"CustomFormatsSpecificationFlag": "Flag",
"CustomFormatsSpecificationLanguage": "Language",
"CustomFormatsSpecificationMaximumSize": "Maximum Size",
"CustomFormatsSpecificationMaximumSizeHelpText": "Release must be less than or equal to this size",
@@ -916,6 +918,7 @@
"Indexer": "Indexer",
"IndexerDownloadClientHealthCheckMessage": "Indexers with invalid download clients: {indexerNames}.",
"IndexerDownloadClientHelpText": "Specify which download client is used for grabs from this indexer",
"IndexerFlags": "Indexer Flags",
"IndexerHDBitsSettingsCategories": "Categories",
"IndexerHDBitsSettingsCategoriesHelpText": "If unspecified, all options are used.",
"IndexerHDBitsSettingsCodecs": "Codecs",
@@ -1749,6 +1752,7 @@
"SelectEpisodesModalTitle": "{modalTitle} - Select Episode(s)",
"SelectFolder": "Select Folder",
"SelectFolderModalTitle": "{modalTitle} - Select Folder",
"SelectIndexerFlags": "Select Indexer Flags",
"SelectLanguage": "Select Language",
"SelectLanguageModalTitle": "{modalTitle} - Select Language",
"SelectLanguages": "Select Languages",
@@ -1790,6 +1794,8 @@
"SeriesType": "Series Type",
"SeriesTypes": "Series Types",
"SeriesTypesHelpText": "Series type is used for renaming, parsing and searching",
"SetIndexerFlags": "Set Indexer Flags",
"SetIndexerFlagsModalTitle": "{modalTitle} - Set Indexer Flags",
"SetPermissions": "Set Permissions",
"SetPermissionsLinuxHelpText": "Should chmod be run when files are imported/renamed?",
"SetPermissionsLinuxHelpTextWarning": "If you're unsure what these settings do, do not alter them.",

View File

@@ -39,10 +39,10 @@
"ApiKey": "Clave de API",
"AnimeEpisodeFormat": "Formato de Episodio de Anime",
"ApplicationUrlHelpText": "La URL externa de la aplicación incluyendo http(s)://, puerto y URL base",
"ApplyTagsHelpTextReplace": "Reemplazar: Reemplazar las etiquetas con las etiquetas introducidas (no introducir etiquetas para eliminar todas las etiquetas)",
"ApplyTagsHelpTextReplace": "Reemplazar: Sustituye las etiquetas por las introducidas (introduce \"no tags\" para borrar todas las etiquetas)",
"ApplicationURL": "URL de la aplicación",
"Authentication": "Autenticación",
"AuthForm": "Formularios (página de inicio de sesión)",
"AuthForm": "Formularios (Página de inicio de sesión)",
"AuthenticationMethodHelpText": "Requerir nombre de usuario y contraseña para acceder {appName}",
"AuthenticationRequired": "Autenticación requerida",
"AutoTaggingLoadError": "No se pudo cargar el etiquetado automático",
@@ -111,7 +111,7 @@
"Yes": "Sí",
"ApplyTagsHelpTextHowToApplyDownloadClients": "Cómo añadir etiquetas a los clientes de descargas seleccionados",
"ApplyTagsHelpTextHowToApplyImportLists": "Cómo añadir etiquetas a las listas de importación seleccionadas",
"ApplyTagsHelpTextHowToApplyIndexers": "Cómo añadir etiquetas a los indexadores seleccionados",
"ApplyTagsHelpTextHowToApplyIndexers": "Cómo aplicar etiquetas a los indexadores seleccionados",
"ApplyTagsHelpTextHowToApplySeries": "Cómo añadir etiquetas a las series seleccionadas",
"Series": "Series",
"Folder": "Carpeta",
@@ -129,8 +129,8 @@
"Episode": "Episodio",
"Activity": "Actividad",
"AddNew": "Añadir Nuevo",
"ApplyTagsHelpTextAdd": "Añadir: Añadir las etiquetas la lista existente de etiquetas",
"ApplyTagsHelpTextRemove": "Eliminar: Eliminar las etiquetas introducidas",
"ApplyTagsHelpTextAdd": "Añadir: Añade las etiquetas a la lista de etiquetas existente",
"ApplyTagsHelpTextRemove": "Eliminar: Elimina las etiquetas introducidas",
"Blocklist": "Lista de bloqueos",
"Grabbed": "Añadido",
"Genres": "Géneros",
@@ -217,7 +217,7 @@
"Absolute": "Absoluto",
"AddANewPath": "Añadir una nueva ruta",
"AddConditionImplementation": "Añadir Condición - {implementationName}",
"AppUpdated": "{appName} Actualizada",
"AppUpdated": "{appName} Actualizado",
"AutomaticUpdatesDisabledDocker": "Las actualizaciones automáticas no están soportadas directamente cuando se utiliza el mecanismo de actualización de Docker. Tendrá que actualizar la imagen del contenedor fuera de {appName} o utilizar un script",
"AuthenticationRequiredHelpText": "Cambiar para que las solicitudes requieran autenticación. No lo cambie a menos que entienda los riesgos.",
"AuthenticationRequiredWarning": "Para evitar el acceso remoto sin autenticación, {appName} ahora requiere que la autenticación esté habilitada. Opcionalmente puede desactivar la autenticación desde una dirección local.",
@@ -228,7 +228,7 @@
"AddDownloadClientImplementation": "Añadir Cliente de Descarga - {implementationName}",
"VideoDynamicRange": "Video de Rango Dinámico",
"AuthenticationMethodHelpTextWarning": "Por favor selecciona un método válido de autenticación",
"AddCustomFilter": "Añadir filtro personalizado",
"AddCustomFilter": "Añadir Filtro Personalizado",
"BypassDelayIfAboveCustomFormatScoreMinimumScore": "Puntuación mínima de formato personalizado",
"CountIndexersSelected": "{count} indexador(es) seleccionado(s)",
"CouldNotFindResults": "No se pudieron encontrar resultados para '{term}'",
@@ -246,16 +246,16 @@
"DeleteQualityProfileMessageText": "¿Seguro que quieres eliminar el perfil de calidad {name}?",
"DeleteRootFolderMessageText": "¿Está seguro de querer eliminar la carpeta raíz '{path}'?",
"DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {count} cliente(s) de descarga seleccionado(s)?",
"ConnectionLostToBackend": "{appName} ha perdido su conexión con el backend y necesitará ser recargada para restaurar su funcionalidad.",
"ConnectionLostToBackend": "{appName} ha perdido su conexión con el backend y tendrá que ser recargado para recuperar su funcionalidad.",
"CalendarOptions": "Opciones de Calendario",
"BypassDelayIfAboveCustomFormatScoreHelpText": "Habilitar ignorar cuando la versión tenga una puntuación superior a la puntuación mínima configurada para el formato personalizado",
"Default": "Por defecto",
"DeleteBackupMessageText": "Seguro que quieres eliminar la copia de seguridad '{name}'?",
"DeleteAutoTagHelpText": "¿Está seguro de querer eliminar el etiquetado automático '{name}'?",
"AddImportListImplementation": "Añadir lista de importación - {implementationName}",
"AddIndexerImplementation": "Añadir Indexador - {implementationName}",
"AddIndexerImplementation": "Agregar Indexador - {implementationName}",
"AutoRedownloadFailed": "Descarga fallida",
"ConnectionLostReconnect": "Radarr intentará conectarse automáticamente, o haz clic en el botón de recarga abajo.",
"ConnectionLostReconnect": "{appName} intentará conectarse automáticamente, o puede hacer clic en recargar abajo.",
"CustomFormatJson": "Formato JSON personalizado",
"CountDownloadClientsSelected": "{count} cliente(s) de descarga seleccionado(s)",
"DeleteImportList": "Eliminar Lista(s) de Importación",
@@ -266,7 +266,7 @@
"DeleteSelectedImportListsMessageText": "Seguro que quieres eliminar {count} lista(s) de importación seleccionada(s)?",
"DeletedReasonUpgrade": "Se ha borrado el archivo para importar una versión mejorada",
"DeleteTagMessageText": "¿Está seguro de querer eliminar la etiqueta '{label}'?",
"DisabledForLocalAddresses": "Desactivado para direcciones locales",
"DisabledForLocalAddresses": "Deshabilitado para Direcciones Locales",
"DeletedReasonManual": "El archivo fue borrado por vía UI",
"ClearBlocklist": "Limpiar lista de bloqueos",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirma la nueva contraseña",
@@ -370,7 +370,7 @@
"AllFiles": "Todos los archivos",
"Any": "Cualquiera",
"AirsTomorrowOn": "Mañana a las {hora} en {networkLabel}",
"AppUpdatedVersion": "{appName} ha sido actualizada a la version `{version}`, para ver los cambios necesitara recargar {appName} ",
"AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitará recargar {appName} ",
"AddListExclusionSeriesHelpText": "Evitar que las series sean agregadas a {appName} por las listas",
"CalendarLegendEpisodeDownloadedTooltip": "El episodio fue descargado y ordenado",
"CalendarLegendEpisodeDownloadingTooltip": "El episodio se esta descargando actualmente",
@@ -402,10 +402,10 @@
"FormatDateTime": "{formattedDate} {formattedTime}",
"DownloadIgnored": "Descarga ignorada",
"EditImportListImplementation": "Añadir lista de importación - {implementationName}",
"EditIndexerImplementation": "Editar indexador - {implementationName}",
"EditIndexerImplementation": "Editar Indexador - {implementationName}",
"EnableProfile": "Habilitar perfil",
"False": "Falso",
"EditDownloadClientImplementation": "Añadir Cliente de Descarga - {implementationName}",
"EditDownloadClientImplementation": "Editar Cliente de Descarga - {implementationName}",
"FormatAgeMinutes": "minutos",
"UnknownEventTooltip": "Evento desconocído",
"DownloadWarning": "Alerta de descarga: {warningMessage}",
@@ -433,7 +433,7 @@
"CountSelectedFile": "{selectedCount} archivo seleccionado",
"CountSeriesSelected": "{count} serie seleccionada",
"CreateGroup": "Crea un grupo",
"CustomFormatsLoadError": "No se pueden cargar formatos personalizados",
"CustomFormatsLoadError": "No se pudo cargar Formatos Personalizados",
"CustomFormatsSettings": "Configuración de formatos personalizados",
"CustomFormatsSettingsSummary": "Formatos y configuraciones personalizados",
"CutoffUnmet": "Umbrales no alcanzados",
@@ -442,7 +442,7 @@
"DelayMinutes": "{delay} Minutos",
"Continuing": "Continua",
"CustomFormats": "Formatos personalizados",
"AddRootFolderError": "No se puede agregar la carpeta raíz",
"AddRootFolderError": "No se pudoagregar la carpeta raíz",
"CollapseAll": "Desplegar todo",
"DailyEpisodeTypeDescription": "Episodios publicados diariamente o con menos frecuencia que utilizan año, mes y día (2023-08-04)",
"DefaultNotFoundMessage": "Debes estar perdido, no hay nada que ver aquí.",
@@ -463,7 +463,7 @@
"InteractiveImportLoadError": "No se pueden cargar elementos de la importación manual",
"InteractiveImportNoFilesFound": "No se han encontrado archivos de vídeo en la carpeta seleccionada",
"InteractiveImportNoQuality": "La calidad debe elegirse para cada archivo seleccionado",
"InteractiveSearchModalHeader": "Búsqueda interactiva",
"InteractiveSearchModalHeader": "Búsqueda Interactiva",
"InvalidUILanguage": "Su interfaz de usuario está configurada en un idioma no válido, corríjalo y guarde la configuración",
"ChownGroup": "Cambiar grupo propietario",
"DelayProfileProtocol": "Protocolo: {preferredProtocol}",
@@ -514,7 +514,7 @@
"DeleteSpecificationHelpText": "Esta seguro que desea borrar la especificacion '{name}'?",
"DeleteSelectedIndexers": "Borrar indexer(s)",
"DeleteIndexer": "Borrar Indexer",
"DeleteSelectedDownloadClients": "Borrar gestor de descarga(s)",
"DeleteSelectedDownloadClients": "Borrar Cliente de Descarga(s)",
"DeleteSeriesFolderCountConfirmation": "Esta seguro que desea eliminar '{count}' series seleccionadas?",
"DeleteSeriesFolders": "Eliminar directorios de series",
"DeletedSeriesDescription": "Serie fue eliminada de TheTVDB",
@@ -586,9 +586,9 @@
"DownloadClientNzbgetValidationKeepHistoryOverMaxDetail": "La opción KeepHistory de NzbGet está establecida demasiado alta.",
"UpgradeUntilEpisodeHelpText": "Una vez alcanzada esta calidad {appName} no se descargarán más episodios",
"DownloadClientDelugeValidationLabelPluginFailureDetail": "{appName} no pudo añadir la etiqueta a {clientName}.",
"DownloadClientDownloadStationProviderMessage": "{appName} no puede conectarse a la Estación de descarga si la Autenticación de 2 factores está habilitada en tu cuenta de DSM",
"DownloadClientDownloadStationProviderMessage": "{appName} no pudo conectarse a la Estación de Descarga si la Autenticación de 2 factores está habilitada en su cuenta de DSM",
"DownloadClientDownloadStationSettingsDirectoryHelpText": "Carpeta compartida opcional en la que poner las descargas, dejar en blanco para usar la ubicación de la Estación de Descarga predeterminada",
"DownloadClientPriorityHelpText": "Prioridad del cliente de descarga desde 1 (la más alta) hasta 50 (la más baja). Predeterminada: 1. Se usa round-robin para clientes con la misma prioridad.",
"DownloadClientPriorityHelpText": "Prioridad del cliente de descarga desde 1 (la más alta) hasta 50 (la más baja). Por defecto: 1. Se usa Round-Robin para clientes con la misma prioridad.",
"DownloadClientDelugeValidationLabelPluginInactive": "Extensión de etiqueta no activada",
"DownloadClientQbittorrentValidationRemovesAtRatioLimit": "qBittorrent está configurado para eliminar torrents cuando alcanzan su Límite de Ratio de Compartición",
"UpgradeUntilCustomFormatScoreEpisodeHelpText": "Una vez alcanzada esta puntuación de formato personalizada {appName} no capturará más lanzamientos de episodios",
@@ -636,7 +636,7 @@
"DownloadClientValidationUnableToConnect": "No es posible conectarse a {clientName}",
"DownloadPropersAndRepacksHelpTextWarning": "Usar formatos personalizados para actualizaciones automáticas a propers/repacks",
"DownloadStationStatusExtracting": "Extrayendo: {progress}%",
"EditConnectionImplementation": "Editar conexión - {implementationName}",
"EditConnectionImplementation": "Editar Conexión - {implementationName}",
"EnableInteractiveSearch": "Habilitar Búsqueda Interactiva",
"EnableInteractiveSearchHelpText": "Se usará cuando se utilice la búsqueda interactiva",
"DoneEditingGroups": "Terminado de editar grupos",
@@ -657,7 +657,7 @@
"DownloadClientQbittorrentValidationCategoryRecommended": "Se recomienda una categoría",
"DownloadClientQbittorrentValidationCategoryRecommendedDetail": "{appName} no intentará importar descargas completadas sin una categoría.",
"DownloadClientQbittorrentValidationQueueingNotEnabledDetail": "Poner en cola el torrent no está habilitado en los ajustes de su qBittorrent. Habilítelo en qBittorrent o seleccione 'Último' como prioridad.",
"DownloadClientQbittorrentValidationRemovesAtRatioLimitDetail": "{appName} no podrá efectuar Manejo de descargas completadas como configurado. Puede arreglar esto en qBittorrent ('Herramientas -> Opciones...' en el menú) cambiando 'Opciones -> BitTorrent -> Límite de ratio ' de 'Eliminarlas' a 'Pausarlas'",
"DownloadClientQbittorrentValidationRemovesAtRatioLimitDetail": "{appName} no podrá efectuar el Manejo de Descargas Completadas según lo configurado. Puede arreglar esto en qBittorrent ('Herramientas -> Opciones...' en el menú) cambiando 'Opciones -> BitTorrent -> Límite de ratio ' de 'Eliminarlas' a 'Pausarlas'",
"DownloadClientRTorrentSettingsAddStopped": "Añadir parados",
"DownloadClientRTorrentSettingsAddStoppedHelpText": "Habilitarlo añadirá los torrents y magnets a rTorrent en un estado parado. Esto puede romper los archivos magnet.",
"DownloadClientRTorrentSettingsDirectoryHelpText": "Ubicación opcional en la que poner las descargas, déjelo en blanco para usar la ubicación predeterminada de rTorrent",
@@ -740,7 +740,7 @@
"EnableCompletedDownloadHandlingHelpText": "Importar automáticamente las descargas completas del gestor de descargas",
"EnableInteractiveSearchHelpTextWarning": "Buscar no está soportado por este indexador",
"EnableRss": "Habilitar RSS",
"Ended": "Finalizado",
"Ended": "Terminado",
"EpisodeFileRenamed": "Archivo de episodio renombrado",
"EpisodeFileRenamedTooltip": "Archivo de episodio renombrado",
"EpisodeFileMissingTooltip": "Archivo de episodio faltante",
@@ -954,7 +954,7 @@
"ImportListsSonarrSettingsFullUrl": "URL completa",
"ImportListsSonarrSettingsQualityProfilesHelpText": "Perfiles de calidad de la instancia de la fuente de la que importar",
"ImportListsSonarrSettingsRootFoldersHelpText": "Carpetas raíz de la instancia de la fuente de la que importar",
"ImportListsTraktSettingsAdditionalParameters": "Parámetros adicionales",
"ImportListsTraktSettingsAdditionalParameters": "Parámetros Adicionales",
"ImportListsTraktSettingsAdditionalParametersHelpText": "Parámetros adicionales de la API de Trakt",
"ImportListsTraktSettingsAuthenticateWithTrakt": "Autenticar con Trakt",
"ImportListsTraktSettingsGenresHelpText": "Filtrar series por género de Trakt (separados por coma) solo para listas populares",
@@ -1051,7 +1051,7 @@
"ImportListsAniListSettingsImportWatchingHelpText": "Lista: Viendo actualmente",
"ImportListsAniListSettingsImportNotYetReleased": "Importar Aún sin lanzar",
"ImportListsSonarrSettingsFullUrlHelpText": "URL, incluyendo puerto, de la instancia de {appName} de la que importar",
"IndexerPriorityHelpText": "Prioridad del indexador desde 1 (la más alta) hasta 50 (la más baja). Predeterminado: 25. Usada para desempatar lanzamientos iguales cuando se capturan, {appName} seguirá usando todos los indexadores habilitados para Sincronización de RSS y Búsqueda.",
"IndexerPriorityHelpText": "Prioridad del Indexador de 1 (la más alta) a 50 (la más baja). Por defecto: 25. Usada para desempatar lanzamientos iguales cuando se capturan, {appName} seguirá usando todos los indexadores habilitados para Sincronización de RSS y Búsqueda",
"IncludeHealthWarnings": "Incluir avisos de salud",
"IndexerJackettAllHealthCheckMessage": "Indexadores usan el endpoint de Jackett no soportado 'todo': {indexerNames}",
"HourShorthand": "h",
@@ -1066,5 +1066,171 @@
"IndexerRssNoIndexersEnabledHealthCheckMessage": "No hay indexadores disponibles con la sincronización RSS activada, {appName} no capturará nuevos estrenos automáticamente",
"IndexerSearchNoAutomaticHealthCheckMessage": "No hay indexadores disponibles con Búsqueda Automática activada, {appName} no proporcionará ningún resultado de búsquedas automáticas",
"IndexerSearchNoAvailableIndexersHealthCheckMessage": "Todos los indexadores con capacidad de búsqueda no están disponibles temporalmente debido a errores recientes del indexadores",
"IndexerSearchNoInteractiveHealthCheckMessage": "No hay indexadores disponibles con Búsqueda Interactiva activada, {appName} no proporcionará ningún resultado de búsquedas interactivas"
"IndexerSearchNoInteractiveHealthCheckMessage": "No hay indexadores disponibles con Búsqueda Interactiva activada, {appName} no proporcionará ningún resultado de búsquedas interactivas",
"PasswordConfirmation": "Confirmación de Contraseña",
"IndexerSettingsAdditionalParameters": "Parámetros Adicionales",
"IndexerSettingsAllowZeroSizeHelpText": "Activar esta opción le permitirá utilizar fuentes que no especifiquen el tamaño del lanzamiento, pero tenga cuidado, no se realizarán comprobaciones relacionadas con el tamaño.",
"IndexerSettingsAllowZeroSize": "Permitir Tamaño Cero",
"StopSelecting": "Detener la Selección",
"IndexerSettingsCookie": "Cookie",
"IndexerSettingsCategories": "Categorías",
"IndexerSettingsMinimumSeedersHelpText": "Número mínimo de semillas necesario.",
"IndexerSettingsSeedRatio": "Proporción de Semillado",
"StartupDirectory": "Directorio de Arranque",
"IndexerSettingsAdditionalParametersNyaa": "Parámetros Adicionales",
"IndexerSettingsPasskey": "Clave de acceso",
"IndexerSettingsSeasonPackSeedTime": "Tiempo de Semillado de los Pack de Temporada",
"IndexerSettingsAnimeStandardFormatSearch": "Formato Estándar de Búsqueda de Anime",
"IndexerSettingsAnimeStandardFormatSearchHelpText": "Buscar también anime utilizando la numeración estándar",
"IndexerSettingsApiPathHelpText": "Ruta a la api, normalmente {url}",
"IndexerSettingsSeasonPackSeedTimeHelpText": "La cantidad de tiempo que un torrent de pack de temporada debe ser compartido antes de que se detenga, dejar vacío utiliza el valor por defecto del cliente de descarga",
"IndexerSettingsSeedTime": "Tiempo de Semillado",
"IndexerStatusAllUnavailableHealthCheckMessage": "Todos los indexadores no están disponibles debido a errores",
"IndexerValidationCloudFlareCaptchaExpired": "El token CAPTCHA de CloudFlare ha caducado, actualícelo.",
"NotificationsDiscordSettingsAuthor": "Autor",
"IndexerSettingsApiUrl": "URL de la API",
"NoIndexersFound": "No se han encontrado indexadores",
"IndexerSettingsAdditionalNewznabParametersHelpText": "Ten en cuenta que si cambias la categoría tendrás que añadir reglas requeridas/restringidas sobre los subgrupos para evitar ediciones en idiomas extranjeros.",
"IndexerSettingsApiUrlHelpText": "No cambie esto a menos que sepa lo que está haciendo. Ya que tu clave API será enviada a ese host.",
"NoDownloadClientsFound": "No se han encontrado clientes de descarga",
"IndexerSettingsAnimeCategories": "Categorías de Anime",
"IndexerSettingsMinimumSeeders": "Semillas mínimas",
"IndexerSettingsRssUrl": "URL de RSS",
"IndexerSettingsAnimeCategoriesHelpText": "Lista desplegable, dejar en blanco para desactivar anime",
"IndexerSettingsApiPath": "Ruta de la API",
"IndexerSettingsCookieHelpText": "Si su sitio requiere una cookie de inicio de sesión para acceder al RSS, tendrá que conseguirla a través de un navegador.",
"IndexerSettingsRssUrlHelpText": "Introduzca la URL de un canal RSS compatible con {indexer}",
"IndexerStatusUnavailableHealthCheckMessage": "Indexadores no disponibles debido a errores: {indexerNames}",
"IndexerHDBitsSettingsMediums": "Medios",
"IndexerSettingsSeedTimeHelpText": "La cantidad de tiempo que un torrent debe ser compartido antes de que se detenga, dejar vacío utiliza el valor por defecto del cliente de descarga",
"IndexerValidationCloudFlareCaptchaRequired": "Sitio protegido por CloudFlare CAPTCHA. Se requiere un token CAPTCHA válido.",
"NotificationsEmailSettingsUseEncryption": "Usar Cifrado",
"LastDuration": "Última Duración",
"LastExecution": "Última Ejecución",
"IndexerSettingsCategoriesHelpText": "Lista desplegable, dejar en blanco para desactivar los programas estándar/diarios",
"IndexerSettingsWebsiteUrl": "URL del Sitio Web",
"OnHealthRestored": "Al resolver las incidencias",
"KeyboardShortcutsConfirmModal": "Aceptar Confirmación de esta Ventana Modal",
"IndexerValidationUnableToConnectHttpError": "No se puede conectar al indexador, por favor compruebe su configuración DNS y asegúrese de que IPv6 está funcionando o que esté desactivado. {exceptionMessage}.",
"InteractiveImportNoSeason": "Se debe elegir la temporada para cada archivo seleccionado",
"Interval": "Intervalo",
"KeyboardShortcuts": "Atajos de Teclado",
"Level": "Nivel",
"LastWriteTime": "Última Fecha de Escritura",
"InteractiveSearchModalHeaderSeason": "Búsqueda Interactiva - {season}",
"InteractiveSearchSeason": "Búsqueda interactiva de todos los episodios de esta temporada",
"Language": "Idioma",
"SaveSettings": "Guardar ajustes",
"InstanceName": "Nombre de la Instancia",
"KeyboardShortcutsCloseModal": "Cerrar esta Ventana Modal",
"IndexerValidationJackettAllNotSupportedHelpText": "Todos los endpoint the Jackett no están soportados, por favor agregue los indexadores individualmente",
"IndexerValidationUnableToConnect": "No se pudo conectar con el indexador: {exceptionMessage}. Compruebe el registro que rodea a este error para obtener más detalles",
"InteractiveImportNoSeries": "Se debe elegir una serie para cada archivo seleccionado",
"InteractiveSearch": "Búsqueda Interactiva",
"LiberaWebchat": "Libera Webchat",
"IndexerValidationFeedNotSupported": "La fuente del indexador no es compatible: {exceptionMessage}",
"IndexerValidationInvalidApiKey": "Clave API Invalida",
"IndexerValidationJackettAllNotSupported": "Todos los endpoint the Jackett no están soportados, por favor agregue los indexadores individualmente",
"IndexerValidationSearchParametersNotSupported": "El indexador no admite los parámetros de búsqueda requeridos",
"IndexerValidationQuerySeasonEpisodesNotSupported": "El indexador no admite la consulta actual. Comprueba si las categorías y/o la búsqueda de temporadas/episodios son compatibles. Comprueba el registro para obtener más detalles.",
"IndexersLoadError": "No se pueden cargar los indexadores",
"IndexersSettingsSummary": "Indexadores y opciones de indexación",
"InvalidFormat": "Formato Inválido",
"IndexerValidationUnableToConnectTimeout": "No se ha podido conectar con el indexador, posiblemente debido a un tiempo de espera excedido. Inténtalo de nuevo o comprueba tu configuración de red. {exceptionMessage}.",
"InteractiveSearchResultsSeriesFailedErrorMessage": "La búsqueda ha fallado porque es {message}. Intente actualizar la información de la serie y compruebe que la información necesaria está presente antes de volver a buscar.",
"IndexerValidationUnableToConnectResolutionFailure": "No se puede conectar con el indexador, fallo de conexión. Compruebe su conexión con el servidor del indexador y DNS. {exceptionMessage}.",
"InstallLatest": "Instala el último",
"InstanceNameHelpText": "Nombre de la instancia en la pestaña y para la aplicación Syslog",
"LastUsed": "Usado por última vez",
"InteractiveImportNoEpisode": "Hay que elegir uno o varios episodios para cada archiveo seleccionado",
"Indexers": "Indexadores",
"InteractiveImportNoLanguage": "Se debe elegir el idioma para cada archivo seleccionado",
"KeepAndTagSeries": "Conservar y Etiquetar Series",
"KeepAndUnmonitorSeries": "Conservar y Desmonitorizar Series",
"KeyboardShortcutsFocusSearchBox": "Enfocar Campo de Búsqueda",
"KeyboardShortcutsOpenModal": "Abrir esta Ventana Modal",
"Languages": "Idiomas",
"LibraryImportSeriesHeader": "Importe las series que ya posee",
"LibraryImportTips": "Algunos consejos para que la importación vaya sobre ruedas:",
"IndexerValidationTestAbortedDueToError": "El test fue abortado debido a un error: {exceptionMessage}",
"Large": "Grande",
"IndexerValidationUnableToConnectInvalidCredentials": "No se puede conectar al indexador, credenciales no válidas. {exceptionMessage}.",
"IndexerValidationUnableToConnectServerUnavailable": "No se puede conectar con el indexador, el servidor del indexador no está disponible. Inténtelo de nuevo más tarde. {exceptionMessage}.",
"InteractiveImport": "Importación Interactiva",
"KeyboardShortcutsSaveSettings": "Guardar ajustes",
"LatestSeason": "Última Temporada",
"ListTagsHelpText": "Etiquetas que se añadirán en la importación a partir de esta lista",
"ManageEpisodes": "Gestionar Episodios",
"Lowercase": "Minúscula",
"ListQualityProfileHelpText": "Los elementos de la lista del Perfil de Calidad se añadirán con",
"ListExclusionsLoadError": "No se puede cargar Lista de Exclusiones",
"ListRootFolderHelpText": "Los elementos de la lista de carpetas raíz se añadirán a",
"Local": "Local",
"LocalStorageIsNotSupported": "El Almacenamiento Local no es compatible o está deshabilitado. Es posible que un plugin o la navegación privada lo hayan deshabilitado.",
"ListOptionsLoadError": "No se pueden cargar opciones de lista",
"ListsLoadError": "No se pueden cargar las Listas",
"Logout": "Cerrar Sesión",
"Links": "Enlaces",
"Logging": "Registro de eventos",
"ListWillRefreshEveryInterval": "La lista se actualizará cada {refreshInterval}",
"LocalPath": "Ruta Local",
"LogFiles": "Archivos de Registro",
"LogLevel": "Nivel de Registro",
"LogLevelTraceHelpTextWarning": "El registro de seguimiento sólo debe activarse temporalmente",
"LibraryImportTipsQualityInEpisodeFilename": "Asegúrate de que tus archivos incluyen la calidad en sus nombres de archivo. ej. 'episodio.s02e15.bluray.mkv'.",
"ListSyncLevelHelpText": "Las series de la biblioteca se gestionarán en función de su selección si se caen o no aparecen en su(s) lista(s)",
"LogOnly": "Sólo Registro",
"LongDateFormat": "Formato de Fecha Larga",
"ManageEpisodesSeason": "Gestionar los archivos de Episodios de esta temporada",
"LibraryImportTipsDontUseDownloadsFolder": "No lo utilice para importar descargas desde su cliente de descargas, esto es sólo para bibliotecas organizadas existentes, no para archivos sin clasificar.",
"LocalAirDate": "Fecha de emisión local",
"NotificationsEmailSettingsUseEncryptionHelpText": "Si prefiere utilizar el cifrado si está configurado en el servidor, utilizar siempre el cifrado mediante SSL (sólo puerto 465) o StartTLS (cualquier otro puerto) o no utilizar nunca el cifrado",
"LibraryImportTipsSeriesUseRootFolder": "Dirija {appName} a la carpeta que contiene todas sus series de TV, no a una en concreto. Por ejemplo, \"`{goodFolderExample}`\" y no \"`{badFolderExample}`\". Además, cada serie debe estar en su propia carpeta dentro de la carpeta raíz/biblioteca.",
"ListSyncTag": "Etiqueta de Sincronización de Lista",
"ListSyncTagHelpText": "Esta etiqueta se añadirá cuando una serie desaparezca o ya no esté en su(s) lista(s)",
"MetadataLoadError": "No se puede cargar Metadatos",
"MetadataSourceSettingsSeriesSummary": "Información de dónde {appName} obtiene información de series y episodio",
"Max": "Máximo",
"MaximumSizeHelpText": "Tamaño máximo en MB para que un lanzamiento sea capturado. Establece a cero para establecer a ilimitado",
"MatchedToEpisodes": "Ajustado a Episodios",
"MediaInfo": "Información de medios",
"MediaManagementSettingsSummary": "Nombrado, opciones de gestión de archivos y carpetas raíz",
"MetadataSource": "Fuente de metadatos",
"ManualImport": "Importación manual",
"MatchedToSeries": "Ajustado a Series",
"MediaManagement": "Gestión de medios",
"MetadataPlexSettingsSeriesPlexMatchFile": "Emparejado de archivos de series de Plex",
"MetadataSettings": "Opciones de metadatos",
"MetadataPlexSettingsSeriesPlexMatchFileHelpText": "Crea un archivo .plexmatch en la carpeta de series",
"MetadataSettingsEpisodeMetadata": "Metadatos de episodio",
"MetadataSettingsEpisodeMetadataImageThumbs": "Metadatos de miniaturas de episodio",
"MetadataSettingsSeriesImages": "Imágenes de series",
"MetadataSettingsSeriesMetadata": "Metadatos de series",
"MatchedToSeason": "Ajustado a Temporada",
"Medium": "Mediano",
"MegabytesPerMinute": "Megabytes por minuto",
"MediaManagementSettings": "Opciones de gestión de medios",
"Mechanism": "Mecanismo",
"Mapping": "Mapeo",
"ManualImportItemsLoadError": "No se puede cargar los elementos de importación manual",
"MarkAsFailed": "Marcar como Fallido",
"MarkAsFailedConfirmation": "¿Estás seguro que quieres marcar '{sourceTitle}' como fallido?",
"MaximumLimits": "Límites máximos",
"MaximumSingleEpisodeAge": "Tiempo máximo de Episodio individual",
"MediaManagementSettingsLoadError": "No se puede cargar las opciones de gestión de medios",
"MetadataProvidedBy": "Los metadatos son proporcionados por {provider}",
"MetadataSettingsEpisodeImages": "Imágenes de episodio",
"MetadataSettingsSeasonImages": "Imágenes de temporada",
"MetadataSettingsSeriesMetadataEpisodeGuide": "Metadatos de guía de episodio de series",
"MetadataSettingsSeriesMetadataUrl": "Metadatos de URL de series",
"MetadataSourceSettings": "Opciones de fuente de metadatos",
"MetadataSettingsSeriesSummary": "Crea archivos de metadatos cuando los episodios son importados o las series son refrescadas",
"Metadata": "Metadatos",
"MassSearchCancelWarning": "Esto no puede ser cancelado una vez empiece sin reiniciar {appName} o deshabilitar todos tus indexadores.",
"MaximumSingleEpisodeAgeHelpText": "Durante una búsqueda completa de temporada, solo serán permitidos los paquetes de temporada cuando el último episodio de temporada sea más antiguo que esta configuración. Solo series estándar. Usa 0 para deshabilitar.",
"MaximumSize": "Tamaño máximo",
"IndexerValidationNoResultsInConfiguredCategories": "Petición con éxito, pero no se devolvió ningún resultado en las categorías configuradas de tu indexador. Esto puede ser un problema con el indexador o tus ajustes de categoría de tu indexador.",
"IndexerValidationNoRssFeedQueryAvailable": "Ninguna consulta de canales RSS disponible. Esto puede ser un problema con el indexador o con los ajustes de categoría de tu indexador.",
"MappedNetworkDrivesWindowsService": "Los discos de red mapeados no están disponibles cuando se ejecutan como un servicio de Windows, consulta el [FAQ](https://wiki.servarr.com/sonarr/faq#why-cant-sonarr-see-my-files-on-a-remote-server) para más información.",
"MediaInfoFootNote": "MediaInfo Full/Idiomas de audio/Idiomas de subtítulo soporta un sufijo `:ES+DE` que te permite filtrar los idiomas incluidos en el nombre de archivo. Usa `-DE` para excluir idiomas específicos. Añadir `+` (eg `:ES+`) devolverá `[ES]`/`[ES+--]`/`[--]` dependiendo de los idiomas excluidos. Por ejemplo `{MediaInfo Full:ES+DE}`."
}

View File

@@ -33,7 +33,7 @@
"Languages": "Kielet",
"MultiLanguages": "Monikielinen",
"Permissions": "Käyttöoikeudet",
"RestartRequiredWindowsService": "Jotta palvelu käynnistyisi automaattisesti, voi suorittavasta käyttäjästä riippuen olla tarpeellista suorittaa sovellus kerran järjestelmänvalvojan oikeuksilla.",
"RestartRequiredWindowsService": "Jotta palvelu käynnistyisi automaattisesti, voi suorittavasta käyttäjästä riippuen olla tarpeellista suorittaa {appName} kerran järjestelmänvalvojan oikeuksilla.",
"SelectLanguageModalTitle": "{modalTitle} - Valitse kieli",
"SelectLanguage": "Valitse kieli",
"SelectLanguages": "Valitse kielet",
@@ -44,14 +44,14 @@
"TimeFormat": "Kellonajan esitys",
"UiLanguage": "Käyttöliittymän kieli",
"UiLanguageHelpText": "{appName}in käyttöliittymän kieli.",
"AutomaticUpdatesDisabledDocker": "Automaattisia päivityksiä ei tueta suoraan käytettäessä Dockerin päivitysmekanismia. Docker-säiliö on päivitettävä {appName}in ulkopuolella tai päivitys on suoritettava skriptillä.",
"AutomaticUpdatesDisabledDocker": "Automaattisia päivityksiä ei tueta suoraan käytettäessä Dockerin päivitysmekanismia. Docker-säiliö on päivitettävä {appName}in ulkopuolella tai päivitys on suoritettava komentosarjalla.",
"AddListExclusionSeriesHelpText": "Estä {appName}ia lisäämästä sarjaa listoilta.",
"AppUpdated": "{appName} on päivitetty",
"AuthenticationMethodHelpText": "Vaadi {appName}in käyttöön käyttäjätunnus ja salasana.",
"ConnectionLostToBackend": "{appName} kadotti yhteyden taustajärjestelmään ja se on käynnistettävä uudelleen.",
"DeleteTag": "Poista tunniste",
"AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on käynnistettävä uudelleen. ",
"ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasua. \"Automaattinen\" vaihtaa vaalean ja tumman tilan välillä järjestelmän teeman mukaan. Innoittanut Theme.Park.",
"ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasua. \"Automaattinen\" vaihtaa vaalean ja tumman tilan välillä käyttöjärjestelmän teeman mukaan. Innoittanut Theme.Park.",
"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.",
"EnableColorImpairedMode": "Heikentyneen värinäön tila",
"EnableAutomaticSearchHelpText": "Profiilia käytetään automaattihauille, jotka suoritetaan käyttöliittymästä tai {appName}in toimesta.",
@@ -117,7 +117,7 @@
"IncludeUnmonitored": "Sisällytä valvomattomat",
"QualityDefinitions": "Laatumääritykset",
"QueueIsEmpty": "Jono on tyhjä",
"QueueLoadError": "Virhe ladattaessa jonoa",
"QueueLoadError": "Jonon lataus epäonnistui",
"RemoveQueueItemConfirmation": "Haluatko varmasti poistaa kohteen \"{sourceTitle}\" jonosta?",
"SourcePath": "Lähdesijainti",
"Imported": "Tuotu",
@@ -155,7 +155,7 @@
"DeleteTagMessageText": "Haluatko varmasti poistaa tunnisteen \"{label}\"?",
"DownloadClientRootFolderHealthCheckMessage": "Lataustyökalu \"{downloadClientName}\" tallentaa lataukset juurikansioon \"{rootFolderPath}\", mutta ne tulisi tallentaa muualle.",
"EditImportListExclusion": "Muokkaa tuontilistapoikkeusta",
"EnableMediaInfoHelpText": "Pura videotiedostoista resoluution, keston ja koodekkien kaltaisia tietoja. Tätä varten {appName}in on luettava osia tiedostoista, joka saattaa kasvataa levyn ja/tai verkon kuormitusta tarkistusten aikana.",
"EnableMediaInfoHelpText": "Pura videotiedostoista resoluution, keston ja koodekkien kaltaisia tietoja. Tätä varten {appName}in on luettava osia tiedostoista, joka saattaa kasvattaa levyn ja/tai verkon kuormitusta tarkistusten aikana.",
"HistoryLoadError": "Virhe ladattaessa historiaa",
"Import": "Tuo",
"DownloadClientQbittorrentSettingsContentLayout": "Sisällön rakenne",
@@ -171,7 +171,7 @@
"EpisodeProgress": "Jaksotilanne",
"FilterSeriesPlaceholder": "Suodata sarjoja",
"GeneralSettingsSummary": "Portti, SSL-salaus, käyttäjätunnus ja salasana, välityspalvelin, analytiikka ja päivitykset.",
"GeneralSettingsLoadError": "Virhe ladattaessa yleisasetuksia",
"GeneralSettingsLoadError": "Virhe ladattaessa yleisasetuksia",
"ImportCountSeries": "Tuo {selectedCount} sarjaa",
"ICalTagsSeriesHelpText": "Vain vähintään yhdellä täsmäävällä tunnisteella merkityt sarjat sisällytetään syötteeseen.",
"IndexerHDBitsSettingsMediumsHelpText": "Jos ei määritetty, käytetään kaikkia vaihtoehtoja.",
@@ -180,7 +180,7 @@
"IndexerSettingsAllowZeroSize": "Salli nollakoko",
"IndexerSettingsAdditionalParametersNyaa": "Muut parametrit",
"IndexerSettingsAnimeCategories": "Animekategoriat",
"IndexerSettingsApiUrl": "API:n URL-osoite",
"IndexerSettingsApiUrl": "Rajapinnan URL-osoite",
"IndexerSettingsCookie": "Eväste",
"IndexerSettingsPasskey": "Suojausavain",
"IndexerTagSeriesHelpText": "Tietolähdettä käytetään vain vähintään yhdellä täsmäävällä tunnisteella merkityille sarjoille. Käytä kaikille jättämällä tyhjäksi.",
@@ -199,7 +199,7 @@
"IndexerSettingsCategories": "Kategoriat",
"IndexerSettingsSeedRatio": "Jakosuhde",
"IndexerSettingsWebsiteUrl": "Verkkosivuston URL-osoite",
"IndexerValidationInvalidApiKey": "Virheellinen API-avain",
"IndexerValidationInvalidApiKey": "Rajapinnan avain ei kelpaa",
"IndexersLoadError": "Virhe ladattaessa tietolähteitä",
"IndexersSettingsSummary": "Tietolähteet ja niiden asetukset.",
"Indexers": "Tietolähteet",
@@ -211,7 +211,7 @@
"MediaManagementSettingsLoadError": "Virhe ladattaessa mediatiedostojen hallinta-asetuksia",
"MaximumSize": "Enimmäiskoko",
"MaximumSizeHelpText": "Kaapattavien julkaisujen enimmäiskoko megatavuina. Arvo \"0\" (nolla) poistaa rajoituksen.",
"MinimumFreeSpaceHelpText": "Estä tuonti, jos sen jälkeinen vapaa levytila olisi tässä määritettyä arvoa pienempi.",
"MinimumFreeSpaceHelpText": "Estä tuonti, jos sen jälkeinen vapaa levytila olisi tässä määritettyä pienempi.",
"MinutesSixty": "60 minuuttia: {sixty}",
"MediaInfo": "Median tiedot",
"MonitorAllEpisodesDescription": "Valvo erikoisjaksoja lukuunottamatta kaikkia jaksoja.",
@@ -253,7 +253,7 @@
"SceneInformation": "Kohtaustiedot",
"SelectFolderModalTitle": "{modalTitle} - Valitse kansio(t)",
"SelectQuality": "Valitse laatu",
"SeriesFolderFormatHelpText": "Käytetään lisättäessä uutta sarjaa tai siirrettäessä sarjaa sarjaeditorin välityksellä.",
"SeriesFolderFormatHelpText": "Käytetään kun lisätään uusi sarja tai siirretään sarjoja sarjaeditorin avulla.",
"SeriesIndexFooterMissingMonitored": "Jaksoja puuttuu (sarjaa valvotaan)",
"ShowPreviousAiring": "Näytä edellinen esitys",
"ShowBannersHelpText": "Korvaa nimet bannerikuvilla.",
@@ -276,7 +276,7 @@
"QualityProfiles": "Laatuprofiilit",
"QualityProfileInUseSeriesListCollection": "Sarjaan, listaan tai kokoelmaan liitettyä laatuprofiilia ei ole mahdollista poistaa.",
"ReadTheWikiForMoreInformation": "Wikistä löydät lisää tietoja",
"RecentChanges": "Viimeisimmät muutokset",
"RecentChanges": "Uusimmat muutokset",
"ReleaseProfileTagSeriesHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille sarjoille. Käytä kaikille jättämällä tyhjäksi.",
"ReleaseTitle": "Julkaisun nimike",
"Reload": "Lataa uudelleen",
@@ -337,7 +337,7 @@
"Type": "Tyyppi",
"TypeOfList": "{typeOfList}-lista",
"Twitter": "X (Twitter)",
"UiSettingsSummary": "Kalenterin, päiväyksen ja värirajoitteisten asetukset.",
"UiSettingsSummary": "Kalenterin, päiväyksen ja kellonajan, sekä kielen ja heikentyneelle värinäölle sopivan tilan asetukset.",
"UnmappedFolders": "Kohdistamattomat kansiot",
"UnmonitorSpecialEpisodes": "Älä valvo erikoisjaksoja",
"UnmonitorSpecialsEpisodesDescription": "Lopeta kaikkien erikoisjaksojen valvonta muuttamatta muiden jakosojen tilaa.",
@@ -408,14 +408,14 @@
"Discord": "Discord",
"DownloadClientFloodSettingsPostImportTags": "Tuonnin jälkeiset tunnisteet",
"DownloadClientDownloadStationValidationSharedFolderMissing": "Jaettua kansiota ei ole olemassa",
"DownloadClientFreeboxSettingsAppId": "Sovelluksen ID",
"DownloadClientFreeboxSettingsApiUrl": "API:n URL-osoite",
"DownloadClientFreeboxSettingsAppToken": "Sovellustunniste",
"DownloadClientFreeboxUnableToReachFreebox": "Freebox API:a ei tavoiteta. Tarkista \"Osoite\", \"Portti\" ja \"Käytä SSL-salausta\" -asetukset. (Virhe: {exceptionMessage})",
"DownloadClientFreeboxSettingsAppId": "Sovellustunniste",
"DownloadClientFreeboxSettingsApiUrl": "Rajapinnan URL-osoite",
"DownloadClientFreeboxSettingsAppToken": "Sovellustietue",
"DownloadClientFreeboxUnableToReachFreebox": "Freebox-rajapintaa ei tavoiteta. Tarkista \"Osoite\"-, \"Portti\"- ja \"Käytä SSL-salausta\"-asetukset. Virhe: {exceptionMessage}.",
"DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Lataa tiedostot järjestyksessä (qBittorrent 4.1.0+).",
"DownloadClientSabnzbdValidationDevelopVersion": "Sabnzbd develop -versio, oletettavasti versio 3.0.0 tai korkeampi.",
"DownloadClientSabnzbdValidationDevelopVersion": "Sabnzbd:n develop-versio, oletettavasti vähintään versio 3.0.0.",
"Daily": "Päivittäinen",
"CutoffUnmetNoItems": "Katkaisutasoa saavuttamattomia kohteita ei ole",
"CutoffUnmetNoItems": "Katkaisutasoa saavuttamattomia kohteita ei ole.",
"DailyEpisodeFormat": "Päivittäisjaksojen kaava",
"DelayProfileProtocol": "Protokolla: {preferredProtocol}",
"Day": "Päivä",
@@ -492,7 +492,7 @@
"DeletedSeriesDescription": "Sarja poistettiin TheTVDB:stä.",
"NoUpdatesAreAvailable": "Päivityksiä ei ole saatavilla",
"NotificationStatusSingleClientHealthCheckMessage": "Ilmoitukset eivät ole ongelmien vuoksi käytettävissä: {notificationNames}",
"NotificationsLoadError": "Kytkösten lataus epäonnistui.",
"NotificationsLoadError": "Virhe ladattaessa kytköksiä",
"Options": "Asetukset",
"OptionalName": "Valinnainen nimi",
"OverviewOptions": "Yleiskatsauksen asetukset",
@@ -520,7 +520,7 @@
"RescanAfterRefreshHelpTextWarning": "{appName} ei tunnista tiedostomuutoksia automaattisesti, jos asetuksena ei ole \"Aina\".",
"RequiredHelpText": "Tämän \"{implementationName}\" -ehdon on täsmättävä mukautetun muodon käyttämiseksi. Muutoin riittää yksi \"{implementationName}\" -vastaavuus.",
"RescanSeriesFolderAfterRefresh": "Tarkista sarjan kansio päivityksen jälkeen",
"ResetAPIKeyMessageText": "Haluatko varmasti uudistaa API-avaimesi?",
"ResetAPIKeyMessageText": "Haluatko varmasti korvata rajapinnan avaimen uudella?",
"ResetDefinitionTitlesHelpText": "Palauta määritysten nimet ja arvot.",
"ResetQualityDefinitionsMessageText": "Haluatko varmasti palauttaa laatumääritykset?",
"ResetTitles": "Palauta nimet",
@@ -560,7 +560,7 @@
"Tags": "Tunnisteet",
"ToggleUnmonitoredToMonitored": "Ei valvota (aloita painamalla)",
"TheLogLevelDefault": "Lokikirjauksen oletusarvoinen laajuus on \"Informatiivinen\". Laajuutta voidaan muuttaa [Yleisistä asetuksista](/settings/general).",
"UiSettingsLoadError": "Virhe ladattaessa käyttöliittymäasetuksia",
"UiSettingsLoadError": "Virhe ladattaesssa käyttöliittymän asetuksia",
"UnableToUpdateSonarrDirectly": "{appName}ia ei voida päivittää suoraan,",
"UnmonitoredOnly": "Vain valvomattomat",
"UnmonitorDeletedEpisodes": "Lopeta poistettujen jaksojen valvonta",
@@ -594,7 +594,7 @@
"ClickToChangeQuality": "Vaihda laatua klikkaamalla",
"EpisodeDownloaded": "Jakso on ladattu",
"InteractiveImportNoQuality": "Jokaisen valitun tiedoston laatu on määritettävä.",
"DownloadClientNzbgetSettingsAddPausedHelpText": "Tämä edellyttää vähintään NzbGet-versiota 16.0",
"DownloadClientNzbgetSettingsAddPausedHelpText": "Tämä vaatii vähintään NzbGet-version 16.0.",
"NotificationStatusAllClientHealthCheckMessage": "Mikään ilmoituspavelu ei ole ongelmien vuoksi käytettävissä.",
"DownloadClientQbittorrentSettingsSequentialOrder": "Peräkkäinen järjestys",
"DownloadClientQbittorrentTorrentStateMetadata": "qBittorrent lataa metatietoja",
@@ -656,7 +656,7 @@
"ImportFailed": "Tuonti epäonnistui: {sourceTitle}",
"DeleteRootFolder": "Poista juurikansio",
"ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Useita tuontilistojen juurikansioita puuttuu: {rootFolderInfo}",
"ImportListExclusionsLoadError": "Virhe ladattaessa tuontilistapokkeuksia",
"ImportListExclusionsLoadError": "Tuontilistapoikkeusten lataus epäonnistui",
"TablePageSizeMinimum": "Sivukohtaisen kohdemäärän on oltava vähintään {minimumValue}.",
"YesCancel": "Kyllä, peru",
"ImportListSearchForMissingEpisodesHelpText": "{appName} aloittaa automaattisesti puuttuvien jaksojen etsinnän kun sarja lisätään.",
@@ -698,11 +698,11 @@
"DownloadIgnored": "Lataus ohitettiin",
"EditSelectedIndexers": "Muokkaa valittuja sisältölähteitä",
"ErrorRestoringBackup": "Virhe palautettaessa varmuuskopiota",
"ErrorLoadingItem": "Virhe ladattaessa tätä kohdetta",
"ErrorLoadingItem": "Virhe ladattaessa kohdetta",
"FileBrowserPlaceholderText": "Kirjoita sijainti tai selaa se alta",
"FeatureRequests": "Kehitysehdotukset",
"IndexerPriority": "Tietolähteiden painotus",
"IndexerOptionsLoadError": "Virhe ladattaessa tietolähdeasetuksia",
"IndexerOptionsLoadError": "Tietolähdeasetusten lataus ei onnistu",
"NoTagsHaveBeenAddedYet": "Tunnisteita ei ole vielä lisätty.",
"PreferProtocol": "Suosi {preferredProtocol}-protokollaa",
"RemotePathMappings": "Etäsijaintien kohdistukset",
@@ -728,7 +728,7 @@
"AuthenticationRequiredUsernameHelpTextWarning": "Syötä uusi käyttäjätunnus",
"BlocklistLoadError": "Virhe ladattaessa estolistaa",
"Database": "Tietokanta",
"LastWriteTime": "Viimeksi tallennettu",
"LastWriteTime": "Edellinen tallennus",
"ChownGroupHelpTextWarning": "Toimii vain, jos {appName}in suorittava käyttäjä on tiedoston omistaja. On parempi varmistaa, että lataustyökalu käyttää samaa ryhmää kuin {appName}.",
"IndexerSettingsSeasonPackSeedTimeHelpText": "Aika, joka tuotantokausipaketin sisältävää torrentia tulee jakaa ennen sen pysäytystä. Käytä lataustyökalun oletusta jättämällä tyhjäksi.",
"ApplyTagsHelpTextAdd": " \"Lisää\" syötetyt tunnisteet aiempiin tunnisteisiin",
@@ -736,7 +736,7 @@
"TorrentBlackholeSaveMagnetFilesHelpText": "Tallenna magnet-linkki, jos .torrent-tiedostoa ei ole käytettävissä (hyödyllinen vain lataustyökalun tukiessa tiedostoon tallennettuja magnet-linkkejä).",
"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.",
"SeriesAndEpisodeInformationIsProvidedByTheTVDB": "Sarjojen ja jaksojen tiedot tarjoaa TheTVDB.com. [Harkitse palvelun tukemista](https://www.thetvdb.com/subscribe)",
"DownloadClientQbittorrentValidationRemovesAtRatioLimitDetail": "{appName} ei voi suorittaa valmistuneiden latausten hallintaa määritetyllä tavalla. Voit korjata tämän vaihtamalla qBittorentin asetusten \"BitTorrent\"-osion \"Jakorajoitukset\"-osion toiminnoksi pysäytyksen poiston sijaan.",
"DownloadClientQbittorrentValidationRemovesAtRatioLimitDetail": "{appName} ei voi suorittaa valmistuneiden latausten hallintaa määritetyllä tavalla. Voit korjata tämän vaihtamalla qBittorentin asetusten \"BitTorrent\"-osion \"Jakosuhderajoitukset\"-osion toiminnoksi pysäytyksen poiston sijaan.",
"FullColorEventsHelpText": "Vaihtoehtoinen tyyli, jossa koko tapahtuma väritetään tilavärillä pelkän vasemman laidan sijaan. Ei vaikuta agendan esitykseen.",
"Yesterday": "Eilen",
"SeriesMonitoring": "Sarjan valvonta",
@@ -750,7 +750,7 @@
"IconForCutoffUnmetHelpText": "Näytä kuvake tiedostoille, joiden määritettyä katkaisutasoa ei ole vielä saavutettu.",
"DownloadClientOptionsLoadError": "Virhe ladattaessa lataustyökaluasetuksia",
"UseHardlinksInsteadOfCopy": "Käytä hardlink-kytköksiä",
"TorrentBlackholeSaveMagnetFilesReadOnlyHelpText": "Tiedostojen siirtämisen sijaan tämä ohjaa {appName}in kopioimaan tiedostot tai käyttämään hardlink-kytköksiä (asetuksista/järjesteästä riippuen).",
"TorrentBlackholeSaveMagnetFilesReadOnlyHelpText": "Tiedostojen siirron sijaan tämä ohjaa {appName}in kopioimaan tiedostot tai käyttämään hardlink-kytköksiä (asetuksista/järjestelmästä riippuen).",
"IndexerValidationUnableToConnectHttpError": "Tietolähdettä ei tavoiteta. Tarkista DNS-asetukset ja varmista, että IPv6 toimii tai on poistettu käytöstä. {exceptionMessage}.",
"BypassDelayIfHighestQualityHelpText": "Ohitusviive kun julkaisun laatu vastaa laatuprofiilin korkeinta käytössä olevaa laatua halutulla protokollalla.",
"IndexerHDBitsSettingsCategoriesHelpText": "Jos ei määritetty, käytetään kaikkia vaihtoehtoja.",
@@ -784,8 +784,8 @@
"AddNewSeriesRootFolderHelpText": "\"{folder}\" -alikansio luodaan automaattisesti.",
"AddNewSeriesSearchForMissingEpisodes": "Käynnistä puuttuvien jaksojen etsintä",
"AddNewSeriesSearchForCutoffUnmetEpisodes": "Käynnistä katkaisutasoa saavuttamattomien jaksojen etsintä",
"AddNewSeriesError": "Virhe ladattaessa hakutuloksia. Yritä uudelleen.",
"AnalyseVideoFilesHelpText": "Pura videotiedostoista resoluution, keston ja koodekkien kaltaisia tietoja. Tätä varten {appName}in on luettava osia tiedostoista, joka saattaa kasvataa levyn ja/tai verkon kuormitusta tarkistusten aikana.",
"AddNewSeriesError": "Hakutulosten lataus epäonnistui. Yritä uudelleen.",
"AnalyseVideoFilesHelpText": "Pura videotiedostoista resoluution, keston ja koodekkien kaltaisia tietoja. Tätä varten {appName}in on luettava osia tiedostoista, joka saattaa kasvattaa levyn ja/tai verkon kuormitusta tarkistusten aikana.",
"ShowUnknownSeriesItemsHelpText": "Näytä jonossa kohteet, joiden sarja ei ole tiedossa. Tämä voi sisältää poistettuja sarjoja, elokuvia tai mitä tahansa muuta {appName}in kategoriasta.",
"ShowSearchHelpText": "Näytä hakupainike osoitettaessa.",
"Size": "Koko",
@@ -869,14 +869,14 @@
"Donate": "Lahjoita",
"DiskSpace": "Levytila",
"DownloadClientDelugeTorrentStateError": "Deluge ilmoittaa virhettä",
"DownloadClientFreeboxApiError": "Freebox API palautti virheen: {errorDescription}",
"DownloadClientFreeboxAuthenticationError": "Freebox API -todennus epäonnistui. Syy: {errorDescription}",
"DownloadClientFreeboxApiError": "Freebox-rajapinta palautti virheen: {errorDescription}",
"DownloadClientFreeboxAuthenticationError": "Freebox API -todennus epäonnistui. Syy: {errorDescription}.",
"Download": "Lataa",
"DownloadClientQbittorrentSettingsUseSslHelpText": "Käytä suojattua yhteyttä. Katso qBittorentin asetusten \"Selainkäyttö\"-osion \"Käytä HTTPS:ää HTTP:n sijaan\" -asetus.",
"DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Aloita lataamalla ensimmäinen ja viimeinen osa (qBittorrent 4.1.0+).",
"DownloadClientRTorrentSettingsAddStopped": "Lisää pysäytettynä",
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Lataustyökalu \"{downloadClientName}\" on määritetty poistamaan valmistuneet lataukset, jonka seuraksena ne saatetaan poistaa ennen kuin {appName} ehtii tuoda niitä.",
"DownloadClientQbittorrentTorrentStatePathError": "Tuonti ei onnistu. Tiedostosijainti vastaa lataustyökalun perussijaintia. Ehkä \"Säilytä ylätason kansio\" ei ole käytössä tälle torrentille tai \"Torrent Content Layout\" -asetuksena ei ole \"Alkuperäinen\" tai \"Luo alikansio\"?",
"DownloadClientQbittorrentTorrentStatePathError": "Tuonti ei onnistu. Tiedostosijainti vastaa lataustyökalun perussijaintia. Ehkä \"Säilytä ylätason kansio\" ei ole käytössä tälle torrentille tai \"Torrentin sisällön asettelu\" -asetuksena EI OLE \"Alkuperäinen\" tai \"Luo alikansio\"?",
"DownloadClientSeriesTagHelpText": "Lataustyökalua käytetään vain vähintään yhdellä täsmäävällä tunnisteella merkityille sarjoille. Käytä kaikille jättämällä tyhjäksi.",
"DownloadClientValidationGroupMissing": "Ryhmää ei ole olemassa",
"DownloadClients": "Lataustyökalut",
@@ -903,7 +903,7 @@
"GrabReleaseUnknownSeriesOrEpisodeMessageText": "{appName} ei tunnista mihin sarjalle ja jaksolle julkaisu kuuluu, eikä sen automaattinen tuonti onnistu. Haluatko kaapata julkaisun \"{0}\"?",
"FailedToUpdateSettings": "Asetusten päivitys epäonnistui",
"Forums": "Keskustelualue",
"ErrorLoadingPage": "Virhe ladattaessa tätä sivua",
"ErrorLoadingPage": "Virhe ladattaessa sivua",
"FormatRuntimeHours": "{hours} t",
"FormatRuntimeMinutes": "{minutes} m",
"ICalLink": "iCal-linkki",
@@ -931,7 +931,7 @@
"MustContainHelpText": "Julkaisun on sisällettävä ainakin yksi näistä termeistä (kirjainkoolla ei ole merkitystä).",
"NoEpisodesFoundForSelectedSeason": "Valitulle tuotantokaudelle ei löytynyt jaksoja.",
"MonitorFutureEpisodesDescription": "Valvo jaksoja, joita ei ole vielä esitetty.",
"MissingNoItems": "Ei puuttuvia kohteita",
"MissingNoItems": "Puuttuvia kohteita ei ole.",
"Mode": "Tila",
"NextExecution": "Seuraava suoritus",
"PreviewRename": "Nimeämisen esikatselu",
@@ -943,7 +943,7 @@
"PreferredSize": "Toivottu koko",
"Progress": "Tilanne",
"OrganizeLoadError": "Virhe ladattaessa esikatseluita",
"QualityCutoffNotMet": "Laadu katkaisutasoa ei ole saavutettu",
"QualityCutoffNotMet": "Laadun katkaisutasoa ei ole saavutettu",
"ProtocolHelpText": "Valitse käytettävä(t) protokolla(t) ja mitä käytetään ensisijaisesti valittaessa muutoin tasaveroisista julkaisuista.",
"QualityDefinitionsLoadError": "Virhe ladattaessa laatumäärityksiä",
"RemotePathMappingLocalWrongOSPathHealthCheckMessage": "Paikallinen lataustyökalu \"{0}\" tallentaa lataukset kohteeseen \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista lataustyökalun asetukset.",
@@ -961,7 +961,7 @@
"Downloaded": "Ladattu",
"Global": "Yleiset",
"GeneralSettings": "Yleiset asetukset",
"ImportListsLoadError": "Virhe ladattaessa tuontilistoja",
"ImportListsLoadError": "Tuontilistojen lataus epäonnistui",
"Importing": "Tuonti",
"IndexerDownloadClientHealthCheckMessage": "Tietolähteet virheellisillä lataustyökaluilla: {indexerNames}.",
"Indexer": "Tietolähde",
@@ -993,7 +993,7 @@
"TablePageSizeHelpText": "Sivukohtainen kohdemäärä.",
"TablePageSize": "Sivun kohdemäärä",
"TablePageSizeMaximum": "Sivukohtainen kohdemäärä ei voi olla suurempi kuin {maximumValue}.",
"WhatsNew": "Mi uutta?",
"WhatsNew": "Mikä on uutta?",
"WeekColumnHeaderHelpText": "Näkyy jokaisen sarakkeen yläpuolella käytettäessä viikkonäkymää.",
"MonitorAllSeasonsDescription": "Valvo kaikkia uusia kausia automaattisesti.",
"MonitorLastSeason": "Viimeinen kausi",
@@ -1004,13 +1004,13 @@
"MonitorNoEpisodes": "Ei mitään",
"MonitorNoEpisodesDescription": "Mitään jaksoja ei valvota.",
"RemotePathMappingWrongOSPathHealthCheckMessage": "Etälataustyökalu \"{downloadClientName}\" tallentaa lataukset kohteeseen \"{path}\", mutta se ei ole kelvollinen {osName}-sijainti. Tarkista etäsijaintien kohdistukset ja lataustyökalun asetukset.",
"RemoveFailedDownloadsHelpText": "Poista epäonnistuneet lataukset lataustyökalun historiasta",
"RemoveFailedDownloadsHelpText": "Poista epäonnistuneet lataukset lataustyökalun historiasta.",
"RemoveSelected": "Poista valitut",
"RemoveSelectedBlocklistMessageText": "Haluatko varmasti poistaa valitut kohteet estolistalta?",
"RemoveSelectedItemsQueueMessageText": "Haluatko varmasti poistaa jonosta {selectedCount} kohdetta?",
"ReplaceIllegalCharactersHelpText": "Korvaa laittomat merkit vaihtoehtoisella merkinnällä. Jos ei valittu, ne poistetaan.",
"ResetQualityDefinitions": "Palauta laatumääritykset",
"RestartRequiredToApplyChanges": "{appName} on käynnistettävä muutosten käyttöönottamiseksi uudelleen. Haluatko tehdä sen nyt?",
"RestartRequiredToApplyChanges": "{appName} on käynnistettävä uudelleen muutosten käyttöönottamiseksi. Haluatko tehdä sen nyt?",
"SearchForAllMissingEpisodes": "Etsi kaikkia puuttuvia jaksoja",
"Seasons": "Kaudet",
"SearchAll": "Etsi kaikkia",
@@ -1043,7 +1043,7 @@
"CloneCondition": "Monista ehto",
"DeleteCondition": "Poista ehto",
"Delete": "Poista",
"ApiKey": "API-avain",
"ApiKey": "Rajapinnan avain",
"CertificateValidationHelpText": "Määritä HTTPS-varmennevahvistuksen tiukkuus. Älä muta, jos et ymmärrä riskejä.",
"Certification": "Varmennus",
"ChangeFileDate": "Muuta tiedoston päiväys",
@@ -1062,7 +1062,7 @@
"BypassDelayIfAboveCustomFormatScoreMinimumScore": "Mukautetun muodon vähimmäispisteytys",
"CertificateValidation": "Varmenteen vahvistus",
"ChmodFolder": "chmod-kansio",
"ChangeFileDateHelpText": "Muuta tiedoston päiväys tuonnin/kirjastotarkistusten yhteydessä.",
"ChangeFileDateHelpText": "Muuta tiedoston päiväys tuonnin/kirjaston uudelleentarkistuksen yhteydessä.",
"ChownGroupHelpText": "Ryhmän nimi tai GID. Käytä GID:tä etätiedostojärjestelmille.",
"ClientPriority": "Lataustyökalun painotus",
"CloneProfile": "Monista profiili",
@@ -1084,7 +1084,7 @@
"UtcAirDate": "UTC-esitysaika",
"FileManagement": "Tiedostojen hallinta",
"InteractiveImportNoEpisode": "Jokaiselle valitulle tiedostolle on valittava ainakin yksi jakso.",
"ApiKeyValidationHealthCheckMessage": "Muuta API-avaimesi ainakin {length} merkin pituiseksi. Voit tehdä tämän asetuksista tai muokkaamalla asetustiedostoa.",
"ApiKeyValidationHealthCheckMessage": "Muuta rajapinnan (API) avain ainakin {length} merkin pituiseksi. Voit tehdä tämän asetuksista tai muokkaamalla asetustiedostoa.",
"Conditions": "Ehdot",
"MinimumCustomFormatScore": "Mukautetun muodon vähimmäispisteytys",
"Period": "Piste",
@@ -1120,7 +1120,7 @@
"Posters": "Julisteet",
"RecyclingBin": "Roskakori",
"RecyclingBinCleanup": "Roskakorin tyhjennys",
"RecyclingBinCleanupHelpText": "Arvo \"0\" (nolla) poistaa automaattityhjennyksen käytöstä.",
"RecyclingBinCleanupHelpText": "Arvo \"0\" (nolla) poistaa automaattisen tyhjennyksen käytöstä.",
"ReleaseSceneIndicatorAssumingScene": "Oletetuksena kohtausnumerointi.",
"ConditionUsingRegularExpressions": "Ehto vastaa säännöllisiä lausekkeita. Huomioi, että merkeillä \"\\^$.|?*+()[{\" on erityismerkityksiä ja ne on erotettava \"\\\"-merkillä.",
"CreateGroup": "Luo ryhmä",
@@ -1155,7 +1155,7 @@
"Destination": "Kohde",
"Directory": "Kansio",
"PendingChangesDiscardChanges": "Hylkää muutokset ja poistu",
"RecyclingBinHelpText": "Poistetut tiedostot siirretään tänne pysyvän poiston sijaan.",
"RecyclingBinHelpText": "Pysyvän poiston sijaan tiedostot siirretään tähän kansioon.",
"ReleaseSceneIndicatorAssumingTvdb": "Oletuksena TheTVDB-numerointi.",
"ReleaseSceneIndicatorMappedNotRequested": "Valittu jakso ei sisältynyt tähän hakuun.",
"ReplaceWithSpaceDash": "Korvaa yhdistelmällä \"välilyönti yhdysmerkki\"",
@@ -1182,7 +1182,7 @@
"InteractiveImportNoSeason": "Jokaiselle valitulle tiedostolle on määritettävä tuotantokausi.",
"InteractiveSearchSeason": "Etsi kauden kaikkia jaksoja manuaalihaulla",
"Space": "Välilyönti",
"DownloadPropersAndRepacksHelpTextCustomFormat": "Käytä \"Älä suosi\" -valintaa suosiaksesi mukautettujen muotojen pisteytystä Proper- ja Repack-merkintöjä enemmän.",
"DownloadPropersAndRepacksHelpTextCustomFormat": "Käytä 'Älä suosi' -valintaa suosiaksesi mukautettujen muotojen pisteytystä Proper- ja Repack-merkintöjä enemmän.",
"AuthenticationRequiredPasswordHelpTextWarning": "Syötä uusi salasana",
"AuthenticationMethod": "Tunnistautumistapa",
"AuthenticationMethodHelpTextWarning": "Valitse sopiva tunnistautumistapa",
@@ -1209,7 +1209,7 @@
"Authentication": "Tunnistautuminen",
"AutomaticAdd": "Automaattinen lisäys",
"AutoAdd": "Automaattilisäys",
"AutoRedownloadFailedHelpText": "Hae ja pyri laaamaan eri julkaisu automaattisesti.",
"AutoRedownloadFailedHelpText": "Etsi ja pyri lataamaan eri julkaisu automaattisesti.",
"Clone": "Monista",
"CloneCustomFormat": "Monista mukautettu muoto",
"ConnectSettings": "Kytkösasetukset",
@@ -1234,7 +1234,7 @@
"DownloadClientDelugeSettingsUrlBaseHelpText": "Lisää etuliitteen Delugen JSON-URL-osoitteeseen (ks. {url}).",
"DownloadClientDownloadStationValidationApiVersion": "Download Stationin API-versiota ei tueta. Sen tulee olla vähintään {requiredVersion} (versioita {minVersion}{maxVersion} tuetaan).",
"DownloadClientFloodSettingsRemovalInfo": "{appName} suorittaa torrenttien automaattisen poiston sen tietolähdeastuksissa määritettyjen jakoasetusten perusteella.",
"DownloadClientFloodSettingsUrlBaseHelpText": "Lisää etuliitteeksi Flood API:n (esim. {url}).",
"DownloadClientFloodSettingsUrlBaseHelpText": "Lisää etuliitteen Flood-rajapintaan (esim. {url}).",
"DownloadClientRTorrentSettingsUrlPath": "URL-sijainti",
"ExtraFileExtensionsHelpText": "Pilkuin eroteltu listaus tuotavista oheistiedostoista (.nfo-tiedostot tuodaan \".nfo-orig\"-nimellä).",
"MultiEpisode": "Useita jaksoja",
@@ -1242,7 +1242,7 @@
"MultiEpisodeInvalidFormat": "Useita jaksoja: virheellinen kaava",
"AutoRedownloadFailedFromInteractiveSearch": "Uudelleenlataus manuaalihaun tuloksista epäonnistui",
"Blocklist": "Estolista",
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Etsi automaattisesti ja pyri lataamaan eri julkaisu vaikka epäonnistunut julkaisu oli kaapattu manuaalihausta.",
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Etsi ja pyri lataamaan eri julkaisu automaattisesti vaikka epäonnistunut julkaisu oli kaapattu manuaalihaun tuloksista.",
"StandardEpisodeFormat": "Tavallisten jaksojen kaava",
"SceneNumberNotVerified": "Kohtausnumeroa ei ole vielä vahvistettu",
"Scene": "Kohtaus",
@@ -1424,7 +1424,7 @@
"VideoCodec": "Videokoodekki",
"MinimumAge": "Vähimmäisikä",
"ReleaseGroups": "Julkaisuryhmät",
"DownloadClientQbittorrentTorrentStateStalled": "Lataus on jäätynyt yhteyksien puuttumksen vuoksi.",
"DownloadClientQbittorrentTorrentStateStalled": "Lataus on jäätynyt, koska yhdistettyjä lähteitä ei ole.",
"EnableProfileHelpText": "Käytä julkaisuprofiilia merkitsemällä tämä.",
"EnableRss": "Käytä RSS-syötettä",
"EpisodeFileDeletedTooltip": "Jaksotiedosto poistettiin",
@@ -1487,10 +1487,10 @@
"NotificationsKodiSettingsDisplayTimeHelpText": "Määrittää ilmoituksen näyttöajan sekunteina.",
"NotificationsMailgunSettingsUseEuEndpointHelpText": "Käytä MailGunin EU-päätepistettä.",
"NotificationsNtfySettingsClickUrl": "Painalluksen URL-osoite",
"NotificationsNotifiarrSettingsApiKeyHelpText": "Käyttäjätililtäsi löytyvä API-avain.",
"NotificationsNotifiarrSettingsApiKeyHelpText": "Käyttäjätililtäsi löytyvä rajapinnan (API) avain.",
"NotificationsNtfySettingsClickUrlHelpText": "Valinnainen URL-osoite, joka ilmoitusta painettaessa avataan.",
"NotificationsNtfySettingsTopics": "Topikit",
"NotificationsPushcutSettingsApiKeyHelpText": "API-avaimia voidaan hallita Puscut-sovelluksen tiliosiossa.",
"NotificationsPushcutSettingsApiKeyHelpText": "Rajapinnan (API) avaimia voidaan hallita Puscut-sovelluksen tiliosiossa.",
"NotificationsPushoverSettingsSoundHelpText": "Ilmoituksen ääni. Käytä oletusta jättämällä tyhjäksi.",
"NotificationsSettingsWebhookMethodHelpText": "Lähetyksessä käytettävä HTTP-menetelmä.",
"NotificationsSimplepushSettingsEvent": "Tapahtuma",
@@ -1521,10 +1521,10 @@
"NotificationsGotifySettingIncludeSeriesPosterHelpText": "Sisällytä sarjan juliste ilmoitukseen.",
"NotificationsGotifySettingsPriorityHelpText": "Ilmoituksen painotus.",
"NotificationsJoinSettingsDeviceIds": "Laite-ID:t",
"NotificationsJoinSettingsApiKeyHelpText": "Join-tilisi asetuksista löytyvä API-avain (paina Join API -painiketta).",
"NotificationsJoinSettingsApiKeyHelpText": "Join-tilisi asetuksista löytyvä rajapinnan (API) avain (paina Join API -painiketta).",
"NotificationsJoinSettingsDeviceNames": "Laitenimet",
"NotificationsKodiSettingsUpdateLibraryHelpText": "Määrittää päivitetäänkö Kodin kirjasto tuonnin tai uudelleennimeämisen yhteydessä.",
"NotificationsMailgunSettingsApiKeyHelpText": "MailGunissa luotu API-avain.",
"NotificationsMailgunSettingsApiKeyHelpText": "MailGunissa luotu rajapinnan (API) avain.",
"NotificationsMailgunSettingsUseEuEndpoint": "Käytä EU-päätepistettä",
"NotificationsNtfySettingsAccessToken": "Käyttötunniste",
"NotificationsNtfySettingsServerUrl": "Palvelimen URL-osoite",
@@ -1545,15 +1545,15 @@
"NotificationsTwitterSettingsConsumerSecretHelpText": "Kuluttajan salaisuus (consumer secret) X (Twitter) -sovelluksesta.",
"NotificationsTwitterSettingsDirectMessageHelpText": "Lähetä julkisen viestin sijaan suora viesti.",
"NotificationsTwitterSettingsMention": "Maininta",
"NotificationsValidationInvalidApiKeyExceptionMessage": "API-avain on virheellinen: {exceptionMessage}",
"NotificationsValidationInvalidApiKey": "API-avain on virheellinen",
"NotificationsValidationInvalidApiKeyExceptionMessage": "Rajapinnan avain ei kelpaa: {exceptionMessage}",
"NotificationsValidationInvalidApiKey": "Rajapinnan avain ei kelpaa",
"NotificationsValidationUnableToConnectToService": "Palvelua {serviceName} ei tavoiteta.",
"NotificationsValidationUnableToConnectToApi": "Palvelun {service} rajapintaa ei tavoiteta. Palvelinyhteys epäonnistui: ({responseCode}) {exceptionMessage}.",
"ReleaseHash": "Julkaisun hajatusarvo",
"False": "Epätosi",
"CustomFormatsSpecificationRegularExpressionHelpText": "Mukautetun muodon säännöllisen lausekkeen kirjainkokoa ei huomioida.",
"CustomFormatsSpecificationRegularExpression": "Säännöllinen lauseke",
"DownloadClientFreeboxSettingsAppTokenHelpText": "Freebox API -määritystä tehtäessä saatu sovellustunniste (i.e. \"app_token\").",
"DownloadClientFreeboxSettingsAppTokenHelpText": "Freebox-rajapinnan käyttöoikeutta määritettäessä saatu app_token-tietue.",
"ImportListsPlexSettingsAuthenticateWithPlex": "Plex.tv-tunnistautuminen",
"ImportListsSettingsAccessToken": "Käyttötunniste",
"ManageClients": "Hallitse työkaluja",
@@ -1574,7 +1574,7 @@
"NotificationsEmailSettingsBccAddressHelpText": "Pilkuin eroteltu listaus sähköpostiosoitteista, joihin viestit lähetetään piilokopioina.",
"NotificationsGotifySettingsServerHelpText": "Gotify-palvelimen URL-osoite. Sisällytä http(s):// ja portti (tarvittaessa).",
"NotificationsGotifySettingsServer": "Gotify-palvelin",
"NotificationsGotifySettingsAppToken": "Sovellustunniste",
"NotificationsGotifySettingsAppToken": "Sovellustietue",
"NotificationsEmailSettingsRecipientAddressHelpText": "Pilkuin eroteltu listaus sähköpostiosoitteista, joihin viestit lähetetään.",
"NotificationsJoinSettingsNotificationPriority": "Ilmoituksen painotus",
"NotificationsJoinValidationInvalidDeviceId": "Laite-ID:issä näyttäisi olevan virheitä.",
@@ -1592,7 +1592,7 @@
"NotificationsPushoverSettingsSound": "Ääni",
"NotificationsSettingsUpdateMapPathsFromHelpText": "{appName}-sijainti, jonka mukaisesti sarjasijainteja muutetaan kun {serviceName} näkee kirjastosijainnin eri tavalla kuin {appName} (vaatii \"Päivitä kirjasto\" -asetuksen).",
"NotificationsPushoverSettingsExpire": "Erääntyminen",
"NotificationsSendGridSettingsApiKeyHelpText": "SendGridin luoma API-avain.",
"NotificationsSendGridSettingsApiKeyHelpText": "SendGridin luoma rajapinnan (API) avain.",
"NotificationsSimplepushSettingsEventHelpText": "Mukauta push-ilmoitusten toimintaa.",
"NotificationsSignalSettingsSenderNumber": "Lähettäjän numero",
"NotificationsSettingsWebhookMethod": "HTTP-menetelmä",
@@ -1629,7 +1629,7 @@
"NotificationsValidationUnableToSendTestMessageApiResponse": "Testiviestin lähetys ei onnistu. API vastasi: {error}",
"NotificationsEmailSettingsUseEncryption": "Käytä salausta",
"ParseModalHelpTextDetails": "{appName} pyrkii jäsentämään nimikkeen ja näyttämään sen tiedot.",
"ImportScriptPathHelpText": "Tuonnissa suoirtettavan komentosarjan sijainti.",
"ImportScriptPathHelpText": "Tuontiin käytettävän komentosarjan sijainti.",
"NotificationsTwitterSettingsConsumerKeyHelpText": "Kuluttajan avain (consumer key) X (Twitter) -sovelluksesta.",
"NotificationsEmailSettingsUseEncryptionHelpText": "Määrittää suositaanko salausta, jos se on määritetty palvelimelle, käytetäänkö aina SSL- (vain portti 465) tai StartTLS-salausta (kaikki muut portit), voi käytetäänkö salausta lainkaan.",
"RemoveMultipleFromDownloadClientHint": "Poistaa latauksen ja ladatut tiedostot lataustyökalusta.",
@@ -1687,7 +1687,7 @@
"ImportListsImdbSettingsListId": "Listan ID",
"ImportListsImdbSettingsListIdHelpText": "IMDb-listan ID (esim. \"ls12345678\").",
"ImportListsSonarrSettingsRootFoldersHelpText": "Lähdeinstanssin juurikansiot, joista tuodaan.",
"ImportListsTraktSettingsRatingHelpText": "Suodata sarjat arviovälin perusteella (0100)",
"ImportListsTraktSettingsRatingHelpText": "Suodata sarjoja arvioden perusteella (alue 0100).",
"ImportListsTraktSettingsWatchedListFilter": "Katselulistan suodatin",
"ImportListsTraktSettingsYearsHelpText": "Suodata sarjat vuoden tai vuosivälin perusteella",
"MetadataSettingsEpisodeImages": "Jaksojen kuvat",
@@ -1725,7 +1725,7 @@
"DownloadClientSettingsDestinationHelpText": "Määrittää manuaalisen tallennuskohteen. Käytä oletusta jättämällä tyhjäksi.",
"DownloadClientSettingsOlderPriority": "Vanhojen painotus",
"DownloadClientSettingsOlderPriorityEpisodeHelpText": "Yli 14 päivää sitten julkaistujen jaksojen kaappauksille käytettävä painotus.",
"ImportListsTraktSettingsGenresHelpText": "Suodata sarjoja Traktin lajityyppien Slug-määrityksen perusteella (pilkuin eroteltuna) vain suosituille listoille.",
"ImportListsTraktSettingsGenresHelpText": "Suodata sarjoja Trakt-lajityyppien slug-arvoilla (pilkuin eroteltuna). Koskee vain suosituimpia listoja.",
"ImportListsTraktSettingsWatchedListFilterHelpText": "Jos \"Listan tyyppi\" on \"Valvottu\", valitse sarjatyyppi, jonka haluat tuoda.",
"MappedNetworkDrivesWindowsService": "Yhdistetyt verkkoasemat eivät ole käytettävissä kun sovellus suoritetaan Windows-palveluna. Saat lisätietoja [UKK:sta](https://wiki.servarr.com/sonarr/faq#why-cant-sonarr-see-my-files-on-a-remote-server).",
"MetadataSettingsSeriesMetadata": "Sarjojen metatiedot",
@@ -1736,5 +1736,73 @@
"ChangeCategoryMultipleHint": "Vaihtaa latausten kategoriaksi lataustyökalun \"Tuonnin jälkeinen kategoria\" -asetuksen kategorian.",
"DownloadClientAriaSettingsDirectoryHelpText": "Valinnainen latuasten tallennussijainti. Käytä Aria2-oletusta jättämällä tyhjäksi.",
"DownloadClientQbittorrentValidationQueueingNotEnabledDetail": "Torrentien jonotus ei ole käytössä qBittorent-asetuksissasi. Ota se käyttöön tai valitse painotukseksi \"Viimeiseksi\".",
"DownloadClientSettingsCategorySubFolderHelpText": "Luomalla {appName}ille oman kategorian, erottuvat sen lataukset muiden lähteiden latauksista. Kategorian määritys on valinnaista, mutta erittäin suositeltavaa. Tämä luo latauskansioon [kategoria]-alikansion."
"DownloadClientSettingsCategorySubFolderHelpText": "Luomalla {appName}ille oman kategorian, erottuvat sen lataukset muiden lähteiden latauksista. Kategorian määritys on valinnaista, mutta erittäin suositeltavaa. Tämä luo latauskansioon [kategoria]-alikansion.",
"ListQualityProfileHelpText": "Laatuprofiili, joka listalta lisätyille kohteille asetetaan.",
"RemovingTag": "Tunniste poistetaan",
"Ui": "Käyttöliittymä",
"Tba": "Selviää myöhemmin",
"UpgradesAllowedHelpText": "Jos käytöstä poistettuja laatuja ei päivitetä.",
"Repack": "Uudelleenpaketoitu",
"SupportedAutoTaggingProperties": "{appName} tukee automaattimerkinnän säännöissä seuraavia arvoja",
"RegularExpressionsCanBeTested": "Säännöllisiä lausekkeita voidaan testata [täällä](http://regexstorm.net/tester).",
"RssSyncIntervalHelpTextWarning": "Tämä koskee kaikkia tietolähteitä. Noudata niiden asettamia sääntöjä.",
"DownloadClientFreeboxSettingsApiUrlHelpText": "Määritä Freebox-rajapinnan perus-URL rajapinnan versiolla. Esimerkiksi \"{url}\". Oletus on \"{defaultApiUrl}\".",
"DownloadClientFreeboxSettingsHostHelpText": "Freeboxin isäntänimi tai IP-osoite. Oletus on \"{url}\" (toimii vain samassa verkossa).",
"DownloadClientFreeboxSettingsPortHelpText": "Freebox-liittymän portti. Oletus on \"{port}\".",
"DownloadClientNzbVortexMultipleFilesMessage": "Lataus sisältää useita tiedostoja, eikä se ole työkansiossa: {outputPath}.",
"DownloadClientFreeboxUnableToReachFreeboxApi": "Freebox-rajapintaa ei tavoiteta. Tarkista \"Rajapinnan URL-osoite\" -asetuksen perus-URL ja versio.",
"DownloadClientNzbgetValidationKeepHistoryZeroDetail": "NzbGetin \"KeepHistory\"-asetus on 0 ja tämä estää {appName}ia näkemästä valmistuneita latauksia.",
"DownloadClientNzbgetValidationKeepHistoryOverMaxDetail": "NzbGetin \"KeepHistory\"-asetus on liian korkea.",
"DownloadClientNzbgetValidationKeepHistoryOverMax": "NzbGetin \"KeepHistory\"-asetuksen tulee olla pienempi kuin 25000.",
"DownloadClientSabnzbdValidationEnableDisableMovieSorting": "Älä järjestele elokuvia",
"DownloadClientPneumaticSettingsNzbFolderHelpText": "Tämän kansion on oltava tavoitettavissa XBMC:stä.",
"DownloadClientValidationTestTorrents": "Torrent-listausten nouto epäonnistui: {exceptionMessage}.",
"ExportCustomFormat": "Vie mukautettu muoto",
"ImportListsValidationInvalidApiKey": "Rajapinnan avain ei kelpaa",
"DownloadClientQbittorrentSettingsInitialStateHelpText": "Tila, jossa torrentit lisätään qBittorrentiin. Huomioi, että pakotetut torrentit eivät noudata nopeusrajoituksia.",
"DownloadClientQbittorrentTorrentStateDhtDisabled": "qBittorrent ei voi selvittää magnet-linkkejä, jos DHT ei ole käytössä.",
"MetadataPlexSettingsSeriesPlexMatchFile": "Luo Plex Match -tiedostot",
"MetadataPlexSettingsSeriesPlexMatchFileHelpText": "Luo sarjojen kansioihin .plexmatch-tiedostot.",
"NoResultsFound": "Tuloksia ei löytynyt.",
"RegularExpressionsTutorialLink": "Lisätietoja säännöllisistä lausekkeista löytyy [täältä](https://www.regular-expressions.info/tutorial.html).",
"ResetAPIKey": "Korvaa rajapinnan avain",
"Reset": "Uudista",
"ResetDefinitions": "Palauta määritykset",
"DownloadClientQbittorrentValidationRemovesAtRatioLimit": "qBittorrent on määritetty poistamaan torrentit niiden saavuttaessa niitä koskevan jakosuhderajoituksen.",
"SecretToken": "Salainen tunniste",
"ShownClickToHide": "Näkyvissä, piilota painamalla",
"DownloadClientValidationAuthenticationFailure": "Tunnistautuminen epäonnistui",
"DownloadClientValidationApiKeyRequired": "Rajapinnan avain on pakollinen",
"DownloadClientValidationVerifySsl": "Vahvista SSL-asetukset",
"ImportListRootFolderMissingRootHealthCheckMessage": "Tuontilistalta tai -listoilta puuttuu juurikansio: {rootFolderInfo}.",
"Release": "Julkaisu",
"OrganizeRelativePaths": "Kaikki tiedostosijainnit on suhtetuttu sijaintiin: \"{path}\".",
"TorrentDelayTime": "Torrent-viive: {torrentDelay}",
"TorrentBlackholeTorrentFolder": "Torrent-kansio",
"UsenetBlackholeNzbFolder": "NZB-kansio",
"UsenetBlackhole": "Usenet Blackhole",
"XmlRpcPath": "XML RPC -sijainti",
"FailedToLoadSonarr": "{appName}in lataus epäonnistui",
"DownloadClientFreeboxSettingsAppIdHelpText": "Freebox-rajapinnan käyttöoikeutta määritettäessä käytettävä App ID -sovellustunniste.",
"ListRootFolderHelpText": "Juurikansio, johon listan kohteet lisätään.",
"DownloadClientSabnzbdValidationEnableDisableTvSorting": "Älä järjestele sarjoja",
"EnableAutomaticAddSeriesHelpText": "Lisää tämän listan sarjat {appName}iin kun synkronointi suoritetaan manuaalisesti käyttöliittymästä tai {appName}in toimesta.",
"DownloadClientValidationTestNzbs": "NZB-listausten nouto epäonnistui: {exceptionMessage}.",
"DownloadClientValidationUnableToConnect": "Lataustyökalua {clientName} ei tavoitettu",
"DownloadClientNzbgetValidationKeepHistoryZero": "NzbGetin \"KeepHistory\"-asetuksen tulee olla suurempi kuin 0.",
"DownloadClientTransmissionSettingsDirectoryHelpText": "Vaihtoehtoinen latauskansio. Käytä Transmissionin oletusta jättämällä tyhjäksi.",
"AddDelayProfileError": "Virhe lisättäessä viiveporofiilia. Yritä uudelleen.",
"DownloadClientPneumaticSettingsStrmFolderHelpText": "Tämän kansion .strm-tiedostot tuodaan droonilla.",
"DownloadClientSabnzbdValidationEnableDisableDateSorting": "Älä järjestele päiväyksellä",
"DownloadClientTransmissionSettingsUrlBaseHelpText": "Lisää etuliite lataustyökalun {clientName} RPC-URL-osoitteeseen. Esimerkiksi {url}. Oletus on \"{defaultUrl}\".",
"DownloadClientValidationApiKeyIncorrect": "Rajapinnan avain ei kelpaa",
"HiddenClickToShow": "Piilotettu, näytä painalla",
"ImportListsCustomListValidationAuthenticationFailure": "Tunnistautuminen epäonnistui",
"ImportListsSonarrSettingsApiKeyHelpText": "{appName}-instanssin, josta tuodaan, rajapinan (API) avain.",
"IndexerSettingsApiUrlHelpText": "Älä muuta tätä, jos et tiedä mitä teet, koska rajapinta-avaimesi lähetetään kyseiselle palvelimelle.",
"ImportListsTraktSettingsRating": "Arvio",
"Required": "Pakollinen",
"TaskUserAgentTooltip": "User-Agent-tiedon ilmoitti rajapinnan kanssa viestinyt sovellus.",
"TorrentBlackhole": "Torrent Blackhole",
"WantMoreControlAddACustomFormat": "Haluatko hallita tarkemmin mitä latauksia suositaan? Lisää [Mukautettu muoto](/settings/customformats)."
}

View File

@@ -233,7 +233,7 @@
"Backup": "Biztonsági mentés",
"AddNew": "Új hozzáadása",
"AddANewPath": "Új útvonal hozzáadása",
"AddConditionImplementation": "Feltétel hozzáadása {megvalósítás név}",
"AddConditionImplementation": "Feltétel hozzáadása {implementationName}",
"AddConnectionImplementation": "Csatlakozás hozzáadása - {implementationName}",
"AddCustomFilter": "Egyéni szűrő hozzáadása",
"AddDownloadClientImplementation": "Letöltési kliens hozzáadása {implementationName}",
@@ -258,8 +258,8 @@
"AddNewSeriesSearchForCutoffUnmetEpisodes": "Indítsa el a levágott, még nem talált epizódok keresését",
"AddListExclusion": "Listakizárás hozzáadása",
"AddNewSeriesSearchForMissingEpisodes": "Kezdje el a hiányzó epizódok keresését",
"AddSeriesWithTitle": "Cím {hozzáadása}",
"AddedDate": "Hozzáadva: {dátum}",
"AddSeriesWithTitle": "Cím {title}",
"AddedDate": "Hozzáadva: {date}",
"AllFiles": "Minden fájl",
"AllSeriesAreHiddenByTheAppliedFilter": "Az összes eredményt elrejti az alkalmazott szűrő",
"AlternateTitles": "Alternatív címek",
@@ -285,7 +285,7 @@
"AddNewSeries": "Új sorozat hozzáadása",
"AddNewSeriesError": "Nem sikerült betölteni a keresési eredményeket, próbálkozzon újra.",
"AddNewSeriesHelpText": "Könnyen hozzáadhat új sorozatot, csak kezdje el beírni a hozzáadni kívánt sorozat nevét.",
"AddNewSeriesRootFolderHelpText": "'{Mappa}' almappa automatikusan létrejön",
"AddNewSeriesRootFolderHelpText": "'{folder}' almappa automatikusan létrejön",
"AuthenticationMethod": "Hitelesítési Módszer",
"BlackholeWatchFolder": "Mappa figyelése",
"CalendarFeed": "{appName} Naptár Feed",
@@ -304,7 +304,7 @@
"Fixed": "Rögzített",
"Events": "Események",
"Exception": "Kivétel",
"AddListExclusionSeriesHelpText": "Akadályozza meg, hogy listák alapján sorozatokat adjanak hozzá a(z) {App név} alkalmazáshoz",
"AddListExclusionSeriesHelpText": "Akadályozza meg, hogy listák alapján sorozatokat adjanak hozzá a(z) {appName} alkalmazáshoz",
"Languages": "Nyelvek",
"Logs": "Naplók",
"AnimeEpisodeTypeDescription": "Az abszolút epizódszámmal kiadott epizódok",
@@ -875,7 +875,7 @@
"ChmodFolderHelpTextWarning": "Ez csak akkor működik, ha a(z) {appName} alkalmazást futtató felhasználó a fájl tulajdonosa. Jobb, ha megbizonyosodik arról, hogy a letöltési kliens megfelelően állítja be az engedélyeket.",
"ChownGroupHelpTextWarning": "Ez csak akkor működik, ha a(z) {appName} alkalmazást futtató felhasználó a fájl tulajdonosa. Jobb, ha a letöltési kliens ugyanazt a csoportot használja, mint a {appName}.",
"CollectionsLoadError": "Nem sikerült betölteni a gyűjteményeket",
"Conditions": "Körülmények",
"Conditions": "Állapot",
"ContinuingSeriesDescription": "További epizódok/újabb évad várható",
"ConnectionLostToBackend": "A(z) {appName} megszakadt a kapcsolat a háttérrendszerrel, ezért újra kell tölteni a működés visszaállításához.",
"CountIndexersSelected": "{count} indexelő(k) kiválasztva",
@@ -958,7 +958,7 @@
"SelectSeries": "Sorozat kiválasztása",
"BlocklistAndSearchMultipleHint": "Indítsa el a helyettesítők keresését a tiltólistázás után",
"BlocklistMultipleOnlyHint": "Blokklista helyettesítők keresése nélkül",
"BlocklistOnly": "Csak blokkolólista",
"BlocklistOnly": "Csak blokklistára",
"BlocklistOnlyHint": "Blokklista csere keresése nélkül",
"ChangeCategory": "Kategória módosítása",
"ChangeCategoryMultipleHint": "Módosítja a letöltéseket az „Importálás utáni kategóriára” a Download Clientből",
@@ -1028,5 +1028,382 @@
"StandardEpisodeFormat": "Alapértelmezett epizód formátum",
"StartProcessing": "Indítsa el a feldolgozást",
"SelectFolder": "Mappa kiválasztása",
"ShowUnknownSeriesItemsHelpText": "Sorozat nélküli elemek megjelenítése a sorban, idetartozhatnak az eltávolított sorozatok, filmek vagy bármi más a(z) {appName} kategóriájában"
"ShowUnknownSeriesItemsHelpText": "Sorozat nélküli elemek megjelenítése a sorban, idetartozhatnak az eltávolított sorozatok, filmek vagy bármi más a(z) {appName} kategóriájában",
"DestinationRelativePath": "A cél relatív útvonala",
"ImportFailed": "Sikertelen importálás: {sourceTitle}",
"ImportList": "Importálási lista",
"DeleteImportListExclusion": "Importálási lista kizárásának törlése",
"DeleteIndexer": "Indexelő törlése",
"DeleteNotification": "Értesítés törlése",
"DockerUpdater": "Frissítse a docker-tárolót a frissítés fogadásához",
"DeleteTag": "Címke törlése",
"CustomFormatScore": "Egyéni formátum pontszáma",
"ImportLists": "Listák importálása",
"CountSelectedFiles": "{selectedCount} kiválasztott fájl",
"AddDelayProfileError": "Nem sikerült új késleltetési profilt hozzáadni, próbálkozzon újra.",
"DownloadClientDelugeValidationLabelPluginInactiveDetail": "A kategóriák használatához engedélyeznie kell a Label beépülő modult a {clientName} szolgáltatásban.",
"BindAddressHelpText": "Érvényes IP-cím, localhost vagy '*' minden interfészhez",
"CustomFormatUnknownConditionOption": "Ismeretlen „{key}” opció a „{implementation}” feltételhez",
"ImportListSearchForMissingEpisodes": "Keresse meg a hiányzó epizódokat",
"ImportListSearchForMissingEpisodesHelpText": "Miután a sorozatot hozzáadta a {appName} alkalmazáshoz, automatikusan megkeresi a hiányzó epizódokat",
"AutoTaggingRequiredHelpText": "Ennek az {implementationName} feltételnek meg kell egyeznie az automatikus címkézési szabály érvényesítéséhez. Ellenkező esetben egyetlen {implementationName} egyezés elegendő.",
"DeleteReleaseProfile": "Release profil törlése",
"DetailedProgressBarHelpText": "Szöveg megjelenítése a folyamatjelző sávon",
"BranchUpdate": "A(z) {appName} frissítéséhez használt fiók",
"BackupFolderHelpText": "A relatív elérési utak a(z) {appName} AppData könyvtárában találhatók",
"CustomFormatsSpecificationRegularExpressionHelpText": "Az egyéni formátumú reguláris kifejezés nem különbözteti meg a kis- és nagybetűket",
"Destination": "Rendeltetési hely",
"DestinationPath": "Cél útvonal",
"DetailedProgressBar": "Részletes folyamatjelző sáv",
"DownloadClientDownloadStationValidationSharedFolderMissing": "Megosztott mappa nem létezik",
"EditListExclusion": "Listakizárás szerkesztése",
"ImportExistingSeries": "Meglévő sorozat importálása",
"ImportListSettings": "Listabeállítások importálása",
"ImportListsAniListSettingsAuthenticateWithAniList": "Hitelesítés az AniList segítségével",
"ImportListsAniListSettingsImportCancelled": "Importálás megszakítva",
"ImportListsAniListSettingsImportFinished": "Az importálás befejeződött",
"ImportListsAniListSettingsImportFinishedHelpText": "Média: Minden epizódot leadtak",
"ImportListsAniListSettingsImportHiatus": "Importálás szünet",
"ImportListsAniListSettingsImportNotYetReleased": "Az importálás még nem jelent meg",
"CleanLibraryLevel": "Tiszta könyvtári szint",
"CustomFormats": "Egyéni formátumok",
"DeleteEpisodeFromDisk": "Epizód törlése a lemezről",
"DeleteEpisodeFileMessage": "Biztosan törli a következőt: „{path}”?",
"DoNotPrefer": "Ne preferáld",
"DeleteSpecificationHelpText": "Biztosan törli a(z) „{name}” specifikációt?",
"DownloadClientDelugeTorrentStateError": "A Deluge hibát jelez",
"DownloadClientDownloadStationValidationFolderMissing": "A mappa nem létezik",
"DownloadClientDownloadStationValidationNoDefaultDestination": "A mappa nem létezik",
"DownloadClientFloodSettingsAdditionalTagsHelpText": "Hozzáadja a média tulajdonságait címkékként. A tippek példák.",
"DownloadClientFloodSettingsPostImportTags": "Importálás utáni címkék",
"DownloadClientFloodSettingsPostImportTagsHelpText": "A letöltés importálása után címkéket fűz hozzá.",
"ImportListsAniListSettingsImportPlanningHelpText": "Lista: Megtekintést tervez",
"BlackholeFolderHelpText": "Mappa, amelyben az {appName} tárolja az {extension} fájlt",
"BlackholeWatchFolderHelpText": "Mappa, amelyből a(z) {appName} a befejezett letöltéseket importálja",
"DeleteSeriesFoldersHelpText": "Törölje a sorozat mappáit és azok teljes tartalmát",
"DeleteSeriesModalHeader": "Törlés {title}",
"DeleteSpecification": "Specifikáció törlése",
"DeleteSeriesFolders": "Sorozat mappák törlése",
"DownloadClientDelugeValidationLabelPluginFailure": "A címke konfigurálása nem sikerült",
"DownloadClientDelugeValidationLabelPluginInactive": "A címke beépülő modul nincs aktiválva",
"DeleteEpisodeFile": "Epizódfájl törlése",
"DeleteQualityProfile": "Törölje a minőségi profilt",
"DeleteReleaseProfileMessageText": "Biztosan törli ezt a kiadási profilt: „{name}”?",
"DeleteEpisodesFilesHelpText": "Törölje az epizódfájlokat és a sorozat mappáját",
"DeleteSelectedEpisodeFiles": "Törölje a kiválasztott epizódfájlokat",
"DeleteSelectedEpisodeFilesHelpText": "Biztosan törli a kiválasztott epizódfájlokat?",
"DeleteSeriesFolderHelpText": "Törölje a sorozat mappát és annak tartalmát",
"DailyEpisodeTypeDescription": "Naponta vagy ritkábban megjelenő, év-hónap-napot használó epizódok (2023-08-04)",
"CustomFilters": "Egyedi Szűrők",
"CurrentlyInstalled": "Jelenleg telepítve",
"DeleteEmptySeriesFoldersHelpText": "Törölje az üres sorozat- és évadmappákat a lemezellenőrzés és az epizódfájlok törlésekor",
"DeleteEpisodesFiles": "Törölje a(z) {episodeFileCount} epizódfájlt",
"DeleteSeriesFolderCountWithFilesConfirmation": "Biztos benne, hogy törölni szeretne {count} kiválasztott sorozatot és az összes tartalmat?",
"CountSelectedFile": "{selectedCount} kiválasztott fájl",
"CutoffUnmetLoadError": "Hiba a nem teljesített elemek betöltésekor",
"CutoffUnmetNoItems": "Nincsenek teljesítetlen elemek levágása",
"DownloadClientDelugeSettingsUrlBaseHelpText": "Előtagot ad a deluge json URL-hez, lásd: {url}",
"DownloadClientFloodSettingsAdditionalTags": "További címkék",
"DownloadClientFloodSettingsStartOnAdd": "Kezdje a Hozzáadás lehetőséggel",
"ImportExtraFiles": "Extra fájlok importálása",
"ImportListExclusions": "Listakizárások importálása",
"BlocklistReleaseHelpText": "Letiltja ennek a kiadásnak a letöltését a(z) {app Name} által RSS-en vagy automatikus keresésen keresztül",
"CustomFormatUnknownCondition": "Ismeretlen egyéni formátum feltétele „{implementation}”",
"AutoTaggingNegateHelpText": "Ha be van jelölve, az automatikus címkézési szabály nem érvényesül, ha ez a {implementationName} feltétel megfelel.",
"CountSeriesSelected": "{count} sorozat kiválasztva",
"DatabaseMigration": "Adatbázis-migráció",
"DeleteSelectedSeries": "A kiválasztott sorozat törlése",
"DeleteSeriesFolder": "Sorozatmappa törlése",
"DeleteSeriesFolderCountConfirmation": "Biztosan törölni szeretne {count} kiválasztott sorozatot?",
"DeletedSeriesDescription": "A sorozatot törölték a TheTVDB-ből",
"DoNotBlocklist": "Ne tiltsa le",
"DoNotBlocklistHint": "Eltávolítás tiltólista nélkül",
"ImportListExclusionsLoadError": "Nem sikerült betölteni az importálási lista kizárásait",
"ImportListStatusAllPossiblePartialFetchHealthCheckMessage": "Minden lista kézi beavatkozást igényel az esetleges részleges lehívások miatt",
"ImportListsAniListSettingsImportCancelledHelpText": "Média: A sorozatot törölték",
"ImportListsAniListSettingsImportCompleted": "Az importálás befejeződött",
"ImportListsAniListSettingsImportCompletedHelpText": "Lista: Befejezett megtekintés",
"ImportExtraFilesEpisodeHelpText": "Importálja a megfelelő extra fájlokat (feliratok, nfo stb.) az epizódfájl importálása után",
"ImportListsAniListSettingsImportDropped": "Az importálás megszakadt",
"ImportListsAniListSettingsImportPaused": "Az importálás szünetel",
"ImportListsAniListSettingsImportPausedHelpText": "Lista: Várakozás",
"ErrorLoadingItem": "Hiba történt az elem betöltésekor",
"ErrorLoadingContents": "Hiba a tartalom betöltésekor",
"ErrorRestoringBackup": "Hiba a biztonsági mentés visszaállításakor",
"ICalLink": "iCal Link(ek)",
"RemoveQueueItemConfirmation": "Biztosan eltávolítja a következőt a sorból: \"{sourceTitle}\"?",
"EnableColorImpairedMode": "Engedélyezze a színtévesztő módot",
"EnableCompletedDownloadHandlingHelpText": "A befejezett letöltések automatikus importálása a letöltési kliensből",
"EpisodeNumbers": "Epizódszám(ok)",
"EpisodeProgress": "Az epizód előrehaladása",
"EpisodeNaming": "Epizód elnevezése",
"EpisodeSearchResultsLoadError": "Nem sikerült betölteni az epizódkeresés eredményeit. Próbáld újra később",
"EnableAutomaticAdd": "Automatikus hozzáadás engedélyezése",
"EnableMetadataHelpText": "Metaadatfájl létrehozásának engedélyezése ehhez a metaadattípushoz",
"EnableProfileHelpText": "Jelölje be a kiadási profil engedélyezéséhez",
"EpisodeTitleRequired": "Az epizód címe kötelező",
"HistoryLoadError": "Nem sikerült betölteni az előzményeket",
"RemoveQueueItem": "Eltávolítás {sourceTitle}",
"ResetQualityDefinitionsMessageText": "Biztosan vissza szeretné állítani a minőségi definíciókat?",
"DownloadClientSettingsInitialState": "Kezdeti állapot",
"DownloadClientSettingsOlderPriority": "Régebbi prioritás",
"DownloadClientSettingsRecentPriorityEpisodeHelpText": "Elsőbbség az elmúlt 14 napban sugárzott epizódok rögzítésekor",
"DownloadClientValidationSslConnectFailure": "Nem lehet SSL-n keresztül csatlakozni",
"DownloadClientValidationUnableToConnect": "Nem sikerült csatlakozni a következőhöz: {clientName}",
"EpisodeFileDeletedTooltip": "Az epizódfájl törölve",
"EpisodesLoadError": "Nem sikerült betölteni az epizódokat",
"ErrorLoadingContent": "Hiba történt a tartalom betöltésekor",
"GeneralSettingsSummary": "Port, SSL, felhasználónév/jelszó, proxy, elemzések és frissítések",
"HideEpisodes": "Epizódok elrejtése",
"ICalSeasonPremieresOnlyHelpText": "Egy évadban csak az első epizód lesz a hírfolyamban",
"HistorySeason": "Az idei szezon előzményeinek megtekintése",
"ICalTagsSeriesHelpText": "A hírcsatorna csak legalább egy egyező címkével rendelkező sorozatokat tartalmaz",
"IconForFinales": "Ikon a fináléhoz",
"DownloadClientUTorrentTorrentStateError": "Az uTorrent hibát jelez",
"General": "Általános",
"GeneralSettings": "Általános Beállítások",
"DownloadClientSettingsOlderPriorityEpisodeHelpText": "Elsőbbség a 14 nappal ezelőtt sugárzott epizódok megragadásánál",
"DownloadClientSettingsRecentPriority": "Legutóbbi prioritás",
"DownloadClientSettingsUseSslHelpText": "Biztonságos kapcsolat használata, amikor a(z) {clientName} szolgáltatással csatlakozik",
"DownloadClientValidationUnableToConnectDetail": "Kérjük, ellenőrizze a gazdagépnevet és a portot.",
"EnableRss": "RSS Aktiválás",
"EditSelectedSeries": "Kiválasztott sorozat szerkesztése",
"EnableInteractiveSearchHelpTextWarning": "Ez az indexelő nem támogatja a keresést",
"EpisodeHistoryLoadError": "Nem sikerült betölteni az epizódelőzményeket",
"EpisodeImported": "Epizód importálva",
"EpisodeInfo": "Epizód infó",
"EpisodeIsNotMonitored": "Az epizódot nem figyelik",
"EpisodeMissingFromDisk": "Az epizód hiányzik a lemezről",
"EpisodeMissingAbsoluteNumber": "Az epizódnak nincs abszolút epizódszáma",
"EpisodeTitle": "Epizód címe",
"FinaleTooltip": "Sorozat vagy évadzáró",
"EpisodeFilesLoadError": "Nem sikerült betölteni az epizódfájlokat",
"EpisodeHasNotAired": "Az epizód nem került adásba",
"DownloadClientSettingsInitialStateHelpText": "A torrentek kezdeti állapota hozzáadva a következőhöz {clientName}",
"EnableHelpText": "Metaadatfájl létrehozásának engedélyezése ehhez a metaadattípushoz",
"EpisodeFileRenamedTooltip": "Az epizódfájl átnevezve",
"EpisodeGrabbedTooltip": "Az epizódot letöltötte a(z) {indexer} és elküldte a(z) {downloadClient} számára",
"EpisodeImportedTooltip": "Az epizód letöltése sikeresen megtörtént, és a letöltés kliensből lett letöltve",
"EpisodeIsDownloading": "Az epizód letöltése folyamatban van",
"FilterNotInNext": "nem a következőben",
"FilterSeriesPlaceholder": "Sorozat Szűrő",
"FirstDayOfWeek": "A hét első napja",
"FreeSpace": "Szabad hely",
"Global": "Globális",
"HomePage": "Kezdőlap",
"ICalShowAsAllDayEventsHelpText": "Az események egész napos eseményekként jelennek meg a naptárban",
"IconForFinalesHelpText": "A sorozat/évadzáró ikon megjelenítése a rendelkezésre álló epizódinformációk alapján",
"WouldYouLikeToRestoreBackup": "Szeretné visszaállítani a(z) „{name}” biztonsági másolatot?",
"EnableAutomaticSearchHelpTextWarning": "Ha interaktív keresést használ, akkor lesz használva",
"EnableInteractiveSearchHelpText": "Interaktív keresés esetén lesz használatos",
"EventType": "Esemény típus",
"FilterDoesNotStartWith": "nem azzal kezdődik",
"FullColorEvents": "Színes események",
"FullSeason": "Teljes évad",
"Genres": "Műfajok",
"GeneralSettingsLoadError": "Nem sikerült betölteni az Általános beállításokat",
"HasMissingSeason": "Hiányzik az évad",
"IgnoreDownload": "Letöltés figyelmen kívül hagyása",
"IgnoreDownloadHint": "Leállítja a(z) {appName} alkalmazásnak a letöltés további feldolgozását",
"Forecast": "Előrejelzés",
"DownloadClientValidationApiKeyRequired": "API-kulcs szükséges",
"DownloadClientValidationAuthenticationFailure": "Hitelesítési hiba",
"Grab": "Megfog",
"DownloadClientValidationGroupMissing": "Csoport nem létezik",
"DownloadClientValidationTestTorrents": "Nem sikerült lekérni a torrentek listáját: {exceptionMessage}",
"ICalFeed": "iCal-Feed",
"ICalIncludeUnmonitoredEpisodesHelpText": "Vegyen fel nem figyelt epizódokat az iCal-Feed-be",
"EnableSslHelpText": "Az érvénybe léptetéshez rendszergazdaként való újraindítás szükséges",
"EndedSeriesDescription": "Az érvénybe léptetéshez rendszergazdaként való újraindítás szükséges",
"HealthMessagesInfoBox": "Az állapotfelmérés okáról további információkat találhat, ha a sor végén található wikilinkre (könyv ikonra) kattint, vagy megnézi [logs] ({link}). Ha nehézségei vannak ezen üzenetek értelmezése során, forduljon ügyfélszolgálatunkhoz az alábbi linkeken.",
"EnableSsl": "SSL engedélyezése",
"RemoveQueueItemRemovalMethod": "Eltávolítási módszer",
"RemoveQueueItemRemovalMethodHelpTextWarning": "Az „Eltávolítás a letöltési kliensből” eltávolítja a letöltést és a fájl(oka)t a letöltési kliensből.",
"RemoveQueueItemsRemovalMethodHelpTextWarning": "Az „Eltávolítás a letöltési kliensből” eltávolítja a letöltéseket és a fájlokat a letöltési kliensből.",
"DownloadClientValidationApiKeyIncorrect": "Az API kulcs helytelen",
"DownloadClientValidationCategoryMissing": "A kategória nem létezik",
"DownloadClientValidationCategoryMissingDetail": "A megadott kategória nem létezik a következőben: {clientName}. Először hozza létre a {clientName} szolgáltatásban.",
"DownloadClientValidationVerifySsl": "Ellenőrizze az SSL-beállításokat",
"DownloadClientVuzeValidationErrorVersion": "A protokoll verziója nem támogatott, használja a Vuze 5.0.0.0 vagy újabb verzióját a Vuze Web Remote bővítménnyel.",
"EditSeriesModalHeader": "Szerkesztés {title}",
"IgnoreDownloads": "Letöltések figyelmen kívül hagyása",
"IgnoreDownloadsHint": "Leállítja a(z) {appName} alkalmazást, hogy feldolgozza ezeket a letöltéseket",
"EnableAutomaticSearchHelpText": "Akkor lesz használatos, ha automatikus keresést hajt végre a felhasználói felületen vagy a(z) {appName} alkalmazáson keresztül",
"ErrorLoadingPage": "Hiba történt az oldal betöltésekor",
"RemoveFromDownloadClientHint": "Távolítsa el a letöltést és a fájlokat) a letöltési kliensből",
"RemoveMultipleFromDownloadClientHint": "Eltávolítja a letöltéseket és fájlokat a letöltési kliensből",
"InteractiveImportNoQuality": "Minden kiválasztott fájlhoz ki kell választani a minőséget",
"ImportScriptPath": "Szkript elérési út importálása",
"ImportScriptPathHelpText": "Az importáláshoz használandó szkript elérési útja",
"ImportSeries": "Sorozat importálása",
"ImportUsingScript": "Importálás Script használatával",
"InteractiveSearch": "Interaktív Keresés",
"ImportUsingScriptHelpText": "Fájlok másolása szkript segítségével történő importáláshoz (pl. átkódoláshoz)",
"IncludeUnmonitored": "Tartalmazza a Nem felügyeltet",
"InteractiveImportNoSeason": "Minden kiválasztott fájlhoz ki kell választani az évadot",
"Mixed": "Mixed",
"ImportListsTraktSettingsGenresHelpText": "Sorozatok szűrése Trakt Genre Slug szerint (vesszővel elválasztva) Csak a népszerű listákhoz",
"ImportListsTraktSettingsListName": "Lista név",
"ImportListsTraktSettingsLimitHelpText": "Korlátozza a beszerezhető sorozatok számát",
"ImportListsTraktSettingsListNameHelpText": "Az importáláshoz szükséges listanév, a listának nyilvánosnak kell lennie, vagy hozzáféréssel kell rendelkeznie a listához",
"ImportListsTraktSettingsListType": "Lista típus",
"ImportListsTraktSettingsPopularListTypeAnticipatedShows": "Várható műsorok",
"ImportListsTraktSettingsPopularListTypePopularShows": "Népszerű műsorok",
"ImportListsTraktSettingsListTypeHelpText": "Az importálni kívánt lista típusa",
"ImportListsTraktSettingsPopularListTypeRecommendedYearShows": "Évek szerint ajánlott műsorok",
"ImportListsTraktSettingsPopularListTypeRecommendedWeekShows": "Ajánlott műsorok hetente",
"ImportListsTraktSettingsPopularListTypeTrendingShows": "Felkapott műsorok",
"ImportListsTraktSettingsPopularName": "Trakt Népszerű lista",
"ImportListsTraktSettingsPopularListTypeTopYearShows": "A legjobban nézett műsorok év szerint",
"ImportListsTraktSettingsRating": "Értékelés",
"ImportListsTraktSettingsUserListName": "Trakt Felhasználó",
"ImportListsTraktSettingsUserListUsernameHelpText": "Felhasználónév az importálandó listához (hagyja üresen az Auth User használatához)",
"ImportListsTraktSettingsUserListTypeWatched": "Felhasználói figyelt lista",
"ImportListsTraktSettingsWatchedListFilterHelpText": "Ha a Lista típusa Figyelt, válassza ki az importálni kívánt sorozattípust",
"ImportListsTraktSettingsWatchedListSortingHelpText": "Ha a Lista típusa Figyelt, válassza ki a sorrendet a lista rendezéséhez",
"ImportListsTraktSettingsWatchedListTypeCompleted": "100% Megnézve",
"ImportListsTraktSettingsWatchedListTypeAll": "Minden",
"ImportListsTraktSettingsWatchedListTypeInProgress": "Folyamatban",
"ImportListsTraktSettingsYearsHelpText": "Sorozatok szűrése év vagy évtartomány szerint",
"ImportListsValidationInvalidApiKey": "Az API-kulcs érvénytelen",
"ImportListsValidationTestFailed": "A teszt megszakadt hiba miatt: {exceptionMessage}",
"IncludeCustomFormatWhenRenaming": "Átnevezéskor adja meg az Egyéni formátumot",
"InteractiveSearchModalHeader": "Interaktív Keresés",
"InteractiveSearchSeason": "Interaktív keresés az évad összes epizódjához",
"MetadataXmbcSettingsSeriesMetadataUrlHelpText": "A TVDB műsor URL-jének szerepeltetése a tvshow.nfo-ban (kombinálható a „Sorozat metaadataival”)",
"ImportedTo": "Importált ide",
"ImportListsTraktSettingsPopularListTypeRecommendedAllTimeShows": "Minden idők ajánlott műsorai",
"ImportListsTraktSettingsPopularListTypeRecommendedMonthShows": "Ajánlott műsorok havonta",
"ImportListsTraktSettingsPopularListTypeTopMonthShows": "A legnézettebb műsorok hónapok szerint",
"ImportListsTraktSettingsPopularListTypeTopWeekShows": "A legnézettebb műsorok heti bontásban",
"ImportListsTraktSettingsRatingHelpText": "Sorozatok szűrése értékelési tartomány szerint (0-100)",
"ImportListsTraktSettingsUsernameHelpText": "Felhasználónév az importálandó listához",
"ImportListsTraktSettingsWatchedListSorting": "Figyelőlista rendezése",
"ImportListsTraktSettingsYears": "Évek",
"ImportListsTraktSettingsWatchedListFilter": "Figyelt lista szűrője",
"MinimumAgeHelpText": "Csak Usenet: Az NZB-k minimális életkora percekben, mielőtt elkapnák őket. Használja ezt, hogy időt adjon az új kiadásoknak, hogy eljuthassanak a usenet szolgáltatóhoz.",
"LogOnly": "Csak naplózás",
"MonitorPilotEpisode": "Pilot epizód",
"ImportListsTraktSettingsPopularListTypeTopAllTimeShows": "Minden idők legjobban nézett műsorai",
"ImportListsTraktSettingsUserListTypeCollection": "Felhasználói gyűjtőlista",
"ImportListsTraktSettingsUserListTypeWatch": "Felhasználói figyelőlista",
"InteractiveImportNoSeries": "Minden kiválasztott fájlhoz sorozatot kell választani",
"ListSyncLevelHelpText": "A könyvtárban lévő sorozatokat a választása alapján kezeljük, ha kimaradnak, vagy nem jelennek meg a listá(k)on",
"ListSyncTagHelpText": "Ez a címke akkor kerül hozzáadásra, ha egy sorozat kiesik, vagy már nem szerepel a listán(ok)",
"MediaInfoFootNote": "A MediaInfo Full/AudioLanguages/SubtitleLanguages támogatja az „:EN+DE” utótagot, amely lehetővé teszi a fájlnévben szereplő nyelvek szűrését. Adott nyelvek kizárásához használja a \"-DE\" billentyűt. A `+` hozzáfűzése (pl. `:EN+`) az `[EN]`/`[EN+--]`/`[--]` karakterláncot adja ki a kizárt nyelvektől függően. Például `{MediaInfo Full:EN+DE}`.",
"ReleaseSceneIndicatorAssumingScene": "Jelenetszámozást feltételezve.",
"RssIsNotSupportedWithThisIndexer": "Ez az indexelő nem támogatja az RSS-t",
"SceneInformation": "Jelenet Információ",
"QualityDefinitionsLoadError": "Nem sikerült betölteni a minőségi meghatározásokat",
"QualityLimitsSeriesRuntimeHelpText": "A korlátok automatikusan igazodnak a sorozat futási idejéhez és a fájlban lévő epizódok számához.",
"QualityProfileInUseSeriesListCollection": "Nem törölhető egy sorozathoz, listához vagy gyűjteményhez csatolt minőségi profil",
"RemoveFromQueue": "Eltávolítás a sorból",
"Reorder": "Újrarendelés",
"Repeat": "Ismétlés",
"ResetAPIKeyMessageText": "Biztosan visszaállítja API-kulcsát?",
"RestartLater": "Később újraindítom",
"PendingDownloadClientUnavailable": "Függőben A letöltési kliens nem érhető el",
"QualityDefinitions": "Minőségi meghatározások",
"QueueIsEmpty": "A sor üres",
"ReleaseProfilesLoadError": "Nem sikerült betölteni a release profilokat",
"RemoveFailedDownloadsHelpText": "A sikertelen letöltések eltávolítása a letöltési ügyfélelőzményekből",
"RenameEpisodes": "Epizódok átnevezése",
"RestartNow": "Újraindítás most",
"RestartRequiredHelpTextWarning": "Újraindítás szükséges az életbe lépéshez",
"RestrictionsLoadError": "Nem sikerült betölteni a korlátozásokat",
"RestartSonarr": "{appName} újraindítása",
"QualitySettingsSummary": "Minőségi méretek és elnevezések",
"RemoveCompletedDownloadsHelpText": "Távolítsa el az importált letöltéseket a letöltési ügyfélelőzményekből",
"PendingChangesMessage": "Vannak nem mentett módosításai. Biztosan elhagyja ezt az oldalt?",
"Permissions": "Engedélyek",
"PreferredProtocol": "Preferált protokoll",
"QualitiesLoadError": "Nem lehet minőségeket betölteni",
"RemoveTagsAutomatically": "Címkék automatikus eltávolítása",
"ResetAPIKey": "API Kulcs Visszaállítása",
"RootFoldersLoadError": "Nem sikerült betölteni a gyökérmappákat",
"RootFolders": "Gyökér mappák",
"ProfilesSettingsSummary": "Minőségi, nyelv késleltetési és Release profilok",
"PendingChangesStayReview": "Maradjon és tekintse át a változtatásokat",
"PreferredSize": "Preferált méret",
"QualitySettings": "Minőség Beállítások",
"RemoveDownloadsAlert": "Az Eltávolítási beállítások átkerültek a fenti táblázatban a Letöltési kliens egyéni beállításaiba.",
"RemovingTag": "Címke eltávolítása",
"RescanAfterRefreshSeriesHelpText": "Olvassa be újra a sorozat mappát a sorozat frissítése után",
"RestoreBackup": "Biztonsági mentés visszaállítása",
"RssSyncIntervalHelpText": "Intervallum percekben. A letiltáshoz állítsa nullára (ez leállítja az összes automatikus feloldást)",
"ProxyUsernameHelpText": "Csak akkor kell megadnia egy felhasználónevet és jelszót, ha szükséges. Ellenkező esetben hagyja üresen.",
"SaveChanges": "Változtatások mentése",
"Port": "Port",
"ProxyBypassFilterHelpText": "Használja a ',' jelet elválasztóként és a '*' jelet. helyettesítő karakterként az aldomainekhez",
"PublishedDate": "Közzététel dátuma",
"QualityCutoffNotMet": "A minőségi korlát nem teljesült",
"RemoveFromBlocklist": "Eltávolítás a tiltólistáról",
"RemovedFromTaskQueue": "Eltávolítva a feladatsorból",
"RemoveSelected": "A kiválasztott eltávolítása",
"RescanSeriesFolderAfterRefresh": "A sorozatmappa újraolvasása a frissítés után",
"ResetQualityDefinitions": "Minőségi meghatározások Visszaállítása",
"ResetTitles": "Címek Visszaállítása",
"RetentionHelpText": "Csak Usenet: Állítsa nullára a korlátlan megőrzéshez",
"RootFolderPath": "Gyökérmappa elérési útja",
"Rss": "RSS",
"RssSync": "RSS Sync",
"RssSyncIntervalHelpTextWarning": "Ez minden indexelőre vonatkozik, kérjük, kövesse az általuk meghatározott szabályokat",
"SaveSettings": "Beállítások mentése",
"Scene": "Jelenet",
"SceneInfo": "Jelenet Infó",
"SceneNumberNotVerified": "A jelenet számát még nem ellenőrizték",
"SceneNumbering": "Jelenet számozás",
"SearchForCutoffUnmetEpisodes": "Az összes Cutoff Unmet epizód keresése",
"PreviewRename": "Előnézet Átnevezés",
"ReleaseSceneIndicatorAssumingTvdb": "TVDB számozást feltételezve.",
"ReleaseTitle": "Release kiadás",
"RssSyncInterval": "RSS szinkronizálási időköz",
"PortNumber": "Port száma",
"QueueFilterHasNoItems": "A kiválasztott sorszűrőben nincsenek elemek",
"SearchForAllMissingEpisodes": "Keresse meg az összes hiányzó epizódot",
"QualityProfiles": "Minőségi profilok",
"QualityProfilesLoadError": "Nem sikerült betölteni a minőségi profilokat",
"RemoveRootFolder": "A gyökérmappa eltávolítása",
"RemoveSelectedBlocklistMessageText": "Biztosan eltávolítja a kijelölt elemeket a tiltólistáról?",
"RemotePathMappingsLoadError": "Nem sikerült betölteni a távoli útvonal-leképezéseket",
"RemoveTagsAutomaticallyHelpText": "Ha a feltételek nem teljesülnek, automatikusan távolítsa el a címkéket",
"RenameFiles": "Fájlok átnevezése",
"PostImportCategory": "Import utáni kategória",
"RemoveFilter": "Szűrő Eltávolítás",
"PosterOptions": "Poszter opciók",
"Posters": "Poszterek",
"PrefixedRange": "Előtag tartomány",
"Presets": "Előbeállítások",
"PreviewRenameSeason": "Előnézet Átnevezése ebben az évadban",
"PreviouslyInstalled": "Korábban telepítve",
"PrioritySettings": "Prioritás: {priority}",
"ProcessingFolders": "Mappák feldolgozása",
"ProgressBarProgress": "Haladásjelző sáv: {progress}%",
"ProxyType": "Proxy típus",
"RegularExpressionsTutorialLink": "További részletek a reguláris kifejezésekről [itt](https://www.regular-expressions.info/tutorial.html).",
"ReplaceIllegalCharacters": "Cserélje ki az illegális karaktereket",
"ResetDefinitionTitlesHelpText": "A definíciócímek és értékek visszaállítása",
"ResetDefinitions": "Definíciók visszaállítása",
"Score": "Pontszám",
"Search": "Keresés",
"SearchByTvdbId": "Kereshet egy műsor TVDB azonosítójával is. például. tvdb:71663",
"SearchFailedError": "A keresés sikertelen, próbálja újra később.",
"SearchForAllMissingEpisodesConfirmationCount": "Biztosan megkeresi az összes {totalRecords} hiányzó epizódot?",
"PosterSize": "Poszter méret",
"ProxyPasswordHelpText": "Csak akkor kell megadnia egy felhasználónevet és jelszót, ha szükséges. Ellenkező esetben hagyja üresen.",
"ReleaseProfileTagSeriesHelpText": "A kiadási profilok a legalább egy megfelelő címkével rendelkező sorozatokra vonatkoznak. Hagyja üresen, ha az összes sorozatra alkalmazni szeretné",
"Paused": "Szüneteltetve",
"SeasonPack": "Szezon Pack",
"SetPermissionsLinuxHelpText": "Futtatandó a chmod a fájlok importálásakor",
"Preferred": "Előnyben részesített",
"SeasonNumberToken": "Évad{seasonNumber}",
"SecretToken": "Titkos token",
"PartialSeason": "Részleges szezon",
"SeasonPassTruncated": "Csak a legutóbbi 25 évad látható, az összes évszak megtekintéséhez menjen a részletekhez",
"Seasons": "Évad",
"Pending": "Függőben levő",
"PendingChangesDiscardChanges": "Vesse el a változtatásokat, és lépjen ki",
"SeasonPremiere": "Évad Premier",
"SeasonPremieresOnly": "Csak az évad premierjei",
"PasswordConfirmation": "Jelszó megerősítése"
}

View File

@@ -107,7 +107,7 @@
"AbsoluteEpisodeNumber": "Numero Episodio Assoluto",
"AddConditionError": "Non è stato possibile aggiungere una nuova condizione. Riprova.",
"AddConnection": "Aggiungi Connessione",
"AddAutoTagError": "Non è stato possibile aggiungere una nuova etichetta automatica. Riprova.",
"AddAutoTagError": "Impossibile aggiungere un nuovo tag automatico, riprova.",
"AddCustomFormat": "Aggiungi Formato Personalizzato",
"AddDownloadClient": "Aggiungi Client di Download",
"AddCustomFormatError": "Non riesco ad aggiungere un nuovo formato personalizzato, riprova.",
@@ -248,5 +248,6 @@
"AddListExclusionSeriesHelpText": "Impedisce che le serie vengano aggiunte a{appName} tramite liste",
"AnimeEpisodeTypeDescription": "Episodi rilasciati utilizzando un numero di episodio assoluto",
"AnimeEpisodeTypeFormat": "Numero assoluto dell'episodio ({format})",
"AutoRedownloadFailed": "Download fallito"
"AutoRedownloadFailed": "Download fallito",
"AddDelayProfileError": "Impossibile aggiungere un nuovo profilo di ritardo, riprova."
}

View File

@@ -151,5 +151,24 @@
"AutoRedownloadFailed": "Opnieuw downloaden mislukt",
"AutoRedownloadFailedFromInteractiveSearch": "Opnieuw downloaden mislukt vanuit interactief zoeken",
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Zoek en download automatisch een andere release als een release vanuit interactief zoeken mislukt is",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Bevestig het nieuwe wachtwoord"
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Bevestig het nieuwe wachtwoord",
"AutomaticSearch": "Automatisch Zoeken",
"Automatic": "Automatisch",
"BackupRetentionHelpText": "Automatische veiligheidskopieën ouder dan de retentie periode zullen worden opgeruimd",
"BackupsLoadError": "Kon geen veiligheidskopieën laden",
"Backup": "Veiligheidskopie",
"Backups": "Veiligheidskopieën",
"AutoTaggingSpecificationMaximumYear": "Maximum Jaar",
"AutoTaggingSpecificationMinimumYear": "Minimum Jaar",
"AutoTaggingSpecificationOriginalLanguage": "Taal",
"AutoTaggingSpecificationQualityProfile": "Kwaliteitsprofiel",
"AutoTaggingSpecificationRootFolder": "Hoofdmap",
"AutoTaggingSpecificationSeriesType": "Series Type",
"AutoTaggingSpecificationStatus": "Status",
"BackupIntervalHelpText": "Tussentijd voor automatische back-up",
"AddRootFolderError": "De hoofd map kon niet toegevoegd worden",
"AutoTaggingSpecificationGenre": "Genre(s)",
"BackupFolderHelpText": "Relatieve paden zullen t.o.v. de {appName} AppData map bekeken worden",
"BindAddress": "Gebonden Adres",
"BindAddressHelpText": "Geldig IP-adres, localhost of '*' voor alle interfaces"
}

View File

@@ -479,7 +479,7 @@
"Condition": "Condição",
"ConditionUsingRegularExpressions": "Esta condição corresponde ao uso de Expressões Regulares. Observe que os caracteres `\\^$.|?*+()[{` têm significados especiais e precisam escape com um `\\`",
"ConnectSettings": "Configurações de Conexão",
"ConnectSettingsSummary": "Notificações, conexões com servidores/reprodutores de mídia e scripts personalizados",
"ConnectSettingsSummary": "Notificações, conexões com servidores/players de mídia e scripts personalizados",
"Connections": "Conexões",
"CopyToClipboard": "Copiar para Área de Transferência",
"CopyUsingHardlinksHelpTextWarning": "Ocasionalmente, os bloqueios de arquivo podem impedir a renomeação de arquivos que estão sendo propagados. Você pode desativar temporariamente a propagação e usar a função de renomeação do {appName} como solução alternativa.",
@@ -597,7 +597,7 @@
"ImportListExclusionsLoadError": "Não foi possível carregar as exclusões da lista de importação",
"ImportListSettings": "Configurações de Importar listas",
"ImportListsLoadError": "Não foi possível carregar Importar listas",
"ImportListsSettingsSummary": "Importar de outra instância do {appName} ou de listas do Trakt, e gerenciar as exclusões de lista",
"ImportListsSettingsSummary": "Importe de outra instância do {appName} ou listas do Trakt e gerencie exclusões de listas",
"ImportScriptPath": "Caminho para importar script",
"ImportScriptPathHelpText": "O caminho para o script a ser usado para importar",
"ImportUsingScript": "Importar usando script",
@@ -729,7 +729,7 @@
"QualityProfiles": "Perfis de Qualidade",
"QualityProfilesLoadError": "Não é possível carregar perfis de qualidade",
"QualitySettings": "Configurações de Qualidade",
"QualitySettingsSummary": "Tamanhos de qualidade e nomenclatura",
"QualitySettingsSummary": "Tamanhos e nomenclatura de qualidade",
"Range": "Faixa",
"RecyclingBin": "Lixeira",
"RecyclingBinCleanup": "Esvaziar Lixeira",
@@ -865,7 +865,7 @@
"TagDetails": "Detalhes da Tag - {label}",
"TagIsNotUsedAndCanBeDeleted": "A tag não é usada e pode ser excluída",
"TagsLoadError": "Não foi possível carregar as tags",
"TagsSettingsSummary": "Veja todas as tags e como elas são usadas. Tags não utilizadas podem ser removidas",
"TagsSettingsSummary": "Veja todas as etiquetas e como elas são usadas. Etiquetas não utilizadas podem ser removidas",
"TestAllClients": "Testar todos os clientes",
"TestAllIndexers": "Testar todos os indexadores",
"TestAllLists": "Testar todas as listas",
@@ -885,7 +885,7 @@
"UiLanguage": "Idioma da UI",
"UiLanguageHelpText": "Idioma que o {appName} usará para interface do usuário",
"UiSettings": "Configurações da UI",
"UiSettingsSummary": "Opções de calendário, data e cores para deficientes visuais",
"UiSettingsSummary": "Opções de calendário, data e cores para daltônicos",
"Underscore": "Sublinhar",
"Ungroup": "Desagrupar",
"Unlimited": "Ilimitado",
@@ -1231,7 +1231,7 @@
"RootFolderSelectFreeSpace": "{freeSpace} Livre",
"Search": "Pesquisar",
"SelectDownloadClientModalTitle": "{modalTitle} - Selecione o Cliente de Download",
"SelectReleaseGroup": "Selecionar Grupo do Lançamento",
"SelectReleaseGroup": "Selecionar um Grupo de Lançamento",
"SelectSeason": "Selecionar Temporada",
"SelectSeasonModalTitle": "{modalTitle} - Selecione a Temporada",
"SetReleaseGroup": "Definir Grupo do Lançamento",
@@ -1279,7 +1279,7 @@
"SelectLanguage": "Selecione o Idioma",
"SelectLanguageModalTitle": "{modalTitle} - Selecione o Idioma",
"SelectLanguages": "Selecione os Idiomas",
"SelectQuality": "Selecionar Qualidade",
"SelectQuality": "Selecionar uma Qualidade",
"SelectSeries": "Selecionar a Série",
"SetReleaseGroupModalTitle": "{modalTitle} - Definir Grupo de Lançamento",
"Shutdown": "Desligar",
@@ -1316,7 +1316,7 @@
"ShowUnknownSeriesItemsHelpText": "Mostrar itens sem uma série na fila, isso pode incluir séries, filmes removidos ou qualquer outra coisa na categoria do {appName}",
"Test": "Teste",
"Level": "Nível",
"AddListExclusion": "Adicionar exclusão à lista",
"AddListExclusion": "Adicionar Exclusão de Lista",
"AddListExclusionSeriesHelpText": "Impedir que o {appName} adicione séries por listas",
"EditSeriesModalHeader": "Editar - {title}",
"EditSelectedSeries": "Editar Séries Selecionadas",
@@ -1454,7 +1454,7 @@
"SearchForAllMissingEpisodesConfirmationCount": "Tem certeza de que deseja pesquisar todos os episódios ausentes de {totalRecords}?",
"SearchSelected": "Pesquisar Selecionado",
"CutoffUnmetLoadError": "Erro ao carregar itens de limite não atendido",
"MassSearchCancelWarning": "Após começar, não é possível cancelar sem reiniciar o {appName} ou desabilitar todos os seus indexadores.",
"MassSearchCancelWarning": "Isso não pode ser cancelado depois de iniciado sem reiniciar {appName} ou desabilitar todos os seus indexadores.",
"SearchForAllMissingEpisodes": "Pesquisar por todos os episódios ausentes",
"SearchForCutoffUnmetEpisodes": "Pesquise todos os episódios que o corte não foi atingido",
"SearchForCutoffUnmetEpisodesConfirmationCount": "Tem certeza de que deseja pesquisar todos os episódios de {totalRecords} corte não atingido?",
@@ -1469,7 +1469,7 @@
"FormatAgeMinutes": "minutos",
"FormatDateTimeRelative": "{relativeDay}, {formattedDate} {formattedTime}",
"FormatRuntimeHours": "{hours}h",
"FormatRuntimeMinutes": "{minutes} m",
"FormatRuntimeMinutes": "{minutes}m",
"FormatShortTimeSpanHours": "{hours} hora(s)",
"FormatShortTimeSpanMinutes": "{minutes} minuto(s)",
"FormatShortTimeSpanSeconds": "{seconds} segundo(s)",
@@ -1484,7 +1484,7 @@
"QueueFilterHasNoItems": "O filtro de fila selecionado não possui itens",
"BlackholeFolderHelpText": "Pasta na qual {appName} armazenará o arquivo {extension}",
"Destination": "Destinação",
"DownloadClientDelugeSettingsUrlBaseHelpText": "Adiciona um prefixo aURL json do Deluge, consulte {url}",
"DownloadClientDelugeSettingsUrlBaseHelpText": "Adiciona um prefixo ao URL json do deluge, consulte {url}",
"DownloadClientDelugeValidationLabelPluginFailure": "Falha na configuração do rótulo",
"DownloadClientDelugeValidationLabelPluginFailureDetail": "{appName} não conseguiu adicionar o rótulo ao {clientName}.",
"DownloadClientDownloadStationProviderMessage": "{appName} não consegue se conectar ao Download Station se a autenticação de dois fatores estiver habilitada em sua conta DSM",
@@ -1496,8 +1496,8 @@
"DownloadClientNzbgetValidationKeepHistoryOverMax": "A configuração NzbGet KeepHistory deve ser menor que 25.000",
"DownloadClientNzbgetValidationKeepHistoryZeroDetail": "A configuração KeepHistory do NzbGet está definida como 0. O que impede que {appName} veja os downloads concluídos.",
"DownloadClientSettingsUrlBaseHelpText": "Adiciona um prefixo ao URL {clientName}, como {url}",
"DownloadClientSettingsUseSslHelpText": "Usar conexão segura ao conectar-se a {clientName}",
"DownloadClientTransmissionSettingsDirectoryHelpText": "Local opcional para colocar downloads, deixe em branco para usar o local padrão do Transmission",
"DownloadClientSettingsUseSslHelpText": "Use conexão segura ao conectar-se a {clientName}",
"DownloadClientTransmissionSettingsDirectoryHelpText": "Local opcional para colocar downloads, deixe em branco para usar o local de transmissão padrão",
"DownloadClientTransmissionSettingsUrlBaseHelpText": "Adiciona um prefixo ao URL rpc {clientName}, por exemplo, {url}, o padrão é '{defaultUrl}'",
"DownloadClientValidationAuthenticationFailureDetail": "Por favor verifique seu nome de usuário e senha. Verifique também se o host que executa {appName} não está impedido de acessar {clientName} pelas limitações da WhiteList na configuração de {clientName}.",
"DownloadClientValidationSslConnectFailureDetail": "{appName} não consegue se conectar a {clientName} usando SSL. Este problema pode estar relacionado ao computador. Tente configurar {appName} e {clientName} para não usar SSL.",
@@ -1505,11 +1505,11 @@
"PostImportCategory": "Categoria Pós-Importação",
"SecretToken": "Token Secreto",
"TorrentBlackhole": "Torrent Blackhole",
"TorrentBlackholeSaveMagnetFiles": "Salvar Arquivos Magnéticos",
"TorrentBlackholeSaveMagnetFilesHelpText": "Salve o link magnético se nenhum arquivo .torrent estiver disponível (útil apenas se o cliente de download suportar magnético salvos em um arquivo)",
"TorrentBlackholeSaveMagnetFiles": "Salvar Arquivos Magnets",
"TorrentBlackholeSaveMagnetFilesHelpText": "Salve o link magnet se nenhum arquivo .torrent estiver disponível (útil apenas se o cliente de download suportar magnets salvos em um arquivo)",
"UnknownDownloadState": "Estado de download desconhecido: {state}",
"UsenetBlackhole": "Usenet Blackhole",
"DownloadClientQbittorrentSettingsInitialStateHelpText": "Estado inicial para torrents adicionados ao qBittorrent. Observe que os Torrents Forçados não obedecem às restrições de sementes",
"DownloadClientQbittorrentSettingsInitialStateHelpText": "Estado inicial para torrents adicionados ao qBittorrent. Observe que os Torrents Forçados não obedecem às restrições de semeação",
"DownloadClientQbittorrentTorrentStatePathError": "Não foi possível importar. O caminho corresponde ao diretório de download da base do cliente, é possível que 'Manter pasta de nível superior' esteja desabilitado para este torrent ou 'Layout de conteúdo de torrent' NÃO esteja definido como 'Original' ou 'Criar subpasta'?",
"DownloadClientQbittorrentValidationCategoryUnsupportedDetail": "As categorias não são suportadas até a versão 3.3.0 do qBittorrent. Atualize ou tente novamente com uma categoria vazia.",
"DownloadClientQbittorrentValidationRemovesAtRatioLimit": "qBittorrent está configurado para remover torrents quando eles atingem seu limite de proporção de compartilhamento",
@@ -1545,8 +1545,8 @@
"DownloadClientFreeboxNotLoggedIn": "Não logado",
"DownloadClientFreeboxSettingsApiUrl": "URL da API",
"DownloadClientFreeboxSettingsApiUrlHelpText": "Defina o URL base da API Freebox com a versão da API, por exemplo, '{url}', o padrão é '{defaultApiUrl}'",
"DownloadClientFreeboxSettingsAppId": "ID do Aplicativo",
"DownloadClientFreeboxSettingsAppToken": "Token do Aplicativo",
"DownloadClientFreeboxSettingsAppId": "ID do App",
"DownloadClientFreeboxSettingsAppToken": "Token do App",
"DownloadClientFreeboxSettingsAppTokenHelpText": "Token do aplicativo recuperado ao criar acesso à API Freebox (ou seja, 'app_token')",
"DownloadClientFreeboxSettingsHostHelpText": "Nome do host ou endereço IP do host do Freebox, o padrão é '{url}' (só funcionará se estiver na mesma rede)",
"DownloadClientFreeboxUnableToReachFreebox": "Não foi possível acessar a API Freebox. Verifique as configurações de 'Host', 'Porta' ou 'Usar SSL'. (Erro: {exceptionMessage})",
@@ -1560,10 +1560,10 @@
"DownloadClientPneumaticSettingsStrmFolder": "Pasta Strm",
"DownloadClientPneumaticSettingsStrmFolderHelpText": "Os arquivos .strm nesta pasta serão importados pelo drone",
"DownloadClientQbittorrentSettingsFirstAndLastFirst": "Primeiro e Último Primeiro",
"DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Baixe a primeira e a última partes primeiro (qBittorrent 4.1.0+)",
"DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Baixe a primeira e a última peças primeiro (qBittorrent 4.1.0+)",
"DownloadClientQbittorrentSettingsSequentialOrder": "Ordem Sequencial",
"DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Baixe em ordem sequencial (qBittorrent 4.1.0+)",
"DownloadClientQbittorrentSettingsUseSslHelpText": "Use uma conexão segura. Consulte Opções -> UI da Web -> 'Usar HTTPS em vez de HTTP' em qBittorrent.",
"DownloadClientQbittorrentSettingsUseSslHelpText": "Use uma conexão segura. Consulte Opções - UI da Web - 'Usar HTTPS em vez de HTTP' em qBittorrent.",
"DownloadClientQbittorrentTorrentStateDhtDisabled": "qBittorrent não pode resolver o link magnético com DHT desativado",
"DownloadClientQbittorrentTorrentStateError": "qBittorrent está relatando um erro",
"DownloadClientQbittorrentTorrentStateMetadata": "qBittorrent está baixando metadados",
@@ -1578,7 +1578,7 @@
"DownloadClientQbittorrentValidationQueueingNotEnabledDetail": "O Fila de Torrent não está habilitado nas configurações do qBittorrent. Habilite-o no qBittorrent ou selecione Último como prioridade.",
"DownloadClientRTorrentProviderMessage": "O rTorrent não pausará os torrents quando eles atenderem aos critérios de seed. {appName} lidará com a remoção automática de torrents com base nos critérios de propagação atuais em Configurações->Indexadores somente quando Remover Concluído estiver habilitado. · · Após a importação, ele também definirá {importedView} como uma visualização rTorrent, que pode ser usada em scripts rTorrent para personalizar o comportamento.",
"DownloadClientRTorrentSettingsAddStopped": "Adicionar Parado",
"DownloadClientRTorrentSettingsAddStoppedHelpText": "A ativação adicionará torrents e ímãs ao rTorrent em um estado parado. Isso pode quebrar os arquivos magnéticos.",
"DownloadClientRTorrentSettingsAddStoppedHelpText": "Habilitando, irá adicionar torrents e magnets ao rTorrent em um estado parado. Isso pode quebrar os arquivos magnéticos.",
"DownloadClientRTorrentSettingsDirectoryHelpText": "Local opcional para colocar downloads, deixe em branco para usar o local padrão do rTorrent",
"DownloadClientRTorrentSettingsUrlPath": "Caminho da URL",
"DownloadClientSabnzbdValidationCheckBeforeDownload": "Desative a opção Verificar antes do download no Sabnbzd",
@@ -1620,8 +1620,8 @@
"DownloadClientValidationVerifySslDetail": "Verifique sua configuração SSL em {clientName} e {appName}",
"DownloadClientVuzeValidationErrorVersion": "Versão do protocolo não suportada, use Vuze 5.0.0.0 ou superior com o plugin Vuze Web Remote.",
"DownloadStationStatusExtracting": "Extraindo: {progress}%",
"TorrentBlackholeSaveMagnetFilesExtension": "Salvar extensão de arquivos magnéticos",
"TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Extensão a ser usada para links magnéticos, o padrão é '.magnet'",
"TorrentBlackholeSaveMagnetFilesExtension": "Salvar Arquivos Magnet com Extensão",
"TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Extensão a ser usada para links magnet, o padrão é '.magnet'",
"TorrentBlackholeSaveMagnetFilesReadOnly": "Só Leitura",
"TorrentBlackholeSaveMagnetFilesReadOnlyHelpText": "Em vez de mover arquivos, isso instruirá {appName} a copiar ou vincular (dependendo das configurações/configuração do sistema)",
"TorrentBlackholeTorrentFolder": "Pasta do Torrent",
@@ -1646,9 +1646,9 @@
"IndexerSettingsPasskey": "Passkey",
"IndexerSettingsRssUrl": "URL do RSS",
"IndexerSettingsSeasonPackSeedTime": "Tempo de Seed de Pack de Temporada",
"IndexerSettingsSeedRatio": "Taxa de Semeação",
"IndexerSettingsSeedRatio": "Proporção de Semeação",
"IndexerSettingsSeedTime": "Tempo de Semeação",
"IndexerSettingsSeedTimeHelpText": "O tempo que um torrent deve ser propagado antes de parar, vazio usa o padrão do cliente de download",
"IndexerSettingsSeedTimeHelpText": "O tempo que um torrent deve ser semeado antes de parar, vazio usa o padrão do cliente de download",
"IndexerSettingsWebsiteUrl": "URL do Website",
"IndexerValidationCloudFlareCaptchaExpired": "O token CloudFlare CAPTCHA expirou, atualize-o.",
"IndexerValidationFeedNotSupported": "O feed do indexador não é compatível: {exceptionMessage}",
@@ -1679,8 +1679,8 @@
"IndexerHDBitsSettingsCategories": "Categorias",
"IndexerHDBitsSettingsCategoriesHelpText": "se não for especificado, todas as opções serão usadas.",
"IndexerHDBitsSettingsCodecs": "Codecs",
"IndexerHDBitsSettingsCodecsHelpText": "Se não for especificado, todas as opções serão usadas.",
"IndexerHDBitsSettingsMediums": "Meio",
"IndexerHDBitsSettingsCodecsHelpText": "se não for especificado, todas as opções serão usadas.",
"IndexerHDBitsSettingsMediums": "Meios",
"IndexerHDBitsSettingsMediumsHelpText": "se não for especificado, todas as opções serão usadas.",
"ClearBlocklist": "Limpar lista de bloqueio",
"MonitorRecentEpisodesDescription": "Monitore episódios exibidos nos últimos 90 dias e episódios futuros",
@@ -2037,7 +2037,6 @@
"ListSyncTag": "Etiqueta de Sincronização de Lista",
"ListSyncTagHelpText": "Esta etiqueta será adicionada quando uma série cair ou não estiver mais na(s) sua(s) lista(s)",
"LogOnly": "Só Registro",
"UnableToLoadListOptions": "Não foi possível carregar as opções da lista",
"CleanLibraryLevel": "Limpar Nível da Biblioteca",
"AddDelayProfileError": "Não foi possível adicionar um novo perfil de atraso. Tente novamente."
}

View File

@@ -195,5 +195,21 @@
"AllFiles": "Все файлы",
"AllSeriesAreHiddenByTheAppliedFilter": "Все результаты скрыты фильтром",
"AlreadyInYourLibrary": "Уже в вашей библиотеке",
"Always": "Всегда"
"Always": "Всегда",
"Conditions": "Условия",
"AddAutoTag": "",
"AbsoluteEpisodeNumber": "Абсолютный номер эпизода",
"CustomFormatsSettings": "Настройки пользовательских форматов",
"Daily": "Ежедневно",
"AnalyticsEnabledHelpText": "Отправлять в {appName} анонимную информацию об использовании и ошибках. Анонимная статистика включает в себя информацию о браузере, какие страницы веб-интерфейса {appName} загружены, сообщения об ошибках, а также операционной системе. Мы используем эту информацию для выявления ошибок, а также для разработки нового функционала.",
"AppDataDirectory": "Директория AppData",
"AddANewPath": "Добавить новый путь",
"CustomFormatsLoadError": "Невозможно загрузить Специальные Форматы",
"CustomFormatsSpecificationLanguage": "Язык",
"CustomFormatsSpecificationMaximumSize": "Максимальный размер",
"CustomFormatsSpecificationMinimumSize": "Минимальный размер",
"CustomFormatsSpecificationRegularExpression": "Регулярное выражение",
"CustomFormatsSpecificationReleaseGroup": "Релиз группа",
"CustomFormatsSpecificationResolution": "Разрешение",
"CustomFormatsSpecificationSource": "Источник"
}

View File

@@ -7,12 +7,63 @@
"AddConditionImplementation": "Koşul Ekle - {implementationName}",
"EditConnectionImplementation": "Koşul Ekle - {implementationName}",
"AddConnectionImplementation": "Koşul Ekle - {implementationName}",
"AddIndexerImplementation": "Koşul Ekle - {implementationName}",
"AddIndexerImplementation": "Yeni Dizin Ekle - {implementationName}",
"EditIndexerImplementation": "Koşul Ekle - {implementationName}",
"AddToDownloadQueue": "İndirme sırasına ekle",
"AddToDownloadQueue": "İndirme kuyruğuna ekleyin",
"AddedToDownloadQueue": "İndirme sırasına eklendi",
"AllTitles": "Tüm Filmler",
"AbsoluteEpisodeNumbers": "Mutlak Bölüm Numaraları",
"Actions": "Eylemler",
"AbsoluteEpisodeNumber": "Mutlak Bölüm Numarası"
"AbsoluteEpisodeNumber": "Mutlak Bölüm Numarası",
"AddListExclusionError": "Yeni bir hariç tutma listesi eklenemiyor, lütfen tekrar deneyin.",
"AddListExclusion": "Liste Hariç Tutma Ekle",
"AddNewRestriction": "Yeni kısıtlama ekle",
"AddedDate": "Eklendi: {date}",
"Activity": "Etkinlik",
"Added": "Eklendi",
"AirDate": "Yayınlanma Tarihi",
"Add": "Ekle",
"AddingTag": "Etiket ekleniyor",
"Age": "Yaş",
"AgeWhenGrabbed": "Yaş (yakalandığında)",
"AddDelayProfileError": "Yeni bir gecikme profili eklenemiyor, lütfen tekrar deneyin.",
"AddImportList": "İçe Aktarım Listesi Ekle",
"AddImportListExclusion": "İçe Aktarma Listesi Hariç Tutma Ekle",
"AddImportListExclusionError": "Yeni bir içe aktarım listesi dışlaması eklenemiyor, lütfen tekrar deneyin.",
"AddImportListImplementation": "İçe Aktarım Listesi Ekle -{implementationName}",
"AddIndexer": "Dizin Oluşturucu Ekle",
"AddNewSeriesSearchForMissingEpisodes": "Kayıp bölümleri aramaya başlayın",
"AddNotificationError": "Yeni bir bildirim eklenemiyor, lütfen tekrar deneyin.",
"AddReleaseProfile": "Sürüm Profili Ekle",
"AddRemotePathMapping": "Uzak Yol Eşleme Ekleme",
"AddRootFolder": "Kök Klasör Ekle",
"AddSeriesWithTitle": "{title} Ekleyin",
"Agenda": "Ajanda",
"Airs": "Yayınlar",
"AddIndexerError": "Yeni dizin oluşturucu eklenemiyor, lütfen tekrar deneyin.",
"AddNewSeriesSearchForCutoffUnmetEpisodes": "Karşılanmamış bölümleri aramaya başlayın",
"AddQualityProfileError": "Yeni kalite profili eklenemiyor, lütfen tekrar deneyin.",
"AddRemotePathMappingError": "Yeni bir uzak yol eşlemesi eklenemiyor, lütfen tekrar deneyin.",
"AfterManualRefresh": "Manüel Yenilemeden Sonra",
"AddAutoTagError": "Yeni bir otomatik etiket eklenemiyor, lütfen tekrar deneyin.",
"AddConditionError": "Yeni bir koşul eklenemiyor, lütfen tekrar deneyin.",
"AddCustomFormat": "Özel Format Ekle",
"AddCustomFormatError": "Yeni bir özel biçim eklenemiyor, lütfen tekrar deneyin.",
"AddDelayProfile": "Gecikme Profili Ekleme",
"AddNewSeries": "Yeni Dizi Ekle",
"AddNewSeriesError": "Arama sonuçları yüklenemedi, lütfen tekrar deneyin.",
"AddNewSeriesHelpText": "Yeni bir dizi eklemek kolaydır, eklemek istediğiniz dizinin adını yazmaya başlamanız yeterlidir.",
"AddNewSeriesRootFolderHelpText": "'{folder}' alt klasörü otomatik olarak oluşturulacaktır",
"AddQualityProfile": "Kalite Profili Ekle",
"AddDownloadClient": "İndirme İstemcisi Ekle",
"AddANewPath": "Yeni bir yol ekle",
"AddDownloadClientError": "Yeni bir indirme istemcisi eklenemiyor, lütfen tekrar deneyin.",
"AddCustomFilter": "Özel Filtre Ekleyin",
"AddDownloadClientImplementation": "İndirme İstemcisi Ekle - {implementationName}",
"AddExclusion": "Hariç Tutma Ekleme",
"AddList": "Liste Ekleyin",
"AddListError": "Yeni bir liste eklenemiyor, lütfen tekrar deneyin.",
"AddNew": "Yeni Ekle",
"AddListExclusionSeriesHelpText": "Dizilerin {appName} listeler tarafından eklenmesini önleyin",
"AddRootFolderError": "Kök klasör eklenemiyor"
}

View File

@@ -156,7 +156,7 @@
"AudioLanguages": "音频语言",
"Certification": "分级",
"Component": "组件",
"ContinuingOnly": "仅继续",
"ContinuingOnly": "仅包含仍在继续",
"CountImportListsSelected": "已选择 {count} 个导入列表",
"CountIndexersSelected": "已选择 {count} 个索引器",
"CurrentlyInstalled": "已安装",
@@ -550,8 +550,8 @@
"AutoRedownloadFailedHelpText": "自动搜索并尝试下载不同的版本",
"AutoTaggingLoadError": "无法加载自动标记",
"Automatic": "自动化",
"AutoTaggingRequiredHelpText": "此 {implementationName} 条件必须匹配才能应用自动标记规则。否则,一个 {implementationName} 匹配就足够了。",
"AutoTaggingNegateHelpText": "如果选中,当 {implementationName} 条件匹配时,自动标记不会应用。",
"AutoTaggingRequiredHelpText": "这个{0}条件必须匹配自动标记规则才能应用。否则,一个{0}匹配就足够了。",
"AutoTaggingNegateHelpText": "如果选中,当 {0} 条件匹配时,自动标记不会应用。",
"BackupRetentionHelpText": "超过保留期限的自动备份将被自动清理",
"BackupsLoadError": "无法加载备份",
"BypassDelayIfAboveCustomFormatScoreMinimumScore": "最小自定义格式分数",
@@ -761,7 +761,7 @@
"HealthMessagesInfoBox": "您可以通过单击行尾的wiki链接(图书图标)或检查[日志]({link})来查找有关这些运行状况检查消息原因的更多信息。如果你在理解这些信息方面有困难,你可以通过下面的链接联系我们的支持。",
"StandardEpisodeFormat": "标准单集格式",
"DefaultNameCopiedSpecification": "{name} - 复制",
"AddListExclusion": "添加列表例外",
"AddListExclusion": "新增 列表",
"AddListExclusionSeriesHelpText": "防止剧集通过列表添加到{appName}",
"AddNewSeriesSearchForCutoffUnmetEpisodes": "开始搜索未达截止条件的集",
"AddedDate": "加入于:{date}",
@@ -794,7 +794,7 @@
"DefaultNameCopiedProfile": "{name} - 复制",
"SeriesFinale": "大结局",
"SeriesFolderFormat": "剧集文件夹格式",
"ReplaceIllegalCharactersHelpText": "替换非法字符。如果未选中,{appName}将删除它们",
"ReplaceIllegalCharactersHelpText": "替换非法字符,如未勾选,则会被{appName}移除",
"SeriesAndEpisodeInformationIsProvidedByTheTVDB": "剧集和剧集信息由TheTVDB.com提供。[请考虑支持他们](https://www.thetvdb.com/subscribe)。",
"DeleteSelectedSeries": "删除选中的剧集",
"ProxyBypassFilterHelpText": "使用“ , ”作为分隔符,和“ *. ”作为二级域名的通配符",
@@ -806,7 +806,7 @@
"RegularExpressionsTutorialLink": "有关正则表达式的更多详细信息,请参阅[此处](https://www.regular-expressions.info/tutorial.html)。",
"FormatDateTime": "{formattedDate} {formattedTime}",
"ReleaseProfileTagSeriesHelpText": "发布配置将应用于至少有一个匹配标记的剧集。留空适用于所有剧集",
"FormatShortTimeSpanHours": "{hours} 时",
"FormatShortTimeSpanHours": "{hours}时",
"RemotePathMappingHostHelpText": "与您为远程下载客户端指定的主机相同",
"HideEpisodes": "隐藏集",
"HistorySeason": "查看本季历史记录",
@@ -1063,7 +1063,7 @@
"PreferUsenet": "首选Usenet",
"Preferred": "首选的",
"Presets": "预设",
"PreferredSize": "首选影片大小",
"PreferredSize": "首选专辑大小",
"PreviewRename": "重命名预览",
"PreviewRenameSeason": "重命名此季的预览",
"PreviousAiringDate": "上一次播出: {date}",
@@ -1092,7 +1092,7 @@
"RemoveFromBlocklist": "从黑名单中移除",
"RemoveCompletedDownloadsHelpText": "从下载客户端记录中移除已导入的下载",
"RemoveFromQueue": "从队列中移除",
"RemoveQueueItem": "删除- {sourceTitle}",
"RemoveQueueItem": "移除 - {sourceTitle}",
"RemoveTagsAutomatically": "自动删除标签",
"Repeat": "重复",
"ResetDefinitions": "重置定义",
@@ -1120,10 +1120,10 @@
"SeasonPassEpisodesDownloaded": "{episodeFileCount}/{totalEpisodeCount} 的剧集被下载",
"SeasonPassTruncated": "只显示最新的25季点击详情查看所有的季",
"SeasonPremieresOnly": "仅限季首播",
"SelectDropdown": "选择...",
"SelectDropdown": "选择",
"SelectEpisodesModalTitle": "{modalTitle} - 选择剧集",
"SelectFolderModalTitle": "{modalTitle} - 选择文件夹",
"SelectQuality": "选择质",
"SelectQuality": "选择质",
"SelectReleaseGroup": "选择发布组",
"SeriesDetailsGoTo": "转到 {title}",
"SeriesDetailsNoEpisodeFiles": "没有集文件",
@@ -1175,7 +1175,7 @@
"TvdbIdExcludeHelpText": "要排除的剧集 TVDB ID",
"TvdbId": "TVDB ID",
"TypeOfList": "{typeOfList} 列表",
"UiLanguageHelpText": "{appName}将用于UI的语言",
"UiLanguageHelpText": "{appName}使用的UI界面语言",
"UiSettings": "UI设置",
"UiLanguage": "UI界面语言",
"Umask770Description": "{octal} - 所有者和组写入",
@@ -1191,7 +1191,7 @@
"UnmonitorSpecialsEpisodesDescription": "取消监控所有特别节目而不改变其他集的监控状态",
"UnmonitorDeletedEpisodesHelpText": "从磁盘删除的集将在 {appName} 中自动取消监控",
"UnmonitorSpecialEpisodes": "取消监控特别节目",
"UpdateAll": "更新全部",
"UpdateAll": "全部更新",
"UpdateAutomaticallyHelpText": "自动下载并安装更新。你还可以在“系统:更新”中安装",
"UpdateSelected": "更新选择的内容",
"UpgradeUntilThisQualityIsMetOrExceeded": "升级直到影片质量超出或者满足",
@@ -1261,11 +1261,11 @@
"FormatAgeHours": "小时",
"FormatAgeMinute": "分钟",
"FormatAgeMinutes": "分钟",
"FormatDateTimeRelative": "{relativeDay}, {formattedDate} {formattedTime}",
"FormatRuntimeHours": "{hours}时",
"FormatDateTimeRelative": "{relativeDay}{formattedDate} {formattedTime}",
"FormatRuntimeHours": "{hours}时",
"FormatRuntimeMinutes": "{minutes}分",
"FormatShortTimeSpanMinutes": "{minutes} 分",
"FormatShortTimeSpanSeconds": "{seconds} 秒",
"FormatShortTimeSpanMinutes": "{minutes}分",
"FormatShortTimeSpanSeconds": "{seconds}秒",
"FormatTimeSpanDays": "{days}天 {time}",
"HistoryModalHeaderSeason": "{season} 历史记录",
"ImportSeries": "导入剧集",
@@ -1378,7 +1378,7 @@
"OnUpgrade": "升级中",
"RemotePathMappings": "远程路径映射",
"RemotePathMappingsLoadError": "无法加载远程路径映射",
"RemoveQueueItemConfirmation": "您确定要从队列中删除'{sourceTitle}'吗?",
"RemoveQueueItemConfirmation": "您确定要从队列中移除“{sourceTitle}”吗?",
"RequiredHelpText": "此 {implementationName} 条件必须匹配才能应用自定义格式。 否则,单个 {implementationName} 匹配就足够了。",
"RescanSeriesFolderAfterRefresh": "刷新后重新扫描剧集文件夹",
"RestartRequiredToApplyChanges": "{appName}需要重新启动才能应用更改,您想现在重新启动吗?",
@@ -1433,7 +1433,7 @@
"Monday": "星期一",
"Monitor": "是否监控",
"NotificationTriggersHelpText": "选择触发此通知的事件",
"ImportListsSettingsSummary": "从另一个{appName}Trakt列表导入并管理排除列表",
"ImportListsSettingsSummary": "从另一个 {appName} 实例或 Trakt 列表导入并管理列表排除项",
"ParseModalHelpTextDetails": "{appName} 将尝试解析标题并向您显示有关详情",
"Proxy": "代理",
"ImportScriptPath": "导入脚本路径",
@@ -1478,8 +1478,8 @@
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "下载客户端 {downloadClientName} 已被设置为删除已完成的下载。这可能导致在 {appName} 导入之前,已下载的文件会被从您的客户端中移除。",
"ImportListSearchForMissingEpisodesHelpText": "将系列添加到{appName}后,自动搜索缺失的剧集",
"AutoRedownloadFailed": "重新下载失败",
"AutoRedownloadFailedFromInteractiveSearch": "从交互式搜索重新下载失败",
"AutoRedownloadFailedFromInteractiveSearchHelpText": "当从交互式搜索中获取失败的版时,自动搜索并尝试下载其他版本",
"AutoRedownloadFailedFromInteractiveSearch": "手动搜索重新下载失败",
"AutoRedownloadFailedFromInteractiveSearchHelpText": "当从手动搜索中获取失败的发行版时,自动搜索并尝试下载不同的发行版",
"ImportListSearchForMissingEpisodes": "搜索缺失集",
"QueueFilterHasNoItems": "选定的队列过滤器没有项目",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "确认新密码",
@@ -1787,5 +1787,28 @@
"NotificationsPushBulletSettingSenderId": "发送 ID",
"DownloadClientAriaSettingsDirectoryHelpText": "可选的下载位置,留空使用 Aria2 默认位置",
"DownloadClientPriorityHelpText": "下载客户端优先级从1最高到50最低默认为1。具有相同优先级的客户端将轮换使用。",
"IndexerSettingsRejectBlocklistedTorrentHashes": "抓取时舍弃列入黑名单的种子散列值"
"IndexerSettingsRejectBlocklistedTorrentHashes": "抓取时舍弃列入黑名单的种子散列值",
"ChangeCategory": "改变分类",
"IgnoreDownload": "忽略下载",
"IgnoreDownloads": "忽略下载",
"IgnoreDownloadsHint": "阻止 {appName} 进一步处理这些下载",
"DoNotBlocklist": "不要列入黑名单",
"DoNotBlocklistHint": "删除而不列入黑名单",
"RemoveQueueItemRemovalMethod": "删除方法",
"BlocklistAndSearch": "黑名单和搜索",
"BlocklistAndSearchMultipleHint": "列入黑名单后开始搜索替代版本",
"BlocklistMultipleOnlyHint": "无需搜索替换的黑名单",
"BlocklistOnly": "仅限黑名单",
"BlocklistOnlyHint": "无需寻找替代版本的黑名单",
"ChangeCategoryMultipleHint": "将下载从下载客户端更改为“导入后类别”",
"CustomFormatsSpecificationRegularExpressionHelpText": "自定义格式正则表达式不区分大小写",
"CustomFormatsSpecificationRegularExpression": "正则表达式",
"RemoveFromDownloadClientHint": "从下载客户端删除下载和文件",
"RemoveMultipleFromDownloadClientHint": "从下载客户端删除下载和文件",
"RemoveQueueItemsRemovalMethodHelpTextWarning": "“从下载客户端移除”将从下载客户端移除下载内容和文件。",
"BlocklistAndSearchHint": "列入黑名单后开始寻找一个替代版本",
"ChangeCategoryHint": "将下载从下载客户端更改为“导入后类别”",
"IgnoreDownloadHint": "阻止 {appName} 进一步处理此下载",
"IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "如果 torrent 的哈希被屏蔽了某些索引器在使用RSS或者搜索期间可能无法正确拒绝它启用此功能将允许在抓取 torrent 之后但在将其发送到客户端之前拒绝它。",
"RemoveQueueItemRemovalMethodHelpTextWarning": "“从下载客户端移除”将从下载客户端移除下载内容和文件。"
}

View File

@@ -4,6 +4,7 @@ using NzbDrone.Common.Extensions;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.Languages;
using NzbDrone.Core.MediaFiles.MediaInfo;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Qualities;
using NzbDrone.Core.Tv;
@@ -21,6 +22,7 @@ namespace NzbDrone.Core.MediaFiles
public string SceneName { get; set; }
public string ReleaseGroup { get; set; }
public QualityModel Quality { get; set; }
public IndexerFlags IndexerFlags { get; set; }
public MediaInfoModel MediaInfo { get; set; }
public LazyLoaded<List<Episode>> Episodes { get; set; }
public LazyLoaded<Series> Series { get; set; }

View File

@@ -7,6 +7,7 @@ using NzbDrone.Common.Disk;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Download;
using NzbDrone.Core.Extras;
using NzbDrone.Core.History;
using NzbDrone.Core.MediaFiles.Commands;
using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Messaging.Commands;
@@ -28,6 +29,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport
private readonly IExtraService _extraService;
private readonly IExistingExtraFiles _existingExtraFiles;
private readonly IDiskProvider _diskProvider;
private readonly IHistoryService _historyService;
private readonly IEventAggregator _eventAggregator;
private readonly IManageCommandQueue _commandQueueManager;
private readonly Logger _logger;
@@ -37,6 +39,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport
IExtraService extraService,
IExistingExtraFiles existingExtraFiles,
IDiskProvider diskProvider,
IHistoryService historyService,
IEventAggregator eventAggregator,
IManageCommandQueue commandQueueManager,
Logger logger)
@@ -46,6 +49,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport
_extraService = extraService;
_existingExtraFiles = existingExtraFiles;
_diskProvider = diskProvider;
_historyService = historyService;
_eventAggregator = eventAggregator;
_commandQueueManager = commandQueueManager;
_logger = logger;
@@ -93,6 +97,22 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport
episodeFile.ReleaseGroup = localEpisode.ReleaseGroup;
episodeFile.Languages = localEpisode.Languages;
if (downloadClientItem?.DownloadId.IsNotNullOrWhiteSpace() == true)
{
var grabHistory = _historyService.FindByDownloadId(downloadClientItem.DownloadId)
.OrderByDescending(h => h.Date)
.FirstOrDefault(h => h.EventType == EpisodeHistoryEventType.Grabbed);
if (Enum.TryParse(grabHistory?.Data.GetValueOrDefault("indexerFlags"), true, out IndexerFlags flags))
{
episodeFile.IndexerFlags = flags;
}
}
else
{
episodeFile.IndexerFlags = localEpisode.IndexerFlags;
}
bool copyOnly;
switch (importMode)
{

View File

@@ -16,6 +16,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
public QualityModel Quality { get; set; }
public List<Language> Languages { get; set; }
public string ReleaseGroup { get; set; }
public int IndexerFlags { get; set; }
public string DownloadId { get; set; }
public bool Equals(ManualImportFile other)

View File

@@ -24,6 +24,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
public string DownloadId { get; set; }
public List<CustomFormat> CustomFormats { get; set; }
public int CustomFormatScore { get; set; }
public int IndexerFlags { get; set; }
public IEnumerable<Rejection> Rejections { get; set; }
public ManualImportItem()

View File

@@ -25,7 +25,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
{
List<ManualImportItem> GetMediaFiles(int seriesId, int? seasonNumber);
List<ManualImportItem> GetMediaFiles(string path, string downloadId, int? seriesId, bool filterExistingFiles);
ManualImportItem ReprocessItem(string path, string downloadId, int seriesId, int? seasonNumber, List<int> episodeIds, string releaseGroup, QualityModel quality, List<Language> languages);
ManualImportItem ReprocessItem(string path, string downloadId, int seriesId, int? seasonNumber, List<int> episodeIds, string releaseGroup, QualityModel quality, List<Language> languages, int indexerFlags);
}
public class ManualImportService : IExecute<ManualImportCommand>, IManualImportService
@@ -139,7 +139,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
return ProcessFolder(path, path, downloadId, seriesId, filterExistingFiles);
}
public ManualImportItem ReprocessItem(string path, string downloadId, int seriesId, int? seasonNumber, List<int> episodeIds, string releaseGroup, QualityModel quality, List<Language> languages)
public ManualImportItem ReprocessItem(string path, string downloadId, int seriesId, int? seasonNumber, List<int> episodeIds, string releaseGroup, QualityModel quality, List<Language> languages, int indexerFlags)
{
var rootFolder = Path.GetDirectoryName(path);
var series = _seriesService.GetSeries(seriesId);
@@ -167,8 +167,11 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
localEpisode.ExistingFile = series.Path.IsParentPath(path);
localEpisode.Size = _diskProvider.GetFileSize(path);
localEpisode.ReleaseGroup = releaseGroup.IsNullOrWhiteSpace() ? Parser.Parser.ParseReleaseGroup(path) : releaseGroup;
localEpisode.Languages = (languages?.SingleOrDefault() ?? Language.Unknown) == Language.Unknown ? languageParse : languages;
localEpisode.Languages = languages?.Count <= 1 && (languages?.SingleOrDefault() ?? Language.Unknown) == Language.Unknown ? languageParse : languages;
localEpisode.Quality = quality.Quality == Quality.Unknown ? QualityParser.ParseQuality(path) : quality;
localEpisode.CustomFormats = _formatCalculator.ParseCustomFormat(localEpisode);
localEpisode.CustomFormatScore = localEpisode.Series?.QualityProfile?.Value.CalculateCustomFormatScore(localEpisode.CustomFormats) ?? 0;
localEpisode.IndexerFlags = (IndexerFlags)indexerFlags;
return MapItem(_importDecisionMaker.GetDecision(localEpisode, downloadClientItem), rootFolder, downloadId, null);
}
@@ -181,22 +184,23 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
var downloadClientItem = GetTrackedDownload(downloadId)?.DownloadItem;
var localEpisode = new LocalEpisode
{
Series = series,
Episodes = new List<Episode>(),
FileEpisodeInfo = Parser.Parser.ParsePath(path),
DownloadClientEpisodeInfo = downloadClientItem == null
? null
: Parser.Parser.ParseTitle(downloadClientItem.Title),
DownloadItem = downloadClientItem,
Path = path,
SceneSource = SceneSource(series, rootFolder),
ExistingFile = series.Path.IsParentPath(path),
Size = _diskProvider.GetFileSize(path),
ReleaseGroup = releaseGroup.IsNullOrWhiteSpace() ? Parser.Parser.ParseReleaseGroup(path) : releaseGroup,
Languages = (languages?.SingleOrDefault() ?? Language.Unknown) == Language.Unknown ? LanguageParser.ParseLanguages(path) : languages,
Quality = quality.Quality == Quality.Unknown ? QualityParser.ParseQuality(path) : quality
};
{
Series = series,
Episodes = new List<Episode>(),
FileEpisodeInfo = Parser.Parser.ParsePath(path),
DownloadClientEpisodeInfo = downloadClientItem == null
? null
: Parser.Parser.ParseTitle(downloadClientItem.Title),
DownloadItem = downloadClientItem,
Path = path,
SceneSource = SceneSource(series, rootFolder),
ExistingFile = series.Path.IsParentPath(path),
Size = _diskProvider.GetFileSize(path),
ReleaseGroup = releaseGroup.IsNullOrWhiteSpace() ? Parser.Parser.ParseReleaseGroup(path) : releaseGroup,
Languages = languages?.Count <= 1 && (languages?.SingleOrDefault() ?? Language.Unknown) == Language.Unknown ? LanguageParser.ParseLanguages(path) : languages,
Quality = quality.Quality == Quality.Unknown ? QualityParser.ParseQuality(path) : quality,
IndexerFlags = (IndexerFlags)indexerFlags
};
return MapItem(new ImportDecision(localEpisode, new Rejection("Episodes not selected")), rootFolder, downloadId, null);
}
@@ -420,6 +424,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
item.Languages = decision.LocalEpisode.Languages;
item.Size = _diskProvider.GetFileSize(decision.LocalEpisode.Path);
item.Rejections = decision.Rejections;
item.IndexerFlags = (int)decision.LocalEpisode.IndexerFlags;
return item;
}
@@ -438,6 +443,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
item.ReleaseGroup = episodeFile.ReleaseGroup;
item.Quality = episodeFile.Quality;
item.Languages = episodeFile.Languages;
item.IndexerFlags = (int)episodeFile.IndexerFlags;
item.Size = _diskProvider.GetFileSize(item.Path);
item.Rejections = Enumerable.Empty<Rejection>();
item.EpisodeFileId = episodeFile.Id;
@@ -474,6 +480,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
ReleaseGroup = file.ReleaseGroup,
Quality = file.Quality,
Languages = file.Languages,
IndexerFlags = (IndexerFlags)file.IndexerFlags,
Series = series,
Size = 0
};
@@ -502,6 +509,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
localEpisode.ReleaseGroup = file.ReleaseGroup;
localEpisode.Quality = file.Quality;
localEpisode.Languages = file.Languages;
localEpisode.IndexerFlags = (IndexerFlags)file.IndexerFlags;
// TODO: Cleanup non-tracked downloads
@@ -518,10 +526,10 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
imported.Add(importResult);
importedTrackedDownload.Add(new ManuallyImportedFile
{
TrackedDownload = trackedDownload,
ImportResult = importResult
});
{
TrackedDownload = trackedDownload,
ImportResult = importResult
});
}
}

View File

@@ -89,6 +89,7 @@ namespace NzbDrone.Core.Notifications.CustomScript
environmentVariables.Add("Sonarr_Release_Quality", remoteEpisode.ParsedEpisodeInfo.Quality.Quality.Name);
environmentVariables.Add("Sonarr_Release_QualityVersion", remoteEpisode.ParsedEpisodeInfo.Quality.Revision.Version.ToString());
environmentVariables.Add("Sonarr_Release_ReleaseGroup", releaseGroup ?? string.Empty);
environmentVariables.Add("Sonarr_Release_IndexerFlags", remoteEpisode.Release.IndexerFlags.ToString());
environmentVariables.Add("Sonarr_Download_Client", message.DownloadClientName ?? string.Empty);
environmentVariables.Add("Sonarr_Download_Client_Type", message.DownloadClientType ?? string.Empty);
environmentVariables.Add("Sonarr_Download_Id", message.DownloadId ?? string.Empty);

View File

@@ -31,6 +31,7 @@ namespace NzbDrone.Core.Parser.Model
public List<DeletedEpisodeFile> OldFiles { get; set; }
public QualityModel Quality { get; set; }
public List<Language> Languages { get; set; }
public IndexerFlags IndexerFlags { get; set; }
public MediaInfoModel MediaInfo { get; set; }
public bool ExistingFile { get; set; }
public bool SceneSource { get; set; }

View File

@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using System.Text.Json.Serialization;
using NzbDrone.Core.Download.Pending;
using NzbDrone.Core.Indexers;
using NzbDrone.Core.Languages;
@@ -39,6 +39,9 @@ namespace NzbDrone.Core.Parser.Model
public List<Language> Languages { get; set; }
[JsonIgnore]
public IndexerFlags IndexerFlags { get; set; }
// Used to track pending releases that are being reprocessed
[JsonIgnore]
public PendingReleaseReason? PendingReleaseReason { get; set; }
@@ -107,4 +110,16 @@ namespace NzbDrone.Core.Parser.Model
}
}
}
[Flags]
public enum IndexerFlags
{
Freeleech = 1, // General
Halfleech = 2, // General, only 1/2 of download counted
DoubleUpload = 4, // General
Internal = 8, // General, uploader is an internal release group
Scene = 16, // General, the torrent comes from a "scene" group
Freeleech75 = 32, // Signifies a torrent counts towards 75 percent of your download quota.
Freeleech25 = 64, // Signifies a torrent counts towards 25 percent of your download quota.
}
}

View File

@@ -191,7 +191,7 @@ namespace NzbDrone.Core.Parser
RegexOptions.IgnoreCase | RegexOptions.Compiled),
// Episodes with a title, Single episodes (S01E05, 1x05, etc) & Multi-episode (S01E05E06, S01E05-06, S01E05 E06, etc)
new Regex(@"^(?<title>.+?)(?:(?:[-_\W](?<![()\[!]))+S?(?<season>(?<!\d+)(?:\d{1,2})(?!\d+))(?:[ex]|\W[ex]){1,2}(?<episode>\d{2,3}(?!\d+))(?:(?:\-|[ex]|\W[ex]|_){1,2}(?<episode>\d{2,3}(?!\d+)))*)(?:[-_. ]|$)(?!\\)",
new Regex(@"^(?<title>.+?)(?:(?:[-_\W](?<![()\[!]))+S?(?<season>(?<!\d+)(?:\d{1,2})(?!\d+))(?:[ex]|\W[ex]){1,2}(?<episode>\d{2,3}(?!\d+))(?:(?:\-|[ex]|\W[ex]|_){1,2}(?<episode>\d{2,3}(?!\d+)))*)(?:[-_. ]|$)",
RegexOptions.IgnoreCase | RegexOptions.Compiled),
// Episodes with a title, 4 digit season number, Single episodes (S2016E05, etc) & Multi-episode (S2016E05E06, S2016E05-06, S2016E05 E06, etc)
@@ -202,6 +202,10 @@ namespace NzbDrone.Core.Parser
new Regex(@"^(?<title>.+?)(?:(?:[-_\W](?<![()\[!]))+(?<season>(?<!\d+)(?:\d{4})(?!\d+))(?:x|\Wx){1,2}(?<episode>\d{2,4}(?!\d+))(?:(?:\-|x|\Wx|_){1,2}(?<episode>\d{2,3}(?!\d+)))*)\W?(?!\\)",
RegexOptions.IgnoreCase | RegexOptions.Compiled),
// Episodes with a title, Single episodes (s01.05)
new Regex(@"^(?<title>.+?)(?:[-_\W](?<![()\[!]))+S(?<season>(?<!\d+)(?:\d{2})(?!\d+))(?:\.)(?<episode>\d{2,3}(?!\d+))(?:[-_. ]|$)",
RegexOptions.IgnoreCase | RegexOptions.Compiled),
// Multi-season pack
new Regex(@"^(?<title>.+?)(Complete Series)?[-_. ]+(?:S|(?:Season|Saison|Series|Stagione)[_. ])(?<season>(?<!\d+)(?:\d{1,2})(?!\d+))(?:[-_. ]{1}|[-_. ]{3})(?:S|(?:Season|Saison|Series|Stagione)[_. ])?(?<season>(?<!\d+)(?:\d{1,2})(?!\d+))",
RegexOptions.IgnoreCase | RegexOptions.Compiled),

View File

@@ -396,7 +396,7 @@ namespace NzbDrone.Core.Parser
return new FindSeriesResult(searchCriteria.Series, SeriesMatchType.Id);
}
if (tvRageId > 0 && tvRageId == searchCriteria.Series.TvRageId)
if (tvRageId > 0 && tvRageId == searchCriteria.Series.TvRageId && tvdbId <= 0)
{
_logger.Debug()
.Message("Found matching series by TVRage ID {0}, an alias may be needed for: {1}", tvRageId, parsedEpisodeInfo.SeriesTitle)
@@ -446,14 +446,14 @@ namespace NzbDrone.Core.Parser
}
}
if (series == null && tvRageId > 0)
if (series == null && tvRageId > 0 && tvdbId <= 0)
{
series = _seriesService.FindByTvRageId(tvRageId);
if (series != null)
{
_logger.Debug()
.Message("Found matching series by TVRage ID {0}, an alias may be needed for: {1}", tvdbId, parsedEpisodeInfo.SeriesTitle)
.Message("Found matching series by TVRage ID {0}, an alias may be needed for: {1}", tvRageId, parsedEpisodeInfo.SeriesTitle)
.Property("TvRageId", tvRageId)
.Property("ParsedEpisodeInfo", parsedEpisodeInfo)
.WriteSentryWarn("TvRageIdMatch", tvRageId.ToString(), parsedEpisodeInfo.SeriesTitle)

View File

@@ -2,6 +2,9 @@
<PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="GitHubActionsTestLogger" Version="2.3.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Host\Sonarr.Host.csproj" />
<ProjectReference Include="..\NzbDrone.Test.Common\Sonarr.Test.Common.csproj" />

View File

@@ -4,6 +4,7 @@
<OutputType>Library</OutputType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="GitHubActionsTestLogger" Version="2.3.3" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.21" />
</ItemGroup>
<ItemGroup>

View File

@@ -2,6 +2,9 @@
<PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="GitHubActionsTestLogger" Version="2.3.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Test.Common\Sonarr.Test.Common.csproj" />
</ItemGroup>

View File

@@ -7,6 +7,7 @@
See https://github.com/xamarin/XamarinComponents/issues/282
-->
<ItemGroup>
<PackageReference Include="GitHubActionsTestLogger" Version="2.3.3" />
<PackageReference Include="Mono.Posix.NETStandard" Version="5.20.1.34-servarr24" />
</ItemGroup>
<ItemGroup>

View File

@@ -2,6 +2,9 @@
<PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="GitHubActionsTestLogger" Version="2.3.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Test.Common\Sonarr.Test.Common.csproj" />
<ProjectReference Include="..\NzbDrone.Update\Sonarr.Update.csproj" />

View File

@@ -2,6 +2,9 @@
<PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="GitHubActionsTestLogger" Version="2.3.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Common.Test\Sonarr.Common.Test.csproj" />
<ProjectReference Include="..\NzbDrone.Test.Common\Sonarr.Test.Common.csproj" />

View File

@@ -9,6 +9,7 @@ using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Parser;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Tv;
using NzbDrone.SignalR;
using Sonarr.Http;
@@ -203,6 +204,11 @@ namespace Sonarr.Api.V3.EpisodeFiles
{
episodeFile.ReleaseGroup = resourceEpisodeFile.ReleaseGroup;
}
if (resourceEpisodeFile.IndexerFlags.HasValue)
{
episodeFile.IndexerFlags = (IndexerFlags)resourceEpisodeFile.IndexerFlags;
}
}
_mediaFileService.Update(episodeFiles);

View File

@@ -25,6 +25,7 @@ namespace Sonarr.Api.V3.EpisodeFiles
public QualityModel Quality { get; set; }
public List<CustomFormatResource> CustomFormats { get; set; }
public int CustomFormatScore { get; set; }
public int? IndexerFlags { get; set; }
public MediaInfoResource MediaInfo { get; set; }
public bool QualityCutoffNotMet { get; set; }
@@ -88,7 +89,8 @@ namespace Sonarr.Api.V3.EpisodeFiles
MediaInfo = model.MediaInfo.ToResource(model.SceneName),
QualityCutoffNotMet = upgradableSpecification.QualityCutoffNotMet(series.QualityProfile.Value, model.Quality),
CustomFormats = customFormats.ToResource(false),
CustomFormatScore = customFormatScore
CustomFormatScore = customFormatScore,
IndexerFlags = (int)model.IndexerFlags
};
}
}

View File

@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using NzbDrone.Core.Parser.Model;
using Sonarr.Http;
namespace Sonarr.Api.V3.Indexers
{
[V3ApiController]
public class IndexerFlagController : Controller
{
[HttpGet]
public List<IndexerFlagResource> GetAll()
{
return Enum.GetValues(typeof(IndexerFlags)).Cast<IndexerFlags>().Select(f => new IndexerFlagResource
{
Id = (int)f,
Name = f.ToString()
}).ToList();
}
}
}

View File

@@ -0,0 +1,13 @@
using Newtonsoft.Json;
using Sonarr.Http.REST;
namespace Sonarr.Api.V3.Indexers
{
public class IndexerFlagResource : RestResource
{
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Include)]
public new int Id { get; set; }
public string Name { get; set; }
public string NameLower => Name.ToLowerInvariant();
}
}

View File

@@ -65,6 +65,7 @@ namespace Sonarr.Api.V3.Indexers
public int? Seeders { get; set; }
public int? Leechers { get; set; }
public DownloadProtocol Protocol { get; set; }
public int IndexerFlags { get; set; }
public bool IsDaily { get; set; }
public bool IsAbsoluteNumbering { get; set; }
@@ -100,6 +101,7 @@ namespace Sonarr.Api.V3.Indexers
var parsedEpisodeInfo = model.RemoteEpisode.ParsedEpisodeInfo;
var remoteEpisode = model.RemoteEpisode;
var torrentInfo = (model.RemoteEpisode.Release as TorrentInfo) ?? new TorrentInfo();
var indexerFlags = torrentInfo.IndexerFlags;
// TODO: Clean this mess up. don't mix data from multiple classes, use sub-resources instead? (Got a huge Deja Vu, didn't we talk about this already once?)
return new ReleaseResource
@@ -152,6 +154,7 @@ namespace Sonarr.Api.V3.Indexers
Seeders = torrentInfo.Seeders,
Leechers = (torrentInfo.Peers.HasValue && torrentInfo.Seeders.HasValue) ? (torrentInfo.Peers.Value - torrentInfo.Seeders.Value) : (int?)null,
Protocol = releaseInfo.DownloadProtocol,
IndexerFlags = (int)indexerFlags,
IsDaily = parsedEpisodeInfo.IsDaily,
IsAbsoluteNumbering = parsedEpisodeInfo.IsAbsoluteNumbering,

View File

@@ -39,10 +39,11 @@ namespace Sonarr.Api.V3.ManualImport
{
foreach (var item in items)
{
var processedItem = _manualImportService.ReprocessItem(item.Path, item.DownloadId, item.SeriesId, item.SeasonNumber, item.EpisodeIds ?? new List<int>(), item.ReleaseGroup, item.Quality, item.Languages);
var processedItem = _manualImportService.ReprocessItem(item.Path, item.DownloadId, item.SeriesId, item.SeasonNumber, item.EpisodeIds ?? new List<int>(), item.ReleaseGroup, item.Quality, item.Languages, item.IndexerFlags);
item.SeasonNumber = processedItem.SeasonNumber;
item.Episodes = processedItem.Episodes.ToResource();
item.IndexerFlags = processedItem.IndexerFlags;
item.Rejections = processedItem.Rejections;
item.CustomFormats = processedItem.CustomFormats.ToResource(false);
item.CustomFormatScore = processedItem.CustomFormatScore;

View File

@@ -21,6 +21,7 @@ namespace Sonarr.Api.V3.ManualImport
public string DownloadId { get; set; }
public List<CustomFormatResource> CustomFormats { get; set; }
public int CustomFormatScore { get; set; }
public int IndexerFlags { get; set; }
public IEnumerable<Rejection> Rejections { get; set; }
}
}

View File

@@ -30,6 +30,7 @@ namespace Sonarr.Api.V3.ManualImport
public string DownloadId { get; set; }
public List<CustomFormatResource> CustomFormats { get; set; }
public int CustomFormatScore { get; set; }
public int IndexerFlags { get; set; }
public IEnumerable<Rejection> Rejections { get; set; }
}
@@ -65,6 +66,7 @@ namespace Sonarr.Api.V3.ManualImport
// QualityWeight
DownloadId = model.DownloadId,
IndexerFlags = model.IndexerFlags,
Rejections = model.Rejections
};
}

View File

@@ -3587,6 +3587,44 @@
}
}
},
"/api/v3/indexerflag": {
"get": {
"tags": [
"IndexerFlag"
],
"responses": {
"200": {
"description": "Success",
"content": {
"text/plain": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/IndexerFlagResource"
}
}
},
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/IndexerFlagResource"
}
}
},
"text/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/IndexerFlagResource"
}
}
}
}
}
}
}
},
"/api/v3/language": {
"get": {
"tags": [
@@ -8177,6 +8215,11 @@
"type": "integer",
"format": "int32"
},
"indexerFlags": {
"type": "integer",
"format": "int32",
"nullable": true
},
"mediaInfo": {
"$ref": "#/components/schemas/MediaInfoResource"
},
@@ -9012,6 +9055,25 @@
},
"additionalProperties": false
},
"IndexerFlagResource": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int32"
},
"name": {
"type": "string",
"nullable": true
},
"nameLower": {
"type": "string",
"nullable": true,
"readOnly": true
}
},
"additionalProperties": false
},
"IndexerResource": {
"type": "object",
"properties": {
@@ -9371,6 +9433,10 @@
"type": "integer",
"format": "int32"
},
"indexerFlags": {
"type": "integer",
"format": "int32"
},
"rejections": {
"type": "array",
"items": {
@@ -9461,6 +9527,10 @@
"type": "integer",
"format": "int32"
},
"indexerFlags": {
"type": "integer",
"format": "int32"
},
"rejections": {
"type": "array",
"items": {
@@ -10843,6 +10913,10 @@
"protocol": {
"$ref": "#/components/schemas/DownloadProtocol"
},
"indexerFlags": {
"type": "integer",
"format": "int32"
},
"isDaily": {
"type": "boolean"
},