Exemplo n.º 1
0
    /// <inheritdoc/>
    public async IAsyncEnumerable <Movie> SearchAsync(string name, int year = 0, string country = "AU", [System.Runtime.CompilerServices.EnumeratorCancellation] CancellationToken cancellationToken = default)
    {
        using var client = new TMDbLib.Client.TMDbClient("b866acbf3519560a3879b55d2d9cb1cb")
              {
                  DefaultCountry       = country,
                  DefaultLanguage      = "en",
                  DefaultImageLanguage = "en",
              };

        var movies = await client.SearchMovieAsync(name, year : year, cancellationToken : cancellationToken).ConfigureAwait(false);

        foreach (var result in movies.Results)
        {
            var movie = await client.GetMovieAsync(result.Id, TMDbLib.Objects.Movies.MovieMethods.Credits | TMDbLib.Objects.Movies.MovieMethods.Releases | TMDbLib.Objects.Movies.MovieMethods.Images, cancellationToken).ConfigureAwait(false);

            if (!client.HasConfig)
            {
                _ = await client.GetConfigAsync().ConfigureAwait(false);
            }

            var    poster          = movie.Images?.Posters?.FirstOrDefault();
            Rating?countryRating   = default;
            Rating?invariantRating = default;
            Rating?usRating        = default;

            foreach (var cty in movie.Releases.Countries)
            {
                if (!invariantRating.HasValue && cty.Primary)
                {
                    invariantRating = Rating.FindBest(cty.Certification, cty.Iso_3166_1);
                }

                if (country is not null && string.Equals(cty.Iso_3166_1, country, StringComparison.InvariantCultureIgnoreCase))
                {
                    countryRating = Rating.FindBest(cty.Certification, cty.Iso_3166_1);
                }

                if (string.Equals(cty.Iso_3166_1, "us", StringComparison.InvariantCultureIgnoreCase))
                {
                    usRating = Rating.FindBest(cty.Certification, cty.Iso_3166_1);
                }
            }

            var rating = countryRating ?? usRating ?? invariantRating;
            if (rating is not null && rating.Value.ContentRating is null)
            {
                rating = default;
            }

            yield return(new RemoteMovie(
                             movie.Title,
                             movie.Overview,
                             GetProducers(movie.Credits?.Crew),
                             GetDirectors(movie.Credits?.Crew),
                             movie.ProductionCompanies?.Select(productionCompany => productionCompany.Name) ?? Enumerable.Empty <string>(),
                             movie.Genres?.Select(genre => genre.Name) ?? Enumerable.Empty <string>(),
                             GetWriters(movie.Credits?.Crew),
                             movie.Credits?.Cast?.Select(cast => cast.Name) ?? Enumerable.Empty <string>(),
                             GetComposers(movie.Credits?.Crew))
            {
                Release = movie.ReleaseDate,
                Rating = rating,
                ImageUri = poster is null ? null : client.GetImageUrl(GetBestPosterSize(client.Config) ?? "original", poster.FilePath),
            });