/// <summary>
        /// Set the movie as favorite
        /// </summary>
        /// <param name="movie">Favorite movie</param>
        public async Task SetFavoriteMovieAsync(MovieShort movie)
        {
            if (movie == null)
            {
                throw new ArgumentNullException(nameof(movie));
            }
            var watch = Stopwatch.StartNew();

            try
            {
                using (var context = new ApplicationDbContext())
                {
                    var movieHistory = await context.MovieHistory.FirstOrDefaultAsync();

                    if (movieHistory == null)
                    {
                        await CreateMovieHistoryAsync();

                        movieHistory = await context.MovieHistory.FirstOrDefaultAsync();
                    }

                    if (movieHistory.MoviesShort == null)
                    {
                        movieHistory.MoviesShort = new List <Entity.Movie.MovieShort>
                        {
                            MovieShortFromModelToEntity(movie)
                        };

                        context.MovieHistory.AddOrUpdate(movieHistory);
                    }
                    else
                    {
                        var movieShort = movieHistory.MoviesShort.FirstOrDefault(p => p.MovieId == movie.Id);
                        if (movieShort == null)
                        {
                            movieHistory.MoviesShort.Add(MovieShortFromModelToEntity(movie));
                        }
                        else
                        {
                            movieShort.IsFavorite = movie.IsFavorite;
                        }
                    }

                    await context.SaveChangesAsync();
                }
            }
            catch (Exception exception)
            {
                Logger.Error(
                    $"SetFavoriteMovieAsync: {exception.Message}");
            }
            finally
            {
                watch.Stop();
                var elapsedMs = watch.ElapsedMilliseconds;
                Logger.Debug(
                    $"SetFavoriteMovieAsync ({movie.ImdbCode}) in {elapsedMs} milliseconds.");
            }
        }
        /// <summary>
        /// Convert a short movie model to a short movie entity
        /// </summary>
        /// <param name="movie">The movie to convert</param>
        /// <returns>Short movie entity</returns>
        private static Entity.Movie.MovieShort MovieShortFromModelToEntity(MovieShort movie)
        {
            if (movie == null)
            {
                throw new ArgumentNullException(nameof(movie));
            }
            var torrents = movie.Torrents.Select(torrent => new Entity.Movie.Torrent
            {
                DateUploaded    = torrent.DateUploaded,
                Url             = torrent.Url,
                Quality         = torrent.Quality,
                DateUploadedMix = torrent.DateUploadedUnix,
                Framerate       = torrent.Framerate,
                Hash            = torrent.Hash,
                Peers           = torrent.Peers,
                Resolution      = torrent.Resolution,
                Seeds           = torrent.Seeds,
                Size            = torrent.Size,
                SizeBytes       = torrent.SizeBytes
            });

            var genres = movie.Genres.Select(genre => new Genre
            {
                Name = genre
            });

            var movieShort = new Entity.Movie.MovieShort
            {
                MovieId         = movie.Id,
                IsFavorite      = movie.IsFavorite,
                HasBeenSeen     = movie.HasBeenSeen,
                ServerTime      = movie.ServerTime,
                ServerTimezone  = movie.ServerTimezone,
                SmallCoverImage = movie.SmallCoverImage,
                State           = movie.State,
                Year            = movie.Year,
                Language        = movie.Language,
                ImdbCode        = movie.ImdbCode,
                Title           = movie.Title,
                Id               = movie.Id,
                DateUploaded     = movie.DateUploaded,
                Runtime          = movie.Runtime,
                Url              = movie.Url,
                TitleLong        = movie.TitleLong,
                Torrents         = torrents.ToList(),
                MediumCoverImage = movie.MediumCoverImage,
                Genres           = genres.ToList(),
                DateUploadedUnix = movie.DateUploadedUnix,
                CoverImagePath   = movie.CoverImagePath,
                MpaRating        = movie.MpaRating,
                Rating           = movie.RatingValue,
                ExecutionTime    = movie.ExecutionTime,
                ApiVersion       = movie.ApiVersion
            };

            return(movieShort);
        }
        /// <summary>
        /// Convert a short movie model to a short movie entity
        /// </summary>
        /// <param name="movie">The movie to convert</param>
        /// <returns>Short movie entity</returns>
        private static Entity.Movie.MovieShort MovieShortFromModelToEntity(MovieShort movie)
        {
            var torrents = movie.Torrents.Select(torrent => new Entity.Movie.Torrent
            {
                DateUploaded = torrent.DateUploaded,
                Url = torrent.Url,
                Quality = torrent.Quality,
                DateUploadedMix = torrent.DateUploadedUnix,
                Framerate = torrent.Framerate,
                Hash = torrent.Hash,
                Peers = torrent.Peers,
                Resolution = torrent.Resolution,
                Seeds = torrent.Seeds,
                Size = torrent.Size,
                SizeBytes = torrent.SizeBytes
            });

            var genres = movie.Genres.Select(genre => new Genre
            {
                Name = genre
            });

            var movieShort = new Entity.Movie.MovieShort
            {
                MovieId = movie.Id,
                IsFavorite = movie.IsFavorite,
                HasBeenSeen = movie.HasBeenSeen,
                ServerTime = movie.ServerTime,
                ServerTimezone = movie.ServerTimezone,
                SmallCoverImage = movie.SmallCoverImage,
                State = movie.State,
                Year = movie.Year,
                Language = movie.Language,
                ImdbCode = movie.ImdbCode,
                Title = movie.Title,
                Id = movie.Id,
                DateUploaded = movie.DateUploaded,
                Runtime = movie.Runtime,
                Url = movie.Url,
                TitleLong = movie.TitleLong,
                Torrents = torrents.ToList(),
                MediumCoverImage = movie.MediumCoverImage,
                Genres = genres.ToList(),
                DateUploadedUnix = movie.DateUploadedUnix,
                CoverImagePath = movie.CoverImagePath,
                MpaRating = movie.MpaRating,
                Rating = movie.RatingValue,
                ExecutionTime = movie.ExecutionTime,
                ApiVersion = movie.ApiVersion
            };

            return movieShort;
        }
        /// <summary>
        /// Set the movie as favorite
        /// </summary>
        /// <param name="movie">Favorite movie</param>
        public async Task SetFavoriteMovieAsync(MovieShort movie)
        {
            var watch = Stopwatch.StartNew();

            try
            {
                using (var context = new ApplicationDbContext())
                {
                    var movieHistory = await context.MovieHistory.FirstOrDefaultAsync();
                    if (movieHistory == null)
                    {
                        await CreateMovieHistoryAsync();
                        movieHistory = await context.MovieHistory.FirstOrDefaultAsync();
                    }

                    if (movieHistory.MoviesShort == null)
                    {
                        movieHistory.MoviesShort = new List<Entity.Movie.MovieShort>
                        {
                            MovieShortFromModelToEntity(movie)
                        };

                        context.MovieHistory.AddOrUpdate(movieHistory);
                    }
                    else
                    {
                        var movieShort = movieHistory.MoviesShort.FirstOrDefault(p => p.MovieId == movie.Id);
                        if (movieShort == null)
                        {
                            movieHistory.MoviesShort.Add(MovieShortFromModelToEntity(movie));
                        }
                        else
                        {
                            movieShort.IsFavorite = movie.IsFavorite;
                        }
                    }

                    await context.SaveChangesAsync();
                }
            }
            catch (Exception exception)
            {
                Logger.Error(
                    $"SetFavoriteMovieAsync: {exception.Message}");
            }
            finally
            {
                watch.Stop();
                var elapsedMs = watch.ElapsedMilliseconds;
                Logger.Debug(
                    $"SetFavoriteMovieAsync ({movie.ImdbCode}) in {elapsedMs} milliseconds.");
            }
        }