diff --git a/NzbDrone.Core/Providers/DiskProvider.cs b/NzbDrone.Core/Providers/DiskProvider.cs index 2ffdb4111..f41c9e724 100644 --- a/NzbDrone.Core/Providers/DiskProvider.cs +++ b/NzbDrone.Core/Providers/DiskProvider.cs @@ -37,6 +37,11 @@ namespace NzbDrone.Core.Providers return Directory.CreateDirectory(path).FullName; } + public void DeleteFile(string path) + { + File.Delete(path); + } + #endregion } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/EpisodeProvider.cs b/NzbDrone.Core/Providers/EpisodeProvider.cs index 4f8c4f17e..62b768c88 100644 --- a/NzbDrone.Core/Providers/EpisodeProvider.cs +++ b/NzbDrone.Core/Providers/EpisodeProvider.cs @@ -21,7 +21,6 @@ namespace NzbDrone.Core.Providers private readonly IQualityProvider _quality; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - public EpisodeProvider(IRepository sonicRepo, ISeriesProvider seriesProvider, ISeasonProvider seasonProvider, ITvDbProvider tvDbProvider, IHistoryProvider history, IQualityProvider quality) { _sonicRepo = sonicRepo; @@ -262,6 +261,11 @@ namespace NzbDrone.Core.Providers Logger.Debug("Finished episode refresh for series:{0}. Successful:{1} - Failed:{2} ", targetSeries.SeriesName, successCount, failCount); } + public void DeleteEpisode(int episodeId) + { + _sonicRepo.Delete(episodeId); + } + private bool IsSeasonIgnored(EpisodeModel episode) { //Check if this Season is ignored diff --git a/NzbDrone.Core/Providers/IDiskProvider.cs b/NzbDrone.Core/Providers/IDiskProvider.cs index bf6bf1d9a..b15967fac 100644 --- a/NzbDrone.Core/Providers/IDiskProvider.cs +++ b/NzbDrone.Core/Providers/IDiskProvider.cs @@ -11,5 +11,6 @@ namespace NzbDrone.Core.Providers string[] GetFiles(string path, string pattern, SearchOption searchOption); bool FileExists(string path); long GetSize(string path); + void DeleteFile(string path); } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/IEpisodeProvider.cs b/NzbDrone.Core/Providers/IEpisodeProvider.cs index 77b193184..17c70ddce 100644 --- a/NzbDrone.Core/Providers/IEpisodeProvider.cs +++ b/NzbDrone.Core/Providers/IEpisodeProvider.cs @@ -22,5 +22,6 @@ namespace NzbDrone.Core.Providers void RefreshEpisodeInfo(int seriesId); void RefreshEpisodeInfo(Season season); IList GetEpisodeBySeason(long seasonId); + void DeleteEpisode(int episodeId); } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/IMediaFileProvider.cs b/NzbDrone.Core/Providers/IMediaFileProvider.cs index c9c19ed9d..da4c0404a 100644 --- a/NzbDrone.Core/Providers/IMediaFileProvider.cs +++ b/NzbDrone.Core/Providers/IMediaFileProvider.cs @@ -13,5 +13,7 @@ namespace NzbDrone.Core.Providers EpisodeFile ImportFile(Series series, string filePath); string GenerateEpisodePath(EpisodeModel episode); + void DeleteFromDb(int fileId); + void DeleteFromDisk(int fileId, string path); } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/ISeasonProvider.cs b/NzbDrone.Core/Providers/ISeasonProvider.cs index 3be25f3ed..20b8ffcb9 100644 --- a/NzbDrone.Core/Providers/ISeasonProvider.cs +++ b/NzbDrone.Core/Providers/ISeasonProvider.cs @@ -12,5 +12,6 @@ namespace NzbDrone.Core.Providers int SaveSeason(Season season); bool IsIgnored(int seasonId); bool IsIgnored(int seriesId, int seasonNumber); + void DeleteSeason(int seasonId); } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/ISeriesProvider.cs b/NzbDrone.Core/Providers/ISeriesProvider.cs index 3cd13b37d..ced49f977 100644 --- a/NzbDrone.Core/Providers/ISeriesProvider.cs +++ b/NzbDrone.Core/Providers/ISeriesProvider.cs @@ -25,5 +25,6 @@ namespace NzbDrone.Core.Providers Series FindSeries(string cleanTitle); bool QualityWanted(int seriesId, QualityTypes quality); void UpdateSeries(Series series); + void DeleteSeries(int seriesId); } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/MediaFileProvider.cs b/NzbDrone.Core/Providers/MediaFileProvider.cs index 07aadc607..030b35fdf 100644 --- a/NzbDrone.Core/Providers/MediaFileProvider.cs +++ b/NzbDrone.Core/Providers/MediaFileProvider.cs @@ -112,6 +112,17 @@ namespace NzbDrone.Core.Providers return String.Format(episodeNamePattern, episode.SeriesTitle, episode.EpisodeNumber, episode.SeasonNumber, episode.EpisodeTitle, episode.Quality); } + public void DeleteFromDb(int fileId) + { + _repository.Delete(fileId); + } + + public void DeleteFromDisk(int fileId, string path) + { + _diskProvider.DeleteFile(path); + _repository.Delete(fileId); + } + private List GetMediaFileList(string path) { Logger.Debug("Scanning '{0}' for episodes", path); diff --git a/NzbDrone.Core/Providers/SeasonProvider.cs b/NzbDrone.Core/Providers/SeasonProvider.cs index c43f0a194..f43418503 100644 --- a/NzbDrone.Core/Providers/SeasonProvider.cs +++ b/NzbDrone.Core/Providers/SeasonProvider.cs @@ -71,5 +71,10 @@ namespace NzbDrone.Core.Providers Logger.Debug("Season: {0} is not wanted for Series: {1}", seasonNumber, seriesId); return true; } + + public void DeleteSeason(int seasonId) + { + _sonicRepo.Delete(seasonId); + } } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/SeriesProvider.cs b/NzbDrone.Core/Providers/SeriesProvider.cs index f419bef0b..bc4ff2c3c 100644 --- a/NzbDrone.Core/Providers/SeriesProvider.cs +++ b/NzbDrone.Core/Providers/SeriesProvider.cs @@ -22,9 +22,11 @@ namespace NzbDrone.Core.Providers private readonly IRepository _sonioRepo; private readonly ITvDbProvider _tvDb; private readonly IQualityProvider _quality; + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - public SeriesProvider(IDiskProvider diskProvider, IConfigProvider configProvider, IRepository dataRepository, ITvDbProvider tvDbProvider, IQualityProvider quality) + public SeriesProvider(IDiskProvider diskProvider, IConfigProvider configProvider, + IRepository dataRepository, ITvDbProvider tvDbProvider, IQualityProvider quality) { _diskProvider = diskProvider; _config = configProvider; @@ -122,6 +124,26 @@ namespace NzbDrone.Core.Providers _sonioRepo.Update(series); } + public void DeleteSeries(int seriesId) + { + var series = _sonioRepo.Single(seriesId); + + //Delete Files, Episdes, Seasons then the Series + //Can't use providers because episode provider needs series provider - Cyclic Dependency Injection, this will work + + Logger.Debug("Deleting EpisodeFiles from DB for Series: {0}", series.SeriesId); + _sonioRepo.DeleteMany(series.Files); + + Logger.Debug("Deleting Episodes from DB for Series: {0}", series.SeriesId); + _sonioRepo.DeleteMany(series.Episodes); + + Logger.Debug("Deleting Seasons from DB for Series: {0}", series.SeriesId); + _sonioRepo.DeleteMany(series.Seasons); + + Logger.Debug("Deleting Series from DB {0}", series.Title); + _sonioRepo.Delete(seriesId); + } + #endregion #region Static Helpers diff --git a/NzbDrone.Web/Controllers/SeriesController.cs b/NzbDrone.Web/Controllers/SeriesController.cs index 3b70edc79..35640e59a 100644 --- a/NzbDrone.Web/Controllers/SeriesController.cs +++ b/NzbDrone.Web/Controllers/SeriesController.cs @@ -181,5 +181,13 @@ namespace NzbDrone.Web.Controllers _seriesProvider.UpdateSeries(series); return Content("Series Updated Successfully"); } + + public ActionResult Delete(int seriesId) + { + //Need to add seriesProvider.Update + _seriesProvider.DeleteSeries(seriesId); + + return RedirectToAction("Index", "Series"); + } } }