From 947dbe1b6a510d5f549d454a4373999ded36a5b9 Mon Sep 17 00:00:00 2001 From: tidusjar Date: Fri, 4 Jan 2019 21:24:07 +0000 Subject: [PATCH] Added a global language flag that now applies to the search by default --- src/Ombi.Core/Engine/BaseMediaEngine.cs | 18 +++ .../Engine/Interfaces/IMovieEngine.cs | 4 +- src/Ombi.Core/Engine/MovieSearchEngine.cs | 51 +++++--- src/Ombi.TheMovieDbApi/IMovieDbApi.cs | 10 +- src/Ombi.TheMovieDbApi/TheMovieDbApi.cs | 16 ++- .../ClientApp/app/interfaces/IRequestModel.ts | 2 +- .../ClientApp/app/interfaces/ISettings.ts | 1 + .../app/search/moviesearch.component.ts | 9 +- .../app/search/moviesearchgrid.component.ts | 2 +- .../app/search/music/musicsearch.component.ts | 52 +-------- .../ClientApp/app/services/search.service.ts | 4 +- .../app/services/settings.service.ts | 4 + .../app/settings/ombi/ombi.component.html | 110 ++++++++++-------- .../app/settings/ombi/ombi.component.ts | 7 +- src/Ombi/Controllers/SearchController.cs | 19 ++- src/Ombi/Controllers/SettingsController.cs | 13 +++ src/Ombi/Models/SimilarMoviesRefineModel.cs | 8 ++ 17 files changed, 196 insertions(+), 134 deletions(-) create mode 100644 src/Ombi/Models/SimilarMoviesRefineModel.cs diff --git a/src/Ombi.Core/Engine/BaseMediaEngine.cs b/src/Ombi.Core/Engine/BaseMediaEngine.cs index cb0047b96..d0bb74c91 100644 --- a/src/Ombi.Core/Engine/BaseMediaEngine.cs +++ b/src/Ombi.Core/Engine/BaseMediaEngine.cs @@ -157,6 +157,24 @@ namespace Ombi.Core.Engine } } + private string defaultLangCode; + protected async Task DefaultLanguageCode(string currentCode) + { + if (currentCode.HasValue()) + { + return currentCode; + } + + var s = await GetOmbiSettings(); + return s.DefaultLanguageCode; + } + + private OmbiSettings ombiSettings; + protected async Task GetOmbiSettings() + { + return ombiSettings ?? (ombiSettings = await OmbiSettings.GetSettingsAsync()); + } + public class HideResult { public bool Hide { get; set; } diff --git a/src/Ombi.Core/Engine/Interfaces/IMovieEngine.cs b/src/Ombi.Core/Engine/Interfaces/IMovieEngine.cs index 4c22bcfc1..b80d132d1 100644 --- a/src/Ombi.Core/Engine/Interfaces/IMovieEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/IMovieEngine.cs @@ -16,8 +16,8 @@ namespace Ombi.Core Task> UpcomingMovies(); - Task LookupImdbInformation(int theMovieDbId, string langCode = "en"); + Task LookupImdbInformation(int theMovieDbId, string langCode = null); - Task> SimilarMovies(int theMovieDbId); + Task> SimilarMovies(int theMovieDbId, string langCode); } } \ No newline at end of file diff --git a/src/Ombi.Core/Engine/MovieSearchEngine.cs b/src/Ombi.Core/Engine/MovieSearchEngine.cs index e4c624c56..51e189db9 100644 --- a/src/Ombi.Core/Engine/MovieSearchEngine.cs +++ b/src/Ombi.Core/Engine/MovieSearchEngine.cs @@ -1,23 +1,22 @@ -using System; -using AutoMapper; +using AutoMapper; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Ombi.Api.TheMovieDb; using Ombi.Api.TheMovieDb.Models; +using Ombi.Core.Authentication; using Ombi.Core.Models.Requests; using Ombi.Core.Models.Search; -using System.Collections.Generic; -using System.Linq; -using System.Security.Principal; -using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore; using Ombi.Core.Rule.Interfaces; -using Microsoft.Extensions.Caching.Memory; -using Ombi.Core.Authentication; using Ombi.Core.Settings; using Ombi.Helpers; using Ombi.Settings.Settings.Models; using Ombi.Store.Entities; using Ombi.Store.Repository; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Principal; +using System.Threading.Tasks; namespace Ombi.Core.Engine { @@ -43,8 +42,9 @@ namespace Ombi.Core.Engine /// /// The movie database identifier. /// - public async Task LookupImdbInformation(int theMovieDbId, string langCode = "en") + public async Task LookupImdbInformation(int theMovieDbId, string langCode = null) { + langCode = await DefaultLanguageCode(langCode); var movieInfo = await MovieApi.GetMovieInformationWithExtraInfo(theMovieDbId, langCode); var viewMovie = Mapper.Map(movieInfo); @@ -58,6 +58,7 @@ namespace Ombi.Core.Engine /// public async Task> Search(string search, int? year, string langaugeCode) { + langaugeCode = await DefaultLanguageCode(langaugeCode); var result = await MovieApi.SearchMovie(search, year, langaugeCode); if (result != null) @@ -72,9 +73,10 @@ namespace Ombi.Core.Engine /// /// /// - public async Task> SimilarMovies(int theMovieDbId) + public async Task> SimilarMovies(int theMovieDbId, string langCode) { - var result = await MovieApi.SimilarMovies(theMovieDbId); + langCode = await DefaultLanguageCode(langCode); + var result = await MovieApi.SimilarMovies(theMovieDbId, langCode); if (result != null) { Logger.LogDebug("Search Result: {result}", result); @@ -89,7 +91,12 @@ namespace Ombi.Core.Engine /// public async Task> PopularMovies() { - var result = await Cache.GetOrAdd(CacheKeys.PopularMovies, async () => await MovieApi.PopularMovies(), DateTime.Now.AddHours(12)); + + var result = await Cache.GetOrAdd(CacheKeys.PopularMovies, async () => + { + var langCode = await DefaultLanguageCode(null); + return await MovieApi.PopularMovies(langCode); + }, DateTime.Now.AddHours(12)); if (result != null) { return await TransformMovieResultsToResponse(result.Take(MovieLimit)); // Take x to stop us overloading the API @@ -103,7 +110,11 @@ namespace Ombi.Core.Engine /// public async Task> TopRatedMovies() { - var result = await Cache.GetOrAdd(CacheKeys.TopRatedMovies, async () => await MovieApi.TopRated(), DateTime.Now.AddHours(12)); + var result = await Cache.GetOrAdd(CacheKeys.TopRatedMovies, async () => + { + var langCode = await DefaultLanguageCode(null); + return await MovieApi.TopRated(langCode); + }, DateTime.Now.AddHours(12)); if (result != null) { return await TransformMovieResultsToResponse(result.Take(MovieLimit)); // Take x to stop us overloading the API @@ -117,7 +128,11 @@ namespace Ombi.Core.Engine /// public async Task> UpcomingMovies() { - var result = await Cache.GetOrAdd(CacheKeys.UpcomingMovies, async () => await MovieApi.Upcoming(), DateTime.Now.AddHours(12)); + var result = await Cache.GetOrAdd(CacheKeys.UpcomingMovies, async () => + { + var langCode = await DefaultLanguageCode(null); + return await MovieApi.Upcoming(langCode); + }, DateTime.Now.AddHours(12)); if (result != null) { Logger.LogDebug("Search Result: {result}", result); @@ -132,7 +147,11 @@ namespace Ombi.Core.Engine /// public async Task> NowPlayingMovies() { - var result = await Cache.GetOrAdd(CacheKeys.NowPlayingMovies, async () => await MovieApi.NowPlaying(), DateTime.Now.AddHours(12)); + var result = await Cache.GetOrAdd(CacheKeys.NowPlayingMovies, async () => + { + var langCode = await DefaultLanguageCode(null); + return await MovieApi.NowPlaying(langCode); + }, DateTime.Now.AddHours(12)); if (result != null) { return await TransformMovieResultsToResponse(result.Take(MovieLimit)); // Take x to stop us overloading the API diff --git a/src/Ombi.TheMovieDbApi/IMovieDbApi.cs b/src/Ombi.TheMovieDbApi/IMovieDbApi.cs index 6f73c5f68..5fa5b73bd 100644 --- a/src/Ombi.TheMovieDbApi/IMovieDbApi.cs +++ b/src/Ombi.TheMovieDbApi/IMovieDbApi.cs @@ -9,13 +9,13 @@ namespace Ombi.Api.TheMovieDb { Task GetMovieInformation(int movieId); Task GetMovieInformationWithExtraInfo(int movieId, string langCode = "en"); - Task> NowPlaying(); - Task> PopularMovies(); + Task> NowPlaying(string languageCode); + Task> PopularMovies(string languageCode); Task> SearchMovie(string searchTerm, int? year, string languageCode); Task> SearchTv(string searchTerm); - Task> TopRated(); - Task> Upcoming(); - Task> SimilarMovies(int movieId); + Task> TopRated(string languageCode); + Task> Upcoming(string languageCode); + Task> SimilarMovies(int movieId, string langCode); Task Find(string externalId, ExternalSource source); Task GetTvExternals(int theMovieDbId); Task GetTVInfo(string themoviedbid); diff --git a/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs b/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs index a66193768..0500171c9 100644 --- a/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs +++ b/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs @@ -63,10 +63,12 @@ namespace Ombi.Api.TheMovieDb return await Api.Request(request); } - public async Task> SimilarMovies(int movieId) + public async Task> SimilarMovies(int movieId, string langCode) { var request = new Request($"movie/{movieId}/similar", BaseUri, HttpMethod.Get); request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken); + + request.FullUri = request.FullUri.AddQueryParameter("language", langCode); AddRetry(request); var result = await Api.Request>(request); @@ -100,37 +102,41 @@ namespace Ombi.Api.TheMovieDb return Mapper.Map>(result.results); } - public async Task> PopularMovies() + public async Task> PopularMovies(string langageCode) { var request = new Request($"movie/popular", BaseUri, HttpMethod.Get); request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken); + request.FullUri = request.FullUri.AddQueryParameter("language", langageCode); AddRetry(request); var result = await Api.Request>(request); return Mapper.Map>(result.results); } - public async Task> TopRated() + public async Task> TopRated(string langageCode) { var request = new Request($"movie/top_rated", BaseUri, HttpMethod.Get); request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken); + request.FullUri = request.FullUri.AddQueryParameter("language", langageCode); AddRetry(request); var result = await Api.Request>(request); return Mapper.Map>(result.results); } - public async Task> Upcoming() + public async Task> Upcoming(string langageCode) { var request = new Request($"movie/upcoming", BaseUri, HttpMethod.Get); request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken); + request.FullUri = request.FullUri.AddQueryParameter("language", langageCode); AddRetry(request); var result = await Api.Request>(request); return Mapper.Map>(result.results); } - public async Task> NowPlaying() + public async Task> NowPlaying(string langageCode) { var request = new Request($"movie/now_playing", BaseUri, HttpMethod.Get); request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken); + request.FullUri = request.FullUri.AddQueryParameter("language", langageCode); AddRetry(request); var result = await Api.Request>(request); return Mapper.Map>(result.results); diff --git a/src/Ombi/ClientApp/app/interfaces/IRequestModel.ts b/src/Ombi/ClientApp/app/interfaces/IRequestModel.ts index 84a63d49c..343db5acc 100644 --- a/src/Ombi/ClientApp/app/interfaces/IRequestModel.ts +++ b/src/Ombi/ClientApp/app/interfaces/IRequestModel.ts @@ -154,7 +154,7 @@ export interface IEpisodesRequests { export interface IMovieRequestModel { theMovieDbId: number; - languageCode: string; + languageCode: string | undefined; } export interface IFilter { diff --git a/src/Ombi/ClientApp/app/interfaces/ISettings.ts b/src/Ombi/ClientApp/app/interfaces/ISettings.ts index e74e10883..f2453c273 100644 --- a/src/Ombi/ClientApp/app/interfaces/ISettings.ts +++ b/src/Ombi/ClientApp/app/interfaces/ISettings.ts @@ -15,6 +15,7 @@ export interface IOmbiSettings extends ISettings { ignoreCertificateErrors: boolean; doNotSendNotificationsForAutoApprove: boolean; hideRequestsUsers: boolean; + defaultLanguageCode: string; } export interface IUpdateSettings extends ISettings { diff --git a/src/Ombi/ClientApp/app/search/moviesearch.component.ts b/src/Ombi/ClientApp/app/search/moviesearch.component.ts index a5327cffe..8c82b58fd 100644 --- a/src/Ombi/ClientApp/app/search/moviesearch.component.ts +++ b/src/Ombi/ClientApp/app/search/moviesearch.component.ts @@ -7,7 +7,7 @@ import { debounceTime, distinctUntilChanged } from "rxjs/operators"; import { AuthService } from "../auth/auth.service"; import { IIssueCategory, ILanguageRefine, IRequestEngineResult, ISearchMovieResult } from "../interfaces"; -import { NotificationService, RequestService, SearchService } from "../services"; +import { NotificationService, RequestService, SearchService, SettingsService } from "../services"; import * as languageData from "../../other/iso-lang.json"; @@ -43,7 +43,7 @@ export class MovieSearchComponent implements OnInit { private searchService: SearchService, private requestService: RequestService, private notificationService: NotificationService, private authService: AuthService, private readonly translate: TranslateService, private sanitizer: DomSanitizer, - private readonly platformLocation: PlatformLocation) { + private readonly platformLocation: PlatformLocation, private settingsService: SettingsService) { this.langauges = languageData; this.searchChanged.pipe( debounceTime(600), // Wait Xms after the last event before emitting last event @@ -67,7 +67,7 @@ export class MovieSearchComponent implements OnInit { result: false, errorMessage: "", }; - + this.settingsService.getDefaultLanguage().subscribe(x => this.selectedLanguage = x); this.popularMovies(); } @@ -159,7 +159,8 @@ export class MovieSearchComponent implements OnInit { public similarMovies(theMovieDbId: number) { this.clearResults(); - this.searchService.similarMovies(theMovieDbId) + const lang = this.selectedLanguage && this.selectedLanguage.length > 0 ? this.selectedLanguage : ""; + this.searchService.similarMovies(theMovieDbId, lang) .subscribe(x => { this.movieResults = x; this.getExtraInfo(); diff --git a/src/Ombi/ClientApp/app/search/moviesearchgrid.component.ts b/src/Ombi/ClientApp/app/search/moviesearchgrid.component.ts index 6999f37aa..4ff6fa986 100644 --- a/src/Ombi/ClientApp/app/search/moviesearchgrid.component.ts +++ b/src/Ombi/ClientApp/app/search/moviesearchgrid.component.ts @@ -65,7 +65,7 @@ export class MovieSearchGridComponent implements OnInit { } try { - this.requestService.requestMovie({ theMovieDbId: searchResult.id }) + this.requestService.requestMovie({ theMovieDbId: searchResult.id, languageCode: "en" }) .subscribe(x => { this.result = x; diff --git a/src/Ombi/ClientApp/app/search/music/musicsearch.component.ts b/src/Ombi/ClientApp/app/search/music/musicsearch.component.ts index 54d941da8..2fd9839f2 100644 --- a/src/Ombi/ClientApp/app/search/music/musicsearch.component.ts +++ b/src/Ombi/ClientApp/app/search/music/musicsearch.component.ts @@ -1,14 +1,11 @@ import { PlatformLocation } from "@angular/common"; import { Component, Input, OnInit } from "@angular/core"; import { DomSanitizer } from "@angular/platform-browser"; -import { TranslateService } from "@ngx-translate/core"; import { Subject } from "rxjs"; import { debounceTime, distinctUntilChanged } from "rxjs/operators"; - -import { AuthService } from "../../auth/auth.service"; -import { IIssueCategory, IRequestEngineResult, ISearchMovieResult } from "../../interfaces"; +import { IIssueCategory, IRequestEngineResult } from "../../interfaces"; import { ISearchAlbumResult, ISearchArtistResult } from "../../interfaces/ISearchMusicResult"; -import { NotificationService, RequestService, SearchService } from "../../services"; +import { SearchService } from "../../services"; @Component({ selector: "music-search", @@ -35,10 +32,8 @@ export class MusicSearchComponent implements OnInit { public defaultPoster: string; constructor( - private searchService: SearchService, private requestService: RequestService, - private notificationService: NotificationService, private authService: AuthService, - private readonly translate: TranslateService, private sanitizer: DomSanitizer, - private readonly platformLocation: PlatformLocation) { + private searchService: SearchService, private sanitizer: DomSanitizer, + private platformLocation: PlatformLocation) { this.searchChanged.pipe( debounceTime(600), // Wait Xms after the last event before emitting last event @@ -110,45 +105,6 @@ export class MusicSearchComponent implements OnInit { this.searchChanged.next(`lidarr:${artistId}`); } - public request(searchResult: ISearchMovieResult) { - searchResult.requested = true; - searchResult.requestProcessing = true; - searchResult.showSubscribe = false; - if (this.authService.hasRole("admin") || this.authService.hasRole("AutoApproveMovie")) { - searchResult.approved = true; - } - - try { - this.requestService.requestMovie({ theMovieDbId: searchResult.id }) - .subscribe(x => { - this.result = x; - - if (this.result.result) { - this.translate.get("Search.RequestAdded", { title: searchResult.title }).subscribe(x => { - this.notificationService.success(x); - searchResult.processed = true; - }); - } else { - if (this.result.errorMessage && this.result.message) { - this.notificationService.warning("Request Added", `${this.result.message} - ${this.result.errorMessage}`); - } else { - this.notificationService.warning("Request Added", this.result.message ? this.result.message : this.result.errorMessage); - } - searchResult.requested = false; - searchResult.approved = false; - searchResult.processed = false; - searchResult.requestProcessing = false; - - } - }); - } catch (e) { - - searchResult.processed = false; - searchResult.requestProcessing = false; - this.notificationService.error(e); - } - } - public viewAlbumsForArtist(albums: ISearchAlbumResult[]) { this.clearArtistResults(); this.searchAlbum = true; diff --git a/src/Ombi/ClientApp/app/services/search.service.ts b/src/Ombi/ClientApp/app/services/search.service.ts index a6c0a2387..a0abd6d24 100644 --- a/src/Ombi/ClientApp/app/services/search.service.ts +++ b/src/Ombi/ClientApp/app/services/search.service.ts @@ -25,8 +25,8 @@ export class SearchService extends ServiceHelpers { return this.http.post(`${this.url}/Movie/`, { searchTerm, year, languageCode: langCode }); } - public similarMovies(theMovieDbId: number): Observable { - return this.http.get(`${this.url}/Movie/${theMovieDbId}/similar`); + public similarMovies(theMovieDbId: number, langCode: string): Observable { + return this.http.post(`${this.url}/Movie/similar`, {theMovieDbId, languageCode: langCode}); } public popularMovies(): Observable { diff --git a/src/Ombi/ClientApp/app/services/settings.service.ts b/src/Ombi/ClientApp/app/services/settings.service.ts index 0994cf6d8..64a6edd14 100644 --- a/src/Ombi/ClientApp/app/services/settings.service.ts +++ b/src/Ombi/ClientApp/app/services/settings.service.ts @@ -52,6 +52,10 @@ export class SettingsService extends ServiceHelpers { return this.http.get(`${this.url}/Ombi/`, {headers: this.headers}); } + public getDefaultLanguage(): Observable { + return this.http.get(`${this.url}/defaultlanguage/`, {headers: this.headers}); + } + public saveOmbi(settings: IOmbiSettings): Observable { return this.http.post(`${this.url}/Ombi/`, JSON.stringify(settings), {headers: this.headers}); } diff --git a/src/Ombi/ClientApp/app/settings/ombi/ombi.component.html b/src/Ombi/ClientApp/app/settings/ombi/ombi.component.html index 2f1d40a8a..478817d6b 100644 --- a/src/Ombi/ClientApp/app/settings/ombi/ombi.component.html +++ b/src/Ombi/ClientApp/app/settings/ombi/ombi.component.html @@ -22,64 +22,80 @@ -->
- -
- -
- -
-
-
- -
- - -
-
-
- -
-
+
+ +
+
-
-
-
-
- - +
+ +
+ + +
+
+
+ +
+
+
+
-
+
-
-
- - +
+
+ + +
-
- -
-
- - +
+
+ + +
-
-
-
- - -
-
-
-
- +
+
+ + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+
+ +
+
+ +
-
- + \ No newline at end of file diff --git a/src/Ombi/ClientApp/app/settings/ombi/ombi.component.ts b/src/Ombi/ClientApp/app/settings/ombi/ombi.component.ts index 31a8da156..4aec1a57c 100644 --- a/src/Ombi/ClientApp/app/settings/ombi/ombi.component.ts +++ b/src/Ombi/ClientApp/app/settings/ombi/ombi.component.ts @@ -1,16 +1,19 @@ import { Component, OnInit } from "@angular/core"; import { FormBuilder, FormGroup } from "@angular/forms"; -import { IOmbiSettings } from "../../interfaces"; +import { ILanguageRefine, IOmbiSettings } from "../../interfaces"; import { NotificationService } from "../../services"; import { SettingsService } from "../../services"; +import * as languageData from "../../../other/iso-lang.json"; + @Component({ templateUrl: "./ombi.component.html", }) export class OmbiComponent implements OnInit { public form: FormGroup; + public langauges: ILanguageRefine[]; constructor(private settingsService: SettingsService, private notificationService: NotificationService, @@ -25,8 +28,10 @@ export class OmbiComponent implements OnInit { baseUrl: [x.baseUrl], doNotSendNotificationsForAutoApprove: [x.doNotSendNotificationsForAutoApprove], hideRequestsUsers: [x.hideRequestsUsers], + defaultLanguageCode: [x.defaultLanguageCode], }); }); + this.langauges = languageData; } public refreshApiKey() { diff --git a/src/Ombi/Controllers/SearchController.cs b/src/Ombi/Controllers/SearchController.cs index 7d86de30d..872a3305e 100644 --- a/src/Ombi/Controllers/SearchController.cs +++ b/src/Ombi/Controllers/SearchController.cs @@ -47,7 +47,7 @@ namespace Ombi.Controllers { Logger.LogDebug("Searching : {searchTerm}", searchTerm); - return await MovieEngine.Search(searchTerm, null, "en"); + return await MovieEngine.Search(searchTerm, null, null); } } @@ -114,6 +114,21 @@ namespace Ombi.Controllers return Json(await MovieEngine.LookupImdbInformation(model.TheMovieDbId, model.LanguageCode)); } + /// + /// Returns similar movies to the movie id passed in + /// + /// ID of the movie + /// + /// We use TheMovieDb as the Movie Provider + /// + [HttpPost("movie/similar")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesDefaultResponseType] + public async Task> SimilarMovies([FromBody] SimilarMoviesRefineModel model) + { + return await MovieEngine.SimilarMovies(model.TheMovieDbId, model.LanguageCode); + } + /// /// Returns similar movies to the movie id passed in /// @@ -126,7 +141,7 @@ namespace Ombi.Controllers [ProducesDefaultResponseType] public async Task> SimilarMovies(int theMovieDbId) { - return await MovieEngine.SimilarMovies(theMovieDbId); + return await MovieEngine.SimilarMovies(theMovieDbId, null); } /// diff --git a/src/Ombi/Controllers/SettingsController.cs b/src/Ombi/Controllers/SettingsController.cs index a02e966c1..45efc8067 100644 --- a/src/Ombi/Controllers/SettingsController.cs +++ b/src/Ombi/Controllers/SettingsController.cs @@ -225,6 +225,19 @@ namespace Ombi.Controllers return await Get(); } + + /// + /// Gets the default language set in Ombi + /// + /// + [HttpGet("defaultlanguage")] + [AllowAnonymous] + public async Task GetDefaultLanguage() + { + var s = await Get(); + return s.DefaultLanguageCode; + } + /// /// Save the Customization settings. /// diff --git a/src/Ombi/Models/SimilarMoviesRefineModel.cs b/src/Ombi/Models/SimilarMoviesRefineModel.cs new file mode 100644 index 000000000..1d955db72 --- /dev/null +++ b/src/Ombi/Models/SimilarMoviesRefineModel.cs @@ -0,0 +1,8 @@ +namespace Ombi.Models +{ + public class SimilarMoviesRefineModel + { + public int TheMovieDbId { get; set; } + public string LanguageCode { get; set; } = "en"; + } +}