From 33de1c36189127bc664816ae6557b83926e51c76 Mon Sep 17 00:00:00 2001 From: InfinityPacer <160988576+InfinityPacer@users.noreply.github.com> Date: Mon, 23 Dec 2024 02:51:23 +0800 Subject: [PATCH] feat(recommend): add semaphore to limit concurrent requests --- app/api/endpoints/mediaserver.py | 40 +++++++++++--------- app/api/endpoints/subscribe.py | 64 +++++++++++++++++--------------- 2 files changed, 58 insertions(+), 46 deletions(-) diff --git a/app/api/endpoints/mediaserver.py b/app/api/endpoints/mediaserver.py index 1f1e90b8..fbfa7909 100644 --- a/app/api/endpoints/mediaserver.py +++ b/app/api/endpoints/mediaserver.py @@ -1,3 +1,4 @@ +import asyncio from typing import Any, List, Dict from fastapi import APIRouter, Depends @@ -42,8 +43,12 @@ def play_item(itemid: str, _: schemas.TokenPayload = Depends(verify_token)) -> s return schemas.Response(success=False, message="未找到播放地址") +# 控制最大并发数 +semaphore = asyncio.Semaphore(10) + + @router.get("/exists", summary="查询本地是否存在(数据库)", response_model=schemas.Response) -def exists_local(title: str = None, +async def exists_local(title: str = None, year: int = None, mtype: str = None, tmdbid: int = None, @@ -53,22 +58,23 @@ def exists_local(title: str = None, """ 判断本地是否存在 """ - meta = MetaInfo(title) - if not season: - season = meta.begin_season - # 返回对象 - ret_info = {} - # 本地数据库是否存在 - exist: MediaServerItem = MediaServerOper(db).exists( - title=meta.name, year=year, mtype=mtype, tmdbid=tmdbid, season=season - ) - if exist: - ret_info = { - "id": exist.item_id - } - return schemas.Response(success=True if exist else False, data={ - "item": ret_info - }) + async with semaphore: + meta = MetaInfo(title) + if not season: + season = meta.begin_season + # 返回对象 + ret_info = {} + # 本地数据库是否存在 + exist: MediaServerItem = MediaServerOper(db).exists( + title=meta.name, year=year, mtype=mtype, tmdbid=tmdbid, season=season + ) + if exist: + ret_info = { + "id": exist.item_id + } + return schemas.Response(success=True if exist else False, data={ + "item": ret_info + }) @router.post("/exists_remote", summary="查询已存在的剧集信息(媒体服务器)", response_model=Dict[int, list]) diff --git a/app/api/endpoints/subscribe.py b/app/api/endpoints/subscribe.py index b19c36bf..69df8b90 100644 --- a/app/api/endpoints/subscribe.py +++ b/app/api/endpoints/subscribe.py @@ -1,3 +1,4 @@ +import asyncio from typing import List, Any import cn2an @@ -146,8 +147,12 @@ def update_subscribe_status( return schemas.Response(success=True) +# 控制最大并发数 +semaphore = asyncio.Semaphore(10) + + @router.get("/media/{mediaid}", summary="查询订阅", response_model=schemas.Subscribe) -def subscribe_mediaid( +async def subscribe_mediaid( mediaid: str, season: int = None, title: str = None, @@ -156,35 +161,36 @@ def subscribe_mediaid( """ 根据 TMDBID/豆瓣ID/BangumiId 查询订阅 tmdb:/douban: """ - result = None - title_check = False - if mediaid.startswith("tmdb:"): - tmdbid = mediaid[5:] - if not tmdbid or not str(tmdbid).isdigit(): - return Subscribe() - result = Subscribe.exists(db, tmdbid=int(tmdbid), season=season) - elif mediaid.startswith("douban:"): - doubanid = mediaid[7:] - if not doubanid: - return Subscribe() - result = Subscribe.get_by_doubanid(db, doubanid) - if not result and title: - title_check = True - elif mediaid.startswith("bangumi:"): - bangumiid = mediaid[8:] - if not bangumiid or not str(bangumiid).isdigit(): - return Subscribe() - result = Subscribe.get_by_bangumiid(db, int(bangumiid)) - if not result and title: - title_check = True - # 使用名称检查订阅 - if title_check and title: - meta = MetaInfo(title) - if season: - meta.begin_season = season - result = Subscribe.get_by_title(db, title=meta.name, season=meta.begin_season) + async with semaphore: + result = None + title_check = False + if mediaid.startswith("tmdb:"): + tmdbid = mediaid[5:] + if not tmdbid or not str(tmdbid).isdigit(): + return Subscribe() + result = Subscribe.exists(db, tmdbid=int(tmdbid), season=season) + elif mediaid.startswith("douban:"): + doubanid = mediaid[7:] + if not doubanid: + return Subscribe() + result = Subscribe.get_by_doubanid(db, doubanid) + if not result and title: + title_check = True + elif mediaid.startswith("bangumi:"): + bangumiid = mediaid[8:] + if not bangumiid or not str(bangumiid).isdigit(): + return Subscribe() + result = Subscribe.get_by_bangumiid(db, int(bangumiid)) + if not result and title: + title_check = True + # 使用名称检查订阅 + if title_check and title: + meta = MetaInfo(title) + if season: + meta.begin_season = season + result = Subscribe.get_by_title(db, title=meta.name, season=meta.begin_season) - return result if result else Subscribe() + return result if result else Subscribe() @router.get("/refresh", summary="刷新订阅", response_model=schemas.Response)