Now importing downloaded episodes
This commit is contained in:
parent
b8102b0d1f
commit
fb96abed49
|
@ -26,7 +26,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests
|
||||||
nzbPath = pneumaticFolder + title + ".nzb";
|
nzbPath = pneumaticFolder + title + ".nzb";
|
||||||
|
|
||||||
Mocker.GetMock<IConfigService>().SetupGet(c => c.PneumaticDirectory).Returns(pneumaticFolder);
|
Mocker.GetMock<IConfigService>().SetupGet(c => c.PneumaticDirectory).Returns(pneumaticFolder);
|
||||||
Mocker.GetMock<IConfigService>().SetupGet(c => c.DownloadClientTvDirectory).Returns(sabDrop);
|
Mocker.GetMock<IConfigService>().SetupGet(c => c.DownloadedEpisodesFolder).Returns(sabDrop);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void WithExistingFile()
|
private void WithExistingFile()
|
||||||
|
|
|
@ -99,11 +99,11 @@ namespace NzbDrone.Core.Configuration
|
||||||
set { SetValue("SabRecentTvPriority", value); }
|
set { SetValue("SabRecentTvPriority", value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public String DownloadClientTvDirectory
|
public String DownloadedEpisodesFolder
|
||||||
{
|
{
|
||||||
get { return GetValue("DownloadClientTvDirectory"); }
|
get { return GetValue("DownloadedEpisodesFolder"); }
|
||||||
|
|
||||||
set { SetValue("DownloadClientTvDirectory", value); }
|
set { SetValue("DownloadedEpisodesFolder", value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool UseSeasonFolder
|
public bool UseSeasonFolder
|
||||||
|
|
|
@ -19,7 +19,7 @@ namespace NzbDrone.Core.Configuration
|
||||||
String SabTvCategory { get; set; }
|
String SabTvCategory { get; set; }
|
||||||
SabPriorityType SabBacklogTvPriority { get; set; }
|
SabPriorityType SabBacklogTvPriority { get; set; }
|
||||||
SabPriorityType SabRecentTvPriority { get; set; }
|
SabPriorityType SabRecentTvPriority { get; set; }
|
||||||
String DownloadClientTvDirectory { get; set; }
|
String DownloadedEpisodesFolder { get; set; }
|
||||||
bool UseSeasonFolder { get; set; }
|
bool UseSeasonFolder { get; set; }
|
||||||
string SortingSeasonFolderFormat { get; set; }
|
string SortingSeasonFolderFormat { get; set; }
|
||||||
int DefaultQualityProfile { get; set; }
|
int DefaultQualityProfile { get; set; }
|
||||||
|
|
|
@ -60,7 +60,7 @@ namespace NzbDrone.Core.Download.Clients
|
||||||
logger.Trace("NZB Download succeeded, saved to: {0}", filename);
|
logger.Trace("NZB Download succeeded, saved to: {0}", filename);
|
||||||
|
|
||||||
var contents = String.Format("plugin://plugin.program.pneumatic/?mode=strm&type=add_file&nzb={0}&nzbname={1}", filename, title);
|
var contents = String.Format("plugin://plugin.program.pneumatic/?mode=strm&type=add_file&nzb={0}&nzbname={1}", filename, title);
|
||||||
_diskProvider.WriteAllText(Path.Combine(_configService.DownloadClientTvDirectory, title + ".strm"), contents);
|
_diskProvider.WriteAllText(Path.Combine(_configService.DownloadedEpisodesFolder, title + ".strm"), contents);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,4 @@ namespace NzbDrone.Core.Jobs
|
||||||
Timer.Stop();
|
Timer.Stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -38,12 +38,12 @@ namespace NzbDrone.Core.Jobs
|
||||||
{
|
{
|
||||||
new ScheduledTask{ Interval = 25, TypeName = typeof(RssSyncCommand).FullName},
|
new ScheduledTask{ Interval = 25, TypeName = typeof(RssSyncCommand).FullName},
|
||||||
new ScheduledTask{ Interval = 12*60, TypeName = typeof(UpdateXemMappings).FullName},
|
new ScheduledTask{ Interval = 12*60, TypeName = typeof(UpdateXemMappings).FullName},
|
||||||
new ScheduledTask{ Interval = 6*60, TypeName = typeof(DiskScanCommand).FullName}
|
new ScheduledTask{ Interval = 6*60, TypeName = typeof(DiskScanCommand).FullName},
|
||||||
|
new ScheduledTask{ Interval = 1, TypeName = typeof(DownloadedEpisodesScanCommand).FullName}
|
||||||
};
|
};
|
||||||
|
|
||||||
var currentTasks = _scheduledTaskRepository.All();
|
var currentTasks = _scheduledTaskRepository.All();
|
||||||
|
|
||||||
|
|
||||||
_logger.Debug("Initializing jobs. Available: {0} Existing:{1}", defaultTasks.Count(), currentTasks.Count());
|
_logger.Debug("Initializing jobs. Available: {0} Existing:{1}", defaultTasks.Count(), currentTasks.Count());
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -13,5 +13,9 @@ namespace NzbDrone.Core.MediaFiles.Commands
|
||||||
SeriesId = seriesId;
|
SeriesId = seriesId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DiskScanCommand()
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
using NzbDrone.Common.Messaging;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.MediaFiles.Commands
|
||||||
|
{
|
||||||
|
public class DownloadedEpisodesScanCommand : ICommand
|
||||||
|
{
|
||||||
|
public DownloadedEpisodesScanCommand()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,31 +2,30 @@
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Core.MediaFiles;
|
using NzbDrone.Common.Messaging;
|
||||||
|
using NzbDrone.Core.Configuration;
|
||||||
|
using NzbDrone.Core.MediaFiles.Commands;
|
||||||
using NzbDrone.Core.Parser;
|
using NzbDrone.Core.Parser;
|
||||||
using NzbDrone.Core.Tv;
|
using NzbDrone.Core.Tv;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Providers
|
namespace NzbDrone.Core.MediaFiles
|
||||||
{
|
{
|
||||||
public interface IDropFolderImportService
|
public class DownloadedEpisodesImportService : IExecute<DownloadedEpisodesScanCommand>
|
||||||
{
|
|
||||||
void ProcessDropFolder(string dropFolder);
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DropFolderImportService : IDropFolderImportService
|
|
||||||
{
|
{
|
||||||
private readonly IDiskProvider _diskProvider;
|
private readonly IDiskProvider _diskProvider;
|
||||||
private readonly IDiskScanService _diskScanService;
|
private readonly IDiskScanService _diskScanService;
|
||||||
private readonly ISeriesService _seriesService;
|
private readonly ISeriesService _seriesService;
|
||||||
private readonly IMoveEpisodeFiles _episodeFileMover;
|
private readonly IMoveEpisodeFiles _episodeFileMover;
|
||||||
private readonly IParsingService _parsingService;
|
private readonly IParsingService _parsingService;
|
||||||
|
private readonly IConfigService _configService;
|
||||||
private readonly Logger _logger;
|
private readonly Logger _logger;
|
||||||
|
|
||||||
public DropFolderImportService(IDiskProvider diskProvider,
|
public DownloadedEpisodesImportService(IDiskProvider diskProvider,
|
||||||
IDiskScanService diskScanService,
|
IDiskScanService diskScanService,
|
||||||
ISeriesService seriesService,
|
ISeriesService seriesService,
|
||||||
IMoveEpisodeFiles episodeFileMover,
|
IMoveEpisodeFiles episodeFileMover,
|
||||||
IParsingService parsingService,
|
IParsingService parsingService,
|
||||||
|
IConfigService configService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
{
|
{
|
||||||
_diskProvider = diskProvider;
|
_diskProvider = diskProvider;
|
||||||
|
@ -34,42 +33,10 @@ namespace NzbDrone.Core.Providers
|
||||||
_seriesService = seriesService;
|
_seriesService = seriesService;
|
||||||
_episodeFileMover = episodeFileMover;
|
_episodeFileMover = episodeFileMover;
|
||||||
_parsingService = parsingService;
|
_parsingService = parsingService;
|
||||||
|
_configService = configService;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void ProcessDropFolder(string dropFolder)
|
|
||||||
{
|
|
||||||
foreach (var subfolder in _diskProvider.GetDirectories(dropFolder))
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (!_seriesService.SeriesPathExists(subfolder))
|
|
||||||
{
|
|
||||||
ProcessSubFolder(new DirectoryInfo(subfolder));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
_logger.ErrorException("An error has occurred while importing folder: " + subfolder, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var videoFile in _diskScanService.GetVideoFiles(dropFolder, false))
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var series = _parsingService.GetSeries(videoFile);
|
|
||||||
ProcessVideoFile(videoFile, series);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.ErrorException("An error has occurred while importing video file" + videoFile, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO: cleanup empty folders
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ProcessSubFolder(DirectoryInfo subfolderInfo)
|
public void ProcessSubFolder(DirectoryInfo subfolderInfo)
|
||||||
{
|
{
|
||||||
if (_diskProvider.GetLastFolderWrite(subfolderInfo.FullName).AddMinutes(2) > DateTime.UtcNow)
|
if (_diskProvider.GetLastFolderWrite(subfolderInfo.FullName).AddMinutes(2) > DateTime.UtcNow)
|
||||||
|
@ -94,7 +61,6 @@ namespace NzbDrone.Core.Providers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void ProcessVideoFile(string videoFile, Series series)
|
public void ProcessVideoFile(string videoFile, Series series)
|
||||||
{
|
{
|
||||||
if (_diskProvider.GetLastFileWrite(videoFile).AddMinutes(2) > DateTime.UtcNow)
|
if (_diskProvider.GetLastFileWrite(videoFile).AddMinutes(2) > DateTime.UtcNow)
|
||||||
|
@ -117,5 +83,46 @@ namespace NzbDrone.Core.Providers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Execute(DownloadedEpisodesScanCommand message)
|
||||||
|
{
|
||||||
|
//TODO: We should also process the download client's category folder
|
||||||
|
var downloadedEpisodesFolder = _configService.DownloadedEpisodesFolder;
|
||||||
|
|
||||||
|
if (String.IsNullOrEmpty(downloadedEpisodesFolder))
|
||||||
|
{
|
||||||
|
_logger.Warn("Downloaded Episodes Folder is not configured");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var subfolder in _diskProvider.GetDirectories(downloadedEpisodesFolder))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!_seriesService.SeriesPathExists(subfolder))
|
||||||
|
{
|
||||||
|
ProcessSubFolder(new DirectoryInfo(subfolder));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
_logger.ErrorException("An error has occurred while importing folder: " + subfolder, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var videoFile in _diskScanService.GetVideoFiles(downloadedEpisodesFolder, false))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var series = _parsingService.GetSeries(videoFile);
|
||||||
|
ProcessVideoFile(videoFile, series);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.ErrorException("An error has occurred while importing video file" + videoFile, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: cleanup empty folders
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -249,6 +249,7 @@
|
||||||
<Compile Include="Lifecycle\ApplicationShutdownRequested.cs" />
|
<Compile Include="Lifecycle\ApplicationShutdownRequested.cs" />
|
||||||
<Compile Include="MediaFiles\Commands\CleanMediaFileDb.cs" />
|
<Compile Include="MediaFiles\Commands\CleanMediaFileDb.cs" />
|
||||||
<Compile Include="MediaFiles\Commands\CleanUpRecycleBinCommand.cs" />
|
<Compile Include="MediaFiles\Commands\CleanUpRecycleBinCommand.cs" />
|
||||||
|
<Compile Include="MediaFiles\Commands\DownloadedEpisodesScanCommand.cs" />
|
||||||
<Compile Include="MediaFiles\Commands\DiskScanCommand.cs" />
|
<Compile Include="MediaFiles\Commands\DiskScanCommand.cs" />
|
||||||
<Compile Include="MediaFiles\Events\EpisodeDownloadedEvent.cs" />
|
<Compile Include="MediaFiles\Events\EpisodeDownloadedEvent.cs" />
|
||||||
<Compile Include="Download\EpisodeGrabbedEvent.cs" />
|
<Compile Include="Download\EpisodeGrabbedEvent.cs" />
|
||||||
|
@ -459,7 +460,7 @@
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="ExternalNotification\PlexProvider.cs" />
|
<Compile Include="ExternalNotification\PlexProvider.cs" />
|
||||||
<Compile Include="Providers\DropfolderImportService.cs">
|
<Compile Include="MediaFiles\DownloadedEpisodesImportService.cs">
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Providers\ProwlProvider.cs">
|
<Compile Include="Providers\ProwlProvider.cs">
|
||||||
|
|
|
@ -17,12 +17,12 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label class="control-label">Unsorted TV Directory</label>
|
<label class="control-label">Downloaded Episodes Folder</label>
|
||||||
|
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<input type="text" placeholder="C:\Unsorted TV" name="downloadClientTvDirectory" class="x-path"/>
|
<input type="text" placeholder="C:\Unsorted TV" name="downloadedEpisodesFolder" class="x-path"/>
|
||||||
<span class="help-inline">
|
<span class="help-inline">
|
||||||
<i class="icon-question-sign" title="The directory where your download client downloads TV shows to."></i>
|
<i class="icon-question-sign" title="The folder where your download client downloads TV shows to."></i>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue