From 33ebf1bf787adff6e85162c4dd995431d34a4bc5 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 27 Feb 2014 08:51:31 -0800 Subject: [PATCH] New: Rename all selected series from the series editor --- .../Commands/RenameSeriesCommand.cs | 22 ++++++++++++ .../MediaFiles/RenameEpisodeFileService.cs | 19 ++++++++-- src/NzbDrone.Core/NzbDrone.Core.csproj | 1 + src/NzbDrone.Core/Tv/SeriesService.cs | 7 +++- .../Series/Editor/Rename/RenameSeriesView.js | 36 +++++++++++++++++++ .../Rename/RenameSeriesViewTemplate.html | 23 ++++++++++++ .../Series/Editor/SeriesEditorFooterView.js | 16 ++++++++- .../SeriesEditorFooterViewTemplate.html | 1 + src/UI/Series/series.less | 12 ++++++- 9 files changed, 132 insertions(+), 5 deletions(-) create mode 100644 src/NzbDrone.Core/MediaFiles/Commands/RenameSeriesCommand.cs create mode 100644 src/UI/Series/Editor/Rename/RenameSeriesView.js create mode 100644 src/UI/Series/Editor/Rename/RenameSeriesViewTemplate.html diff --git a/src/NzbDrone.Core/MediaFiles/Commands/RenameSeriesCommand.cs b/src/NzbDrone.Core/MediaFiles/Commands/RenameSeriesCommand.cs new file mode 100644 index 000000000..e50cc18e0 --- /dev/null +++ b/src/NzbDrone.Core/MediaFiles/Commands/RenameSeriesCommand.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using NzbDrone.Core.Messaging.Commands; + +namespace NzbDrone.Core.MediaFiles.Commands +{ + public class RenameSeriesCommand : Command + { + public List SeriesIds { get; set; } + + public override bool SendUpdatesToClient + { + get + { + return true; + } + } + + public RenameSeriesCommand() + { + } + } +} \ No newline at end of file diff --git a/src/NzbDrone.Core/MediaFiles/RenameEpisodeFileService.cs b/src/NzbDrone.Core/MediaFiles/RenameEpisodeFileService.cs index 6195f5d3a..315bd7894 100644 --- a/src/NzbDrone.Core/MediaFiles/RenameEpisodeFileService.cs +++ b/src/NzbDrone.Core/MediaFiles/RenameEpisodeFileService.cs @@ -21,7 +21,8 @@ namespace NzbDrone.Core.MediaFiles } public class RenameEpisodeFileService : IRenameEpisodeFileService, - IExecute + IExecute, + IExecute { private readonly ISeriesService _seriesService; private readonly IMediaFileService _mediaFileService; @@ -145,7 +146,21 @@ namespace NzbDrone.Core.MediaFiles _logger.ProgressInfo("Renaming {0} files for {1}", episodeFiles.Count, series.Title); RenameFiles(episodeFiles, series); - _logger.ProgressInfo("Selected Episode Files renamed for {0}", series.Title); + _logger.ProgressInfo("Selected episode files renamed for {0}", series.Title); + } + + public void Execute(RenameSeriesCommand message) + { + _logger.Trace("Renaming all files for selected series"); + var seriesToRename = _seriesService.GetSeries(message.SeriesIds); + + foreach (var series in seriesToRename) + { + var episodeFiles = _mediaFileService.GetFilesBySeries(series.Id); + _logger.ProgressInfo("Renaming all files in series: {0}", series.Title); + RenameFiles(episodeFiles, series); + _logger.ProgressInfo("All episode files renamed for {0}", series.Title); + } } } } diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index 78cacb406..166fee736 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -308,6 +308,7 @@ + diff --git a/src/NzbDrone.Core/Tv/SeriesService.cs b/src/NzbDrone.Core/Tv/SeriesService.cs index eeaa24054..9ddbb9428 100644 --- a/src/NzbDrone.Core/Tv/SeriesService.cs +++ b/src/NzbDrone.Core/Tv/SeriesService.cs @@ -4,7 +4,6 @@ using System.IO; using System.Linq; using NLog; using NzbDrone.Common.EnsureThat; -using NzbDrone.Core.Configuration; using NzbDrone.Core.DataAugmentation.Scene; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Organizer; @@ -15,6 +14,7 @@ namespace NzbDrone.Core.Tv public interface ISeriesService { Series GetSeries(int seriesId); + List GetSeries(IEnumerable seriesIds); Series AddSeries(Series newSeries); Series FindByTvdbId(int tvdbId); Series FindByTvRageId(int tvRageId); @@ -58,6 +58,11 @@ namespace NzbDrone.Core.Tv return _seriesRepository.Get(seriesId); } + public List GetSeries(IEnumerable seriesIds) + { + return _seriesRepository.Get(seriesIds).ToList(); + } + public Series AddSeries(Series newSeries) { Ensure.That(newSeries, () => newSeries).IsNotNull(); diff --git a/src/UI/Series/Editor/Rename/RenameSeriesView.js b/src/UI/Series/Editor/Rename/RenameSeriesView.js new file mode 100644 index 000000000..c573433bf --- /dev/null +++ b/src/UI/Series/Editor/Rename/RenameSeriesView.js @@ -0,0 +1,36 @@ +'use strict'; +define( + [ + 'underscore', + 'vent', + 'backbone', + 'marionette', + 'Commands/CommandController' + ], function (_, vent, Backbone, Marionette, CommandController) { + + return Marionette.ItemView.extend({ + template: 'Series/Editor/Rename/RenameSeriesViewTemplate', + + events: { + 'click .x-confirm-rename': '_rename' + }, + + initialize: function (options) { + this.series = options.series; + + this.templateHelpers = { numberOfSeries: this.series.length, series: new Backbone.Collection(this.series).toJSON() }; + }, + + _rename: function () { + var seriesIds = _.pluck(this.series, 'id'); + + CommandController.Execute('renameSeries', { + name : 'renameSeries', + seriesIds : seriesIds + }); + + this.trigger('seriesRenamed'); + vent.trigger(vent.Commands.CloseModalCommand); + } + }); + }); diff --git a/src/UI/Series/Editor/Rename/RenameSeriesViewTemplate.html b/src/UI/Series/Editor/Rename/RenameSeriesViewTemplate.html new file mode 100644 index 000000000..e9c2e58c7 --- /dev/null +++ b/src/UI/Series/Editor/Rename/RenameSeriesViewTemplate.html @@ -0,0 +1,23 @@ + + + diff --git a/src/UI/Series/Editor/SeriesEditorFooterView.js b/src/UI/Series/Editor/SeriesEditorFooterView.js index 3d8993ece..cf02a09f1 100644 --- a/src/UI/Series/Editor/SeriesEditorFooterView.js +++ b/src/UI/Series/Editor/SeriesEditorFooterView.js @@ -10,6 +10,7 @@ define( 'AddSeries/RootFolders/RootFolderCollection', 'Shared/Toolbar/ToolbarLayout', 'AddSeries/RootFolders/RootFolderLayout', + 'Series/Editor/Rename/RenameSeriesView', 'Config' ], function (_, Marionette, @@ -20,6 +21,7 @@ define( RootFolders, ToolbarLayout, RootFolderLayout, + RenameSeriesView, Config) { return Marionette.ItemView.extend({ template: 'Series/Editor/SeriesEditorFooterViewTemplate', @@ -31,12 +33,14 @@ define( rootFolder : '.x-root-folder', selectedCount : '.x-selected-count', saveButton : '.x-save', + renameButton : '.x-rename', container : '.series-editor-footer' }, events: { 'click .x-save' : '_updateAndSave', - 'change .x-root-folder': '_rootFolderChanged' + 'change .x-root-folder': '_rootFolderChanged', + 'click .x-rename' : '_rename' }, templateHelpers: function () { @@ -115,6 +119,7 @@ define( this.ui.seasonFolder.attr('disabled', ''); this.ui.rootFolder.attr('disabled', ''); this.ui.saveButton.attr('disabled', ''); + this.ui.renameButton.attr('disabled', ''); } else { @@ -123,6 +128,7 @@ define( this.ui.seasonFolder.removeAttr('disabled', ''); this.ui.rootFolder.removeAttr('disabled', ''); this.ui.saveButton.removeAttr('disabled', ''); + this.ui.renameButton.removeAttr('disabled', ''); } }, @@ -154,6 +160,14 @@ define( model.trigger('backgrid:select', model, false); model.edited = false; }); + }, + + _rename: function () { + var selected = this.editorGrid.getSelectedModels(); + var renameSeriesView = new RenameSeriesView({ series: selected }); + this.listenToOnce(renameSeriesView, 'seriesRenamed', this._afterSave); + + vent.trigger(vent.Commands.OpenModalCommand, renameSeriesView); } }); }); diff --git a/src/UI/Series/Editor/SeriesEditorFooterViewTemplate.html b/src/UI/Series/Editor/SeriesEditorFooterViewTemplate.html index ad5b16e14..88a1d382c 100644 --- a/src/UI/Series/Editor/SeriesEditorFooterViewTemplate.html +++ b/src/UI/Series/Editor/SeriesEditorFooterViewTemplate.html @@ -45,6 +45,7 @@ 0 series selected + \ No newline at end of file diff --git a/src/UI/Series/series.less b/src/UI/Series/series.less index 78a1098fa..c20cd0f76 100644 --- a/src/UI/Series/series.less +++ b/src/UI/Series/series.less @@ -302,7 +302,7 @@ //Editor .series-editor-footer { - width: 1100px; + width: 1160px; color: #f5f5f5; margin-left: auto; margin-right: auto; @@ -310,6 +310,16 @@ .selected-count { margin-right: 10px; } + + .row { + margin-left: -40px; + } +} + +.rename-series-modal { + .selected-series { + margin-top: 15px; + } } //Series Details