/// <summary> /// Get TMDb movie informations /// </summary> /// <param name="movieToLoad">Movie to load</param> /// <returns>Movie's full details</returns> public async Task<MovieFull> GetMovieFullDetailsAsync(MovieShort movieToLoad) { var watch = Stopwatch.StartNew(); var restClient = new RestClient(Constants.YtsApiEndpoint); var request = new RestRequest("/{segment}", Method.GET); request.AddUrlSegment("segment", "movie_details.json"); request.AddParameter("movie_id", movieToLoad.Id); request.AddParameter("with_images", true); request.AddParameter("with_cast", true); var response = await restClient.ExecuteGetTaskAsync(request); if (response.ErrorException != null) { Logger.Error( $"Error while loading the movie {movieToLoad.Title}: {response.ErrorException.Message}"); Messenger.Default.Send(new ManageExceptionMessage(new WebException(response.ErrorException.Message))); } var movie = new MovieFull(); await Task.Run(() => { var wrapper = JsonConvert.DeserializeObject<WrapperMovieFullDeserialized>(response.Content); if (wrapper == null) return; var tmdbInfos = TmdbClient.GetMovie(wrapper.Movie.ImdbCode, MovieMethods.Credits); var rating = Convert.ToDouble(wrapper.Movie.Rating, CultureInfo.InvariantCulture); rating /= 2.0; movie = new MovieFull { Id = wrapper.Movie.Id, Actors = wrapper.Movie.Actors, BackgroundImagePath = string.Empty, DateUploaded = wrapper.Movie.DateUploaded, DateUploadedUnix = wrapper.Movie.DateUploadedUnix, DescriptionFull = tmdbInfos.Overview, DescriptionIntro = wrapper.Movie.DescriptionIntro, Directors = wrapper.Movie.Directors, DownloadCount = wrapper.Movie.DownloadCount, FullHdAvailable = wrapper.Movie.Torrents.Any(torrent => torrent.Quality == "1080p"), Genres = tmdbInfos.Genres.Select(a => a.Name).ToList(), Images = wrapper.Movie.Images, ImdbCode = wrapper.Movie.ImdbCode, Language = wrapper.Movie.Language, LikeCount = wrapper.Movie.LikeCount, MpaRating = wrapper.Movie.MpaRating, PosterImagePath = string.Empty, RatingValue = rating, RtAudienceRating = wrapper.Movie.RtAudienceRating, RtAudienceScore = wrapper.Movie.RtAudienceScore, RtCriticsRating = wrapper.Movie.RtCriticsRating, RtCrtiticsScore = wrapper.Movie.RtCrtiticsScore, Runtime = wrapper.Movie.Runtime, Title = tmdbInfos.Title, TitleLong = wrapper.Movie.TitleLong, Torrents = wrapper.Movie.Torrents, Url = wrapper.Movie.Url, WatchInFullHdQuality = false, Year = wrapper.Movie.Year, YtTrailerCode = wrapper.Movie.YtTrailerCode }; }); watch.Stop(); var elapsedMs = watch.ElapsedMilliseconds; Logger.Debug( $"GetMovieFullDetails ({movie.ImdbCode}) in {elapsedMs} milliseconds."); return movie; }
/// <summary> /// Translate movie informations (title, description, ...) /// </summary> /// <param name="movieToTranslate">Movie to translate</param> /// <returns>Task</returns> public async Task TranslateMovieShortAsync(MovieShort movieToTranslate) { var watch = Stopwatch.StartNew(); await Task.Run(() => { try { var movie = TmdbClient.GetMovie(movieToTranslate.ImdbCode, MovieMethods.Credits); movieToTranslate.Title = movie.Title; movieToTranslate.Genres = movie.Genres.Select(a => a.Name).ToList(); } catch (Exception ex) when (ex is SocketException || ex is WebException) { Logger.Error( $"Error while translating movie {movieToTranslate.Title}: {ex.Message}"); Messenger.Default.Send(new ManageExceptionMessage(ex)); } }); watch.Stop(); var elapsedMs = watch.ElapsedMilliseconds; Logger.Debug( $"TranslateMovieShortAsync ({movieToTranslate.ImdbCode}) in {elapsedMs} milliseconds."); }
/// <summary> /// Get the requested movie /// </summary> /// <param name="movie">The movie to load</param> private async Task LoadMovieAsync(MovieShort movie) { Messenger.Default.Send(new LoadMovieMessage(movie)); IsMovieLoading = true; try { Movie = await MovieService.GetMovieFullDetailsAsync(movie); IsMovieLoading = false; await MovieService.DownloadPosterImageAsync(Movie); await MovieService.DownloadDirectorImageAsync(Movie); await MovieService.DownloadActorImageAsync(Movie); await MovieService.DownloadBackgroundImageAsync(Movie); } catch (Exception ex) when (ex is SocketException || ex is WebException) { Messenger.Default.Send(new ManageExceptionMessage(ex)); } }
/// <summary> /// Constructor /// </summary> /// <param name="movie">The movie</param> public ChangeFavoriteMovieMessage(MovieShort movie) { Movie = movie; }
/// <summary> /// Constructor /// </summary> /// <param name="movie">Movie</param> public LoadMovieMessage(MovieShort movie) { Movie = movie; }
/// <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.DateUploadedMix, Framerate = torrent.Framerate, Hash = torrent.Hash, Peers = torrent.Peers, Resolution = torrent.Resolution, Seeds = torrent.Seeds, Size = torrent.Size, SizeBytes = torrent.SizeBytes }).ToList(); var genres = movie.Genres.Select(genre => new Genre { Name = genre }).ToList(); 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, MediumCoverImage = movie.MediumCoverImage, Genres = genres, 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 static async Task SetFavoriteMovieAsync(MovieShort movie) { await Task.Run(async () => { var watch = Stopwatch.StartNew(); using (var context = new ApplicationDbContext()) { await context.MovieHistory.LoadAsync(); 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(); } watch.Stop(); var elapsedMs = watch.ElapsedMilliseconds; Logger.Debug( $"SetFavoriteMovieAsync ({movie.ImdbCode}) in {elapsedMs} milliseconds."); }); }
/// <summary> /// Get movie by id /// </summary> /// <param name="id">Movie's id</param> /// <returns>Movie searched by movie id</returns> public async Task<MovieShort> GetMovieById(int id) { var watch = Stopwatch.StartNew(); var restClient = new RestClient(Constants.YtsApiEndpoint); var request = new RestRequest("/{segment}", Method.GET); request.AddUrlSegment("segment", "movie_details.json"); request.AddParameter("movie_id", id); request.AddParameter("with_cast", true); request.AddParameter("with_images", true); var response = await restClient.ExecuteGetTaskAsync(request); if (response.ErrorException != null) Messenger.Default.Send(new ManageExceptionMessage(new WebException(response.ErrorException.Message))); var movie = new MovieShort(); await Task.Run(() => { var wrapper = JsonConvert.DeserializeObject<WrapperMovieFullDeserialized>(response.Content); if (wrapper == null) return; var rating = Convert.ToDouble(movie.Rating, CultureInfo.InvariantCulture); rating /= 2.0; movie = new MovieShort { ApiVersion = wrapper.Meta.ApiVersion, DateUploaded = wrapper.Movie.DateUploaded, DateUploadedUnix = wrapper.Movie.DateUploadedUnix, ExecutionTime = wrapper.Meta.ExecutionTime, Genres = wrapper.Movie.Genres, Id = wrapper.Movie.Id, ImdbCode = wrapper.Movie.ImdbCode, IsFavorite = false, HasBeenSeen = false, Language = wrapper.Movie.Language, MediumCoverImage = wrapper.Movie.Images.MediumCoverImage, CoverImagePath = string.Empty, MpaRating = wrapper.Movie.MpaRating, RatingValue = rating, Runtime = wrapper.Movie.Runtime, ServerTime = wrapper.Meta.ServerTime, ServerTimezone = wrapper.Meta.ServerTimezone, SmallCoverImage = wrapper.Movie.Images.SmallCoverImage, State = wrapper.Status, Title = wrapper.Movie.TitleLong, TitleLong = wrapper.Movie.TitleLong, Torrents = wrapper.Movie.Torrents, Url = wrapper.Movie.Url, Year = wrapper.Movie.Year }; }); watch.Stop(); var elapsedMs = watch.ElapsedMilliseconds; Logger.Debug( $"GetMovieById ({id}) in {elapsedMs} milliseconds."); return movie; }
/// <summary> /// Get the requested movie /// </summary> /// <param name="movie">The movie to load</param> private async Task LoadMovieAsync(MovieShort movie) { Logger.Info( $"Loading movie: {movie.Title}"); Messenger.Default.Send(new LoadMovieMessage()); IsMovieLoading = true; try { Movie = await MovieService.GetMovieFullDetailsAsync(movie); IsMovieLoading = false; await MovieService.DownloadPosterImageAsync(Movie); await MovieService.DownloadDirectorImageAsync(Movie); await MovieService.DownloadActorImageAsync(Movie); await MovieService.DownloadBackgroundImageAsync(Movie); Logger.Info( $"Movie loaded: {movie.Title}"); } catch (Exception ex) when (ex is SocketException || ex is WebException) { Logger.Info( $"Error while loading movie {movie.Title}: {ex.Message}"); Messenger.Default.Send(new ManageExceptionMessage(ex)); } }