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/*
|
||||
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
|
||||
node_modules
|
||||
node_modules.nosync
|
||||
|
||||
# API doc generation
|
||||
.config/
|
||||
|
||||
# Ignore Jetbrains IntelliJ Workspace Directories
|
||||
.idea/
|
||||
|
|
|
@ -9,7 +9,7 @@ variables:
|
|||
testsFolder: './_tests'
|
||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||
majorVersion: '2.13.1'
|
||||
majorVersion: '2.12.0'
|
||||
minorVersion: $[counter('minorVersion', 1076)]
|
||||
lidarrVersion: '$(majorVersion).$(minorVersion)'
|
||||
buildName: '$(Build.SourceBranchName).$(lidarrVersion)'
|
||||
|
|
|
@ -224,58 +224,10 @@ class SignalRConnector extends Component {
|
|||
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 = () => {
|
||||
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) => {
|
||||
const action = body.action;
|
||||
const section = 'artist';
|
||||
|
|
|
@ -94,9 +94,9 @@ class RootFolder extends Component {
|
|||
<ConfirmModal
|
||||
isOpen={this.state.isDeleteRootFolderModalOpen}
|
||||
kind={kinds.DANGER}
|
||||
title={translate('RemoveRootFolder')}
|
||||
message={translate('RemoveRootFolderArtistsMessageText', { name })}
|
||||
confirmLabel={translate('Remove')}
|
||||
title={translate('DeleteRootFolder')}
|
||||
message={translate('DeleteRootFolderMessageText', { name })}
|
||||
confirmLabel={translate('Delete')}
|
||||
onConfirm={this.onConfirmDeleteRootFolder}
|
||||
onCancel={this.onDeleteRootFolderModalClose}
|
||||
/>
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
height: 20px;
|
||||
}
|
||||
|
||||
.track {
|
||||
.bar {
|
||||
top: 9px;
|
||||
margin: 0 5px;
|
||||
height: 3px;
|
||||
|
@ -36,7 +36,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
.thumb {
|
||||
.handle {
|
||||
top: 1px;
|
||||
z-index: 0 !important;
|
||||
width: 18px;
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
// This file is automatically generated.
|
||||
// Please do not change this file!
|
||||
interface CssExports {
|
||||
'bar': string;
|
||||
'handle': string;
|
||||
'kilobitsPerSecond': string;
|
||||
'quality': string;
|
||||
'qualityDefinition': string;
|
||||
|
@ -8,9 +10,7 @@ interface CssExports {
|
|||
'sizeLimit': string;
|
||||
'sizes': string;
|
||||
'slider': string;
|
||||
'thumb': string;
|
||||
'title': string;
|
||||
'track': string;
|
||||
}
|
||||
export const cssExports: 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
|
||||
|
||||
|
@ -195,7 +174,6 @@ class QualityDefinition extends Component {
|
|||
|
||||
<div className={styles.sizeLimit}>
|
||||
<ReactSlider
|
||||
className={styles.slider}
|
||||
min={slider.min}
|
||||
max={slider.max}
|
||||
step={slider.step}
|
||||
|
@ -204,9 +182,9 @@ class QualityDefinition extends Component {
|
|||
withTracks={true}
|
||||
allowCross={false}
|
||||
snapDragDisabled={true}
|
||||
pearling={true}
|
||||
renderThumb={this.thumbRenderer}
|
||||
renderTrack={this.trackRenderer}
|
||||
className={styles.slider}
|
||||
trackClassName={styles.bar}
|
||||
thumbClassName={styles.handle}
|
||||
onChange={this.onSliderChange}
|
||||
onAfterChange={this.onAfterSliderChange}
|
||||
/>
|
||||
|
|
|
@ -151,7 +151,7 @@ export const defaultState = {
|
|||
{
|
||||
name: 'genres',
|
||||
label: () => translate('Genres'),
|
||||
isSortable: true,
|
||||
isSortable: false,
|
||||
isVisible: false
|
||||
},
|
||||
{
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import Alert from 'Components/Alert';
|
||||
import Link from 'Components/Link/Link';
|
||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||
import InlineMarkdown from 'Components/Markdown/InlineMarkdown';
|
||||
import PageContent from 'Components/Page/PageContent';
|
||||
import PageContentBody from 'Components/Page/PageContentBody';
|
||||
import PageToolbar from 'Components/Page/Toolbar/PageToolbar';
|
||||
|
@ -77,16 +77,15 @@ class LogFiles extends Component {
|
|||
<PageContentBody>
|
||||
<Alert>
|
||||
<div>
|
||||
{translate('LogFilesLocation', {
|
||||
location
|
||||
})}
|
||||
Log files are located in: {location}
|
||||
</div>
|
||||
|
||||
{currentLogView === 'Log Files' ? (
|
||||
{
|
||||
currentLogView === 'Log Files' &&
|
||||
<div>
|
||||
<InlineMarkdown data={translate('TheLogLevelDefault')} />
|
||||
The log level defaults to 'Info' and can be changed in <Link to="/settings/general">General Settings</Link>
|
||||
</div>
|
||||
) : null}
|
||||
}
|
||||
</Alert>
|
||||
|
||||
{
|
||||
|
|
|
@ -270,7 +270,7 @@ function Updates() {
|
|||
|
||||
{generalSettingsError ? (
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('FailedToFetchSettings')}
|
||||
{translate('FailedToUpdateSettings')}
|
||||
</Alert>
|
||||
) : null}
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
using FluentValidation;
|
||||
using Lidarr.Http;
|
||||
using NzbDrone.Core.Download;
|
||||
using NzbDrone.SignalR;
|
||||
|
||||
namespace Lidarr.Api.V1.DownloadClient
|
||||
{
|
||||
|
@ -11,8 +10,8 @@ namespace Lidarr.Api.V1.DownloadClient
|
|||
public static readonly DownloadClientResourceMapper ResourceMapper = new ();
|
||||
public static readonly DownloadClientBulkResourceMapper BulkResourceMapper = new ();
|
||||
|
||||
public DownloadClientController(IBroadcastSignalRMessage signalRBroadcaster, IDownloadClientFactory downloadClientFactory)
|
||||
: base(signalRBroadcaster, downloadClientFactory, "downloadclient", ResourceMapper, BulkResourceMapper)
|
||||
public DownloadClientController(IDownloadClientFactory downloadClientFactory)
|
||||
: base(downloadClientFactory, "downloadclient", ResourceMapper, BulkResourceMapper)
|
||||
{
|
||||
SharedValidator.RuleFor(c => c.Priority).InclusiveBetween(1, 50);
|
||||
}
|
||||
|
|
|
@ -3,7 +3,6 @@ using Lidarr.Http;
|
|||
using NzbDrone.Core.ImportLists;
|
||||
using NzbDrone.Core.Validation;
|
||||
using NzbDrone.Core.Validation.Paths;
|
||||
using NzbDrone.SignalR;
|
||||
|
||||
namespace Lidarr.Api.V1.ImportLists
|
||||
{
|
||||
|
@ -13,12 +12,11 @@ namespace Lidarr.Api.V1.ImportLists
|
|||
public static readonly ImportListResourceMapper ResourceMapper = new ();
|
||||
public static readonly ImportListBulkResourceMapper BulkResourceMapper = new ();
|
||||
|
||||
public ImportListController(IBroadcastSignalRMessage signalRBroadcaster,
|
||||
IImportListFactory importListFactory,
|
||||
public ImportListController(IImportListFactory importListFactory,
|
||||
RootFolderExistsValidator rootFolderExistsValidator,
|
||||
QualityProfileExistsValidator qualityProfileExistsValidator,
|
||||
MetadataProfileExistsValidator metadataProfileExistsValidator)
|
||||
: base(signalRBroadcaster, importListFactory, "importlist", ResourceMapper, BulkResourceMapper)
|
||||
: base(importListFactory, "importlist", ResourceMapper, BulkResourceMapper)
|
||||
{
|
||||
SharedValidator.RuleFor(c => c.RootFolderPath).Cascade(CascadeMode.Stop)
|
||||
.IsValidPath()
|
||||
|
|
|
@ -2,7 +2,6 @@ using FluentValidation;
|
|||
using Lidarr.Http;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.Validation;
|
||||
using NzbDrone.SignalR;
|
||||
|
||||
namespace Lidarr.Api.V1.Indexers
|
||||
{
|
||||
|
@ -12,10 +11,8 @@ namespace Lidarr.Api.V1.Indexers
|
|||
public static readonly IndexerResourceMapper ResourceMapper = new ();
|
||||
public static readonly IndexerBulkResourceMapper BulkResourceMapper = new ();
|
||||
|
||||
public IndexerController(IBroadcastSignalRMessage signalRBroadcaster,
|
||||
IndexerFactory indexerFactory,
|
||||
DownloadClientExistsValidator downloadClientExistsValidator)
|
||||
: base(signalRBroadcaster, indexerFactory, "indexer", ResourceMapper, BulkResourceMapper)
|
||||
public IndexerController(IndexerFactory indexerFactory, DownloadClientExistsValidator downloadClientExistsValidator)
|
||||
: base(indexerFactory, "indexer", ResourceMapper, BulkResourceMapper)
|
||||
{
|
||||
SharedValidator.RuleFor(c => c.Priority).InclusiveBetween(1, 50);
|
||||
SharedValidator.RuleFor(c => c.DownloadClientId).SetValidator(downloadClientExistsValidator);
|
||||
|
|
|
@ -2,7 +2,6 @@ using System;
|
|||
using Lidarr.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using NzbDrone.Core.Extras.Metadata;
|
||||
using NzbDrone.SignalR;
|
||||
|
||||
namespace Lidarr.Api.V1.Metadata
|
||||
{
|
||||
|
@ -12,8 +11,8 @@ namespace Lidarr.Api.V1.Metadata
|
|||
public static readonly MetadataResourceMapper ResourceMapper = new ();
|
||||
public static readonly MetadataBulkResourceMapper BulkResourceMapper = new ();
|
||||
|
||||
public MetadataController(IBroadcastSignalRMessage signalRBroadcaster, IMetadataFactory metadataFactory)
|
||||
: base(signalRBroadcaster, metadataFactory, "metadata", ResourceMapper, BulkResourceMapper)
|
||||
public MetadataController(IMetadataFactory metadataFactory)
|
||||
: base(metadataFactory, "metadata", ResourceMapper, BulkResourceMapper)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@ using System;
|
|||
using Lidarr.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using NzbDrone.Core.Notifications;
|
||||
using NzbDrone.SignalR;
|
||||
|
||||
namespace Lidarr.Api.V1.Notifications
|
||||
{
|
||||
|
@ -12,8 +11,8 @@ namespace Lidarr.Api.V1.Notifications
|
|||
public static readonly NotificationResourceMapper ResourceMapper = new ();
|
||||
public static readonly NotificationBulkResourceMapper BulkResourceMapper = new ();
|
||||
|
||||
public NotificationController(IBroadcastSignalRMessage signalRBroadcaster, NotificationFactory notificationFactory)
|
||||
: base(signalRBroadcaster, notificationFactory, "notification", ResourceMapper, BulkResourceMapper)
|
||||
public NotificationController(NotificationFactory notificationFactory)
|
||||
: base(notificationFactory, "notification", ResourceMapper, BulkResourceMapper)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -7,19 +7,12 @@ using Lidarr.Http.REST.Attributes;
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Serializer;
|
||||
using NzbDrone.Core.Datastore.Events;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
using NzbDrone.Core.ThingiProvider;
|
||||
using NzbDrone.Core.ThingiProvider.Events;
|
||||
using NzbDrone.Core.Validation;
|
||||
using NzbDrone.SignalR;
|
||||
|
||||
namespace Lidarr.Api.V1
|
||||
{
|
||||
public abstract class ProviderControllerBase<TProviderResource, TBulkProviderResource, TProvider, TProviderDefinition> : RestControllerWithSignalR<TProviderResource, TProviderDefinition>,
|
||||
IHandle<ProviderAddedEvent<TProvider>>,
|
||||
IHandle<ProviderUpdatedEvent<TProvider>>,
|
||||
IHandle<ProviderDeletedEvent<TProvider>>
|
||||
public abstract class ProviderControllerBase<TProviderResource, TBulkProviderResource, TProvider, TProviderDefinition> : RestController<TProviderResource>
|
||||
where TProviderDefinition : ProviderDefinition, new()
|
||||
where TProvider : IProvider
|
||||
where TProviderResource : ProviderResource<TProviderResource>, new()
|
||||
|
@ -29,13 +22,11 @@ namespace Lidarr.Api.V1
|
|||
private readonly ProviderResourceMapper<TProviderResource, TProviderDefinition> _resourceMapper;
|
||||
private readonly ProviderBulkResourceMapper<TBulkProviderResource, TProviderDefinition> _bulkResourceMapper;
|
||||
|
||||
protected ProviderControllerBase(IBroadcastSignalRMessage signalRBroadcaster,
|
||||
IProviderFactory<TProvider,
|
||||
protected ProviderControllerBase(IProviderFactory<TProvider,
|
||||
TProviderDefinition> providerFactory,
|
||||
string resource,
|
||||
ProviderResourceMapper<TProviderResource, TProviderDefinition> resourceMapper,
|
||||
ProviderBulkResourceMapper<TBulkProviderResource, TProviderDefinition> bulkResourceMapper)
|
||||
: base(signalRBroadcaster)
|
||||
{
|
||||
_providerFactory = providerFactory;
|
||||
_resourceMapper = resourceMapper;
|
||||
|
@ -270,24 +261,6 @@ namespace Lidarr.Api.V1
|
|||
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)
|
||||
{
|
||||
var validationResult = definition.Settings.Validate();
|
||||
|
|
|
@ -4,7 +4,6 @@ using Lidarr.Http;
|
|||
using Lidarr.Http.REST;
|
||||
using Lidarr.Http.REST.Attributes;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
using NzbDrone.Core.Validation.Paths;
|
||||
|
||||
|
@ -28,14 +27,6 @@ namespace Lidarr.Api.V1.RemotePathMappings
|
|||
SharedValidator.RuleFor(c => c.RemotePath)
|
||||
.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)
|
||||
.Cascade(CascadeMode.Stop)
|
||||
.IsValidPath()
|
||||
|
|
|
@ -92,7 +92,7 @@ namespace Lidarr.Api.V1.System.Backup
|
|||
}
|
||||
|
||||
[HttpPost("restore/upload")]
|
||||
[RequestFormLimits(MultipartBodyLengthLimit = 5000000000)]
|
||||
[RequestFormLimits(MultipartBodyLengthLimit = 1000000000)]
|
||||
public object UploadAndRestore()
|
||||
{
|
||||
var files = Request.Form.Files;
|
||||
|
|
|
@ -40,16 +40,15 @@ namespace NzbDrone.Automation.Test
|
|||
var service = ChromeDriverService.CreateDefaultService();
|
||||
|
||||
// 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.FullScreen();
|
||||
|
||||
_runner = new NzbDroneRunner(LogManager.GetCurrentClassLogger(), null);
|
||||
_runner.KillAll();
|
||||
_runner.Start(true);
|
||||
|
||||
driver.Navigate().GoToUrl("http://localhost:8686");
|
||||
driver.Url = "http://localhost:8686";
|
||||
|
||||
var page = new PageBase(driver);
|
||||
page.WaitForNoSpinner();
|
||||
|
@ -69,7 +68,7 @@ namespace NzbDrone.Automation.Test
|
|||
{
|
||||
try
|
||||
{
|
||||
var image = (driver as ITakesScreenshot).GetScreenshot();
|
||||
var image = ((ITakesScreenshot)driver).GetScreenshot();
|
||||
image.SaveAsFile($"./{name}_test_screenshot.png", ScreenshotImageFormat.Png);
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
|
|
@ -1,17 +1,19 @@
|
|||
using System;
|
||||
using System.Threading;
|
||||
using OpenQA.Selenium;
|
||||
using OpenQA.Selenium.Remote;
|
||||
using OpenQA.Selenium.Support.UI;
|
||||
|
||||
namespace NzbDrone.Automation.Test.PageModel
|
||||
{
|
||||
public class PageBase
|
||||
{
|
||||
private readonly IWebDriver _driver;
|
||||
private readonly RemoteWebDriver _driver;
|
||||
|
||||
public PageBase(IWebDriver driver)
|
||||
public PageBase(RemoteWebDriver driver)
|
||||
{
|
||||
_driver = driver;
|
||||
driver.Manage().Window.Maximize();
|
||||
}
|
||||
|
||||
public IWebElement FindByClass(string className, int timeout = 5)
|
||||
|
|
|
@ -141,7 +141,7 @@ namespace NzbDrone.Common.Http.Dispatchers
|
|||
}
|
||||
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>
|
||||
<ItemGroup>
|
||||
<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="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="NLog" Version="5.4.0" />
|
||||
|
|
|
@ -103,7 +103,6 @@ namespace NzbDrone.Core.Test.DiskSpace
|
|||
[TestCase("/var/lib/docker")]
|
||||
[TestCase("/some/place/docker/aufs")]
|
||||
[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)
|
||||
{
|
||||
var mount = new Mock<IMount>();
|
||||
|
|
|
@ -14,7 +14,6 @@ using NzbDrone.Core.Test.Framework;
|
|||
namespace NzbDrone.Core.Test.MetadataSource.SkyHook
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class SkyHookProxyFixture : CoreTest<SkyHookProxy>
|
||||
{
|
||||
private MetadataProfile _metadataProfile;
|
||||
|
|
|
@ -12,7 +12,6 @@ using NzbDrone.Test.Common;
|
|||
namespace NzbDrone.Core.Test.MetadataSource.SkyHook
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class SkyHookProxySearchFixture : CoreTest<SkyHookProxy>
|
||||
{
|
||||
[SetUp]
|
||||
|
|
|
@ -11,7 +11,6 @@ namespace NzbDrone.Core.CustomFormats
|
|||
{
|
||||
RuleFor(c => c.Min).GreaterThanOrEqualTo(0);
|
||||
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 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,
|
||||
IRootFolderService rootFolderService,
|
||||
|
@ -38,10 +38,7 @@ namespace NzbDrone.Core.DiskSpace
|
|||
|
||||
var optionalRootFolders = GetFixedDisksRootPaths().Except(importantRootFolders).Distinct().ToList();
|
||||
|
||||
var diskSpace = GetDiskSpace(importantRootFolders)
|
||||
.Concat(GetDiskSpace(optionalRootFolders, true))
|
||||
.OrderBy(d => d.Path, StringComparer.OrdinalIgnoreCase)
|
||||
.ToList();
|
||||
var diskSpace = GetDiskSpace(importantRootFolders).Concat(GetDiskSpace(optionalRootFolders, true)).ToList();
|
||||
|
||||
return diskSpace;
|
||||
}
|
||||
|
@ -57,7 +54,7 @@ namespace NzbDrone.Core.DiskSpace
|
|||
private IEnumerable<string> GetFixedDisksRootPaths()
|
||||
{
|
||||
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))
|
||||
.Select(d => d.RootDirectory);
|
||||
}
|
||||
|
|
|
@ -9,7 +9,6 @@ using NzbDrone.Common.Extensions;
|
|||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Blocklisting;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
|
@ -29,10 +28,9 @@ namespace NzbDrone.Core.Download.Clients.Aria2
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
|
|
@ -9,7 +9,6 @@ using NzbDrone.Common.Extensions;
|
|||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Blocklisting;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||
using NzbDrone.Core.Organizer;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
|
@ -31,10 +30,9 @@ namespace NzbDrone.Core.Download.Clients.Blackhole
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
{
|
||||
_scanWatchFolder = scanWatchFolder;
|
||||
|
||||
|
|
|
@ -7,7 +7,6 @@ using NzbDrone.Common.Disk;
|
|||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.Organizer;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
|
@ -26,9 +25,8 @@ namespace NzbDrone.Core.Download.Clients.Blackhole
|
|||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
IValidateNzbs nzbValidationService,
|
||||
ILocalizationService localizationService,
|
||||
Logger logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, localizationService, logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, logger)
|
||||
{
|
||||
_scanWatchFolder = scanWatchFolder;
|
||||
|
||||
|
|
|
@ -9,7 +9,6 @@ using NzbDrone.Common.Extensions;
|
|||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Blocklisting;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
|
@ -28,10 +27,9 @@ namespace NzbDrone.Core.Download.Clients.Deluge
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
|
|
@ -11,7 +11,6 @@ using NzbDrone.Common.Http;
|
|||
using NzbDrone.Core.Blocklisting;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Download.Clients.DownloadStation.Proxies;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
|
@ -38,10 +37,9 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
{
|
||||
_dsInfoProxy = dsInfoProxy;
|
||||
_dsTaskProxySelector = dsTaskProxySelector;
|
||||
|
|
|
@ -9,7 +9,6 @@ using NzbDrone.Common.Extensions;
|
|||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Download.Clients.DownloadStation.Proxies;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
using NzbDrone.Core.ThingiProvider;
|
||||
|
@ -35,9 +34,8 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation
|
|||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
IValidateNzbs nzbValidationService,
|
||||
ILocalizationService localizationService,
|
||||
Logger logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, localizationService, logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, logger)
|
||||
{
|
||||
_dsInfoProxy = dsInfoProxy;
|
||||
_dsTaskProxySelector = dsTaskProxySelector;
|
||||
|
|
|
@ -9,7 +9,6 @@ using NzbDrone.Common.Http;
|
|||
using NzbDrone.Core.Blocklisting;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Download.Clients.Flood.Models;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
|
@ -29,10 +28,9 @@ namespace NzbDrone.Core.Download.Clients.Flood
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
_downloadSeedConfigProvider = downloadSeedConfigProvider;
|
||||
|
|
|
@ -9,7 +9,6 @@ using NzbDrone.Common.Http;
|
|||
using NzbDrone.Core.Blocklisting;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Download.Clients.FreeboxDownload.Responses;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
|
@ -26,10 +25,9 @@ namespace NzbDrone.Core.Download.Clients.FreeboxDownload
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
|
|
@ -8,7 +8,6 @@ using NzbDrone.Common.Http;
|
|||
using NzbDrone.Core.Blocklisting;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Download.Clients.Hadouken.Models;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
|
@ -26,10 +25,9 @@ namespace NzbDrone.Core.Download.Clients.Hadouken
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
|
|
@ -8,7 +8,6 @@ using NzbDrone.Common.Disk;
|
|||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
using NzbDrone.Core.Validation;
|
||||
|
@ -25,9 +24,8 @@ namespace NzbDrone.Core.Download.Clients.NzbVortex
|
|||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
IValidateNzbs nzbValidationService,
|
||||
ILocalizationService localizationService,
|
||||
Logger logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, localizationService, logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
|
|
@ -10,7 +10,6 @@ using NzbDrone.Common.Extensions;
|
|||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Exceptions;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
using NzbDrone.Core.Validation;
|
||||
|
@ -29,9 +28,8 @@ namespace NzbDrone.Core.Download.Clients.Nzbget
|
|||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
IValidateNzbs nzbValidationService,
|
||||
ILocalizationService localizationService,
|
||||
Logger logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, localizationService, logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
|
|
@ -9,7 +9,6 @@ using NzbDrone.Common.Extensions;
|
|||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.Organizer;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
|
@ -24,9 +23,8 @@ namespace NzbDrone.Core.Download.Clients.Pneumatic
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
Logger logger)
|
||||
: base(configService, diskProvider, remotePathMappingService, localizationService, logger)
|
||||
: base(configService, diskProvider, remotePathMappingService, logger)
|
||||
{
|
||||
_httpClient = httpClient;
|
||||
}
|
||||
|
|
|
@ -10,7 +10,6 @@ using NzbDrone.Common.Extensions;
|
|||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Blocklisting;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
|
@ -36,10 +35,9 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
|||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ICacheManager cacheManager,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
{
|
||||
_proxySelector = proxySelector;
|
||||
|
||||
|
|
|
@ -10,7 +10,6 @@ using NzbDrone.Common.Extensions;
|
|||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Exceptions;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
using NzbDrone.Core.Validation;
|
||||
|
@ -27,9 +26,8 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd
|
|||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
IValidateNzbs nzbValidationService,
|
||||
ILocalizationService localizationService,
|
||||
Logger logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, localizationService, logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
|
|
@ -8,7 +8,6 @@ using NzbDrone.Common.Extensions;
|
|||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Blocklisting;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
|
||||
|
@ -25,10 +24,9 @@ namespace NzbDrone.Core.Download.Clients.Transmission
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
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.Core.Blocklisting;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
|
@ -29,10 +28,9 @@ namespace NzbDrone.Core.Download.Clients.Transmission
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
@ -103,11 +101,7 @@ namespace NzbDrone.Core.Download.Clients.Transmission
|
|||
if (!torrent.ErrorString.IsNullOrWhiteSpace())
|
||||
{
|
||||
item.Status = DownloadItemStatus.Warning;
|
||||
item.Message = _localizationService.GetLocalizedString("DownloadClientItemErrorMessage", new Dictionary<string, object>
|
||||
{
|
||||
{ "clientName", Name },
|
||||
{ "message", torrent.ErrorString }
|
||||
});
|
||||
item.Message = torrent.ErrorString;
|
||||
}
|
||||
else if (torrent.TotalSize == 0)
|
||||
{
|
||||
|
|
|
@ -5,7 +5,6 @@ using NzbDrone.Common.Http;
|
|||
using NzbDrone.Core.Blocklisting;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Download.Clients.Transmission;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
|
||||
|
@ -24,10 +23,9 @@ namespace NzbDrone.Core.Download.Clients.Vuze
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
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.Download.Clients.rTorrent;
|
||||
using NzbDrone.Core.Exceptions;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
|
@ -36,10 +35,9 @@ namespace NzbDrone.Core.Download.Clients.RTorrent
|
|||
IRemotePathMappingService remotePathMappingService,
|
||||
IDownloadSeedConfigProvider downloadSeedConfigProvider,
|
||||
IRTorrentDirectoryValidator rTorrentDirectoryValidator,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
_rTorrentDirectoryValidator = rTorrentDirectoryValidator;
|
||||
|
|
|
@ -10,7 +10,6 @@ using NzbDrone.Common.Extensions;
|
|||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Blocklisting;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
|
@ -30,10 +29,9 @@ namespace NzbDrone.Core.Download.Clients.UTorrent
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
|
||||
|
|
|
@ -8,7 +8,6 @@ using NzbDrone.Common.Disk;
|
|||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
using NzbDrone.Core.ThingiProvider;
|
||||
|
@ -24,7 +23,6 @@ namespace NzbDrone.Core.Download
|
|||
protected readonly IConfigService _configService;
|
||||
protected readonly IDiskProvider _diskProvider;
|
||||
protected readonly IRemotePathMappingService _remotePathMappingService;
|
||||
protected readonly ILocalizationService _localizationService;
|
||||
protected readonly Logger _logger;
|
||||
|
||||
protected ResiliencePipeline<HttpResponse> RetryStrategy => new ResiliencePipelineBuilder<HttpResponse>()
|
||||
|
@ -79,13 +77,11 @@ namespace NzbDrone.Core.Download
|
|||
protected DownloadClientBase(IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
Logger logger)
|
||||
{
|
||||
_configService = configService;
|
||||
_diskProvider = diskProvider;
|
||||
_remotePathMappingService = remotePathMappingService;
|
||||
_localizationService = localizationService;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Xml;
|
||||
|
@ -15,13 +14,10 @@ namespace NzbDrone.Core.Download
|
|||
public class NzbValidationService : IValidateNzbs
|
||||
{
|
||||
public void Validate(string filename, byte[] fileContent)
|
||||
{
|
||||
try
|
||||
{
|
||||
var reader = new StreamReader(new MemoryStream(fileContent));
|
||||
|
||||
using (var xmlTextReader = XmlReader.Create(reader,
|
||||
new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, IgnoreComments = true }))
|
||||
using (var xmlTextReader = XmlReader.Create(reader, new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, IgnoreComments = true }))
|
||||
{
|
||||
var xDoc = XDocument.Load(xmlTextReader);
|
||||
var nzb = xDoc.Root;
|
||||
|
@ -41,8 +37,7 @@ namespace NzbDrone.Core.Download
|
|||
|
||||
if (!nzb.Name.LocalName.Equals("nzb"))
|
||||
{
|
||||
throw new InvalidNzbException(
|
||||
"Invalid NZB: Unexpected root element. Expected 'nzb' found '{0}' [{1}]", nzb.Name.LocalName, filename);
|
||||
throw new InvalidNzbException("Invalid NZB: Unexpected root element. Expected 'nzb' found '{0}' [{1}]", nzb.Name.LocalName, filename);
|
||||
}
|
||||
|
||||
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.Exceptions;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.MediaFiles.TorrentInfo;
|
||||
using NzbDrone.Core.Organizer;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
|
@ -31,10 +30,9 @@ namespace NzbDrone.Core.Download
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(configService, diskProvider, remotePathMappingService, localizationService, logger)
|
||||
: base(configService, diskProvider, remotePathMappingService, logger)
|
||||
{
|
||||
_httpClient = httpClient;
|
||||
_blocklistService = blocklistService;
|
||||
|
@ -172,7 +170,7 @@ namespace NzbDrone.Core.Download
|
|||
}
|
||||
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);
|
||||
throw new ReleaseUnavailableException(remoteAlbum.Release, "Downloading torrent failed", ex);
|
||||
|
|
|
@ -6,7 +6,6 @@ using NzbDrone.Common.Http;
|
|||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Exceptions;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.Organizer;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
|
@ -25,9 +24,8 @@ namespace NzbDrone.Core.Download
|
|||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
IValidateNzbs nzbValidationService,
|
||||
ILocalizationService localizationService,
|
||||
Logger logger)
|
||||
: base(configService, diskProvider, remotePathMappingService, localizationService, logger)
|
||||
: base(configService, diskProvider, remotePathMappingService, logger)
|
||||
{
|
||||
_httpClient = httpClient;
|
||||
_nzbValidationService = nzbValidationService;
|
||||
|
@ -48,7 +46,6 @@ namespace NzbDrone.Core.Download
|
|||
{
|
||||
var request = indexer?.GetDownloadRequest(url) ?? new HttpRequest(url);
|
||||
request.RateLimitKey = remoteAlbum?.Release?.IndexerId.ToString();
|
||||
request.AllowAutoRedirect = true;
|
||||
|
||||
var response = await RetryStrategy
|
||||
.ExecuteAsync(static async (state, _) => await state._httpClient.GetAsync(state.request), (_httpClient, request))
|
||||
|
@ -60,7 +57,7 @@ namespace NzbDrone.Core.Download
|
|||
}
|
||||
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);
|
||||
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("AgeHours", message.Album.Release.AgeHours.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("Size", message.Album.Release.Size.ToString());
|
||||
history.Data.Add("DownloadUrl", message.Album.Release.DownloadUrl);
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Http;
|
||||
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)
|
||||
{
|
||||
if (categories.Empty())
|
||||
{
|
||||
yield break;
|
||||
}
|
||||
|
||||
var categoriesQuery = string.Join(",", categories.Distinct());
|
||||
|
||||
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.Passkey).NotEmpty();
|
||||
|
||||
RuleFor(c => c.Categories).NotEmpty();
|
||||
|
||||
RuleFor(c => c.SeedCriteria).SetValidator(_ => new SeedCriteriaSettingsValidator());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
<PackageReference Include="TagLibSharp-Lidarr" Version="2.2.0.27" />
|
||||
<PackageReference Include="Npgsql" Version="7.0.10" />
|
||||
<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" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
|
|
@ -256,7 +256,6 @@
|
|||
"CreateEmptyArtistFolders": "Create empty artist folders",
|
||||
"CreateEmptyArtistFoldersHelpText": "Create missing artist folders during disk scan",
|
||||
"CreateGroup": "Create group",
|
||||
"CurrentlyInstalled": "Currently Installed",
|
||||
"Custom": "Custom",
|
||||
"CustomFilter": "Custom Filter",
|
||||
"CustomFilters": "Custom Filters",
|
||||
|
@ -335,6 +334,8 @@
|
|||
"DeleteReleaseProfileMessageText": "Are you sure you want to delete this release profile?",
|
||||
"DeleteRemotePathMapping": "Delete 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",
|
||||
"DeleteSelectedArtists": "Delete Selected Artists",
|
||||
"DeleteSelectedCustomFormats": "Delete Custom Format(s)",
|
||||
|
@ -382,7 +383,6 @@
|
|||
"DownloadClientDelugeSettingsDirectoryCompleted": "Move When Completed Directory",
|
||||
"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",
|
||||
"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.",
|
||||
"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+)",
|
||||
|
@ -486,8 +486,6 @@
|
|||
"ExtraFileExtensionsHelpTextsExamples": "Examples: '.sub, .nfo' or 'sub,nfo'",
|
||||
"FailedDownloadHandling": "Failed Download Handling",
|
||||
"FailedLoadingSearchResults": "Failed to load search results, please try again.",
|
||||
"FailedToFetchSettings": "Failed to fetch settings",
|
||||
"FailedToFetchUpdates": "Failed to fetch updates",
|
||||
"FailedToLoadQueue": "Failed to load Queue",
|
||||
"False": "False",
|
||||
"FileDateHelpText": "Change file date on import/rescan",
|
||||
|
@ -690,7 +688,6 @@
|
|||
"LocalPathHelpText": "Path that {appName} should use to access the remote path locally",
|
||||
"Location": "Location",
|
||||
"LogFiles": "Log Files",
|
||||
"LogFilesLocation": "Log files are located in: {location}",
|
||||
"LogLevel": "Log Level",
|
||||
"LogLevelvalueTraceTraceLoggingShouldOnlyBeEnabledTemporarily": "Trace logging should only be enabled temporarily",
|
||||
"LogSizeLimit": "Log Size Limit",
|
||||
|
@ -1027,8 +1024,6 @@
|
|||
"RemoveQueueItemRemovalMethod": "Removal Method",
|
||||
"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.",
|
||||
"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",
|
||||
"RemoveSelectedItem": "Remove Selected Item",
|
||||
"RemoveSelectedItemBlocklistMessageText": "Are you sure you want to remove the selected items from the blocklist?",
|
||||
|
@ -1223,7 +1218,6 @@
|
|||
"TestParsing": "Test Parsing",
|
||||
"TheAlbumsFilesWillBeDeleted": "The album's files 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",
|
||||
"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",
|
||||
|
|
|
@ -963,7 +963,7 @@
|
|||
"Small": "Pieni",
|
||||
"RemoveSelectedItems": "Poista valitut kohteet",
|
||||
"ResetTitles": "Palauta nimet",
|
||||
"AddNewArtistRootFolderHelpText": "Alikansio \"{folder}\" luodaan automaattisesti.",
|
||||
"AddNewArtistRootFolderHelpText": "\"{folder}\" -alikansio luodaan automaattisesti.",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Syötä uusi käyttäjätunnus",
|
||||
"AutoAdd": "Automaattilisäys",
|
||||
"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.",
|
||||
"RemotePathMappingCheckFileRemoved": "Tiedosto \"{0}\" poistettiin kesken käsittelyn.",
|
||||
"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.",
|
||||
"DeleteArtistFoldersHelpText": "Poista esittäjäkansiot ja niiden kaikki sisältö.",
|
||||
"ChangeCategoryHint": "Vaihtaa latauksen kategoriaksi latauspalvelun \"Tuonnin jälkeinen kategoria\" -asetuksen kategorian.",
|
||||
|
|
|
@ -1061,6 +1061,5 @@
|
|||
"ImportFailed": "Importazione fallita: {sourceTitle}",
|
||||
"Paused": "In Pausa",
|
||||
"Pending": "In Attesa",
|
||||
"UnableToImportAutomatically": "Impossibile Importare Automaticamente",
|
||||
"AlbumCount": "Numero album"
|
||||
"UnableToImportAutomatically": "Impossibile Importare Automaticamente"
|
||||
}
|
||||
|
|
|
@ -286,7 +286,5 @@
|
|||
"IgnoredPlaceHolder": "Legg til ny begrensning",
|
||||
"AddImportList": "Ny Importliste",
|
||||
"AddNewArtistRootFolderHelpText": "Undermappa \"{folder}\" vil bli automatisk laget",
|
||||
"CheckDownloadClientForDetails": "sjekk nedlastningsklienten for mer informasjon",
|
||||
"TBA": "Venter",
|
||||
"History": "Historikk"
|
||||
"CheckDownloadClientForDetails": "sjekk nedlastningsklienten for mer informasjon"
|
||||
}
|
||||
|
|
|
@ -595,7 +595,7 @@
|
|||
"CustomFormatSettings": "Eigen Formaten Instellingen",
|
||||
"CustomFormats": "Eigen Formaten",
|
||||
"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",
|
||||
"DeleteCustomFormatMessageText": "Bent u zeker dat u de indexeerder '{0}' wilt verwijderen?",
|
||||
"DeleteFormatMessageText": "Weet je zeker dat je formaat tag {0} wilt verwijderen?",
|
||||
|
@ -879,7 +879,7 @@
|
|||
"BlocklistOnly": "Alleen bloklijst",
|
||||
"ChangeCategoryHint": "Verandert download naar de 'Post-Import Categorie' van Downloadclient",
|
||||
"ClearBlocklist": "Blokkeerlijst wissen",
|
||||
"Clone": "Dupliceren",
|
||||
"Clone": "Kloon",
|
||||
"CustomFormatsSpecificationRegularExpression": "Reguliere expressie",
|
||||
"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.",
|
||||
|
|
|
@ -1031,9 +1031,5 @@
|
|||
"CheckDownloadClientForDetails": "verifique o cliente de transferências para obter mais detalhes",
|
||||
"DownloadWarning": "Alerta de transferência: {warningMessage}",
|
||||
"Pending": "Pendente",
|
||||
"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"
|
||||
"WaitingToImport": "Aguardando para importar"
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
"BackupRetentionHelpText": "Автоматичні резервні копії, старіші за період зберігання, очищаються автоматично",
|
||||
"ChmodFolderHelpText": "Восьмеричний, застосовується при імпорті/перейменуванні до медіа-папок та файлів (без бітів виконання)",
|
||||
"CompletedDownloadHandling": "Обробка завершених завантажень",
|
||||
"CopyUsingHardlinksHelpText": "Жорсткі посилання дозволяють {appName} імпортувати торренти, що роздаються, до папки виконавця без зайвого місця на диску або копіювання всього вмісту файлу. Жорсткі посилання працюватимуть лише якщо джерело та призначення знаходяться на одному томі",
|
||||
"CopyUsingHardlinksHelpText": "Використання жорстких посилань, коли намагаєтеся скопіювати файли з торентів, які все ще завантажуються",
|
||||
"DeleteBackupMessageText": "Ви впевнені, що хочете видалити резервну копію \"{name}\"?",
|
||||
"DeleteDownloadClientMessageText": "Ви впевнені, що хочете видалити клієнт завантаження '{name}'?",
|
||||
"AlreadyInYourLibrary": "Вже у вашій бібліотеці",
|
||||
|
@ -55,12 +55,12 @@
|
|||
"ResetAPIKeyMessageText": "Ви впевнені, що хочете скинути свій ключ API?",
|
||||
"ShowQualityProfile": "Додати профіль якості",
|
||||
"AnalyticsEnabledHelpText": "Надсилайте анонімну інформацію про використання та помилки на сервери {appName}. Це включає інформацію про ваш веб-переглядач, які сторінки {appName} WebUI ви використовуєте, звіти про помилки, а також версію ОС і часу виконання. Ми будемо використовувати цю інформацію, щоб визначити пріоритети функцій і виправлення помилок.",
|
||||
"DeleteMetadataProfileMessageText": "Ви впевнені, що хочете видалити профіль метаданих '{name}'",
|
||||
"DeleteMetadataProfileMessageText": "Ви впевнені, що хочете видалити цей профіль затримки?",
|
||||
"DeleteNotificationMessageText": "Ви впевнені, що хочете видалити сповіщення '{name}'?",
|
||||
"DeleteQualityProfileMessageText": "Ви впевнені, що хочете видалити профіль якості '{name}'?",
|
||||
"DeleteReleaseProfile": "Видалити профіль випуску",
|
||||
"DeleteReleaseProfileMessageText": "Ви впевнені, що хочете видалити цей профіль випуску?",
|
||||
"DeleteRootFolderMessageText": "Ви впевнені, що хочете видалити кореневу папку '{name}'?",
|
||||
"DeleteReleaseProfileMessageText": "Ви впевнені, що хочете видалити цей профіль затримки?",
|
||||
"DeleteRootFolderMessageText": "Ви впевнені, що хочете видалити тег {0} ?",
|
||||
"DeleteTagMessageText": "Ви впевнені, що хочете видалити тег '{label}'?",
|
||||
"IsCutoffCutoff": "Припинення",
|
||||
"CertificateValidationHelpText": "Змініть суворість перевірки сертифікації HTTPS. Не змінюйте, якщо не розумієте ризики.",
|
||||
|
@ -470,7 +470,7 @@
|
|||
"AddImportListExclusion": "Додати виняток до списку імпорту",
|
||||
"AddConnection": "Додати Підключення",
|
||||
"AddConnectionImplementation": "Додати Підключення - {implementationName}",
|
||||
"Absolute": "Загальний",
|
||||
"Absolute": "Абсолютний",
|
||||
"AddAutoTag": "Додати Авто Тег",
|
||||
"AddAutoTagError": "Не вдалося додати новий авто тег, спробуйте ще раз.",
|
||||
"AddConditionError": "Не вдалося додати нову умову, спробуйте ще раз.",
|
||||
|
@ -620,7 +620,7 @@
|
|||
"UnmonitoredHelpText": "Включайте неконтрольовані фільми в канал iCal",
|
||||
"Posters": "Плакати",
|
||||
"Priority": "Пріоритет",
|
||||
"RemotePathMappingCheckImportFailed": "{appName} не вдалося імпортувати музику. Перегляньте журнали для деталей",
|
||||
"RemotePathMappingCheckImportFailed": "{appName} не вдалося імпортувати фільм. Подробиці перевірте у своїх журналах.",
|
||||
"SslPortHelpTextWarning": "Щоб набуло чинності, потрібно перезапустити",
|
||||
"ApiKeyValidationHealthCheckMessage": "Будь ласка оновіть ключ API, щоб він містив принаймні {length} символів. Ви можете зробити це в налаштуваннях або в файлі конфігурації",
|
||||
"CustomFilter": "Користувацькі фільтри",
|
||||
|
@ -694,7 +694,7 @@
|
|||
"LongDateFormat": "Довгий формат дати",
|
||||
"MaintenanceRelease": "Випуск для обслуговування: виправлення помилок та інші покращення. Щоб отримати докладнішу інформацію, перегляньте історію фіксації Github",
|
||||
"ReleaseDate": "Дати випуску",
|
||||
"RemotePathMappingCheckDownloadPermissions": "{appName} бачить, але не має доступу до завантаженої музики{0}. Ймовірно, помилка дозволів.",
|
||||
"RemotePathMappingCheckDownloadPermissions": "{appName} може бачити, але не має доступу до завантаженого фільму {path}. Ймовірна помилка дозволів.",
|
||||
"UnableToLoadCustomFormats": "Не вдалося завантажити спеціальні формати",
|
||||
"ShownAboveEachColumnWhenWeekIsTheActiveView": "Відображається над кожним стовпцем, коли тиждень є активним переглядом",
|
||||
"Table": "Таблиця",
|
||||
|
@ -945,267 +945,5 @@
|
|||
"NotificationsEmbySettingsUpdateLibraryHelpText": "Оновити бібліотеку при імпорті, перейменуванні або видаленні",
|
||||
"NotificationsSettingsUpdateMapPathsFromHelpText": "Шлях {appName}, який використовується для зміни шляхів до серіалів, коли {serviceName} бачить шлях до бібліотеки інакше, ніж {appName} (необхідно 'Оновити бібліотеку')",
|
||||
"NotificationsSettingsUpdateMapPathsToHelpText": "Шлях {serviceName}, що використовується для зміни шляхів до серіалів, коли {serviceName} бачить шлях до бібліотеки інакше, ніж {appName} (потрібно 'Оновити бібліотеку')",
|
||||
"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": "Слідкувати за змінами файлів у кореневих папках"
|
||||
"Select...": "Вибрати..."
|
||||
}
|
||||
|
|
|
@ -1349,7 +1349,5 @@
|
|||
"WaitingToImport": "等待导入",
|
||||
"WaitingToProcess": "等待处理",
|
||||
"DelayProfileArtistTagsHelpText": "应用到至少有一个标签匹配的艺术家",
|
||||
"AlbumInfo": "专辑 信息",
|
||||
"DownloadClientSettingsOlderPriorityAlbumHelpText": "优先使用14天前发布的专辑",
|
||||
"DownloadClientSettingsRecentPriorityAlbumHelpText": "优先使用过去14天内发布的专辑"
|
||||
"AlbumInfo": "专辑 信息"
|
||||
}
|
||||
|
|
|
@ -4,9 +4,5 @@
|
|||
"Always": "总是",
|
||||
"Analytics": "分析",
|
||||
"Username": "用户名",
|
||||
"Activity": "活动",
|
||||
"UseProxy": "使用代理",
|
||||
"Uptime": "运行时间",
|
||||
"Warn": "警告",
|
||||
"Updates": "更新"
|
||||
"Activity": "活动"
|
||||
}
|
||||
|
|
|
@ -65,10 +65,6 @@ namespace NzbDrone.Core.MediaFiles
|
|||
_logger.Debug("Removing existing track file: {0}", file);
|
||||
_recycleBinProvider.DeleteFile(trackFilePath, subfolder);
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.Warn("Existing track file missing from disk: {0}", trackFilePath);
|
||||
}
|
||||
|
||||
moveFileResult.OldFiles.Add(file);
|
||||
_mediaFileService.Delete(file, DeleteMediaFileReason.Upgrade);
|
||||
|
|
|
@ -18,8 +18,6 @@ namespace NzbDrone.Core.Music
|
|||
}
|
||||
|
||||
public bool ShouldRefresh(Album album)
|
||||
{
|
||||
try
|
||||
{
|
||||
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);
|
||||
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)
|
||||
{
|
||||
try
|
||||
{
|
||||
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);
|
||||
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)
|
||||
{
|
||||
return new List<string>();
|
||||
return null;
|
||||
}
|
||||
|
||||
return _tagRepository.GetTags(artist.Tags)
|
||||
|
|
|
@ -514,9 +514,9 @@ namespace NzbDrone.Core.Notifications.Discord
|
|||
{
|
||||
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");
|
||||
}
|
||||
|
||||
if (mapping.RemotePath.StartsWith(" "))
|
||||
{
|
||||
throw new ArgumentException("Remote Path must not start with a space");
|
||||
}
|
||||
|
||||
var remotePath = new OsPath(mapping.RemotePath);
|
||||
var localPath = new OsPath(mapping.LocalPath);
|
||||
|
||||
|
|
|
@ -7,7 +7,6 @@ using NzbDrone.Test.Common;
|
|||
namespace NzbDrone.Integration.Test.ApiTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class ArtistEditorFixture : IntegrationTest
|
||||
{
|
||||
private void GivenExistingArtist()
|
||||
|
|
|
@ -7,7 +7,6 @@ using NUnit.Framework;
|
|||
namespace NzbDrone.Integration.Test.ApiTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class ArtistFixture : IntegrationTest
|
||||
{
|
||||
[Test]
|
||||
|
|
|
@ -4,7 +4,6 @@ using NUnit.Framework;
|
|||
namespace NzbDrone.Integration.Test.ApiTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class ArtistLookupFixture : IntegrationTest
|
||||
{
|
||||
[TestCase("Kiss", "Kiss")]
|
||||
|
|
|
@ -6,7 +6,6 @@ using NUnit.Framework;
|
|||
namespace NzbDrone.Integration.Test.ApiTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class BlocklistFixture : IntegrationTest
|
||||
{
|
||||
private ArtistResource _artist;
|
||||
|
|
|
@ -9,7 +9,6 @@ using NzbDrone.Integration.Test.Client;
|
|||
namespace NzbDrone.Integration.Test.ApiTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class CalendarFixture : IntegrationTest
|
||||
{
|
||||
public ClientBase<AlbumResource> Calendar;
|
||||
|
|
|
@ -7,7 +7,6 @@ using NUnit.Framework;
|
|||
namespace NzbDrone.Integration.Test.ApiTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class TrackFixture : IntegrationTest
|
||||
{
|
||||
private ArtistResource _artist;
|
||||
|
|
|
@ -8,7 +8,6 @@ using NzbDrone.Core.Qualities;
|
|||
namespace NzbDrone.Integration.Test.ApiTests.WantedTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class CutoffUnmetFixture : IntegrationTest
|
||||
{
|
||||
[SetUp]
|
||||
|
|
|
@ -7,7 +7,6 @@ using NzbDrone.Core.Music;
|
|||
namespace NzbDrone.Integration.Test.ApiTests.WantedTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class MissingFixture : IntegrationTest
|
||||
{
|
||||
[SetUp]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue