mirror of
https://github.com/lidarr/lidarr.git
synced 2025-08-23 14:55:20 -07:00
Merge branch 'develop' into feature/better-import-exclusions
This commit is contained in:
commit
ab28bfead2
12 changed files with 161 additions and 52 deletions
|
@ -1,6 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using NLog;
|
||||||
using NzbDrone.Api.Extensions;
|
using NzbDrone.Api.Extensions;
|
||||||
using NzbDrone.Api.Validation;
|
using NzbDrone.Api.Validation;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
|
@ -17,14 +18,17 @@ namespace NzbDrone.Api.Commands
|
||||||
{
|
{
|
||||||
private readonly IManageCommandQueue _commandQueueManager;
|
private readonly IManageCommandQueue _commandQueueManager;
|
||||||
private readonly IServiceFactory _serviceFactory;
|
private readonly IServiceFactory _serviceFactory;
|
||||||
|
private readonly Logger _logger;
|
||||||
|
|
||||||
public CommandModule(IManageCommandQueue commandQueueManager,
|
public CommandModule(IManageCommandQueue commandQueueManager,
|
||||||
IBroadcastSignalRMessage signalRBroadcaster,
|
IBroadcastSignalRMessage signalRBroadcaster,
|
||||||
IServiceFactory serviceFactory)
|
IServiceFactory serviceFactory,
|
||||||
|
Logger logger)
|
||||||
: base(signalRBroadcaster)
|
: base(signalRBroadcaster)
|
||||||
{
|
{
|
||||||
_commandQueueManager = commandQueueManager;
|
_commandQueueManager = commandQueueManager;
|
||||||
_serviceFactory = serviceFactory;
|
_serviceFactory = serviceFactory;
|
||||||
|
_logger = logger;
|
||||||
|
|
||||||
GetResourceById = GetCommand;
|
GetResourceById = GetCommand;
|
||||||
CreateResource = StartCommand;
|
CreateResource = StartCommand;
|
||||||
|
@ -41,7 +45,13 @@ namespace NzbDrone.Api.Commands
|
||||||
private int StartCommand(CommandResource commandResource)
|
private int StartCommand(CommandResource commandResource)
|
||||||
{
|
{
|
||||||
var commandType = _serviceFactory.GetImplementations(typeof(Command))
|
var commandType = _serviceFactory.GetImplementations(typeof(Command))
|
||||||
.Single(c => c.Name.Replace("Command", "").Equals(commandResource.Name, StringComparison.InvariantCultureIgnoreCase));
|
.SingleOrDefault(c => c.Name.Replace("Command", "").Equals(commandResource.Name, StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
|
||||||
|
if (commandType == null)
|
||||||
|
{
|
||||||
|
_logger.Error("Found no matching command for {0}", commandResource.Name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
dynamic command = Request.Body.FromJson(commandType);
|
dynamic command = Request.Body.FromJson(commandType);
|
||||||
command.Trigger = CommandTrigger.Manual;
|
command.Trigger = CommandTrigger.Manual;
|
||||||
|
|
|
@ -17,12 +17,12 @@ namespace NzbDrone.Api.Movie
|
||||||
: base("/movies/discover")
|
: base("/movies/discover")
|
||||||
{
|
{
|
||||||
_searchProxy = searchProxy;
|
_searchProxy = searchProxy;
|
||||||
Get["/"] = x => Search();
|
Get["/{action?recommendations}"] = x => Search(x.action);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Response Search()
|
private Response Search(string action)
|
||||||
{
|
{
|
||||||
var imdbResults = _searchProxy.DiscoverNewMovies();
|
var imdbResults = _searchProxy.DiscoverNewMovies(action);
|
||||||
return MapToResource(imdbResults).AsResponse();
|
return MapToResource(imdbResults).AsResponse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,8 @@ using NzbDrone.Core.DataAugmentation.Scene;
|
||||||
using NzbDrone.Core.Validation;
|
using NzbDrone.Core.Validation;
|
||||||
using NzbDrone.SignalR;
|
using NzbDrone.SignalR;
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Datastore;
|
||||||
|
using Microsoft.CSharp.RuntimeBinder;
|
||||||
|
using Nancy;
|
||||||
|
|
||||||
namespace NzbDrone.Api.Movie
|
namespace NzbDrone.Api.Movie
|
||||||
{
|
{
|
||||||
|
@ -58,9 +60,12 @@ namespace NzbDrone.Api.Movie
|
||||||
GetResourceAll = AllMovie;
|
GetResourceAll = AllMovie;
|
||||||
GetResourcePaged = GetMoviePaged;
|
GetResourcePaged = GetMoviePaged;
|
||||||
GetResourceById = GetMovie;
|
GetResourceById = GetMovie;
|
||||||
Get[TITLE_SLUG_ROUTE] = (options) => {
|
Get[TITLE_SLUG_ROUTE] = GetByTitleSlug; /*(options) => {
|
||||||
return ReqResExtensions.AsResponse(GetByTitleSlug(options.slug));
|
return ReqResExtensions.AsResponse(GetByTitleSlug(options.slug), Nancy.HttpStatusCode.OK);
|
||||||
};
|
};*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CreateResource = AddMovie;
|
CreateResource = AddMovie;
|
||||||
UpdateResource = UpdateMovie;
|
UpdateResource = UpdateMovie;
|
||||||
DeleteResource = DeleteMovie;
|
DeleteResource = DeleteMovie;
|
||||||
|
@ -145,9 +150,27 @@ namespace NzbDrone.Api.Movie
|
||||||
return moviesResources;
|
return moviesResources;
|
||||||
}
|
}
|
||||||
|
|
||||||
private MovieResource GetByTitleSlug(string slug)
|
private Response GetByTitleSlug(dynamic options)
|
||||||
{
|
{
|
||||||
return MapToResource(_moviesService.FindByTitleSlug(slug));
|
var slug = "";
|
||||||
|
try
|
||||||
|
{
|
||||||
|
slug = options.slug;
|
||||||
|
// do stuff with x
|
||||||
|
}
|
||||||
|
catch (RuntimeBinderException)
|
||||||
|
{
|
||||||
|
return new NotFoundResponse();
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return MapToResource(_moviesService.FindByTitleSlug(slug)).AsResponse(Nancy.HttpStatusCode.OK);
|
||||||
|
}
|
||||||
|
catch (ModelNotFoundException)
|
||||||
|
{
|
||||||
|
return new NotFoundResponse();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private int AddMovie(MovieResource moviesResource)
|
private int AddMovie(MovieResource moviesResource)
|
||||||
|
|
|
@ -75,6 +75,7 @@ namespace NzbDrone.Core.Test.ParserTests
|
||||||
[TestCase("A.I.Artificial.Intelligence.(2001)", "A.I. Artificial Intelligence")]
|
[TestCase("A.I.Artificial.Intelligence.(2001)", "A.I. Artificial Intelligence")]
|
||||||
[TestCase("A.Movie.Name.(1998)", "A Movie Name")]
|
[TestCase("A.Movie.Name.(1998)", "A Movie Name")]
|
||||||
[TestCase("Thor: The Dark World 2013", "Thor The Dark World")]
|
[TestCase("Thor: The Dark World 2013", "Thor The Dark World")]
|
||||||
|
[TestCase("Resident.Evil.The.Final.Chapter.2016", "Resident Evil The Final Chapter")]
|
||||||
public void should_parse_movie_title(string postTitle, string title)
|
public void should_parse_movie_title(string postTitle, string title)
|
||||||
{
|
{
|
||||||
Parser.Parser.ParseMovieTitle(postTitle).MovieTitle.Should().Be(title);
|
Parser.Parser.ParseMovieTitle(postTitle).MovieTitle.Should().Be(title);
|
||||||
|
@ -87,6 +88,7 @@ namespace NzbDrone.Core.Test.ParserTests
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestCase("The Danish Girl 2015")]
|
[TestCase("The Danish Girl 2015")]
|
||||||
|
[TestCase("The.Danish.Girl.2015.1080p.BluRay.x264.DTS-HD.MA.5.1-RARBG")]
|
||||||
public void should_not_parse_language_in_movie_title(string postTitle)
|
public void should_not_parse_language_in_movie_title(string postTitle)
|
||||||
{
|
{
|
||||||
Parser.Parser.ParseMovieTitle(postTitle).Language.Should().Be(Language.English);
|
Parser.Parser.ParseMovieTitle(postTitle).Language.Should().Be(Language.English);
|
||||||
|
@ -123,6 +125,8 @@ namespace NzbDrone.Core.Test.ParserTests
|
||||||
[TestCase("Prometheus 50th Anniversary Edition 2012.mkv", "50th Anniversary Edition")]
|
[TestCase("Prometheus 50th Anniversary Edition 2012.mkv", "50th Anniversary Edition")]
|
||||||
[TestCase("Movie 2in1 2012.mkv", "2in1")]
|
[TestCase("Movie 2in1 2012.mkv", "2in1")]
|
||||||
[TestCase("Movie IMAX 2012.mkv", "IMAX")]
|
[TestCase("Movie IMAX 2012.mkv", "IMAX")]
|
||||||
|
[TestCase("Fake Movie Final Cut 2016", "Final Cut")]
|
||||||
|
[TestCase("Fake Movie 2016 Final Cut ", "Final Cut")]
|
||||||
public void should_parse_edition(string postTitle, string edition)
|
public void should_parse_edition(string postTitle, string edition)
|
||||||
{
|
{
|
||||||
Parser.Parser.ParseMovieTitle(postTitle).Edition.Should().Be(edition);
|
Parser.Parser.ParseMovieTitle(postTitle).Edition.Should().Be(edition);
|
||||||
|
|
|
@ -5,6 +5,6 @@ namespace NzbDrone.Core.MetadataSource
|
||||||
{
|
{
|
||||||
public interface IDiscoverNewMovies
|
public interface IDiscoverNewMovies
|
||||||
{
|
{
|
||||||
List<Movie> DiscoverNewMovies();
|
List<Movie> DiscoverNewMovies(string action);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -349,31 +349,57 @@ namespace NzbDrone.Core.MetadataSource.SkyHook
|
||||||
return resources.movie_results.SelectList(MapMovie).FirstOrDefault();
|
return resources.movie_results.SelectList(MapMovie).FirstOrDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Movie> DiscoverNewMovies()
|
public List<Movie> DiscoverNewMovies(string action)
|
||||||
{
|
{
|
||||||
string allIds = string.Join(",", _movieService.GetAllMovies().Select(m => m.TmdbId));
|
string allIds = string.Join(",", _movieService.GetAllMovies().Select(m => m.TmdbId));
|
||||||
var request = new HttpRequestBuilder("https://radarr.video/recommendations/api.php").Build();
|
|
||||||
|
|
||||||
request.AllowAutoRedirect = true;
|
HttpRequest request;
|
||||||
request.Method = HttpMethod.POST;
|
List<MovieResult> results;
|
||||||
request.Headers.ContentType = "application/x-www-form-urlencoded";
|
|
||||||
request.SetContent($"tmdbids={allIds}");
|
|
||||||
|
|
||||||
|
if (action == "upcoming")
|
||||||
var response = _httpClient.Post<List<MovieResult>>(request);
|
|
||||||
if (response.StatusCode != HttpStatusCode.OK)
|
|
||||||
{
|
{
|
||||||
throw new HttpException(request, response);
|
var lastWeek = DateTime.Now.AddDays(-7);
|
||||||
|
var threeWeeks = DateTime.Now.AddDays(7 * 3);
|
||||||
|
|
||||||
|
request = _movieBuilder.Create().SetSegment("route", "discover")
|
||||||
|
.SetSegment("id", "movie")
|
||||||
|
.SetSegment("secondaryRoute", "")
|
||||||
|
.AddQueryParam("region", "us")
|
||||||
|
.AddQueryParam("with_release_type", "5|4|6")
|
||||||
|
.AddQueryParam("release_date.gte", lastWeek.ToString("yyyy-MM-dd"))
|
||||||
|
.AddQueryParam("sort_by", "popularity.desc")
|
||||||
|
.AddQueryParam("release_date.lte", threeWeeks.ToString("yyyy-MM-dd")).Build();
|
||||||
|
|
||||||
|
|
||||||
|
var response = _httpClient.Get<MovieSearchRoot>(request);
|
||||||
|
|
||||||
|
if (response.StatusCode != HttpStatusCode.OK)
|
||||||
|
{
|
||||||
|
throw new HttpException(request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
results = response.Resource.results.ToList();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
request = new HttpRequestBuilder("https://radarr.video/api/{action}/").SetSegment("action", action).Build();
|
||||||
|
|
||||||
|
request.AllowAutoRedirect = true;
|
||||||
|
request.Method = HttpMethod.POST;
|
||||||
|
request.Headers.ContentType = "application/x-www-form-urlencoded";
|
||||||
|
request.SetContent($"tmdbids={allIds}");
|
||||||
|
|
||||||
|
var response = _httpClient.Post<List<MovieResult>>(request);
|
||||||
|
|
||||||
|
if (response.StatusCode != HttpStatusCode.OK)
|
||||||
|
{
|
||||||
|
throw new HttpException(request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
results = response.Resource;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.Headers.ContentType != HttpAccept.Json.Value)
|
return results.SelectList(MapMovie);
|
||||||
{
|
|
||||||
throw new HttpException(request, response);
|
|
||||||
}
|
|
||||||
|
|
||||||
var movieResults = response.Resource;
|
|
||||||
|
|
||||||
return movieResults.SelectList(MapMovie);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private string StripTrailingTheFromTitle(string title)
|
private string StripTrailingTheFromTitle(string title)
|
||||||
|
|
|
@ -41,7 +41,7 @@ namespace NzbDrone.Core.Notifications.Xbmc
|
||||||
var parameters = new Dictionary<string, object>();
|
var parameters = new Dictionary<string, object>();
|
||||||
parameters.Add("title", title);
|
parameters.Add("title", title);
|
||||||
parameters.Add("message", message);
|
parameters.Add("message", message);
|
||||||
parameters.Add("image", "https://raw.github.com/Sonarr/Sonarr/develop/Logo/64.png");
|
parameters.Add("image", "https://raw.github.com/Radarr/Radarr/develop/Logo/64.png");
|
||||||
parameters.Add("displaytime", settings.DisplayTime * 1000);
|
parameters.Add("displaytime", settings.DisplayTime * 1000);
|
||||||
|
|
||||||
ProcessRequest(request, settings, "GUI.ShowNotification", parameters);
|
ProcessRequest(request, settings, "GUI.ShowNotification", parameters);
|
||||||
|
|
|
@ -19,11 +19,11 @@ namespace NzbDrone.Core.Parser
|
||||||
private static readonly Regex[] ReportMovieTitleRegex = new[]
|
private static readonly Regex[] ReportMovieTitleRegex = new[]
|
||||||
{
|
{
|
||||||
//Special, Despecialized, etc. Edition Movies, e.g: Mission.Impossible.3.Special.Edition.2011
|
//Special, Despecialized, etc. Edition Movies, e.g: Mission.Impossible.3.Special.Edition.2011
|
||||||
new Regex(@"^(?<title>(?![(\[]).+?)?(?:(?:[-_\W](?<![)\[!]))*\(?(?<edition>(((Extended.|Ultimate.)?(Director.?s|Collector.?s|Theatrical|Ultimate|Final|Extended|Rogue|Special|Despecialized|\d{2,3}(th)?.Anniversary)(.(Cut|Edition|Version))?(.(Extended|Uncensored|Remastered|Unrated|Uncut|IMAX|Fan.?Edit))?|((Uncensored|Remastered|Unrated|Uncut|IMAX|Fan.?Edit|Edition|Restored|((2|3|4)in1))))))\)?.+(?<year>(19|20)\d{2}(?!p|i|\d+|\]|\W\d+)))+(\W+|_|$)(?!\\)",
|
new Regex(@"^(?<title>(?![(\[]).+?)?(?:(?:[-_\W](?<![)\[!]))*\(?(?<edition>(((Extended.|Ultimate.)?(Director.?s|Collector.?s|Theatrical|Ultimate|Final(?=(.(Cut|Edition|Version)))|Extended|Rogue|Special|Despecialized|\d{2,3}(th)?.Anniversary)(.(Cut|Edition|Version))?(.(Extended|Uncensored|Remastered|Unrated|Uncut|IMAX|Fan.?Edit))?|((Uncensored|Remastered|Unrated|Uncut|IMAX|Fan.?Edit|Edition|Restored|((2|3|4)in1))))))\)?.+(?<year>(19|20)\d{2}(?!p|i|\d+|\]|\W\d+)))+(\W+|_|$)(?!\\)",
|
||||||
RegexOptions.IgnoreCase | RegexOptions.Compiled),
|
RegexOptions.IgnoreCase | RegexOptions.Compiled),
|
||||||
|
|
||||||
//Special, Despecialized, etc. Edition Movies, e.g: Mission.Impossible.3.2011.Special.Edition //TODO: Seems to slow down parsing heavily!
|
//Special, Despecialized, etc. Edition Movies, e.g: Mission.Impossible.3.2011.Special.Edition //TODO: Seems to slow down parsing heavily!
|
||||||
new Regex(@"^(?<title>(?![(\[]).+?)?(?:(?:[-_\W](?<![)\[!]))*(?<year>(19|20)\d{2}(?!p|i|(19|20)\d{2}|\]|\W(19|20)\d{2})))+(\W+|_|$)(?!\\)\(?(?<edition>(((Extended.|Ultimate.)?(Director.?s|Collector.?s|Theatrical|Ultimate|Final|Extended|Rogue|Special|Despecialized|\d{2,3}(th)?.Anniversary)(.(Cut|Edition|Version))?(.(Extended|Uncensored|Remastered|Unrated|Uncut|IMAX|Fan.?Edit))?|((Uncensored|Remastered|Unrated|Uncut|IMAX|Fan.?Edit|Edition|Restored|((2|3|4)in1))))))\)?",
|
new Regex(@"^(?<title>(?![(\[]).+?)?(?:(?:[-_\W](?<![)\[!]))*(?<year>(19|20)\d{2}(?!p|i|(19|20)\d{2}|\]|\W(19|20)\d{2})))+(\W+|_|$)(?!\\)\(?(?<edition>(((Extended.|Ultimate.)?(Director.?s|Collector.?s|Theatrical|Ultimate|Final(?=(.(Cut|Edition|Version)))|Extended|Rogue|Special|Despecialized|\d{2,3}(th)?.Anniversary)(.(Cut|Edition|Version))?(.(Extended|Uncensored|Remastered|Unrated|Uncut|IMAX|Fan.?Edit))?|((Uncensored|Remastered|Unrated|Uncut|IMAX|Fan.?Edit|Edition|Restored|((2|3|4)in1))))))\)?",
|
||||||
RegexOptions.IgnoreCase | RegexOptions.Compiled),
|
RegexOptions.IgnoreCase | RegexOptions.Compiled),
|
||||||
|
|
||||||
//Normal movie format, e.g: Mission.Impossible.3.2011
|
//Normal movie format, e.g: Mission.Impossible.3.2011
|
||||||
|
@ -412,9 +412,9 @@ namespace NzbDrone.Core.Parser
|
||||||
if (result != null)
|
if (result != null)
|
||||||
{
|
{
|
||||||
var languageTitle = simpleTitle;
|
var languageTitle = simpleTitle;
|
||||||
if (result.MovieTitle.IsNotNullOrWhiteSpace() )
|
if (match[0].Groups["title"].Success && match[0].Groups["title"].Value.IsNotNullOrWhiteSpace())
|
||||||
{
|
{
|
||||||
languageTitle = simpleTitle.Replace(result.MovieTitle, "A Movie");
|
languageTitle = simpleTitle.Replace(match[0].Groups["title"].Value, "A Movie");
|
||||||
}
|
}
|
||||||
|
|
||||||
result.Language = LanguageParser.ParseLanguage(languageTitle);
|
result.Language = LanguageParser.ParseLanguage(languageTitle);
|
||||||
|
|
|
@ -21,11 +21,18 @@ module.exports = Marionette.Layout.extend({
|
||||||
moviesSearch : '.x-movies-search',
|
moviesSearch : '.x-movies-search',
|
||||||
searchBar : '.x-search-bar',
|
searchBar : '.x-search-bar',
|
||||||
loadMore : '.x-load-more',
|
loadMore : '.x-load-more',
|
||||||
discoverHeader : ".x-discover-header"
|
discoverHeader : ".x-discover-header",
|
||||||
|
discoverBefore : ".x-discover-before",
|
||||||
|
discoverRecos : ".x-recommendations-tab",
|
||||||
|
discoverPopular : ".x-popular-tab" ,
|
||||||
|
discoverUpcoming : ".x-upcoming-tab"
|
||||||
},
|
},
|
||||||
|
|
||||||
events : {
|
events : {
|
||||||
'click .x-load-more' : '_onLoadMore'
|
'click .x-load-more' : '_onLoadMore',
|
||||||
|
"click .x-recommendations-tab" : "_discoverRecos",
|
||||||
|
"click .x-popular-tab" : "_discoverPopular",
|
||||||
|
"click .x-upcoming-tab" : "_discoverUpcoming"
|
||||||
},
|
},
|
||||||
|
|
||||||
initialize : function(options) {
|
initialize : function(options) {
|
||||||
|
@ -56,11 +63,6 @@ module.exports = Marionette.Layout.extend({
|
||||||
this.search({term: options.query});
|
this.search({term: options.query});
|
||||||
} else if (options.action == "discover") {
|
} else if (options.action == "discover") {
|
||||||
this.isDiscover = true;
|
this.isDiscover = true;
|
||||||
if (FullMovieCollection.length > 0) {
|
|
||||||
this._discover();
|
|
||||||
} else {
|
|
||||||
this.listenTo(FullMovieCollection, "sync", this._discover);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
@ -110,6 +112,11 @@ module.exports = Marionette.Layout.extend({
|
||||||
|
|
||||||
if (this.isDiscover) {
|
if (this.isDiscover) {
|
||||||
this.ui.searchBar.hide();
|
this.ui.searchBar.hide();
|
||||||
|
if (FullMovieCollection.length > 0) {
|
||||||
|
this._discoverRecos();
|
||||||
|
} else {
|
||||||
|
this.listenTo(FullMovieCollection, "sync", this._discover);
|
||||||
|
}
|
||||||
if (this.collection.length == 0) {
|
if (this.collection.length == 0) {
|
||||||
this.searchResult.show(new LoadingView());
|
this.searchResult.show(new LoadingView());
|
||||||
}
|
}
|
||||||
|
@ -117,10 +124,10 @@ module.exports = Marionette.Layout.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
onShow : function() {
|
onShow : function() {
|
||||||
this.ui.discoverHeader.hide();
|
this.ui.discoverBefore.hide();
|
||||||
this.ui.moviesSearch.focus();
|
this.ui.moviesSearch.focus();
|
||||||
if (this.isDiscover) {
|
if (this.isDiscover) {
|
||||||
this.ui.discoverHeader.show();
|
this.ui.discoverBefore.show();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -213,7 +220,34 @@ module.exports = Marionette.Layout.extend({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_discover : function() {
|
_discover : function(action) {
|
||||||
this.collection.fetch()
|
if (this.collection.action === action) {
|
||||||
}
|
return
|
||||||
|
}
|
||||||
|
this.searchResult.show(new LoadingView());
|
||||||
|
this.collection.action = action;
|
||||||
|
this.collection.fetch({
|
||||||
|
data : { action : action }
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
_discoverRecos : function() {
|
||||||
|
this.ui.discoverRecos.tab("show");
|
||||||
|
this.ui.discoverHeader.html("Recommendations by The Movie Database for you");
|
||||||
|
this._discover("recommendations");
|
||||||
|
},
|
||||||
|
|
||||||
|
_discoverPopular : function() {
|
||||||
|
this.ui.discoverPopular.tab("show");
|
||||||
|
this.ui.discoverHeader.html("Currently Popular Movies");
|
||||||
|
this._discover("popular");
|
||||||
|
},
|
||||||
|
|
||||||
|
_discoverUpcoming : function() {
|
||||||
|
this.ui.discoverUpcoming.tab("show");
|
||||||
|
this.ui.discoverHeader.html("Movies coming to Blu-Ray in the next weeks");
|
||||||
|
this._discover("upcoming");
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -4,9 +4,18 @@
|
||||||
{{folder.path}}
|
{{folder.path}}
|
||||||
</div>
|
</div>
|
||||||
</div>{{/if}}
|
</div>{{/if}}
|
||||||
<h2 class="x-discover-header">
|
|
||||||
Recommendations by The Movie Database based on your library:
|
<div class="x-discover-before">
|
||||||
</h2>
|
<ul class="nav nav-tabs nav-justified settings-tabs">
|
||||||
|
<li><a href="#media-management" class="x-recommendations-tab no-router">Recommendations</a></li>
|
||||||
|
<li><a href="#popular" class="x-popular-tab no-router">Popular</a></li>
|
||||||
|
<li><a href="#upcoming" class="x-upcoming-tab no-router">Upcoming</a></li>
|
||||||
|
</ul>
|
||||||
|
<h2 class="x-discover-header">
|
||||||
|
Recommendations by The Movie Database based on your library:
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="x-search-bar">
|
<div class="x-search-bar">
|
||||||
<div class="input-group input-group-lg add-movies-search">
|
<div class="input-group input-group-lg add-movies-search">
|
||||||
<span class="input-group-addon"><i class="icon-sonarr-search"/></span>
|
<span class="input-group-addon"><i class="icon-sonarr-search"/></span>
|
||||||
|
|
|
@ -3,7 +3,11 @@ var MovieModel = require('../Movies/MovieModel');
|
||||||
var _ = require('underscore');
|
var _ = require('underscore');
|
||||||
|
|
||||||
module.exports = Backbone.Collection.extend({
|
module.exports = Backbone.Collection.extend({
|
||||||
url : window.NzbDrone.ApiRoot + "/movies/discover",
|
url : function() {
|
||||||
|
var route = this.action || "";
|
||||||
|
return window.NzbDrone.ApiRoot + "/movies/discover/" + route;
|
||||||
|
},
|
||||||
|
|
||||||
model : MovieModel,
|
model : MovieModel,
|
||||||
|
|
||||||
parse : function(response) {
|
parse : function(response) {
|
||||||
|
|
|
@ -52,7 +52,6 @@ module.exports = Marionette.ItemView.extend({
|
||||||
|
|
||||||
this.listenTo(FullMovieCollection, 'save', function() {
|
this.listenTo(FullMovieCollection, 'save', function() {
|
||||||
window.alert(' Done Saving');
|
window.alert(' Done Saving');
|
||||||
|
|
||||||
var selected = FullMovieCollection.where({ selected : true });
|
var selected = FullMovieCollection.where({ selected : true });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -177,7 +176,7 @@ module.exports = Marionette.ItemView.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
_organizeFiles : function() {
|
_organizeFiles : function() {
|
||||||
var selected = this.editorGrid.getSelectedModels();
|
var selected = FullMovieCollection.where({ selected : true });
|
||||||
var updateFilesMoviesView = new UpdateFilesMoviesView({ movies : selected });
|
var updateFilesMoviesView = new UpdateFilesMoviesView({ movies : selected });
|
||||||
this.listenToOnce(updateFilesMoviesView, 'updatingFiles', this._afterSave);
|
this.listenToOnce(updateFilesMoviesView, 'updatingFiles', this._afterSave);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue