/// <summary> /// Gets a movie from the TMDb API based on its TMDb id. /// </summary> /// <param name="tmdbId">The movie's TMDb id.</param> /// <param name="language">The movie's language.</param> /// <param name="imageLanguages">A comma-separated list of image languages.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The TMDb movie or null if not found.</returns> public async Task <Movie?> GetMovieAsync(int tmdbId, string language, string imageLanguages, CancellationToken cancellationToken) { var key = $"movie-{tmdbId.ToString(CultureInfo.InvariantCulture)}-{language}"; if (_memoryCache.TryGetValue(key, out Movie movie)) { return(movie); } await EnsureClientConfigAsync().ConfigureAwait(false); movie = await _tmDbClient.GetMovieAsync( tmdbId, TmdbUtils.NormalizeLanguage(language), imageLanguages, MovieMethods.Credits | MovieMethods.Releases | MovieMethods.Images | MovieMethods.Keywords | MovieMethods.Videos, cancellationToken).ConfigureAwait(false); if (movie != null) { _memoryCache.Set(key, movie, TimeSpan.FromHours(CacheDurationInHours)); } return(movie); }
/// <summary> /// Gets a collection from the TMDb API based on its TMDb id. /// </summary> /// <param name="tmdbId">The collection's TMDb id.</param> /// <param name="language">The collection's language.</param> /// <param name="imageLanguages">A comma-separated list of image languages.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The TMDb collection or null if not found.</returns> public async Task <Collection?> GetCollectionAsync(int tmdbId, string language, string imageLanguages, CancellationToken cancellationToken) { var key = $"collection-{tmdbId.ToString(CultureInfo.InvariantCulture)}-{language}"; if (_memoryCache.TryGetValue(key, out Collection collection)) { return(collection); } await EnsureClientConfigAsync().ConfigureAwait(false); collection = await _tmDbClient.GetCollectionAsync( tmdbId, TmdbUtils.NormalizeLanguage(language), imageLanguages, CollectionMethods.Images, cancellationToken).ConfigureAwait(false); if (collection != null) { _memoryCache.Set(key, collection, TimeSpan.FromHours(CacheDurationInHours)); } return(collection); }
/// <summary> /// Gets an item from the TMDb API based on its id from an external service eg. IMDb id, TvDb id. /// </summary> /// <param name="externalId">The item's external id.</param> /// <param name="source">The source of the id eg. IMDb.</param> /// <param name="language">The item's language.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The TMDb item or null if not found.</returns> public async Task <FindContainer?> FindByExternalIdAsync( string externalId, FindExternalSource source, string language, CancellationToken cancellationToken) { var key = $"find-{source.ToString()}-{externalId.ToString(CultureInfo.InvariantCulture)}-{language}"; if (_memoryCache.TryGetValue(key, out FindContainer result)) { return(result); } await EnsureClientConfigAsync().ConfigureAwait(false); result = await _tmDbClient.FindAsync( source, externalId, TmdbUtils.NormalizeLanguage(language), cancellationToken).ConfigureAwait(false); if (result != null) { _memoryCache.Set(key, result, TimeSpan.FromHours(CacheDurationInHours)); } return(result); }
/// <summary> /// Gets a movie from the TMDb API based on the tv show's TMDb id. /// </summary> /// <param name="tvShowId">The tv show's TMDb id.</param> /// <param name="seasonNumber">The season number.</param> /// <param name="episodeNumber">The episode number.</param> /// <param name="language">The episode's language.</param> /// <param name="imageLanguages">A comma-separated list of image languages.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The TMDb tv episode information or null if not found.</returns> public async Task <TvEpisode?> GetEpisodeAsync(int tvShowId, int seasonNumber, int episodeNumber, string language, string imageLanguages, CancellationToken cancellationToken) { var key = $"episode-{tvShowId.ToString(CultureInfo.InvariantCulture)}-s{seasonNumber.ToString(CultureInfo.InvariantCulture)}e{episodeNumber.ToString(CultureInfo.InvariantCulture)}-{language}"; if (_memoryCache.TryGetValue(key, out TvEpisode episode)) { return(episode); } await EnsureClientConfigAsync().ConfigureAwait(false); episode = await _tmDbClient.GetTvEpisodeAsync( tvShowId, seasonNumber, episodeNumber, language : TmdbUtils.NormalizeLanguage(language), includeImageLanguage : imageLanguages, extraMethods : TvEpisodeMethods.Credits | TvEpisodeMethods.Images | TvEpisodeMethods.ExternalIds | TvEpisodeMethods.Videos, cancellationToken : cancellationToken).ConfigureAwait(false); if (episode != null) { _memoryCache.Set(key, episode, TimeSpan.FromHours(CacheDurationInHours)); } return(episode); }
/// <summary> /// Gets a tv show from the TMDb API based on its TMDb id. /// </summary> /// <param name="tmdbId">The tv show's TMDb id.</param> /// <param name="language">The tv show's language.</param> /// <param name="imageLanguages">A comma-separated list of image languages.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The TMDb tv show information or null if not found.</returns> public async Task <TvShow?> GetSeriesAsync(int tmdbId, string language, string imageLanguages, CancellationToken cancellationToken) { var key = $"series-{tmdbId.ToString(CultureInfo.InvariantCulture)}-{language}"; if (_memoryCache.TryGetValue(key, out TvShow series)) { return(series); } await EnsureClientConfigAsync().ConfigureAwait(false); series = await _tmDbClient.GetTvShowAsync( tmdbId, language : TmdbUtils.NormalizeLanguage(language), includeImageLanguage : imageLanguages, extraMethods : TvShowMethods.Credits | TvShowMethods.Images | TvShowMethods.Keywords | TvShowMethods.ExternalIds | TvShowMethods.Videos | TvShowMethods.ContentRatings, cancellationToken : cancellationToken).ConfigureAwait(false); if (series != null) { _memoryCache.Set(key, series, TimeSpan.FromHours(CacheDurationInHours)); } return(series); }
/// <summary> /// Searches for a collection based on its name using the TMDb API. /// </summary> /// <param name="name">The name of the collection.</param> /// <param name="language">The collection's language.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The TMDb collection information.</returns> public async Task <IReadOnlyList <SearchCollection> > SearchCollectionAsync(string name, string language, CancellationToken cancellationToken) { var key = $"collectionsearch-{name}-{language}"; if (_memoryCache.TryGetValue(key, out SearchContainer <SearchCollection> collections)) { return(collections.Results); } await EnsureClientConfigAsync().ConfigureAwait(false); var searchResults = await _tmDbClient .SearchCollectionAsync(name, TmdbUtils.NormalizeLanguage(language), cancellationToken : cancellationToken) .ConfigureAwait(false); if (searchResults.Results.Count > 0) { _memoryCache.Set(key, searchResults, TimeSpan.FromHours(CacheDurationInHours)); } return(searchResults.Results); }
/// <summary> /// Searches for a movie based on its name using the TMDb API. /// </summary> /// <param name="name">The name of the movie.</param> /// <param name="year">The release year of the movie.</param> /// <param name="language">The movie's language.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The TMDb movie information.</returns> public async Task <IReadOnlyList <SearchMovie> > SearchMovieAsync(string name, int year, string language, CancellationToken cancellationToken) { var key = $"moviesearch-{name}-{year.ToString(CultureInfo.InvariantCulture)}-{language}"; if (_memoryCache.TryGetValue(key, out SearchContainer <SearchMovie> movies)) { return(movies.Results); } await EnsureClientConfigAsync().ConfigureAwait(false); var searchResults = await _tmDbClient .SearchMovieAsync(name, TmdbUtils.NormalizeLanguage(language), year : year, cancellationToken : cancellationToken) .ConfigureAwait(false); if (searchResults.Results.Count > 0) { _memoryCache.Set(key, searchResults, TimeSpan.FromHours(CacheDurationInHours)); } return(searchResults.Results); }