Cleaned up import file a bit

pull/4/head
kay.one 13 years ago
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); Logger.Trace("[{0}] appears to be a sample. skipping.", filePath);
return null; return null;
} }
//Check to see if file already exists in the database var parseResult = Parser.ParseEpisodeInfo(filePath);
if (!_database.Exists<EpisodeFile>("Path =@0", Parser.NormalizePath(filePath)))
{
var parseResult = Parser.ParseEpisodeInfo(filePath);
if (parseResult == null) if (parseResult == null)
return null; return null;
parseResult.CleanTitle = series.Title;//replaces the nasty path as title to help with logging parseResult.CleanTitle = series.Title;//replaces the nasty path as title to help with logging
//Stores the list of episodes to add to the EpisodeFile //Stores the list of episodes to add to the EpisodeFile
var episodes = new List<Episode>(); 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)
{
episodes.Add(episode);
}
else
{
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);
//Check for daily shows if (episode != null)
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);
} }
catch (Exception ex)
//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)
{ {
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…
Cancel
Save