diff --git a/backend/src/module/api/bangumi.py b/backend/src/module/api/bangumi.py index 48943fbf..c09792b1 100644 --- a/backend/src/module/api/bangumi.py +++ b/backend/src/module/api/bangumi.py @@ -1,6 +1,8 @@ from fastapi import APIRouter, Depends from fastapi.responses import JSONResponse +from .response import u_response + from module.manager import TorrentManager from module.models import Bangumi, BangumiUpdate from module.security.api import get_current_user, UNAUTHORIZED @@ -13,7 +15,8 @@ async def get_all_data(current_user=Depends(get_current_user)): if not current_user: raise UNAUTHORIZED with TorrentManager() as manager: - return manager.bangumi.search_all() + resp = manager.bangumi.search_all() + return u_response(resp) @router.get("/get/{bangumi_id}", response_model=Bangumi) @@ -21,7 +24,8 @@ async def get_data(bangumi_id: str, current_user=Depends(get_current_user)): if not current_user: raise UNAUTHORIZED with TorrentManager() as manager: - return manager.search_one(bangumi_id) + resp = manager.search_one(bangumi_id) + return u_response(resp) @router.patch("/update/{bangumi_id}") @@ -31,7 +35,8 @@ async def update_rule( if not current_user: raise UNAUTHORIZED with TorrentManager() as manager: - return manager.update_rule(bangumi_id, data) + resp = manager.update_rule(bangumi_id, data) + return u_response(resp) @router.delete("/delete/{bangumi_id}") @@ -41,7 +46,8 @@ async def delete_rule( if not current_user: raise UNAUTHORIZED with TorrentManager() as manager: - return manager.delete_rule(bangumi_id, file) + resp = manager.delete_rule(bangumi_id, file) + return u_response(resp) @router.delete("/disable/{bangumi_id}") diff --git a/backend/src/module/api/response.py b/backend/src/module/api/response.py index 6b8eb367..00365a7e 100644 --- a/backend/src/module/api/response.py +++ b/backend/src/module/api/response.py @@ -3,7 +3,7 @@ from fastapi.responses import JSONResponse from module.models.response import ResponseModel -def universal_response(response_model: ResponseModel): +def u_response(response_model: ResponseModel): return JSONResponse( status_code=response_model.status_code, content={ diff --git a/backend/src/module/database/bangumi.py b/backend/src/module/database/bangumi.py index 017b3b5f..3417c1cd 100644 --- a/backend/src/module/database/bangumi.py +++ b/backend/src/module/database/bangumi.py @@ -18,9 +18,9 @@ class BangumiDatabase: self.session.commit() logger.debug(f"[Database] Insert {data.official_title} into database.") - def add_all(self, data: list[Bangumi]): - self.session.add_all(data) - logger.debug(f"[Database] Insert {len(data)} bangumi into database.") + def add_all(self, datas: list[Bangumi]): + self.session.add_all(datas) + logger.debug(f"[Database] Insert {len(datas)} bangumi into database.") def update(self, data: Bangumi) -> bool: db_data = self.session.get(Bangumi, data.id) diff --git a/backend/src/module/database/rss.py b/backend/src/module/database/rss.py index 4d9087bc..cd28e3d9 100644 --- a/backend/src/module/database/rss.py +++ b/backend/src/module/database/rss.py @@ -1,6 +1,6 @@ import logging -from sqlmodel import Session, select, delete +from sqlmodel import Session, select, delete, and_ from module.models import RSSItem, RSSUpdate @@ -49,7 +49,9 @@ class RSSDatabase: return self.session.exec(select(RSSItem).where(RSSItem.enabled)).all() def search_combine(self) -> list[RSSItem]: - return self.session.exec(select(RSSItem).where(RSSItem.combine)).all() + return self.session.exec( + select(RSSItem).where(and_(RSSItem.combine, RSSItem.enabled)) + ).all() def delete(self, _id: int): condition = delete(RSSItem).where(RSSItem.id == _id) diff --git a/backend/src/module/manager/torrent.py b/backend/src/module/manager/torrent.py index 6492bb41..81411c88 100644 --- a/backend/src/module/manager/torrent.py +++ b/backend/src/module/manager/torrent.py @@ -4,7 +4,7 @@ from fastapi.responses import JSONResponse from module.database import Database from module.downloader import DownloadClient -from module.models import Bangumi, BangumiUpdate +from module.models import Bangumi, BangumiUpdate, ResponseModel logger = logging.getLogger(__name__) @@ -23,9 +23,19 @@ class TorrentManager(Database): if hash_list: client.delete_torrent(hash_list) logger.info(f"Delete rule and torrents for {data.official_title}") - return f"Delete {data.official_title} torrents." + return ResponseModel( + status_code=200, + status=True, + msg_en=f"Delete rule and torrents for {data.official_title}", + msg_zh=f"删除 {data.official_title} 规则和种子", + ) else: - return f"Can't find {data.official_title} torrents." + return ResponseModel( + status_code=406, + status=False, + msg_en=f"Can't find torrents for {data.official_title}", + msg_zh=f"无法找到 {data.official_title} 的种子", + ) def delete_rule(self, _id: int | str, file: bool = False): data = self.bangumi.search_id(int(_id)) @@ -37,20 +47,20 @@ class TorrentManager(Database): self.bangumi.delete_one(int(_id)) if file: torrent_message = self.delete_torrents(data, client) - return JSONResponse( - status_code=200, - content={ - "msg": f"Delete {data.official_title} rule. {torrent_message}" - }, - ) + return torrent_message logger.info(f"[Manager] Delete rule for {data.official_title}") - return JSONResponse( + return ResponseModel( status_code=200, - content={"msg": f"Delete rule for {data.official_title}"}, + status=True, + msg_en=f"Delete rule for {data.official_title}", + msg_zh=f"删除 {data.official_title} 规则", ) else: - return JSONResponse( - status_code=406, content={"msg": f"Can't find id {_id}"} + return ResponseModel( + status_code=406, + status=False, + msg_en=f"Can't find id {_id}", + msg_zh=f"无法找到 id {_id}", ) def disable_rule(self, _id: str | int, file: bool = False): @@ -69,15 +79,18 @@ class TorrentManager(Database): }, ) logger.info(f"[Manager] Disable rule for {data.official_title}") - return JSONResponse( + return ResponseModel( status_code=200, - content={ - "msg": f"Disable {data.official_title} rule.", - }, + status=True, + msg_en=f"Disable rule for {data.official_title}", + msg_zh=f"禁用 {data.official_title} 规则", ) else: - return JSONResponse( - status_code=406, content={"msg": f"Can't find id {_id}"} + return ResponseModel( + status_code=406, + status=False, + msg_en=f"Can't find id {_id}", + msg_zh=f"无法找到 id {_id}", ) def enable_rule(self, _id: str | int): @@ -86,22 +99,30 @@ class TorrentManager(Database): data.deleted = False self.bangumi.update(data) logger.info(f"[Manager] Enable rule for {data.official_title}") - return JSONResponse( + return ResponseModel( status_code=200, - content={ - "msg": f"Enable {data.official_title} rule.", - }, + status=True, + msg_en=f"Enable rule for {data.official_title}", + msg_zh=f"启用 {data.official_title} 规则", ) else: - return JSONResponse( - status_code=406, content={"msg": f"Can't find bangumi id {_id}"} + return ResponseModel( + status_code=406, + status=False, + msg_en=f"Can't find id {_id}", + msg_zh=f"无法找到 id {_id}", ) def update_rule(self, bangumi_id, data: BangumiUpdate): old_data = self.bangumi.search_id(bangumi_id) if not old_data: logger.error(f"[Manager] Can't find data with {bangumi_id}") - return {"status": False, "msg": f"Can't find data with {bangumi_id}"} + return ResponseModel( + status_code=406, + status=False, + msg_en=f"Can't find data with {bangumi_id}", + msg_zh=f"无法找到 id {bangumi_id} 的数据", + ) else: # Move torrent match_list = self.__match_torrents_list(old_data.save_path) @@ -110,11 +131,11 @@ class TorrentManager(Database): if match_list: client.move_torrent(match_list, path) self.bangumi.update(data) - return JSONResponse( + return ResponseModel( status_code=200, - content={ - "msg": f"Set new path for {data.official_title}", - }, + status=True, + msg_en=f"Update rule for {data.official_title}", + msg_zh=f"更新 {data.official_title} 规则", ) def search_all_bangumi(self): diff --git a/backend/src/module/models/__init__.py b/backend/src/module/models/__init__.py index dc391533..a5578a5f 100644 --- a/backend/src/module/models/__init__.py +++ b/backend/src/module/models/__init__.py @@ -2,4 +2,5 @@ from .bangumi import Bangumi, Episode, BangumiUpdate, Notification from .config import Config from .rss import RSSItem, RSSUpdate from .torrent import EpisodeFile, SubtitleFile, Torrent, TorrentUpdate -from .user import UserLogin, User +from .user import UserLogin, User, UserUpdate +from .response import ResponseModel diff --git a/backend/src/module/models/torrent.py b/backend/src/module/models/torrent.py index 0d5f68be..57e818a3 100644 --- a/backend/src/module/models/torrent.py +++ b/backend/src/module/models/torrent.py @@ -10,7 +10,6 @@ class Torrent(SQLModel, table=True): name: str = Field("", alias="name") url: str = Field("https://example.com/torrent", alias="url") homepage: Optional[str] = Field(None, alias="homepage") - save_path: Optional[str] = Field(None, alias="saved_path") downloaded: bool = Field(False, alias="downloaded") diff --git a/backend/src/module/update/version_check.py b/backend/src/module/update/version_check.py new file mode 100644 index 00000000..7fbfc2b6 --- /dev/null +++ b/backend/src/module/update/version_check.py @@ -0,0 +1,11 @@ +from module.conf import VERSION + + +def version_check() -> bool: + with open("config/version.txt", "rw") as f: + version = f.read() + if VERSION > version: + f.write(VERSION) + return False + else: + return True