117 lines
5.0 KiB
C#
117 lines
5.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Globalization;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using NLog;
|
|
using NzbDrone.Core.Model.Notification;
|
|
|
|
namespace NzbDrone.Core.Providers
|
|
{
|
|
public class SyncProvider : ISyncProvider
|
|
{
|
|
private readonly ISeriesProvider _seriesProvider;
|
|
private readonly IEpisodeProvider _episodeProvider;
|
|
private readonly IMediaFileProvider _mediaFileProvider;
|
|
private readonly INotificationProvider _notificationProvider;
|
|
|
|
private ProgressNotification _seriesSyncNotification;
|
|
private Thread _seriesSyncThread;
|
|
|
|
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
|
|
|
public SyncProvider(ISeriesProvider seriesProvider, IEpisodeProvider episodeProvider, IMediaFileProvider mediaFileProvider, INotificationProvider notificationProvider)
|
|
{
|
|
_seriesProvider = seriesProvider;
|
|
_episodeProvider = episodeProvider;
|
|
_mediaFileProvider = mediaFileProvider;
|
|
_notificationProvider = notificationProvider;
|
|
}
|
|
|
|
public void BeginSyncUnmappedFolders()
|
|
{
|
|
Logger.Debug("User has request series folder scan");
|
|
if (_seriesSyncThread == null || !_seriesSyncThread.IsAlive)
|
|
{
|
|
Logger.Debug("Initializing background scan of series folder.");
|
|
_seriesSyncThread = new Thread(SyncUnmappedFolders)
|
|
{
|
|
Name = "SyncUnmappedFolders",
|
|
Priority = ThreadPriority.Lowest
|
|
};
|
|
|
|
_seriesSyncThread.Start();
|
|
}
|
|
else
|
|
{
|
|
Logger.Warn("Series folder scan already in progress. Ignoring request.");
|
|
}
|
|
}
|
|
|
|
public void SyncUnmappedFolders()
|
|
{
|
|
Logger.Info("Starting Series folder scan");
|
|
|
|
try
|
|
{
|
|
using (_seriesSyncNotification = new ProgressNotification("Series Scan"))
|
|
{
|
|
_notificationProvider.Register(_seriesSyncNotification);
|
|
_seriesSyncNotification.CurrentStatus = "Analysing Folder";
|
|
var unmappedFolders = _seriesProvider.GetUnmappedFolders();
|
|
_seriesSyncNotification.ProgressMax = unmappedFolders.Count;
|
|
|
|
foreach (string seriesFolder in unmappedFolders.Values)
|
|
{
|
|
try
|
|
{
|
|
_seriesSyncNotification.CurrentStatus = String.Format("Searching For: {0}", CultureInfo.CurrentCulture.TextInfo.ToTitleCase(new DirectoryInfo(seriesFolder).Name));
|
|
|
|
Logger.Debug("Folder '{0}' isn't mapped in the database. Trying to map it.'", seriesFolder);
|
|
var mappedSeries = _seriesProvider.MapPathToSeries(seriesFolder);
|
|
|
|
if (mappedSeries == null)
|
|
{
|
|
Logger.Warn("Unable to find a matching series for '{0}'", seriesFolder);
|
|
}
|
|
else
|
|
{
|
|
//Check if series is mapped to another folder
|
|
if (_seriesProvider.GetSeries(mappedSeries.Id) == null)
|
|
{
|
|
_seriesSyncNotification.CurrentStatus = String.Format("{0}: downloading series info...", mappedSeries.SeriesName);
|
|
_seriesProvider.AddSeries(seriesFolder, mappedSeries);
|
|
_episodeProvider.RefreshEpisodeInfo(mappedSeries.Id);
|
|
_seriesSyncNotification.CurrentStatus = String.Format("{0}: finding episodes on disk...", mappedSeries.SeriesName);
|
|
_mediaFileProvider.Scan(_seriesProvider.GetSeries(mappedSeries.Id));
|
|
|
|
}
|
|
else
|
|
{
|
|
Logger.Warn("Folder '{0}' mapped to '{1}' which is already another folder assigned to it.'", seriesFolder, mappedSeries.SeriesName);
|
|
}
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Logger.ErrorException(e.Message, e);
|
|
}
|
|
_seriesSyncNotification.ProgressValue++;
|
|
}
|
|
|
|
_seriesSyncNotification.CurrentStatus = "Series Scan Completed";
|
|
Logger.Info("Series folders scan has successfully completed.");
|
|
Thread.Sleep(3000);
|
|
_seriesSyncNotification.Status = ProgressNotificationStatus.Completed;
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Logger.ErrorException(e.Message, e);
|
|
}
|
|
}
|
|
}
|
|
}
|