Fixed: Metadata files incorrectly stored in database
This commit is contained in:
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…
Reference in New Issue