mirror of
https://github.com/EstrellaXD/Auto_Bangumi.git
synced 2026-04-04 11:09:13 +08:00
fix: bugs, add disable rss api.
This commit is contained in:
33
.github/workflows/build.yml
vendored
33
.github/workflows/build.yml
vendored
@@ -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:
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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}")
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -18,6 +18,11 @@ export const apiRSS = {
|
||||
return data!;
|
||||
},
|
||||
|
||||
async disable(rss_id: number) {
|
||||
const { data } = await axios.patch<ApiSuccess>(`api/v1/rss/disable/${rss_id}`);
|
||||
return data!;
|
||||
},
|
||||
|
||||
async update(rss_id: number, rss: RSS) {
|
||||
const { data } = await axios.patch<ApiSuccess>(`api/v1/rss/update/${rss_id}`, rss);
|
||||
return data!;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<script lang="ts" setup>
|
||||
import { ref } from 'vue';
|
||||
|
||||
withDefaults(
|
||||
defineProps<{
|
||||
name: string;
|
||||
|
||||
@@ -45,7 +45,7 @@ $notify-font: #A76E18;
|
||||
|
||||
.round-label {
|
||||
padding: 2px 12px;
|
||||
font-size: 8px;
|
||||
font-size: 10px;
|
||||
display: inline-flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
|
||||
@@ -13,43 +13,46 @@ definePage({
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<ab-fold-panel :title="$t('rss.title')">
|
||||
<div flex justify-between>
|
||||
<div flex space-x-40px>
|
||||
<div text-h3>{{ $t('rss.selectbox') }}</div>
|
||||
<div class="spacer-1"></div>
|
||||
<div text-h3>{{ $t('rss.name') }}</div>
|
||||
<div class="spacer-2"></div>
|
||||
<div text-h3>{{ $t('rss.url') }}</div>
|
||||
<div overflow-auto mt-12px flex-grow>
|
||||
<ab-container :title="$t('rss.title')">
|
||||
<div flex justify-between>
|
||||
<div flex space-x-40px>
|
||||
<div text-h3>{{ $t('rss.selectbox') }}</div>
|
||||
<div class="spacer-1"></div>
|
||||
<div text-h3>{{ $t('rss.name') }}</div>
|
||||
<div class="spacer-2"></div>
|
||||
<div text-h3>{{ $t('rss.url') }}</div>
|
||||
</div>
|
||||
<div>
|
||||
<div text-h3>{{ $t('rss.status') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div line my-12px></div>
|
||||
<div>
|
||||
<div text-h3>{{ $t('rss.status') }}</div>
|
||||
<ab-rss-item
|
||||
v-for="i in rss"
|
||||
:key="i.id"
|
||||
:name="i.name"
|
||||
:url="i.url"
|
||||
:enable="i.enabled"
|
||||
:parser="i.parser"
|
||||
:aggregate="i.aggregate">
|
||||
</ab-rss-item>
|
||||
</div>
|
||||
</div>
|
||||
<div line my-12px></div>
|
||||
<div>
|
||||
<ab-rss-item
|
||||
v-for="i in rss"
|
||||
:key="i.id"
|
||||
:name="i.name"
|
||||
:url="i.url"
|
||||
:enable="i.enabled"
|
||||
:parser="i.parser"
|
||||
:aggregate="i.aggregate">
|
||||
</ab-rss-item>
|
||||
</div>
|
||||
<div line my-12px></div>
|
||||
<div flex="~ justify-end" space-x-10px>
|
||||
<ab-button icon="edit">{{ $t('rss.disable') }}</ab-button>
|
||||
<ab-button class="type-warn" text="delete">{{ $t('rss.delete') }}</ab-button>
|
||||
</div>
|
||||
</ab-fold-panel>
|
||||
<!-- <div line my-12px></div> -->
|
||||
<!-- <div flex="~ justify-end" space-x-10px> -->
|
||||
<!-- <ab-button @click="updateRSS">{{ $t('rss.disable') }}</ab-button> -->
|
||||
<!-- <ab-button class="type-warn" @click="deleteRSS">{{ $t('rss.delete') }}</ab-button> -->
|
||||
<!-- </div> -->
|
||||
</ab-container>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.spacer-1 {
|
||||
width: 32px;
|
||||
}
|
||||
|
||||
.spacer-2 {
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
@@ -11,6 +11,9 @@ export const useRSSStore = defineStore('rss', () => {
|
||||
const { execute: updateRSS, onResult: onUpdateRSSResult } = useApi(
|
||||
apiRSS.update
|
||||
);
|
||||
const { execute: disableRSS, onResult: onDisableRSSResult} = useApi(
|
||||
apiRSS.disable
|
||||
);
|
||||
const { execute: deleteRSS, onResult: onDeleteRSSResult } = useApi(
|
||||
apiRSS.delete
|
||||
);
|
||||
@@ -38,12 +41,14 @@ export const useRSSStore = defineStore('rss', () => {
|
||||
|
||||
onUpdateRSSResult(actionSuccess);
|
||||
onDeleteRSSResult(actionSuccess);
|
||||
onDisableRSSResult(actionSuccess)
|
||||
|
||||
return {
|
||||
rss,
|
||||
getAll,
|
||||
refresh,
|
||||
updateRSS,
|
||||
disableRSS,
|
||||
deleteRSS,
|
||||
};
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user