diff --git a/app/core/metainfo.py b/app/core/metainfo.py index 9732b6da..cf7b5c10 100644 --- a/app/core/metainfo.py +++ b/app/core/metainfo.py @@ -1,4 +1,5 @@ from pathlib import Path +from typing import Tuple import regex as re @@ -20,7 +21,7 @@ def MetaInfo(title: str, subtitle: str = None) -> MetaBase: # 预处理标题 title, apply_words = WordsMatcher().prepare(title) # 获取标题中媒体信息 - title, mediainfo = find_mediainfo(title) + title, metainfo = find_metainfo(title) # 判断是否处理文件 if title and Path(title).suffix.lower() in settings.RMT_MEDIAEXT: isfile = True @@ -33,22 +34,22 @@ def MetaInfo(title: str, subtitle: str = None) -> MetaBase: # 记录使用的识别词 meta.apply_words = apply_words or [] # 修正媒体信息 - if mediainfo['tmdbid']: - meta.tmdbid = mediainfo['tmdbid'] - if mediainfo['type']: - meta.type = mediainfo['type'] - if mediainfo['begin_season']: - meta.begin_season = mediainfo['begin_season'] - if mediainfo['end_season']: - meta.end_season = mediainfo['end_season'] - if mediainfo['total_season']: - meta.total_season = mediainfo['total_season'] - if mediainfo['begin_episode']: - meta.begin_episode = mediainfo['begin_episode'] - if mediainfo['end_episode']: - meta.end_episode = mediainfo['end_episode'] - if mediainfo['total_episode']: - meta.total_episode = mediainfo['total_episode'] + if metainfo.get('tmdbid'): + meta.tmdbid = metainfo['tmdbid'] + if metainfo.get('type'): + meta.type = metainfo['type'] + if metainfo.get('begin_season'): + meta.begin_season = metainfo['begin_season'] + if metainfo.get('end_season'): + meta.end_season = metainfo['end_season'] + if metainfo.get('total_season'): + meta.total_season = metainfo['total_season'] + if metainfo.get('begin_episode'): + meta.begin_episode = metainfo['begin_episode'] + if metainfo.get('end_episode'): + meta.end_episode = metainfo['end_episode'] + if metainfo.get('total_episode'): + meta.total_episode = metainfo['total_episode'] return meta @@ -86,11 +87,11 @@ def is_anime(name: str) -> bool: return False -def find_mediainfo(title: str) -> (str, dict): +def find_metainfo(title: str) -> Tuple[str, dict]: """ 从标题中提取媒体信息 """ - media_info = { + metainfo = { 'tmdbid': None, 'type': None, 'begin_season': None, @@ -101,54 +102,54 @@ def find_mediainfo(title: str) -> (str, dict): 'total_episode': None, } if not title: - return title, media_info + return title, metainfo # 从标题中提取媒体信息 格式为{[tmdbid=xxx;type=xxx;s=xxx;e=xxx]} results = re.findall(r'(?<={\[)[\W\w]+(?=]})', title) if not results: - return title, media_info + return title, metainfo for result in results: tmdbid = re.findall(r'(?<=tmdbid=)\d+', result) # 查找tmdbid信息 if tmdbid and tmdbid[0].isdigit(): - media_info['tmdbid'] = tmdbid[0] + metainfo['tmdbid'] = tmdbid[0] # 查找媒体类型 mtype = re.findall(r'(?<=type=)\d+', result) if mtype: match mtype[0]: case "movie": - media_info['type'] = MediaType.MOVIE + metainfo['type'] = MediaType.MOVIE case "tv": - media_info['type'] = MediaType.TV + metainfo['type'] = MediaType.TV case _: pass # 查找季信息 begin_season = re.findall(r'(?<=s=)\d+', result) if begin_season and begin_season[0].isdigit(): - media_info['begin_season'] = int(begin_season[0]) + metainfo['begin_season'] = int(begin_season[0]) end_season = re.findall(r'(?<=s=\d+-)\d+', result) if end_season and end_season[0].isdigit(): - media_info['end_season'] = int(end_season[0]) + metainfo['end_season'] = int(end_season[0]) # 查找集信息 begin_episode = re.findall(r'(?<=e=)\d+', result) if begin_episode and begin_episode[0].isdigit(): - media_info['begin_episode'] = int(begin_episode[0]) + metainfo['begin_episode'] = int(begin_episode[0]) end_episode = re.findall(r'(?<=e=\d+-)\d+', result) if end_episode and end_episode[0].isdigit(): - media_info['end_episode'] = int(end_episode[0]) + metainfo['end_episode'] = int(end_episode[0]) # 去除title中该部分 if tmdbid or mtype or begin_season or end_season or begin_episode or end_episode: title = title.replace(f"{{[{result}]}}", '') # 计算季集总数 - if media_info['begin_season'] and media_info['end_season']: - if media_info['begin_season'] > media_info['end_season']: - media_info['begin_season'], media_info['end_season'] = media_info['end_season'], media_info['begin_season'] - media_info['total_season'] = media_info['end_season'] - media_info['begin_season'] + 1 - elif media_info['begin_season'] and not media_info['end_season']: - media_info['total_season'] = 1 - if media_info['begin_episode'] and media_info['end_episode']: - if media_info['begin_episode'] > media_info['end_episode']: - media_info['begin_episode'], media_info['end_episode'] = media_info['end_episode'], media_info['begin_episode'] - media_info['total_episode'] = media_info['end_episode'] - media_info['begin_episode'] + 1 - elif media_info['begin_episode'] and not media_info['end_episode']: - media_info['total_episode'] = 1 - return title, media_info + if metainfo.get('begin_season') and metainfo.get('end_season'): + if metainfo['begin_season'] > metainfo['end_season']: + metainfo['begin_season'], metainfo['end_season'] = metainfo['end_season'], metainfo['begin_season'] + metainfo['total_season'] = metainfo['end_season'] - metainfo['begin_season'] + 1 + elif metainfo.get('begin_season') and not metainfo.get('end_season'): + metainfo['total_season'] = 1 + if metainfo.get('begin_episode') and metainfo.get('end_episode'): + if metainfo['begin_episode'] > metainfo['end_episode']: + metainfo['begin_episode'], metainfo['end_episode'] = metainfo['end_episode'], metainfo['begin_episode'] + metainfo['total_episode'] = metainfo['end_episode'] - metainfo['begin_episode'] + 1 + elif metainfo.get('begin_episode') and not metainfo.get('end_episode'): + metainfo['total_episode'] = 1 + return title, metainfo