/// <summary> /// Updates all subsections and/or movies contained in this section /// </summary> /// <param name="section"></param> /// <returns></returns> public override NodeResult Update() { string sectionUri = this.Uri; Configuration config = this.session.Config; #region Root if (sectionUri == Section.RootUri) { //Sections.Clear(); //Section subSection = this.session.Get<Section>(Section.FeaturedUri); //subSection.Name = "Featured"; //this.Sections.Add(subSection); this.state = NodeState.Complete; return(NodeResult.Success); } #endregion #region Featured if (sectionUri == Section.FeaturedUri) { Sections.Clear(); Section subSection = this.session.Get <Section>(config.FeaturedJustAddedUri); subSection.Name = "Just Added"; Sections.Add(subSection); subSection = this.session.Get <Section>(config.FeaturedMostPopularUri); subSection.Name = "Most Popular"; Sections.Add(subSection); subSection = this.session.Get <Section>(config.FeaturedExclusiveUri); subSection.Name = "Exclusive"; Sections.Add(subSection); subSection = this.session.Get <Section>(config.FeaturedGenresUri); subSection.Name = "Genre"; Sections.Add(subSection); subSection = this.session.Get <Section>(config.FeaturedStudiosUri); subSection.Name = "Movie Studio"; Sections.Add(subSection); this.state = NodeState.Complete; return(NodeResult.Success); } #endregion bool IsFtGenre = sectionUri.StartsWith("urn://itunes/featured/genre/"); bool IsFtStudio = sectionUri.StartsWith("urn://itunes/featured/studio/"); string requestUri; if (IsFtGenre) { requestUri = config.FeaturedGenresUri; } else if (IsFtStudio) { requestUri = config.FeaturedStudiosUri; } else { requestUri = Uri; } string data = this.session.MakeRequest(requestUri); Sections.Clear(); Movies.Clear(); List <Movie> movies = new List <Movie>(); movies = Movie.GetMoviesFromJsonData(session, data); #region Featured Genres if (Uri == config.FeaturedGenresUri) { var genres = ( from m in movies select m.Genres[0] ).Distinct(); foreach (string genre in genres) { string genreUrn = "urn://itunes/featured/genre/" + genre.ToLower().Replace(" ", ""); Section genreSection = this.session.Get <Section>(genreUrn); if (genreSection.State == NodeState.Complete) { genreSection.Movies.Clear(); } genreSection.Name = genre; List <Movie> genresMovies = movies.FindAll(m => m.Genres[0] == genre); genreSection.Movies.AddRange(genresMovies); genreSection.state = NodeState.Complete; Sections.Add(genreSection); } this.state = NodeState.Complete; return(NodeResult.Success); } #endregion #region Featured Studios else if (this.uri == config.FeaturedStudiosUri) { var studios = ( from m in movies select m.Studio ).Distinct(); foreach (string studio in studios) { string studioUrn = "urn://itunes/featured/studio/" + studio.ToLower().Replace(" ", ""); Section studioSection = this.session.Get <Section>(studioUrn); studioSection.Name = studio; List <Movie> studiosMovies = movies.FindAll(m => m.Studio == studio); studioSection.Movies.AddRange(studiosMovies); studioSection.state = NodeState.Complete; Sections.Add(studioSection); } this.state = NodeState.Complete; return(NodeResult.Success); } #endregion #region Featured Subitems else if (sectionUri.StartsWith("urn://itunes/featured/genre/")) { movies = movies.FindAll(m => m.Genres[0] == this.Name); } else if (sectionUri.StartsWith("urn://itunes/featured/studio/")) { movies = movies.FindAll(m => m.Studio == this.Name); } #endregion Movies.AddRange(movies); this.state = NodeState.Complete; return(NodeResult.Success); }
/// <summary> /// Load movies asynchronously /// </summary> public override async Task LoadMoviesAsync(bool reset = false) { await LoadingSemaphore.WaitAsync(CancellationLoadingMovies.Token); StopLoadingMovies(); if (reset) { Movies.Clear(); Page = 0; VerticalScroll = 0d; } var watch = Stopwatch.StartNew(); Page++; if (Page > 1 && Movies.Count == MaxNumberOfMovies && reset) { Page--; LoadingSemaphore.Release(); return; } StopLoadingMovies(); Logger.Trace( $"Loading page {Page}..."); HasLoadingFailed = false; try { IsLoadingMovies = true; var getMoviesWatcher = new Stopwatch(); getMoviesWatcher.Start(); var seen = UserService.GetSeenMovies(Page); var favorites = UserService.GetFavoritesMovies(Page); var movies = seen.allMovies.Union(favorites.allMovies).Distinct().ToList(); var result = await MovieService .GetSimilar(Page, MaxMoviesPerPage, Rating, SortBy, movies, CancellationLoadingMovies.Token, Genre); getMoviesWatcher.Stop(); var getMoviesEllapsedTime = getMoviesWatcher.ElapsedMilliseconds; if (reset && getMoviesEllapsedTime < 500) { // Wait for VerticalOffset to reach 0 (animation lasts 500ms) await Task.Delay(500 - (int)getMoviesEllapsedTime, CancellationLoadingMovies.Token); } Movies.AddRange(result.movies.Except(Movies, new MovieLightComparer())); IsLoadingMovies = false; IsMovieFound = Movies.Any(); CurrentNumberOfMovies = Movies.Count; MaxNumberOfMovies = result.nbMovies == 0 ? Movies.Count : result.nbMovies; UserService.SyncMovieHistory(Movies); } catch (Exception exception) { Page--; Logger.Error( $"Error while loading page {Page}: {exception.Message}"); HasLoadingFailed = true; Messenger.Default.Send(new ManageExceptionMessage(exception)); } finally { watch.Stop(); var elapsedMs = watch.ElapsedMilliseconds; Logger.Trace( $"Loaded page {Page} in {elapsedMs} milliseconds."); LoadingSemaphore.Release(); } }
/// <summary> /// Search movies asynchronously /// </summary> public override async Task LoadMoviesAsync(bool reset = false) { await LoadingSemaphore.WaitAsync(CancellationLoadingMovies.Token); await Task.Run(async() => { StopLoadingMovies(); if (reset) { DispatcherHelper.CheckBeginInvokeOnUI(() => { Movies.Clear(); Page = 0; VerticalScroll = 0d; }); } var watch = Stopwatch.StartNew(); Page++; if (Page > 1 && Movies.Count == MaxNumberOfMovies) { Page--; LoadingSemaphore.Release(); return; } Logger.Info( $"Loading search page {Page} with criteria: {SearchFilter}"); HasLoadingFailed = false; try { IsLoadingMovies = true; var result = await MovieService.SearchMoviesAsync(SearchFilter, Page, MaxMoviesPerPage, Genre, Rating, CancellationLoadingMovies.Token); DispatcherHelper.CheckBeginInvokeOnUI(() => { Movies.AddRange(result.movies.Except(Movies, new MovieLightComparer())); IsLoadingMovies = false; IsMovieFound = Movies.Any(); CurrentNumberOfMovies = Movies.Count; MaxNumberOfMovies = result.nbMovies; UserService.SyncMovieHistory(Movies); }); } catch (Exception exception) { Page--; Logger.Error( $"Error while loading search page {Page} with criteria {SearchFilter}: {exception.Message}"); HasLoadingFailed = true; Messenger.Default.Send(new ManageExceptionMessage(exception)); } finally { watch.Stop(); var elapsedMs = watch.ElapsedMilliseconds; Logger.Info( $"Loaded search page {Page} with criteria {SearchFilter} in {elapsedMs} milliseconds."); LoadingSemaphore.Release(); } }); }
/// <summary> /// Load movies asynchronously /// </summary> public override async Task LoadMoviesAsync(bool reset = false) { await LoadingSemaphore.WaitAsync(); StopLoadingMovies(); if (reset) { Movies.Clear(); Page = 0; } var watch = Stopwatch.StartNew(); Page++; if (Page > 1 && Movies.Count == MaxNumberOfMovies) { Page--; LoadingSemaphore.Release(); return; } Logger.Info( "Loading movies favorites page..."); HasLoadingFailed = false; try { IsLoadingMovies = true; var imdbIds = await UserService.GetFavoritesMovies(Page); if (!_needSync) { var movies = new List <MovieJson>(); await imdbIds.movies.ParallelForEachAsync(async imdbId => { var movie = await MovieService.GetMovieAsync(imdbId); if (movie != null) { movie.IsFavorite = true; movies.Add(movie); } }); var updatedMovies = movies.OrderBy(a => a.Title) .Where(a => (Genre != null ? a.Genres.Any( genre => genre.ToLowerInvariant() == Genre.EnglishName.ToLowerInvariant()) : a.Genres.TrueForAll(b => true)) && a.Rating >= Rating); Movies.AddRange(updatedMovies.Except(Movies.ToList(), new MovieComparer())); } else { var moviesToDelete = Movies.Select(a => a.ImdbCode).Except(imdbIds.allMovies); var moviesToAdd = imdbIds.allMovies.Except(Movies.Select(a => a.ImdbCode)); foreach (var movie in moviesToDelete.ToList()) { Movies.Remove(Movies.FirstOrDefault(a => a.ImdbCode == movie)); } var movies = moviesToAdd.ToList(); await movies.ParallelForEachAsync(async imdbId => { var movie = await MovieService.GetMovieAsync(imdbId); if ((Genre != null ? movie.Genres.Any( genre => genre.ToLowerInvariant() == Genre.EnglishName.ToLowerInvariant()) : movie.Genres.TrueForAll(b => true)) && movie.Rating >= Rating) { DispatcherHelper.CheckBeginInvokeOnUI(() => { Movies.Add(movie); }); } }); } IsLoadingMovies = false; IsMovieFound = Movies.Any(); CurrentNumberOfMovies = Movies.Count; MaxNumberOfMovies = imdbIds.nbMovies; await UserService.SyncMovieHistoryAsync(Movies); } catch (Exception exception) { Page--; Logger.Error( $"Error while loading movies favorite page {Page}: {exception.Message}"); HasLoadingFailed = true; Messenger.Default.Send(new ManageExceptionMessage(exception)); } finally { Movies.Sort((a, b) => String.Compare(a.Title, b.Title, StringComparison.Ordinal)); _needSync = false; watch.Stop(); var elapsedMs = watch.ElapsedMilliseconds; Logger.Info( $"Loaded movies favorite page {Page} in {elapsedMs} milliseconds."); LoadingSemaphore.Release(); } }
protected async Task GetMoviesAsync(int page = 1) { IEnumerable <MoviePosterModel> movies; Loading = true; Movies.Clear(); CurrentPage = page; if (!CachedMovies.ContainsKey(page)) { try { if (_requestToken != null) { _requestToken.Cancel(); } _requestToken = new CancellationTokenSource(); var moviesResult = await _movieService.FindMoviesByPattern(SearchMovieTitle, page, _requestToken.Token); if (bool.Parse(moviesResult.Response)) { movies = moviesResult.Search.Select(m => new MoviePosterModel { Id = m.imdbID, Plot = m.Plot, Poster = m.Poster, Title = m.Title }); CachedMovies[page] = movies; if (MoviesCount == 0) { MoviesCount = int.Parse(moviesResult.totalResults); HasContent = MoviesCount > 0; PageCount = (int)Math.Ceiling(MoviesCount / 10d); } movies = CachedMovies[page]; Movies.AddRange(movies); } else { HasContent = false; } } catch (OperationCanceledException) { } catch { HasContent = false; } } else { movies = CachedMovies[page]; Movies.AddRange(movies); } Loading = false; }
public OrderContext(DbContextOptions <OrderContext> options) : base(options) { var orders = new[] { new Order { Id = Guid.Parse("9f35b48d-cb87-4783-bfdb-21e36012930a"), OrderState = 1, CustomerGuid = Guid.Parse("d3e3137e-ccc9-488c-9e89-50ba354738c2"), CustomerFullName = "Wolfgang Ofner" }, new Order { Id = Guid.Parse("bffcf83a-0224-4a7c-a278-5aae00a02c1e"), OrderState = 1, CustomerGuid = Guid.Parse("4a2f1e35-f527-4136-8b12-138a57e1ba08"), CustomerFullName = "Darth Vader" }, new Order { Id = Guid.Parse("58e5cd7d-856b-4224-bdff-bd8f85bf5a6d"), OrderState = 2, CustomerGuid = Guid.Parse("334feb16-d7bb-4ca9-ab56-f4fadeb88d21"), CustomerFullName = "Son Goku" } }; var movies = new[] { new Movie { Id = 1, Name = "Alien: Covenant", Genre = "Sci-fi", Director = "Ridley Scott" }, new Movie { Id = 2, Name = "The Lord Of The Rings", Genre = "Drama ,Fantasy", Director = "Peter Jackson" }, new Movie { Id = 3, Name = "Original Sin", Genre = "Drama", Director = "Michael Cristofer" }, new Movie { Id = 4, Name = "World War Z", Genre = "Horror", Director = "Marc Forster" } }; Order.AddRange(orders); SaveChanges(); Movies.AddRange(movies); SaveChanges(); }
/// <summary> /// Seed the database with some test data /// </summary> public void Seed() { //Set-up some movies MovieModel movieTheyLive = new MovieModel { Title = "They Live", Description = "Science fiction thriller, directed by John Carpenter", MovieActors = new List <MovieActor>() }; MovieModel movieTaxiDriver = new MovieModel { Title = "Taxi Driver", Description = "Martin Scorsese, neo-noir classic", MovieActors = new List <MovieActor>() }; MovieModel movieCapeFear = new MovieModel { Title = "Cape Fear", Description = "Creepy boat scene, parodied by The Simpsons", MovieActors = new List <MovieActor>() }; MovieModel movie48Hrs = new MovieModel { Title = "48 Hrs", Description = "80s cop film", MovieActors = new List <MovieActor>() }; //Set-up some actors ActorModel actorRoddyPiper = new ActorModel { FirstName = "'Rowdy' Roddy", Surname = "Piper", MovieActors = new List <MovieActor>() }; ActorModel actorKeithDavid = new ActorModel { FirstName = "Keith", Surname = "David", MovieActors = new List <MovieActor>() }; ActorModel actorRobertDeNiro = new ActorModel { FirstName = "Robert", Surname = "De Niro", MovieActors = new List <MovieActor>() }; ActorModel actorHarveyKeitel = new ActorModel { FirstName = "Harvey", Surname = "Keitel", MovieActors = new List <MovieActor>() }; ActorModel actorNickNolte = new ActorModel { FirstName = "Nick", Surname = "Nolte", MovieActors = new List <MovieActor>() }; ActorModel actorEddieMurphy = new ActorModel { FirstName = "Eddie", Surname = "Murphy", MovieActors = new List <MovieActor>() }; //Set-up the relationships MovieActor theyLiveRoddyPiper = new MovieActor { Movie = movieTheyLive, Actor = actorRoddyPiper }; MovieActor theyLiveKeithDavid = new MovieActor { Movie = movieTheyLive, Actor = actorKeithDavid }; MovieActor taxiDriverDeNiro = new MovieActor { Movie = movieTaxiDriver, Actor = actorRobertDeNiro }; MovieActor taxiDriverKeitel = new MovieActor { Movie = movieTaxiDriver, Actor = actorHarveyKeitel }; MovieActor capeFearDeNiro = new MovieActor { Movie = movieCapeFear, Actor = actorRobertDeNiro }; MovieActor capeFearNolte = new MovieActor { Movie = movieCapeFear, Actor = actorNickNolte }; MovieActor hrsNolte = new MovieActor { Movie = movie48Hrs, Actor = actorNickNolte }; MovieActor hrsMurphy = new MovieActor { Movie = movie48Hrs, Actor = actorEddieMurphy }; //Add the relationships movieTheyLive.MovieActors.Add(theyLiveRoddyPiper); movieTheyLive.MovieActors.Add(theyLiveKeithDavid); movieTaxiDriver.MovieActors.Add(taxiDriverDeNiro); movieTaxiDriver.MovieActors.Add(taxiDriverKeitel); movieCapeFear.MovieActors.Add(capeFearDeNiro); movieCapeFear.MovieActors.Add(capeFearNolte); movie48Hrs.MovieActors.Add(hrsMurphy); movie48Hrs.MovieActors.Add(hrsNolte); actorRoddyPiper.MovieActors.Add(theyLiveRoddyPiper); actorKeithDavid.MovieActors.Add(theyLiveKeithDavid); actorRobertDeNiro.MovieActors.Add(taxiDriverDeNiro); actorRobertDeNiro.MovieActors.Add(capeFearDeNiro); actorHarveyKeitel.MovieActors.Add(taxiDriverKeitel); actorNickNolte.MovieActors.Add(capeFearNolte); actorNickNolte.MovieActors.Add(hrsNolte); actorEddieMurphy.MovieActors.Add(hrsMurphy); Movies.AddRange(movieTheyLive, movieTaxiDriver, movieCapeFear, movie48Hrs); Actors.AddRange(actorRoddyPiper, actorKeithDavid, actorRobertDeNiro, actorHarveyKeitel, actorNickNolte, actorEddieMurphy); SaveChanges(); }
/// <summary> /// Search movies asynchronously /// </summary> /// <param name="searchFilter">The parameter of the search</param> public async Task SearchMoviesAsync(string searchFilter) { if (SearchFilter != searchFilter) { // We start an other search StopLoadingMovies(); Movies.Clear(); Page = 0; CurrentNumberOfMovies = 0; MaxNumberOfMovies = 0; IsLoadingMovies = false; } var watch = Stopwatch.StartNew(); Page++; if (Page > 1 && Movies.Count == MaxNumberOfMovies) { return; } Logger.Info( $"Loading page {Page} with criteria: {searchFilter}"); HasLoadingFailed = false; try { SearchFilter = searchFilter; IsLoadingMovies = true; var movies = await MovieService.SearchMoviesAsync(searchFilter, Page, MaxMoviesPerPage, Genre, Rating, CancellationLoadingMovies.Token).ConfigureAwait(false); DispatcherHelper.CheckBeginInvokeOnUI(async() => { Movies.AddRange(movies.Item1); IsLoadingMovies = false; IsMovieFound = Movies.Any(); CurrentNumberOfMovies = Movies.Count; MaxNumberOfMovies = movies.Item2; await MovieHistoryService.SetMovieHistoryAsync(movies.Item1).ConfigureAwait(false); }); } catch (Exception exception) { Page--; Logger.Error( $"Error while loading page {Page} with criteria {searchFilter}: {exception.Message}"); HasLoadingFailed = true; Messenger.Default.Send(new ManageExceptionMessage(exception)); } finally { watch.Stop(); var elapsedMs = watch.ElapsedMilliseconds; Logger.Info( $"Loaded page {Page} with criteria {searchFilter} in {elapsedMs} milliseconds."); } }
/// <summary> /// Load movies asynchronously /// </summary> public override async Task LoadMoviesAsync(bool reset = false) { await LoadingSemaphore.WaitAsync(); if (reset) { Movies.Clear(); Page = 0; VerticalScroll = 0d; } var watch = Stopwatch.StartNew(); Page++; if (Page > 1 && Movies.Count == MaxNumberOfMovies) { Page--; LoadingSemaphore.Release(); return; } StopLoadingMovies(); Logger.Info( $"Loading page {Page}..."); HasLoadingFailed = false; try { IsLoadingMovies = true; await Task.Run(async() => { var getMoviesWatcher = new Stopwatch(); getMoviesWatcher.Start(); var result = await MovieService.Discover(Page).ConfigureAwait(false); getMoviesWatcher.Stop(); var getMoviesEllapsedTime = getMoviesWatcher.ElapsedMilliseconds; if (reset && getMoviesEllapsedTime < 500) { // Wait for VerticalOffset to reach 0 (animation lasts 500ms) await Task.Delay(500 - (int)getMoviesEllapsedTime).ConfigureAwait(false); } DispatcherHelper.CheckBeginInvokeOnUI(() => { Movies.AddRange(result.Item1.Except(Movies, new MovieLightComparer())); IsLoadingMovies = false; IsMovieFound = Movies.Any(); CurrentNumberOfMovies = Movies.Count; MaxNumberOfMovies = result.nbMovies; UserService.SyncMovieHistory(Movies); }); }).ConfigureAwait(false); } catch (Exception exception) { Page--; Logger.Error( $"Error while loading page {Page}: {exception.Message}"); HasLoadingFailed = true; Messenger.Default.Send(new ManageExceptionMessage(exception)); } finally { watch.Stop(); var elapsedMs = watch.ElapsedMilliseconds; Logger.Info( $"Loaded page {Page} in {elapsedMs} milliseconds."); LoadingSemaphore.Release(); } }