You've already forked Sonarr
mirror of
https://github.com/Sonarr/Sonarr.git
synced 2025-11-06 09:19:38 +02:00
Episode renaming implemented on the Series/Details page.
This commit is contained in:
@@ -1,11 +1,9 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using NLog;
|
||||
using NzbDrone.Core.Helpers;
|
||||
using NzbDrone.Core.Model;
|
||||
using NzbDrone.Core.Model.Notification;
|
||||
using NzbDrone.Core.Providers.Core;
|
||||
using NzbDrone.Core.Repository;
|
||||
|
||||
@@ -14,7 +12,6 @@ namespace NzbDrone.Core.Providers
|
||||
public class RenameProvider
|
||||
{
|
||||
//TODO: Remove some of these dependencies. we shouldn't have a single class with dependency on the whole app!
|
||||
//TODO: Also upgrade to a job that can run on background thread.
|
||||
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
||||
private readonly ConfigProvider _configProvider;
|
||||
private readonly DiskProvider _diskProvider;
|
||||
@@ -22,10 +19,6 @@ namespace NzbDrone.Core.Providers
|
||||
private readonly MediaFileProvider _mediaFileProvider;
|
||||
private readonly SeriesProvider _seriesProvider;
|
||||
|
||||
private readonly List<EpisodeRenameModel> _epsToRename = new List<EpisodeRenameModel>();
|
||||
|
||||
private Thread _renameThread;
|
||||
|
||||
public RenameProvider(SeriesProvider seriesProvider,EpisodeProvider episodeProvider,
|
||||
MediaFileProvider mediaFileProvider, DiskProvider diskProvider,
|
||||
ConfigProvider configProvider)
|
||||
@@ -37,160 +30,35 @@ namespace NzbDrone.Core.Providers
|
||||
_configProvider = configProvider;
|
||||
}
|
||||
|
||||
public virtual void RenameAll()
|
||||
public virtual void RenameEpisodeFile(int episodeFileId, ProgressNotification notification)
|
||||
{
|
||||
//Get a list of all episode files/episodes and rename them
|
||||
|
||||
foreach (var episodeFile in _mediaFileProvider.GetEpisodeFiles())
|
||||
{
|
||||
var series = _seriesProvider.GetSeries(episodeFile.SeriesId);
|
||||
var erm = new EpisodeRenameModel { SeriesName = series.Title, Folder = series.Path };
|
||||
|
||||
if (series.SeasonFolder)
|
||||
erm.Folder += Path.DirectorySeparatorChar +
|
||||
EpisodeRenameHelper.GetSeasonFolder(episodeFile.Episodes[0].SeasonNumber,
|
||||
_configProvider.GetValue(
|
||||
"Sorting_SeasonFolderFormat", "Season %s",
|
||||
true));
|
||||
|
||||
erm.EpisodeFile = episodeFile;
|
||||
_epsToRename.Add(erm);
|
||||
StartRename();
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void RenameSeries(int seriesId)
|
||||
{
|
||||
//Get a list of all applicable episode files/episodes and rename them
|
||||
|
||||
var series = _seriesProvider.GetSeries(seriesId);
|
||||
|
||||
foreach (var episodeFile in _mediaFileProvider.GetEpisodeFiles().Where(s => s.SeriesId == seriesId))
|
||||
{
|
||||
var erm = new EpisodeRenameModel { SeriesName = series.Title, Folder = series.Path };
|
||||
|
||||
if (series.SeasonFolder)
|
||||
erm.Folder += Path.DirectorySeparatorChar +
|
||||
EpisodeRenameHelper.GetSeasonFolder(episodeFile.Episodes[0].SeasonNumber,
|
||||
_configProvider.GetValue(
|
||||
"Sorting_SeasonFolderFormat", "Season %s",
|
||||
true));
|
||||
|
||||
erm.EpisodeFile = episodeFile;
|
||||
_epsToRename.Add(erm);
|
||||
StartRename();
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void RenameSeason(int seasonId)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public virtual void RenameEpisode(int episodeId)
|
||||
{
|
||||
//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 episodeFile =
|
||||
_mediaFileProvider.GetEpisodeFiles().Where(s => s.Episodes.Contains(episode)).FirstOrDefault();
|
||||
|
||||
var erm = new EpisodeRenameModel { SeriesName = series.Title, Folder = series.Path };
|
||||
|
||||
if (series.SeasonFolder)
|
||||
erm.Folder += Path.DirectorySeparatorChar +
|
||||
EpisodeRenameHelper.GetSeasonFolder(episodeFile.Episodes[0].SeasonNumber,
|
||||
_configProvider.GetValue(
|
||||
"Sorting_SeasonFolderFormat", "Season %s", true));
|
||||
|
||||
erm.EpisodeFile = episodeFile;
|
||||
_epsToRename.Add(erm);
|
||||
StartRename();
|
||||
}
|
||||
|
||||
public virtual void RenameEpisodeFile(int episodeFileId, bool newDownload)
|
||||
{
|
||||
//This will properly rename multi-episode files if asked to rename either of the episode
|
||||
var episodeFile = _mediaFileProvider.GetEpisodeFile(episodeFileId);
|
||||
var series = _seriesProvider.GetSeries(episodeFile.Series.SeriesId);
|
||||
|
||||
var erm = new EpisodeRenameModel { SeriesName = series.Title, Folder = series.Path };
|
||||
|
||||
if (series.SeasonFolder)
|
||||
erm.Folder += Path.DirectorySeparatorChar +
|
||||
EpisodeRenameHelper.GetSeasonFolder(episodeFile.Episodes[0].SeasonNumber,
|
||||
_configProvider.GetValue(
|
||||
"Sorting_SeasonFolderFormat", "Season %s", true));
|
||||
|
||||
erm.EpisodeFile = episodeFile;
|
||||
_epsToRename.Add(erm);
|
||||
StartRename();
|
||||
}
|
||||
|
||||
private void StartRename()
|
||||
{
|
||||
Logger.Debug("Episode Rename Starting");
|
||||
if (_renameThread == null || !_renameThread.IsAlive)
|
||||
{
|
||||
Logger.Debug("Initializing background rename of episodes");
|
||||
_renameThread = new Thread(RenameProcessor)
|
||||
{
|
||||
Name = "RenameEpisodes",
|
||||
Priority = ThreadPriority.Lowest
|
||||
};
|
||||
|
||||
_renameThread.Start();
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.Warn("Episode renaming already in progress. Ignoring request.");
|
||||
}
|
||||
}
|
||||
|
||||
private void RenameProcessor()
|
||||
{
|
||||
while (_epsToRename.Count > 0)
|
||||
{
|
||||
var ep = _epsToRename.First();
|
||||
_epsToRename.RemoveAt(0);
|
||||
RenameFile(ep);
|
||||
}
|
||||
}
|
||||
|
||||
private void RenameFile(EpisodeRenameModel erm)
|
||||
{
|
||||
try
|
||||
{
|
||||
//Update EpisodeFile if successful
|
||||
Logger.Debug("Renaming Episode: {0}", Path.GetFileName(erm.EpisodeFile.Path));
|
||||
var newName = EpisodeRenameHelper.GetNewName(erm);
|
||||
var ext = Path.GetExtension(erm.EpisodeFile.Path);
|
||||
var newFilename = erm.Folder + Path.DirectorySeparatorChar + newName + ext;
|
||||
notification.CurrentMessage = String.Format("Renaming '{0}'", episodeFile.Path);
|
||||
|
||||
if (!_diskProvider.FolderExists(erm.Folder))
|
||||
_diskProvider.CreateDirectory(erm.Folder);
|
||||
var series = _seriesProvider.GetSeries(episodeFile.SeriesId);
|
||||
var folder = new FileInfo(episodeFile.Path).DirectoryName;
|
||||
var newFileName = GetNewFilename(episodeFile, series.Title);
|
||||
var newFile = folder + Path.DirectorySeparatorChar + newFileName;
|
||||
_diskProvider.RenameFile(episodeFile.Path, newFile);
|
||||
|
||||
if (erm.EpisodeFile.Path == newFilename)
|
||||
return;
|
||||
|
||||
_diskProvider.RenameFile(erm.EpisodeFile.Path, newFilename);
|
||||
erm.EpisodeFile.Path = newFilename;
|
||||
_mediaFileProvider.Update(erm.EpisodeFile);
|
||||
|
||||
throw new NotImplementedException("Rename File");
|
||||
notification.CurrentMessage = String.Format("Finished Renaming '{0}'", newFile);
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
catch (Exception e)
|
||||
{
|
||||
Logger.DebugException(ex.Message, ex);
|
||||
Logger.Warn("Unable to Rename Episode: {0}", Path.GetFileName(erm.EpisodeFile.Path));
|
||||
notification.CurrentMessage = String.Format("Failed to Rename '{0}'", episodeFile.Path);
|
||||
Logger.ErrorException("An error has occurred while renaming episode: " + episodeFile.Path, e);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public string GetNewFilename(EpisodeFile episodeFile)
|
||||
public string GetNewFilename(EpisodeFile episodeFile, string seriesName)
|
||||
{
|
||||
var episodes = _episodeProvider.EpisodesByFileId(episodeFile.EpisodeFileId);
|
||||
var series = _seriesProvider.GetSeries(episodeFile.SeriesId);
|
||||
//var series = _seriesProvider.GetSeries(episodeFile.SeriesId);
|
||||
|
||||
var separatorStyle = EpisodeSortingHelper.GetSeparatorStyle(_configProvider.SeparatorStyle);
|
||||
var numberStyle = EpisodeSortingHelper.GetNumberStyle(_configProvider.NumberStyle);
|
||||
@@ -205,7 +73,7 @@ namespace NzbDrone.Core.Providers
|
||||
{
|
||||
if (useSeriesName)
|
||||
{
|
||||
title += series.Title;
|
||||
title += seriesName;
|
||||
title += separatorStyle.Pattern;
|
||||
}
|
||||
|
||||
@@ -233,7 +101,7 @@ namespace NzbDrone.Core.Providers
|
||||
|
||||
if (useSeriesName)
|
||||
{
|
||||
title += series.Title;
|
||||
title += seriesName;
|
||||
title += separatorStyle.Pattern;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user