Made some of the searching async #278

This commit is contained in:
tidusjar 2016-05-27 14:31:47 +01:00
parent e3cd016dc7
commit 8550cc4c5e

View file

@ -47,7 +47,7 @@ using PlexRequests.Store;
using PlexRequests.UI.Helpers; using PlexRequests.UI.Helpers;
using PlexRequests.UI.Models; using PlexRequests.UI.Models;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms;
using Nancy.Extensions; using Nancy.Extensions;
using PlexRequests.Api.Models.Tv; using PlexRequests.Api.Models.Tv;
using PlexRequests.Store.Models; using PlexRequests.Store.Models;
@ -94,13 +94,13 @@ namespace PlexRequests.UI.Modules
Get["/"] = parameters => RequestLoad(); Get["/"] = parameters => RequestLoad();
Get["movie/{searchTerm}"] = parameters => SearchMovie((string)parameters.searchTerm); Get["movie/{searchTerm}", true] = async (x, ct) => await SearchMovie((string)x.searchTerm);
Get["tv/{searchTerm}"] = parameters => SearchTvShow((string)parameters.searchTerm); Get["tv/{searchTerm}", true] = async (x, ct) => await SearchTvShow((string)x.searchTerm);
Get["music/{searchTerm}"] = parameters => SearchMusic((string)parameters.searchTerm); Get["music/{searchTerm}", true] = async (x, ct) => await SearchMusic((string)x.searchTerm);
Get["music/coverArt/{id}"] = p => GetMusicBrainzCoverArt((string)p.id); Get["music/coverArt/{id}"] = p => GetMusicBrainzCoverArt((string)p.id);
Get["movie/upcoming"] = parameters => UpcomingMovies(); Get["movie/upcoming", true] = async (x, ct) => await UpcomingMovies();
Get["movie/playing"] = parameters => CurrentlyPlayingMovies(); Get["movie/playing", true] = async (x, ct) => await CurrentlyPlayingMovies();
Post["request/movie"] = parameters => RequestMovie((int)Request.Form.movieId); Post["request/movie"] = parameters => RequestMovie((int)Request.Form.movieId);
Post["request/tv"] = parameters => RequestTvShow((int)Request.Form.tvId, (string)Request.Form.seasons); Post["request/tv"] = parameters => RequestTvShow((int)Request.Form.tvId, (string)Request.Form.seasons);
@ -144,75 +144,80 @@ namespace PlexRequests.UI.Modules
return View["Search/Index", settings]; return View["Search/Index", settings];
} }
private Response UpcomingMovies() private async Task<Response> UpcomingMovies()
{ {
Log.Trace("Loading upcoming movies"); Log.Trace("Loading upcoming movies");
return ProcessMovies(MovieSearchType.Upcoming, string.Empty); return await ProcessMovies(MovieSearchType.Upcoming, string.Empty);
} }
private Response CurrentlyPlayingMovies() private async Task<Response> CurrentlyPlayingMovies()
{ {
Log.Trace("Loading currently playing movies"); Log.Trace("Loading currently playing movies");
return ProcessMovies(MovieSearchType.CurrentlyPlaying, string.Empty); return await ProcessMovies(MovieSearchType.CurrentlyPlaying, string.Empty);
} }
private Response SearchMovie(string searchTerm) private async Task<Response> SearchMovie(string searchTerm)
{ {
Log.Trace("Searching for Movie {0}", searchTerm); Log.Trace("Searching for Movie {0}", searchTerm);
return ProcessMovies(MovieSearchType.Search, searchTerm); return await ProcessMovies(MovieSearchType.Search, searchTerm);
} }
private Response ProcessMovies(MovieSearchType searchType, string searchTerm) private async Task<Response> ProcessMovies(MovieSearchType searchType, string searchTerm)
{ {
var taskList = new List<Task>();
var apiMovies = new List<MovieResult>(); var apiMovies = new List<MovieResult>();
taskList.Add(Task.Factory.StartNew(() => await Task.Factory.StartNew(
{ () =>
switch (searchType)
{ {
case MovieSearchType.Search: switch (searchType)
return MovieApi.SearchMovie(searchTerm).Result.Select(x => new MovieResult() {
{ case MovieSearchType.Search:
Adult = x.Adult, return
BackdropPath = x.BackdropPath, MovieApi.SearchMovie(searchTerm)
GenreIds = x.GenreIds, .Result.Select(
Id = x.Id, x =>
OriginalLanguage = x.OriginalLanguage, new MovieResult()
OriginalTitle = x.OriginalTitle, {
Overview = x.Overview, Adult = x.Adult,
Popularity = x.Popularity, BackdropPath = x.BackdropPath,
PosterPath = x.PosterPath, GenreIds = x.GenreIds,
ReleaseDate = x.ReleaseDate, Id = x.Id,
Title = x.Title, OriginalLanguage = x.OriginalLanguage,
Video = x.Video, OriginalTitle = x.OriginalTitle,
VoteAverage = x.VoteAverage, Overview = x.Overview,
VoteCount = x.VoteCount Popularity = x.Popularity,
}).ToList(); PosterPath = x.PosterPath,
case MovieSearchType.CurrentlyPlaying: ReleaseDate = x.ReleaseDate,
return MovieApi.GetCurrentPlayingMovies().Result.ToList(); Title = x.Title,
case MovieSearchType.Upcoming: Video = x.Video,
return MovieApi.GetUpcomingMovies().Result.ToList(); VoteAverage = x.VoteAverage,
default: VoteCount = x.VoteCount
return new List<MovieResult>(); })
} .ToList();
}).ContinueWith((t) => case MovieSearchType.CurrentlyPlaying:
{ return MovieApi.GetCurrentPlayingMovies().Result.ToList();
apiMovies = t.Result; case MovieSearchType.Upcoming:
})); return MovieApi.GetUpcomingMovies().Result.ToList();
default:
return new List<MovieResult>();
}
}).ContinueWith(
(t) =>
{
apiMovies = t.Result;
});
Dictionary<int, RequestedModel> dbMovies = new Dictionary<int, RequestedModel>(); Dictionary<int, RequestedModel> dbMovies = new Dictionary<int, RequestedModel>();
taskList.Add(Task.Factory.StartNew(() => await Task.Factory.StartNew(() =>
{ {
return RequestService.GetAll().Where(x => x.Type == RequestType.Movie); return RequestService.GetAll().Where(x => x.Type == RequestType.Movie);
}).ContinueWith((t) => }).ContinueWith((t) =>
{ {
var distinctResults = t.Result.DistinctBy(x => x.ProviderId); var distinctResults = t.Result.DistinctBy(x => x.ProviderId);
dbMovies = distinctResults.ToDictionary(x => x.ProviderId); dbMovies = distinctResults.ToDictionary(x => x.ProviderId);
})); });
Task.WaitAll(taskList.ToArray());
var cpCached = CpCacher.QueuedIds(); var cpCached = CpCacher.QueuedIds();
var plexMovies = Checker.GetPlexMovies(); var plexMovies = Checker.GetPlexMovies();
@ -272,33 +277,25 @@ namespace PlexRequests.UI.Modules
return true; return true;
} }
private Response SearchTvShow(string searchTerm) private async Task<Response> SearchTvShow(string searchTerm)
{ {
Log.Trace("Searching for TV Show {0}", searchTerm); Log.Trace("Searching for TV Show {0}", searchTerm);
var taskList = new List<Task>();
var apiTv = new List<TvMazeSearch>(); var apiTv = new List<TvMazeSearch>();
taskList.Add(Task.Factory.StartNew(() => await Task.Factory.StartNew(() => new TvMazeApi().Search(searchTerm)).ContinueWith((t) =>
{
return new TvMazeApi().Search(searchTerm);
}).ContinueWith((t) =>
{ {
apiTv = t.Result; apiTv = t.Result;
})); });
var dbTv = new Dictionary<int, RequestedModel>(); var dbTv = new Dictionary<int, RequestedModel>();
taskList.Add(Task.Factory.StartNew(() => await Task.Factory.StartNew(() =>
{ {
return RequestService.GetAll().Where(x => x.Type == RequestType.TvShow); return RequestService.GetAll().Where(x => x.Type == RequestType.TvShow);
}).ContinueWith((t) => }).ContinueWith((t) =>
{ {
dbTv = t.Result.ToDictionary(x => x.ProviderId); dbTv = t.Result.ToDictionary(x => x.ProviderId);
})); });
Task.WaitAll(taskList.ToArray());
if (!apiTv.Any()) if (!apiTv.Any())
{ {
@ -361,31 +358,25 @@ namespace PlexRequests.UI.Modules
return Response.AsJson(viewTv); return Response.AsJson(viewTv);
} }
private Response SearchMusic(string searchTerm) private async Task<Response> SearchMusic(string searchTerm)
{ {
var taskList = new List<Task>();
var apiAlbums = new List<Release>(); var apiAlbums = new List<Release>();
taskList.Add(Task.Factory.StartNew(() => await Task.Factory.StartNew(() => MusicBrainzApi.SearchAlbum(searchTerm)).ContinueWith((t) =>
{
return MusicBrainzApi.SearchAlbum(searchTerm);
}).ContinueWith((t) =>
{ {
apiAlbums = t.Result.releases ?? new List<Release>(); apiAlbums = t.Result.releases ?? new List<Release>();
})); });
var dbAlbum = new Dictionary<string, RequestedModel>(); var dbAlbum = new Dictionary<string, RequestedModel>();
taskList.Add(Task.Factory.StartNew(() => await Task.Factory.StartNew(() =>
{ {
return RequestService.GetAll().Where(x => x.Type == RequestType.Album); return RequestService.GetAll().Where(x => x.Type == RequestType.Album);
}).ContinueWith((t) =>
{
dbAlbum = t.Result.ToDictionary(x => x.MusicBrainzId);
});
}).ContinueWith((t) =>
{
dbAlbum = t.Result.ToDictionary(x => x.MusicBrainzId);
}));
Task.WaitAll(taskList.ToArray());
var plexAlbums = Checker.GetPlexAlbums(); var plexAlbums = Checker.GetPlexAlbums();
@ -935,7 +926,7 @@ namespace PlexRequests.UI.Modules
var email = EmailNotificationSettings.GetSettings().EnableUserEmailNotifications; var email = EmailNotificationSettings.GetSettings().EnableUserEmailNotifications;
if (!auth) if (!auth)
{ {
return Response.AsJson(new JsonResponseModel { Result = false, Message = "Sorry, but this functionality is currently only for users with Plex accounts"}); return Response.AsJson(new JsonResponseModel { Result = false, Message = "Sorry, but this functionality is currently only for users with Plex accounts" });
} }
if (!email) if (!email)
{ {