diff --git a/CHANGELOG.md b/CHANGELOG.md index 115942b8b..979453ca0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,39 +1,3 @@ -## [4.49.3](https://github.com/Ombi-app/Ombi/compare/v4.49.2...v4.49.3) (2025-08-17) - - -### Bug Fixes - -* **plex-api:** update Plex Watchlist URL ([11fd7a5](https://github.com/Ombi-app/Ombi/commit/11fd7a5fc853da75974a16bf4fdecd72a836f54b)) - - - -## [4.49.2](https://github.com/Ombi-app/Ombi/compare/v4.49.1...v4.49.2) (2025-07-12) - - -### Performance Improvements - -* **discover:** :zap: Improve the loading performance on the discover page ([97d5167](https://github.com/Ombi-app/Ombi/commit/97d5167db6c9f915021f32b96b281d7db3741d7f)) - - - -## [4.49.1](https://github.com/Ombi-app/Ombi/compare/v4.49.0...v4.49.1) (2025-07-12) - - -### Bug Fixes - -* **auth:** Fixed an issue where refreshing the page as a power user would stop the application from loading [#5242](https://github.com/Ombi-app/Ombi/issues/5242) ([cee4014](https://github.com/Ombi-app/Ombi/commit/cee40146ee02f7fb79e2019d6fe2f9d5c5dbdfc8)) - - - -# [4.49.0](https://github.com/Ombi-app/Ombi/compare/v4.48.5...v4.49.0) (2025-07-11) - - -### Features - -* Added the ability for the Watchlist to automatically refresh the users token. This will reduce the need for the user to log in ([067c029](https://github.com/Ombi-app/Ombi/commit/067c029f42e9fd853d060fdb2093013b15ac14c0)) - - - ## [4.48.5](https://github.com/Ombi-app/Ombi/compare/v4.48.4...v4.48.5) (2025-05-14) @@ -2211,3 +2175,35 @@ +## [4.43.5](https://github.com/Ombi-app/Ombi/compare/v4.43.4...v4.43.5) (2023-08-24) + + + +## [4.43.4](https://github.com/Ombi-app/Ombi/compare/v4.43.3...v4.43.4) (2023-07-28) + + +### Bug Fixes + +* **user-importer:** Fixed not importing all correct users [#4989](https://github.com/Ombi-app/Ombi/issues/4989) ([34c32f8](https://github.com/Ombi-app/Ombi/commit/34c32f8338705ea3f790d95b91c9ada21a41b9f2)) + + + +## [4.43.3](https://github.com/Ombi-app/Ombi/compare/v4.43.2...v4.43.3) (2023-07-28) + + +### Bug Fixes + +* switch back to the old plex friends API [#4989](https://github.com/Ombi-app/Ombi/issues/4989) ([c8ad12e](https://github.com/Ombi-app/Ombi/commit/c8ad12eb5f53889609d1793ae907afd33ba6ef38)) + + + +## [4.43.2](https://github.com/Ombi-app/Ombi/compare/v4.43.1...v4.43.2) (2023-07-19) + + +### Bug Fixes + +* **plex-api:** Switch over to the new API to avoid deprecation & save… ([#4986](https://github.com/Ombi-app/Ombi/issues/4986)) ([2f2d35e](https://github.com/Ombi-app/Ombi/commit/2f2d35ec867a8e5488e368db294bd37bcf92d843)) +* Remove old trending source ([#4987](https://github.com/Ombi-app/Ombi/issues/4987)) ([aacaa3e](https://github.com/Ombi-app/Ombi/commit/aacaa3e140b43f5d196da612f785cc4451717752)) + + + diff --git a/README.md b/README.md index 8fb37b8f8..0e9350d59 100644 --- a/README.md +++ b/README.md @@ -122,10 +122,10 @@ Here are some of the features Ombi has: - - AmyJeanes + + MattJeanes
- Amy Jeanes + Matt Jeanes
diff --git a/src/Ombi.Api.Plex/IPlexApi.cs b/src/Ombi.Api.Plex/IPlexApi.cs index be6a61c16..6632da875 100644 --- a/src/Ombi.Api.Plex/IPlexApi.cs +++ b/src/Ombi.Api.Plex/IPlexApi.cs @@ -29,6 +29,5 @@ namespace Ombi.Api.Plex Task AddUser(string emailAddress, string serverId, string authToken, int[] libs); Task GetWatchlist(string plexToken, CancellationToken cancellationToken); Task GetWatchlistMetadata(string ratingKey, string plexToken, CancellationToken cancellationToken); - Task Ping(string authToken, CancellationToken cancellationToken = default); } } \ No newline at end of file diff --git a/src/Ombi.Api.Plex/PlexApi.cs b/src/Ombi.Api.Plex/PlexApi.cs index 8babba05d..cc0d13aaa 100644 --- a/src/Ombi.Api.Plex/PlexApi.cs +++ b/src/Ombi.Api.Plex/PlexApi.cs @@ -68,7 +68,7 @@ namespace Ombi.Api.Plex private const string FriendsUri = "https://plex.tv/api/users"; private const string GetAccountUri = "https://plex.tv/users/account.json"; private const string ServerUri = "https://plex.tv/pms/servers.xml"; - private const string WatchlistUri = "https://discover.provider.plex.tv/"; + private const string WatchlistUri = "https://metadata.provider.plex.tv/"; /// /// Sign into the Plex API @@ -320,30 +320,6 @@ namespace Ombi.Api.Plex return result; } - /// - /// Pings the Plex API to validate if a token is still valid - /// - /// The authentication token to validate - /// Cancellation token - /// True if the token is valid, false otherwise - public async Task Ping(string authToken, CancellationToken cancellationToken = default) - { - try - { - var request = new Request("api/v2/ping", "https://plex.tv/", HttpMethod.Get); - await AddHeaders(request, authToken); - - // We don't need to parse the response, just check if the request succeeds - await Api.Request(request, cancellationToken); - return true; - } - catch - { - // If the request fails (401, 403, etc.), the token is invalid - return false; - } - } - /// /// Adds the required headers and also the authorization header diff --git a/src/Ombi.Core/Authentication/PlexTokenKeepAliveService.cs b/src/Ombi.Core/Authentication/PlexTokenKeepAliveService.cs deleted file mode 100644 index d29da4a5a..000000000 --- a/src/Ombi.Core/Authentication/PlexTokenKeepAliveService.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using Ombi.Api.Plex; - -namespace Ombi.Core.Authentication -{ - public interface IPlexTokenKeepAliveService - { - Task KeepTokenAliveAsync(string token, CancellationToken cancellationToken); - } - - public class PlexTokenKeepAliveService : IPlexTokenKeepAliveService - { - private readonly IPlexApi _plexApi; - private readonly ILogger _logger; - - public PlexTokenKeepAliveService(IPlexApi plexApi, ILogger logger) - { - _plexApi = plexApi; - _logger = logger; - } - - public async Task KeepTokenAliveAsync(string token, CancellationToken cancellationToken) - { - try - { - if (string.IsNullOrEmpty(token)) - { - _logger.LogWarning("Token is null or empty"); - return false; - } - - // Use the Ping method to validate the token - var isValid = await _plexApi.Ping(token, cancellationToken); - - if (!isValid) - { - _logger.LogWarning("Token validation failed - token may be expired or invalid"); - } - - return isValid; - } - catch (Exception ex) - { - _logger.LogError(ex, "Error occurred while keeping token alive"); - return false; - } - } - } -} \ No newline at end of file diff --git a/src/Ombi.DependencyInjection/IocExtensions.cs b/src/Ombi.DependencyInjection/IocExtensions.cs index 027717bbe..caceb9b0e 100644 --- a/src/Ombi.DependencyInjection/IocExtensions.cs +++ b/src/Ombi.DependencyInjection/IocExtensions.cs @@ -107,7 +107,6 @@ namespace Ombi.DependencyInjection services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/src/Ombi.Schedule.Tests/PlexWatchlistImportTests.cs b/src/Ombi.Schedule.Tests/PlexWatchlistImportTests.cs index 87a1d5e28..b1fec6d1b 100644 --- a/src/Ombi.Schedule.Tests/PlexWatchlistImportTests.cs +++ b/src/Ombi.Schedule.Tests/PlexWatchlistImportTests.cs @@ -24,7 +24,6 @@ using Ombi.Notifications.Models; using Ombi.Core.Notifications; using Ombi.Helpers; using Ombi.Core; -using Ombi.Core.Authentication; namespace Ombi.Schedule.Tests { @@ -44,8 +43,6 @@ namespace Ombi.Schedule.Tests _mocker.Use(um); _context = _mocker.GetMock(); _context.Setup(x => x.CancellationToken).Returns(CancellationToken.None); - // Mock the keep-alive service to return true by default - _mocker.Use(Mock.Of(s => s.KeepTokenAliveAsync(It.IsAny(), It.IsAny()) == Task.FromResult(true))); _subject = _mocker.CreateInstance(); _mocker.Setup, IQueryable>(x => x.GetAll()).Returns(new List().AsQueryable().BuildMock()); _mocker.Setup(x => x.Notify(It.IsAny())); @@ -841,43 +838,5 @@ namespace Ombi.Schedule.Tests // Assert _mocker.Verify(x => x.Notify(It.IsAny()), Times.Never); } - - [Test] - public async Task SkipsUserIfTokenKeepAliveFails() - { - // Arrange: Set up the keep-alive service to return false (token invalid/expired) - var keepAliveMock = new Mock(); - keepAliveMock.Setup(x => x.KeepTokenAliveAsync(It.IsAny(), It.IsAny())).ReturnsAsync(false); - _mocker.Use(keepAliveMock.Object); - _subject = _mocker.CreateInstance(); - _mocker.Setup, Task>(x => x.GetSettingsAsync()).ReturnsAsync(new PlexSettings { Enable = true, EnableWatchlistImport = true }); - // Act - await _subject.Execute(_context.Object); - // Assert: Should not attempt to import watchlist if keep-alive fails - keepAliveMock.Verify(x => x.KeepTokenAliveAsync(It.IsAny(), It.IsAny()), Times.Once); - _mocker.Verify(x => x.GetWatchlist(It.IsAny(), It.IsAny()), Times.Never); - _mocker.Verify(x => x.Notify(It.IsAny()), Times.Never); // or Times.Once if notification is expected - } - [Test] - public async Task CallsKeepAliveForEachPlexUser() - { - // Arrange: Multiple Plex users - var users = new List - { - new OmbiUser { Id = "abc1", UserType = UserType.PlexUser, MediaServerToken = "abc1", UserName = "abc1", NormalizedUserName = "ABC1" }, - new OmbiUser { Id = "abc2", UserType = UserType.PlexUser, MediaServerToken = "abc2", UserName = "abc2", NormalizedUserName = "ABC2" }, - }; - var um = MockHelper.MockUserManager(users); - _mocker.Use(um); - var keepAliveMock = new Mock(); - keepAliveMock.Setup(x => x.KeepTokenAliveAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); - _mocker.Use(keepAliveMock.Object); - _subject = _mocker.CreateInstance(); - _mocker.Setup, Task>(x => x.GetSettingsAsync()).ReturnsAsync(new PlexSettings { Enable = true, EnableWatchlistImport = true }); - // Act - await _subject.Execute(_context.Object); - // Assert: KeepAlive should be called for each user - keepAliveMock.Verify(x => x.KeepTokenAliveAsync(It.IsAny(), It.IsAny()), Times.Exactly(users.Count)); - } } } diff --git a/src/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs b/src/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs index 3de332879..947e54406 100644 --- a/src/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs +++ b/src/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs @@ -43,12 +43,11 @@ namespace Ombi.Schedule.Jobs.Plex private readonly IRepository _userError; private readonly IMovieDbApi _movieDbApi; private readonly INotificationHelper _notificationHelper; - private readonly IPlexTokenKeepAliveService _tokenKeepAliveService; public PlexWatchlistImport(IPlexApi plexApi, ISettingsService settings, OmbiUserManager ombiUserManager, IMovieRequestEngine movieRequestEngine, ITvRequestEngine tvRequestEngine, INotificationHubService notificationHubService, ILogger logger, IExternalRepository watchlistRepo, IRepository userError, - IMovieDbApi movieDbApi, INotificationHelper notificationHelper, IPlexTokenKeepAliveService tokenKeepAliveService) + IMovieDbApi movieDbApi, INotificationHelper notificationHelper) { _plexApi = plexApi; _settings = settings; @@ -61,7 +60,6 @@ namespace Ombi.Schedule.Jobs.Plex _userError = userError; _movieDbApi = movieDbApi; _notificationHelper = notificationHelper; - _tokenKeepAliveService = tokenKeepAliveService; } public async Task Execute(IJobExecutionContext context) @@ -99,36 +97,6 @@ namespace Ombi.Schedule.Jobs.Plex } _logger.LogDebug($"Starting Watchlist Import for {user.UserName} with token {user.MediaServerToken}"); - - // Keep the token alive before attempting watchlist import - var keepAliveSuccess = await _tokenKeepAliveService.KeepTokenAliveAsync(user.MediaServerToken, context?.CancellationToken ?? CancellationToken.None); - if (!keepAliveSuccess) - { - _logger.LogWarning($"Token for user '{user.UserName}' is invalid or expired (keep-alive failed). Recording error and skipping."); - await _userError.Add(new PlexWatchlistUserError - { - UserId = user.Id, - MediaServerToken = user.MediaServerToken, - }); - - // Send notification to user about token expiration - if (settings.NotifyOnWatchlistTokenExpiration && !string.IsNullOrEmpty(user.Email)) - { - var notificationModel = new NotificationOptions - { - NotificationType = NotificationType.PlexWatchlistTokenExpired, - Recipient = user.Email, - DateTime = DateTime.Now, - Substitutes = new Dictionary - { - { "UserName", user.UserName } - } - }; - await _notificationHelper.Notify(notificationModel); - } - continue; - } - var watchlist = await _plexApi.GetWatchlist(user.MediaServerToken, context?.CancellationToken ?? CancellationToken.None); if (watchlist?.AuthError ?? false) { diff --git a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.html b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.html index f8dbaf257..a1b3bc81b 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.html +++ b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.html @@ -5,17 +5,13 @@ {{'Discovery.Tv' | translate}} -@defer (when discoverResults.length > 0; prefetch on idle) { +@defer (when discoverResults.length > 0) { } -@placeholder(minimum 300) { -
-
- -
-
+@placeholder(minimum 500) { + } \ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.scss b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.scss index 9b62c9256..81c559a83 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.scss +++ b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.scss @@ -105,30 +105,6 @@ padding: 5px; } -.loading-container { - display: flex; - gap: 10px; - padding: 0 20px; - margin-top: 20px; -} - -.loading-container .col-2 { - flex: 0 0 auto; - width: calc(10% - 9px); -} - -@media (max-width: 768px) { - .loading-container .col-2 { - width: calc(50% - 5px); - } -} - -@media (max-width: 480px) { - .loading-container .col-2 { - width: calc(100% - 0px); - } -} - @media (min-width:755px){ ::ng-deep .p-carousel-item{ flex: 1 0 200px !important; diff --git a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts index 2463af3c4..36b8122ff 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts +++ b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts @@ -43,7 +43,7 @@ export class CarouselListComponent implements OnInit { get mediaTypeStorageKey() { return "DiscoverOptions" + this.discoverType.toString(); }; - private amountToLoad = 10; + private amountToLoad = 17; private currentlyLoaded = 0; private baseUrl: string = ""; @@ -148,7 +148,6 @@ export class CarouselListComponent implements OnInit { } public async ngOnInit() { - this.is4kEnabled = this.featureFacade.is4kEnabled(); this.currentlyLoaded = 0; const localDiscoverOptions = +this.storageService.get(this.mediaTypeStorageKey); @@ -156,15 +155,11 @@ export class CarouselListComponent implements OnInit { this.discoverOptions = DiscoverOption[DiscoverOption[localDiscoverOptions]]; } - // Load initial data - just enough to fill the first carousel page - // This reduces initial API calls and improves loading performance - await this.loadData(false); - - // If we don't have enough results to fill the carousel, load one more batch - if (this.discoverResults.length < 10) { + let currentIteration = 0; + while (this.discoverResults.length <= 14 && currentIteration <= 3) { + currentIteration++; await this.loadData(false); } - } public async toggleChanged(event: MatButtonToggleChange) { diff --git a/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.html b/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.html index dc4e33be1..16a46c0d6 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.html +++ b/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.html @@ -1,108 +1,46 @@
- @defer (on viewport; prefetch on idle) { -
-

{{ 'Discovery.Genres' | translate }}

- +
+

{{ 'Discovery.Genres' | translate }}

+ +
+
+

{{ 'Discovery.RecentlyRequestedTab' | translate }}

+
+
- } @placeholder(minimum 300) { -
-

{{ 'Discovery.Genres' | translate }}

- -
- } +
- @defer (on viewport; prefetch on idle) { -
-

{{ 'Discovery.RecentlyRequestedTab' | translate }}

-
- -
-
- } @placeholder(minimum 300) { -
-

{{ 'Discovery.RecentlyRequestedTab' | translate }}

-
-
- -
-
-
- } - @defer (on viewport; prefetch on idle) { -
-

{{ 'Discovery.SeasonalTab' | translate }}

-
- -
+
+

{{ 'Discovery.SeasonalTab' | translate }}

+
+
- } @placeholder(minimum 300) { -
-

{{ 'Discovery.SeasonalTab' | translate }}

-
-
- -
-
-
- } +
- @defer (on viewport; prefetch on idle) { -
-

{{ 'Discovery.PopularTab' | translate }}

-
- -
+
+

{{ 'Discovery.PopularTab' | translate }}

+
+
- } @placeholder(minimum 300) { -
-

{{ 'Discovery.PopularTab' | translate }}

-
-
- -
-
-
- } +
- @defer (on viewport; prefetch on idle) { -
-

{{ 'Discovery.TrendingTab' | translate }}

-
- -
+
+

{{ 'Discovery.TrendingTab' | translate }}

+
+
- } @placeholder(minimum 300) { -
-

{{ 'Discovery.TrendingTab' | translate }}

-
-
- -
-
-
- } +
- @defer (on viewport; prefetch on idle) { -
-

{{ 'Discovery.UpcomingTab' | translate }}

-
- -
+
+

{{ 'Discovery.UpcomingTab' | translate }}

+
+
- } @placeholder(minimum 300) { -
-

{{ 'Discovery.UpcomingTab' | translate }}

-
-
- -
-
-
- } +
diff --git a/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.scss b/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.scss index 9ba892e01..d95586507 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.scss +++ b/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.scss @@ -9,28 +9,4 @@ h2{ margin-top:40px; margin-left:40px; font-size: 24px; -} - -.loading-container { - display: flex; - gap: 10px; - padding: 0 20px; - margin-top: 20px; -} - -.loading-container .col-2 { - flex: 0 0 auto; - width: calc(10% - 9px); -} - -@media (max-width: 768px) { - .loading-container .col-2 { - width: calc(50% - 5px); - } -} - -@media (max-width: 480px) { - .loading-container .col-2 { - width: calc(100% - 0px); - } } \ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/discover/components/recently-requested-list/recently-requested-list.component.html b/src/Ombi/ClientApp/src/app/discover/components/recently-requested-list/recently-requested-list.component.html index a6db36865..6da28c744 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/recently-requested-list/recently-requested-list.component.html +++ b/src/Ombi/ClientApp/src/app/discover/components/recently-requested-list/recently-requested-list.component.html @@ -1,4 +1,4 @@ -@defer (when requests(); prefetch on idle) { +@defer (when requests()) {
@@ -13,9 +13,21 @@
-}@placeholder(minimum 300) { +}@placeholder(minimum 500) {
-
+
+ +
+
+ +
+
+ +
+
+ +
+
diff --git a/src/Ombi/ClientApp/src/app/discover/components/recently-requested-list/recently-requested-list.component.scss b/src/Ombi/ClientApp/src/app/discover/components/recently-requested-list/recently-requested-list.component.scss index c7fef78f9..01c68db4d 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/recently-requested-list/recently-requested-list.component.scss +++ b/src/Ombi/ClientApp/src/app/discover/components/recently-requested-list/recently-requested-list.component.scss @@ -105,32 +105,12 @@ padding: 5px; } -.loading-container { - display: flex; - gap: 10px; - padding: 0 20px; - margin-top: 20px; -} - -.loading-container .col-2 { - flex: 0 0 auto; - width: calc(20% - 8px); -} - -@media (max-width: 768px) { - .loading-container .col-2 { - width: calc(50% - 5px); - } -} - -@media (max-width: 480px) { - .loading-container .col-2 { - width: calc(100% - 0px); - } -} - @media (min-width:755px){ ::ng-deep .p-carousel-item{ flex: 1 0 200px !important; } +} + +.loading-container { + margin-left: 10rem; } \ No newline at end of file diff --git a/src/Ombi/Controllers/V1/SettingsController.cs b/src/Ombi/Controllers/V1/SettingsController.cs index a23d56124..ad714780b 100644 --- a/src/Ombi/Controllers/V1/SettingsController.cs +++ b/src/Ombi/Controllers/V1/SettingsController.cs @@ -40,6 +40,7 @@ namespace Ombi.Controllers.V1 /// /// The Settings Controller /// + [Admin] [ApiV1] [Produces("application/json")] [ApiController] @@ -77,7 +78,6 @@ namespace Ombi.Controllers.V1 /// Gets the Ombi settings. ///
/// - [Admin] [HttpGet("ombi")] public async Task OmbiSettings() { @@ -110,7 +110,6 @@ namespace Ombi.Controllers.V1 ///
/// The ombi. /// - [Admin] [HttpPost("ombi")] public async Task OmbiSettings([FromBody]OmbiSettings ombi) { @@ -146,7 +145,6 @@ namespace Ombi.Controllers.V1 return model; } - [Admin] [HttpPost("ombi/resetApi")] public async Task ResetApiKey() { @@ -161,7 +159,6 @@ namespace Ombi.Controllers.V1 /// Gets the Plex Settings. /// /// - [Admin] [HttpGet("plex")] public async Task PlexSettings() { @@ -188,7 +185,6 @@ namespace Ombi.Controllers.V1 /// /// The plex. /// - [Admin] [HttpPost("plex")] public async Task PlexSettings([FromBody]PlexSettings plex) { @@ -211,7 +207,6 @@ namespace Ombi.Controllers.V1 /// Gets the Emby Settings. /// /// - [Admin] [HttpGet("emby")] public async Task EmbySettings() { @@ -223,7 +218,6 @@ namespace Ombi.Controllers.V1 /// /// The emby. /// - [Admin] [HttpPost("emby")] public async Task EmbySettings([FromBody]EmbySettings emby) { @@ -249,7 +243,6 @@ namespace Ombi.Controllers.V1 /// Gets the Jellyfin Settings. /// /// - [Admin] [HttpGet("jellyfin")] public async Task JellyfinSettings() { @@ -261,7 +254,6 @@ namespace Ombi.Controllers.V1 /// /// The jellyfin. /// - [Admin] [HttpPost("jellyfin")] public async Task JellyfinSettings([FromBody]JellyfinSettings jellyfin) { @@ -299,7 +291,6 @@ namespace Ombi.Controllers.V1 /// /// The settings. /// - [Admin] [HttpPost("landingpage")] public async Task LandingPageSettings([FromBody]LandingPageSettings settings) { @@ -335,7 +326,6 @@ namespace Ombi.Controllers.V1 /// /// The settings. /// - [Admin] [HttpPost("customization")] public async Task CustomizationSettings([FromBody]CustomizationSettings settings) { @@ -354,7 +344,6 @@ namespace Ombi.Controllers.V1 /// Get's the preset themes available /// /// - [Admin] [HttpGet("themes")] public async Task> GetThemes() { @@ -400,7 +389,6 @@ namespace Ombi.Controllers.V1 /// The settings. /// [HttpPost("sonarr")] - [Admin] public async Task SonarrSettings([FromBody]SonarrSettings settings) { var result = await Save(settings); @@ -430,7 +418,6 @@ namespace Ombi.Controllers.V1 /// Gets the Lidarr Settings. /// /// - [Admin] [HttpGet("lidarr")] public async Task LidarrSettings() { @@ -454,7 +441,6 @@ namespace Ombi.Controllers.V1 /// /// The settings. /// - [Admin] [HttpPost("lidarr")] public async Task LidarrSettings([FromBody]LidarrSettings settings) { @@ -471,7 +457,6 @@ namespace Ombi.Controllers.V1 /// /// The settings. /// - [Admin] [HttpPost("authentication")] public async Task AuthenticationsSettings([FromBody]AuthenticationSettings settings) { @@ -494,7 +479,6 @@ namespace Ombi.Controllers.V1 /// /// The settings. /// - [Admin] [HttpPost("radarr")] public async Task RadarrSettings([FromBody]RadarrCombinedModel settings) { @@ -516,7 +500,6 @@ namespace Ombi.Controllers.V1 /// /// The settings. /// - [Admin] [HttpPost("Update")] public async Task UpdateSettings([FromBody]UpdateSettings settings) { @@ -527,7 +510,6 @@ namespace Ombi.Controllers.V1 /// Gets the UserManagement Settings. /// /// - [Admin] [HttpGet("UserManagement")] public async Task UserManagementSettings() { @@ -539,7 +521,6 @@ namespace Ombi.Controllers.V1 /// /// The settings. /// - [Admin] [HttpPost("UserManagement")] public async Task UserManagementSettings([FromBody]UserManagementSettings settings) { @@ -550,7 +531,6 @@ namespace Ombi.Controllers.V1 /// Gets the Update Settings. /// /// - [Admin] [HttpGet("Update")] public async Task UpdateSettings() { @@ -563,7 +543,6 @@ namespace Ombi.Controllers.V1 /// Gets the CouchPotatoSettings Settings. /// /// - [Admin] [HttpGet("CouchPotato")] public async Task CouchPotatoSettings() { @@ -575,7 +554,6 @@ namespace Ombi.Controllers.V1 /// /// The settings. /// - [Admin] [HttpPost("CouchPotato")] public async Task CouchPotatoSettings([FromBody]CouchPotatoSettings settings) { @@ -586,7 +564,6 @@ namespace Ombi.Controllers.V1 /// Gets the DogNzbSettings Settings. /// /// - [Admin] [HttpGet("DogNzb")] public async Task DogNzbSettings() { @@ -598,7 +575,6 @@ namespace Ombi.Controllers.V1 /// /// The settings. /// - [Admin] [HttpPost("DogNzb")] public async Task DogNzbSettings([FromBody]DogNzbSettings settings) { @@ -610,7 +586,6 @@ namespace Ombi.Controllers.V1 /// /// The settings. /// - [Admin] [HttpPost("SickRage")] public async Task SickRageSettings([FromBody]SickRageSettings settings) { @@ -621,7 +596,6 @@ namespace Ombi.Controllers.V1 /// Gets the SickRage Settings. /// /// - [Admin] [HttpGet("SickRage")] public async Task SickRageSettings() { @@ -632,7 +606,6 @@ namespace Ombi.Controllers.V1 /// Gets the JobSettings Settings. /// /// - [Admin] [HttpGet("jobs")] public async Task JobSettings() { @@ -665,7 +638,6 @@ namespace Ombi.Controllers.V1 /// /// The settings. /// - [Admin] [HttpPost("jobs")] public async Task JobSettings([FromBody]JobSettings settings) { @@ -709,7 +681,6 @@ namespace Ombi.Controllers.V1 } [HttpPost("testcron")] - [Admin] public CronTestModel TestCron([FromBody] CronViewModelBody body) { var model = new CronTestModel(); @@ -743,7 +714,6 @@ namespace Ombi.Controllers.V1 /// The settings. /// [HttpPost("Issues")] - [Admin] public async Task IssueSettings([FromBody]IssueSettings settings) { return await Save(settings); @@ -774,7 +744,6 @@ namespace Ombi.Controllers.V1 /// The settings. /// [HttpPost("vote")] - [Admin] public async Task VoteSettings([FromBody]VoteSettings settings) { return await Save(settings); @@ -785,7 +754,6 @@ namespace Ombi.Controllers.V1 /// /// [HttpGet("vote")] - [Admin] public async Task VoteSettings() { return await Get(); @@ -804,7 +772,6 @@ namespace Ombi.Controllers.V1 /// /// The settings. [HttpPost("themoviedb")] - [Admin] public async Task TheMovieDbSettings([FromBody]TheMovieDbSettings settings) { return await Save(settings); @@ -813,7 +780,6 @@ namespace Ombi.Controllers.V1 /// /// Get The Movie DB settings. /// - [Admin] [HttpGet("themoviedb")] public async Task TheMovieDbSettings() { @@ -825,7 +791,6 @@ namespace Ombi.Controllers.V1 /// /// The model. /// - [Admin] [HttpPost("notifications/email")] public async Task EmailNotificationSettings([FromBody] EmailNotificationsViewModel model) { @@ -843,7 +808,6 @@ namespace Ombi.Controllers.V1 /// Gets the Email Notification Settings. /// /// - [Admin] [HttpGet("notifications/email")] public async Task EmailNotificationSettings() { @@ -874,7 +838,6 @@ namespace Ombi.Controllers.V1 /// /// The model. /// - [Admin] [HttpPost("notifications/discord")] public async Task DiscordNotificationSettings([FromBody] DiscordNotificationsViewModel model) { @@ -892,7 +855,6 @@ namespace Ombi.Controllers.V1 /// Gets the discord Notification Settings. /// /// - [Admin] [HttpGet("notifications/discord")] public async Task DiscordNotificationSettings() { @@ -911,7 +873,6 @@ namespace Ombi.Controllers.V1 /// /// The model. /// - [Admin] [HttpPost("notifications/telegram")] public async Task TelegramNotificationSettings([FromBody] TelegramNotificationsViewModel model) { @@ -929,7 +890,6 @@ namespace Ombi.Controllers.V1 /// Gets the telegram Notification Settings. /// /// - [Admin] [HttpGet("notifications/telegram")] public async Task TelegramNotificationSettings() { @@ -947,7 +907,6 @@ namespace Ombi.Controllers.V1 /// /// The model. /// - [Admin] [HttpPost("notifications/pushbullet")] public async Task PushbulletNotificationSettings([FromBody] PushbulletNotificationViewModel model) { @@ -965,7 +924,6 @@ namespace Ombi.Controllers.V1 /// Gets the pushbullet Notification Settings. /// /// - [Admin] [HttpGet("notifications/pushbullet")] public async Task PushbulletNotificationSettings() { @@ -983,7 +941,6 @@ namespace Ombi.Controllers.V1 /// /// The model. /// - [Admin] [HttpPost("notifications/pushover")] public async Task PushoverNotificationSettings([FromBody] PushoverNotificationViewModel model) { @@ -1001,7 +958,6 @@ namespace Ombi.Controllers.V1 /// Gets the pushover Notification Settings. /// /// - [Admin] [HttpGet("notifications/pushover")] public async Task PushoverNotificationSettings() { @@ -1020,7 +976,6 @@ namespace Ombi.Controllers.V1 /// /// The model. /// - [Admin] [HttpPost("notifications/slack")] public async Task SlacktNotificationSettings([FromBody] SlackNotificationsViewModel model) { @@ -1038,7 +993,6 @@ namespace Ombi.Controllers.V1 /// Gets the slack Notification Settings. /// /// - [Admin] [HttpGet("notifications/slack")] public async Task SlackNotificationSettings() { @@ -1056,7 +1010,6 @@ namespace Ombi.Controllers.V1 /// /// The model. /// - [Admin] [HttpPost("notifications/mattermost")] public async Task MattermostNotificationSettings([FromBody] MattermostNotificationsViewModel model) { @@ -1074,7 +1027,6 @@ namespace Ombi.Controllers.V1 /// Gets the Mattermost Notification Settings. /// /// - [Admin] [HttpGet("notifications/mattermost")] public async Task MattermostNotificationSettings() { @@ -1091,7 +1043,6 @@ namespace Ombi.Controllers.V1 /// Gets the Twilio Notification Settings. /// /// - [Admin] [HttpGet("notifications/twilio")] public async Task TwilioNotificationSettings() { @@ -1113,7 +1064,6 @@ namespace Ombi.Controllers.V1 /// /// The model. /// - [Admin] [HttpPost("notifications/twilio")] public async Task TwilioNotificationSettings([FromBody] TwilioSettingsViewModel model) { @@ -1132,7 +1082,6 @@ namespace Ombi.Controllers.V1 /// /// The model. /// - [Admin] [HttpPost("notifications/mobile")] public async Task MobileNotificationSettings([FromBody] MobileNotificationsViewModel model) { @@ -1150,7 +1099,6 @@ namespace Ombi.Controllers.V1 /// Gets the Mobile Notification Settings. /// /// - [Admin] [HttpGet("notifications/mobile")] public async Task MobileNotificationSettings() { @@ -1168,7 +1116,6 @@ namespace Ombi.Controllers.V1 /// /// The model. /// - [Admin] [HttpPost("notifications/gotify")] public async Task GotifyNotificationSettings([FromBody] GotifyNotificationViewModel model) { @@ -1186,7 +1133,6 @@ namespace Ombi.Controllers.V1 /// Gets the gotify Notification Settings. /// /// - [Admin] [HttpGet("notifications/gotify")] public async Task GotifyNotificationSettings() { @@ -1204,7 +1150,6 @@ namespace Ombi.Controllers.V1 /// /// The model. /// - [Admin] [HttpPost("notifications/webhook")] public async Task WebhookNotificationSettings([FromBody] WebhookNotificationViewModel model) { @@ -1218,7 +1163,6 @@ namespace Ombi.Controllers.V1 /// Gets the webhook notification settings. /// /// - [Admin] [HttpGet("notifications/webhook")] public async Task WebhookNotificationSettings() { @@ -1233,7 +1177,6 @@ namespace Ombi.Controllers.V1 /// /// The model. /// - [Admin] [HttpPost("notifications/newsletter")] public async Task NewsletterSettings([FromBody] NewsletterNotificationViewModel model) { @@ -1248,7 +1191,6 @@ namespace Ombi.Controllers.V1 } [ApiExplorerSettings(IgnoreApi = true)] - [Admin] [HttpPost("notifications/newsletterdatabase")] public async Task UpdateNewsletterDatabase() { @@ -1259,7 +1201,6 @@ namespace Ombi.Controllers.V1 /// Gets the Newsletter Notification Settings. /// /// - [Admin] [HttpGet("notifications/newsletter")] public async Task NewsletterSettings() { diff --git a/version.json b/version.json index dc01ed894..ead760bcd 100644 --- a/version.json +++ b/version.json @@ -1,3 +1,3 @@ { - "version": "4.49.3" + "version": "4.48.5" }