feat: 增加桌面端登录、视频清单和封面缓存
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
import logging
|
||||
import threading
|
||||
|
||||
from server.services.rapt import rapt
|
||||
from server.services.sessions import sessions
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ProfilePoller:
|
||||
def __init__(self, interval: float = 15) -> None:
|
||||
self.interval = interval
|
||||
self._lock = threading.Lock()
|
||||
self._token = ""
|
||||
self._stop: threading.Event | None = None
|
||||
self._thread: threading.Thread | None = None
|
||||
|
||||
def ensure(self, token: str) -> None:
|
||||
with self._lock:
|
||||
if self._token == token and self._thread is not None and self._thread.is_alive():
|
||||
return
|
||||
if self._stop is not None:
|
||||
self._stop.set()
|
||||
stop = threading.Event()
|
||||
thread = threading.Thread(
|
||||
target=self._loop,
|
||||
args=(token, stop),
|
||||
name="profile-poller",
|
||||
daemon=True,
|
||||
)
|
||||
self._token = token
|
||||
self._stop = stop
|
||||
self._thread = thread
|
||||
thread.start()
|
||||
|
||||
def stop_if(self, token: str) -> None:
|
||||
with self._lock:
|
||||
if self._token != token:
|
||||
return
|
||||
if self._stop is not None:
|
||||
self._stop.set()
|
||||
self._token = ""
|
||||
self._stop = None
|
||||
self._thread = None
|
||||
|
||||
def _loop(self, token: str, stop: threading.Event) -> None:
|
||||
while not stop.wait(self.interval):
|
||||
if sessions.active_token() != token:
|
||||
return
|
||||
device = sessions.device_for(token)
|
||||
if device is None:
|
||||
return
|
||||
try:
|
||||
profile = rapt.user_info(token, device)
|
||||
except Exception:
|
||||
log.warning("刷新个人信息失败", exc_info=True)
|
||||
continue
|
||||
sessions.set_profile(token, profile)
|
||||
|
||||
|
||||
profile_poller = ProfilePoller()
|
||||
Reference in New Issue
Block a user