From 7ccee98e2e69ebe687aa489a2f90fb23fce9a1fa Mon Sep 17 00:00:00 2001 From: EstrellaXD Date: Tue, 29 Aug 2023 19:28:44 +0800 Subject: [PATCH] fix: bugs, add disable rss api. --- .github/workflows/build.yml | 33 +++++------ backend/src/module/api/program.py | 2 + backend/src/module/api/rss.py | 17 ++++++ backend/src/module/database/rss.py | 12 ++++ backend/src/module/models/config.py | 3 +- .../src/module/network/request_contents.py | 12 ++-- backend/src/module/rss/analyser.py | 2 +- backend/src/module/rss/engine.py | 7 +++ webui/src/api/rss.ts | 5 ++ webui/src/components/ab-rss-item.vue | 1 + webui/src/components/basic/ab-tag.vue | 2 +- webui/src/pages/index/rss.vue | 59 ++++++++++--------- webui/src/store/rss.ts | 5 ++ 13 files changed, 105 insertions(+), 55 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 700dc18c..a5009440 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -227,30 +227,25 @@ jobs: run: | cd webui && ls -al && tree && zip -r dist.zip dist - - name: Generate Release + - name: Generate Release info + id: release-info + run: | + if ${{ needs.version-info.outputs.dev == 1 }}; then + echo "version=🌙${{ needs.version-info.outputs.version }}" >> $GITHUB_OUTPUT + echo "pre_release=true" >> $GITHUB_OUTPUT + else + echo "version=🌟${{ needs.version-info.outputs.version }}" >> $GITHUB_OUTPUT + echo "pre_release=false" >> $GITHUB_OUTPUT + + - name: Release id: release - if: ${{ needs.version-info.outputs.dev != 1 }} uses: softprops/action-gh-release@v1 with: - tag_name: ${{ github.event.pull_request.title }} - name: 🌟${{ github.event.pull_request.title }} + tag_name: ${{ needs.version-info.outputs.version }} + name: ${{ steps.release-info.outputs.version }} body: ${{ github.event.pull_request.body }} draft: false - prerelease: false - files: | - webui/dist.zip - env: - GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }} - - - name: Generate dev Release - if: ${{ needs.version-info.outputs.dev == 1 }} - uses: softprops/action-gh-release@v1 - with: - tag_name: ${{ github.ref_name }} - name: 🌙${{ github.ref_name }} - body: "Dev release" - draft: false - prerelease: true + prerelease: ${{ steps.release-info.outputs.pre_release == 'true' }} files: | webui/dist.zip env: diff --git a/backend/src/module/api/program.py b/backend/src/module/api/program.py index 411cab58..8f679ad2 100644 --- a/backend/src/module/api/program.py +++ b/backend/src/module/api/program.py @@ -80,11 +80,13 @@ async def program_status(current_user=Depends(get_current_user)): return { "status": False, "version": VERSION, + "first_run": program.first_run, } else: return { "status": True, "version": VERSION, + "first_run": program.first_run, } diff --git a/backend/src/module/api/rss.py b/backend/src/module/api/rss.py index 2d0558a0..1cccfe3b 100644 --- a/backend/src/module/api/rss.py +++ b/backend/src/module/api/rss.py @@ -47,6 +47,23 @@ async def delete_rss(rss_id: int, current_user=Depends(get_current_user)): ) +@router.patch(path="/disable/{rss_id}", response_model=APIResponse) +async def disable_rss(rss_id: int, current_user=Depends(get_current_user)): + if not current_user: + raise UNAUTHORIZED + with RSSEngine() as engine: + if engine.rss.disable(rss_id): + return JSONResponse( + status_code=200, + content={"msg_en": "Disable RSS successfully.", "msg_zh": "禁用 RSS 成功。"}, + ) + else: + return JSONResponse( + status_code=406, + content={"msg_en": "Disable RSS failed.", "msg_zh": "禁用 RSS 失败。"}, + ) + + @router.patch(path="/update/{rss_id}", response_model=APIResponse) async def update_rss( rss_id: int, data: RSSUpdate, current_user=Depends(get_current_user) diff --git a/backend/src/module/database/rss.py b/backend/src/module/database/rss.py index 97b4415b..5c4dce81 100644 --- a/backend/src/module/database/rss.py +++ b/backend/src/module/database/rss.py @@ -44,6 +44,18 @@ class RSSDatabase: self.session.refresh(db_data) return True + def disable(self, _id: int): + statement = select(RSSItem).where(RSSItem.id == _id) + db_data = self.session.exec(statement).first() + if not db_data: + return False + db_data.enabled = False + self.session.add(db_data) + self.session.commit() + self.session.refresh(db_data) + return True + + def search_id(self, _id: int) -> RSSItem: return self.session.get(RSSItem, _id) diff --git a/backend/src/module/models/config.py b/backend/src/module/models/config.py index c282908a..9a14001e 100644 --- a/backend/src/module/models/config.py +++ b/backend/src/module/models/config.py @@ -3,7 +3,7 @@ from pydantic import BaseModel, Field class Program(BaseModel): - rss_time: int = Field(7200, description="Sleep time") + rss_time: int = Field(900, description="Sleep time") rename_time: int = Field(60, description="Rename times in one loop") webui_port: int = Field(7892, description="WebUI port") @@ -29,7 +29,6 @@ class Downloader(BaseModel): class RSSParser(BaseModel): enable: bool = Field(True, description="Enable RSS parser") - type: str = Field("mikan", description="RSS parser type") filter: list[str] = Field(["720", r"\d+-\d"], description="Filter") language: str = "zh" diff --git a/backend/src/module/network/request_contents.py b/backend/src/module/network/request_contents.py index 96c741ed..1516dade 100644 --- a/backend/src/module/network/request_contents.py +++ b/backend/src/module/network/request_contents.py @@ -1,14 +1,15 @@ import re +import logging import xml.etree.ElementTree -from bs4 import BeautifulSoup - from module.conf import settings from module.models import Torrent from .request_url import RequestURL from .site import mikan_parser +logger = logging.getLogger(__name__) + class RequestContent(RequestURL): def get_torrents( @@ -58,5 +59,8 @@ class RequestContent(RequestURL): return self.check_url(_url) def get_rss_title(self, _url): - soup = self.get_xml(_url) - return soup.find("./channel/title").text + try: + soup = self.get_xml(_url) + return soup.find("./channel/title").text + except ConnectionError: + logger.warning(f"Failed to get RSS title: {_url}") diff --git a/backend/src/module/rss/analyser.py b/backend/src/module/rss/analyser.py index 56623cb4..f73b7d3a 100644 --- a/backend/src/module/rss/analyser.py +++ b/backend/src/module/rss/analyser.py @@ -48,7 +48,7 @@ class RSSAnalyser(TitleParser): if not full_parse: return [bangumi] new_data.append(bangumi) - logger.debug(f"[RSS] New title found: {bangumi.official_title}") + logger.info(f"[RSS] New bangumi founded: {bangumi.official_title}") return new_data def torrent_to_data(self, torrent: Torrent, rss: RSSItem) -> Bangumi: diff --git a/backend/src/module/rss/engine.py b/backend/src/module/rss/engine.py index 45cf9658..ff733355 100644 --- a/backend/src/module/rss/engine.py +++ b/backend/src/module/rss/engine.py @@ -36,6 +36,13 @@ class RSSEngine(Database): if not name: with RequestContent() as req: name = req.get_rss_title(rss_link) + if not name: + return ResponseModel( + status=False, + status_code=406, + msg_en="Failed to get RSS title.", + msg_zh="无法获取 RSS 标题。", + ) rss_data = RSSItem(name=name, url=rss_link, aggregate=aggregate) if self.rss.add(rss_data): return ResponseModel( diff --git a/webui/src/api/rss.ts b/webui/src/api/rss.ts index b196cc1c..dbc9b233 100644 --- a/webui/src/api/rss.ts +++ b/webui/src/api/rss.ts @@ -18,6 +18,11 @@ export const apiRSS = { return data!; }, + async disable(rss_id: number) { + const { data } = await axios.patch(`api/v1/rss/disable/${rss_id}`); + return data!; + }, + async update(rss_id: number, rss: RSS) { const { data } = await axios.patch(`api/v1/rss/update/${rss_id}`, rss); return data!; diff --git a/webui/src/components/ab-rss-item.vue b/webui/src/components/ab-rss-item.vue index 8c73c21b..7c0ad175 100644 --- a/webui/src/components/ab-rss-item.vue +++ b/webui/src/components/ab-rss-item.vue @@ -1,5 +1,6 @@