parent
48cb5d2271
commit
d86aeb7472
@ -0,0 +1,83 @@
|
|||||||
|
using FizzWare.NBuilder;
|
||||||
|
using FluentAssertions;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation.Aggregators;
|
||||||
|
using NzbDrone.Core.Parser.Model;
|
||||||
|
using NzbDrone.Core.Test.Framework;
|
||||||
|
using NzbDrone.Core.Tv;
|
||||||
|
using NzbDrone.Test.Common;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Test.MediaFiles.EpisodeImport.Aggregation.Aggregators
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class AggregateReleaseHashFixture : CoreTest<AggregateReleaseHash>
|
||||||
|
{
|
||||||
|
private Series _series;
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
_series = Builder<Series>.CreateNew().Build();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_prefer_file()
|
||||||
|
{
|
||||||
|
var fileEpisodeInfo = Parser.Parser.ParseTitle("[DHD] Series Title! - 08 (1280x720 10bit AAC) [ABCDEFGH]");
|
||||||
|
var folderEpisodeInfo = Parser.Parser.ParseTitle("[DHD] Series Title! - 08 [12345678]");
|
||||||
|
var downloadClientEpisodeInfo = Parser.Parser.ParseTitle("[DHD] Series Title! - 08 (1280x720 10bit AAC) [ABCD1234]");
|
||||||
|
var localEpisode = new LocalEpisode
|
||||||
|
{
|
||||||
|
FileEpisodeInfo = fileEpisodeInfo,
|
||||||
|
FolderEpisodeInfo = folderEpisodeInfo,
|
||||||
|
DownloadClientEpisodeInfo = downloadClientEpisodeInfo,
|
||||||
|
Path = @"C:\Test\Unsorted TV\Series.Title.S01\Series.Title.S01E01.mkv".AsOsAgnostic(),
|
||||||
|
Series = _series
|
||||||
|
};
|
||||||
|
|
||||||
|
Subject.Aggregate(localEpisode, null);
|
||||||
|
|
||||||
|
localEpisode.ReleaseHash.Should().Be("ABCDEFGH");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_fallback_to_downloadclient()
|
||||||
|
{
|
||||||
|
var fileEpisodeInfo = Parser.Parser.ParseTitle("[DHD] Series Title! - 08 (1280x720 10bit AAC)");
|
||||||
|
var downloadClientEpisodeInfo = Parser.Parser.ParseTitle("[DHD] Series Title! - 08 (1280x720 10bit AAC) [ABCD1234]");
|
||||||
|
var folderEpisodeInfo = Parser.Parser.ParseTitle("[DHD] Series Title! - 08 [12345678]");
|
||||||
|
var localEpisode = new LocalEpisode
|
||||||
|
{
|
||||||
|
FileEpisodeInfo = fileEpisodeInfo,
|
||||||
|
FolderEpisodeInfo = folderEpisodeInfo,
|
||||||
|
DownloadClientEpisodeInfo = downloadClientEpisodeInfo,
|
||||||
|
Path = @"C:\Test\Unsorted TV\Series.Title.S01\Series.Title.S01E01.WEB-DL.mkv".AsOsAgnostic(),
|
||||||
|
Series = _series
|
||||||
|
};
|
||||||
|
|
||||||
|
Subject.Aggregate(localEpisode, null);
|
||||||
|
|
||||||
|
localEpisode.ReleaseHash.Should().Be("ABCD1234");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_fallback_to_folder()
|
||||||
|
{
|
||||||
|
var fileEpisodeInfo = Parser.Parser.ParseTitle("[DHD] Series Title! - 08 (1280x720 10bit AAC)");
|
||||||
|
var downloadClientEpisodeInfo = Parser.Parser.ParseTitle("[DHD] Series Title! - 08 (1280x720 10bit AAC)");
|
||||||
|
var folderEpisodeInfo = Parser.Parser.ParseTitle("[DHD] Series Title! - 08 [12345678]");
|
||||||
|
var localEpisode = new LocalEpisode
|
||||||
|
{
|
||||||
|
FileEpisodeInfo = fileEpisodeInfo,
|
||||||
|
FolderEpisodeInfo = folderEpisodeInfo,
|
||||||
|
DownloadClientEpisodeInfo = downloadClientEpisodeInfo,
|
||||||
|
Path = @"C:\Test\Unsorted TV\Series.Title.S01\Series.Title.S01E01.WEB-DL.mkv".AsOsAgnostic(),
|
||||||
|
Series = _series
|
||||||
|
};
|
||||||
|
|
||||||
|
Subject.Aggregate(localEpisode, null);
|
||||||
|
|
||||||
|
localEpisode.ReleaseHash.Should().Be("12345678");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,76 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Data;
|
||||||
|
using System.IO;
|
||||||
|
using Dapper;
|
||||||
|
using FluentMigrator;
|
||||||
|
using NzbDrone.Common.Extensions;
|
||||||
|
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||||
|
using NzbDrone.Core.Parser.Model;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Datastore.Migration
|
||||||
|
{
|
||||||
|
[Migration(204)]
|
||||||
|
public class add_add_release_hash : NzbDroneMigrationBase
|
||||||
|
{
|
||||||
|
protected override void MainDbUpgrade()
|
||||||
|
{
|
||||||
|
Alter.Table("EpisodeFiles").AddColumn("ReleaseHash").AsString().Nullable();
|
||||||
|
|
||||||
|
Execute.WithConnection(UpdateEpisodeFiles);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateEpisodeFiles(IDbConnection conn, IDbTransaction tran)
|
||||||
|
{
|
||||||
|
var updates = new List<object>();
|
||||||
|
|
||||||
|
using (var cmd = conn.CreateCommand())
|
||||||
|
{
|
||||||
|
cmd.Transaction = tran;
|
||||||
|
cmd.CommandText = "SELECT \"Id\", \"SceneName\", \"RelativePath\", \"OriginalFilePath\" FROM \"EpisodeFiles\"";
|
||||||
|
|
||||||
|
using var reader = cmd.ExecuteReader();
|
||||||
|
while (reader.Read())
|
||||||
|
{
|
||||||
|
var id = reader.GetInt32(0);
|
||||||
|
var sceneName = reader[1] as string;
|
||||||
|
var relativePath = reader[2] as string;
|
||||||
|
var originalFilePath = reader[3] as string;
|
||||||
|
|
||||||
|
ParsedEpisodeInfo parsedEpisodeInfo = null;
|
||||||
|
|
||||||
|
var originalTitle = sceneName;
|
||||||
|
|
||||||
|
if (originalTitle.IsNullOrWhiteSpace() && originalFilePath.IsNotNullOrWhiteSpace())
|
||||||
|
{
|
||||||
|
originalTitle = Path.GetFileNameWithoutExtension(originalFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (originalTitle.IsNotNullOrWhiteSpace())
|
||||||
|
{
|
||||||
|
parsedEpisodeInfo = Parser.Parser.ParseTitle(originalTitle);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parsedEpisodeInfo == null || parsedEpisodeInfo.ReleaseHash.IsNullOrWhiteSpace())
|
||||||
|
{
|
||||||
|
parsedEpisodeInfo = Parser.Parser.ParseTitle(Path.GetFileNameWithoutExtension(relativePath));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parsedEpisodeInfo != null && parsedEpisodeInfo.ReleaseHash.IsNotNullOrWhiteSpace())
|
||||||
|
{
|
||||||
|
updates.Add(new
|
||||||
|
{
|
||||||
|
Id = id,
|
||||||
|
ReleaseHash = parsedEpisodeInfo.ReleaseHash
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (updates.Count > 0)
|
||||||
|
{
|
||||||
|
var updateEpisodeFilesSql = "UPDATE \"EpisodeFiles\" SET \"ReleaseHash\" = @ReleaseHash WHERE \"Id\" = @Id";
|
||||||
|
conn.Execute(updateEpisodeFilesSql, updates, transaction: tran);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
using NzbDrone.Common.Extensions;
|
||||||
|
using NzbDrone.Core.Download;
|
||||||
|
using NzbDrone.Core.Parser.Model;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation.Aggregators
|
||||||
|
{
|
||||||
|
public class AggregateReleaseHash : IAggregateLocalEpisode
|
||||||
|
{
|
||||||
|
public int Order => 1;
|
||||||
|
|
||||||
|
public LocalEpisode Aggregate(LocalEpisode localEpisode, DownloadClientItem downloadClientItem)
|
||||||
|
{
|
||||||
|
var releaseHash = GetReleaseHash(localEpisode.FileEpisodeInfo);
|
||||||
|
|
||||||
|
if (releaseHash.IsNullOrWhiteSpace())
|
||||||
|
{
|
||||||
|
releaseHash = GetReleaseHash(localEpisode.DownloadClientEpisodeInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (releaseHash.IsNullOrWhiteSpace())
|
||||||
|
{
|
||||||
|
releaseHash = GetReleaseHash(localEpisode.FolderEpisodeInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
localEpisode.ReleaseHash = releaseHash;
|
||||||
|
|
||||||
|
return localEpisode;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetReleaseHash(ParsedEpisodeInfo episodeInfo)
|
||||||
|
{
|
||||||
|
// ReleaseHash doesn't make sense for a FullSeason, since hashes should be specific to a file
|
||||||
|
if (episodeInfo == null || episodeInfo.FullSeason)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return episodeInfo.ReleaseHash;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue