diff --git a/app/api/endpoints/site.py b/app/api/endpoints/site.py index f1e22f94..fa2b5b0e 100644 --- a/app/api/endpoints/site.py +++ b/app/api/endpoints/site.py @@ -5,10 +5,12 @@ from sqlalchemy.orm import Session from app import schemas from app.chain.cookiecloud import CookieCloudChain +from app.chain.search import SearchChain from app.chain.site import SiteChain from app.core.security import verify_token from app.db import get_db from app.db.models.site import Site +from app.db.models.siteicon import SiteIcon from app.db.siteicon_oper import SiteIconOper router = APIRouter() @@ -85,7 +87,7 @@ async def cookie_cloud_sync(_: schemas.TokenPayload = Depends(verify_token)) -> return schemas.Response(success=True, message="同步成功!") -@router.get("/cookie", summary="更新站点Cookie&UA", response_model=schemas.Response) +@router.get("/cookie/{site_id}", summary="更新站点Cookie&UA", response_model=schemas.Response) async def update_cookie( site_id: int, username: str, @@ -112,23 +114,58 @@ async def update_cookie( return schemas.Response(success=True, message=msg) -@router.get("/test", summary="连接测试", response_model=schemas.Response) -async def test_site(domain: str, _: schemas.TokenPayload = Depends(verify_token)) -> Any: +@router.get("/test/{site_id}", summary="连接测试", response_model=schemas.Response) +async def test_site(site_id: int, + db: Session = Depends(get_db), + _: schemas.TokenPayload = Depends(verify_token)) -> Any: """ 测试站点是否可用 """ - status, message = SiteChain().test(domain) + site = Site.get(db, site_id) + if not site: + raise HTTPException( + status_code=404, + detail=f"站点 {site_id} 不存在", + ) + status, message = SiteChain().test(site.domain) return schemas.Response(success=status, message=message) -@router.get("/icon", summary="站点图标", response_model=schemas.Response) -async def site_icon(domain: str, _: schemas.TokenPayload = Depends(verify_token)) -> Any: +@router.get("/icon/{site_id}", summary="站点图标", response_model=schemas.Response) +async def site_icon(site_id: int, + db: Session = Depends(get_db), + _: schemas.TokenPayload = Depends(verify_token)) -> Any: """ 获取站点图标:base64或者url """ - icon = SiteIconOper().get_by_domain(domain) + site = Site.get(db, site_id) + if not site: + raise HTTPException( + status_code=404, + detail=f"站点 {site_id} 不存在", + ) + icon = SiteIcon.get_by_domain(db, site.domain) if not icon: return schemas.Response(success=False, message="站点图标不存在!") return schemas.Response(success=True, data={ "icon": icon.base64 if icon.base64 else icon.url }) + + +@router.get("/resource/{site_id}", summary="站点资源", response_model=List[schemas.TorrentInfo]) +async def site_resource(site_id: int, keyword: str = None, + db: Session = Depends(get_db), + _: schemas.TokenPayload = Depends(verify_token)) -> Any: + """ + 浏览站点资源 + """ + site = Site.get(db, site_id) + if not site: + raise HTTPException( + status_code=404, + detail=f"站点 {site_id} 不存在", + ) + torrents = SearchChain().browse(site.domain, keyword) + if not torrents: + return [] + return [torrent.to_dict() for torrent in torrents] diff --git a/app/chain/__init__.py b/app/chain/__init__.py index 34a86526..dcd2bd36 100644 --- a/app/chain/__init__.py +++ b/app/chain/__init__.py @@ -148,12 +148,13 @@ class ChainBase(AbstractSingleton, metaclass=Singleton): """ return self.run_module("search_medias", meta=meta) - def search_torrents(self, mediainfo: Optional[MediaInfo], site: CommentedMap, + def search_torrents(self, site: CommentedMap, + mediainfo: Optional[MediaInfo] = None, keyword: str = None) -> List[TorrentInfo]: """ 搜索一个站点的种子资源 - :param mediainfo: 识别的媒体信息 :param site: 站点 + :param mediainfo: 识别的媒体信息 :param keyword: 搜索关键词,如有按关键词搜索,否则按媒体信息名称搜索 :reutrn: 资源列表 """ diff --git a/app/chain/search.py b/app/chain/search.py index fbc9778b..7c545099 100644 --- a/app/chain/search.py +++ b/app/chain/search.py @@ -41,11 +41,28 @@ class SearchChain(ChainBase): def search_by_title(self, title: str) -> List[TorrentInfo]: """ 根据标题搜索资源,不识别不过滤,直接返回站点内容 + :param title: 标题,为空时返回所有站点首页内容 """ logger.info(f'开始搜索资源,关键词:{title} ...') # 搜索 return self.__search_all_sites(keyword=title) + def browse(self, domain: str, keyword: str = None) -> List[TorrentInfo]: + """ + 浏览站点首页内容 + :param domain: 站点域名 + :param keyword: 关键词,有值时为搜索 + """ + if not keyword: + logger.info(f'开始浏览站点首页内容,站点:{domain} ...') + else: + logger.info(f'开始搜索资源,关键词:{keyword},站点:{domain} ...') + site = self.siteshelper.get_indexer(domain) + if not site: + logger.error(f'站点 {domain} 不存在!') + return [] + return self.search_torrents(site=site, keyword=keyword) + def process(self, mediainfo: MediaInfo, keyword: str = None, no_exists: Dict[int, Dict[int, NotExistMediaInfo]] = None) -> Optional[List[Context]]: diff --git a/app/helper/sites.cp310-win_amd64.pyd b/app/helper/sites.cp310-win_amd64.pyd index fd886595..a6c5c3ae 100644 Binary files a/app/helper/sites.cp310-win_amd64.pyd and b/app/helper/sites.cp310-win_amd64.pyd differ diff --git a/app/helper/sites.cpython-310-darwin.so b/app/helper/sites.cpython-310-darwin.so index 7cf37b50..5d0ee184 100755 Binary files a/app/helper/sites.cpython-310-darwin.so and b/app/helper/sites.cpython-310-darwin.so differ diff --git a/app/helper/sites.cpython-310-x86_64-linux-gnu.so b/app/helper/sites.cpython-310-x86_64-linux-gnu.so index bb65511a..5e524bb7 100644 Binary files a/app/helper/sites.cpython-310-x86_64-linux-gnu.so and b/app/helper/sites.cpython-310-x86_64-linux-gnu.so differ