mirror of
https://github.com/Radarr/Radarr
synced 2025-01-01 12:54:21 +00:00
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
7 changed files with 109 additions and 99 deletions
|
@ -1,16 +1,17 @@
|
|||
using NzbDrone.Api.ClientSchema;
|
||||
using FluentValidation;
|
||||
using NzbDrone.Api.ClientSchema;
|
||||
using NzbDrone.Core.NetImport;
|
||||
using NzbDrone.Core.Profiles;
|
||||
using NzbDrone.Core.Validation.Paths;
|
||||
|
||||
namespace NzbDrone.Api.NetImport
|
||||
{
|
||||
public class NetImportModule : ProviderModuleBase<NetImportResource, INetImport, NetImportDefinition>
|
||||
{
|
||||
private readonly IProfileService _profileService;
|
||||
public NetImportModule(NetImportFactory indexerFactory, IProfileService profileService)
|
||||
: base(indexerFactory, "netimport")
|
||||
public NetImportModule(NetImportFactory netImportFactory) : base(netImportFactory, "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)
|
||||
|
|
|
@ -119,7 +119,7 @@ protected virtual void MapToResource(TProviderResource resource, TProviderDefini
|
|||
|
||||
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"),
|
||||
definition.Implementation.ToLower());
|
||||
}
|
||||
|
|
|
@ -1,8 +1,4 @@
|
|||
using NzbDrone.Core.Messaging.Commands;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace NzbDrone.Core.IndexerSearch
|
||||
{
|
||||
|
|
|
@ -1,41 +1,79 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Instrumentation.Extensions;
|
||||
using NzbDrone.Core.Download;
|
||||
using NzbDrone.Core.Messaging.Commands;
|
||||
using NzbDrone.Core.Tv;
|
||||
using NzbDrone.Core.Datastore;
|
||||
using NzbDrone.Core.Queue;
|
||||
using NzbDrone.Core.DecisionEngine;
|
||||
|
||||
namespace NzbDrone.Core.IndexerSearch
|
||||
{
|
||||
public class MovieSearchService : IExecute<MoviesSearchCommand>, IExecute<MissingMoviesSearchCommand>
|
||||
{
|
||||
private readonly IMovieService _movieService;
|
||||
private readonly ISearchForNzb _nzbSearchService;
|
||||
private readonly IProcessDownloadDecisions _processDownloadDecisions;
|
||||
private readonly IQueueService _queueService;
|
||||
private readonly Logger _logger;
|
||||
|
||||
public MovieSearchService(IMovieService movieService,
|
||||
ISearchForNzb nzbSearchService,
|
||||
IProcessDownloadDecisions processDownloadDecisions,
|
||||
IQueueService queueService,
|
||||
Logger logger)
|
||||
{
|
||||
_movieService = movieService;
|
||||
_nzbSearchService = nzbSearchService;
|
||||
_processDownloadDecisions = processDownloadDecisions;
|
||||
_queueService = queueService;
|
||||
_logger = logger;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Instrumentation.Extensions;
|
||||
using NzbDrone.Core.Download;
|
||||
using NzbDrone.Core.Messaging.Commands;
|
||||
using NzbDrone.Core.Tv;
|
||||
using NzbDrone.Core.Datastore;
|
||||
using NzbDrone.Core.Queue;
|
||||
using NzbDrone.Core.DecisionEngine;
|
||||
|
||||
namespace NzbDrone.Core.IndexerSearch
|
||||
{
|
||||
public class MovieSearchService : IExecute<MoviesSearchCommand>, IExecute<MissingMoviesSearchCommand>
|
||||
{
|
||||
private readonly IMovieService _movieService;
|
||||
private readonly ISearchForNzb _nzbSearchService;
|
||||
private readonly IProcessDownloadDecisions _processDownloadDecisions;
|
||||
private readonly IQueueService _queueService;
|
||||
private readonly Logger _logger;
|
||||
|
||||
public MovieSearchService(IMovieService movieService,
|
||||
ISearchForNzb nzbSearchService,
|
||||
IProcessDownloadDecisions processDownloadDecisions,
|
||||
IQueueService queueService,
|
||||
Logger logger)
|
||||
{
|
||||
_movieService = movieService;
|
||||
_nzbSearchService = nzbSearchService;
|
||||
_processDownloadDecisions = processDownloadDecisions;
|
||||
_queueService = queueService;
|
||||
_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;
|
||||
|
||||
foreach (var movieId in movies.GroupBy(e => e.Id))
|
||||
|
@ -59,47 +97,9 @@ private void SearchForMissingMovies(List<Movie> movies, bool userInvokedSearch)
|
|||
}
|
||||
|
||||
_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 @@ public void Delete(EpisodeFile episodeFile, DeleteMediaFileReason 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
|
||||
episodeFile.Movie.LazyLoad();
|
||||
episodeFile.Path = Path.Combine(episodeFile.Movie.Value.Path, episodeFile.RelativePath);
|
||||
movieFile.Movie.LazyLoad();
|
||||
movieFile.Path = Path.Combine(movieFile.Movie.Value.Path, movieFile.RelativePath);
|
||||
|
||||
_movieFileRepository.Delete(episodeFile);
|
||||
_eventAggregator.PublishEvent(new MovieFileDeletedEvent(episodeFile, reason));
|
||||
_movieFileRepository.Delete(movieFile);
|
||||
_eventAggregator.PublishEvent(new MovieFileDeletedEvent(movieFile, reason));
|
||||
}
|
||||
|
||||
public List<EpisodeFile> GetFilesBySeries(int seriesId)
|
||||
|
@ -153,9 +153,9 @@ public MovieFile Add(MovieFile episodeFile)
|
|||
return addedFile;
|
||||
}
|
||||
|
||||
public void Update(MovieFile episodeFile)
|
||||
public void Update(MovieFile movieFile)
|
||||
{
|
||||
_movieFileRepository.Update(episodeFile);
|
||||
_movieFileRepository.Update(movieFile);
|
||||
}
|
||||
|
||||
public MovieFile GetMovie(int id)
|
||||
|
|
|
@ -89,7 +89,15 @@
|
|||
<label class="col-sm-3 control-label">Folder</label>
|
||||
|
||||
<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>
|
||||
|
||||
|
|
|
@ -103,7 +103,7 @@ module.exports = Marionette.Layout.extend({
|
|||
icon : 'icon-sonarr-search',
|
||||
callback : this._searchMissing,
|
||||
ownerContext : this,
|
||||
className : 'x-search-missing'
|
||||
className : 'x-search-cutoff'
|
||||
},
|
||||
]
|
||||
};
|
||||
|
@ -182,6 +182,11 @@ module.exports = Marionette.Layout.extend({
|
|||
name : 'moviesSearch'
|
||||
}
|
||||
});
|
||||
|
||||
CommandController.bindToCommand({
|
||||
element : this.$('.x-search-cutoff'),
|
||||
command : { name : 'missingMoviesSearch' }
|
||||
});
|
||||
},
|
||||
|
||||
_setFilter : function(buttonContext) {
|
||||
|
|
Loading…
Reference in a new issue