示例#1
0
        /// <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);
        }
示例#2
0
        /// <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;
        }
示例#6
0
        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();
        }
示例#7
0
        /// <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();
            }
        }