mirror of https://github.com/Sonarr/Sonarr
Drop folder is now wired. needs more tests.
This commit is contained in:
parent
5c45515b00
commit
1ba74e0eea
|
@ -373,6 +373,11 @@ namespace NzbDrone.Core.Test
|
||||||
.Setup(c => c.GetEpisodeBySeries(It.IsAny<long>()))
|
.Setup(c => c.GetEpisodeBySeries(It.IsAny<long>()))
|
||||||
.Returns(new List<Episode> { new Episode() });
|
.Returns(new List<Episode> { new Episode() });
|
||||||
|
|
||||||
|
|
||||||
|
mocker.GetMock<MediaFileProvider>()
|
||||||
|
.Setup(c => c.GetSeriesFiles(It.IsAny<int>()))
|
||||||
|
.Returns(new List<EpisodeFile>());
|
||||||
|
|
||||||
mocker.Resolve<DiskScanProvider>().Scan(new Series());
|
mocker.Resolve<DiskScanProvider>().Scan(new Series());
|
||||||
|
|
||||||
mocker.VerifyAllMocks();
|
mocker.VerifyAllMocks();
|
||||||
|
|
|
@ -8,7 +8,9 @@ using FluentAssertions;
|
||||||
using Moq;
|
using Moq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Core.Providers;
|
using NzbDrone.Core.Providers;
|
||||||
|
using NzbDrone.Core.Providers.Core;
|
||||||
using NzbDrone.Core.Repository;
|
using NzbDrone.Core.Repository;
|
||||||
|
using NzbDrone.Core.Repository.Quality;
|
||||||
using NzbDrone.Core.Test.Framework;
|
using NzbDrone.Core.Test.Framework;
|
||||||
using PetaPoco;
|
using PetaPoco;
|
||||||
using TvdbLib.Data;
|
using TvdbLib.Data;
|
||||||
|
@ -562,13 +564,21 @@ namespace NzbDrone.Core.Test
|
||||||
public void Add_daily_show_episodes()
|
public void Add_daily_show_episodes()
|
||||||
{
|
{
|
||||||
var mocker = new AutoMoqer();
|
var mocker = new AutoMoqer();
|
||||||
mocker.SetConstant(MockLib.GetEmptyDatabase());
|
var db = MockLib.GetEmptyDatabase();
|
||||||
|
mocker.SetConstant(db);
|
||||||
mocker.Resolve<TvDbProvider>();
|
mocker.Resolve<TvDbProvider>();
|
||||||
|
|
||||||
|
mocker.GetMock<ConfigProvider>()
|
||||||
|
.Setup(e => e.DefaultQualityProfile).Returns(1);
|
||||||
|
|
||||||
|
db.Insert(Builder<QualityProfile>.CreateNew().Build());
|
||||||
|
|
||||||
|
|
||||||
const int tvDbSeriesId = 71256;
|
const int tvDbSeriesId = 71256;
|
||||||
//act
|
//act
|
||||||
var seriesProvider = mocker.Resolve<SeriesProvider>();
|
var seriesProvider = mocker.Resolve<SeriesProvider>();
|
||||||
|
|
||||||
seriesProvider.AddSeries("c:\\test\\", tvDbSeriesId, 0);
|
seriesProvider.AddSeries("c:\\test\\", tvDbSeriesId, 1);
|
||||||
|
|
||||||
var episodeProvider = mocker.Resolve<EpisodeProvider>();
|
var episodeProvider = mocker.Resolve<EpisodeProvider>();
|
||||||
episodeProvider.RefreshEpisodeInfo(seriesProvider.GetSeries(tvDbSeriesId));
|
episodeProvider.RefreshEpisodeInfo(seriesProvider.GetSeries(tvDbSeriesId));
|
||||||
|
|
|
@ -59,10 +59,17 @@ namespace NzbDrone.Core.Test
|
||||||
public void Scan_series_should_skip_series_with_no_episodes()
|
public void Scan_series_should_skip_series_with_no_episodes()
|
||||||
{
|
{
|
||||||
var mocker = new AutoMoqer(MockBehavior.Strict);
|
var mocker = new AutoMoqer(MockBehavior.Strict);
|
||||||
|
|
||||||
mocker.GetMock<EpisodeProvider>()
|
mocker.GetMock<EpisodeProvider>()
|
||||||
.Setup(c => c.GetEpisodeBySeries(12))
|
.Setup(c => c.GetEpisodeBySeries(12))
|
||||||
.Returns(new List<Episode>());
|
.Returns(new List<Episode>());
|
||||||
|
|
||||||
|
mocker.GetMock<MediaFileProvider>()
|
||||||
|
.Setup(e => e.RepairLinks()).Returns(0);
|
||||||
|
mocker.GetMock<MediaFileProvider>()
|
||||||
|
.Setup(e => e.DeleteOrphaned()).Returns(0);
|
||||||
|
|
||||||
|
|
||||||
var series = Builder<Series>.CreateNew()
|
var series = Builder<Series>.CreateNew()
|
||||||
.With(s => s.SeriesId = 12).Build();
|
.With(s => s.SeriesId = 12).Build();
|
||||||
|
|
||||||
|
@ -97,12 +104,14 @@ namespace NzbDrone.Core.Test
|
||||||
database.InsertMany(episodes);
|
database.InsertMany(episodes);
|
||||||
|
|
||||||
//Act
|
//Act
|
||||||
mocker.Resolve<MediaFileProvider>().CleanEpisodesWithNonExistantFiles();
|
var removedLinks = mocker.Resolve<MediaFileProvider>().RepairLinks();
|
||||||
var result = database.Fetch<Episode>();
|
var result = database.Fetch<Episode>();
|
||||||
|
|
||||||
//Assert
|
//Assert
|
||||||
result.Should().HaveSameCount(episodes);
|
result.Should().HaveSameCount(episodes);
|
||||||
result.Should().OnlyContain(e => e.EpisodeFileId == 0);
|
result.Should().OnlyContain(e => e.EpisodeFileId == 0);
|
||||||
|
removedLinks.Should().Be(10);
|
||||||
|
ExceptionVerification.ExcpectedWarns(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -119,12 +128,13 @@ namespace NzbDrone.Core.Test
|
||||||
database.InsertMany(episodeFiles);
|
database.InsertMany(episodeFiles);
|
||||||
|
|
||||||
//Act
|
//Act
|
||||||
mocker.Resolve<MediaFileProvider>().DeleteOrphanedEpisodeFiles();
|
mocker.Resolve<MediaFileProvider>().DeleteOrphaned();
|
||||||
var result = database.Fetch<EpisodeFile>();
|
var result = database.Fetch<EpisodeFile>();
|
||||||
|
|
||||||
//Assert
|
//Assert
|
||||||
result.Should().HaveCount(5);
|
result.Should().HaveCount(5);
|
||||||
result.Should().OnlyContain(e => e.EpisodeFileId > 0);
|
result.Should().OnlyContain(e => e.EpisodeFileId > 0);
|
||||||
|
ExceptionVerification.ExcpectedWarns(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -53,12 +53,18 @@ namespace NzbDrone.Core.Providers
|
||||||
/// <param name="path">Path to scan</param>
|
/// <param name="path">Path to scan</param>
|
||||||
public virtual List<EpisodeFile> Scan(Series series, string path)
|
public virtual List<EpisodeFile> Scan(Series series, string path)
|
||||||
{
|
{
|
||||||
|
_mediaFileProvider.DeleteOrphaned();
|
||||||
|
_mediaFileProvider.RepairLinks();
|
||||||
|
|
||||||
if (_episodeProvider.GetEpisodeBySeries(series.SeriesId).Count == 0)
|
if (_episodeProvider.GetEpisodeBySeries(series.SeriesId).Count == 0)
|
||||||
{
|
{
|
||||||
Logger.Debug("Series {0} has no episodes. skipping", series.Title);
|
Logger.Debug("Series {0} has no episodes. skipping", series.Title);
|
||||||
return new List<EpisodeFile>();
|
return new List<EpisodeFile>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var seriesFile = _mediaFileProvider.GetSeriesFiles(series.SeriesId);
|
||||||
|
CleanUp(seriesFile);
|
||||||
|
|
||||||
var mediaFileList = GetVideoFiles(path);
|
var mediaFileList = GetVideoFiles(path);
|
||||||
var importedFiles = new List<EpisodeFile>();
|
var importedFiles = new List<EpisodeFile>();
|
||||||
|
|
||||||
|
@ -199,11 +205,8 @@ namespace NzbDrone.Core.Providers
|
||||||
/// Removes files that no longer exist on disk from the database
|
/// Removes files that no longer exist on disk from the database
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name = "files">list of files to verify</param>
|
/// <param name = "files">list of files to verify</param>
|
||||||
public virtual void CleanUp(List<EpisodeFile> files)
|
public virtual void CleanUp(IList<EpisodeFile> files)
|
||||||
{
|
{
|
||||||
_mediaFileProvider.CleanEpisodesWithNonExistantFiles();
|
|
||||||
_mediaFileProvider.DeleteOrphanedEpisodeFiles();
|
|
||||||
|
|
||||||
foreach (var episodeFile in files)
|
foreach (var episodeFile in files)
|
||||||
{
|
{
|
||||||
if (!_diskProvider.FileExists(episodeFile.Path))
|
if (!_diskProvider.FileExists(episodeFile.Path))
|
||||||
|
|
|
@ -74,24 +74,41 @@ namespace NzbDrone.Core.Providers
|
||||||
return new FileInfo(path);
|
return new FileInfo(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void CleanEpisodesWithNonExistantFiles()
|
public virtual int RepairLinks()
|
||||||
{
|
{
|
||||||
_database.Execute(@"UPDATE Episodes SET EpisodeFileId = 0
|
Logger.Debug("Verifying Episode>Episode file relationships.");
|
||||||
|
var updated = _database.Execute(@"UPDATE Episodes SET EpisodeFileId = 0
|
||||||
WHERE EpisodeFileId IN
|
WHERE EpisodeFileId IN
|
||||||
(SELECT Episodes.EpisodeFileId FROM Episodes
|
(SELECT Episodes.EpisodeFileId FROM Episodes
|
||||||
LEFT OUTER JOIN EpisodeFiles
|
LEFT OUTER JOIN EpisodeFiles
|
||||||
ON Episodes.EpisodeFileId = EpisodeFiles.EpisodeFileId
|
ON Episodes.EpisodeFileId = EpisodeFiles.EpisodeFileId
|
||||||
WHERE Episodes.EpisodeFileId > 0 AND EpisodeFiles.EpisodeFileId IS null)");
|
WHERE Episodes.EpisodeFileId > 0 AND EpisodeFiles.EpisodeFileId IS null)");
|
||||||
|
|
||||||
|
if (updated > 0)
|
||||||
|
{
|
||||||
|
Logger.Warn("Removed {0} invalid links to episode files.", updated);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void DeleteOrphanedEpisodeFiles()
|
return updated;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual int DeleteOrphaned()
|
||||||
{
|
{
|
||||||
_database.Execute(@"DELETE FROM EpisodeFiles
|
Logger.Debug("Deleting orphaned files.");
|
||||||
|
|
||||||
|
var updated = _database.Execute(@"DELETE FROM EpisodeFiles
|
||||||
WHERE EpisodeFileId IN
|
WHERE EpisodeFileId IN
|
||||||
(SELECT EpisodeFiles.EpisodeFileId FROM EpisodeFiles
|
(SELECT EpisodeFiles.EpisodeFileId FROM EpisodeFiles
|
||||||
LEFT OUTER JOIN Episodes
|
LEFT OUTER JOIN Episodes
|
||||||
ON EpisodeFiles.EpisodeFileId = Episodes.EpisodeFileId
|
ON EpisodeFiles.EpisodeFileId = Episodes.EpisodeFileId
|
||||||
WHERE Episodes.EpisodeFileId IS null)");
|
WHERE Episodes.EpisodeFileId IS null)");
|
||||||
|
|
||||||
|
if (updated > 0)
|
||||||
|
{
|
||||||
|
Logger.Warn("Removed {0} orphaned files.", updated);
|
||||||
|
}
|
||||||
|
|
||||||
|
return updated;
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual string GetNewFilename(IList<Episode> episodes, string seriesTitle, QualityTypes quality)
|
public virtual string GetNewFilename(IList<Episode> episodes, string seriesTitle, QualityTypes quality)
|
||||||
|
|
Loading…
Reference in New Issue