From 4dcefb141a6d1958e36156155d0b1f8a89aafcc5 Mon Sep 17 00:00:00 2001 From: thsrite Date: Mon, 8 Jan 2024 13:05:48 +0800 Subject: [PATCH] fix #907 --- app/api/endpoints/dashboard.py | 13 +------------ app/chain/dashboard.py | 35 ++++++++++++++++++++++++++++++++-- app/db/mediaserver_oper.py | 6 ++++++ app/db/models/mediaserver.py | 8 ++++++++ 4 files changed, 48 insertions(+), 14 deletions(-) diff --git a/app/api/endpoints/dashboard.py b/app/api/endpoints/dashboard.py index ce437d37..35f81317 100644 --- a/app/api/endpoints/dashboard.py +++ b/app/api/endpoints/dashboard.py @@ -20,18 +20,7 @@ def statistic(_: schemas.TokenPayload = Depends(verify_token)) -> Any: """ 查询媒体数量统计信息 """ - media_statistics: Optional[List[schemas.Statistic]] = DashboardChain().media_statistic() - if media_statistics: - # 汇总各媒体库统计信息 - ret_statistic = schemas.Statistic() - for media_statistic in media_statistics: - ret_statistic.movie_count += media_statistic.movie_count - ret_statistic.tv_count += media_statistic.tv_count - ret_statistic.episode_count += media_statistic.episode_count - ret_statistic.user_count += media_statistic.user_count - return ret_statistic - else: - return schemas.Statistic() + return DashboardChain().media_statistic() @router.get("/statistic2", summary="媒体数量统计(API_TOKEN)", response_model=schemas.Statistic) diff --git a/app/chain/dashboard.py b/app/chain/dashboard.py index 35258a90..0aff73f6 100644 --- a/app/chain/dashboard.py +++ b/app/chain/dashboard.py @@ -1,19 +1,50 @@ +import json from typing import Optional, List from app import schemas from app.chain import ChainBase +from app.db.mediaserver_oper import MediaServerOper from app.utils.singleton import Singleton class DashboardChain(ChainBase, metaclass=Singleton): + + def __init__(self): + super().__init__() + self.dboper = MediaServerOper() + """ 各类仪表板统计处理链 """ - def media_statistic(self) -> Optional[List[schemas.Statistic]]: + + def media_statistic(self) -> Optional[schemas.Statistic]: """ 媒体数量统计 """ - return self.run_module("media_statistic") + ret_statistic = schemas.Statistic() + media_statistics = self.run_module("media_statistic") + if media_statistics: + # 汇总各媒体库统计信息 + for media_statistic in media_statistics: + ret_statistic.user_count += media_statistic.user_count + # 电影数量 + movies = self.dboper.list_by_type(mtype="电影") or [] + ret_statistic.movie_count = len(movies) + # 电视剧数量 + series = self.dboper.list_by_type(mtype="电视剧") or [] + if series: + ret_statistic.tv_count = len(series) + # 剧集数量 + for tv in series: + seasoninfo = tv.seasoninfo + if seasoninfo: + if not isinstance(seasoninfo, dict): + seasoninfo = json.loads(seasoninfo) + if seasoninfo.keys(): + for season in seasoninfo.keys(): + episodes = seasoninfo.get(season) or [] + ret_statistic.episode_count += len(episodes) + return ret_statistic def downloader_info(self) -> schemas.DownloaderInfo: """ diff --git a/app/db/mediaserver_oper.py b/app/db/mediaserver_oper.py index d22e4504..f0a7eb41 100644 --- a/app/db/mediaserver_oper.py +++ b/app/db/mediaserver_oper.py @@ -65,3 +65,9 @@ class MediaServerOper(DbOper): if not item: return None return str(item.item_id) + + def list_by_type(self, mtype: str = None): + """ + 获取指定类型的媒体服务器数据 + """ + return MediaServerItem.list_by_type(self._db, mtype=mtype) diff --git a/app/db/models/mediaserver.py b/app/db/models/mediaserver.py index 1690bc04..f4fce7ac 100644 --- a/app/db/models/mediaserver.py +++ b/app/db/models/mediaserver.py @@ -66,3 +66,11 @@ class MediaServerItem(Base): return db.query(MediaServerItem).filter(MediaServerItem.title == title, MediaServerItem.item_type == mtype, MediaServerItem.year == str(year)).first() + + @staticmethod + @db_query + def list_by_type(db: Session, mtype: str = None): + if mtype: + return db.query(MediaServerItem).filter(MediaServerItem.item_type == mtype).all() + else: + return db.query(MediaServerItem).all()