diff --git a/PlexRequests.UI/Content/requests-1.7.js b/PlexRequests.UI/Content/requests-1.7.js index 453c6d7cb..84c0e5d49 100644 --- a/PlexRequests.UI/Content/requests-1.7.js +++ b/PlexRequests.UI/Content/requests-1.7.js @@ -514,8 +514,10 @@ function mixItUpConfig(activeState) { return conf; }; +var position = 0; function initLoad() { - movieLoad(); + //movieLoad(); + movieLoadWithPosition(0); tvLoad(); albumLoad(); } @@ -544,6 +546,52 @@ function movieLoad() { }); }; +function movieLoadWithPosition(pos) { + var $ml = $('#movieList'); + if ($ml.mixItUp('isLoaded')) { + activeState = $ml.mixItUp('getState'); + $ml.mixItUp('destroy'); + } + + var url = createBaseUrl(base, '/requests/movies/'+pos); + $.ajax(url).success(function (results) { + if (results.length > 0) { + position++; + results.forEach(function (result) { + var context = buildRequestContext(result, "movie"); + var html = searchTemplate(context); + $ml.append(html); + }); + } + else { + $ml.append(noResultsHtml.format("movie")); + } + $ml.mixItUp(mixItUpConfig()); + }); +}; + +var win = $(window); + +$(win).scroll(function () { + if ($(win).scrollTop() + $(win).height() >= $(document).height() - 100) { + // Debounce the scroll event + if (this.timeoutId) + win.clearTimeout(this.timeoutId); + this.timeoutId = win.setTimeout(function () { + movieLoadWithPosition(position); + }, 200); + } +}); +//// Each time the user scrolls +//win.scroll(function () { +// // End of the document reached? +// if ($(document).height() - win.height() == win.scrollTop()) { +// $('#loading').show(); + +// movieLoadWithPosition(position); +// } +//}); + function tvLoad() { var $tvl = $('#tvList'); if ($tvl.mixItUp('isLoaded')) { diff --git a/PlexRequests.UI/Modules/RequestsModule.cs b/PlexRequests.UI/Modules/RequestsModule.cs index 64e150f58..460ac964b 100644 --- a/PlexRequests.UI/Modules/RequestsModule.cs +++ b/PlexRequests.UI/Modules/RequestsModule.cs @@ -74,7 +74,8 @@ namespace PlexRequests.UI.Modules Cache = cache; Get["/"] = _ => LoadRequests(); - Get["/movies"] = _ => GetMovies(); + Get["/movies", true] = async (x, ct) => await GetMovies(); + Get["/movies/{position}", true] = async (x, ct) => await GetMovies(x.position); Get["/tvshows"] = _ => GetTvShows(); Get["/albums"] = _ => GetAlbumRequests(); Post["/delete"] = _ => DeleteRequest((int)Request.Form.id); @@ -105,77 +106,61 @@ namespace PlexRequests.UI.Modules return View["Index", settings]; } - private Response GetMovies() // TODO: async await the API calls + private async Task GetMovies() { var settings = PrSettings.GetSettings(); - List taskList = new List(); + var allRequests = await Service.GetAllAsync(); + allRequests = allRequests.Where(x => x.Type == RequestType.Movie); - List dbMovies = new List(); - taskList.Add(Task.Factory.StartNew(() => - { - return Service.GetAll().Where(x => x.Type == RequestType.Movie); + var dbMovies = allRequests.ToList(); - }).ContinueWith((t) => + if (settings.UsersCanViewOnlyOwnRequests && !IsAdmin) { - dbMovies = t.Result.ToList(); - - if (settings.UsersCanViewOnlyOwnRequests && !IsAdmin) - { - dbMovies = dbMovies.Where(x => x.UserHasRequested(Username)).ToList(); - } - })); - + dbMovies = dbMovies.Where(x => x.UserHasRequested(Username)).ToList(); + } List qualities = new List(); - if (IsAdmin) + if (IsAdmin) { var cpSettings = CpSettings.GetSettings(); if (cpSettings.Enabled) { - taskList.Add(Task.Factory.StartNew(() => - { - return Cache.GetOrSet(CacheKeys.CouchPotatoQualityProfiles, () => - { - return CpApi.GetProfiles(cpSettings.FullUri, cpSettings.ApiKey); // TODO: cache this! - }); - }).ContinueWith((t) => + + var result = await Cache.GetOrSetAsync(CacheKeys.CouchPotatoQualityProfiles, async () => { - qualities = t.Result.list.Select(x => new QualityModel() { Id = x._id, Name = x.label }).ToList(); - })); + return await Task.Run(() => CpApi.GetProfiles(cpSettings.FullUri, cpSettings.ApiKey)).ConfigureAwait(false); + }); + + qualities = result.list.Select(x => new QualityModel() { Id = x._id, Name = x.label }).ToList(); } } - Task.WaitAll(taskList.ToArray()); - - var viewModel = dbMovies.Select(movie => + var viewModel = dbMovies.Select(movie => new RequestViewModel { - return new RequestViewModel - { - ProviderId = movie.ProviderId, - Type = movie.Type, - Status = movie.Status, - ImdbId = movie.ImdbId, - Id = movie.Id, - PosterPath = movie.PosterPath, - ReleaseDate = movie.ReleaseDate, - ReleaseDateTicks = movie.ReleaseDate.Ticks, - RequestedDate = movie.RequestedDate, - Released = DateTime.Now > movie.ReleaseDate, - RequestedDateTicks = DateTimeHelper.OffsetUTCDateTime(movie.RequestedDate, DateTimeOffset).Ticks, - Approved = movie.Available || movie.Approved, - Title = movie.Title, - Overview = movie.Overview, - RequestedUsers = IsAdmin ? movie.AllUsers.ToArray() : new string[] { }, - ReleaseYear = movie.ReleaseDate.Year.ToString(), - Available = movie.Available, - Admin = IsAdmin, - Issues = movie.Issues.ToString().CamelCaseToWords(), - OtherMessage = movie.OtherMessage, - AdminNotes = movie.AdminNote, - Qualities = qualities.ToArray() - }; + ProviderId = movie.ProviderId, + Type = movie.Type, + Status = movie.Status, + ImdbId = movie.ImdbId, + Id = movie.Id, + PosterPath = movie.PosterPath, + ReleaseDate = movie.ReleaseDate, + ReleaseDateTicks = movie.ReleaseDate.Ticks, + RequestedDate = movie.RequestedDate, + Released = DateTime.Now > movie.ReleaseDate, + RequestedDateTicks = DateTimeHelper.OffsetUTCDateTime(movie.RequestedDate, DateTimeOffset).Ticks, + Approved = movie.Available || movie.Approved, + Title = movie.Title, + Overview = movie.Overview, + RequestedUsers = IsAdmin ? movie.AllUsers.ToArray() : new string[] { }, + ReleaseYear = movie.ReleaseDate.Year.ToString(), + Available = movie.Available, + Admin = IsAdmin, + Issues = movie.Issues.ToString().CamelCaseToWords(), + OtherMessage = movie.OtherMessage, + AdminNotes = movie.AdminNote, + Qualities = qualities.ToArray() }).ToList(); return Response.AsJson(viewModel); @@ -196,7 +181,7 @@ namespace PlexRequests.UI.Modules { dbTv = t.Result.ToList(); - if (settings.UsersCanViewOnlyOwnRequests && !IsAdmin) + if (settings.UsersCanViewOnlyOwnRequests && !IsAdmin) { dbTv = dbTv.Where(x => x.UserHasRequested(Username)).ToList(); } @@ -214,13 +199,14 @@ namespace PlexRequests.UI.Modules { return SonarrApi.GetProfiles(sonarrSettings.ApiKey, sonarrSettings.FullUri); // TODO: cache this! - }); + }); }).ContinueWith((t) => { qualities = t.Result.Select(x => new QualityModel() { Id = x.id.ToString(), Name = x.name }).ToList(); })); } - else { + else + { var sickRageSettings = SickRageSettings.GetSettings(); if (sickRageSettings.Enabled) { @@ -309,8 +295,8 @@ namespace PlexRequests.UI.Modules } private Response DeleteRequest(int requestid) - { - this.RequiresClaims (UserClaims.Admin); + { + this.RequiresClaims(UserClaims.Admin); var currentEntity = Service.Get(requestid); Service.DeleteRequest(currentEntity); @@ -357,7 +343,7 @@ namespace PlexRequests.UI.Modules private Response ClearIssue(int requestId) { - this.RequiresClaims ( UserClaims.Admin); + this.RequiresClaims(UserClaims.Admin); var originalRequest = Service.Get(requestId); if (originalRequest == null) @@ -374,8 +360,8 @@ namespace PlexRequests.UI.Modules } private Response ChangeRequestAvailability(int requestId, bool available) - { - this.RequiresClaims (UserClaims.Admin); + { + this.RequiresClaims(UserClaims.Admin); var originalRequest = Service.Get(requestId); if (originalRequest == null) { @@ -391,8 +377,8 @@ namespace PlexRequests.UI.Modules } private Response AddNote(int requestId, string noteArea) - { - this.RequiresClaims (UserClaims.Admin); + { + this.RequiresClaims(UserClaims.Admin); var originalRequest = Service.Get(requestId); if (originalRequest == null) { @@ -406,5 +392,65 @@ namespace PlexRequests.UI.Modules ? new JsonResponseModel { Result = true } : new JsonResponseModel { Result = false, Message = "Could not update the notes, please try again or check the logs" }); } + + private async Task GetMovies(int position) + { + var settings = PrSettings.GetSettings(); + + var allRequests = await Service.GetAllAsync(); + allRequests = allRequests.Where(x => x.Type == RequestType.Movie).OrderByDescending(x => x.RequestedDate).Skip(position == 0 ? 0 : position * 3).Take(3); + + var dbMovies = allRequests.ToList(); + + if (settings.UsersCanViewOnlyOwnRequests && !IsAdmin) + { + dbMovies = dbMovies.Where(x => x.UserHasRequested(Username)).ToList(); + } + + List qualities = new List(); + + if (IsAdmin) + { + var cpSettings = CpSettings.GetSettings(); + if (cpSettings.Enabled) + { + + var result = await Cache.GetOrSetAsync(CacheKeys.CouchPotatoQualityProfiles, async () => + { + return await Task.Run(() => CpApi.GetProfiles(cpSettings.FullUri, cpSettings.ApiKey)).ConfigureAwait(false); + }); + + qualities = result.list.Select(x => new QualityModel() { Id = x._id, Name = x.label }).ToList(); + } + } + + var viewModel = dbMovies.Select(movie => new RequestViewModel + { + ProviderId = movie.ProviderId, + Type = movie.Type, + Status = movie.Status, + ImdbId = movie.ImdbId, + Id = movie.Id, + PosterPath = movie.PosterPath, + ReleaseDate = movie.ReleaseDate, + ReleaseDateTicks = movie.ReleaseDate.Ticks, + RequestedDate = movie.RequestedDate, + Released = DateTime.Now > movie.ReleaseDate, + RequestedDateTicks = DateTimeHelper.OffsetUTCDateTime(movie.RequestedDate, DateTimeOffset).Ticks, + Approved = movie.Available || movie.Approved, + Title = movie.Title, + Overview = movie.Overview, + RequestedUsers = IsAdmin ? movie.AllUsers.ToArray() : new string[] { }, + ReleaseYear = movie.ReleaseDate.Year.ToString(), + Available = movie.Available, + Admin = IsAdmin, + Issues = movie.Issues.ToString().CamelCaseToWords(), + OtherMessage = movie.OtherMessage, + AdminNotes = movie.AdminNote, + Qualities = qualities.ToArray() + }).ToList(); + + return Response.AsJson(viewModel); + } } }