From 8e429239a8fdd501a3210910ceb4f44ca4ccfc06 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Wed, 15 Jun 2016 23:53:23 -0700 Subject: [PATCH] Fixed: Metadata files incorrectly stored in database --- ...CleanupAbsolutePathMetadataFilesFixture.cs | 65 +++++++++++++++++++ .../NzbDrone.Core.Test.csproj | 1 + .../CleanupAbsolutePathMetadataFiles.cs | 30 +++++++++ .../MediaBrowser/MediaBrowserMetadata.cs | 17 ++--- .../Metadata/Consumers/Wdtv/WdtvMetadata.cs | 15 +++-- .../Metadata/Consumers/Xbmc/XbmcMetadata.cs | 6 +- src/NzbDrone.Core/Metadata/MetadataService.cs | 19 ++++-- src/NzbDrone.Core/NzbDrone.Core.csproj | 1 + 8 files changed, 126 insertions(+), 28 deletions(-) create mode 100644 src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupAbsolutePathMetadataFilesFixture.cs create mode 100644 src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupAbsolutePathMetadataFiles.cs diff --git a/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupAbsolutePathMetadataFilesFixture.cs b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupAbsolutePathMetadataFilesFixture.cs new file mode 100644 index 000000000..59b856668 --- /dev/null +++ b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupAbsolutePathMetadataFilesFixture.cs @@ -0,0 +1,65 @@ +using FizzWare.NBuilder; +using FluentAssertions; +using NUnit.Framework; +using NzbDrone.Common.Extensions; +using NzbDrone.Core.Housekeeping.Housekeepers; +using NzbDrone.Core.Metadata; +using NzbDrone.Core.Metadata.Files; +using NzbDrone.Core.Test.Framework; +using NzbDrone.Test.Common; + +namespace NzbDrone.Core.Test.Housekeeping.Housekeepers +{ + [TestFixture] + public class CleanupAbsolutePathMetadataFilesFixture : DbTest + { + [Test] + public void should_not_delete_metadata_files_that_have_a_relative_path() + { + var relativePath = @"C:\Test\".AsOsAgnostic().GetRelativePath(@"C:\Test\Relative\Path"); + var file = Builder.CreateNew() + .With(m => m.RelativePath = relativePath) + .BuildNew(); + + Db.Insert(file); + Subject.Clean(); + AllStoredModels.Count.Should().Be(1); + } + + [Test] + public void should_delete_metadata_files_that_start_with_a_drive_letter() + { + var file = Builder.CreateNew() + .With(m => m.RelativePath = @"C:\Relative\Path") + .BuildNew(); + + Db.Insert(file); + Subject.Clean(); + AllStoredModels.Count.Should().Be(0); + } + + [Test] + public void should_delete_metadata_files_that_start_with_a_forward_slash() + { + var file = Builder.CreateNew() + .With(m => m.RelativePath = @"/Relative/Path") + .BuildNew(); + + Db.Insert(file); + Subject.Clean(); + AllStoredModels.Count.Should().Be(0); + } + + [Test] + public void should_delete_metadata_files_that_start_with_a_backslash() + { + var file = Builder.CreateNew() + .With(m => m.RelativePath = @"\\Relative\Path") + .BuildNew(); + + Db.Insert(file); + Subject.Clean(); + AllStoredModels.Count.Should().Be(0); + } + } +} diff --git a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index 7fa94631c..6ec1b76fa 100644 --- a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -212,6 +212,7 @@ + diff --git a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupAbsolutePathMetadataFiles.cs b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupAbsolutePathMetadataFiles.cs new file mode 100644 index 000000000..099180b3b --- /dev/null +++ b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupAbsolutePathMetadataFiles.cs @@ -0,0 +1,30 @@ +using NzbDrone.Core.Datastore; + +namespace NzbDrone.Core.Housekeeping.Housekeepers +{ + public class CleanupAbsolutePathMetadataFiles : IHousekeepingTask + { + private readonly IMainDatabase _database; + + public CleanupAbsolutePathMetadataFiles(IMainDatabase database) + { + _database = database; + } + + public void Clean() + { + var mapper = _database.GetDataMapper(); + + mapper.ExecuteNonQuery(@"DELETE FROM MetadataFiles + WHERE Id IN ( + SELECT Id FROM MetadataFiles + WHERE RelativePath + LIKE '_:\%' + OR RelativePath + LIKE '\%' + OR RelativePath + LIKE '/%' + )"); + } + } +} diff --git a/src/NzbDrone.Core/Metadata/Consumers/MediaBrowser/MediaBrowserMetadata.cs b/src/NzbDrone.Core/Metadata/Consumers/MediaBrowser/MediaBrowserMetadata.cs index 043627f27..9a6a1b765 100644 --- a/src/NzbDrone.Core/Metadata/Consumers/MediaBrowser/MediaBrowserMetadata.cs +++ b/src/NzbDrone.Core/Metadata/Consumers/MediaBrowser/MediaBrowserMetadata.cs @@ -88,37 +88,30 @@ namespace NzbDrone.Core.Metadata.Consumers.MediaBrowser tvShow.Add(new XElement("Status", series.Status)); tvShow.Add(new XElement("Network", series.Network)); tvShow.Add(new XElement("Airs_Time", series.AirTime)); - //tvShow.Add(new XElement("Airs_DayOfWeek", + if (series.FirstAired.HasValue) { tvShow.Add(new XElement("FirstAired", series.FirstAired.Value.ToString("yyyy-MM-dd"))); } + tvShow.Add(new XElement("ContentRating", series.Certification)); tvShow.Add(new XElement("Added", series.Added.ToString("MM/dd/yyyy HH:mm:ss tt"))); tvShow.Add(new XElement("LockData", "false")); tvShow.Add(new XElement("Overview", series.Overview)); tvShow.Add(new XElement("LocalTitle", series.Title)); + if (series.FirstAired.HasValue) { tvShow.Add(new XElement("PremiereDate", series.FirstAired.Value.ToString("yyyy-MM-dd"))); } - //tvShow.Add(new XElement("EndDate", series.EndDate.ToString("yyyy-MM-dd"))); + tvShow.Add(new XElement("Rating", series.Ratings.Value)); - //tvShow.Add(new XElement("VoteCount", tvShow.Add(new XElement("ProductionYear", series.Year)); - //tvShow.Add(new XElement("Website", tvShow.Add(new XElement("RunningTime", series.Runtime)); tvShow.Add(new XElement("IMDB", series.ImdbId)); - //tvShow.Add(new XElement("TMDbId", - //tvShow.Add(new XElement("Zap2itId", tvShow.Add(new XElement("TVRageId", series.TvRageId)); tvShow.Add(new XElement("Genres", series.Genres.Select(genre => new XElement("Genre", genre)))); - // Studios - // Studio - // Studio - // ?? - var persons = new XElement("Persons"); foreach (var person in series.Actors) @@ -138,7 +131,7 @@ namespace NzbDrone.Core.Metadata.Consumers.MediaBrowser _logger.Debug("Saving series.xml for {0}", series.Title); - return new MetadataFileResult(Path.Combine(series.Path, "series.xml"), doc.ToString()); + return new MetadataFileResult("series.xml", doc.ToString()); } } diff --git a/src/NzbDrone.Core/Metadata/Consumers/Wdtv/WdtvMetadata.cs b/src/NzbDrone.Core/Metadata/Consumers/Wdtv/WdtvMetadata.cs index 076797c1f..260d21455 100644 --- a/src/NzbDrone.Core/Metadata/Consumers/Wdtv/WdtvMetadata.cs +++ b/src/NzbDrone.Core/Metadata/Consumers/Wdtv/WdtvMetadata.cs @@ -70,18 +70,19 @@ namespace NzbDrone.Core.Metadata.Consumers.Wdtv continue; } - var existingFilename = Path.Combine(series.Path, metadataFile.RelativePath); - newFilename = Path.Combine(series.Path, newFilename); + var existingPath = Path.Combine(series.Path, metadataFile.RelativePath); + var newPath = Path.Combine(series.Path, newFilename); - if (!newFilename.PathEquals(existingFilename)) + if (!newPath.PathEquals(existingPath)) { - _diskProvider.MoveFile(existingFilename, newFilename); - metadataFile.RelativePath = series.Path.GetRelativePath(newFilename); + _diskProvider.MoveFile(existingPath, newPath); + metadataFile.RelativePath = newFilename; updatedMetadataFiles.Add(metadataFile); } } } + return updatedMetadataFiles; } @@ -217,7 +218,7 @@ namespace NzbDrone.Core.Metadata.Consumers.Wdtv } var source = _mediaCoverService.GetCoverPath(series.Id, image.CoverType); - var destination = Path.Combine(series.Path, "folder" + Path.GetExtension(source)); + var destination = "folder" + Path.GetExtension(source); return new List { @@ -250,7 +251,7 @@ namespace NzbDrone.Core.Metadata.Consumers.Wdtv return new List(); } - var path = Path.Combine(series.Path, seasonFolder, "folder.jpg"); + var path = Path.Combine(seasonFolder, "folder.jpg"); return new List{ new ImageFileResult(path, image.Url) }; } diff --git a/src/NzbDrone.Core/Metadata/Consumers/Xbmc/XbmcMetadata.cs b/src/NzbDrone.Core/Metadata/Consumers/Xbmc/XbmcMetadata.cs index 85b561ad9..4680ad7c1 100644 --- a/src/NzbDrone.Core/Metadata/Consumers/Xbmc/XbmcMetadata.cs +++ b/src/NzbDrone.Core/Metadata/Consumers/Xbmc/XbmcMetadata.cs @@ -222,7 +222,7 @@ namespace NzbDrone.Core.Metadata.Consumers.Xbmc _logger.Debug("Saving tvshow.nfo for {0}", series.Title); - return new MetadataFileResult(Path.Combine(series.Path, "tvshow.nfo"), doc.ToString()); + return new MetadataFileResult("tvshow.nfo", doc.ToString()); } } @@ -386,7 +386,7 @@ namespace NzbDrone.Core.Metadata.Consumers.Xbmc foreach (var image in series.Images) { var source = _mediaCoverService.GetCoverPath(series.Id, image.CoverType); - var destination = Path.Combine(series.Path, image.CoverType.ToString().ToLowerInvariant() + Path.GetExtension(source)); + var destination = image.CoverType.ToString().ToLowerInvariant() + Path.GetExtension(source); yield return new ImageFileResult(destination, source); } @@ -403,7 +403,7 @@ namespace NzbDrone.Core.Metadata.Consumers.Xbmc filename = string.Format("season-specials-{0}.jpg", image.CoverType.ToString().ToLower()); } - yield return new ImageFileResult(Path.Combine(series.Path, filename), image.Url); + yield return new ImageFileResult(filename, image.Url); } } diff --git a/src/NzbDrone.Core/Metadata/MetadataService.cs b/src/NzbDrone.Core/Metadata/MetadataService.cs index 6316743d5..b516421ac 100644 --- a/src/NzbDrone.Core/Metadata/MetadataService.cs +++ b/src/NzbDrone.Core/Metadata/MetadataService.cs @@ -183,11 +183,18 @@ namespace NzbDrone.Core.Metadata { SeriesId = series.Id, Consumer = consumer.GetType().Name, - Type = MetadataType.SeriesMetadata, + Type = MetadataType.SeriesMetadata }; if (hash == metadata.Hash) { + if (seriesMetadata.RelativePath != metadata.RelativePath) + { + metadata.RelativePath = seriesMetadata.RelativePath; + + return metadata; + } + return null; } @@ -273,7 +280,7 @@ namespace NzbDrone.Core.Metadata RelativePath = image.RelativePath }; - _diskProvider.CopyFile(image.Url, image.RelativePath); + _diskProvider.CopyFile(image.Url, Path.Combine(series.Path, image.RelativePath)); _mediaFileAttributeService.SetFilePermissions(image.RelativePath); result.Add(metadata); @@ -368,16 +375,16 @@ namespace NzbDrone.Core.Metadata return result; } - private void DownloadImage(Series series, string url, string path) + private void DownloadImage(Series series, string url, string relativePath) { try { - _httpClient.DownloadFile(url, path); - _mediaFileAttributeService.SetFilePermissions(path); + _httpClient.DownloadFile(url, Path.Combine(series.Path, relativePath)); + _mediaFileAttributeService.SetFilePermissions(relativePath); } catch (WebException e) { - _logger.Warn(string.Format("Couldn't download image {0} for {1}. {2}", url, series, e.Message)); + _logger.Warn("Couldn't download image {0} for {1}. {2}", url, series, e.Message); } catch (Exception e) { diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index 9d5c545ac..2c7d66ee2 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -510,6 +510,7 @@ +