mirror of
https://github.com/lidarr/lidarr.git
synced 2025-07-06 04:52:21 -07:00
Compare commits
40 commits
v2.11.2.46
...
develop
Author | SHA1 | Date | |
---|---|---|---|
|
91f06801ca | ||
|
dc61618711 | ||
|
fd00a5627c | ||
|
66ea1b1dfb | ||
|
72fa05cf41 | ||
|
c51b5c6fba | ||
|
efebab9ba2 | ||
|
47c32c9963 | ||
|
9f229bb684 | ||
|
f9b2e57696 | ||
|
4b48edab0a | ||
|
e087574de7 | ||
|
8877cf99f1 | ||
|
a56e5b3f9a | ||
|
5bb1949ea2 | ||
|
979042948d | ||
|
ebe59b18d9 | ||
|
086a451dff | ||
|
1bcb82eed0 | ||
|
ae9b4cec75 | ||
|
ed777de015 | ||
|
96f956a5d6 | ||
|
68a8f40746 | ||
|
c518cf63e7 | ||
|
da55b8578a | ||
|
234c29ef49 | ||
|
de169e8a1f | ||
|
4b300a448a | ||
|
785bcfda0b | ||
|
94ea751ad2 | ||
|
0c172b58f1 | ||
|
ea2ee70208 | ||
|
8b63928a25 | ||
|
7217e891f7 | ||
|
345bbcd992 | ||
|
bd9d7ba085 | ||
|
3937bebfea | ||
|
767b0930a5 | ||
|
c3f0fc640c | ||
|
9dbcc79436 |
83 changed files with 692 additions and 201 deletions
1
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
1
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
|
@ -60,6 +60,7 @@ body:
|
|||
- Master
|
||||
- Develop
|
||||
- Nightly
|
||||
- Plugins (experimental)
|
||||
- Other (This issue will be closed)
|
||||
validations:
|
||||
required: true
|
||||
|
|
28
.gitignore
vendored
28
.gitignore
vendored
|
@ -158,34 +158,12 @@ Thumbs.db
|
|||
/tools/Addins/*
|
||||
packages.config.md5sum
|
||||
|
||||
|
||||
# Common IntelliJ Platform excludes
|
||||
|
||||
# User specific
|
||||
**/.idea/**/workspace.xml
|
||||
**/.idea/**/tasks.xml
|
||||
**/.idea/shelf/*
|
||||
**/.idea/dictionaries
|
||||
**/.idea/.idea.Radarr.Posix
|
||||
**/.idea/.idea.Radarr.Windows
|
||||
|
||||
# Sensitive or high-churn files
|
||||
**/.idea/**/dataSources/
|
||||
**/.idea/**/dataSources.ids
|
||||
**/.idea/**/dataSources.xml
|
||||
**/.idea/**/dataSources.local.xml
|
||||
**/.idea/**/sqlDataSources.xml
|
||||
**/.idea/**/dynamic.xml
|
||||
|
||||
# Rider
|
||||
# Rider auto-generates .iml files, and contentModel.xml
|
||||
**/.idea/**/*.iml
|
||||
**/.idea/**/contentModel.xml
|
||||
**/.idea/**/modules.xml
|
||||
|
||||
# ignore node_modules symlink
|
||||
node_modules
|
||||
node_modules.nosync
|
||||
|
||||
# API doc generation
|
||||
.config/
|
||||
|
||||
# Ignore Jetbrains IntelliJ Workspace Directories
|
||||
.idea/
|
||||
|
|
|
@ -9,7 +9,7 @@ variables:
|
|||
testsFolder: './_tests'
|
||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||
majorVersion: '2.11.2'
|
||||
majorVersion: '2.13.1'
|
||||
minorVersion: $[counter('minorVersion', 1076)]
|
||||
lidarrVersion: '$(majorVersion).$(minorVersion)'
|
||||
buildName: '$(Build.SourceBranchName).$(lidarrVersion)'
|
||||
|
|
|
@ -188,7 +188,7 @@ module.exports = (env) => {
|
|||
loose: true,
|
||||
debug: false,
|
||||
useBuiltIns: 'entry',
|
||||
corejs: '3.39'
|
||||
corejs: '3.41'
|
||||
}
|
||||
]
|
||||
]
|
||||
|
|
|
@ -172,7 +172,7 @@ class SignalRConnector extends Component {
|
|||
const status = resource.status;
|
||||
|
||||
// Both successful and failed commands need to be
|
||||
// completed, otherwise they spin until they timeout.
|
||||
// completed, otherwise they spin until they time out.
|
||||
|
||||
if (status === 'completed' || status === 'failed') {
|
||||
this.props.dispatchFinishCommand(resource);
|
||||
|
@ -224,10 +224,58 @@ class SignalRConnector extends Component {
|
|||
repopulatePage('trackFileUpdated');
|
||||
};
|
||||
|
||||
handleDownloadclient = ({ action, resource }) => {
|
||||
const section = 'settings.downloadClients';
|
||||
|
||||
if (action === 'created' || action === 'updated') {
|
||||
this.props.dispatchUpdateItem({ section, ...resource });
|
||||
} else if (action === 'deleted') {
|
||||
this.props.dispatchRemoveItem({ section, id: resource.id });
|
||||
}
|
||||
};
|
||||
|
||||
handleHealth = () => {
|
||||
this.props.dispatchFetchHealth();
|
||||
};
|
||||
|
||||
handleImportlist = ({ action, resource }) => {
|
||||
const section = 'settings.importLists';
|
||||
|
||||
if (action === 'created' || action === 'updated') {
|
||||
this.props.dispatchUpdateItem({ section, ...resource });
|
||||
} else if (action === 'deleted') {
|
||||
this.props.dispatchRemoveItem({ section, id: resource.id });
|
||||
}
|
||||
};
|
||||
|
||||
handleIndexer = ({ action, resource }) => {
|
||||
const section = 'settings.indexers';
|
||||
|
||||
if (action === 'created' || action === 'updated') {
|
||||
this.props.dispatchUpdateItem({ section, ...resource });
|
||||
} else if (action === 'deleted') {
|
||||
this.props.dispatchRemoveItem({ section, id: resource.id });
|
||||
}
|
||||
};
|
||||
|
||||
handleMetadata = ({ action, resource }) => {
|
||||
const section = 'settings.metadata';
|
||||
|
||||
if (action === 'updated') {
|
||||
this.props.dispatchUpdateItem({ section, ...resource });
|
||||
}
|
||||
};
|
||||
|
||||
handleNotification = ({ action, resource }) => {
|
||||
const section = 'settings.notifications';
|
||||
|
||||
if (action === 'created' || action === 'updated') {
|
||||
this.props.dispatchUpdateItem({ section, ...resource });
|
||||
} else if (action === 'deleted') {
|
||||
this.props.dispatchRemoveItem({ section, id: resource.id });
|
||||
}
|
||||
};
|
||||
|
||||
handleArtist = (body) => {
|
||||
const action = body.action;
|
||||
const section = 'artist';
|
||||
|
|
|
@ -94,9 +94,9 @@ class RootFolder extends Component {
|
|||
<ConfirmModal
|
||||
isOpen={this.state.isDeleteRootFolderModalOpen}
|
||||
kind={kinds.DANGER}
|
||||
title={translate('DeleteRootFolder')}
|
||||
message={translate('DeleteRootFolderMessageText', { name })}
|
||||
confirmLabel={translate('Delete')}
|
||||
title={translate('RemoveRootFolder')}
|
||||
message={translate('RemoveRootFolderArtistsMessageText', { name })}
|
||||
confirmLabel={translate('Remove')}
|
||||
onConfirm={this.onConfirmDeleteRootFolder}
|
||||
onCancel={this.onDeleteRootFolderModalClose}
|
||||
/>
|
||||
|
|
|
@ -24,19 +24,19 @@
|
|||
height: 20px;
|
||||
}
|
||||
|
||||
.bar {
|
||||
.track {
|
||||
top: 9px;
|
||||
margin: 0 5px;
|
||||
height: 3px;
|
||||
background-color: var(--sliderAccentColor);
|
||||
box-shadow: 0 0 0 #000;
|
||||
|
||||
&:nth-child(3n+1) {
|
||||
&:nth-child(3n + 1) {
|
||||
background-color: #ddd;
|
||||
}
|
||||
}
|
||||
|
||||
.handle {
|
||||
.thumb {
|
||||
top: 1px;
|
||||
z-index: 0 !important;
|
||||
width: 18px;
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
// This file is automatically generated.
|
||||
// Please do not change this file!
|
||||
interface CssExports {
|
||||
'bar': string;
|
||||
'handle': string;
|
||||
'kilobitsPerSecond': string;
|
||||
'quality': string;
|
||||
'qualityDefinition': string;
|
||||
|
@ -10,7 +8,9 @@ interface CssExports {
|
|||
'sizeLimit': string;
|
||||
'sizes': string;
|
||||
'slider': string;
|
||||
'thumb': string;
|
||||
'title': string;
|
||||
'track': string;
|
||||
}
|
||||
export const cssExports: CssExports;
|
||||
export default cssExports;
|
||||
|
|
|
@ -55,6 +55,27 @@ class QualityDefinition extends Component {
|
|||
};
|
||||
}
|
||||
|
||||
//
|
||||
// Control
|
||||
|
||||
trackRenderer(props, state) {
|
||||
return (
|
||||
<div
|
||||
{...props}
|
||||
className={styles.track}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
thumbRenderer(props, state) {
|
||||
return (
|
||||
<div
|
||||
{...props}
|
||||
className={styles.thumb}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Listeners
|
||||
|
||||
|
@ -174,6 +195,7 @@ class QualityDefinition extends Component {
|
|||
|
||||
<div className={styles.sizeLimit}>
|
||||
<ReactSlider
|
||||
className={styles.slider}
|
||||
min={slider.min}
|
||||
max={slider.max}
|
||||
step={slider.step}
|
||||
|
@ -182,9 +204,9 @@ class QualityDefinition extends Component {
|
|||
withTracks={true}
|
||||
allowCross={false}
|
||||
snapDragDisabled={true}
|
||||
className={styles.slider}
|
||||
trackClassName={styles.bar}
|
||||
thumbClassName={styles.handle}
|
||||
pearling={true}
|
||||
renderThumb={this.thumbRenderer}
|
||||
renderTrack={this.trackRenderer}
|
||||
onChange={this.onSliderChange}
|
||||
onAfterChange={this.onAfterSliderChange}
|
||||
/>
|
||||
|
|
|
@ -151,7 +151,7 @@ export const defaultState = {
|
|||
{
|
||||
name: 'genres',
|
||||
label: () => translate('Genres'),
|
||||
isSortable: false,
|
||||
isSortable: true,
|
||||
isVisible: false
|
||||
},
|
||||
{
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import Alert from 'Components/Alert';
|
||||
import Link from 'Components/Link/Link';
|
||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||
import InlineMarkdown from 'Components/Markdown/InlineMarkdown';
|
||||
import PageContent from 'Components/Page/PageContent';
|
||||
import PageContentBody from 'Components/Page/PageContentBody';
|
||||
import PageToolbar from 'Components/Page/Toolbar/PageToolbar';
|
||||
|
@ -77,15 +77,16 @@ class LogFiles extends Component {
|
|||
<PageContentBody>
|
||||
<Alert>
|
||||
<div>
|
||||
Log files are located in: {location}
|
||||
{translate('LogFilesLocation', {
|
||||
location
|
||||
})}
|
||||
</div>
|
||||
|
||||
{
|
||||
currentLogView === 'Log Files' &&
|
||||
{currentLogView === 'Log Files' ? (
|
||||
<div>
|
||||
The log level defaults to 'Info' and can be changed in <Link to="/settings/general">General Settings</Link>
|
||||
<InlineMarkdown data={translate('TheLogLevelDefault')} />
|
||||
</div>
|
||||
}
|
||||
) : null}
|
||||
</Alert>
|
||||
|
||||
{
|
||||
|
|
|
@ -270,7 +270,7 @@ function Updates() {
|
|||
|
||||
{generalSettingsError ? (
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('FailedToUpdateSettings')}
|
||||
{translate('FailedToFetchSettings')}
|
||||
</Alert>
|
||||
) : null}
|
||||
|
||||
|
|
|
@ -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.39.0",
|
||||
"core-js": "3.41.0",
|
||||
"css-loader": "6.7.3",
|
||||
"css-modules-typescript-loader": "4.0.1",
|
||||
"eslint": "8.57.1",
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
using FluentValidation;
|
||||
using Lidarr.Http;
|
||||
using NzbDrone.Core.Download;
|
||||
using NzbDrone.SignalR;
|
||||
|
||||
namespace Lidarr.Api.V1.DownloadClient
|
||||
{
|
||||
|
@ -10,8 +11,8 @@ namespace Lidarr.Api.V1.DownloadClient
|
|||
public static readonly DownloadClientResourceMapper ResourceMapper = new ();
|
||||
public static readonly DownloadClientBulkResourceMapper BulkResourceMapper = new ();
|
||||
|
||||
public DownloadClientController(IDownloadClientFactory downloadClientFactory)
|
||||
: base(downloadClientFactory, "downloadclient", ResourceMapper, BulkResourceMapper)
|
||||
public DownloadClientController(IBroadcastSignalRMessage signalRBroadcaster, IDownloadClientFactory downloadClientFactory)
|
||||
: base(signalRBroadcaster, downloadClientFactory, "downloadclient", ResourceMapper, BulkResourceMapper)
|
||||
{
|
||||
SharedValidator.RuleFor(c => c.Priority).InclusiveBetween(1, 50);
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ using Lidarr.Http;
|
|||
using NzbDrone.Core.ImportLists;
|
||||
using NzbDrone.Core.Validation;
|
||||
using NzbDrone.Core.Validation.Paths;
|
||||
using NzbDrone.SignalR;
|
||||
|
||||
namespace Lidarr.Api.V1.ImportLists
|
||||
{
|
||||
|
@ -12,11 +13,12 @@ namespace Lidarr.Api.V1.ImportLists
|
|||
public static readonly ImportListResourceMapper ResourceMapper = new ();
|
||||
public static readonly ImportListBulkResourceMapper BulkResourceMapper = new ();
|
||||
|
||||
public ImportListController(IImportListFactory importListFactory,
|
||||
public ImportListController(IBroadcastSignalRMessage signalRBroadcaster,
|
||||
IImportListFactory importListFactory,
|
||||
RootFolderExistsValidator rootFolderExistsValidator,
|
||||
QualityProfileExistsValidator qualityProfileExistsValidator,
|
||||
MetadataProfileExistsValidator metadataProfileExistsValidator)
|
||||
: base(importListFactory, "importlist", ResourceMapper, BulkResourceMapper)
|
||||
: base(signalRBroadcaster, importListFactory, "importlist", ResourceMapper, BulkResourceMapper)
|
||||
{
|
||||
SharedValidator.RuleFor(c => c.RootFolderPath).Cascade(CascadeMode.Stop)
|
||||
.IsValidPath()
|
||||
|
|
|
@ -2,6 +2,7 @@ using FluentValidation;
|
|||
using Lidarr.Http;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.Validation;
|
||||
using NzbDrone.SignalR;
|
||||
|
||||
namespace Lidarr.Api.V1.Indexers
|
||||
{
|
||||
|
@ -11,8 +12,10 @@ namespace Lidarr.Api.V1.Indexers
|
|||
public static readonly IndexerResourceMapper ResourceMapper = new ();
|
||||
public static readonly IndexerBulkResourceMapper BulkResourceMapper = new ();
|
||||
|
||||
public IndexerController(IndexerFactory indexerFactory, DownloadClientExistsValidator downloadClientExistsValidator)
|
||||
: base(indexerFactory, "indexer", ResourceMapper, BulkResourceMapper)
|
||||
public IndexerController(IBroadcastSignalRMessage signalRBroadcaster,
|
||||
IndexerFactory indexerFactory,
|
||||
DownloadClientExistsValidator downloadClientExistsValidator)
|
||||
: base(signalRBroadcaster, indexerFactory, "indexer", ResourceMapper, BulkResourceMapper)
|
||||
{
|
||||
SharedValidator.RuleFor(c => c.Priority).InclusiveBetween(1, 50);
|
||||
SharedValidator.RuleFor(c => c.DownloadClientId).SetValidator(downloadClientExistsValidator);
|
||||
|
|
|
@ -2,6 +2,7 @@ using System;
|
|||
using Lidarr.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using NzbDrone.Core.Extras.Metadata;
|
||||
using NzbDrone.SignalR;
|
||||
|
||||
namespace Lidarr.Api.V1.Metadata
|
||||
{
|
||||
|
@ -11,8 +12,8 @@ namespace Lidarr.Api.V1.Metadata
|
|||
public static readonly MetadataResourceMapper ResourceMapper = new ();
|
||||
public static readonly MetadataBulkResourceMapper BulkResourceMapper = new ();
|
||||
|
||||
public MetadataController(IMetadataFactory metadataFactory)
|
||||
: base(metadataFactory, "metadata", ResourceMapper, BulkResourceMapper)
|
||||
public MetadataController(IBroadcastSignalRMessage signalRBroadcaster, IMetadataFactory metadataFactory)
|
||||
: base(signalRBroadcaster, metadataFactory, "metadata", ResourceMapper, BulkResourceMapper)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ using System;
|
|||
using Lidarr.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using NzbDrone.Core.Notifications;
|
||||
using NzbDrone.SignalR;
|
||||
|
||||
namespace Lidarr.Api.V1.Notifications
|
||||
{
|
||||
|
@ -11,8 +12,8 @@ namespace Lidarr.Api.V1.Notifications
|
|||
public static readonly NotificationResourceMapper ResourceMapper = new ();
|
||||
public static readonly NotificationBulkResourceMapper BulkResourceMapper = new ();
|
||||
|
||||
public NotificationController(NotificationFactory notificationFactory)
|
||||
: base(notificationFactory, "notification", ResourceMapper, BulkResourceMapper)
|
||||
public NotificationController(IBroadcastSignalRMessage signalRBroadcaster, NotificationFactory notificationFactory)
|
||||
: base(signalRBroadcaster, notificationFactory, "notification", ResourceMapper, BulkResourceMapper)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -7,12 +7,19 @@ using Lidarr.Http.REST.Attributes;
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Serializer;
|
||||
using NzbDrone.Core.Datastore.Events;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
using NzbDrone.Core.ThingiProvider;
|
||||
using NzbDrone.Core.ThingiProvider.Events;
|
||||
using NzbDrone.Core.Validation;
|
||||
using NzbDrone.SignalR;
|
||||
|
||||
namespace Lidarr.Api.V1
|
||||
{
|
||||
public abstract class ProviderControllerBase<TProviderResource, TBulkProviderResource, TProvider, TProviderDefinition> : RestController<TProviderResource>
|
||||
public abstract class ProviderControllerBase<TProviderResource, TBulkProviderResource, TProvider, TProviderDefinition> : RestControllerWithSignalR<TProviderResource, TProviderDefinition>,
|
||||
IHandle<ProviderAddedEvent<TProvider>>,
|
||||
IHandle<ProviderUpdatedEvent<TProvider>>,
|
||||
IHandle<ProviderDeletedEvent<TProvider>>
|
||||
where TProviderDefinition : ProviderDefinition, new()
|
||||
where TProvider : IProvider
|
||||
where TProviderResource : ProviderResource<TProviderResource>, new()
|
||||
|
@ -22,11 +29,13 @@ namespace Lidarr.Api.V1
|
|||
private readonly ProviderResourceMapper<TProviderResource, TProviderDefinition> _resourceMapper;
|
||||
private readonly ProviderBulkResourceMapper<TBulkProviderResource, TProviderDefinition> _bulkResourceMapper;
|
||||
|
||||
protected ProviderControllerBase(IProviderFactory<TProvider,
|
||||
protected ProviderControllerBase(IBroadcastSignalRMessage signalRBroadcaster,
|
||||
IProviderFactory<TProvider,
|
||||
TProviderDefinition> providerFactory,
|
||||
string resource,
|
||||
ProviderResourceMapper<TProviderResource, TProviderDefinition> resourceMapper,
|
||||
ProviderBulkResourceMapper<TBulkProviderResource, TProviderDefinition> bulkResourceMapper)
|
||||
: base(signalRBroadcaster)
|
||||
{
|
||||
_providerFactory = providerFactory;
|
||||
_resourceMapper = resourceMapper;
|
||||
|
@ -261,6 +270,24 @@ namespace Lidarr.Api.V1
|
|||
return Content(data.ToJson(), "application/json");
|
||||
}
|
||||
|
||||
[NonAction]
|
||||
public virtual void Handle(ProviderAddedEvent<TProvider> message)
|
||||
{
|
||||
BroadcastResourceChange(ModelAction.Created, message.Definition.Id);
|
||||
}
|
||||
|
||||
[NonAction]
|
||||
public virtual void Handle(ProviderUpdatedEvent<TProvider> message)
|
||||
{
|
||||
BroadcastResourceChange(ModelAction.Updated, message.Definition.Id);
|
||||
}
|
||||
|
||||
[NonAction]
|
||||
public virtual void Handle(ProviderDeletedEvent<TProvider> message)
|
||||
{
|
||||
BroadcastResourceChange(ModelAction.Deleted, message.ProviderId);
|
||||
}
|
||||
|
||||
protected virtual void Validate(TProviderDefinition definition, bool includeWarnings)
|
||||
{
|
||||
var validationResult = definition.Settings.Validate();
|
||||
|
|
|
@ -4,6 +4,7 @@ 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;
|
||||
|
||||
|
@ -27,6 +28,14 @@ namespace Lidarr.Api.V1.RemotePathMappings
|
|||
SharedValidator.RuleFor(c => c.RemotePath)
|
||||
.NotEmpty();
|
||||
|
||||
SharedValidator.RuleFor(c => c.RemotePath)
|
||||
.Must(remotePath => remotePath.IsNotNullOrWhiteSpace() && !remotePath.StartsWith(" "))
|
||||
.WithMessage("Remote Path '{PropertyValue}' must not start with a space");
|
||||
|
||||
SharedValidator.RuleFor(c => c.RemotePath)
|
||||
.Must(remotePath => remotePath.IsNotNullOrWhiteSpace() && !remotePath.EndsWith(" "))
|
||||
.WithMessage("Remote Path '{PropertyValue}' must not end with a space");
|
||||
|
||||
SharedValidator.RuleFor(c => c.LocalPath)
|
||||
.Cascade(CascadeMode.Stop)
|
||||
.IsValidPath()
|
||||
|
|
|
@ -92,7 +92,7 @@ namespace Lidarr.Api.V1.System.Backup
|
|||
}
|
||||
|
||||
[HttpPost("restore/upload")]
|
||||
[RequestFormLimits(MultipartBodyLengthLimit = 1000000000)]
|
||||
[RequestFormLimits(MultipartBodyLengthLimit = 5000000000)]
|
||||
public object UploadAndRestore()
|
||||
{
|
||||
var files = Request.Form.Files;
|
||||
|
|
|
@ -40,15 +40,16 @@ 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, new TimeSpan(0, 3, 0));
|
||||
driver = new ChromeDriver(service, options, TimeSpan.FromMinutes(3));
|
||||
|
||||
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.Url = "http://localhost:8686";
|
||||
driver.Navigate().GoToUrl("http://localhost:8686");
|
||||
|
||||
var page = new PageBase(driver);
|
||||
page.WaitForNoSpinner();
|
||||
|
@ -68,7 +69,7 @@ namespace NzbDrone.Automation.Test
|
|||
{
|
||||
try
|
||||
{
|
||||
var image = ((ITakesScreenshot)driver).GetScreenshot();
|
||||
var image = (driver as ITakesScreenshot).GetScreenshot();
|
||||
image.SaveAsFile($"./{name}_test_screenshot.png", ScreenshotImageFormat.Png);
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
|
|
@ -1,19 +1,17 @@
|
|||
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 RemoteWebDriver _driver;
|
||||
private readonly IWebDriver _driver;
|
||||
|
||||
public PageBase(RemoteWebDriver driver)
|
||||
public PageBase(IWebDriver driver)
|
||||
{
|
||||
_driver = driver;
|
||||
driver.Manage().Window.Maximize();
|
||||
}
|
||||
|
||||
public IWebElement FindByClass(string className, int timeout = 5)
|
||||
|
|
|
@ -141,7 +141,7 @@ namespace NzbDrone.Common.Http.Dispatchers
|
|||
}
|
||||
catch (OperationCanceledException ex) when (cts.IsCancellationRequested)
|
||||
{
|
||||
throw new WebException("Http request timed out", ex.InnerException, WebExceptionStatus.Timeout, null);
|
||||
throw new WebException("Http request timed out", ex, WebExceptionStatus.Timeout, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="DryIoc.dll" Version="5.4.3" />
|
||||
<PackageReference Include="IPAddressRange" Version="6.1.0" />
|
||||
<PackageReference Include="IPAddressRange" Version="6.2.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="NLog" Version="5.4.0" />
|
||||
|
|
|
@ -103,6 +103,7 @@ namespace NzbDrone.Core.Test.DiskSpace
|
|||
[TestCase("/var/lib/docker")]
|
||||
[TestCase("/some/place/docker/aufs")]
|
||||
[TestCase("/etc/network")]
|
||||
[TestCase("/Volumes/.timemachine/ABC123456-A1BC-12A3B45678C9/2025-05-13-181401.backup")]
|
||||
public void should_not_check_diskspace_for_irrelevant_mounts(string path)
|
||||
{
|
||||
var mount = new Mock<IMount>();
|
||||
|
|
|
@ -14,6 +14,7 @@ using NzbDrone.Core.Test.Framework;
|
|||
namespace NzbDrone.Core.Test.MetadataSource.SkyHook
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class SkyHookProxyFixture : CoreTest<SkyHookProxy>
|
||||
{
|
||||
private MetadataProfile _metadataProfile;
|
||||
|
|
|
@ -12,6 +12,7 @@ using NzbDrone.Test.Common;
|
|||
namespace NzbDrone.Core.Test.MetadataSource.SkyHook
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class SkyHookProxySearchFixture : CoreTest<SkyHookProxy>
|
||||
{
|
||||
[SetUp]
|
||||
|
|
|
@ -129,6 +129,9 @@ 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);
|
||||
|
|
|
@ -11,6 +11,7 @@ namespace NzbDrone.Core.CustomFormats
|
|||
{
|
||||
RuleFor(c => c.Min).GreaterThanOrEqualTo(0);
|
||||
RuleFor(c => c.Max).GreaterThan(c => c.Min);
|
||||
RuleFor(c => c.Max).LessThanOrEqualTo(double.MaxValue);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace NzbDrone.Core.DiskSpace
|
|||
private readonly IRootFolderService _rootFolderService;
|
||||
private readonly Logger _logger;
|
||||
|
||||
private static readonly Regex _regexSpecialDrive = new Regex("^/var/lib/(docker|rancher|kubelet)(/|$)|^/(boot|etc)(/|$)|/docker(/var)?/aufs(/|$)", RegexOptions.Compiled);
|
||||
private static readonly Regex _regexSpecialDrive = new Regex(@"^/var/lib/(docker|rancher|kubelet)(/|$)|^/(boot|etc)(/|$)|/docker(/var)?/aufs(/|$)|/\.timemachine", RegexOptions.Compiled);
|
||||
|
||||
public DiskSpaceService(IDiskProvider diskProvider,
|
||||
IRootFolderService rootFolderService,
|
||||
|
@ -38,7 +38,10 @@ namespace NzbDrone.Core.DiskSpace
|
|||
|
||||
var optionalRootFolders = GetFixedDisksRootPaths().Except(importantRootFolders).Distinct().ToList();
|
||||
|
||||
var diskSpace = GetDiskSpace(importantRootFolders).Concat(GetDiskSpace(optionalRootFolders, true)).ToList();
|
||||
var diskSpace = GetDiskSpace(importantRootFolders)
|
||||
.Concat(GetDiskSpace(optionalRootFolders, true))
|
||||
.OrderBy(d => d.Path, StringComparer.OrdinalIgnoreCase)
|
||||
.ToList();
|
||||
|
||||
return diskSpace;
|
||||
}
|
||||
|
@ -54,7 +57,7 @@ namespace NzbDrone.Core.DiskSpace
|
|||
private IEnumerable<string> GetFixedDisksRootPaths()
|
||||
{
|
||||
return _diskProvider.GetMounts()
|
||||
.Where(d => d.DriveType == DriveType.Fixed)
|
||||
.Where(d => d.DriveType is DriveType.Fixed or DriveType.Network)
|
||||
.Where(d => !_regexSpecialDrive.IsMatch(d.RootDirectory))
|
||||
.Select(d => d.RootDirectory);
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ 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,9 +29,10 @@ namespace NzbDrone.Core.Download.Clients.Aria2
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ 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;
|
||||
|
@ -30,9 +31,10 @@ namespace NzbDrone.Core.Download.Clients.Blackhole
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
{
|
||||
_scanWatchFolder = scanWatchFolder;
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ 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;
|
||||
|
@ -25,8 +26,9 @@ namespace NzbDrone.Core.Download.Clients.Blackhole
|
|||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
IValidateNzbs nzbValidationService,
|
||||
ILocalizationService localizationService,
|
||||
Logger logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, localizationService, logger)
|
||||
{
|
||||
_scanWatchFolder = scanWatchFolder;
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ 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;
|
||||
|
@ -27,9 +28,10 @@ namespace NzbDrone.Core.Download.Clients.Deluge
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ 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;
|
||||
|
@ -37,9 +38,10 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
{
|
||||
_dsInfoProxy = dsInfoProxy;
|
||||
_dsTaskProxySelector = dsTaskProxySelector;
|
||||
|
|
|
@ -9,6 +9,7 @@ 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;
|
||||
|
@ -34,8 +35,9 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation
|
|||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
IValidateNzbs nzbValidationService,
|
||||
ILocalizationService localizationService,
|
||||
Logger logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, localizationService, logger)
|
||||
{
|
||||
_dsInfoProxy = dsInfoProxy;
|
||||
_dsTaskProxySelector = dsTaskProxySelector;
|
||||
|
|
|
@ -9,6 +9,7 @@ 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;
|
||||
|
@ -28,9 +29,10 @@ namespace NzbDrone.Core.Download.Clients.Flood
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
_downloadSeedConfigProvider = downloadSeedConfigProvider;
|
||||
|
|
|
@ -9,6 +9,7 @@ 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;
|
||||
|
@ -25,9 +26,10 @@ namespace NzbDrone.Core.Download.Clients.FreeboxDownload
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ 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;
|
||||
|
@ -25,9 +26,10 @@ namespace NzbDrone.Core.Download.Clients.Hadouken
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ 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;
|
||||
|
@ -24,8 +25,9 @@ namespace NzbDrone.Core.Download.Clients.NzbVortex
|
|||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
IValidateNzbs nzbValidationService,
|
||||
ILocalizationService localizationService,
|
||||
Logger logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, localizationService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ 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;
|
||||
|
@ -28,8 +29,9 @@ namespace NzbDrone.Core.Download.Clients.Nzbget
|
|||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
IValidateNzbs nzbValidationService,
|
||||
ILocalizationService localizationService,
|
||||
Logger logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, localizationService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ 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;
|
||||
|
@ -23,8 +24,9 @@ namespace NzbDrone.Core.Download.Clients.Pneumatic
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
Logger logger)
|
||||
: base(configService, diskProvider, remotePathMappingService, logger)
|
||||
: base(configService, diskProvider, remotePathMappingService, localizationService, logger)
|
||||
{
|
||||
_httpClient = httpClient;
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ 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;
|
||||
|
@ -35,9 +36,10 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
|||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ICacheManager cacheManager,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
{
|
||||
_proxySelector = proxySelector;
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@ 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;
|
||||
|
@ -26,8 +27,9 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd
|
|||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
IValidateNzbs nzbValidationService,
|
||||
ILocalizationService localizationService,
|
||||
Logger logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, logger)
|
||||
: base(httpClient, configService, diskProvider, remotePathMappingService, nzbValidationService, localizationService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ 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;
|
||||
|
||||
|
@ -24,9 +25,10 @@ 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, blocklistService, logger)
|
||||
: base(proxy, torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ 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,9 +29,10 @@ namespace NzbDrone.Core.Download.Clients.Transmission
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
@ -101,7 +103,11 @@ namespace NzbDrone.Core.Download.Clients.Transmission
|
|||
if (!torrent.ErrorString.IsNullOrWhiteSpace())
|
||||
{
|
||||
item.Status = DownloadItemStatus.Warning;
|
||||
item.Message = torrent.ErrorString;
|
||||
item.Message = _localizationService.GetLocalizedString("DownloadClientItemErrorMessage", new Dictionary<string, object>
|
||||
{
|
||||
{ "clientName", Name },
|
||||
{ "message", torrent.ErrorString }
|
||||
});
|
||||
}
|
||||
else if (torrent.TotalSize == 0)
|
||||
{
|
||||
|
|
|
@ -5,6 +5,7 @@ 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;
|
||||
|
||||
|
@ -23,9 +24,10 @@ 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, blocklistService, logger)
|
||||
: base(proxy, torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@ 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;
|
||||
|
@ -35,9 +36,10 @@ namespace NzbDrone.Core.Download.Clients.RTorrent
|
|||
IRemotePathMappingService remotePathMappingService,
|
||||
IDownloadSeedConfigProvider downloadSeedConfigProvider,
|
||||
IRTorrentDirectoryValidator rTorrentDirectoryValidator,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
_rTorrentDirectoryValidator = rTorrentDirectoryValidator;
|
||||
|
|
|
@ -10,6 +10,7 @@ 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,9 +30,10 @@ namespace NzbDrone.Core.Download.Clients.UTorrent
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, blocklistService, logger)
|
||||
: base(torrentFileInfoReader, httpClient, configService, diskProvider, remotePathMappingService, localizationService, blocklistService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@ 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;
|
||||
|
@ -23,6 +24,7 @@ namespace NzbDrone.Core.Download
|
|||
protected readonly IConfigService _configService;
|
||||
protected readonly IDiskProvider _diskProvider;
|
||||
protected readonly IRemotePathMappingService _remotePathMappingService;
|
||||
protected readonly ILocalizationService _localizationService;
|
||||
protected readonly Logger _logger;
|
||||
|
||||
protected ResiliencePipeline<HttpResponse> RetryStrategy => new ResiliencePipelineBuilder<HttpResponse>()
|
||||
|
@ -77,11 +79,13 @@ namespace NzbDrone.Core.Download
|
|||
protected DownloadClientBase(IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
Logger logger)
|
||||
{
|
||||
_configService = configService;
|
||||
_diskProvider = diskProvider;
|
||||
_remotePathMappingService = remotePathMappingService;
|
||||
_localizationService = localizationService;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Xml;
|
||||
|
@ -14,10 +15,13 @@ namespace NzbDrone.Core.Download
|
|||
public class NzbValidationService : IValidateNzbs
|
||||
{
|
||||
public void Validate(string filename, byte[] fileContent)
|
||||
{
|
||||
try
|
||||
{
|
||||
var reader = new StreamReader(new MemoryStream(fileContent));
|
||||
|
||||
using (var xmlTextReader = XmlReader.Create(reader, new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, IgnoreComments = true }))
|
||||
using (var xmlTextReader = XmlReader.Create(reader,
|
||||
new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, IgnoreComments = true }))
|
||||
{
|
||||
var xDoc = XDocument.Load(xmlTextReader);
|
||||
var nzb = xDoc.Root;
|
||||
|
@ -37,7 +41,8 @@ namespace NzbDrone.Core.Download
|
|||
|
||||
if (!nzb.Name.LocalName.Equals("nzb"))
|
||||
{
|
||||
throw new InvalidNzbException("Invalid NZB: Unexpected root element. Expected 'nzb' found '{0}' [{1}]", nzb.Name.LocalName, filename);
|
||||
throw new InvalidNzbException(
|
||||
"Invalid NZB: Unexpected root element. Expected 'nzb' found '{0}' [{1}]", nzb.Name.LocalName, filename);
|
||||
}
|
||||
|
||||
var ns = nzb.Name.Namespace;
|
||||
|
@ -49,5 +54,15 @@ namespace NzbDrone.Core.Download
|
|||
}
|
||||
}
|
||||
}
|
||||
catch (InvalidNzbException)
|
||||
{
|
||||
// Throw the original exception
|
||||
throw;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new InvalidNzbException("Invalid NZB: Unable to parse [{0}]", ex, filename);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ 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;
|
||||
|
@ -30,9 +31,10 @@ namespace NzbDrone.Core.Download
|
|||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
ILocalizationService localizationService,
|
||||
IBlocklistService blocklistService,
|
||||
Logger logger)
|
||||
: base(configService, diskProvider, remotePathMappingService, logger)
|
||||
: base(configService, diskProvider, remotePathMappingService, localizationService, logger)
|
||||
{
|
||||
_httpClient = httpClient;
|
||||
_blocklistService = blocklistService;
|
||||
|
@ -170,7 +172,7 @@ namespace NzbDrone.Core.Download
|
|||
}
|
||||
catch (HttpException ex)
|
||||
{
|
||||
if (ex.Response.StatusCode == HttpStatusCode.NotFound)
|
||||
if (ex.Response.StatusCode is HttpStatusCode.NotFound or HttpStatusCode.Gone)
|
||||
{
|
||||
_logger.Error(ex, "Downloading torrent file for album '{0}' failed since it no longer exists ({1})", remoteAlbum.Release.Title, torrentUrl);
|
||||
throw new ReleaseUnavailableException(remoteAlbum.Release, "Downloading torrent failed", ex);
|
||||
|
|
|
@ -6,6 +6,7 @@ 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;
|
||||
|
@ -24,8 +25,9 @@ namespace NzbDrone.Core.Download
|
|||
IDiskProvider diskProvider,
|
||||
IRemotePathMappingService remotePathMappingService,
|
||||
IValidateNzbs nzbValidationService,
|
||||
ILocalizationService localizationService,
|
||||
Logger logger)
|
||||
: base(configService, diskProvider, remotePathMappingService, logger)
|
||||
: base(configService, diskProvider, remotePathMappingService, localizationService, logger)
|
||||
{
|
||||
_httpClient = httpClient;
|
||||
_nzbValidationService = nzbValidationService;
|
||||
|
@ -46,6 +48,7 @@ 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))
|
||||
|
@ -57,7 +60,7 @@ namespace NzbDrone.Core.Download
|
|||
}
|
||||
catch (HttpException ex)
|
||||
{
|
||||
if (ex.Response.StatusCode == HttpStatusCode.NotFound)
|
||||
if (ex.Response.StatusCode is HttpStatusCode.NotFound or HttpStatusCode.Gone)
|
||||
{
|
||||
_logger.Error(ex, "Downloading nzb file for album '{0}' failed since it no longer exists ({1})", remoteAlbum.Release.Title, url);
|
||||
throw new ReleaseUnavailableException(remoteAlbum.Release, "Downloading nzb failed", ex);
|
||||
|
|
|
@ -157,7 +157,7 @@ namespace NzbDrone.Core.History
|
|||
history.Data.Add("Age", message.Album.Release.Age.ToString());
|
||||
history.Data.Add("AgeHours", message.Album.Release.AgeHours.ToString());
|
||||
history.Data.Add("AgeMinutes", message.Album.Release.AgeMinutes.ToString());
|
||||
history.Data.Add("PublishedDate", message.Album.Release.PublishDate.ToString("s") + "Z");
|
||||
history.Data.Add("PublishedDate", message.Album.Release.PublishDate.ToUniversalTime().ToString("s") + "Z");
|
||||
history.Data.Add("DownloadClient", message.DownloadClient);
|
||||
history.Data.Add("Size", message.Album.Release.Size.ToString());
|
||||
history.Data.Add("DownloadUrl", message.Album.Release.DownloadUrl);
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.IndexerSearch.Definitions;
|
||||
|
||||
|
@ -44,6 +45,11 @@ namespace NzbDrone.Core.Indexers.FileList
|
|||
|
||||
private IEnumerable<IndexerRequest> GetRequest(string searchType, IEnumerable<int> categories, string parameters)
|
||||
{
|
||||
if (categories.Empty())
|
||||
{
|
||||
yield break;
|
||||
}
|
||||
|
||||
var categoriesQuery = string.Join(",", categories.Distinct());
|
||||
|
||||
var baseUrl = string.Format("{0}/api.php?action={1}&category={2}{3}", Settings.BaseUrl.TrimEnd('/'), searchType, categoriesQuery, parameters);
|
||||
|
|
|
@ -13,6 +13,8 @@ namespace NzbDrone.Core.Indexers.FileList
|
|||
RuleFor(c => c.Username).NotEmpty();
|
||||
RuleFor(c => c.Passkey).NotEmpty();
|
||||
|
||||
RuleFor(c => c.Categories).NotEmpty();
|
||||
|
||||
RuleFor(c => c.SeedCriteria).SetValidator(_ => new SeedCriteriaSettingsValidator());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
<PackageReference Include="TagLibSharp-Lidarr" Version="2.2.0.27" />
|
||||
<PackageReference Include="Npgsql" Version="7.0.10" />
|
||||
<PackageReference Include="SpotifyAPI.Web" Version="5.1.1" />
|
||||
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.7" />
|
||||
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.9" />
|
||||
<PackageReference Include="MonoTorrent" Version="2.0.7" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
|
|
@ -256,6 +256,7 @@
|
|||
"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",
|
||||
|
@ -334,8 +335,6 @@
|
|||
"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)",
|
||||
|
@ -383,6 +382,7 @@
|
|||
"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,6 +486,8 @@
|
|||
"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",
|
||||
|
@ -688,6 +690,7 @@
|
|||
"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",
|
||||
|
@ -1024,6 +1027,8 @@
|
|||
"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?",
|
||||
|
@ -1218,6 +1223,7 @@
|
|||
"TestParsing": "Test Parsing",
|
||||
"TheAlbumsFilesWillBeDeleted": "The album's files will be deleted.",
|
||||
"TheArtistFolderStrongpathstrongAndAllOfItsContentWillBeDeleted": "The artist folder '{0}' and all of its content will be deleted.",
|
||||
"TheLogLevelDefault": "The log level defaults to 'Debug' and can be changed in [General Settings](/settings/general)",
|
||||
"Theme": "Theme",
|
||||
"ThemeHelpText": "Change Application UI Theme, 'Auto' Theme will use your OS Theme to set Light or Dark mode. Inspired by Theme.Park",
|
||||
"ThereWasAnErrorLoadingThisItem": "There was an error loading this item",
|
||||
|
|
|
@ -963,7 +963,7 @@
|
|||
"Small": "Pieni",
|
||||
"RemoveSelectedItems": "Poista valitut kohteet",
|
||||
"ResetTitles": "Palauta nimet",
|
||||
"AddNewArtistRootFolderHelpText": "\"{folder}\" -alikansio luodaan automaattisesti.",
|
||||
"AddNewArtistRootFolderHelpText": "Alikansio \"{folder}\" 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 samaan juurikansioon voidaan niiden kansioiden nimet päivittää vastaamaan päivittynyttä nimikettä tai nimeämiskaavaa.",
|
||||
"ArtistsEditRootFolderHelpText": "Siirtämällä esittäjät niiden nykyiseen juurikansioon voidaan niiden kansioiden nimet päivittää vastaamaan päivittynyttä nimikettä tai nimeämiskaavaa.",
|
||||
"DownloadClientAriaSettingsDirectoryHelpText": "Vaihtoehtoinen latausten tallennussijainti. Käytä Aria2:n oletusta jättämällä tyhjäksi.",
|
||||
"DeleteArtistFoldersHelpText": "Poista esittäjäkansiot ja niiden kaikki sisältö.",
|
||||
"ChangeCategoryHint": "Vaihtaa latauksen kategoriaksi latauspalvelun \"Tuonnin jälkeinen kategoria\" -asetuksen kategorian.",
|
||||
|
|
|
@ -1061,5 +1061,6 @@
|
|||
"ImportFailed": "Importazione fallita: {sourceTitle}",
|
||||
"Paused": "In Pausa",
|
||||
"Pending": "In Attesa",
|
||||
"UnableToImportAutomatically": "Impossibile Importare Automaticamente"
|
||||
"UnableToImportAutomatically": "Impossibile Importare Automaticamente",
|
||||
"AlbumCount": "Numero album"
|
||||
}
|
||||
|
|
|
@ -286,5 +286,7 @@
|
|||
"IgnoredPlaceHolder": "Legg til ny begrensning",
|
||||
"AddImportList": "Ny Importliste",
|
||||
"AddNewArtistRootFolderHelpText": "Undermappa \"{folder}\" vil bli automatisk laget",
|
||||
"CheckDownloadClientForDetails": "sjekk nedlastningsklienten for mer informasjon"
|
||||
"CheckDownloadClientForDetails": "sjekk nedlastningsklienten for mer informasjon",
|
||||
"TBA": "Venter",
|
||||
"History": "Historikk"
|
||||
}
|
||||
|
|
|
@ -595,7 +595,7 @@
|
|||
"CustomFormatSettings": "Eigen Formaten Instellingen",
|
||||
"CustomFormats": "Eigen Formaten",
|
||||
"Customformat": "Eigen Formaat",
|
||||
"CutoffFormatScoreHelpText": "Wanneer deze eigen formaat score is behaald, zal {appName} niet langer films downloaden",
|
||||
"CutoffFormatScoreHelpText": "Wanneer deze aangepaste formaatscore is behaald, zal {appName} niet langer albumuitgaven 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": "Kloon",
|
||||
"Clone": "Dupliceren",
|
||||
"CustomFormatsSpecificationRegularExpression": "Reguliere expressie",
|
||||
"CustomFormatsSpecificationRegularExpressionHelpText": "Aangepaste opmaak RegEx is hoofdletterongevoelig",
|
||||
"CustomFormatsSettingsTriggerInfo": "Een Aangepast Formaat wordt toegepast op een uitgave of bestand als het overeenkomt met ten minste één van de verschillende condities die zijn gekozen.",
|
||||
|
|
|
@ -1031,5 +1031,9 @@
|
|||
"CheckDownloadClientForDetails": "verifique o cliente de transferências para obter mais detalhes",
|
||||
"DownloadWarning": "Alerta de transferência: {warningMessage}",
|
||||
"Pending": "Pendente",
|
||||
"WaitingToImport": "Aguardando para importar"
|
||||
"WaitingToImport": "Aguardando para importar",
|
||||
"TBA": "TBA",
|
||||
"ThereWasAnErrorLoadingThisItem": "Houve um erro ao carregar este item",
|
||||
"ThereWasAnErrorLoadingThisPage": "Houve um erro ao carregar esta página",
|
||||
"EpisodeDoesNotHaveAnAbsoluteEpisodeNumber": "Episódio não tem um número de episódio absoluto"
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
"BackupRetentionHelpText": "Автоматичні резервні копії, старіші за період зберігання, очищаються автоматично",
|
||||
"ChmodFolderHelpText": "Восьмеричний, застосовується при імпорті/перейменуванні до медіа-папок та файлів (без бітів виконання)",
|
||||
"CompletedDownloadHandling": "Обробка завершених завантажень",
|
||||
"CopyUsingHardlinksHelpText": "Використання жорстких посилань, коли намагаєтеся скопіювати файли з торентів, які все ще завантажуються",
|
||||
"CopyUsingHardlinksHelpText": "Жорсткі посилання дозволяють {appName} імпортувати торренти, що роздаються, до папки виконавця без зайвого місця на диску або копіювання всього вмісту файлу. Жорсткі посилання працюватимуть лише якщо джерело та призначення знаходяться на одному томі",
|
||||
"DeleteBackupMessageText": "Ви впевнені, що хочете видалити резервну копію \"{name}\"?",
|
||||
"DeleteDownloadClientMessageText": "Ви впевнені, що хочете видалити клієнт завантаження '{name}'?",
|
||||
"AlreadyInYourLibrary": "Вже у вашій бібліотеці",
|
||||
|
@ -55,12 +55,12 @@
|
|||
"ResetAPIKeyMessageText": "Ви впевнені, що хочете скинути свій ключ API?",
|
||||
"ShowQualityProfile": "Додати профіль якості",
|
||||
"AnalyticsEnabledHelpText": "Надсилайте анонімну інформацію про використання та помилки на сервери {appName}. Це включає інформацію про ваш веб-переглядач, які сторінки {appName} WebUI ви використовуєте, звіти про помилки, а також версію ОС і часу виконання. Ми будемо використовувати цю інформацію, щоб визначити пріоритети функцій і виправлення помилок.",
|
||||
"DeleteMetadataProfileMessageText": "Ви впевнені, що хочете видалити цей профіль затримки?",
|
||||
"DeleteMetadataProfileMessageText": "Ви впевнені, що хочете видалити профіль метаданих '{name}'",
|
||||
"DeleteNotificationMessageText": "Ви впевнені, що хочете видалити сповіщення '{name}'?",
|
||||
"DeleteQualityProfileMessageText": "Ви впевнені, що хочете видалити профіль якості '{name}'?",
|
||||
"DeleteReleaseProfile": "Видалити профіль випуску",
|
||||
"DeleteReleaseProfileMessageText": "Ви впевнені, що хочете видалити цей профіль затримки?",
|
||||
"DeleteRootFolderMessageText": "Ви впевнені, що хочете видалити тег {0} ?",
|
||||
"DeleteReleaseProfileMessageText": "Ви впевнені, що хочете видалити цей профіль випуску?",
|
||||
"DeleteRootFolderMessageText": "Ви впевнені, що хочете видалити кореневу папку '{name}'?",
|
||||
"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} може бачити, але не має доступу до завантаженого фільму {path}. Ймовірна помилка дозволів.",
|
||||
"RemotePathMappingCheckDownloadPermissions": "{appName} бачить, але не має доступу до завантаженої музики{0}. Ймовірно, помилка дозволів.",
|
||||
"UnableToLoadCustomFormats": "Не вдалося завантажити спеціальні формати",
|
||||
"ShownAboveEachColumnWhenWeekIsTheActiveView": "Відображається над кожним стовпцем, коли тиждень є активним переглядом",
|
||||
"Table": "Таблиця",
|
||||
|
@ -945,5 +945,267 @@
|
|||
"NotificationsEmbySettingsUpdateLibraryHelpText": "Оновити бібліотеку при імпорті, перейменуванні або видаленні",
|
||||
"NotificationsSettingsUpdateMapPathsFromHelpText": "Шлях {appName}, який використовується для зміни шляхів до серіалів, коли {serviceName} бачить шлях до бібліотеки інакше, ніж {appName} (необхідно 'Оновити бібліотеку')",
|
||||
"NotificationsSettingsUpdateMapPathsToHelpText": "Шлях {serviceName}, що використовується для зміни шляхів до серіалів, коли {serviceName} бачить шлях до бібліотеки інакше, ніж {appName} (потрібно 'Оновити бібліотеку')",
|
||||
"Select...": "Вибрати..."
|
||||
"Select...": "Вибрати...",
|
||||
"DeleteSelectedDownloadClients": "Видалити вибрані клієнти завантаження",
|
||||
"DownloadImported": "Завантажено імпортовано",
|
||||
"DownloadedWaitingToImport": "'Завантажено - Очікує імпорту'",
|
||||
"FirstAlbum": "Перший альбом",
|
||||
"FutureAlbumsData": "Відстежувати альбоми, які ще не вийшли",
|
||||
"IsExpandedHideAlbums": "Приховати альбоми",
|
||||
"ManualDownload": "Завантажити вручну",
|
||||
"ArtistIsUnmonitored": "Виконавець не відстежується",
|
||||
"ForeignId": "Зовнішній ідентифікатор",
|
||||
"IndexerIdHelpTextWarning": "Використання певного індексатора з бажаними словами може призвести до завантаження дублікатів релізів",
|
||||
"ArtistsEditRootFolderHelpText": "Переміщення виконавців до однієї кореневої папки може використовуватися для перейменування папок виконавців відповідно до оновленого імені або формату найменування",
|
||||
"AllowFingerprintingHelpText": "Використовувати створення аудіовідбитків для покращення точності зіставлення треків",
|
||||
"CollapseMultipleAlbumsHelpText": "Згорнути кілька альбомів, що виходять в один день",
|
||||
"ContinuingNoAdditionalAlbumsAreExpected": "Додаткових альбомів не очікується",
|
||||
"DownloadClientSortingCheckMessage": "Для клієнта завантаження {0} увімкнено сортування для категорії {appName}. Вам слід вимкнути сортування у вашому клієнті завантаження, щоб уникнути проблем з імпортом",
|
||||
"AnchorTooltip": "Цей файл вже є у вашій бібліотеці для релізу, який ви зараз імпортуєте",
|
||||
"CollapseMultipleAlbums": "Згорнути кілька альбомів",
|
||||
"ExpandEPByDefaultHelpText": "EP (міні-альбоми)",
|
||||
"ForNewImportsOnly": "Лише для нових імпортів",
|
||||
"MetadataProfile": "Профіль метаданих",
|
||||
"EditMetadataProfile": "Редагувати профіль метаданих",
|
||||
"EmbedCoverArtHelpText": "Вбудовувати обкладинку альбому Lidarr у аудіофайли під час запису тегів",
|
||||
"AreYouSure": "Ви впевнені?",
|
||||
"DelayProfileArtistTagsHelpText": "Застосовується до виконавців, які мають хоча б один відповідний тег",
|
||||
"FilterArtistPlaceholder": "Фільтрувати виконавця",
|
||||
"HasMonitoredAlbumsNoMonitoredAlbumsForThisArtist": "Для цього виконавця немає жодних альбомів, що відстежуються",
|
||||
"IsExpandedHideFileInfo": "Приховати інформацію про файл",
|
||||
"ArtistIsMonitored": "Виконавець відстежується",
|
||||
"CustomFormatRequiredHelpText": "Ця {0}-а умова повинна збігатися, щоб застосувався власний формат. Інакше достатньо одного {0}-го збігу",
|
||||
"ICalTagsArtistHelpText": "Стрічка міститиме лише виконавців, які мають хоча б один відповідний тег",
|
||||
"MetadataConsumers": "Споживачі метаданих",
|
||||
"ArtistNameHelpText": "Назва виконавця/альбому, який потрібно виключити (може бути будь-якою значущою)",
|
||||
"DefaultMonitorOptionHelpText": "Які альбоми слід відстежувати при початковому додаванні для виконавців, виявлених у цій папці",
|
||||
"ExistingAlbums": "Існуючі альбоми",
|
||||
"IfYouDontAddAnImportListExclusionAndTheArtistHasAMetadataProfileOtherThanNoneThenThisAlbumMayBeReaddedDuringTheNextArtistRefresh": "Якщо ви не додасте виключення зі списку імпорту, і виконавець матиме профіль метаданих, відмінний від \"Немає\", цей альбом може бути повторно додано під час наступного оновлення виконавця",
|
||||
"IsInUseCantDeleteAQualityProfileThatIsAttachedToAnArtistOrImportList": "Неможливо видалити профіль якості, який пов'язаний з виконавцем або списком імпорту",
|
||||
"DeleteMetadataProfile": "Видалити профіль метаданих",
|
||||
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Для клієнта завантаження {0} налаштовано видалення завершених завантажень. Це може призвести до видалення завантажень з вашого клієнта до того, як {1} зможе їх імпортувати",
|
||||
"ForeignIdHelpText": "Ідентифікатор MusicBrainz виконавця/альбому, який потрібно виключити",
|
||||
"MassAlbumsCutoffUnmetWarning": "Ви впевнені, що хочете виконати пошук для всіх альбомів, де не досягнуто порогового значення '{0}'?",
|
||||
"IsExpandedShowAlbums": "Показати альбоми",
|
||||
"IsInUseCantDeleteAMetadataProfileThatIsAttachedToAnArtistOrImportList": "Неможливо видалити профіль метаданих, який пов'язаний з виконавцем або списком імпорту",
|
||||
"MetadataSettingsArtistSummary": "Створювати файли метаданих під час імпорту треків або оновлення інформації про виконавця",
|
||||
"MissingAlbumsData": "Відстежувати альбоми, які не мають файлів або ще не вийшли",
|
||||
"MissingTracksArtistNotMonitored": "Відсутні треки (виконавець не відстежується)",
|
||||
"MonitorAlbumExistingOnlyWarning": "Це одноразове коригування налаштування відстеження для кожного альбому. Використовуйте опцію в розділі \"Виконавець/Редагувати\", щоб контролювати, що відбуватиметься з новими доданими альбомами",
|
||||
"FutureDaysHelpText": "Днів для перегляду майбутніх подій у стрічці iCal",
|
||||
"CountImportListsSelected": "Вибрано {selectedCount} списків імпорту",
|
||||
"DateAdded": "Дата додавання",
|
||||
"MissingAlbums": "Відсутні альбоми",
|
||||
"DeleteTrackFile": "Видалити файл треку",
|
||||
"MonitorFutureAlbums": "Майбутні альбоми",
|
||||
"MonitorLastestAlbum": "Останній альбом",
|
||||
"MonitorMissingAlbums": "Відсутні альбоми",
|
||||
"MonitorNewAlbums": "Нові альбоми",
|
||||
"MonitorNewItemsHelpText": "Які нові альбоми слід відстежувати",
|
||||
"MultiDiscTrackFormat": "Формат треків на кількох дисках",
|
||||
"CombineWithExistingFiles": "Об'єднати з існуючими файлами",
|
||||
"ContinuingAllTracksDownloaded": "Продовжити (Усі треки завантажено)",
|
||||
"ContinuingMoreAlbumsAreExpected": "Очікуються інші альбоми",
|
||||
"CountAlbums": "{albumCount} альбомів",
|
||||
"CountIndexersSelected": "Вибрано {selectedCount} індексаторів",
|
||||
"Country": "Країна",
|
||||
"Deceased": "Помер(ла)",
|
||||
"DefaultDelayProfileArtist": "Це профіль за замовчуванням. Він застосовується до всіх виконавців, які не мають явного профілю.",
|
||||
"DefaultLidarrTags": "Теги {appName} за замовчуванням",
|
||||
"DefaultMetadataProfileIdHelpText": "Профіль метаданих за замовчуванням для виконавців, виявлених у цій папці",
|
||||
"DefaultQualityProfileIdHelpText": "Профіль якості за замовчуванням для виконавців, виявлених у цій папці",
|
||||
"DefaultTagsHelpText": "Теги {appName} за замовчуванням для виконавців, виявлених у цій папці",
|
||||
"DeleteArtist": "Видалити вибраного виконавця",
|
||||
"DeleteArtistFolder": "Видалити папку виконавця",
|
||||
"DeleteArtistFolders": "Видалити папки виконавців",
|
||||
"DeleteFilesHelpText": "Видалити файли треків та папку виконавця",
|
||||
"DeleteFormat": "Видалити формат",
|
||||
"DeleteSelectedArtists": "Видалити вибраних виконавців",
|
||||
"Discography": "Дискографія",
|
||||
"DownloadClientSettingsRecentPriorityAlbumHelpText": "Пріоритет, який використовуватиметься при завантаженні альбомів, випущених протягом останніх 14 днів",
|
||||
"DownloadPropersAndRepacksHelpTexts2": "Використовуйте \"Не надавати перевагу\", щоб сортувати за оцінкою бажаного слова, а не за належними назвами/перепакуваннями",
|
||||
"DownloadedImporting": "'Завантажено - Імпортується'",
|
||||
"DownloadedUnableToImportCheckLogsForDetails": "'Завантажено - Неможливо імпортувати: деталі дивіться в журналах'",
|
||||
"EditArtist": "Редагувати виконавця",
|
||||
"EditMetadata": "Редагувати метадані",
|
||||
"EditSelectedArtists": "Редагувати вибраних виконавців",
|
||||
"EmbedCoverArtInAudioFiles": "Вбудувати обкладинку в аудіофайли",
|
||||
"EnableAutomaticAddHelpText": "Додавати виконавців/альбоми до {appName} під час синхронізації через інтерфейс користувача або {appName}",
|
||||
"EndedAllTracksDownloaded": "Закінчено (Усі треки завантажено)",
|
||||
"EntityName": "Назва сутності",
|
||||
"ExistingAlbumsData": "Відстежувати альбоми, які мають файли або ще не вийшли",
|
||||
"ExistingTagsScrubbed": "Наявні теги очищено",
|
||||
"ExpandBroadcastByDefaultHelpText": "Трансляція",
|
||||
"ExpandItemsByDefault": "Розгорнути елементи за замовчуванням",
|
||||
"ExpandSingleByDefaultHelpText": "Сингли",
|
||||
"FilterAlbumPlaceholder": "Фільтрувати альбом",
|
||||
"FirstAlbumData": "Відстежувати перші альбоми. Усі інші альбоми буде проігноровано",
|
||||
"FutureAlbums": "Майбутні альбоми",
|
||||
"FutureDays": "Майбутні дні",
|
||||
"GoToArtistListing": "Перейти до списку виконавців",
|
||||
"GroupInformation": "Інформація про групу",
|
||||
"HideAlbums": "Приховати альбоми",
|
||||
"HideTracks": "Приховати треки",
|
||||
"ImportCompleteFailed": "Імпорт не вдався",
|
||||
"ImportFailures": "Збої імпорту",
|
||||
"ImportListSettings": "Загальні налаштування списку імпорту",
|
||||
"ImportListSpecificSettings": "Специфічні налаштування списку імпорту",
|
||||
"Inactive": "Неактивний",
|
||||
"IndexerDownloadClientHealthCheckMessage": "Індексатори з недійсними клієнтами завантаження: {0}.",
|
||||
"IsExpandedShowFileInfo": "Показати інформацію про файл",
|
||||
"IsExpandedShowTracks": "Показати треки",
|
||||
"LastAlbum": "Останній альбом",
|
||||
"LatestAlbum": "Найновіший альбом",
|
||||
"LatestAlbumData": "Відстежувати останні та майбутні альбоми",
|
||||
"LidarrSupportsMultipleListsForImportingAlbumsAndArtistsIntoTheDatabase": "{appName} підтримує кілька списків для імпорту альбомів та виконавців до бази даних",
|
||||
"ListWillRefreshEveryInterp": "Список оновлюватиметься кожні {0}",
|
||||
"MatchedToAlbums": "Збіги з альбомами",
|
||||
"MatchedToArtist": "Збіги з виконавцем",
|
||||
"MediaCount": "Кількість медіафайлів",
|
||||
"MediumFormat": "Формат носія",
|
||||
"MetadataProfileIdHelpText": "Елементи списку профілю метаданих слід додавати з",
|
||||
"MetadataProfiles": "Профілі метаданих",
|
||||
"MonitorAlbum": "Відстежувати альбом",
|
||||
"MonitorArtist": "Відстежувати виконавця",
|
||||
"MonitorArtists": "Відстежувати виконавців",
|
||||
"MonitorExistingAlbums": "Наявні альбоми",
|
||||
"MonitorFirstAlbum": "Перший альбом",
|
||||
"MonitorNoNewAlbums": "Немає нових альбомів",
|
||||
"MonitoredHelpText": "Завантажити відстежувані альбоми цього виконавця",
|
||||
"MonitoringOptionsHelpText": "Які альбоми слід відстежувати після додавання виконавця (одноразове налаштування)",
|
||||
"DownloadClientSettingsOlderPriorityAlbumHelpText": "Пріоритет, який використовуватиметься при завантаженні альбомів, випущених понад 14 днів тому",
|
||||
"MissingTracks": "Відсутні треки",
|
||||
"MissingTracksArtistMonitored": "Відсутні треки (виконавець відстежується)",
|
||||
"AddMetadataProfile": "Додати профіль метаданих",
|
||||
"AddedArtistSettings": "Додано налаштування артиста",
|
||||
"AlbumCount": "Кількість альбомів",
|
||||
"AlbumHasNotAired": "Альбом не був випущений",
|
||||
"AlbumInfo": "Інформація про альбом",
|
||||
"AlbumIsNotMonitored": "Альбом не моніториться",
|
||||
"AlbumRelease": "Випуск альбому",
|
||||
"AlbumStudio": "Студійний альбом",
|
||||
"AllArtistAlbums": "Усі альбоми виконавця",
|
||||
"AllMonitoringOptionHelpText": "Відстежувати виконавців та всі альбоми кожного виконавця, включеного до списку імпорту",
|
||||
"AllowArtistChangeClickToChangeArtist": "Натисніть, щоб змінити виконавця",
|
||||
"AllowFingerprinting": "Дозволити створення аудіовідбитків",
|
||||
"AllowFingerprintingHelpTextWarning": "Для цього програмі 1 {appName} потрібно зчитати частини файлу, що сповільнить сканування та може спричинити високу активність диска або мережі",
|
||||
"AnyReleaseOkHelpText": "{appName} автоматично перемкнеться на реліз, який найкраще відповідає завантаженим трекам",
|
||||
"ArtistClickToChangeAlbum": "Натисніть, щоб змінити альбом",
|
||||
"ArtistEditor": "Редактор виконавця",
|
||||
"ArtistFolderFormat": "Формат папки виконавця",
|
||||
"ArtistProgressBarText": "Завантажено файлів: {trackFileCount} / Всього треків у файлах: {trackCount} (Всього треків у релізі: {totalTrackCount}, Завантажується треків: {downloadingCount})",
|
||||
"AutomaticallySwitchRelease": "Автоматично вибирати реліз",
|
||||
"BannerOptions": "Параметри банера",
|
||||
"Banners": "Банери",
|
||||
"CatalogNumber": "Каталожний номер",
|
||||
"Disambiguation": "Розрізнення",
|
||||
"DiscCount": "Кількість дисків",
|
||||
"DiscNumber": "Номер диску",
|
||||
"IsExpandedHideTracks": "Приховати треки",
|
||||
"ManageTracks": "Керувати треками",
|
||||
"ScrubExistingTags": "Очистити існуючі теги",
|
||||
"PathHelpText": "Коренева папка, що містить вашу музичну бібліотеку",
|
||||
"RecycleBinUnableToWriteHealthCheck": "Не вдається записати до налаштованої папки кошика: {0}. Переконайтеся, що цей шлях існує і доступний для запису користувачем, який запустив {appName}",
|
||||
"SelectArtist": "Вибрати виконавця",
|
||||
"ShowNextAlbumHelpText": "Показувати наступний альбом під постером",
|
||||
"ShouldMonitorExistingHelpText": "Автоматично відстежувати альбоми зі цього списку, які вже є в {appName}",
|
||||
"UnableToLoadInteractiveSearch": "Не вдалося завантажити результати для цього пошуку альбому. Спробуйте пізніше",
|
||||
"SpecificMonitoringOptionHelpText": "Відстежувати виконавців, але відстежувати лише альбоми, явно включені до списку",
|
||||
"SearchForAllMissingAlbumsConfirmationCount": "Ви впевнені, що хочете шукати всі {totalRecords} відсутніх альбомів?",
|
||||
"NoHistoryBlocklist": "Немає історії заблокованих елементів",
|
||||
"QualityProfileIdHelpText": "Елементи списку профілів якості слід додавати за допомогою",
|
||||
"ShouldSearchHelpText": "Пошук в індексаторах нових доданих елементів. Обережно використовуйте для великих списків.",
|
||||
"NotificationsEmbySettingsSendNotificationsHelpText": "Відправляти сповіщення MediaBrowser на налаштовані провайдери",
|
||||
"TrackFileRenamedTooltip": "Файл треку перейменовано",
|
||||
"TrackMissingFromDisk": "Трек відсутній на диску",
|
||||
"WatchLibraryForChangesHelpText": "Автоматично сканувати при зміні файлів у кореневій папці",
|
||||
"MonitorNewItems": "Відстежувати нові альбоми",
|
||||
"ReleaseProfileTagArtistHelpText": "Профілі випуску застосовуватимуться до виконавців, які мають хоча б один відповідний тег. Залиште порожнім, щоб застосувати до всіх виконавців",
|
||||
"ReplaceExistingFiles": "Замінити існуючі файли",
|
||||
"Retag": "Перетегувати",
|
||||
"Retagged": "Перетеговано",
|
||||
"TotalTrackCountTracksTotalTrackFileCountTracksWithFilesInterp": "Всього {0} треків. {1} треків з файлами.",
|
||||
"UnableToLoadMetadataProviderSettings": "Не вдалося завантажити налаштування постачальника метаданих",
|
||||
"RenameTracks": "Перейменувати треки",
|
||||
"NoMediumInformation": "Інформація про носій недоступна",
|
||||
"NotificationsTagsArtistHelpText": "Надсилати сповіщення лише для виконавців, які мають хоча б один відповідний тег",
|
||||
"OnArtistAdd": "При додаванні виконавця",
|
||||
"OnArtistDelete": "При видаленні виконавця",
|
||||
"OnImportFailure": "При помилці імпорту",
|
||||
"OneAlbum": "1 альбом",
|
||||
"PastDays": "Минулі дні",
|
||||
"PastDaysHelpText": "Кількість днів для перегляду минулих подій у фіді iCa",
|
||||
"Playlist": "Плейлист",
|
||||
"ProfilesSettingsArtistSummary": "Якість, метадані, затримка та профілі випуску",
|
||||
"RetagSelectedArtists": "Перетегувати вибраних виконавців",
|
||||
"SearchBoxPlaceHolder": "напр., Breaking Benjamin, lidarr:854a1807-025b-42a8-ba8c-2a39717f1d25",
|
||||
"SearchForAllCutoffUnmetAlbums": "Пошук усіх альбомів, які не відповідають критерію відсікання",
|
||||
"SecondaryAlbumTypes": "Другорядні типи альбомів",
|
||||
"SecondaryTypes": "Другорядні типи",
|
||||
"ShouldMonitorExisting": "Відстежувати існуючі альбоми",
|
||||
"ShowBannersHelpText": "Показувати банери замість назв",
|
||||
"SkipRedownloadHelpText": "Запобігає спробам {appName} завантажувати альтернативні випуски для видалених елементів.",
|
||||
"ReleasesHelpText": "Змінити випуск для цього альбому",
|
||||
"MusicBrainzAlbumID": "MusicBrainz Альбом ID",
|
||||
"MusicBrainzArtistID": "MusicBrainz викаонавець ID",
|
||||
"NoTracksInThisMedium": "На цьому носії немає треків",
|
||||
"OnReleaseImport": "При імпорті релізу",
|
||||
"SearchForAllCutoffUnmetAlbumsConfirmationCount": "Ви впевнені, що хочете шукати всі {totalRecords} альбомів, які не відповідають критерію відсікання?",
|
||||
"SelectTracks": "Вибрати треки",
|
||||
"TrackArtist": "Виконавець треку",
|
||||
"TrackCount": "Кількість треків",
|
||||
"TrackDownloaded": "Трек завантажено",
|
||||
"TrackFileCounttotalTrackCountTracksDownloadedInterp": "Завантажено {0} з {1} треків",
|
||||
"WriteMetadataToAudioFiles": "Записувати метадані до аудіофайлів",
|
||||
"WriteAudioTagsHelpTextWarning": "Вибір \"Усі файли\" змінить існуючі файли під час їх імпорту.",
|
||||
"WriteMetadataTags": "Записати теги метаданих",
|
||||
"MusicBrainzRecordingID": "MusicBrainz запису ID",
|
||||
"MusicBrainzReleaseID": "MusicBrainz релізу ID",
|
||||
"MusicBrainzTrackID": "MusicBrainz Track ID",
|
||||
"MusicbrainzId": "Musicbrainz Id",
|
||||
"NewAlbums": "Нові альбоми",
|
||||
"NextAlbum": "Наступний альбом",
|
||||
"NoAlbums": "Немає альбомів",
|
||||
"NoneData": "Жоден альбом не буде відстежуватися",
|
||||
"NoneMonitoringOptionHelpText": "Не відстежувати виконавців або альбоми",
|
||||
"NotDiscography": "Не дискографія",
|
||||
"OnAlbumDelete": "При видаленні альбому",
|
||||
"OnDownloadFailure": "При помилці завантаження",
|
||||
"OnTrackRetag": "При перетегуванні треку",
|
||||
"PathHelpTextWarning": "Це має відрізнятися від каталогу, куди ваш клієнт завантажує файли",
|
||||
"PreviewRetag": "Попередній перегляд перетегування",
|
||||
"PrimaryAlbumTypes": "Основні типи альбомів",
|
||||
"PrimaryTypes": "Основні типи",
|
||||
"Proceed": "Продовжити",
|
||||
"RefreshArtist": "Оновити виконавця",
|
||||
"ScrubAudioTagsHelpText": "Видалити існуючі теги з файлів, залишивши лише ті, що додані {appName}.",
|
||||
"SearchAlbum": "Пошук альбому",
|
||||
"SearchForAllMissingAlbums": "Пошук усіх відсутніх альбомів",
|
||||
"SearchForMonitoredAlbums": "Пошук відстежуваних альбомів",
|
||||
"SelectAlbum": "Вибрати альбом",
|
||||
"SelectAlbumRelease": "Вибрати випуск альбому",
|
||||
"SelectedCountArtistsSelectedInterp": "Вибрано {selectedCount} виконавця(ів)",
|
||||
"SetAppTags": "Встановити теги {appName}.",
|
||||
"ShouldMonitorHelpText": "Відстежувати виконавців та альбоми, додані з цього списку",
|
||||
"ShouldSearch": "Пошук нових елементів",
|
||||
"ShowAlbumCount": "Показати кількість альбомів",
|
||||
"ShowLastAlbum": "Показати останній альбом",
|
||||
"ShowName": "Показати назву",
|
||||
"ShowNextAlbum": "Показати наступний альбом",
|
||||
"ShowTitleHelpText": "Показувати ім'я виконавця під постером",
|
||||
"SpecificAlbum": "Конкретний альбом",
|
||||
"TagAudioFilesWithMetadata": "Тегувати аудіофайли метаданими",
|
||||
"TheAlbumsFilesWillBeDeleted": "Файли альбому буде видалено",
|
||||
"TrackFileDeletedTooltip": "Файл треку видалено",
|
||||
"TrackFileMissingTooltip": "Файл треку відсутній",
|
||||
"TrackFileTagsUpdatedTooltip": "Теги файлу треку оновлено",
|
||||
"TrackFiles": "Файли треків",
|
||||
"TrackFilesLoadError": "Не вдалося завантажити файли треків",
|
||||
"TrackImported": "Трек імпортовано",
|
||||
"TrackNaming": "Іменування треків",
|
||||
"TrackProgress": "Прогрес треку",
|
||||
"TrackStatus": "Статус треку",
|
||||
"TracksLoadError": "Не вдалося завантажити треки",
|
||||
"UpdatingIsDisabledInsideADockerContainerUpdateTheContainerImageInstead": "Оновлення вимкнено всередині контейнера Docker. Оновіть образ контейнера.",
|
||||
"WatchRootFoldersForFileChanges": "Слідкувати за змінами файлів у кореневих папках"
|
||||
}
|
||||
|
|
|
@ -1349,5 +1349,7 @@
|
|||
"WaitingToImport": "等待导入",
|
||||
"WaitingToProcess": "等待处理",
|
||||
"DelayProfileArtistTagsHelpText": "应用到至少有一个标签匹配的艺术家",
|
||||
"AlbumInfo": "专辑 信息"
|
||||
"AlbumInfo": "专辑 信息",
|
||||
"DownloadClientSettingsOlderPriorityAlbumHelpText": "优先使用14天前发布的专辑",
|
||||
"DownloadClientSettingsRecentPriorityAlbumHelpText": "优先使用过去14天内发布的专辑"
|
||||
}
|
||||
|
|
|
@ -4,5 +4,9 @@
|
|||
"Always": "总是",
|
||||
"Analytics": "分析",
|
||||
"Username": "用户名",
|
||||
"Activity": "活动"
|
||||
"Activity": "活动",
|
||||
"UseProxy": "使用代理",
|
||||
"Uptime": "运行时间",
|
||||
"Warn": "警告",
|
||||
"Updates": "更新"
|
||||
}
|
||||
|
|
|
@ -65,6 +65,10 @@ namespace NzbDrone.Core.MediaFiles
|
|||
_logger.Debug("Removing existing track file: {0}", file);
|
||||
_recycleBinProvider.DeleteFile(trackFilePath, subfolder);
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.Warn("Existing track file missing from disk: {0}", trackFilePath);
|
||||
}
|
||||
|
||||
moveFileResult.OldFiles.Add(file);
|
||||
_mediaFileService.Delete(file, DeleteMediaFileReason.Upgrade);
|
||||
|
|
|
@ -18,6 +18,8 @@ namespace NzbDrone.Core.Music
|
|||
}
|
||||
|
||||
public bool ShouldRefresh(Album album)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (album.LastInfoSync < DateTime.UtcNow.AddDays(-60))
|
||||
{
|
||||
|
@ -40,5 +42,11 @@ namespace NzbDrone.Core.Music
|
|||
_logger.Trace("Album {0} released long ago and recently refreshed, should not be refreshed.", album.Title);
|
||||
return false;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.Error(e, "Unable to determine if album should refresh, will try to refresh.");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,6 +21,8 @@ namespace NzbDrone.Core.Music
|
|||
}
|
||||
|
||||
public bool ShouldRefresh(Artist artist)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (artist.LastInfoSync == null)
|
||||
{
|
||||
|
@ -57,5 +59,11 @@ namespace NzbDrone.Core.Music
|
|||
_logger.Trace("Artist {0} ended long ago, should not be refreshed.", artist.Name);
|
||||
return false;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.Error(e, "Unable to determine if artist should refresh, will try to refresh.");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -347,7 +347,7 @@ namespace NzbDrone.Core.Notifications.CustomScript
|
|||
{
|
||||
if (artist == null)
|
||||
{
|
||||
return null;
|
||||
return new List<string>();
|
||||
}
|
||||
|
||||
return _tagRepository.GetTags(artist.Tags)
|
||||
|
|
|
@ -514,9 +514,9 @@ namespace NzbDrone.Core.Notifications.Discord
|
|||
{
|
||||
var albumTitles = string.Join(" + ", albums.Select(e => e.Title));
|
||||
|
||||
var title = $"{artist.Name} - {albumTitles}";
|
||||
var title = $"{artist.Name} - {albumTitles}".Replace("`", "\\`");
|
||||
|
||||
return title.Length > 256 ? $"{title.AsSpan(0, 253)}..." : title;
|
||||
return title.Length > 256 ? $"{title.AsSpan(0, 253).TrimEnd('\\')}..." : title;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,9 +36,9 @@ namespace NzbDrone.Core.Parser
|
|||
(?<VBRV2>V2[ ]?kbps|V2|[\[\(].*V2.*[\]\)]))\b",
|
||||
RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
|
||||
|
||||
private static readonly Regex SampleSizeRegex = new (@"\b(?:(?<S24>24[-._ ]?bit|tr24|24-(?:44|48|96|192)|[\[\(].*24bit.*[\]\)]))\b", RegexOptions.Compiled);
|
||||
private static readonly Regex SampleSizeRegex = new (@"\b(?:(?<S24>24[-._ ]?bit|flac24(?:[-._ ]?bit)?|tr24|24-(?:44|48|96|192)|[\[\(].*24bit.*[\]\)]))\b", RegexOptions.Compiled);
|
||||
|
||||
private static readonly Regex CodecRegex = new (@"\b(?:(?<MP1>MPEG Version \d(.5)? Audio, Layer 1|MP1)|(?<MP2>MPEG Version \d(.5)? Audio, Layer 2|MP2)|(?<MP3VBR>MP3.*VBR|MPEG Version \d(.5)? Audio, Layer 3 vbr)|(?<MP3CBR>MP3|MPEG Version \d(.5)? Audio, Layer 3)|(?<FLAC>(web)?flac|TR24)|(?<WAVPACK>wavpack|wv)|(?<ALAC>alac)|(?<WMA>WMA\d?)|(?<WAV>WAV|PCM)|(?<AAC>M4A|M4P|M4B|AAC|mp4a|MPEG-4 Audio(?!.*alac))|(?<OGG>OGG|OGA|Vorbis))\b|(?<APE>monkey's audio|[\[|\(].*\bape\b.*[\]|\)])|(?<OPUS>Opus Version \d(.5)? Audio|[\[|\(].*\bopus\b.*[\]|\)])",
|
||||
private static readonly Regex CodecRegex = new (@"\b(?:(?<MP1>MPEG Version \d(.5)? Audio, Layer 1|MP1)|(?<MP2>MPEG Version \d(.5)? Audio, Layer 2|MP2)|(?<MP3VBR>MP3.*VBR|MPEG Version \d(.5)? Audio, Layer 3 vbr)|(?<MP3CBR>MP3|MPEG Version \d(.5)? Audio, Layer 3)|(?<FLAC>(web)?flac(?:24(?:[-._ ]?bit)?)?|TR24)|(?<WAVPACK>wavpack|wv)|(?<ALAC>alac)|(?<WMA>WMA\d?)|(?<WAV>WAV|PCM)|(?<AAC>M4A|M4P|M4B|AAC|mp4a|MPEG-4 Audio(?!.*alac))|(?<OGG>OGG|OGA|Vorbis))\b|(?<APE>monkey's audio|[\[|\(].*\bape\b.*[\]|\)])|(?<OPUS>Opus Version \d(.5)? Audio|[\[|\(].*\bopus\b.*[\]|\)])",
|
||||
RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
private static readonly Regex WebRegex = new (@"\b(?<web>WEB)(?:\b|$|[ .])",
|
||||
|
@ -59,7 +59,7 @@ namespace NzbDrone.Core.Parser
|
|||
if (desc.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
var descCodec = ParseCodec(desc, "");
|
||||
Logger.Trace($"Got codec {descCodec}");
|
||||
Logger.Trace("Got codec {0}", descCodec);
|
||||
|
||||
result.Quality = FindQuality(descCodec, fileBitrate, fileSampleSize);
|
||||
|
||||
|
|
|
@ -96,6 +96,11 @@ namespace NzbDrone.Core.RemotePathMappings
|
|||
throw new ArgumentException("Invalid Host");
|
||||
}
|
||||
|
||||
if (mapping.RemotePath.StartsWith(" "))
|
||||
{
|
||||
throw new ArgumentException("Remote Path must not start with a space");
|
||||
}
|
||||
|
||||
var remotePath = new OsPath(mapping.RemotePath);
|
||||
var localPath = new OsPath(mapping.LocalPath);
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ using NzbDrone.Test.Common;
|
|||
namespace NzbDrone.Integration.Test.ApiTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class ArtistEditorFixture : IntegrationTest
|
||||
{
|
||||
private void GivenExistingArtist()
|
||||
|
|
|
@ -7,6 +7,7 @@ using NUnit.Framework;
|
|||
namespace NzbDrone.Integration.Test.ApiTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class ArtistFixture : IntegrationTest
|
||||
{
|
||||
[Test]
|
||||
|
|
|
@ -4,6 +4,7 @@ using NUnit.Framework;
|
|||
namespace NzbDrone.Integration.Test.ApiTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class ArtistLookupFixture : IntegrationTest
|
||||
{
|
||||
[TestCase("Kiss", "Kiss")]
|
||||
|
|
|
@ -6,6 +6,7 @@ using NUnit.Framework;
|
|||
namespace NzbDrone.Integration.Test.ApiTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class BlocklistFixture : IntegrationTest
|
||||
{
|
||||
private ArtistResource _artist;
|
||||
|
|
|
@ -9,6 +9,7 @@ using NzbDrone.Integration.Test.Client;
|
|||
namespace NzbDrone.Integration.Test.ApiTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class CalendarFixture : IntegrationTest
|
||||
{
|
||||
public ClientBase<AlbumResource> Calendar;
|
||||
|
|
|
@ -7,6 +7,7 @@ using NUnit.Framework;
|
|||
namespace NzbDrone.Integration.Test.ApiTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class TrackFixture : IntegrationTest
|
||||
{
|
||||
private ArtistResource _artist;
|
||||
|
|
|
@ -8,6 +8,7 @@ using NzbDrone.Core.Qualities;
|
|||
namespace NzbDrone.Integration.Test.ApiTests.WantedTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class CutoffUnmetFixture : IntegrationTest
|
||||
{
|
||||
[SetUp]
|
||||
|
|
|
@ -7,6 +7,7 @@ using NzbDrone.Core.Music;
|
|||
namespace NzbDrone.Integration.Test.ApiTests.WantedTests
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2025-07-01 00:00:00Z")]
|
||||
public class MissingFixture : IntegrationTest
|
||||
{
|
||||
[SetUp]
|
||||
|
|
14
yarn.lock
14
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.30001707"
|
||||
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz"
|
||||
integrity sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==
|
||||
version "1.0.30001715"
|
||||
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz"
|
||||
integrity sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==
|
||||
|
||||
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.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@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@^2.4.0:
|
||||
version "2.6.12"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue