diff --git a/app/chain/torrents.py b/app/chain/torrents.py index d08be754..9e22b74a 100644 --- a/app/chain/torrents.py +++ b/app/chain/torrents.py @@ -176,7 +176,7 @@ class TorrentsChain(ChainBase): # 按pubdate降序排列 torrents.sort(key=lambda x: x.pubdate or '', reverse=True) # 取前N条 - torrents = torrents[:settings.CONF["refresh"]] + torrents = torrents[:settings.CONF.refresh] if torrents: # 过滤出没有处理过的种子 - 优化:使用集合查找,避免重复创建字符串列表 cached_signatures = {f'{t.torrent_info.title}{t.torrent_info.description}' @@ -217,8 +217,8 @@ class TorrentsChain(ChainBase): else: torrents_cache[domain].append(context) # 如果超过了限制条数则移除掉前面的 - if len(torrents_cache[domain]) > settings.CONF["torrents"]: - torrents_cache[domain] = torrents_cache[domain][-settings.CONF["torrents"]:] + if len(torrents_cache[domain]) > settings.CONF.torrents: + torrents_cache[domain] = torrents_cache[domain][-settings.CONF.torrents:] finally: torrents.clear() del torrents diff --git a/app/core/config.py b/app/core/config.py index a3e7cb6e..25467567 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -15,6 +15,30 @@ from app.utils.system import SystemUtils 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): """ Pydantic 配置模型,描述所有配置项及其类型和默认值 @@ -525,43 +549,33 @@ class Settings(BaseSettings, ConfigModel, LogConfigModel): return self.CONFIG_PATH / "cookies" @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: - return { - "torrents": 200, - "refresh": 100, - "tmdb": 1024, - "douban": 512, - "bangumi": 512, - "fanart": 512, - "meta": (self.META_CACHE_EXPIRE or 24) * 3600, - "scheduler": 100, - "threadpool": 100 - } - return { - "torrents": 100, - "refresh": 50, - "tmdb": 256, - "douban": 256, - "bangumi": 256, - "fanart": 128, - "meta": (self.META_CACHE_EXPIRE or 2) * 3600, - "scheduler": 50, - "threadpool": 50 - } + return SystemConfModel( + torrents=200, + refresh=100, + tmdb=1024, + douban=512, + bangumi=512, + fanart=512, + meta=(self.META_CACHE_EXPIRE or 24) * 3600, + scheduler=100, + threadpool=100 + ) + return SystemConfModel( + torrents=100, + refresh=50, + tmdb=256, + douban=256, + bangumi=256, + fanart=128, + meta=(self.META_CACHE_EXPIRE or 2) * 3600, + scheduler=50, + threadpool=50 + ) @property def PROXY(self): diff --git a/app/helper/thread.py b/app/helper/thread.py index c32a836b..1778a5dc 100644 --- a/app/helper/thread.py +++ b/app/helper/thread.py @@ -9,7 +9,7 @@ class ThreadHelper(metaclass=Singleton): 线程池管理 """ 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): """ diff --git a/app/modules/bangumi/bangumi.py b/app/modules/bangumi/bangumi.py index 6fa095b8..b5378c6b 100644 --- a/app/modules/bangumi/bangumi.py +++ b/app/modules/bangumi/bangumi.py @@ -30,7 +30,7 @@ class BangumiApi(object): self._session = requests.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): req_url = self._base_url + url params = {} diff --git a/app/modules/douban/apiv2.py b/app/modules/douban/apiv2.py index ff75fa66..a9fcfd23 100644 --- a/app/modules/douban/apiv2.py +++ b/app/modules/douban/apiv2.py @@ -171,14 +171,14 @@ class DoubanApi(metaclass=Singleton): ).digest() ).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: """ 推荐/发现类API """ 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: """ 搜索类API @@ -213,7 +213,7 @@ class DoubanApi(metaclass=Singleton): return resp.json() 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: """ POST请求 diff --git a/app/modules/douban/douban_cache.py b/app/modules/douban/douban_cache.py index 2baa8c71..b0d996d3 100644 --- a/app/modules/douban/douban_cache.py +++ b/app/modules/douban/douban_cache.py @@ -16,7 +16,7 @@ from app.schemas.types import MediaType lock = RLock() CACHE_EXPIRE_TIMESTAMP_STR = "cache_expire_timestamp" -EXPIRE_TIMESTAMP = settings.CONF["meta"] +EXPIRE_TIMESTAMP = settings.CONF.meta class DoubanCache(metaclass=Singleton): diff --git a/app/modules/fanart/__init__.py b/app/modules/fanart/__init__.py index 006faffa..764b8106 100644 --- a/app/modules/fanart/__init__.py +++ b/app/modules/fanart/__init__.py @@ -440,7 +440,7 @@ class FanartModule(_ModuleBase): return result @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]: if media_type == MediaType.MOVIE: image_url = cls._movie_url % queryid diff --git a/app/modules/themoviedb/tmdb_cache.py b/app/modules/themoviedb/tmdb_cache.py index fdd6312b..52cc2988 100644 --- a/app/modules/themoviedb/tmdb_cache.py +++ b/app/modules/themoviedb/tmdb_cache.py @@ -15,7 +15,7 @@ from app.schemas.types import MediaType lock = RLock() CACHE_EXPIRE_TIMESTAMP_STR = "cache_expire_timestamp" -EXPIRE_TIMESTAMP = settings.CONF["meta"] +EXPIRE_TIMESTAMP = settings.CONF.meta class TmdbCache(metaclass=Singleton): diff --git a/app/modules/themoviedb/tmdbapi.py b/app/modules/themoviedb/tmdbapi.py index 0380d91c..8da7c1ed 100644 --- a/app/modules/themoviedb/tmdbapi.py +++ b/app/modules/themoviedb/tmdbapi.py @@ -500,7 +500,7 @@ class TmdbApi: 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) def match_web(self, name: str, mtype: MediaType) -> Optional[dict]: """ diff --git a/app/modules/themoviedb/tmdbv3api/tmdb.py b/app/modules/themoviedb/tmdbv3api/tmdb.py index 1bf1ae75..614dd6f9 100644 --- a/app/modules/themoviedb/tmdbv3api/tmdb.py +++ b/app/modules/themoviedb/tmdbv3api/tmdb.py @@ -124,7 +124,7 @@ class TMDb(object): def cache(self, 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, _ts=datetime.strftime(datetime.now(), '%Y%m%d')): """ diff --git a/app/scheduler.py b/app/scheduler.py index 2225bff5..d73bfa75 100644 --- a/app/scheduler.py +++ b/app/scheduler.py @@ -167,7 +167,7 @@ class Scheduler(metaclass=Singleton): # 创建定时服务 self._scheduler = BackgroundScheduler(timezone=settings.TZ, executors={ - 'default': ThreadPoolExecutor(settings.CONF['scheduler']) + 'default': ThreadPoolExecutor(settings.CONF.scheduler) }) # CookieCloud定时同步 @@ -324,7 +324,7 @@ class Scheduler(metaclass=Singleton): "interval", id="clear_cache", name="缓存清理", - hours=settings.CONF["meta"] / 3600, + hours=settings.CONF.meta / 3600, kwargs={ 'job_id': 'clear_cache' }