diff --git a/app/api/endpoints/subscribe.py b/app/api/endpoints/subscribe.py index 64a299d0..262793bf 100644 --- a/app/api/endpoints/subscribe.py +++ b/app/api/endpoints/subscribe.py @@ -398,7 +398,7 @@ def user_subscribes( return Subscribe.list_by_username(db, username) -@router.get("/files/{subscribe_id}", summary="订阅相关文件信息", response_model=List[schemas.SubscrbieInfo]) +@router.get("/files/{subscribe_id}", summary="订阅相关文件信息", response_model=schemas.SubscrbieInfo) def subscribe_files( subscribe_id: int, db: Session = Depends(get_db), diff --git a/app/chain/subscribe.py b/app/chain/subscribe.py index f2578bd6..561f45b5 100644 --- a/app/chain/subscribe.py +++ b/app/chain/subscribe.py @@ -25,7 +25,8 @@ from app.helper.message import MessageHelper from app.helper.subscribe import SubscribeHelper from app.helper.torrent import TorrentHelper from app.log import logger -from app.schemas import NotExistMediaInfo, Notification, SubscrbieInfo, SubscribeEpisodeInfo +from app.schemas import NotExistMediaInfo, Notification, SubscrbieInfo, SubscribeEpisodeInfo, SubscribeDownloadFileInfo, \ + SubscribeLibraryFileInfo from app.schemas.types import MediaType, SystemConfigKey, MessageChannel, NotificationType, EventType @@ -1167,47 +1168,34 @@ class SubscribeChain(ChainBase): return # 返回订阅数据 - subscribe_info = SubscrbieInfo( - id=subscribe.id, - name=subscribe.name, - year=subscribe.year, - type=subscribe.type, - tmdbid=subscribe.tmdbid, - doubanid=subscribe.doubanid, - season=subscribe.season, - poster=subscribe.poster, - backdrop=subscribe.backdrop, - vote=subscribe.vote, - description=subscribe.description, - episodes_info={} - ) + subscribe_info = SubscrbieInfo() # 所有集的数据 - episodes_info = {} + episodes: Dict[int, SubscribeEpisodeInfo] = {} if subscribe.tmdbid and subscribe.type == MediaType.TV.value: # 查询TMDB中的集信息 tmdb_episodes = self.tmdbchain.tmdb_episodes( - tmdbid=subscribe.tmdb_id, + tmdbid=subscribe.tmdbid, season=subscribe.season ) if tmdb_episodes: for episode in tmdb_episodes: - episode_info = SubscribeEpisodeInfo() - episodes_info.title = episode.name - episodes_info.description = episode.overview - episodes_info.backdrop = f"https://{settings.TMDB_IMAGE_DOMAIN}/t/p/w500${episode.still_path}" - episodes_info[episode.episode_number] = episode_info + info = SubscribeEpisodeInfo() + info.title = episode.name + info.description = episode.overview + info.backdrop = f"https://{settings.TMDB_IMAGE_DOMAIN}/t/p/w500${episode.still_path}" + episodes[episode.episode_number] = info elif subscribe.type == MediaType.TV.value: # 根据开始结束集计算集信息 for i in range(subscribe.start_episode or 1, subscribe.total_episode + 1): - episode_info = SubscribeEpisodeInfo() - episode_info.title = f'第 {i} 集' - episodes_info[i] = episode_info + info = SubscribeEpisodeInfo() + info.title = f'第 {i} 集' + episodes[i] = info else: # 电影 - episode_info = SubscribeEpisodeInfo() - episode_info.title = subscribe.name - episodes_info[0] = episode_info + info = SubscribeEpisodeInfo() + info.title = subscribe.name + episodes[0] = info # 所有下载记录 download_his = self.downloadhis.get_by_mediaid(tmdbid=subscribe.tmdbid, doubanid=subscribe.doubanid) @@ -1221,14 +1209,20 @@ class SubscribeChain(ChainBase): for file in files: # 识别文件名 file_meta = MetaInfo(file.filepath) + # 下载文件信息 + file_info = SubscribeDownloadFileInfo( + torrent_title=his.torrent_name, + site_name=his.torrent_site, + downloader=file.downloader, + hash=his.download_hash, + file_path=file.fullpath, + ) if subscribe.type == MediaType.TV.value: episode_number = file_meta.begin_episode - if episode_number and episodes_info.get(episode_number): - episodes_info[episode_number].download_file = file.fullpath - episodes_info[episode_number].torrent = torrent_url + if episode_number and episodes.get(episode_number): + episodes[episode_number].download.append(file_info) else: - episodes_info[0].download_file = file.fullpath - episodes_info[0].torrent = torrent_url + episodes[0].download.append(file_info) # 生成元数据 meta = MetaInfo(subscribe.name) @@ -1255,13 +1249,19 @@ class SubscribeChain(ChainBase): for fileitem in library_fileitems: # 识别文件名 file_meta = MetaInfo(fileitem.path) + # 媒体库文件信息 + file_info = SubscribeLibraryFileInfo( + storage=fileitem.storage, + file_path=fileitem.path, + ) if subscribe.type == MediaType.TV.value: episode_number = file_meta.begin_episode - if episode_number and episodes_info.get(episode_number): - episodes_info[episode_number].library_file = fileitem.path + if episode_number and episodes.get(episode_number): + episodes[episode_number].library.append(file_info) else: - episodes_info[0].library_file = fileitem.path + episodes[0].library.append(file_info) # 更新订阅信息 - subscribe_info.episodes_info = episodes_info + subscribe_info.subscribe = Subscribe(**subscribe.to_dict()) + subscribe_info.episodes = episodes return subscribe_info diff --git a/app/modules/filemanager/__init__.py b/app/modules/filemanager/__init__.py index 1271ddf6..3a271a06 100644 --- a/app/modules/filemanager/__init__.py +++ b/app/modules/filemanager/__init__.py @@ -1093,9 +1093,6 @@ class FileManagerModule(_ModuleBase): media_path = dir_path / rel_path.parts[0] else: continue - # 检查媒体文件夹是否存在 - if not media_path.exists(): - continue # 检索媒体文件 fileitem = storage_oper.get_item(media_path) if not fileitem: diff --git a/app/schemas/subscribe.py b/app/schemas/subscribe.py index e437228b..3cb8feda 100644 --- a/app/schemas/subscribe.py +++ b/app/schemas/subscribe.py @@ -81,43 +81,41 @@ class Subscribe(BaseModel): orm_mode = True +class SubscribeDownloadFileInfo(BaseModel): + # 种子名称 + torrent_title: Optional[str] = None + # 站点名称 + site_name: Optional[str] = None + # 下载器 + downloader: Optional[str] = None + # hash + hash: Optional[str] = None + # 文件路径 + file_path: Optional[str] = None + + +class SubscribeLibraryFileInfo(BaseModel): + # 存储 + storage: Optional[str] = "local" + # 文件路径 + file_path: Optional[str] = None + + class SubscribeEpisodeInfo(BaseModel): - # 种子地址 - torrent: Optional[str] = None - # 下载文件路程 - download_file: Optional[str] = None - # 媒体库文件路径 - library_file: Optional[str] = None # 标题 title: Optional[str] = None # 描述 description: Optional[str] = None # 背景图 backdrop: Optional[str] = None + # 下载文件信息 + download: Optional[List[SubscribeDownloadFileInfo]] = [] + # 媒体库文件信息 + library: Optional[List[SubscribeLibraryFileInfo]] = [] class SubscrbieInfo(BaseModel): - # 订阅ID - id: Optional[int] = None - # 订阅名称 - name: Optional[str] = None - # 订阅年份 - year: Optional[str] = None - # 订阅类型 电影/电视剧 - type: Optional[str] = None - # 媒体ID - tmdbid: Optional[int] = None - doubanid: Optional[str] = None - bangumiid: Optional[int] = None - # 季号 - season: Optional[int] = None - # 海报 - poster: Optional[str] = None - # 背景图 - backdrop: Optional[str] = None - # 评分 - vote: Optional[int] = 0 - # 描述 - description: Optional[str] = None + # 订阅信息 + subscribe: Optional[Subscribe] = None # 集信息 {集号: {download: 文件路径,library: 文件路径, backdrop: url, title: 标题, description: 描述}} - episodes_info: Optional[Dict[int, SubscribeEpisodeInfo]] = {} + episodes: Optional[Dict[int, SubscribeEpisodeInfo]] = {}