add system message
This commit is contained in:
@ -2,6 +2,7 @@ from typing import List, Any
|
|||||||
|
|
||||||
from fastapi import APIRouter, Depends, HTTPException
|
from fastapi import APIRouter, Depends, HTTPException
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import Session
|
||||||
|
from starlette.background import BackgroundTasks
|
||||||
|
|
||||||
from app import schemas
|
from app import schemas
|
||||||
from app.chain.cookiecloud import CookieCloudChain
|
from app.chain.cookiecloud import CookieCloudChain
|
||||||
@ -11,11 +12,27 @@ from app.core.security import verify_token
|
|||||||
from app.db import get_db
|
from app.db import get_db
|
||||||
from app.db.models.site import Site
|
from app.db.models.site import Site
|
||||||
from app.db.models.siteicon import SiteIcon
|
from app.db.models.siteicon import SiteIcon
|
||||||
from app.db.siteicon_oper import SiteIconOper
|
|
||||||
|
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
|
|
||||||
|
def start_cookiecloud_sync():
|
||||||
|
"""
|
||||||
|
后台启动CookieCloud站点同步
|
||||||
|
"""
|
||||||
|
CookieCloudChain().process(manual=True)
|
||||||
|
|
||||||
|
|
||||||
|
def start_site_cookie(site_info: Site, username: str, password: str):
|
||||||
|
"""
|
||||||
|
后台启动站点Cookie更新
|
||||||
|
"""
|
||||||
|
SiteChain().update_cookie(site_info=site_info,
|
||||||
|
username=username,
|
||||||
|
password=password,
|
||||||
|
manual=True)
|
||||||
|
|
||||||
|
|
||||||
@router.get("/", summary="所有站点", response_model=List[schemas.Site])
|
@router.get("/", summary="所有站点", response_model=List[schemas.Site])
|
||||||
async def read_sites(db: Session = Depends(get_db),
|
async def read_sites(db: Session = Depends(get_db),
|
||||||
_: schemas.TokenPayload = Depends(verify_token)) -> List[dict]:
|
_: schemas.TokenPayload = Depends(verify_token)) -> List[dict]:
|
||||||
@ -77,14 +94,13 @@ async def delete_site(
|
|||||||
|
|
||||||
|
|
||||||
@router.get("/cookiecloud", summary="CookieCloud同步", response_model=schemas.Response)
|
@router.get("/cookiecloud", summary="CookieCloud同步", response_model=schemas.Response)
|
||||||
async def cookie_cloud_sync(_: schemas.TokenPayload = Depends(verify_token)) -> Any:
|
async def cookie_cloud_sync(background_tasks: BackgroundTasks,
|
||||||
|
_: schemas.TokenPayload = Depends(verify_token)) -> Any:
|
||||||
"""
|
"""
|
||||||
运行CookieCloud同步站点信息
|
运行CookieCloud同步站点信息
|
||||||
"""
|
"""
|
||||||
status, error_msg = CookieCloudChain().process()
|
background_tasks.add_task(start_cookiecloud_sync)
|
||||||
if not status:
|
return schemas.Response(success=True, message="CookieCloud同步任务已启动!")
|
||||||
schemas.Response(success=True, message=error_msg)
|
|
||||||
return schemas.Response(success=True, message="同步成功!")
|
|
||||||
|
|
||||||
|
|
||||||
@router.get("/cookie/{site_id}", summary="更新站点Cookie&UA", response_model=schemas.Response)
|
@router.get("/cookie/{site_id}", summary="更新站点Cookie&UA", response_model=schemas.Response)
|
||||||
@ -92,6 +108,7 @@ async def update_cookie(
|
|||||||
site_id: int,
|
site_id: int,
|
||||||
username: str,
|
username: str,
|
||||||
password: str,
|
password: str,
|
||||||
|
background_tasks: BackgroundTasks,
|
||||||
db: Session = Depends(get_db),
|
db: Session = Depends(get_db),
|
||||||
_: schemas.TokenPayload = Depends(verify_token)) -> Any:
|
_: schemas.TokenPayload = Depends(verify_token)) -> Any:
|
||||||
"""
|
"""
|
||||||
@ -105,13 +122,11 @@ async def update_cookie(
|
|||||||
detail=f"站点 {site_id} 不存在!",
|
detail=f"站点 {site_id} 不存在!",
|
||||||
)
|
)
|
||||||
# 更新Cookie
|
# 更新Cookie
|
||||||
status, msg = SiteChain().update_cookie(site_info=site_info,
|
background_tasks.add_task(start_site_cookie,
|
||||||
username=username,
|
site_info=site_info,
|
||||||
password=password)
|
username=username,
|
||||||
if not status:
|
password=password)
|
||||||
return schemas.Response(success=False, message=msg)
|
return schemas.Response(success=True, message="站点Cookie更新任务已启动!")
|
||||||
else:
|
|
||||||
return schemas.Response(success=True, message=msg)
|
|
||||||
|
|
||||||
|
|
||||||
@router.get("/test/{site_id}", summary="连接测试", response_model=schemas.Response)
|
@router.get("/test/{site_id}", summary="连接测试", response_model=schemas.Response)
|
||||||
|
@ -29,7 +29,7 @@ def start_subscribe_search(sid: Optional[int], state: Optional[str]):
|
|||||||
"""
|
"""
|
||||||
启动订阅搜索任务
|
启动订阅搜索任务
|
||||||
"""
|
"""
|
||||||
SubscribeChain().search(sid=sid, state=state)
|
SubscribeChain().search(sid=sid, state=state, manul=True)
|
||||||
|
|
||||||
|
|
||||||
@router.get("/", summary="所有订阅", response_model=List[schemas.Subscribe])
|
@router.get("/", summary="所有订阅", response_model=List[schemas.Subscribe])
|
||||||
|
@ -10,6 +10,7 @@ from app.core.config import settings
|
|||||||
from app.db.siteicon_oper import SiteIconOper
|
from app.db.siteicon_oper import SiteIconOper
|
||||||
from app.db.site_oper import SiteOper
|
from app.db.site_oper import SiteOper
|
||||||
from app.helper.cookiecloud import CookieCloudHelper
|
from app.helper.cookiecloud import CookieCloudHelper
|
||||||
|
from app.helper.message import MessageHelper
|
||||||
from app.helper.sites import SitesHelper
|
from app.helper.sites import SitesHelper
|
||||||
from app.log import logger
|
from app.log import logger
|
||||||
from app.utils.http import RequestUtils
|
from app.utils.http import RequestUtils
|
||||||
@ -26,6 +27,7 @@ class CookieCloudChain(ChainBase):
|
|||||||
self.siteiconoper = SiteIconOper()
|
self.siteiconoper = SiteIconOper()
|
||||||
self.siteshelper = SitesHelper()
|
self.siteshelper = SitesHelper()
|
||||||
self.sitechain = SiteChain()
|
self.sitechain = SiteChain()
|
||||||
|
self.message = MessageHelper()
|
||||||
self.cookiecloud = CookieCloudHelper(
|
self.cookiecloud = CookieCloudHelper(
|
||||||
server=settings.COOKIECLOUD_HOST,
|
server=settings.COOKIECLOUD_HOST,
|
||||||
key=settings.COOKIECLOUD_KEY,
|
key=settings.COOKIECLOUD_KEY,
|
||||||
@ -44,7 +46,7 @@ class CookieCloudChain(ChainBase):
|
|||||||
else:
|
else:
|
||||||
self.post_message(title=f"同步站点失败:{msg}", userid=userid)
|
self.post_message(title=f"同步站点失败:{msg}", userid=userid)
|
||||||
|
|
||||||
def process(self) -> Tuple[bool, str]:
|
def process(self, manual=False) -> Tuple[bool, str]:
|
||||||
"""
|
"""
|
||||||
通过CookieCloud同步站点Cookie
|
通过CookieCloud同步站点Cookie
|
||||||
"""
|
"""
|
||||||
@ -93,6 +95,8 @@ class CookieCloudChain(ChainBase):
|
|||||||
logger.warn(f"缓存站点 {indexer.get('name')} 图标失败")
|
logger.warn(f"缓存站点 {indexer.get('name')} 图标失败")
|
||||||
# 处理完成
|
# 处理完成
|
||||||
ret_msg = f"更新了{_update_count}个站点,新增了{_add_count}个站点"
|
ret_msg = f"更新了{_update_count}个站点,新增了{_add_count}个站点"
|
||||||
|
if manual:
|
||||||
|
self.message.put(f"CookieCloud同步成功, {ret_msg}")
|
||||||
logger.info(f"CookieCloud同步成功:{ret_msg}")
|
logger.info(f"CookieCloud同步成功:{ret_msg}")
|
||||||
return True, ret_msg
|
return True, ret_msg
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ from app.db.site_oper import SiteOper
|
|||||||
from app.helper.browser import PlaywrightHelper
|
from app.helper.browser import PlaywrightHelper
|
||||||
from app.helper.cloudflare import under_challenge
|
from app.helper.cloudflare import under_challenge
|
||||||
from app.helper.cookie import CookieHelper
|
from app.helper.cookie import CookieHelper
|
||||||
|
from app.helper.message import MessageHelper
|
||||||
from app.log import logger
|
from app.log import logger
|
||||||
from app.utils.http import RequestUtils
|
from app.utils.http import RequestUtils
|
||||||
from app.utils.site import SiteUtils
|
from app.utils.site import SiteUtils
|
||||||
@ -18,13 +19,11 @@ class SiteChain(ChainBase):
|
|||||||
站点管理处理链
|
站点管理处理链
|
||||||
"""
|
"""
|
||||||
|
|
||||||
_siteoper: SiteOper = None
|
|
||||||
_cookiehelper: CookieHelper = None
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self._siteoper = SiteOper()
|
self.siteoper = SiteOper()
|
||||||
self._cookiehelper = CookieHelper()
|
self.cookiehelper = CookieHelper()
|
||||||
|
self.message = MessageHelper()
|
||||||
|
|
||||||
def test(self, url: str) -> Tuple[bool, str]:
|
def test(self, url: str) -> Tuple[bool, str]:
|
||||||
"""
|
"""
|
||||||
@ -34,7 +33,7 @@ class SiteChain(ChainBase):
|
|||||||
"""
|
"""
|
||||||
# 检查域名是否可用
|
# 检查域名是否可用
|
||||||
domain = StringUtils.get_url_domain(url)
|
domain = StringUtils.get_url_domain(url)
|
||||||
site_info = self._siteoper.get_by_domain(domain)
|
site_info = self.siteoper.get_by_domain(domain)
|
||||||
if not site_info:
|
if not site_info:
|
||||||
return False, f"站点【{url}】不存在"
|
return False, f"站点【{url}】不存在"
|
||||||
site_url = site_info.url
|
site_url = site_info.url
|
||||||
@ -84,7 +83,7 @@ class SiteChain(ChainBase):
|
|||||||
"""
|
"""
|
||||||
查询所有站点,发送消息
|
查询所有站点,发送消息
|
||||||
"""
|
"""
|
||||||
site_list = self._siteoper.list()
|
site_list = self.siteoper.list()
|
||||||
if not site_list:
|
if not site_list:
|
||||||
self.post_message(title="没有维护任何站点信息!")
|
self.post_message(title="没有维护任何站点信息!")
|
||||||
title = f"共有 {len(site_list)} 个站点,回复对应指令操作:" \
|
title = f"共有 {len(site_list)} 个站点,回复对应指令操作:" \
|
||||||
@ -114,12 +113,12 @@ class SiteChain(ChainBase):
|
|||||||
if not arg_str.isdigit():
|
if not arg_str.isdigit():
|
||||||
return
|
return
|
||||||
site_id = int(arg_str)
|
site_id = int(arg_str)
|
||||||
site = self._siteoper.get(site_id)
|
site = self.siteoper.get(site_id)
|
||||||
if not site:
|
if not site:
|
||||||
self.post_message(title=f"站点编号 {site_id} 不存在!", userid=userid)
|
self.post_message(title=f"站点编号 {site_id} 不存在!", userid=userid)
|
||||||
return
|
return
|
||||||
# 禁用站点
|
# 禁用站点
|
||||||
self._siteoper.update(site_id, {
|
self.siteoper.update(site_id, {
|
||||||
"is_active": False
|
"is_active": False
|
||||||
})
|
})
|
||||||
# 重新发送消息
|
# 重新发送消息
|
||||||
@ -135,28 +134,30 @@ class SiteChain(ChainBase):
|
|||||||
if not arg_str.isdigit():
|
if not arg_str.isdigit():
|
||||||
return
|
return
|
||||||
site_id = int(arg_str)
|
site_id = int(arg_str)
|
||||||
site = self._siteoper.get(site_id)
|
site = self.siteoper.get(site_id)
|
||||||
if not site:
|
if not site:
|
||||||
self.post_message(title=f"站点编号 {site_id} 不存在!", userid=userid)
|
self.post_message(title=f"站点编号 {site_id} 不存在!", userid=userid)
|
||||||
return
|
return
|
||||||
# 禁用站点
|
# 禁用站点
|
||||||
self._siteoper.update(site_id, {
|
self.siteoper.update(site_id, {
|
||||||
"is_active": True
|
"is_active": True
|
||||||
})
|
})
|
||||||
# 重新发送消息
|
# 重新发送消息
|
||||||
self.remote_list()
|
self.remote_list()
|
||||||
|
|
||||||
def update_cookie(self, site_info: Site,
|
def update_cookie(self, site_info: Site,
|
||||||
username: str, password: str) -> Tuple[bool, str]:
|
username: str, password: str,
|
||||||
|
manual=False) -> Tuple[bool, str]:
|
||||||
"""
|
"""
|
||||||
根据用户名密码更新站点Cookie
|
根据用户名密码更新站点Cookie
|
||||||
:param site_info: 站点信息
|
:param site_info: 站点信息
|
||||||
:param username: 用户名
|
:param username: 用户名
|
||||||
:param password: 密码
|
:param password: 密码
|
||||||
|
:param manual: 是否手动更新
|
||||||
:return: (是否成功, 错误信息)
|
:return: (是否成功, 错误信息)
|
||||||
"""
|
"""
|
||||||
# 更新站点Cookie
|
# 更新站点Cookie
|
||||||
result = self._cookiehelper.get_site_cookie_ua(
|
result = self.cookiehelper.get_site_cookie_ua(
|
||||||
url=site_info.url,
|
url=site_info.url,
|
||||||
username=username,
|
username=username,
|
||||||
password=password,
|
password=password,
|
||||||
@ -165,11 +166,15 @@ class SiteChain(ChainBase):
|
|||||||
if result:
|
if result:
|
||||||
cookie, ua, msg = result
|
cookie, ua, msg = result
|
||||||
if not cookie:
|
if not cookie:
|
||||||
|
if manual:
|
||||||
|
self.message.put(f"站点 {site_info.name} Cookie更新失败:{msg}!")
|
||||||
return False, msg
|
return False, msg
|
||||||
self._siteoper.update(site_info.id, {
|
self.siteoper.update(site_info.id, {
|
||||||
"cookie": cookie,
|
"cookie": cookie,
|
||||||
"ua": ua
|
"ua": ua
|
||||||
})
|
})
|
||||||
|
if manual:
|
||||||
|
self.message.put(f"站点 {site_info.name} Cookie更新成功!")
|
||||||
return True, msg
|
return True, msg
|
||||||
return False, "未知错误"
|
return False, "未知错误"
|
||||||
|
|
||||||
@ -194,7 +199,7 @@ class SiteChain(ChainBase):
|
|||||||
# 站点ID
|
# 站点ID
|
||||||
site_id = int(site_id)
|
site_id = int(site_id)
|
||||||
# 站点信息
|
# 站点信息
|
||||||
site_info = self._siteoper.get(site_id)
|
site_info = self.siteoper.get(site_id)
|
||||||
if not site_info:
|
if not site_info:
|
||||||
self.post_message(title=f"站点编号 {site_id} 不存在!", userid=userid)
|
self.post_message(title=f"站点编号 {site_id} 不存在!", userid=userid)
|
||||||
return
|
return
|
||||||
|
@ -10,6 +10,7 @@ from app.core.context import TorrentInfo, Context, MediaInfo
|
|||||||
from app.core.config import settings
|
from app.core.config import settings
|
||||||
from app.db.models.subscribe import Subscribe
|
from app.db.models.subscribe import Subscribe
|
||||||
from app.db.subscribe_oper import SubscribeOper
|
from app.db.subscribe_oper import SubscribeOper
|
||||||
|
from app.helper.message import MessageHelper
|
||||||
from app.helper.sites import SitesHelper
|
from app.helper.sites import SitesHelper
|
||||||
from app.log import logger
|
from app.log import logger
|
||||||
from app.schemas import NotExistMediaInfo
|
from app.schemas import NotExistMediaInfo
|
||||||
@ -31,6 +32,7 @@ class SubscribeChain(ChainBase):
|
|||||||
self.searchchain = SearchChain()
|
self.searchchain = SearchChain()
|
||||||
self.subscribehelper = SubscribeOper()
|
self.subscribehelper = SubscribeOper()
|
||||||
self.siteshelper = SitesHelper()
|
self.siteshelper = SitesHelper()
|
||||||
|
self.message = MessageHelper()
|
||||||
|
|
||||||
def add(self, title: str, year: str,
|
def add(self, title: str, year: str,
|
||||||
mtype: MediaType = None,
|
mtype: MediaType = None,
|
||||||
@ -150,11 +152,12 @@ class SubscribeChain(ChainBase):
|
|||||||
self.search(state='R')
|
self.search(state='R')
|
||||||
self.post_message(title=f"订阅搜索完成!", userid=userid)
|
self.post_message(title=f"订阅搜索完成!", userid=userid)
|
||||||
|
|
||||||
def search(self, sid: int = None, state: str = 'N'):
|
def search(self, sid: int = None, state: str = 'N', manul: bool = False):
|
||||||
"""
|
"""
|
||||||
订阅搜索
|
订阅搜索
|
||||||
:param sid: 订阅ID,有值时只处理该订阅
|
:param sid: 订阅ID,有值时只处理该订阅
|
||||||
:param state: 订阅状态 N:未搜索 R:已搜索
|
:param state: 订阅状态 N:未搜索 R:已搜索
|
||||||
|
:param manul: 是否手动搜索
|
||||||
:return: 更新订阅状态为R或删除订阅
|
:return: 更新订阅状态为R或删除订阅
|
||||||
"""
|
"""
|
||||||
if sid:
|
if sid:
|
||||||
@ -239,6 +242,12 @@ class SubscribeChain(ChainBase):
|
|||||||
update_date = True if downloads else False
|
update_date = True if downloads else False
|
||||||
self.__upate_lack_episodes(lefts=lefts, subscribe=subscribe,
|
self.__upate_lack_episodes(lefts=lefts, subscribe=subscribe,
|
||||||
mediainfo=mediainfo, update_date=update_date)
|
mediainfo=mediainfo, update_date=update_date)
|
||||||
|
# 手动触发时发送系统消息
|
||||||
|
if manul:
|
||||||
|
if sid:
|
||||||
|
self.message.put(f'订阅 {subscribes[0].name} 搜索完成!')
|
||||||
|
else:
|
||||||
|
self.message.put(f'所有订阅搜索完成!')
|
||||||
|
|
||||||
def refresh(self):
|
def refresh(self):
|
||||||
"""
|
"""
|
||||||
|
Reference in New Issue
Block a user