Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
            }
        }