diff --git a/appveyor.yml b/appveyor.yml index edd53f512..3c60a0006 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -35,7 +35,10 @@ after_build: appveyor PushArtifact "%APPVEYOR_BUILD_FOLDER%\src\Ombi\bin\Release\netcoreapp2.2\linux.tar.gz" - + + appveyor PushArtifact "%APPVEYOR_BUILD_FOLDER%\src\Ombi\bin\Release\netcoreapp2.2\linux-arm.tar.gz" + + appveyor PushArtifact "%APPVEYOR_BUILD_FOLDER%\src\Ombi\bin\Release\netcoreapp2.2\windows-32bit.zip" diff --git a/build.cake b/build.cake index 8333bd3a1..e8e4bb8c0 100644 --- a/build.cake +++ b/build.cake @@ -47,6 +47,7 @@ var windowsArtifactsFolder = artifactsFolder + "win10-x64/published"; var windows32BitArtifactsFolder = artifactsFolder + "win10-x86/published"; var osxArtifactsFolder = artifactsFolder + "osx-x64/published"; var linuxArtifactsFolder = artifactsFolder + "linux-x64/published"; +var linuxArmArtifactsFolder = artifactsFolder + "linux-arm/published"; var linuxArm64BitArtifactsFolder = artifactsFolder + "linux-arm64/published"; @@ -149,6 +150,7 @@ Task("Package") Zip(windows32BitArtifactsFolder +"/",artifactsFolder + "windows-32bit.zip"); GZipCompress(osxArtifactsFolder, artifactsFolder + "osx.tar.gz"); GZipCompress(linuxArtifactsFolder, artifactsFolder + "linux.tar.gz"); + GZipCompress(linuxArmArtifactsFolder, artifactsFolder + "linux-arm.tar.gz"); GZipCompress(linuxArm64BitArtifactsFolder, artifactsFolder + "linux-arm64.tar.gz"); }); @@ -158,6 +160,7 @@ Task("Publish") .IsDependentOn("Publish-Windows-32bit") .IsDependentOn("Publish-OSX") .IsDependentOn("Publish-Linux") + .IsDependentOn("Publish-Linux-ARM") .IsDependentOn("Publish-Linux-ARM-64Bit") .IsDependentOn("Package"); @@ -214,6 +217,20 @@ Task("Publish-Linux") DotNetCorePublish("./src/Ombi.Updater/Ombi.Updater.csproj", publishSettings); }); +Task("Publish-Linux-ARM") + .Does(() => +{ + publishSettings.Runtime = "linux-arm"; + publishSettings.OutputDirectory = Directory(buildDir) + Directory(frameworkVer+"/linux-arm/published"); + + DotNetCorePublish("./src/Ombi/Ombi.csproj", publishSettings); + CopyFile( + buildDir + "/"+frameworkVer+"/linux-arm/Swagger.xml", + buildDir + "/"+frameworkVer+"/linux-arm/published/Swagger.xml"); + + publishSettings.OutputDirectory = Directory(buildDir) + Directory(frameworkVer +"/linux-arm/published/updater"); + DotNetCorePublish("./src/Ombi.Updater/Ombi.Updater.csproj", publishSettings); +}); Task("Publish-Linux-ARM-64Bit") .Does(() => diff --git a/src/Ombi.Api.Sonarr/Models/SonarrSeries.cs b/src/Ombi.Api.Sonarr/Models/SonarrSeries.cs index 568592734..3ade006d5 100644 --- a/src/Ombi.Api.Sonarr/Models/SonarrSeries.cs +++ b/src/Ombi.Api.Sonarr/Models/SonarrSeries.cs @@ -44,6 +44,7 @@ namespace Ombi.Api.Sonarr.Models public DateTime added { get; set; } public Ratings ratings { get; set; } public int qualityProfileId { get; set; } + public int languageProfileId { get; set; } public int id { get; set; } public DateTime nextAiring { get; set; } } diff --git a/src/Ombi.Core/Engine/Interfaces/IMovieEngine.cs b/src/Ombi.Core/Engine/Interfaces/IMovieEngine.cs index 91b6404db..4c22bcfc1 100644 --- a/src/Ombi.Core/Engine/Interfaces/IMovieEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/IMovieEngine.cs @@ -10,13 +10,13 @@ namespace Ombi.Core Task> PopularMovies(); - Task> Search(string search); + Task> Search(string search, int? year, string languageCode); Task> TopRatedMovies(); Task> UpcomingMovies(); - Task LookupImdbInformation(int theMovieDbId); + Task LookupImdbInformation(int theMovieDbId, string langCode = "en"); Task> SimilarMovies(int theMovieDbId); } diff --git a/src/Ombi.Core/Engine/MovieSearchEngine.cs b/src/Ombi.Core/Engine/MovieSearchEngine.cs index 09b4cea6b..e4c624c56 100644 --- a/src/Ombi.Core/Engine/MovieSearchEngine.cs +++ b/src/Ombi.Core/Engine/MovieSearchEngine.cs @@ -36,14 +36,16 @@ namespace Ombi.Core.Engine private IMapper Mapper { get; } private ILogger Logger { get; } + private const int MovieLimit = 10; + /// /// Lookups the imdb information. /// /// The movie database identifier. /// - public async Task LookupImdbInformation(int theMovieDbId) + public async Task LookupImdbInformation(int theMovieDbId, string langCode = "en") { - var movieInfo = await MovieApi.GetMovieInformationWithExtraInfo(theMovieDbId); + var movieInfo = await MovieApi.GetMovieInformationWithExtraInfo(theMovieDbId, langCode); var viewMovie = Mapper.Map(movieInfo); return await ProcessSingleMovie(viewMovie, true); @@ -54,13 +56,13 @@ namespace Ombi.Core.Engine /// /// The search. /// - public async Task> Search(string search) + public async Task> Search(string search, int? year, string langaugeCode) { - var result = await MovieApi.SearchMovie(search); + var result = await MovieApi.SearchMovie(search, year, langaugeCode); if (result != null) { - return await TransformMovieResultsToResponse(result.Take(10)); // Take 10 to stop us overloading the API + return await TransformMovieResultsToResponse(result.Take(MovieLimit)); // Take x to stop us overloading the API } return null; } @@ -76,7 +78,7 @@ namespace Ombi.Core.Engine if (result != null) { Logger.LogDebug("Search Result: {result}", result); - return await TransformMovieResultsToResponse(result.Take(10)); // Take 10 to stop us overloading the API + return await TransformMovieResultsToResponse(result.Take(MovieLimit)); // Take x to stop us overloading the API } return null; } @@ -90,7 +92,7 @@ namespace Ombi.Core.Engine var result = await Cache.GetOrAdd(CacheKeys.PopularMovies, async () => await MovieApi.PopularMovies(), DateTime.Now.AddHours(12)); if (result != null) { - return await TransformMovieResultsToResponse(result.Take(10)); // Take 10 to stop us overloading the API + return await TransformMovieResultsToResponse(result.Take(MovieLimit)); // Take x to stop us overloading the API } return null; } @@ -104,7 +106,7 @@ namespace Ombi.Core.Engine var result = await Cache.GetOrAdd(CacheKeys.TopRatedMovies, async () => await MovieApi.TopRated(), DateTime.Now.AddHours(12)); if (result != null) { - return await TransformMovieResultsToResponse(result.Take(10)); // Take 10 to stop us overloading the API + return await TransformMovieResultsToResponse(result.Take(MovieLimit)); // Take x to stop us overloading the API } return null; } @@ -119,7 +121,7 @@ namespace Ombi.Core.Engine if (result != null) { Logger.LogDebug("Search Result: {result}", result); - return await TransformMovieResultsToResponse(result.Take(10)); // Take 10 to stop us overloading the API + return await TransformMovieResultsToResponse(result.Take(MovieLimit)); // Take x to stop us overloading the API } return null; } @@ -133,7 +135,7 @@ namespace Ombi.Core.Engine var result = await Cache.GetOrAdd(CacheKeys.NowPlayingMovies, async () => await MovieApi.NowPlaying(), DateTime.Now.AddHours(12)); if (result != null) { - return await TransformMovieResultsToResponse(result.Take(10)); // Take 10 to stop us overloading the API + return await TransformMovieResultsToResponse(result.Take(MovieLimit)); // Take x to stop us overloading the API } return null; } diff --git a/src/Ombi.Core/Senders/TvSender.cs b/src/Ombi.Core/Senders/TvSender.cs index d0946b6f4..f0784a4ca 100644 --- a/src/Ombi.Core/Senders/TvSender.cs +++ b/src/Ombi.Core/Senders/TvSender.cs @@ -348,16 +348,16 @@ namespace Ombi.Core.Senders if (!existingSeason.monitored) { // We need to monitor it, problem being is all episodes will now be monitored - // So we need to monior the series but unmonitor every episode - // Except the episodes that are already monitored before we update the series (we do not want to unmonitor episodes that are monitored beforehand) + // So we need to monitor the series but unmonitor every episode + // Except the episodes that are already monitored before we update the series (we do not want to unmonitored episodes that are monitored beforehand) existingSeason.monitored = true; var sea = result.seasons.FirstOrDefault(x => x.seasonNumber == existingSeason.seasonNumber); sea.monitored = true; //var previouslyMonitoredEpisodes = sonarrEpList.Where(x => // x.seasonNumber == existingSeason.seasonNumber && x.monitored).Select(x => x.episodeNumber).ToList(); // We probably don't actually care about this result = await SonarrApi.UpdateSeries(result, s.ApiKey, s.FullUri); - var epToUnmonitor = new List(); - var newEpList = sonarrEpList.ConvertAll(ep => new Episode(ep)); // Clone it so we don't modify the orignal member + var epToUnmonitored = new List(); + var newEpList = sonarrEpList.ConvertAll(ep => new Episode(ep)); // Clone it so we don't modify the original member foreach (var ep in newEpList.Where(x => x.seasonNumber == existingSeason.seasonNumber).ToList()) { //if (previouslyMonitoredEpisodes.Contains(ep.episodeNumber)) @@ -366,10 +366,10 @@ namespace Ombi.Core.Senders // continue; //} ep.monitored = false; - epToUnmonitor.Add(ep); + epToUnmonitored.Add(ep); } - foreach (var epToUpdate in epToUnmonitor) + foreach (var epToUpdate in epToUnmonitored) { await SonarrApi.UpdateEpisode(epToUpdate, s.ApiKey, s.FullUri); } diff --git a/src/Ombi.Helpers.Tests/Ombi.Helpers.Tests.csproj b/src/Ombi.Helpers.Tests/Ombi.Helpers.Tests.csproj new file mode 100644 index 000000000..0517af22d --- /dev/null +++ b/src/Ombi.Helpers.Tests/Ombi.Helpers.Tests.csproj @@ -0,0 +1,19 @@ + + + + netcoreapp2.2 + + false + + + + + + + + + + + + + diff --git a/src/Ombi.Helpers.Tests/PlexHelperTests.cs b/src/Ombi.Helpers.Tests/PlexHelperTests.cs new file mode 100644 index 000000000..8ecb3fa0a --- /dev/null +++ b/src/Ombi.Helpers.Tests/PlexHelperTests.cs @@ -0,0 +1,52 @@ +using System; +using NUnit.Framework; +using System.Collections.Generic; + +namespace Ombi.Helpers.Tests +{ + [TestFixture] + public class PlexHelperTests + { + + [TestCaseSource(nameof(ProviderIdGuidData))] + public string GetProviderIdFromPlexGuidTests(string guidInput, ProviderIdType type) + { + var result = PlexHelper.GetProviderIdFromPlexGuid(guidInput); + + switch (type) + { + case ProviderIdType.Imdb: + Assert.That(result.ImdbId, Is.Not.Null); + return result.ImdbId; + case ProviderIdType.TvDb: + Assert.That(result.TheTvDb, Is.Not.Null); + return result.TheTvDb; + case ProviderIdType.MovieDb: + Assert.That(result.TheMovieDb, Is.Not.Null); + return result.TheMovieDb; + default: + throw new ArgumentOutOfRangeException(nameof(type), type, null); + } + } + + public static IEnumerable ProviderIdGuidData + { + get + { + yield return new TestCaseData("com.plexapp.agents.thetvdb://269586/2/8?lang=en", ProviderIdType.TvDb).Returns("269586").SetName("Regular TvDb Id"); + yield return new TestCaseData("com.plexapp.agents.themoviedb://390043?lang=en", ProviderIdType.MovieDb).Returns("390043").SetName("Regular MovieDb Id"); + yield return new TestCaseData("com.plexapp.agents.imdb://tt2543164?lang=en", ProviderIdType.Imdb).Returns("tt2543164").SetName("Regular Imdb Id"); + yield return new TestCaseData("com.plexapp.agents.agent47://tt2543456?lang=en", ProviderIdType.Imdb).Returns("tt2543456").SetName("Unknown IMDB agent"); + yield return new TestCaseData("com.plexapp.agents.agent47://456822/1/1?lang=en", ProviderIdType.TvDb).Returns("456822").SetName("Unknown TvDb agent"); + yield return new TestCaseData("com.plexapp.agents.agent47://456822/999/999?lang=en", ProviderIdType.TvDb).Returns("456822").SetName("Unknown TvDb agent, large episode and season"); + } + } + + public enum ProviderIdType + { + Imdb, + TvDb, + MovieDb + } + } +} \ No newline at end of file diff --git a/src/Ombi.Helpers/PlexHelper.cs b/src/Ombi.Helpers/PlexHelper.cs index 93710022f..de61b8740 100644 --- a/src/Ombi.Helpers/PlexHelper.cs +++ b/src/Ombi.Helpers/PlexHelper.cs @@ -27,12 +27,15 @@ using System; using System.Globalization; +using System.Text.RegularExpressions; namespace Ombi.Helpers { public class PlexHelper { - + private const string ImdbMatchExpression = "tt([0-9]{1,10})"; + private const string TvDbIdMatchExpression = "//[0-9]+/([0-9]{1,3})/([0-9]{1,3})"; + public static ProviderId GetProviderIdFromPlexGuid(string guid) { //com.plexapp.agents.thetvdb://269586/2/8?lang=en @@ -52,7 +55,7 @@ namespace Ombi.Helpers { TheTvDb = guidSplit[1] }; - } + } else if (guid.Contains("themoviedb", CompareOptions.IgnoreCase)) { return new ProviderId @@ -60,6 +63,7 @@ namespace Ombi.Helpers TheMovieDb = guidSplit[1] }; } + else if (guid.Contains("imdb", CompareOptions.IgnoreCase)) { return new ProviderId @@ -67,6 +71,31 @@ namespace Ombi.Helpers ImdbId = guidSplit[1] }; } + else + { + var imdbRegex = new Regex(ImdbMatchExpression, RegexOptions.Compiled); + var tvdbRegex = new Regex(TvDbIdMatchExpression, RegexOptions.Compiled); + var imdbMatch = imdbRegex.IsMatch(guid); + if (imdbMatch) + { + return new ProviderId + { + ImdbId = guidSplit[1] + }; + } + else + { + // Check if it matches the TvDb pattern + var tvdbMatch = tvdbRegex.IsMatch(guid); + if (tvdbMatch) + { + return new ProviderId + { + TheTvDb = guidSplit[1] + }; + } + } + } } return new ProviderId(); } diff --git a/src/Ombi.Notifications.Templates/Templates/NewsletterTemplate.html b/src/Ombi.Notifications.Templates/Templates/NewsletterTemplate.html index 450e7df2a..5456743c9 100644 --- a/src/Ombi.Notifications.Templates/Templates/NewsletterTemplate.html +++ b/src/Ombi.Notifications.Templates/Templates/NewsletterTemplate.html @@ -1,10 +1,17 @@ - + + - - + + Ombi - - - - -
-
- - - - - - - - - - - - - -
- - - - - - - -
- -
-
-
-

{@INTRO}

- -
- -
- {@RECENTLYADDED} -
- - -
"); - sb.AppendFormat("", url); + sb.Append("
"); + sb.AppendFormat("", url); sb.Append(""); - sb.Append("
"); - sb.Append(""); + sb.Append("
"); + sb.Append(""); } protected virtual void AddPosterInsideTable(StringBuilder sb, string url) { sb.Append(""); - sb.Append("
"); - sb.AppendFormat("", url); + sb.Append("
"); + sb.AppendFormat("", url); } protected virtual void AddMediaServerUrl(StringBuilder sb, string mediaurl, string url) @@ -27,10 +27,10 @@ namespace Ombi.Schedule.Jobs.Ombi { sb.Append(""); sb.Append( - ""); @@ -44,16 +44,16 @@ namespace Ombi.Schedule.Jobs.Ombi protected virtual void AddInfoTable(StringBuilder sb) { sb.Append( - "
"); + ""); sb.AppendFormat("", mediaurl); sb.AppendFormat( - "", + "", url); sb.Append(""); sb.Append(""); + ""); sb.Append(""); } protected virtual void AddTitle(StringBuilder sb, string url, string title) { - sb.Append(""); - sb.Append(""); + sb.Append(""); sb.Append(""); @@ -61,30 +61,30 @@ namespace Ombi.Schedule.Jobs.Ombi protected virtual void AddParagraph(StringBuilder sb, string text) { - sb.Append(""); - sb.Append(""); + sb.Append(""); sb.Append(""); } protected virtual void AddTvParagraph(StringBuilder sb, string episodes, string summary) { - sb.Append(""); - sb.Append(""); + sb.Append(""); sb.Append(""); } protected virtual void AddGenres(StringBuilder sb, string text) { - sb.Append(""); - sb.Append(""); + sb.Append(""); sb.Append(""); } } -} \ No newline at end of file +} diff --git a/src/Ombi.Settings/Settings/Models/OmbiSettings.cs b/src/Ombi.Settings/Settings/Models/OmbiSettings.cs index bf4d29eb4..c35f10f9f 100644 --- a/src/Ombi.Settings/Settings/Models/OmbiSettings.cs +++ b/src/Ombi.Settings/Settings/Models/OmbiSettings.cs @@ -4,6 +4,7 @@ { public string BaseUrl { get; set; } public bool CollectAnalyticData { get; set; } + public bool Set { get; set; } public bool Wizard { get; set; } public string ApiKey { get; set; } public bool IgnoreCertificateErrors { get; set; } diff --git a/src/Ombi.Store/Migrations/OmbiContextModelSnapshot.cs b/src/Ombi.Store/Migrations/OmbiContextModelSnapshot.cs index 5a009d5ef..f72490720 100644 --- a/src/Ombi.Store/Migrations/OmbiContextModelSnapshot.cs +++ b/src/Ombi.Store/Migrations/OmbiContextModelSnapshot.cs @@ -2,7 +2,6 @@ using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Ombi.Store.Context; namespace Ombi.Store.Migrations @@ -14,7 +13,7 @@ namespace Ombi.Store.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "2.1.4-rtm-31024"); + .HasAnnotation("ProductVersion", "2.2.0-rtm-35687"); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => { @@ -530,6 +529,24 @@ namespace Ombi.Store.Migrations b.ToTable("RequestQueue"); }); + modelBuilder.Entity("Ombi.Store.Entities.RequestSubscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("RequestId"); + + b.Property("RequestType"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("RequestSubscription"); + }); + modelBuilder.Entity("Ombi.Store.Entities.Requests.AlbumRequest", b => { b.Property("Id") @@ -800,24 +817,6 @@ namespace Ombi.Store.Migrations b.ToTable("TvRequests"); }); - modelBuilder.Entity("Ombi.Store.Entities.RequestSubscription", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("RequestId"); - - b.Property("RequestType"); - - b.Property("UserId"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("RequestSubscription"); - }); - modelBuilder.Entity("Ombi.Store.Entities.SickRageCache", b => { b.Property("Id") @@ -1082,6 +1081,13 @@ namespace Ombi.Store.Migrations .HasForeignKey("PlexServerContentId"); }); + modelBuilder.Entity("Ombi.Store.Entities.RequestSubscription", b => + { + b.HasOne("Ombi.Store.Entities.OmbiUser", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + modelBuilder.Entity("Ombi.Store.Entities.Requests.AlbumRequest", b => { b.HasOne("Ombi.Store.Entities.OmbiUser", "RequestedUser") @@ -1146,13 +1152,6 @@ namespace Ombi.Store.Migrations .HasForeignKey("UserId"); }); - modelBuilder.Entity("Ombi.Store.Entities.RequestSubscription", b => - { - b.HasOne("Ombi.Store.Entities.OmbiUser", "User") - .WithMany() - .HasForeignKey("UserId"); - }); - modelBuilder.Entity("Ombi.Store.Entities.Tokens", b => { b.HasOne("Ombi.Store.Entities.OmbiUser", "User") diff --git a/src/Ombi.Store/Migrations/Settings/SettingsContextModelSnapshot.cs b/src/Ombi.Store/Migrations/Settings/SettingsContextModelSnapshot.cs index 2f072d3dd..fe063ef8b 100644 --- a/src/Ombi.Store/Migrations/Settings/SettingsContextModelSnapshot.cs +++ b/src/Ombi.Store/Migrations/Settings/SettingsContextModelSnapshot.cs @@ -13,7 +13,7 @@ namespace Ombi.Store.Migrations.Settings { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "2.1.3-rtm-32065"); + .HasAnnotation("ProductVersion", "2.2.0-rtm-35687"); modelBuilder.Entity("Ombi.Store.Entities.ApplicationConfiguration", b => { diff --git a/src/Ombi.TheMovieDbApi/IMovieDbApi.cs b/src/Ombi.TheMovieDbApi/IMovieDbApi.cs index 0b24bd55c..6f73c5f68 100644 --- a/src/Ombi.TheMovieDbApi/IMovieDbApi.cs +++ b/src/Ombi.TheMovieDbApi/IMovieDbApi.cs @@ -8,10 +8,10 @@ namespace Ombi.Api.TheMovieDb public interface IMovieDbApi { Task GetMovieInformation(int movieId); - Task GetMovieInformationWithExtraInfo(int movieId); + Task GetMovieInformationWithExtraInfo(int movieId, string langCode = "en"); Task> NowPlaying(); Task> PopularMovies(); - Task> SearchMovie(string searchTerm); + Task> SearchMovie(string searchTerm, int? year, string languageCode); Task> SearchTv(string searchTerm); Task> TopRated(); Task> Upcoming(); diff --git a/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs b/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs index af9423f5d..a66193768 100644 --- a/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs +++ b/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs @@ -73,21 +73,27 @@ namespace Ombi.Api.TheMovieDb return Mapper.Map>(result.results); } - public async Task GetMovieInformationWithExtraInfo(int movieId) + public async Task GetMovieInformationWithExtraInfo(int movieId, string langCode = "en") { var request = new Request($"movie/{movieId}", BaseUri, HttpMethod.Get); request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken); request.FullUri = request.FullUri.AddQueryParameter("append_to_response", "videos,release_dates"); + request.FullUri = request.FullUri.AddQueryParameter("language", langCode); AddRetry(request); var result = await Api.Request(request); return Mapper.Map(result); } - public async Task> SearchMovie(string searchTerm) + public async Task> SearchMovie(string searchTerm, int? year, string langageCode) { var request = new Request($"search/movie", BaseUri, HttpMethod.Get); request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken); request.FullUri = request.FullUri.AddQueryParameter("query", searchTerm); + request.FullUri = request.FullUri.AddQueryParameter("language", langageCode); + if (year.HasValue && year.Value > 0) + { + request.FullUri = request.FullUri.AddQueryParameter("year", year.Value.ToString()); + } AddRetry(request); var result = await Api.Request>(request); diff --git a/src/Ombi.sln b/src/Ombi.sln index 1dfaa1dc6..2b9be2c42 100644 --- a/src/Ombi.sln +++ b/src/Ombi.sln @@ -94,7 +94,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ombi.Api.SickRage", "Ombi.A EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ombi.Api.Notifications", "Ombi.Api.Notifications\Ombi.Api.Notifications.csproj", "{10D1FE9D-9124-42B7-B1E1-CEB99B832618}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ombi.Api.Lidarr", "Ombi.Api.Lidarr\Ombi.Api.Lidarr.csproj", "{4FA21A20-92F4-462C-B929-2C517A88CC56}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ombi.Api.Lidarr", "Ombi.Api.Lidarr\Ombi.Api.Lidarr.csproj", "{4FA21A20-92F4-462C-B929-2C517A88CC56}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ombi.Helpers.Tests", "Ombi.Helpers.Tests\Ombi.Helpers.Tests.csproj", "{CC8CEFCD-0CB6-45BB-845F-508BCAB5BDC3}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -250,6 +252,10 @@ Global {4FA21A20-92F4-462C-B929-2C517A88CC56}.Debug|Any CPU.Build.0 = Debug|Any CPU {4FA21A20-92F4-462C-B929-2C517A88CC56}.Release|Any CPU.ActiveCfg = Release|Any CPU {4FA21A20-92F4-462C-B929-2C517A88CC56}.Release|Any CPU.Build.0 = Release|Any CPU + {CC8CEFCD-0CB6-45BB-845F-508BCAB5BDC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CC8CEFCD-0CB6-45BB-845F-508BCAB5BDC3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CC8CEFCD-0CB6-45BB-845F-508BCAB5BDC3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CC8CEFCD-0CB6-45BB-845F-508BCAB5BDC3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -286,6 +292,7 @@ Global {94C9A366-2595-45EA-AABB-8E4A2E90EC5B} = {9293CA11-360A-4C20-A674-B9E794431BF5} {10D1FE9D-9124-42B7-B1E1-CEB99B832618} = {9293CA11-360A-4C20-A674-B9E794431BF5} {4FA21A20-92F4-462C-B929-2C517A88CC56} = {9293CA11-360A-4C20-A674-B9E794431BF5} + {CC8CEFCD-0CB6-45BB-845F-508BCAB5BDC3} = {6F42AB98-9196-44C4-B888-D5E409F415A1} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {192E9BF8-00B4-45E4-BCCC-4C215725C869} diff --git a/src/Ombi/ClientApp/app/interfaces/ISearchMovieResult.ts b/src/Ombi/ClientApp/app/interfaces/ISearchMovieResult.ts index 3ea282351..045e3290d 100644 --- a/src/Ombi/ClientApp/app/interfaces/ISearchMovieResult.ts +++ b/src/Ombi/ClientApp/app/interfaces/ISearchMovieResult.ts @@ -34,6 +34,12 @@ background: any; } +export interface ILanguageRefine { + code: string; + name: string; + nativeName: string; +} + export interface ISearchMovieResultContainer { movies: ISearchMovieResult[]; } diff --git a/src/Ombi/ClientApp/app/requests/music/musicrequests.component.ts b/src/Ombi/ClientApp/app/requests/music/musicrequests.component.ts index 7cda9ab29..b10173042 100644 --- a/src/Ombi/ClientApp/app/requests/music/musicrequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/music/musicrequests.component.ts @@ -39,7 +39,7 @@ export class MusicRequestsComponent implements OnInit { public rejectionReason: string; public totalAlbums: number = 100; - private currentlyLoaded: number; + public currentlyLoaded: number; private amountToLoad: number; constructor( diff --git a/src/Ombi/ClientApp/app/search/moviesearch.component.html b/src/Ombi/ClientApp/app/search/moviesearch.component.html index 64ba43450..e2ba69cb6 100644 --- a/src/Ombi/ClientApp/app/search/moviesearch.component.html +++ b/src/Ombi/ClientApp/app/search/moviesearch.component.html @@ -1,11 +1,11 @@ 
-
+
-
+
  • +
    +
    + +
    +
    +
    + + + +
    +
    + + +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + @@ -111,11 +144,15 @@
    "); - if(url.HasValue()) sb.AppendFormat("", url); - sb.AppendFormat("

    {0}

    ", title); + sb.Append("
    "); + if(url.HasValue()) sb.AppendFormat("", url); + sb.AppendFormat("

    {0}

    ", title); if (url.HasValue()) sb.Append("
    "); sb.Append("
    "); - sb.AppendFormat("

    {0}

    ", text); + sb.Append("
    "); + sb.AppendFormat("

    {0}

    ", text); sb.Append("
    "); - sb.AppendFormat("

    {0}

    ", episodes); - sb.AppendFormat("
    {0}
    ", summary); + sb.Append("
    "); + sb.AppendFormat("

    {0}

    ", episodes); + sb.AppendFormat("
    {0}
    ", summary); sb.Append("
    "); - sb.AppendFormat("{0}", text); + sb.Append("
    "); + sb.AppendFormat("{0}", text); sb.Append("