mirror of
https://github.com/Readarr/Readarr.git
synced 2026-04-18 21:34:28 -04:00
Compare commits
54 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cf415e61de | |||
| 9865e92cea | |||
| 1cf956a9d9 | |||
| 8989c55c8c | |||
| dc83e0127e | |||
| 34eb312426 | |||
| 9d5cdebdb2 | |||
| a0ab224acd | |||
| 05aa35a54d | |||
| ca7f8775f5 | |||
| 2a01e9b445 | |||
| 7d30c7d1ea | |||
| 50be87e5a4 | |||
| 0572d1ac80 | |||
| d2240514d7 | |||
| ad47dc032d | |||
| 6c6df7d7d9 | |||
| 2121204064 | |||
| 61004ea33f | |||
| 54c1c7862e | |||
| 43dfdc8bf5 | |||
| 0d1ae0ca4e | |||
| 9902889a30 | |||
| 04d7061030 | |||
| fd201912a9 | |||
| c412701a3d | |||
| 7451a66365 | |||
| a6431fdb0b | |||
| 060b133f6d | |||
| 5ed13b942b | |||
| 89f3d8167b | |||
| 77b027374f | |||
| 650490abb2 | |||
| 7d2e215d61 | |||
| 65ff890c74 | |||
| 50c0b0dbaa | |||
| d5f36d0144 | |||
| fab7558bd4 | |||
| 3dc86b3a01 | |||
| 24ad6134e3 | |||
| 033f8c40af | |||
| 4c73a619eb | |||
| 3ca798e983 | |||
| d9827fd6a6 | |||
| f4f03a853f | |||
| 4f4e4bf2ca | |||
| 413a70a312 | |||
| a8f2b91010 | |||
| 68a4ee6000 | |||
| 5196ce311b | |||
| ae92b22727 | |||
| 0bccffef01 | |||
| bca899b9c0 | |||
| 2bb576a94b |
+2
-2
@@ -9,13 +9,13 @@ variables:
|
|||||||
testsFolder: './_tests'
|
testsFolder: './_tests'
|
||||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||||
majorVersion: '0.3.10'
|
majorVersion: '0.3.14'
|
||||||
minorVersion: $[counter('minorVersion', 1)]
|
minorVersion: $[counter('minorVersion', 1)]
|
||||||
readarrVersion: '$(majorVersion).$(minorVersion)'
|
readarrVersion: '$(majorVersion).$(minorVersion)'
|
||||||
buildName: '$(Build.SourceBranchName).$(readarrVersion)'
|
buildName: '$(Build.SourceBranchName).$(readarrVersion)'
|
||||||
sentryOrg: 'servarr'
|
sentryOrg: 'servarr'
|
||||||
sentryUrl: 'https://sentry.servarr.com'
|
sentryUrl: 'https://sentry.servarr.com'
|
||||||
dotnetVersion: '6.0.413'
|
dotnetVersion: '6.0.417'
|
||||||
nodeVersion: '16.X'
|
nodeVersion: '16.X'
|
||||||
innoVersion: '6.2.0'
|
innoVersion: '6.2.0'
|
||||||
windowsImage: 'windows-2022'
|
windowsImage: 'windows-2022'
|
||||||
|
|||||||
@@ -44,6 +44,10 @@
|
|||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.filterIcon {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
.authorNavigationButtons {
|
.authorNavigationButtons {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 0;
|
right: 0;
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ interface CssExports {
|
|||||||
'authorUpButton': string;
|
'authorUpButton': string;
|
||||||
'contentContainer': string;
|
'contentContainer': string;
|
||||||
'errorMessage': string;
|
'errorMessage': string;
|
||||||
|
'filterIcon': string;
|
||||||
'innerContentBody': string;
|
'innerContentBody': string;
|
||||||
'metadataMessage': string;
|
'metadataMessage': string;
|
||||||
'selectedTab': string;
|
'selectedTab': string;
|
||||||
|
|||||||
@@ -239,9 +239,14 @@ class AuthorDetails extends Component {
|
|||||||
saveError,
|
saveError,
|
||||||
isDeleting,
|
isDeleting,
|
||||||
deleteError,
|
deleteError,
|
||||||
statistics
|
statistics = {}
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
|
const {
|
||||||
|
bookFileCount = 0,
|
||||||
|
totalBookCount = 0
|
||||||
|
} = statistics;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
isOrganizeModalOpen,
|
isOrganizeModalOpen,
|
||||||
isRetagModalOpen,
|
isRetagModalOpen,
|
||||||
@@ -435,7 +440,7 @@ class AuthorDetails extends Component {
|
|||||||
className={styles.tab}
|
className={styles.tab}
|
||||||
selectedClassName={styles.selectedTab}
|
selectedClassName={styles.selectedTab}
|
||||||
>
|
>
|
||||||
{translate('BooksTotal', [statistics.totalBookCount])}
|
{translate('BooksTotal', [totalBookCount])}
|
||||||
</Tab>
|
</Tab>
|
||||||
|
|
||||||
<Tab
|
<Tab
|
||||||
@@ -463,7 +468,7 @@ class AuthorDetails extends Component {
|
|||||||
className={styles.tab}
|
className={styles.tab}
|
||||||
selectedClassName={styles.selectedTab}
|
selectedClassName={styles.selectedTab}
|
||||||
>
|
>
|
||||||
{translate('FilesTotal', [statistics.bookFileCount])}
|
{translate('FilesTotal', [bookFileCount])}
|
||||||
</Tab>
|
</Tab>
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -136,8 +136,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.title {
|
.title {
|
||||||
|
font-weight: 300;
|
||||||
font-size: 30px;
|
font-size: 30px;
|
||||||
line-height: 50px;
|
line-height: 30px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
.container {
|
||||||
|
border: 1px solid var(--borderColor);
|
||||||
|
border-radius: 4px;
|
||||||
|
background-color: var(--inputBackgroundColor);
|
||||||
|
|
||||||
|
&:last-of-type {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'container': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import AuthorHistoryContentConnector from 'Author/History/AuthorHistoryContentConnector';
|
import AuthorHistoryContentConnector from 'Author/History/AuthorHistoryContentConnector';
|
||||||
import AuthorHistoryTableContent from 'Author/History/AuthorHistoryTableContent';
|
import AuthorHistoryTableContent from 'Author/History/AuthorHistoryTableContent';
|
||||||
|
import styles from './AuthorHistoryTable.css';
|
||||||
|
|
||||||
function AuthorHistoryTable(props) {
|
function AuthorHistoryTable(props) {
|
||||||
const {
|
const {
|
||||||
@@ -8,10 +9,12 @@ function AuthorHistoryTable(props) {
|
|||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<AuthorHistoryContentConnector
|
<div className={styles.container}>
|
||||||
component={AuthorHistoryTableContent}
|
<AuthorHistoryContentConnector
|
||||||
{...otherProps}
|
component={AuthorHistoryTableContent}
|
||||||
/>
|
{...otherProps}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
.blankpad {
|
||||||
|
padding-top: 10px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
padding-left: 2em;
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'blankpad': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
@@ -7,6 +7,7 @@ import TableBody from 'Components/Table/TableBody';
|
|||||||
import { kinds } from 'Helpers/Props';
|
import { kinds } from 'Helpers/Props';
|
||||||
import translate from 'Utilities/String/translate';
|
import translate from 'Utilities/String/translate';
|
||||||
import AuthorHistoryRowConnector from './AuthorHistoryRowConnector';
|
import AuthorHistoryRowConnector from './AuthorHistoryRowConnector';
|
||||||
|
import styles from './AuthorHistoryTableContent.css';
|
||||||
|
|
||||||
const columns = [
|
const columns = [
|
||||||
{
|
{
|
||||||
@@ -64,7 +65,7 @@ class AuthorHistoryTableContent extends Component {
|
|||||||
const hasItems = !!items.length;
|
const hasItems = !!items.length;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<div>
|
||||||
{
|
{
|
||||||
isFetching &&
|
isFetching &&
|
||||||
<LoadingIndicator />
|
<LoadingIndicator />
|
||||||
@@ -79,7 +80,7 @@ class AuthorHistoryTableContent extends Component {
|
|||||||
|
|
||||||
{
|
{
|
||||||
isPopulated && !hasItems && !error &&
|
isPopulated && !hasItems && !error &&
|
||||||
<div>
|
<div className={styles.blankpad}>
|
||||||
{translate('NoHistory')}
|
{translate('NoHistory')}
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
@@ -103,7 +104,7 @@ class AuthorHistoryTableContent extends Component {
|
|||||||
</TableBody>
|
</TableBody>
|
||||||
</Table>
|
</Table>
|
||||||
}
|
}
|
||||||
</>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -99,9 +99,14 @@ class BookDetails extends Component {
|
|||||||
nextBook,
|
nextBook,
|
||||||
isSearching,
|
isSearching,
|
||||||
onRefreshPress,
|
onRefreshPress,
|
||||||
onSearchPress
|
onSearchPress,
|
||||||
|
statistics = {}
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
|
const {
|
||||||
|
bookFileCount = 0
|
||||||
|
} = statistics;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
isOrganizeModalOpen,
|
isOrganizeModalOpen,
|
||||||
isRetagModalOpen,
|
isRetagModalOpen,
|
||||||
@@ -238,21 +243,21 @@ class BookDetails extends Component {
|
|||||||
className={styles.tab}
|
className={styles.tab}
|
||||||
selectedClassName={styles.selectedTab}
|
selectedClassName={styles.selectedTab}
|
||||||
>
|
>
|
||||||
History
|
{translate('History')}
|
||||||
</Tab>
|
</Tab>
|
||||||
|
|
||||||
<Tab
|
<Tab
|
||||||
className={styles.tab}
|
className={styles.tab}
|
||||||
selectedClassName={styles.selectedTab}
|
selectedClassName={styles.selectedTab}
|
||||||
>
|
>
|
||||||
Search
|
{translate('Search')}
|
||||||
</Tab>
|
</Tab>
|
||||||
|
|
||||||
<Tab
|
<Tab
|
||||||
className={styles.tab}
|
className={styles.tab}
|
||||||
selectedClassName={styles.selectedTab}
|
selectedClassName={styles.selectedTab}
|
||||||
>
|
>
|
||||||
Files
|
{translate('FilesTotal', [bookFileCount])}
|
||||||
</Tab>
|
</Tab>
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -335,6 +340,7 @@ BookDetails.propTypes = {
|
|||||||
ratings: PropTypes.object.isRequired,
|
ratings: PropTypes.object.isRequired,
|
||||||
images: PropTypes.arrayOf(PropTypes.object).isRequired,
|
images: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||||
links: PropTypes.arrayOf(PropTypes.object).isRequired,
|
links: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||||
|
statistics: PropTypes.object.isRequired,
|
||||||
monitored: PropTypes.bool.isRequired,
|
monitored: PropTypes.bool.isRequired,
|
||||||
shortDateFormat: PropTypes.string.isRequired,
|
shortDateFormat: PropTypes.string.isRequired,
|
||||||
isSaving: PropTypes.bool.isRequired,
|
isSaving: PropTypes.bool.isRequired,
|
||||||
|
|||||||
@@ -117,8 +117,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.title {
|
.title {
|
||||||
|
font-weight: 300;
|
||||||
font-size: 30px;
|
font-size: 30px;
|
||||||
line-height: 50px;
|
line-height: 30px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -229,7 +229,6 @@ class BookIndexRow extends Component {
|
|||||||
className={styles[name]}
|
className={styles[name]}
|
||||||
>
|
>
|
||||||
{bookFileCount}
|
{bookFileCount}
|
||||||
|
|
||||||
</VirtualTableRowCell>
|
</VirtualTableRowCell>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
.container {
|
||||||
|
border: 1px solid var(--borderColor);
|
||||||
|
border-radius: 4px;
|
||||||
|
background-color: var(--inputBackgroundColor);
|
||||||
|
|
||||||
|
&:last-of-type {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'container': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import BookFileEditorTableContentConnector from './BookFileEditorTableContentConnector';
|
import BookFileEditorTableContentConnector from './BookFileEditorTableContentConnector';
|
||||||
|
import styles from './BookFileEditorTable.css';
|
||||||
|
|
||||||
function BookFileEditorTable(props) {
|
function BookFileEditorTable(props) {
|
||||||
const {
|
const {
|
||||||
@@ -7,9 +8,11 @@ function BookFileEditorTable(props) {
|
|||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<BookFileEditorTableContentConnector
|
<div className={styles.container}>
|
||||||
{...otherProps}
|
<BookFileEditorTableContentConnector
|
||||||
/>
|
{...otherProps}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
.filesTable {
|
.filesTable {
|
||||||
margin-bottom: 20px;
|
margin: 10px;
|
||||||
padding-top: 15px;
|
padding-top: 5px;
|
||||||
border: 1px solid var(--borderColor);
|
border: 1px solid var(--borderColor);
|
||||||
border-top: 1px solid var(--borderColor);
|
border-top: 1px solid var(--borderColor);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
@@ -13,9 +13,15 @@
|
|||||||
|
|
||||||
.actions {
|
.actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
margin-right: auto;
|
margin: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.selectInput {
|
.selectInput {
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.blankpad {
|
||||||
|
padding-top: 10px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
padding-left: 2em;
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
// Please do not change this file!
|
// Please do not change this file!
|
||||||
interface CssExports {
|
interface CssExports {
|
||||||
'actions': string;
|
'actions': string;
|
||||||
|
'blankpad': string;
|
||||||
'filesTable': string;
|
'filesTable': string;
|
||||||
'selectInput': string;
|
'selectInput': string;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
|
import Alert from 'Components/Alert';
|
||||||
import SelectInput from 'Components/Form/SelectInput';
|
import SelectInput from 'Components/Form/SelectInput';
|
||||||
import SpinnerButton from 'Components/Link/SpinnerButton';
|
import SpinnerButton from 'Components/Link/SpinnerButton';
|
||||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||||
@@ -120,7 +121,7 @@ class BookFileEditorTableContent extends Component {
|
|||||||
const hasSelectedFiles = this.getSelectedIds().length > 0;
|
const hasSelectedFiles = this.getSelectedIds().length > 0;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<div>
|
||||||
{
|
{
|
||||||
isFetching && !isPopulated ?
|
isFetching && !isPopulated ?
|
||||||
<LoadingIndicator /> :
|
<LoadingIndicator /> :
|
||||||
@@ -129,13 +130,13 @@ class BookFileEditorTableContent extends Component {
|
|||||||
|
|
||||||
{
|
{
|
||||||
!isFetching && error ?
|
!isFetching && error ?
|
||||||
<div>{error}</div> :
|
<Alert kind={kinds.DANGER}>{error}</Alert> :
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
isPopulated && !items.length ?
|
isPopulated && !items.length ?
|
||||||
<div>
|
<div className={styles.blankpad}>
|
||||||
No book files to manage.
|
No book files to manage.
|
||||||
</div> :
|
</div> :
|
||||||
null
|
null
|
||||||
@@ -173,26 +174,30 @@ class BookFileEditorTableContent extends Component {
|
|||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
|
||||||
<div className={styles.actions}>
|
{
|
||||||
<SpinnerButton
|
isPopulated && items.length ? (
|
||||||
kind={kinds.DANGER}
|
<div className={styles.actions}>
|
||||||
isSpinning={isDeleting}
|
<SpinnerButton
|
||||||
isDisabled={!hasSelectedFiles}
|
kind={kinds.DANGER}
|
||||||
onPress={this.onDeletePress}
|
isSpinning={isDeleting}
|
||||||
>
|
isDisabled={!hasSelectedFiles}
|
||||||
Delete
|
onPress={this.onDeletePress}
|
||||||
</SpinnerButton>
|
>
|
||||||
|
{translate('Delete')}
|
||||||
|
</SpinnerButton>
|
||||||
|
|
||||||
<div className={styles.selectInput}>
|
<div className={styles.selectInput}>
|
||||||
<SelectInput
|
<SelectInput
|
||||||
name="quality"
|
name="quality"
|
||||||
value="selectQuality"
|
value="selectQuality"
|
||||||
values={qualityOptions}
|
values={qualityOptions}
|
||||||
isDisabled={!hasSelectedFiles}
|
isDisabled={!hasSelectedFiles}
|
||||||
onChange={this.onQualityChange}
|
onChange={this.onQualityChange}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
) : null
|
||||||
|
}
|
||||||
|
|
||||||
<ConfirmModal
|
<ConfirmModal
|
||||||
isOpen={isConfirmDeleteModalOpen}
|
isOpen={isConfirmDeleteModalOpen}
|
||||||
@@ -203,7 +208,7 @@ class BookFileEditorTableContent extends Component {
|
|||||||
onConfirm={this.onConfirmDelete}
|
onConfirm={this.onConfirmDelete}
|
||||||
onCancel={this.onConfirmDeleteModalClose}
|
onCancel={this.onConfirmDeleteModalClose}
|
||||||
/>
|
/>
|
||||||
</>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ class CalendarConnector extends Component {
|
|||||||
gotoCalendarToday
|
gotoCalendarToday
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
registerPagePopulator(this.repopulate);
|
registerPagePopulator(this.repopulate, ['bookFileUpdated', 'bookFileDeleted']);
|
||||||
|
|
||||||
if (useCurrentPage) {
|
if (useCurrentPage) {
|
||||||
fetchCalendar();
|
fetchCalendar();
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
.description {
|
|
||||||
line-height: $lineHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
.description {
|
.description {
|
||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
|
line-height: $lineHeight;
|
||||||
|
overflow-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: 768px) {
|
@media (min-width: 768px) {
|
||||||
|
|||||||
@@ -202,6 +202,8 @@ class SignalRConnector extends Component {
|
|||||||
this.props.dispatchUpdateItem({ section, ...body.resource });
|
this.props.dispatchUpdateItem({ section, ...body.resource });
|
||||||
} else if (body.action === 'deleted') {
|
} else if (body.action === 'deleted') {
|
||||||
this.props.dispatchRemoveItem({ section, id: body.resource.id });
|
this.props.dispatchRemoveItem({ section, id: body.resource.id });
|
||||||
|
|
||||||
|
repopulatePage('bookFileDeleted');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Repopulate the page to handle recently imported file
|
// Repopulate the page to handle recently imported file
|
||||||
|
|||||||
@@ -15,5 +15,5 @@
|
|||||||
"start_url": "../../../../",
|
"start_url": "../../../../",
|
||||||
"theme_color": "#3a3f51",
|
"theme_color": "#3a3f51",
|
||||||
"background_color": "#3a3f51",
|
"background_color": "#3a3f51",
|
||||||
"display": "standalone"
|
"display": "minimal-ui"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,120 @@
|
|||||||
|
import createAjaxRequest from 'Utilities/createAjaxRequest';
|
||||||
|
|
||||||
|
// This file contains some helpers for power users in a browser console
|
||||||
|
|
||||||
|
let hasWarned = false;
|
||||||
|
|
||||||
|
function checkActivationWarning() {
|
||||||
|
if (!hasWarned) {
|
||||||
|
console.log('Activated ReadarrApi console helpers.');
|
||||||
|
console.warn('Be warned: There will be no further confirmation checks.');
|
||||||
|
hasWarned = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function attachAsyncActions(promise) {
|
||||||
|
promise.filter = function() {
|
||||||
|
const args = arguments;
|
||||||
|
const res = this.then((d) => d.filter(...args));
|
||||||
|
attachAsyncActions(res);
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
|
||||||
|
promise.map = function() {
|
||||||
|
const args = arguments;
|
||||||
|
const res = this.then((d) => d.map(...args));
|
||||||
|
attachAsyncActions(res);
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
|
||||||
|
promise.all = function() {
|
||||||
|
const res = this.then((d) => Promise.all(d));
|
||||||
|
attachAsyncActions(res);
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
|
||||||
|
promise.forEach = function(action) {
|
||||||
|
const res = this.then((d) => Promise.all(d.map(action)));
|
||||||
|
attachAsyncActions(res);
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class ResourceApi {
|
||||||
|
constructor(api, url) {
|
||||||
|
this.api = api;
|
||||||
|
this.url = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
single(id) {
|
||||||
|
return this.api.fetch(`${this.url}/${id}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
all() {
|
||||||
|
return this.api.fetch(this.url);
|
||||||
|
}
|
||||||
|
|
||||||
|
filter(pred) {
|
||||||
|
return this.all().filter(pred);
|
||||||
|
}
|
||||||
|
|
||||||
|
update(resource) {
|
||||||
|
return this.api.fetch(`${this.url}/${resource.id}`, { method: 'PUT', data: resource });
|
||||||
|
}
|
||||||
|
|
||||||
|
delete(resource) {
|
||||||
|
if (typeof resource === 'object' && resource !== null && resource.id) {
|
||||||
|
resource = resource.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!resource || !Number.isInteger(resource)) {
|
||||||
|
throw Error('Invalid resource', resource);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.api.fetch(`${this.url}/${resource}`, { method: 'DELETE' });
|
||||||
|
}
|
||||||
|
|
||||||
|
fetch(url, options) {
|
||||||
|
return this.api.fetch(`${this.url}${url}`, options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ConsoleApi {
|
||||||
|
constructor() {
|
||||||
|
this.author = new ResourceApi(this, '/author');
|
||||||
|
}
|
||||||
|
|
||||||
|
resource(url) {
|
||||||
|
return new ResourceApi(this, url);
|
||||||
|
}
|
||||||
|
|
||||||
|
fetch(url, options) {
|
||||||
|
checkActivationWarning();
|
||||||
|
|
||||||
|
options = options || {};
|
||||||
|
|
||||||
|
const req = {
|
||||||
|
url,
|
||||||
|
method: options.method || 'GET'
|
||||||
|
};
|
||||||
|
|
||||||
|
if (options.data) {
|
||||||
|
req.dataType = 'json';
|
||||||
|
req.data = JSON.stringify(options.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
const promise = createAjaxRequest(req).request;
|
||||||
|
|
||||||
|
promise.fail((xhr) => {
|
||||||
|
console.error(`Failed to fetch ${url}`, xhr);
|
||||||
|
});
|
||||||
|
|
||||||
|
attachAsyncActions(promise);
|
||||||
|
|
||||||
|
return promise;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window.ReadarrApi = new ConsoleApi();
|
||||||
|
|
||||||
|
export default ConsoleApi;
|
||||||
@@ -8,11 +8,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.name {
|
.name {
|
||||||
flex: 1 0 300px;
|
@add-mixin truncate;
|
||||||
|
|
||||||
|
flex: 0 1 600px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.foreignId {
|
.foreignId {
|
||||||
flex: 0 0 200px;
|
flex: 0 0 100px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.actions {
|
.actions {
|
||||||
|
|||||||
@@ -4,12 +4,12 @@
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.foreignId {
|
.name {
|
||||||
flex: 0 0 200px;
|
flex: 0 1 600px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.name {
|
.foreignId {
|
||||||
flex: 1 0 300px;
|
flex: 0 0 100px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.addImportListExclusion {
|
.addImportListExclusion {
|
||||||
|
|||||||
@@ -212,26 +212,24 @@ class MediaManagement extends Component {
|
|||||||
</FormGroup>
|
</FormGroup>
|
||||||
|
|
||||||
{
|
{
|
||||||
settings.importExtraFiles.value &&
|
settings.importExtraFiles.value ?
|
||||||
<FormGroup
|
<FormGroup
|
||||||
advancedSettings={advancedSettings}
|
advancedSettings={advancedSettings}
|
||||||
isAdvanced={true}
|
isAdvanced={true}
|
||||||
>
|
>
|
||||||
<FormLabel>
|
<FormLabel>{translate('ImportExtraFiles')}</FormLabel>
|
||||||
{translate('ImportExtraFiles')}
|
|
||||||
</FormLabel>
|
|
||||||
|
|
||||||
<FormInputGroup
|
<FormInputGroup
|
||||||
type={inputTypes.TEXT}
|
type={inputTypes.TEXT}
|
||||||
name="extraFileExtensions"
|
name="extraFileExtensions"
|
||||||
helpTexts={[
|
helpTexts={[
|
||||||
translate('ExtraFileExtensionsHelpTexts1'),
|
translate('ExtraFileExtensionsHelpText'),
|
||||||
translate('ExtraFileExtensionsHelpTexts2')
|
translate('ExtraFileExtensionsHelpTextsExamples')
|
||||||
]}
|
]}
|
||||||
onChange={onInputChange}
|
onChange={onInputChange}
|
||||||
{...settings.extraFileExtensions}
|
{...settings.extraFileExtensions}
|
||||||
/>
|
/>
|
||||||
</FormGroup>
|
</FormGroup> : null
|
||||||
}
|
}
|
||||||
</FieldSet>
|
</FieldSet>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,6 +41,14 @@ export const defaultState = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
columns: [
|
columns: [
|
||||||
|
{
|
||||||
|
name: 'select',
|
||||||
|
columnLabel: 'Select',
|
||||||
|
isSortable: false,
|
||||||
|
isVisible: true,
|
||||||
|
isModifiable: false,
|
||||||
|
isHidden: true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'path',
|
name: 'path',
|
||||||
label: 'Path',
|
label: 'Path',
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ export const defaultState = {
|
|||||||
bookFileCount: function(item) {
|
bookFileCount: function(item) {
|
||||||
const { statistics = {} } = item;
|
const { statistics = {} } = item;
|
||||||
|
|
||||||
return statistics.bookCount || 0;
|
return statistics.bookFileCount || 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
ratings: function(item) {
|
ratings: function(item) {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import { sortDirections } from 'Helpers/Props';
|
|||||||
import { createThunk, handleThunks } from 'Store/thunks';
|
import { createThunk, handleThunks } from 'Store/thunks';
|
||||||
import createAjaxRequest from 'Utilities/createAjaxRequest';
|
import createAjaxRequest from 'Utilities/createAjaxRequest';
|
||||||
import updateSectionState from 'Utilities/State/updateSectionState';
|
import updateSectionState from 'Utilities/State/updateSectionState';
|
||||||
|
import naturalExpansion from 'Utilities/String/naturalExpansion';
|
||||||
import { set, update, updateItem } from './baseActions';
|
import { set, update, updateItem } from './baseActions';
|
||||||
import createFetchHandler from './Creators/createFetchHandler';
|
import createFetchHandler from './Creators/createFetchHandler';
|
||||||
import createHandleActions from './Creators/createHandleActions';
|
import createHandleActions from './Creators/createHandleActions';
|
||||||
@@ -17,6 +18,7 @@ export const section = 'interactiveImport';
|
|||||||
|
|
||||||
const booksSection = `${section}.books`;
|
const booksSection = `${section}.books`;
|
||||||
const bookFilesSection = `${section}.bookFiles`;
|
const bookFilesSection = `${section}.bookFiles`;
|
||||||
|
let abortCurrentFetchRequest = null;
|
||||||
let abortCurrentRequest = null;
|
let abortCurrentRequest = null;
|
||||||
let currentIds = [];
|
let currentIds = [];
|
||||||
|
|
||||||
@@ -32,15 +34,17 @@ export const defaultState = {
|
|||||||
error: null,
|
error: null,
|
||||||
items: [],
|
items: [],
|
||||||
pendingChanges: {},
|
pendingChanges: {},
|
||||||
sortKey: 'quality',
|
sortKey: 'path',
|
||||||
sortDirection: sortDirections.DESCENDING,
|
sortDirection: sortDirections.ASCENDING,
|
||||||
|
secondarySortKey: 'path',
|
||||||
|
secondarySortDirection: sortDirections.ASCENDING,
|
||||||
recentFolders: [],
|
recentFolders: [],
|
||||||
importMode: 'chooseImportMode',
|
importMode: 'chooseImportMode',
|
||||||
sortPredicates: {
|
sortPredicates: {
|
||||||
path: function(item, direction) {
|
path: function(item, direction) {
|
||||||
const path = item.path;
|
const path = item.path;
|
||||||
|
|
||||||
return path.toLowerCase();
|
return naturalExpansion(path.toLowerCase());
|
||||||
},
|
},
|
||||||
|
|
||||||
author: function(item, direction) {
|
author: function(item, direction) {
|
||||||
@@ -74,6 +78,8 @@ export const defaultState = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const persistState = [
|
export const persistState = [
|
||||||
|
'interactiveImport.sortKey',
|
||||||
|
'interactiveImport.sortDirection',
|
||||||
'interactiveImport.recentFolders',
|
'interactiveImport.recentFolders',
|
||||||
'interactiveImport.importMode'
|
'interactiveImport.importMode'
|
||||||
];
|
];
|
||||||
@@ -122,6 +128,11 @@ export const clearInteractiveImportBookFiles = createAction(CLEAR_INTERACTIVE_IM
|
|||||||
// Action Handlers
|
// Action Handlers
|
||||||
export const actionHandlers = handleThunks({
|
export const actionHandlers = handleThunks({
|
||||||
[FETCH_INTERACTIVE_IMPORT_ITEMS]: function(getState, payload, dispatch) {
|
[FETCH_INTERACTIVE_IMPORT_ITEMS]: function(getState, payload, dispatch) {
|
||||||
|
if (abortCurrentFetchRequest) {
|
||||||
|
abortCurrentFetchRequest();
|
||||||
|
abortCurrentFetchRequest = null;
|
||||||
|
}
|
||||||
|
|
||||||
if (!payload.downloadId && !payload.folder) {
|
if (!payload.downloadId && !payload.folder) {
|
||||||
dispatch(set({ section, error: { message: '`downloadId` or `folder` is required.' } }));
|
dispatch(set({ section, error: { message: '`downloadId` or `folder` is required.' } }));
|
||||||
return;
|
return;
|
||||||
@@ -129,12 +140,14 @@ export const actionHandlers = handleThunks({
|
|||||||
|
|
||||||
dispatch(set({ section, isFetching: true }));
|
dispatch(set({ section, isFetching: true }));
|
||||||
|
|
||||||
const promise = createAjaxRequest({
|
const { request, abortRequest } = createAjaxRequest({
|
||||||
url: '/manualimport',
|
url: '/manualimport',
|
||||||
data: payload
|
data: payload
|
||||||
}).request;
|
});
|
||||||
|
|
||||||
promise.done((data) => {
|
abortCurrentFetchRequest = abortRequest;
|
||||||
|
|
||||||
|
request.done((data) => {
|
||||||
dispatch(batchActions([
|
dispatch(batchActions([
|
||||||
update({ section, data }),
|
update({ section, data }),
|
||||||
|
|
||||||
@@ -147,7 +160,11 @@ export const actionHandlers = handleThunks({
|
|||||||
]));
|
]));
|
||||||
});
|
});
|
||||||
|
|
||||||
promise.fail((xhr) => {
|
request.fail((xhr) => {
|
||||||
|
if (xhr.aborted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
dispatch(set({
|
dispatch(set({
|
||||||
section,
|
section,
|
||||||
isFetching: false,
|
isFetching: false,
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
|
import Alert from 'Components/Alert';
|
||||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||||
import PageContent from 'Components/Page/PageContent';
|
import PageContent from 'Components/Page/PageContent';
|
||||||
import PageContentBody from 'Components/Page/PageContentBody';
|
import PageContentBody from 'Components/Page/PageContentBody';
|
||||||
@@ -9,8 +10,12 @@ import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection';
|
|||||||
import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper';
|
import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper';
|
||||||
import VirtualTable from 'Components/Table/VirtualTable';
|
import VirtualTable from 'Components/Table/VirtualTable';
|
||||||
import VirtualTableRow from 'Components/Table/VirtualTableRow';
|
import VirtualTableRow from 'Components/Table/VirtualTableRow';
|
||||||
import { align, icons, sortDirections } from 'Helpers/Props';
|
import { align, icons, kinds, sortDirections } from 'Helpers/Props';
|
||||||
|
import hasDifferentItemsOrOrder from 'Utilities/Object/hasDifferentItemsOrOrder';
|
||||||
import translate from 'Utilities/String/translate';
|
import translate from 'Utilities/String/translate';
|
||||||
|
import getSelectedIds from 'Utilities/Table/getSelectedIds';
|
||||||
|
import selectAll from 'Utilities/Table/selectAll';
|
||||||
|
import toggleSelected from 'Utilities/Table/toggleSelected';
|
||||||
import UnmappedFilesTableHeader from './UnmappedFilesTableHeader';
|
import UnmappedFilesTableHeader from './UnmappedFilesTableHeader';
|
||||||
import UnmappedFilesTableRow from './UnmappedFilesTableRow';
|
import UnmappedFilesTableRow from './UnmappedFilesTableRow';
|
||||||
|
|
||||||
@@ -23,10 +28,43 @@ class UnmappedFilesTable extends Component {
|
|||||||
super(props, context);
|
super(props, context);
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
scroller: null
|
scroller: null,
|
||||||
|
allSelected: false,
|
||||||
|
allUnselected: false,
|
||||||
|
lastToggled: null,
|
||||||
|
selectedState: {}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
this.setSelectedState();
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidUpdate(prevProps) {
|
||||||
|
const {
|
||||||
|
items,
|
||||||
|
sortKey,
|
||||||
|
sortDirection,
|
||||||
|
isDeleting,
|
||||||
|
deleteError
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
|
if (sortKey !== prevProps.sortKey ||
|
||||||
|
sortDirection !== prevProps.sortDirection ||
|
||||||
|
hasDifferentItemsOrOrder(prevProps.items, items)
|
||||||
|
) {
|
||||||
|
this.setSelectedState();
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasFinishedDeleting = prevProps.isDeleting &&
|
||||||
|
!isDeleting &&
|
||||||
|
!deleteError;
|
||||||
|
|
||||||
|
if (hasFinishedDeleting) {
|
||||||
|
this.onSelectAllChange({ value: false });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Control
|
// Control
|
||||||
|
|
||||||
@@ -34,6 +72,68 @@ class UnmappedFilesTable extends Component {
|
|||||||
this.setState({ scroller: ref });
|
this.setState({ scroller: ref });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
getSelectedIds = () => {
|
||||||
|
if (this.state.allUnselected) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return getSelectedIds(this.state.selectedState);
|
||||||
|
};
|
||||||
|
|
||||||
|
setSelectedState() {
|
||||||
|
const {
|
||||||
|
items
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
|
const {
|
||||||
|
selectedState
|
||||||
|
} = this.state;
|
||||||
|
|
||||||
|
const newSelectedState = {};
|
||||||
|
|
||||||
|
items.forEach((file) => {
|
||||||
|
const isItemSelected = selectedState[file.id];
|
||||||
|
|
||||||
|
if (isItemSelected) {
|
||||||
|
newSelectedState[file.id] = isItemSelected;
|
||||||
|
} else {
|
||||||
|
newSelectedState[file.id] = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const selectedCount = getSelectedIds(newSelectedState).length;
|
||||||
|
const newStateCount = Object.keys(newSelectedState).length;
|
||||||
|
let isAllSelected = false;
|
||||||
|
let isAllUnselected = false;
|
||||||
|
|
||||||
|
if (selectedCount === 0) {
|
||||||
|
isAllUnselected = true;
|
||||||
|
} else if (selectedCount === newStateCount) {
|
||||||
|
isAllSelected = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setState({ selectedState: newSelectedState, allSelected: isAllSelected, allUnselected: isAllUnselected });
|
||||||
|
}
|
||||||
|
|
||||||
|
onSelectAllChange = ({ value }) => {
|
||||||
|
this.setState(selectAll(this.state.selectedState, value));
|
||||||
|
};
|
||||||
|
|
||||||
|
onSelectAllPress = () => {
|
||||||
|
this.onSelectAllChange({ value: !this.state.allSelected });
|
||||||
|
};
|
||||||
|
|
||||||
|
onSelectedChange = ({ id, value, shiftKey = false }) => {
|
||||||
|
this.setState((state) => {
|
||||||
|
return toggleSelected(state, this.props.items, id, value, shiftKey);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
onDeleteUnmappedFilesPress = () => {
|
||||||
|
const selectedIds = this.getSelectedIds();
|
||||||
|
|
||||||
|
this.props.deleteUnmappedFiles(selectedIds);
|
||||||
|
};
|
||||||
|
|
||||||
rowRenderer = ({ key, rowIndex, style }) => {
|
rowRenderer = ({ key, rowIndex, style }) => {
|
||||||
const {
|
const {
|
||||||
items,
|
items,
|
||||||
@@ -41,6 +141,10 @@ class UnmappedFilesTable extends Component {
|
|||||||
deleteUnmappedFile
|
deleteUnmappedFile
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
|
const {
|
||||||
|
selectedState
|
||||||
|
} = this.state;
|
||||||
|
|
||||||
const item = items[rowIndex];
|
const item = items[rowIndex];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -51,6 +155,8 @@ class UnmappedFilesTable extends Component {
|
|||||||
<UnmappedFilesTableRow
|
<UnmappedFilesTableRow
|
||||||
key={item.id}
|
key={item.id}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
|
isSelected={selectedState[item.id]}
|
||||||
|
onSelectedChange={this.onSelectedChange}
|
||||||
deleteUnmappedFile={deleteUnmappedFile}
|
deleteUnmappedFile={deleteUnmappedFile}
|
||||||
{...item}
|
{...item}
|
||||||
/>
|
/>
|
||||||
@@ -63,6 +169,7 @@ class UnmappedFilesTable extends Component {
|
|||||||
const {
|
const {
|
||||||
isFetching,
|
isFetching,
|
||||||
isPopulated,
|
isPopulated,
|
||||||
|
isDeleting,
|
||||||
error,
|
error,
|
||||||
items,
|
items,
|
||||||
columns,
|
columns,
|
||||||
@@ -72,13 +179,19 @@ class UnmappedFilesTable extends Component {
|
|||||||
onSortPress,
|
onSortPress,
|
||||||
isScanningFolders,
|
isScanningFolders,
|
||||||
onAddMissingAuthorsPress,
|
onAddMissingAuthorsPress,
|
||||||
|
deleteUnmappedFiles,
|
||||||
...otherProps
|
...otherProps
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
scroller
|
scroller,
|
||||||
|
allSelected,
|
||||||
|
allUnselected,
|
||||||
|
selectedState
|
||||||
} = this.state;
|
} = this.state;
|
||||||
|
|
||||||
|
const selectedTrackFileIds = this.getSelectedIds();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageContent title={translate('UnmappedFiles')}>
|
<PageContent title={translate('UnmappedFiles')}>
|
||||||
<PageToolbar>
|
<PageToolbar>
|
||||||
@@ -90,6 +203,13 @@ class UnmappedFilesTable extends Component {
|
|||||||
isSpinning={isScanningFolders}
|
isSpinning={isScanningFolders}
|
||||||
onPress={onAddMissingAuthorsPress}
|
onPress={onAddMissingAuthorsPress}
|
||||||
/>
|
/>
|
||||||
|
<PageToolbarButton
|
||||||
|
label={translate('DeleteSelected')}
|
||||||
|
iconName={icons.DELETE}
|
||||||
|
isDisabled={selectedTrackFileIds.length === 0}
|
||||||
|
isSpinning={isDeleting}
|
||||||
|
onPress={this.onDeleteUnmappedFilesPress}
|
||||||
|
/>
|
||||||
</PageToolbarSection>
|
</PageToolbarSection>
|
||||||
|
|
||||||
<PageToolbarSection alignContent={align.RIGHT}>
|
<PageToolbarSection alignContent={align.RIGHT}>
|
||||||
@@ -117,9 +237,9 @@ class UnmappedFilesTable extends Component {
|
|||||||
|
|
||||||
{
|
{
|
||||||
isPopulated && !error && !items.length &&
|
isPopulated && !error && !items.length &&
|
||||||
<div>
|
<Alert kind={kinds.INFO}>
|
||||||
Success! My work is done, all files on disk are matched to known books.
|
Success! My work is done, all files on disk are matched to known books.
|
||||||
</div>
|
</Alert>
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -138,8 +258,12 @@ class UnmappedFilesTable extends Component {
|
|||||||
sortDirection={sortDirection}
|
sortDirection={sortDirection}
|
||||||
onTableOptionChange={onTableOptionChange}
|
onTableOptionChange={onTableOptionChange}
|
||||||
onSortPress={onSortPress}
|
onSortPress={onSortPress}
|
||||||
|
allSelected={allSelected}
|
||||||
|
allUnselected={allUnselected}
|
||||||
|
onSelectAllChange={this.onSelectAllChange}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
selectedState={selectedState}
|
||||||
sortKey={sortKey}
|
sortKey={sortKey}
|
||||||
sortDirection={sortDirection}
|
sortDirection={sortDirection}
|
||||||
/>
|
/>
|
||||||
@@ -153,6 +277,8 @@ class UnmappedFilesTable extends Component {
|
|||||||
UnmappedFilesTable.propTypes = {
|
UnmappedFilesTable.propTypes = {
|
||||||
isFetching: PropTypes.bool.isRequired,
|
isFetching: PropTypes.bool.isRequired,
|
||||||
isPopulated: PropTypes.bool.isRequired,
|
isPopulated: PropTypes.bool.isRequired,
|
||||||
|
isDeleting: PropTypes.bool.isRequired,
|
||||||
|
deleteError: PropTypes.object,
|
||||||
error: PropTypes.object,
|
error: PropTypes.object,
|
||||||
items: PropTypes.arrayOf(PropTypes.object).isRequired,
|
items: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||||
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
|
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||||
@@ -161,6 +287,7 @@ UnmappedFilesTable.propTypes = {
|
|||||||
onTableOptionChange: PropTypes.func.isRequired,
|
onTableOptionChange: PropTypes.func.isRequired,
|
||||||
onSortPress: PropTypes.func.isRequired,
|
onSortPress: PropTypes.func.isRequired,
|
||||||
deleteUnmappedFile: PropTypes.func.isRequired,
|
deleteUnmappedFile: PropTypes.func.isRequired,
|
||||||
|
deleteUnmappedFiles: PropTypes.func.isRequired,
|
||||||
isScanningFolders: PropTypes.bool.isRequired,
|
isScanningFolders: PropTypes.bool.isRequired,
|
||||||
onAddMissingAuthorsPress: PropTypes.func.isRequired
|
onAddMissingAuthorsPress: PropTypes.func.isRequired
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { connect } from 'react-redux';
|
|||||||
import { createSelector } from 'reselect';
|
import { createSelector } from 'reselect';
|
||||||
import * as commandNames from 'Commands/commandNames';
|
import * as commandNames from 'Commands/commandNames';
|
||||||
import withCurrentPage from 'Components/withCurrentPage';
|
import withCurrentPage from 'Components/withCurrentPage';
|
||||||
import { deleteBookFile, fetchBookFiles, setBookFilesSort, setBookFilesTableOption } from 'Store/Actions/bookFileActions';
|
import { deleteBookFile, deleteBookFiles, fetchBookFiles, setBookFilesSort, setBookFilesTableOption } from 'Store/Actions/bookFileActions';
|
||||||
import { executeCommand } from 'Store/Actions/commandActions';
|
import { executeCommand } from 'Store/Actions/commandActions';
|
||||||
import createClientSideCollectionSelector from 'Store/Selectors/createClientSideCollectionSelector';
|
import createClientSideCollectionSelector from 'Store/Selectors/createClientSideCollectionSelector';
|
||||||
import createCommandExecutingSelector from 'Store/Selectors/createCommandExecutingSelector';
|
import createCommandExecutingSelector from 'Store/Selectors/createCommandExecutingSelector';
|
||||||
@@ -28,7 +28,9 @@ function createMapStateToProps() {
|
|||||||
items,
|
items,
|
||||||
...otherProps
|
...otherProps
|
||||||
} = bookFiles;
|
} = bookFiles;
|
||||||
|
|
||||||
const unmappedFiles = _.filter(items, { bookId: 0 });
|
const unmappedFiles = _.filter(items, { bookId: 0 });
|
||||||
|
|
||||||
return {
|
return {
|
||||||
items: unmappedFiles,
|
items: unmappedFiles,
|
||||||
...otherProps,
|
...otherProps,
|
||||||
@@ -57,6 +59,10 @@ function createMapDispatchToProps(dispatch, props) {
|
|||||||
dispatch(deleteBookFile({ id }));
|
dispatch(deleteBookFile({ id }));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
deleteUnmappedFiles(bookFileIds) {
|
||||||
|
dispatch(deleteBookFiles({ bookFileIds }));
|
||||||
|
},
|
||||||
|
|
||||||
onAddMissingAuthorsPress() {
|
onAddMissingAuthorsPress() {
|
||||||
dispatch(executeCommand({
|
dispatch(executeCommand({
|
||||||
name: commandNames.RESCAN_FOLDERS,
|
name: commandNames.RESCAN_FOLDERS,
|
||||||
@@ -106,7 +112,8 @@ UnmappedFilesTableConnector.propTypes = {
|
|||||||
onSortPress: PropTypes.func.isRequired,
|
onSortPress: PropTypes.func.isRequired,
|
||||||
onTableOptionChange: PropTypes.func.isRequired,
|
onTableOptionChange: PropTypes.func.isRequired,
|
||||||
fetchUnmappedFiles: PropTypes.func.isRequired,
|
fetchUnmappedFiles: PropTypes.func.isRequired,
|
||||||
deleteUnmappedFile: PropTypes.func.isRequired
|
deleteUnmappedFile: PropTypes.func.isRequired,
|
||||||
|
deleteUnmappedFiles: PropTypes.func.isRequired
|
||||||
};
|
};
|
||||||
|
|
||||||
export default withCurrentPage(
|
export default withCurrentPage(
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import IconButton from 'Components/Link/IconButton';
|
|||||||
import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper';
|
import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper';
|
||||||
import VirtualTableHeader from 'Components/Table/VirtualTableHeader';
|
import VirtualTableHeader from 'Components/Table/VirtualTableHeader';
|
||||||
import VirtualTableHeaderCell from 'Components/Table/VirtualTableHeaderCell';
|
import VirtualTableHeaderCell from 'Components/Table/VirtualTableHeaderCell';
|
||||||
|
import VirtualTableSelectAllHeaderCell from 'Components/Table/VirtualTableSelectAllHeaderCell';
|
||||||
import { icons } from 'Helpers/Props';
|
import { icons } from 'Helpers/Props';
|
||||||
// import hasGrowableColumns from './hasGrowableColumns';
|
// import hasGrowableColumns from './hasGrowableColumns';
|
||||||
import styles from './UnmappedFilesTableHeader.css';
|
import styles from './UnmappedFilesTableHeader.css';
|
||||||
@@ -12,6 +13,9 @@ function UnmappedFilesTableHeader(props) {
|
|||||||
const {
|
const {
|
||||||
columns,
|
columns,
|
||||||
onTableOptionChange,
|
onTableOptionChange,
|
||||||
|
allSelected,
|
||||||
|
allUnselected,
|
||||||
|
onSelectAllChange,
|
||||||
...otherProps
|
...otherProps
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
@@ -30,6 +34,17 @@ function UnmappedFilesTableHeader(props) {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (name === 'select') {
|
||||||
|
return (
|
||||||
|
<VirtualTableSelectAllHeaderCell
|
||||||
|
key={name}
|
||||||
|
allSelected={allSelected}
|
||||||
|
allUnselected={allUnselected}
|
||||||
|
onSelectAllChange={onSelectAllChange}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (name === 'actions') {
|
if (name === 'actions') {
|
||||||
return (
|
return (
|
||||||
<VirtualTableHeaderCell
|
<VirtualTableHeaderCell
|
||||||
@@ -71,6 +86,9 @@ function UnmappedFilesTableHeader(props) {
|
|||||||
|
|
||||||
UnmappedFilesTableHeader.propTypes = {
|
UnmappedFilesTableHeader.propTypes = {
|
||||||
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
|
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||||
|
allSelected: PropTypes.bool.isRequired,
|
||||||
|
allUnselected: PropTypes.bool.isRequired,
|
||||||
|
onSelectAllChange: PropTypes.func.isRequired,
|
||||||
onTableOptionChange: PropTypes.func.isRequired
|
onTableOptionChange: PropTypes.func.isRequired
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -20,3 +20,9 @@
|
|||||||
|
|
||||||
flex: 0 0 100px;
|
flex: 0 0 100px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.checkInput {
|
||||||
|
composes: input from '~Components/Form/CheckInput.css';
|
||||||
|
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
// Please do not change this file!
|
// Please do not change this file!
|
||||||
interface CssExports {
|
interface CssExports {
|
||||||
'actions': string;
|
'actions': string;
|
||||||
|
'checkInput': string;
|
||||||
'dateAdded': string;
|
'dateAdded': string;
|
||||||
'path': string;
|
'path': string;
|
||||||
'quality': string;
|
'quality': string;
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import IconButton from 'Components/Link/IconButton';
|
|||||||
import ConfirmModal from 'Components/Modal/ConfirmModal';
|
import ConfirmModal from 'Components/Modal/ConfirmModal';
|
||||||
import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellConnector';
|
import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellConnector';
|
||||||
import VirtualTableRowCell from 'Components/Table/Cells/VirtualTableRowCell';
|
import VirtualTableRowCell from 'Components/Table/Cells/VirtualTableRowCell';
|
||||||
|
import VirtualTableSelectCell from 'Components/Table/Cells/VirtualTableSelectCell';
|
||||||
import { icons, kinds } from 'Helpers/Props';
|
import { icons, kinds } from 'Helpers/Props';
|
||||||
import InteractiveImportModal from 'InteractiveImport/InteractiveImportModal';
|
import InteractiveImportModal from 'InteractiveImport/InteractiveImportModal';
|
||||||
import formatBytes from 'Utilities/Number/formatBytes';
|
import formatBytes from 'Utilities/Number/formatBytes';
|
||||||
@@ -69,7 +70,9 @@ class UnmappedFilesTableRow extends Component {
|
|||||||
size,
|
size,
|
||||||
dateAdded,
|
dateAdded,
|
||||||
quality,
|
quality,
|
||||||
columns
|
columns,
|
||||||
|
isSelected,
|
||||||
|
onSelectedChange
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
const folder = path.substring(0, Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\')));
|
const folder = path.substring(0, Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\')));
|
||||||
@@ -93,6 +96,19 @@ class UnmappedFilesTableRow extends Component {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (name === 'select') {
|
||||||
|
return (
|
||||||
|
<VirtualTableSelectCell
|
||||||
|
inputClassName={styles.checkInput}
|
||||||
|
id={id}
|
||||||
|
key={name}
|
||||||
|
isSelected={isSelected}
|
||||||
|
isDisabled={false}
|
||||||
|
onSelectedChange={onSelectedChange}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (name === 'path') {
|
if (name === 'path') {
|
||||||
return (
|
return (
|
||||||
<VirtualTableRowCell
|
<VirtualTableRowCell
|
||||||
@@ -208,6 +224,8 @@ UnmappedFilesTableRow.propTypes = {
|
|||||||
quality: PropTypes.object.isRequired,
|
quality: PropTypes.object.isRequired,
|
||||||
dateAdded: PropTypes.string.isRequired,
|
dateAdded: PropTypes.string.isRequired,
|
||||||
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
|
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||||
|
isSelected: PropTypes.bool,
|
||||||
|
onSelectedChange: PropTypes.func.isRequired,
|
||||||
deleteUnmappedFile: PropTypes.func.isRequired
|
deleteUnmappedFile: PropTypes.func.isRequired
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
const regex = /\d+/g;
|
||||||
|
|
||||||
|
function naturalExpansion(input) {
|
||||||
|
if (!input) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return input.replace(regex, (n) => n.padStart(8, '0'));
|
||||||
|
}
|
||||||
|
|
||||||
|
export default naturalExpansion;
|
||||||
@@ -1,9 +1,11 @@
|
|||||||
|
const regex = /\b\w+/g;
|
||||||
|
|
||||||
function titleCase(input) {
|
function titleCase(input) {
|
||||||
if (!input) {
|
if (!input) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
return input.replace(/\b\w+/g, (match) => {
|
return input.replace(regex, (match) => {
|
||||||
return match.charAt(0).toUpperCase() + match.substr(1).toLowerCase();
|
return match.charAt(0).toUpperCase() + match.substr(1).toLowerCase();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ class CutoffUnmetConnector extends Component {
|
|||||||
gotoCutoffUnmetFirstPage
|
gotoCutoffUnmetFirstPage
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
registerPagePopulator(this.repopulate, ['bookFileUpdated']);
|
registerPagePopulator(this.repopulate, ['bookFileUpdated', 'bookFileDeleted']);
|
||||||
|
|
||||||
if (useCurrentPage) {
|
if (useCurrentPage) {
|
||||||
fetchCutoffUnmet();
|
fetchCutoffUnmet();
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ class MissingConnector extends Component {
|
|||||||
gotoMissingFirstPage
|
gotoMissingFirstPage
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
registerPagePopulator(this.repopulate, ['bookFileUpdated']);
|
registerPagePopulator(this.repopulate, ['bookFileUpdated', 'bookFileDeleted']);
|
||||||
|
|
||||||
if (useCurrentPage) {
|
if (useCurrentPage) {
|
||||||
fetchMissing();
|
fetchMissing();
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import { render } from 'react-dom';
|
|||||||
import createAppStore from 'Store/createAppStore';
|
import createAppStore from 'Store/createAppStore';
|
||||||
import App from './App/App';
|
import App from './App/App';
|
||||||
|
|
||||||
|
import 'Diag/ConsoleApi';
|
||||||
|
|
||||||
export async function bootstrap() {
|
export async function bootstrap() {
|
||||||
const history = createBrowserHistory();
|
const history = createBrowserHistory();
|
||||||
const store = createAppStore(history);
|
const store = createAppStore(history);
|
||||||
|
|||||||
+1
-1
@@ -30,7 +30,7 @@
|
|||||||
"@fortawesome/free-regular-svg-icons": "6.4.0",
|
"@fortawesome/free-regular-svg-icons": "6.4.0",
|
||||||
"@fortawesome/free-solid-svg-icons": "6.4.0",
|
"@fortawesome/free-solid-svg-icons": "6.4.0",
|
||||||
"@fortawesome/react-fontawesome": "0.2.0",
|
"@fortawesome/react-fontawesome": "0.2.0",
|
||||||
"@microsoft/signalr": "6.0.21",
|
"@microsoft/signalr": "6.0.25",
|
||||||
"@sentry/browser": "7.51.2",
|
"@sentry/browser": "7.51.2",
|
||||||
"@sentry/integrations": "7.51.2",
|
"@sentry/integrations": "7.51.2",
|
||||||
"@types/node": "18.16.16",
|
"@types/node": "18.16.16",
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<PackageVersion Include="AutoFixture" Version="4.17.0" />
|
<PackageVersion Include="AutoFixture" Version="4.17.0" />
|
||||||
<PackageVersion Include="coverlet.collector" Version="3.0.4-preview.27.ge7cb7c3b40" PrivateAssets="all" />
|
<PackageVersion Include="coverlet.collector" Version="3.0.4-preview.27.ge7cb7c3b40" PrivateAssets="all" />
|
||||||
<PackageVersion Include="Dapper" Version="2.0.123" />
|
<PackageVersion Include="Dapper" Version="2.0.123" />
|
||||||
<PackageVersion Include="DryIoc.dll" Version="5.4.1" />
|
<PackageVersion Include="DryIoc.dll" Version="5.4.3" />
|
||||||
<PackageVersion Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" />
|
<PackageVersion Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" />
|
||||||
<PackageVersion Include="Equ" Version="2.3.0" />
|
<PackageVersion Include="Equ" Version="2.3.0" />
|
||||||
<PackageVersion Include="FluentAssertions" Version="5.10.3" />
|
<PackageVersion Include="FluentAssertions" Version="5.10.3" />
|
||||||
@@ -16,11 +16,11 @@
|
|||||||
<PackageVersion Include="ImpromptuInterface" Version="7.0.1" />
|
<PackageVersion Include="ImpromptuInterface" Version="7.0.1" />
|
||||||
<PackageVersion Include="LazyCache" Version="2.4.0" />
|
<PackageVersion Include="LazyCache" Version="2.4.0" />
|
||||||
<PackageVersion Include="Mailkit" Version="3.6.0" />
|
<PackageVersion Include="Mailkit" Version="3.6.0" />
|
||||||
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.21" />
|
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.25" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="6.0.1" />
|
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="6.0.1" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="6.0.1" />
|
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="6.0.1" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
|
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.1" />
|
<PackageVersion Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Logging" Version="6.0.0" />
|
<PackageVersion Include="Microsoft.Extensions.Logging" Version="6.0.0" />
|
||||||
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.4.1" />
|
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.4.1" />
|
||||||
<PackageVersion Include="Microsoft.Win32.Registry" Version="5.0.0" />
|
<PackageVersion Include="Microsoft.Win32.Registry" Version="5.0.0" />
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
<PackageVersion Include="NLog.Extensions.Logging" Version="5.2.3" />
|
<PackageVersion Include="NLog.Extensions.Logging" Version="5.2.3" />
|
||||||
<PackageVersion Include="NLog" Version="5.1.4" />
|
<PackageVersion Include="NLog" Version="5.1.4" />
|
||||||
<PackageVersion Include="NLog.Targets.Syslog" Version="7.0.0" />
|
<PackageVersion Include="NLog.Targets.Syslog" Version="7.0.0" />
|
||||||
<PackageVersion Include="Npgsql" Version="7.0.4" />
|
<PackageVersion Include="Npgsql" Version="7.0.6" />
|
||||||
<PackageVersion Include="NUnit3TestAdapter" Version="4.2.1" />
|
<PackageVersion Include="NUnit3TestAdapter" Version="4.2.1" />
|
||||||
<PackageVersion Include="NUnit" Version="3.13.3" />
|
<PackageVersion Include="NUnit" Version="3.13.3" />
|
||||||
<PackageVersion Include="NunitXml.TestLogger" Version="3.0.117" />
|
<PackageVersion Include="NunitXml.TestLogger" Version="3.0.117" />
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
<PackageVersion Include="System.Security.Principal.Windows" Version="5.0.0" />
|
<PackageVersion Include="System.Security.Principal.Windows" Version="5.0.0" />
|
||||||
<PackageVersion Include="System.ServiceProcess.ServiceController" Version="6.0.1" />
|
<PackageVersion Include="System.ServiceProcess.ServiceController" Version="6.0.1" />
|
||||||
<PackageVersion Include="System.Text.Encoding.CodePages" Version="6.0.0" />
|
<PackageVersion Include="System.Text.Encoding.CodePages" Version="6.0.0" />
|
||||||
<PackageVersion Include="System.Text.Json" Version="6.0.8" />
|
<PackageVersion Include="System.Text.Json" Version="6.0.9" />
|
||||||
<PackageVersion Include="System.ValueTuple" Version="4.5.0" />
|
<PackageVersion Include="System.ValueTuple" Version="4.5.0" />
|
||||||
<PackageVersion Include="TagLibSharp-Lidarr" Version="2.2.0.19" />
|
<PackageVersion Include="TagLibSharp-Lidarr" Version="2.2.0.19" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ using FluentAssertions;
|
|||||||
using Moq;
|
using Moq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Core.Books;
|
using NzbDrone.Core.Books;
|
||||||
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.CustomFormats;
|
using NzbDrone.Core.CustomFormats;
|
||||||
using NzbDrone.Core.DecisionEngine.Specifications;
|
using NzbDrone.Core.DecisionEngine.Specifications;
|
||||||
using NzbDrone.Core.Download.TrackedDownloads;
|
using NzbDrone.Core.Download.TrackedDownloads;
|
||||||
@@ -369,5 +370,31 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
|||||||
|
|
||||||
Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeTrue();
|
Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_return_false_if_same_quality_non_proper_in_queue_and_download_propers_is_do_not_upgrade()
|
||||||
|
{
|
||||||
|
_remoteBook.ParsedBookInfo.Quality = new QualityModel(Quality.FLAC, new Revision(2));
|
||||||
|
_author.QualityProfile.Value.Cutoff = _remoteBook.ParsedBookInfo.Quality.Quality.Id;
|
||||||
|
|
||||||
|
Mocker.GetMock<IConfigService>()
|
||||||
|
.Setup(s => s.DownloadPropersAndRepacks)
|
||||||
|
.Returns(ProperDownloadTypes.DoNotUpgrade);
|
||||||
|
|
||||||
|
var remoteBook = Builder<RemoteBook>.CreateNew()
|
||||||
|
.With(r => r.Author = _author)
|
||||||
|
.With(r => r.Books = new List<Book> { _book })
|
||||||
|
.With(r => r.ParsedBookInfo = new ParsedBookInfo
|
||||||
|
{
|
||||||
|
Quality = new QualityModel(Quality.FLAC)
|
||||||
|
})
|
||||||
|
.With(r => r.Release = _releaseInfo)
|
||||||
|
.With(r => r.CustomFormats = new List<CustomFormat>())
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
GivenQueue(new List<RemoteBook> { remoteBook });
|
||||||
|
|
||||||
|
Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeFalse();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ namespace NzbDrone.Core.Test.ImportListTests
|
|||||||
|
|
||||||
_importListReports = new List<ImportListItemInfo> { importListItem1 };
|
_importListReports = new List<ImportListItemInfo> { importListItem1 };
|
||||||
|
|
||||||
|
var mockImportList = new Mock<IImportList>();
|
||||||
|
|
||||||
Mocker.GetMock<IFetchAndParseImportList>()
|
Mocker.GetMock<IFetchAndParseImportList>()
|
||||||
.Setup(v => v.Fetch())
|
.Setup(v => v.Fetch())
|
||||||
.Returns(_importListReports);
|
.Returns(_importListReports);
|
||||||
@@ -53,6 +55,10 @@ namespace NzbDrone.Core.Test.ImportListTests
|
|||||||
.Setup(v => v.Get(It.IsAny<int>()))
|
.Setup(v => v.Get(It.IsAny<int>()))
|
||||||
.Returns(new ImportListDefinition { ShouldMonitor = ImportListMonitorType.SpecificBook });
|
.Returns(new ImportListDefinition { ShouldMonitor = ImportListMonitorType.SpecificBook });
|
||||||
|
|
||||||
|
Mocker.GetMock<IImportListFactory>()
|
||||||
|
.Setup(v => v.AutomaticAddEnabled(It.IsAny<bool>()))
|
||||||
|
.Returns(new List<IImportList> { mockImportList.Object });
|
||||||
|
|
||||||
Mocker.GetMock<IFetchAndParseImportList>()
|
Mocker.GetMock<IFetchAndParseImportList>()
|
||||||
.Setup(v => v.Fetch())
|
.Setup(v => v.Fetch())
|
||||||
.Returns(_importListReports);
|
.Returns(_importListReports);
|
||||||
@@ -322,5 +328,31 @@ namespace NzbDrone.Core.Test.ImportListTests
|
|||||||
t.First().AddOptions.BooksToMonitor.Count == expectedBooksMonitored &&
|
t.First().AddOptions.BooksToMonitor.Count == expectedBooksMonitored &&
|
||||||
t.First().Monitored == expectedAuthorMonitored), false));
|
t.First().Monitored == expectedAuthorMonitored), false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_fetch_if_no_lists_are_enabled()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IImportListFactory>()
|
||||||
|
.Setup(v => v.AutomaticAddEnabled(It.IsAny<bool>()))
|
||||||
|
.Returns(new List<IImportList>());
|
||||||
|
|
||||||
|
Subject.Execute(new ImportListSyncCommand());
|
||||||
|
|
||||||
|
Mocker.GetMock<IFetchAndParseImportList>()
|
||||||
|
.Verify(v => v.Fetch(), Times.Never);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_process_if_no_items_are_returned()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IFetchAndParseImportList>()
|
||||||
|
.Setup(v => v.Fetch())
|
||||||
|
.Returns(new List<ImportListItemInfo>());
|
||||||
|
|
||||||
|
Subject.Execute(new ImportListSyncCommand());
|
||||||
|
|
||||||
|
Mocker.GetMock<IImportListExclusionService>()
|
||||||
|
.Verify(v => v.All(), Times.Never);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,12 +5,15 @@ using System.IO;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using FizzWare.NBuilder;
|
using FizzWare.NBuilder;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
|
using Moq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Common.Disk;
|
using NzbDrone.Common.Disk;
|
||||||
using NzbDrone.Common.Extensions;
|
using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Core.Books;
|
using NzbDrone.Core.Books;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.MediaFiles;
|
using NzbDrone.Core.MediaFiles;
|
||||||
|
using NzbDrone.Core.MediaFiles.Events;
|
||||||
|
using NzbDrone.Core.Messaging.Events;
|
||||||
using NzbDrone.Core.Test.Framework;
|
using NzbDrone.Core.Test.Framework;
|
||||||
using NzbDrone.Test.Common;
|
using NzbDrone.Test.Common;
|
||||||
using NzbDrone.Test.Common.AutoMoq;
|
using NzbDrone.Test.Common.AutoMoq;
|
||||||
@@ -166,7 +169,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[TestCaseSource(typeof(TestCaseFactory), "TestCases")]
|
[TestCaseSource(typeof(TestCaseFactory), nameof(TestCaseFactory.TestCases))]
|
||||||
public void should_read_duration(string filename, string[] ignored)
|
public void should_read_duration(string filename, string[] ignored)
|
||||||
{
|
{
|
||||||
var path = Path.Combine(_testdir, filename);
|
var path = Path.Combine(_testdir, filename);
|
||||||
@@ -177,7 +180,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[TestCaseSource(typeof(TestCaseFactory), "TestCases")]
|
[TestCaseSource(typeof(TestCaseFactory), nameof(TestCaseFactory.TestCases))]
|
||||||
public void should_read_write_tags(string filename, string[] skipProperties)
|
public void should_read_write_tags(string filename, string[] skipProperties)
|
||||||
{
|
{
|
||||||
GivenFileCopy(filename);
|
GivenFileCopy(filename);
|
||||||
@@ -198,7 +201,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[TestCaseSource(typeof(TestCaseFactory), "TestCases")]
|
[TestCaseSource(typeof(TestCaseFactory), nameof(TestCaseFactory.TestCases))]
|
||||||
public void should_read_audiotag_from_file_with_no_tags(string filename, string[] skipProperties)
|
public void should_read_audiotag_from_file_with_no_tags(string filename, string[] skipProperties)
|
||||||
{
|
{
|
||||||
GivenFileCopy(filename);
|
GivenFileCopy(filename);
|
||||||
@@ -220,7 +223,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[TestCaseSource(typeof(TestCaseFactory), "TestCases")]
|
[TestCaseSource(typeof(TestCaseFactory), nameof(TestCaseFactory.TestCases))]
|
||||||
public void should_read_parsedtrackinfo_from_file_with_no_tags(string filename, string[] skipProperties)
|
public void should_read_parsedtrackinfo_from_file_with_no_tags(string filename, string[] skipProperties)
|
||||||
{
|
{
|
||||||
GivenFileCopy(filename);
|
GivenFileCopy(filename);
|
||||||
@@ -235,7 +238,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[TestCaseSource(typeof(TestCaseFactory), "TestCases")]
|
[TestCaseSource(typeof(TestCaseFactory), nameof(TestCaseFactory.TestCases))]
|
||||||
public void should_set_quality_and_mediainfo_for_corrupt_file(string filename, string[] skipProperties)
|
public void should_set_quality_and_mediainfo_for_corrupt_file(string filename, string[] skipProperties)
|
||||||
{
|
{
|
||||||
// use missing to simulate corrupt
|
// use missing to simulate corrupt
|
||||||
@@ -250,7 +253,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[TestCaseSource(typeof(TestCaseFactory), "TestCases")]
|
[TestCaseSource(typeof(TestCaseFactory), nameof(TestCaseFactory.TestCases))]
|
||||||
public void should_read_file_with_only_title_tag(string filename, string[] ignored)
|
public void should_read_file_with_only_title_tag(string filename, string[] ignored)
|
||||||
{
|
{
|
||||||
GivenFileCopy(filename);
|
GivenFileCopy(filename);
|
||||||
@@ -270,7 +273,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[TestCaseSource(typeof(TestCaseFactory), "TestCases")]
|
[TestCaseSource(typeof(TestCaseFactory), nameof(TestCaseFactory.TestCases))]
|
||||||
public void should_remove_date_from_tags_when_not_in_metadata(string filename, string[] ignored)
|
public void should_remove_date_from_tags_when_not_in_metadata(string filename, string[] ignored)
|
||||||
{
|
{
|
||||||
GivenFileCopy(filename);
|
GivenFileCopy(filename);
|
||||||
@@ -365,6 +368,29 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
|
|||||||
var fileInfo = _diskProvider.GetFileInfo(file.Path);
|
var fileInfo = _diskProvider.GetFileInfo(file.Path);
|
||||||
file.Modified.Should().Be(fileInfo.LastWriteTimeUtc);
|
file.Modified.Should().Be(fileInfo.LastWriteTimeUtc);
|
||||||
file.Size.Should().Be(fileInfo.Length);
|
file.Size.Should().Be(fileInfo.Length);
|
||||||
|
|
||||||
|
Mocker.GetMock<IEventAggregator>()
|
||||||
|
.Verify(v => v.PublishEvent(It.IsAny<BookFileRetaggedEvent>()), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestCase("nin.mp3")]
|
||||||
|
public void write_tags_should_not_update_tags_if_already_updated(string filename)
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IConfigService>()
|
||||||
|
.Setup(x => x.ScrubAudioTags)
|
||||||
|
.Returns(true);
|
||||||
|
|
||||||
|
GivenFileCopy(filename);
|
||||||
|
|
||||||
|
var file = GivenPopulatedTrackfile(0);
|
||||||
|
|
||||||
|
file.Path = _copiedFile;
|
||||||
|
Subject.WriteTags(file, false, true);
|
||||||
|
Subject.WriteTags(file, false, true);
|
||||||
|
Subject.WriteTags(file, false, true);
|
||||||
|
|
||||||
|
Mocker.GetMock<IEventAggregator>()
|
||||||
|
.Verify(v => v.PublishEvent(It.IsAny<BookFileRetaggedEvent>()), Times.Once());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ using NzbDrone.Core.Test.Framework;
|
|||||||
namespace NzbDrone.Core.Test.MetadataSource.Goodreads
|
namespace NzbDrone.Core.Test.MetadataSource.Goodreads
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
|
[Ignore("Waiting for metadata to be back again", Until = "2023-12-31 00:00:00Z")]
|
||||||
public class BookInfoProxyFixture : CoreTest<BookInfoProxy>
|
public class BookInfoProxyFixture : CoreTest<BookInfoProxy>
|
||||||
{
|
{
|
||||||
private MetadataProfile _metadataProfile;
|
private MetadataProfile _metadataProfile;
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ using NzbDrone.Test.Common;
|
|||||||
namespace NzbDrone.Core.Test.MetadataSource.Goodreads
|
namespace NzbDrone.Core.Test.MetadataSource.Goodreads
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
|
[Ignore("Waiting for metadata to be back again", Until = "2023-12-31 00:00:00Z")]
|
||||||
public class BookInfoProxySearchFixture : CoreTest<BookInfoProxy>
|
public class BookInfoProxySearchFixture : CoreTest<BookInfoProxy>
|
||||||
{
|
{
|
||||||
[SetUp]
|
[SetUp]
|
||||||
|
|||||||
@@ -35,16 +35,13 @@ namespace NzbDrone.Core.Test.ParserTests
|
|||||||
[TestCase("or")]
|
[TestCase("or")]
|
||||||
[TestCase("an")]
|
[TestCase("an")]
|
||||||
[TestCase("of")]
|
[TestCase("of")]
|
||||||
public void should_remove_common_words(string word)
|
public void should_remove_common_words_from_middle_of_title(string word)
|
||||||
{
|
{
|
||||||
var dirtyFormat = new[]
|
var dirtyFormat = new[]
|
||||||
{
|
{
|
||||||
"word.{0}.word",
|
"word.{0}.word",
|
||||||
"word {0} word",
|
"word {0} word",
|
||||||
"word-{0}-word",
|
"word-{0}-word"
|
||||||
"word.word.{0}",
|
|
||||||
"word-word-{0}",
|
|
||||||
"word-word {0}",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
foreach (var s in dirtyFormat)
|
foreach (var s in dirtyFormat)
|
||||||
@@ -54,6 +51,27 @@ namespace NzbDrone.Core.Test.ParserTests
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestCase("the")]
|
||||||
|
[TestCase("and")]
|
||||||
|
[TestCase("or")]
|
||||||
|
[TestCase("an")]
|
||||||
|
[TestCase("of")]
|
||||||
|
public void should_not_remove_common_words_from_end_of_title(string word)
|
||||||
|
{
|
||||||
|
var dirtyFormat = new[]
|
||||||
|
{
|
||||||
|
"word.word.{0}",
|
||||||
|
"word-word-{0}",
|
||||||
|
"word-word {0}"
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (var s in dirtyFormat)
|
||||||
|
{
|
||||||
|
var dirty = string.Format(s, word);
|
||||||
|
dirty.CleanAuthorName().Should().Be("wordword" + word.ToLower());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_remove_a_from_middle_of_title()
|
public void should_remove_a_from_middle_of_title()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ using System.Threading;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using FluentValidation;
|
using FluentValidation;
|
||||||
using FluentValidation.Results;
|
using FluentValidation.Results;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Cache;
|
using NzbDrone.Common.Cache;
|
||||||
using NzbDrone.Common.Disk;
|
using NzbDrone.Common.Disk;
|
||||||
@@ -218,11 +219,11 @@ namespace NzbDrone.Core.Books.Calibre
|
|||||||
double? seriesIndex = null;
|
double? seriesIndex = null;
|
||||||
if (double.TryParse(serieslink?.Position, out var index))
|
if (double.TryParse(serieslink?.Position, out var index))
|
||||||
{
|
{
|
||||||
_logger.Trace($"Parsed {serieslink?.Position} as {index}");
|
_logger.Trace("Parsed '{0}' as '{1}'", serieslink.Position, index);
|
||||||
seriesIndex = index;
|
seriesIndex = index;
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.Trace($"Book: {book} Series: {series?.Title}, Position: {seriesIndex}");
|
_logger.Trace("Book: {0} Series: {1}, Position: {2}", book, series?.Title, seriesIndex);
|
||||||
|
|
||||||
var cover = edition.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Cover);
|
var cover = edition.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Cover);
|
||||||
string image = null;
|
string image = null;
|
||||||
@@ -275,7 +276,9 @@ namespace NzbDrone.Core.Books.Calibre
|
|||||||
|
|
||||||
var updatedPath = GetOriginalFormat(updated.Formats);
|
var updatedPath = GetOriginalFormat(updated.Formats);
|
||||||
|
|
||||||
if (updatedPath != null && updatedPath != file.Path)
|
_logger.Trace("File path from Calibre: '{0}'", updatedPath);
|
||||||
|
|
||||||
|
if (updatedPath.IsNotNullOrWhiteSpace() && updatedPath != file.Path)
|
||||||
{
|
{
|
||||||
_rootFolderWatchingService.ReportFileSystemChangeBeginning(updatedPath);
|
_rootFolderWatchingService.ReportFileSystemChangeBeginning(updatedPath);
|
||||||
file.Path = updatedPath;
|
file.Path = updatedPath;
|
||||||
@@ -304,6 +307,7 @@ namespace NzbDrone.Core.Books.Calibre
|
|||||||
|
|
||||||
var request = builder.Build();
|
var request = builder.Build();
|
||||||
request.SetContent(payload.ToJson());
|
request.SetContent(payload.ToJson());
|
||||||
|
request.ContentSummary = payload.ToJson(Formatting.None);
|
||||||
|
|
||||||
_httpClient.Execute(request);
|
_httpClient.Execute(request);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -322,6 +322,20 @@ namespace NzbDrone.Core.Configuration
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void MigrateConfigFile()
|
||||||
|
{
|
||||||
|
if (!File.Exists(_configFile))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If SSL is enabled and a cert hash is still in the config file disable SSL
|
||||||
|
if (EnableSsl && GetValue("SslCertHash", null).IsNotNullOrWhiteSpace())
|
||||||
|
{
|
||||||
|
SetValue("EnableSsl", false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void DeleteOldValues()
|
private void DeleteOldValues()
|
||||||
{
|
{
|
||||||
var xDoc = LoadConfigFile();
|
var xDoc = LoadConfigFile();
|
||||||
@@ -404,6 +418,7 @@ namespace NzbDrone.Core.Configuration
|
|||||||
|
|
||||||
public void HandleAsync(ApplicationStartedEvent message)
|
public void HandleAsync(ApplicationStartedEvent message)
|
||||||
{
|
{
|
||||||
|
MigrateConfigFile();
|
||||||
EnsureDefaultConfigFile();
|
EnsureDefaultConfigFile();
|
||||||
DeleteOldValues();
|
DeleteOldValues();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,9 @@ namespace NzbDrone.Core.Datastore
|
|||||||
{
|
{
|
||||||
public interface IConnectionStringFactory
|
public interface IConnectionStringFactory
|
||||||
{
|
{
|
||||||
string MainDbConnectionString { get; }
|
DatabaseConnectionInfo MainDbConnection { get; }
|
||||||
string LogDbConnectionString { get; }
|
DatabaseConnectionInfo LogDbConnection { get; }
|
||||||
string CacheDbConnectionString { get; }
|
DatabaseConnectionInfo CacheDbConnection { get; }
|
||||||
string GetDatabasePath(string connectionString);
|
string GetDatabasePath(string connectionString);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -23,19 +23,19 @@ namespace NzbDrone.Core.Datastore
|
|||||||
{
|
{
|
||||||
_configFileProvider = configFileProvider;
|
_configFileProvider = configFileProvider;
|
||||||
|
|
||||||
MainDbConnectionString = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresMainDb) :
|
MainDbConnection = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresMainDb) :
|
||||||
GetConnectionString(appFolderInfo.GetDatabase());
|
GetConnectionString(appFolderInfo.GetDatabase());
|
||||||
|
|
||||||
LogDbConnectionString = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresLogDb) :
|
LogDbConnection = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresLogDb) :
|
||||||
GetConnectionString(appFolderInfo.GetLogDatabase());
|
GetConnectionString(appFolderInfo.GetLogDatabase());
|
||||||
|
|
||||||
CacheDbConnectionString = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresCacheDb) :
|
CacheDbConnection = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresCacheDb) :
|
||||||
GetConnectionString(appFolderInfo.GetCacheDatabase());
|
GetConnectionString(appFolderInfo.GetCacheDatabase());
|
||||||
}
|
}
|
||||||
|
|
||||||
public string MainDbConnectionString { get; private set; }
|
public DatabaseConnectionInfo MainDbConnection { get; private set; }
|
||||||
public string LogDbConnectionString { get; private set; }
|
public DatabaseConnectionInfo LogDbConnection { get; private set; }
|
||||||
public string CacheDbConnectionString { get; private set; }
|
public DatabaseConnectionInfo CacheDbConnection { get; private set; }
|
||||||
|
|
||||||
public string GetDatabasePath(string connectionString)
|
public string GetDatabasePath(string connectionString)
|
||||||
{
|
{
|
||||||
@@ -44,7 +44,7 @@ namespace NzbDrone.Core.Datastore
|
|||||||
return connectionBuilder.DataSource;
|
return connectionBuilder.DataSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string GetConnectionString(string dbPath)
|
private static DatabaseConnectionInfo GetConnectionString(string dbPath)
|
||||||
{
|
{
|
||||||
var connectionBuilder = new SQLiteConnectionStringBuilder
|
var connectionBuilder = new SQLiteConnectionStringBuilder
|
||||||
{
|
{
|
||||||
@@ -62,21 +62,22 @@ namespace NzbDrone.Core.Datastore
|
|||||||
connectionBuilder.Add("Full FSync", true);
|
connectionBuilder.Add("Full FSync", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return connectionBuilder.ConnectionString;
|
return new DatabaseConnectionInfo(DatabaseType.SQLite, connectionBuilder.ConnectionString);
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetPostgresConnectionString(string dbName)
|
private DatabaseConnectionInfo GetPostgresConnectionString(string dbName)
|
||||||
{
|
{
|
||||||
var connectionBuilder = new NpgsqlConnectionStringBuilder();
|
var connectionBuilder = new NpgsqlConnectionStringBuilder
|
||||||
|
{
|
||||||
|
Database = dbName,
|
||||||
|
Host = _configFileProvider.PostgresHost,
|
||||||
|
Username = _configFileProvider.PostgresUser,
|
||||||
|
Password = _configFileProvider.PostgresPassword,
|
||||||
|
Port = _configFileProvider.PostgresPort,
|
||||||
|
Enlist = false
|
||||||
|
};
|
||||||
|
|
||||||
connectionBuilder.Database = dbName;
|
return new DatabaseConnectionInfo(DatabaseType.PostgreSQL, connectionBuilder.ConnectionString);
|
||||||
connectionBuilder.Host = _configFileProvider.PostgresHost;
|
|
||||||
connectionBuilder.Username = _configFileProvider.PostgresUser;
|
|
||||||
connectionBuilder.Password = _configFileProvider.PostgresPassword;
|
|
||||||
connectionBuilder.Port = _configFileProvider.PostgresPort;
|
|
||||||
connectionBuilder.Enlist = false;
|
|
||||||
|
|
||||||
return connectionBuilder.ConnectionString;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
namespace NzbDrone.Core.Datastore
|
||||||
|
{
|
||||||
|
public class DatabaseConnectionInfo
|
||||||
|
{
|
||||||
|
public DatabaseConnectionInfo(DatabaseType databaseType, string connectionString)
|
||||||
|
{
|
||||||
|
DatabaseType = databaseType;
|
||||||
|
ConnectionString = connectionString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DatabaseType DatabaseType { get; internal set; }
|
||||||
|
public string ConnectionString { get; internal set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ using System;
|
|||||||
using System.Data.Common;
|
using System.Data.Common;
|
||||||
using System.Data.SQLite;
|
using System.Data.SQLite;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
|
using System.Threading;
|
||||||
using NLog;
|
using NLog;
|
||||||
using Npgsql;
|
using Npgsql;
|
||||||
using NzbDrone.Common.Disk;
|
using NzbDrone.Common.Disk;
|
||||||
@@ -59,30 +60,30 @@ namespace NzbDrone.Core.Datastore
|
|||||||
|
|
||||||
public IDatabase Create(MigrationContext migrationContext)
|
public IDatabase Create(MigrationContext migrationContext)
|
||||||
{
|
{
|
||||||
string connectionString;
|
DatabaseConnectionInfo connectionInfo;
|
||||||
|
|
||||||
switch (migrationContext.MigrationType)
|
switch (migrationContext.MigrationType)
|
||||||
{
|
{
|
||||||
case MigrationType.Main:
|
case MigrationType.Main:
|
||||||
{
|
{
|
||||||
connectionString = _connectionStringFactory.MainDbConnectionString;
|
connectionInfo = _connectionStringFactory.MainDbConnection;
|
||||||
CreateMain(connectionString, migrationContext);
|
CreateMain(connectionInfo.ConnectionString, migrationContext, connectionInfo.DatabaseType);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case MigrationType.Log:
|
case MigrationType.Log:
|
||||||
{
|
{
|
||||||
connectionString = _connectionStringFactory.LogDbConnectionString;
|
connectionInfo = _connectionStringFactory.LogDbConnection;
|
||||||
CreateLog(connectionString, migrationContext);
|
CreateLog(connectionInfo.ConnectionString, migrationContext, connectionInfo.DatabaseType);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case MigrationType.Cache:
|
case MigrationType.Cache:
|
||||||
{
|
{
|
||||||
connectionString = _connectionStringFactory.CacheDbConnectionString;
|
connectionInfo = _connectionStringFactory.CacheDbConnection;
|
||||||
CreateLog(connectionString, migrationContext);
|
CreateLog(connectionInfo.ConnectionString, migrationContext, connectionInfo.DatabaseType);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -97,14 +98,14 @@ namespace NzbDrone.Core.Datastore
|
|||||||
{
|
{
|
||||||
DbConnection conn;
|
DbConnection conn;
|
||||||
|
|
||||||
if (connectionString.Contains(".db"))
|
if (connectionInfo.DatabaseType == DatabaseType.SQLite)
|
||||||
{
|
{
|
||||||
conn = SQLiteFactory.Instance.CreateConnection();
|
conn = SQLiteFactory.Instance.CreateConnection();
|
||||||
conn.ConnectionString = connectionString;
|
conn.ConnectionString = connectionInfo.ConnectionString;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
conn = new NpgsqlConnection(connectionString);
|
conn = new NpgsqlConnection(connectionInfo.ConnectionString);
|
||||||
}
|
}
|
||||||
|
|
||||||
conn.Open();
|
conn.Open();
|
||||||
@@ -114,12 +115,12 @@ namespace NzbDrone.Core.Datastore
|
|||||||
return db;
|
return db;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CreateMain(string connectionString, MigrationContext migrationContext)
|
private void CreateMain(string connectionString, MigrationContext migrationContext, DatabaseType databaseType)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_restoreDatabaseService.Restore();
|
_restoreDatabaseService.Restore();
|
||||||
_migrationController.Migrate(connectionString, migrationContext);
|
_migrationController.Migrate(connectionString, migrationContext, databaseType);
|
||||||
}
|
}
|
||||||
catch (SQLiteException e)
|
catch (SQLiteException e)
|
||||||
{
|
{
|
||||||
@@ -142,15 +143,17 @@ namespace NzbDrone.Core.Datastore
|
|||||||
{
|
{
|
||||||
Logger.Error(e, "Failure to connect to Postgres DB, {0} retries remaining", retryCount);
|
Logger.Error(e, "Failure to connect to Postgres DB, {0} retries remaining", retryCount);
|
||||||
|
|
||||||
|
Thread.Sleep(5000);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_migrationController.Migrate(connectionString, migrationContext);
|
_migrationController.Migrate(connectionString, migrationContext, databaseType);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
if (--retryCount > 0)
|
if (--retryCount > 0)
|
||||||
{
|
{
|
||||||
System.Threading.Thread.Sleep(5000);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,11 +172,11 @@ namespace NzbDrone.Core.Datastore
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CreateLog(string connectionString, MigrationContext migrationContext)
|
private void CreateLog(string connectionString, MigrationContext migrationContext, DatabaseType databaseType)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_migrationController.Migrate(connectionString, migrationContext);
|
_migrationController.Migrate(connectionString, migrationContext, databaseType);
|
||||||
}
|
}
|
||||||
catch (SQLiteException e)
|
catch (SQLiteException e)
|
||||||
{
|
{
|
||||||
@@ -193,7 +196,7 @@ namespace NzbDrone.Core.Datastore
|
|||||||
Logger.Error("Unable to recreate logging database automatically. It will need to be removed manually.");
|
Logger.Error("Unable to recreate logging database automatically. It will need to be removed manually.");
|
||||||
}
|
}
|
||||||
|
|
||||||
_migrationController.Migrate(connectionString, migrationContext);
|
_migrationController.Migrate(connectionString, migrationContext, databaseType);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
|
|||||||
{
|
{
|
||||||
public interface IMigrationController
|
public interface IMigrationController
|
||||||
{
|
{
|
||||||
void Migrate(string connectionString, MigrationContext migrationContext);
|
void Migrate(string connectionString, MigrationContext migrationContext, DatabaseType databaseType);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MigrationController : IMigrationController
|
public class MigrationController : IMigrationController
|
||||||
@@ -29,7 +29,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
|
|||||||
_migrationLoggerProvider = migrationLoggerProvider;
|
_migrationLoggerProvider = migrationLoggerProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Migrate(string connectionString, MigrationContext migrationContext)
|
public void Migrate(string connectionString, MigrationContext migrationContext, DatabaseType databaseType)
|
||||||
{
|
{
|
||||||
var sw = Stopwatch.StartNew();
|
var sw = Stopwatch.StartNew();
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
|
|||||||
|
|
||||||
ServiceProvider serviceProvider;
|
ServiceProvider serviceProvider;
|
||||||
|
|
||||||
var db = connectionString.Contains(".db") ? "sqlite" : "postgres";
|
var db = databaseType == DatabaseType.SQLite ? "sqlite" : "postgres";
|
||||||
|
|
||||||
serviceProvider = new ServiceCollection()
|
serviceProvider = new ServiceCollection()
|
||||||
.AddLogging(b => b.AddNLog())
|
.AddLogging(b => b.AddNLog())
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NLog;
|
using NLog;
|
||||||
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.CustomFormats;
|
using NzbDrone.Core.CustomFormats;
|
||||||
using NzbDrone.Core.Download.TrackedDownloads;
|
using NzbDrone.Core.Download.TrackedDownloads;
|
||||||
using NzbDrone.Core.IndexerSearch.Definitions;
|
using NzbDrone.Core.IndexerSearch.Definitions;
|
||||||
@@ -15,16 +16,19 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
|
|||||||
private readonly IQueueService _queueService;
|
private readonly IQueueService _queueService;
|
||||||
private readonly UpgradableSpecification _upgradableSpecification;
|
private readonly UpgradableSpecification _upgradableSpecification;
|
||||||
private readonly ICustomFormatCalculationService _formatService;
|
private readonly ICustomFormatCalculationService _formatService;
|
||||||
|
private readonly IConfigService _configService;
|
||||||
private readonly Logger _logger;
|
private readonly Logger _logger;
|
||||||
|
|
||||||
public QueueSpecification(IQueueService queueService,
|
public QueueSpecification(IQueueService queueService,
|
||||||
UpgradableSpecification upgradableSpecification,
|
UpgradableSpecification upgradableSpecification,
|
||||||
ICustomFormatCalculationService formatService,
|
ICustomFormatCalculationService formatService,
|
||||||
|
IConfigService configService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
{
|
{
|
||||||
_queueService = queueService;
|
_queueService = queueService;
|
||||||
_upgradableSpecification = upgradableSpecification;
|
_upgradableSpecification = upgradableSpecification;
|
||||||
_formatService = formatService;
|
_formatService = formatService;
|
||||||
|
_configService = configService;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,6 +89,15 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
|
|||||||
{
|
{
|
||||||
return Decision.Reject("Another release is queued and the Quality profile does not allow upgrades");
|
return Decision.Reject("Another release is queued and the Quality profile does not allow upgrades");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_upgradableSpecification.IsRevisionUpgrade(remoteBook.ParsedBookInfo.Quality, subject.ParsedBookInfo.Quality))
|
||||||
|
{
|
||||||
|
if (_configService.DownloadPropersAndRepacks == ProperDownloadTypes.DoNotUpgrade)
|
||||||
|
{
|
||||||
|
_logger.Debug("Auto downloading of propers is disabled");
|
||||||
|
return Decision.Reject("Proper downloading is disabled");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Decision.Accept();
|
return Decision.Accept();
|
||||||
|
|||||||
@@ -368,6 +368,10 @@ namespace NzbDrone.Core.Extras.Metadata
|
|||||||
_mediaFileAttributeService.SetFilePermissions(fullPath);
|
_mediaFileAttributeService.SetFilePermissions(fullPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (HttpException ex)
|
||||||
|
{
|
||||||
|
_logger.Warn(ex, "Couldn't download image {0} for {1}. {2}", image.Url, author, ex.Message);
|
||||||
|
}
|
||||||
catch (WebException ex)
|
catch (WebException ex)
|
||||||
{
|
{
|
||||||
_logger.Warn(ex, "Couldn't download image {0} for {1}. {2}", image.Url, author, ex.Message);
|
_logger.Warn(ex, "Couldn't download image {0} for {1}. {2}", image.Url, author, ex.Message);
|
||||||
|
|||||||
@@ -67,41 +67,51 @@ namespace NzbDrone.Core.ImportLists
|
|||||||
|
|
||||||
private List<Book> SyncAll()
|
private List<Book> SyncAll()
|
||||||
{
|
{
|
||||||
|
if (_importListFactory.AutomaticAddEnabled().Empty())
|
||||||
|
{
|
||||||
|
_logger.Debug("No import lists with automatic add enabled");
|
||||||
|
|
||||||
|
return new List<Book>();
|
||||||
|
}
|
||||||
|
|
||||||
_logger.ProgressInfo("Starting Import List Sync");
|
_logger.ProgressInfo("Starting Import List Sync");
|
||||||
|
|
||||||
var rssReleases = _listFetcherAndParser.Fetch();
|
var listItems = _listFetcherAndParser.Fetch().ToList();
|
||||||
|
|
||||||
var reports = rssReleases.ToList();
|
return ProcessListItems(listItems);
|
||||||
|
|
||||||
return ProcessReports(reports);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Book> SyncList(ImportListDefinition definition)
|
private List<Book> SyncList(ImportListDefinition definition)
|
||||||
{
|
{
|
||||||
_logger.ProgressInfo(string.Format("Starting Import List Refresh for List {0}", definition.Name));
|
_logger.ProgressInfo($"Starting Import List Refresh for List {definition.Name}");
|
||||||
|
|
||||||
var rssReleases = _listFetcherAndParser.FetchSingleList(definition);
|
var listItems = _listFetcherAndParser.FetchSingleList(definition).ToList();
|
||||||
|
|
||||||
var reports = rssReleases.ToList();
|
return ProcessListItems(listItems);
|
||||||
|
|
||||||
return ProcessReports(reports);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Book> ProcessReports(List<ImportListItemInfo> reports)
|
private List<Book> ProcessListItems(List<ImportListItemInfo> items)
|
||||||
{
|
{
|
||||||
var processed = new List<Book>();
|
var processed = new List<Book>();
|
||||||
var authorsToAdd = new List<Author>();
|
var authorsToAdd = new List<Author>();
|
||||||
var booksToAdd = new List<Book>();
|
var booksToAdd = new List<Book>();
|
||||||
|
|
||||||
_logger.ProgressInfo("Processing {0} list items", reports.Count);
|
if (items.Count == 0)
|
||||||
|
{
|
||||||
|
_logger.ProgressInfo("No list items to process");
|
||||||
|
|
||||||
|
return new List<Book>();
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.ProgressInfo("Processing {0} list items", items.Count);
|
||||||
|
|
||||||
var reportNumber = 1;
|
var reportNumber = 1;
|
||||||
|
|
||||||
var listExclusions = _importListExclusionService.All();
|
var listExclusions = _importListExclusionService.All();
|
||||||
|
|
||||||
foreach (var report in reports)
|
foreach (var report in items)
|
||||||
{
|
{
|
||||||
_logger.ProgressTrace("Processing list item {0}/{1}", reportNumber, reports.Count);
|
_logger.ProgressTrace("Processing list item {0}/{1}", reportNumber, items.Count);
|
||||||
|
|
||||||
reportNumber++;
|
reportNumber++;
|
||||||
|
|
||||||
@@ -130,7 +140,7 @@ namespace NzbDrone.Core.ImportLists
|
|||||||
var addedAuthors = _addAuthorService.AddAuthors(authorsToAdd, false);
|
var addedAuthors = _addAuthorService.AddAuthors(authorsToAdd, false);
|
||||||
var addedBooks = _addBookService.AddBooks(booksToAdd, false);
|
var addedBooks = _addBookService.AddBooks(booksToAdd, false);
|
||||||
|
|
||||||
var message = string.Format($"Import List Sync Completed. Items found: {reports.Count}, Authors added: {authorsToAdd.Count}, Books added: {booksToAdd.Count}");
|
var message = string.Format($"Import List Sync Completed. Items found: {items.Count}, Authors added: {authorsToAdd.Count}, Books added: {booksToAdd.Count}");
|
||||||
|
|
||||||
_logger.ProgressInfo(message);
|
_logger.ProgressInfo(message);
|
||||||
|
|
||||||
@@ -364,7 +374,7 @@ namespace NzbDrone.Core.ImportLists
|
|||||||
var existingAuthor = _authorService.FindById(report.AuthorGoodreadsId);
|
var existingAuthor = _authorService.FindById(report.AuthorGoodreadsId);
|
||||||
|
|
||||||
// Check to see if author excluded
|
// Check to see if author excluded
|
||||||
var excludedAuthor = listExclusions.Where(s => s.ForeignId == report.AuthorGoodreadsId).SingleOrDefault();
|
var excludedAuthor = listExclusions.SingleOrDefault(s => s.ForeignId == report.AuthorGoodreadsId);
|
||||||
|
|
||||||
// Check to see if author in import
|
// Check to see if author in import
|
||||||
var existingImportAuthor = authorsToAdd.Find(i => i.ForeignAuthorId == report.AuthorGoodreadsId);
|
var existingImportAuthor = authorsToAdd.Find(i => i.ForeignAuthorId == report.AuthorGoodreadsId);
|
||||||
@@ -425,16 +435,7 @@ namespace NzbDrone.Core.ImportLists
|
|||||||
|
|
||||||
public void Execute(ImportListSyncCommand message)
|
public void Execute(ImportListSyncCommand message)
|
||||||
{
|
{
|
||||||
List<Book> processed;
|
var processed = message.DefinitionId.HasValue ? SyncList(_importListFactory.Get(message.DefinitionId.Value)) : SyncAll();
|
||||||
|
|
||||||
if (message.DefinitionId.HasValue)
|
|
||||||
{
|
|
||||||
processed = SyncList(_importListFactory.Get(message.DefinitionId.Value));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
processed = SyncAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
_eventAggregator.PublishEvent(new ImportListSyncCompleteEvent(processed));
|
_eventAggregator.PublishEvent(new ImportListSyncCompleteEvent(processed));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,6 @@ namespace NzbDrone.Core.Indexers.Newznab
|
|||||||
yield return GetDefinition("NZBFinder.ws", GetSettings("https://nzbfinder.ws"));
|
yield return GetDefinition("NZBFinder.ws", GetSettings("https://nzbfinder.ws"));
|
||||||
yield return GetDefinition("NZBgeek", GetSettings("https://api.nzbgeek.info"));
|
yield return GetDefinition("NZBgeek", GetSettings("https://api.nzbgeek.info"));
|
||||||
yield return GetDefinition("nzbplanet.net", GetSettings("https://api.nzbplanet.net"));
|
yield return GetDefinition("nzbplanet.net", GetSettings("https://api.nzbplanet.net"));
|
||||||
yield return GetDefinition("OZnzb.com", GetSettings("https://api.oznzb.com"));
|
|
||||||
yield return GetDefinition("SimplyNZBs", GetSettings("https://simplynzbs.com"));
|
yield return GetDefinition("SimplyNZBs", GetSettings("https://simplynzbs.com"));
|
||||||
yield return GetDefinition("Tabula Rasa", GetSettings("https://www.tabula-rasa.pw", apiPath: @"/api/v1/api"));
|
yield return GetDefinition("Tabula Rasa", GetSettings("https://www.tabula-rasa.pw", apiPath: @"/api/v1/api"));
|
||||||
yield return GetDefinition("Usenet Crawler", GetSettings("https://www.usenet-crawler.com"));
|
yield return GetDefinition("Usenet Crawler", GetSettings("https://www.usenet-crawler.com"));
|
||||||
|
|||||||
@@ -85,16 +85,15 @@ namespace NzbDrone.Core.Instrumentation
|
|||||||
|
|
||||||
log.Level = logEvent.Level.Name;
|
log.Level = logEvent.Level.Name;
|
||||||
|
|
||||||
var connectionString = _connectionStringFactory.LogDbConnectionString;
|
var connectionInfo = _connectionStringFactory.LogDbConnection;
|
||||||
|
|
||||||
//TODO: Probably need more robust way to differentiate what's being used
|
if (connectionInfo.DatabaseType == DatabaseType.SQLite)
|
||||||
if (connectionString.Contains(".db"))
|
|
||||||
{
|
{
|
||||||
WriteSqliteLog(log, connectionString);
|
WriteSqliteLog(log, connectionInfo.ConnectionString);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
WritePostgresLog(log, connectionString);
|
WritePostgresLog(log, connectionInfo.ConnectionString);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (SQLiteException ex)
|
catch (SQLiteException ex)
|
||||||
|
|||||||
@@ -216,8 +216,6 @@
|
|||||||
"FileManagement": "إدارة الملفات",
|
"FileManagement": "إدارة الملفات",
|
||||||
"FileDateHelpText": "تغيير تاريخ الملف عند الاستيراد / إعادة الفحص",
|
"FileDateHelpText": "تغيير تاريخ الملف عند الاستيراد / إعادة الفحص",
|
||||||
"FailedDownloadHandling": "فشل معالجة التنزيل",
|
"FailedDownloadHandling": "فشل معالجة التنزيل",
|
||||||
"ExtraFileExtensionsHelpTexts2": "أمثلة: \".sub أو .nfo\" أو \"sub، nfo\"",
|
|
||||||
"ExtraFileExtensionsHelpTexts1": "قائمة مفصولة بفواصل بالملفات الإضافية المراد استيرادها (سيتم استيراد .nfo كـ .nfo-Orig)",
|
|
||||||
"Exception": "استثناء",
|
"Exception": "استثناء",
|
||||||
"ErrorLoadingPreviews": "خطأ في تحميل المعاينات",
|
"ErrorLoadingPreviews": "خطأ في تحميل المعاينات",
|
||||||
"ErrorLoadingContents": "خطأ في تحميل المحتويات",
|
"ErrorLoadingContents": "خطأ في تحميل المحتويات",
|
||||||
@@ -628,5 +626,7 @@
|
|||||||
"AddNew": "اضف جديد",
|
"AddNew": "اضف جديد",
|
||||||
"System": "النظام",
|
"System": "النظام",
|
||||||
"AllResultsAreHiddenByTheAppliedFilter": "يتم إخفاء جميع النتائج بواسطة عامل التصفية المطبق",
|
"AllResultsAreHiddenByTheAppliedFilter": "يتم إخفاء جميع النتائج بواسطة عامل التصفية المطبق",
|
||||||
"Backup": "دعم"
|
"Backup": "دعم",
|
||||||
|
"ExtraFileExtensionsHelpText": "قائمة مفصولة بفواصل بالملفات الإضافية المراد استيرادها (سيتم استيراد .nfo كـ .nfo-Orig)",
|
||||||
|
"ExtraFileExtensionsHelpTextsExamples": "أمثلة: \".sub أو .nfo\" أو \"sub، nfo\""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -122,8 +122,6 @@
|
|||||||
"ErrorLoadingContents": "Грешка при зареждането на съдържанието",
|
"ErrorLoadingContents": "Грешка при зареждането на съдържанието",
|
||||||
"ErrorLoadingPreviews": "Грешка при зареждането на визуализациите",
|
"ErrorLoadingPreviews": "Грешка при зареждането на визуализациите",
|
||||||
"Exception": "Изключение",
|
"Exception": "Изключение",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Списък с допълнителни файлове за импортиране, разделени със запетая (.nfo ще бъде импортиран като .nfo-orig)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Примери: '.sub, .nfo' или 'sub, nfo'",
|
|
||||||
"FailedDownloadHandling": "Неуспешно обработване на изтеглянето",
|
"FailedDownloadHandling": "Неуспешно обработване на изтеглянето",
|
||||||
"FileDateHelpText": "Променете датата на файла при импортиране / пресканиране",
|
"FileDateHelpText": "Променете датата на файла при импортиране / пресканиране",
|
||||||
"FileManagement": "Управление на файлове",
|
"FileManagement": "Управление на файлове",
|
||||||
@@ -628,5 +626,7 @@
|
|||||||
"AllResultsAreHiddenByTheAppliedFilter": "Всички резултати са скрити от приложения филтър",
|
"AllResultsAreHiddenByTheAppliedFilter": "Всички резултати са скрити от приложения филтър",
|
||||||
"Backup": "Архивиране",
|
"Backup": "Архивиране",
|
||||||
"MetadataProfiles": "Добави профил на метадата",
|
"MetadataProfiles": "Добави профил на метадата",
|
||||||
"MetadataProfile": "Добави профил на метадата"
|
"MetadataProfile": "Добави профил на метадата",
|
||||||
|
"ExtraFileExtensionsHelpText": "Списък с допълнителни файлове за импортиране, разделени със запетая (.nfo ще бъде импортиран като .nfo-orig)",
|
||||||
|
"ExtraFileExtensionsHelpTextsExamples": "Примери: '.sub, .nfo' или 'sub, nfo'"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -326,7 +326,6 @@
|
|||||||
"DownloadClientStatusCheckAllClientMessage": "Tots els clients de descàrrega no estan disponibles a causa d'errors",
|
"DownloadClientStatusCheckAllClientMessage": "Tots els clients de descàrrega no estan disponibles a causa d'errors",
|
||||||
"DownloadClientStatusCheckSingleClientMessage": "Baixa els clients no disponibles a causa d'errors: {0}",
|
"DownloadClientStatusCheckSingleClientMessage": "Baixa els clients no disponibles a causa d'errors: {0}",
|
||||||
"Duration": "durada",
|
"Duration": "durada",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Llista separada per comes de fitxers addicionals per importar (.nfo s'importarà com a .nfo-orig)",
|
|
||||||
"FileWasDeletedByViaUI": "El fitxer s'ha suprimit mitjançant la interfície d'usuari",
|
"FileWasDeletedByViaUI": "El fitxer s'ha suprimit mitjançant la interfície d'usuari",
|
||||||
"GeneralSettingsSummary": "Port, SSL, nom d'usuari/contrasenya, servidor intermediari, analítiques i actualitzacions",
|
"GeneralSettingsSummary": "Port, SSL, nom d'usuari/contrasenya, servidor intermediari, analítiques i actualitzacions",
|
||||||
"GrabRelease": "Captura novetat",
|
"GrabRelease": "Captura novetat",
|
||||||
@@ -528,7 +527,6 @@
|
|||||||
"CutoffUnmet": "Tall no assolit",
|
"CutoffUnmet": "Tall no assolit",
|
||||||
"DeleteDelayProfileMessageText": "Esteu segur que voleu suprimir aquest perfil de retard?",
|
"DeleteDelayProfileMessageText": "Esteu segur que voleu suprimir aquest perfil de retard?",
|
||||||
"DeleteImportListExclusionMessageText": "Esteu segur que voleu suprimir aquesta exclusió de la llista d'importació?",
|
"DeleteImportListExclusionMessageText": "Esteu segur que voleu suprimir aquesta exclusió de la llista d'importació?",
|
||||||
"ExtraFileExtensionsHelpTexts2": "Exemples: '.sub, .nfo' o 'sub,nfo'",
|
|
||||||
"HasPendingChangesSaveChanges": "Desa els canvis",
|
"HasPendingChangesSaveChanges": "Desa els canvis",
|
||||||
"ICalLink": "Enllaç iCal`",
|
"ICalLink": "Enllaç iCal`",
|
||||||
"IgnoredHelpText": "La publicació es rebutjarà si conté un o més dels termes (no distingeix entre majúscules i minúscules)",
|
"IgnoredHelpText": "La publicació es rebutjarà si conté un o més dels termes (no distingeix entre majúscules i minúscules)",
|
||||||
|
|||||||
@@ -80,19 +80,19 @@
|
|||||||
"DeleteDelayProfile": "Odstranění profilu zpoždění",
|
"DeleteDelayProfile": "Odstranění profilu zpoždění",
|
||||||
"DeleteDelayProfileMessageText": "Opravdu chcete smazat tento profil zpoždění?",
|
"DeleteDelayProfileMessageText": "Opravdu chcete smazat tento profil zpoždění?",
|
||||||
"DeleteDownloadClient": "Odstranění klienta pro stahování",
|
"DeleteDownloadClient": "Odstranění klienta pro stahování",
|
||||||
"DeleteDownloadClientMessageText": "Opravdu chcete odstranit klienta pro stahování „{0}“?",
|
"DeleteDownloadClientMessageText": "Opravdu chcete odstranit klienta pro stahování '{name}'?",
|
||||||
"DeleteEmptyFolders": "Odstraňte prázdné složky",
|
"DeleteEmptyFolders": "Odstraňte prázdné složky",
|
||||||
"DeleteEmptyFoldersHelpText": "Během skenování disku a při mazání filmových souborů odstraňte prázdné složky s filmy",
|
"DeleteEmptyFoldersHelpText": "Během skenování disku a při mazání filmových souborů odstraňte prázdné složky s filmy",
|
||||||
"DeleteImportListExclusion": "Odstranit vyloučení seznamu importů",
|
"DeleteImportListExclusion": "Odstranit vyloučení seznamu importů",
|
||||||
"DeleteImportListExclusionMessageText": "Opravdu chcete toto vyloučení importního seznamu smazat?",
|
"DeleteImportListExclusionMessageText": "Opravdu chcete toto vyloučení importního seznamu smazat?",
|
||||||
"DeleteImportListMessageText": "Opravdu chcete smazat seznam „{0}“?",
|
"DeleteImportListMessageText": "Opravdu chcete smazat seznam '{name}'?",
|
||||||
"DeleteIndexer": "Odstranit indexer",
|
"DeleteIndexer": "Odstranit indexer",
|
||||||
"DeleteIndexerMessageText": "Opravdu chcete odstranit indexer „{0}“?",
|
"DeleteIndexerMessageText": "Opravdu chcete odstranit indexer '{name}'?",
|
||||||
"DeleteMetadataProfileMessageText": "Opravdu chcete smazat kvalitní profil {0}",
|
"DeleteMetadataProfileMessageText": "Opravdu chcete smazat profil metadat '{name}'?",
|
||||||
"DeleteNotification": "Smazat oznámení",
|
"DeleteNotification": "Smazat oznámení",
|
||||||
"DeleteNotificationMessageText": "Opravdu chcete smazat oznámení „{0}“?",
|
"DeleteNotificationMessageText": "Opravdu chcete smazat oznámení '{name}'?",
|
||||||
"DeleteQualityProfile": "Smažte profil kvality",
|
"DeleteQualityProfile": "Smažte profil kvality",
|
||||||
"DeleteQualityProfileMessageText": "Opravdu chcete smazat kvalitní profil {0}",
|
"DeleteQualityProfileMessageText": "Opravdu chcete smazat profil kvality '{name}'?",
|
||||||
"DeleteReleaseProfile": "Smazat profil zpoždění",
|
"DeleteReleaseProfile": "Smazat profil zpoždění",
|
||||||
"DeleteReleaseProfileMessageText": "Opravdu chcete smazat tento profil zpoždění?",
|
"DeleteReleaseProfileMessageText": "Opravdu chcete smazat tento profil zpoždění?",
|
||||||
"DeleteSelectedBookFiles": "Odstranit vybrané filmové soubory",
|
"DeleteSelectedBookFiles": "Odstranit vybrané filmové soubory",
|
||||||
@@ -128,8 +128,6 @@
|
|||||||
"ErrorLoadingContents": "Chyba při načítání obsahu",
|
"ErrorLoadingContents": "Chyba při načítání obsahu",
|
||||||
"ErrorLoadingPreviews": "Chyba při načítání náhledů",
|
"ErrorLoadingPreviews": "Chyba při načítání náhledů",
|
||||||
"Exception": "Výjimka",
|
"Exception": "Výjimka",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Seznam extra souborů k importu oddělených čárkami (.nfo bude importován jako .nfo-orig)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Příklady: „.sub, .nfo“ nebo „sub, nfo“",
|
|
||||||
"FailedDownloadHandling": "Zpracování stahování se nezdařilo",
|
"FailedDownloadHandling": "Zpracování stahování se nezdařilo",
|
||||||
"FileDateHelpText": "Změnit datum souboru při importu / opětovném skenování",
|
"FileDateHelpText": "Změnit datum souboru při importu / opětovném skenování",
|
||||||
"FileManagement": "Správa souborů",
|
"FileManagement": "Správa souborů",
|
||||||
@@ -588,23 +586,23 @@
|
|||||||
"Required": "Požadované",
|
"Required": "Požadované",
|
||||||
"NoEventsFound": "Nebyly nalezeny žádné události",
|
"NoEventsFound": "Nebyly nalezeny žádné události",
|
||||||
"RedownloadFailed": "Stažení se nezdařilo",
|
"RedownloadFailed": "Stažení se nezdařilo",
|
||||||
"DeleteSelectedImportListsMessageText": "Opravdu chcete odstranit indexer „{0}“?",
|
"DeleteSelectedImportListsMessageText": "Opravdu chcete smazat {count} vybraných seznamů k importu?",
|
||||||
"DeleteSelectedIndexers": "Odstranit indexer",
|
"DeleteSelectedIndexers": "Odstranit indexer",
|
||||||
"ExistingTag": "Stávající značka",
|
"ExistingTag": "Stávající značka",
|
||||||
"ApplyTagsHelpTextHowToApplyAuthors": "Jak použít značky na vybrané filmy",
|
"ApplyTagsHelpTextHowToApplyAuthors": "Jak použít značky na vybrané filmy",
|
||||||
"DeleteSelectedDownloadClientsMessageText": "Opravdu chcete odstranit indexer „{0}“?",
|
"DeleteSelectedDownloadClientsMessageText": "Opravdu chcete smazat {count} vybraných klientů pro stahování?",
|
||||||
"No": "Ne",
|
"No": "Ne",
|
||||||
"NoChange": "Žádná změna",
|
"NoChange": "Žádná změna",
|
||||||
"RemovingTag": "Odebírání značky",
|
"RemovingTag": "Odebírání značky",
|
||||||
"SetTags": "Nastavit značky",
|
"SetTags": "Nastavit značky",
|
||||||
"ApplyTagsHelpTextAdd": "Přidat: Přidá značky k již existujícímu seznamu",
|
"ApplyTagsHelpTextAdd": "Přidat: Přidá značky k již existujícímu seznamu",
|
||||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Jak použít značky na vybrané klienty pro stahování",
|
"ApplyTagsHelpTextHowToApplyDownloadClients": "Jak použít značky na vybrané klienty pro stahování",
|
||||||
"ApplyTagsHelpTextHowToApplyImportLists": "Jak použít značky na vybrané importní seznamy",
|
"ApplyTagsHelpTextHowToApplyImportLists": "Jak použít značky na vybrané seznamy k importu",
|
||||||
"ApplyTagsHelpTextHowToApplyIndexers": "Jak použít značky na vybrané indexátory",
|
"ApplyTagsHelpTextHowToApplyIndexers": "Jak použít značky na vybrané indexery",
|
||||||
"ApplyTagsHelpTextRemove": "Odebrat: Odebrat zadané značky",
|
"ApplyTagsHelpTextRemove": "Odebrat: Odebrat zadané značky",
|
||||||
"ApplyTagsHelpTextReplace": "Nahradit: Nahradit značky zadanými značkami (zadáním žádné značky vymažete všechny značky)",
|
"ApplyTagsHelpTextReplace": "Nahradit: Nahradit značky zadanými značkami (prázdné pole vymaže všechny značky)",
|
||||||
"DeleteSelectedDownloadClients": "Odstranit staženého klienta",
|
"DeleteSelectedDownloadClients": "Odstranit klienta pro stahování",
|
||||||
"DeleteSelectedIndexersMessageText": "Opravdu chcete odstranit indexer „{0}“?",
|
"DeleteSelectedIndexersMessageText": "Opravdu chcete smazat {count} vybraný(ch) indexer(ů)?",
|
||||||
"Yes": "Ano",
|
"Yes": "Ano",
|
||||||
"NotificationStatusAllClientHealthCheckMessage": "Všechny seznamy nejsou k dispozici z důvodu selhání",
|
"NotificationStatusAllClientHealthCheckMessage": "Všechny seznamy nejsou k dispozici z důvodu selhání",
|
||||||
"Small": "Malý",
|
"Small": "Malý",
|
||||||
@@ -624,7 +622,7 @@
|
|||||||
"TotalSpace": "Celkový prostor",
|
"TotalSpace": "Celkový prostor",
|
||||||
"ConnectionLost": "Spojení ztraceno",
|
"ConnectionLost": "Spojení ztraceno",
|
||||||
"ConnectionLostReconnect": "{appName} se pokusí připojit automaticky, nebo můžete kliknout na tlačítko znovunačtení níže.",
|
"ConnectionLostReconnect": "{appName} se pokusí připojit automaticky, nebo můžete kliknout na tlačítko znovunačtení níže.",
|
||||||
"ConnectionLostToBackend": "{appName} ztratila spojení s backendem a pro obnovení funkčnosti bude třeba ji znovu načíst.",
|
"ConnectionLostToBackend": "{appName} ztratil spojení s backendem a pro obnovení funkčnosti bude třebaho znovu načíst.",
|
||||||
"Large": "Velký",
|
"Large": "Velký",
|
||||||
"LastDuration": "lastDuration",
|
"LastDuration": "lastDuration",
|
||||||
"Ui": "UI",
|
"Ui": "UI",
|
||||||
@@ -645,8 +643,8 @@
|
|||||||
"CloneCondition": "Klonovat podmínku",
|
"CloneCondition": "Klonovat podmínku",
|
||||||
"Clone": "Klonovat",
|
"Clone": "Klonovat",
|
||||||
"ApiKeyValidationHealthCheckMessage": "Aktualizujte svůj klíč API tak, aby měl alespoň {0} znaků. Můžete to provést prostřednictvím nastavení nebo konfiguračního souboru",
|
"ApiKeyValidationHealthCheckMessage": "Aktualizujte svůj klíč API tak, aby měl alespoň {0} znaků. Můžete to provést prostřednictvím nastavení nebo konfiguračního souboru",
|
||||||
"ChooseImportMethod": "Vyberte mód importu",
|
"ChooseImportMethod": "Vyberte způsob importu",
|
||||||
"CatalogNumber": "katalogové číslo",
|
"CatalogNumber": "Katalogové číslo",
|
||||||
"Publisher": "Vydavatel",
|
"Publisher": "Vydavatel",
|
||||||
"StatusEndedContinuing": "Pokračující",
|
"StatusEndedContinuing": "Pokračující",
|
||||||
"MetadataProfiles": "profil metadat",
|
"MetadataProfiles": "profil metadat",
|
||||||
@@ -655,7 +653,7 @@
|
|||||||
"Label": "Etiketa",
|
"Label": "Etiketa",
|
||||||
"Library": "Knihovna",
|
"Library": "Knihovna",
|
||||||
"BypassIfAboveCustomFormatScore": "Obejít, pokud je vyšší než skóre vlastního formátu",
|
"BypassIfAboveCustomFormatScore": "Obejít, pokud je vyšší než skóre vlastního formátu",
|
||||||
"AppUpdatedVersion": "{appName} byla aktualizována na verzi `{version}`, abyste získali nejnovější změny, musíte znovu načíst {appName}.",
|
"AppUpdatedVersion": "{appName} byl aktualizován na verzi `{version}`, abyste získali nejnovější změny, musíte znovu načíst {appName}",
|
||||||
"BypassIfAboveCustomFormatScoreHelpText": "Povolit obcházení, pokud má vydání vyšší skóre, než je nakonfigurované minimální skóre vlastního formátu",
|
"BypassIfAboveCustomFormatScoreHelpText": "Povolit obcházení, pokud má vydání vyšší skóre, než je nakonfigurované minimální skóre vlastního formátu",
|
||||||
"BypassIfHighestQuality": "Obejít v případě nejvyšší kvality",
|
"BypassIfHighestQuality": "Obejít v případě nejvyšší kvality",
|
||||||
"Theme": "Motiv",
|
"Theme": "Motiv",
|
||||||
@@ -666,5 +664,24 @@
|
|||||||
"CountDownloadClientsSelected": "{count} vybraných klientů ke stahování",
|
"CountDownloadClientsSelected": "{count} vybraných klientů ke stahování",
|
||||||
"ImportListMissingRoot": "Chybí kořenový adresář pro import seznamu: {0}",
|
"ImportListMissingRoot": "Chybí kořenový adresář pro import seznamu: {0}",
|
||||||
"IndexerDownloadClientHelpText": "Zvolte, který klient pro stahování bude použit pro zachytávání z toho indexeru",
|
"IndexerDownloadClientHelpText": "Zvolte, který klient pro stahování bude použit pro zachytávání z toho indexeru",
|
||||||
"ImportListMultipleMissingRoots": "Několik kořenových adresářů chybí pro seznamy importu: {0}"
|
"ImportListMultipleMissingRoots": "Několik kořenových adresářů chybí pro seznamy importu: {0}",
|
||||||
|
"EditSelectedDownloadClients": "Upravit vybrané klienty pro stahování",
|
||||||
|
"EditSelectedIndexers": "Upravit vybrané indexery",
|
||||||
|
"EnableProfile": "Povolit profil",
|
||||||
|
"DeleteImportList": "Smazat seznam importovaných položek",
|
||||||
|
"AddNewItem": "Přidat novou položku",
|
||||||
|
"AddMissing": "Přidat chybějící",
|
||||||
|
"EditSelectedImportLists": "Upravit vybrané seznamy k importu",
|
||||||
|
"DeleteSelectedImportLists": "Smazat seznam k importu",
|
||||||
|
"Duration": "Trvání",
|
||||||
|
"DeleteRootFolder": "Smazat kořenový adresář",
|
||||||
|
"DownloadClientTagHelpText": "Tohoto klienta pro stahování používat pouze pro filmy s alespoň jednou odpovídající značkou. Pro použití se všemi filmy ponechte prázdné pole.",
|
||||||
|
"AddedAuthorSettings": "Nastavení umělce přidáno",
|
||||||
|
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Klient stahování {downloadClientName} je nastaven na odstranění dokončených stahování. To může vést k tomu, že stahování budou z klienta odstraněna dříve, než je bude moci importovat {1}.",
|
||||||
|
"IndexerTagsHelpText": "Tohoto klienta pro stahování používat pouze pro filmy s alespoň jednou odpovídající značkou. Pro použití se všemi filmy ponechte prázdné pole.",
|
||||||
|
"BlocklistReleaseHelpText": "Zabránit {appName}u v opětovném sebrání tohoto vydání",
|
||||||
|
"ListsSettingsSummary": "Seznam k importu",
|
||||||
|
"ExtraFileExtensionsHelpText": "Seznam extra souborů k importu oddělených čárkami (.nfo bude importován jako .nfo-orig)",
|
||||||
|
"ExtraFileExtensionsHelpTextsExamples": "Příklady: „.sub, .nfo“ nebo „sub, nfo“",
|
||||||
|
"ImportLists": "Seznam k importu"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,8 +123,6 @@
|
|||||||
"ErrorLoadingContents": "Fejl ved indlæsning af indhold",
|
"ErrorLoadingContents": "Fejl ved indlæsning af indhold",
|
||||||
"ErrorLoadingPreviews": "Fejl ved indlæsning af forhåndsvisning",
|
"ErrorLoadingPreviews": "Fejl ved indlæsning af forhåndsvisning",
|
||||||
"Exception": "Undtagelse",
|
"Exception": "Undtagelse",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Kommasepareret liste over ekstra filer, der skal importeres (.nfo importeres som .nfo-orig)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Eksempler: '.sub, .nfo' eller 'sub, nfo'",
|
|
||||||
"FailedDownloadHandling": "Fejlet Download Håndtering",
|
"FailedDownloadHandling": "Fejlet Download Håndtering",
|
||||||
"FileDateHelpText": "Skift fildato ved import / genscanning",
|
"FileDateHelpText": "Skift fildato ved import / genscanning",
|
||||||
"FileManagement": "Fil Håndtering",
|
"FileManagement": "Fil Håndtering",
|
||||||
@@ -635,5 +633,7 @@
|
|||||||
"Large": "Stor",
|
"Large": "Stor",
|
||||||
"Library": "Bibliotek",
|
"Library": "Bibliotek",
|
||||||
"AllResultsAreHiddenByTheAppliedFilter": "Alle resultater skjules af det anvendte filter",
|
"AllResultsAreHiddenByTheAppliedFilter": "Alle resultater skjules af det anvendte filter",
|
||||||
"AddNewItem": "Tilføj Ny Genstand"
|
"AddNewItem": "Tilføj Ny Genstand",
|
||||||
|
"ExtraFileExtensionsHelpText": "Kommasepareret liste over ekstra filer, der skal importeres (.nfo importeres som .nfo-orig)",
|
||||||
|
"ExtraFileExtensionsHelpTextsExamples": "Eksempler: '.sub, .nfo' eller 'sub, nfo'"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -122,8 +122,6 @@
|
|||||||
"ErrorLoadingContents": "Fehler beim laden der Inhalte",
|
"ErrorLoadingContents": "Fehler beim laden der Inhalte",
|
||||||
"ErrorLoadingPreviews": "Fehler beim laden der Vorschauen",
|
"ErrorLoadingPreviews": "Fehler beim laden der Vorschauen",
|
||||||
"Exception": "Ausnahme",
|
"Exception": "Ausnahme",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Kommaseparierte Liste von Dateiendungen die als Extra Dateien importiert werden sollen ( .nfo wird in .nfo-orig umbenannt )",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Vorschläge: sub, nfo, srt, jpg",
|
|
||||||
"FailedDownloadHandling": "Verarbeitung fehlgeschlagener Downloads",
|
"FailedDownloadHandling": "Verarbeitung fehlgeschlagener Downloads",
|
||||||
"FileDateHelpText": "Aktualisiere das Erstelldatum beim Import oder Re-Scan",
|
"FileDateHelpText": "Aktualisiere das Erstelldatum beim Import oder Re-Scan",
|
||||||
"FileManagement": "Dateiverwaltung",
|
"FileManagement": "Dateiverwaltung",
|
||||||
@@ -240,32 +238,32 @@
|
|||||||
"PortNumber": "Port Nummer",
|
"PortNumber": "Port Nummer",
|
||||||
"PosterSize": "Plakatgröße",
|
"PosterSize": "Plakatgröße",
|
||||||
"Profiles": "Profile",
|
"Profiles": "Profile",
|
||||||
"Proper": "Proper",
|
"Proper": "Korrekt",
|
||||||
"PropersAndRepacks": "Propers und Repacks",
|
"PropersAndRepacks": "Propers und Repacks",
|
||||||
"Protocol": "Protokoll",
|
"Protocol": "Protokoll",
|
||||||
"ProtocolHelpText": "Wählen Sie, welche(s) Protokoll(e) verwendet werden soll(en) und welches Protokoll bei der Wahl zwischen ansonsten gleichwertigen Releases bevorzugt wird",
|
"ProtocolHelpText": "Wählen Sie aus, welche(s) Protokoll(e) Sie verwenden möchten und welches Protokoll Sie bevorzugen, wenn Sie zwischen ansonsten gleichen Versionen wählen",
|
||||||
"Proxy": "Proxy",
|
"Proxy": "Proxy",
|
||||||
"ProxyBypassFilterHelpText": "Verwende ',' als Trennzeichen und '*.' als Platzhalter für Subdomains",
|
"ProxyBypassFilterHelpText": "Verwenden Sie ',' als Trennzeichen und '*.' als Wildcard für Subdomains",
|
||||||
"ProxyPasswordHelpText": "Nur wenn ein Benutzername und Passwort erforderlich ist, muss es eingegeben werden. Ansonsten leer lassen.",
|
"ProxyPasswordHelpText": "Sie müssen nur einen Benutzernamen und ein Passwort eingeben, wenn dies erforderlich ist. Andernfalls lassen Sie sie leer.",
|
||||||
"ProxyType": "Proxy Typ",
|
"ProxyType": "Proxy-Typ",
|
||||||
"PublishedDate": "Veröffentlichungs Datum",
|
"PublishedDate": "Veröffentlichungsdatum",
|
||||||
"Quality": "Qualität",
|
"Quality": "Qualität",
|
||||||
"QualityDefinitions": "Qualitätsdefinitionen",
|
"QualityDefinitions": "Qualitätsdefinitionen",
|
||||||
"QualityProfile": "Qualitätsprofil",
|
"QualityProfile": "Qualitätsprofil",
|
||||||
"QualityProfiles": "Qualitätsprofile",
|
"QualityProfiles": "Qualitätsprofile",
|
||||||
"QualitySettings": "Qualitäts Einstellungen",
|
"QualitySettings": "Qualitätseinstellungen",
|
||||||
"Queue": "Warteschlange",
|
"Queue": "Warteschlange",
|
||||||
"RSSSync": "RSS-Sync",
|
"RSSSync": "RSS-Sync",
|
||||||
"RSSSyncInterval": "RSS Synchronisierungs Intervall",
|
"RSSSyncInterval": "RSS Synchronisierungs Intervall",
|
||||||
"ReadTheWikiForMoreInformation": "Lese das Wiki für mehr Informationen",
|
"ReadTheWikiForMoreInformation": "Lesen Sie das Wiki für weitere Informationen",
|
||||||
"ReadarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "Jeder Indexer der den Newznab-Standard verwendet oder unten aufgelistet ist wird untertützt.",
|
"ReadarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "Jeder Indexer der den Newznab-Standard verwendet oder unten aufgelistet ist wird untertützt.",
|
||||||
"ReadarrTags": "Radarr Tags",
|
"ReadarrTags": "Radarr Tags",
|
||||||
"Real": "Echt",
|
"Real": "Real",
|
||||||
"Reason": "Grund",
|
"Reason": "Begründung",
|
||||||
"RecycleBinCleanupDaysHelpText": "Auf 0 setzen um das automatische leeren des Papierkorbs zu deaktivieren",
|
"RecycleBinCleanupDaysHelpText": "Auf 0 setzen um das automatische leeren des Papierkorbs zu deaktivieren",
|
||||||
"RecycleBinCleanupDaysHelpTextWarning": "Datien im Papierkorb die älter sind als der gewählte Wert, werden endgültig gelöscht",
|
"RecycleBinCleanupDaysHelpTextWarning": "Datien im Papierkorb die älter sind als der gewählte Wert, werden endgültig gelöscht",
|
||||||
"RecycleBinHelpText": "Gelöschte Filmdateien werden hierher verschoben anstatt sie direkt endgültig zu löschen",
|
"RecycleBinHelpText": "Gelöschte Filmdateien werden hierher verschoben anstatt sie direkt endgültig zu löschen",
|
||||||
"RecyclingBinCleanup": "Papierkorb aufräumen",
|
"RecyclingBinCleanup": "Papierkorb leeren",
|
||||||
"Redownload": "Nochmal herunterladen",
|
"Redownload": "Nochmal herunterladen",
|
||||||
"Refresh": "Aktualisieren",
|
"Refresh": "Aktualisieren",
|
||||||
"RefreshInformationAndScanDisk": "Metadaten aktualisieren und Festplatte scannen",
|
"RefreshInformationAndScanDisk": "Metadaten aktualisieren und Festplatte scannen",
|
||||||
@@ -435,7 +433,7 @@
|
|||||||
"YesCancel": "Ja, abbrechen",
|
"YesCancel": "Ja, abbrechen",
|
||||||
"BindAddressHelpTextWarning": "Erfordert einen Neustart",
|
"BindAddressHelpTextWarning": "Erfordert einen Neustart",
|
||||||
"LoadingBooksFailed": "Laden der Film-Dateien fehlgeschlagen",
|
"LoadingBooksFailed": "Laden der Film-Dateien fehlgeschlagen",
|
||||||
"ProxyUsernameHelpText": "Nur wenn ein Benutzername und Passwort erforderlich ist, muss es eingegeben werden. Ansonsten leer lassen.",
|
"ProxyUsernameHelpText": "Sie müssen nur einen Benutzernamen und ein Passwort eingeben, wenn dies erforderlich ist. Andernfalls lassen Sie sie leer.",
|
||||||
"SslPortHelpTextWarning": "Erfordert einen Neustart",
|
"SslPortHelpTextWarning": "Erfordert einen Neustart",
|
||||||
"UnableToLoadMetadataProfiles": "Verzögerungsprofile konnten nicht geladen werden",
|
"UnableToLoadMetadataProfiles": "Verzögerungsprofile konnten nicht geladen werden",
|
||||||
"ApiKeyHelpTextWarning": "Erfordert einen Neustart",
|
"ApiKeyHelpTextWarning": "Erfordert einen Neustart",
|
||||||
@@ -694,8 +692,8 @@
|
|||||||
"PathHelpText": "Stammordner für die Musikbibliothek",
|
"PathHelpText": "Stammordner für die Musikbibliothek",
|
||||||
"ProxyCheckBadRequestMessage": "Proxy konnte nicht getestet werden. StatusCode: {0}",
|
"ProxyCheckBadRequestMessage": "Proxy konnte nicht getestet werden. StatusCode: {0}",
|
||||||
"ProxyCheckFailedToTestMessage": "Proxy konnte nicht getestet werden: {0}",
|
"ProxyCheckFailedToTestMessage": "Proxy konnte nicht getestet werden: {0}",
|
||||||
"Queued": "In der Warteschlange",
|
"Queued": "In Warteschlange",
|
||||||
"RefreshAndScan": "Aktualisieren",
|
"RefreshAndScan": "Aktualisieren und scannen",
|
||||||
"SettingsRemotePathMappingRemotePathHelpText": "Root-Pfad zum Verzeichnis, auf das der Download-Client zugreift",
|
"SettingsRemotePathMappingRemotePathHelpText": "Root-Pfad zum Verzeichnis, auf das der Download-Client zugreift",
|
||||||
"Yesterday": "Gestern",
|
"Yesterday": "Gestern",
|
||||||
"UpdateAvailable": "Neue Version verfügbar",
|
"UpdateAvailable": "Neue Version verfügbar",
|
||||||
@@ -750,8 +748,8 @@
|
|||||||
"IfYouDontAddAnImportListExclusionAndTheAuthorHasAMetadataProfileOtherThanNoneThenThisBookMayBeReaddedDuringTheNextAuthorRefresh": "Wenn kein Ausschluss der Import Liste hinzugefügt wird und der Künstler ein anderes Metadaten Profil als 'Keine' hat, kann es passieren, dass dieses Album bei der nächsten Aktualisierung des Künstlers erneut hinzugefügt wird.",
|
"IfYouDontAddAnImportListExclusionAndTheAuthorHasAMetadataProfileOtherThanNoneThenThisBookMayBeReaddedDuringTheNextAuthorRefresh": "Wenn kein Ausschluss der Import Liste hinzugefügt wird und der Künstler ein anderes Metadaten Profil als 'Keine' hat, kann es passieren, dass dieses Album bei der nächsten Aktualisierung des Künstlers erneut hinzugefügt wird.",
|
||||||
"MissingFromDisk": "Radarr konnte die Datei nicht auf der Festplatte finden, daher wurde die Verknüpfung auf die Datei aus der Datenbank entfernt",
|
"MissingFromDisk": "Radarr konnte die Datei nicht auf der Festplatte finden, daher wurde die Verknüpfung auf die Datei aus der Datenbank entfernt",
|
||||||
"ProxyCheckResolveIpMessage": "Fehler beim Auflösen der IP-Adresse für den konfigurierten Proxy-Host {0}",
|
"ProxyCheckResolveIpMessage": "Fehler beim Auflösen der IP-Adresse für den konfigurierten Proxy-Host {0}",
|
||||||
"QualitySettingsSummary": "Qualitätgrößen und Bennenung",
|
"QualitySettingsSummary": "Qualitätsgrößen und Namensgebung",
|
||||||
"QueueIsEmpty": "Warteschlange ist leer",
|
"QueueIsEmpty": "Die Warteschlange ist leer",
|
||||||
"ReadarrSupportsMultipleListsForImportingBooksAndAuthorsIntoTheDatabase": "Lidarr unterstützt mehrere Listen für den Import von Alben und Künstlern in die Datenbank.",
|
"ReadarrSupportsMultipleListsForImportingBooksAndAuthorsIntoTheDatabase": "Lidarr unterstützt mehrere Listen für den Import von Alben und Künstlern in die Datenbank.",
|
||||||
"TotalBookCountBooksTotalBookFileCountBooksWithFilesInterp": "{0} Titel insgesamt. {1} Titel mit Dateien.",
|
"TotalBookCountBooksTotalBookFileCountBooksWithFilesInterp": "{0} Titel insgesamt. {1} Titel mit Dateien.",
|
||||||
"SearchFiltered": "Suche gefilterte",
|
"SearchFiltered": "Suche gefilterte",
|
||||||
@@ -985,7 +983,7 @@
|
|||||||
"ConnectionLost": "Verbindung unterbrochen",
|
"ConnectionLost": "Verbindung unterbrochen",
|
||||||
"Events": "Events",
|
"Events": "Events",
|
||||||
"LastDuration": "Letzte Dauer",
|
"LastDuration": "Letzte Dauer",
|
||||||
"RecentChanges": "Neuste Änderungen",
|
"RecentChanges": "Kürzliche Änderungen",
|
||||||
"System": "System",
|
"System": "System",
|
||||||
"WhatsNew": "Was gibt's Neues?",
|
"WhatsNew": "Was gibt's Neues?",
|
||||||
"NextExecution": "Nächste Ausführung",
|
"NextExecution": "Nächste Ausführung",
|
||||||
@@ -993,7 +991,9 @@
|
|||||||
"SomeResultsAreHiddenByTheAppliedFilter": "Einige Ergebnisse werden wegen der aktiven Filter nicht angezeigt",
|
"SomeResultsAreHiddenByTheAppliedFilter": "Einige Ergebnisse werden wegen der aktiven Filter nicht angezeigt",
|
||||||
"Medium": "Medium",
|
"Medium": "Medium",
|
||||||
"Activity": "Aktivität",
|
"Activity": "Aktivität",
|
||||||
"AddNew": "Hinzufügen",
|
"AddNew": "Neue hinzufügen",
|
||||||
"Backup": "Backups",
|
"Backup": "Backups",
|
||||||
"AllResultsAreHiddenByTheAppliedFilter": "Keine Ergebnisse mit den ausgewählten Filtern"
|
"AllResultsAreHiddenByTheAppliedFilter": "Keine Ergebnisse mit den ausgewählten Filtern",
|
||||||
|
"AppUpdated": "{appName} aktualisiert",
|
||||||
|
"AppUpdatedVersion": "{appName} wurde auf die Version `{version}` aktualisiert. Um die neusten Funktionen zu bekommen lade {appName} neu"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -124,8 +124,6 @@
|
|||||||
"ErrorLoadingContents": "Σφάλμα κατά τη φόρτωση περιεχομένων",
|
"ErrorLoadingContents": "Σφάλμα κατά τη φόρτωση περιεχομένων",
|
||||||
"ErrorLoadingPreviews": "Σφάλμα κατά τη φόρτωση προεπισκοπήσεων",
|
"ErrorLoadingPreviews": "Σφάλμα κατά τη φόρτωση προεπισκοπήσεων",
|
||||||
"Exception": "Εξαίρεση",
|
"Exception": "Εξαίρεση",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Λίστα πρόσθετων αρχείων που διαχωρίζονται με κόμμα για εισαγωγή (το .nfo θα εισαχθεί ως .nfo-orig)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Παραδείγματα: «.sub, .nfo» ή «sub, nfo»",
|
|
||||||
"FailedDownloadHandling": "Η Διαχείρηση Λήψης Απέτυχε",
|
"FailedDownloadHandling": "Η Διαχείρηση Λήψης Απέτυχε",
|
||||||
"FileDateHelpText": "Αλλαγή ημερομηνίας αρχείου κατά την εισαγωγή / επανασύνδεση",
|
"FileDateHelpText": "Αλλαγή ημερομηνίας αρχείου κατά την εισαγωγή / επανασύνδεση",
|
||||||
"FileManagement": "Διαχείρηση Αρχείων",
|
"FileManagement": "Διαχείρηση Αρχείων",
|
||||||
|
|||||||
@@ -242,6 +242,7 @@
|
|||||||
"DeleteRemotePathMappingMessageText": "Are you sure you want to delete this remote path mapping?",
|
"DeleteRemotePathMappingMessageText": "Are you sure you want to delete this remote path mapping?",
|
||||||
"DeleteRootFolder": "Delete Root Folder",
|
"DeleteRootFolder": "Delete Root Folder",
|
||||||
"DeleteRootFolderMessageText": "Are you sure you want to delete the root folder '{name}'?",
|
"DeleteRootFolderMessageText": "Are you sure you want to delete the root folder '{name}'?",
|
||||||
|
"DeleteSelected": "Delete Selected",
|
||||||
"DeleteSelectedBookFiles": "Delete Selected Book Files",
|
"DeleteSelectedBookFiles": "Delete Selected Book Files",
|
||||||
"DeleteSelectedBookFilesMessageText": "Are you sure you want to delete the selected book files?",
|
"DeleteSelectedBookFilesMessageText": "Are you sure you want to delete the selected book files?",
|
||||||
"DeleteSelectedDownloadClients": "Delete Download Client(s)",
|
"DeleteSelectedDownloadClients": "Delete Download Client(s)",
|
||||||
@@ -317,8 +318,8 @@
|
|||||||
"ExistingTag": "Existing tag",
|
"ExistingTag": "Existing tag",
|
||||||
"ExistingTagsScrubbed": "Existing tags scrubbed",
|
"ExistingTagsScrubbed": "Existing tags scrubbed",
|
||||||
"ExportCustomFormat": "Export Custom Format",
|
"ExportCustomFormat": "Export Custom Format",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Comma separated list of extra files to import (.nfo will be imported as .nfo-orig)",
|
"ExtraFileExtensionsHelpText": "Comma separated list of extra files to import (.nfo will be imported as .nfo-orig)",
|
||||||
"ExtraFileExtensionsHelpTexts2": "Examples: \".sub, .nfo\" or \"sub,nfo\"",
|
"ExtraFileExtensionsHelpTextsExamples": "Examples: '.sub, .nfo' or 'sub,nfo'",
|
||||||
"FailedDownloadHandling": "Failed Download Handling",
|
"FailedDownloadHandling": "Failed Download Handling",
|
||||||
"FailedToLoadQueue": "Failed to load Queue",
|
"FailedToLoadQueue": "Failed to load Queue",
|
||||||
"FileDateHelpText": "Change file date on import/rescan",
|
"FileDateHelpText": "Change file date on import/rescan",
|
||||||
|
|||||||
@@ -14,11 +14,11 @@
|
|||||||
"60MinutesSixty": "60 Minutos: {0}",
|
"60MinutesSixty": "60 Minutos: {0}",
|
||||||
"APIKey": "Clave API",
|
"APIKey": "Clave API",
|
||||||
"About": "Acerca de",
|
"About": "Acerca de",
|
||||||
"AddListExclusion": "Añadir Exclusión De Lista",
|
"AddListExclusion": "Agregar Lista de Exclusión",
|
||||||
"AddingTag": "Añadir etiqueta",
|
"AddingTag": "Añadir etiqueta",
|
||||||
"AgeWhenGrabbed": "Antigüedad (cuando se añadió)",
|
"AgeWhenGrabbed": "Antigüedad (cuando se añadió)",
|
||||||
"AlreadyInYourLibrary": "Ya en tu biblioteca",
|
"AlreadyInYourLibrary": "Ya en tu biblioteca",
|
||||||
"AlternateTitles": "Título alternativo",
|
"AlternateTitles": "Titulos alternativos",
|
||||||
"Analytics": "Analíticas",
|
"Analytics": "Analíticas",
|
||||||
"AnalyticsEnabledHelpText": "Envíe información anónima de uso y error a los servidores de Radarr. Esto incluye información sobre su navegador, qué páginas de Radarr WebUI utiliza, informes de errores, así como el sistema operativo y la versión en tiempo de ejecución. Usaremos esta información para priorizar funciones y correcciones de errores.",
|
"AnalyticsEnabledHelpText": "Envíe información anónima de uso y error a los servidores de Radarr. Esto incluye información sobre su navegador, qué páginas de Radarr WebUI utiliza, informes de errores, así como el sistema operativo y la versión en tiempo de ejecución. Usaremos esta información para priorizar funciones y correcciones de errores.",
|
||||||
"AnalyticsEnabledHelpTextWarning": "Requiere reiniciar para que surta efecto",
|
"AnalyticsEnabledHelpTextWarning": "Requiere reiniciar para que surta efecto",
|
||||||
@@ -45,9 +45,9 @@
|
|||||||
"CalendarWeekColumnHeaderHelpText": "Mostrado sobre cada columna cuando la vista activa es semana",
|
"CalendarWeekColumnHeaderHelpText": "Mostrado sobre cada columna cuando la vista activa es semana",
|
||||||
"Cancel": "Cancelar",
|
"Cancel": "Cancelar",
|
||||||
"CancelMessageText": "Seguro que quieres cancelar esta tarea pendiente?",
|
"CancelMessageText": "Seguro que quieres cancelar esta tarea pendiente?",
|
||||||
"CertificateValidation": "Validación del certificado",
|
"CertificateValidation": "Validacion de certificado",
|
||||||
"CertificateValidationHelpText": "Cambiar la rigidez de la validación de la certificación HTTPS",
|
"CertificateValidationHelpText": "Cambiar como es la validacion de la certificacion estricta de HTTPS. No cambiar a menos que entiendas las consecuencias.",
|
||||||
"ChangeFileDate": "Cambiar Fecha de Archivo",
|
"ChangeFileDate": "Cambiar fecha de archivo",
|
||||||
"ChangeHasNotBeenSavedYet": "El cambio aún no se ha guardado",
|
"ChangeHasNotBeenSavedYet": "El cambio aún no se ha guardado",
|
||||||
"ChmodFolder": "Carpeta chmod",
|
"ChmodFolder": "Carpeta chmod",
|
||||||
"ChmodFolderHelpText": "Octal, aplicado durante la importación / cambio de nombre a carpetas y archivos multimedia (sin bits de ejecución)",
|
"ChmodFolderHelpText": "Octal, aplicado durante la importación / cambio de nombre a carpetas y archivos multimedia (sin bits de ejecución)",
|
||||||
@@ -56,12 +56,7 @@
|
|||||||
"ChownGroupHelpTextWarning": "Esto solo funciona si el usuario que ejecuta Radarr es el propietario del archivo. Es mejor asegurarse de que el cliente de descarga use el mismo grupo que Radarr.",
|
"ChownGroupHelpTextWarning": "Esto solo funciona si el usuario que ejecuta Radarr es el propietario del archivo. Es mejor asegurarse de que el cliente de descarga use el mismo grupo que Radarr.",
|
||||||
"Clear": "Borrar",
|
"Clear": "Borrar",
|
||||||
"ClickToChangeQuality": "Clic para cambiar la calidad",
|
"ClickToChangeQuality": "Clic para cambiar la calidad",
|
||||||
"ClientPriority": "Prioridad de Cliente",
|
|
||||||
"CloneIndexer": "Clonar Indexer",
|
|
||||||
"CloneProfile": "Clonar Perfil",
|
|
||||||
"Close": "Cerrar",
|
|
||||||
"Columns": "Columnas",
|
"Columns": "Columnas",
|
||||||
"CompletedDownloadHandling": "Manipulación de descargas completas",
|
|
||||||
"ConnectSettings": "Conectar Ajustes",
|
"ConnectSettings": "Conectar Ajustes",
|
||||||
"Connections": "Conexiones",
|
"Connections": "Conexiones",
|
||||||
"CopyUsingHardlinksHelpText": "Usar Hardlinks al intentar copiar ficheros de los torrents que siguen seedeando",
|
"CopyUsingHardlinksHelpText": "Usar Hardlinks al intentar copiar ficheros de los torrents que siguen seedeando",
|
||||||
@@ -81,7 +76,7 @@
|
|||||||
"DeleteDelayProfile": "Borrar Perfil de Retraso",
|
"DeleteDelayProfile": "Borrar Perfil de Retraso",
|
||||||
"DeleteDelayProfileMessageText": "Está seguro que quieres borrar este perfil de retraso?",
|
"DeleteDelayProfileMessageText": "Está seguro que quieres borrar este perfil de retraso?",
|
||||||
"DeleteDownloadClient": "Borrar Gestor de Descargas",
|
"DeleteDownloadClient": "Borrar Gestor de Descargas",
|
||||||
"DeleteDownloadClientMessageText": "¿Seguro que quieres eliminar el cliente de descargas '{name}'?",
|
"DeleteDownloadClientMessageText": "Seguro que quieres eliminar el gestor de descargas '{name}'?",
|
||||||
"DeleteEmptyFolders": "Borrar carpetas vacías",
|
"DeleteEmptyFolders": "Borrar carpetas vacías",
|
||||||
"DeleteEmptyFoldersHelpText": "Borrar carpetas vacías durante la exploración del disco y cuando se eliminen archivos",
|
"DeleteEmptyFoldersHelpText": "Borrar carpetas vacías durante la exploración del disco y cuando se eliminen archivos",
|
||||||
"DeleteImportListExclusion": "Borrar exclusión de lista de importación",
|
"DeleteImportListExclusion": "Borrar exclusión de lista de importación",
|
||||||
@@ -89,9 +84,9 @@
|
|||||||
"DeleteImportListMessageText": "Seguro que quieres eliminar la lista '{name}'?",
|
"DeleteImportListMessageText": "Seguro que quieres eliminar la lista '{name}'?",
|
||||||
"DeleteIndexer": "Borrar Indexer",
|
"DeleteIndexer": "Borrar Indexer",
|
||||||
"DeleteIndexerMessageText": "Seguro que quieres eliminar el indexer '{name}'?",
|
"DeleteIndexerMessageText": "Seguro que quieres eliminar el indexer '{name}'?",
|
||||||
"DeleteMetadataProfileMessageText": "Seguro que quieres eliminar el perfil de calidad {0}",
|
"DeleteMetadataProfileMessageText": "¿Seguro que quieres eliminar el perfil de metadatos '{name}'?",
|
||||||
"DeleteNotification": "Borrar Notificación",
|
"DeleteNotification": "Borrar Notificación",
|
||||||
"DeleteNotificationMessageText": "¿Seguro que quieres eliminiar la notificación '{name}'?",
|
"DeleteNotificationMessageText": "¿Seguro que quieres eliminar la notificación '{name}'?",
|
||||||
"DeleteQualityProfile": "Borrar Perfil de Calidad",
|
"DeleteQualityProfile": "Borrar Perfil de Calidad",
|
||||||
"DeleteQualityProfileMessageText": "¿Seguro que quieres eliminar el perfil de calidad {name}?",
|
"DeleteQualityProfileMessageText": "¿Seguro que quieres eliminar el perfil de calidad {name}?",
|
||||||
"DeleteReleaseProfile": "Borrar Perfil de Retraso",
|
"DeleteReleaseProfile": "Borrar Perfil de Retraso",
|
||||||
@@ -129,8 +124,6 @@
|
|||||||
"ErrorLoadingContents": "Error al cargar los contenidos",
|
"ErrorLoadingContents": "Error al cargar los contenidos",
|
||||||
"ErrorLoadingPreviews": "Error al cargar las previsualizaciones",
|
"ErrorLoadingPreviews": "Error al cargar las previsualizaciones",
|
||||||
"Exception": "Excepción",
|
"Exception": "Excepción",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Separar con cons la lista de los archivos extra a importar (.nfo será impotado como .nfo-orig)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Ejemplos : '.sub, .nfo' o 'sub,nfo'",
|
|
||||||
"FailedDownloadHandling": "Manipulación de Descargas Fallidas",
|
"FailedDownloadHandling": "Manipulación de Descargas Fallidas",
|
||||||
"FileDateHelpText": "Cambiar la fecha del archivo al importar/rescan",
|
"FileDateHelpText": "Cambiar la fecha del archivo al importar/rescan",
|
||||||
"FileManagement": "Administración de Archivos",
|
"FileManagement": "Administración de Archivos",
|
||||||
@@ -154,7 +147,7 @@
|
|||||||
"GrabSelected": "Capturar Seleccionados",
|
"GrabSelected": "Capturar Seleccionados",
|
||||||
"HasPendingChangesNoChanges": "Sin Cambios",
|
"HasPendingChangesNoChanges": "Sin Cambios",
|
||||||
"HasPendingChangesSaveChanges": "Guardar Cambios",
|
"HasPendingChangesSaveChanges": "Guardar Cambios",
|
||||||
"History": "Historia",
|
"History": "Historial",
|
||||||
"Host": "Host",
|
"Host": "Host",
|
||||||
"Hostname": "Nombre del Host",
|
"Hostname": "Nombre del Host",
|
||||||
"ICalFeed": "iCal Feed",
|
"ICalFeed": "iCal Feed",
|
||||||
@@ -210,7 +203,7 @@
|
|||||||
"MinimumLimits": "Límites Mínimos",
|
"MinimumLimits": "Límites Mínimos",
|
||||||
"Missing": "Falta",
|
"Missing": "Falta",
|
||||||
"Mode": "Modo",
|
"Mode": "Modo",
|
||||||
"Monitored": "Monitoreada",
|
"Monitored": "Monitorizado",
|
||||||
"MoreInfo": "Más Información",
|
"MoreInfo": "Más Información",
|
||||||
"MustContain": "Debe Contener",
|
"MustContain": "Debe Contener",
|
||||||
"MustNotContain": "No Debe Contener",
|
"MustNotContain": "No Debe Contener",
|
||||||
@@ -440,7 +433,7 @@
|
|||||||
"YesCancel": "Sí, Cancelar",
|
"YesCancel": "Sí, Cancelar",
|
||||||
"20MinutesTwenty": "20 Minutos: {0}",
|
"20MinutesTwenty": "20 Minutos: {0}",
|
||||||
"DownloadClientCheckDownloadingToRoot": "El cliente de descargas {0} coloca las descargas en la carpeta raíz {1}. No debe descargar a una carpeta raíz.",
|
"DownloadClientCheckDownloadingToRoot": "El cliente de descargas {0} coloca las descargas en la carpeta raíz {1}. No debe descargar a una carpeta raíz.",
|
||||||
"MaintenanceRelease": "Lanzamiento de mantenimiento",
|
"MaintenanceRelease": "Lanzamiento de mantenimiento: Corrección de errores y otras mejoras. Ver historial de commits de Github para mas detalle",
|
||||||
"ReplaceIllegalCharactersHelpText": "Reemplazar caracteres ilegales. Si está desactivado, Radarr los eliminará si no",
|
"ReplaceIllegalCharactersHelpText": "Reemplazar caracteres ilegales. Si está desactivado, Radarr los eliminará si no",
|
||||||
"Actions": "Acciones",
|
"Actions": "Acciones",
|
||||||
"Today": "Hoy",
|
"Today": "Hoy",
|
||||||
@@ -462,7 +455,7 @@
|
|||||||
"Level": "Nivel",
|
"Level": "Nivel",
|
||||||
"ReleaseBranchCheckOfficialBranchMessage": "Las versión {0} no es una versión válida de Radarr, no recibirás actualizaciones",
|
"ReleaseBranchCheckOfficialBranchMessage": "Las versión {0} no es una versión válida de Radarr, no recibirás actualizaciones",
|
||||||
"Blocklist": "Bloqueadas",
|
"Blocklist": "Bloqueadas",
|
||||||
"BlocklistRelease": "Bloquear este Estreno",
|
"BlocklistRelease": "Lista de lanzamientos bloqueados",
|
||||||
"CreateEmptyAuthorFolders": "Crear carpetas de películas vacías",
|
"CreateEmptyAuthorFolders": "Crear carpetas de películas vacías",
|
||||||
"SelectAll": "Seleccionar Todas",
|
"SelectAll": "Seleccionar Todas",
|
||||||
"SelectedCountBooksSelectedInterp": "{0} Película(s) Seleccionada(s)",
|
"SelectedCountBooksSelectedInterp": "{0} Película(s) Seleccionada(s)",
|
||||||
@@ -599,7 +592,6 @@
|
|||||||
"BypassIfHighestQuality": "Pasar sí es la calidad más alta",
|
"BypassIfHighestQuality": "Pasar sí es la calidad más alta",
|
||||||
"CustomFormatScore": "Puntuación de Formato personalizado",
|
"CustomFormatScore": "Puntuación de Formato personalizado",
|
||||||
"MinimumCustomFormatScore": "Puntuación mínima de formato personalizado",
|
"MinimumCustomFormatScore": "Puntuación mínima de formato personalizado",
|
||||||
"CloneCustomFormat": "Clonar Formato Personalizado",
|
|
||||||
"Conditions": "Condiciones",
|
"Conditions": "Condiciones",
|
||||||
"CopyToClipboard": "Copiar al portapapeles",
|
"CopyToClipboard": "Copiar al portapapeles",
|
||||||
"CustomFormat": "Formatos Personalizados",
|
"CustomFormat": "Formatos Personalizados",
|
||||||
@@ -630,12 +622,11 @@
|
|||||||
"HideAdvanced": "Ocultar Avanzado",
|
"HideAdvanced": "Ocultar Avanzado",
|
||||||
"ShowAdvanced": "Mostrar Avanzado",
|
"ShowAdvanced": "Mostrar Avanzado",
|
||||||
"ShownClickToHide": "Mostrado, clic para ocultar",
|
"ShownClickToHide": "Mostrado, clic para ocultar",
|
||||||
"ColonReplacement": "Reemplazo dos puntos",
|
|
||||||
"ReplaceWithDash": "Reemplazar con Dash",
|
"ReplaceWithDash": "Reemplazar con Dash",
|
||||||
"ReplaceWithSpaceDash": "Reemplazar con Space Dash",
|
"ReplaceWithSpaceDash": "Reemplazar con Space Dash",
|
||||||
"ReplaceWithSpaceDashSpace": "Reemplazar con Space Dash Space",
|
"ReplaceWithSpaceDashSpace": "Reemplazar con Space Dash Space",
|
||||||
"DeleteRemotePathMapping": "Editar Mapeo de Ruta Remota",
|
"DeleteRemotePathMapping": "Editar Mapeo de Ruta Remota",
|
||||||
"BlocklistReleases": "Bloquear este Estreno",
|
"BlocklistReleases": "Lista de lanzamientos bloqueados",
|
||||||
"DeleteConditionMessageText": "Seguro que quieres eliminar la etiqueta '{0}'?",
|
"DeleteConditionMessageText": "Seguro que quieres eliminar la etiqueta '{0}'?",
|
||||||
"Negated": "Negado",
|
"Negated": "Negado",
|
||||||
"RemoveSelectedItem": "Eliminar el elemento seleccionado",
|
"RemoveSelectedItem": "Eliminar el elemento seleccionado",
|
||||||
@@ -649,7 +640,7 @@
|
|||||||
"BlocklistReleaseHelpText": "Evita que Radarr vuelva a capturar esta película automáticamente",
|
"BlocklistReleaseHelpText": "Evita que Radarr vuelva a capturar esta película automáticamente",
|
||||||
"NoEventsFound": "No se encontraron eventos",
|
"NoEventsFound": "No se encontraron eventos",
|
||||||
"ApplyTagsHelpTextHowToApplyAuthors": "Cómo añadir etiquetas a las películas seleccionadas",
|
"ApplyTagsHelpTextHowToApplyAuthors": "Cómo añadir etiquetas a las películas seleccionadas",
|
||||||
"DeleteSelectedIndexersMessageText": "Seguro que quieres eliminar el indexer '{0}'?",
|
"DeleteSelectedIndexersMessageText": "¿Está seguro de querer eliminar {count} indexador(es) seleccionado(s)?",
|
||||||
"Yes": "Sí",
|
"Yes": "Sí",
|
||||||
"RedownloadFailed": "La descarga ha fallado",
|
"RedownloadFailed": "La descarga ha fallado",
|
||||||
"RemoveCompleted": "Eliminación completada",
|
"RemoveCompleted": "Eliminación completada",
|
||||||
@@ -662,8 +653,8 @@
|
|||||||
"ApplyTagsHelpTextRemove": "Eliminar: Eliminar las etiquetas introducidas",
|
"ApplyTagsHelpTextRemove": "Eliminar: Eliminar las etiquetas introducidas",
|
||||||
"ApplyTagsHelpTextReplace": "Reemplazar: Reemplazar las etiquetas con las etiquetas introducidas (no introducir etiquetas para eliminar todas las etiquetas)",
|
"ApplyTagsHelpTextReplace": "Reemplazar: Reemplazar las etiquetas con las etiquetas introducidas (no introducir etiquetas para eliminar todas las etiquetas)",
|
||||||
"DeleteSelectedDownloadClients": "Borrar Gestor de Descargas",
|
"DeleteSelectedDownloadClients": "Borrar Gestor de Descargas",
|
||||||
"DeleteSelectedDownloadClientsMessageText": "¿Estas seguro que quieres eliminar {count} cliente(s) de descarga seleccionado(s)?",
|
"DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {count} cliente(s) de descarga seleccionado(s)?",
|
||||||
"DeleteSelectedImportListsMessageText": "Seguro que quieres eliminar el indexer '{0}'?",
|
"DeleteSelectedImportListsMessageText": "Seguro que quieres eliminar {count} lista(s) de importación seleccionada(s)?",
|
||||||
"DeleteSelectedIndexers": "Borrar Indexer",
|
"DeleteSelectedIndexers": "Borrar Indexer",
|
||||||
"DownloadClientTagHelpText": "Solo utilizar este indexador para películas que coincidan con al menos una etiqueta. Déjelo en blanco para utilizarlo con todas las películas.",
|
"DownloadClientTagHelpText": "Solo utilizar este indexador para películas que coincidan con al menos una etiqueta. Déjelo en blanco para utilizarlo con todas las películas.",
|
||||||
"ExistingTag": "Etiqueta existente",
|
"ExistingTag": "Etiqueta existente",
|
||||||
@@ -723,7 +714,7 @@
|
|||||||
"NextExecution": "Siguiente ejecución",
|
"NextExecution": "Siguiente ejecución",
|
||||||
"NoResultsFound": "No se han encontrado resultados",
|
"NoResultsFound": "No se han encontrado resultados",
|
||||||
"RecentChanges": "Cambios recientes",
|
"RecentChanges": "Cambios recientes",
|
||||||
"WhatsNew": "¿Qué hay de nuevo?",
|
"WhatsNew": "Que es lo nuevo?",
|
||||||
"Loading": "Cargando",
|
"Loading": "Cargando",
|
||||||
"Events": "Eventos",
|
"Events": "Eventos",
|
||||||
"Medium": "Medio",
|
"Medium": "Medio",
|
||||||
@@ -746,7 +737,7 @@
|
|||||||
"ASIN": "ASIN",
|
"ASIN": "ASIN",
|
||||||
"AnyEditionOkHelpText": "Readarr cambiará automáticamente a la edición que mejor coincida con los archivos descargados",
|
"AnyEditionOkHelpText": "Readarr cambiará automáticamente a la edición que mejor coincida con los archivos descargados",
|
||||||
"AppUpdated": "{appName} Actualizada",
|
"AppUpdated": "{appName} Actualizada",
|
||||||
"AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitaras recargar {appName}",
|
"AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes necesitará recargar {appName}",
|
||||||
"AuthorFolderFormat": "Formato de Carpeta de Autor",
|
"AuthorFolderFormat": "Formato de Carpeta de Autor",
|
||||||
"AuthorNameHelpText": "El nombre del autor/libro a excluir (puede ser cualquier cosa significativa)",
|
"AuthorNameHelpText": "El nombre del autor/libro a excluir (puede ser cualquier cosa significativa)",
|
||||||
"BookMonitoring": "Monitoreo de libros",
|
"BookMonitoring": "Monitoreo de libros",
|
||||||
@@ -755,5 +746,25 @@
|
|||||||
"Book": "Libro",
|
"Book": "Libro",
|
||||||
"AutomaticallySwitchEdition": "Cambiar edición automáticamente",
|
"AutomaticallySwitchEdition": "Cambiar edición automáticamente",
|
||||||
"BookNaming": "Nombrado de libros",
|
"BookNaming": "Nombrado de libros",
|
||||||
"Books": "Libro"
|
"Books": "Libro",
|
||||||
|
"NoHistoryBlocklist": "Sin lista de bloqueo de historial",
|
||||||
|
"WouldYouLikeToRestoreBackup": "Te gustaria restaurar la copia de seguridad '{name}'?",
|
||||||
|
"IsShowingMonitoredUnmonitorSelected": "Monitorizar Seleccionados",
|
||||||
|
"CloneCustomFormat": "Clonar formato personalizado",
|
||||||
|
"MinimumCustomFormatScoreHelpText": "Puntuación mínima de formato personalizado necesaria para evitar el retraso del protocolo preferido",
|
||||||
|
"BypassIfAboveCustomFormatScore": "Omitir si está por encima de la puntuación del formato personalizado",
|
||||||
|
"BypassIfAboveCustomFormatScoreHelpText": "Habilitar ignorar cuando la versión tenga una puntuación superior a la puntuación mínima configurada para el formato personalizado",
|
||||||
|
"IsShowingMonitoredMonitorSelected": "Monitorizar Seleccionados",
|
||||||
|
"ClientPriority": "Prioridad del Cliente",
|
||||||
|
"ColonReplacement": "Reemplazar dos puntos",
|
||||||
|
"CloneProfile": "Clonar Perfil",
|
||||||
|
"Close": "Cerrar",
|
||||||
|
"CloneIndexer": "Clonar Indexer",
|
||||||
|
"CompletedDownloadHandling": "Manipulación de descargas completas",
|
||||||
|
"EnableProfile": "Habilitar perfil",
|
||||||
|
"ListsSettingsSummary": "lista de importación",
|
||||||
|
"ExtraFileExtensionsHelpText": "Separar con cons la lista de los archivos extra a importar (.nfo será impotado como .nfo-orig)",
|
||||||
|
"ExtraFileExtensionsHelpTextsExamples": "Ejemplos : '.sub, .nfo' o 'sub,nfo'",
|
||||||
|
"ImportLists": "lista de importación",
|
||||||
|
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "El cliente de descarga {downloadClientName} esta configurado para eliminar las descargas completadas. Esto puede causar que las descargas sean eliminadas del cliente antes que {1} las pueda importar."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,8 +123,6 @@
|
|||||||
"ErrorLoadingContents": "Sisällönlatauksen virhe",
|
"ErrorLoadingContents": "Sisällönlatauksen virhe",
|
||||||
"ErrorLoadingPreviews": "Virhe ladattaessa esikatselua",
|
"ErrorLoadingPreviews": "Virhe ladattaessa esikatselua",
|
||||||
"Exception": "Poikkeus",
|
"Exception": "Poikkeus",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Pilkulla eroteltu lista tuotavista oheistiedostoista (.nfo tuodaan nimellä .nfo-orig).",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Esimerkkejä: '.sub, .nfo' tai 'sub, nfo'.",
|
|
||||||
"FailedDownloadHandling": "Latauksen käsittely epäonnistui",
|
"FailedDownloadHandling": "Latauksen käsittely epäonnistui",
|
||||||
"FileDateHelpText": "Muuta tiedoston päiväys tuonnin ja uudelleentarkistuksen yhteydessä.",
|
"FileDateHelpText": "Muuta tiedoston päiväys tuonnin ja uudelleentarkistuksen yhteydessä.",
|
||||||
"FileManagement": "Tiedostojen hallinta",
|
"FileManagement": "Tiedostojen hallinta",
|
||||||
@@ -883,5 +881,7 @@
|
|||||||
"AutomaticUpdatesDisabledDocker": "Suoraa automaattista päivitystä ei tueta käytettäessä Dockerin päivitysmekanismia. Joko Docker-säiliö on päivitettävä {appName}in ulkopuolella tai päivitys on suoritettava skriptillä.",
|
"AutomaticUpdatesDisabledDocker": "Suoraa automaattista päivitystä ei tueta käytettäessä Dockerin päivitysmekanismia. Joko Docker-säiliö on päivitettävä {appName}in ulkopuolella tai päivitys on suoritettava skriptillä.",
|
||||||
"AppUpdated": "{appName} on päivitetty",
|
"AppUpdated": "{appName} on päivitetty",
|
||||||
"AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on ladattava uudelleen.",
|
"AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on ladattava uudelleen.",
|
||||||
"Iso639-3": "ISO 639-3 -kielikoodit tai \"null\" (pilkuin eroteltuna)"
|
"Iso639-3": "ISO 639-3 -kielikoodit tai \"null\" (pilkuin eroteltuna)",
|
||||||
|
"ExtraFileExtensionsHelpText": "Pilkulla eroteltu lista tuotavista oheistiedostoista (.nfo tuodaan nimellä .nfo-orig).",
|
||||||
|
"ExtraFileExtensionsHelpTextsExamples": "Esimerkkejä: '.sub, .nfo' tai 'sub, nfo'."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -112,7 +112,7 @@
|
|||||||
"DiskSpace": "Espace disque",
|
"DiskSpace": "Espace disque",
|
||||||
"DownloadClient": "Client de téléchargement",
|
"DownloadClient": "Client de téléchargement",
|
||||||
"DownloadClientSettings": "Télécharger les paramètres client",
|
"DownloadClientSettings": "Télécharger les paramètres client",
|
||||||
"DownloadClients": "Clients de téléchargements",
|
"DownloadClients": "Clients de téléchargement",
|
||||||
"DownloadFailedCheckDownloadClientForMoreDetails": "Téléchargement échoué : voir le client de téléchargement pour plus de détails",
|
"DownloadFailedCheckDownloadClientForMoreDetails": "Téléchargement échoué : voir le client de téléchargement pour plus de détails",
|
||||||
"DownloadFailedInterp": "Échec du téléchargement : {0}",
|
"DownloadFailedInterp": "Échec du téléchargement : {0}",
|
||||||
"DownloadPropersAndRepacksHelpTexts1": "S'il faut ou non mettre à niveau automatiquement vers Propres/Repacks",
|
"DownloadPropersAndRepacksHelpTexts1": "S'il faut ou non mettre à niveau automatiquement vers Propres/Repacks",
|
||||||
@@ -132,15 +132,13 @@
|
|||||||
"ErrorLoadingContents": "Erreur lors du chargement du contenu",
|
"ErrorLoadingContents": "Erreur lors du chargement du contenu",
|
||||||
"ErrorLoadingPreviews": "Erreur lors du chargement des aperçus",
|
"ErrorLoadingPreviews": "Erreur lors du chargement des aperçus",
|
||||||
"Exception": "Exception",
|
"Exception": "Exception",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Liste séparée par des virgules des fichiers supplémentaires à importer (.nfo sera importé en tant que .nfo-orig)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Exemples : '.sub, .nfo' ou 'sub,nfo'",
|
|
||||||
"FailedDownloadHandling": "Gestion des échecs de téléchargement",
|
"FailedDownloadHandling": "Gestion des échecs de téléchargement",
|
||||||
"FileDateHelpText": "Changer la date du fichier lors de l'import/re-scan",
|
"FileDateHelpText": "Changer la date du fichier lors de l'import/re-scan",
|
||||||
"FileNames": "Noms de fichier",
|
"FileNames": "Noms de fichier",
|
||||||
"Filename": "Nom de fichier",
|
"Filename": "Nom de fichier",
|
||||||
"Files": "Fichiers",
|
"Files": "Fichiers",
|
||||||
"FirstDayOfWeek": "Premier jour de la semaine",
|
"FirstDayOfWeek": "Premier jour de la semaine",
|
||||||
"Fixed": "Fixé",
|
"Fixed": "Corrigés",
|
||||||
"Folder": "Dossier",
|
"Folder": "Dossier",
|
||||||
"Folders": "Dossiers",
|
"Folders": "Dossiers",
|
||||||
"ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Pour plus d'informations sur les clients de téléchargement individuels, cliquez sur les boutons d'information.",
|
"ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Pour plus d'informations sur les clients de téléchargement individuels, cliquez sur les boutons d'information.",
|
||||||
@@ -158,7 +156,7 @@
|
|||||||
"HasPendingChangesNoChanges": "Aucune modification",
|
"HasPendingChangesNoChanges": "Aucune modification",
|
||||||
"HasPendingChangesSaveChanges": "Sauvegarder les modifications",
|
"HasPendingChangesSaveChanges": "Sauvegarder les modifications",
|
||||||
"History": "Historique",
|
"History": "Historique",
|
||||||
"Hostname": "Hostname",
|
"Hostname": "Nom d'hôte",
|
||||||
"ICalFeed": "Flux iCal",
|
"ICalFeed": "Flux iCal",
|
||||||
"ICalHttpUrlHelpText": "Copiez cette URL dans votre/vos client(s) ou cliquez pour abonner si votre navigateur est compatible avec webcal",
|
"ICalHttpUrlHelpText": "Copiez cette URL dans votre/vos client(s) ou cliquez pour abonner si votre navigateur est compatible avec webcal",
|
||||||
"ICalLink": "Lien iCal",
|
"ICalLink": "Lien iCal",
|
||||||
@@ -246,7 +244,7 @@
|
|||||||
"PortNumber": "Numéro de port",
|
"PortNumber": "Numéro de port",
|
||||||
"PosterSize": "Poster taille",
|
"PosterSize": "Poster taille",
|
||||||
"PreviewRename": "Aperçu Renommer",
|
"PreviewRename": "Aperçu Renommer",
|
||||||
"Profiles": "Profiles",
|
"Profiles": "Profils",
|
||||||
"Proper": "Approprié",
|
"Proper": "Approprié",
|
||||||
"PropersAndRepacks": "Propres et Repacks",
|
"PropersAndRepacks": "Propres et Repacks",
|
||||||
"Protocol": "Protocole",
|
"Protocol": "Protocole",
|
||||||
@@ -398,7 +396,7 @@
|
|||||||
"UnableToLoadDownloadClientOptions": "Impossible de charger les options du client de téléchargement",
|
"UnableToLoadDownloadClientOptions": "Impossible de charger les options du client de téléchargement",
|
||||||
"UnableToLoadDownloadClients": "Impossible de charger les clients de téléchargement",
|
"UnableToLoadDownloadClients": "Impossible de charger les clients de téléchargement",
|
||||||
"UnableToLoadGeneralSettings": "Impossible de charger les paramètres généraux",
|
"UnableToLoadGeneralSettings": "Impossible de charger les paramètres généraux",
|
||||||
"UnableToLoadHistory": "Impossible de charger l'historique",
|
"UnableToLoadHistory": "Impossible de charger l'historique.",
|
||||||
"UnableToLoadImportListExclusions": "Impossible de charger les exclusions de liste",
|
"UnableToLoadImportListExclusions": "Impossible de charger les exclusions de liste",
|
||||||
"UnableToLoadIndexerOptions": "Impossible de charger les options de l'indexeur",
|
"UnableToLoadIndexerOptions": "Impossible de charger les options de l'indexeur",
|
||||||
"UnableToLoadIndexers": "Impossible de charger les indexeurs",
|
"UnableToLoadIndexers": "Impossible de charger les indexeurs",
|
||||||
@@ -502,7 +500,7 @@
|
|||||||
"Save": "Sauvegarder",
|
"Save": "Sauvegarder",
|
||||||
"BackupIntervalHelpText": "Intervalle entre les sauvegardes automatiques",
|
"BackupIntervalHelpText": "Intervalle entre les sauvegardes automatiques",
|
||||||
"CatalogNumber": "Numéro de catalogue",
|
"CatalogNumber": "Numéro de catalogue",
|
||||||
"Metadata": "Metadonnées",
|
"Metadata": "Métadonnées",
|
||||||
"Disabled": "Désactivé",
|
"Disabled": "Désactivé",
|
||||||
"IndexersSettingsSummary": "Indexeurs et restrictions de version",
|
"IndexersSettingsSummary": "Indexeurs et restrictions de version",
|
||||||
"OnUpgrade": "Lors de la mise à niveau",
|
"OnUpgrade": "Lors de la mise à niveau",
|
||||||
@@ -525,7 +523,7 @@
|
|||||||
"ImportListStatusCheckAllClientMessage": "Toutes les listes ne sont pas disponibles en raison d'échecs",
|
"ImportListStatusCheckAllClientMessage": "Toutes les listes ne sont pas disponibles en raison d'échecs",
|
||||||
"ImportMechanismHealthCheckMessage": "Activer la gestion des téléchargements terminés",
|
"ImportMechanismHealthCheckMessage": "Activer la gestion des téléchargements terminés",
|
||||||
"IndexerRssHealthCheckNoIndexers": "Aucun indexeur disponible avec la synchronisation RSS activée, Readarr ne récupérera pas automatiquement les nouvelles versions",
|
"IndexerRssHealthCheckNoIndexers": "Aucun indexeur disponible avec la synchronisation RSS activée, Readarr ne récupérera pas automatiquement les nouvelles versions",
|
||||||
"CouldntFindAnyResultsForTerm": "Pas de résultats pour '{0}'",
|
"CouldntFindAnyResultsForTerm": "Aucun résultat pour de résultats pour '{0}'",
|
||||||
"ReadarrSupportsAnyDownloadClient": "Readarr prend en charge de nombreux clients de téléchargement torrent et usenet.",
|
"ReadarrSupportsAnyDownloadClient": "Readarr prend en charge de nombreux clients de téléchargement torrent et usenet.",
|
||||||
"RefreshAndScan": "Actualiser et analyser",
|
"RefreshAndScan": "Actualiser et analyser",
|
||||||
"RemotePathMappingCheckFileRemoved": "Le fichier {0} a été supprimé pendant le processus.",
|
"RemotePathMappingCheckFileRemoved": "Le fichier {0} a été supprimé pendant le processus.",
|
||||||
@@ -685,10 +683,10 @@
|
|||||||
"CopyToClipboard": "Copier dans le presse-papier",
|
"CopyToClipboard": "Copier dans le presse-papier",
|
||||||
"CustomFormat": "Format personnalisé",
|
"CustomFormat": "Format personnalisé",
|
||||||
"CustomFormatSettings": "Réglages Formats Personnalisés",
|
"CustomFormatSettings": "Réglages Formats Personnalisés",
|
||||||
"CustomFormats": "Formats perso.",
|
"CustomFormats": "Formats personnalisés",
|
||||||
"DeleteCustomFormat": "Supprimer le format personnalisé",
|
"DeleteCustomFormat": "Supprimer le format personnalisé",
|
||||||
"DeleteCustomFormatMessageText": "Voulez-vous vraiment supprimer le format personnalisé « {name} » ?",
|
"DeleteCustomFormatMessageText": "Voulez-vous vraiment supprimer le format personnalisé « {name} » ?",
|
||||||
"DeleteFormatMessageText": "Êtes-vous sûr de vouloir supprimer le tag {0} ?",
|
"DeleteFormatMessageText": "Êtes-vous sûr de vouloir supprimer le tag « {0} » ?",
|
||||||
"ExportCustomFormat": "Exporter un format personnalisé",
|
"ExportCustomFormat": "Exporter un format personnalisé",
|
||||||
"Formats": "Formats",
|
"Formats": "Formats",
|
||||||
"IncludeCustomFormatWhenRenamingHelpText": "Inclus dans {Custom Formats} renommer le format",
|
"IncludeCustomFormatWhenRenamingHelpText": "Inclus dans {Custom Formats} renommer le format",
|
||||||
@@ -713,7 +711,7 @@
|
|||||||
"ApiKeyValidationHealthCheckMessage": "Veuillez mettre à jour votre clé API pour qu'elle contienne au moins {0} caractères. Vous pouvez le faire via les paramètres ou le fichier de configuration",
|
"ApiKeyValidationHealthCheckMessage": "Veuillez mettre à jour votre clé API pour qu'elle contienne au moins {0} caractères. Vous pouvez le faire via les paramètres ou le fichier de configuration",
|
||||||
"DeleteBookFile": "Effacer le fichier du livre",
|
"DeleteBookFile": "Effacer le fichier du livre",
|
||||||
"HiddenClickToShow": "Masqué, cliquez pour afficher",
|
"HiddenClickToShow": "Masqué, cliquez pour afficher",
|
||||||
"HideAdvanced": "Masquer param. av.",
|
"HideAdvanced": "Masquer les Options Avancées",
|
||||||
"ShowAdvanced": "Afficher les paramètres avancés",
|
"ShowAdvanced": "Afficher les paramètres avancés",
|
||||||
"ShownClickToHide": "Affiché, cliquez pour masquer",
|
"ShownClickToHide": "Affiché, cliquez pour masquer",
|
||||||
"ColonReplacement": "Remplacement pour le « deux-points »",
|
"ColonReplacement": "Remplacement pour le « deux-points »",
|
||||||
@@ -885,7 +883,7 @@
|
|||||||
"IndexerIdHelpText": "Spécifiez à quel indexeur le profil s'applique",
|
"IndexerIdHelpText": "Spécifiez à quel indexeur le profil s'applique",
|
||||||
"Monitoring": "Surveillance",
|
"Monitoring": "Surveillance",
|
||||||
"UnmappedFiles": "Fichiers non mappés",
|
"UnmappedFiles": "Fichiers non mappés",
|
||||||
"Bookshelf": "Étagère à livres",
|
"Bookshelf": "Bibliothèque",
|
||||||
"ErrorLoadingContent": "Une erreur s'est produite lors du chargement de ce contenu",
|
"ErrorLoadingContent": "Une erreur s'est produite lors du chargement de ce contenu",
|
||||||
"OnReleaseImportHelpText": "Lors de l'importation de la version",
|
"OnReleaseImportHelpText": "Lors de l'importation de la version",
|
||||||
"UnableToLoadMetadataProviderSettings": "Impossible de charger les paramètres du fournisseur de métadonnées",
|
"UnableToLoadMetadataProviderSettings": "Impossible de charger les paramètres du fournisseur de métadonnées",
|
||||||
@@ -921,5 +919,12 @@
|
|||||||
"ReadarrSupportsMultipleListsForImportingBooksAndAuthorsIntoTheDatabase": "Lidarr prend en charge plusieurs listes pour importer des albums et des artistes dans la base de données.",
|
"ReadarrSupportsMultipleListsForImportingBooksAndAuthorsIntoTheDatabase": "Lidarr prend en charge plusieurs listes pour importer des albums et des artistes dans la base de données.",
|
||||||
"TotalBookCountBooksTotalBookFileCountBooksWithFilesInterp": "{0} pistes au total. {1} pistes avec fichiers.",
|
"TotalBookCountBooksTotalBookFileCountBooksWithFilesInterp": "{0} pistes au total. {1} pistes avec fichiers.",
|
||||||
"SearchForAllMissingBooks": "Rechercher tous les albums manquants",
|
"SearchForAllMissingBooks": "Rechercher tous les albums manquants",
|
||||||
"ForeignIdHelpText": "L'identifiant Musicbrainz de l'artiste/album à exclure"
|
"ForeignIdHelpText": "L'identifiant Musicbrainz de l'artiste/album à exclure",
|
||||||
|
"EnableProfile": "Activer profil",
|
||||||
|
"Development": "Développement",
|
||||||
|
"FilesTotal": "Fichiers ({0})",
|
||||||
|
"SearchBoxPlaceHolder": "Par ex. Guerre et Paix, goodreads:656, isbn:067003469X, asin:B00JCDK5ME",
|
||||||
|
"ExtraFileExtensionsHelpText": "Liste de fichiers supplémentaires séparés par des virgules à importer (.nfo sera importé en tant que .nfo-orig)",
|
||||||
|
"ExtraFileExtensionsHelpTextsExamples": "Exemples : '.sub, .nfo' ou 'sub,nfo'",
|
||||||
|
"UseSSL": "Utiliser SSL"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,8 +109,6 @@
|
|||||||
"ErrorLoadingContents": "שגיאה בטעינת התוכן",
|
"ErrorLoadingContents": "שגיאה בטעינת התוכן",
|
||||||
"ErrorLoadingPreviews": "שגיאה בטעינת תצוגה מקדימה",
|
"ErrorLoadingPreviews": "שגיאה בטעינת תצוגה מקדימה",
|
||||||
"Exception": "יוצא מן הכלל",
|
"Exception": "יוצא מן הכלל",
|
||||||
"ExtraFileExtensionsHelpTexts1": "רשימה מופרדת באמצעות פסיקים של קבצים נוספים לייבוא (.nfo יובא כ- nfo-orig)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "דוגמאות: '.sub, .nfo' או 'sub, nfo'",
|
|
||||||
"FailedDownloadHandling": "הטיפול בהורדות נכשל",
|
"FailedDownloadHandling": "הטיפול בהורדות נכשל",
|
||||||
"FileDateHelpText": "שנה את תאריך הקובץ בעת הייבוא / סריקה מחדש",
|
"FileDateHelpText": "שנה את תאריך הקובץ בעת הייבוא / סריקה מחדש",
|
||||||
"FileManagement": "ניהול קבצים",
|
"FileManagement": "ניהול קבצים",
|
||||||
@@ -657,5 +655,7 @@
|
|||||||
"System": "מערכת",
|
"System": "מערכת",
|
||||||
"Theme": "ערכת נושא",
|
"Theme": "ערכת נושא",
|
||||||
"TotalSpace": "השטח הכולל",
|
"TotalSpace": "השטח הכולל",
|
||||||
"Publisher": "מוציא לאור"
|
"Publisher": "מוציא לאור",
|
||||||
|
"ExtraFileExtensionsHelpText": "רשימה מופרדת באמצעות פסיקים של קבצים נוספים לייבוא (.nfo יובא כ- nfo-orig)",
|
||||||
|
"ExtraFileExtensionsHelpTextsExamples": "דוגמאות: '.sub, .nfo' או 'sub, nfo'"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -114,8 +114,6 @@
|
|||||||
"ErrorLoadingContents": "सामग्री लोड करने में त्रुटि",
|
"ErrorLoadingContents": "सामग्री लोड करने में त्रुटि",
|
||||||
"ErrorLoadingPreviews": "पूर्वावलोकन लोड करने में त्रुटि",
|
"ErrorLoadingPreviews": "पूर्वावलोकन लोड करने में त्रुटि",
|
||||||
"Exception": "अपवाद",
|
"Exception": "अपवाद",
|
||||||
"ExtraFileExtensionsHelpTexts1": "आयात करने के लिए कोमा ने अतिरिक्त फ़ाइलों की सूची अलग कर दी (.nfo को .nfo- मूल के रूप में आयात किया जाएगा)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "उदाहरण: '.sub, .nfo' या 'सब, nfo'",
|
|
||||||
"FailedDownloadHandling": "डाउनलोड हैंडलिंग विफल",
|
"FailedDownloadHandling": "डाउनलोड हैंडलिंग विफल",
|
||||||
"FileDateHelpText": "आयात / रेस्क्यू पर फ़ाइल तिथि बदलें",
|
"FileDateHelpText": "आयात / रेस्क्यू पर फ़ाइल तिथि बदलें",
|
||||||
"FileManagement": "फाइल प्रबंधन",
|
"FileManagement": "फाइल प्रबंधन",
|
||||||
|
|||||||
@@ -109,8 +109,6 @@
|
|||||||
"ErrorLoadingContents": "Hiba történt a tartalom betöltésekor",
|
"ErrorLoadingContents": "Hiba történt a tartalom betöltésekor",
|
||||||
"ErrorLoadingPreviews": "Hiba történt az előnézetek betöltése közben",
|
"ErrorLoadingPreviews": "Hiba történt az előnézetek betöltése közben",
|
||||||
"Exception": "Kivétel",
|
"Exception": "Kivétel",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Az importálandó extra fájlok vesszővel lesznek elválasztva (.nfo .nfo-orig néven lesz importálva)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Például: '.sub, .nfo' vagy 'sub, nfo'",
|
|
||||||
"FailedDownloadHandling": "Nem sikerült a letöltés kezelése",
|
"FailedDownloadHandling": "Nem sikerült a letöltés kezelése",
|
||||||
"FileDateHelpText": "A fájl dátumának módosítása az importáláskor / újrakereséskor",
|
"FileDateHelpText": "A fájl dátumának módosítása az importáláskor / újrakereséskor",
|
||||||
"FileManagement": "Fájlkezelő",
|
"FileManagement": "Fájlkezelő",
|
||||||
@@ -977,5 +975,7 @@
|
|||||||
"AddNew": "Új hozzáadása",
|
"AddNew": "Új hozzáadása",
|
||||||
"Backup": "Biztonsági Mentés",
|
"Backup": "Biztonsági Mentés",
|
||||||
"Medium": "Közepes",
|
"Medium": "Közepes",
|
||||||
"AutoAdd": "Automatikus hozzáadás"
|
"AutoAdd": "Automatikus hozzáadás",
|
||||||
|
"ExtraFileExtensionsHelpText": "Az importálandó extra fájlok vesszővel lesznek elválasztva (.nfo .nfo-orig néven lesz importálva)",
|
||||||
|
"ExtraFileExtensionsHelpTextsExamples": "Például: '.sub, .nfo' vagy 'sub, nfo'"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"Actions": "Tindakan",
|
"Actions": "Tindakan",
|
||||||
"AgeWhenGrabbed": "Usia (saat diperoleh)",
|
"AgeWhenGrabbed": "Usia (saat diperoleh)",
|
||||||
"All": "Semua",
|
"All": "Semua",
|
||||||
"AlreadyInYourLibrary": "Sudah ada di pustaka kamu",
|
"AlreadyInYourLibrary": "Sudah di pustakamu",
|
||||||
"Analytics": "Analitik",
|
"Analytics": "Analitik",
|
||||||
"AnalyticsEnabledHelpText": "Kirimkan informasi penggunaan secara anonim ke server Radarr. Informasi tersebut mengandung browser kamu, halaman WebUI Radarr yang kamu gunakan, pelaporan masalah serta OS dan versi runtime. Kami akan memanfaatkan informasi ini untuk memprioritaskan fitur dan perbaikan bug.",
|
"AnalyticsEnabledHelpText": "Kirimkan informasi penggunaan secara anonim ke server Radarr. Informasi tersebut mengandung browser kamu, halaman WebUI Radarr yang kamu gunakan, pelaporan masalah serta OS dan versi runtime. Kami akan memanfaatkan informasi ini untuk memprioritaskan fitur dan perbaikan bug.",
|
||||||
"ApplicationURL": "URL Aplikasi",
|
"ApplicationURL": "URL Aplikasi",
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
"ClickToChangeQuality": "Klik untuk mengubah kualitas",
|
"ClickToChangeQuality": "Klik untuk mengubah kualitas",
|
||||||
"AlternateTitles": "Judul Lain",
|
"AlternateTitles": "Judul Lain",
|
||||||
"AppDataDirectory": "Direktori AppData",
|
"AppDataDirectory": "Direktori AppData",
|
||||||
"Connections": "Koleksi",
|
"Connections": "Koneksi",
|
||||||
"ExportCustomFormat": "Tambahkan Format Khusus",
|
"ExportCustomFormat": "Tambahkan Format Khusus",
|
||||||
"AuthorClickToChangeBook": "Klik untuk mengubah film",
|
"AuthorClickToChangeBook": "Klik untuk mengubah film",
|
||||||
"Automatic": "Otomatis",
|
"Automatic": "Otomatis",
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
"EnableRSS": "Aktifkan RSS",
|
"EnableRSS": "Aktifkan RSS",
|
||||||
"MetadataSource": "Sumber Metadata",
|
"MetadataSource": "Sumber Metadata",
|
||||||
"Language": "Bahasa",
|
"Language": "Bahasa",
|
||||||
"LogFiles": "Berkas Log",
|
"LogFiles": "File Log",
|
||||||
"MediaManagement": "Pengelolaan Media",
|
"MediaManagement": "Pengelolaan Media",
|
||||||
"Metadata": "Metadata",
|
"Metadata": "Metadata",
|
||||||
"Queue": "Antrean",
|
"Queue": "Antrean",
|
||||||
@@ -67,7 +67,23 @@
|
|||||||
"Activity": "Aktivitas",
|
"Activity": "Aktivitas",
|
||||||
"Backup": "Cadangan",
|
"Backup": "Cadangan",
|
||||||
"ConnectionLost": "Koneksi Terputus",
|
"ConnectionLost": "Koneksi Terputus",
|
||||||
"ConnectionLostReconnect": "Radarr akan mencoba untuk menghubungi secara otomatis, atau klik muat ulang di bawah.",
|
"ConnectionLostReconnect": "{appName} akan mencoba untuk menghubungkan secara otomatis, atau silakan klik muat ulang di bawah.",
|
||||||
"SomeResultsAreHiddenByTheAppliedFilter": "Seluruh hasil disembunyikan karena penyaringan yang diterapkan",
|
"SomeResultsAreHiddenByTheAppliedFilter": "Seluruh hasil disembunyikan karena penyaringan yang diterapkan",
|
||||||
"AllResultsAreHiddenByTheAppliedFilter": "Seluruh hasil disembunyikan karena penyaringan yang diterapkan"
|
"AllResultsAreHiddenByTheAppliedFilter": "Seluruh hasil disembunyikan karena penyaringan yang diterapkan",
|
||||||
|
"Today": "Hari Ini",
|
||||||
|
"TotalFileSize": "Jumlah Ukuran File",
|
||||||
|
"Unmonitored": "Tidak Dimonitor",
|
||||||
|
"ConnectSettings": "Pengaturan Koneksi",
|
||||||
|
"Yesterday": "Kemarin",
|
||||||
|
"ClickToChangeReleaseGroup": "Klik untuk mengubah rilis grup",
|
||||||
|
"Connect": "Koneksi",
|
||||||
|
"Continuing": "Berlanjut",
|
||||||
|
"Edit": "Edit",
|
||||||
|
"Files": "File",
|
||||||
|
"AddNew": "Tambah",
|
||||||
|
"Search": "Cari",
|
||||||
|
"Refresh": "Muat Ulang",
|
||||||
|
"ConnectionLostToBackend": "Koneksi {appName} telah terputus dari backend dan perlu dimuat ulang untuk dipulihkan.",
|
||||||
|
"ApplyChanges": "Terapkan Perubahan",
|
||||||
|
"History": "Riwayat"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -129,8 +129,6 @@
|
|||||||
"ErrorLoadingContents": "Villa við að hlaða innihald",
|
"ErrorLoadingContents": "Villa við að hlaða innihald",
|
||||||
"ErrorLoadingPreviews": "Villa við að hlaða forskoðun",
|
"ErrorLoadingPreviews": "Villa við að hlaða forskoðun",
|
||||||
"Exception": "Undantekning",
|
"Exception": "Undantekning",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Komma aðskilinn listi yfir auka skrár til að flytja inn (.nfo verður fluttur inn sem .nfo-orig)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Dæmi: '.sub, .nfo' eða 'sub, nfo'",
|
|
||||||
"FailedDownloadHandling": "Mistókst niðurhalshöndlun",
|
"FailedDownloadHandling": "Mistókst niðurhalshöndlun",
|
||||||
"FileDateHelpText": "Breyttu dagsetningu skráar við innflutning / endurskoðun",
|
"FileDateHelpText": "Breyttu dagsetningu skráar við innflutning / endurskoðun",
|
||||||
"FileManagement": "Skráastjórnun",
|
"FileManagement": "Skráastjórnun",
|
||||||
|
|||||||
@@ -134,8 +134,6 @@
|
|||||||
"ErrorLoadingContents": "Errore nel caricare i contenuti",
|
"ErrorLoadingContents": "Errore nel caricare i contenuti",
|
||||||
"ErrorLoadingPreviews": "Errore nel caricare le anteprime",
|
"ErrorLoadingPreviews": "Errore nel caricare le anteprime",
|
||||||
"Exception": "Eccezione",
|
"Exception": "Eccezione",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Liste di file Extra da importare separate da virgola (.nfo saranno importate come .nfo-orig)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Esempi: '.sub, .nfo' or 'sub,nfo'",
|
|
||||||
"FailedDownloadHandling": "Gestione dei Download Falliti",
|
"FailedDownloadHandling": "Gestione dei Download Falliti",
|
||||||
"FileDateHelpText": "Modifica la data dei file in importazione/rescan",
|
"FileDateHelpText": "Modifica la data dei file in importazione/rescan",
|
||||||
"FileManagement": "Gestione dei File",
|
"FileManagement": "Gestione dei File",
|
||||||
|
|||||||
@@ -71,8 +71,6 @@
|
|||||||
"ErrorLoadingContents": "コンテンツの読み込み中にエラーが発生しました",
|
"ErrorLoadingContents": "コンテンツの読み込み中にエラーが発生しました",
|
||||||
"ErrorLoadingPreviews": "プレビューの読み込みエラー",
|
"ErrorLoadingPreviews": "プレビューの読み込みエラー",
|
||||||
"Exception": "例外",
|
"Exception": "例外",
|
||||||
"ExtraFileExtensionsHelpTexts1": "インポートする追加ファイルのコンマ区切りリスト(.nfoは.nfo-origとしてインポートされます)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "例: '。sub、.nfo'または 'sub、nfo'",
|
|
||||||
"FailedDownloadHandling": "ダウンロード処理の失敗",
|
"FailedDownloadHandling": "ダウンロード処理の失敗",
|
||||||
"FileDateHelpText": "インポート/再スキャン時にファイルの日付を変更する",
|
"FileDateHelpText": "インポート/再スキャン時にファイルの日付を変更する",
|
||||||
"FileManagement": "ファイル管理",
|
"FileManagement": "ファイル管理",
|
||||||
@@ -626,5 +624,7 @@
|
|||||||
"Medium": "中",
|
"Medium": "中",
|
||||||
"NoResultsFound": "結果が見つかりません",
|
"NoResultsFound": "結果が見つかりません",
|
||||||
"Activity": "アクティビティ",
|
"Activity": "アクティビティ",
|
||||||
"AddNew": "新しく追加する"
|
"AddNew": "新しく追加する",
|
||||||
|
"ExtraFileExtensionsHelpText": "インポートする追加ファイルのコンマ区切りリスト(.nfoは.nfo-origとしてインポートされます)",
|
||||||
|
"ExtraFileExtensionsHelpTextsExamples": "例: '。sub、.nfo'または 'sub、nfo'"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -155,8 +155,6 @@
|
|||||||
"ErrorLoadingContents": "콘텐츠로드 오류",
|
"ErrorLoadingContents": "콘텐츠로드 오류",
|
||||||
"ErrorLoadingPreviews": "미리보기를로드하는 중에 오류가 발생했습니다.",
|
"ErrorLoadingPreviews": "미리보기를로드하는 중에 오류가 발생했습니다.",
|
||||||
"Exception": "예외",
|
"Exception": "예외",
|
||||||
"ExtraFileExtensionsHelpTexts1": "가져올 추가 파일의 쉼표로 구분 된 목록 (.nfo는 .nfo-orig로 가져옴)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "예 : '.sub, .nfo'또는 'sub, nfo'",
|
|
||||||
"FailedDownloadHandling": "실패한 다운로드 처리",
|
"FailedDownloadHandling": "실패한 다운로드 처리",
|
||||||
"FileDateHelpText": "가져 오기 / 재검색시 파일 날짜 변경",
|
"FileDateHelpText": "가져 오기 / 재검색시 파일 날짜 변경",
|
||||||
"FileManagement": "파일 관리",
|
"FileManagement": "파일 관리",
|
||||||
@@ -617,5 +615,7 @@
|
|||||||
"LastExecution": "마지막 실행",
|
"LastExecution": "마지막 실행",
|
||||||
"Activity": "활동",
|
"Activity": "활동",
|
||||||
"AddNew": "새로 추가하기",
|
"AddNew": "새로 추가하기",
|
||||||
"Backup": "백업"
|
"Backup": "백업",
|
||||||
|
"ExtraFileExtensionsHelpText": "가져올 추가 파일의 쉼표로 구분 된 목록 (.nfo는 .nfo-orig로 가져옴)",
|
||||||
|
"ExtraFileExtensionsHelpTextsExamples": "예 : '.sub, .nfo'또는 'sub, nfo'"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1,7 @@
|
|||||||
{}
|
{
|
||||||
|
"Actions": "Darbības",
|
||||||
|
"About": "Par",
|
||||||
|
"Activity": "Aktivitāte",
|
||||||
|
"New": "Jauns",
|
||||||
|
"ExportCustomFormat": "Pievienot Pielāgotu Formātu"
|
||||||
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
"60MinutesSixty": "60 Minuten: {0}",
|
"60MinutesSixty": "60 Minuten: {0}",
|
||||||
"APIKey": "API-sleutel",
|
"APIKey": "API-sleutel",
|
||||||
"About": "Over",
|
"About": "Over",
|
||||||
"AddListExclusion": "Toevoegen aan Uitzonderingenlijst",
|
"AddListExclusion": "Lijst uitzondering toevoegen",
|
||||||
"AddingTag": "Tag wordt toegevoegd",
|
"AddingTag": "Tag wordt toegevoegd",
|
||||||
"AgeWhenGrabbed": "Leeftijd (op moment van ophalen)",
|
"AgeWhenGrabbed": "Leeftijd (op moment van ophalen)",
|
||||||
"AlreadyInYourLibrary": "Reeds in uw bibliotheek",
|
"AlreadyInYourLibrary": "Reeds in uw bibliotheek",
|
||||||
@@ -78,18 +78,18 @@
|
|||||||
"DelayingDownloadUntilInterp": "Vertraag download tot {0} op {1}",
|
"DelayingDownloadUntilInterp": "Vertraag download tot {0} op {1}",
|
||||||
"Delete": "Verwijder",
|
"Delete": "Verwijder",
|
||||||
"DeleteBackup": "Verwijder Backup",
|
"DeleteBackup": "Verwijder Backup",
|
||||||
"DeleteBackupMessageText": "Bent u zeker dat u de veiligheidskopie '{0}' wilt verwijderen?",
|
"DeleteBackupMessageText": "Bent u zeker dat u de veiligheidskopie '{name}' wilt verwijderen?",
|
||||||
"DeleteDelayProfile": "Verwijder Vertragingsprofiel",
|
"DeleteDelayProfile": "Verwijder Vertragingsprofiel",
|
||||||
"DeleteDelayProfileMessageText": "Weet u zeker dat u dit vertragingsprofiel wilt verwijderen?",
|
"DeleteDelayProfileMessageText": "Weet u zeker dat u dit vertragingsprofiel wilt verwijderen?",
|
||||||
"DeleteDownloadClient": "Verwijder Downloader",
|
"DeleteDownloadClient": "Verwijder Downloader",
|
||||||
"DeleteDownloadClientMessageText": "Bent u zeker dat u de downloader '{0}' wilt verwijderen?",
|
"DeleteDownloadClientMessageText": "Bent u zeker dat u de downloader '{name}' wilt verwijderen?",
|
||||||
"DeleteEmptyFolders": "Verwijder lege mappen",
|
"DeleteEmptyFolders": "Verwijder lege mappen",
|
||||||
"DeleteEmptyFoldersHelpText": "Lege mappen verwijderen, tijdens de schijfscan en wanneer filmbestanden worden verwijderd",
|
"DeleteEmptyFoldersHelpText": "Lege mappen verwijderen, tijdens de schijfscan en wanneer filmbestanden worden verwijderd",
|
||||||
"DeleteImportListExclusion": "Verwijder van Uitzonderingenlijst",
|
"DeleteImportListExclusion": "Verwijder van Uitzonderingenlijst",
|
||||||
"DeleteImportListExclusionMessageText": "Bent u zeker dat u dit van de uitzonderingenlijst wilt verwijderen?",
|
"DeleteImportListExclusionMessageText": "Bent u zeker dat u dit van de uitzonderingenlijst wilt verwijderen?",
|
||||||
"DeleteImportListMessageText": "Bent u zeker dat u de lijst '{0}' wilt verwijderen?",
|
"DeleteImportListMessageText": "Bent u zeker dat u de lijst '{0}' wilt verwijderen?",
|
||||||
"DeleteIndexer": "Verwijder Indexeerder",
|
"DeleteIndexer": "Verwijder Indexeerder",
|
||||||
"DeleteIndexerMessageText": "Bent u zeker dat u de indexeerder '{0}' wilt verwijderen?",
|
"DeleteIndexerMessageText": "Bent u zeker dat u de indexeerder '{name}' wilt verwijderen?",
|
||||||
"DeleteMetadataProfileMessageText": "Bent u zeker dat u het kwaliteitsprofiel {name} wilt verwijderen?",
|
"DeleteMetadataProfileMessageText": "Bent u zeker dat u het kwaliteitsprofiel {name} wilt verwijderen?",
|
||||||
"DeleteNotification": "Verwijder Notificatie",
|
"DeleteNotification": "Verwijder Notificatie",
|
||||||
"DeleteNotificationMessageText": "Bent u zeker dat u de notificatie '{0}' wilt verwijderen?",
|
"DeleteNotificationMessageText": "Bent u zeker dat u de notificatie '{0}' wilt verwijderen?",
|
||||||
@@ -130,8 +130,6 @@
|
|||||||
"ErrorLoadingContents": "Fout bij laden van inhoud",
|
"ErrorLoadingContents": "Fout bij laden van inhoud",
|
||||||
"ErrorLoadingPreviews": "Fout bij laden van voorvertoningen",
|
"ErrorLoadingPreviews": "Fout bij laden van voorvertoningen",
|
||||||
"Exception": "Uitzondering",
|
"Exception": "Uitzondering",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Komma gescheiden lijst met extra bestanden om te importeren (.nfo zal als .nfo-orig worden geïmporteerd)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Voorbeelden: '.sub, .nfo' of 'sub,nfo'",
|
|
||||||
"FailedDownloadHandling": "Mislukte Download Afhandeling",
|
"FailedDownloadHandling": "Mislukte Download Afhandeling",
|
||||||
"FileDateHelpText": "Pas bestandsdatum aan tijdens het importeren/herscannen",
|
"FileDateHelpText": "Pas bestandsdatum aan tijdens het importeren/herscannen",
|
||||||
"FileManagement": "Bestandsbeheer",
|
"FileManagement": "Bestandsbeheer",
|
||||||
|
|||||||
@@ -149,8 +149,6 @@
|
|||||||
"ErrorLoadingContents": "Błąd podczas ładowania treści",
|
"ErrorLoadingContents": "Błąd podczas ładowania treści",
|
||||||
"ErrorLoadingPreviews": "Błąd podczas ładowania podglądów",
|
"ErrorLoadingPreviews": "Błąd podczas ładowania podglądów",
|
||||||
"Exception": "Wyjątek",
|
"Exception": "Wyjątek",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Rozdzielana przecinkami lista dodatkowych plików do zaimportowania (.nfo zostanie zaimportowane jako .nfo-orig)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Przykłady: „.sub, .nfo” lub „sub, nfo”",
|
|
||||||
"FailedDownloadHandling": "Nieudana obsługa pobierania",
|
"FailedDownloadHandling": "Nieudana obsługa pobierania",
|
||||||
"FileDateHelpText": "Zmień datę pliku przy imporcie / ponownym skanowaniu",
|
"FileDateHelpText": "Zmień datę pliku przy imporcie / ponownym skanowaniu",
|
||||||
"FileManagement": "Zarządzanie plikami",
|
"FileManagement": "Zarządzanie plikami",
|
||||||
@@ -676,5 +674,7 @@
|
|||||||
"Activity": "Aktywność",
|
"Activity": "Aktywność",
|
||||||
"AddNew": "Dodaj nowy",
|
"AddNew": "Dodaj nowy",
|
||||||
"Backup": "Kopia zapasowa",
|
"Backup": "Kopia zapasowa",
|
||||||
"AllResultsAreHiddenByTheAppliedFilter": "Wszystkie wyniki są ukrywane przez zastosowany filtr"
|
"AllResultsAreHiddenByTheAppliedFilter": "Wszystkie wyniki są ukrywane przez zastosowany filtr",
|
||||||
|
"ExtraFileExtensionsHelpText": "Rozdzielana przecinkami lista dodatkowych plików do zaimportowania (.nfo zostanie zaimportowane jako .nfo-orig)",
|
||||||
|
"ExtraFileExtensionsHelpTextsExamples": "Przykłady: „.sub, .nfo” lub „sub, nfo”"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -245,9 +245,7 @@
|
|||||||
"Ended": "Terminado",
|
"Ended": "Terminado",
|
||||||
"ErrorLoadingContents": "Erro ao carregar conteúdo",
|
"ErrorLoadingContents": "Erro ao carregar conteúdo",
|
||||||
"ErrorLoadingPreviews": "Erro ao carregar pré-visualizações",
|
"ErrorLoadingPreviews": "Erro ao carregar pré-visualizações",
|
||||||
"Exception": "Excepção",
|
"Exception": "Exceção",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Lista separada por vírgulas de ficheiros adicionais a importar (.nfo será importado como .nfo-orig)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Exemplos: \".sub, .nfo\" ou \"sub,nfo\"",
|
|
||||||
"FailedDownloadHandling": "Falha no processamento de transferências",
|
"FailedDownloadHandling": "Falha no processamento de transferências",
|
||||||
"ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "Para obter mais informações sobre cada indexador, clique nos botões de informação.",
|
"ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "Para obter mais informações sobre cada indexador, clique nos botões de informação.",
|
||||||
"ForMoreInformationOnTheIndividualListsClickOnTheInfoButtons": "Para obter mais informações sobre cada lista, clique nos botões de informação.",
|
"ForMoreInformationOnTheIndividualListsClickOnTheInfoButtons": "Para obter mais informações sobre cada lista, clique nos botões de informação.",
|
||||||
@@ -857,5 +855,7 @@
|
|||||||
"DeleteCondition": "Eliminar Condição",
|
"DeleteCondition": "Eliminar Condição",
|
||||||
"AppUpdatedVersion": "{appName} foi atualizado para a versão `{version}`, para obter as alterações mais recentes, você precisará recarregar {appName}",
|
"AppUpdatedVersion": "{appName} foi atualizado para a versão `{version}`, para obter as alterações mais recentes, você precisará recarregar {appName}",
|
||||||
"AutomaticUpdatesDisabledDocker": "As actualizações automáticas não são diretamente suportadas quando se utiliza o mecanismo de atualização do Docker. Terá de atualizar a imagem do contentor fora de {appName} ou utilizar um script",
|
"AutomaticUpdatesDisabledDocker": "As actualizações automáticas não são diretamente suportadas quando se utiliza o mecanismo de atualização do Docker. Terá de atualizar a imagem do contentor fora de {appName} ou utilizar um script",
|
||||||
"EditSelectedDownloadClients": "Editar Clientes de Transferência Selecionados"
|
"EditSelectedDownloadClients": "Editar Clientes de Transferência Selecionados",
|
||||||
|
"ApplyChanges": "Aplicar alterações",
|
||||||
|
"Backup": "Backup"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -148,8 +148,6 @@
|
|||||||
"ErrorLoadingContents": "Erro ao carregar o conteúdo",
|
"ErrorLoadingContents": "Erro ao carregar o conteúdo",
|
||||||
"ErrorLoadingPreviews": "Erro ao carregar as visualizações",
|
"ErrorLoadingPreviews": "Erro ao carregar as visualizações",
|
||||||
"Exception": "Exceção",
|
"Exception": "Exceção",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Lista separada por vírgulas de arquivos adicionais a importar (.nfo será importado como .nfo-orig)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Exemplos: \".sub, .nfo\" ou \"sub,nfo\"",
|
|
||||||
"FailedDownloadHandling": "Falha no gerenciamento de download",
|
"FailedDownloadHandling": "Falha no gerenciamento de download",
|
||||||
"FileDateHelpText": "Alterar a data do arquivo ao importar/verificar novamente",
|
"FileDateHelpText": "Alterar a data do arquivo ao importar/verificar novamente",
|
||||||
"FileManagement": "Gerenciamento de arquivo",
|
"FileManagement": "Gerenciamento de arquivo",
|
||||||
@@ -964,7 +962,7 @@
|
|||||||
"AutoAdd": "Adicionar automaticamente",
|
"AutoAdd": "Adicionar automaticamente",
|
||||||
"AutomaticAdd": "Adição Automática",
|
"AutomaticAdd": "Adição Automática",
|
||||||
"ApplyChanges": "Aplicar Mudanças",
|
"ApplyChanges": "Aplicar Mudanças",
|
||||||
"ApplyTagsHelpTextAdd": "Adicionar: adicione as tags à lista existente de tags",
|
"ApplyTagsHelpTextAdd": "Adicionar: Adicione as tags à lista existente de tags",
|
||||||
"ApplyTagsHelpTextRemove": "Remover: Remove as tags inseridas",
|
"ApplyTagsHelpTextRemove": "Remover: Remove as tags inseridas",
|
||||||
"ApplyTagsHelpTextReplace": "Substituir: Substitua as tags pelas tags inseridas (não digite nenhuma tag para limpar todas as tags)",
|
"ApplyTagsHelpTextReplace": "Substituir: Substitua as tags pelas tags inseridas (não digite nenhuma tag para limpar todas as tags)",
|
||||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Como aplicar tags aos clientes de download selecionados",
|
"ApplyTagsHelpTextHowToApplyDownloadClients": "Como aplicar tags aos clientes de download selecionados",
|
||||||
@@ -981,7 +979,7 @@
|
|||||||
"ExistingTag": "Tag existente",
|
"ExistingTag": "Tag existente",
|
||||||
"No": "Não",
|
"No": "Não",
|
||||||
"RemoveCompletedDownloads": "Remover downloads concluídos",
|
"RemoveCompletedDownloads": "Remover downloads concluídos",
|
||||||
"RemovingTag": "Removendo tag",
|
"RemovingTag": "Removendo a tag",
|
||||||
"SkipRedownloadHelpText": "Impede Readarr de tentar baixar versões alternativas para os itens removidos",
|
"SkipRedownloadHelpText": "Impede Readarr de tentar baixar versões alternativas para os itens removidos",
|
||||||
"IndexerDownloadClientHealthCheckMessage": "Indexadores com clientes de download inválidos: {0}.",
|
"IndexerDownloadClientHealthCheckMessage": "Indexadores com clientes de download inválidos: {0}.",
|
||||||
"Activity": "Atividade",
|
"Activity": "Atividade",
|
||||||
@@ -1021,5 +1019,7 @@
|
|||||||
"ErrorLoadingContent": "Ocorreu um erro ao carregar este conteúdo",
|
"ErrorLoadingContent": "Ocorreu um erro ao carregar este conteúdo",
|
||||||
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "O cliente de download {0} está configurado para remover downloads concluídos. Isso pode resultar na remoção dos downloads do seu cliente antes que {1} possa importá-los.",
|
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "O cliente de download {0} está configurado para remover downloads concluídos. Isso pode resultar na remoção dos downloads do seu cliente antes que {1} possa importá-los.",
|
||||||
"OnAuthorAdded": "Sobre o Autor Adicionado",
|
"OnAuthorAdded": "Sobre o Autor Adicionado",
|
||||||
"OnAuthorAddedHelpText": "Sobre o Autor Adicionado"
|
"OnAuthorAddedHelpText": "Sobre o Autor Adicionado",
|
||||||
|
"ExtraFileExtensionsHelpTextsExamples": "Exemplos: '.sub, .nfo' or 'sub,nfo'",
|
||||||
|
"ExtraFileExtensionsHelpText": "Lista separada por vírgulas de arquivos extras para importar (.nfo será importado como .nfo-orig)"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -185,8 +185,6 @@
|
|||||||
"ErrorLoadingContents": "Eroare la încărcarea conținutului",
|
"ErrorLoadingContents": "Eroare la încărcarea conținutului",
|
||||||
"ErrorLoadingPreviews": "Eroare la încărcarea previzualizărilor",
|
"ErrorLoadingPreviews": "Eroare la încărcarea previzualizărilor",
|
||||||
"Exception": "Excepție",
|
"Exception": "Excepție",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Lista separată prin virgulă a fișierelor suplimentare de importat (.nfo va fi importat ca .nfo-orig)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Exemple: „.sub, .nfo” sau „sub, nfo”",
|
|
||||||
"FailedDownloadHandling": "Procesarea descărcării a eșuat",
|
"FailedDownloadHandling": "Procesarea descărcării a eșuat",
|
||||||
"FileDateHelpText": "Schimbați data fișierului la import / rescanare",
|
"FileDateHelpText": "Schimbați data fișierului la import / rescanare",
|
||||||
"FileManagement": "Administrarea de fișiere",
|
"FileManagement": "Administrarea de fișiere",
|
||||||
@@ -644,5 +642,7 @@
|
|||||||
"AllResultsAreHiddenByTheAppliedFilter": "Toate rezultatele sunt ascunse de filtrul aplicat",
|
"AllResultsAreHiddenByTheAppliedFilter": "Toate rezultatele sunt ascunse de filtrul aplicat",
|
||||||
"Backup": "Copie de rezervă",
|
"Backup": "Copie de rezervă",
|
||||||
"AppUpdated": "{appName} actualizat",
|
"AppUpdated": "{appName} actualizat",
|
||||||
"BlocklistReleaseHelpText": "Împiedică Radarr să apuce automat această versiune din nou"
|
"BlocklistReleaseHelpText": "Împiedică Radarr să apuce automat această versiune din nou",
|
||||||
|
"ExtraFileExtensionsHelpText": "Lista separată prin virgulă a fișierelor suplimentare de importat (.nfo va fi importat ca .nfo-orig)",
|
||||||
|
"ExtraFileExtensionsHelpTextsExamples": "Exemple: „.sub, .nfo” sau „sub, nfo”"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -132,8 +132,6 @@
|
|||||||
"ErrorLoadingContents": "Ошибка при загрузке содержимого",
|
"ErrorLoadingContents": "Ошибка при загрузке содержимого",
|
||||||
"ErrorLoadingPreviews": "Ошибка при загрузке предпросмотра",
|
"ErrorLoadingPreviews": "Ошибка при загрузке предпросмотра",
|
||||||
"Exception": "Исключение",
|
"Exception": "Исключение",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Список экстра файлов для импорта разделенных двоеточием(.info будет заменено на .nfo-orig)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Например: '.sub, .nfo' или 'sub,nfo'",
|
|
||||||
"FailedDownloadHandling": "Неудачные обработки скачиваний",
|
"FailedDownloadHandling": "Неудачные обработки скачиваний",
|
||||||
"FileDateHelpText": "Заменить дату файла при импорте/сканировании",
|
"FileDateHelpText": "Заменить дату файла при импорте/сканировании",
|
||||||
"FileManagement": "Управление файлами",
|
"FileManagement": "Управление файлами",
|
||||||
|
|||||||
@@ -135,8 +135,6 @@
|
|||||||
"ErrorLoadingContents": "Fel vid inläsning av innehåll",
|
"ErrorLoadingContents": "Fel vid inläsning av innehåll",
|
||||||
"ErrorLoadingPreviews": "Fel vid inläsning av förhandsgranskningar",
|
"ErrorLoadingPreviews": "Fel vid inläsning av förhandsgranskningar",
|
||||||
"Exception": "Undantag",
|
"Exception": "Undantag",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Kommaseparerad lista med extra filer som ska importeras (.nfo importeras som .nfo-orig)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Exempel: '.sub, .nfo' eller 'sub,nfo'",
|
|
||||||
"FailedDownloadHandling": "Misslyckad nedladdningshantering",
|
"FailedDownloadHandling": "Misslyckad nedladdningshantering",
|
||||||
"FileDateHelpText": "Ändra fildatum vid import/omskanning",
|
"FileDateHelpText": "Ändra fildatum vid import/omskanning",
|
||||||
"FileManagement": "Filhantering",
|
"FileManagement": "Filhantering",
|
||||||
|
|||||||
@@ -136,8 +136,6 @@
|
|||||||
"ErrorLoadingContents": "เกิดข้อผิดพลาดในการโหลดเนื้อหา",
|
"ErrorLoadingContents": "เกิดข้อผิดพลาดในการโหลดเนื้อหา",
|
||||||
"ErrorLoadingPreviews": "เกิดข้อผิดพลาดในการโหลดตัวอย่าง",
|
"ErrorLoadingPreviews": "เกิดข้อผิดพลาดในการโหลดตัวอย่าง",
|
||||||
"Exception": "ข้อยกเว้น",
|
"Exception": "ข้อยกเว้น",
|
||||||
"ExtraFileExtensionsHelpTexts1": "รายการไฟล์พิเศษที่คั่นด้วยจุลภาคที่จะนำเข้า (.nfo จะนำเข้าเป็น. nfo-orig)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "ตัวอย่าง: \".sub, .nfo\" หรือ \"sub, nfo\"",
|
|
||||||
"FailedDownloadHandling": "การจัดการการดาวน์โหลดล้มเหลว",
|
"FailedDownloadHandling": "การจัดการการดาวน์โหลดล้มเหลว",
|
||||||
"FileDateHelpText": "เปลี่ยนวันที่ของไฟล์ในการนำเข้า / สแกนใหม่",
|
"FileDateHelpText": "เปลี่ยนวันที่ของไฟล์ในการนำเข้า / สแกนใหม่",
|
||||||
"FileManagement": "การจัดการไฟล์",
|
"FileManagement": "การจัดการไฟล์",
|
||||||
@@ -628,5 +626,7 @@
|
|||||||
"Large": "ใหญ่",
|
"Large": "ใหญ่",
|
||||||
"NextExecution": "การดำเนินการถัดไป",
|
"NextExecution": "การดำเนินการถัดไป",
|
||||||
"AllResultsAreHiddenByTheAppliedFilter": "ผลลัพธ์ทั้งหมดถูกซ่อนโดยตัวกรองที่ใช้",
|
"AllResultsAreHiddenByTheAppliedFilter": "ผลลัพธ์ทั้งหมดถูกซ่อนโดยตัวกรองที่ใช้",
|
||||||
"Medium": "ปานกลาง"
|
"Medium": "ปานกลาง",
|
||||||
|
"ExtraFileExtensionsHelpText": "รายการไฟล์พิเศษที่คั่นด้วยจุลภาคที่จะนำเข้า (.nfo จะนำเข้าเป็น. nfo-orig)",
|
||||||
|
"ExtraFileExtensionsHelpTextsExamples": "ตัวอย่าง: \".sub, .nfo\" หรือ \"sub, nfo\""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -129,8 +129,6 @@
|
|||||||
"ErrorLoadingContents": "İçerik yüklenirken hata oluştu",
|
"ErrorLoadingContents": "İçerik yüklenirken hata oluştu",
|
||||||
"ErrorLoadingPreviews": "Önizlemeler yüklenirken hata oluştu",
|
"ErrorLoadingPreviews": "Önizlemeler yüklenirken hata oluştu",
|
||||||
"Exception": "İstisna",
|
"Exception": "İstisna",
|
||||||
"ExtraFileExtensionsHelpTexts1": "İçe aktarılacak ekstra dosyaların virgülle ayrılmış listesi (.nfo, .nfo-orig olarak içe aktarılacaktır)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Örnekler: \".sub, .nfo\" veya \"sub, nfo\"",
|
|
||||||
"FailedDownloadHandling": "Başarısız İndirme İşlemi",
|
"FailedDownloadHandling": "Başarısız İndirme İşlemi",
|
||||||
"FileDateHelpText": "İçe aktarmada / yeniden taramada dosya tarihini değiştirin",
|
"FileDateHelpText": "İçe aktarmada / yeniden taramada dosya tarihini değiştirin",
|
||||||
"FileManagement": "Dosya idare",
|
"FileManagement": "Dosya idare",
|
||||||
@@ -631,5 +629,7 @@
|
|||||||
"AllResultsAreHiddenByTheAppliedFilter": "Tüm sonuçlar, uygulanan filtre tarafından gizlenir",
|
"AllResultsAreHiddenByTheAppliedFilter": "Tüm sonuçlar, uygulanan filtre tarafından gizlenir",
|
||||||
"Library": "kütüphane",
|
"Library": "kütüphane",
|
||||||
"MetadataProfile": "üstveri profili",
|
"MetadataProfile": "üstveri profili",
|
||||||
"MetadataProfiles": "üstveri profili"
|
"MetadataProfiles": "üstveri profili",
|
||||||
|
"ExtraFileExtensionsHelpText": "İçe aktarılacak ekstra dosyaların virgülle ayrılmış listesi (.nfo, .nfo-orig olarak içe aktarılacaktır)",
|
||||||
|
"ExtraFileExtensionsHelpTextsExamples": "Örnekler: \".sub, .nfo\" veya \"sub, nfo\""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,7 +134,6 @@
|
|||||||
"MinimumFreeSpaceWhenImportingHelpText": "Заборонити імпорт, якщо він залишить менше, ніж цей обсяг доступного дискового простору",
|
"MinimumFreeSpaceWhenImportingHelpText": "Заборонити імпорт, якщо він залишить менше, ніж цей обсяг доступного дискового простору",
|
||||||
"EnableInteractiveSearch": "Увімкнути інтерактивний пошук",
|
"EnableInteractiveSearch": "Увімкнути інтерактивний пошук",
|
||||||
"ErrorLoadingContents": "Помилка завантаження вмісту",
|
"ErrorLoadingContents": "Помилка завантаження вмісту",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Розділений комами список додаткових файлів для імпорту (.nfo буде імпортовано як .nfo-orig)",
|
|
||||||
"FileWasDeletedByUpgrade": "Файл видалено, щоб імпортувати оновлення",
|
"FileWasDeletedByUpgrade": "Файл видалено, щоб імпортувати оновлення",
|
||||||
"FirstDayOfWeek": "Перший день тижня",
|
"FirstDayOfWeek": "Перший день тижня",
|
||||||
"IndexerSearchCheckNoAvailableIndexersMessage": "Усі індексатори з можливістю пошуку тимчасово недоступні через нещодавні помилки індексатора",
|
"IndexerSearchCheckNoAvailableIndexersMessage": "Усі індексатори з можливістю пошуку тимчасово недоступні через нещодавні помилки індексатора",
|
||||||
@@ -466,7 +465,6 @@
|
|||||||
"UnmonitoredHelpText": "Включайте неконтрольовані фільми в канал iCal",
|
"UnmonitoredHelpText": "Включайте неконтрольовані фільми в канал iCal",
|
||||||
"Database": "База даних",
|
"Database": "База даних",
|
||||||
"DeleteSelectedBookFiles": "Видалити вибрані файли фільмів",
|
"DeleteSelectedBookFiles": "Видалити вибрані файли фільмів",
|
||||||
"ExtraFileExtensionsHelpTexts2": "Приклади: '.sub, .nfo' або 'sub,nfo'",
|
|
||||||
"ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Щоб отримати додаткові відомості про окремі клієнти для завантаження, натисніть кнопки додаткових відомостей.",
|
"ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Щоб отримати додаткові відомості про окремі клієнти для завантаження, натисніть кнопки додаткових відомостей.",
|
||||||
"ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "Щоб отримати додаткову інформацію про окремих індексаторів, натисніть кнопки інформації.",
|
"ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "Щоб отримати додаткову інформацію про окремих індексаторів, натисніть кнопки інформації.",
|
||||||
"ForMoreInformationOnTheIndividualListsClickOnTheInfoButtons": "Щоб отримати додаткову інформацію про окремі списки імпорту, натисніть інформаційні кнопки.",
|
"ForMoreInformationOnTheIndividualListsClickOnTheInfoButtons": "Щоб отримати додаткову інформацію про окремі списки імпорту, натисніть інформаційні кнопки.",
|
||||||
|
|||||||
@@ -132,8 +132,6 @@
|
|||||||
"ErrorLoadingContents": "Lỗi khi tải nội dung",
|
"ErrorLoadingContents": "Lỗi khi tải nội dung",
|
||||||
"ErrorLoadingPreviews": "Lỗi khi tải bản xem trước",
|
"ErrorLoadingPreviews": "Lỗi khi tải bản xem trước",
|
||||||
"Exception": "ngoại lệ",
|
"Exception": "ngoại lệ",
|
||||||
"ExtraFileExtensionsHelpTexts1": "Danh sách các tệp bổ sung cần nhập được phân tách bằng dấu phẩy (.nfo sẽ được nhập dưới dạng .nfo-orig)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "Ví dụ: '.sub, .nfo' hoặc 'sub, nfo'",
|
|
||||||
"FailedDownloadHandling": "Xử lý tải xuống không thành công",
|
"FailedDownloadHandling": "Xử lý tải xuống không thành công",
|
||||||
"FileDateHelpText": "Thay đổi ngày tệp khi nhập / quét lại",
|
"FileDateHelpText": "Thay đổi ngày tệp khi nhập / quét lại",
|
||||||
"FileManagement": "Quản lý tệp",
|
"FileManagement": "Quản lý tệp",
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
"AddingTag": "添加标签",
|
"AddingTag": "添加标签",
|
||||||
"AgeWhenGrabbed": "年龄(在被抓取后)",
|
"AgeWhenGrabbed": "年龄(在被抓取后)",
|
||||||
"AlreadyInYourLibrary": "已经在你的库中",
|
"AlreadyInYourLibrary": "已经在你的库中",
|
||||||
"AlternateTitles": "备选标题",
|
"AlternateTitles": "别名",
|
||||||
"Analytics": "分析",
|
"Analytics": "分析",
|
||||||
"AnalyticsEnabledHelpText": "发送匿名使用和错误信息到Readarr的服务器。这包括有关浏览器的信息、您使用的Readarr web页面、错误报告以及操作系统和运行时版本。我们将使用这些信息来确定功能和bug修复的优先级。",
|
"AnalyticsEnabledHelpText": "发送匿名使用和错误信息到Readarr的服务器。这包括有关浏览器的信息、您使用的Readarr web页面、错误报告以及操作系统和运行时版本。我们将使用这些信息来确定功能和bug修复的优先级。",
|
||||||
"AnalyticsEnabledHelpTextWarning": "需要重启生效",
|
"AnalyticsEnabledHelpTextWarning": "需要重启生效",
|
||||||
@@ -86,8 +86,8 @@
|
|||||||
"DeleteSelectedBookFiles": "删除选择的电影文件",
|
"DeleteSelectedBookFiles": "删除选择的电影文件",
|
||||||
"DeleteSelectedBookFilesMessageText": "您确定要删除选择的电影文件吗?",
|
"DeleteSelectedBookFilesMessageText": "您确定要删除选择的电影文件吗?",
|
||||||
"DeleteTagMessageText": "您确定要删除标签 '{0}' 吗?",
|
"DeleteTagMessageText": "您确定要删除标签 '{0}' 吗?",
|
||||||
"DestinationPath": "目的路径",
|
"DestinationPath": "目标路径",
|
||||||
"DetailedProgressBar": "详细的进度条",
|
"DetailedProgressBar": "详细进度条",
|
||||||
"DetailedProgressBarHelpText": "在进度条上显示文本",
|
"DetailedProgressBarHelpText": "在进度条上显示文本",
|
||||||
"DiskSpace": "硬盘空间",
|
"DiskSpace": "硬盘空间",
|
||||||
"Docker": "Docker",
|
"Docker": "Docker",
|
||||||
@@ -108,15 +108,13 @@
|
|||||||
"EnableCompletedDownloadHandlingHelpText": "自动从下载客户端导入已完成的下载内容",
|
"EnableCompletedDownloadHandlingHelpText": "自动从下载客户端导入已完成的下载内容",
|
||||||
"EnableHelpText": "启用此元数据类型的元数据文件创建",
|
"EnableHelpText": "启用此元数据类型的元数据文件创建",
|
||||||
"EnableInteractiveSearch": "启用手动搜索",
|
"EnableInteractiveSearch": "启用手动搜索",
|
||||||
"EnableRSS": "启用RSS",
|
"EnableRSS": "启用 RSS",
|
||||||
"EnableSSL": "启用SSL",
|
"EnableSSL": "启用 SSL",
|
||||||
"EnableSslHelpText": " 重启生效",
|
"EnableSslHelpText": " 重启生效",
|
||||||
"Ended": "已完结",
|
"Ended": "已完结",
|
||||||
"ErrorLoadingContents": "加载内容出错",
|
"ErrorLoadingContents": "加载内容出错",
|
||||||
"ErrorLoadingPreviews": "读取预告片错误",
|
"ErrorLoadingPreviews": "读取预告片错误",
|
||||||
"Exception": "例外",
|
"Exception": "例外",
|
||||||
"ExtraFileExtensionsHelpTexts1": "导入逗号分隔其他文件(.nfo将做为.nfo-orig被导入)",
|
|
||||||
"ExtraFileExtensionsHelpTexts2": "例:'.sub, .nfo' 或者 'sub,nfo'",
|
|
||||||
"FailedDownloadHandling": "下载失败处理",
|
"FailedDownloadHandling": "下载失败处理",
|
||||||
"FileDateHelpText": "导入和重新扫描时修改文件日期",
|
"FileDateHelpText": "导入和重新扫描时修改文件日期",
|
||||||
"FileManagement": "文件管理",
|
"FileManagement": "文件管理",
|
||||||
@@ -194,7 +192,7 @@
|
|||||||
"MinimumFreeSpace": "最小剩余空间",
|
"MinimumFreeSpace": "最小剩余空间",
|
||||||
"MinimumFreeSpaceWhenImportingHelpText": "如果导入的磁盘空间不足,则禁止导入",
|
"MinimumFreeSpaceWhenImportingHelpText": "如果导入的磁盘空间不足,则禁止导入",
|
||||||
"MinimumLimits": "最小限制",
|
"MinimumLimits": "最小限制",
|
||||||
"Missing": "缺少",
|
"Missing": "缺失",
|
||||||
"Mode": "模式",
|
"Mode": "模式",
|
||||||
"Monitored": "监控中",
|
"Monitored": "监控中",
|
||||||
"MoreInfo": "更多信息",
|
"MoreInfo": "更多信息",
|
||||||
@@ -326,7 +324,7 @@
|
|||||||
"ShowRelativeDatesHelpText": "显示相对日期(今天昨天等)或绝对日期",
|
"ShowRelativeDatesHelpText": "显示相对日期(今天昨天等)或绝对日期",
|
||||||
"ShowSearch": "显示搜索",
|
"ShowSearch": "显示搜索",
|
||||||
"ShowSearchActionHelpText": "在选项中显示搜索框",
|
"ShowSearchActionHelpText": "在选项中显示搜索框",
|
||||||
"ShowSizeOnDisk": "显示已用空间",
|
"ShowSizeOnDisk": "显示占用空间",
|
||||||
"ShownAboveEachColumnWhenWeekIsTheActiveView": "当使用周视图时显示上面的每一列",
|
"ShownAboveEachColumnWhenWeekIsTheActiveView": "当使用周视图时显示上面的每一列",
|
||||||
"Size": " 文件大小",
|
"Size": " 文件大小",
|
||||||
"SkipFreeSpaceCheck": "跳过剩余空间检查",
|
"SkipFreeSpaceCheck": "跳过剩余空间检查",
|
||||||
@@ -475,7 +473,7 @@
|
|||||||
"UnableToLoadBlocklist": "无法加载黑名单",
|
"UnableToLoadBlocklist": "无法加载黑名单",
|
||||||
"UnselectAll": "取消选择全部",
|
"UnselectAll": "取消选择全部",
|
||||||
"UpdateSelected": "更新已选",
|
"UpdateSelected": "更新已选",
|
||||||
"Wanted": "想要的",
|
"Wanted": "已追踪",
|
||||||
"All": "全部",
|
"All": "全部",
|
||||||
"Level": "等级",
|
"Level": "等级",
|
||||||
"RemoveFromBlocklist": "从黑名单中移除",
|
"RemoveFromBlocklist": "从黑名单中移除",
|
||||||
@@ -779,7 +777,6 @@
|
|||||||
"CalibreUsername": "Calibre用户名",
|
"CalibreUsername": "Calibre用户名",
|
||||||
"ChownGroup": "修改组权限",
|
"ChownGroup": "修改组权限",
|
||||||
"ContinuingAllBooksDownloaded": "仍在继续(所有书籍已下载)",
|
"ContinuingAllBooksDownloaded": "仍在继续(所有书籍已下载)",
|
||||||
"EnableProfile": "启用配置文件",
|
|
||||||
"IfYouDontAddAnImportListExclusionAndTheAuthorHasAMetadataProfileOtherThanNoneThenThisBookMayBeReaddedDuringTheNextAuthorRefresh": "如果您不添加导入列表排除,并且作者有除“无”之外的元数据配置文件,那么这本书可能会在下一次作者刷新期间重新添加。",
|
"IfYouDontAddAnImportListExclusionAndTheAuthorHasAMetadataProfileOtherThanNoneThenThisBookMayBeReaddedDuringTheNextAuthorRefresh": "如果您不添加导入列表排除,并且作者有除“无”之外的元数据配置文件,那么这本书可能会在下一次作者刷新期间重新添加。",
|
||||||
"IndexerIdHelpTextWarning": "使用带有首字母的特定索引器可能会导致复制版本被抓取",
|
"IndexerIdHelpTextWarning": "使用带有首字母的特定索引器可能会导致复制版本被抓取",
|
||||||
"MassBookSearchWarning": "您确定要对{0}本书进行批量书籍搜索吗?",
|
"MassBookSearchWarning": "您确定要对{0}本书进行批量书籍搜索吗?",
|
||||||
@@ -1021,5 +1018,6 @@
|
|||||||
"Library": "库",
|
"Library": "库",
|
||||||
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "下载客户端 {0} 已被设置为删除已完成的下载。这可能导致在 {1} 导入之前,已下载的文件会被从您的客户端中移除。",
|
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "下载客户端 {0} 已被设置为删除已完成的下载。这可能导致在 {1} 导入之前,已下载的文件会被从您的客户端中移除。",
|
||||||
"OnAuthorAddedHelpText": "作者添加时",
|
"OnAuthorAddedHelpText": "作者添加时",
|
||||||
"OnAuthorAdded": "作者添加时"
|
"OnAuthorAdded": "作者添加时",
|
||||||
|
"EnableProfile": "启用配置"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,6 +143,10 @@ namespace NzbDrone.Core.MediaCover
|
|||||||
DownloadCover(author, cover, serverFileHeaders.LastModified ?? DateTime.Now);
|
DownloadCover(author, cover, serverFileHeaders.LastModified ?? DateTime.Now);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (HttpException e)
|
||||||
|
{
|
||||||
|
_logger.Warn("Couldn't download media cover for {0}. {1}", author, e.Message);
|
||||||
|
}
|
||||||
catch (WebException e)
|
catch (WebException e)
|
||||||
{
|
{
|
||||||
_logger.Warn("Couldn't download media cover for {0}. {1}", author, e.Message);
|
_logger.Warn("Couldn't download media cover for {0}. {1}", author, e.Message);
|
||||||
@@ -193,6 +197,10 @@ namespace NzbDrone.Core.MediaCover
|
|||||||
DownloadBookCover(book, cover, serverFileHeaders.LastModified ?? DateTime.Now);
|
DownloadBookCover(book, cover, serverFileHeaders.LastModified ?? DateTime.Now);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (HttpException e)
|
||||||
|
{
|
||||||
|
_logger.Warn("Couldn't download media cover for {0}. {1}", book, e.Message);
|
||||||
|
}
|
||||||
catch (WebException e)
|
catch (WebException e)
|
||||||
{
|
{
|
||||||
_logger.Warn("Couldn't download media cover for {0}. {1}", book, e.Message);
|
_logger.Warn("Couldn't download media cover for {0}. {1}", book, e.Message);
|
||||||
|
|||||||
@@ -174,6 +174,12 @@ namespace NzbDrone.Core.MediaFiles
|
|||||||
|
|
||||||
var diff = ReadAudioTag(path).Diff(newTags);
|
var diff = ReadAudioTag(path).Diff(newTags);
|
||||||
|
|
||||||
|
if (!diff.Any())
|
||||||
|
{
|
||||||
|
_logger.Debug("No tags update for {0} due to no difference", trackfile);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
_rootFolderWatchingService.ReportFileSystemChangeBeginning(path);
|
_rootFolderWatchingService.ReportFileSystemChangeBeginning(path);
|
||||||
|
|
||||||
if (_configService.ScrubAudioTags)
|
if (_configService.ScrubAudioTags)
|
||||||
|
|||||||
@@ -115,7 +115,9 @@ namespace NzbDrone.Core.MediaFiles
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var bookFiles = _diskScanService.GetBookFiles(directoryInfo.FullName);
|
var bookFiles = _diskScanService.GetBookFiles(directoryInfo.FullName);
|
||||||
var rarFiles = _diskProvider.GetFiles(directoryInfo.FullName, true).Where(f => Path.GetExtension(f).Equals(".rar", StringComparison.OrdinalIgnoreCase));
|
var rarFiles = _diskProvider.GetFiles(directoryInfo.FullName, true).Where(f =>
|
||||||
|
Path.GetExtension(f).Equals(".rar",
|
||||||
|
StringComparison.OrdinalIgnoreCase));
|
||||||
|
|
||||||
foreach (var bookFile in bookFiles)
|
foreach (var bookFile in bookFiles)
|
||||||
{
|
{
|
||||||
@@ -144,6 +146,11 @@ namespace NzbDrone.Core.MediaFiles
|
|||||||
_logger.Debug(e, "Folder {0} has already been removed", directoryInfo.FullName);
|
_logger.Debug(e, "Folder {0} has already been removed", directoryInfo.FullName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
_logger.Debug(e, "Unable to determine whether folder {0} should be removed", directoryInfo.FullName);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<ImportResult> ProcessFolder(IDirectoryInfo directoryInfo, ImportMode importMode, DownloadClientItem downloadClientItem)
|
private List<ImportResult> ProcessFolder(IDirectoryInfo directoryInfo, ImportMode importMode, DownloadClientItem downloadClientItem)
|
||||||
|
|||||||
@@ -175,6 +175,12 @@ namespace NzbDrone.Core.MediaFiles
|
|||||||
}
|
}
|
||||||
|
|
||||||
var rootFolder = _rootFolderService.GetBestRootFolder(file.Path);
|
var rootFolder = _rootFolderService.GetBestRootFolder(file.Path);
|
||||||
|
|
||||||
|
if (rootFolder == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"File '{file.Path}' is not in a root folder.");
|
||||||
|
}
|
||||||
|
|
||||||
_calibre.SetFields(file, rootFolder.CalibreSettings, updateCover, embedMetadata);
|
_calibre.SetFields(file, rootFolder.CalibreSettings, updateCover, embedMetadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ namespace NzbDrone.Core.MediaFiles
|
|||||||
{
|
{
|
||||||
unwanted = combined
|
unwanted = combined
|
||||||
.Where(x => x.DiskFile.Length == x.DbFile.Size &&
|
.Where(x => x.DiskFile.Length == x.DbFile.Size &&
|
||||||
Math.Abs((x.DiskFile.LastWriteTimeUtc - x.DbFile.Modified).TotalSeconds) <= 1)
|
Math.Abs((x.DiskFile.LastWriteTimeUtc - x.DbFile.Modified.ToUniversalTime()).TotalSeconds) <= 1)
|
||||||
.Select(x => x.DiskFile)
|
.Select(x => x.DiskFile)
|
||||||
.ToList();
|
.ToList();
|
||||||
_logger.Trace($"{unwanted.Count} unchanged existing files");
|
_logger.Trace($"{unwanted.Count} unchanged existing files");
|
||||||
@@ -138,7 +138,7 @@ namespace NzbDrone.Core.MediaFiles
|
|||||||
{
|
{
|
||||||
unwanted = combined
|
unwanted = combined
|
||||||
.Where(x => x.DiskFile.Length == x.DbFile.Size &&
|
.Where(x => x.DiskFile.Length == x.DbFile.Size &&
|
||||||
Math.Abs((x.DiskFile.LastWriteTimeUtc - x.DbFile.Modified).TotalSeconds) <= 1 &&
|
Math.Abs((x.DiskFile.LastWriteTimeUtc - x.DbFile.Modified.ToUniversalTime()).TotalSeconds) <= 1 &&
|
||||||
(x.DbFile.Edition == null || (x.DbFile.Edition.IsLoaded && x.DbFile.Edition.Value != null)))
|
(x.DbFile.Edition == null || (x.DbFile.Edition.IsLoaded && x.DbFile.Edition.Value != null)))
|
||||||
.Select(x => x.DiskFile)
|
.Select(x => x.DiskFile)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|||||||
@@ -183,7 +183,7 @@ namespace NzbDrone.Core.MediaFiles
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_logger.Error(ex, "Error in Directory watcher for: {0}" + dw.Path);
|
_logger.Error(ex, "Error in Directory watcher for: {0}", dw.Path);
|
||||||
|
|
||||||
DisposeWatcher(dw, true);
|
DisposeWatcher(dw, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,79 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using FluentValidation.Results;
|
|
||||||
using NzbDrone.Common.Extensions;
|
|
||||||
using NzbDrone.Core.Books;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Notifications.Boxcar
|
|
||||||
{
|
|
||||||
public class Boxcar : NotificationBase<BoxcarSettings>
|
|
||||||
{
|
|
||||||
private readonly IBoxcarProxy _proxy;
|
|
||||||
|
|
||||||
public Boxcar(IBoxcarProxy proxy)
|
|
||||||
{
|
|
||||||
_proxy = proxy;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string Link => "https://boxcar.io/client";
|
|
||||||
public override string Name => "Boxcar";
|
|
||||||
|
|
||||||
public override void OnGrab(GrabMessage grabMessage)
|
|
||||||
{
|
|
||||||
_proxy.SendNotification(BOOK_GRABBED_TITLE, grabMessage.Message, Settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnReleaseImport(BookDownloadMessage message)
|
|
||||||
{
|
|
||||||
_proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnAuthorAdded(Author author)
|
|
||||||
{
|
|
||||||
_proxy.SendNotification(AUTHOR_ADDED_TITLE, author.Name, Settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
|
|
||||||
{
|
|
||||||
_proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnBookDelete(BookDeleteMessage deleteMessage)
|
|
||||||
{
|
|
||||||
_proxy.SendNotification(BOOK_DELETED_TITLE, deleteMessage.Message, Settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnBookFileDelete(BookFileDeleteMessage deleteMessage)
|
|
||||||
{
|
|
||||||
_proxy.SendNotification(BOOK_FILE_DELETED_TITLE, deleteMessage.Message, Settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnHealthIssue(HealthCheck.HealthCheck message)
|
|
||||||
{
|
|
||||||
_proxy.SendNotification(HEALTH_ISSUE_TITLE, message.Message, Settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnDownloadFailure(DownloadFailedMessage message)
|
|
||||||
{
|
|
||||||
_proxy.SendNotification(DOWNLOAD_FAILURE_TITLE, message.Message, Settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnImportFailure(BookDownloadMessage message)
|
|
||||||
{
|
|
||||||
_proxy.SendNotification(IMPORT_FAILURE_TITLE, message.Message, Settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnApplicationUpdate(ApplicationUpdateMessage message)
|
|
||||||
{
|
|
||||||
_proxy.SendNotification(APPLICATION_UPDATE_TITLE, message.Message, Settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override ValidationResult Test()
|
|
||||||
{
|
|
||||||
var failures = new List<ValidationFailure>();
|
|
||||||
|
|
||||||
failures.AddIfNotNull(_proxy.Test(Settings));
|
|
||||||
|
|
||||||
return new ValidationResult(failures);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user