mirror of https://github.com/Radarr/Radarr
Patch/onedr0p updates (#998)
* few small things * update var names * Validate Root Folder, Minimum Avability and ProfileId on List import.
This commit is contained in:
parent
f7bc889723
commit
aab425ee5b
|
@ -1,16 +1,17 @@
|
||||||
using NzbDrone.Api.ClientSchema;
|
using FluentValidation;
|
||||||
|
using NzbDrone.Api.ClientSchema;
|
||||||
using NzbDrone.Core.NetImport;
|
using NzbDrone.Core.NetImport;
|
||||||
using NzbDrone.Core.Profiles;
|
using NzbDrone.Core.Validation.Paths;
|
||||||
|
|
||||||
namespace NzbDrone.Api.NetImport
|
namespace NzbDrone.Api.NetImport
|
||||||
{
|
{
|
||||||
public class NetImportModule : ProviderModuleBase<NetImportResource, INetImport, NetImportDefinition>
|
public class NetImportModule : ProviderModuleBase<NetImportResource, INetImport, NetImportDefinition>
|
||||||
{
|
{
|
||||||
private readonly IProfileService _profileService;
|
public NetImportModule(NetImportFactory netImportFactory) : base(netImportFactory, "netimport")
|
||||||
public NetImportModule(NetImportFactory indexerFactory, IProfileService profileService)
|
|
||||||
: base(indexerFactory, "netimport")
|
|
||||||
{
|
{
|
||||||
_profileService = profileService;
|
PostValidator.RuleFor(c => c.RootFolderPath).NotNull();
|
||||||
|
PostValidator.RuleFor(c => c.MinimumAvailability).NotNull();
|
||||||
|
PostValidator.RuleFor(c => c.ProfileId).NotNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void MapToResource(NetImportResource resource, NetImportDefinition definition)
|
protected override void MapToResource(NetImportResource resource, NetImportDefinition definition)
|
||||||
|
|
|
@ -119,7 +119,7 @@ namespace NzbDrone.Api
|
||||||
|
|
||||||
resource.Fields = SchemaBuilder.ToSchema(definition.Settings);
|
resource.Fields = SchemaBuilder.ToSchema(definition.Settings);
|
||||||
|
|
||||||
resource.InfoLink = string.Format("https://github.com/Sonarr/Sonarr/wiki/Supported-{0}#{1}",
|
resource.InfoLink = string.Format("https://github.com/Radarr/Radarr/wiki/Supported-{0}#{1}",
|
||||||
typeof(TProviderResource).Name.Replace("Resource", "s"),
|
typeof(TProviderResource).Name.Replace("Resource", "s"),
|
||||||
definition.Implementation.ToLower());
|
definition.Implementation.ToLower());
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,4 @@
|
||||||
using NzbDrone.Core.Messaging.Commands;
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.IndexerSearch
|
namespace NzbDrone.Core.IndexerSearch
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,41 +1,79 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Instrumentation.Extensions;
|
using NzbDrone.Common.Instrumentation.Extensions;
|
||||||
using NzbDrone.Core.Download;
|
using NzbDrone.Core.Download;
|
||||||
using NzbDrone.Core.Messaging.Commands;
|
using NzbDrone.Core.Messaging.Commands;
|
||||||
using NzbDrone.Core.Tv;
|
using NzbDrone.Core.Tv;
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Datastore;
|
||||||
using NzbDrone.Core.Queue;
|
using NzbDrone.Core.Queue;
|
||||||
using NzbDrone.Core.DecisionEngine;
|
using NzbDrone.Core.DecisionEngine;
|
||||||
|
|
||||||
namespace NzbDrone.Core.IndexerSearch
|
namespace NzbDrone.Core.IndexerSearch
|
||||||
{
|
{
|
||||||
public class MovieSearchService : IExecute<MoviesSearchCommand>, IExecute<MissingMoviesSearchCommand>
|
public class MovieSearchService : IExecute<MoviesSearchCommand>, IExecute<MissingMoviesSearchCommand>
|
||||||
{
|
{
|
||||||
private readonly IMovieService _movieService;
|
private readonly IMovieService _movieService;
|
||||||
private readonly ISearchForNzb _nzbSearchService;
|
private readonly ISearchForNzb _nzbSearchService;
|
||||||
private readonly IProcessDownloadDecisions _processDownloadDecisions;
|
private readonly IProcessDownloadDecisions _processDownloadDecisions;
|
||||||
private readonly IQueueService _queueService;
|
private readonly IQueueService _queueService;
|
||||||
private readonly Logger _logger;
|
private readonly Logger _logger;
|
||||||
|
|
||||||
public MovieSearchService(IMovieService movieService,
|
public MovieSearchService(IMovieService movieService,
|
||||||
ISearchForNzb nzbSearchService,
|
ISearchForNzb nzbSearchService,
|
||||||
IProcessDownloadDecisions processDownloadDecisions,
|
IProcessDownloadDecisions processDownloadDecisions,
|
||||||
IQueueService queueService,
|
IQueueService queueService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
{
|
{
|
||||||
_movieService = movieService;
|
_movieService = movieService;
|
||||||
_nzbSearchService = nzbSearchService;
|
_nzbSearchService = nzbSearchService;
|
||||||
_processDownloadDecisions = processDownloadDecisions;
|
_processDownloadDecisions = processDownloadDecisions;
|
||||||
_queueService = queueService;
|
_queueService = queueService;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SearchForMissingMovies(List<Movie> movies, bool userInvokedSearch)
|
public void Execute(MoviesSearchCommand message)
|
||||||
{
|
{
|
||||||
_logger.ProgressInfo("Performing missing search for {0} movies", movies.Count);
|
var downloadedCount = 0;
|
||||||
|
foreach (var movieId in message.MovieIds)
|
||||||
|
{
|
||||||
|
var movies = _movieService.GetMovie(movieId);
|
||||||
|
|
||||||
|
if (!movies.Monitored)
|
||||||
|
{
|
||||||
|
_logger.Debug("Movie {0} is not monitored, skipping search", movies.Title);
|
||||||
|
}
|
||||||
|
|
||||||
|
var decisions = _nzbSearchService.MovieSearch(movieId, false);//_nzbSearchService.SeasonSearch(message.MovieId, season.SeasonNumber, false, message.Trigger == CommandTrigger.Manual);
|
||||||
|
downloadedCount += _processDownloadDecisions.ProcessDecisions(decisions).Grabbed.Count;
|
||||||
|
|
||||||
|
}
|
||||||
|
_logger.ProgressInfo("Movie search completed. {0} reports downloaded.", downloadedCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Execute(MissingMoviesSearchCommand message)
|
||||||
|
{
|
||||||
|
List<Movie> movies = _movieService.MoviesWithoutFiles(new PagingSpec<Movie>
|
||||||
|
{
|
||||||
|
Page = 1,
|
||||||
|
PageSize = 100000,
|
||||||
|
SortDirection = SortDirection.Ascending,
|
||||||
|
SortKey = "Id",
|
||||||
|
FilterExpression = _movieService.ConstructFilterExpression(message.FilterKey, message.FilterValue)
|
||||||
|
}).Records.ToList();
|
||||||
|
|
||||||
|
|
||||||
|
var queue = _queueService.GetQueue().Select(q => q.Movie.Id);
|
||||||
|
var missing = movies.Where(e => !queue.Contains(e.Id)).ToList();
|
||||||
|
|
||||||
|
SearchForMissingMovies(missing, message.Trigger == CommandTrigger.Manual);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SearchForMissingMovies(List<Movie> movies, bool userInvokedSearch)
|
||||||
|
{
|
||||||
|
_logger.ProgressInfo("Performing missing search for {0} movies", movies.Count);
|
||||||
var downloadedCount = 0;
|
var downloadedCount = 0;
|
||||||
|
|
||||||
foreach (var movieId in movies.GroupBy(e => e.Id))
|
foreach (var movieId in movies.GroupBy(e => e.Id))
|
||||||
|
@ -59,47 +97,9 @@ namespace NzbDrone.Core.IndexerSearch
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.ProgressInfo("Completed missing search for {0} movies. {1} reports downloaded.", movies.Count, downloadedCount);
|
_logger.ProgressInfo("Completed missing search for {0} movies. {1} reports downloaded.", movies.Count, downloadedCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Execute(MoviesSearchCommand message)
|
|
||||||
{
|
|
||||||
var downloadedCount = 0;
|
}
|
||||||
foreach (var movieId in message.MovieIds)
|
}
|
||||||
{
|
|
||||||
var series = _movieService.GetMovie(movieId);
|
|
||||||
|
|
||||||
if (!series.Monitored)
|
|
||||||
{
|
|
||||||
_logger.Debug("Movie {0} is not monitored, skipping search", series.Title);
|
|
||||||
}
|
|
||||||
|
|
||||||
var decisions = _nzbSearchService.MovieSearch(movieId, false);//_nzbSearchService.SeasonSearch(message.MovieId, season.SeasonNumber, false, message.Trigger == CommandTrigger.Manual);
|
|
||||||
downloadedCount += _processDownloadDecisions.ProcessDecisions(decisions).Grabbed.Count;
|
|
||||||
|
|
||||||
}
|
|
||||||
_logger.ProgressInfo("Movie search completed. {0} reports downloaded.", downloadedCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Execute(MissingMoviesSearchCommand message)
|
|
||||||
{
|
|
||||||
List<Movie> movies;
|
|
||||||
|
|
||||||
movies = _movieService.MoviesWithoutFiles(new PagingSpec<Movie>
|
|
||||||
{
|
|
||||||
Page = 1,
|
|
||||||
PageSize = 100000,
|
|
||||||
SortDirection = SortDirection.Ascending,
|
|
||||||
SortKey = "Id",
|
|
||||||
FilterExpression = _movieService.ConstructFilterExpression(message.FilterKey, message.FilterValue)
|
|
||||||
}).Records.ToList();
|
|
||||||
|
|
||||||
|
|
||||||
var queue = _queueService.GetQueue().Select(q => q.Movie.Id);
|
|
||||||
var missing = movies.Where(e => !queue.Contains(e.Id)).ToList();
|
|
||||||
|
|
||||||
SearchForMissingMovies(missing, message.Trigger == CommandTrigger.Manual);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -74,14 +74,14 @@ namespace NzbDrone.Core.MediaFiles
|
||||||
_eventAggregator.PublishEvent(new EpisodeFileDeletedEvent(episodeFile, reason));
|
_eventAggregator.PublishEvent(new EpisodeFileDeletedEvent(episodeFile, reason));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Delete(MovieFile episodeFile, DeleteMediaFileReason reason)
|
public void Delete(MovieFile movieFile, DeleteMediaFileReason reason)
|
||||||
{
|
{
|
||||||
//Little hack so we have the episodes and series attached for the event consumers
|
//Little hack so we have the episodes and series attached for the event consumers
|
||||||
episodeFile.Movie.LazyLoad();
|
movieFile.Movie.LazyLoad();
|
||||||
episodeFile.Path = Path.Combine(episodeFile.Movie.Value.Path, episodeFile.RelativePath);
|
movieFile.Path = Path.Combine(movieFile.Movie.Value.Path, movieFile.RelativePath);
|
||||||
|
|
||||||
_movieFileRepository.Delete(episodeFile);
|
_movieFileRepository.Delete(movieFile);
|
||||||
_eventAggregator.PublishEvent(new MovieFileDeletedEvent(episodeFile, reason));
|
_eventAggregator.PublishEvent(new MovieFileDeletedEvent(movieFile, reason));
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<EpisodeFile> GetFilesBySeries(int seriesId)
|
public List<EpisodeFile> GetFilesBySeries(int seriesId)
|
||||||
|
@ -153,9 +153,9 @@ namespace NzbDrone.Core.MediaFiles
|
||||||
return addedFile;
|
return addedFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Update(MovieFile episodeFile)
|
public void Update(MovieFile movieFile)
|
||||||
{
|
{
|
||||||
_movieFileRepository.Update(episodeFile);
|
_movieFileRepository.Update(movieFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
public MovieFile GetMovie(int id)
|
public MovieFile GetMovie(int id)
|
||||||
|
|
|
@ -89,7 +89,15 @@
|
||||||
<label class="col-sm-3 control-label">Folder</label>
|
<label class="col-sm-3 control-label">Folder</label>
|
||||||
|
|
||||||
<div class="col-sm-5">
|
<div class="col-sm-5">
|
||||||
{{> RootFolderSelectionPartial rootFolders}}
|
<select class="col-md-4 form-control x-root-folder" name="RootFolderPath">
|
||||||
|
{{#if rootFolders}}
|
||||||
|
{{#each rootFolders}}
|
||||||
|
<option value="{{id}}">{{path}}</option>
|
||||||
|
{{/each}}
|
||||||
|
{{else}}
|
||||||
|
<option value="">Select Path</option>
|
||||||
|
{{/if}}
|
||||||
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -103,7 +103,7 @@ module.exports = Marionette.Layout.extend({
|
||||||
icon : 'icon-sonarr-search',
|
icon : 'icon-sonarr-search',
|
||||||
callback : this._searchMissing,
|
callback : this._searchMissing,
|
||||||
ownerContext : this,
|
ownerContext : this,
|
||||||
className : 'x-search-missing'
|
className : 'x-search-cutoff'
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
@ -182,6 +182,11 @@ module.exports = Marionette.Layout.extend({
|
||||||
name : 'moviesSearch'
|
name : 'moviesSearch'
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
CommandController.bindToCommand({
|
||||||
|
element : this.$('.x-search-cutoff'),
|
||||||
|
command : { name : 'missingMoviesSearch' }
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
_setFilter : function(buttonContext) {
|
_setFilter : function(buttonContext) {
|
||||||
|
|
Loading…
Reference in New Issue