diff --git a/NzbDrone.Core/Providers/MediaFileProvider.cs b/NzbDrone.Core/Providers/MediaFileProvider.cs index 865835d99..3e2d58bd4 100644 --- a/NzbDrone.Core/Providers/MediaFileProvider.cs +++ b/NzbDrone.Core/Providers/MediaFileProvider.cs @@ -109,7 +109,7 @@ namespace NzbDrone.Core.Providers if (!_diskProvider.FileExists(episodeFile.Path)) { Logger.Trace("File {0} no longer exists on disk. removing from database.", episodeFile.Path); - _repository.Delete(episodeFile); + _repository.Delete(episodeFile.EpisodeFileId); } } } diff --git a/NzbDrone.Core/Providers/RenameProvider.cs b/NzbDrone.Core/Providers/RenameProvider.cs index 90c9a87c0..d85ec4bc5 100644 --- a/NzbDrone.Core/Providers/RenameProvider.cs +++ b/NzbDrone.Core/Providers/RenameProvider.cs @@ -40,14 +40,12 @@ namespace NzbDrone.Core.Providers { //Get a list of all episode files/episodes and rename them - var seasonFolder = _configProvider.GetValue("SeasonFolder", "Season %s", true); - foreach (var episodeFile in _mediaFileProvider.GetEpisodeFiles()) { var series = _seriesProvider.GetSeries(episodeFile.SeriesId); var erm = new EpisodeRenameModel(); erm.SeriesName = series.Title; - erm.Folder = series.Path + Path.DirectorySeparatorChar + seasonFolder; + erm.Folder = series.Path + Path.DirectorySeparatorChar + GetSeasonFolder(episodeFile.Episodes[0].SeasonNumber); erm.EpisodeFile = episodeFile; _epsToRename.Add(erm); StartRename(); @@ -59,13 +57,12 @@ namespace NzbDrone.Core.Providers //Get a list of all applicable episode files/episodes and rename them var series = _seriesProvider.GetSeries(seriesId); - var seasonFolder = _configProvider.GetValue("SeasonFolder", "Season %s", true); foreach (var episodeFile in _mediaFileProvider.GetEpisodeFiles().Where(s => s.SeriesId == seriesId)) { var erm = new EpisodeRenameModel(); erm.SeriesName = series.Title; - erm.Folder = series.Path + Path.DirectorySeparatorChar + seasonFolder; + erm.Folder = series.Path + Path.DirectorySeparatorChar + GetSeasonFolder(episodeFile.Episodes[0].SeasonNumber); erm.EpisodeFile = episodeFile; _epsToRename.Add(erm); StartRename(); @@ -77,13 +74,12 @@ namespace NzbDrone.Core.Providers //Get a list of all applicable episode files/episodes and rename them var season = _seasonProvider.GetSeason(seasonId); var series = _seriesProvider.GetSeries(season.SeriesId); - var seasonFolder = _configProvider.GetValue("SeasonFolder", "Season %s", true); foreach (var episodeFile in _mediaFileProvider.GetEpisodeFiles().Where(s => s.Episodes[0].SeasonId == seasonId)) { var erm = new EpisodeRenameModel(); erm.SeriesName = series.Title; - erm.Folder = series.Path + Path.DirectorySeparatorChar + seasonFolder; + erm.Folder = series.Path + Path.DirectorySeparatorChar + GetSeasonFolder(episodeFile.Episodes[0].SeasonNumber); erm.EpisodeFile = episodeFile; _epsToRename.Add(erm); StartRename(); @@ -95,13 +91,12 @@ namespace NzbDrone.Core.Providers //This will properly rename multi-episode files if asked to rename either of the episode var episode = _episodeProvider.GetEpisode(episodeId); var series = _seriesProvider.GetSeries(episode.SeriesId); - var seasonFolder = _configProvider.GetValue("SeasonFolder", "Season %s", true); var episodeFile = _mediaFileProvider.GetEpisodeFiles().Where(s => s.Episodes.Contains(episode)).FirstOrDefault(); var erm = new EpisodeRenameModel(); erm.SeriesName = series.Title; - erm.Folder = series.Path + Path.DirectorySeparatorChar + seasonFolder; + erm.Folder = series.Path + Path.DirectorySeparatorChar + GetSeasonFolder(episodeFile.Episodes[0].SeasonNumber); erm.EpisodeFile = episodeFile; _epsToRename.Add(erm); StartRename(); @@ -146,7 +141,8 @@ namespace NzbDrone.Core.Providers //Update EpisodeFile if successful Logger.Debug("Renaming Episode: {0}", Path.GetFileName(erm.EpisodeFile.Path)); var newName = GetNewName(erm); - var newFilename = erm.Folder + Path.DirectorySeparatorChar + newName; + var ext = Path.GetExtension(erm.EpisodeFile.Path); + var newFilename = erm.Folder + Path.DirectorySeparatorChar + newName + ext; if (!_diskProvider.FolderExists(erm.Folder)) _diskProvider.CreateDirectory(erm.Folder); @@ -189,5 +185,12 @@ namespace NzbDrone.Core.Providers return String.Format("{0} - S{1:00}E{2} - {3}", erm.SeriesName, erm.EpisodeFile.Episodes[0].SeasonNumber, epNumberString, epNameString); } + + private string GetSeasonFolder(int seasonNumber) + { + return + _configProvider.GetValue("SeasonFolder", "Season %s", true).Replace("%s", seasonNumber.ToString()). + Replace("%0s", seasonNumber.ToString("00")); + } } } diff --git a/NzbDrone.Web/Controllers/SeriesController.cs b/NzbDrone.Web/Controllers/SeriesController.cs index 0c4d55428..9ba560e17 100644 --- a/NzbDrone.Web/Controllers/SeriesController.cs +++ b/NzbDrone.Web/Controllers/SeriesController.cs @@ -218,7 +218,7 @@ namespace NzbDrone.Web.Controllers public ActionResult RenameSeries(int seriesId) { _renameProvider.RenameSeries(seriesId); - return RedirectToAction("Index"); + return RedirectToAction("Details", new { seriesId }); } public ActionResult RenameSeason(int seasonId) @@ -235,6 +235,15 @@ namespace NzbDrone.Web.Controllers return RedirectToAction("Index"); } + public ActionResult ReScanFiles(int seriesId) + { + var epFiles = _mediaFileProvider.GetEpisodeFiles().Where(s => s.SeriesId == seriesId).ToList(); + _mediaFileProvider.CleanUp(epFiles); + _mediaFileProvider.Scan(_seriesProvider.GetSeries(seriesId)); + + return RedirectToAction("Details", "Series", new { seriesId }); + } + //Local Helpers private string GetEpisodePath(EpisodeFile file) { diff --git a/NzbDrone.Web/Views/Series/Details.aspx b/NzbDrone.Web/Views/Series/Details.aspx index ee6f655ec..7b46d84f1 100644 --- a/NzbDrone.Web/Views/Series/Details.aspx +++ b/NzbDrone.Web/Views/Series/Details.aspx @@ -13,6 +13,7 @@ items.Add().Text("Back to Series List").Action("Index", "Series"); items.Add().Text("Scan For Episodes on Disk").Action("SyncEpisodesOnDisk", "Series", new { seriesId = Model.SeriesId }); items.Add().Text("Rename Series").Action("RenameSeries", "Series", new { seriesId = Model.SeriesId }); + items.Add().Text("Re-Scan Files").Action("ReScanFiles", "Series", new { seriesId = Model.SeriesId }); }).Render(); %>