add SystemConfModel

This commit is contained in:
jxxghp
2025-06-27 09:54:15 +08:00
parent bb4438ac42
commit 574257edf8
11 changed files with 63 additions and 49 deletions
+3 -3
View File
@@ -176,7 +176,7 @@ class TorrentsChain(ChainBase):
# 按pubdate降序排列 # 按pubdate降序排列
torrents.sort(key=lambda x: x.pubdate or '', reverse=True) torrents.sort(key=lambda x: x.pubdate or '', reverse=True)
# 取前N条 # 取前N条
torrents = torrents[:settings.CONF["refresh"]] torrents = torrents[:settings.CONF.refresh]
if torrents: if torrents:
# 过滤出没有处理过的种子 - 优化:使用集合查找,避免重复创建字符串列表 # 过滤出没有处理过的种子 - 优化:使用集合查找,避免重复创建字符串列表
cached_signatures = {f'{t.torrent_info.title}{t.torrent_info.description}' cached_signatures = {f'{t.torrent_info.title}{t.torrent_info.description}'
@@ -217,8 +217,8 @@ class TorrentsChain(ChainBase):
else: else:
torrents_cache[domain].append(context) torrents_cache[domain].append(context)
# 如果超过了限制条数则移除掉前面的 # 如果超过了限制条数则移除掉前面的
if len(torrents_cache[domain]) > settings.CONF["torrents"]: if len(torrents_cache[domain]) > settings.CONF.torrents:
torrents_cache[domain] = torrents_cache[domain][-settings.CONF["torrents"]:] torrents_cache[domain] = torrents_cache[domain][-settings.CONF.torrents:]
finally: finally:
torrents.clear() torrents.clear()
del torrents del torrents
+48 -34
View File
@@ -15,6 +15,30 @@ from app.utils.system import SystemUtils
from app.utils.url import UrlUtils from app.utils.url import UrlUtils
class SystemConfModel(BaseModel):
"""
系统关键资源大小配置
"""
# 缓存种子数量
torrents: int = 0
# 订阅刷新处理数量
refresh: int = 0
# TMDB请求缓存数量
tmdb: int = 0
# 豆瓣请求缓存数量
douban: int = 0
# Bangumi请求缓存数量
bangumi: int = 0
# Fanart请求缓存数量
fanart: int = 0
# 元数据缓存过期时间(秒)
meta: int = 0
# 调度器数量
scheduler: int = 0
# 线程池大小
threadpool: int = 0
class ConfigModel(BaseModel): class ConfigModel(BaseModel):
""" """
Pydantic 配置模型,描述所有配置项及其类型和默认值 Pydantic 配置模型,描述所有配置项及其类型和默认值
@@ -525,43 +549,33 @@ class Settings(BaseSettings, ConfigModel, LogConfigModel):
return self.CONFIG_PATH / "cookies" return self.CONFIG_PATH / "cookies"
@property @property
def CONF(self): def CONF(self) -> SystemConfModel:
""" """
{ 根据内存模式返回系统配置
"torrents": "缓存种子数量",
"refresh": "订阅刷新处理数量",
"tmdb": "TMDB请求缓存数量",
"douban": "豆瓣请求缓存数量",
"fanart": "Fanart请求缓存数量",
"meta": "元数据缓存过期时间(秒)",
"memory": "最大占用内存(MB",
"scheduler": "调度器缓存数量"
"threadpool": "线程池数量"
}
""" """
if self.BIG_MEMORY_MODE: if self.BIG_MEMORY_MODE:
return { return SystemConfModel(
"torrents": 200, torrents=200,
"refresh": 100, refresh=100,
"tmdb": 1024, tmdb=1024,
"douban": 512, douban=512,
"bangumi": 512, bangumi=512,
"fanart": 512, fanart=512,
"meta": (self.META_CACHE_EXPIRE or 24) * 3600, meta=(self.META_CACHE_EXPIRE or 24) * 3600,
"scheduler": 100, scheduler=100,
"threadpool": 100 threadpool=100
} )
return { return SystemConfModel(
"torrents": 100, torrents=100,
"refresh": 50, refresh=50,
"tmdb": 256, tmdb=256,
"douban": 256, douban=256,
"bangumi": 256, bangumi=256,
"fanart": 128, fanart=128,
"meta": (self.META_CACHE_EXPIRE or 2) * 3600, meta=(self.META_CACHE_EXPIRE or 2) * 3600,
"scheduler": 50, scheduler=50,
"threadpool": 50 threadpool=50
} )
@property @property
def PROXY(self): def PROXY(self):
+1 -1
View File
@@ -9,7 +9,7 @@ class ThreadHelper(metaclass=Singleton):
线程池管理 线程池管理
""" """
def __init__(self): def __init__(self):
self.pool = ThreadPoolExecutor(max_workers=settings.CONF['threadpool']) self.pool = ThreadPoolExecutor(max_workers=settings.CONF.threadpool)
def submit(self, func, *args, **kwargs): def submit(self, func, *args, **kwargs):
""" """
+1 -1
View File
@@ -30,7 +30,7 @@ class BangumiApi(object):
self._session = requests.Session() self._session = requests.Session()
self._req = RequestUtils(session=self._session) self._req = RequestUtils(session=self._session)
@cached(maxsize=settings.CONF["bangumi"], ttl=settings.CONF["meta"]) @cached(maxsize=settings.CONF.bangumi, ttl=settings.CONF.meta)
def __invoke(self, url, key: Optional[str] = None, **kwargs): def __invoke(self, url, key: Optional[str] = None, **kwargs):
req_url = self._base_url + url req_url = self._base_url + url
params = {} params = {}
+3 -3
View File
@@ -171,14 +171,14 @@ class DoubanApi(metaclass=Singleton):
).digest() ).digest()
).decode() ).decode()
@cached(maxsize=settings.CONF["douban"], ttl=settings.CONF["meta"]) @cached(maxsize=settings.CONF.douban, ttl=settings.CONF.meta)
def __invoke_recommend(self, url: str, **kwargs) -> dict: def __invoke_recommend(self, url: str, **kwargs) -> dict:
""" """
推荐/发现类API 推荐/发现类API
""" """
return self.__invoke(url, **kwargs) return self.__invoke(url, **kwargs)
@cached(maxsize=settings.CONF["douban"], ttl=settings.CONF["meta"]) @cached(maxsize=settings.CONF.douban, ttl=settings.CONF.meta)
def __invoke_search(self, url: str, **kwargs) -> dict: def __invoke_search(self, url: str, **kwargs) -> dict:
""" """
搜索类API 搜索类API
@@ -213,7 +213,7 @@ class DoubanApi(metaclass=Singleton):
return resp.json() return resp.json()
return resp.json() if resp else {} return resp.json() if resp else {}
@cached(maxsize=settings.CONF["douban"], ttl=settings.CONF["meta"]) @cached(maxsize=settings.CONF.douban, ttl=settings.CONF.meta)
def __post(self, url: str, **kwargs) -> dict: def __post(self, url: str, **kwargs) -> dict:
""" """
POST请求 POST请求
+1 -1
View File
@@ -16,7 +16,7 @@ from app.schemas.types import MediaType
lock = RLock() lock = RLock()
CACHE_EXPIRE_TIMESTAMP_STR = "cache_expire_timestamp" CACHE_EXPIRE_TIMESTAMP_STR = "cache_expire_timestamp"
EXPIRE_TIMESTAMP = settings.CONF["meta"] EXPIRE_TIMESTAMP = settings.CONF.meta
class DoubanCache(metaclass=Singleton): class DoubanCache(metaclass=Singleton):
+1 -1
View File
@@ -440,7 +440,7 @@ class FanartModule(_ModuleBase):
return result return result
@classmethod @classmethod
@cached(maxsize=settings.CONF["fanart"], ttl=settings.CONF["meta"]) @cached(maxsize=settings.CONF.fanart, ttl=settings.CONF.meta)
def __request_fanart(cls, media_type: MediaType, queryid: Union[str, int]) -> Optional[dict]: def __request_fanart(cls, media_type: MediaType, queryid: Union[str, int]) -> Optional[dict]:
if media_type == MediaType.MOVIE: if media_type == MediaType.MOVIE:
image_url = cls._movie_url % queryid image_url = cls._movie_url % queryid
+1 -1
View File
@@ -15,7 +15,7 @@ from app.schemas.types import MediaType
lock = RLock() lock = RLock()
CACHE_EXPIRE_TIMESTAMP_STR = "cache_expire_timestamp" CACHE_EXPIRE_TIMESTAMP_STR = "cache_expire_timestamp"
EXPIRE_TIMESTAMP = settings.CONF["meta"] EXPIRE_TIMESTAMP = settings.CONF.meta
class TmdbCache(metaclass=Singleton): class TmdbCache(metaclass=Singleton):
+1 -1
View File
@@ -500,7 +500,7 @@ class TmdbApi:
return ret_info return ret_info
@cached(maxsize=settings.CONF["tmdb"], ttl=settings.CONF["meta"]) @cached(maxsize=settings.CONF.tmdb, ttl=settings.CONF.meta)
@rate_limit_exponential(source="match_tmdb_web", base_wait=5, max_wait=1800, enable_logging=True) @rate_limit_exponential(source="match_tmdb_web", base_wait=5, max_wait=1800, enable_logging=True)
def match_web(self, name: str, mtype: MediaType) -> Optional[dict]: def match_web(self, name: str, mtype: MediaType) -> Optional[dict]:
""" """
+1 -1
View File
@@ -124,7 +124,7 @@ class TMDb(object):
def cache(self, cache): def cache(self, cache):
self._cache_enabled = bool(cache) self._cache_enabled = bool(cache)
@cached(maxsize=settings.CONF["tmdb"], ttl=settings.CONF["meta"]) @cached(maxsize=settings.CONF.tmdb, ttl=settings.CONF.meta)
def cached_request(self, method, url, data, json, def cached_request(self, method, url, data, json,
_ts=datetime.strftime(datetime.now(), '%Y%m%d')): _ts=datetime.strftime(datetime.now(), '%Y%m%d')):
""" """
+2 -2
View File
@@ -167,7 +167,7 @@ class Scheduler(metaclass=Singleton):
# 创建定时服务 # 创建定时服务
self._scheduler = BackgroundScheduler(timezone=settings.TZ, self._scheduler = BackgroundScheduler(timezone=settings.TZ,
executors={ executors={
'default': ThreadPoolExecutor(settings.CONF['scheduler']) 'default': ThreadPoolExecutor(settings.CONF.scheduler)
}) })
# CookieCloud定时同步 # CookieCloud定时同步
@@ -324,7 +324,7 @@ class Scheduler(metaclass=Singleton):
"interval", "interval",
id="clear_cache", id="clear_cache",
name="缓存清理", name="缓存清理",
hours=settings.CONF["meta"] / 3600, hours=settings.CONF.meta / 3600,
kwargs={ kwargs={
'job_id': 'clear_cache' 'job_id': 'clear_cache'
} }