feat:种子名为拼音的情况下,从副标题中提取中文名用于识别
This commit is contained in:
@ -75,8 +75,8 @@ class MetaBase(object):
|
|||||||
def __init__(self, title: str, subtitle: str = None, isfile: bool = False):
|
def __init__(self, title: str, subtitle: str = None, isfile: bool = False):
|
||||||
if not title:
|
if not title:
|
||||||
return
|
return
|
||||||
self.org_string = title
|
self.org_string = title.strip() if title else None
|
||||||
self.subtitle = subtitle
|
self.subtitle = subtitle.strip() if subtitle else None
|
||||||
self.isfile = isfile
|
self.isfile = isfile
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -1,13 +1,16 @@
|
|||||||
import re
|
import re
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
from Pinyin2Hanzi import is_pinyin
|
||||||
|
|
||||||
from app.core.config import settings
|
from app.core.config import settings
|
||||||
from app.core.meta.customization import CustomizationMatcher
|
from app.core.meta.customization import CustomizationMatcher
|
||||||
from app.core.meta.metabase import MetaBase
|
from app.core.meta.metabase import MetaBase
|
||||||
from app.core.meta.releasegroup import ReleaseGroupsMatcher
|
from app.core.meta.releasegroup import ReleaseGroupsMatcher
|
||||||
|
from app.schemas.types import MediaType
|
||||||
from app.utils.string import StringUtils
|
from app.utils.string import StringUtils
|
||||||
from app.utils.tokens import Tokens
|
from app.utils.tokens import Tokens
|
||||||
from app.schemas.types import MediaType
|
|
||||||
|
|
||||||
|
|
||||||
class MetaVideo(MetaBase):
|
class MetaVideo(MetaBase):
|
||||||
@ -52,6 +55,12 @@ class MetaVideo(MetaBase):
|
|||||||
_audio_encode_re = r"^DTS\d?$|^DTSHD$|^DTSHDMA$|^Atmos$|^TrueHD\d?$|^AC3$|^\dAudios?$|^DDP\d?$|^DD\d?$|^LPCM\d?$|^AAC\d?$|^FLAC\d?$|^HD\d?$|^MA\d?$"
|
_audio_encode_re = r"^DTS\d?$|^DTSHD$|^DTSHDMA$|^Atmos$|^TrueHD\d?$|^AC3$|^\dAudios?$|^DDP\d?$|^DD\d?$|^LPCM\d?$|^AAC\d?$|^FLAC\d?$|^HD\d?$|^MA\d?$"
|
||||||
|
|
||||||
def __init__(self, title: str, subtitle: str = None, isfile: bool = False):
|
def __init__(self, title: str, subtitle: str = None, isfile: bool = False):
|
||||||
|
"""
|
||||||
|
初始化
|
||||||
|
:param title: 标题
|
||||||
|
:param subtitle: 副标题
|
||||||
|
:param isfile: 是否是文件名
|
||||||
|
"""
|
||||||
super().__init__(title, subtitle, isfile)
|
super().__init__(title, subtitle, isfile)
|
||||||
if not title:
|
if not title:
|
||||||
return
|
return
|
||||||
@ -130,12 +139,47 @@ class MetaVideo(MetaBase):
|
|||||||
# 处理part
|
# 处理part
|
||||||
if self.part and self.part.upper() == "PART":
|
if self.part and self.part.upper() == "PART":
|
||||||
self.part = None
|
self.part = None
|
||||||
|
# 没有中文标题时,偿试中描述中获取中文名
|
||||||
|
if not self.cn_name and self.en_name and self.subtitle:
|
||||||
|
if self.__is_pinyin(self.en_name):
|
||||||
|
# 英文名是拼音
|
||||||
|
cn_name = self.__get_title_from_description(self.subtitle)
|
||||||
|
if len(cn_name) == len(self.en_name.split()):
|
||||||
|
# 中文名和拼音单词数相同,认为是中文名
|
||||||
|
self.cn_name = cn_name
|
||||||
# 制作组/字幕组
|
# 制作组/字幕组
|
||||||
self.resource_team = ReleaseGroupsMatcher().match(title=original_title) or None
|
self.resource_team = ReleaseGroupsMatcher().match(title=original_title) or None
|
||||||
# 自定义占位符
|
# 自定义占位符
|
||||||
self.customization = CustomizationMatcher().match(title=original_title) or None
|
self.customization = CustomizationMatcher().match(title=original_title) or None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def __get_title_from_description(description: str) -> Optional[str]:
|
||||||
|
"""
|
||||||
|
从描述中提取标题
|
||||||
|
"""
|
||||||
|
if not description:
|
||||||
|
return None
|
||||||
|
titles = re.split(r'[\s/|]+', description)
|
||||||
|
if StringUtils.is_chinese(titles[0]):
|
||||||
|
return titles[0]
|
||||||
|
return None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def __is_pinyin(name_str: str) -> bool:
|
||||||
|
"""
|
||||||
|
判断是否拼音
|
||||||
|
"""
|
||||||
|
if not name_str:
|
||||||
|
return False
|
||||||
|
for n in name_str.lower().split():
|
||||||
|
if not is_pinyin(n):
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
def __fix_name(self, name: str):
|
def __fix_name(self, name: str):
|
||||||
|
"""
|
||||||
|
去掉名字中不需要的干扰字符
|
||||||
|
"""
|
||||||
if not name:
|
if not name:
|
||||||
return name
|
return name
|
||||||
name = re.sub(r'%s' % self._name_nostring_re, '', name,
|
name = re.sub(r'%s' % self._name_nostring_re, '', name,
|
||||||
@ -157,6 +201,9 @@ class MetaVideo(MetaBase):
|
|||||||
return name
|
return name
|
||||||
|
|
||||||
def __init_name(self, token: str):
|
def __init_name(self, token: str):
|
||||||
|
"""
|
||||||
|
识别名称
|
||||||
|
"""
|
||||||
if not token:
|
if not token:
|
||||||
return
|
return
|
||||||
# 回收标题
|
# 回收标题
|
||||||
@ -250,6 +297,9 @@ class MetaVideo(MetaBase):
|
|||||||
self._last_token_type = "enname"
|
self._last_token_type = "enname"
|
||||||
|
|
||||||
def __init_part(self, token: str):
|
def __init_part(self, token: str):
|
||||||
|
"""
|
||||||
|
识别Part
|
||||||
|
"""
|
||||||
if not self.name:
|
if not self.name:
|
||||||
return
|
return
|
||||||
if not self.year \
|
if not self.year \
|
||||||
@ -273,6 +323,9 @@ class MetaVideo(MetaBase):
|
|||||||
# self._stop_name_flag = False
|
# self._stop_name_flag = False
|
||||||
|
|
||||||
def __init_year(self, token: str):
|
def __init_year(self, token: str):
|
||||||
|
"""
|
||||||
|
识别年份
|
||||||
|
"""
|
||||||
if not self.name:
|
if not self.name:
|
||||||
return
|
return
|
||||||
if not token.isdigit():
|
if not token.isdigit():
|
||||||
@ -295,6 +348,9 @@ class MetaVideo(MetaBase):
|
|||||||
self._stop_name_flag = True
|
self._stop_name_flag = True
|
||||||
|
|
||||||
def __init_resource_pix(self, token: str):
|
def __init_resource_pix(self, token: str):
|
||||||
|
"""
|
||||||
|
识别分辨率
|
||||||
|
"""
|
||||||
if not self.name:
|
if not self.name:
|
||||||
return
|
return
|
||||||
re_res = re.findall(r"%s" % self._resources_pix_re, token, re.IGNORECASE)
|
re_res = re.findall(r"%s" % self._resources_pix_re, token, re.IGNORECASE)
|
||||||
@ -331,6 +387,9 @@ class MetaVideo(MetaBase):
|
|||||||
self.resource_pix = re_res.group(1).lower()
|
self.resource_pix = re_res.group(1).lower()
|
||||||
|
|
||||||
def __init_season(self, token: str):
|
def __init_season(self, token: str):
|
||||||
|
"""
|
||||||
|
识别季
|
||||||
|
"""
|
||||||
re_res = re.findall(r"%s" % self._season_re, token, re.IGNORECASE)
|
re_res = re.findall(r"%s" % self._season_re, token, re.IGNORECASE)
|
||||||
if re_res:
|
if re_res:
|
||||||
self._last_token_type = "season"
|
self._last_token_type = "season"
|
||||||
@ -380,6 +439,9 @@ class MetaVideo(MetaBase):
|
|||||||
self.begin_season = 1
|
self.begin_season = 1
|
||||||
|
|
||||||
def __init_episode(self, token: str):
|
def __init_episode(self, token: str):
|
||||||
|
"""
|
||||||
|
识别集
|
||||||
|
"""
|
||||||
re_res = re.findall(r"%s" % self._episode_re, token, re.IGNORECASE)
|
re_res = re.findall(r"%s" % self._episode_re, token, re.IGNORECASE)
|
||||||
if re_res:
|
if re_res:
|
||||||
self._last_token_type = "episode"
|
self._last_token_type = "episode"
|
||||||
@ -450,6 +512,9 @@ class MetaVideo(MetaBase):
|
|||||||
self._last_token_type = "EPISODE"
|
self._last_token_type = "EPISODE"
|
||||||
|
|
||||||
def __init_resource_type(self, token):
|
def __init_resource_type(self, token):
|
||||||
|
"""
|
||||||
|
识别资源类型
|
||||||
|
"""
|
||||||
if not self.name:
|
if not self.name:
|
||||||
return
|
return
|
||||||
source_res = re.search(r"(%s)" % self._source_re, token, re.IGNORECASE)
|
source_res = re.search(r"(%s)" % self._source_re, token, re.IGNORECASE)
|
||||||
@ -488,6 +553,9 @@ class MetaVideo(MetaBase):
|
|||||||
self._last_token = effect.upper()
|
self._last_token = effect.upper()
|
||||||
|
|
||||||
def __init_video_encode(self, token: str):
|
def __init_video_encode(self, token: str):
|
||||||
|
"""
|
||||||
|
识别视频编码
|
||||||
|
"""
|
||||||
if not self.name:
|
if not self.name:
|
||||||
return
|
return
|
||||||
if not self.year \
|
if not self.year \
|
||||||
@ -528,6 +596,9 @@ class MetaVideo(MetaBase):
|
|||||||
self.video_encode = f"{self.video_encode} 10bit"
|
self.video_encode = f"{self.video_encode} 10bit"
|
||||||
|
|
||||||
def __init_audio_encode(self, token: str):
|
def __init_audio_encode(self, token: str):
|
||||||
|
"""
|
||||||
|
识别音频编码
|
||||||
|
"""
|
||||||
if not self.name:
|
if not self.name:
|
||||||
return
|
return
|
||||||
if not self.year \
|
if not self.year \
|
||||||
|
@ -55,4 +55,5 @@ docker~=6.1.3
|
|||||||
cachetools~=5.3.1
|
cachetools~=5.3.1
|
||||||
fast-bencode~=1.1.3
|
fast-bencode~=1.1.3
|
||||||
pystray~=0.19.5
|
pystray~=0.19.5
|
||||||
pyotp~=2.9.0
|
pyotp~=2.9.0
|
||||||
|
Pinyin2Hanzi~=0.1.1
|
Reference in New Issue
Block a user