public async Task <TraktPaginationListResult <TraktSearchResult> > GetTextQueryResultsAsync(TraktSearchResultType searchResultTypes, [NotNull] string searchQuery, TraktSearchField searchFields = null, TraktSearchFilter filter = null, TraktExtendedInfo extendedInfo = null, int?page = null, int?limitPerPage = null) { Validate(searchResultTypes); Validate(searchQuery); return(await QueryAsync(new TraktSearchTextQueryRequest(Client) { ResultTypes = searchResultTypes, Query = searchQuery, SearchFields = searchFields, Filter = filter, ExtendedInfo = extendedInfo, PaginationOptions = new TraktPaginationOptions(page, limitPerPage) })); }
private async Task ShowSearch(TraktList model, IList <ITraktShow> list) { uint?page = 0; TraktSearchField searchFields = new TraktSearchField(); if (model.SearchByAlias) { searchFields |= TraktSearchField.Aliases; } if (model.SearchByBiography) { searchFields |= TraktSearchField.Biography; } if (model.SearchByDescription) { searchFields |= TraktSearchField.Description; } if (model.SearchByName) { searchFields |= TraktSearchField.Name; } if (model.SearchByOverview) { searchFields |= TraktSearchField.Overview; } if (model.SearchByPeople) { searchFields |= TraktSearchField.People; } if (model.SearchByTagline) { searchFields |= TraktSearchField.Tagline; } if (model.SearchByTitle) { searchFields |= TraktSearchField.Title; } if (model.SearchByTranslations) { searchFields |= TraktSearchField.Translations; } var traktShowStatus = new List <TraktNet.Enums.TraktShowStatus>(); if (model.Filter_Status.Status?.Contains("canceled") == true) { traktShowStatus.Add(TraktNet.Enums.TraktShowStatus.Canceled); } if (model.Filter_Status.Status?.Contains("ended") == true) { traktShowStatus.Add(TraktNet.Enums.TraktShowStatus.Ended); } if (model.Filter_Status.Status?.Contains("in production") == true) { traktShowStatus.Add(TraktNet.Enums.TraktShowStatus.InProduction); } if (model.Filter_Status.Status?.Contains("returning series") == true) { traktShowStatus.Add(TraktNet.Enums.TraktShowStatus.ReturningSeries); } while (true) { var result = await _traktClient.Search.GetTextQueryResultsAsync( TraktSearchResultType.Show, model.Query, searchFields, new TraktSearchFilter( model.Filter_Years.From, model.Filter_Years.To, model.Filter_Genres.Genres, model.Filter_Languages.Languages, model.Filter_Countries.Languages, new Range <int>( model.Filter_Runtimes.From, model.Filter_Runtimes.To ), new Range <int>( model.Filter_Ratings.From, model.Filter_Ratings.To ), model.Filter_Certifications_Show.Certifications, model.Filter_Networks.Networks, traktShowStatus.Count != 0 ? traktShowStatus.ToArray() : null ), new TraktExtendedInfo().SetFull(), new TraktPagedParameters(page, _traktApiConfiguration.FetchLimitSearch) ); if (!result.IsSuccess) { throw result.Exception; } foreach (var traktSearchResult in result.Value) { if (traktSearchResult.Show?.Votes != null && model.Filter_Ratings.Votes > 0) { if (!(traktSearchResult.Show.Votes >= model.Filter_Ratings.Votes)) { continue; } } if (model.ReverseFilter_Certifications_Show?.Certifications != null && !string.IsNullOrEmpty(traktSearchResult.Show.Certification)) { if (model.ReverseFilter_Certifications_Show.Certifications.Contains(traktSearchResult.Show.Certification)) { continue; } } if (model.ReverseFilter_Countries?.Languages != null && !string.IsNullOrEmpty(traktSearchResult.Show.CountryCode)) { if (model.ReverseFilter_Countries.Languages.Contains(traktSearchResult.Show.CountryCode)) { continue; } } if (model.ReverseFilter_Genres?.Genres != null && traktSearchResult.Show.Genres != null) { if (model.ReverseFilter_Genres.Genres.Any(traktSearchResult.Show.Genres.Contains)) { continue; } } if (model.ReverseFilter_Languages?.Languages != null && !string.IsNullOrEmpty(traktSearchResult.Show.LanguageCode)) { if (model.ReverseFilter_Languages.Languages.Contains(traktSearchResult.Show.LanguageCode)) { continue; } } if (model.ReverseFilter_Networks?.Networks != null && !string.IsNullOrEmpty(traktSearchResult.Show.Network)) { if (model.ReverseFilter_Networks.Networks.Contains(traktSearchResult.Show.Network)) { continue; } } if (model.ReverseFilter_Status?.Status != null && traktSearchResult.Show.Status != null) { if (model.ReverseFilter_Status.Status.Contains(traktSearchResult.Show.Status.ObjectName)) { continue; } } if (model.ReverseFilter_Translations?.Translations != null && traktSearchResult.Show.AvailableTranslationLanguageCodes != null) { if (model.ReverseFilter_Translations.Translations.Any(traktSearchResult.Show.AvailableTranslationLanguageCodes.Contains)) { continue; } } if (!list.Contains(traktSearchResult.Show, new TraktShowComparer())) { list.Add(traktSearchResult.Show); } } if (result.PageCount == page) { break; } page++; await Task.Delay(_traktApiConfiguration.DelaySearch); } }
private async Task MovieSearch(TraktList model, IList <ITraktMovie> list) { uint?page = 0; TraktSearchField searchFields = new TraktSearchField(); if (model.SearchByAlias) { searchFields |= TraktSearchField.Aliases; } if (model.SearchByBiography) { searchFields |= TraktSearchField.Biography; } if (model.SearchByDescription) { searchFields |= TraktSearchField.Description; } if (model.SearchByName) { searchFields |= TraktSearchField.Name; } if (model.SearchByOverview) { searchFields |= TraktSearchField.Overview; } if (model.SearchByPeople) { searchFields |= TraktSearchField.People; } if (model.SearchByTagline) { searchFields |= TraktSearchField.Tagline; } if (model.SearchByTitle) { searchFields |= TraktSearchField.Title; } if (model.SearchByTranslations) { searchFields |= TraktSearchField.Translations; } if (model.SearchByTagline) { searchFields |= TraktSearchField.Tagline; } while (true) { var result = await _traktClient.Search.GetTextQueryResultsAsync( TraktSearchResultType.Movie, model.Query, searchFields, new TraktSearchFilter( model.Filter_Years.From, model.Filter_Years.To, model.Filter_Genres.Genres, model.Filter_Languages.Languages, model.Filter_Countries.Languages, new Range <int>( model.Filter_Runtimes.From, model.Filter_Runtimes.To ), new Range <int>( model.Filter_Ratings.From, model.Filter_Ratings.To ) ), new TraktExtendedInfo().SetFull(), new TraktPagedParameters(page, _traktApiConfiguration.FetchLimitSearch) ); if (!result.IsSuccess) { throw result.Exception; } foreach (var traktSearchResult in result.Value) { if (traktSearchResult.Movie?.Votes != null && model.Filter_Ratings.Votes > 0) { if (!(traktSearchResult.Movie.Votes >= model.Filter_Ratings.Votes)) { continue; } } if (model.ReverseFilter_Certifications_Movie?.Certifications != null && !string.IsNullOrEmpty(traktSearchResult.Movie.Certification)) { if (model.ReverseFilter_Certifications_Movie.Certifications.Contains(traktSearchResult.Movie.Certification)) { continue; } } if (model.ReverseFilter_Countries?.Languages != null && !string.IsNullOrEmpty(traktSearchResult.Movie.CountryCode)) { if (model.ReverseFilter_Countries.Languages.Contains(traktSearchResult.Movie.CountryCode)) { continue; } } if (model.ReverseFilter_Genres?.Genres != null && traktSearchResult.Movie.Genres != null) { if (model.ReverseFilter_Genres.Genres.Any(traktSearchResult.Movie.Genres.Contains)) { continue; } } if (model.ReverseFilter_Languages?.Languages != null && !string.IsNullOrEmpty(traktSearchResult.Movie.LanguageCode)) { if (model.ReverseFilter_Languages.Languages.Contains(traktSearchResult.Movie.LanguageCode)) { continue; } } if (model.ReverseFilter_Translations?.Translations != null && traktSearchResult.Movie.AvailableTranslationLanguageCodes != null) { if (model.ReverseFilter_Translations.Translations.Any(traktSearchResult.Movie.AvailableTranslationLanguageCodes.Contains)) { continue; } } if (!list.Contains(traktSearchResult.Movie, new TraktMovieComparer())) { list.Add(traktSearchResult.Movie); } } if (result.PageCount == page) { break; } page++; await Task.Delay(_traktApiConfiguration.DelaySearch); } }
private async Task ShowSearch(TraktList model, IList <ITraktShow> list) { uint?page = 0; TraktSearchField searchFields = new TraktSearchField(); if (model.SearchByAlias) { searchFields |= TraktSearchField.Aliases; } if (model.SearchByBiography) { searchFields |= TraktSearchField.Biography; } if (model.SearchByDescription) { searchFields |= TraktSearchField.Description; } if (model.SearchByName) { searchFields |= TraktSearchField.Name; } if (model.SearchByOverview) { searchFields |= TraktSearchField.Overview; } if (model.SearchByPeople) { searchFields |= TraktSearchField.People; } if (model.SearchByTagline) { searchFields |= TraktSearchField.Tagline; } if (model.SearchByTitle) { searchFields |= TraktSearchField.Title; } if (model.SearchByTranslations) { searchFields |= TraktSearchField.Translations; } var traktShowStatus = new List <TraktNet.Enums.TraktShowStatus>(); if (model.Filter_Status.Status?.Contains("canceled") == true) { traktShowStatus.Add(TraktNet.Enums.TraktShowStatus.Canceled); } if (model.Filter_Status.Status?.Contains("ended") == true) { traktShowStatus.Add(TraktNet.Enums.TraktShowStatus.Ended); } if (model.Filter_Status.Status?.Contains("in production") == true) { traktShowStatus.Add(TraktNet.Enums.TraktShowStatus.InProduction); } if (model.Filter_Status.Status?.Contains("returning series") == true) { traktShowStatus.Add(TraktNet.Enums.TraktShowStatus.ReturningSeries); } while (true) { var result = await _traktClient.Search.GetTextQueryResultsAsync( TraktSearchResultType.Show, model.Query, searchFields, new TraktSearchFilter( model.Filter_Years.From, model.Filter_Years.To, model.Filter_Genres.Genres, model.Filter_Languages.Languages, model.Filter_Countries.Languages, new Range <int>( model.Filter_Runtimes.From, model.Filter_Runtimes.To ), new Range <int>( model.Filter_Ratings_Trakt.From, model.Filter_Ratings_Trakt.To ), model.Filter_Certifications_Show.Certifications, model.Filter_Networks.Networks, traktShowStatus.Count != 0 ? traktShowStatus.ToArray() : null ), new TraktExtendedInfo().SetFull(), new TraktPagedParameters(page, _traktApiConfiguration.FetchLimitSearch) ); if (!result.IsSuccess) { throw result.Exception; } var userLimits = _userLimitService.Get(model.Owner.Level); foreach (var traktSearchResult in result.Value) { if (traktSearchResult.Show?.Votes != null && model.Filter_Ratings_Trakt.Votes > 0) { if (!(traktSearchResult.Show.Votes >= model.Filter_Ratings_Trakt.Votes)) { continue; } } if (userLimits.ExclusionFilters) { if (model.ExclusionFilter_Certifications_Show?.Certifications != null && !string.IsNullOrEmpty(traktSearchResult.Show.Certification)) { if (model.ExclusionFilter_Certifications_Show.Certifications.Contains(traktSearchResult.Show.Certification)) { continue; } } if (model.ExclusionFilter_Countries?.Languages != null && !string.IsNullOrEmpty(traktSearchResult.Show.CountryCode)) { if (model.ExclusionFilter_Countries.Languages.Contains(traktSearchResult.Show.CountryCode)) { continue; } } if (model.ExclusionFilter_Genres?.Genres != null && traktSearchResult.Show.Genres != null) { if (model.ExclusionFilter_Genres.Genres.Any(traktSearchResult.Show.Genres.Contains)) { continue; } } if (model.ExclusionFilter_Languages?.Languages != null && !string.IsNullOrEmpty(traktSearchResult.Show.LanguageCode)) { if (model.ExclusionFilter_Languages.Languages.Contains(traktSearchResult.Show.LanguageCode)) { continue; } } if (model.ExclusionFilter_Networks?.Networks != null && !string.IsNullOrEmpty(traktSearchResult.Show.Network)) { if (model.ExclusionFilter_Networks.Networks.Contains(traktSearchResult.Show.Network)) { continue; } } if (model.ExclusionFilter_Status?.Status != null && traktSearchResult.Show.Status != null) { if (model.ExclusionFilter_Status.Status.Contains(traktSearchResult.Show.Status.ObjectName)) { continue; } } if (model.ExclusionFilter_Translations?.Translations != null && traktSearchResult.Show.AvailableTranslationLanguageCodes != null) { if (model.ExclusionFilter_Translations.Translations.Any(traktSearchResult.Show.AvailableTranslationLanguageCodes.Contains)) { continue; } } var hasKeyword = false; if (model.ExclusionFilter_Keywords != null && model.ExclusionFilter_Keywords.Length > 0) { foreach (var keyWord in model.ExclusionFilter_Keywords) { if (!string.IsNullOrWhiteSpace(keyWord)) { if (traktSearchResult.Show.Title.ToLower().Contains(keyWord.ToLower())) { hasKeyword = true; break; } } } } if (hasKeyword) { continue; } } if (userLimits.IMDbRatings) { if (model.Filter_Ratings_IMDb != null) { if (!string.IsNullOrEmpty(traktSearchResult.Show.Ids.Imdb)) { var imdbRating = await _imDbRepository.Get(traktSearchResult.Show.Ids.Imdb); if (imdbRating != null) { if (model.Filter_Ratings_IMDb.Votes > 0) { if (!(imdbRating.Votes >= model.Filter_Ratings_IMDb.Votes)) { continue; } if (model.Filter_Ratings_IMDb.From > 0) { if (!(imdbRating.Rating >= model.Filter_Ratings_IMDb.From)) { continue; } } if (model.Filter_Ratings_IMDb.To > 0) { if (!(imdbRating.Rating <= model.Filter_Ratings_IMDb.To)) { continue; } } } } else { continue; } } else { continue; } } } if (!list.Contains(traktSearchResult.Show, new TraktShowComparer())) { list.Add(traktSearchResult.Show); } } if (result.PageCount == page) { break; } page++; await Task.Delay(_traktApiConfiguration.DelaySearch); } }
public void TestTraktSearchFieldIsTraktEnumeration() { var enumeration = new TraktSearchField(); enumeration.Should().BeAssignableTo <TraktEnumeration>(); }
/// <summary> /// Searches for movies, shows, episodes, people and / or lists with the given search query. /// <para>OAuth authorization not required.</para> /// <para> /// See <a href="http://docs.trakt.apiary.io/#reference/search/text-query/get-text-query-results">"Trakt API Doc - Search: Text Query"</a> for more information. /// </para> /// </summary> /// <param name="searchResultTypes"> /// The object type(s), for which will be searched. See also <seealso cref="TraktSearchResultType" />. /// Multiple <see cref="TraktSearchResultType" /> values can be combined with a binary operator, like this: TraktSearchResultType.Movie | TraktSearchResultType.Show. /// </param> /// <param name="searchQuery">The query, for which will be searched.</param> /// <param name="searchFields">Determines the text fields, which will be searched. See also <seealso cref="TraktSearchField" />.</param> /// <param name="filter">Optional filter for genres, year, runtimes, ratings, etc. See also <seealso cref="TraktSearchFilter" />.</param> /// <param name="extendedInfo"> /// The extended info, which determines how much data about the movies, shows, episodes, people and / or lists should be queried. /// See also <seealso cref="TraktExtendedInfo" />. /// </param> /// <param name="pagedParameters"></param> /// <param name="cancellationToken"></param> /// <returns> /// An <see cref="TraktPagedResponse{ITraktSearchResult}"/> instance containing the found movies, shows, episodes, people and / or lists and which also /// contains the queried page number, the page's item count, maximum page count and maximum item count. /// <para> /// See also <seealso cref="TraktPagedResponse{ListItem}" /> and <seealso cref="ITraktSearchResult" />. /// </para> /// </returns> /// <exception cref="TraktException">Thrown, if the request fails.</exception> /// <exception cref="ArgumentException"> /// Thrown, if the given searchQuery is null, empty or contains spaces. /// Thrown, if the given searchResultType is unspecified. /// </exception> /// <exception cref="ArgumentNullException">Thrown, if the given searchResultType is null</exception> public Task <TraktPagedResponse <ITraktSearchResult> > GetTextQueryResultsAsync(TraktSearchResultType searchResultTypes, string searchQuery, TraktSearchField searchFields = null, TraktSearchFilter filter = null, TraktExtendedInfo extendedInfo = null, TraktPagedParameters pagedParameters = null, CancellationToken cancellationToken = default) { var requestHandler = new RequestHandler(Client); return(requestHandler.ExecutePagedRequestAsync(new SearchTextQueryRequest { ResultTypes = searchResultTypes, Query = searchQuery, SearchFields = searchFields, Filter = filter, ExtendedInfo = extendedInfo, Page = pagedParameters?.Page, Limit = pagedParameters?.Limit }, cancellationToken)); }