private async Task <FlickEntity> PopulateMovieFlickAsync(Movie movie, CancellationToken cancellationToken = default) { // Poster image var image = !string.IsNullOrWhiteSpace(movie.PosterPath) ? await StoreImageAsync(movie.PosterPath, cancellationToken) : null; // TODO: get external rating from IMDB, not TMDB var flickEntity = new FlickEntity { Kind = FlickKind.Movie, ImdbId = movie.ImdbId, Title = movie.Title, OriginalTitle = movie.OriginalTitle?.Pipe(t => !string.Equals(t, movie.Title, StringComparison.OrdinalIgnoreCase) ? t : null), FirstAired = movie.ReleaseDate, Runtime = movie.Runtime?.Pipe(m => TimeSpan.FromMinutes(m)).NullIf(t => t.TotalSeconds <= 0), ExternalRating = movie.VoteAverage, Synopsis = movie.Overview, CoverImageId = image?.Id, Tags = movie.Genres.Select(g => g.Name).ToArray() }; await AddOrUpdateFlickAsync(flickEntity, cancellationToken); await _database.SaveChangesAsync(cancellationToken); return(flickEntity); }
private async Task <FlickEntity> PopulateSeriesFlickAsync(TvShow series, CancellationToken cancellationToken = default) { var externalIds = await TmDbClient.GetTvShowExternalIdsAsync(series.Id, cancellationToken); // Poster image var image = !string.IsNullOrWhiteSpace(series.PosterPath) ? await StoreImageAsync(series.PosterPath, cancellationToken) : null; // TODO: get external rating from IMDB, not TMDB var flickEntity = new FlickEntity { Kind = FlickKind.Series, ImdbId = externalIds.ImdbId, Title = series.Name, OriginalTitle = series.OriginalName?.Pipe(t => !string.Equals(t, series.Name, StringComparison.OrdinalIgnoreCase) ? t : null), FirstAired = series.FirstAirDate, LastAired = series.LastAirDate?.NullIf(series.InProduction), Runtime = series.EpisodeRunTime.NullIfEmpty()?.Average().Pipe(TimeSpan.FromMinutes), EpisodeCount = series.NumberOfEpisodes, ExternalRating = series.VoteAverage, Synopsis = series.Overview, CoverImageId = image?.Id, Tags = series.Genres.Select(g => g.Name).ToArray() }; await AddOrUpdateFlickAsync(flickEntity, cancellationToken); await _database.SaveChangesAsync(cancellationToken); return(flickEntity); }
private async Task AddOrUpdateFlickAsync(FlickEntity flickEntity, CancellationToken cancellationToken = default) { var existing = await _database.Flicks .FirstOrDefaultAsync(f => f.ImdbId == flickEntity.ImdbId, cancellationToken); if (existing is not null) { if (existing.CoverImageId is not null) { _database.Files.RemoveRange(_database.Files.Where(f => f.Id == existing.CoverImageId)); } flickEntity.Id = existing.Id; _database.Entry(existing).CurrentValues.SetValues(flickEntity); } else { await _database.Flicks.AddAsync(flickEntity, cancellationToken); } }