diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DiskStationProxyBase.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DiskStationProxyBase.cs index 7a6538970..edaa2ebf6 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DiskStationProxyBase.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DiskStationProxyBase.cs @@ -49,7 +49,7 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation.Proxies { if (retries == 5) { - throw new DownloadClientException("Try to process same request more than 5 times"); + throw new DownloadClientException("Try to process request to {0} with {1} more than 5 times", api, arguments.ToJson().ToString()); } if (!_authenticated && api != DiskStationApi.Info && api != DiskStationApi.DSMInfo) @@ -72,15 +72,21 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation.Proxies } else { + var msg = $"Failed to {operation}. Reason: {responseContent.Error.GetMessage(api)}"; + _logger.Error(msg); + if (responseContent.Error.SessionError) { _authenticated = false; - return ProcessRequest(api, arguments, settings, operation, method, retries++); - } - - var msg = $"Failed to {operation}. Reason: {responseContent.Error.GetMessage(api)}"; - _logger.Error(msg); + if (responseContent.Error.Code == 105) + { + throw new DownloadClientAuthenticationException(msg); + } + + return ProcessRequest(api, arguments, settings, operation, method, ++retries); + } + throw new DownloadClientException(msg); } } diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs index d3161c428..79d0f042b 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/TorrentDownloadStation.cs @@ -282,7 +282,17 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation { try { - var downloadDir = GetDownloadDirectory(); + var downloadDir = GetDefaultDir(); + + if (downloadDir == null) + { + return new NzbDroneValidationFailure(nameof(Settings.TvDirectory), "No default destination") + { + DetailedDescription = $"You must login into your Diskstation as {Settings.Username} and manually set it up into DownloadStation settings under BT/HTTP/FTP/NZB -> Location." + }; + } + + downloadDir = GetDownloadDirectory(); if (downloadDir != null) { @@ -295,7 +305,7 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation { return new NzbDroneValidationFailure(fieldName, $"Shared folder does not exist") { - DetailedDescription = $"The DownloadStation does not have a Shared Folder with the name '{sharedFolder}', are you sure you specified it correctly?" + DetailedDescription = $"The Diskstation does not have a Shared Folder with the name '{sharedFolder}', are you sure you specified it correctly?" }; } @@ -310,6 +320,11 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation return null; } + catch (DownloadClientAuthenticationException ex) // User could not have permission to access to downloadstation + { + _logger.Error(ex); + return new NzbDroneValidationFailure(string.Empty, ex.Message); + } catch (Exception ex) { _logger.Error(ex); diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs index 65b6c0440..3348077d2 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/UsenetDownloadStation.cs @@ -195,7 +195,17 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation { try { - var downloadDir = GetDownloadDirectory(); + var downloadDir = GetDefaultDir(); + + if (downloadDir == null) + { + return new NzbDroneValidationFailure(nameof(Settings.TvDirectory), "No default destination") + { + DetailedDescription = $"You must login into your Diskstation as {Settings.Username} and manually set it up into DownloadStation settings under BT/HTTP/FTP/NZB -> Location." + }; + } + + downloadDir = GetDownloadDirectory(); if (downloadDir != null) { @@ -208,7 +218,7 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation { return new NzbDroneValidationFailure(fieldName, $"Shared folder does not exist") { - DetailedDescription = $"The DownloadStation does not have a Shared Folder with the name '{sharedFolder}', are you sure you specified it correctly?" + DetailedDescription = $"The Diskstation does not have a Shared Folder with the name '{sharedFolder}', are you sure you specified it correctly?" }; } @@ -223,6 +233,11 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation return null; } + catch (DownloadClientAuthenticationException ex) // User could not have permission to access to downloadstation + { + _logger.Error(ex); + return new NzbDroneValidationFailure(string.Empty, ex.Message); + } catch (Exception ex) { _logger.Error(ex); diff --git a/src/NzbDrone.Core/MediaFiles/UpgradeMediaFileService.cs b/src/NzbDrone.Core/MediaFiles/UpgradeMediaFileService.cs index fb00c5c89..53dcd6462 100644 --- a/src/NzbDrone.Core/MediaFiles/UpgradeMediaFileService.cs +++ b/src/NzbDrone.Core/MediaFiles/UpgradeMediaFileService.cs @@ -36,42 +36,34 @@ namespace NzbDrone.Core.MediaFiles _logger = logger; } - public MovieFileMoveResult UpgradeMovieFile(MovieFile episodeFile, LocalMovie localEpisode, bool copyOnly = false) + public MovieFileMoveResult UpgradeMovieFile(MovieFile movieFile, LocalMovie localMovie, bool copyOnly = false) { - _logger.Trace("Upgrading existing episode file."); + _logger.Trace("Upgrading existing movie file."); var moveFileResult = new MovieFileMoveResult(); - localEpisode.Movie.MovieFile.LazyLoad(); - var existingFile = localEpisode.Movie.MovieFile; - existingFile.LazyLoad(); - if (existingFile.IsLoaded && existingFile.Value != null) + var existingFile = localMovie.Movie.MovieFile.Value; + + if (existingFile != null) { - var file = existingFile.Value; - var episodeFilePath = Path.Combine(localEpisode.Movie.Path, file.RelativePath); + var movieFilePath = Path.Combine(localMovie.Movie.Path, existingFile.RelativePath); - if (_diskProvider.FileExists(episodeFilePath)) + if (_diskProvider.FileExists(movieFilePath)) { - _logger.Debug("Removing existing episode file: {0}", file); - _recycleBinProvider.DeleteFile(episodeFilePath); + _logger.Debug("Removing existing movie file: {0}", existingFile); + _recycleBinProvider.DeleteFile(movieFilePath); } - moveFileResult.OldFiles.Add(file); - _mediaFileService.Delete(file, DeleteMediaFileReason.Upgrade); + moveFileResult.OldFiles.Add(existingFile); + _mediaFileService.Delete(existingFile, DeleteMediaFileReason.Upgrade); } - else - { - //_logger.Warn("The existing movie file was not lazy loaded."); - } - - if (copyOnly) { - moveFileResult.MovieFile = _movieFileMover.CopyMovieFile(episodeFile, localEpisode); + moveFileResult.MovieFile = _movieFileMover.CopyMovieFile(movieFile, localMovie); } else { - moveFileResult.MovieFile= _movieFileMover.MoveMovieFile(episodeFile, localEpisode); + moveFileResult.MovieFile = _movieFileMover.MoveMovieFile(movieFile, localMovie); } return moveFileResult; diff --git a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs index 8ff95a672..dda6e2e6d 100644 --- a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs +++ b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs @@ -31,17 +31,17 @@ namespace NzbDrone.Core.Notifications.CustomScript { var movie = message.Movie; var remoteMovie = message.RemoteMovie; - var releaseGroup = remoteMovie.ParsedMovieInfo.ReleaseGroup; var environmentVariables = new StringDictionary(); environmentVariables.Add("Radarr_EventType", "Grab"); environmentVariables.Add("Radarr_Movie_Id", movie.Id.ToString()); environmentVariables.Add("Radarr_Movie_Title", movie.Title); - environmentVariables.Add("Radarr_Movie_ImdbId", movie.ImdbId.ToString()); + environmentVariables.Add("Radarr_Movie_ImdbId", movie.ImdbId); + environmentVariables.Add("Radarr_Movie_TmdbId", movie.TmdbId.ToString()); environmentVariables.Add("Radarr_Release_Title", remoteMovie.Release.Title); environmentVariables.Add("Radarr_Release_Indexer", remoteMovie.Release.Indexer); environmentVariables.Add("Radarr_Release_Size", remoteMovie.Release.Size.ToString()); - environmentVariables.Add("Radarr_Release_ReleaseGroup", releaseGroup); + environmentVariables.Add("Radarr_Release_ReleaseGroup", remoteMovie.ParsedMovieInfo.ReleaseGroup ?? string.Empty); ExecuteScript(environmentVariables); } @@ -57,7 +57,8 @@ namespace NzbDrone.Core.Notifications.CustomScript environmentVariables.Add("Radarr_Movie_Id", movie.Id.ToString()); environmentVariables.Add("Radarr_Movie_Title", movie.Title); environmentVariables.Add("Radarr_Movie_Path", movie.Path); - environmentVariables.Add("Radarr_Movie_ImdbId", movie.ImdbId.ToString()); + environmentVariables.Add("Radarr_Movie_ImdbId", movie.ImdbId); + environmentVariables.Add("Radarr_Movie_TmdbId", movie.TmdbId.ToString()); environmentVariables.Add("Radarr_MovieFile_Id", movieFile.Id.ToString()); environmentVariables.Add("Radarr_MovieFile_RelativePath", movieFile.RelativePath); environmentVariables.Add("Radarr_MovieFile_Path", Path.Combine(movie.Path, movieFile.RelativePath)); @@ -79,7 +80,9 @@ namespace NzbDrone.Core.Notifications.CustomScript environmentVariables.Add("Radarr_Movie_Id", movie.Id.ToString()); environmentVariables.Add("Radarr_Movie_Title", movie.Title); environmentVariables.Add("Radarr_Movie_Path", movie.Path); - environmentVariables.Add("Radarr_Movie_TvdbId", movie.ImdbId.ToString()); + environmentVariables.Add("Radarr_Movie_ImdbId", movie.ImdbId); + environmentVariables.Add("Radarr_Movie_TmdbId", movie.TmdbId.ToString()); + ExecuteScript(environmentVariables); } diff --git a/src/UI/Movies/Index/MoviesIndexLayout.js b/src/UI/Movies/Index/MoviesIndexLayout.js index f50f01f9f..fbd998c48 100644 --- a/src/UI/Movies/Index/MoviesIndexLayout.js +++ b/src/UI/Movies/Index/MoviesIndexLayout.js @@ -1,467 +1,476 @@ -var _ = require('underscore'); -var Marionette = require('marionette'); -var Backgrid = require('backgrid'); -var PosterCollectionView = require('./Posters/SeriesPostersCollectionView'); -var ListCollectionView = require('./Overview/SeriesOverviewCollectionView'); -var EmptyView = require('./EmptyView'); -var MoviesCollection = require('../MoviesCollection'); -var FullMovieCollection = require('../FullMovieCollection'); -var InCinemasCell = require('../../Cells/InCinemasCell'); -var MovieTitleCell = require('../../Cells/MovieTitleCell'); -var TemplatedCell = require('../../Cells/TemplatedCell'); -var ProfileCell = require('../../Cells/ProfileCell'); -var MovieLinksCell = require('../../Cells/MovieLinksCell'); -var MovieActionCell = require('../../Cells/MovieActionCell'); -var MovieStatusCell = require('../../Cells/MovieStatusCell'); -var MovieDownloadStatusCell = require('../../Cells/MovieDownloadStatusCell'); -var DownloadedQualityCell = require('../../Cells/DownloadedQualityCell'); -var FooterView = require('./FooterView'); -var GridPager = require('../../Shared/Grid/Pager'); -var FooterModel = require('./FooterModel'); -var ToolbarLayout = require('../../Shared/Toolbar/ToolbarLayout'); -require('../../Mixins/backbone.signalr.mixin'); - -//var MoviesCollectionClient = require('../MoviesCollectionClient'); - - -//this variable prevents double fetching the FullMovieCollection on first load -//var shownOnce = false; -//require('../Globals'); -window.shownOnce = false; -module.exports = Marionette.Layout.extend({ - template : 'Movies/Index/MoviesIndexLayoutTemplate', - - regions : { - seriesRegion : '#x-series', - toolbar : '#x-toolbar', - toolbar2 : '#x-toolbar2', - footer : '#x-series-footer', - pager : "#x-movie-pager", - pagerTop : "#x-movie-pager-top" - }, - - columns : [ - { - name : 'status', - label : '', - cell : MovieStatusCell - }, - { - name : 'title', - label : 'Title', - cell : MovieTitleCell, - cellValue : 'this', - }, - { - name : "downloadedQuality", - label : "Downloaded", - cell : DownloadedQualityCell, - sortable : true - }, - { - name : 'profileId', - label : 'Profile', - cell : ProfileCell - }, - { - name : 'inCinemas', - label : 'In Cinemas', - cell : InCinemasCell - }, - { - name : 'this', - label : 'Links', - cell : MovieLinksCell, - className : "movie-links-cell", - sortable : false, - }, - { - name : "this", - label : "Status", - cell : MovieDownloadStatusCell, - sortable : false, - sortValue : function(m, k) { - if (m.get("downloaded")) { - return -1; - } - return 0; - } - }, - { - name : 'this', - label : '', - sortable : false, - cell : MovieActionCell - } - ], - - leftSideButtons : { - type : 'default', - storeState : false, - collapse : true, - items : [ - { - title : 'Add Movie', - icon : 'icon-sonarr-add', - route : 'addmovies' - }, - { - title : 'Movie Editor', - icon : 'icon-sonarr-edit', - route : 'movieeditor' - }, - { - title : 'RSS Sync', - icon : 'icon-sonarr-rss', - command : 'rsssync', - errorMessage : 'RSS Sync Failed!' - }, - { - title : 'Update Library', - icon : 'icon-sonarr-refresh', - command : 'refreshmovie', - successMessage : 'Library was updated!', - errorMessage : 'Library update failed!' - } - ] - }, - - initialize : function() { - //this variable prevents us from showing the list before seriesCollection has been fetched the first time - this.seriesCollection = MoviesCollection;//.clone(); - this.seriesCollection.bindSignalR(); - - this.listenTo(FullMovieCollection, 'sync', function() { - this._showFooter(); - }); - - this.listenTo(this.seriesCollection, 'sync', function(model, collection, options) { - this._renderView(); - //MoviesCollectionClient.fetch(); - }); - this.listenTo(this.seriesCollection, "change", function(model) { - if (model.get('saved')) { - model.set('saved', false); - this.seriesCollection.fetch(); - //FullMovieCollection.fetch({reset : true }); - //this._showFooter(); - var m = FullMovieCollection.findWhere( { tmdbId : model.get('tmdbId') }); - m.set('monitored', model.get('monitored')); - m.set('minimumAvailability', model.get('minimumAvailability')); - m.set( {profileId : model.get('profileId') } ); - - this._showFooter(); - } - }); - - - this.listenTo(this.seriesCollection, 'remove', function(model, collection, options) { - if (model.get('deleted')) { - this.seriesCollection.fetch(); //need to do this so that the page shows a full page and the 'total records' number is updated - //FullMovieCollection.fetch({reset : true}); //need to do this to update the footer - FullMovieCollection.remove(model); - this._showFooter(); - } - - }); - - this.sortingOptions = { - type : 'sorting', - storeState : false, - viewCollection : this.seriesCollection, - callback : this._sort, - items : [ - { - title : 'Title', - name : 'title' - }, +var _ = require('underscore'); +var Marionette = require('marionette'); +var Backgrid = require('backgrid'); +var PosterCollectionView = require('./Posters/SeriesPostersCollectionView'); +var ListCollectionView = require('./Overview/SeriesOverviewCollectionView'); +var EmptyView = require('./EmptyView'); +var MoviesCollection = require('../MoviesCollection'); + +var FullMovieCollection = require('../FullMovieCollection'); +var InCinemasCell = require('../../Cells/InCinemasCell'); + +var RelativeDateCell = require('../../Cells/RelativeDateCell'); + +var MovieTitleCell = require('../../Cells/MovieTitleCell'); +var TemplatedCell = require('../../Cells/TemplatedCell'); +var ProfileCell = require('../../Cells/ProfileCell'); +var MovieLinksCell = require('../../Cells/MovieLinksCell'); +var MovieActionCell = require('../../Cells/MovieActionCell'); +var MovieStatusCell = require('../../Cells/MovieStatusCell'); +var MovieDownloadStatusCell = require('../../Cells/MovieDownloadStatusCell'); +var DownloadedQualityCell = require('../../Cells/DownloadedQualityCell'); +var FooterView = require('./FooterView'); +var GridPager = require('../../Shared/Grid/Pager'); +var FooterModel = require('./FooterModel'); +var ToolbarLayout = require('../../Shared/Toolbar/ToolbarLayout'); +require('../../Mixins/backbone.signalr.mixin'); + +//var MoviesCollectionClient = require('../MoviesCollectionClient'); + + +//this variable prevents double fetching the FullMovieCollection on first load +//var shownOnce = false; +//require('../Globals'); +window.shownOnce = false; +module.exports = Marionette.Layout.extend({ + template : 'Movies/Index/MoviesIndexLayoutTemplate', + + regions : { + seriesRegion : '#x-series', + toolbar : '#x-toolbar', + toolbar2 : '#x-toolbar2', + footer : '#x-series-footer', + pager : "#x-movie-pager", + pagerTop : "#x-movie-pager-top" + }, + + columns : [ + { + name : 'status', + label : '', + cell : MovieStatusCell + }, + { + name : 'title', + label : 'Title', + cell : MovieTitleCell, + cellValue : 'this', + }, + { + name : 'added', + label : 'Date Added', + cell : RelativeDateCell + }, + { + name : "downloadedQuality", + label : "Downloaded", + cell : DownloadedQualityCell, + sortable : true + }, + { + name : 'profileId', + label : 'Profile', + cell : ProfileCell + }, + { + name : 'inCinemas', + label : 'In Cinemas', + cell : RelativeDateCell + }, + { + name : 'this', + label : 'Links', + cell : MovieLinksCell, + className : "movie-links-cell", + sortable : false, + }, + { + name : "this", + label : "Status", + cell : MovieDownloadStatusCell, + sortable : false, + sortValue : function(m, k) { + if (m.get("downloaded")) { + return -1; + } + return 0; + } + }, + { + name : 'this', + label : '', + sortable : false, + cell : MovieActionCell + } + ], + + leftSideButtons : { + type : 'default', + storeState : false, + collapse : true, + items : [ + { + title : 'Add Movie', + icon : 'icon-sonarr-add', + route : 'addmovies' + }, + { + title : 'Movie Editor', + icon : 'icon-sonarr-edit', + route : 'movieeditor' + }, + { + title : 'RSS Sync', + icon : 'icon-sonarr-rss', + command : 'rsssync', + errorMessage : 'RSS Sync Failed!' + }, + { + title : 'Update Library', + icon : 'icon-sonarr-refresh', + command : 'refreshmovie', + successMessage : 'Library was updated!', + errorMessage : 'Library update failed!' + } + ] + }, + + initialize : function() { + //this variable prevents us from showing the list before seriesCollection has been fetched the first time + this.seriesCollection = MoviesCollection;//.clone(); + this.seriesCollection.bindSignalR(); + + this.listenTo(FullMovieCollection, 'sync', function() { + this._showFooter(); + }); + + this.listenTo(this.seriesCollection, 'sync', function(model, collection, options) { + this._renderView(); + //MoviesCollectionClient.fetch(); + }); + this.listenTo(this.seriesCollection, "change", function(model) { + if (model.get('saved')) { + model.set('saved', false); + this.seriesCollection.fetch(); + //FullMovieCollection.fetch({reset : true }); + //this._showFooter(); + var m = FullMovieCollection.findWhere( { tmdbId : model.get('tmdbId') }); + m.set('monitored', model.get('monitored')); + m.set('minimumAvailability', model.get('minimumAvailability')); + m.set( {profileId : model.get('profileId') } ); + + this._showFooter(); + } + }); + + + this.listenTo(this.seriesCollection, 'remove', function(model, collection, options) { + if (model.get('deleted')) { + this.seriesCollection.fetch(); //need to do this so that the page shows a full page and the 'total records' number is updated + //FullMovieCollection.fetch({reset : true}); //need to do this to update the footer + FullMovieCollection.remove(model); + this._showFooter(); + } + + }); + + this.sortingOptions = { + type : 'sorting', + storeState : false, + viewCollection : this.seriesCollection, + callback : this._sort, + items : [ { - title: 'Downloaded', + title : 'Title', + name : 'title' + }, + { + title: 'Downloaded', name: 'downloadedQuality' - }, - { - title : 'Profile', - name : 'profileId' - }, - { - title : 'In Cinemas', - name : 'inCinemas' - }, - /*{ - title : "Status", - name : "status", - }*/ - ] - }; - - this.filteringOptions = { - type : 'radio', - storeState : true, - menuKey : 'series.filterMode', - defaultAction : 'all', - items : [ - { - key : 'all', - title : '', - tooltip : 'All', - icon : 'icon-sonarr-all', - callback : this._setFilter - }, - { - key : 'monitored', - title : '', - tooltip : 'Monitored Only', - icon : 'icon-sonarr-monitored', - callback : this._setFilter - }, - { - key : 'missing', - title : '', - tooltip : 'Missing Only', - icon : 'icon-sonarr-missing', - callback : this._setFilter - }, - { - key : 'released', - title : '', - tooltip : 'Released', - icon : 'icon-sonarr-movie-released', - callback : this._setFilter - }, - { - key : 'announced', - title : '', - tooltip : 'Announced', - icon : 'icon-sonarr-movie-announced', - callback : this._setFilter - }, - { - key : 'cinemas', - title : '', - tooltip : 'In Cinemas', - icon : 'icon-sonarr-movie-cinemas', - callback : this._setFilter - } - ] - }; - - this.viewButtons = { - type : 'radio', - storeState : true, - menuKey : 'seriesViewMode', - defaultAction : 'listView', - items : [ - { - key : 'posterView', - title : '', - tooltip : 'Posters', - icon : 'icon-sonarr-view-poster', - callback : this._showPosters - }, - { - key : 'listView', - title : '', - tooltip : 'Overview List', - icon : 'icon-sonarr-view-list', - callback : this._showList - }, - { - key : 'tableView', - title : '', - tooltip : 'Table', - icon : 'icon-sonarr-view-table', - callback : this._showTable - } - ] - }; - }, - - onShow : function() { - this._showToolbar(); - this._fetchCollection(); - if (window.shownOnce) { - this._showFooter(); - } - window.shownOnce = true; - }, - - _showTable : function() { - this.currentView = new Backgrid.Grid({ - collection : this.seriesCollection, - columns : this.columns, - className : 'table table-hover' - }); - - this._showPager(); - this._renderView(); - }, - - _showList : function() { - //this.current = "list"; - this.currentView = new ListCollectionView({ - collection : this.seriesCollection - }); - - this._renderView(); - }, - - _showPosters : function() { - this.currentView = new PosterCollectionView({ - collection : this.seriesCollection - }); - - this._renderView(); - }, - - _sort : function() { - console.warn("Sorting"); - }, - - _renderView : function() { - if (MoviesCollection.length === 0) { - this.seriesRegion.show(new EmptyView()); - - this.toolbar.close(); - this.toolbar2.close(); - } else { - this.renderedOnce = true; - this.seriesRegion.show(this.currentView); - this.listenTo(this.currentView.collection, 'sync', function(eventName){ - this._showPager(); - }); - this._showToolbar(); - } - }, - - _fetchCollection : function() { - this.seriesCollection.fetch(); - }, - - _setFilter : function(buttonContext) { - var mode = buttonContext.model.get('key'); - this.seriesCollection.setFilterMode(mode); - }, - - _showToolbar : function() { - if (this.toolbar.currentView) { - return; - } - - this.toolbar2.show(new ToolbarLayout({ - right : [ - this.filteringOptions - ], - context : this - })); - - this.toolbar.show(new ToolbarLayout({ - right : [ - this.sortingOptions, - this.viewButtons - ], - left : [ - this.leftSideButtons - ], - context : this - })); - }, - - _showPager : function() { - var pager = new GridPager({ - columns : this.columns, - collection : this.seriesCollection, - }); - var pagerTop = new GridPager({ - columns : this.columns, - collection : this.seriesCollection, - }); - this.pager.show(pager); - this.pagerTop.show(pagerTop); - }, - - _showFooter : function() { - var footerModel = new FooterModel(); - var movies = FullMovieCollection.models.length; - //instead of all the counters could do something like this with different query in the where... - //var releasedMovies = FullMovieCollection.where({ 'released' : this.model.get('released') }); - // releasedMovies.length - - var announced = 0; - var incinemas = 0; - var released = 0; - - var monitored = 0; - - var downloaded =0; - var missingMonitored=0; - var missingNotMonitored=0; - var missingMonitoredNotAvailable=0; - var missingMonitoredAvailable=0; - - var downloadedMonitored=0; - var downloadedNotMonitored=0; - - _.each(FullMovieCollection.models, function(model) { - - if (model.get('status').toLowerCase() === 'released') { - released++; - } - else if (model.get('status').toLowerCase() === 'incinemas') { - incinemas++; - } - else if (model.get('status').toLowerCase() === 'announced') { - announced++; - } - - if (model.get('monitored')) { - monitored++; - if (model.get('downloaded')) { - downloadedMonitored++; - } - } - else { //not monitored - if (model.get('downloaded')) { - downloadedNotMonitored++; - } - else { //missing - missingNotMonitored++; - } - } - - if (model.get('downloaded')) { - downloaded++; - } - else { //missing - if (!model.get('isAvailable')) { - if (model.get('monitored')) { - missingMonitoredNotAvailable++; - } - } - - if (model.get('monitored')) { - missingMonitored++; - if (model.get('isAvailable')) { - missingMonitoredAvailable++; - } - } - } - }); - - footerModel.set({ - movies : movies, - announced : announced, - incinemas : incinemas, - released : released, - monitored : monitored, - downloaded : downloaded, - downloadedMonitored : downloadedMonitored, - downloadedNotMonitored : downloadedNotMonitored, - missingMonitored : missingMonitored, - missingMonitoredAvailable : missingMonitoredAvailable, - missingMonitoredNotAvailable : missingMonitoredNotAvailable, - missingNotMonitored : missingNotMonitored - }); - - this.footer.show(new FooterView({ model : footerModel })); - } -}); + }, + { + title : 'Profile', + name : 'profileId' + }, + { + title : 'In Cinemas', + name : 'inCinemas' + }, + /*{ + title : "Status", + name : "status", + }*/ + ] + }; + + this.filteringOptions = { + type : 'radio', + storeState : true, + menuKey : 'series.filterMode', + defaultAction : 'all', + items : [ + { + key : 'all', + title : '', + tooltip : 'All', + icon : 'icon-sonarr-all', + callback : this._setFilter + }, + { + key : 'monitored', + title : '', + tooltip : 'Monitored Only', + icon : 'icon-sonarr-monitored', + callback : this._setFilter + }, + { + key : 'missing', + title : '', + tooltip : 'Missing Only', + icon : 'icon-sonarr-missing', + callback : this._setFilter + }, + { + key : 'released', + title : '', + tooltip : 'Released', + icon : 'icon-sonarr-movie-released', + callback : this._setFilter + }, + { + key : 'announced', + title : '', + tooltip : 'Announced', + icon : 'icon-sonarr-movie-announced', + callback : this._setFilter + }, + { + key : 'cinemas', + title : '', + tooltip : 'In Cinemas', + icon : 'icon-sonarr-movie-cinemas', + callback : this._setFilter + } + ] + }; + + this.viewButtons = { + type : 'radio', + storeState : true, + menuKey : 'seriesViewMode', + defaultAction : 'listView', + items : [ + { + key : 'posterView', + title : '', + tooltip : 'Posters', + icon : 'icon-sonarr-view-poster', + callback : this._showPosters + }, + { + key : 'listView', + title : '', + tooltip : 'Overview List', + icon : 'icon-sonarr-view-list', + callback : this._showList + }, + { + key : 'tableView', + title : '', + tooltip : 'Table', + icon : 'icon-sonarr-view-table', + callback : this._showTable + } + ] + }; + }, + + onShow : function() { + this._showToolbar(); + this._fetchCollection(); + if (window.shownOnce) { + this._showFooter(); + } + window.shownOnce = true; + }, + + _showTable : function() { + this.currentView = new Backgrid.Grid({ + collection : this.seriesCollection, + columns : this.columns, + className : 'table table-hover' + }); + + this._showPager(); + this._renderView(); + }, + + _showList : function() { + //this.current = "list"; + this.currentView = new ListCollectionView({ + collection : this.seriesCollection + }); + + this._renderView(); + }, + + _showPosters : function() { + this.currentView = new PosterCollectionView({ + collection : this.seriesCollection + }); + + this._renderView(); + }, + + _sort : function() { + console.warn("Sorting"); + }, + + _renderView : function() { + if (MoviesCollection.length === 0) { + this.seriesRegion.show(new EmptyView()); + + this.toolbar.close(); + this.toolbar2.close(); + } else { + this.renderedOnce = true; + this.seriesRegion.show(this.currentView); + this.listenTo(this.currentView.collection, 'sync', function(eventName){ + this._showPager(); + }); + this._showToolbar(); + } + }, + + _fetchCollection : function() { + this.seriesCollection.fetch(); + }, + + _setFilter : function(buttonContext) { + var mode = buttonContext.model.get('key'); + this.seriesCollection.setFilterMode(mode); + }, + + _showToolbar : function() { + if (this.toolbar.currentView) { + return; + } + + this.toolbar2.show(new ToolbarLayout({ + right : [ + this.filteringOptions + ], + context : this + })); + + this.toolbar.show(new ToolbarLayout({ + right : [ + this.sortingOptions, + this.viewButtons + ], + left : [ + this.leftSideButtons + ], + context : this + })); + }, + + _showPager : function() { + var pager = new GridPager({ + columns : this.columns, + collection : this.seriesCollection, + }); + var pagerTop = new GridPager({ + columns : this.columns, + collection : this.seriesCollection, + }); + this.pager.show(pager); + this.pagerTop.show(pagerTop); + }, + + _showFooter : function() { + var footerModel = new FooterModel(); + var movies = FullMovieCollection.models.length; + //instead of all the counters could do something like this with different query in the where... + //var releasedMovies = FullMovieCollection.where({ 'released' : this.model.get('released') }); + // releasedMovies.length + + var announced = 0; + var incinemas = 0; + var released = 0; + + var monitored = 0; + + var downloaded =0; + var missingMonitored=0; + var missingNotMonitored=0; + var missingMonitoredNotAvailable=0; + var missingMonitoredAvailable=0; + + var downloadedMonitored=0; + var downloadedNotMonitored=0; + + _.each(FullMovieCollection.models, function(model) { + + if (model.get('status').toLowerCase() === 'released') { + released++; + } + else if (model.get('status').toLowerCase() === 'incinemas') { + incinemas++; + } + else if (model.get('status').toLowerCase() === 'announced') { + announced++; + } + + if (model.get('monitored')) { + monitored++; + if (model.get('downloaded')) { + downloadedMonitored++; + } + } + else { //not monitored + if (model.get('downloaded')) { + downloadedNotMonitored++; + } + else { //missing + missingNotMonitored++; + } + } + + if (model.get('downloaded')) { + downloaded++; + } + else { //missing + if (!model.get('isAvailable')) { + if (model.get('monitored')) { + missingMonitoredNotAvailable++; + } + } + + if (model.get('monitored')) { + missingMonitored++; + if (model.get('isAvailable')) { + missingMonitoredAvailable++; + } + } + } + }); + + footerModel.set({ + movies : movies, + announced : announced, + incinemas : incinemas, + released : released, + monitored : monitored, + downloaded : downloaded, + downloadedMonitored : downloadedMonitored, + downloadedNotMonitored : downloadedNotMonitored, + missingMonitored : missingMonitored, + missingMonitoredAvailable : missingMonitoredAvailable, + missingMonitoredNotAvailable : missingMonitoredNotAvailable, + missingNotMonitored : missingNotMonitored + }); + + this.footer.show(new FooterView({ model : footerModel })); + } +}); diff --git a/src/UI/Movies/Index/Overview/SeriesOverviewItemViewTemplate.hbs b/src/UI/Movies/Index/Overview/SeriesOverviewItemViewTemplate.hbs index 18033cc04..f23658fa3 100644 --- a/src/UI/Movies/Index/Overview/SeriesOverviewItemViewTemplate.hbs +++ b/src/UI/Movies/Index/Overview/SeriesOverviewItemViewTemplate.hbs @@ -37,7 +37,9 @@
{{GetStatus}} - {{ShortDate inCinemas}} + {{#if inCinemas}} + {{RelativeDate inCinemas}} + {{/if}} {{profile profileId}} diff --git a/src/UI/Movies/MoviesController.js b/src/UI/Movies/MoviesController.js index 8cdef3be5..41cf97877 100644 --- a/src/UI/Movies/MoviesController.js +++ b/src/UI/Movies/MoviesController.js @@ -4,7 +4,6 @@ var MoviesCollection = require('./MoviesCollection'); var FullMovieCollection = require("./FullMovieCollection"); var MoviesIndexLayout = require('./Index/MoviesIndexLayout'); var MoviesDetailsLayout = require('./Details/MoviesDetailsLayout'); -var SeriesDetailsLayout = require('../Series/Details/SeriesDetailsLayout'); module.exports = NzbDroneController.extend({ _originalInit : NzbDroneController.prototype.initialize, @@ -23,17 +22,26 @@ module.exports = NzbDroneController.extend({ }, seriesDetails : function(query) { - var series = FullMovieCollection.where({ titleSlug : query }); - if (series.length !== 0) { - var targetMovie = series[0]; - console.log(AppLayout.mainRegion); - - this.setTitle(targetMovie.get('title')); - //this.showNotFound(); - //this.showMainRegion(new SeriesDetailsLayout({model : targetMovie})); - this.showMainRegion(new MoviesDetailsLayout({ model : targetMovie })); - } else { - this.showNotFound(); - } + + if(FullMovieCollection.length > 0) { + this._renderMovieDetails(query); + } else { + this.listenTo(FullMovieCollection, 'sync', function(model, options) { + this._renderMovieDetails(query); + }); + } + }, + + + _renderMovieDetails: function(query) { + var movies = FullMovieCollection.where({ titleSlug : query }); + if (movies.length !== 0) { + var targetMovie = movies[0]; + + this.setTitle(targetMovie.get('title')); + this.showMainRegion(new MoviesDetailsLayout({ model : targetMovie })); + } else { + this.showNotFound(); + } } });