mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 07:27:15 +08:00
add SystemConfModel
This commit is contained in:
@@ -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
@@ -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):
|
||||||
|
|||||||
@@ -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):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -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 = {}
|
||||||
|
|||||||
@@ -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请求
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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]:
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -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
@@ -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'
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user