diff --git a/README.md b/README.md index af30a3ba..ed9cc186 100644 --- a/README.md +++ b/README.md @@ -13,11 +13,9 @@ # 如何开始 -- **[部署说明 (Official)](https://github.com/EstrellaXD/Auto_Bangumi/blob/main/docs/部署说明.md)** +- **[部署说明 (Official)](https://github.com/EstrellaXD/Auto_Bangumi/wiki)** - **[部署说明 (手把手)](https://www.himiku.com/archives/auto-bangumi.html)** -- **[常见问题排错](https://github.com/EstrellaXD/Auto_Bangumi/blob/main/docs/常见错误解决.md)** - # 项目说明

@@ -82,9 +80,13 @@ - 更为智能细致的分类预设。 # 声明 +## 致谢 感谢 [Sean](https://github.com/findix) 提供的大量帮助 -# Licence +## 请我喝一杯咖啡 + + +## Licence [MIT licence](https://github.com/EstrellaXD/Auto_Bangumi/blob/main/LICENSE) diff --git a/auto_bangumi/ab_decorator/__init__.py b/auto_bangumi/ab_decorator/__init__.py index b2d8c691..c6738b3a 100644 --- a/auto_bangumi/ab_decorator/__init__.py +++ b/auto_bangumi/ab_decorator/__init__.py @@ -21,3 +21,14 @@ def qb_connect_failed_wait(func): time.sleep(300) times += 1 return wrapper + + +def api_failed(func): + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except Exception as e: + logger.debug(f"URL: {args[0]}") + logger.warning("Wrong API response.") + logger.debug(e) + return wrapper diff --git a/auto_bangumi/api.py b/auto_bangumi/api.py index 8a8d0306..a574ad02 100644 --- a/auto_bangumi/api.py +++ b/auto_bangumi/api.py @@ -8,12 +8,24 @@ from fastapi.templating import Jinja2Templates from pydantic import BaseModel import logging -from core import RSSAnalyser, DownloadClient, FullSeasonGet +from core import APIProcess from conf import settings, parse from utils import json_config logger = logging.getLogger(__name__) +args = parse() +if args.debug: + try: + from conf.const_dev import DEV_SETTINGS + + settings.init(DEV_SETTINGS) + except ModuleNotFoundError: + logger.debug("Please copy `const_dev.py` to `const_dev.py` to use custom settings") +else: + settings.init() app = FastAPI() +api_func = APIProcess() + # templates = Jinja2Templates(directory="templates") @@ -38,45 +50,26 @@ async def get_log(): @app.get("/api/v1/resetRule") def reset_rule(): - data = json_config.load(settings.info_path) - data["bangumi_info"] = [] - json_config.save(settings.info_path, data) - return "Success" + return api_func.reset_rule() @app.get("api/v1/removeRule/{name}") def remove_rule(name: str): - datas = json_config.load(settings.info_path)["bangumi_info"] - for data in datas: - if re.search(name.name.lower(), data["title_raw"].lower()) is not None: - datas.remove(data) - json_config.save(settings.info_path, datas) - return "Success" - return "Not matched" + return api_func.remove_rule(name) -@app.get("/api/v1/collection/{link}") -async def receive(link: str): - client = DownloadClient() - try: - data = RSSAnalyser().rss_to_data(link.link) - FullSeasonGet().download_collection(data, link.link, client) - return data - except Exception as e: - logger.debug(e) - return "Error" +class RssLink(BaseModel): + rss_link: str -@app.get("/api/v1/subscribe/{link}") -async def add_link(link: str): - client = DownloadClient() - try: - data = RSSAnalyser().rss_to_data(link.link) - client.set_rule(data, link.link) - return data - except Exception as e: - logger.debug(e) - return "Error" +@app.post("/api/v1/collection") +async def collection(link: RssLink): + return api_func.download_collection(link.rss_link) + + +@app.post("/api/v1/subscribe") +async def subscribe(link: RssLink): + return api_func.add_subscribe(link.rss_link) class AddRule(BaseModel): @@ -86,19 +79,10 @@ class AddRule(BaseModel): @app.post("/api/v1/addRule") async def add_rule(info: AddRule): - return "Not complete" + return api_func.add_rule(info.title, info.season) def run(): - args = parse() - if args.debug: - try: - from conf.const_dev import DEV_SETTINGS - settings.init(DEV_SETTINGS) - except ModuleNotFoundError: - logger.debug("Please copy `const_dev.py` to `const_dev.py` to use custom settings") - else: - settings.init() LOGGING_CONFIG["formatters"]["default"]["fmt"] = "[%(asctime)s] %(levelprefix)s %(message)s" uvicorn.run(app, host="0.0.0.0", port=settings.webui_port) diff --git a/auto_bangumi/conf/const.py b/auto_bangumi/conf/const.py index 7905cd85..6f97d08b 100644 --- a/auto_bangumi/conf/const.py +++ b/auto_bangumi/conf/const.py @@ -1,7 +1,7 @@ # -*- encoding: utf-8 -*- DEFAULT_SETTINGS = { - "version": "2.5.9", + "version": "2.5.10", "data_version": 4.0, "host_ip": "localhost:8080", "sleep_time": 7200, diff --git a/auto_bangumi/core/__init__.py b/auto_bangumi/core/__init__.py index a364fcf9..4ba677f3 100644 --- a/auto_bangumi/core/__init__.py +++ b/auto_bangumi/core/__init__.py @@ -1,4 +1,5 @@ from .download_client import DownloadClient from .eps_complete import FullSeasonGet from .renamer import Renamer -from .rss_analyser import RSSAnalyser \ No newline at end of file +from .rss_analyser import RSSAnalyser +from .api_func import APIProcess diff --git a/auto_bangumi/core/api_func.py b/auto_bangumi/core/api_func.py new file mode 100644 index 00000000..00b4badd --- /dev/null +++ b/auto_bangumi/core/api_func.py @@ -0,0 +1,72 @@ +import re + +from core import FullSeasonGet, DownloadClient, RSSAnalyser +from utils import json_config +from conf import settings + +from ab_decorator import api_failed + + +class APIProcess: + def __init__(self): + self._rss_analyser = RSSAnalyser() + self._download_client = DownloadClient() + self._full_season_get = FullSeasonGet() + + def link_process(self, link): + data = self._rss_analyser.rss_to_data(link) + return data + + @api_failed + def download_collection(self, link): + data = self.link_process(link) + self._full_season_get.download_collection(data, link, self._download_client) + return data + + @api_failed + def add_subscribe(self, link): + data = self.link_process(link) + self._download_client.add_rss_feed(link, data.get("official_title")) + self._download_client.set_rule(data, link) + return data + + @staticmethod + def reset_rule(): + data = json_config.load(settings.info_path) + data["bangumi_info"] = [] + json_config.save(settings.info_path, data) + return "Success" + + @staticmethod + def remove_rule(name): + datas = json_config.load(settings.info_path)["bangumi_info"] + for data in datas: + if re.search(name.lower(), data["title_raw"].lower()) is not None: + datas.remove(data) + json_config.save(settings.info_path, datas) + return "Success" + return "Not matched" + + @staticmethod + def add_rule(title, season): + data = json_config.load(settings.info_path) + extra_data = { + "official_title": title, + "title_raw": title, + "season": season, + "season_raw": "", + "dpi": "", + "group": "", + "eps_complete": False, + "added": False, + } + data["bangumi_info"].append(extra_data) + json_config.save(settings.info_path, data) + return "Success" + + +if __name__ == '__main__': + from conf.const_dev import DEV_SETTINGS + settings.init(DEV_SETTINGS) + API = APIProcess() + API.add_subscribe("http://dmhy.org/topics/rss/rss.xml?keyword=彻夜之歌+星空+简") \ No newline at end of file diff --git a/auto_bangumi/core/download_client.py b/auto_bangumi/core/download_client.py index 3540064a..e64d94d9 100644 --- a/auto_bangumi/core/download_client.py +++ b/auto_bangumi/core/download_client.py @@ -109,6 +109,9 @@ class DownloadClient: new_location=location ) + def add_rss_feed(self, rss_link, item_path): + self.client.rss_add_feed(url=rss_link, item_path=item_path) + logger.info("Add RSS Feed successfully.") if __name__ == "__main__": put = DownloadClient()