feat 本地存在标识&媒体库同步

This commit is contained in:
jxxghp
2023-07-22 11:49:22 +08:00
parent ce05b25f87
commit d93bc31092
24 changed files with 873 additions and 217 deletions

View File

@ -12,7 +12,7 @@ from app.core.context import MediaInfo
from app.core.metainfo import MetaInfo
from app.helper.rss import RssHelper
from app.log import logger
from app.schemas import MediaType, Notification, MessageChannel, NotificationType
from app.schemas import MediaType, Notification, MessageChannel
class DoubanChain(ChainBase):
@ -95,10 +95,10 @@ class DoubanChain(ChainBase):
"""
同步豆瓣想看数据,发送消息
"""
self.post_message(Notification(channel=channel, mtype=NotificationType.Subscribe,
self.post_message(Notification(channel=channel,
title="开始同步豆瓣想看 ...", userid=userid))
self.sync()
self.post_message(Notification(channel=channel, mtype=NotificationType.Subscribe,
self.post_message(Notification(channel=channel,
title="同步豆瓣想看数据完成!", userid=userid))
def sync(self):

88
app/chain/mediaserver.py Normal file
View File

@ -0,0 +1,88 @@
import json
import threading
from typing import List, Union, Generator
from app import schemas
from app.chain import ChainBase
from app.core.config import settings
from app.db.mediaserver_oper import MediaServerOper
from app.log import logger
from app.schemas import MessageChannel, Notification
lock = threading.Lock()
class MediaServerChain(ChainBase):
"""
媒体服务器处理链
"""
def __init__(self):
super().__init__()
self.mediaserverdb = MediaServerOper()
def librarys(self) -> List[schemas.MediaServerLibrary]:
"""
获取媒体服务器所有媒体库
"""
return self.run_module("mediaserver_librarys")
def items(self, library_id: Union[str, int]) -> Generator:
"""
获取媒体服务器所有项目
"""
return self.run_module("mediaserver_items", library_id=library_id)
def episodes(self, item_id: Union[str, int]) -> List[schemas.MediaServerSeasonInfo]:
"""
获取媒体服务器剧集信息
"""
return self.run_module("mediaserver_tv_episodes", item_id=item_id)
def remote_sync(self, channel: MessageChannel, userid: Union[int, str]):
"""
同步豆瓣想看数据,发送消息
"""
self.post_message(Notification(channel=channel,
title="开始媒体服务器 ...", userid=userid))
self.sync()
self.post_message(Notification(channel=channel,
title="同步媒体服务器完成!", userid=userid))
def sync(self):
"""
同步媒体库所有数据到本地数据库
"""
with lock:
logger.info("开始同步媒体库数据 ...")
# 汇总统计
total_count = 0
# 清空登记薄
self.mediaserverdb.empty(server=settings.MEDIASERVER)
for library in self.librarys():
logger.info(f"正在同步媒体库 {library.name} ...")
library_count = 0
for item in self.items(library.id):
if not item:
continue
if not item.item_id:
continue
# 计数
library_count += 1
seasoninfo = {}
# 类型
item_type = "电视剧" if item.item_type in ['Series', 'show'] else "电影"
if item_type == "电视剧":
# 查询剧集信息
espisodes_info = self.episodes(item.item_id)
for episode in espisodes_info:
seasoninfo[episode.season] = episode.episodes
# 插入数据
item_dict = item.dict()
item_dict['seasoninfo'] = json.dumps(seasoninfo)
item_dict['item_type'] = item_type
self.mediaserverdb.add(**item_dict)
logger.info(f"媒体库 {library.name} 同步完成,共同步数量:{library_count}")
# 总数累加
total_count += library_count
logger.info("【MediaServer】媒体库数据同步完成同步数量%s" % total_count)

View File

@ -123,7 +123,8 @@ class SiteChain(ChainBase):
if not site:
self.post_message(Notification(
channel=channel,
title=f"站点编号 {site_id} 不存在!", userid=userid))
title=f"站点编号 {site_id} 不存在!",
userid=userid))
return
# 禁用站点
self.siteoper.update(site_id, {