diff --git a/app/api/endpoints/subscribe.py b/app/api/endpoints/subscribe.py index 6e884574..883c4a48 100644 --- a/app/api/endpoints/subscribe.py +++ b/app/api/endpoints/subscribe.py @@ -560,6 +560,15 @@ def popular_subscribes( return SubscribeHelper().get_shares(name=name, page=page, count=count) +@router.get("/share/statistics", summary="查询订阅分享统计", response_model=List[schemas.SubscribeShareStatistics]) +def subscribe_share_statistics(_: schemas.TokenPayload = Depends(verify_token)) -> Any: + """ + 查询订阅分享统计 + 返回每个分享人分享的媒体数量以及总的复用人次 + """ + return SubscribeHelper().get_share_statistics() + + @router.get("/{subscribe_id}", summary="订阅详情", response_model=schemas.Subscribe) def read_subscribe( subscribe_id: int, diff --git a/app/helper/subscribe.py b/app/helper/subscribe.py index 682378d7..2eee526a 100644 --- a/app/helper/subscribe.py +++ b/app/helper/subscribe.py @@ -29,6 +29,8 @@ class SubscribeHelper(metaclass=WeakSingleton): _sub_shares = f"{settings.MP_SERVER_HOST}/subscribe/shares" + _sub_share_statistic = f"{settings.MP_SERVER_HOST}/subscribe/share/statistic" + _sub_fork = f"{settings.MP_SERVER_HOST}/subscribe/fork/%s" _shares_cache_region = "subscribe_share" @@ -215,6 +217,18 @@ class SubscribeHelper(metaclass=WeakSingleton): return res.json() return [] + @cached(maxsize=1, ttl=1800) + def get_share_statistics(self) -> List[dict]: + """ + 获取订阅分享统计数据 + """ + if not settings.SUBSCRIBE_STATISTIC_SHARE: + return [] + res = RequestUtils(proxies=settings.PROXY, timeout=15).get_res(self._sub_share_statistic) + if res and res.status_code == 200: + return res.json() + return [] + def get_user_uuid(self) -> str: """ 获取用户uuid diff --git a/app/schemas/subscribe.py b/app/schemas/subscribe.py index 2129ee58..f482e9cc 100644 --- a/app/schemas/subscribe.py +++ b/app/schemas/subscribe.py @@ -138,6 +138,15 @@ class SubscribeShare(BaseModel): count: Optional[int] = 0 +class SubscribeShareStatistics(BaseModel): + # 分享人 + share_user: Optional[str] = None + # 分享数量 + share_count: Optional[int] = 0 + # 总复用人次 + total_reuse_count: Optional[int] = 0 + + class SubscribeDownloadFileInfo(BaseModel): # 种子名称 torrent_title: Optional[str] = None