mirror of
https://github.com/lidarr/lidarr.git
synced 2025-07-07 21:42:16 -07:00
Compare commits
No commits in common. "develop" and "v2.12.0.4633" have entirely different histories.
develop
...
v2.12.0.46
77 changed files with 203 additions and 690 deletions
28
.gitignore
vendored
28
.gitignore
vendored
|
@ -158,12 +158,34 @@ Thumbs.db
|
||||||
/tools/Addins/*
|
/tools/Addins/*
|
||||||
packages.config.md5sum
|
packages.config.md5sum
|
||||||
|
|
||||||
|
|
||||||
|
# Common IntelliJ Platform excludes
|
||||||
|
|
||||||
|
# User specific
|
||||||
|
**/.idea/**/workspace.xml
|
||||||
|
**/.idea/**/tasks.xml
|
||||||
|
**/.idea/shelf/*
|
||||||
|
**/.idea/dictionaries
|
||||||
|
**/.idea/.idea.Radarr.Posix
|
||||||
|
**/.idea/.idea.Radarr.Windows
|
||||||
|
|
||||||
|
# Sensitive or high-churn files
|
||||||
|
**/.idea/**/dataSources/
|
||||||
|
**/.idea/**/dataSources.ids
|
||||||
|
**/.idea/**/dataSources.xml
|
||||||
|
**/.idea/**/dataSources.local.xml
|
||||||
|
**/.idea/**/sqlDataSources.xml
|
||||||
|
**/.idea/**/dynamic.xml
|
||||||
|
|
||||||
|
# Rider
|
||||||
|
# Rider auto-generates .iml files, and contentModel.xml
|
||||||
|
**/.idea/**/*.iml
|
||||||
|
**/.idea/**/contentModel.xml
|
||||||
|
**/.idea/**/modules.xml
|
||||||
|
|
||||||
# ignore node_modules symlink
|
# ignore node_modules symlink
|
||||||
node_modules
|
node_modules
|
||||||
node_modules.nosync
|
node_modules.nosync
|
||||||
|
|
||||||
# API doc generation
|
# API doc generation
|
||||||
.config/
|
.config/
|
||||||
|
|
||||||
# Ignore Jetbrains IntelliJ Workspace Directories
|
|
||||||
.idea/
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ variables:
|
||||||
testsFolder: './_tests'
|
testsFolder: './_tests'
|
||||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||||
majorVersion: '2.13.1'
|
majorVersion: '2.12.0'
|
||||||
minorVersion: $[counter('minorVersion', 1076)]
|
minorVersion: $[counter('minorVersion', 1076)]
|
||||||
lidarrVersion: '$(majorVersion).$(minorVersion)'
|
lidarrVersion: '$(majorVersion).$(minorVersion)'
|
||||||
buildName: '$(Build.SourceBranchName).$(lidarrVersion)'
|
buildName: '$(Build.SourceBranchName).$(lidarrVersion)'
|
||||||
|
|
|
@ -224,58 +224,10 @@ class SignalRConnector extends Component {
|
||||||
repopulatePage('trackFileUpdated');
|
repopulatePage('trackFileUpdated');
|
||||||
};
|
};
|
||||||
|
|
||||||
handleDownloadclient = ({ action, resource }) => {
|
|
||||||
const section = 'settings.downloadClients';
|
|
||||||
|
|
||||||
if (action === 'created' || action === 'updated') {
|
|
||||||
this.props.dispatchUpdateItem({ section, ...resource });
|
|
||||||
} else if (action === 'deleted') {
|
|
||||||
this.props.dispatchRemoveItem({ section, id: resource.id });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
handleHealth = () => {
|
handleHealth = () => {
|
||||||
this.props.dispatchFetchHealth();
|
this.props.dispatchFetchHealth();
|
||||||
};
|
};
|
||||||
|
|
||||||
handleImportlist = ({ action, resource }) => {
|
|
||||||
const section = 'settings.importLists';
|
|
||||||
|
|
||||||
if (action === 'created' || action === 'updated') {
|
|
||||||
this.props.dispatchUpdateItem({ section, ...resource });
|
|
||||||
} else if (action === 'deleted') {
|
|
||||||
this.props.dispatchRemoveItem({ section, id: resource.id });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
handleIndexer = ({ action, resource }) => {
|
|
||||||
const section = 'settings.indexers';
|
|
||||||
|
|
||||||
if (action === 'created' || action === 'updated') {
|
|
||||||
this.props.dispatchUpdateItem({ section, ...resource });
|
|
||||||
} else if (action === 'deleted') {
|
|
||||||
this.props.dispatchRemoveItem({ section, id: resource.id });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
handleMetadata = ({ action, resource }) => {
|
|
||||||
const section = 'settings.metadata';
|
|
||||||
|
|
||||||
if (action === 'updated') {
|
|
||||||
this.props.dispatchUpdateItem({ section, ...resource });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
handleNotification = ({ action, resource }) => {
|
|
||||||
const section = 'settings.notifications';
|
|
||||||
|
|
||||||
if (action === 'created' || action === 'updated') {
|
|
||||||
this.props.dispatchUpdateItem({ section, ...resource });
|
|
||||||
} else if (action === 'deleted') {
|
|
||||||
this.props.dispatchRemoveItem({ section, id: resource.id });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
handleArtist = (body) => {
|
handleArtist = (body) => {
|
||||||
const action = body.action;
|
const action = body.action;
|
||||||
const section = 'artist';
|
const section = 'artist';
|
||||||
|
|
|
@ -94,9 +94,9 @@ class RootFolder extends Component {
|
||||||
<ConfirmModal
|
<ConfirmModal
|
||||||
isOpen={this.state.isDeleteRootFolderModalOpen}
|
isOpen={this.state.isDeleteRootFolderModalOpen}
|
||||||
kind={kinds.DANGER}
|
kind={kinds.DANGER}
|
||||||
title={translate('RemoveRootFolder')}
|
title={translate('DeleteRootFolder')}
|
||||||
message={translate('RemoveRootFolderArtistsMessageText', { name })}
|
message={translate('DeleteRootFolderMessageText', { name })}
|
||||||
confirmLabel={translate('Remove')}
|
confirmLabel={translate('Delete')}
|
||||||
onConfirm={this.onConfirmDeleteRootFolder}
|
onConfirm={this.onConfirmDeleteRootFolder}
|
||||||
onCancel={this.onDeleteRootFolderModalClose}
|
onCancel={this.onDeleteRootFolderModalClose}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
height: 20px;
|
height: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.track {
|
.bar {
|
||||||
top: 9px;
|
top: 9px;
|
||||||
margin: 0 5px;
|
margin: 0 5px;
|
||||||
height: 3px;
|
height: 3px;
|
||||||
|
@ -36,7 +36,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.thumb {
|
.handle {
|
||||||
top: 1px;
|
top: 1px;
|
||||||
z-index: 0 !important;
|
z-index: 0 !important;
|
||||||
width: 18px;
|
width: 18px;
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
// This file is automatically generated.
|
// This file is automatically generated.
|
||||||
// Please do not change this file!
|
// Please do not change this file!
|
||||||
interface CssExports {
|
interface CssExports {
|
||||||
|
'bar': string;
|
||||||
|
'handle': string;
|
||||||
'kilobitsPerSecond': string;
|
'kilobitsPerSecond': string;
|
||||||
'quality': string;
|
'quality': string;
|
||||||
'qualityDefinition': string;
|
'qualityDefinition': string;
|
||||||
|
@ -8,9 +10,7 @@ interface CssExports {
|
||||||
'sizeLimit': string;
|
'sizeLimit': string;
|
||||||
'sizes': string;
|
'sizes': string;
|
||||||
'slider': string;
|
'slider': string;
|
||||||
'thumb': string;
|
|
||||||
'title': string;
|
'title': string;
|
||||||
'track': string;
|
|
||||||
}
|
}
|
||||||
export const cssExports: CssExports;
|
export const cssExports: CssExports;
|
||||||
export default cssExports;
|
export default cssExports;
|
||||||
|
|
|
@ -55,27 +55,6 @@ class QualityDefinition extends Component {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Control
|
|
||||||
|
|
||||||
trackRenderer(props, state) {
|
|
||||||
return (
|
|
||||||
<div
|
|
||||||
{...props}
|
|
||||||
className={styles.track}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
thumbRenderer(props, state) {
|
|
||||||
return (
|
|
||||||
<div
|
|
||||||
{...props}
|
|
||||||
className={styles.thumb}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Listeners
|
// Listeners
|
||||||
|
|
||||||
|
@ -195,7 +174,6 @@ class QualityDefinition extends Component {
|
||||||
|
|
||||||
<div className={styles.sizeLimit}>
|
<div className={styles.sizeLimit}>
|
||||||
<ReactSlider
|
<ReactSlider
|
||||||
className={styles.slider}
|
|
||||||
min={slider.min}
|
min={slider.min}
|
||||||
max={slider.max}
|
max={slider.max}
|
||||||
step={slider.step}
|
step={slider.step}
|
||||||
|
@ -204,9 +182,9 @@ class QualityDefinition extends Component {
|
||||||
withTracks={true}
|
withTracks={true}
|
||||||
allowCross={false}
|
allowCross={false}
|
||||||
snapDragDisabled={true}
|
snapDragDisabled={true}
|
||||||
pearling={true}
|
className={styles.slider}
|
||||||
renderThumb={this.thumbRenderer}
|
trackClassName={styles.bar}
|
||||||
renderTrack={this.trackRenderer}
|
thumbClassName={styles.handle}
|
||||||
onChange={this.onSliderChange}
|
onChange={this.onSliderChange}
|
||||||
onAfterChange={this.onAfterSliderChange}
|
onAfterChange={this.onAfterSliderChange}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -151,7 +151,7 @@ export const defaultState = {
|
||||||
{
|
{
|
||||||
name: 'genres',
|
name: 'genres',
|
||||||
label: () => translate('Genres'),
|
label: () => translate('Genres'),
|
||||||
isSortable: true,
|
isSortable: false,
|
||||||
isVisible: false
|
isVisible: false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
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 Alert from 'Components/Alert';
|
||||||
|
import Link from 'Components/Link/Link';
|
||||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||||
import InlineMarkdown from 'Components/Markdown/InlineMarkdown';
|
|
||||||
import PageContent from 'Components/Page/PageContent';
|
import PageContent from 'Components/Page/PageContent';
|
||||||
import PageContentBody from 'Components/Page/PageContentBody';
|
import PageContentBody from 'Components/Page/PageContentBody';
|
||||||
import PageToolbar from 'Components/Page/Toolbar/PageToolbar';
|
import PageToolbar from 'Components/Page/Toolbar/PageToolbar';
|
||||||
|
@ -77,16 +77,15 @@ class LogFiles extends Component {
|
||||||
<PageContentBody>
|
<PageContentBody>
|
||||||
<Alert>
|
<Alert>
|
||||||
<div>
|
<div>
|
||||||
{translate('LogFilesLocation', {
|
Log files are located in: {location}
|
||||||
location
|
|
||||||
})}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{currentLogView === 'Log Files' ? (
|
{
|
||||||
|
currentLogView === 'Log Files' &&
|
||||||
<div>
|
<div>
|
||||||
<InlineMarkdown data={translate('TheLogLevelDefault')} />
|
The log level defaults to 'Info' and can be changed in <Link to="/settings/general">General Settings</Link>
|
||||||
</div>
|
</div>
|
||||||
) : null}
|
}
|
||||||
</Alert>
|
</Alert>
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
|
@ -270,7 +270,7 @@ function Updates() {
|
||||||
|
|
||||||
{generalSettingsError ? (
|
{generalSettingsError ? (
|
||||||
<Alert kind={kinds.DANGER}>
|
<Alert kind={kinds.DANGER}>
|
||||||
{translate('FailedToFetchSettings')}
|
{translate('FailedToUpdateSettings')}
|
||||||
</Alert>
|
</Alert>
|
||||||
) : null}
|
) : null}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
using FluentValidation;
|
using FluentValidation;
|
||||||
using Lidarr.Http;
|
using Lidarr.Http;
|
||||||
using NzbDrone.Core.Download;
|
using NzbDrone.Core.Download;
|
||||||
using NzbDrone.SignalR;
|
|
||||||
|
|
||||||
namespace Lidarr.Api.V1.DownloadClient
|
namespace Lidarr.Api.V1.DownloadClient
|
||||||
{
|
{
|
||||||
|
@ -11,8 +10,8 @@ namespace Lidarr.Api.V1.DownloadClient
|
||||||
public static readonly DownloadClientResourceMapper ResourceMapper = new ();
|
public static readonly DownloadClientResourceMapper ResourceMapper = new ();
|
||||||
public static readonly DownloadClientBulkResourceMapper BulkResourceMapper = new ();
|
public static readonly DownloadClientBulkResourceMapper BulkResourceMapper = new ();
|
||||||
|
|
||||||
public DownloadClientController(IBroadcastSignalRMessage signalRBroadcaster, IDownloadClientFactory downloadClientFactory)
|
public DownloadClientController(IDownloadClientFactory downloadClientFactory)
|
||||||
: base(signalRBroadcaster, downloadClientFactory, "downloadclient", ResourceMapper, BulkResourceMapper)
|
: base(downloadClientFactory, "downloadclient", ResourceMapper, BulkResourceMapper)
|
||||||
{
|
{
|
||||||
SharedValidator.RuleFor(c => c.Priority).InclusiveBetween(1, 50);
|
SharedValidator.RuleFor(c => c.Priority).InclusiveBetween(1, 50);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,6 @@ using Lidarr.Http;
|
||||||
using NzbDrone.Core.ImportLists;
|
using NzbDrone.Core.ImportLists;
|
||||||
using NzbDrone.Core.Validation;
|
using NzbDrone.Core.Validation;
|
||||||
using NzbDrone.Core.Validation.Paths;
|
using NzbDrone.Core.Validation.Paths;
|
||||||
using NzbDrone.SignalR;
|
|
||||||
|
|
||||||
namespace Lidarr.Api.V1.ImportLists
|
namespace Lidarr.Api.V1.ImportLists
|
||||||
{
|
{
|
||||||
|
@ -13,12 +12,11 @@ namespace Lidarr.Api.V1.ImportLists
|
||||||
public static readonly ImportListResourceMapper ResourceMapper = new ();
|
public static readonly ImportListResourceMapper ResourceMapper = new ();
|
||||||
public static readonly ImportListBulkResourceMapper BulkResourceMapper = new ();
|
public static readonly ImportListBulkResourceMapper BulkResourceMapper = new ();
|
||||||
|
|
||||||
public ImportListController(IBroadcastSignalRMessage signalRBroadcaster,
|
public ImportListController(IImportListFactory importListFactory,
|
||||||
IImportListFactory importListFactory,
|
|
||||||
RootFolderExistsValidator rootFolderExistsValidator,
|
RootFolderExistsValidator rootFolderExistsValidator,
|
||||||
QualityProfileExistsValidator qualityProfileExistsValidator,
|
QualityProfileExistsValidator qualityProfileExistsValidator,
|
||||||
MetadataProfileExistsValidator metadataProfileExistsValidator)
|
MetadataProfileExistsValidator metadataProfileExistsValidator)
|
||||||
: base(signalRBroadcaster, importListFactory, "importlist", ResourceMapper, BulkResourceMapper)
|
: base(importListFactory, "importlist", ResourceMapper, BulkResourceMapper)
|
||||||
{
|
{
|
||||||
SharedValidator.RuleFor(c => c.RootFolderPath).Cascade(CascadeMode.Stop)
|
SharedValidator.RuleFor(c => c.RootFolderPath).Cascade(CascadeMode.Stop)
|
||||||
.IsValidPath()
|
.IsValidPath()
|
||||||
|
|
|
@ -2,7 +2,6 @@ using FluentValidation;
|
||||||
using Lidarr.Http;
|
using Lidarr.Http;
|
||||||
using NzbDrone.Core.Indexers;
|
using NzbDrone.Core.Indexers;
|
||||||
using NzbDrone.Core.Validation;
|
using NzbDrone.Core.Validation;
|
||||||
using NzbDrone.SignalR;
|
|
||||||
|
|
||||||
namespace Lidarr.Api.V1.Indexers
|
namespace Lidarr.Api.V1.Indexers
|
||||||
{
|
{
|
||||||
|
@ -12,10 +11,8 @@ namespace Lidarr.Api.V1.Indexers
|
||||||
public static readonly IndexerResourceMapper ResourceMapper = new ();
|
public static readonly IndexerResourceMapper ResourceMapper = new ();
|
||||||
public static readonly IndexerBulkResourceMapper BulkResourceMapper = new ();
|
public static readonly IndexerBulkResourceMapper BulkResourceMapper = new ();
|
||||||
|
|
||||||
public IndexerController(IBroadcastSignalRMessage signalRBroadcaster,
|
public IndexerController(IndexerFactory indexerFactory, DownloadClientExistsValidator downloadClientExistsValidator)
|
||||||
IndexerFactory indexerFactory,
|
: base(indexerFactory, "indexer", ResourceMapper, BulkResourceMapper)
|
||||||
DownloadClientExistsValidator downloadClientExistsValidator)
|
|
||||||
: base(signalRBroadcaster, indexerFactory, "indexer", ResourceMapper, BulkResourceMapper)
|
|
||||||
{
|
{
|
||||||
SharedValidator.RuleFor(c => c.Priority).InclusiveBetween(1, 50);
|
SharedValidator.RuleFor(c => c.Priority).InclusiveBetween(1, 50);
|
||||||
SharedValidator.RuleFor(c => c.DownloadClientId).SetValidator(downloadClientExistsValidator);
|
SharedValidator.RuleFor(c => c.DownloadClientId).SetValidator(downloadClientExistsValidator);
|
||||||
|
|
|
@ -2,7 +2,6 @@ using System;
|
||||||
using Lidarr.Http;
|
using Lidarr.Http;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using NzbDrone.Core.Extras.Metadata;
|
using NzbDrone.Core.Extras.Metadata;
|
||||||
using NzbDrone.SignalR;
|
|
||||||
|
|
||||||
namespace Lidarr.Api.V1.Metadata
|
namespace Lidarr.Api.V1.Metadata
|
||||||
{
|
{
|
||||||
|
@ -12,8 +11,8 @@ namespace Lidarr.Api.V1.Metadata
|
||||||
public static readonly MetadataResourceMapper ResourceMapper = new ();
|
public static readonly MetadataResourceMapper ResourceMapper = new ();
|
||||||
public static readonly MetadataBulkResourceMapper BulkResourceMapper = new ();
|
public static readonly MetadataBulkResourceMapper BulkResourceMapper = new ();
|
||||||
|
|
||||||
public MetadataController(IBroadcastSignalRMessage signalRBroadcaster, IMetadataFactory metadataFactory)
|
public MetadataController(IMetadataFactory metadataFactory)
|
||||||
: base(signalRBroadcaster, metadataFactory, "metadata", ResourceMapper, BulkResourceMapper)
|
: base(metadataFactory, "metadata", ResourceMapper, BulkResourceMapper)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,6 @@ using System;
|
||||||
using Lidarr.Http;
|
using Lidarr.Http;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using NzbDrone.Core.Notifications;
|
using NzbDrone.Core.Notifications;
|
||||||
using NzbDrone.SignalR;
|
|
||||||
|
|
||||||
namespace Lidarr.Api.V1.Notifications
|
namespace Lidarr.Api.V1.Notifications
|
||||||
{
|
{
|
||||||
|
@ -12,8 +11,8 @@ namespace Lidarr.Api.V1.Notifications
|
||||||
public static readonly NotificationResourceMapper ResourceMapper = new ();
|
public static readonly NotificationResourceMapper ResourceMapper = new ();
|
||||||
public static readonly NotificationBulkResourceMapper BulkResourceMapper = new ();
|
public static readonly NotificationBulkResourceMapper BulkResourceMapper = new ();
|
||||||
|
|
||||||
public NotificationController(IBroadcastSignalRMessage signalRBroadcaster, NotificationFactory notificationFactory)
|
public NotificationController(NotificationFactory notificationFactory)
|
||||||
: base(signalRBroadcaster, notificationFactory, "notification", ResourceMapper, BulkResourceMapper)
|
: base(notificationFactory, "notification", ResourceMapper, BulkResourceMapper)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,19 +7,12 @@ using Lidarr.Http.REST.Attributes;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using NzbDrone.Common.Extensions;
|
using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Serializer;
|
using NzbDrone.Common.Serializer;
|
||||||
using NzbDrone.Core.Datastore.Events;
|
|
||||||
using NzbDrone.Core.Messaging.Events;
|
|
||||||
using NzbDrone.Core.ThingiProvider;
|
using NzbDrone.Core.ThingiProvider;
|
||||||
using NzbDrone.Core.ThingiProvider.Events;
|
|
||||||
using NzbDrone.Core.Validation;
|
using NzbDrone.Core.Validation;
|
||||||
using NzbDrone.SignalR;
|
|
||||||
|
|
||||||
namespace Lidarr.Api.V1
|
namespace Lidarr.Api.V1
|
||||||
{
|
{
|
||||||
public abstract class ProviderControllerBase<TProviderResource, TBulkProviderResource, TProvider, TProviderDefinition> : RestControllerWithSignalR<TProviderResource, TProviderDefinition>,
|
public abstract class ProviderControllerBase<TProviderResource, TBulkProviderResource, TProvider, TProviderDefinition> : RestController<TProviderResource>
|
||||||
IHandle<ProviderAddedEvent<TProvider>>,
|
|
||||||
IHandle<ProviderUpdatedEvent<TProvider>>,
|
|
||||||
IHandle<ProviderDeletedEvent<TProvider>>
|
|
||||||
where TProviderDefinition : ProviderDefinition, new()
|
where TProviderDefinition : ProviderDefinition, new()
|
||||||
where TProvider : IProvider
|
where TProvider : IProvider
|
||||||
where TProviderResource : ProviderResource<TProviderResource>, new()
|
where TProviderResource : ProviderResource<TProviderResource>, new()
|
||||||
|
@ -29,13 +22,11 @@ namespace Lidarr.Api.V1
|
||||||
private readonly ProviderResourceMapper<TProviderResource, TProviderDefinition> _resourceMapper;
|
private readonly ProviderResourceMapper<TProviderResource, TProviderDefinition> _resourceMapper;
|
||||||
private readonly ProviderBulkResourceMapper<TBulkProviderResource, TProviderDefinition> _bulkResourceMapper;
|
private readonly ProviderBulkResourceMapper<TBulkProviderResource, TProviderDefinition> _bulkResourceMapper;
|
||||||
|
|
||||||
protected ProviderControllerBase(IBroadcastSignalRMessage signalRBroadcaster,
|
protected ProviderControllerBase(IProviderFactory<TProvider,
|
||||||
IProviderFactory<TProvider,
|
|
||||||
TProviderDefinition> providerFactory,
|
TProviderDefinition> providerFactory,
|
||||||
string resource,
|
string resource,
|
||||||
ProviderResourceMapper<TProviderResource, TProviderDefinition> resourceMapper,
|
ProviderResourceMapper<TProviderResource, TProviderDefinition> resourceMapper,
|
||||||
ProviderBulkResourceMapper<TBulkProviderResource, TProviderDefinition> bulkResourceMapper)
|
ProviderBulkResourceMapper<TBulkProviderResource, TProviderDefinition> bulkResourceMapper)
|
||||||
: base(signalRBroadcaster)
|
|
||||||
{
|
{
|
||||||
_providerFactory = providerFactory;
|
_providerFactory = providerFactory;
|
||||||
_resourceMapper = resourceMapper;
|
_resourceMapper = resourceMapper;
|
||||||
|
@ -270,24 +261,6 @@ namespace Lidarr.Api.V1
|
||||||
return Content(data.ToJson(), "application/json");
|
return Content(data.ToJson(), "application/json");
|
||||||
}
|
}
|
||||||
|
|
||||||
[NonAction]
|
|
||||||
public virtual void Handle(ProviderAddedEvent<TProvider> message)
|
|
||||||
{
|
|
||||||
BroadcastResourceChange(ModelAction.Created, message.Definition.Id);
|
|
||||||
}
|
|
||||||
|
|
||||||
[NonAction]
|
|
||||||
public virtual void Handle(ProviderUpdatedEvent<TProvider> message)
|
|
||||||
{
|
|
||||||
BroadcastResourceChange(ModelAction.Updated, message.Definition.Id);
|
|
||||||
}
|
|
||||||
|
|
||||||
[NonAction]
|
|
||||||
public virtual void Handle(ProviderDeletedEvent<TProvider> message)
|
|
||||||
{
|
|
||||||
BroadcastResourceChange(ModelAction.Deleted, message.ProviderId);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual void Validate(TProviderDefinition definition, bool includeWarnings)
|
protected virtual void Validate(TProviderDefinition definition, bool includeWarnings)
|
||||||
{
|
{
|
||||||
var validationResult = definition.Settings.Validate();
|
var validationResult = definition.Settings.Validate();
|
||||||
|
|
|
@ -4,7 +4,6 @@ using Lidarr.Http;
|
||||||
using Lidarr.Http.REST;
|
using Lidarr.Http.REST;
|
||||||
using Lidarr.Http.REST.Attributes;
|
using Lidarr.Http.REST.Attributes;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using NzbDrone.Common.Extensions;
|
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
using NzbDrone.Core.Validation.Paths;
|
using NzbDrone.Core.Validation.Paths;
|
||||||
|
|
||||||
|
@ -28,14 +27,6 @@ namespace Lidarr.Api.V1.RemotePathMappings
|
||||||
SharedValidator.RuleFor(c => c.RemotePath)
|
SharedValidator.RuleFor(c => c.RemotePath)
|
||||||
.NotEmpty();
|
.NotEmpty();
|
||||||
|
|
||||||
SharedValidator.RuleFor(c => c.RemotePath)
|
|
||||||
.Must(remotePath => remotePath.IsNotNullOrWhiteSpace() && !remotePath.StartsWith(" "))
|
|
||||||
.WithMessage("Remote Path '{PropertyValue}' must not start with a space");
|
|
||||||
|
|
||||||
SharedValidator.RuleFor(c => c.RemotePath)
|
|
||||||
.Must(remotePath => remotePath.IsNotNullOrWhiteSpace() && !remotePath.EndsWith(" "))
|
|
||||||
.WithMessage("Remote Path '{PropertyValue}' must not end with a space");
|
|
||||||
|
|
||||||
SharedValidator.RuleFor(c => c.LocalPath)
|
SharedValidator.RuleFor(c => c.LocalPath)
|
||||||
.Cascade(CascadeMode.Stop)
|
.Cascade(CascadeMode.Stop)
|
||||||
.IsValidPath()
|
.IsValidPath()
|
||||||
|
|
|
@ -92,7 +92,7 @@ namespace Lidarr.Api.V1.System.Backup
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("restore/upload")]
|
[HttpPost("restore/upload")]
|
||||||
[RequestFormLimits(MultipartBodyLengthLimit = 5000000000)]
|
[RequestFormLimits(MultipartBodyLengthLimit = 1000000000)]
|
||||||
public object UploadAndRestore()
|
public object UploadAndRestore()
|
||||||
{
|
{
|
||||||
var files = Request.Form.Files;
|
var files = Request.Form.Files;
|
||||||
|
|
|
@ -40,16 +40,15 @@ namespace NzbDrone.Automation.Test
|
||||||
var service = ChromeDriverService.CreateDefaultService();
|
var service = ChromeDriverService.CreateDefaultService();
|
||||||
|
|
||||||
// Timeout as windows automation tests seem to take alot longer to get going
|
// Timeout as windows automation tests seem to take alot longer to get going
|
||||||
driver = new ChromeDriver(service, options, TimeSpan.FromMinutes(3));
|
driver = new ChromeDriver(service, options, new TimeSpan(0, 3, 0));
|
||||||
|
|
||||||
driver.Manage().Window.Size = new System.Drawing.Size(1920, 1080);
|
driver.Manage().Window.Size = new System.Drawing.Size(1920, 1080);
|
||||||
driver.Manage().Window.FullScreen();
|
|
||||||
|
|
||||||
_runner = new NzbDroneRunner(LogManager.GetCurrentClassLogger(), null);
|
_runner = new NzbDroneRunner(LogManager.GetCurrentClassLogger(), null);
|
||||||
_runner.KillAll();
|
_runner.KillAll();
|
||||||
_runner.Start(true);
|
_runner.Start(true);
|
||||||
|
|
||||||
driver.Navigate().GoToUrl("http://localhost:8686");
|
driver.Url = "http://localhost:8686";
|
||||||
|
|
||||||
var page = new PageBase(driver);
|
var page = new PageBase(driver);
|
||||||
page.WaitForNoSpinner();
|
page.WaitForNoSpinner();
|
||||||
|
@ -69,7 +68,7 @@ namespace NzbDrone.Automation.Test
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var image = (driver as ITakesScreenshot).GetScreenshot();
|
var image = ((ITakesScreenshot)driver).GetScreenshot();
|
||||||
image.SaveAsFile($"./{name}_test_screenshot.png", ScreenshotImageFormat.Png);
|
image.SaveAsFile($"./{name}_test_screenshot.png", ScreenshotImageFormat.Png);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
|
@ -1,17 +1,19 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using OpenQA.Selenium;
|
using OpenQA.Selenium;
|
||||||
|
using OpenQA.Selenium.Remote;
|
||||||
using OpenQA.Selenium.Support.UI;
|
using OpenQA.Selenium.Support.UI;
|
||||||
|
|
||||||
namespace NzbDrone.Automation.Test.PageModel
|
namespace NzbDrone.Automation.Test.PageModel
|
||||||
{
|
{
|
||||||
public class PageBase
|
public class PageBase
|
||||||
{
|
{
|
||||||
private readonly IWebDriver _driver;
|
private readonly RemoteWebDriver _driver;
|
||||||
|
|
||||||
public PageBase(IWebDriver driver)
|
public PageBase(RemoteWebDriver driver)
|
||||||
{
|
{
|
||||||
_driver = driver;
|
_driver = driver;
|
||||||
|
driver.Manage().Window.Maximize();
|
||||||
}
|
}
|
||||||
|
|
||||||
public IWebElement FindByClass(string className, int timeout = 5)
|
public IWebElement FindByClass(string className, int timeout = 5)
|
||||||
|
|
|
@ -141,7 +141,7 @@ namespace NzbDrone.Common.Http.Dispatchers
|
||||||
}
|
}
|
||||||
catch (OperationCanceledException ex) when (cts.IsCancellationRequested)
|
catch (OperationCanceledException ex) when (cts.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
throw new WebException("Http request timed out", ex, WebExceptionStatus.Timeout, null);
|
throw new WebException("Http request timed out", ex.InnerException, WebExceptionStatus.Timeout, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="DryIoc.dll" Version="5.4.3" />
|
<PackageReference Include="DryIoc.dll" Version="5.4.3" />
|
||||||
<PackageReference Include="IPAddressRange" Version="6.2.0" />
|
<PackageReference Include="IPAddressRange" Version="6.1.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
<PackageReference Include="NLog" Version="5.4.0" />
|
<PackageReference Include="NLog" Version="5.4.0" />
|
||||||
|
|
|
@ -103,7 +103,6 @@ namespace NzbDrone.Core.Test.DiskSpace
|
||||||
[TestCase("/var/lib/docker")]
|
[TestCase("/var/lib/docker")]
|
||||||
[TestCase("/some/place/docker/aufs")]
|
[TestCase("/some/place/docker/aufs")]
|
||||||
[TestCase("/etc/network")]
|
[TestCase("/etc/network")]
|
||||||
[TestCase("/Volumes/.timemachine/ABC123456-A1BC-12A3B45678C9/2025-05-13-181401.backup")]
|
|
||||||
public void should_not_check_diskspace_for_irrelevant_mounts(string path)
|
public void should_not_check_diskspace_for_irrelevant_mounts(string path)
|
||||||
{
|
{
|
||||||
var mount = new Mock<IMount>();
|
var mount = new Mock<IMount>();
|
||||||
|
|
|
@ -14,7 +14,6 @@ using NzbDrone.Core.Test.Framework;
|
||||||
namespace NzbDrone.Core.Test.MetadataSource.SkyHook
|
namespace NzbDrone.Core.Test.MetadataSource.SkyHook
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
|
||||||
public class SkyHookProxyFixture : CoreTest<SkyHookProxy>
|
public class SkyHookProxyFixture : CoreTest<SkyHookProxy>
|
||||||
{
|
{
|
||||||
private MetadataProfile _metadataProfile;
|
private MetadataProfile _metadataProfile;
|
||||||
|
|
|
@ -12,7 +12,6 @@ using NzbDrone.Test.Common;
|
||||||
namespace NzbDrone.Core.Test.MetadataSource.SkyHook
|
namespace NzbDrone.Core.Test.MetadataSource.SkyHook
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
|
||||||
public class SkyHookProxySearchFixture : CoreTest<SkyHookProxy>
|
public class SkyHookProxySearchFixture : CoreTest<SkyHookProxy>
|
||||||
{
|
{
|
||||||
[SetUp]
|
[SetUp]
|
||||||
|
|
|
@ -11,7 +11,6 @@ namespace NzbDrone.Core.CustomFormats
|
||||||
{
|
{
|
||||||
RuleFor(c => c.Min).GreaterThanOrEqualTo(0);
|
RuleFor(c => c.Min).GreaterThanOrEqualTo(0);
|
||||||
RuleFor(c => c.Max).GreaterThan(c => c.Min);
|
RuleFor(c => c.Max).GreaterThan(c => c.Min);
|
||||||
RuleFor(c => c.Max).LessThanOrEqualTo(double.MaxValue);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ namespace NzbDrone.Core.DiskSpace
|
||||||
private readonly IRootFolderService _rootFolderService;
|
private readonly IRootFolderService _rootFolderService;
|
||||||
private readonly Logger _logger;
|
private readonly Logger _logger;
|
||||||
|
|
||||||
private static readonly Regex _regexSpecialDrive = new Regex(@"^/var/lib/(docker|rancher|kubelet)(/|$)|^/(boot|etc)(/|$)|/docker(/var)?/aufs(/|$)|/\.timemachine", RegexOptions.Compiled);
|
private static readonly Regex _regexSpecialDrive = new Regex("^/var/lib/(docker|rancher|kubelet)(/|$)|^/(boot|etc)(/|$)|/docker(/var)?/aufs(/|$)", RegexOptions.Compiled);
|
||||||
|
|
||||||
public DiskSpaceService(IDiskProvider diskProvider,
|
public DiskSpaceService(IDiskProvider diskProvider,
|
||||||
IRootFolderService rootFolderService,
|
IRootFolderService rootFolderService,
|
||||||
|
@ -38,10 +38,7 @@ namespace NzbDrone.Core.DiskSpace
|
||||||
|
|
||||||
var optionalRootFolders = GetFixedDisksRootPaths().Except(importantRootFolders).Distinct().ToList();
|
var optionalRootFolders = GetFixedDisksRootPaths().Except(importantRootFolders).Distinct().ToList();
|
||||||
|
|
||||||
var diskSpace = GetDiskSpace(importantRootFolders)
|
var diskSpace = GetDiskSpace(importantRootFolders).Concat(GetDiskSpace(optionalRootFolders, true)).ToList();
|
||||||
.Concat(GetDiskSpace(optionalRootFolders, true))
|
|
||||||
.OrderBy(d => d.Path, StringComparer.OrdinalIgnoreCase)
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
return diskSpace;
|
return diskSpace;
|
||||||
}
|
}
|
||||||
|
@ -57,7 +54,7 @@ namespace NzbDrone.Core.DiskSpace
|
||||||
private IEnumerable<string> GetFixedDisksRootPaths()
|
private IEnumerable<string> GetFixedDisksRootPaths()
|
||||||
{
|
{
|
||||||
return _diskProvider.GetMounts()
|
return _diskProvider.GetMounts()
|
||||||
.Where(d => d.DriveType is DriveType.Fixed or DriveType.Network)
|
.Where(d => d.DriveType == DriveType.Fixed)
|
||||||
.Where(d => !_regexSpecialDrive.IsMatch(d.RootDirectory))
|
.Where(d => !_regexSpecialDrive.IsMatch(d.RootDirectory))
|
||||||
.Select(d => d.RootDirectory);
|
.Select(d => d.RootDirectory);
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,6 @@ using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Blocklisting;
|
using NzbDrone.Core.Blocklisting;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
|
@ -29,10 +28,9 @@ namespace NzbDrone.Core.Download.Clients.Aria2
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
IBlocklistService blocklistService,
|
IBlocklistService blocklistService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||||
{
|
{
|
||||||
_proxy = proxy;
|
_proxy = proxy;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,6 @@ using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Blocklisting;
|
using NzbDrone.Core.Blocklisting;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||||
using NzbDrone.Core.Organizer;
|
using NzbDrone.Core.Organizer;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
|
@ -31,10 +30,9 @@ namespace NzbDrone.Core.Download.Clients.Blackhole
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
IBlocklistService blocklistService,
|
IBlocklistService blocklistService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||||
{
|
{
|
||||||
_scanWatchFolder = scanWatchFolder;
|
_scanWatchFolder = scanWatchFolder;
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,6 @@ using NzbDrone.Common.Disk;
|
||||||
using NzbDrone.Common.Extensions;
|
using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.Organizer;
|
using NzbDrone.Core.Organizer;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
|
@ -26,9 +25,8 @@ namespace NzbDrone.Core.Download.Clients.Blackhole
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
IValidateNzbs nzbValidationService,
|
IValidateNzbs nzbValidationService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, localizationService, logger)
|
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, logger)
|
||||||
{
|
{
|
||||||
_scanWatchFolder = scanWatchFolder;
|
_scanWatchFolder = scanWatchFolder;
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,6 @@ using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Blocklisting;
|
using NzbDrone.Core.Blocklisting;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
|
@ -28,10 +27,9 @@ namespace NzbDrone.Core.Download.Clients.Deluge
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
IBlocklistService blocklistService,
|
IBlocklistService blocklistService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||||
{
|
{
|
||||||
_proxy = proxy;
|
_proxy = proxy;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,6 @@ using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Blocklisting;
|
using NzbDrone.Core.Blocklisting;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Download.Clients.DownloadStation.Proxies;
|
using NzbDrone.Core.Download.Clients.DownloadStation.Proxies;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
|
@ -38,10 +37,9 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
IBlocklistService blocklistService,
|
IBlocklistService blocklistService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||||
{
|
{
|
||||||
_dsInfoProxy = dsInfoProxy;
|
_dsInfoProxy = dsInfoProxy;
|
||||||
_dsTaskProxySelector = dsTaskProxySelector;
|
_dsTaskProxySelector = dsTaskProxySelector;
|
||||||
|
|
|
@ -9,7 +9,6 @@ using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Download.Clients.DownloadStation.Proxies;
|
using NzbDrone.Core.Download.Clients.DownloadStation.Proxies;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
using NzbDrone.Core.ThingiProvider;
|
using NzbDrone.Core.ThingiProvider;
|
||||||
|
@ -35,9 +34,8 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
IValidateNzbs nzbValidationService,
|
IValidateNzbs nzbValidationService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, localizationService, logger)
|
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, logger)
|
||||||
{
|
{
|
||||||
_dsInfoProxy = dsInfoProxy;
|
_dsInfoProxy = dsInfoProxy;
|
||||||
_dsTaskProxySelector = dsTaskProxySelector;
|
_dsTaskProxySelector = dsTaskProxySelector;
|
||||||
|
|
|
@ -9,7 +9,6 @@ using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Blocklisting;
|
using NzbDrone.Core.Blocklisting;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Download.Clients.Flood.Models;
|
using NzbDrone.Core.Download.Clients.Flood.Models;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
|
@ -29,10 +28,9 @@ namespace NzbDrone.Core.Download.Clients.Flood
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
IBlocklistService blocklistService,
|
IBlocklistService blocklistService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||||
{
|
{
|
||||||
_proxy = proxy;
|
_proxy = proxy;
|
||||||
_downloadSeedConfigProvider = downloadSeedConfigProvider;
|
_downloadSeedConfigProvider = downloadSeedConfigProvider;
|
||||||
|
|
|
@ -9,7 +9,6 @@ using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Blocklisting;
|
using NzbDrone.Core.Blocklisting;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Download.Clients.FreeboxDownload.Responses;
|
using NzbDrone.Core.Download.Clients.FreeboxDownload.Responses;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
|
@ -26,10 +25,9 @@ namespace NzbDrone.Core.Download.Clients.FreeboxDownload
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
IBlocklistService blocklistService,
|
IBlocklistService blocklistService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||||
{
|
{
|
||||||
_proxy = proxy;
|
_proxy = proxy;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,6 @@ using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Blocklisting;
|
using NzbDrone.Core.Blocklisting;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Download.Clients.Hadouken.Models;
|
using NzbDrone.Core.Download.Clients.Hadouken.Models;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
|
@ -26,10 +25,9 @@ namespace NzbDrone.Core.Download.Clients.Hadouken
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
IBlocklistService blocklistService,
|
IBlocklistService blocklistService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||||
{
|
{
|
||||||
_proxy = proxy;
|
_proxy = proxy;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,6 @@ using NzbDrone.Common.Disk;
|
||||||
using NzbDrone.Common.Extensions;
|
using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
using NzbDrone.Core.Validation;
|
using NzbDrone.Core.Validation;
|
||||||
|
@ -25,9 +24,8 @@ namespace NzbDrone.Core.Download.Clients.NzbVortex
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
IValidateNzbs nzbValidationService,
|
IValidateNzbs nzbValidationService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, localizationService, logger)
|
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, logger)
|
||||||
{
|
{
|
||||||
_proxy = proxy;
|
_proxy = proxy;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,6 @@ using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Exceptions;
|
using NzbDrone.Core.Exceptions;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
using NzbDrone.Core.Validation;
|
using NzbDrone.Core.Validation;
|
||||||
|
@ -29,9 +28,8 @@ namespace NzbDrone.Core.Download.Clients.Nzbget
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
IValidateNzbs nzbValidationService,
|
IValidateNzbs nzbValidationService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, localizationService, logger)
|
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, logger)
|
||||||
{
|
{
|
||||||
_proxy = proxy;
|
_proxy = proxy;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,6 @@ using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Indexers;
|
using NzbDrone.Core.Indexers;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.Organizer;
|
using NzbDrone.Core.Organizer;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
|
@ -24,9 +23,8 @@ namespace NzbDrone.Core.Download.Clients.Pneumatic
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(configService, diskProvider, remotePathMappingService, localizationService, logger)
|
: base(configService, diskProvider, remotePathMappingService, logger)
|
||||||
{
|
{
|
||||||
_httpClient = httpClient;
|
_httpClient = httpClient;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,6 @@ using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Blocklisting;
|
using NzbDrone.Core.Blocklisting;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
|
@ -36,10 +35,9 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
ICacheManager cacheManager,
|
ICacheManager cacheManager,
|
||||||
ILocalizationService localizationService,
|
|
||||||
IBlocklistService blocklistService,
|
IBlocklistService blocklistService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||||
{
|
{
|
||||||
_proxySelector = proxySelector;
|
_proxySelector = proxySelector;
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,6 @@ using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Exceptions;
|
using NzbDrone.Core.Exceptions;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
using NzbDrone.Core.Validation;
|
using NzbDrone.Core.Validation;
|
||||||
|
@ -27,9 +26,8 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
IValidateNzbs nzbValidationService,
|
IValidateNzbs nzbValidationService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, localizationService, logger)
|
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, logger)
|
||||||
{
|
{
|
||||||
_proxy = proxy;
|
_proxy = proxy;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,6 @@ using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Blocklisting;
|
using NzbDrone.Core.Blocklisting;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
|
|
||||||
|
@ -25,10 +24,9 @@ namespace NzbDrone.Core.Download.Clients.Transmission
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
IBlocklistService blocklistService,
|
IBlocklistService blocklistService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(proxy, torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
: base(proxy, torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,6 @@ using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Blocklisting;
|
using NzbDrone.Core.Blocklisting;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
|
@ -29,10 +28,9 @@ namespace NzbDrone.Core.Download.Clients.Transmission
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
IBlocklistService blocklistService,
|
IBlocklistService blocklistService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||||
{
|
{
|
||||||
_proxy = proxy;
|
_proxy = proxy;
|
||||||
}
|
}
|
||||||
|
@ -103,11 +101,7 @@ namespace NzbDrone.Core.Download.Clients.Transmission
|
||||||
if (!torrent.ErrorString.IsNullOrWhiteSpace())
|
if (!torrent.ErrorString.IsNullOrWhiteSpace())
|
||||||
{
|
{
|
||||||
item.Status = DownloadItemStatus.Warning;
|
item.Status = DownloadItemStatus.Warning;
|
||||||
item.Message = _localizationService.GetLocalizedString("DownloadClientItemErrorMessage", new Dictionary<string, object>
|
item.Message = torrent.ErrorString;
|
||||||
{
|
|
||||||
{ "clientName", Name },
|
|
||||||
{ "message", torrent.ErrorString }
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
else if (torrent.TotalSize == 0)
|
else if (torrent.TotalSize == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,7 +5,6 @@ using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Blocklisting;
|
using NzbDrone.Core.Blocklisting;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Download.Clients.Transmission;
|
using NzbDrone.Core.Download.Clients.Transmission;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
|
|
||||||
|
@ -24,10 +23,9 @@ namespace NzbDrone.Core.Download.Clients.Vuze
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
IBlocklistService blocklistService,
|
IBlocklistService blocklistService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(proxy, torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
: base(proxy, torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,6 @@ using NzbDrone.Core.Blocklisting;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Download.Clients.rTorrent;
|
using NzbDrone.Core.Download.Clients.rTorrent;
|
||||||
using NzbDrone.Core.Exceptions;
|
using NzbDrone.Core.Exceptions;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
|
@ -36,10 +35,9 @@ namespace NzbDrone.Core.Download.Clients.RTorrent
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
IDownloadSeedConfigProvider downloadSeedConfigProvider,
|
IDownloadSeedConfigProvider downloadSeedConfigProvider,
|
||||||
IRTorrentDirectoryValidator rTorrentDirectoryValidator,
|
IRTorrentDirectoryValidator rTorrentDirectoryValidator,
|
||||||
ILocalizationService localizationService,
|
|
||||||
IBlocklistService blocklistService,
|
IBlocklistService blocklistService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||||
{
|
{
|
||||||
_proxy = proxy;
|
_proxy = proxy;
|
||||||
_rTorrentDirectoryValidator = rTorrentDirectoryValidator;
|
_rTorrentDirectoryValidator = rTorrentDirectoryValidator;
|
||||||
|
|
|
@ -10,7 +10,6 @@ using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Blocklisting;
|
using NzbDrone.Core.Blocklisting;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
|
@ -30,10 +29,9 @@ namespace NzbDrone.Core.Download.Clients.UTorrent
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
IBlocklistService blocklistService,
|
IBlocklistService blocklistService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||||
{
|
{
|
||||||
_proxy = proxy;
|
_proxy = proxy;
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,6 @@ using NzbDrone.Common.Disk;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Indexers;
|
using NzbDrone.Core.Indexers;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
using NzbDrone.Core.ThingiProvider;
|
using NzbDrone.Core.ThingiProvider;
|
||||||
|
@ -24,7 +23,6 @@ namespace NzbDrone.Core.Download
|
||||||
protected readonly IConfigService _configService;
|
protected readonly IConfigService _configService;
|
||||||
protected readonly IDiskProvider _diskProvider;
|
protected readonly IDiskProvider _diskProvider;
|
||||||
protected readonly IRemotePathMappingService _remotePathMappingService;
|
protected readonly IRemotePathMappingService _remotePathMappingService;
|
||||||
protected readonly ILocalizationService _localizationService;
|
|
||||||
protected readonly Logger _logger;
|
protected readonly Logger _logger;
|
||||||
|
|
||||||
protected ResiliencePipeline<HttpResponse> RetryStrategy => new ResiliencePipelineBuilder<HttpResponse>()
|
protected ResiliencePipeline<HttpResponse> RetryStrategy => new ResiliencePipelineBuilder<HttpResponse>()
|
||||||
|
@ -79,13 +77,11 @@ namespace NzbDrone.Core.Download
|
||||||
protected DownloadClientBase(IConfigService configService,
|
protected DownloadClientBase(IConfigService configService,
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
Logger logger)
|
Logger logger)
|
||||||
{
|
{
|
||||||
_configService = configService;
|
_configService = configService;
|
||||||
_diskProvider = diskProvider;
|
_diskProvider = diskProvider;
|
||||||
_remotePathMappingService = remotePathMappingService;
|
_remotePathMappingService = remotePathMappingService;
|
||||||
_localizationService = localizationService;
|
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
using System;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Xml;
|
using System.Xml;
|
||||||
|
@ -15,13 +14,10 @@ namespace NzbDrone.Core.Download
|
||||||
public class NzbValidationService : IValidateNzbs
|
public class NzbValidationService : IValidateNzbs
|
||||||
{
|
{
|
||||||
public void Validate(string filename, byte[] fileContent)
|
public void Validate(string filename, byte[] fileContent)
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
var reader = new StreamReader(new MemoryStream(fileContent));
|
var reader = new StreamReader(new MemoryStream(fileContent));
|
||||||
|
|
||||||
using (var xmlTextReader = XmlReader.Create(reader,
|
using (var xmlTextReader = XmlReader.Create(reader, new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, IgnoreComments = true }))
|
||||||
new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, IgnoreComments = true }))
|
|
||||||
{
|
{
|
||||||
var xDoc = XDocument.Load(xmlTextReader);
|
var xDoc = XDocument.Load(xmlTextReader);
|
||||||
var nzb = xDoc.Root;
|
var nzb = xDoc.Root;
|
||||||
|
@ -41,8 +37,7 @@ namespace NzbDrone.Core.Download
|
||||||
|
|
||||||
if (!nzb.Name.LocalName.Equals("nzb"))
|
if (!nzb.Name.LocalName.Equals("nzb"))
|
||||||
{
|
{
|
||||||
throw new InvalidNzbException(
|
throw new InvalidNzbException("Invalid NZB: Unexpected root element. Expected 'nzb' found '{0}' [{1}]", nzb.Name.LocalName, filename);
|
||||||
"Invalid NZB: Unexpected root element. Expected 'nzb' found '{0}' [{1}]", nzb.Name.LocalName, filename);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var ns = nzb.Name.Namespace;
|
var ns = nzb.Name.Namespace;
|
||||||
|
@ -54,15 +49,5 @@ namespace NzbDrone.Core.Download
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InvalidNzbException)
|
|
||||||
{
|
|
||||||
// Throw the original exception
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
throw new InvalidNzbException("Invalid NZB: Unable to parse [{0}]", ex, filename);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,6 @@ using NzbDrone.Core.Blocklisting;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Exceptions;
|
using NzbDrone.Core.Exceptions;
|
||||||
using NzbDrone.Core.Indexers;
|
using NzbDrone.Core.Indexers;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||||
using NzbDrone.Core.Organizer;
|
using NzbDrone.Core.Organizer;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
|
@ -31,10 +30,9 @@ namespace NzbDrone.Core.Download
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
IBlocklistService blocklistService,
|
IBlocklistService blocklistService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(configService, diskProvider, remotePathMappingService, localizationService, logger)
|
: base(configService, diskProvider, remotePathMappingService, logger)
|
||||||
{
|
{
|
||||||
_httpClient = httpClient;
|
_httpClient = httpClient;
|
||||||
_blocklistService = blocklistService;
|
_blocklistService = blocklistService;
|
||||||
|
@ -172,7 +170,7 @@ namespace NzbDrone.Core.Download
|
||||||
}
|
}
|
||||||
catch (HttpException ex)
|
catch (HttpException ex)
|
||||||
{
|
{
|
||||||
if (ex.Response.StatusCode is HttpStatusCode.NotFound or HttpStatusCode.Gone)
|
if (ex.Response.StatusCode == HttpStatusCode.NotFound)
|
||||||
{
|
{
|
||||||
_logger.Error(ex, "Downloading torrent file for album '{0}' failed since it no longer exists ({1})", remoteAlbum.Release.Title, torrentUrl);
|
_logger.Error(ex, "Downloading torrent file for album '{0}' failed since it no longer exists ({1})", remoteAlbum.Release.Title, torrentUrl);
|
||||||
throw new ReleaseUnavailableException(remoteAlbum.Release, "Downloading torrent failed", ex);
|
throw new ReleaseUnavailableException(remoteAlbum.Release, "Downloading torrent failed", ex);
|
||||||
|
|
|
@ -6,7 +6,6 @@ using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Exceptions;
|
using NzbDrone.Core.Exceptions;
|
||||||
using NzbDrone.Core.Indexers;
|
using NzbDrone.Core.Indexers;
|
||||||
using NzbDrone.Core.Localization;
|
|
||||||
using NzbDrone.Core.Organizer;
|
using NzbDrone.Core.Organizer;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.RemotePathMappings;
|
using NzbDrone.Core.RemotePathMappings;
|
||||||
|
@ -25,9 +24,8 @@ namespace NzbDrone.Core.Download
|
||||||
IDiskProvider diskProvider,
|
IDiskProvider diskProvider,
|
||||||
IRemotePathMappingService remotePathMappingService,
|
IRemotePathMappingService remotePathMappingService,
|
||||||
IValidateNzbs nzbValidationService,
|
IValidateNzbs nzbValidationService,
|
||||||
ILocalizationService localizationService,
|
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(configService, diskProvider, remotePathMappingService, localizationService, logger)
|
: base(configService, diskProvider, remotePathMappingService, logger)
|
||||||
{
|
{
|
||||||
_httpClient = httpClient;
|
_httpClient = httpClient;
|
||||||
_nzbValidationService = nzbValidationService;
|
_nzbValidationService = nzbValidationService;
|
||||||
|
@ -48,7 +46,6 @@ namespace NzbDrone.Core.Download
|
||||||
{
|
{
|
||||||
var request = indexer?.GetDownloadRequest(url) ?? new HttpRequest(url);
|
var request = indexer?.GetDownloadRequest(url) ?? new HttpRequest(url);
|
||||||
request.RateLimitKey = remoteAlbum?.Release?.IndexerId.ToString();
|
request.RateLimitKey = remoteAlbum?.Release?.IndexerId.ToString();
|
||||||
request.AllowAutoRedirect = true;
|
|
||||||
|
|
||||||
var response = await RetryStrategy
|
var response = await RetryStrategy
|
||||||
.ExecuteAsync(static async (state, _) => await state._httpClient.GetAsync(state.request), (_httpClient, request))
|
.ExecuteAsync(static async (state, _) => await state._httpClient.GetAsync(state.request), (_httpClient, request))
|
||||||
|
@ -60,7 +57,7 @@ namespace NzbDrone.Core.Download
|
||||||
}
|
}
|
||||||
catch (HttpException ex)
|
catch (HttpException ex)
|
||||||
{
|
{
|
||||||
if (ex.Response.StatusCode is HttpStatusCode.NotFound or HttpStatusCode.Gone)
|
if (ex.Response.StatusCode == HttpStatusCode.NotFound)
|
||||||
{
|
{
|
||||||
_logger.Error(ex, "Downloading nzb file for album '{0}' failed since it no longer exists ({1})", remoteAlbum.Release.Title, url);
|
_logger.Error(ex, "Downloading nzb file for album '{0}' failed since it no longer exists ({1})", remoteAlbum.Release.Title, url);
|
||||||
throw new ReleaseUnavailableException(remoteAlbum.Release, "Downloading nzb failed", ex);
|
throw new ReleaseUnavailableException(remoteAlbum.Release, "Downloading nzb failed", ex);
|
||||||
|
|
|
@ -157,7 +157,7 @@ namespace NzbDrone.Core.History
|
||||||
history.Data.Add("Age", message.Album.Release.Age.ToString());
|
history.Data.Add("Age", message.Album.Release.Age.ToString());
|
||||||
history.Data.Add("AgeHours", message.Album.Release.AgeHours.ToString());
|
history.Data.Add("AgeHours", message.Album.Release.AgeHours.ToString());
|
||||||
history.Data.Add("AgeMinutes", message.Album.Release.AgeMinutes.ToString());
|
history.Data.Add("AgeMinutes", message.Album.Release.AgeMinutes.ToString());
|
||||||
history.Data.Add("PublishedDate", message.Album.Release.PublishDate.ToUniversalTime().ToString("s") + "Z");
|
history.Data.Add("PublishedDate", message.Album.Release.PublishDate.ToString("s") + "Z");
|
||||||
history.Data.Add("DownloadClient", message.DownloadClient);
|
history.Data.Add("DownloadClient", message.DownloadClient);
|
||||||
history.Data.Add("Size", message.Album.Release.Size.ToString());
|
history.Data.Add("Size", message.Album.Release.Size.ToString());
|
||||||
history.Data.Add("DownloadUrl", message.Album.Release.DownloadUrl);
|
history.Data.Add("DownloadUrl", message.Album.Release.DownloadUrl);
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NzbDrone.Common.Extensions;
|
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.IndexerSearch.Definitions;
|
using NzbDrone.Core.IndexerSearch.Definitions;
|
||||||
|
|
||||||
|
@ -45,11 +44,6 @@ namespace NzbDrone.Core.Indexers.FileList
|
||||||
|
|
||||||
private IEnumerable<IndexerRequest> GetRequest(string searchType, IEnumerable<int> categories, string parameters)
|
private IEnumerable<IndexerRequest> GetRequest(string searchType, IEnumerable<int> categories, string parameters)
|
||||||
{
|
{
|
||||||
if (categories.Empty())
|
|
||||||
{
|
|
||||||
yield break;
|
|
||||||
}
|
|
||||||
|
|
||||||
var categoriesQuery = string.Join(",", categories.Distinct());
|
var categoriesQuery = string.Join(",", categories.Distinct());
|
||||||
|
|
||||||
var baseUrl = string.Format("{0}/api.php?action={1}&category={2}{3}", Settings.BaseUrl.TrimEnd('/'), searchType, categoriesQuery, parameters);
|
var baseUrl = string.Format("{0}/api.php?action={1}&category={2}{3}", Settings.BaseUrl.TrimEnd('/'), searchType, categoriesQuery, parameters);
|
||||||
|
|
|
@ -13,8 +13,6 @@ namespace NzbDrone.Core.Indexers.FileList
|
||||||
RuleFor(c => c.Username).NotEmpty();
|
RuleFor(c => c.Username).NotEmpty();
|
||||||
RuleFor(c => c.Passkey).NotEmpty();
|
RuleFor(c => c.Passkey).NotEmpty();
|
||||||
|
|
||||||
RuleFor(c => c.Categories).NotEmpty();
|
|
||||||
|
|
||||||
RuleFor(c => c.SeedCriteria).SetValidator(_ => new SeedCriteriaSettingsValidator());
|
RuleFor(c => c.SeedCriteria).SetValidator(_ => new SeedCriteriaSettingsValidator());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
<PackageReference Include="TagLibSharp-Lidarr" Version="2.2.0.27" />
|
<PackageReference Include="TagLibSharp-Lidarr" Version="2.2.0.27" />
|
||||||
<PackageReference Include="Npgsql" Version="7.0.10" />
|
<PackageReference Include="Npgsql" Version="7.0.10" />
|
||||||
<PackageReference Include="SpotifyAPI.Web" Version="5.1.1" />
|
<PackageReference Include="SpotifyAPI.Web" Version="5.1.1" />
|
||||||
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.9" />
|
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.7" />
|
||||||
<PackageReference Include="MonoTorrent" Version="2.0.7" />
|
<PackageReference Include="MonoTorrent" Version="2.0.7" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -256,7 +256,6 @@
|
||||||
"CreateEmptyArtistFolders": "Create empty artist folders",
|
"CreateEmptyArtistFolders": "Create empty artist folders",
|
||||||
"CreateEmptyArtistFoldersHelpText": "Create missing artist folders during disk scan",
|
"CreateEmptyArtistFoldersHelpText": "Create missing artist folders during disk scan",
|
||||||
"CreateGroup": "Create group",
|
"CreateGroup": "Create group",
|
||||||
"CurrentlyInstalled": "Currently Installed",
|
|
||||||
"Custom": "Custom",
|
"Custom": "Custom",
|
||||||
"CustomFilter": "Custom Filter",
|
"CustomFilter": "Custom Filter",
|
||||||
"CustomFilters": "Custom Filters",
|
"CustomFilters": "Custom Filters",
|
||||||
|
@ -335,6 +334,8 @@
|
||||||
"DeleteReleaseProfileMessageText": "Are you sure you want to delete this release profile?",
|
"DeleteReleaseProfileMessageText": "Are you sure you want to delete this release profile?",
|
||||||
"DeleteRemotePathMapping": "Delete Remote Path Mapping",
|
"DeleteRemotePathMapping": "Delete Remote Path Mapping",
|
||||||
"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",
|
||||||
|
"DeleteRootFolderMessageText": "Are you sure you want to delete the root folder '{name}'?",
|
||||||
"DeleteSelected": "Delete Selected",
|
"DeleteSelected": "Delete Selected",
|
||||||
"DeleteSelectedArtists": "Delete Selected Artists",
|
"DeleteSelectedArtists": "Delete Selected Artists",
|
||||||
"DeleteSelectedCustomFormats": "Delete Custom Format(s)",
|
"DeleteSelectedCustomFormats": "Delete Custom Format(s)",
|
||||||
|
@ -382,7 +383,6 @@
|
||||||
"DownloadClientDelugeSettingsDirectoryCompleted": "Move When Completed Directory",
|
"DownloadClientDelugeSettingsDirectoryCompleted": "Move When Completed Directory",
|
||||||
"DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Optional location to move completed downloads to, leave blank to use the default Deluge location",
|
"DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Optional location to move completed downloads to, leave blank to use the default Deluge location",
|
||||||
"DownloadClientDelugeSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Deluge location",
|
"DownloadClientDelugeSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Deluge location",
|
||||||
"DownloadClientItemErrorMessage": "{clientName} is reporting an error: {message}",
|
|
||||||
"DownloadClientPriorityHelpText": "Download Client Priority from 1 (Highest) to 50 (Lowest). Default: 1. Round-Robin is used for clients with the same priority.",
|
"DownloadClientPriorityHelpText": "Download Client Priority from 1 (Highest) to 50 (Lowest). Default: 1. Round-Robin is used for clients with the same priority.",
|
||||||
"DownloadClientQbittorrentSettingsContentLayout": "Content Layout",
|
"DownloadClientQbittorrentSettingsContentLayout": "Content Layout",
|
||||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Whether to use qBittorrent's configured content layout, the original layout from the torrent or always create a subfolder (qBittorrent 4.3.2+)",
|
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Whether to use qBittorrent's configured content layout, the original layout from the torrent or always create a subfolder (qBittorrent 4.3.2+)",
|
||||||
|
@ -486,8 +486,6 @@
|
||||||
"ExtraFileExtensionsHelpTextsExamples": "Examples: '.sub, .nfo' or 'sub,nfo'",
|
"ExtraFileExtensionsHelpTextsExamples": "Examples: '.sub, .nfo' or 'sub,nfo'",
|
||||||
"FailedDownloadHandling": "Failed Download Handling",
|
"FailedDownloadHandling": "Failed Download Handling",
|
||||||
"FailedLoadingSearchResults": "Failed to load search results, please try again.",
|
"FailedLoadingSearchResults": "Failed to load search results, please try again.",
|
||||||
"FailedToFetchSettings": "Failed to fetch settings",
|
|
||||||
"FailedToFetchUpdates": "Failed to fetch updates",
|
|
||||||
"FailedToLoadQueue": "Failed to load Queue",
|
"FailedToLoadQueue": "Failed to load Queue",
|
||||||
"False": "False",
|
"False": "False",
|
||||||
"FileDateHelpText": "Change file date on import/rescan",
|
"FileDateHelpText": "Change file date on import/rescan",
|
||||||
|
@ -690,7 +688,6 @@
|
||||||
"LocalPathHelpText": "Path that {appName} should use to access the remote path locally",
|
"LocalPathHelpText": "Path that {appName} should use to access the remote path locally",
|
||||||
"Location": "Location",
|
"Location": "Location",
|
||||||
"LogFiles": "Log Files",
|
"LogFiles": "Log Files",
|
||||||
"LogFilesLocation": "Log files are located in: {location}",
|
|
||||||
"LogLevel": "Log Level",
|
"LogLevel": "Log Level",
|
||||||
"LogLevelvalueTraceTraceLoggingShouldOnlyBeEnabledTemporarily": "Trace logging should only be enabled temporarily",
|
"LogLevelvalueTraceTraceLoggingShouldOnlyBeEnabledTemporarily": "Trace logging should only be enabled temporarily",
|
||||||
"LogSizeLimit": "Log Size Limit",
|
"LogSizeLimit": "Log Size Limit",
|
||||||
|
@ -1027,8 +1024,6 @@
|
||||||
"RemoveQueueItemRemovalMethod": "Removal Method",
|
"RemoveQueueItemRemovalMethod": "Removal Method",
|
||||||
"RemoveQueueItemRemovalMethodHelpTextWarning": "'Remove from Download Client' will remove the download and the file(s) from the download client.",
|
"RemoveQueueItemRemovalMethodHelpTextWarning": "'Remove from Download Client' will remove the download and the file(s) from the download client.",
|
||||||
"RemoveQueueItemsRemovalMethodHelpTextWarning": "'Remove from Download Client' will remove the downloads and the files from the download client.",
|
"RemoveQueueItemsRemovalMethodHelpTextWarning": "'Remove from Download Client' will remove the downloads and the files from the download client.",
|
||||||
"RemoveRootFolder": "Remove Root Folder",
|
|
||||||
"RemoveRootFolderArtistsMessageText": "Are you sure you want to remove the root folder '{name}'? Files and folders will not be deleted from disk, and artists in this root folder will not be removed from {appName}.",
|
|
||||||
"RemoveSelected": "Remove Selected",
|
"RemoveSelected": "Remove Selected",
|
||||||
"RemoveSelectedItem": "Remove Selected Item",
|
"RemoveSelectedItem": "Remove Selected Item",
|
||||||
"RemoveSelectedItemBlocklistMessageText": "Are you sure you want to remove the selected items from the blocklist?",
|
"RemoveSelectedItemBlocklistMessageText": "Are you sure you want to remove the selected items from the blocklist?",
|
||||||
|
@ -1223,7 +1218,6 @@
|
||||||
"TestParsing": "Test Parsing",
|
"TestParsing": "Test Parsing",
|
||||||
"TheAlbumsFilesWillBeDeleted": "The album's files will be deleted.",
|
"TheAlbumsFilesWillBeDeleted": "The album's files will be deleted.",
|
||||||
"TheArtistFolderStrongpathstrongAndAllOfItsContentWillBeDeleted": "The artist folder '{0}' and all of its content will be deleted.",
|
"TheArtistFolderStrongpathstrongAndAllOfItsContentWillBeDeleted": "The artist folder '{0}' and all of its content will be deleted.",
|
||||||
"TheLogLevelDefault": "The log level defaults to 'Debug' and can be changed in [General Settings](/settings/general)",
|
|
||||||
"Theme": "Theme",
|
"Theme": "Theme",
|
||||||
"ThemeHelpText": "Change Application UI Theme, 'Auto' Theme will use your OS Theme to set Light or Dark mode. Inspired by Theme.Park",
|
"ThemeHelpText": "Change Application UI Theme, 'Auto' Theme will use your OS Theme to set Light or Dark mode. Inspired by Theme.Park",
|
||||||
"ThereWasAnErrorLoadingThisItem": "There was an error loading this item",
|
"ThereWasAnErrorLoadingThisItem": "There was an error loading this item",
|
||||||
|
|
|
@ -963,7 +963,7 @@
|
||||||
"Small": "Pieni",
|
"Small": "Pieni",
|
||||||
"RemoveSelectedItems": "Poista valitut kohteet",
|
"RemoveSelectedItems": "Poista valitut kohteet",
|
||||||
"ResetTitles": "Palauta nimet",
|
"ResetTitles": "Palauta nimet",
|
||||||
"AddNewArtistRootFolderHelpText": "Alikansio \"{folder}\" luodaan automaattisesti.",
|
"AddNewArtistRootFolderHelpText": "\"{folder}\" -alikansio luodaan automaattisesti.",
|
||||||
"AuthenticationRequiredUsernameHelpTextWarning": "Syötä uusi käyttäjätunnus",
|
"AuthenticationRequiredUsernameHelpTextWarning": "Syötä uusi käyttäjätunnus",
|
||||||
"AutoAdd": "Automaattilisäys",
|
"AutoAdd": "Automaattilisäys",
|
||||||
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Latauspalvelu {0} on määritetty poistamaan valmistuneet lataukset, jonka seuraksena ne saatetaan poistaa ennen kuin {1} ehtii tuoda niitä.",
|
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Latauspalvelu {0} on määritetty poistamaan valmistuneet lataukset, jonka seuraksena ne saatetaan poistaa ennen kuin {1} ehtii tuoda niitä.",
|
||||||
|
@ -1058,7 +1058,7 @@
|
||||||
"SomeResultsAreHiddenByTheAppliedFilter": "Aktiivinen suodatin piilottaa joitakin tuloksia.",
|
"SomeResultsAreHiddenByTheAppliedFilter": "Aktiivinen suodatin piilottaa joitakin tuloksia.",
|
||||||
"RemotePathMappingCheckFileRemoved": "Tiedosto \"{0}\" poistettiin kesken käsittelyn.",
|
"RemotePathMappingCheckFileRemoved": "Tiedosto \"{0}\" poistettiin kesken käsittelyn.",
|
||||||
"AddListExclusionHelpText": "Estä {appName}ia lisäämästä esittäjää listoilta.",
|
"AddListExclusionHelpText": "Estä {appName}ia lisäämästä esittäjää listoilta.",
|
||||||
"ArtistsEditRootFolderHelpText": "Siirtämällä esittäjät niiden nykyiseen juurikansioon voidaan niiden kansioiden nimet päivittää vastaamaan päivittynyttä nimikettä tai nimeämiskaavaa.",
|
"ArtistsEditRootFolderHelpText": "Siirtämällä esittäjät samaan juurikansioon voidaan niiden kansioiden nimet päivittää vastaamaan päivittynyttä nimikettä tai nimeämiskaavaa.",
|
||||||
"DownloadClientAriaSettingsDirectoryHelpText": "Vaihtoehtoinen latausten tallennussijainti. Käytä Aria2:n oletusta jättämällä tyhjäksi.",
|
"DownloadClientAriaSettingsDirectoryHelpText": "Vaihtoehtoinen latausten tallennussijainti. Käytä Aria2:n oletusta jättämällä tyhjäksi.",
|
||||||
"DeleteArtistFoldersHelpText": "Poista esittäjäkansiot ja niiden kaikki sisältö.",
|
"DeleteArtistFoldersHelpText": "Poista esittäjäkansiot ja niiden kaikki sisältö.",
|
||||||
"ChangeCategoryHint": "Vaihtaa latauksen kategoriaksi latauspalvelun \"Tuonnin jälkeinen kategoria\" -asetuksen kategorian.",
|
"ChangeCategoryHint": "Vaihtaa latauksen kategoriaksi latauspalvelun \"Tuonnin jälkeinen kategoria\" -asetuksen kategorian.",
|
||||||
|
|
|
@ -1061,6 +1061,5 @@
|
||||||
"ImportFailed": "Importazione fallita: {sourceTitle}",
|
"ImportFailed": "Importazione fallita: {sourceTitle}",
|
||||||
"Paused": "In Pausa",
|
"Paused": "In Pausa",
|
||||||
"Pending": "In Attesa",
|
"Pending": "In Attesa",
|
||||||
"UnableToImportAutomatically": "Impossibile Importare Automaticamente",
|
"UnableToImportAutomatically": "Impossibile Importare Automaticamente"
|
||||||
"AlbumCount": "Numero album"
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -286,7 +286,5 @@
|
||||||
"IgnoredPlaceHolder": "Legg til ny begrensning",
|
"IgnoredPlaceHolder": "Legg til ny begrensning",
|
||||||
"AddImportList": "Ny Importliste",
|
"AddImportList": "Ny Importliste",
|
||||||
"AddNewArtistRootFolderHelpText": "Undermappa \"{folder}\" vil bli automatisk laget",
|
"AddNewArtistRootFolderHelpText": "Undermappa \"{folder}\" vil bli automatisk laget",
|
||||||
"CheckDownloadClientForDetails": "sjekk nedlastningsklienten for mer informasjon",
|
"CheckDownloadClientForDetails": "sjekk nedlastningsklienten for mer informasjon"
|
||||||
"TBA": "Venter",
|
|
||||||
"History": "Historikk"
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -595,7 +595,7 @@
|
||||||
"CustomFormatSettings": "Eigen Formaten Instellingen",
|
"CustomFormatSettings": "Eigen Formaten Instellingen",
|
||||||
"CustomFormats": "Eigen Formaten",
|
"CustomFormats": "Eigen Formaten",
|
||||||
"Customformat": "Eigen Formaat",
|
"Customformat": "Eigen Formaat",
|
||||||
"CutoffFormatScoreHelpText": "Wanneer deze aangepaste formaatscore is behaald, zal {appName} niet langer albumuitgaven downloaden",
|
"CutoffFormatScoreHelpText": "Wanneer deze eigen formaat score is behaald, zal {appName} niet langer films downloaden",
|
||||||
"DeleteCustomFormat": "Verwijder Eigen Formaat",
|
"DeleteCustomFormat": "Verwijder Eigen Formaat",
|
||||||
"DeleteCustomFormatMessageText": "Bent u zeker dat u de indexeerder '{0}' wilt verwijderen?",
|
"DeleteCustomFormatMessageText": "Bent u zeker dat u de indexeerder '{0}' wilt verwijderen?",
|
||||||
"DeleteFormatMessageText": "Weet je zeker dat je formaat tag {0} wilt verwijderen?",
|
"DeleteFormatMessageText": "Weet je zeker dat je formaat tag {0} wilt verwijderen?",
|
||||||
|
@ -879,7 +879,7 @@
|
||||||
"BlocklistOnly": "Alleen bloklijst",
|
"BlocklistOnly": "Alleen bloklijst",
|
||||||
"ChangeCategoryHint": "Verandert download naar de 'Post-Import Categorie' van Downloadclient",
|
"ChangeCategoryHint": "Verandert download naar de 'Post-Import Categorie' van Downloadclient",
|
||||||
"ClearBlocklist": "Blokkeerlijst wissen",
|
"ClearBlocklist": "Blokkeerlijst wissen",
|
||||||
"Clone": "Dupliceren",
|
"Clone": "Kloon",
|
||||||
"CustomFormatsSpecificationRegularExpression": "Reguliere expressie",
|
"CustomFormatsSpecificationRegularExpression": "Reguliere expressie",
|
||||||
"CustomFormatsSpecificationRegularExpressionHelpText": "Aangepaste opmaak RegEx is hoofdletterongevoelig",
|
"CustomFormatsSpecificationRegularExpressionHelpText": "Aangepaste opmaak RegEx is hoofdletterongevoelig",
|
||||||
"CustomFormatsSettingsTriggerInfo": "Een Aangepast Formaat wordt toegepast op een uitgave of bestand als het overeenkomt met ten minste één van de verschillende condities die zijn gekozen.",
|
"CustomFormatsSettingsTriggerInfo": "Een Aangepast Formaat wordt toegepast op een uitgave of bestand als het overeenkomt met ten minste één van de verschillende condities die zijn gekozen.",
|
||||||
|
|
|
@ -1031,9 +1031,5 @@
|
||||||
"CheckDownloadClientForDetails": "verifique o cliente de transferências para obter mais detalhes",
|
"CheckDownloadClientForDetails": "verifique o cliente de transferências para obter mais detalhes",
|
||||||
"DownloadWarning": "Alerta de transferência: {warningMessage}",
|
"DownloadWarning": "Alerta de transferência: {warningMessage}",
|
||||||
"Pending": "Pendente",
|
"Pending": "Pendente",
|
||||||
"WaitingToImport": "Aguardando para importar",
|
"WaitingToImport": "Aguardando para importar"
|
||||||
"TBA": "TBA",
|
|
||||||
"ThereWasAnErrorLoadingThisItem": "Houve um erro ao carregar este item",
|
|
||||||
"ThereWasAnErrorLoadingThisPage": "Houve um erro ao carregar esta página",
|
|
||||||
"EpisodeDoesNotHaveAnAbsoluteEpisodeNumber": "Episódio não tem um número de episódio absoluto"
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
"BackupRetentionHelpText": "Автоматичні резервні копії, старіші за період зберігання, очищаються автоматично",
|
"BackupRetentionHelpText": "Автоматичні резервні копії, старіші за період зберігання, очищаються автоматично",
|
||||||
"ChmodFolderHelpText": "Восьмеричний, застосовується при імпорті/перейменуванні до медіа-папок та файлів (без бітів виконання)",
|
"ChmodFolderHelpText": "Восьмеричний, застосовується при імпорті/перейменуванні до медіа-папок та файлів (без бітів виконання)",
|
||||||
"CompletedDownloadHandling": "Обробка завершених завантажень",
|
"CompletedDownloadHandling": "Обробка завершених завантажень",
|
||||||
"CopyUsingHardlinksHelpText": "Жорсткі посилання дозволяють {appName} імпортувати торренти, що роздаються, до папки виконавця без зайвого місця на диску або копіювання всього вмісту файлу. Жорсткі посилання працюватимуть лише якщо джерело та призначення знаходяться на одному томі",
|
"CopyUsingHardlinksHelpText": "Використання жорстких посилань, коли намагаєтеся скопіювати файли з торентів, які все ще завантажуються",
|
||||||
"DeleteBackupMessageText": "Ви впевнені, що хочете видалити резервну копію \"{name}\"?",
|
"DeleteBackupMessageText": "Ви впевнені, що хочете видалити резервну копію \"{name}\"?",
|
||||||
"DeleteDownloadClientMessageText": "Ви впевнені, що хочете видалити клієнт завантаження '{name}'?",
|
"DeleteDownloadClientMessageText": "Ви впевнені, що хочете видалити клієнт завантаження '{name}'?",
|
||||||
"AlreadyInYourLibrary": "Вже у вашій бібліотеці",
|
"AlreadyInYourLibrary": "Вже у вашій бібліотеці",
|
||||||
|
@ -55,12 +55,12 @@
|
||||||
"ResetAPIKeyMessageText": "Ви впевнені, що хочете скинути свій ключ API?",
|
"ResetAPIKeyMessageText": "Ви впевнені, що хочете скинути свій ключ API?",
|
||||||
"ShowQualityProfile": "Додати профіль якості",
|
"ShowQualityProfile": "Додати профіль якості",
|
||||||
"AnalyticsEnabledHelpText": "Надсилайте анонімну інформацію про використання та помилки на сервери {appName}. Це включає інформацію про ваш веб-переглядач, які сторінки {appName} WebUI ви використовуєте, звіти про помилки, а також версію ОС і часу виконання. Ми будемо використовувати цю інформацію, щоб визначити пріоритети функцій і виправлення помилок.",
|
"AnalyticsEnabledHelpText": "Надсилайте анонімну інформацію про використання та помилки на сервери {appName}. Це включає інформацію про ваш веб-переглядач, які сторінки {appName} WebUI ви використовуєте, звіти про помилки, а також версію ОС і часу виконання. Ми будемо використовувати цю інформацію, щоб визначити пріоритети функцій і виправлення помилок.",
|
||||||
"DeleteMetadataProfileMessageText": "Ви впевнені, що хочете видалити профіль метаданих '{name}'",
|
"DeleteMetadataProfileMessageText": "Ви впевнені, що хочете видалити цей профіль затримки?",
|
||||||
"DeleteNotificationMessageText": "Ви впевнені, що хочете видалити сповіщення '{name}'?",
|
"DeleteNotificationMessageText": "Ви впевнені, що хочете видалити сповіщення '{name}'?",
|
||||||
"DeleteQualityProfileMessageText": "Ви впевнені, що хочете видалити профіль якості '{name}'?",
|
"DeleteQualityProfileMessageText": "Ви впевнені, що хочете видалити профіль якості '{name}'?",
|
||||||
"DeleteReleaseProfile": "Видалити профіль випуску",
|
"DeleteReleaseProfile": "Видалити профіль випуску",
|
||||||
"DeleteReleaseProfileMessageText": "Ви впевнені, що хочете видалити цей профіль випуску?",
|
"DeleteReleaseProfileMessageText": "Ви впевнені, що хочете видалити цей профіль затримки?",
|
||||||
"DeleteRootFolderMessageText": "Ви впевнені, що хочете видалити кореневу папку '{name}'?",
|
"DeleteRootFolderMessageText": "Ви впевнені, що хочете видалити тег {0} ?",
|
||||||
"DeleteTagMessageText": "Ви впевнені, що хочете видалити тег '{label}'?",
|
"DeleteTagMessageText": "Ви впевнені, що хочете видалити тег '{label}'?",
|
||||||
"IsCutoffCutoff": "Припинення",
|
"IsCutoffCutoff": "Припинення",
|
||||||
"CertificateValidationHelpText": "Змініть суворість перевірки сертифікації HTTPS. Не змінюйте, якщо не розумієте ризики.",
|
"CertificateValidationHelpText": "Змініть суворість перевірки сертифікації HTTPS. Не змінюйте, якщо не розумієте ризики.",
|
||||||
|
@ -470,7 +470,7 @@
|
||||||
"AddImportListExclusion": "Додати виняток до списку імпорту",
|
"AddImportListExclusion": "Додати виняток до списку імпорту",
|
||||||
"AddConnection": "Додати Підключення",
|
"AddConnection": "Додати Підключення",
|
||||||
"AddConnectionImplementation": "Додати Підключення - {implementationName}",
|
"AddConnectionImplementation": "Додати Підключення - {implementationName}",
|
||||||
"Absolute": "Загальний",
|
"Absolute": "Абсолютний",
|
||||||
"AddAutoTag": "Додати Авто Тег",
|
"AddAutoTag": "Додати Авто Тег",
|
||||||
"AddAutoTagError": "Не вдалося додати новий авто тег, спробуйте ще раз.",
|
"AddAutoTagError": "Не вдалося додати новий авто тег, спробуйте ще раз.",
|
||||||
"AddConditionError": "Не вдалося додати нову умову, спробуйте ще раз.",
|
"AddConditionError": "Не вдалося додати нову умову, спробуйте ще раз.",
|
||||||
|
@ -620,7 +620,7 @@
|
||||||
"UnmonitoredHelpText": "Включайте неконтрольовані фільми в канал iCal",
|
"UnmonitoredHelpText": "Включайте неконтрольовані фільми в канал iCal",
|
||||||
"Posters": "Плакати",
|
"Posters": "Плакати",
|
||||||
"Priority": "Пріоритет",
|
"Priority": "Пріоритет",
|
||||||
"RemotePathMappingCheckImportFailed": "{appName} не вдалося імпортувати музику. Перегляньте журнали для деталей",
|
"RemotePathMappingCheckImportFailed": "{appName} не вдалося імпортувати фільм. Подробиці перевірте у своїх журналах.",
|
||||||
"SslPortHelpTextWarning": "Щоб набуло чинності, потрібно перезапустити",
|
"SslPortHelpTextWarning": "Щоб набуло чинності, потрібно перезапустити",
|
||||||
"ApiKeyValidationHealthCheckMessage": "Будь ласка оновіть ключ API, щоб він містив принаймні {length} символів. Ви можете зробити це в налаштуваннях або в файлі конфігурації",
|
"ApiKeyValidationHealthCheckMessage": "Будь ласка оновіть ключ API, щоб він містив принаймні {length} символів. Ви можете зробити це в налаштуваннях або в файлі конфігурації",
|
||||||
"CustomFilter": "Користувацькі фільтри",
|
"CustomFilter": "Користувацькі фільтри",
|
||||||
|
@ -694,7 +694,7 @@
|
||||||
"LongDateFormat": "Довгий формат дати",
|
"LongDateFormat": "Довгий формат дати",
|
||||||
"MaintenanceRelease": "Випуск для обслуговування: виправлення помилок та інші покращення. Щоб отримати докладнішу інформацію, перегляньте історію фіксації Github",
|
"MaintenanceRelease": "Випуск для обслуговування: виправлення помилок та інші покращення. Щоб отримати докладнішу інформацію, перегляньте історію фіксації Github",
|
||||||
"ReleaseDate": "Дати випуску",
|
"ReleaseDate": "Дати випуску",
|
||||||
"RemotePathMappingCheckDownloadPermissions": "{appName} бачить, але не має доступу до завантаженої музики{0}. Ймовірно, помилка дозволів.",
|
"RemotePathMappingCheckDownloadPermissions": "{appName} може бачити, але не має доступу до завантаженого фільму {path}. Ймовірна помилка дозволів.",
|
||||||
"UnableToLoadCustomFormats": "Не вдалося завантажити спеціальні формати",
|
"UnableToLoadCustomFormats": "Не вдалося завантажити спеціальні формати",
|
||||||
"ShownAboveEachColumnWhenWeekIsTheActiveView": "Відображається над кожним стовпцем, коли тиждень є активним переглядом",
|
"ShownAboveEachColumnWhenWeekIsTheActiveView": "Відображається над кожним стовпцем, коли тиждень є активним переглядом",
|
||||||
"Table": "Таблиця",
|
"Table": "Таблиця",
|
||||||
|
@ -945,267 +945,5 @@
|
||||||
"NotificationsEmbySettingsUpdateLibraryHelpText": "Оновити бібліотеку при імпорті, перейменуванні або видаленні",
|
"NotificationsEmbySettingsUpdateLibraryHelpText": "Оновити бібліотеку при імпорті, перейменуванні або видаленні",
|
||||||
"NotificationsSettingsUpdateMapPathsFromHelpText": "Шлях {appName}, який використовується для зміни шляхів до серіалів, коли {serviceName} бачить шлях до бібліотеки інакше, ніж {appName} (необхідно 'Оновити бібліотеку')",
|
"NotificationsSettingsUpdateMapPathsFromHelpText": "Шлях {appName}, який використовується для зміни шляхів до серіалів, коли {serviceName} бачить шлях до бібліотеки інакше, ніж {appName} (необхідно 'Оновити бібліотеку')",
|
||||||
"NotificationsSettingsUpdateMapPathsToHelpText": "Шлях {serviceName}, що використовується для зміни шляхів до серіалів, коли {serviceName} бачить шлях до бібліотеки інакше, ніж {appName} (потрібно 'Оновити бібліотеку')",
|
"NotificationsSettingsUpdateMapPathsToHelpText": "Шлях {serviceName}, що використовується для зміни шляхів до серіалів, коли {serviceName} бачить шлях до бібліотеки інакше, ніж {appName} (потрібно 'Оновити бібліотеку')",
|
||||||
"Select...": "Вибрати...",
|
"Select...": "Вибрати..."
|
||||||
"DeleteSelectedDownloadClients": "Видалити вибрані клієнти завантаження",
|
|
||||||
"DownloadImported": "Завантажено імпортовано",
|
|
||||||
"DownloadedWaitingToImport": "'Завантажено - Очікує імпорту'",
|
|
||||||
"FirstAlbum": "Перший альбом",
|
|
||||||
"FutureAlbumsData": "Відстежувати альбоми, які ще не вийшли",
|
|
||||||
"IsExpandedHideAlbums": "Приховати альбоми",
|
|
||||||
"ManualDownload": "Завантажити вручну",
|
|
||||||
"ArtistIsUnmonitored": "Виконавець не відстежується",
|
|
||||||
"ForeignId": "Зовнішній ідентифікатор",
|
|
||||||
"IndexerIdHelpTextWarning": "Використання певного індексатора з бажаними словами може призвести до завантаження дублікатів релізів",
|
|
||||||
"ArtistsEditRootFolderHelpText": "Переміщення виконавців до однієї кореневої папки може використовуватися для перейменування папок виконавців відповідно до оновленого імені або формату найменування",
|
|
||||||
"AllowFingerprintingHelpText": "Використовувати створення аудіовідбитків для покращення точності зіставлення треків",
|
|
||||||
"CollapseMultipleAlbumsHelpText": "Згорнути кілька альбомів, що виходять в один день",
|
|
||||||
"ContinuingNoAdditionalAlbumsAreExpected": "Додаткових альбомів не очікується",
|
|
||||||
"DownloadClientSortingCheckMessage": "Для клієнта завантаження {0} увімкнено сортування для категорії {appName}. Вам слід вимкнути сортування у вашому клієнті завантаження, щоб уникнути проблем з імпортом",
|
|
||||||
"AnchorTooltip": "Цей файл вже є у вашій бібліотеці для релізу, який ви зараз імпортуєте",
|
|
||||||
"CollapseMultipleAlbums": "Згорнути кілька альбомів",
|
|
||||||
"ExpandEPByDefaultHelpText": "EP (міні-альбоми)",
|
|
||||||
"ForNewImportsOnly": "Лише для нових імпортів",
|
|
||||||
"MetadataProfile": "Профіль метаданих",
|
|
||||||
"EditMetadataProfile": "Редагувати профіль метаданих",
|
|
||||||
"EmbedCoverArtHelpText": "Вбудовувати обкладинку альбому Lidarr у аудіофайли під час запису тегів",
|
|
||||||
"AreYouSure": "Ви впевнені?",
|
|
||||||
"DelayProfileArtistTagsHelpText": "Застосовується до виконавців, які мають хоча б один відповідний тег",
|
|
||||||
"FilterArtistPlaceholder": "Фільтрувати виконавця",
|
|
||||||
"HasMonitoredAlbumsNoMonitoredAlbumsForThisArtist": "Для цього виконавця немає жодних альбомів, що відстежуються",
|
|
||||||
"IsExpandedHideFileInfo": "Приховати інформацію про файл",
|
|
||||||
"ArtistIsMonitored": "Виконавець відстежується",
|
|
||||||
"CustomFormatRequiredHelpText": "Ця {0}-а умова повинна збігатися, щоб застосувався власний формат. Інакше достатньо одного {0}-го збігу",
|
|
||||||
"ICalTagsArtistHelpText": "Стрічка міститиме лише виконавців, які мають хоча б один відповідний тег",
|
|
||||||
"MetadataConsumers": "Споживачі метаданих",
|
|
||||||
"ArtistNameHelpText": "Назва виконавця/альбому, який потрібно виключити (може бути будь-якою значущою)",
|
|
||||||
"DefaultMonitorOptionHelpText": "Які альбоми слід відстежувати при початковому додаванні для виконавців, виявлених у цій папці",
|
|
||||||
"ExistingAlbums": "Існуючі альбоми",
|
|
||||||
"IfYouDontAddAnImportListExclusionAndTheArtistHasAMetadataProfileOtherThanNoneThenThisAlbumMayBeReaddedDuringTheNextArtistRefresh": "Якщо ви не додасте виключення зі списку імпорту, і виконавець матиме профіль метаданих, відмінний від \"Немає\", цей альбом може бути повторно додано під час наступного оновлення виконавця",
|
|
||||||
"IsInUseCantDeleteAQualityProfileThatIsAttachedToAnArtistOrImportList": "Неможливо видалити профіль якості, який пов'язаний з виконавцем або списком імпорту",
|
|
||||||
"DeleteMetadataProfile": "Видалити профіль метаданих",
|
|
||||||
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Для клієнта завантаження {0} налаштовано видалення завершених завантажень. Це може призвести до видалення завантажень з вашого клієнта до того, як {1} зможе їх імпортувати",
|
|
||||||
"ForeignIdHelpText": "Ідентифікатор MusicBrainz виконавця/альбому, який потрібно виключити",
|
|
||||||
"MassAlbumsCutoffUnmetWarning": "Ви впевнені, що хочете виконати пошук для всіх альбомів, де не досягнуто порогового значення '{0}'?",
|
|
||||||
"IsExpandedShowAlbums": "Показати альбоми",
|
|
||||||
"IsInUseCantDeleteAMetadataProfileThatIsAttachedToAnArtistOrImportList": "Неможливо видалити профіль метаданих, який пов'язаний з виконавцем або списком імпорту",
|
|
||||||
"MetadataSettingsArtistSummary": "Створювати файли метаданих під час імпорту треків або оновлення інформації про виконавця",
|
|
||||||
"MissingAlbumsData": "Відстежувати альбоми, які не мають файлів або ще не вийшли",
|
|
||||||
"MissingTracksArtistNotMonitored": "Відсутні треки (виконавець не відстежується)",
|
|
||||||
"MonitorAlbumExistingOnlyWarning": "Це одноразове коригування налаштування відстеження для кожного альбому. Використовуйте опцію в розділі \"Виконавець/Редагувати\", щоб контролювати, що відбуватиметься з новими доданими альбомами",
|
|
||||||
"FutureDaysHelpText": "Днів для перегляду майбутніх подій у стрічці iCal",
|
|
||||||
"CountImportListsSelected": "Вибрано {selectedCount} списків імпорту",
|
|
||||||
"DateAdded": "Дата додавання",
|
|
||||||
"MissingAlbums": "Відсутні альбоми",
|
|
||||||
"DeleteTrackFile": "Видалити файл треку",
|
|
||||||
"MonitorFutureAlbums": "Майбутні альбоми",
|
|
||||||
"MonitorLastestAlbum": "Останній альбом",
|
|
||||||
"MonitorMissingAlbums": "Відсутні альбоми",
|
|
||||||
"MonitorNewAlbums": "Нові альбоми",
|
|
||||||
"MonitorNewItemsHelpText": "Які нові альбоми слід відстежувати",
|
|
||||||
"MultiDiscTrackFormat": "Формат треків на кількох дисках",
|
|
||||||
"CombineWithExistingFiles": "Об'єднати з існуючими файлами",
|
|
||||||
"ContinuingAllTracksDownloaded": "Продовжити (Усі треки завантажено)",
|
|
||||||
"ContinuingMoreAlbumsAreExpected": "Очікуються інші альбоми",
|
|
||||||
"CountAlbums": "{albumCount} альбомів",
|
|
||||||
"CountIndexersSelected": "Вибрано {selectedCount} індексаторів",
|
|
||||||
"Country": "Країна",
|
|
||||||
"Deceased": "Помер(ла)",
|
|
||||||
"DefaultDelayProfileArtist": "Це профіль за замовчуванням. Він застосовується до всіх виконавців, які не мають явного профілю.",
|
|
||||||
"DefaultLidarrTags": "Теги {appName} за замовчуванням",
|
|
||||||
"DefaultMetadataProfileIdHelpText": "Профіль метаданих за замовчуванням для виконавців, виявлених у цій папці",
|
|
||||||
"DefaultQualityProfileIdHelpText": "Профіль якості за замовчуванням для виконавців, виявлених у цій папці",
|
|
||||||
"DefaultTagsHelpText": "Теги {appName} за замовчуванням для виконавців, виявлених у цій папці",
|
|
||||||
"DeleteArtist": "Видалити вибраного виконавця",
|
|
||||||
"DeleteArtistFolder": "Видалити папку виконавця",
|
|
||||||
"DeleteArtistFolders": "Видалити папки виконавців",
|
|
||||||
"DeleteFilesHelpText": "Видалити файли треків та папку виконавця",
|
|
||||||
"DeleteFormat": "Видалити формат",
|
|
||||||
"DeleteSelectedArtists": "Видалити вибраних виконавців",
|
|
||||||
"Discography": "Дискографія",
|
|
||||||
"DownloadClientSettingsRecentPriorityAlbumHelpText": "Пріоритет, який використовуватиметься при завантаженні альбомів, випущених протягом останніх 14 днів",
|
|
||||||
"DownloadPropersAndRepacksHelpTexts2": "Використовуйте \"Не надавати перевагу\", щоб сортувати за оцінкою бажаного слова, а не за належними назвами/перепакуваннями",
|
|
||||||
"DownloadedImporting": "'Завантажено - Імпортується'",
|
|
||||||
"DownloadedUnableToImportCheckLogsForDetails": "'Завантажено - Неможливо імпортувати: деталі дивіться в журналах'",
|
|
||||||
"EditArtist": "Редагувати виконавця",
|
|
||||||
"EditMetadata": "Редагувати метадані",
|
|
||||||
"EditSelectedArtists": "Редагувати вибраних виконавців",
|
|
||||||
"EmbedCoverArtInAudioFiles": "Вбудувати обкладинку в аудіофайли",
|
|
||||||
"EnableAutomaticAddHelpText": "Додавати виконавців/альбоми до {appName} під час синхронізації через інтерфейс користувача або {appName}",
|
|
||||||
"EndedAllTracksDownloaded": "Закінчено (Усі треки завантажено)",
|
|
||||||
"EntityName": "Назва сутності",
|
|
||||||
"ExistingAlbumsData": "Відстежувати альбоми, які мають файли або ще не вийшли",
|
|
||||||
"ExistingTagsScrubbed": "Наявні теги очищено",
|
|
||||||
"ExpandBroadcastByDefaultHelpText": "Трансляція",
|
|
||||||
"ExpandItemsByDefault": "Розгорнути елементи за замовчуванням",
|
|
||||||
"ExpandSingleByDefaultHelpText": "Сингли",
|
|
||||||
"FilterAlbumPlaceholder": "Фільтрувати альбом",
|
|
||||||
"FirstAlbumData": "Відстежувати перші альбоми. Усі інші альбоми буде проігноровано",
|
|
||||||
"FutureAlbums": "Майбутні альбоми",
|
|
||||||
"FutureDays": "Майбутні дні",
|
|
||||||
"GoToArtistListing": "Перейти до списку виконавців",
|
|
||||||
"GroupInformation": "Інформація про групу",
|
|
||||||
"HideAlbums": "Приховати альбоми",
|
|
||||||
"HideTracks": "Приховати треки",
|
|
||||||
"ImportCompleteFailed": "Імпорт не вдався",
|
|
||||||
"ImportFailures": "Збої імпорту",
|
|
||||||
"ImportListSettings": "Загальні налаштування списку імпорту",
|
|
||||||
"ImportListSpecificSettings": "Специфічні налаштування списку імпорту",
|
|
||||||
"Inactive": "Неактивний",
|
|
||||||
"IndexerDownloadClientHealthCheckMessage": "Індексатори з недійсними клієнтами завантаження: {0}.",
|
|
||||||
"IsExpandedShowFileInfo": "Показати інформацію про файл",
|
|
||||||
"IsExpandedShowTracks": "Показати треки",
|
|
||||||
"LastAlbum": "Останній альбом",
|
|
||||||
"LatestAlbum": "Найновіший альбом",
|
|
||||||
"LatestAlbumData": "Відстежувати останні та майбутні альбоми",
|
|
||||||
"LidarrSupportsMultipleListsForImportingAlbumsAndArtistsIntoTheDatabase": "{appName} підтримує кілька списків для імпорту альбомів та виконавців до бази даних",
|
|
||||||
"ListWillRefreshEveryInterp": "Список оновлюватиметься кожні {0}",
|
|
||||||
"MatchedToAlbums": "Збіги з альбомами",
|
|
||||||
"MatchedToArtist": "Збіги з виконавцем",
|
|
||||||
"MediaCount": "Кількість медіафайлів",
|
|
||||||
"MediumFormat": "Формат носія",
|
|
||||||
"MetadataProfileIdHelpText": "Елементи списку профілю метаданих слід додавати з",
|
|
||||||
"MetadataProfiles": "Профілі метаданих",
|
|
||||||
"MonitorAlbum": "Відстежувати альбом",
|
|
||||||
"MonitorArtist": "Відстежувати виконавця",
|
|
||||||
"MonitorArtists": "Відстежувати виконавців",
|
|
||||||
"MonitorExistingAlbums": "Наявні альбоми",
|
|
||||||
"MonitorFirstAlbum": "Перший альбом",
|
|
||||||
"MonitorNoNewAlbums": "Немає нових альбомів",
|
|
||||||
"MonitoredHelpText": "Завантажити відстежувані альбоми цього виконавця",
|
|
||||||
"MonitoringOptionsHelpText": "Які альбоми слід відстежувати після додавання виконавця (одноразове налаштування)",
|
|
||||||
"DownloadClientSettingsOlderPriorityAlbumHelpText": "Пріоритет, який використовуватиметься при завантаженні альбомів, випущених понад 14 днів тому",
|
|
||||||
"MissingTracks": "Відсутні треки",
|
|
||||||
"MissingTracksArtistMonitored": "Відсутні треки (виконавець відстежується)",
|
|
||||||
"AddMetadataProfile": "Додати профіль метаданих",
|
|
||||||
"AddedArtistSettings": "Додано налаштування артиста",
|
|
||||||
"AlbumCount": "Кількість альбомів",
|
|
||||||
"AlbumHasNotAired": "Альбом не був випущений",
|
|
||||||
"AlbumInfo": "Інформація про альбом",
|
|
||||||
"AlbumIsNotMonitored": "Альбом не моніториться",
|
|
||||||
"AlbumRelease": "Випуск альбому",
|
|
||||||
"AlbumStudio": "Студійний альбом",
|
|
||||||
"AllArtistAlbums": "Усі альбоми виконавця",
|
|
||||||
"AllMonitoringOptionHelpText": "Відстежувати виконавців та всі альбоми кожного виконавця, включеного до списку імпорту",
|
|
||||||
"AllowArtistChangeClickToChangeArtist": "Натисніть, щоб змінити виконавця",
|
|
||||||
"AllowFingerprinting": "Дозволити створення аудіовідбитків",
|
|
||||||
"AllowFingerprintingHelpTextWarning": "Для цього програмі 1 {appName} потрібно зчитати частини файлу, що сповільнить сканування та може спричинити високу активність диска або мережі",
|
|
||||||
"AnyReleaseOkHelpText": "{appName} автоматично перемкнеться на реліз, який найкраще відповідає завантаженим трекам",
|
|
||||||
"ArtistClickToChangeAlbum": "Натисніть, щоб змінити альбом",
|
|
||||||
"ArtistEditor": "Редактор виконавця",
|
|
||||||
"ArtistFolderFormat": "Формат папки виконавця",
|
|
||||||
"ArtistProgressBarText": "Завантажено файлів: {trackFileCount} / Всього треків у файлах: {trackCount} (Всього треків у релізі: {totalTrackCount}, Завантажується треків: {downloadingCount})",
|
|
||||||
"AutomaticallySwitchRelease": "Автоматично вибирати реліз",
|
|
||||||
"BannerOptions": "Параметри банера",
|
|
||||||
"Banners": "Банери",
|
|
||||||
"CatalogNumber": "Каталожний номер",
|
|
||||||
"Disambiguation": "Розрізнення",
|
|
||||||
"DiscCount": "Кількість дисків",
|
|
||||||
"DiscNumber": "Номер диску",
|
|
||||||
"IsExpandedHideTracks": "Приховати треки",
|
|
||||||
"ManageTracks": "Керувати треками",
|
|
||||||
"ScrubExistingTags": "Очистити існуючі теги",
|
|
||||||
"PathHelpText": "Коренева папка, що містить вашу музичну бібліотеку",
|
|
||||||
"RecycleBinUnableToWriteHealthCheck": "Не вдається записати до налаштованої папки кошика: {0}. Переконайтеся, що цей шлях існує і доступний для запису користувачем, який запустив {appName}",
|
|
||||||
"SelectArtist": "Вибрати виконавця",
|
|
||||||
"ShowNextAlbumHelpText": "Показувати наступний альбом під постером",
|
|
||||||
"ShouldMonitorExistingHelpText": "Автоматично відстежувати альбоми зі цього списку, які вже є в {appName}",
|
|
||||||
"UnableToLoadInteractiveSearch": "Не вдалося завантажити результати для цього пошуку альбому. Спробуйте пізніше",
|
|
||||||
"SpecificMonitoringOptionHelpText": "Відстежувати виконавців, але відстежувати лише альбоми, явно включені до списку",
|
|
||||||
"SearchForAllMissingAlbumsConfirmationCount": "Ви впевнені, що хочете шукати всі {totalRecords} відсутніх альбомів?",
|
|
||||||
"NoHistoryBlocklist": "Немає історії заблокованих елементів",
|
|
||||||
"QualityProfileIdHelpText": "Елементи списку профілів якості слід додавати за допомогою",
|
|
||||||
"ShouldSearchHelpText": "Пошук в індексаторах нових доданих елементів. Обережно використовуйте для великих списків.",
|
|
||||||
"NotificationsEmbySettingsSendNotificationsHelpText": "Відправляти сповіщення MediaBrowser на налаштовані провайдери",
|
|
||||||
"TrackFileRenamedTooltip": "Файл треку перейменовано",
|
|
||||||
"TrackMissingFromDisk": "Трек відсутній на диску",
|
|
||||||
"WatchLibraryForChangesHelpText": "Автоматично сканувати при зміні файлів у кореневій папці",
|
|
||||||
"MonitorNewItems": "Відстежувати нові альбоми",
|
|
||||||
"ReleaseProfileTagArtistHelpText": "Профілі випуску застосовуватимуться до виконавців, які мають хоча б один відповідний тег. Залиште порожнім, щоб застосувати до всіх виконавців",
|
|
||||||
"ReplaceExistingFiles": "Замінити існуючі файли",
|
|
||||||
"Retag": "Перетегувати",
|
|
||||||
"Retagged": "Перетеговано",
|
|
||||||
"TotalTrackCountTracksTotalTrackFileCountTracksWithFilesInterp": "Всього {0} треків. {1} треків з файлами.",
|
|
||||||
"UnableToLoadMetadataProviderSettings": "Не вдалося завантажити налаштування постачальника метаданих",
|
|
||||||
"RenameTracks": "Перейменувати треки",
|
|
||||||
"NoMediumInformation": "Інформація про носій недоступна",
|
|
||||||
"NotificationsTagsArtistHelpText": "Надсилати сповіщення лише для виконавців, які мають хоча б один відповідний тег",
|
|
||||||
"OnArtistAdd": "При додаванні виконавця",
|
|
||||||
"OnArtistDelete": "При видаленні виконавця",
|
|
||||||
"OnImportFailure": "При помилці імпорту",
|
|
||||||
"OneAlbum": "1 альбом",
|
|
||||||
"PastDays": "Минулі дні",
|
|
||||||
"PastDaysHelpText": "Кількість днів для перегляду минулих подій у фіді iCa",
|
|
||||||
"Playlist": "Плейлист",
|
|
||||||
"ProfilesSettingsArtistSummary": "Якість, метадані, затримка та профілі випуску",
|
|
||||||
"RetagSelectedArtists": "Перетегувати вибраних виконавців",
|
|
||||||
"SearchBoxPlaceHolder": "напр., Breaking Benjamin, lidarr:854a1807-025b-42a8-ba8c-2a39717f1d25",
|
|
||||||
"SearchForAllCutoffUnmetAlbums": "Пошук усіх альбомів, які не відповідають критерію відсікання",
|
|
||||||
"SecondaryAlbumTypes": "Другорядні типи альбомів",
|
|
||||||
"SecondaryTypes": "Другорядні типи",
|
|
||||||
"ShouldMonitorExisting": "Відстежувати існуючі альбоми",
|
|
||||||
"ShowBannersHelpText": "Показувати банери замість назв",
|
|
||||||
"SkipRedownloadHelpText": "Запобігає спробам {appName} завантажувати альтернативні випуски для видалених елементів.",
|
|
||||||
"ReleasesHelpText": "Змінити випуск для цього альбому",
|
|
||||||
"MusicBrainzAlbumID": "MusicBrainz Альбом ID",
|
|
||||||
"MusicBrainzArtistID": "MusicBrainz викаонавець ID",
|
|
||||||
"NoTracksInThisMedium": "На цьому носії немає треків",
|
|
||||||
"OnReleaseImport": "При імпорті релізу",
|
|
||||||
"SearchForAllCutoffUnmetAlbumsConfirmationCount": "Ви впевнені, що хочете шукати всі {totalRecords} альбомів, які не відповідають критерію відсікання?",
|
|
||||||
"SelectTracks": "Вибрати треки",
|
|
||||||
"TrackArtist": "Виконавець треку",
|
|
||||||
"TrackCount": "Кількість треків",
|
|
||||||
"TrackDownloaded": "Трек завантажено",
|
|
||||||
"TrackFileCounttotalTrackCountTracksDownloadedInterp": "Завантажено {0} з {1} треків",
|
|
||||||
"WriteMetadataToAudioFiles": "Записувати метадані до аудіофайлів",
|
|
||||||
"WriteAudioTagsHelpTextWarning": "Вибір \"Усі файли\" змінить існуючі файли під час їх імпорту.",
|
|
||||||
"WriteMetadataTags": "Записати теги метаданих",
|
|
||||||
"MusicBrainzRecordingID": "MusicBrainz запису ID",
|
|
||||||
"MusicBrainzReleaseID": "MusicBrainz релізу ID",
|
|
||||||
"MusicBrainzTrackID": "MusicBrainz Track ID",
|
|
||||||
"MusicbrainzId": "Musicbrainz Id",
|
|
||||||
"NewAlbums": "Нові альбоми",
|
|
||||||
"NextAlbum": "Наступний альбом",
|
|
||||||
"NoAlbums": "Немає альбомів",
|
|
||||||
"NoneData": "Жоден альбом не буде відстежуватися",
|
|
||||||
"NoneMonitoringOptionHelpText": "Не відстежувати виконавців або альбоми",
|
|
||||||
"NotDiscography": "Не дискографія",
|
|
||||||
"OnAlbumDelete": "При видаленні альбому",
|
|
||||||
"OnDownloadFailure": "При помилці завантаження",
|
|
||||||
"OnTrackRetag": "При перетегуванні треку",
|
|
||||||
"PathHelpTextWarning": "Це має відрізнятися від каталогу, куди ваш клієнт завантажує файли",
|
|
||||||
"PreviewRetag": "Попередній перегляд перетегування",
|
|
||||||
"PrimaryAlbumTypes": "Основні типи альбомів",
|
|
||||||
"PrimaryTypes": "Основні типи",
|
|
||||||
"Proceed": "Продовжити",
|
|
||||||
"RefreshArtist": "Оновити виконавця",
|
|
||||||
"ScrubAudioTagsHelpText": "Видалити існуючі теги з файлів, залишивши лише ті, що додані {appName}.",
|
|
||||||
"SearchAlbum": "Пошук альбому",
|
|
||||||
"SearchForAllMissingAlbums": "Пошук усіх відсутніх альбомів",
|
|
||||||
"SearchForMonitoredAlbums": "Пошук відстежуваних альбомів",
|
|
||||||
"SelectAlbum": "Вибрати альбом",
|
|
||||||
"SelectAlbumRelease": "Вибрати випуск альбому",
|
|
||||||
"SelectedCountArtistsSelectedInterp": "Вибрано {selectedCount} виконавця(ів)",
|
|
||||||
"SetAppTags": "Встановити теги {appName}.",
|
|
||||||
"ShouldMonitorHelpText": "Відстежувати виконавців та альбоми, додані з цього списку",
|
|
||||||
"ShouldSearch": "Пошук нових елементів",
|
|
||||||
"ShowAlbumCount": "Показати кількість альбомів",
|
|
||||||
"ShowLastAlbum": "Показати останній альбом",
|
|
||||||
"ShowName": "Показати назву",
|
|
||||||
"ShowNextAlbum": "Показати наступний альбом",
|
|
||||||
"ShowTitleHelpText": "Показувати ім'я виконавця під постером",
|
|
||||||
"SpecificAlbum": "Конкретний альбом",
|
|
||||||
"TagAudioFilesWithMetadata": "Тегувати аудіофайли метаданими",
|
|
||||||
"TheAlbumsFilesWillBeDeleted": "Файли альбому буде видалено",
|
|
||||||
"TrackFileDeletedTooltip": "Файл треку видалено",
|
|
||||||
"TrackFileMissingTooltip": "Файл треку відсутній",
|
|
||||||
"TrackFileTagsUpdatedTooltip": "Теги файлу треку оновлено",
|
|
||||||
"TrackFiles": "Файли треків",
|
|
||||||
"TrackFilesLoadError": "Не вдалося завантажити файли треків",
|
|
||||||
"TrackImported": "Трек імпортовано",
|
|
||||||
"TrackNaming": "Іменування треків",
|
|
||||||
"TrackProgress": "Прогрес треку",
|
|
||||||
"TrackStatus": "Статус треку",
|
|
||||||
"TracksLoadError": "Не вдалося завантажити треки",
|
|
||||||
"UpdatingIsDisabledInsideADockerContainerUpdateTheContainerImageInstead": "Оновлення вимкнено всередині контейнера Docker. Оновіть образ контейнера.",
|
|
||||||
"WatchRootFoldersForFileChanges": "Слідкувати за змінами файлів у кореневих папках"
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1349,7 +1349,5 @@
|
||||||
"WaitingToImport": "等待导入",
|
"WaitingToImport": "等待导入",
|
||||||
"WaitingToProcess": "等待处理",
|
"WaitingToProcess": "等待处理",
|
||||||
"DelayProfileArtistTagsHelpText": "应用到至少有一个标签匹配的艺术家",
|
"DelayProfileArtistTagsHelpText": "应用到至少有一个标签匹配的艺术家",
|
||||||
"AlbumInfo": "专辑 信息",
|
"AlbumInfo": "专辑 信息"
|
||||||
"DownloadClientSettingsOlderPriorityAlbumHelpText": "优先使用14天前发布的专辑",
|
|
||||||
"DownloadClientSettingsRecentPriorityAlbumHelpText": "优先使用过去14天内发布的专辑"
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,9 +4,5 @@
|
||||||
"Always": "总是",
|
"Always": "总是",
|
||||||
"Analytics": "分析",
|
"Analytics": "分析",
|
||||||
"Username": "用户名",
|
"Username": "用户名",
|
||||||
"Activity": "活动",
|
"Activity": "活动"
|
||||||
"UseProxy": "使用代理",
|
|
||||||
"Uptime": "运行时间",
|
|
||||||
"Warn": "警告",
|
|
||||||
"Updates": "更新"
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,10 +65,6 @@ namespace NzbDrone.Core.MediaFiles
|
||||||
_logger.Debug("Removing existing track file: {0}", file);
|
_logger.Debug("Removing existing track file: {0}", file);
|
||||||
_recycleBinProvider.DeleteFile(trackFilePath, subfolder);
|
_recycleBinProvider.DeleteFile(trackFilePath, subfolder);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
_logger.Warn("Existing track file missing from disk: {0}", trackFilePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
moveFileResult.OldFiles.Add(file);
|
moveFileResult.OldFiles.Add(file);
|
||||||
_mediaFileService.Delete(file, DeleteMediaFileReason.Upgrade);
|
_mediaFileService.Delete(file, DeleteMediaFileReason.Upgrade);
|
||||||
|
|
|
@ -18,8 +18,6 @@ namespace NzbDrone.Core.Music
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool ShouldRefresh(Album album)
|
public bool ShouldRefresh(Album album)
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
if (album.LastInfoSync < DateTime.UtcNow.AddDays(-60))
|
if (album.LastInfoSync < DateTime.UtcNow.AddDays(-60))
|
||||||
{
|
{
|
||||||
|
@ -42,11 +40,5 @@ namespace NzbDrone.Core.Music
|
||||||
_logger.Trace("Album {0} released long ago and recently refreshed, should not be refreshed.", album.Title);
|
_logger.Trace("Album {0} released long ago and recently refreshed, should not be refreshed.", album.Title);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
_logger.Error(e, "Unable to determine if album should refresh, will try to refresh.");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,8 +21,6 @@ namespace NzbDrone.Core.Music
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool ShouldRefresh(Artist artist)
|
public bool ShouldRefresh(Artist artist)
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
if (artist.LastInfoSync == null)
|
if (artist.LastInfoSync == null)
|
||||||
{
|
{
|
||||||
|
@ -59,11 +57,5 @@ namespace NzbDrone.Core.Music
|
||||||
_logger.Trace("Artist {0} ended long ago, should not be refreshed.", artist.Name);
|
_logger.Trace("Artist {0} ended long ago, should not be refreshed.", artist.Name);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
_logger.Error(e, "Unable to determine if artist should refresh, will try to refresh.");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -347,7 +347,7 @@ namespace NzbDrone.Core.Notifications.CustomScript
|
||||||
{
|
{
|
||||||
if (artist == null)
|
if (artist == null)
|
||||||
{
|
{
|
||||||
return new List<string>();
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return _tagRepository.GetTags(artist.Tags)
|
return _tagRepository.GetTags(artist.Tags)
|
||||||
|
|
|
@ -514,9 +514,9 @@ namespace NzbDrone.Core.Notifications.Discord
|
||||||
{
|
{
|
||||||
var albumTitles = string.Join(" + ", albums.Select(e => e.Title));
|
var albumTitles = string.Join(" + ", albums.Select(e => e.Title));
|
||||||
|
|
||||||
var title = $"{artist.Name} - {albumTitles}".Replace("`", "\\`");
|
var title = $"{artist.Name} - {albumTitles}";
|
||||||
|
|
||||||
return title.Length > 256 ? $"{title.AsSpan(0, 253).TrimEnd('\\')}..." : title;
|
return title.Length > 256 ? $"{title.AsSpan(0, 253)}..." : title;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,11 +96,6 @@ namespace NzbDrone.Core.RemotePathMappings
|
||||||
throw new ArgumentException("Invalid Host");
|
throw new ArgumentException("Invalid Host");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mapping.RemotePath.StartsWith(" "))
|
|
||||||
{
|
|
||||||
throw new ArgumentException("Remote Path must not start with a space");
|
|
||||||
}
|
|
||||||
|
|
||||||
var remotePath = new OsPath(mapping.RemotePath);
|
var remotePath = new OsPath(mapping.RemotePath);
|
||||||
var localPath = new OsPath(mapping.LocalPath);
|
var localPath = new OsPath(mapping.LocalPath);
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,6 @@ using NzbDrone.Test.Common;
|
||||||
namespace NzbDrone.Integration.Test.ApiTests
|
namespace NzbDrone.Integration.Test.ApiTests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
|
||||||
public class ArtistEditorFixture : IntegrationTest
|
public class ArtistEditorFixture : IntegrationTest
|
||||||
{
|
{
|
||||||
private void GivenExistingArtist()
|
private void GivenExistingArtist()
|
||||||
|
|
|
@ -7,7 +7,6 @@ using NUnit.Framework;
|
||||||
namespace NzbDrone.Integration.Test.ApiTests
|
namespace NzbDrone.Integration.Test.ApiTests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
|
||||||
public class ArtistFixture : IntegrationTest
|
public class ArtistFixture : IntegrationTest
|
||||||
{
|
{
|
||||||
[Test]
|
[Test]
|
||||||
|
|
|
@ -4,7 +4,6 @@ using NUnit.Framework;
|
||||||
namespace NzbDrone.Integration.Test.ApiTests
|
namespace NzbDrone.Integration.Test.ApiTests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
|
||||||
public class ArtistLookupFixture : IntegrationTest
|
public class ArtistLookupFixture : IntegrationTest
|
||||||
{
|
{
|
||||||
[TestCase("Kiss", "Kiss")]
|
[TestCase("Kiss", "Kiss")]
|
||||||
|
|
|
@ -6,7 +6,6 @@ using NUnit.Framework;
|
||||||
namespace NzbDrone.Integration.Test.ApiTests
|
namespace NzbDrone.Integration.Test.ApiTests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
|
||||||
public class BlocklistFixture : IntegrationTest
|
public class BlocklistFixture : IntegrationTest
|
||||||
{
|
{
|
||||||
private ArtistResource _artist;
|
private ArtistResource _artist;
|
||||||
|
|
|
@ -9,7 +9,6 @@ using NzbDrone.Integration.Test.Client;
|
||||||
namespace NzbDrone.Integration.Test.ApiTests
|
namespace NzbDrone.Integration.Test.ApiTests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
|
||||||
public class CalendarFixture : IntegrationTest
|
public class CalendarFixture : IntegrationTest
|
||||||
{
|
{
|
||||||
public ClientBase<AlbumResource> Calendar;
|
public ClientBase<AlbumResource> Calendar;
|
||||||
|
|
|
@ -7,7 +7,6 @@ using NUnit.Framework;
|
||||||
namespace NzbDrone.Integration.Test.ApiTests
|
namespace NzbDrone.Integration.Test.ApiTests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
|
||||||
public class TrackFixture : IntegrationTest
|
public class TrackFixture : IntegrationTest
|
||||||
{
|
{
|
||||||
private ArtistResource _artist;
|
private ArtistResource _artist;
|
||||||
|
|
|
@ -8,7 +8,6 @@ using NzbDrone.Core.Qualities;
|
||||||
namespace NzbDrone.Integration.Test.ApiTests.WantedTests
|
namespace NzbDrone.Integration.Test.ApiTests.WantedTests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
|
||||||
public class CutoffUnmetFixture : IntegrationTest
|
public class CutoffUnmetFixture : IntegrationTest
|
||||||
{
|
{
|
||||||
[SetUp]
|
[SetUp]
|
||||||
|
|
|
@ -7,7 +7,6 @@ using NzbDrone.Core.Music;
|
||||||
namespace NzbDrone.Integration.Test.ApiTests.WantedTests
|
namespace NzbDrone.Integration.Test.ApiTests.WantedTests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
|
||||||
public class MissingFixture : IntegrationTest
|
public class MissingFixture : IntegrationTest
|
||||||
{
|
{
|
||||||
[SetUp]
|
[SetUp]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue