mirror of https://github.com/Sonarr/Sonarr
Cleaned up import file a bit
This commit is contained in:
parent
d3f823734e
commit
cfcb9e61d7
|
@ -129,19 +129,16 @@ namespace NzbDrone.Core.Test
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[Description("Verifies that a new file imported properly")]
|
public void import_existing_season_file_should_skip()
|
||||||
public void import_existing_season_file()
|
|
||||||
{
|
{
|
||||||
//Arrange
|
//Arrange
|
||||||
/////////////////////////////////////////
|
/////////////////////////////////////////
|
||||||
|
|
||||||
//Constants
|
//Constants
|
||||||
const string fileName = @"WEEDS.S03E01.DUAL.BDRip.XviD.AC3.-HELLYWOOD.avi";
|
const string fileName = @"WEEDS.S03E01.DUAL.BDRip.XviD.AC3.-HELLYWOOD.avi";
|
||||||
const int size = 12345;
|
|
||||||
|
|
||||||
//Fakes
|
//Fakes
|
||||||
var fakeSeries = Builder<Series>.CreateNew().Build();
|
var fakeSeries = Builder<Series>.CreateNew().Build();
|
||||||
var fakeEpisodeFile = Builder<EpisodeFile>.CreateNew().With(s => s.SeriesId = fakeSeries.SeriesId).Build();
|
|
||||||
|
|
||||||
//Mocks
|
//Mocks
|
||||||
var mocker = new AutoMoqer();
|
var mocker = new AutoMoqer();
|
||||||
|
@ -149,10 +146,6 @@ namespace NzbDrone.Core.Test
|
||||||
mocker.GetMock<IDatabase>(MockBehavior.Strict)
|
mocker.GetMock<IDatabase>(MockBehavior.Strict)
|
||||||
.Setup(r => r.Exists<EpisodeFile>(It.IsAny<string>(), It.IsAny<object>())).Returns(true).Verifiable();
|
.Setup(r => r.Exists<EpisodeFile>(It.IsAny<string>(), It.IsAny<object>())).Returns(true).Verifiable();
|
||||||
|
|
||||||
mocker.GetMock<DiskProvider>()
|
|
||||||
.Setup(e => e.GetSize(fileName)).Returns(size).Verifiable();
|
|
||||||
|
|
||||||
|
|
||||||
//Act
|
//Act
|
||||||
var result = mocker.Resolve<MediaFileProvider>().ImportFile(fakeSeries, fileName);
|
var result = mocker.Resolve<MediaFileProvider>().ImportFile(fakeSeries, fileName);
|
||||||
|
|
||||||
|
@ -232,33 +225,23 @@ namespace NzbDrone.Core.Test
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[Description("Verifies that an existing file will skip import")]
|
|
||||||
public void import_existing_file()
|
public void import_existing_file()
|
||||||
{
|
{
|
||||||
//Arrange
|
|
||||||
/////////////////////////////////////////
|
|
||||||
|
|
||||||
//Constants
|
|
||||||
const string fileName = "WEEDS.S03E01-06.DUAL.BDRip.XviD.AC3.-HELLYWOOD.avi";
|
const string fileName = "WEEDS.S03E01-06.DUAL.BDRip.XviD.AC3.-HELLYWOOD.avi";
|
||||||
|
|
||||||
//Fakes
|
|
||||||
var fakeSeries = Builder<Series>.CreateNew().Build();
|
var fakeSeries = Builder<Series>.CreateNew().Build();
|
||||||
|
|
||||||
//Mocks
|
|
||||||
var mocker = new AutoMoqer();
|
var mocker = new AutoMoqer();
|
||||||
mocker.GetMock<IDatabase>(MockBehavior.Strict)
|
mocker.GetMock<IDatabase>(MockBehavior.Strict)
|
||||||
.Setup(r => r.Exists<EpisodeFile>(It.IsAny<string>(), It.IsAny<object>())).Returns(true).Verifiable();
|
.Setup(r => r.Exists<EpisodeFile>(It.IsAny<string>(), It.IsAny<object>())).Returns(true).Verifiable();
|
||||||
|
|
||||||
mocker.GetMock<EpisodeProvider>(MockBehavior.Strict);
|
mocker.GetMock<EpisodeProvider>(MockBehavior.Strict);
|
||||||
mocker.GetMock<DiskProvider>()
|
|
||||||
.Setup(e => e.GetSize(fileName)).Returns(500000).Verifiable();
|
|
||||||
|
|
||||||
|
|
||||||
//Act
|
//Act
|
||||||
var result = mocker.Resolve<MediaFileProvider>().ImportFile(fakeSeries, fileName);
|
var result = mocker.Resolve<MediaFileProvider>().ImportFile(fakeSeries, fileName);
|
||||||
|
|
||||||
//Assert
|
//Assert
|
||||||
Assert.IsNull(result);
|
result.Should().BeNull();
|
||||||
mocker.GetMock<IDatabase>().Verify(r => r.Insert(result), Times.Never());
|
mocker.GetMock<IDatabase>().Verify(r => r.Insert(result), Times.Never());
|
||||||
mocker.VerifyAllMocks();
|
mocker.VerifyAllMocks();
|
||||||
}
|
}
|
||||||
|
@ -296,7 +279,7 @@ namespace NzbDrone.Core.Test
|
||||||
|
|
||||||
//Assert
|
//Assert
|
||||||
mocker.VerifyAllMocks();
|
mocker.VerifyAllMocks();
|
||||||
Assert.IsNull(result);
|
result.Should().BeNull();
|
||||||
mocker.GetMock<IDatabase>().Verify(r => r.Insert(result), Times.Never());
|
mocker.GetMock<IDatabase>().Verify(r => r.Insert(result), Times.Never());
|
||||||
ExceptionVerification.ExcpectedWarns(1);
|
ExceptionVerification.ExcpectedWarns(1);
|
||||||
}
|
}
|
||||||
|
@ -311,7 +294,7 @@ namespace NzbDrone.Core.Test
|
||||||
|
|
||||||
mocker.GetMock<EpisodeProvider>()
|
mocker.GetMock<EpisodeProvider>()
|
||||||
.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.Resolve<MediaFileProvider>().Scan(new Series());
|
mocker.Resolve<MediaFileProvider>().Scan(new Series());
|
||||||
|
|
||||||
|
@ -319,7 +302,7 @@ namespace NzbDrone.Core.Test
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void get_series_files()
|
public void get_series_files()
|
||||||
{
|
{
|
||||||
|
|
|
@ -69,98 +69,90 @@ namespace NzbDrone.Core.Providers
|
||||||
{
|
{
|
||||||
Logger.Trace("Importing file to database [{0}]", filePath);
|
Logger.Trace("Importing file to database [{0}]", filePath);
|
||||||
|
|
||||||
try
|
if (_database.Exists<EpisodeFile>("Path =@0", Parser.NormalizePath(filePath)))
|
||||||
{
|
{
|
||||||
var size = _diskProvider.GetSize(filePath);
|
Logger.Trace("[{0}] already exists in the database. skipping.", filePath);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var size = _diskProvider.GetSize(filePath);
|
||||||
|
|
||||||
//If Size is less than 50MB and contains sample. Check for Size to ensure its not an episode with sample in the title
|
//If Size is less than 50MB and contains sample. Check for Size to ensure its not an episode with sample in the title
|
||||||
if (size < 40000000 && filePath.ToLower().Contains("sample"))
|
if (size < 40000000 && filePath.ToLower().Contains("sample"))
|
||||||
|
{
|
||||||
|
Logger.Trace("[{0}] appears to be a sample. skipping.", filePath);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var parseResult = Parser.ParseEpisodeInfo(filePath);
|
||||||
|
|
||||||
|
if (parseResult == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
parseResult.CleanTitle = series.Title;//replaces the nasty path as title to help with logging
|
||||||
|
|
||||||
|
//Stores the list of episodes to add to the EpisodeFile
|
||||||
|
var episodes = new List<Episode>();
|
||||||
|
|
||||||
|
//Check for daily shows
|
||||||
|
if (parseResult.EpisodeNumbers == null)
|
||||||
|
{
|
||||||
|
var episode = _episodeProvider.GetEpisode(series.SeriesId, parseResult.AirDate.Date);
|
||||||
|
|
||||||
|
if (episode != null)
|
||||||
{
|
{
|
||||||
Logger.Trace("[{0}] appears to be a sample. skipping.", filePath);
|
episodes.Add(episode);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
//Check to see if file already exists in the database
|
|
||||||
if (!_database.Exists<EpisodeFile>("Path =@0", Parser.NormalizePath(filePath)))
|
|
||||||
{
|
{
|
||||||
var parseResult = Parser.ParseEpisodeInfo(filePath);
|
Logger.Warn("Unable to find [{0}] in the database.[{1}]", parseResult, filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (var episodeNumber in parseResult.EpisodeNumbers)
|
||||||
|
{
|
||||||
|
var episode = _episodeProvider.GetEpisode(series.SeriesId, parseResult.SeasonNumber,
|
||||||
|
episodeNumber);
|
||||||
|
|
||||||
if (parseResult == null)
|
if (episode != null)
|
||||||
return null;
|
|
||||||
|
|
||||||
parseResult.CleanTitle = series.Title;//replaces the nasty path as title to help with logging
|
|
||||||
|
|
||||||
//Stores the list of episodes to add to the EpisodeFile
|
|
||||||
var episodes = new List<Episode>();
|
|
||||||
|
|
||||||
//Check for daily shows
|
|
||||||
if (parseResult.EpisodeNumbers == null)
|
|
||||||
{
|
{
|
||||||
var episode = _episodeProvider.GetEpisode(series.SeriesId, parseResult.AirDate.Date);
|
episodes.Add(episode);
|
||||||
|
|
||||||
if (episode != null)
|
|
||||||
{
|
|
||||||
episodes.Add(episode);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Logger.Warn("Unable to find [{0}] in the database.[{1}]", parseResult, filePath);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
foreach (var episodeNumber in parseResult.EpisodeNumbers)
|
Logger.Warn("Unable to find [{0}] in the database.[{1}]", parseResult, filePath);
|
||||||
{
|
|
||||||
var episode = _episodeProvider.GetEpisode(series.SeriesId, parseResult.SeasonNumber,
|
|
||||||
episodeNumber);
|
|
||||||
|
|
||||||
if (episode != null)
|
|
||||||
{
|
|
||||||
episodes.Add(episode);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Logger.Warn("Unable to find [{0}] in the database.[{1}]", parseResult, filePath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Return null if no Episodes exist in the DB for the parsed episodes from file
|
|
||||||
if (episodes.Count <= 0)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
var episodeFile = new EpisodeFile();
|
|
||||||
episodeFile.DateAdded = DateTime.Now;
|
|
||||||
episodeFile.SeriesId = series.SeriesId;
|
|
||||||
episodeFile.Path = Parser.NormalizePath(filePath);
|
|
||||||
episodeFile.Size = size;
|
|
||||||
episodeFile.Quality = parseResult.Quality.QualityType;
|
|
||||||
episodeFile.Proper = parseResult.Quality.Proper;
|
|
||||||
episodeFile.SeasonNumber = parseResult.SeasonNumber;
|
|
||||||
var fileId = Convert.ToInt32(_database.Insert(episodeFile));
|
|
||||||
|
|
||||||
//This is for logging + updating the episodes that are linked to this EpisodeFile
|
|
||||||
string episodeList = String.Empty;
|
|
||||||
foreach (var ep in episodes)
|
|
||||||
{
|
|
||||||
ep.EpisodeFileId = fileId;
|
|
||||||
_episodeProvider.UpdateEpisode(ep);
|
|
||||||
episodeList += String.Format(", {0}", ep.EpisodeId).Trim(' ', ',');
|
|
||||||
}
|
|
||||||
Logger.Trace("File {0}:{1} attached to episode(s): '{2}'", episodeFile.EpisodeFileId, filePath,
|
|
||||||
episodeList);
|
|
||||||
|
|
||||||
return episodeFile;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Logger.Trace("[{0}] already exists in the database. skipping.", filePath);
|
//Return null if no Episodes exist in the DB for the parsed episodes from file
|
||||||
}
|
if (episodes.Count <= 0)
|
||||||
catch (Exception ex)
|
return null;
|
||||||
|
|
||||||
|
var episodeFile = new EpisodeFile();
|
||||||
|
episodeFile.DateAdded = DateTime.Now;
|
||||||
|
episodeFile.SeriesId = series.SeriesId;
|
||||||
|
episodeFile.Path = Parser.NormalizePath(filePath);
|
||||||
|
episodeFile.Size = size;
|
||||||
|
episodeFile.Quality = parseResult.Quality.QualityType;
|
||||||
|
episodeFile.Proper = parseResult.Quality.Proper;
|
||||||
|
episodeFile.SeasonNumber = parseResult.SeasonNumber;
|
||||||
|
var fileId = Convert.ToInt32(_database.Insert(episodeFile));
|
||||||
|
|
||||||
|
//This is for logging + updating the episodes that are linked to this EpisodeFile
|
||||||
|
string episodeList = String.Empty;
|
||||||
|
foreach (var ep in episodes)
|
||||||
{
|
{
|
||||||
Logger.ErrorException("An error has occurred while importing file " + filePath, ex);
|
ep.EpisodeFileId = fileId;
|
||||||
throw;
|
_episodeProvider.UpdateEpisode(ep);
|
||||||
|
episodeList += String.Format(", {0}", ep.EpisodeId).Trim(' ', ',');
|
||||||
}
|
}
|
||||||
return null;
|
Logger.Trace("File {0}:{1} attached to episode(s): '{2}'", episodeFile.EpisodeFileId, filePath,
|
||||||
|
episodeList);
|
||||||
|
|
||||||
|
return episodeFile;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -311,7 +303,7 @@ namespace NzbDrone.Core.Providers
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual string GetNewFilename(IList<Episode> episodes, string seriesName, QualityTypes quality)
|
public virtual string GetNewFilename(IList<Episode> episodes, string seriesTitle, QualityTypes quality)
|
||||||
{
|
{
|
||||||
var separatorStyle = EpisodeSortingHelper.GetSeparatorStyle(_configProvider.SeparatorStyle);
|
var separatorStyle = EpisodeSortingHelper.GetSeparatorStyle(_configProvider.SeparatorStyle);
|
||||||
var numberStyle = EpisodeSortingHelper.GetNumberStyle(_configProvider.NumberStyle);
|
var numberStyle = EpisodeSortingHelper.GetNumberStyle(_configProvider.NumberStyle);
|
||||||
|
@ -322,7 +314,7 @@ namespace NzbDrone.Core.Providers
|
||||||
|
|
||||||
if (_configProvider.SeriesName)
|
if (_configProvider.SeriesName)
|
||||||
{
|
{
|
||||||
result += seriesName + separatorStyle.Pattern;
|
result += seriesTitle + separatorStyle.Pattern;
|
||||||
}
|
}
|
||||||
|
|
||||||
result += numberStyle.Pattern.Replace("%0e", String.Format("{0:00}", episodes[0].EpisodeNumber));
|
result += numberStyle.Pattern.Replace("%0e", String.Format("{0:00}", episodes[0].EpisodeNumber));
|
||||||
|
@ -369,25 +361,36 @@ namespace NzbDrone.Core.Providers
|
||||||
return result.Trim();
|
return result.Trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual FileInfo CalculateFilePath(Series series, int seasonNumber, string fileName, string extention)
|
||||||
|
{
|
||||||
|
var path = series.Path;
|
||||||
|
if (series.SeasonFolder)
|
||||||
|
{
|
||||||
|
path = Path.Combine(path, "Season " + seasonNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
path = Path.Combine(path, fileName + extention);
|
||||||
|
|
||||||
|
return new FileInfo(path);
|
||||||
|
}
|
||||||
|
|
||||||
public virtual bool RenameEpisodeFile(EpisodeFile episodeFile)
|
public virtual bool RenameEpisodeFile(EpisodeFile episodeFile)
|
||||||
{
|
{
|
||||||
if (episodeFile == null)
|
if (episodeFile == null)
|
||||||
throw new ArgumentNullException("episodeFile");
|
throw new ArgumentNullException("episodeFile");
|
||||||
|
|
||||||
var series = _seriesProvider.GetSeries(episodeFile.SeriesId);
|
var series = _seriesProvider.GetSeries(episodeFile.SeriesId);
|
||||||
var folder = new FileInfo(episodeFile.Path).DirectoryName;
|
|
||||||
var ext = _diskProvider.GetExtension(episodeFile.Path);
|
var ext = _diskProvider.GetExtension(episodeFile.Path);
|
||||||
var episodes = _episodeProvider.GetEpisodesByFileId(episodeFile.EpisodeFileId);
|
var episodes = _episodeProvider.GetEpisodesByFileId(episodeFile.EpisodeFileId);
|
||||||
|
|
||||||
var newFileName = GetNewFilename(episodes, series.Title, episodeFile.Quality);
|
var newFileName = GetNewFilename(episodes, series.Title, episodeFile.Quality);
|
||||||
|
|
||||||
var newFile = folder + Path.DirectorySeparatorChar + newFileName + ext;
|
var newFile = CalculateFilePath(series, episodes.First().SeasonNumber, newFileName, ext);
|
||||||
|
|
||||||
//Do the rename
|
//Do the rename
|
||||||
_diskProvider.RenameFile(episodeFile.Path, newFile);
|
_diskProvider.RenameFile(episodeFile.Path, newFile.FullName);
|
||||||
|
|
||||||
//Update the filename in the DB
|
//Update the filename in the DB
|
||||||
episodeFile.Path = newFile;
|
episodeFile.Path = newFile.FullName;
|
||||||
Update(episodeFile);
|
Update(episodeFile);
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue