Fixed: Cleanup duplicate Series Metadata files in database on startup
This commit is contained in:
parent
4de036af55
commit
da5713688d
|
@ -0,0 +1,70 @@
|
||||||
|
using FizzWare.NBuilder;
|
||||||
|
using FluentAssertions;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Core.Housekeeping.Housekeepers;
|
||||||
|
using NzbDrone.Core.MediaFiles;
|
||||||
|
using NzbDrone.Core.Metadata;
|
||||||
|
using NzbDrone.Core.Metadata.Files;
|
||||||
|
using NzbDrone.Core.Test.Framework;
|
||||||
|
using NzbDrone.Core.Tv;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class CleanupDuplicateMetadataFilesFixture : DbTest<CleanupDuplicateMetadataFiles, MetadataFile>
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void should_not_delete_metadata_files_when_they_are_for_the_same_series_but_different_consumers()
|
||||||
|
{
|
||||||
|
var files = Builder<MetadataFile>.CreateListOfSize(2)
|
||||||
|
.All()
|
||||||
|
.With(m => m.Type = MetadataType.SeriesMetadata)
|
||||||
|
.With(m => m.SeriesId = 1)
|
||||||
|
.BuildListOfNew();
|
||||||
|
|
||||||
|
Db.InsertMany(files);
|
||||||
|
Subject.Clean();
|
||||||
|
AllStoredModels.Count.Should().Be(files.Count);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_delete_metadata_files_for_different_series()
|
||||||
|
{
|
||||||
|
var files = Builder<MetadataFile>.CreateListOfSize(2)
|
||||||
|
.All()
|
||||||
|
.With(m => m.Type = MetadataType.SeriesMetadata)
|
||||||
|
.With(m => m.Consumer = "XbmcMetadata")
|
||||||
|
.BuildListOfNew();
|
||||||
|
|
||||||
|
Db.InsertMany(files);
|
||||||
|
Subject.Clean();
|
||||||
|
AllStoredModels.Count.Should().Be(files.Count);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_delete_metadata_files_when_they_are_for_the_same_series_and_consumer()
|
||||||
|
{
|
||||||
|
var files = Builder<MetadataFile>.CreateListOfSize(2)
|
||||||
|
.All()
|
||||||
|
.With(m => m.Type = MetadataType.SeriesMetadata)
|
||||||
|
.With(m => m.SeriesId = 1)
|
||||||
|
.With(m => m.Consumer = "XbmcMetadata")
|
||||||
|
.BuildListOfNew();
|
||||||
|
|
||||||
|
Db.InsertMany(files);
|
||||||
|
Subject.Clean();
|
||||||
|
AllStoredModels.Count.Should().Be(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_delete_metadata_files_when_there_is_only_one_for_that_series_and_consumer()
|
||||||
|
{
|
||||||
|
var file = Builder<MetadataFile>.CreateNew()
|
||||||
|
.BuildNew();
|
||||||
|
|
||||||
|
Db.Insert(file);
|
||||||
|
Subject.Clean();
|
||||||
|
AllStoredModels.Count.Should().Be(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,12 +1,10 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
|
||||||
using FizzWare.NBuilder;
|
using FizzWare.NBuilder;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using Microsoft.Practices.ObjectBuilder2;
|
using Microsoft.Practices.ObjectBuilder2;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Core.Housekeeping.Housekeepers;
|
using NzbDrone.Core.Housekeeping.Housekeepers;
|
||||||
using NzbDrone.Core.Jobs;
|
using NzbDrone.Core.Jobs;
|
||||||
using NzbDrone.Core.Organizer;
|
|
||||||
using NzbDrone.Core.Test.Framework;
|
using NzbDrone.Core.Test.Framework;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
|
namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
|
||||||
|
|
|
@ -136,6 +136,7 @@
|
||||||
<Compile Include="Housekeeping\Housekeepers\CleanupOrphanedEpisodeFilesFixture.cs" />
|
<Compile Include="Housekeeping\Housekeepers\CleanupOrphanedEpisodeFilesFixture.cs" />
|
||||||
<Compile Include="Housekeeping\Housekeepers\CleanupAdditionalNamingSpecsFixture.cs" />
|
<Compile Include="Housekeeping\Housekeepers\CleanupAdditionalNamingSpecsFixture.cs" />
|
||||||
<Compile Include="Housekeeping\Housekeepers\CleanupOrphanedMetadataFilesFixture.cs" />
|
<Compile Include="Housekeeping\Housekeepers\CleanupOrphanedMetadataFilesFixture.cs" />
|
||||||
|
<Compile Include="Housekeeping\Housekeepers\CleanupDuplicateMetadataFilesFixture.cs" />
|
||||||
<Compile Include="Housekeeping\Housekeepers\FixFutureRunScheduledTasksFixture.cs" />
|
<Compile Include="Housekeeping\Housekeepers\FixFutureRunScheduledTasksFixture.cs" />
|
||||||
<Compile Include="IndexerSearchTests\SearchDefinitionFixture.cs" />
|
<Compile Include="IndexerSearchTests\SearchDefinitionFixture.cs" />
|
||||||
<Compile Include="IndexerTests\BasicRssParserFixture.cs" />
|
<Compile Include="IndexerTests\BasicRssParserFixture.cs" />
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
using NLog;
|
||||||
|
using NzbDrone.Core.Datastore;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Housekeeping.Housekeepers
|
||||||
|
{
|
||||||
|
public class CleanupDuplicateMetadataFiles : IHousekeepingTask
|
||||||
|
{
|
||||||
|
private readonly IDatabase _database;
|
||||||
|
private readonly Logger _logger;
|
||||||
|
|
||||||
|
public CleanupDuplicateMetadataFiles(IDatabase database, Logger logger)
|
||||||
|
{
|
||||||
|
_database = database;
|
||||||
|
_logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clean()
|
||||||
|
{
|
||||||
|
_logger.Debug("Running cleanup of duplicate metadata files");
|
||||||
|
|
||||||
|
DeleteDuplicateSeriesMetadata();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DeleteDuplicateSeriesMetadata()
|
||||||
|
{
|
||||||
|
var mapper = _database.GetDataMapper();
|
||||||
|
|
||||||
|
mapper.ExecuteNonQuery(@"DELETE FROM MetadataFiles
|
||||||
|
WHERE Id IN (
|
||||||
|
SELECT Id FROM MetadataFiles
|
||||||
|
WHERE Type = 1
|
||||||
|
GROUP BY SeriesId, Consumer
|
||||||
|
HAVING COUNT(SeriesId) > 1
|
||||||
|
)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,39 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using NLog;
|
|
||||||
using NzbDrone.Common;
|
|
||||||
using NzbDrone.Common.Disk;
|
|
||||||
using NzbDrone.Core.MediaFiles;
|
|
||||||
using NzbDrone.Core.Metadata.Files;
|
|
||||||
using NzbDrone.Core.Tv;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Metadata.Consumers.Fake
|
|
||||||
{
|
|
||||||
public class FakeMetadata : MetadataBase<FakeMetadataSettings>
|
|
||||||
{
|
|
||||||
public FakeMetadata(IDiskProvider diskProvider, IHttpProvider httpProvider, Logger logger)
|
|
||||||
: base(diskProvider, httpProvider, logger)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnSeriesUpdated(Series series, List<MetadataFile> existingMetadataFiles, List<EpisodeFile> episodeFiles)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnEpisodeImport(Series series, EpisodeFile episodeFile, bool newDownload)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void AfterRename(Series series, List<MetadataFile> existingMetadataFiles, List<EpisodeFile> episodeFiles)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override MetadataFile FindMetadataFile(Series series, string path)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
using System;
|
|
||||||
using FluentValidation;
|
|
||||||
using FluentValidation.Results;
|
|
||||||
using NzbDrone.Core.Annotations;
|
|
||||||
using NzbDrone.Core.ThingiProvider;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Metadata.Consumers.Fake
|
|
||||||
{
|
|
||||||
public class FakeMetadataSettingsValidator : AbstractValidator<FakeMetadataSettings>
|
|
||||||
{
|
|
||||||
public FakeMetadataSettingsValidator()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class FakeMetadataSettings : IProviderConfig
|
|
||||||
{
|
|
||||||
private static readonly FakeMetadataSettingsValidator Validator = new FakeMetadataSettingsValidator();
|
|
||||||
|
|
||||||
public FakeMetadataSettings()
|
|
||||||
{
|
|
||||||
FakeSetting = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
[FieldDefinition(0, Label = "Fake Setting", Type = FieldType.Checkbox)]
|
|
||||||
public Boolean FakeSetting { get; set; }
|
|
||||||
|
|
||||||
public bool IsValid
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ValidationResult Validate()
|
|
||||||
{
|
|
||||||
return Validator.Validate(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -2,7 +2,6 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.Remoting.Messaging;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Xml;
|
using System.Xml;
|
||||||
|
@ -10,7 +9,6 @@ using System.Xml.Linq;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Common.Disk;
|
using NzbDrone.Common.Disk;
|
||||||
using NzbDrone.Core.Datastore;
|
|
||||||
using NzbDrone.Core.MediaCover;
|
using NzbDrone.Core.MediaCover;
|
||||||
using NzbDrone.Core.MediaFiles;
|
using NzbDrone.Core.MediaFiles;
|
||||||
using NzbDrone.Core.Messaging.Events;
|
using NzbDrone.Core.Messaging.Events;
|
||||||
|
|
|
@ -4,7 +4,6 @@ using System.Linq;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Composition;
|
using NzbDrone.Common.Composition;
|
||||||
using NzbDrone.Core.Messaging.Events;
|
using NzbDrone.Core.Messaging.Events;
|
||||||
using NzbDrone.Core.Metadata.Consumers.Fake;
|
|
||||||
using NzbDrone.Core.ThingiProvider;
|
using NzbDrone.Core.ThingiProvider;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Metadata
|
namespace NzbDrone.Core.Metadata
|
||||||
|
@ -30,8 +29,6 @@ namespace NzbDrone.Core.Metadata
|
||||||
|
|
||||||
foreach (var provider in _providers)
|
foreach (var provider in _providers)
|
||||||
{
|
{
|
||||||
if (provider.GetType() == typeof(FakeMetadata)) continue;;
|
|
||||||
|
|
||||||
definitions.Add(new MetadataDefinition
|
definitions.Add(new MetadataDefinition
|
||||||
{
|
{
|
||||||
Enable = false,
|
Enable = false,
|
||||||
|
|
|
@ -282,6 +282,7 @@
|
||||||
<Compile Include="Housekeeping\Housekeepers\CleanupOrphanedMetadataFiles.cs" />
|
<Compile Include="Housekeeping\Housekeepers\CleanupOrphanedMetadataFiles.cs" />
|
||||||
<Compile Include="Housekeeping\Housekeepers\CleanupAdditionalNamingSpecs.cs" />
|
<Compile Include="Housekeeping\Housekeepers\CleanupAdditionalNamingSpecs.cs" />
|
||||||
<Compile Include="Housekeeping\Housekeepers\CleanupOrphanedBlacklist.cs" />
|
<Compile Include="Housekeeping\Housekeepers\CleanupOrphanedBlacklist.cs" />
|
||||||
|
<Compile Include="Housekeeping\Housekeepers\CleanupDuplicateMetadataFiles.cs" />
|
||||||
<Compile Include="Housekeeping\Housekeepers\UpdateCleanTitleForSeries.cs" />
|
<Compile Include="Housekeeping\Housekeepers\UpdateCleanTitleForSeries.cs" />
|
||||||
<Compile Include="Housekeeping\Housekeepers\CleanupOrphanedEpisodeFiles.cs" />
|
<Compile Include="Housekeeping\Housekeepers\CleanupOrphanedEpisodeFiles.cs" />
|
||||||
<Compile Include="Housekeeping\Housekeepers\FixFutureRunScheduledTasks.cs" />
|
<Compile Include="Housekeeping\Housekeepers\FixFutureRunScheduledTasks.cs" />
|
||||||
|
@ -350,8 +351,6 @@
|
||||||
<Compile Include="Metadata\Consumers\Wdtv\WdtvMetadata.cs" />
|
<Compile Include="Metadata\Consumers\Wdtv\WdtvMetadata.cs" />
|
||||||
<Compile Include="Metadata\Consumers\Wdtv\WdtvMetadataSettings.cs" />
|
<Compile Include="Metadata\Consumers\Wdtv\WdtvMetadataSettings.cs" />
|
||||||
<Compile Include="Metadata\Files\CleanMetadataService.cs" />
|
<Compile Include="Metadata\Files\CleanMetadataService.cs" />
|
||||||
<Compile Include="Metadata\Consumers\Fake\Fake.cs" />
|
|
||||||
<Compile Include="Metadata\Consumers\Fake\FakeSettings.cs" />
|
|
||||||
<Compile Include="Metadata\Consumers\Xbmc\XbmcMetadata.cs" />
|
<Compile Include="Metadata\Consumers\Xbmc\XbmcMetadata.cs" />
|
||||||
<Compile Include="Metadata\Consumers\Xbmc\XbmcMetadataSettings.cs" />
|
<Compile Include="Metadata\Consumers\Xbmc\XbmcMetadataSettings.cs" />
|
||||||
<Compile Include="Metadata\ExistingMetadataService.cs" />
|
<Compile Include="Metadata\ExistingMetadataService.cs" />
|
||||||
|
|
Loading…
Reference in New Issue