From 8497cd4927958e4c590a90835a218f1c20be6613 Mon Sep 17 00:00:00 2001 From: Harvey Tindall Date: Sat, 9 May 2020 22:10:30 +0100 Subject: [PATCH] Speed up interface through adding caching jf_api now caches the list of users, only fetching new data if the cache is more than 30 minutes old. Also remove the pointless tempJF with an instance named auth_jf since jf_api can now handle multiple authentications. --- jellyfin_accounts/jf_api.py | 43 +++++++++++++++++++++++++------------ jellyfin_accounts/login.py | 16 ++++++-------- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/jellyfin_accounts/jf_api.py b/jellyfin_accounts/jf_api.py index ad0b5e5..c64ddd6 100644 --- a/jellyfin_accounts/jf_api.py +++ b/jellyfin_accounts/jf_api.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 import requests - +import time class Error(Exception): pass @@ -20,6 +20,9 @@ class Jellyfin: self.version = version self.device = device self.deviceId = deviceId + self.timeout = 30 * 60 + self.userCacheAge = time.time() - self.timeout - 1 + self.userCachePublicAge = self.userCacheAge self.useragent = f"{self.client}/{self.version}" self.auth = "MediaBrowser " self.auth += f"Client={self.client}, " @@ -37,20 +40,32 @@ class Jellyfin: } def getUsers(self, username="all", id="all", public=True): if public is True: - response = requests.get(self.server+"/emby/Users/Public").json() - elif public is False and hasattr(self, 'username') and hasattr(self, 'password'): - response = requests.get(self.server+"/emby/Users", - headers=self.header, - params={'Username': self.username, - 'Pw': self.password}) - if response.status_code == 200: - response = response.json() + if (time.time() - self.userCachePublicAge) >= self.timeout: + response = requests.get(self.server+"/emby/Users/Public").json() + self.userCachePublic = response + self.userCachePublicAge = time.time() else: - try: - self.authenticate(self.username, self.password) - return self.getUsers(username, id, public) - except self.AuthenticationError: - raise self.AuthenticationRequiredError + response = self.userCachePublic + elif (public is False and + hasattr(self, 'username') and + hasattr(self, 'password')): + if (time.time() - self.userCacheAge) >= self.timeout: + response = requests.get(self.server+"/emby/Users", + headers=self.header, + params={'Username': self.username, + 'Pw': self.password}) + if response.status_code == 200: + response = response.json() + self.userCache = response + self.userCacheAge = time.time() + else: + try: + self.authenticate(self.username, self.password) + return self.getUsers(username, id, public) + except self.AuthenticationError: + raise self.AuthenticationRequiredError + else: + response = self.userCache else: raise self.AuthenticationRequiredError if username == "all" and id == "all": diff --git a/jellyfin_accounts/login.py b/jellyfin_accounts/login.py index 6be5d20..d57f8a5 100644 --- a/jellyfin_accounts/login.py +++ b/jellyfin_accounts/login.py @@ -11,13 +11,11 @@ from __main__ import auth_log as log from jellyfin_accounts.jf_api import Jellyfin from jellyfin_accounts.web_api import jf - -def tempJF(): - return Jellyfin(config['jellyfin']['server'], - config['jellyfin']['client'], - config['jellyfin']['version'], - config['jellyfin']['device'] + '_temp', - config['jellyfin']['device_id'] + '_temp') +auth_jf = Jellyfin(config['jellyfin']['server'], + config['jellyfin']['client'], + config['jellyfin']['version'], + config['jellyfin']['device'], + config['jellyfin']['device_id'] + '_authClient') class Account(): def __init__(self, username=None, password=None): @@ -35,9 +33,8 @@ class Account(): if not self.jf: return pwd_context.verify(password, self.password_hash) else: - temp_jf = tempJF() try: - return temp_jf.authenticate(self.username, password) + return auth_jf.authenticate(self.username, password) except Jellyfin.AuthenticationError: return False def generate_token(self, expiration=1200): @@ -107,7 +104,6 @@ def verify_password(username, password): else: user = accounts['adminAccount'] verified = Account().verify_token(username, accounts) - if not verified: if username == user.username and user.verify_password(password): g.user = user