Beispiel #1
0
        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 dbUsers = Repo.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);
            }
        }
Beispiel #2
0
        public async Task <bool> Emby([FromBody] EmbyServers settings)
        {
            try
            {
                var result = await EmbyApi.GetUsers(settings.FullUri, settings.ApiKey);

                return(result.Any());
            }
            catch (Exception e)
            {
                Log.LogError(LoggingEvents.Api, e, "Could not test Emby");
                return(false);
            }
        }
Beispiel #3
0
 private EmbyUser GetEmbyUser(string username, EmbySettings s)
 {
     try
     {
         var users    = EmbyApi.GetUsers(s.FullUri, s.ApiKey);
         var allUsers = users?.Where(x => !string.IsNullOrEmpty(x.Name));
         return(allUsers?.FirstOrDefault(x => x.Name.Equals(username, StringComparison.CurrentCultureIgnoreCase)));
     }
     catch (Exception e)
     {
         Log.Error(e);
         return(null);
     }
 }
Beispiel #4
0
        private async Task <Response> 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 settings = new EmbySettings
            {
                ApiKey = apiKey,
                Enable = true,
                Ip     = ip,
                Port   = port,
                Ssl    = ssl,
            };

            try
            {
                // Test that we can connect
                var result = EmbyApi.GetUsers(settings.FullUri, apiKey);

                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
                    {
                        Result = true
                    }));
                }
            }
            catch (Exception e)
            {
                return(Response.AsJson(new JsonResponseModel
                {
                    Result = false,
                    Message = $"Could not connect to Emby, please check your settings. Error: {e.Message}"
                }));
            }

            return(Response.AsJson(new JsonResponseModel
            {
                Result = false,
                Message = "Could not connect to Emby, please check your settings."
            }));
        }
Beispiel #5
0
        public async Task <IEnumerable <UsersViewModel> > EmbyUsers()
        {
            var vm = new List <UsersViewModel>();
            var s  = await EmbySettings.GetSettingsAsync();

            foreach (var server in s?.Servers ?? new List <EmbyServers>())
            {
                var users = await EmbyApi.GetUsers(server.FullUri, server.ApiKey);

                if (users != null && users.Any())
                {
                    vm.AddRange(users.Select(u => new UsersViewModel
                    {
                        Username = u.Name,
                        Id       = u.Id
                    }));
                }
            }

            // Filter out any dupes
            return(vm.DistinctBy(x => x.Id));
        }
Beispiel #6
0
        public async Task <EmbySettings> SignIn([FromBody] EmbySettings request)
        {
            // Check if settings exist since we allow anon...
            var settings = await EmbySettings.GetSettingsAsync();

            if (settings?.Servers?.Any() ?? false)
            {
                return(null);
            }

            request.Enable = true;
            var firstServer = request.Servers.FirstOrDefault();
            // Test that we can connect
            var result = await EmbyApi.GetUsers(firstServer.FullUri, firstServer.ApiKey);

            if (result != null && result.Any())
            {
                firstServer.AdministratorId = result.FirstOrDefault(x => x.Policy.IsAdministrator)?.Id ?? string.Empty;
                await EmbySettings.SaveSettingsAsync(request);

                return(request);
            }
            return(null);
        }
        public async Task NotifyUsers(IEnumerable <RequestedModel> modelChanged, NotificationType type)
        {
            try
            {
                var embySettings = await EmbySettings.GetSettingsAsync();

                var embyUsers   = EmbyApi.GetUsers(embySettings.FullUri, embySettings.ApiKey);
                var userAccount = embyUsers.FirstOrDefault(x => x.Policy.IsAdministrator);

                var adminUsername = userAccount?.Name ?? string.Empty;

                var users = UserHelper.GetUsersWithFeature(Features.RequestAddedNotification).ToList();
                Log.Debug("Notifying Users Count {0}", users.Count);
                foreach (var model in modelChanged)
                {
                    var selectedUsers = new List <string>();

                    foreach (var u in users)
                    {
                        var requestUser = model.RequestedUsers.FirstOrDefault(
                            x => x.Equals(u.Username, StringComparison.CurrentCultureIgnoreCase) || x.Equals(u.UserAlias, StringComparison.CurrentCultureIgnoreCase));
                        if (string.IsNullOrEmpty(requestUser))
                        {
                            continue;
                        }

                        // Make sure we do not already have the user
                        if (!selectedUsers.Contains(requestUser))
                        {
                            selectedUsers.Add(requestUser);
                        }
                    }

                    foreach (var user in selectedUsers)
                    {
                        var localUser =
                            users.FirstOrDefault(x =>
                                                 x.Username.Equals(user, StringComparison.CurrentCultureIgnoreCase) ||
                                                 x.UserAlias.Equals(user, StringComparison.CurrentCultureIgnoreCase));
                        Log.Info("Notifying user {0}", user);
                        if (user.Equals(adminUsername, StringComparison.CurrentCultureIgnoreCase))
                        {
                            Log.Info("This user is the Plex server owner");
                            await PublishUserNotification(userAccount?.Name, localUser?.EmailAddress, model.Title, model.PosterPath, type, model.Type);

                            return;
                        }



                        // So if the request was from an alias, then we need to use the local user (since that contains the alias).
                        // If we do not have a local user, then we should be using the Emby user if that user exists.
                        // This will execute most of the time since Emby and Local users will most always be in the database.
                        if (localUser != null)
                        {
                            if (string.IsNullOrEmpty(localUser?.EmailAddress))
                            {
                                Log.Info("There is no email address for this Local user ({0}), cannot send notification", localUser.Username);
                                continue;
                            }

                            Log.Info("Sending notification to: {0} at: {1}, for : {2}", localUser, localUser.EmailAddress, model.Title);
                            await PublishUserNotification(localUser.Username, localUser.EmailAddress, model.Title, model.PosterPath, type, model.Type);
                        }
                        else
                        {
                            var embyUser = EmbyUserRepo.GetUserByUsername(user);
                            var email    = embyUsers.FirstOrDefault(x => x.Name.Equals(user, StringComparison.CurrentCultureIgnoreCase));
                            if (string.IsNullOrEmpty(embyUser?.EmailAddress)) // TODO this needs to be the email
                            {
                                Log.Info("There is no email address for this Emby user ({0}), cannot send notification", email?.Name);
                                // We do not have a plex user that requested this!
                                continue;
                            }

                            Log.Info("Sending notification to: {0} at: {1}, for : {2}", embyUser?.Username, embyUser?.EmailAddress, model.Title);
                            await PublishUserNotification(email?.Name, embyUser?.EmailAddress, model.Title, model.PosterPath, type, model.Type);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
        }
        public async Task NotifyUsers(RequestedModel model, NotificationType type)
        {
            try
            {
                var embySettings = await EmbySettings.GetSettingsAsync();

                var embyUsers   = EmbyApi.GetUsers(embySettings.FullUri, embySettings.ApiKey);
                var userAccount = embyUsers.FirstOrDefault(x => x.Policy.IsAdministrator);
                var localUsers  = UserHelper.GetUsers().ToList();

                var adminUsername = userAccount.Name ?? string.Empty;

                var users = UserHelper.GetUsersWithFeature(Features.RequestAddedNotification).ToList();
                Log.Debug("Notifying Users Count {0}", users.Count);

                // Get the usernames or alias depending if they have an alias
                var userNamesWithFeature = users.Select(x => x.UsernameOrAlias).ToList();
                Log.Debug("Users with the feature count {0}", userNamesWithFeature.Count);
                Log.Debug("Usernames: ");
                foreach (var u in userNamesWithFeature)
                {
                    Log.Debug(u);
                }

                Log.Debug("Users in the requested model count: {0}", model.AllUsers.Count);
                Log.Debug("usernames from model: ");
                foreach (var modelAllUser in model.AllUsers)
                {
                    Log.Debug(modelAllUser);
                }

                if (model.AllUsers == null || !model.AllUsers.Any())
                {
                    Log.Debug("There are no users in the model.AllUsers, no users to notify");
                    return;
                }
                var usersToNotify = userNamesWithFeature.Intersect(model.AllUsers, StringComparer.CurrentCultureIgnoreCase).ToList();

                if (!usersToNotify.Any())
                {
                    Log.Debug("Could not find any users after the .Intersect()");
                }

                Log.Debug("Users being notified for this request count {0}", users.Count);
                foreach (var user in usersToNotify)
                {
                    var embyUser = EmbyUserRepo.GetUserByUsername(user);
                    Log.Info("Notifying user {0}", user);
                    if (user.Equals(adminUsername, StringComparison.CurrentCultureIgnoreCase))
                    {
                        Log.Info("This user is the Emby server owner");
                        await PublishUserNotification(userAccount.Name, embyUser.EmailAddress, model.Title, model.PosterPath, type, model.Type);

                        return;
                    }

                    var email = embyUsers.FirstOrDefault(x => x.Name.Equals(user, StringComparison.CurrentCultureIgnoreCase));
                    if (email == null)
                    {
                        // Local User?
                        var local = localUsers.FirstOrDefault(x => x.UsernameOrAlias.Equals(user));
                        if (local != null)
                        {
                            Log.Info("Sending notification to: {0} at: {1}, for title: {2}", local.UsernameOrAlias, local.EmailAddress, model.Title);
                            await PublishUserNotification(local.UsernameOrAlias, local.EmailAddress, model.Title, model.PosterPath, type, model.Type);

                            continue;
                        }
                    }

                    Log.Info("Sending notification to: {0} at: {1}, for title: {2}", email.Name, embyUser.EmailAddress, model.Title);
                    await PublishUserNotification(email.Name, embyUser.EmailAddress, model.Title, model.PosterPath, type, model.Type);
                }
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
        }