Fixed: Metadata files incorrectly stored in database

pull/2/head
Mark McDowall 8 years ago
parent 4783803b6b
commit 8e429239a8

@ -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<CleanupAbsolutePathMetadataFiles, MetadataFile>
{
[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<MetadataFile>.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<MetadataFile>.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<MetadataFile>.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<MetadataFile>.CreateNew()
.With(m => m.RelativePath = @"\\Relative\Path")
.BuildNew();
Db.Insert(file);
Subject.Clean();
AllStoredModels.Count.Should().Be(0);
}
}
}

@ -212,6 +212,7 @@
<Compile Include="HistoryTests\HistoryServiceFixture.cs" /> <Compile Include="HistoryTests\HistoryServiceFixture.cs" />
<Compile Include="Housekeeping\Housekeepers\CleanupAdditionalUsersFixture.cs" /> <Compile Include="Housekeeping\Housekeepers\CleanupAdditionalUsersFixture.cs" />
<Compile Include="Housekeeping\Housekeepers\CleanupAdditionalNamingSpecsFixture.cs" /> <Compile Include="Housekeeping\Housekeepers\CleanupAdditionalNamingSpecsFixture.cs" />
<Compile Include="Housekeeping\Housekeepers\CleanupAbsolutePathMetadataFilesFixture.cs" />
<Compile Include="Housekeeping\Housekeepers\CleanupDuplicateMetadataFilesFixture.cs" /> <Compile Include="Housekeeping\Housekeepers\CleanupDuplicateMetadataFilesFixture.cs" />
<Compile Include="Housekeeping\Housekeepers\CleanupOrphanedBlacklistFixture.cs" /> <Compile Include="Housekeeping\Housekeepers\CleanupOrphanedBlacklistFixture.cs" />
<Compile Include="Housekeeping\Housekeepers\CleanupOrphanedEpisodeFilesFixture.cs" /> <Compile Include="Housekeeping\Housekeepers\CleanupOrphanedEpisodeFilesFixture.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 '/%'
)");
}
}
}

@ -88,37 +88,30 @@ namespace NzbDrone.Core.Metadata.Consumers.MediaBrowser
tvShow.Add(new XElement("Status", series.Status)); tvShow.Add(new XElement("Status", series.Status));
tvShow.Add(new XElement("Network", series.Network)); tvShow.Add(new XElement("Network", series.Network));
tvShow.Add(new XElement("Airs_Time", series.AirTime)); tvShow.Add(new XElement("Airs_Time", series.AirTime));
//tvShow.Add(new XElement("Airs_DayOfWeek",
if (series.FirstAired.HasValue) if (series.FirstAired.HasValue)
{ {
tvShow.Add(new XElement("FirstAired", series.FirstAired.Value.ToString("yyyy-MM-dd"))); tvShow.Add(new XElement("FirstAired", series.FirstAired.Value.ToString("yyyy-MM-dd")));
} }
tvShow.Add(new XElement("ContentRating", series.Certification)); 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("Added", series.Added.ToString("MM/dd/yyyy HH:mm:ss tt")));
tvShow.Add(new XElement("LockData", "false")); tvShow.Add(new XElement("LockData", "false"));
tvShow.Add(new XElement("Overview", series.Overview)); tvShow.Add(new XElement("Overview", series.Overview));
tvShow.Add(new XElement("LocalTitle", series.Title)); tvShow.Add(new XElement("LocalTitle", series.Title));
if (series.FirstAired.HasValue) if (series.FirstAired.HasValue)
{ {
tvShow.Add(new XElement("PremiereDate", series.FirstAired.Value.ToString("yyyy-MM-dd"))); 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("Rating", series.Ratings.Value));
//tvShow.Add(new XElement("VoteCount",
tvShow.Add(new XElement("ProductionYear", series.Year)); tvShow.Add(new XElement("ProductionYear", series.Year));
//tvShow.Add(new XElement("Website",
tvShow.Add(new XElement("RunningTime", series.Runtime)); tvShow.Add(new XElement("RunningTime", series.Runtime));
tvShow.Add(new XElement("IMDB", series.ImdbId)); 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("TVRageId", series.TvRageId));
tvShow.Add(new XElement("Genres", series.Genres.Select(genre => new XElement("Genre", genre)))); tvShow.Add(new XElement("Genres", series.Genres.Select(genre => new XElement("Genre", genre))));
// Studios
// Studio
// Studio
// ??
var persons = new XElement("Persons"); var persons = new XElement("Persons");
foreach (var person in series.Actors) 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); _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());
} }
} }

@ -70,18 +70,19 @@ namespace NzbDrone.Core.Metadata.Consumers.Wdtv
continue; continue;
} }
var existingFilename = Path.Combine(series.Path, metadataFile.RelativePath); var existingPath = Path.Combine(series.Path, metadataFile.RelativePath);
newFilename = Path.Combine(series.Path, newFilename); var newPath = Path.Combine(series.Path, newFilename);
if (!newFilename.PathEquals(existingFilename)) if (!newPath.PathEquals(existingPath))
{ {
_diskProvider.MoveFile(existingFilename, newFilename); _diskProvider.MoveFile(existingPath, newPath);
metadataFile.RelativePath = series.Path.GetRelativePath(newFilename); metadataFile.RelativePath = newFilename;
updatedMetadataFiles.Add(metadataFile); updatedMetadataFiles.Add(metadataFile);
} }
} }
} }
return updatedMetadataFiles; return updatedMetadataFiles;
} }
@ -217,7 +218,7 @@ namespace NzbDrone.Core.Metadata.Consumers.Wdtv
} }
var source = _mediaCoverService.GetCoverPath(series.Id, image.CoverType); 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<ImageFileResult> return new List<ImageFileResult>
{ {
@ -250,7 +251,7 @@ namespace NzbDrone.Core.Metadata.Consumers.Wdtv
return new List<ImageFileResult>(); return new List<ImageFileResult>();
} }
var path = Path.Combine(series.Path, seasonFolder, "folder.jpg"); var path = Path.Combine(seasonFolder, "folder.jpg");
return new List<ImageFileResult>{ new ImageFileResult(path, image.Url) }; return new List<ImageFileResult>{ new ImageFileResult(path, image.Url) };
} }

@ -222,7 +222,7 @@ namespace NzbDrone.Core.Metadata.Consumers.Xbmc
_logger.Debug("Saving tvshow.nfo for {0}", series.Title); _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) foreach (var image in series.Images)
{ {
var source = _mediaCoverService.GetCoverPath(series.Id, image.CoverType); 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); 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()); 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);
} }
} }

@ -183,11 +183,18 @@ namespace NzbDrone.Core.Metadata
{ {
SeriesId = series.Id, SeriesId = series.Id,
Consumer = consumer.GetType().Name, Consumer = consumer.GetType().Name,
Type = MetadataType.SeriesMetadata, Type = MetadataType.SeriesMetadata
}; };
if (hash == metadata.Hash) if (hash == metadata.Hash)
{ {
if (seriesMetadata.RelativePath != metadata.RelativePath)
{
metadata.RelativePath = seriesMetadata.RelativePath;
return metadata;
}
return null; return null;
} }
@ -273,7 +280,7 @@ namespace NzbDrone.Core.Metadata
RelativePath = image.RelativePath RelativePath = image.RelativePath
}; };
_diskProvider.CopyFile(image.Url, image.RelativePath); _diskProvider.CopyFile(image.Url, Path.Combine(series.Path, image.RelativePath));
_mediaFileAttributeService.SetFilePermissions(image.RelativePath); _mediaFileAttributeService.SetFilePermissions(image.RelativePath);
result.Add(metadata); result.Add(metadata);
@ -368,16 +375,16 @@ namespace NzbDrone.Core.Metadata
return result; return result;
} }
private void DownloadImage(Series series, string url, string path) private void DownloadImage(Series series, string url, string relativePath)
{ {
try try
{ {
_httpClient.DownloadFile(url, path); _httpClient.DownloadFile(url, Path.Combine(series.Path, relativePath));
_mediaFileAttributeService.SetFilePermissions(path); _mediaFileAttributeService.SetFilePermissions(relativePath);
} }
catch (WebException e) 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) catch (Exception e)
{ {

@ -510,6 +510,7 @@
<Compile Include="Housekeeping\Housekeepers\CleanupAdditionalUsers.cs" /> <Compile Include="Housekeeping\Housekeepers\CleanupAdditionalUsers.cs" />
<Compile Include="Housekeeping\Housekeepers\CleanupAdditionalNamingSpecs.cs" /> <Compile Include="Housekeeping\Housekeepers\CleanupAdditionalNamingSpecs.cs" />
<Compile Include="Housekeeping\Housekeepers\CleanupCommandQueue.cs" /> <Compile Include="Housekeeping\Housekeepers\CleanupCommandQueue.cs" />
<Compile Include="Housekeeping\Housekeepers\CleanupAbsolutePathMetadataFiles.cs" />
<Compile Include="Housekeeping\Housekeepers\CleanupDuplicateMetadataFiles.cs" /> <Compile Include="Housekeeping\Housekeepers\CleanupDuplicateMetadataFiles.cs" />
<Compile Include="Housekeeping\Housekeepers\CleanupOrphanedBlacklist.cs" /> <Compile Include="Housekeeping\Housekeepers\CleanupOrphanedBlacklist.cs" />
<Compile Include="Housekeeping\Housekeepers\CleanupOrphanedEpisodeFiles.cs" /> <Compile Include="Housekeeping\Housekeepers\CleanupOrphanedEpisodeFiles.cs" />

Loading…
Cancel
Save