diff --git a/Ombi.Core/SettingModels/ScheduledJobsSettings.cs b/Ombi.Core/SettingModels/ScheduledJobsSettings.cs index f018cdb73..b6f7e68d7 100644 --- a/Ombi.Core/SettingModels/ScheduledJobsSettings.cs +++ b/Ombi.Core/SettingModels/ScheduledJobsSettings.cs @@ -51,5 +51,6 @@ namespace Ombi.Core.SettingModels public int EmbyEpisodeCacher { get; set; } public int EmbyContentCacher { get; set; } public int EmbyAvailabilityChecker { get; set; } + public int EmbyUserChecker { get; set; } } } \ No newline at end of file diff --git a/Ombi.Services/Jobs/EmbyUserChecker.cs b/Ombi.Services/Jobs/EmbyUserChecker.cs new file mode 100644 index 000000000..a33fb19f8 --- /dev/null +++ b/Ombi.Services/Jobs/EmbyUserChecker.cs @@ -0,0 +1,138 @@ +#region Copyright + +// /************************************************************************ +// Copyright (c) 2016 Jamie Rees +// File: StoreCleanup.cs +// Created By: Jamie Rees +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// ************************************************************************/ + +#endregion + +using System; +using System.Linq; +using NLog; +using Ombi.Api.Interfaces; +using Ombi.Core; +using Ombi.Core.SettingModels; +using Ombi.Core.Users; +using Ombi.Helpers.Permissions; +using Ombi.Services.Interfaces; +using Ombi.Store.Models.Emby; +using Ombi.Store.Repository; +using Quartz; + +namespace Ombi.Services.Jobs +{ + public class EmbyUserChecker : IJob, IEmbyUserChecker + { + private static readonly Logger Log = LogManager.GetCurrentClassLogger(); + + public EmbyUserChecker(IExternalUserRepository plexUsers, IEmbyApi embyApi, IJobRecord rec, ISettingsService embyS, ISettingsService prSettings, ISettingsService umSettings, + IRequestService requestService, IUserRepository localUser) + { + Repo = plexUsers; + JobRecord = rec; + EmbyApi = embyApi; + EmbySettings = embyS; + PlexRequestSettings = prSettings; + UserManagementSettings = umSettings; + RequestService = requestService; + LocalUserRepository = localUser; + } + + private IJobRecord JobRecord { get; } + private IEmbyApi EmbyApi { get; } + private IExternalUserRepository Repo { get; } + private ISettingsService EmbySettings { get; } + private ISettingsService PlexRequestSettings { get; } + private ISettingsService UserManagementSettings { get; } + private IRequestService RequestService { get; } + private IUserRepository LocalUserRepository { get; } + + public void Start() + { + JobRecord.SetRunning(true, JobNames.EmbyUserChecker); + + try + { + var settings = EmbySettings.GetSettings(); + if (string.IsNullOrEmpty(settings.ApiKey) || !settings.Enable) + { + return; + } + var embyUsers = EmbyApi.GetUsers(settings.FullUri, settings.ApiKey); + var userManagementSettings = UserManagementSettings.GetSettings(); + var requests = RequestService.GetAll().ToList(); + + var dbUsers = Repo.GetAll().ToList(); + var localUsers = LocalUserRepository.GetAll().ToList(); + + // Regular users + foreach (var user in embyUsers) + { + var dbUser = dbUsers.FirstOrDefault(x => x.EmbyUserId == user.Id); + if (dbUser != null) + { + // we already have a user + continue; + } + + // Looks like it's a new user! + var m = new EmbyUsers + { + EmbyUserId = user.Id, + Permissions = UserManagementHelper.GetPermissions(userManagementSettings), + Features = UserManagementHelper.GetFeatures(userManagementSettings), + UserAlias = string.Empty, + Username = user.Name, + LoginId = Guid.NewGuid().ToString() + }; + + + // If it's the admin, give them the admin permission + if (user.Policy.IsAdministrator) + { + if (!((Permissions) m.Permissions).HasFlag(Permissions.Administrator)) + { + m.Permissions += (int)Permissions.Administrator; + } + } + + Repo.Insert(m); + } + } + catch (Exception e) + { + Log.Error(e); + } + finally + { + JobRecord.SetRunning(false, JobNames.EmbyUserChecker); + JobRecord.Record(JobNames.EmbyUserChecker); + } + } + public void Execute(IJobExecutionContext context) + { + Start(); + } + } +} \ No newline at end of file diff --git a/Ombi.Services/Jobs/IEmbyUserChecker.cs b/Ombi.Services/Jobs/IEmbyUserChecker.cs new file mode 100644 index 000000000..6f1fe353c --- /dev/null +++ b/Ombi.Services/Jobs/IEmbyUserChecker.cs @@ -0,0 +1,10 @@ +using Quartz; + +namespace Ombi.Services.Jobs +{ + public interface IEmbyUserChecker + { + void Execute(IJobExecutionContext context); + void Start(); + } +} \ No newline at end of file diff --git a/Ombi.Services/Jobs/JobNames.cs b/Ombi.Services/Jobs/JobNames.cs index 006af8761..0283d7ed8 100644 --- a/Ombi.Services/Jobs/JobNames.cs +++ b/Ombi.Services/Jobs/JobNames.cs @@ -45,6 +45,7 @@ namespace Ombi.Services.Jobs public const string RecentlyAddedEmail = "Recently Added Email Notification"; public const string FaultQueueHandler = "Request Fault Queue Handler"; public const string PlexUserChecker = "Plex User Checker"; + public const string EmbyUserChecker = "Emby User Checker"; } } \ No newline at end of file diff --git a/Ombi.Services/Ombi.Services.csproj b/Ombi.Services/Ombi.Services.csproj index 0405622c0..1735094dd 100644 --- a/Ombi.Services/Ombi.Services.csproj +++ b/Ombi.Services/Ombi.Services.csproj @@ -95,6 +95,7 @@ + @@ -104,6 +105,7 @@ + diff --git a/Ombi.Store/Models/Emby/EmbyUsers.cs b/Ombi.Store/Models/Emby/EmbyUsers.cs index 386dad9a6..0f90dd025 100644 --- a/Ombi.Store/Models/Emby/EmbyUsers.cs +++ b/Ombi.Store/Models/Emby/EmbyUsers.cs @@ -32,7 +32,7 @@ namespace Ombi.Store.Models.Emby [Table(nameof(EmbyUsers))] public class EmbyUsers : Entity { - public string PlexUserId { get; set; } + public string EmbyUserId { get; set; } public string UserAlias { get; set; } public int Permissions { get; set; } public int Features { get; set; } diff --git a/Ombi.Store/Repository/BaseExternalUserRepository.cs b/Ombi.Store/Repository/BaseExternalUserRepository.cs index 979bc6253..3df071f78 100644 --- a/Ombi.Store/Repository/BaseExternalUserRepository.cs +++ b/Ombi.Store/Repository/BaseExternalUserRepository.cs @@ -33,7 +33,7 @@ using Ombi.Helpers; namespace Ombi.Store.Repository { - public class BaseExternalUserRepository : BaseGenericRepository, IExternalUserRepository where T : class + public class BaseExternalUserRepository : BaseGenericRepository, IExternalUserRepository where T : Entity { public BaseExternalUserRepository(ISqliteConfiguration config, ICacheProvider cache) : base(config,cache) { diff --git a/Ombi.Store/Repository/IExternalUserRepository.cs b/Ombi.Store/Repository/IExternalUserRepository.cs index 25583a97a..7d0587edc 100644 --- a/Ombi.Store/Repository/IExternalUserRepository.cs +++ b/Ombi.Store/Repository/IExternalUserRepository.cs @@ -5,7 +5,7 @@ using System.Threading.Tasks; namespace Ombi.Store.Repository { - public interface IExternalUserRepository where T : class + public interface IExternalUserRepository where T : Entity { T Get(string id); T Get(int id); diff --git a/Ombi.Store/SqlTables.sql b/Ombi.Store/SqlTables.sql index 01ad1e8f9..f548381a8 100644 --- a/Ombi.Store/SqlTables.sql +++ b/Ombi.Store/SqlTables.sql @@ -128,7 +128,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS PlexUsers_Id ON PlexUsers (Id); CREATE TABLE IF NOT EXISTS EmbyUsers ( Id INTEGER PRIMARY KEY AUTOINCREMENT, - PlexUserId varchar(100) NOT NULL, + EmbyUserId varchar(100) NOT NULL, UserAlias varchar(100) NOT NULL, Permissions INTEGER, Features INTEGER, diff --git a/Ombi.UI/Content/app/userManagement/Directives/sidebar.html b/Ombi.UI/Content/app/userManagement/Directives/sidebar.html index ed7546840..571ed2f59 100644 --- a/Ombi.UI/Content/app/userManagement/Directives/sidebar.html +++ b/Ombi.UI/Content/app/userManagement/Directives/sidebar.html @@ -12,7 +12,10 @@ Email Address:
- User Type: + User Type: + Local User + Emby User + Plex User


diff --git a/Ombi.UI/Content/app/userManagement/Directives/table.html b/Ombi.UI/Content/app/userManagement/Directives/table.html index 587acc988..8c7b381e5 100644 --- a/Ombi.UI/Content/app/userManagement/Directives/table.html +++ b/Ombi.UI/Content/app/userManagement/Directives/table.html @@ -75,7 +75,9 @@ {{u.permissionsFormattedString}} - {{u.type === 1 ? 'Local User' : 'Plex User'}} + Local User + Plex User + Emby User diff --git a/Ombi.UI/Content/app/userManagement/userManagementController.js b/Ombi.UI/Content/app/userManagement/userManagementController.js index 56f68005e..19eb70f42 100644 --- a/Ombi.UI/Content/app/userManagement/userManagementController.js +++ b/Ombi.UI/Content/app/userManagement/userManagementController.js @@ -20,7 +20,7 @@ $scope.searchTerm = ""; $scope.hideColumns = false; - + var ReadOnlyPermission = "Read Only User"; var open = false; diff --git a/Ombi.UI/Content/wizard.js b/Ombi.UI/Content/wizard.js index 2151a44e2..8bb81b171 100644 --- a/Ombi.UI/Content/wizard.js +++ b/Ombi.UI/Content/wizard.js @@ -25,12 +25,15 @@ $('#contentBody').on('click', '#embyApiKeySave', function (e) { e.preventDefault(); + $('#spinner').attr("class", "fa fa-spinner fa-spin"); var $form = $("#embyAuthForm"); $.post($form.prop("action"), $form.serialize(), function (response) { if (response.result === true) { loadArea("authArea"); } else { + + $('#spinner').attr("class", "fa fa-times"); generateNotify(response.message, "warning"); } }); diff --git a/Ombi.UI/Jobs/Scheduler.cs b/Ombi.UI/Jobs/Scheduler.cs index 2573e756d..dd4fb034f 100644 --- a/Ombi.UI/Jobs/Scheduler.cs +++ b/Ombi.UI/Jobs/Scheduler.cs @@ -78,6 +78,7 @@ namespace Ombi.UI.Jobs JobBuilder.Create().WithIdentity("EmbyEpisodeCacher", "Emby").Build(), JobBuilder.Create().WithIdentity("EmbyAvailabilityChecker", "Emby").Build(), JobBuilder.Create().WithIdentity("EmbyContentCacher", "Emby").Build(), + JobBuilder.Create().WithIdentity("EmbyUserChecker", "Emby").Build(), }; jobs.AddRange(jobList); @@ -189,6 +190,10 @@ namespace Ombi.UI.Jobs { s.EmbyEpisodeCacher = 11; } + if (s.EmbyUserChecker == 0) + { + s.EmbyUserChecker = 24; + } var triggers = new List(); @@ -310,12 +315,20 @@ namespace Ombi.UI.Jobs .StartNow() .WithSimpleSchedule(x => x.WithIntervalInHours(s.EmbyContentCacher).RepeatForever()) .Build(); - - var embyAvailabilityChecker = + + var embyAvailabilityChecker = + TriggerBuilder.Create() + .WithIdentity("EmbyAvailabilityChecker", "Emby") + .StartAt(DateBuilder.FutureDate(5, IntervalUnit.Minute)) + .WithSimpleSchedule(x => x.WithIntervalInHours(s.EmbyAvailabilityChecker).RepeatForever()) + .Build(); + + var embyUserChecker = TriggerBuilder.Create() - .WithIdentity("EmbyAvailabilityChecker", "Emby") - .StartAt(DateBuilder.FutureDate(5, IntervalUnit.Minute)) - .WithSimpleSchedule(x => x.WithIntervalInHours(s.EmbyAvailabilityChecker).RepeatForever()) + .WithIdentity("EmbyUserChecker", "Emby") + .StartNow() + //.StartAt(DateBuilder.FutureDate(1, IntervalUnit.Minute)) + .WithSimpleSchedule(x => x.WithIntervalInHours(s.EmbyUserChecker).RepeatForever()) .Build(); triggers.Add(rencentlyAdded); @@ -335,6 +348,7 @@ namespace Ombi.UI.Jobs triggers.Add(embyEpisode); triggers.Add(embyAvailabilityChecker); triggers.Add(embyContentCacher); + triggers.Add(embyUserChecker); return triggers; } diff --git a/Ombi.UI/Models/ScheduledJobsViewModel.cs b/Ombi.UI/Models/ScheduledJobsViewModel.cs index df1a6ef2f..62b186216 100644 --- a/Ombi.UI/Models/ScheduledJobsViewModel.cs +++ b/Ombi.UI/Models/ScheduledJobsViewModel.cs @@ -33,6 +33,8 @@ namespace Ombi.UI.Models { public class ScheduledJobsViewModel : ScheduledJobsSettings { + public bool Emby { get; set; } + public bool Plex { get; set; } public Dictionary JobRecorder { get; set; } } } \ No newline at end of file diff --git a/Ombi.UI/Modules/Admin/AdminModule.cs b/Ombi.UI/Modules/Admin/AdminModule.cs index 94184521e..a83ff8bd1 100644 --- a/Ombi.UI/Modules/Admin/AdminModule.cs +++ b/Ombi.UI/Modules/Admin/AdminModule.cs @@ -1130,6 +1130,8 @@ namespace Ombi.UI.Modules.Admin { var s = await ScheduledJobSettings.GetSettingsAsync(); var allJobs = await JobRecorder.GetJobsAsync(); + var emby = await EmbySettings.GetSettingsAsync(); + var plex = await PlexService.GetSettingsAsync(); var dict = new Dictionary(); @@ -1150,6 +1152,8 @@ namespace Ombi.UI.Modules.Admin var model = new ScheduledJobsViewModel { + Emby = emby.Enable, + Plex = plex.Enable, CouchPotatoCacher = s.CouchPotatoCacher, PlexAvailabilityChecker = s.PlexAvailabilityChecker, SickRageCacher = s.SickRageCacher, diff --git a/Ombi.UI/Modules/Admin/ScheduledJobsRunnerModule.cs b/Ombi.UI/Modules/Admin/ScheduledJobsRunnerModule.cs index 52a16b01d..a08bd056d 100644 --- a/Ombi.UI/Modules/Admin/ScheduledJobsRunnerModule.cs +++ b/Ombi.UI/Modules/Admin/ScheduledJobsRunnerModule.cs @@ -46,7 +46,7 @@ namespace Ombi.UI.Modules.Admin IRadarrCacher radarrCacher, ICouchPotatoCacher cpCacher, IStoreBackup store, ISickRageCacher srCacher, IAvailabilityChecker plexChceker, IStoreCleanup cleanup, IUserRequestLimitResetter requestLimit, IPlexEpisodeCacher episodeCacher, IRecentlyAdded recentlyAdded, IFaultQueueHandler faultQueueHandler, IPlexUserChecker plexUserChecker, IEmbyAvailabilityChecker embyAvailabilityChecker, IEmbyEpisodeCacher embyEpisode, - IEmbyContentCacher embyContentCacher) : base("admin", settingsService, security) + IEmbyContentCacher embyContentCacher, IEmbyUserChecker embyUser) : base("admin", settingsService, security) { Before += (ctx) => Security.AdminLoginRedirect(Permissions.Administrator, ctx); @@ -67,6 +67,7 @@ namespace Ombi.UI.Modules.Admin EmbyAvailabilityChecker = embyAvailabilityChecker; EmbyContentCacher = embyContentCacher; EmbyEpisodeCacher = embyEpisode; + EmbyUserChecker = embyUser; Post["/schedulerun", true] = async (x, ct) => await ScheduleRun((string)Request.Form.key); } @@ -88,6 +89,7 @@ namespace Ombi.UI.Modules.Admin private IEmbyAvailabilityChecker EmbyAvailabilityChecker { get; } private IEmbyContentCacher EmbyContentCacher { get; } private IEmbyEpisodeCacher EmbyEpisodeCacher { get; } + private IEmbyUserChecker EmbyUserChecker { get; } private async Task ScheduleRun(string key) @@ -162,6 +164,10 @@ namespace Ombi.UI.Modules.Admin { EmbyAvailabilityChecker.CheckAndUpdateAll(); } + if (key.Equals(JobNames.EmbyUserChecker, StringComparison.CurrentCultureIgnoreCase)) + { + EmbyUserChecker.Start(); + } return Response.AsJson(new JsonResponseModel { Result = true }); diff --git a/Ombi.UI/Modules/UserManagementModule.cs b/Ombi.UI/Modules/UserManagementModule.cs index 6e559d419..d7ea20364 100644 --- a/Ombi.UI/Modules/UserManagementModule.cs +++ b/Ombi.UI/Modules/UserManagementModule.cs @@ -197,64 +197,95 @@ namespace Ombi.UI.Modules } var plexSettings = await PlexSettings.GetSettingsAsync(); - var plexDbUsers = await PlexUsersRepository.GetAllAsync(); - var plexUsers = PlexApi.GetUsers(plexSettings.PlexAuthToken); - var plexDbUser = plexDbUsers.FirstOrDefault(x => x.PlexUserId == model.Id); - var plexUser = plexUsers.User.FirstOrDefault(x => x.Id == model.Id); - var userLogin = UserLoginsRepo.GetAll().FirstOrDefault(x => x.UserId == model.Id); - if (plexDbUser != null && plexUser != null) + if (plexSettings.Enable) { - // We have a user in the DB for this Plex Account - plexDbUser.Permissions = permissionsValue; - plexDbUser.Features = featuresValue; - - await UpdateRequests(plexDbUser.Username, plexDbUser.UserAlias, model.Alias); - - plexDbUser.UserAlias = model.Alias; - plexDbUser.EmailAddress = model.EmailAddress; - - await PlexUsersRepository.UpdateAsync(plexDbUser); - - var retUser = MapPlexUser(plexUser, plexDbUser, userLogin?.LastLoggedIn ?? DateTime.MinValue); - return Response.AsJson(retUser); - } - - // So it could actually be the admin - var account = PlexApi.GetAccount(plexSettings.PlexAuthToken); - if (plexDbUser != null && account != null) - { - // We have a user in the DB for this Plex Account - plexDbUser.Permissions = permissionsValue; - plexDbUser.Features = featuresValue; - - await UpdateRequests(plexDbUser.Username, plexDbUser.UserAlias, model.Alias); - - plexDbUser.UserAlias = model.Alias; - - await PlexUsersRepository.UpdateAsync(plexDbUser); - - var retUser = MapPlexAdmin(account, plexDbUser, userLogin?.LastLoggedIn ?? DateTime.MinValue); - return Response.AsJson(retUser); - } - - // We have a Plex Account but he's not in the DB - if (plexUser != null) - { - var user = new PlexUsers + var plexDbUsers = await PlexUsersRepository.GetAllAsync(); + var plexUsers = PlexApi.GetUsers(plexSettings.PlexAuthToken); + var plexDbUser = plexDbUsers.FirstOrDefault(x => x.PlexUserId == model.Id); + var plexUser = plexUsers.User.FirstOrDefault(x => x.Id == model.Id); + var userLogin = UserLoginsRepo.GetAll().FirstOrDefault(x => x.UserId == model.Id); + if (plexDbUser != null && plexUser != null) { - Permissions = permissionsValue, - Features = featuresValue, - UserAlias = model.Alias, - PlexUserId = plexUser.Id, - EmailAddress = plexUser.Email, - Username = plexUser.Title, - LoginId = Guid.NewGuid().ToString() - }; + // We have a user in the DB for this Plex Account + plexDbUser.Permissions = permissionsValue; + plexDbUser.Features = featuresValue; - await PlexUsersRepository.InsertAsync(user); + await UpdateRequests(plexDbUser.Username, plexDbUser.UserAlias, model.Alias); + + plexDbUser.UserAlias = model.Alias; + plexDbUser.EmailAddress = model.EmailAddress; + + await PlexUsersRepository.UpdateAsync(plexDbUser); + + var retUser = MapPlexUser(plexUser, plexDbUser, userLogin?.LastLoggedIn ?? DateTime.MinValue); + return Response.AsJson(retUser); + } + + // So it could actually be the admin + var account = PlexApi.GetAccount(plexSettings.PlexAuthToken); + if (plexDbUser != null && account != null) + { + // We have a user in the DB for this Plex Account + plexDbUser.Permissions = permissionsValue; + plexDbUser.Features = featuresValue; + + await UpdateRequests(plexDbUser.Username, plexDbUser.UserAlias, model.Alias); + + plexDbUser.UserAlias = model.Alias; + + await PlexUsersRepository.UpdateAsync(plexDbUser); + + var retUser = MapPlexAdmin(account, plexDbUser, userLogin?.LastLoggedIn ?? DateTime.MinValue); + return Response.AsJson(retUser); + } + + // We have a Plex Account but he's not in the DB + if (plexUser != null) + { + var user = new PlexUsers + { + Permissions = permissionsValue, + Features = featuresValue, + UserAlias = model.Alias, + PlexUserId = plexUser.Id, + EmailAddress = plexUser.Email, + Username = plexUser.Title, + LoginId = Guid.NewGuid().ToString() + }; + + await PlexUsersRepository.InsertAsync(user); + + var retUser = MapPlexUser(plexUser, user, userLogin?.LastLoggedIn ?? DateTime.MinValue); + return Response.AsJson(retUser); + } + } + + var embySettings = await EmbySettings.GetSettingsAsync(); + if (embySettings.Enable) + { + var embyDbUsers = await EmbyRepository.GetAllAsync(); + var embyUsers = EmbyApi.GetUsers(embySettings.FullUri, embySettings.ApiKey); + var selectedDbUser = embyDbUsers.FirstOrDefault(x => x.EmbyUserId == model.Id); + var embyUser = embyUsers.FirstOrDefault(x => x.Id == model.Id); + + var userLogin = UserLoginsRepo.GetAll().FirstOrDefault(x => x.UserId == model.Id); + if (selectedDbUser != null && embyUser != null) + { + // We have a user in the DB for this Plex Account + selectedDbUser.Permissions = permissionsValue; + selectedDbUser.Features = featuresValue; + + await UpdateRequests(selectedDbUser.Username, selectedDbUser.UserAlias, model.Alias); + + selectedDbUser.UserAlias = model.Alias; + selectedDbUser.EmailAddress = model.EmailAddress; + + await EmbyRepository.UpdateAsync(selectedDbUser); + + var retUser = MapEmbyUser(embyUser, selectedDbUser, userLogin?.LastLoggedIn ?? DateTime.MinValue); + return Response.AsJson(retUser); + } - var retUser = MapPlexUser(plexUser, user, userLogin?.LastLoggedIn ?? DateTime.MinValue); - return Response.AsJson(retUser); } return null; // We should never end up here. } @@ -535,7 +566,7 @@ namespace Ombi.UI.Modules { //Get Plex Users var plexUsers = PlexApi.GetUsers(plexSettings.PlexAuthToken); - if (plexUsers != null && plexUsers.User != null) + if (plexUsers?.User != null) { foreach (var u in plexUsers.User) { @@ -585,12 +616,12 @@ namespace Ombi.UI.Modules if (!string.IsNullOrEmpty(embySettings.ApiKey)) { //Get Plex Users - var plexUsers = EmbyApi.GetUsers(embySettings.FullUri, embySettings.ApiKey); - if (plexUsers != null) + var embyUsers = EmbyApi.GetUsers(embySettings.FullUri, embySettings.ApiKey); + if (embyUsers != null) { - foreach (var u in plexUsers) + foreach (var u in embyUsers) { - var dbUser = embyDbUsers.FirstOrDefault(x => x.PlexUserId == u.Id); + var dbUser = embyDbUsers.FirstOrDefault(x => x.EmbyUserId == u.Id); var userDb = userLogins.FirstOrDefault(x => x.UserId == u.Id); // We don't have the user in the database yet @@ -599,15 +630,6 @@ namespace Ombi.UI.Modules : MapEmbyUser(u, dbUser, userDb?.LastLoggedIn ?? DateTime.MinValue)); } } - - // Also get the server admin - var account = PlexApi.GetAccount(embySettings.PlexAuthToken); - if (account != null) - { - var dbUser = embyDbUsers.FirstOrDefault(x => x.PlexUserId == account.Id); - var userDb = userLogins.FirstOrDefault(x => x.UserId == account.Id); - model.Add(MapPlexAdmin(account, dbUser, userDb?.LastLoggedIn ?? DateTime.MinValue)); - } } return Response.AsJson(model); } diff --git a/Ombi.UI/Modules/UserWizardModule.cs b/Ombi.UI/Modules/UserWizardModule.cs index cfc8878ac..39cf8cc3e 100644 --- a/Ombi.UI/Modules/UserWizardModule.cs +++ b/Ombi.UI/Modules/UserWizardModule.cs @@ -121,7 +121,7 @@ namespace Ombi.UI.Modules if (model?.user == null) { return - Response.AsJson(new JsonResponseModel {Result = false, Message = "Incorrect username or password!"}); + Response.AsJson(new JsonResponseModel { Result = false, Message = "Incorrect username or password!" }); } // Set the auth token in the session so we can use it in the next form @@ -132,7 +132,7 @@ namespace Ombi.UI.Modules return Response.AsJson( - new {Result = true, firstServer?.Port, Ip = firstServer?.LocalAddresses, firstServer?.Scheme}); + new { Result = true, firstServer?.Port, Ip = firstServer?.LocalAddresses, firstServer?.Scheme }); } private async Task Plex() @@ -144,7 +144,7 @@ namespace Ombi.UI.Modules return Response.AsJson(valid.SendJsonError()); } form.PlexAuthToken = Session[SessionKeys.UserWizardPlexAuth].ToString(); - // Set the auth token from the previous form + // Set the auth token from the previous form // Get the machine ID from the settings (This could have changed) try @@ -163,7 +163,7 @@ namespace Ombi.UI.Modules var result = await PlexSettings.SaveSettingsAsync(form); if (result) { - return Response.AsJson(new JsonResponseModel {Result = true}); + return Response.AsJson(new JsonResponseModel { Result = true }); } return Response.AsJson(new JsonResponseModel @@ -189,7 +189,7 @@ namespace Ombi.UI.Modules var result = await PlexRequestSettings.SaveSettingsAsync(currentSettings); if (result) { - return Response.AsJson(new {Result = true}); + return Response.AsJson(new { Result = true }); } return @@ -207,7 +207,7 @@ namespace Ombi.UI.Modules var result = await Auth.SaveSettingsAsync(form); if (result) { - return Response.AsJson(new JsonResponseModel {Result = true}); + return Response.AsJson(new JsonResponseModel { Result = true }); } return Response.AsJson(new JsonResponseModel @@ -219,9 +219,9 @@ namespace Ombi.UI.Modules private async Task CreateUser() { - var username = (string) Request.Form.Username; + var username = (string)Request.Form.Username; var userId = Mapper.CreateUser(username, Request.Form.Password, - EnumHelper.All() - (int) Permissions.ReadOnlyUser, 0); + EnumHelper.All() - (int)Permissions.ReadOnlyUser, 0); Analytics.TrackEventAsync(Category.Wizard, Action.Finish, "Finished the wizard", username, CookieHelper.GetAnalyticClientId(Cookies)); Session[SessionKeys.UsernameKey] = username; @@ -236,15 +236,15 @@ namespace Ombi.UI.Modules var baseUrl = string.IsNullOrEmpty(settings.BaseUrl) ? string.Empty : $"/{settings.BaseUrl}"; - return CustomModuleExtensions.LoginAndRedirect(this, (Guid) userId, fallbackRedirectUrl: $"{baseUrl}/search"); + return CustomModuleExtensions.LoginAndRedirect(this, (Guid)userId, fallbackRedirectUrl: $"{baseUrl}/search"); } private async Task EmbyAuth() { - var ip = (string) Request.Form.Ip; - var port = (int) Request.Form.Port; - var apiKey = (string) Request.Form.ApiKey; - var ssl = (bool) Request.Form.Ssl; + var ip = (string)Request.Form.Ip; + var port = (int)Request.Form.Port; + var apiKey = (string)Request.Form.ApiKey; + var ssl = (bool)Request.Form.Ssl; var settings = new EmbySettings { @@ -262,7 +262,7 @@ namespace Ombi.UI.Modules if (result != null && result.Any()) { - + settings.AdministratorId = result.FirstOrDefault(x => x.Policy.IsAdministrator)?.Id ?? string.Empty; await EmbySettings.SaveSettingsAsync(settings); return Response.AsJson(new JsonResponseModel diff --git a/Ombi.UI/NinjectModules/ServicesModule.cs b/Ombi.UI/NinjectModules/ServicesModule.cs index a573e1ddf..95dfcf433 100644 --- a/Ombi.UI/NinjectModules/ServicesModule.cs +++ b/Ombi.UI/NinjectModules/ServicesModule.cs @@ -63,6 +63,7 @@ namespace Ombi.UI.NinjectModules Bind().To(); Bind().To(); Bind().To(); + Bind().To(); Bind().To(); diff --git a/Ombi.UI/Views/Admin/SchedulerSettings.cshtml b/Ombi.UI/Views/Admin/SchedulerSettings.cshtml index d0ec15837..ac2e0f4b8 100644 --- a/Ombi.UI/Views/Admin/SchedulerSettings.cshtml +++ b/Ombi.UI/Views/Admin/SchedulerSettings.cshtml @@ -35,22 +35,53 @@
Scheduler Settings Please note, you will need to restart for these settings to take effect - -
- - -
- -
- - -
-
- - -
+ + @if (Model.Plex) + { +
+ + +
+
+ + +
+ +
+ + +
+ + Please note, the minimum time for this to run is 11 hours, if set below 11 then we will ignore that value. This is a very resource intensive job, the less we run it the better. +
+ + +
+ } + @if (Model.Emby) + { +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ }
@@ -64,11 +95,7 @@
- Please note, the minimum time for this to run is 11 hours, if set below 11 then we will ignore that value. This is a very resource intensive job, the less we run it the better. -
- - -
+
diff --git a/Ombi.UI/Views/UserLogin/Username.cshtml b/Ombi.UI/Views/UserLogin/Username.cshtml index 3fdb206bb..fcf46d8e7 100644 --- a/Ombi.UI/Views/UserLogin/Username.cshtml +++ b/Ombi.UI/Views/UserLogin/Username.cshtml @@ -14,10 +14,10 @@
- +
- +

diff --git a/Ombi.UI/Views/UserWizard/Index.cshtml b/Ombi.UI/Views/UserWizard/Index.cshtml index 051ce0cf5..b8bae77d2 100644 --- a/Ombi.UI/Views/UserWizard/Index.cshtml +++ b/Ombi.UI/Views/UserWizard/Index.cshtml @@ -64,7 +64,7 @@
- +
@@ -79,7 +79,7 @@
- Next + Next