mirror of
https://github.com/Sonarr/Sonarr.git
synced 2026-04-17 21:26:13 -04:00
Compare commits
27 Commits
v4.0.1.113
...
v4.0.2.118
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7a37f130f9 | ||
|
|
724dd7e733 | ||
|
|
e1be3b20e9 | ||
|
|
2f041f9ec1 | ||
|
|
f10ccf587d | ||
|
|
0242b40eda | ||
|
|
7a768b5d0f | ||
|
|
a57254640f | ||
|
|
1a6f45bafd | ||
|
|
c6071f6d81 | ||
|
|
2a47a237d4 | ||
|
|
a7607ac7d6 | ||
|
|
43797b326d | ||
|
|
5c4f829993 | ||
|
|
8dd8c95f36 | ||
|
|
6f6036a199 | ||
|
|
625e500132 | ||
|
|
39575b1248 | ||
|
|
f1d343218c | ||
|
|
b0829d5537 | ||
|
|
965e7c22d9 | ||
|
|
75535e61d9 | ||
|
|
c0b17d9345 | ||
|
|
84e657482d | ||
|
|
ed27bcf213 | ||
|
|
9ee2fe6f5c | ||
|
|
d5e19b8c3c |
13
.github/actions/test/action.yml
vendored
13
.github/actions/test/action.yml
vendored
@@ -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
|
||||
|
||||
4
.github/workflows/api_docs.yml
vendored
4
.github/workflows/api_docs.yml
vendored
@@ -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
|
||||
|
||||
26
.github/workflows/build.yml
vendored
26
.github/workflows/build.yml
vendored
@@ -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
|
||||
|
||||
4
.github/workflows/deploy.yml
vendored
4
.github/workflows/deploy.yml
vendored
@@ -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
|
||||
|
||||
41
.github/workflows/publish-test-results.yml
vendored
41
.github/workflows/publish-test-results.yml
vendored
@@ -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
|
||||
@@ -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;
|
||||
|
||||
@@ -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})`
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
@@ -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),
|
||||
|
||||
62
frontend/src/Components/Form/IndexerFlagsSelectInput.tsx
Normal file
62
frontend/src/Components/Form/IndexerFlagsSelectInput.tsx
Normal 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;
|
||||
@@ -91,6 +91,7 @@ class TextTagInputConnector extends Component {
|
||||
render() {
|
||||
return (
|
||||
<TagInput
|
||||
delimiters={['Tab', 'Enter', ',']}
|
||||
tagList={[]}
|
||||
onTagAdd={this.onTagAdd}
|
||||
onTagDelete={this.onTagDelete}
|
||||
|
||||
@@ -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,
|
||||
|
||||
26
frontend/src/Episode/IndexerFlags.tsx
Normal file
26
frontend/src/Episode/IndexerFlags.tsx
Normal 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;
|
||||
@@ -16,6 +16,7 @@ export interface EpisodeFile extends ModelBase {
|
||||
languages: Language[];
|
||||
quality: QualityModel;
|
||||
customFormats: CustomFormat[];
|
||||
indexerFlags: number;
|
||||
mediaInfo: MediaInfo;
|
||||
qualityCutoffNotMet: boolean;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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;
|
||||
@@ -0,0 +1,7 @@
|
||||
.modalBody {
|
||||
composes: modalBody from '~Components/Modal/ModalBody.css';
|
||||
|
||||
display: flex;
|
||||
flex: 1 1 auto;
|
||||
flex-direction: column;
|
||||
}
|
||||
7
frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModalContent.css.d.ts
vendored
Normal file
7
frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModalContent.css.d.ts
vendored
Normal 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;
|
||||
@@ -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;
|
||||
@@ -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}
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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, {
|
||||
|
||||
@@ -44,7 +44,8 @@
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.rejected {
|
||||
.rejected,
|
||||
.indexerFlags {
|
||||
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||
|
||||
width: 50px;
|
||||
|
||||
@@ -6,6 +6,7 @@ interface CssExports {
|
||||
'download': string;
|
||||
'downloadIcon': string;
|
||||
'indexer': string;
|
||||
'indexerFlags': string;
|
||||
'interactiveIcon': string;
|
||||
'languages': string;
|
||||
'manualDownloadContent': string;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -62,3 +62,9 @@
|
||||
|
||||
width: 55px;
|
||||
}
|
||||
|
||||
.indexerFlags {
|
||||
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||
|
||||
width: 50px;
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ interface CssExports {
|
||||
'customFormatScore': string;
|
||||
'episodeNumber': string;
|
||||
'episodeNumberAnime': string;
|
||||
'indexerFlags': string;
|
||||
'languages': string;
|
||||
'monitored': string;
|
||||
'releaseGroup': string;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
48
frontend/src/Store/Actions/Settings/indexerFlags.js
Normal file
48
frontend/src/Store/Actions/Settings/indexerFlags.js
Normal 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: {
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
@@ -97,7 +97,7 @@ export const persistState = [
|
||||
'calendar.view',
|
||||
'calendar.selectedFilterKey',
|
||||
'calendar.options',
|
||||
'seriesIndex.customFilters'
|
||||
'calendar.customFilters'
|
||||
];
|
||||
|
||||
//
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -162,6 +162,7 @@ export const actionHandlers = handleThunks({
|
||||
quality: item.quality,
|
||||
languages: item.languages,
|
||||
releaseGroup: item.releaseGroup,
|
||||
indexerFlags: item.indexerFlags,
|
||||
downloadId: item.downloadId
|
||||
};
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
6
frontend/src/typings/IndexerFlag.ts
Normal file
6
frontend/src/typings/IndexerFlag.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
interface IndexerFlag {
|
||||
id: number;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export default IndexerFlag;
|
||||
@@ -146,7 +146,7 @@
|
||||
"worker-loader": "3.0.8"
|
||||
},
|
||||
"volta": {
|
||||
"node": "16.17.0",
|
||||
"node": "20.11.1",
|
||||
"yarn": "1.22.19"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
};
|
||||
|
||||
|
||||
@@ -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; }
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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("\\", "");
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")]
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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}`."
|
||||
}
|
||||
|
||||
@@ -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 yleisiä asetuksia",
|
||||
"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": "Mitä 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äystä 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 (0–100)",
|
||||
"ImportListsTraktSettingsRatingHelpText": "Suodata sarjoja arvioden perusteella (alue 0–100).",
|
||||
"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)."
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
|
||||
@@ -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": "Источник"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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": "“从下载客户端移除”将从下载客户端移除下载内容和文件。"
|
||||
}
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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.
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
23
src/Sonarr.Api.V3/Indexers/IndexerFlagController.cs
Normal file
23
src/Sonarr.Api.V3/Indexers/IndexerFlagController.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
13
src/Sonarr.Api.V3/Indexers/IndexerFlagResource.cs
Normal file
13
src/Sonarr.Api.V3/Indexers/IndexerFlagResource.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user