diff --git a/src/Ombi.Core/Engine/V2/IMultiSearchEngine.cs b/src/Ombi.Core/Engine/V2/IMultiSearchEngine.cs index 1b78eaea5..7ad8c509a 100644 --- a/src/Ombi.Core/Engine/V2/IMultiSearchEngine.cs +++ b/src/Ombi.Core/Engine/V2/IMultiSearchEngine.cs @@ -4,10 +4,15 @@ using System.Threading.Tasks; using Ombi.Api.TheMovieDb.Models; using Ombi.Core.Models.Search.V2; +// Due to conflicting Genre models in +// Ombi.TheMovieDbApi.Models and Ombi.Api.TheMovieDb.Models +using Genre = Ombi.TheMovieDbApi.Models.Genre; + namespace Ombi.Core.Engine.V2 { public interface IMultiSearchEngine { Task> MultiSearch(string searchTerm, MultiSearchFilter filter, CancellationToken cancellationToken); + Task> GetGenres(string media, CancellationToken requestAborted); } } \ No newline at end of file diff --git a/src/Ombi.Core/Engine/V2/MultiSearchEngine.cs b/src/Ombi.Core/Engine/V2/MultiSearchEngine.cs index fc2595676..44f792415 100644 --- a/src/Ombi.Core/Engine/V2/MultiSearchEngine.cs +++ b/src/Ombi.Core/Engine/V2/MultiSearchEngine.cs @@ -17,6 +17,10 @@ using Ombi.Settings.Settings.Models.External; using Ombi.Store.Entities; using Ombi.Store.Repository; +// Due to conflicting Genre models in +// Ombi.TheMovieDbApi.Models and Ombi.Api.TheMovieDb.Models +using Genre = Ombi.TheMovieDbApi.Models.Genre; + namespace Ombi.Core.Engine.V2 { public class MultiSearchEngine : BaseMediaEngine, IMultiSearchEngine @@ -113,5 +117,11 @@ namespace Ombi.Core.Engine.V2 return model; } + + public async Task> GetGenres(string media, CancellationToken cancellationToken) + { + var lang = await DefaultLanguageCode(null); + return await _movieDbApi.GetGenres(media, cancellationToken, lang); + } } } diff --git a/src/Ombi.TheMovieDbApi/IMovieDbApi.cs b/src/Ombi.TheMovieDbApi/IMovieDbApi.cs index eadfb3a3a..dc2e5525c 100644 --- a/src/Ombi.TheMovieDbApi/IMovieDbApi.cs +++ b/src/Ombi.TheMovieDbApi/IMovieDbApi.cs @@ -40,7 +40,7 @@ namespace Ombi.Api.TheMovieDb Task GetKeyword(int keywordId); Task GetMovieWatchProviders(int theMoviedbId, CancellationToken token); Task GetTvWatchProviders(int theMoviedbId, CancellationToken token); - Task> GetGenres(string media, CancellationToken cancellationToken); + Task> GetGenres(string media, CancellationToken cancellationToken, string languageCode); Task> SearchWatchProviders(string media, string searchTerm, CancellationToken cancellationToken); Task> AdvancedSearch(DiscoverModel model, CancellationToken cancellationToken); } diff --git a/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs b/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs index 0391c184a..335ea7da3 100644 --- a/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs +++ b/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs @@ -427,10 +427,11 @@ namespace Ombi.Api.TheMovieDb return keyword == null || keyword.Id == 0 ? null : keyword; } - public async Task> GetGenres(string media, CancellationToken cancellationToken) + public async Task> GetGenres(string media, CancellationToken cancellationToken, string languageCode) { var request = new Request($"genre/{media}/list", BaseUri, HttpMethod.Get); request.AddQueryString("api_key", ApiToken); + request.AddQueryString("language", languageCode); AddRetry(request); var result = await Api.Request>(request, cancellationToken); diff --git a/src/Ombi/ClientApp/src/app/services/applications/themoviedb.service.ts b/src/Ombi/ClientApp/src/app/services/applications/themoviedb.service.ts index a49fb4146..d2c5b6122 100644 --- a/src/Ombi/ClientApp/src/app/services/applications/themoviedb.service.ts +++ b/src/Ombi/ClientApp/src/app/services/applications/themoviedb.service.ts @@ -25,10 +25,6 @@ export class TheMovieDbService extends ServiceHelpers { .pipe(catchError((error: HttpErrorResponse) => error.status === 404 ? empty() : throwError(error))); } - public getGenres(media: string): Observable { - return this.http.get(`${this.url}/Genres/${media}`, { headers: this.headers }) - } - public getWatchProviders(media: string): Observable { return this.http.get(`${this.url}/WatchProviders/${media}`, {headers: this.headers}); } diff --git a/src/Ombi/ClientApp/src/app/services/searchV2.service.ts b/src/Ombi/ClientApp/src/app/services/searchV2.service.ts index 9e065ea97..c80655370 100644 --- a/src/Ombi/ClientApp/src/app/services/searchV2.service.ts +++ b/src/Ombi/ClientApp/src/app/services/searchV2.service.ts @@ -4,7 +4,7 @@ import { Injectable, Inject } from "@angular/core"; import { HttpClient } from "@angular/common/http"; import { Observable } from "rxjs"; -import { IDiscoverModel, IMultiSearchResult, ISearchMovieResult, ISearchTvResult } from "../interfaces"; +import { IDiscoverModel, IMovieDbKeyword, IMultiSearchResult, ISearchMovieResult, ISearchTvResult } from "../interfaces"; import { ServiceHelpers } from "./service.helpers"; import { ISearchMovieResultV2 } from "../interfaces/ISearchMovieResultV2"; @@ -23,6 +23,11 @@ export class SearchV2Service extends ServiceHelpers { public multiSearch(searchTerm: string, filter: SearchFilter): Observable { return this.http.post(`${this.url}/multi/${encodeURIComponent(searchTerm)}`, filter); } + + public getGenres(media: string): Observable { + return this.http.get(`${this.url}/Genres/${media}`, { headers: this.headers }) + } + public getFullMovieDetails(theMovieDbId: number): Observable { return this.http.get(`${this.url}/Movie/${theMovieDbId}`); } diff --git a/src/Ombi/ClientApp/src/app/settings/themoviedb/themoviedb.component.ts b/src/Ombi/ClientApp/src/app/settings/themoviedb/themoviedb.component.ts index 427905902..512f60363 100644 --- a/src/Ombi/ClientApp/src/app/settings/themoviedb/themoviedb.component.ts +++ b/src/Ombi/ClientApp/src/app/settings/themoviedb/themoviedb.component.ts @@ -5,7 +5,7 @@ import { IMovieDbKeyword, ITheMovieDbSettings } from "../../interfaces"; import { debounceTime, switchMap } from "rxjs/operators"; import { MatAutocomplete } from "@angular/material/autocomplete"; -import { NotificationService } from "../../services"; +import { NotificationService, SearchV2Service } from "../../services"; import { SettingsService } from "../../services"; import { TheMovieDbService } from "../../services"; @@ -33,6 +33,7 @@ export class TheMovieDbComponent implements OnInit { constructor(private settingsService: SettingsService, private notificationService: NotificationService, private tmdbService: TheMovieDbService, + private searchService: SearchV2Service, private fb: FormBuilder) { } public ngOnInit() { @@ -71,7 +72,7 @@ export class TheMovieDbComponent implements OnInit { })) : []; - this.tmdbService.getGenres("movie").subscribe(results => { + this.searchService.getGenres("movie").subscribe(results => { this.filteredMovieGenres = results; this.excludedMovieGenres.forEach(genre => { @@ -92,7 +93,7 @@ export class TheMovieDbComponent implements OnInit { })) : []; - this.tmdbService.getGenres("tv").subscribe(results => { + this.searchService.getGenres("tv").subscribe(results => { this.filteredTvGenres = results; this.excludedTvGenres.forEach(genre => { diff --git a/src/Ombi/ClientApp/src/app/shared/components/genre-select/genre-select.component.ts b/src/Ombi/ClientApp/src/app/shared/components/genre-select/genre-select.component.ts index 06c92e4cf..839b8169c 100644 --- a/src/Ombi/ClientApp/src/app/shared/components/genre-select/genre-select.component.ts +++ b/src/Ombi/ClientApp/src/app/shared/components/genre-select/genre-select.component.ts @@ -5,7 +5,7 @@ import { debounceTime, distinctUntilChanged, map, startWith, switchMap } from "r import { IMovieDbKeyword } from "../../../interfaces"; import { MatAutocompleteSelectedEvent } from "@angular/material/autocomplete"; import { Observable } from "rxjs"; -import { TheMovieDbService } from "../../../services"; +import { SearchV2Service } from "../../../services"; @Component({ selector: "genre-select", @@ -13,7 +13,7 @@ import { TheMovieDbService } from "../../../services"; }) export class GenreSelectComponent { constructor( - private tmdbService: TheMovieDbService + private searchService: SearchV2Service ) {} @Input() public form: FormGroup; @@ -21,7 +21,7 @@ export class GenreSelectComponent { private _mediaType: string; @Input() set mediaType(type: string) { this._mediaType = type; - this.tmdbService.getGenres(this._mediaType).subscribe((res) => { + this.searchService.getGenres(this._mediaType).subscribe((res) => { this.genres = res; this.filteredKeywords = this.control.valueChanges.pipe( startWith(''), diff --git a/src/Ombi/Controllers/V1/External/TheMovieDbController.cs b/src/Ombi/Controllers/V1/External/TheMovieDbController.cs index f5fdb996f..4017c0b42 100644 --- a/src/Ombi/Controllers/V1/External/TheMovieDbController.cs +++ b/src/Ombi/Controllers/V1/External/TheMovieDbController.cs @@ -39,14 +39,6 @@ namespace Ombi.Controllers.External return keyword == null ? NotFound() : Ok(keyword); } - /// - /// Gets the genres for either Tv or Movies depending on media type - /// - /// Either `tv` or `movie`. - [HttpGet("Genres/{media}")] - public async Task> GetGenres(string media) => - await TmdbApi.GetGenres(media, HttpContext.RequestAborted); - /// /// Searches for the watch providers matching the specified term. /// diff --git a/src/Ombi/Controllers/V2/SearchController.cs b/src/Ombi/Controllers/V2/SearchController.cs index ac5905c33..fc970b793 100644 --- a/src/Ombi/Controllers/V2/SearchController.cs +++ b/src/Ombi/Controllers/V2/SearchController.cs @@ -16,6 +16,10 @@ using Ombi.Api.RottenTomatoes.Models; using Ombi.Api.RottenTomatoes; using Ombi.Helpers; +// Due to conflicting Genre models in +// Ombi.TheMovieDbApi.Models and Ombi.Api.TheMovieDb.Models +using Genre = Ombi.TheMovieDbApi.Models.Genre; + namespace Ombi.Controllers.V2 { public class SearchController : V2Controller @@ -55,6 +59,16 @@ namespace Ombi.Controllers.V2 return await _multiSearchEngine.MultiSearch(Uri.UnescapeDataString(searchTerm), filter, Request.HttpContext.RequestAborted); } + /// + /// Gets the genres for either Tv or Movies depending on media type + /// + /// Either `tv` or `movie`. + [HttpGet("Genres/{media}")] + public Task> GetGenres(string media) + { + return _multiSearchEngine.GetGenres(media, HttpContext.RequestAborted); + } + /// /// Returns details for a single movie ///