meta property
This commit is contained in:
parent
c06122ff19
commit
1f832633ea
@ -76,24 +76,24 @@ class DoubanSyncChain(ChainBase):
|
||||
# 查询缺失的媒体信息
|
||||
exist_flag, no_exists = self.downloadchain.get_no_exists_info(meta=meta, mediainfo=mediainfo)
|
||||
if exist_flag:
|
||||
logger.info(f'{mediainfo.get_title_string()} 媒体库中已存在')
|
||||
logger.info(f'{mediainfo.title_year} 媒体库中已存在')
|
||||
continue
|
||||
logger.info(f'{mediainfo.get_title_string()} 媒体库中不存在,开始搜索 ...')
|
||||
logger.info(f'{mediainfo.title_year} 媒体库中不存在,开始搜索 ...')
|
||||
# 搜索
|
||||
contexts = self.searchchain.process(meta=meta,
|
||||
mediainfo=mediainfo,
|
||||
no_exists=no_exists)
|
||||
if not contexts:
|
||||
logger.warn(f'{mediainfo.get_title_string()} 未搜索到资源')
|
||||
logger.warn(f'{mediainfo.title_year} 未搜索到资源')
|
||||
continue
|
||||
# 自动下载
|
||||
downloads, lefts = self.downloadchain.batch_download(contexts=contexts, need_tvs=no_exists)
|
||||
if downloads and not lefts:
|
||||
# 全部下载完成
|
||||
logger.info(f'{mediainfo.get_title_string()} 下载完成')
|
||||
logger.info(f'{mediainfo.title_year} 下载完成')
|
||||
else:
|
||||
# 未完成下载
|
||||
logger.info(f'{mediainfo.get_title_string()} 未下载未完整,添加订阅 ...')
|
||||
logger.info(f'{mediainfo.title_year} 未下载未完整,添加订阅 ...')
|
||||
# 添加订阅
|
||||
self.subscribechain.process(title=mediainfo.title,
|
||||
year=mediainfo.year,
|
||||
|
@ -29,8 +29,8 @@ class DownloadChain(ChainBase):
|
||||
msg_text = ""
|
||||
if torrent.site_name:
|
||||
msg_text = f"站点:{torrent.site_name}"
|
||||
if meta.get_resource_type_string():
|
||||
msg_text = f"{msg_text}\n质量:{meta.get_resource_type_string()}"
|
||||
if meta.resource:
|
||||
msg_text = f"{msg_text}\n质量:{meta.resource}"
|
||||
if torrent.size:
|
||||
if str(torrent.size).isdigit():
|
||||
size = StringUtils.str_filesize(torrent.size)
|
||||
@ -50,8 +50,8 @@ class DownloadChain(ChainBase):
|
||||
torrent.description = re.sub(r'<[^>]+>', '', description)
|
||||
msg_text = f"{msg_text}\n描述:{torrent.description}"
|
||||
|
||||
self.post_message(title=f"{mediainfo.get_title_string()}"
|
||||
f"{meta.get_season_episode_string()} 开始下载",
|
||||
self.post_message(title=f"{mediainfo.title_year}"
|
||||
f"{meta.season_episode} 开始下载",
|
||||
text=msg_text,
|
||||
image=mediainfo.get_message_image(),
|
||||
userid=userid)
|
||||
@ -124,11 +124,11 @@ class DownloadChain(ChainBase):
|
||||
self.download_added(context=_context, torrent_path=_torrent_file)
|
||||
else:
|
||||
# 下载失败
|
||||
logger.error(f"{_media.get_title_string()} 添加下载任务失败:"
|
||||
logger.error(f"{_media.title_year} 添加下载任务失败:"
|
||||
f"{_torrent.title} - {_torrent.enclosure},{error_msg}")
|
||||
self.post_message(
|
||||
title="添加下载任务失败:%s %s"
|
||||
% (_media.get_title_string(), _meta.get_season_episode_string()),
|
||||
% (_media.title_year, _meta.get_season_episode_string()),
|
||||
text=f"站点:{_torrent.site_name}\n"
|
||||
f"种子名称:{_meta.org_string}\n"
|
||||
f"种子链接:{_torrent.enclosure}\n"
|
||||
@ -208,8 +208,8 @@ class DownloadChain(ChainBase):
|
||||
torrent = context.torrent_info
|
||||
if media.type != MediaType.TV:
|
||||
continue
|
||||
item_season = meta.get_season_list()
|
||||
if meta.get_episode_list():
|
||||
item_season = meta.season_list
|
||||
if meta.episode_list:
|
||||
continue
|
||||
if need_tmdbid == media.tmdb_id:
|
||||
if set(item_season).issubset(set(need_season)):
|
||||
@ -259,10 +259,10 @@ class DownloadChain(ChainBase):
|
||||
if context in downloaded_list:
|
||||
continue
|
||||
# 只处理单季含集的种子
|
||||
item_season = meta.get_season_list()
|
||||
item_season = meta.season_list
|
||||
if len(item_season) != 1 or item_season[0] != need_season:
|
||||
continue
|
||||
item_episodes = meta.get_episode_list()
|
||||
item_episodes = meta.episode_list
|
||||
if not item_episodes:
|
||||
continue
|
||||
# 为需要集的子集则下载
|
||||
@ -301,10 +301,10 @@ class DownloadChain(ChainBase):
|
||||
break
|
||||
# 选中一个单季整季的或单季包括需要的所有集的
|
||||
if media.tmdb_id == need_tmdbid \
|
||||
and (not meta.get_episode_list()
|
||||
or set(meta.get_episode_list()).intersection(set(need_episodes))) \
|
||||
and len(meta.get_season_list()) == 1 \
|
||||
and meta.get_season_list()[0] == need_season:
|
||||
and (not meta.episode_list
|
||||
or set(meta.episode_list).intersection(set(need_episodes))) \
|
||||
and len(meta.season_list) == 1 \
|
||||
and meta.season_list[0] == need_season:
|
||||
# 检查种子看是否有需要的集
|
||||
torrent_path, torrent_files = __download_torrent(torrent)
|
||||
if not torrent_path:
|
||||
@ -377,20 +377,20 @@ class DownloadChain(ChainBase):
|
||||
# 电影
|
||||
exists_movies: Optional[ExistMediaInfo] = self.media_exists(mediainfo)
|
||||
if exists_movies:
|
||||
logger.info(f"媒体库中已存在电影:{mediainfo.get_title_string()}")
|
||||
logger.info(f"媒体库中已存在电影:{mediainfo.title_year}")
|
||||
return True, {}
|
||||
return False, {}
|
||||
else:
|
||||
if not mediainfo.seasons:
|
||||
# 补充媒体信息
|
||||
mediainfo: MediaInfo = self.recognize_media(meta=MetaInfo(title=mediainfo.get_title_string()),
|
||||
mediainfo: MediaInfo = self.recognize_media(meta=MetaInfo(title=mediainfo.title_year),
|
||||
mtype=mediainfo.type,
|
||||
tmdbid=mediainfo.tmdb_id)
|
||||
if not mediainfo:
|
||||
logger.error(f"媒体信息识别失败!")
|
||||
return False, {}
|
||||
if not mediainfo.seasons:
|
||||
logger.error(f"媒体信息中没有季集信息:{mediainfo.get_title_string()}")
|
||||
logger.error(f"媒体信息中没有季集信息:{mediainfo.title_year}")
|
||||
return False, {}
|
||||
# 电视剧
|
||||
exists_tvs: Optional[ExistMediaInfo] = self.media_exists(mediainfo)
|
||||
@ -399,7 +399,7 @@ class DownloadChain(ChainBase):
|
||||
for season, episodes in mediainfo.seasons.items():
|
||||
# 全季不存在
|
||||
if meta.begin_season \
|
||||
and season not in meta.get_season_list():
|
||||
and season not in meta.season_list:
|
||||
continue
|
||||
__append_no_exists(_season=season, _episodes=[], _total=len(episodes), _start=min(episodes))
|
||||
return False, no_exists
|
||||
@ -407,7 +407,7 @@ class DownloadChain(ChainBase):
|
||||
# 存在一些,检查缺失的季集
|
||||
for season, episodes in mediainfo.seasons.items():
|
||||
if meta.begin_season \
|
||||
and season not in meta.get_season_list():
|
||||
and season not in meta.season_list:
|
||||
continue
|
||||
exist_seasons = exists_tvs.seasons
|
||||
if exist_seasons.get(season):
|
||||
|
@ -27,7 +27,7 @@ class IdentifyChain(ChainBase):
|
||||
if not mediainfo:
|
||||
logger.warn(f'{title} 未识别到媒体信息')
|
||||
return Context(meta=metainfo)
|
||||
logger.info(f'{title} 识别到媒体信息:{mediainfo.type.value} {mediainfo.get_title_string()}')
|
||||
logger.info(f'{title} 识别到媒体信息:{mediainfo.type.value} {mediainfo.title_year}')
|
||||
# 更新媒体图片
|
||||
self.obtain_image(mediainfo=mediainfo)
|
||||
# 返回上下文
|
||||
|
@ -110,14 +110,14 @@ class SearchChain(ChainBase):
|
||||
if torrent_meta.year != mediainfo.year:
|
||||
continue
|
||||
# 比对标题
|
||||
if torrent_meta.get_name() in [mediainfo.title, mediainfo.original_title]:
|
||||
if torrent_meta.name in [mediainfo.title, mediainfo.original_title]:
|
||||
logger.info(f'{mediainfo.title} 匹配到资源:{torrent.site_name} - {torrent.title}')
|
||||
_match_torrents.append(torrent)
|
||||
continue
|
||||
# 比对别名和译名
|
||||
for name in mediainfo.names:
|
||||
if StringUtils.clear(name).strip().upper() == \
|
||||
StringUtils.clear(torrent_meta.get_name()).strip().upper():
|
||||
StringUtils.clear(torrent_meta.name).strip().upper():
|
||||
logger.info(f'{mediainfo.title} 匹配到资源:{torrent.site_name} - {torrent.title}')
|
||||
_match_torrents.append(torrent)
|
||||
break
|
||||
|
@ -86,17 +86,17 @@ class SubscribeChain(ChainBase):
|
||||
# 添加订阅
|
||||
sid, err_msg = self.subscribes.add(mediainfo, season=season, **kwargs)
|
||||
if not sid:
|
||||
logger.error(f'{mediainfo.get_title_string()} {err_msg}')
|
||||
logger.error(f'{mediainfo.title_year} {err_msg}')
|
||||
# 发回原用户
|
||||
self.post_message(title=f"{mediainfo.get_title_string()}{metainfo.get_season_string()} "
|
||||
self.post_message(title=f"{mediainfo.title_year}{metainfo.season} "
|
||||
f"添加订阅失败!",
|
||||
text=f"{err_msg}",
|
||||
image=mediainfo.get_message_image(),
|
||||
userid=userid)
|
||||
else:
|
||||
logger.info(f'{mediainfo.get_title_string()}{metainfo.get_season_string()} 添加订阅成功')
|
||||
logger.info(f'{mediainfo.title_year}{metainfo.season} 添加订阅成功')
|
||||
# 广而告之
|
||||
self.post_message(title=f"{mediainfo.get_title_string()}{metainfo.get_season_string()} 已添加订阅",
|
||||
self.post_message(title=f"{mediainfo.title_year}{metainfo.season} 已添加订阅",
|
||||
text=f"评分:{mediainfo.vote_average},来自用户:{username or userid}",
|
||||
image=mediainfo.get_message_image())
|
||||
# 返回结果
|
||||
@ -132,10 +132,10 @@ class SubscribeChain(ChainBase):
|
||||
# 查询缺失的媒体信息
|
||||
exist_flag, no_exists = self.downloadchain.get_no_exists_info(meta=meta, mediainfo=mediainfo)
|
||||
if exist_flag:
|
||||
logger.info(f'{mediainfo.get_title_string()} 媒体库中已存在,完成订阅')
|
||||
logger.info(f'{mediainfo.title_year} 媒体库中已存在,完成订阅')
|
||||
self.subscribes.delete(subscribe.id)
|
||||
# 发送通知
|
||||
self.post_message(title=f'{mediainfo.get_title_string()}{meta.get_season_string()} 已完成订阅',
|
||||
self.post_message(title=f'{mediainfo.title_year}{meta.season} 已完成订阅',
|
||||
image=mediainfo.get_message_image())
|
||||
continue
|
||||
# 使用订阅的总集数和开始集数替换no_exists
|
||||
@ -159,14 +159,14 @@ class SubscribeChain(ChainBase):
|
||||
downloads, lefts = self.downloadchain.batch_download(contexts=contexts, need_tvs=no_exists)
|
||||
if downloads and not lefts:
|
||||
# 全部下载完成
|
||||
logger.info(f'{mediainfo.get_title_string()} 下载完成,完成订阅')
|
||||
logger.info(f'{mediainfo.title_year} 下载完成,完成订阅')
|
||||
self.subscribes.delete(subscribe.id)
|
||||
# 发送通知
|
||||
self.post_message(title=f'{mediainfo.get_title_string()}{meta.get_season_string()} 已完成订阅',
|
||||
self.post_message(title=f'{mediainfo.title_year}{meta.season} 已完成订阅',
|
||||
image=mediainfo.get_message_image())
|
||||
else:
|
||||
# 未完成下载
|
||||
logger.info(f'{mediainfo.get_title_string()} 未下载未完整,继续订阅 ...')
|
||||
logger.info(f'{mediainfo.title_year} 未下载未完整,继续订阅 ...')
|
||||
|
||||
def refresh(self):
|
||||
"""
|
||||
@ -236,10 +236,10 @@ class SubscribeChain(ChainBase):
|
||||
# 查询缺失的媒体信息
|
||||
exist_flag, no_exists = self.downloadchain.get_no_exists_info(meta=meta, mediainfo=mediainfo)
|
||||
if exist_flag:
|
||||
logger.info(f'{mediainfo.get_title_string()} 媒体库中已存在,完成订阅')
|
||||
logger.info(f'{mediainfo.title_year} 媒体库中已存在,完成订阅')
|
||||
self.subscribes.delete(subscribe.id)
|
||||
# 发送通知
|
||||
self.post_message(title=f'{mediainfo.get_title_string()}{meta.get_season_string()} 已完成订阅',
|
||||
self.post_message(title=f'{mediainfo.title_year}{meta.season} 已完成订阅',
|
||||
image=mediainfo.get_message_image())
|
||||
continue
|
||||
# 使用订阅的总集数和开始集数替换no_exists
|
||||
@ -264,18 +264,18 @@ class SubscribeChain(ChainBase):
|
||||
if meta.begin_season and meta.begin_season != torrent_meta.begin_season:
|
||||
continue
|
||||
# 匹配成功
|
||||
logger.info(f'{mediainfo.get_title_string()} 匹配成功:{torrent_info.title}')
|
||||
logger.info(f'{mediainfo.title_year} 匹配成功:{torrent_info.title}')
|
||||
_match_context.append(context)
|
||||
logger.info(f'{mediainfo.get_title_string()} 匹配完成,共匹配到{len(_match_context)}个资源')
|
||||
logger.info(f'{mediainfo.title_year} 匹配完成,共匹配到{len(_match_context)}个资源')
|
||||
if _match_context:
|
||||
# 批量择优下载
|
||||
downloads, lefts = self.downloadchain.batch_download(contexts=_match_context, need_tvs=no_exists)
|
||||
if downloads and not lefts:
|
||||
# 全部下载完成
|
||||
logger.info(f'{mediainfo.get_title_string()} 下载完成,完成订阅')
|
||||
logger.info(f'{mediainfo.title_year} 下载完成,完成订阅')
|
||||
self.subscribes.delete(subscribe.id)
|
||||
# 发送通知
|
||||
self.post_message(title=f'{mediainfo.get_title_string()}{meta.get_season_string()} 已完成订阅',
|
||||
self.post_message(title=f'{mediainfo.title_year}{meta.season} 已完成订阅',
|
||||
image=mediainfo.get_message_image())
|
||||
else:
|
||||
# 未完成下载,计算剩余集数
|
||||
@ -284,7 +284,7 @@ class SubscribeChain(ChainBase):
|
||||
season = season_info.get('season')
|
||||
if season == subscribe.season:
|
||||
left_episodes = season_info.get('episodes')
|
||||
logger.info(f'{mediainfo.get_title_string()} 季 {season} 未下载完整,'
|
||||
logger.info(f'{mediainfo.title_year} 季 {season} 未下载完整,'
|
||||
f'更新缺失集数为{len(left_episodes)} ...')
|
||||
self.subscribes.update(subscribe.id, {
|
||||
"lack_episode": len(left_episodes)
|
||||
|
@ -78,7 +78,7 @@ class TransferChain(ChainBase):
|
||||
title, subtitle = torrent.title, None
|
||||
# 识别元数据
|
||||
meta: MetaBase = MetaInfo(title=title, subtitle=subtitle)
|
||||
if not meta.get_name():
|
||||
if not meta.name:
|
||||
logger.warn(f'未识别到元数据,标题:{title}')
|
||||
continue
|
||||
if not arg_mediainfo:
|
||||
@ -91,7 +91,7 @@ class TransferChain(ChainBase):
|
||||
continue
|
||||
else:
|
||||
mediainfo = arg_mediainfo
|
||||
logger.info(f"{torrent.title} 识别为:{mediainfo.type.value} {mediainfo.get_title_string()}")
|
||||
logger.info(f"{torrent.title} 识别为:{mediainfo.type.value} {mediainfo.title_year}")
|
||||
# 更新媒体图片
|
||||
self.obtain_image(mediainfo=mediainfo)
|
||||
# 转移
|
||||
@ -99,7 +99,7 @@ class TransferChain(ChainBase):
|
||||
if not transferinfo or not transferinfo.target_path:
|
||||
logger.warn(f"{torrent.title} 入库失败")
|
||||
self.post_message(
|
||||
title=f"{mediainfo.get_title_string()}{meta.get_season_episode_string()} 入库失败!",
|
||||
title=f"{mediainfo.title_year}{meta.season_episode} 入库失败!",
|
||||
text=f"原因:{transferinfo.message if transferinfo else '未知'}",
|
||||
image=mediainfo.get_message_image()
|
||||
),
|
||||
@ -126,15 +126,15 @@ class TransferChain(ChainBase):
|
||||
transferinfo.target_path
|
||||
)
|
||||
)
|
||||
msg_title = f"{mediainfo.get_title_string()} 已入库"
|
||||
msg_title = f"{mediainfo.title_year} 已入库"
|
||||
if mediainfo.vote_average:
|
||||
msg_str = f"评分:{mediainfo.vote_average},类型:{mediainfo.type.value}"
|
||||
else:
|
||||
msg_str = f"类型:{mediainfo.type.value}"
|
||||
if mediainfo.category:
|
||||
msg_str = f"{msg_str},类别:{mediainfo.category}"
|
||||
if meta.get_resource_type_string():
|
||||
msg_str = f"{msg_str},质量:{meta.get_resource_type_string()}"
|
||||
if meta.resource:
|
||||
msg_str = f"{msg_str},质量:{meta.resource}"
|
||||
msg_str = f"{msg_str}, 大小:{file_size}"
|
||||
# 发送
|
||||
self.post_message(title=msg_title, text=msg_str, image=mediainfo.get_message_image())
|
||||
|
@ -85,8 +85,8 @@ class UserMessageChain(ChainBase):
|
||||
exist_flag, no_exists = self.downloadchain.get_no_exists_info(meta=self._current_meta,
|
||||
mediainfo=self._current_media)
|
||||
if exist_flag:
|
||||
self.post_message(title=f"{self._current_media.get_title_string()}"
|
||||
f"{self._current_meta.get_season()} 媒体库中已存在",
|
||||
self.post_message(title=f"{self._current_media.title_year}"
|
||||
f"{self._current_meta.sea} 媒体库中已存在",
|
||||
userid=userid)
|
||||
return
|
||||
# 发送缺失的媒体信息
|
||||
@ -94,11 +94,11 @@ class UserMessageChain(ChainBase):
|
||||
# 发送消息
|
||||
messages = [f"第 {no_exist.get('season')} 季缺失 {len(no_exist.get('episodes')) or no_exist.get('total_episodes')} 集"
|
||||
for no_exist in no_exists.get(mediainfo.tmdb_id)]
|
||||
self.post_message(title=f"{mediainfo.get_title_string()}:\n" + "\n".join(messages))
|
||||
self.post_message(title=f"{mediainfo.title_year}:\n" + "\n".join(messages))
|
||||
# 搜索种子,过滤掉不需要的剧集,以便选择
|
||||
logger.info(f"{mediainfo.get_title_string()} 媒体库中不存在,开始搜索 ...")
|
||||
logger.info(f"{mediainfo.title_year} 媒体库中不存在,开始搜索 ...")
|
||||
self.post_message(
|
||||
title=f"开始搜索 {mediainfo.type.value} {mediainfo.get_title_string()} ...", userid=userid)
|
||||
title=f"开始搜索 {mediainfo.type.value} {mediainfo.title_year} ...", userid=userid)
|
||||
# 开始搜索
|
||||
contexts = self.searchchain.process(meta=self._current_meta,
|
||||
mediainfo=mediainfo,
|
||||
@ -106,7 +106,7 @@ class UserMessageChain(ChainBase):
|
||||
if not contexts:
|
||||
# 没有数据
|
||||
self.post_message(title=f"{mediainfo.title}"
|
||||
f"{self._current_meta.get_season()} 未搜索到资源!",
|
||||
f"{self._current_meta.sea} 未搜索到资源!",
|
||||
userid=userid)
|
||||
return
|
||||
# 搜索结果排序
|
||||
@ -142,8 +142,8 @@ class UserMessageChain(ChainBase):
|
||||
exist_flag, no_exists = self.downloadchain.get_no_exists_info(meta=self._current_meta,
|
||||
mediainfo=self._current_media)
|
||||
if exist_flag:
|
||||
self.post_message(title=f"{self._current_media.get_title_string()}"
|
||||
f"{self._current_meta.get_season()} 媒体库中已存在",
|
||||
self.post_message(title=f"{self._current_media.title_year}"
|
||||
f"{self._current_meta.sea} 媒体库中已存在",
|
||||
userid=userid)
|
||||
return
|
||||
# 批量下载
|
||||
@ -152,10 +152,10 @@ class UserMessageChain(ChainBase):
|
||||
userid=userid)
|
||||
if downloads and not lefts:
|
||||
# 全部下载完成
|
||||
logger.info(f'{self._current_media.get_title_string()} 下载完成')
|
||||
logger.info(f'{self._current_media.title_year} 下载完成')
|
||||
else:
|
||||
# 未完成下载
|
||||
logger.info(f'{self._current_media.get_title_string()} 未下载未完整,添加订阅 ...')
|
||||
logger.info(f'{self._current_media.title_year} 未下载未完整,添加订阅 ...')
|
||||
# 添加订阅
|
||||
self.subscribechain.process(title=self._current_media.title,
|
||||
year=self._current_media.year,
|
||||
@ -286,7 +286,7 @@ class UserMessageChain(ChainBase):
|
||||
mtype, key_word, season_num, episode_num, year, title = StringUtils.get_keyword(content)
|
||||
# 识别
|
||||
meta = MetaInfo(title)
|
||||
if not meta.get_name():
|
||||
if not meta.name:
|
||||
self.post_message(title="无法识别输入内容!", userid=userid)
|
||||
return
|
||||
# 合并信息
|
||||
@ -301,10 +301,10 @@ class UserMessageChain(ChainBase):
|
||||
# 记录当前状态
|
||||
self._current_meta = meta
|
||||
# 开始搜索
|
||||
logger.info(f"开始搜索:{meta.get_name()}")
|
||||
logger.info(f"开始搜索:{meta.name}")
|
||||
medias: Optional[List[MediaInfo]] = self.search_medias(meta=meta)
|
||||
if not medias:
|
||||
self.post_message(title=f"{meta.get_name()} 没有找到对应的媒体信息!", userid=userid)
|
||||
self.post_message(title=f"{meta.name} 没有找到对应的媒体信息!", userid=userid)
|
||||
return
|
||||
logger.info(f"搜索到 {len(medias)} 条相关媒体信息")
|
||||
self._user_cache[userid] = {
|
||||
@ -314,7 +314,7 @@ class UserMessageChain(ChainBase):
|
||||
self._current_page = 0
|
||||
self._current_media = None
|
||||
# 发送媒体列表
|
||||
self.__post_medias_message(title=meta.get_name(),
|
||||
self.__post_medias_message(title=meta.name,
|
||||
items=medias[:self._page_size],
|
||||
userid=userid, total=len(medias))
|
||||
|
||||
|
@ -341,7 +341,14 @@ class MediaInfo:
|
||||
if overview.split("/")[0].strip().isdigit():
|
||||
self.year = overview.split("/")[0].strip()
|
||||
|
||||
def get_detail_url(self):
|
||||
@property
|
||||
def title_year(self):
|
||||
if self.title:
|
||||
return "%s (%s)" % (self.title, self.year) if self.year else self.title
|
||||
return ""
|
||||
|
||||
@property
|
||||
def detail_link(self):
|
||||
"""
|
||||
TMDB媒体详情页地址
|
||||
"""
|
||||
@ -354,7 +361,8 @@ class MediaInfo:
|
||||
return "https://movie.douban.com/subject/%s" % self.douban_id
|
||||
return ""
|
||||
|
||||
def get_stars(self):
|
||||
@property
|
||||
def stars(self):
|
||||
"""
|
||||
返回评分星星个数
|
||||
"""
|
||||
@ -362,9 +370,10 @@ class MediaInfo:
|
||||
return ""
|
||||
return "".rjust(int(self.vote_average), "★")
|
||||
|
||||
def get_star_string(self):
|
||||
@property
|
||||
def vote_star(self):
|
||||
if self.vote_average:
|
||||
return "评分:%s" % self.get_stars()
|
||||
return "评分:%s" % self.stars
|
||||
return ""
|
||||
|
||||
def get_backdrop_image(self, default: bool = False):
|
||||
@ -391,11 +400,6 @@ class MediaInfo:
|
||||
return self.poster_path.replace("original", "w500")
|
||||
return default or ""
|
||||
|
||||
def get_title_string(self):
|
||||
if self.title:
|
||||
return "%s (%s)" % (self.title, self.year) if self.year else self.title
|
||||
return ""
|
||||
|
||||
def get_overview_string(self, max_len: int = 140):
|
||||
"""
|
||||
返回带限定长度的简介信息
|
||||
@ -487,6 +491,7 @@ class Context:
|
||||
"""
|
||||
转换为字典
|
||||
"""
|
||||
|
||||
def object_to_dict(obj):
|
||||
attributes = [
|
||||
attr for attr in dir(obj)
|
||||
|
@ -66,7 +66,8 @@ class MetaBase(object):
|
||||
self.subtitle = subtitle
|
||||
self.isfile = isfile
|
||||
|
||||
def get_name(self) -> str:
|
||||
@property
|
||||
def name(self) -> str:
|
||||
"""
|
||||
返回名称
|
||||
"""
|
||||
@ -220,9 +221,10 @@ class MetaBase(object):
|
||||
else:
|
||||
return int(episode) == self.begin_episode
|
||||
|
||||
def get_season_string(self) -> str:
|
||||
@property
|
||||
def season(self) -> str:
|
||||
"""
|
||||
返回季字符串,确定是剧集没有季的返回S01
|
||||
返回开始季、结束季字符串,确定是剧集没有季的返回S01
|
||||
"""
|
||||
if self.begin_season is not None:
|
||||
return "S%s" % str(self.begin_season).rjust(2, "0") \
|
||||
@ -236,16 +238,18 @@ class MetaBase(object):
|
||||
else:
|
||||
return ""
|
||||
|
||||
def get_season(self) -> str:
|
||||
@property
|
||||
def sea(self) -> str:
|
||||
"""
|
||||
返回季字符串,确定是剧集没有季的返回空
|
||||
返回开始季字符串,确定是剧集没有季的返回空
|
||||
"""
|
||||
if self.begin_season is not None:
|
||||
return self.get_season_string()
|
||||
return self.season
|
||||
else:
|
||||
return ""
|
||||
|
||||
def get_begin_season_string(self) -> str:
|
||||
@property
|
||||
def season_name(self) -> str:
|
||||
"""
|
||||
返回begin_season 的Sxx
|
||||
"""
|
||||
@ -257,7 +261,8 @@ class MetaBase(object):
|
||||
else:
|
||||
return ""
|
||||
|
||||
def get_season_seq(self) -> str:
|
||||
@property
|
||||
def season_seq(self) -> str:
|
||||
"""
|
||||
返回begin_season 的数字,电视剧没有季的返回1
|
||||
"""
|
||||
@ -269,7 +274,8 @@ class MetaBase(object):
|
||||
else:
|
||||
return ""
|
||||
|
||||
def get_season_list(self) -> List[int]:
|
||||
@property
|
||||
def season_list(self) -> List[int]:
|
||||
"""
|
||||
返回季的数组
|
||||
"""
|
||||
@ -317,10 +323,10 @@ class MetaBase(object):
|
||||
self.begin_episode = int(ep)
|
||||
self.end_episode = None
|
||||
|
||||
#
|
||||
def get_episode_string(self) -> str:
|
||||
@ property
|
||||
def episode(self) -> str:
|
||||
"""
|
||||
返回集字符串
|
||||
返回开始集、结束集字符串
|
||||
"""
|
||||
if self.begin_episode is not None:
|
||||
return "E%s" % str(self.begin_episode).rjust(2, "0") \
|
||||
@ -332,7 +338,8 @@ class MetaBase(object):
|
||||
else:
|
||||
return ""
|
||||
|
||||
def get_episode_list(self) -> List[int]:
|
||||
@property
|
||||
def episode_list(self) -> List[int]:
|
||||
"""
|
||||
返回集的数组
|
||||
"""
|
||||
@ -343,17 +350,19 @@ class MetaBase(object):
|
||||
else:
|
||||
return [self.begin_episode]
|
||||
|
||||
def get_episode_strings(self) -> str:
|
||||
@property
|
||||
def episodes(self) -> str:
|
||||
"""
|
||||
返回集的并列表达方式,用于支持单文件多集
|
||||
"""
|
||||
return "E%s" % "E".join(str(episode).rjust(2, '0') for episode in self.get_episode_list())
|
||||
return "E%s" % "E".join(str(episode).rjust(2, '0') for episode in self.episode_list)
|
||||
|
||||
def get_episode_seqs(self) -> str:
|
||||
@property
|
||||
def episode_seqs(self) -> str:
|
||||
"""
|
||||
返回单文件多集的集数表达方式,用于支持单文件多集
|
||||
"""
|
||||
episodes = self.get_episode_list()
|
||||
episodes = self.episode_list
|
||||
if episodes:
|
||||
# 集 xx
|
||||
if len(episodes) == 1:
|
||||
@ -363,23 +372,25 @@ class MetaBase(object):
|
||||
else:
|
||||
return ""
|
||||
|
||||
def get_episode_seq(self) -> str:
|
||||
@property
|
||||
def episode_seq(self) -> str:
|
||||
"""
|
||||
返回begin_episode 的数字
|
||||
"""
|
||||
episodes = self.get_episode_list()
|
||||
episodes = self.episode_list
|
||||
if episodes:
|
||||
return str(episodes[0])
|
||||
else:
|
||||
return ""
|
||||
|
||||
def get_season_episode_string(self) -> str:
|
||||
@property
|
||||
def season_episode(self) -> str:
|
||||
"""
|
||||
返回季集字符串
|
||||
"""
|
||||
if self.type == MediaType.TV:
|
||||
seaion = self.get_season_string()
|
||||
episode = self.get_episode_string()
|
||||
seaion = self.season
|
||||
episode = self.episode
|
||||
if seaion and episode:
|
||||
return "%s %s" % (seaion, episode)
|
||||
elif seaion:
|
||||
@ -390,7 +401,8 @@ class MetaBase(object):
|
||||
return ""
|
||||
return ""
|
||||
|
||||
def get_resource_type_string(self) -> str:
|
||||
@property
|
||||
def resource(self) -> str:
|
||||
"""
|
||||
返回资源类型字符串,含分辨率
|
||||
"""
|
||||
@ -403,7 +415,8 @@ class MetaBase(object):
|
||||
ret_string = f"{ret_string} {self.resource_pix}"
|
||||
return ret_string
|
||||
|
||||
def get_edtion_string(self) -> str:
|
||||
@property
|
||||
def edtion(self) -> str:
|
||||
"""
|
||||
返回资源类型字符串,不含分辨率
|
||||
"""
|
||||
@ -414,7 +427,8 @@ class MetaBase(object):
|
||||
ret_string = f"{ret_string} {self.resource_effect}"
|
||||
return ret_string.strip()
|
||||
|
||||
def get_resource_team_string(self) -> str:
|
||||
@property
|
||||
def release_team(self) -> str:
|
||||
"""
|
||||
返回发布组/字幕组字符串
|
||||
"""
|
||||
@ -423,13 +437,15 @@ class MetaBase(object):
|
||||
else:
|
||||
return ""
|
||||
|
||||
def get_video_encode_string(self) -> str:
|
||||
@property
|
||||
def video_term(self) -> str:
|
||||
"""
|
||||
返回视频编码
|
||||
"""
|
||||
return self.video_encode or ""
|
||||
|
||||
def get_audio_encode_string(self) -> str:
|
||||
@property
|
||||
def audio_term(self) -> str:
|
||||
"""
|
||||
返回音频编码
|
||||
"""
|
||||
|
@ -190,7 +190,7 @@ class MetaVideo(MetaBase):
|
||||
# 第季集后面的不要
|
||||
if self._last_token_type == 'name_se_words':
|
||||
return
|
||||
if self.get_name():
|
||||
if self.name:
|
||||
# 名字后面以 0 开头的不要,极有可能是集
|
||||
if token.startswith('0'):
|
||||
return
|
||||
@ -245,7 +245,7 @@ class MetaVideo(MetaBase):
|
||||
self._last_token_type = "enname"
|
||||
|
||||
def __init_part(self, token: str):
|
||||
if not self.get_name():
|
||||
if not self.name:
|
||||
return
|
||||
if not self.year \
|
||||
and not self.begin_season \
|
||||
@ -268,7 +268,7 @@ class MetaVideo(MetaBase):
|
||||
self._stop_name_flag = False
|
||||
|
||||
def __init_year(self, token: str):
|
||||
if not self.get_name():
|
||||
if not self.name:
|
||||
return
|
||||
if not token.isdigit():
|
||||
return
|
||||
@ -290,7 +290,7 @@ class MetaVideo(MetaBase):
|
||||
self._stop_name_flag = True
|
||||
|
||||
def __init_resource_pix(self, token: str):
|
||||
if not self.get_name():
|
||||
if not self.name:
|
||||
return
|
||||
re_res = re.findall(r"%s" % self._resources_pix_re, token, re.IGNORECASE)
|
||||
if re_res:
|
||||
@ -443,7 +443,7 @@ class MetaVideo(MetaBase):
|
||||
self._last_token_type = "EPISODE"
|
||||
|
||||
def __init_resource_type(self, token):
|
||||
if not self.get_name():
|
||||
if not self.name:
|
||||
return
|
||||
source_res = re.search(r"(%s)" % self._source_re, token, re.IGNORECASE)
|
||||
if source_res:
|
||||
@ -481,7 +481,7 @@ class MetaVideo(MetaBase):
|
||||
self._last_token = effect.upper()
|
||||
|
||||
def __init_video_encode(self, token: str):
|
||||
if not self.get_name():
|
||||
if not self.name:
|
||||
return
|
||||
if not self.year \
|
||||
and not self.resource_pix \
|
||||
@ -521,7 +521,7 @@ class MetaVideo(MetaBase):
|
||||
self.video_encode = f"{self.video_encode} 10bit"
|
||||
|
||||
def __init_audio_encode(self, token: str):
|
||||
if not self.get_name():
|
||||
if not self.name:
|
||||
return
|
||||
if not self.year \
|
||||
and not self.resource_pix \
|
||||
|
@ -175,8 +175,8 @@ class TorrentHelper:
|
||||
def get_sort_str(_context):
|
||||
_meta = _context.meta_info
|
||||
_torrent = _context.torrent_info
|
||||
season_len = str(len(_meta.get_season_list())).rjust(2, '0')
|
||||
episode_len = str(9999 - len(_meta.get_episode_list())).rjust(4, '0')
|
||||
season_len = str(len(_meta.season_list)).rjust(2, '0')
|
||||
episode_len = str(9999 - len(_meta.episode_list)).rjust(4, '0')
|
||||
# 排序:标题、资源类型、站点、做种、季集
|
||||
return "%s%s%s%s" % (str(_torrent.title).ljust(100, ' '),
|
||||
str(_torrent.pri_order).rjust(3, '0'),
|
||||
@ -208,10 +208,10 @@ class TorrentHelper:
|
||||
meta = context.meta_info
|
||||
media = context.media_info
|
||||
if media.type == MediaType.TV:
|
||||
media_name = "%s%s" % (media.get_title_string(),
|
||||
media_name = "%s%s" % (media.title_year,
|
||||
meta.get_season_episode_string())
|
||||
else:
|
||||
media_name = media.get_title_string()
|
||||
media_name = media.title_year
|
||||
if media_name not in _added:
|
||||
_added.append(media_name)
|
||||
result.append(context)
|
||||
@ -230,5 +230,5 @@ class TorrentHelper:
|
||||
meta = MetaInfo(file)
|
||||
if not meta.begin_episode:
|
||||
continue
|
||||
episodes = list(set(episodes).union(set(meta.get_episode_list())))
|
||||
episodes = list(set(episodes).union(set(meta.episode_list)))
|
||||
return episodes
|
||||
|
@ -98,9 +98,9 @@ class DoubanModule(_ModuleBase):
|
||||
if settings.SEARCH_SOURCE != "douban":
|
||||
return None
|
||||
|
||||
if not meta.get_name():
|
||||
if not meta.name:
|
||||
return []
|
||||
result = self.doubanapi.search(meta.get_name())
|
||||
result = self.doubanapi.search(meta.name)
|
||||
if not result:
|
||||
return []
|
||||
# 返回数据
|
||||
@ -128,7 +128,7 @@ class DoubanModule(_ModuleBase):
|
||||
if not title:
|
||||
continue
|
||||
meta = MetaInfo(title)
|
||||
if meta.get_name() == name and (not season or meta.begin_season == season):
|
||||
if meta.name == name and (not season or meta.begin_season == season):
|
||||
return item_obj
|
||||
return {}
|
||||
|
||||
@ -148,7 +148,7 @@ class DoubanModule(_ModuleBase):
|
||||
logger.info(f"开始刮削媒体库文件:{file} ...")
|
||||
try:
|
||||
meta = MetaInfo(file.stem)
|
||||
if not meta.get_name():
|
||||
if not meta.name:
|
||||
continue
|
||||
# 根据名称查询豆瓣数据
|
||||
doubaninfo = self.match(name=mediainfo.title, year=mediainfo.year, season=meta.begin_season)
|
||||
|
@ -41,7 +41,7 @@ class EmbyModule(_ModuleBase):
|
||||
if mediainfo.type == MediaType.MOVIE:
|
||||
movies = self.emby.get_movies(title=mediainfo.title, year=mediainfo.year)
|
||||
if not movies:
|
||||
logger.info(f"{mediainfo.get_title_string()} 在媒体库中不存在")
|
||||
logger.info(f"{mediainfo.title_year} 在媒体库中不存在")
|
||||
return None
|
||||
else:
|
||||
logger.info(f"媒体库中已存在:{movies}")
|
||||
@ -51,10 +51,10 @@ class EmbyModule(_ModuleBase):
|
||||
year=mediainfo.year,
|
||||
tmdb_id=mediainfo.tmdb_id)
|
||||
if not tvs:
|
||||
logger.info(f"{mediainfo.get_title_string()} 在媒体库中不存在")
|
||||
logger.info(f"{mediainfo.title_year} 在媒体库中不存在")
|
||||
return None
|
||||
else:
|
||||
logger.info(f"{mediainfo.get_title_string()} 媒体库中已存在:{tvs}")
|
||||
logger.info(f"{mediainfo.title_year} 媒体库中已存在:{tvs}")
|
||||
return ExistMediaInfo(type=MediaType.TV, seasons=tvs)
|
||||
|
||||
def refresh_mediaserver(self, mediainfo: MediaInfo, file_path: Path) -> Optional[bool]:
|
||||
|
@ -38,7 +38,7 @@ class FanartModule(_ModuleBase):
|
||||
else:
|
||||
result = self.__request_fanart(mediainfo.type, mediainfo.tvdb_id)
|
||||
if not result or result.get('status') == 'error':
|
||||
logger.warn(f"没有获取到 {mediainfo.get_title_string()} 的Fanart图片数据")
|
||||
logger.warn(f"没有获取到 {mediainfo.title_year} 的Fanart图片数据")
|
||||
return
|
||||
for name, images in result.items():
|
||||
if not images:
|
||||
|
@ -137,11 +137,11 @@ class FileTransferModule(_ModuleBase):
|
||||
if (org_path.stem == Path(sub_file_name).stem) or \
|
||||
(sub_metainfo.cn_name and sub_metainfo.cn_name == metainfo.cn_name) \
|
||||
or (sub_metainfo.en_name and sub_metainfo.en_name == metainfo.en_name):
|
||||
if metainfo.get_season_string() \
|
||||
and metainfo.get_season_string() != sub_metainfo.get_season_string():
|
||||
if metainfo.season \
|
||||
and metainfo.season != sub_metainfo.season:
|
||||
continue
|
||||
if metainfo.get_episode_string() \
|
||||
and metainfo.get_episode_string() != sub_metainfo.get_episode_string():
|
||||
if metainfo.episode \
|
||||
and metainfo.episode != sub_metainfo.episode:
|
||||
continue
|
||||
new_file_type = ""
|
||||
# 兼容jellyfin字幕识别(多重识别), emby则会识别最后一个后缀
|
||||
@ -444,11 +444,11 @@ class FileTransferModule(_ModuleBase):
|
||||
# 原语种标题
|
||||
"original_title": mediainfo.original_title,
|
||||
# 识别名称
|
||||
"name": meta.get_name(),
|
||||
"name": meta.name,
|
||||
# 年份
|
||||
"year": mediainfo.year,
|
||||
# 版本
|
||||
"edition": meta.get_edtion_string(),
|
||||
"edition": meta.edtion,
|
||||
# 分辨率
|
||||
"videoFormat": meta.resource_pix,
|
||||
# 制作组/字幕组
|
||||
@ -464,11 +464,11 @@ class FileTransferModule(_ModuleBase):
|
||||
# IMDBID
|
||||
"imdbid": mediainfo.imdb_id,
|
||||
# 季号
|
||||
"season": meta.get_season_seq(),
|
||||
"season": meta.season_seq,
|
||||
# 集号
|
||||
"episode": meta.get_episode_seqs(),
|
||||
"episode": meta.episode_seqs,
|
||||
# 季集 SxxExx
|
||||
"season_episode": "%s%s" % (meta.get_begin_season_string(), meta.get_episode_strings()),
|
||||
"season_episode": "%s%s" % (meta.season_name, meta.episode),
|
||||
# 段/节
|
||||
"part": meta.part,
|
||||
# 文件后缀
|
||||
|
@ -105,12 +105,12 @@ class FilterModule(_ModuleBase):
|
||||
seasons = season_episodes.keys()
|
||||
meta = MetaInfo(title=torrent.title, subtitle=torrent.description)
|
||||
# 种子季
|
||||
torrent_seasons = meta.get_season_list()
|
||||
torrent_seasons = meta.season_list
|
||||
if not torrent_seasons:
|
||||
# 按第一季处理
|
||||
torrent_seasons = [1]
|
||||
# 种子集
|
||||
torrent_episodes = meta.get_episode_list()
|
||||
torrent_episodes = meta.episode_list
|
||||
if not set(torrent_seasons).issubset(set(seasons)):
|
||||
# 种子季不在过滤季中
|
||||
logger.info(f"种子 {torrent.title} 不是需要的季")
|
||||
|
@ -41,7 +41,7 @@ class JellyfinModule(_ModuleBase):
|
||||
if mediainfo.type == MediaType.MOVIE:
|
||||
movies = self.jellyfin.get_movies(title=mediainfo.title, year=mediainfo.year)
|
||||
if not movies:
|
||||
logger.info(f"{mediainfo.get_title_string()} 在媒体库中不存在")
|
||||
logger.info(f"{mediainfo.title_year} 在媒体库中不存在")
|
||||
return None
|
||||
else:
|
||||
logger.info(f"媒体库中已存在:{movies}")
|
||||
@ -51,10 +51,10 @@ class JellyfinModule(_ModuleBase):
|
||||
year=mediainfo.year,
|
||||
tmdb_id=mediainfo.tmdb_id)
|
||||
if not tvs:
|
||||
logger.info(f"{mediainfo.get_title_string()} 在媒体库中不存在")
|
||||
logger.info(f"{mediainfo.title_year} 在媒体库中不存在")
|
||||
return None
|
||||
else:
|
||||
logger.info(f"{mediainfo.get_title_string()} 媒体库中已存在:{tvs}")
|
||||
logger.info(f"{mediainfo.title_year} 媒体库中已存在:{tvs}")
|
||||
return ExistMediaInfo(type=MediaType.TV, seasons=tvs)
|
||||
|
||||
def refresh_mediaserver(self, mediainfo: MediaInfo, file_path: Path) -> Optional[bool]:
|
||||
|
@ -41,7 +41,7 @@ class PlexModule(_ModuleBase):
|
||||
if mediainfo.type == MediaType.MOVIE:
|
||||
movies = self.plex.get_movies(title=mediainfo.title, year=mediainfo.year)
|
||||
if not movies:
|
||||
logger.info(f"{mediainfo.get_title_string()} 在媒体库中不存在")
|
||||
logger.info(f"{mediainfo.title_year} 在媒体库中不存在")
|
||||
return None
|
||||
else:
|
||||
logger.info(f"媒体库中已存在:{movies}")
|
||||
@ -50,10 +50,10 @@ class PlexModule(_ModuleBase):
|
||||
tvs = self.plex.get_tv_episodes(title=mediainfo.title,
|
||||
year=mediainfo.year)
|
||||
if not tvs:
|
||||
logger.info(f"{mediainfo.get_title_string()} 在媒体库中不存在")
|
||||
logger.info(f"{mediainfo.title_year} 在媒体库中不存在")
|
||||
return None
|
||||
else:
|
||||
logger.info(f"{mediainfo.get_title_string()} 媒体库中已存在:{tvs}")
|
||||
logger.info(f"{mediainfo.title_year} 媒体库中已存在:{tvs}")
|
||||
return ExistMediaInfo(type=MediaType.TV, seasons=tvs)
|
||||
|
||||
def refresh_mediaserver(self, mediainfo: MediaInfo, file_path: Path) -> Optional[bool]:
|
||||
|
@ -71,11 +71,11 @@ class QbittorrentModule(_ModuleBase):
|
||||
file_id = torrent_file.get("id")
|
||||
file_name = torrent_file.get("name")
|
||||
meta_info = MetaInfo(file_name)
|
||||
if not meta_info.get_episode_list() \
|
||||
or not set(meta_info.get_episode_list()).issubset(episodes):
|
||||
if not meta_info.episode_list \
|
||||
or not set(meta_info.episode_list).issubset(episodes):
|
||||
file_ids.append(file_id)
|
||||
else:
|
||||
sucess_epidised = list(set(sucess_epidised).union(set(meta_info.get_episode_list())))
|
||||
sucess_epidised = list(set(sucess_epidised).union(set(meta_info.episode_list)))
|
||||
if sucess_epidised and file_ids:
|
||||
# 选择文件
|
||||
self.qbittorrent.set_files(torrent_hash=torrent_hash, file_ids=file_ids, priority=0)
|
||||
|
@ -177,13 +177,13 @@ class Slack:
|
||||
index = 1
|
||||
for media in medias:
|
||||
if media.get_poster_image():
|
||||
if media.get_star_string():
|
||||
text = f"{index}. *<{media.get_detail_url()}|{media.get_title_string()}>*" \
|
||||
if media.vote_star:
|
||||
text = f"{index}. *<{media.detail_link}|{media.title_year}>*" \
|
||||
f"\n类型:{media.type.value}" \
|
||||
f"\n{media.get_star_string()}" \
|
||||
f"\n{media.vote_star}" \
|
||||
f"\n{media.get_overview_string(50)}"
|
||||
else:
|
||||
text = f"{index}. *<{media.get_detail_url()}|{media.get_title_string()}>*" \
|
||||
text = f"{index}. *<{media.detail_link}|{media.title_year}>*" \
|
||||
f"\n类型:{media.type.value}" \
|
||||
f"\n{media.get_overview_string(50)}"
|
||||
blocks.append(
|
||||
@ -196,7 +196,7 @@ class Slack:
|
||||
"accessory": {
|
||||
"type": "image",
|
||||
"image_url": f"{media.get_poster_image()}",
|
||||
"alt_text": f"{media.get_title_string()}"
|
||||
"alt_text": f"{media.title_year}"
|
||||
}
|
||||
}
|
||||
)
|
||||
@ -261,9 +261,9 @@ class Slack:
|
||||
site_name = torrent.site_name
|
||||
meta = MetaInfo(torrent.title, torrent.description)
|
||||
link = torrent.page_url
|
||||
title = f"{meta.get_season_episode_string()} " \
|
||||
f"{meta.get_resource_type_string()} " \
|
||||
f"{meta.get_resource_team_string()}"
|
||||
title = f"{meta.season_episode} " \
|
||||
f"{meta.resource} " \
|
||||
f"{meta.release_team}"
|
||||
title = re.sub(r"\s+", " ", title).strip()
|
||||
free = torrent.get_volume_factor_string()
|
||||
seeder = f"{torrent.seeders}↑"
|
||||
|
@ -109,15 +109,15 @@ class Telegram(metaclass=Singleton):
|
||||
if media.vote_average:
|
||||
caption = "%s\n%s. [%s](%s)\n_%s,%s_" % (caption,
|
||||
index,
|
||||
media.get_title_string(),
|
||||
media.get_detail_url(),
|
||||
media.title_year,
|
||||
media.detail_link,
|
||||
f"类型:{media.type.value}",
|
||||
f"评分:{media.vote_average}")
|
||||
else:
|
||||
caption = "%s\n%s. [%s](%s)\n_%s_" % (caption,
|
||||
index,
|
||||
media.get_title_string(),
|
||||
media.get_detail_url(),
|
||||
media.title_year,
|
||||
media.detail_link,
|
||||
f"类型:{media.type.value}")
|
||||
index += 1
|
||||
|
||||
@ -148,9 +148,9 @@ class Telegram(metaclass=Singleton):
|
||||
site_name = torrent.site_name
|
||||
meta = MetaInfo(torrent.title, torrent.description)
|
||||
link = torrent.page_url
|
||||
title = f"{meta.get_season_episode_string()} " \
|
||||
f"{meta.get_resource_type_string()} " \
|
||||
f"{meta.get_resource_team_string()}"
|
||||
title = f"{meta.season_episode} " \
|
||||
f"{meta.resource} " \
|
||||
f"{meta.release_team}"
|
||||
title = re.sub(r"\s+", " ", title).strip()
|
||||
free = torrent.get_volume_factor_string()
|
||||
seeder = f"{torrent.seeders}↑"
|
||||
|
@ -60,38 +60,38 @@ class TheMovieDbModule(_ModuleBase):
|
||||
# 直接查询详情
|
||||
info = self.tmdb.get_info(mtype=mtype, tmdbid=tmdbid)
|
||||
else:
|
||||
logger.info(f"正在识别 {meta.get_name()} ...")
|
||||
logger.info(f"正在识别 {meta.name} ...")
|
||||
if meta.type == MediaType.UNKNOWN and not meta.year:
|
||||
info = self.tmdb.match_multi(meta.get_name())
|
||||
info = self.tmdb.match_multi(meta.name)
|
||||
else:
|
||||
if meta.type == MediaType.TV:
|
||||
# 确定是电视
|
||||
info = self.tmdb.match(name=meta.get_name(),
|
||||
info = self.tmdb.match(name=meta.name,
|
||||
year=meta.year,
|
||||
mtype=meta.type,
|
||||
season_year=meta.year,
|
||||
season_number=meta.begin_season)
|
||||
if meta.year:
|
||||
# 非严格模式下去掉年份再查一次
|
||||
info = self.tmdb.match(name=meta.get_name(),
|
||||
info = self.tmdb.match(name=meta.name,
|
||||
mtype=meta.type)
|
||||
else:
|
||||
# 有年份先按电影查
|
||||
info = self.tmdb.match(name=meta.get_name(),
|
||||
info = self.tmdb.match(name=meta.name,
|
||||
year=meta.year,
|
||||
mtype=MediaType.MOVIE)
|
||||
# 没有再按电视剧查
|
||||
if not info:
|
||||
info = self.tmdb.match(name=meta.get_name(),
|
||||
info = self.tmdb.match(name=meta.name,
|
||||
year=meta.year,
|
||||
mtype=MediaType.TV)
|
||||
if not info:
|
||||
# 非严格模式下去掉年份和类型再查一次
|
||||
info = self.tmdb.match_multi(name=meta.get_name())
|
||||
info = self.tmdb.match_multi(name=meta.name)
|
||||
|
||||
if not info:
|
||||
# 从网站查询
|
||||
info = self.tmdb.match_web(name=meta.get_name(),
|
||||
info = self.tmdb.match_web(name=meta.name,
|
||||
mtype=meta.type)
|
||||
# 补充全量信息
|
||||
if info and not info.get("genres"):
|
||||
@ -102,11 +102,11 @@ class TheMovieDbModule(_ModuleBase):
|
||||
else:
|
||||
# 使用缓存信息
|
||||
if cache_info.get("title"):
|
||||
logger.info(f"{meta.get_name()} 使用识别缓存:{cache_info.get('title')}")
|
||||
logger.info(f"{meta.name} 使用识别缓存:{cache_info.get('title')}")
|
||||
info = self.tmdb.get_info(mtype=cache_info.get("type"),
|
||||
tmdbid=cache_info.get("id"))
|
||||
else:
|
||||
logger.info(f"{meta.get_name()} 使用识别缓存:无法识别")
|
||||
logger.info(f"{meta.name} 使用识别缓存:无法识别")
|
||||
info = None
|
||||
|
||||
if info:
|
||||
@ -118,12 +118,12 @@ class TheMovieDbModule(_ModuleBase):
|
||||
# 赋值TMDB信息并返回
|
||||
mediainfo = MediaInfo(tmdb_info=info)
|
||||
mediainfo.set_category(cat)
|
||||
logger.info(f"{meta.get_name()} 识别结果:{mediainfo.type.value} "
|
||||
f"{mediainfo.get_title_string()} "
|
||||
logger.info(f"{meta.name} 识别结果:{mediainfo.type.value} "
|
||||
f"{mediainfo.title_year} "
|
||||
f"{mediainfo.tmdb_id}")
|
||||
return mediainfo
|
||||
else:
|
||||
logger.info(f"{meta.get_name()} 未匹配到媒体信息")
|
||||
logger.info(f"{meta.name} 未匹配到媒体信息")
|
||||
|
||||
return None
|
||||
|
||||
@ -137,15 +137,15 @@ class TheMovieDbModule(_ModuleBase):
|
||||
if settings.SEARCH_SOURCE != "themoviedb":
|
||||
return None
|
||||
|
||||
if not meta.get_name():
|
||||
if not meta.name:
|
||||
return []
|
||||
if meta.type == MediaType.UNKNOWN and not meta.year:
|
||||
results = self.tmdb.search_multiis(meta.get_name())
|
||||
results = self.tmdb.search_multiis(meta.name)
|
||||
else:
|
||||
if meta.type == MediaType.UNKNOWN:
|
||||
results = list(
|
||||
set(self.tmdb.search_movies(meta.get_name(), meta.year))
|
||||
.union(set(self.tmdb.search_tv_tmdbinfos(meta.get_name(), meta.year)))
|
||||
set(self.tmdb.search_movies(meta.name, meta.year))
|
||||
.union(set(self.tmdb.search_tv_tmdbinfos(meta.name, meta.year)))
|
||||
)
|
||||
# 组合结果的情况下要排序
|
||||
results = sorted(
|
||||
@ -154,9 +154,9 @@ class TheMovieDbModule(_ModuleBase):
|
||||
reverse=True
|
||||
)
|
||||
elif meta.type == MediaType.MOVIE:
|
||||
results = self.tmdb.search_movies(meta.get_name(), meta.year)
|
||||
results = self.tmdb.search_movies(meta.name, meta.year)
|
||||
else:
|
||||
results = self.tmdb.search_tv_tmdbinfos(meta.get_name(), meta.year)
|
||||
results = self.tmdb.search_tv_tmdbinfos(meta.name, meta.year)
|
||||
|
||||
return [MediaInfo(tmdb_info=info) for info in results]
|
||||
|
||||
|
@ -48,7 +48,7 @@ class TmdbCache(metaclass=Singleton):
|
||||
"""
|
||||
获取缓存KEY
|
||||
"""
|
||||
return f"[{meta.type.value if meta.type else '未知'}]{meta.get_name()}-{meta.year}-{meta.begin_season}"
|
||||
return f"[{meta.type.value if meta.type else '未知'}]{meta.name}-{meta.year}-{meta.begin_season}"
|
||||
|
||||
def get(self, meta: MetaBase):
|
||||
"""
|
||||
|
@ -59,9 +59,9 @@ class TransmissionModule(_ModuleBase):
|
||||
file_id = torrent_file.id
|
||||
file_name = torrent_file.name
|
||||
meta_info = MetaInfo(file_name)
|
||||
if not meta_info.get_episode_list():
|
||||
if not meta_info.episode_list:
|
||||
continue
|
||||
selected = set(meta_info.get_episode_list()).issubset(set(episodes))
|
||||
selected = set(meta_info.episode_list).issubset(set(episodes))
|
||||
if not selected:
|
||||
continue
|
||||
file_ids.append(file_id)
|
||||
|
@ -170,14 +170,14 @@ class WeChat(metaclass=Singleton):
|
||||
index = 1
|
||||
for media in medias:
|
||||
if media.vote_average:
|
||||
title = f"{index}. {media.get_title_string()}\n类型:{media.type.value},评分:{media.vote_average}"
|
||||
title = f"{index}. {media.title_year}\n类型:{media.type.value},评分:{media.vote_average}"
|
||||
else:
|
||||
title = f"{index}. {media.get_title_string()}\n类型:{media.type.value}"
|
||||
title = f"{index}. {media.title_year}\n类型:{media.type.value}"
|
||||
articles.append({
|
||||
"title": title,
|
||||
"description": "",
|
||||
"picurl": media.get_message_image() if index == 1 else media.get_poster_image(),
|
||||
"url": media.get_detail_url()
|
||||
"url": media.detail_link
|
||||
})
|
||||
index += 1
|
||||
|
||||
@ -214,9 +214,9 @@ class WeChat(metaclass=Singleton):
|
||||
torrent = context.torrent_info
|
||||
meta = MetaInfo(title=torrent.title, subtitle=torrent.description)
|
||||
torrent_title = f"{index}.【{torrent.site_name}】" \
|
||||
f"{meta.get_season_episode_string()} " \
|
||||
f"{meta.get_resource_type_string()} " \
|
||||
f"{meta.get_resource_team_string()} " \
|
||||
f"{meta.season_episode} " \
|
||||
f"{meta.resource} " \
|
||||
f"{meta.release_team} " \
|
||||
f"{StringUtils.str_filesize(torrent.size)} " \
|
||||
f"{torrent.get_volume_factor_string()} " \
|
||||
f"{torrent.seeders}↑"
|
||||
|
@ -24,9 +24,9 @@ class MetaInfoTest(TestCase):
|
||||
"en_name": meta_info.en_name or "",
|
||||
"year": meta_info.year or "",
|
||||
"part": meta_info.part or "",
|
||||
"season": meta_info.get_season_string(),
|
||||
"episode": meta_info.get_episode_string(),
|
||||
"restype": meta_info.get_edtion_string(),
|
||||
"season": meta_info.season,
|
||||
"episode": meta_info.episode,
|
||||
"restype": meta_info.edtion,
|
||||
"pix": meta_info.resource_pix or "",
|
||||
"video_codec": meta_info.video_encode or "",
|
||||
"audio_codec": meta_info.audio_encode or ""
|
||||
|
Loading…
x
Reference in New Issue
Block a user