diff --git a/frontend/src/Store/Actions/artistIndexActions.js b/frontend/src/Store/Actions/artistIndexActions.js
index 736502460..055e92662 100644
--- a/frontend/src/Store/Actions/artistIndexActions.js
+++ b/frontend/src/Store/Actions/artistIndexActions.js
@@ -151,7 +151,7 @@ export const defaultState = {
{
name: 'genres',
label: () => translate('Genres'),
- isSortable: true,
+ isSortable: false,
isVisible: false
},
{
diff --git a/frontend/src/System/Logs/Files/LogFiles.js b/frontend/src/System/Logs/Files/LogFiles.js
index 5339a8590..83736c617 100644
--- a/frontend/src/System/Logs/Files/LogFiles.js
+++ b/frontend/src/System/Logs/Files/LogFiles.js
@@ -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 {
- {translate('LogFilesLocation', {
- location
- })}
+ Log files are located in: {location}
- {currentLogView === 'Log Files' ? (
-
-
-
- ) : null}
+ {
+ currentLogView === 'Log Files' &&
+
+ The log level defaults to 'Info' and can be changed in General Settings
+
+ }
{
diff --git a/frontend/src/System/Updates/Updates.tsx b/frontend/src/System/Updates/Updates.tsx
index 300ab1f99..ef3d20288 100644
--- a/frontend/src/System/Updates/Updates.tsx
+++ b/frontend/src/System/Updates/Updates.tsx
@@ -270,7 +270,7 @@ function Updates() {
{generalSettingsError ? (
- {translate('FailedToFetchSettings')}
+ {translate('FailedToUpdateSettings')}
) : null}
diff --git a/package.json b/package.json
index 642d79a12..d73552544 100644
--- a/package.json
+++ b/package.json
@@ -109,7 +109,7 @@
"babel-loader": "9.2.1",
"babel-plugin-inline-classnames": "2.0.1",
"babel-plugin-transform-react-remove-prop-types": "0.4.24",
- "core-js": "3.41.0",
+ "core-js": "3.39.0",
"css-loader": "6.7.3",
"css-modules-typescript-loader": "4.0.1",
"eslint": "8.57.1",
diff --git a/src/Lidarr.Api.V1/DownloadClient/DownloadClientController.cs b/src/Lidarr.Api.V1/DownloadClient/DownloadClientController.cs
index b1cbb3ab5..bd4c993bf 100644
--- a/src/Lidarr.Api.V1/DownloadClient/DownloadClientController.cs
+++ b/src/Lidarr.Api.V1/DownloadClient/DownloadClientController.cs
@@ -1,7 +1,5 @@
-using FluentValidation;
using Lidarr.Http;
using NzbDrone.Core.Download;
-using NzbDrone.SignalR;
namespace Lidarr.Api.V1.DownloadClient
{
@@ -11,10 +9,9 @@ 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);
}
}
}
diff --git a/src/Lidarr.Api.V1/Health/HealthResource.cs b/src/Lidarr.Api.V1/Health/HealthResource.cs
index b059198db..9de525009 100644
--- a/src/Lidarr.Api.V1/Health/HealthResource.cs
+++ b/src/Lidarr.Api.V1/Health/HealthResource.cs
@@ -1,6 +1,7 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.Linq;
using Lidarr.Http.REST;
+using NzbDrone.Common.Http;
using NzbDrone.Core.HealthCheck;
namespace Lidarr.Api.V1.Health
@@ -10,7 +11,7 @@ namespace Lidarr.Api.V1.Health
public string Source { get; set; }
public HealthCheckResult Type { get; set; }
public string Message { get; set; }
- public string WikiUrl { get; set; }
+ public HttpUri WikiUrl { get; set; }
}
public static class HealthResourceMapper
@@ -28,7 +29,7 @@ namespace Lidarr.Api.V1.Health
Source = model.Source.Name,
Type = model.Type,
Message = model.Message,
- WikiUrl = model.WikiUrl.FullUri
+ WikiUrl = model.WikiUrl
};
}
diff --git a/src/Lidarr.Api.V1/ImportLists/ImportListController.cs b/src/Lidarr.Api.V1/ImportLists/ImportListController.cs
index 24a823e58..ff2ed98db 100644
--- a/src/Lidarr.Api.V1/ImportLists/ImportListController.cs
+++ b/src/Lidarr.Api.V1/ImportLists/ImportListController.cs
@@ -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,
- RootFolderExistsValidator rootFolderExistsValidator,
- QualityProfileExistsValidator qualityProfileExistsValidator,
- MetadataProfileExistsValidator metadataProfileExistsValidator)
- : base(signalRBroadcaster, importListFactory, "importlist", ResourceMapper, BulkResourceMapper)
+ public ImportListController(IImportListFactory importListFactory,
+ RootFolderExistsValidator rootFolderExistsValidator,
+ QualityProfileExistsValidator qualityProfileExistsValidator,
+ MetadataProfileExistsValidator metadataProfileExistsValidator)
+ : base(importListFactory, "importlist", ResourceMapper, BulkResourceMapper)
{
SharedValidator.RuleFor(c => c.RootFolderPath).Cascade(CascadeMode.Stop)
.IsValidPath()
diff --git a/src/Lidarr.Api.V1/Indexers/IndexerController.cs b/src/Lidarr.Api.V1/Indexers/IndexerController.cs
index 462c68898..2ebcd3f29 100644
--- a/src/Lidarr.Api.V1/Indexers/IndexerController.cs
+++ b/src/Lidarr.Api.V1/Indexers/IndexerController.cs
@@ -1,8 +1,6 @@
-using FluentValidation;
using Lidarr.Http;
using NzbDrone.Core.Indexers;
using NzbDrone.Core.Validation;
-using NzbDrone.SignalR;
namespace Lidarr.Api.V1.Indexers
{
@@ -12,12 +10,9 @@ 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);
}
}
diff --git a/src/Lidarr.Api.V1/Lidarr.Api.V1.csproj b/src/Lidarr.Api.V1/Lidarr.Api.V1.csproj
index 187fa86ff..b501c694b 100644
--- a/src/Lidarr.Api.V1/Lidarr.Api.V1.csproj
+++ b/src/Lidarr.Api.V1/Lidarr.Api.V1.csproj
@@ -13,7 +13,7 @@
-
+
diff --git a/src/Lidarr.Api.V1/Metadata/MetadataController.cs b/src/Lidarr.Api.V1/Metadata/MetadataController.cs
index 4349058b0..01e82ad37 100644
--- a/src/Lidarr.Api.V1/Metadata/MetadataController.cs
+++ b/src/Lidarr.Api.V1/Metadata/MetadataController.cs
@@ -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)
{
}
diff --git a/src/Lidarr.Api.V1/Notifications/NotificationController.cs b/src/Lidarr.Api.V1/Notifications/NotificationController.cs
index 7e5f45064..dc792fc1f 100644
--- a/src/Lidarr.Api.V1/Notifications/NotificationController.cs
+++ b/src/Lidarr.Api.V1/Notifications/NotificationController.cs
@@ -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)
{
}
diff --git a/src/Lidarr.Api.V1/ProviderControllerBase.cs b/src/Lidarr.Api.V1/ProviderControllerBase.cs
index c630dddd9..8d0b88c4a 100644
--- a/src/Lidarr.Api.V1/ProviderControllerBase.cs
+++ b/src/Lidarr.Api.V1/ProviderControllerBase.cs
@@ -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 : RestControllerWithSignalR,
- IHandle>,
- IHandle>,
- IHandle>
+ public abstract class ProviderControllerBase : RestController
where TProviderDefinition : ProviderDefinition, new()
where TProvider : IProvider
where TProviderResource : ProviderResource, new()
@@ -29,13 +22,11 @@ namespace Lidarr.Api.V1
private readonly ProviderResourceMapper _resourceMapper;
private readonly ProviderBulkResourceMapper _bulkResourceMapper;
- protected ProviderControllerBase(IBroadcastSignalRMessage signalRBroadcaster,
- IProviderFactory providerFactory,
string resource,
ProviderResourceMapper resourceMapper,
ProviderBulkResourceMapper 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 message)
- {
- BroadcastResourceChange(ModelAction.Created, message.Definition.Id);
- }
-
- [NonAction]
- public virtual void Handle(ProviderUpdatedEvent message)
- {
- BroadcastResourceChange(ModelAction.Updated, message.Definition.Id);
- }
-
- [NonAction]
- public virtual void Handle(ProviderDeletedEvent message)
- {
- BroadcastResourceChange(ModelAction.Deleted, message.ProviderId);
- }
-
protected virtual void Validate(TProviderDefinition definition, bool includeWarnings)
{
var validationResult = definition.Settings.Validate();
diff --git a/src/Lidarr.Api.V1/RemotePathMappings/RemotePathMappingController.cs b/src/Lidarr.Api.V1/RemotePathMappings/RemotePathMappingController.cs
index fae5b2388..f0679e27b 100644
--- a/src/Lidarr.Api.V1/RemotePathMappings/RemotePathMappingController.cs
+++ b/src/Lidarr.Api.V1/RemotePathMappings/RemotePathMappingController.cs
@@ -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;
@@ -22,28 +21,17 @@ namespace Lidarr.Api.V1.RemotePathMappings
_remotePathMappingService = remotePathMappingService;
SharedValidator.RuleFor(c => c.Host)
- .NotEmpty();
+ .NotEmpty();
// We cannot use IsValidPath here, because it's a remote path, possibly other OS.
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");
+ .NotEmpty();
SharedValidator.RuleFor(c => c.LocalPath)
- .Cascade(CascadeMode.Stop)
- .IsValidPath()
- .SetValidator(mappedNetworkDriveValidator)
- .SetValidator(pathExistsValidator)
- .SetValidator(new SystemFolderValidator())
- .NotEqual("/")
- .WithMessage("Cannot be set to '/'");
+ .Cascade(CascadeMode.Stop)
+ .IsValidPath()
+ .SetValidator(mappedNetworkDriveValidator)
+ .SetValidator(pathExistsValidator);
}
public override RemotePathMappingResource GetResourceById(int id)
@@ -53,7 +41,7 @@ namespace Lidarr.Api.V1.RemotePathMappings
[RestPostById]
[Consumes("application/json")]
- public ActionResult CreateMapping([FromBody] RemotePathMappingResource resource)
+ public ActionResult CreateMapping(RemotePathMappingResource resource)
{
var model = resource.ToModel();
@@ -74,7 +62,7 @@ namespace Lidarr.Api.V1.RemotePathMappings
}
[RestPutById]
- public ActionResult UpdateMapping([FromBody] RemotePathMappingResource resource)
+ public ActionResult UpdateMapping(RemotePathMappingResource resource)
{
var mapping = resource.ToModel();
diff --git a/src/Lidarr.Api.V1/System/Backup/BackupController.cs b/src/Lidarr.Api.V1/System/Backup/BackupController.cs
index 350ada72b..22f017d03 100644
--- a/src/Lidarr.Api.V1/System/Backup/BackupController.cs
+++ b/src/Lidarr.Api.V1/System/Backup/BackupController.cs
@@ -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;
diff --git a/src/Lidarr.Api.V1/Tags/TagController.cs b/src/Lidarr.Api.V1/Tags/TagController.cs
index 14f1aef64..a0e76335e 100644
--- a/src/Lidarr.Api.V1/Tags/TagController.cs
+++ b/src/Lidarr.Api.V1/Tags/TagController.cs
@@ -1,5 +1,4 @@
using System.Collections.Generic;
-using FluentValidation;
using Lidarr.Http;
using Lidarr.Http.REST;
using Lidarr.Http.REST.Attributes;
@@ -24,8 +23,6 @@ namespace Lidarr.Api.V1.Tags
: base(signalRBroadcaster)
{
_tagService = tagService;
-
- SharedValidator.RuleFor(c => c.Label).NotEmpty();
}
public override TagResource GetResourceById(int id)
diff --git a/src/Lidarr.Api.V1/openapi.json b/src/Lidarr.Api.V1/openapi.json
index 4c0462717..8849354f6 100644
--- a/src/Lidarr.Api.V1/openapi.json
+++ b/src/Lidarr.Api.V1/openapi.json
@@ -9808,8 +9808,7 @@
"nullable": true
},
"wikiUrl": {
- "type": "string",
- "nullable": true
+ "$ref": "#/components/schemas/HttpUri"
}
},
"additionalProperties": false
@@ -10063,6 +10062,48 @@
},
"additionalProperties": false
},
+ "HttpUri": {
+ "type": "object",
+ "properties": {
+ "fullUri": {
+ "type": "string",
+ "nullable": true,
+ "readOnly": true
+ },
+ "scheme": {
+ "type": "string",
+ "nullable": true,
+ "readOnly": true
+ },
+ "host": {
+ "type": "string",
+ "nullable": true,
+ "readOnly": true
+ },
+ "port": {
+ "type": "integer",
+ "format": "int32",
+ "nullable": true,
+ "readOnly": true
+ },
+ "path": {
+ "type": "string",
+ "nullable": true,
+ "readOnly": true
+ },
+ "query": {
+ "type": "string",
+ "nullable": true,
+ "readOnly": true
+ },
+ "fragment": {
+ "type": "string",
+ "nullable": true,
+ "readOnly": true
+ }
+ },
+ "additionalProperties": false
+ },
"ImportListBulkResource": {
"type": "object",
"properties": {
diff --git a/src/Lidarr.Http/Authentication/AuthenticationController.cs b/src/Lidarr.Http/Authentication/AuthenticationController.cs
index f7281cf5c..2fc588dd2 100644
--- a/src/Lidarr.Http/Authentication/AuthenticationController.cs
+++ b/src/Lidarr.Http/Authentication/AuthenticationController.cs
@@ -1,14 +1,9 @@
using System.Collections.Generic;
-using System.IO;
using System.Security.Claims;
-using System.Security.Cryptography;
using System.Threading.Tasks;
-using System.Xml;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
-using NLog;
-using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Authentication;
using NzbDrone.Core.Configuration;
@@ -21,15 +16,11 @@ namespace Lidarr.Http.Authentication
{
private readonly IAuthenticationService _authService;
private readonly IConfigFileProvider _configFileProvider;
- private readonly IAppFolderInfo _appFolderInfo;
- private readonly Logger _logger;
- public AuthenticationController(IAuthenticationService authService, IConfigFileProvider configFileProvider, IAppFolderInfo appFolderInfo, Logger logger)
+ public AuthenticationController(IAuthenticationService authService, IConfigFileProvider configFileProvider)
{
_authService = authService;
_configFileProvider = configFileProvider;
- _appFolderInfo = appFolderInfo;
- _logger = logger;
}
[HttpPost("login")]
@@ -54,23 +45,7 @@ namespace Lidarr.Http.Authentication
IsPersistent = resource.RememberMe == "on"
};
- try
- {
- await HttpContext.SignInAsync(AuthenticationType.Forms.ToString(), new ClaimsPrincipal(new ClaimsIdentity(claims, "Cookies", "user", "identifier")), authProperties);
- }
- catch (CryptographicException e)
- {
- if (e.InnerException is XmlException)
- {
- _logger.Error(e, "Failed to authenticate user due to corrupt XML. Please remove all XML files from {0} and restart Lidarr", Path.Combine(_appFolderInfo.AppDataFolder, "asp"));
- }
- else
- {
- _logger.Error(e, "Failed to authenticate user. {0}", e.Message);
- }
-
- return Unauthorized();
- }
+ await HttpContext.SignInAsync(AuthenticationType.Forms.ToString(), new ClaimsPrincipal(new ClaimsIdentity(claims, "Cookies", "user", "identifier")), authProperties);
if (returnUrl.IsNullOrWhiteSpace() || !Url.IsLocalUrl(returnUrl))
{
diff --git a/src/Lidarr.Http/Lidarr.Http.csproj b/src/Lidarr.Http/Lidarr.Http.csproj
index 103ca71ea..5164642dc 100644
--- a/src/Lidarr.Http/Lidarr.Http.csproj
+++ b/src/Lidarr.Http/Lidarr.Http.csproj
@@ -5,7 +5,7 @@
-
+
diff --git a/src/NzbDrone.Automation.Test/AutomationTest.cs b/src/NzbDrone.Automation.Test/AutomationTest.cs
index 51c79539e..bcf777431 100644
--- a/src/NzbDrone.Automation.Test/AutomationTest.cs
+++ b/src/NzbDrone.Automation.Test/AutomationTest.cs
@@ -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)
diff --git a/src/NzbDrone.Automation.Test/Lidarr.Automation.Test.csproj b/src/NzbDrone.Automation.Test/Lidarr.Automation.Test.csproj
index 8204721f3..ada550253 100644
--- a/src/NzbDrone.Automation.Test/Lidarr.Automation.Test.csproj
+++ b/src/NzbDrone.Automation.Test/Lidarr.Automation.Test.csproj
@@ -4,7 +4,7 @@
-
+
diff --git a/src/NzbDrone.Automation.Test/PageModel/PageBase.cs b/src/NzbDrone.Automation.Test/PageModel/PageBase.cs
index 664ec7258..c9a7e8891 100644
--- a/src/NzbDrone.Automation.Test/PageModel/PageBase.cs
+++ b/src/NzbDrone.Automation.Test/PageModel/PageBase.cs
@@ -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)
diff --git a/src/NzbDrone.Common/Disk/DiskProviderBase.cs b/src/NzbDrone.Common/Disk/DiskProviderBase.cs
index 01aaaaded..dfdb6b54c 100644
--- a/src/NzbDrone.Common/Disk/DiskProviderBase.cs
+++ b/src/NzbDrone.Common/Disk/DiskProviderBase.cs
@@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.IO;
using System.IO.Abstractions;
using System.Linq;
-using System.Threading;
using NLog;
using NzbDrone.Common.EnsureThat;
using NzbDrone.Common.EnvironmentInfo;
@@ -307,26 +306,9 @@ namespace NzbDrone.Common.Disk
{
Ensure.That(path, () => path).IsValidPath(PathValidationType.CurrentOs);
- var files = GetFiles(path, recursive).ToList();
+ var files = GetFiles(path, recursive);
- files.ForEach(RemoveReadOnly);
-
- var attempts = 0;
-
- while (attempts < 3 && files.Any())
- {
- EmptyFolder(path);
-
- if (GetFiles(path, recursive).Any())
- {
- // Wait for IO operations to complete after emptying the folder since they aren't always
- // instantly removed and it can lead to false positives that files are still present.
- Thread.Sleep(3000);
- }
-
- attempts++;
- files = GetFiles(path, recursive).ToList();
- }
+ files.ToList().ForEach(RemoveReadOnly);
_fileSystem.Directory.Delete(path, recursive);
}
diff --git a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs
index 9d896d15c..8ca01f6ec 100644
--- a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs
+++ b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs
@@ -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);
}
}
diff --git a/src/NzbDrone.Common/Lidarr.Common.csproj b/src/NzbDrone.Common/Lidarr.Common.csproj
index 2e5bacde4..383149c37 100644
--- a/src/NzbDrone.Common/Lidarr.Common.csproj
+++ b/src/NzbDrone.Common/Lidarr.Common.csproj
@@ -6,17 +6,17 @@
-
+
-
+
-
+
-
+
diff --git a/src/NzbDrone.Common/PathEqualityComparer.cs b/src/NzbDrone.Common/PathEqualityComparer.cs
index e8322864a..bd6fa430d 100644
--- a/src/NzbDrone.Common/PathEqualityComparer.cs
+++ b/src/NzbDrone.Common/PathEqualityComparer.cs
@@ -1,4 +1,3 @@
-using System;
using System.Collections.Generic;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Extensions;
@@ -7,7 +6,7 @@ namespace NzbDrone.Common
{
public class PathEqualityComparer : IEqualityComparer
{
- public static readonly PathEqualityComparer Instance = new ();
+ public static readonly PathEqualityComparer Instance = new PathEqualityComparer();
private PathEqualityComparer()
{
@@ -20,19 +19,12 @@ namespace NzbDrone.Common
public int GetHashCode(string obj)
{
- try
+ if (OsInfo.IsWindows)
{
- if (OsInfo.IsWindows)
- {
- return obj.CleanFilePath().Normalize().ToLower().GetHashCode();
- }
+ return obj.CleanFilePath().Normalize().ToLower().GetHashCode();
+ }
- return obj.CleanFilePath().Normalize().GetHashCode();
- }
- catch (ArgumentException ex)
- {
- throw new ArgumentException($"Invalid path: {obj}", ex);
- }
+ return obj.CleanFilePath().Normalize().GetHashCode();
}
}
}
diff --git a/src/NzbDrone.Common/Processes/ProcessProvider.cs b/src/NzbDrone.Common/Processes/ProcessProvider.cs
index bee099319..3c86a06b1 100644
--- a/src/NzbDrone.Common/Processes/ProcessProvider.cs
+++ b/src/NzbDrone.Common/Processes/ProcessProvider.cs
@@ -6,7 +6,6 @@ using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
-using System.Text;
using NLog;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Model;
@@ -118,9 +117,7 @@ namespace NzbDrone.Common.Processes
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardOutput = true,
- RedirectStandardInput = true,
- StandardOutputEncoding = Encoding.UTF8,
- StandardErrorEncoding = Encoding.UTF8
+ RedirectStandardInput = true
};
if (environmentVariables != null)
diff --git a/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs b/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs
index dd501374c..948ab3a54 100644
--- a/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs
+++ b/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs
@@ -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();
diff --git a/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs b/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs
index 53e1d1558..83c8b720f 100644
--- a/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs
+++ b/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs
@@ -80,7 +80,7 @@ namespace NzbDrone.Core.Test.ImportListTests
}
[Test]
- [Ignore("Pending mapping fixes", Until = "2025-10-20 00:00:00Z")]
+ [Ignore("Pending mapping fixes", Until = "2025-04-20 00:00:00Z")]
public void map_artist_should_work()
{
UseRealHttp();
@@ -159,7 +159,7 @@ namespace NzbDrone.Core.Test.ImportListTests
}
[Test]
- [Ignore("Pending mapping fixes", Until = "2025-10-20 00:00:00Z")]
+ [Ignore("Pending mapping fixes", Until = "2025-04-20 00:00:00Z")]
public void map_album_should_work()
{
UseRealHttp();
diff --git a/src/NzbDrone.Core.Test/MetadataSource/SkyHook/SkyHookProxyFixture.cs b/src/NzbDrone.Core.Test/MetadataSource/SkyHook/SkyHookProxyFixture.cs
index 2ee493ecf..933eb1009 100644
--- a/src/NzbDrone.Core.Test/MetadataSource/SkyHook/SkyHookProxyFixture.cs
+++ b/src/NzbDrone.Core.Test/MetadataSource/SkyHook/SkyHookProxyFixture.cs
@@ -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-08-01 00:00:00Z")]
public class SkyHookProxyFixture : CoreTest
{
private MetadataProfile _metadataProfile;
diff --git a/src/NzbDrone.Core.Test/MetadataSource/SkyHook/SkyHookProxySearchFixture.cs b/src/NzbDrone.Core.Test/MetadataSource/SkyHook/SkyHookProxySearchFixture.cs
index 13c9480c9..ebe3a88a5 100644
--- a/src/NzbDrone.Core.Test/MetadataSource/SkyHook/SkyHookProxySearchFixture.cs
+++ b/src/NzbDrone.Core.Test/MetadataSource/SkyHook/SkyHookProxySearchFixture.cs
@@ -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-08-01 00:00:00Z")]
public class SkyHookProxySearchFixture : CoreTest
{
[SetUp]
diff --git a/src/NzbDrone.Core.Test/ParserTests/QualityParserFixture.cs b/src/NzbDrone.Core.Test/ParserTests/QualityParserFixture.cs
index 5d22174ab..f2e6039c6 100644
--- a/src/NzbDrone.Core.Test/ParserTests/QualityParserFixture.cs
+++ b/src/NzbDrone.Core.Test/ParserTests/QualityParserFixture.cs
@@ -129,9 +129,6 @@ namespace NzbDrone.Core.Test.ParserTests
[TestCase("Green Day - Father Of All [FLAC (M4A) 24-bit Lossless]", null, 0, 0)]
[TestCase("Green_Day-Father_Of_All_FLAC_M4A_24_bit_Lossless", null, 0, 0)]
[TestCase("Green.Day-Father.Of.All.FLAC.M4A.24.bit.Lossless", null, 0, 0)]
- [TestCase("Linkin Park - Studio Collection 2000-2012 (2013) [WEB FLAC24-44.1]", null, 0, 0)]
- [TestCase("Linkin Park - Studio Collection 2000-2012 (2013) [WEB FLAC24bit]", null, 0, 0)]
- [TestCase("Linkin Park - Studio Collection 2000-2012 (2013) [WEB FLAC24-bit]", null, 0, 0)]
public void should_parse_flac_24bit_quality(string title, string desc, int bitrate, int sampleSize)
{
ParseAndVerifyQuality(title, desc, bitrate, Quality.FLAC_24, sampleSize);
diff --git a/src/NzbDrone.Core/CustomFormats/Specifications/SizeSpecification.cs b/src/NzbDrone.Core/CustomFormats/Specifications/SizeSpecification.cs
index 9e2fe766e..fe873f9ec 100644
--- a/src/NzbDrone.Core/CustomFormats/Specifications/SizeSpecification.cs
+++ b/src/NzbDrone.Core/CustomFormats/Specifications/SizeSpecification.cs
@@ -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);
}
}
diff --git a/src/NzbDrone.Core/Datastore/BasicRepository.cs b/src/NzbDrone.Core/Datastore/BasicRepository.cs
index d39858f2f..75cc9510b 100644
--- a/src/NzbDrone.Core/Datastore/BasicRepository.cs
+++ b/src/NzbDrone.Core/Datastore/BasicRepository.cs
@@ -252,7 +252,7 @@ namespace NzbDrone.Core.Datastore
protected void Delete(SqlBuilder builder)
{
- var sql = builder.AddDeleteTemplate(typeof(TModel));
+ var sql = builder.AddDeleteTemplate(typeof(TModel)).LogQuery();
using (var conn = _database.OpenConnection())
{
diff --git a/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs b/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs
index cb8bd50f0..4f685c560 100644
--- a/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs
+++ b/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs
@@ -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 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);
}
diff --git a/src/NzbDrone.Core/Download/Clients/Aria2/Aria2.cs b/src/NzbDrone.Core/Download/Clients/Aria2/Aria2.cs
index 2a045f788..0e13b49af 100644
--- a/src/NzbDrone.Core/Download/Clients/Aria2/Aria2.cs
+++ b/src/NzbDrone.Core/Download/Clients/Aria2/Aria2.cs
@@ -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;
}
diff --git a/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackhole.cs b/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackhole.cs
index a9f8c445f..27e2560ec 100644
--- a/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackhole.cs
+++ b/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackhole.cs
@@ -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;
diff --git a/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackhole.cs b/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackhole.cs
index 71f7fc828..279ef6fcd 100644
--- a/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackhole.cs
+++ b/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackhole.cs
@@ -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;
diff --git a/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs b/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs
index e9ad75d37..5ad0f2387 100644
--- a/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs
+++ b/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs
@@ -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;
}
diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs
index 0774d5d6a..1c31bbd9a 100644
--- a/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs
+++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs
@@ -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;
diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs
index fc14629f8..1add52b29 100644
--- a/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs
+++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs
@@ -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;
diff --git a/src/NzbDrone.Core/Download/Clients/Flood/Flood.cs b/src/NzbDrone.Core/Download/Clients/Flood/Flood.cs
index 0c8802859..f8cfeeed0 100644
--- a/src/NzbDrone.Core/Download/Clients/Flood/Flood.cs
+++ b/src/NzbDrone.Core/Download/Clients/Flood/Flood.cs
@@ -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;
diff --git a/src/NzbDrone.Core/Download/Clients/FreeboxDownload/TorrentFreeboxDownload.cs b/src/NzbDrone.Core/Download/Clients/FreeboxDownload/TorrentFreeboxDownload.cs
index 34afe472f..b83615c18 100644
--- a/src/NzbDrone.Core/Download/Clients/FreeboxDownload/TorrentFreeboxDownload.cs
+++ b/src/NzbDrone.Core/Download/Clients/FreeboxDownload/TorrentFreeboxDownload.cs
@@ -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;
}
diff --git a/src/NzbDrone.Core/Download/Clients/Hadouken/Hadouken.cs b/src/NzbDrone.Core/Download/Clients/Hadouken/Hadouken.cs
index 12336c986..d97645b3c 100644
--- a/src/NzbDrone.Core/Download/Clients/Hadouken/Hadouken.cs
+++ b/src/NzbDrone.Core/Download/Clients/Hadouken/Hadouken.cs
@@ -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;
}
diff --git a/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortex.cs b/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortex.cs
index c71e6977f..dba7b3ffb 100644
--- a/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortex.cs
+++ b/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortex.cs
@@ -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;
}
diff --git a/src/NzbDrone.Core/Download/Clients/Nzbget/Nzbget.cs b/src/NzbDrone.Core/Download/Clients/Nzbget/Nzbget.cs
index 29ee3718e..df3e86411 100644
--- a/src/NzbDrone.Core/Download/Clients/Nzbget/Nzbget.cs
+++ b/src/NzbDrone.Core/Download/Clients/Nzbget/Nzbget.cs
@@ -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;
}
diff --git a/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs b/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs
index 28866080e..becc142d2 100644
--- a/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs
+++ b/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs
@@ -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;
}
diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs
index 9ecf3d471..75587513a 100644
--- a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs
+++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs
@@ -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;
diff --git a/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs b/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs
index 7f36ae891..05d565718 100644
--- a/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs
+++ b/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs
@@ -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;
}
diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/Transmission.cs b/src/NzbDrone.Core/Download/Clients/Transmission/Transmission.cs
index d3963e571..88fdb0f41 100644
--- a/src/NzbDrone.Core/Download/Clients/Transmission/Transmission.cs
+++ b/src/NzbDrone.Core/Download/Clients/Transmission/Transmission.cs
@@ -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)
{
}
diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs
index e797ae48a..2dc9dd14e 100644
--- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs
+++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs
@@ -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
- {
- { "clientName", Name },
- { "message", torrent.ErrorString }
- });
+ item.Message = torrent.ErrorString;
}
else if (torrent.TotalSize == 0)
{
diff --git a/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs b/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs
index c10d5d3ba..9f5897495 100644
--- a/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs
+++ b/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs
@@ -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)
{
}
diff --git a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs
index ff89db95c..c68e1c15d 100644
--- a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs
+++ b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs
@@ -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;
diff --git a/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrent.cs b/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrent.cs
index c44b908bd..72c7ec827 100644
--- a/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrent.cs
+++ b/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrent.cs
@@ -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;
diff --git a/src/NzbDrone.Core/Download/DownloadClientBase.cs b/src/NzbDrone.Core/Download/DownloadClientBase.cs
index 69f0a025e..63ccf629e 100644
--- a/src/NzbDrone.Core/Download/DownloadClientBase.cs
+++ b/src/NzbDrone.Core/Download/DownloadClientBase.cs
@@ -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 RetryStrategy => new ResiliencePipelineBuilder()
@@ -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;
}
diff --git a/src/NzbDrone.Core/Download/NzbValidationService.cs b/src/NzbDrone.Core/Download/NzbValidationService.cs
index ee5eae100..e3cbff710 100644
--- a/src/NzbDrone.Core/Download/NzbValidationService.cs
+++ b/src/NzbDrone.Core/Download/NzbValidationService.cs
@@ -1,4 +1,3 @@
-using System;
using System.IO;
using System.Linq;
using System.Xml;
@@ -16,52 +15,38 @@ namespace NzbDrone.Core.Download
{
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,
- 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;
+
+ if (nzb == null)
{
- var xDoc = XDocument.Load(xmlTextReader);
- var nzb = xDoc.Root;
-
- if (nzb == null)
- {
- throw new InvalidNzbException("Invalid NZB: No Root element [{0}]", filename);
- }
-
- // nZEDb has an bug in their error reporting code spitting out invalid http status codes
- if (nzb.Name.LocalName.Equals("error") &&
- nzb.TryGetAttributeValue("code", out var code) &&
- nzb.TryGetAttributeValue("description", out var description))
- {
- throw new InvalidNzbException("Invalid NZB: Contains indexer error: {0} - {1}", code, description);
- }
-
- if (!nzb.Name.LocalName.Equals("nzb"))
- {
- throw new InvalidNzbException(
- "Invalid NZB: Unexpected root element. Expected 'nzb' found '{0}' [{1}]", nzb.Name.LocalName, filename);
- }
-
- var ns = nzb.Name.Namespace;
- var files = nzb.Elements(ns + "file").ToList();
-
- if (files.Empty())
- {
- throw new InvalidNzbException("Invalid NZB: No files [{0}]", filename);
- }
+ throw new InvalidNzbException("Invalid NZB: No Root element [{0}]", filename);
+ }
+
+ // nZEDb has an bug in their error reporting code spitting out invalid http status codes
+ if (nzb.Name.LocalName.Equals("error") &&
+ nzb.TryGetAttributeValue("code", out var code) &&
+ nzb.TryGetAttributeValue("description", out var description))
+ {
+ throw new InvalidNzbException("Invalid NZB: Contains indexer error: {0} - {1}", code, description);
+ }
+
+ if (!nzb.Name.LocalName.Equals("nzb"))
+ {
+ throw new InvalidNzbException("Invalid NZB: Unexpected root element. Expected 'nzb' found '{0}' [{1}]", nzb.Name.LocalName, filename);
+ }
+
+ var ns = nzb.Name.Namespace;
+ var files = nzb.Elements(ns + "file").ToList();
+
+ if (files.Empty())
+ {
+ throw new InvalidNzbException("Invalid NZB: No files [{0}]", filename);
}
- }
- catch (InvalidNzbException)
- {
- // Throw the original exception
- throw;
- }
- catch (Exception ex)
- {
- throw new InvalidNzbException("Invalid NZB: Unable to parse [{0}]", ex, filename);
}
}
}
diff --git a/src/NzbDrone.Core/Download/TorrentClientBase.cs b/src/NzbDrone.Core/Download/TorrentClientBase.cs
index cdee0e799..4e3ec11ab 100644
--- a/src/NzbDrone.Core/Download/TorrentClientBase.cs
+++ b/src/NzbDrone.Core/Download/TorrentClientBase.cs
@@ -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);
diff --git a/src/NzbDrone.Core/Download/UsenetClientBase.cs b/src/NzbDrone.Core/Download/UsenetClientBase.cs
index d92363abf..e14ac5a87 100644
--- a/src/NzbDrone.Core/Download/UsenetClientBase.cs
+++ b/src/NzbDrone.Core/Download/UsenetClientBase.cs
@@ -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);
diff --git a/src/NzbDrone.Core/History/EntityHistory.cs b/src/NzbDrone.Core/History/EntityHistory.cs
index 496213275..ffc7e8e7c 100644
--- a/src/NzbDrone.Core/History/EntityHistory.cs
+++ b/src/NzbDrone.Core/History/EntityHistory.cs
@@ -10,9 +10,6 @@ namespace NzbDrone.Core.History
{
public const string DOWNLOAD_CLIENT = "downloadClient";
public const string RELEASE_SOURCE = "releaseSource";
- public const string RELEASE_GROUP = "releaseGroup";
- public const string SIZE = "size";
- public const string INDEXER = "indexer";
public EntityHistory()
{
diff --git a/src/NzbDrone.Core/History/EntityHistoryRepository.cs b/src/NzbDrone.Core/History/EntityHistoryRepository.cs
index 5c659724d..4b66c88b7 100644
--- a/src/NzbDrone.Core/History/EntityHistoryRepository.cs
+++ b/src/NzbDrone.Core/History/EntityHistoryRepository.cs
@@ -104,7 +104,6 @@ namespace NzbDrone.Core.History
var builder = Builder()
.Join((h, a) => h.ArtistId == a.Id)
.Join((h, a) => h.AlbumId == a.Id)
- .LeftJoin((h, t) => h.TrackId == t.Id)
.Where(x => x.Date >= date);
if (eventType.HasValue)
@@ -112,11 +111,10 @@ namespace NzbDrone.Core.History
builder.Where(h => h.EventType == eventType);
}
- return _database.QueryJoined(builder, (history, artist, album, track) =>
+ return _database.QueryJoined(builder, (history, artist, album) =>
{
history.Artist = artist;
history.Album = album;
- history.Track = track;
return history;
}).OrderBy(h => h.Date).ToList();
}
diff --git a/src/NzbDrone.Core/History/EntityHistoryService.cs b/src/NzbDrone.Core/History/EntityHistoryService.cs
index 4b342995a..d94d0cf9e 100644
--- a/src/NzbDrone.Core/History/EntityHistoryService.cs
+++ b/src/NzbDrone.Core/History/EntityHistoryService.cs
@@ -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);
@@ -267,9 +267,7 @@ namespace NzbDrone.Core.History
history.Data.Add("DownloadClient", message.DownloadClient);
history.Data.Add("Message", message.Message);
- history.Data.Add("ReleaseGroup", message.TrackedDownload?.RemoteAlbum?.ParsedAlbumInfo?.ReleaseGroup ?? message.Data.GetValueOrDefault(EntityHistory.RELEASE_GROUP));
- history.Data.Add("Size", message.TrackedDownload?.DownloadItem.TotalSize.ToString() ?? message.Data.GetValueOrDefault(EntityHistory.SIZE));
- history.Data.Add("Indexer", message.TrackedDownload?.RemoteAlbum?.Release?.Indexer ?? message.Data.GetValueOrDefault(EntityHistory.INDEXER));
+ history.Data.Add("Size", message.TrackedDownload?.DownloadItem.TotalSize.ToString());
_historyRepository.Insert(history);
}
@@ -419,7 +417,6 @@ namespace NzbDrone.Core.History
history.Data.Add("Message", message.Message);
history.Data.Add("ReleaseGroup", message.TrackedDownload?.RemoteAlbum?.ParsedAlbumInfo?.ReleaseGroup);
history.Data.Add("Size", message.TrackedDownload?.DownloadItem.TotalSize.ToString());
- history.Data.Add("Indexer", message.TrackedDownload?.RemoteAlbum?.Release?.Indexer);
historyToAdd.Add(history);
}
diff --git a/src/NzbDrone.Core/Indexers/FileList/FileListRequestGenerator.cs b/src/NzbDrone.Core/Indexers/FileList/FileListRequestGenerator.cs
index 653a94f9c..37c421456 100644
--- a/src/NzbDrone.Core/Indexers/FileList/FileListRequestGenerator.cs
+++ b/src/NzbDrone.Core/Indexers/FileList/FileListRequestGenerator.cs
@@ -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 GetRequest(string searchType, IEnumerable 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);
diff --git a/src/NzbDrone.Core/Indexers/FileList/FileListSettings.cs b/src/NzbDrone.Core/Indexers/FileList/FileListSettings.cs
index 398cebd38..2f587e6ef 100644
--- a/src/NzbDrone.Core/Indexers/FileList/FileListSettings.cs
+++ b/src/NzbDrone.Core/Indexers/FileList/FileListSettings.cs
@@ -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());
}
}
diff --git a/src/NzbDrone.Core/Lidarr.Core.csproj b/src/NzbDrone.Core/Lidarr.Core.csproj
index 14b90c62a..a56bfb295 100644
--- a/src/NzbDrone.Core/Lidarr.Core.csproj
+++ b/src/NzbDrone.Core/Lidarr.Core.csproj
@@ -9,7 +9,7 @@
-
+
@@ -20,14 +20,14 @@
-
-
+
+
-
+
-
+
diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json
index 97ac789ac..f090fc042 100644
--- a/src/NzbDrone.Core/Localization/Core/ca.json
+++ b/src/NzbDrone.Core/Localization/Core/ca.json
@@ -15,7 +15,7 @@
"BindAddress": "Adreça d'enllaç",
"DeleteQualityProfileMessageText": "Esteu segur que voleu suprimir el perfil de qualitat '{name}'?",
"DeleteReleaseProfile": "Suprimeix el perfil de llançament",
- "DeleteReleaseProfileMessageText": "Esteu segur que voleu suprimir aquest perfil de llançament?",
+ "DeleteReleaseProfileMessageText": "Esteu segur que voleu suprimir aquest perfil de retard?",
"DownloadClients": "Descàrrega Clients",
"EnableColorImpairedMode": "Activa el mode amb alteracions del color",
"EnableHelpText": "Activa la creació de fitxers de metadades per a aquest tipus de metadades",
@@ -82,7 +82,7 @@
"TorrentDelayHelpText": "Retard en minuts per a esperar abans de capturar un torrent",
"Torrents": "Torrents",
"UnableToLoadGeneralSettings": "No es pot carregar la configuració general",
- "UnableToLoadHistory": "No es pot carregar l'historial.",
+ "UnableToLoadHistory": "No es pot carregar l'historial",
"UnableToLoadImportListExclusions": "No es poden carregar les exclusions de la llista",
"UnableToLoadIndexerOptions": "No es poden carregar les opcions de l'indexador",
"RemoveCompleted": "S'ha eliminat",
@@ -134,7 +134,7 @@
"MoreInfo": "Més informació",
"NoBackupsAreAvailable": "No hi ha còpies de seguretat disponibles",
"NETCore": ".NET",
- "NoHistory": "Sense historial.",
+ "NoHistory": "Sense història",
"NoLeaveIt": "No, deixa-ho",
"NotificationTriggers": "Activadors de notificacions",
"NoUpdatesAreAvailable": "No hi ha actualitzacions disponibles",
@@ -243,7 +243,7 @@
"ChownGroupHelpText": "Nom del grup o gid. Utilitzeu gid per a sistemes de fitxers remots.",
"ChownGroupHelpTextWarning": "Això només funciona si l'usuari que executa {appName} és el propietari del fitxer. És millor assegurar-se que el client de descàrrega utilitza el mateix grup que {appName}.",
"ConnectSettings": "Configuració de connexió",
- "CopyUsingHardlinksHelpText": "Els enllaços durs permeten que {appName} importi torrents de sembra a la carpeta de l'artista sense prendre espai extra al disc o copiar tot el contingut del fitxer. Els enllaços durs només funcionaran si l'origen i la destinació estan en el mateix volum",
+ "CopyUsingHardlinksHelpText": "Utilitzeu els enllaços durs quan intenteu copiar fitxers de torrents que encara s'estan sembrant",
"CopyUsingHardlinksHelpTextWarning": "De tant en tant, els bloquejos de fitxers poden impedir reanomenar els fitxers que s'estan sembrant. Podeu desactivar temporalment la compartició i utilitzar la funció de reanomenar de {appName} com a solució.",
"CreateEmptyArtistFolders": "Creeu carpetes buides per a les pel·lícules",
"CreateEmptyArtistFoldersHelpText": "Creeu carpetes de pel·lícules que falten durant l'exploració del disc",
@@ -252,7 +252,7 @@
"CutoffUnmet": "Tall no assolit",
"Dates": "Dates",
"DatabaseMigration": "Migració de BD",
- "DelayingDownloadUntil": "S'està retardant la baixada fins a les {date} a les {time}",
+ "DelayingDownloadUntil": "S'està retardant la baixada fins a les {0} a les {1}",
"DelayProfile": "Perfil de retard",
"DelayProfiles": "Perfils de retard",
"Delete": "Suprimeix",
@@ -311,7 +311,7 @@
"IllRestartLater": "Reinicia més tard",
"ImportExtraFiles": "Importa fitxers addicionals",
"ImportExtraFilesHelpText": "Importeu fitxers addicionals coincidents (subtítols, nfo, etc.) després d'importar un fitxer de pel·lícula",
- "ImportFailedInterp": "Importació fallida: {0}",
+ "ImportFailedInterp": "ImportFailedInterp",
"Importing": "S'està important",
"IncludeUnmonitored": "Inclou no monitorat",
"Indexer": "Indexador",
@@ -323,7 +323,7 @@
"LogFiles": "Fitxers de registre",
"LogLevel": "Nivell de registre",
"MaximumSize": "Mida màxima",
- "MaximumSizeHelpText": "Mida màxima per a una versió que es pot capturar en MB. Establiu a zero per establir-lo en il·limitat.",
+ "MaximumSizeHelpText": "Mida màxima per a una versió que es pot capturar en MB. Establiu a zero per establir-lo en il·limitat",
"Mechanism": "Mecanisme",
"MediaInfo": "Informació de mitjans",
"MediaManagementSettings": "Configuració de gestió de mitjans",
@@ -462,7 +462,7 @@
"Progress": "Progrés",
"SizeLimit": "Límit de mida",
"Backup": "Còpia de seguretat",
- "IndexerTagHelpText": "Només utilitza aquest indexador per a pel·lícules que coincideixin amb almenys una etiqueta. Deixar en blanc per a utilitzar-ho amb totes les pel·lícules.",
+ "IndexerTagHelpText": "Utilitzeu aquest indexador només per a pel·lícules amb almenys una etiqueta coincident. Deixeu-ho en blanc per utilitzar-ho amb totes les pel·lícules.",
"Info": "Informació",
"InstanceName": "Nom de la instància",
"InteractiveImport": "Importació interactiva",
@@ -593,7 +593,7 @@
"CouldntFindAnyResultsForTerm": "No s'ha pogut trobar cap resultat per a '{0}'",
"DeleteCustomFormat": "Suprimeix el format personalitzat",
"DeleteCustomFormatMessageText": "Esteu segur que voleu suprimir l'indexador '{0}'?",
- "DeleteFormatMessageText": "Esteu segur que voleu suprimir l'etiqueta de format '{name}'?",
+ "DeleteFormatMessageText": "Esteu segur que voleu suprimir l'etiqueta de format {0} ?",
"DownloadPropersAndRepacksHelpTextWarning": "Utilitzeu formats personalitzats per a actualitzacions automàtiques a Propers/Repacks",
"DownloadedUnableToImportCheckLogsForDetails": "Baixat: no es pot importar: comproveu els registres per obtenir-ne més detalls",
"ExportCustomFormat": "Exporta el format personalitzat",
@@ -601,7 +601,7 @@
"FailedLoadingSearchResults": "No s'han pogut carregar els resultats de la cerca, torneu-ho a provar.",
"Formats": "Formats",
"IncludeCustomFormatWhenRenamingHelpText": "Inclou en {Custom Formats} el format de canvi de nom",
- "ItsEasyToAddANewArtistJustStartTypingTheNameOfTheArtistYouWantToAdd": "És fàcil afegir una pel·lícula nova, només cal que comenceu a escriure el nom de la pel·lícula que voleu afegir.",
+ "ItsEasyToAddANewArtistJustStartTypingTheNameOfTheArtistYouWantToAdd": "És fàcil afegir una pel·lícula nova, només cal que comenceu a escriure el nom de la pel·lícula que voleu afegir",
"MinFormatScoreHelpText": "La puntuació mínima de format personalitzada per a la baixada",
"Monitor": "Monitora",
"NegateHelpText": "Si està marcat, el format personalitzat no s'aplicarà si la condició {0} coincideix.",
@@ -614,7 +614,7 @@
"UnableToLoadInteractiveSearch": "No es poden carregar els resultats d'aquesta cerca de pel·lícules. Torna-ho a provar més tard",
"TheArtistFolderStrongpathstrongAndAllOfItsContentWillBeDeleted": "La carpeta de pel·lícules '{0}' i tot el seu contingut es suprimiran.",
"CustomFormat": "Format personalitzat",
- "CustomFormatRequiredHelpText": "La condició {0} ha de coincidir perquè s'apliqui el format personalitzat. En cas contrari, n'hi ha prou amb una única coincidència de {0}.",
+ "CustomFormatRequiredHelpText": "La condició {0} ha de coincidir perquè s'apliqui el format personalitzat. En cas contrari, n'hi ha prou amb una única coincidència de {1}.",
"CustomFormatSettings": "Configuració de formats personalitzats",
"CustomFormats": "Formats personalitzats",
"Customformat": "Formats personalitzats",
@@ -643,13 +643,13 @@
"ProxyCheckBadRequestMessage": "No s'ha pogut provar el servidor intermediari. Codi d'estat: {0}",
"ProxyCheckResolveIpMessage": "No s'ha pogut resoldre l'adreça IP de l'amfitrió intermediari configurat {0}",
"RemotePathMappingCheckBadDockerPath": "Esteu utilitzant docker; el client de baixada {0} col·loca les baixades a {1}, però el camí {2} no és vàlid. Reviseu els mapes de camins remots i la configuració del client de baixada.",
- "RemotePathMappingCheckDownloadPermissions": "{appName} pot veure però no accedir a la música descarregada {0}. Probablement s'ha produït un error en els permisos.",
+ "RemotePathMappingCheckDownloadPermissions": "{appName} pot veure però no accedir a la pel·lícula baixada {0}. Error de permisos probable.",
"RemotePathMappingCheckDockerFolderMissing": "Esteu utilitzant docker; el client de baixada {0} col·loca les baixades a {1}, però sembla que aquest directori no existeix dins del contenidor. Reviseu els mapes de camins remots i la configuració dels volums del contenidor.",
"RemotePathMappingCheckFilesBadDockerPath": "Esteu utilitzant docker; el client de baixada{0} ha informat de fitxers a {1}, però el camí {2} no és vàlid. Reviseu els mapes de camins remots i la configuració del client de baixada.",
"RemotePathMappingCheckFilesLocalWrongOSPath": "El client de baixada local {0} ha informat de fitxers a {1}, però el camí {2} no és vàlid. Reviseu la configuració del vostre client de baixada.",
"RemotePathMappingCheckFilesWrongOSPath": "El client de baixada remota {0} ha informat de fitxers a {1}, però el camí {2} no és vàlid. Reviseu els mapes de camins remots i baixeu la configuració del client.",
"RemotePathMappingCheckGenericPermissions": "El client de baixada {0} col·loca les baixades a {1} però {appName} no pot veure aquest directori. És possible que hàgiu d'ajustar els permisos de la carpeta.",
- "RemotePathMappingCheckImportFailed": "{appName} no ha pogut importar música. Comproveu els vostres registres per obtenir-ne més detalls.",
+ "RemotePathMappingCheckImportFailed": "{appName} no ha pogut importar una pel·lícula. Comproveu els vostres registres per a obtenir més informació.",
"RemotePathMappingCheckLocalWrongOSPath": "El client de baixada local {0} col·loca les baixades a {1}, però el camí {2} no és vàlid. Reviseu la configuració del vostre client de baixada.",
"RemotePathMappingCheckRemoteDownloadClient": "El client de baixada remota {0} ha informat de fitxers a {1}, però sembla que aquest directori no existeix. És probable que falti el mapa de camins remots.",
"RootFolderCheckMultipleMessage": "Falten diverses carpetes arrel: {0}",
@@ -677,8 +677,8 @@
"BlocklistReleases": "Llista de llançaments bloquejats",
"BlocklistReleaseHelpText": "Impedeix que {appName} torni a capturar aquesta versió automàticament",
"FailedToLoadQueue": "No s'ha pogut carregar la cua",
- "DeleteConditionMessageText": "Esteu segur que voleu suprimir la condició '{name}'?",
- "DeleteSelectedDownloadClients": "Suprimeix els clients seleccionats de baixada",
+ "DeleteConditionMessageText": "Esteu segur que voleu suprimir la notificació '{0}'?",
+ "DeleteSelectedDownloadClients": "Suprimeix el client de descàrrega",
"DeleteSelectedIndexers": "Suprimeix l'indexador(s)",
"DeleteSelectedIndexersMessageText": "Esteu segur que voleu suprimir {count} indexador(s) seleccionat(s)?",
"DownloadClientSortingCheckMessage": "El client de baixada {0} té l'ordenació {1} activada per a la categoria de {appName}. Hauríeu de desactivar l'ordenació al vostre client de descàrrega per evitar problemes d'importació.",
@@ -721,7 +721,7 @@
"ImportListRootFolderMissingRootHealthCheckMessage": "Falta la carpeta arrel per a les llistes d'importació: {0}",
"ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Falten diverses carpetes arrel per a les llistes d'importació: {0}",
"Enabled": "Habilitat",
- "AddNewArtistRootFolderHelpText": "La subcarpeta '{folder}' es crearà automàticament",
+ "AddNewArtistRootFolderHelpText": "La subcarpeta '{0}' es crearà automàticament",
"Priority": "Prioritat",
"DeleteSpecification": "Esborra especificació",
"BypassIfHighestQualityHelpText": "Evita el retard quan la versió té la qualitat activada més alta al perfil de qualitat amb el protocol preferit",
@@ -826,15 +826,15 @@
"Unlimited": "Il·limitat",
"Artist": "artista",
"BypassIfAboveCustomFormatScore": "Ometre si està per sobre de la puntuació de format personalitzada",
- "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "El client de baixada {0} està configurat per eliminar les baixades completades. Això pot provocar que les baixades s'eliminin del vostre client abans que {1} pugui importar-les.",
+ "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "El client de baixada {downloadClientName} està configurat per eliminar les baixades completades. Això pot provocar que les baixades s'eliminin del vostre client abans que {1} pugui importar-les.",
"EditConnectionImplementation": "Afegeix una connexió - {implementationName}",
"Episode": "Episodi",
"AddImportListExclusionAlbumHelpText": "Eviteu que els àlbums s'afegeixin a {appName} per llistes",
"ImportLists": "llista d'importació",
- "ApiKeyValidationHealthCheckMessage": "Actualitzeu la vostra clau de l'API perquè tingui almenys {0} caràcters. Podeu fer-ho mitjançant la configuració o el fitxer de configuració",
+ "ApiKeyValidationHealthCheckMessage": "Actualitzeu la vostra clau de l'API perquè tingui almenys {length} caràcters. Podeu fer-ho mitjançant la configuració o el fitxer de configuració",
"BypassIfAboveCustomFormatScoreHelpText": "Habiliteu l'omissió quan la versió tingui una puntuació superior a la puntuació mínima per al format personalitzat",
"Artists": "artista",
- "CountDownloadClientsSelected": "{selectedCount} client(s) de baixada seleccionat(s)",
+ "CountDownloadClientsSelected": "{count} client(s) de baixada seleccionat(s)",
"EditReleaseProfile": "Afegeix un perfil de llançament",
"ReleaseProfiles": "Perfils de llançament",
"ExtraFileExtensionsHelpTextsExamples": "Exemples: '.sub, .nfo' o 'sub,nfo'",
@@ -859,7 +859,7 @@
"AutoRedownloadFailedFromInteractiveSearch": "Tornar a baixar baixades fallades des de la cerca interactiva",
"AutoRedownloadFailed": "Tornar a baixar les baixades fallades",
"StatusEndedContinuing": "Continua",
- "DeleteTrackFileMessageText": "Esteu segur que voleu suprimir {0}?",
+ "DeleteTrackFileMessageText": "Esteu segur que voleu suprimir '{path}'?",
"NoCutoffUnmetItems": "No hi ha elements de tall no assolits",
"Release": " Llançament",
"DeleteEmptyFoldersHelpText": "Suprimeix les carpetes de sèries buides durant l'exploració del disc i quan s'esborren els fitxers de sèries",
@@ -914,7 +914,7 @@
"DownloadClientDelugeSettingsDirectoryCompleted": "Directori al qual es mou quan s'hagi completat",
"DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Ubicació opcional de les baixades completades, deixeu-lo en blanc per utilitzar la ubicació predeterminada de Deluge",
"DownloadClientDelugeSettingsDirectoryHelpText": "Ubicació opcional de les baixades completades, deixeu-lo en blanc per utilitzar la ubicació predeterminada de Deluge",
- "GrabReleaseUnknownArtistOrAlbumMessageText": "{appName} no ha pogut determinar per a quina pel·lícula era aquest llançament. És possible que {appName} no pugui importar automàticament aquesta versió. Voleu capturar '{title}'?",
+ "GrabReleaseUnknownArtistOrAlbumMessageText": "{appName} no ha pogut determinar per a quina pel·lícula era aquest llançament. És possible que {appName} no pugui importar automàticament aquesta versió. Voleu capturar \"{0}\"?",
"IndexerFlags": "Indicadors de l'indexador",
"MonitorNoAlbums": "Cap",
"Rejections": "Rebutjats",
@@ -992,240 +992,5 @@
"Paused": "En pausa",
"Pending": "Pendents",
"WaitingToImport": "S’està esperant per a importar",
- "WaitingToProcess": "S’està esperant per a processar",
- "DefaultMonitorOptionHelpText": "Quins àlbums s'han de controlar en afegir inicialment per als artistes detectats en aquesta carpeta",
- "DownloadedImporting": "'Descarregat - Important'",
- "ExpandItemsByDefault": "Expandeix els elements per defecte",
- "HideAlbums": "Oculta els àlbums",
- "PathHelpText": "Carpeta arrel que conté la vostra biblioteca de música",
- "AllAlbums": "Tots els àlbums",
- "AllowFingerprintingHelpText": "Utilitza l'empremta digital per millorar la precisió de la coincidència de la pista",
- "DefaultTagsHelpText": "Etiquetes {appName} per defecte per als artistes detectats en aquesta carpeta",
- "ShowNextAlbumHelpText": "Mostra el següent àlbum sota el cartell",
- "TheAlbumsFilesWillBeDeleted": "Els fitxers de l'àlbum s'eliminaran.",
- "TrackCount": "Comptador de pistes",
- "TrackDownloaded": "Pista descarregada",
- "TrackFiles": "Fitxers de pista",
- "ArtistNameHelpText": "El nom de l'artista/àlbum a excloure (pot ser qualsevol cosa significativa)",
- "ContinuingNoAdditionalAlbumsAreExpected": "No s'espera cap àlbum addicional",
- "ContinuingMoreAlbumsAreExpected": "S'espera més àlbums",
- "AddedArtistSettings": "Configuració d'artista afegida",
- "AlbumDetails": "Detalls de l'àlbum",
- "AlbumHasNotAired": "L'àlbum no s'ha emès",
- "AlbumInfo": "Informació de l'àlbum",
- "AlbumIsDownloading": "L'àlbum s'està baixant",
- "AlbumIsNotMonitored": "L'àlbum no està monitoritzat",
- "AlbumRelease": "Publicació de l'àlbum",
- "AlbumReleaseDate": "Data de publicació de l'àlbum",
- "AlbumStatus": "Estat de l'àlbum",
- "AlbumStudio": "Estudi d'àlbum",
- "AlbumStudioTracksDownloaded": "{trackFileCount}/{totalTrackCount} pistes baixades",
- "AlbumStudioTruncated": "Només es mostren els últims 20 àlbums, ves als detalls per veure tots els àlbums",
- "AlbumType": "Tipus d'àlbum",
- "AllAlbumsData": "Controla tots els àlbums excepte els especials",
- "AllArtistAlbums": "Tots els àlbums d'artista",
- "AllMonitoringOptionHelpText": "Monitora els artistes i tots els àlbums de cada artista inclosos a la llista d'importació",
- "AllowFingerprintingHelpTextWarning": "Això requereix que {appName} llegeixi parts del fitxer que alentiran els escanejos i poden causar una activitat de disc o xarxa alta.",
- "AnchorTooltip": "Aquest fitxer ja és a la vostra biblioteca per a una versió que esteu important",
- "AnyReleaseOkHelpText": "{appName} canviarà automàticament a la versió que coincideixi amb les pistes baixades",
- "ArtistClickToChangeAlbum": "Feu clic per canviar l'àlbum",
- "ArtistEditor": "Editor d'artistes",
- "ArtistFolderFormat": "Format de carpeta d'artista",
- "ArtistIsMonitored": "L'artista està monitoritzat",
- "ArtistMonitoring": "Seguiment de l'artista",
- "ArtistProgressBarText": "{trackFileCount} / {trackCount} (Total: {totalTrackCount}, Baixada: {downloadingCount})",
- "ArtistType": "Tipus d'artista",
- "ArtistsEditRootFolderHelpText": "Moure artistes a la mateixa carpeta arrel es pot utilitzar per a canviar el nom de les carpetes d'artista perquè coincideixin amb el nom o el format de nom actualitzat",
- "AutomaticallySwitchRelease": "Commuta automàticament la versió",
- "BackupIntervalHelpText": "Interval per a fer una còpia de seguretat de la base de dades {appName} i de la configuració",
- "BannerOptions": "Opcions del bàner",
- "ContinuingAllTracksDownloaded": "Continuant (totes les pistes baixades)",
- "DashOrSpaceDashDependingOnName": "Traç o guió d'espai depenent del nom",
- "DelayProfileArtistTagsHelpText": "Aplica als artistes amb almenys una etiqueta coincident",
- "DownloadClientSettingsRecentPriorityAlbumHelpText": "Prioritat a utilitzar en capturar àlbums publicats en els últims 14 dies",
- "IsShowingMonitoredMonitorSelected": "Monitor seleccionat",
- "LidarrSupportsMultipleListsForImportingAlbumsAndArtistsIntoTheDatabase": "{appName} admet múltiples llistes per importar àlbums i artistes a la base de dades.",
- "MediumFormat": "Format mitjà",
- "MetadataSettingsArtistSummary": "Crea fitxers de metadades quan s'importin pistes o s'actualitzi l'artista",
- "MissingTracks": "Manquen pistes",
- "MonitorAlbum": "Àlbum del monitor",
- "MonitorArtists": "Monitora els artistes",
- "MonitorExistingAlbums": "Àlbums existents",
- "MonitorFirstAlbum": "Primer àlbum",
- "NoTracksInThisMedium": "No hi ha pistes en aquest suport",
- "NotificationsSettingsUpdateMapPathsToHelpText": "{serviceName} camí, utilitzat per modificar els camins de sèrie quan {serviceName} veu la ubicació del camí de la biblioteca diferent de {appName} (requereix 'Biblioteca d'actualització')",
- "OneAlbum": "1 àlbum",
- "Retag": "Reetiqueta",
- "SearchForAllCutoffUnmetAlbums": "Cerca tots els àlbums de Cutoff Unmet",
- "SecondaryAlbumTypes": "Tipus d'àlbum secundari",
- "SetAppTags": "Estableix {appName} etiquetes",
- "ShouldMonitorExisting": "Monitora els àlbums existents",
- "ShouldMonitorExistingHelpText": "Monitora automàticament els àlbums d'aquesta llista que ja estan a {appName}",
- "ShouldMonitorHelpText": "Monitora els artistes i àlbums afegits d'aquesta llista",
- "ShowLastAlbum": "Mostra l'últim àlbum",
- "TagAudioFilesWithMetadata": "Etiqueta els fitxers d'àudio amb metadades",
- "TrackFileMissingTooltip": "Falta el fitxer de la pista",
- "TrackNaming": "Nom de la pista",
- "TrackProgress": "Progrés de la pista",
- "TrackStatus": "Estat de la pista",
- "SpecificMonitoringOptionHelpText": "Monitora els artistes, però només supervisa els àlbums inclosos explícitament a la llista",
- "OnAlbumDelete": "En suprimir l'àlbum",
- "TrackFileDeletedTooltip": "S'ha suprimit el fitxer de pista",
- "TrackFileTagsUpdatedTooltip": "S'han actualitzat les etiquetes dels fitxers de seguiment",
- "MonitoringOptionsHelpText": "Quins àlbums s'han de controlar després d'afegir l'artista (ajust d'un sol cop)",
- "Proceed": "Procedeix",
- "SelectArtist": "Selecciona l'artista",
- "AllowArtistChangeClickToChangeArtist": "Feu clic per canviar l'artista",
- "FutureAlbums": "Àlbums futurs",
- "ArtistName": "Nom de l'artista",
- "MonitorNoNewAlbums": "Sense àlbums nous",
- "IsExpandedShowTracks": "Mostra les pistes",
- "MonitorMissingAlbums": "Manquen àlbums",
- "ShowAlbumCount": "Mostra el comptador d'àlbums",
- "AreYouSure": "N'estàs segur?",
- "Banners": "Bàners",
- "NoneMonitoringOptionHelpText": "No monitoris artistes ni àlbums",
- "DownloadedWaitingToImport": "'Descarregat - Esperant a importar'",
- "EpisodeDoesNotHaveAnAbsoluteEpisodeNumber": "L'episodi no té un número d'episodi absolut",
- "NoMediumInformation": "No hi ha informació de suport disponible.",
- "MissingTracksArtistNotMonitored": "Manquen pistes (l'artista no està monitoritzat)",
- "NotDiscography": "No discografia",
- "NotificationsSettingsUpdateMapPathsFromHelpText": "{appName} camí, utilitzat per modificar els camins de sèrie quan {serviceName} veu la ubicació del camí de la biblioteca diferent de {appName} (requereix 'Biblioteca d'actualització')",
- "NotificationsTagsArtistHelpText": "Envia només notificacions per a artistes amb almenys una etiqueta coincident",
- "Playlist": "Reproducció",
- "PrimaryAlbumTypes": "Tipus d'àlbum principal",
- "PrimaryTypes": "Tipus primaris",
- "TrackArtist": "Artista de la pista",
- "TrackImported": "S'ha importat la pista",
- "DownloadImported": "Baixada importada",
- "ForeignId": "Id estranger",
- "Inactive": "Inactiu",
- "EditArtist": "Edita l'artista",
- "ReleasesHelpText": "Canvia el llançament d'aquest àlbum",
- "ShouldSearch": "Cerca elements nous",
- "GoToArtistListing": "Ves a la llista d'artistes",
- "SelectAlbum": "Selecciona l'àlbum",
- "SceneNumberHasntBeenVerifiedYet": "El número d'escena encara no s'ha verificat",
- "SelectTracks": "Selecciona les pistes",
- "ArtistIsUnmonitored": "L'artista no està monitoritzat",
- "DefaultQualityProfileIdHelpText": "Perfil de qualitat predeterminat per als artistes detectats en aquesta carpeta",
- "ExistingAlbums": "Àlbums existents",
- "GroupInformation": "Informació del grup",
- "MatchedToAlbums": "Coincideix amb els àlbums",
- "MusicbrainzId": "Id del Musicbrainz",
- "ThereWasAnErrorLoadingThisItem": "S'ha produït un error en carregar aquest element",
- "SearchBoxPlaceHolder": "p. ex. Trencant Benjamin, lidarr:854a1807-025b-42a8-ba8c-2a39717f1d25",
- "ShowNextAlbum": "Mostra l'àlbum següent",
- "MediaCount": "Comptador de mitjans",
- "MissingAlbums": "Manquen àlbums",
- "MissingTracksArtistMonitored": "Pistes que falten (controlat per l'artista)",
- "MonitorFutureAlbums": "Àlbums futurs",
- "MusicBrainzAlbumID": "ID de l'àlbum del MusicBrainz",
- "NextAlbum": "Àlbum següent",
- "AlbumTitle": "Títol de l'àlbum",
- "AllExpandedExpandAll": "Expandeix-ho tot",
- "MonitorNewAlbums": "Àlbums nous",
- "LatestAlbum": "Últim àlbum",
- "RemoveSelectedItemBlocklistMessageText": "Esteu segur que voleu eliminar els elements seleccionats de la llista de bloqueigs?",
- "RenameTracks": "Canvia el nom de les pistes",
- "ThereWasAnErrorLoadingThisPage": "S'ha produït un error en carregar aquesta pàgina",
- "TrackFileCounttotalTrackCountTracksDownloadedInterp": "{0}/{1} pistes baixades",
- "TrackFileRenamedTooltip": "S'ha canviat el nom del fitxer de pista",
- "WriteMetadataToAudioFiles": "Escriu les metadades als fitxers d'àudio",
- "HasMonitoredAlbumsNoMonitoredAlbumsForThisArtist": "No hi ha àlbums supervisats per a aquest artista",
- "SearchAlbum": "Cerca un àlbum",
- "ForNewImportsOnly": "Només per a importacions noves",
- "CollapseMultipleAlbums": "Redueix diversos àlbums",
- "CollapseMultipleAlbumsHelpText": "Redueix diversos àlbums que es publiquen el mateix dia",
- "CombineWithExistingFiles": "Combina amb els fitxers existents",
- "CountAlbums": "{albumCount} àlbums",
- "Deceased": "Defunció",
- "DefaultDelayProfileArtist": "Aquest és el perfil per defecte. S'aplica a tots els artistes que no tenen un perfil explícit.",
- "DefaultLidarrTags": "Etiquetes {appName} per defecte",
- "DefaultMetadataProfileIdHelpText": "Perfil predeterminat de metadades per als artistes detectats en aquesta carpeta",
- "DeleteArtist": "Suprimeix l'artista seleccionat",
- "DeleteArtistFolder": "Suprimeix la carpeta d'artista",
- "DeleteArtistFolderCountWithFilesConfirmation": "Esteu segur que voleu suprimir {count} artistes seleccionats i tots els continguts?",
- "DeleteFilesHelpText": "Suprimeix els fitxers de la pista i la carpeta de l'artista",
- "DeleteSelectedArtists": "Suprimeix els artistes seleccionats",
- "DeleteTrackFile": "Suprimeix el fitxer de pista",
- "EditSelectedArtists": "Edita els artistes seleccionats",
- "EmbedCoverArtHelpText": "Incrusta l'art de l'àlbum Lidarr en fitxers d'àudio en escriure etiquetes",
- "EmbedCoverArtInAudioFiles": "Incrusta la caràtula en fitxers d'àudio",
- "EnableAutomaticAddHelpText": "Afegeix un artista/àlbum a {appName} quan es realitzen les sincronitzacions a través de la interfície d'usuari o per {appName}",
- "EnabledHelpText": "Marqueu-ho per a habilitar el perfil de la versió",
- "EndedAllTracksDownloaded": "Finalitzat (totes les pistes baixades)",
- "ExistingAlbumsData": "Monitora els àlbums que tenen fitxers o encara no s'han publicat",
- "ExpandBroadcastByDefaultHelpText": "Transmissió",
- "ExpandEPByDefaultHelpText": "Eps",
- "ExpandSingleByDefaultHelpText": "Individuals",
- "FilterAlbumPlaceholder": "Filtra l'àlbum",
- "FilterArtistPlaceholder": "Filtra l'artista",
- "FirstAlbum": "Primer àlbum",
- "FirstAlbumData": "Controla els primers àlbums. Tots els altres àlbums seran ignorats",
- "ForeignIdHelpText": "L'ID del Musicbrainz de l'artista/àlbum a excloure",
- "FutureAlbumsData": "Monitora els àlbums que encara no s'han publicat",
- "HideTracks": "Oculta les pistes",
- "ICalTagsArtistHelpText": "Feed només contindrà artistes amb almenys una etiqueta coincident",
- "IfYouDontAddAnImportListExclusionAndTheArtistHasAMetadataProfileOtherThanNoneThenThisAlbumMayBeReaddedDuringTheNextArtistRefresh": "Si no afegiu una exclusió de la llista d'importació i l'artista té un perfil de metadades diferent de 'None'.",
- "ImportCompleteFailed": "Ha fallat la importació",
- "ImportListTagsHelpText": "Etiquetes que s'afegiran a la importació des d'aquesta llista",
- "IndexerIdHelpText": "Especifiqueu a quin indexador s'aplica el perfil",
- "IsExpandedHideAlbums": "Oculta els àlbums",
- "IsExpandedHideTracks": "Oculta les pistes",
- "IsExpandedShowAlbums": "Mostra els àlbums",
- "IsInUseCantDeleteAMetadataProfileThatIsAttachedToAnArtistOrImportList": "No es pot suprimir un perfil de metadades que està adjuntat a un artista o a una llista d'importació",
- "IsInUseCantDeleteAQualityProfileThatIsAttachedToAnArtistOrImportList": "No es pot suprimir un perfil de qualitat que estigui adjuntat a un artista o a una llista d'importació",
- "IsShowingMonitoredUnmonitorSelected": "Unmonitor seleccionat",
- "LastAlbum": "Últim àlbum",
- "LatestAlbumData": "Monitoritza els últims àlbums i futurs àlbums",
- "ManageTracks": "Gestiona les pistes",
- "MatchedToArtist": "Coincideix amb l'artista",
- "MassAlbumsCutoffUnmetWarning": "Esteu segur que voleu cercar tots els ‘{0}’ àlbums sense límits satisfets?",
- "MissingAlbumsData": "Monitora els àlbums que no tenen fitxers o que encara no s'han publicat",
- "MonitorAlbumExistingOnlyWarning": "Aquest és un ajust ajustat de la configuració monitoritzada per a cada àlbum. Utilitzeu l'opció Artist/Edit per controlar què passa amb els àlbums nous",
- "MonitorAllAlbums": "Tots els àlbums",
- "MonitorArtist": "Monitora l’artista",
- "MonitorLastestAlbum": "Últim àlbum",
- "MonitorNewItems": "Monitora els àlbums nous",
- "MonitorNewItemsHelpText": "Quins àlbums nous s'han de controlar",
- "MonitoredHelpText": "Baixa els àlbums monitoritzats d'aquest artista",
- "MultiDiscTrackFormat": "Format de pista multidisc",
- "MusicBrainzArtistID": "ID de l'artista del MusicBrainz",
- "NoneData": "No es controlarà cap àlbum",
- "OnArtistAdd": "En afegir l'artista",
- "Retagged": "Reetiquetat",
- "RecycleBinUnableToWriteHealthCheck": "No s'ha pogut escriure a la carpeta de contenidors de reciclatge configurada: {0}. Assegureu-vos que aquest camí existeix i que l'usuari que executa {appName} pot escriure",
- "RefreshArtist": "Actualitza l'artista",
- "ReleaseProfileTagArtistHelpText": "Els perfils de llançament s'aplicaran als artistes amb almenys una etiqueta coincident. Deixa en blanc per aplicar a tots els artistes",
- "ReplaceExistingFiles": "Substitueix els fitxers existents",
- "RetagSelectedArtists": "Reetiqueta els artistes seleccionats",
- "SearchForAllCutoffUnmetAlbumsConfirmationCount": "Esteu segur que voleu cercar tots els {totalRecords} àlbums tallats Unmet?",
- "SearchForAllMissingAlbums": "Cerca tots els àlbums que falten",
- "SearchForAllMissingAlbumsConfirmationCount": "Esteu segur que voleu cercar tots els {totalRecords} àlbums que manquen?",
- "SearchForMonitoredAlbums": "Cerca àlbums monitoritzats",
- "SecondaryTypes": "Tipus secundaris",
- "SelectAlbumRelease": "Selecciona la publicació de l'àlbum",
- "SelectedCountArtistsSelectedInterp": "{selectedCount} Artistes seleccionats",
- "ShowTitleHelpText": "Mostra el nom de l'artista sota el cartell",
- "SkipRedownloadHelpText": "Evita que {appName} intenti baixar versions alternatives per als elements eliminats",
- "SpecificAlbum": "Àlbum específic",
- "TotalTrackCountTracksTotalTrackFileCountTracksWithFilesInterp": "{0} pistes totals. {1} pistes amb fitxers.",
- "TrackFilesCountMessage": "No hi ha fitxers de pista",
- "TrackFilesLoadError": "No s'han pogut carregar els fitxers de pista",
- "TrackMissingFromDisk": "Falta la pista del disc",
- "TracksLoadError": "No s'han pogut carregar les pistes",
- "WriteAudioTagsHelpTextWarning": "En seleccionar ‘Tots els fitxers’ s'alteraran els fitxers existents quan s'importin.",
- "DeleteArtistFolders": "Suprimeix les carpetes d'artista",
- "DownloadClientSettingsOlderPriorityAlbumHelpText": "Prioritat a utilitzar en capturar àlbums publicats fa més de 14 dies",
- "EditMetadata": "Edita les metadades",
- "NewAlbums": "Àlbums nous",
- "NoAlbums": "Sense àlbums",
- "NoMissingItems": "No falten elements",
- "OnArtistDelete": "En suprimir l'artista",
- "OnTrackRetag": "En reetiquetar la pista",
- "RootFolderPathHelpText": "Els elements de la llista de carpetes arrel s'afegiran a",
- "ScrubAudioTagsHelpText": "Elimina les etiquetes existents dels fitxers, deixant només les afegides per {appName}.",
- "ScrubExistingTags": "Neteja les etiquetes existents",
- "Disambiguation": "Desambiguació"
+ "WaitingToProcess": "S’està esperant per a processar"
}
diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json
index c9271275e..5f9c76b0c 100644
--- a/src/NzbDrone.Core/Localization/Core/en.json
+++ b/src/NzbDrone.Core/Localization/Core/en.json
@@ -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",
diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json
index b61d52f69..9eab9f71b 100644
--- a/src/NzbDrone.Core/Localization/Core/fi.json
+++ b/src/NzbDrone.Core/Localization/Core/fi.json
@@ -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.",
diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json
index 6dbaaf986..7b10d98b2 100644
--- a/src/NzbDrone.Core/Localization/Core/fr.json
+++ b/src/NzbDrone.Core/Localization/Core/fr.json
@@ -690,7 +690,7 @@
"ResetDefinitions": "Réinitialiser les définitions",
"ResetTitles": "Réinitialiser les titres",
"HiddenClickToShow": "Masqué, cliquez pour afficher",
- "RemotePathMappingCheckDownloadPermissions": "{appName} peut voir mais ne peut accéder au musique téléchargé {0}. Il s'agit probablement d'une erreur de permissions.",
+ "RemotePathMappingCheckDownloadPermissions": "{appName} peut voir mais ne peut accéder au film téléchargé {0}. Il s'agit probablement d'une erreur de permissions.",
"RemotePathMappingCheckDockerFolderMissing": "Vous utilisez docker ; {0} enregistre les téléchargements dans {1} mais ce dossier n'est pas présent dans ce conteneur. Vérifiez vos paramètres de dossier distant et les paramètres de votre conteneur docker.",
"ShownClickToHide": "Affiché, cliquez pour masquer",
"ApiKeyValidationHealthCheckMessage": "Veuillez mettre à jour votre clé API pour qu'elle contienne au moins {0} caractères. Vous pouvez le faire via les paramètres ou le fichier de configuration",
@@ -729,7 +729,7 @@
"RemotePathMappingCheckFilesWrongOSPath": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais il ne s'agit pas d'un chemin {2} valide. Vérifiez les paramètres de votre client de téléchargement.",
"RemotePathMappingCheckFolderPermissions": "{appName} peut voir mais pas accéder au répertoire de téléchargement {0}. Erreur d'autorisations probable.",
"RemotePathMappingCheckGenericPermissions": "Le client de téléchargement {0} met les téléchargements dans {1} mais {appName} ne peut voir ce répertoire. Il est possible que vous ayez besoin d'ajuster les permissions de ce dossier.",
- "RemotePathMappingCheckImportFailed": "{appName} a échoué en important une musique. Vérifier vos logs pour plus de détails.",
+ "RemotePathMappingCheckImportFailed": "{appName} a échoué en important un Film. Vérifier vos logs pour plus de détails.",
"RemotePathMappingCheckLocalFolderMissing": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais ce chemin ne semble pas exister. Vérifiez vos paramètres de chemins distants.",
"RemotePathMappingCheckLocalWrongOSPath": "Le client de téléchargement {0} met les téléchargements dans {1} mais il ne s'agit pas d'un chemin {2} valide. Vérifiez les paramètres de votre client de téléchargement.",
"RemotePathMappingCheckRemoteDownloadClient": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais ce chemin ne semble pas exister. Vérifiez vos paramètres de chemins distants.",
@@ -1350,14 +1350,5 @@
"PendingDownloadClientUnavailable": "En attente – Le client de téléchargement n'est pas disponible",
"UnableToImportAutomatically": "Impossible d'importer automatiquement",
"WaitingToImport": "En attente d'import",
- "WaitingToProcess": "En attente de traitement",
- "DefaultDelayProfileArtist": "Il s'agit du profil par défaut. Il s'applique à tous les artistes qui n'ont pas de profil explicite.",
- "DelayProfileArtistTagsHelpText": "S'applique aux artistes avec au moins une balise correspondante",
- "ICalTagsArtistHelpText": "Le flux ne contiendra que des artistes ayant au moins un tag correspondant",
- "NoMediumInformation": "Aucune information sur le support n'est disponible.",
- "DownloadClientSettingsOlderPriorityAlbumHelpText": "Priorité à utiliser lors de la récupération des albums sortis il y a plus de 14 jours",
- "DownloadClientSettingsRecentPriorityAlbumHelpText": "Priorité à utiliser lors de la récupération des albums sortis au cours des 14 derniers jours",
- "NotificationsTagsArtistHelpText": "Envoyer des notifications uniquement pour les artistes ayant au moins un tag correspondant",
- "ReleaseProfileTagArtistHelpText": "Les profils de sortie s'appliqueront aux artistes ayant au moins un tag correspondant. Laisser vide pour appliquer à tous les artistes",
- "TracksLoadError": "Impossible de charger les pistes"
+ "WaitingToProcess": "En attente de traitement"
}
diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json
index 2af304152..ea9515178 100644
--- a/src/NzbDrone.Core/Localization/Core/it.json
+++ b/src/NzbDrone.Core/Localization/Core/it.json
@@ -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"
}
diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json
index 7b294c88f..e694f772b 100644
--- a/src/NzbDrone.Core/Localization/Core/nb_NO.json
+++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json
@@ -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"
}
diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json
index cb686c7ce..8c24bdac1 100644
--- a/src/NzbDrone.Core/Localization/Core/nl.json
+++ b/src/NzbDrone.Core/Localization/Core/nl.json
@@ -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.",
diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json
index 063c9d179..762f82806 100644
--- a/src/NzbDrone.Core/Localization/Core/pt.json
+++ b/src/NzbDrone.Core/Localization/Core/pt.json
@@ -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"
}
diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json
index 7b1bed1fc..ae809669b 100644
--- a/src/NzbDrone.Core/Localization/Core/ru.json
+++ b/src/NzbDrone.Core/Localization/Core/ru.json
@@ -834,7 +834,7 @@
"Absolute": "Абсолютный",
"RecycleBinUnableToWriteHealthCheck": "Не удается выполнить запись в настроенную папку корзины: {path}. Убедитесь, что этот путь существует и доступен для записи пользователем, запускающим {appName}",
"AddListExclusionHelpText": "Запретить добавление серий в {appName} по спискам",
- "AddNewArtistRootFolderHelpText": "Подпапка \"{folder}\" будет создана автоматически",
+ "AddNewArtistRootFolderHelpText": "Подпапка \"{0}\" будет создана автоматически",
"AuthenticationRequiredHelpText": "Отредактируйте, для каких запросов требуется авторизация. Не изменяйте, если не понимаете риски.",
"DeleteArtistFolderCountConfirmation": "Вы уверены, что хотите удалить {count} выбранных индексатора?",
"RenameFiles": "Переименовать файлы",
@@ -1108,8 +1108,5 @@
"Pending": "В ожидании",
"PendingDownloadClientUnavailable": "Ожидание – Клиент для загрузки недоступен",
"SkipFreeSpaceCheckHelpText": "Используете, когда {appName} не может верно определить свободное место в вашей корневой папке",
- "ManageFormats": "Управлять форматами",
- "AddArtistWithName": "Добавить {artistName}",
- "AddNewAlbum": "Добавить новый альбом",
- "AddMetadataProfile": "Добавить мета-данные профиля"
+ "ManageFormats": "Управлять форматами"
}
diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json
index f6db56e21..7b1d2a391 100644
--- a/src/NzbDrone.Core/Localization/Core/uk.json
+++ b/src/NzbDrone.Core/Localization/Core/uk.json
@@ -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": "Таблиця",
@@ -923,289 +923,5 @@
"Pending": "В очікуванні",
"WaitingToImport": "Очікування імпорту",
"WaitingToProcess": "Очікування обробки",
- "CheckDownloadClientForDetails": "перевірте клієнт завантаження, щоб дізнатися більше",
- "DashOrSpaceDashDependingOnName": "Тире або пробіл залежно від імені",
- "EpisodeDoesNotHaveAnAbsoluteEpisodeNumber": "Епізод не має абсолютного номера епізоду",
- "ExpandOtherByDefaultHelpText": "Інше",
- "ImportListTagsHelpText": "Теги, які будуть додані при імпорті з цього списку",
- "IndexerIdHelpText": "Вкажіть, до якого індексатору застосовується профіль",
- "IsShowingMonitoredUnmonitorSelected": "Не відстежувати вибрані",
- "RemoveSelectedItemBlocklistMessageText": "Ви впевнені, що хочете видалити вибрані елементи з чорного списку?",
- "RootFolderPathHelpText": "Елементи списку кореневих тек будуть додані в",
- "ThereWasAnErrorLoadingThisItem": "Сталася помилка при завантаженні цього елемента",
- "ThereWasAnErrorLoadingThisPage": "Сталася помилка під час завантаження цієї сторінки",
- "AllExpandedExpandAll": "Розгорнути все",
- "NoMissingItems": "Немає відсутніх елементів",
- "TBA": "Будь ласка, перевірте пізніше",
- "IsShowingMonitoredMonitorSelected": "Відстеження вибрано",
- "SceneNumberHasntBeenVerifiedYet": "Номер сцени ще не перевірено",
- "EnabledHelpText": "Установіть прапорець, щоб увімкнути профіль релізу",
- "Loading": "Завантаження",
- "NoCutoffUnmetItems": "Не має елементів що не досягли порогу",
- "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": "Слідкувати за змінами файлів у кореневих папках"
+ "CheckDownloadClientForDetails": "перевірте клієнт завантаження, щоб дізнатися більше"
}
diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json
index 54d7c5a4f..09dbca921 100644
--- a/src/NzbDrone.Core/Localization/Core/zh_CN.json
+++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json
@@ -1337,7 +1337,7 @@
"DownloadClientSettingsRecentPriority": "最近优先",
"PostImportCategory": "导入后分类",
"NotificationsSettingsWebhookHeaders": "标头",
- "DefaultDelayProfileArtist": "这是默认的配置。此配置用于所有的没有配置的艺术家",
+ "DefaultDelayProfileArtist": "This is the default profile. It applies to all artists that don't have an explicit profile.",
"CheckDownloadClientForDetails": "查看下载客户端了解更多详细信息",
"DownloadWarning": "下载警告:{warningMessage}",
"UnableToImportAutomatically": "无法自动导入",
@@ -1347,9 +1347,5 @@
"Pending": "挂起",
"PendingDownloadClientUnavailable": "挂起 - 下载客户端不可用",
"WaitingToImport": "等待导入",
- "WaitingToProcess": "等待处理",
- "DelayProfileArtistTagsHelpText": "应用到至少有一个标签匹配的艺术家",
- "AlbumInfo": "专辑 信息",
- "DownloadClientSettingsOlderPriorityAlbumHelpText": "优先使用14天前发布的专辑",
- "DownloadClientSettingsRecentPriorityAlbumHelpText": "优先使用过去14天内发布的专辑"
+ "WaitingToProcess": "等待处理"
}
diff --git a/src/NzbDrone.Core/Localization/Core/zh_Hans.json b/src/NzbDrone.Core/Localization/Core/zh_Hans.json
index 69720c484..032c8c738 100644
--- a/src/NzbDrone.Core/Localization/Core/zh_Hans.json
+++ b/src/NzbDrone.Core/Localization/Core/zh_Hans.json
@@ -4,9 +4,5 @@
"Always": "总是",
"Analytics": "分析",
"Username": "用户名",
- "Activity": "活动",
- "UseProxy": "使用代理",
- "Uptime": "运行时间",
- "Warn": "警告",
- "Updates": "更新"
+ "Activity": "活动"
}
diff --git a/src/NzbDrone.Core/MediaFiles/UpgradeMediaFileService.cs b/src/NzbDrone.Core/MediaFiles/UpgradeMediaFileService.cs
index 1dddb8de2..0dd3c3e62 100644
--- a/src/NzbDrone.Core/MediaFiles/UpgradeMediaFileService.cs
+++ b/src/NzbDrone.Core/MediaFiles/UpgradeMediaFileService.cs
@@ -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);
diff --git a/src/NzbDrone.Core/Music/Utilities/ShouldRefreshAlbum.cs b/src/NzbDrone.Core/Music/Utilities/ShouldRefreshAlbum.cs
index f21c6d70c..5dac303ce 100644
--- a/src/NzbDrone.Core/Music/Utilities/ShouldRefreshAlbum.cs
+++ b/src/NzbDrone.Core/Music/Utilities/ShouldRefreshAlbum.cs
@@ -19,34 +19,26 @@ namespace NzbDrone.Core.Music
public bool ShouldRefresh(Album album)
{
- try
+ if (album.LastInfoSync < DateTime.UtcNow.AddDays(-60))
{
- if (album.LastInfoSync < DateTime.UtcNow.AddDays(-60))
- {
- _logger.Trace("Album {0} last updated more than 60 days ago, should refresh.", album.Title);
- return true;
- }
-
- if (album.LastInfoSync >= DateTime.UtcNow.AddHours(-12))
- {
- _logger.Trace("Album {0} last updated less than 12 hours ago, should not be refreshed.", album.Title);
- return false;
- }
-
- if (album.ReleaseDate > DateTime.UtcNow.AddDays(-30))
- {
- _logger.Trace("album {0} released less than 30 days ago, should refresh.", album.Title);
- return true;
- }
-
- _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.");
+ _logger.Trace("Album {0} last updated more than 60 days ago, should refresh.", album.Title);
return true;
}
+
+ if (album.LastInfoSync >= DateTime.UtcNow.AddHours(-12))
+ {
+ _logger.Trace("Album {0} last updated less than 12 hours ago, should not be refreshed.", album.Title);
+ return false;
+ }
+
+ if (album.ReleaseDate > DateTime.UtcNow.AddDays(-30))
+ {
+ _logger.Trace("album {0} released less than 30 days ago, should refresh.", album.Title);
+ return true;
+ }
+
+ _logger.Trace("Album {0} released long ago and recently refreshed, should not be refreshed.", album.Title);
+ return false;
}
}
}
diff --git a/src/NzbDrone.Core/Music/Utilities/ShouldRefreshArtist.cs b/src/NzbDrone.Core/Music/Utilities/ShouldRefreshArtist.cs
index 26548d757..495b937af 100644
--- a/src/NzbDrone.Core/Music/Utilities/ShouldRefreshArtist.cs
+++ b/src/NzbDrone.Core/Music/Utilities/ShouldRefreshArtist.cs
@@ -22,48 +22,40 @@ namespace NzbDrone.Core.Music
public bool ShouldRefresh(Artist artist)
{
- try
+ if (artist.LastInfoSync == null)
{
- if (artist.LastInfoSync == null)
- {
- _logger.Trace("Artist {0} was just added, should refresh.", artist.Name);
- return true;
- }
-
- if (artist.LastInfoSync < DateTime.UtcNow.AddDays(-30))
- {
- _logger.Trace("Artist {0} last updated more than 30 days ago, should refresh.", artist.Name);
- return true;
- }
-
- if (artist.LastInfoSync >= DateTime.UtcNow.AddHours(-12))
- {
- _logger.Trace("Artist {0} last updated less than 12 hours ago, should not be refreshed.", artist.Name);
- return false;
- }
-
- if (artist.Metadata.Value.Status == ArtistStatusType.Continuing && artist.LastInfoSync < DateTime.UtcNow.AddDays(-2))
- {
- _logger.Trace("Artist {0} is continuing and has not been refreshed in 2 days, should refresh.", artist.Name);
- return true;
- }
-
- var lastAlbum = _albumService.GetAlbumsByArtist(artist.Id).MaxBy(e => e.ReleaseDate);
-
- if (lastAlbum != null && lastAlbum.ReleaseDate > DateTime.UtcNow.AddDays(-30))
- {
- _logger.Trace("Last album in {0} aired less than 30 days ago, should refresh.", artist.Name);
- return true;
- }
-
- _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.");
+ _logger.Trace("Artist {0} was just added, should refresh.", artist.Name);
return true;
}
+
+ if (artist.LastInfoSync < DateTime.UtcNow.AddDays(-30))
+ {
+ _logger.Trace("Artist {0} last updated more than 30 days ago, should refresh.", artist.Name);
+ return true;
+ }
+
+ if (artist.LastInfoSync >= DateTime.UtcNow.AddHours(-12))
+ {
+ _logger.Trace("Artist {0} last updated less than 12 hours ago, should not be refreshed.", artist.Name);
+ return false;
+ }
+
+ if (artist.Metadata.Value.Status == ArtistStatusType.Continuing && artist.LastInfoSync < DateTime.UtcNow.AddDays(-2))
+ {
+ _logger.Trace("Artist {0} is continuing and has not been refreshed in 2 days, should refresh.", artist.Name);
+ return true;
+ }
+
+ var lastAlbum = _albumService.GetAlbumsByArtist(artist.Id).MaxBy(e => e.ReleaseDate);
+
+ if (lastAlbum != null && lastAlbum.ReleaseDate > DateTime.UtcNow.AddDays(-30))
+ {
+ _logger.Trace("Last album in {0} aired less than 30 days ago, should refresh.", artist.Name);
+ return true;
+ }
+
+ _logger.Trace("Artist {0} ended long ago, should not be refreshed.", artist.Name);
+ return false;
}
}
}
diff --git a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs
index c657f8b16..9610ef324 100644
--- a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs
+++ b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs
@@ -347,7 +347,7 @@ namespace NzbDrone.Core.Notifications.CustomScript
{
if (artist == null)
{
- return new List();
+ return null;
}
return _tagRepository.GetTags(artist.Tags)
diff --git a/src/NzbDrone.Core/Notifications/Discord/Discord.cs b/src/NzbDrone.Core/Notifications/Discord/Discord.cs
index 9889a8ace..94714a4f0 100644
--- a/src/NzbDrone.Core/Notifications/Discord/Discord.cs
+++ b/src/NzbDrone.Core/Notifications/Discord/Discord.cs
@@ -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;
}
}
}
diff --git a/src/NzbDrone.Core/Parser/QualityParser.cs b/src/NzbDrone.Core/Parser/QualityParser.cs
index 1bfca5fea..32b7e7542 100644
--- a/src/NzbDrone.Core/Parser/QualityParser.cs
+++ b/src/NzbDrone.Core/Parser/QualityParser.cs
@@ -36,9 +36,9 @@ namespace NzbDrone.Core.Parser
(?V2[ ]?kbps|V2|[\[\(].*V2.*[\]\)]))\b",
RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
- private static readonly Regex SampleSizeRegex = new (@"\b(?:(?24[-._ ]?bit|flac24(?:[-._ ]?bit)?|tr24|24-(?:44|48|96|192)|[\[\(].*24bit.*[\]\)]))\b", RegexOptions.Compiled);
+ private static readonly Regex SampleSizeRegex = new (@"\b(?:(?24[-._ ]?bit|tr24|24-(?:44|48|96|192)|[\[\(].*24bit.*[\]\)]))\b", RegexOptions.Compiled);
- private static readonly Regex CodecRegex = new (@"\b(?:(?MPEG Version \d(.5)? Audio, Layer 1|MP1)|(?MPEG Version \d(.5)? Audio, Layer 2|MP2)|(?MP3.*VBR|MPEG Version \d(.5)? Audio, Layer 3 vbr)|(?MP3|MPEG Version \d(.5)? Audio, Layer 3)|(?(web)?flac(?:24(?:[-._ ]?bit)?)?|TR24)|(?wavpack|wv)|(?alac)|(?WMA\d?)|(?WAV|PCM)|(?M4A|M4P|M4B|AAC|mp4a|MPEG-4 Audio(?!.*alac))|(?OGG|OGA|Vorbis))\b|(?monkey's audio|[\[|\(].*\bape\b.*[\]|\)])|(?Opus Version \d(.5)? Audio|[\[|\(].*\bopus\b.*[\]|\)])",
+ private static readonly Regex CodecRegex = new (@"\b(?:(?MPEG Version \d(.5)? Audio, Layer 1|MP1)|(?MPEG Version \d(.5)? Audio, Layer 2|MP2)|(?MP3.*VBR|MPEG Version \d(.5)? Audio, Layer 3 vbr)|(?MP3|MPEG Version \d(.5)? Audio, Layer 3)|(?(web)?flac|TR24)|(?wavpack|wv)|(?alac)|(?WMA\d?)|(?WAV|PCM)|(?M4A|M4P|M4B|AAC|mp4a|MPEG-4 Audio(?!.*alac))|(?OGG|OGA|Vorbis))\b|(?monkey's audio|[\[|\(].*\bape\b.*[\]|\)])|(?Opus Version \d(.5)? Audio|[\[|\(].*\bopus\b.*[\]|\)])",
RegexOptions.Compiled | RegexOptions.IgnoreCase);
private static readonly Regex WebRegex = new (@"\b(?WEB)(?:\b|$|[ .])",
@@ -59,7 +59,7 @@ namespace NzbDrone.Core.Parser
if (desc.IsNotNullOrWhiteSpace())
{
var descCodec = ParseCodec(desc, "");
- Logger.Trace("Got codec {0}", descCodec);
+ Logger.Trace($"Got codec {descCodec}");
result.Quality = FindQuality(descCodec, fileBitrate, fileSampleSize);
diff --git a/src/NzbDrone.Core/RemotePathMappings/RemotePathMappingService.cs b/src/NzbDrone.Core/RemotePathMappings/RemotePathMappingService.cs
index 9ee8a0ad0..b757db3f3 100644
--- a/src/NzbDrone.Core/RemotePathMappings/RemotePathMappingService.cs
+++ b/src/NzbDrone.Core/RemotePathMappings/RemotePathMappingService.cs
@@ -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);
diff --git a/src/NzbDrone.Integration.Test/ApiTests/ArtistEditorFixture.cs b/src/NzbDrone.Integration.Test/ApiTests/ArtistEditorFixture.cs
index 56b5bb96b..ca5e2743f 100644
--- a/src/NzbDrone.Integration.Test/ApiTests/ArtistEditorFixture.cs
+++ b/src/NzbDrone.Integration.Test/ApiTests/ArtistEditorFixture.cs
@@ -7,7 +7,6 @@ using NzbDrone.Test.Common;
namespace NzbDrone.Integration.Test.ApiTests
{
[TestFixture]
- [Ignore("Waiting for metadata to be back again", Until = "2025-08-01 00:00:00Z")]
public class ArtistEditorFixture : IntegrationTest
{
private void GivenExistingArtist()
diff --git a/src/NzbDrone.Integration.Test/ApiTests/ArtistFixture.cs b/src/NzbDrone.Integration.Test/ApiTests/ArtistFixture.cs
index 9311f74bc..61279a695 100644
--- a/src/NzbDrone.Integration.Test/ApiTests/ArtistFixture.cs
+++ b/src/NzbDrone.Integration.Test/ApiTests/ArtistFixture.cs
@@ -7,7 +7,6 @@ using NUnit.Framework;
namespace NzbDrone.Integration.Test.ApiTests
{
[TestFixture]
- [Ignore("Waiting for metadata to be back again", Until = "2025-08-01 00:00:00Z")]
public class ArtistFixture : IntegrationTest
{
[Test]
diff --git a/src/NzbDrone.Integration.Test/ApiTests/ArtistLookupFixture.cs b/src/NzbDrone.Integration.Test/ApiTests/ArtistLookupFixture.cs
index c83456066..af78cd1b5 100644
--- a/src/NzbDrone.Integration.Test/ApiTests/ArtistLookupFixture.cs
+++ b/src/NzbDrone.Integration.Test/ApiTests/ArtistLookupFixture.cs
@@ -4,7 +4,6 @@ using NUnit.Framework;
namespace NzbDrone.Integration.Test.ApiTests
{
[TestFixture]
- [Ignore("Waiting for metadata to be back again", Until = "2025-08-01 00:00:00Z")]
public class ArtistLookupFixture : IntegrationTest
{
[TestCase("Kiss", "Kiss")]
diff --git a/src/NzbDrone.Integration.Test/ApiTests/BlocklistFixture.cs b/src/NzbDrone.Integration.Test/ApiTests/BlocklistFixture.cs
index c068f1d32..e727e4608 100644
--- a/src/NzbDrone.Integration.Test/ApiTests/BlocklistFixture.cs
+++ b/src/NzbDrone.Integration.Test/ApiTests/BlocklistFixture.cs
@@ -6,7 +6,6 @@ using NUnit.Framework;
namespace NzbDrone.Integration.Test.ApiTests
{
[TestFixture]
- [Ignore("Waiting for metadata to be back again", Until = "2025-08-01 00:00:00Z")]
public class BlocklistFixture : IntegrationTest
{
private ArtistResource _artist;
diff --git a/src/NzbDrone.Integration.Test/ApiTests/CalendarFixture.cs b/src/NzbDrone.Integration.Test/ApiTests/CalendarFixture.cs
index 5aa4afa48..240bc9553 100644
--- a/src/NzbDrone.Integration.Test/ApiTests/CalendarFixture.cs
+++ b/src/NzbDrone.Integration.Test/ApiTests/CalendarFixture.cs
@@ -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-08-01 00:00:00Z")]
public class CalendarFixture : IntegrationTest
{
public ClientBase Calendar;
diff --git a/src/NzbDrone.Integration.Test/ApiTests/TrackFixture.cs b/src/NzbDrone.Integration.Test/ApiTests/TrackFixture.cs
index 73304a7ec..91a86091d 100644
--- a/src/NzbDrone.Integration.Test/ApiTests/TrackFixture.cs
+++ b/src/NzbDrone.Integration.Test/ApiTests/TrackFixture.cs
@@ -7,7 +7,6 @@ using NUnit.Framework;
namespace NzbDrone.Integration.Test.ApiTests
{
[TestFixture]
- [Ignore("Waiting for metadata to be back again", Until = "2025-08-01 00:00:00Z")]
public class TrackFixture : IntegrationTest
{
private ArtistResource _artist;
diff --git a/src/NzbDrone.Integration.Test/ApiTests/WantedTests/CutoffUnmetFixture.cs b/src/NzbDrone.Integration.Test/ApiTests/WantedTests/CutoffUnmetFixture.cs
index 8289b8a56..2a859aefb 100644
--- a/src/NzbDrone.Integration.Test/ApiTests/WantedTests/CutoffUnmetFixture.cs
+++ b/src/NzbDrone.Integration.Test/ApiTests/WantedTests/CutoffUnmetFixture.cs
@@ -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-08-01 00:00:00Z")]
public class CutoffUnmetFixture : IntegrationTest
{
[SetUp]
diff --git a/src/NzbDrone.Integration.Test/ApiTests/WantedTests/MissingFixture.cs b/src/NzbDrone.Integration.Test/ApiTests/WantedTests/MissingFixture.cs
index 6bc8b828a..934543499 100644
--- a/src/NzbDrone.Integration.Test/ApiTests/WantedTests/MissingFixture.cs
+++ b/src/NzbDrone.Integration.Test/ApiTests/WantedTests/MissingFixture.cs
@@ -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-08-01 00:00:00Z")]
public class MissingFixture : IntegrationTest
{
[SetUp]
diff --git a/src/NzbDrone.Mono/Lidarr.Mono.csproj b/src/NzbDrone.Mono/Lidarr.Mono.csproj
index 386105c02..73a45be81 100644
--- a/src/NzbDrone.Mono/Lidarr.Mono.csproj
+++ b/src/NzbDrone.Mono/Lidarr.Mono.csproj
@@ -4,7 +4,7 @@
true
-
+
diff --git a/src/NzbDrone.Test.Common/Lidarr.Test.Common.csproj b/src/NzbDrone.Test.Common/Lidarr.Test.Common.csproj
index 77109c6a9..704b7b0df 100644
--- a/src/NzbDrone.Test.Common/Lidarr.Test.Common.csproj
+++ b/src/NzbDrone.Test.Common/Lidarr.Test.Common.csproj
@@ -6,7 +6,7 @@
-
+
diff --git a/src/NzbDrone.Update/Lidarr.Update.csproj b/src/NzbDrone.Update/Lidarr.Update.csproj
index c23403b1a..d2d84022e 100644
--- a/src/NzbDrone.Update/Lidarr.Update.csproj
+++ b/src/NzbDrone.Update/Lidarr.Update.csproj
@@ -6,7 +6,7 @@
-
+
diff --git a/src/NzbDrone.Windows/Lidarr.Windows.csproj b/src/NzbDrone.Windows/Lidarr.Windows.csproj
index 4914272c2..7f41c9233 100644
--- a/src/NzbDrone.Windows/Lidarr.Windows.csproj
+++ b/src/NzbDrone.Windows/Lidarr.Windows.csproj
@@ -4,7 +4,7 @@
true
-
+
diff --git a/yarn.lock b/yarn.lock
index 0e2d62c5c..a08388e6b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2323,9 +2323,9 @@ camelcase@^5.3.1:
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001663:
- version "1.0.30001715"
- resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz"
- integrity sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==
+ version "1.0.30001668"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz#98e214455329f54bf7a4d70b49c9794f0fbedbed"
+ integrity sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==
chalk@^2.4.1, chalk@^2.4.2:
version "2.4.2"
@@ -2536,10 +2536,10 @@ core-js-compat@^3.38.0, core-js-compat@^3.38.1:
dependencies:
browserslist "^4.23.3"
-core-js@3.41.0:
- version "3.41.0"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.41.0.tgz#57714dafb8c751a6095d028a7428f1fb5834a776"
- integrity sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==
+core-js@3.39.0:
+ version "3.39.0"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.39.0.tgz#57f7647f4d2d030c32a72ea23a0555b2eaa30f83"
+ integrity sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==
core-js@^2.4.0:
version "2.6.12"