diff --git a/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupDuplicateMetadataFilesFixture.cs b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupDuplicateMetadataFilesFixture.cs new file mode 100644 index 000000000..839acf23b --- /dev/null +++ b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupDuplicateMetadataFilesFixture.cs @@ -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 + { + [Test] + public void should_not_delete_metadata_files_when_they_are_for_the_same_series_but_different_consumers() + { + var files = Builder.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.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.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.CreateNew() + .BuildNew(); + + Db.Insert(file); + Subject.Clean(); + AllStoredModels.Count.Should().Be(1); + } + } +} diff --git a/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/FixFutureRunScheduledTasksFixture.cs b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/FixFutureRunScheduledTasksFixture.cs index 886ef8a58..4235b217e 100644 --- a/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/FixFutureRunScheduledTasksFixture.cs +++ b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/FixFutureRunScheduledTasksFixture.cs @@ -1,12 +1,10 @@ using System; -using System.Linq; using FizzWare.NBuilder; using FluentAssertions; using Microsoft.Practices.ObjectBuilder2; using NUnit.Framework; using NzbDrone.Core.Housekeeping.Housekeepers; using NzbDrone.Core.Jobs; -using NzbDrone.Core.Organizer; using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test.Housekeeping.Housekeepers diff --git a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index 05876a0fe..f140c68b8 100644 --- a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -136,6 +136,7 @@ + diff --git a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupDuplicateMetadataFiles.cs b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupDuplicateMetadataFiles.cs new file mode 100644 index 000000000..3c7ba56b2 --- /dev/null +++ b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupDuplicateMetadataFiles.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 + )"); + } + } +} diff --git a/src/NzbDrone.Core/MetaData/Consumers/Fake/Fake.cs b/src/NzbDrone.Core/MetaData/Consumers/Fake/Fake.cs deleted file mode 100644 index 6ae86b093..000000000 --- a/src/NzbDrone.Core/MetaData/Consumers/Fake/Fake.cs +++ /dev/null @@ -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 - { - public FakeMetadata(IDiskProvider diskProvider, IHttpProvider httpProvider, Logger logger) - : base(diskProvider, httpProvider, logger) - { - } - - public override void OnSeriesUpdated(Series series, List existingMetadataFiles, List episodeFiles) - { - throw new NotImplementedException(); - } - - public override void OnEpisodeImport(Series series, EpisodeFile episodeFile, bool newDownload) - { - throw new NotImplementedException(); - } - - public override void AfterRename(Series series, List existingMetadataFiles, List episodeFiles) - { - throw new NotImplementedException(); - } - - public override MetadataFile FindMetadataFile(Series series, string path) - { - return null; - } - } -} diff --git a/src/NzbDrone.Core/MetaData/Consumers/Fake/FakeSettings.cs b/src/NzbDrone.Core/MetaData/Consumers/Fake/FakeSettings.cs deleted file mode 100644 index e94f4a589..000000000 --- a/src/NzbDrone.Core/MetaData/Consumers/Fake/FakeSettings.cs +++ /dev/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 - { - 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); - } - } -} diff --git a/src/NzbDrone.Core/MetaData/Consumers/Xbmc/XbmcMetadata.cs b/src/NzbDrone.Core/MetaData/Consumers/Xbmc/XbmcMetadata.cs index 4cc004bff..571d51c75 100644 --- a/src/NzbDrone.Core/MetaData/Consumers/Xbmc/XbmcMetadata.cs +++ b/src/NzbDrone.Core/MetaData/Consumers/Xbmc/XbmcMetadata.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Runtime.Remoting.Messaging; using System.Text; using System.Text.RegularExpressions; using System.Xml; @@ -10,7 +9,6 @@ using System.Xml.Linq; using NLog; using NzbDrone.Common; using NzbDrone.Common.Disk; -using NzbDrone.Core.Datastore; using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Messaging.Events; diff --git a/src/NzbDrone.Core/MetaData/MetadataFactory.cs b/src/NzbDrone.Core/MetaData/MetadataFactory.cs index 74d837c6a..d5d358bf8 100644 --- a/src/NzbDrone.Core/MetaData/MetadataFactory.cs +++ b/src/NzbDrone.Core/MetaData/MetadataFactory.cs @@ -4,7 +4,6 @@ using System.Linq; using NLog; using NzbDrone.Common.Composition; using NzbDrone.Core.Messaging.Events; -using NzbDrone.Core.Metadata.Consumers.Fake; using NzbDrone.Core.ThingiProvider; namespace NzbDrone.Core.Metadata @@ -30,8 +29,6 @@ namespace NzbDrone.Core.Metadata foreach (var provider in _providers) { - if (provider.GetType() == typeof(FakeMetadata)) continue;; - definitions.Add(new MetadataDefinition { Enable = false, diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index 1592be0d7..0e3b6e8b7 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -282,6 +282,7 @@ + @@ -350,8 +351,6 @@ - -