feat(recommend): add semaphore to limit concurrent requests

This commit is contained in:
InfinityPacer
2024-12-23 02:51:23 +08:00
parent 6fec16d78a
commit 33de1c3618
2 changed files with 58 additions and 46 deletions
+23 -17
View File
@@ -1,3 +1,4 @@
import asyncio
from typing import Any, List, Dict from typing import Any, List, Dict
from fastapi import APIRouter, Depends 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="未找到播放地址") return schemas.Response(success=False, message="未找到播放地址")
# 控制最大并发数
semaphore = asyncio.Semaphore(10)
@router.get("/exists", summary="查询本地是否存在(数据库)", response_model=schemas.Response) @router.get("/exists", summary="查询本地是否存在(数据库)", response_model=schemas.Response)
def exists_local(title: str = None, async def exists_local(title: str = None,
year: int = None, year: int = None,
mtype: str = None, mtype: str = None,
tmdbid: int = None, tmdbid: int = None,
@@ -53,22 +58,23 @@ def exists_local(title: str = None,
""" """
判断本地是否存在 判断本地是否存在
""" """
meta = MetaInfo(title) async with semaphore:
if not season: meta = MetaInfo(title)
season = meta.begin_season if not season:
# 返回对象 season = meta.begin_season
ret_info = {} # 返回对象
# 本地数据库是否存在 ret_info = {}
exist: MediaServerItem = MediaServerOper(db).exists( # 本地数据库是否存在
title=meta.name, year=year, mtype=mtype, tmdbid=tmdbid, season=season exist: MediaServerItem = MediaServerOper(db).exists(
) title=meta.name, year=year, mtype=mtype, tmdbid=tmdbid, season=season
if exist: )
ret_info = { if exist:
"id": exist.item_id ret_info = {
} "id": exist.item_id
return schemas.Response(success=True if exist else False, data={ }
"item": ret_info return schemas.Response(success=True if exist else False, data={
}) "item": ret_info
})
@router.post("/exists_remote", summary="查询已存在的剧集信息(媒体服务器)", response_model=Dict[int, list]) @router.post("/exists_remote", summary="查询已存在的剧集信息(媒体服务器)", response_model=Dict[int, list])
+35 -29
View File
@@ -1,3 +1,4 @@
import asyncio
from typing import List, Any from typing import List, Any
import cn2an import cn2an
@@ -146,8 +147,12 @@ def update_subscribe_status(
return schemas.Response(success=True) return schemas.Response(success=True)
# 控制最大并发数
semaphore = asyncio.Semaphore(10)
@router.get("/media/{mediaid}", summary="查询订阅", response_model=schemas.Subscribe) @router.get("/media/{mediaid}", summary="查询订阅", response_model=schemas.Subscribe)
def subscribe_mediaid( async def subscribe_mediaid(
mediaid: str, mediaid: str,
season: int = None, season: int = None,
title: str = None, title: str = None,
@@ -156,35 +161,36 @@ def subscribe_mediaid(
""" """
根据 TMDBID/豆瓣ID/BangumiId 查询订阅 tmdb:/douban: 根据 TMDBID/豆瓣ID/BangumiId 查询订阅 tmdb:/douban:
""" """
result = None async with semaphore:
title_check = False result = None
if mediaid.startswith("tmdb:"): title_check = False
tmdbid = mediaid[5:] if mediaid.startswith("tmdb:"):
if not tmdbid or not str(tmdbid).isdigit(): tmdbid = mediaid[5:]
return Subscribe() if not tmdbid or not str(tmdbid).isdigit():
result = Subscribe.exists(db, tmdbid=int(tmdbid), season=season) return Subscribe()
elif mediaid.startswith("douban:"): result = Subscribe.exists(db, tmdbid=int(tmdbid), season=season)
doubanid = mediaid[7:] elif mediaid.startswith("douban:"):
if not doubanid: doubanid = mediaid[7:]
return Subscribe() if not doubanid:
result = Subscribe.get_by_doubanid(db, doubanid) return Subscribe()
if not result and title: result = Subscribe.get_by_doubanid(db, doubanid)
title_check = True if not result and title:
elif mediaid.startswith("bangumi:"): title_check = True
bangumiid = mediaid[8:] elif mediaid.startswith("bangumi:"):
if not bangumiid or not str(bangumiid).isdigit(): bangumiid = mediaid[8:]
return Subscribe() if not bangumiid or not str(bangumiid).isdigit():
result = Subscribe.get_by_bangumiid(db, int(bangumiid)) return Subscribe()
if not result and title: result = Subscribe.get_by_bangumiid(db, int(bangumiid))
title_check = True if not result and title:
# 使用名称检查订阅 title_check = True
if title_check and title: # 使用名称检查订阅
meta = MetaInfo(title) if title_check and title:
if season: meta = MetaInfo(title)
meta.begin_season = season if season:
result = Subscribe.get_by_title(db, title=meta.name, season=meta.begin_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) @router.get("/refresh", summary="刷新订阅", response_model=schemas.Response)