diff --git a/README.md b/README.md index a15ee1c4..0bfc84ef 100644 --- a/README.md +++ b/README.md @@ -197,6 +197,7 @@ docker pull jxxghp/moviepilot:latest > `edition`: 版本(资源类型+特效) > `videoFormat`: 分辨率 > `releaseGroup`: 制作组/字幕组 +> `customization`: 自定义占位符 > `videoCodec`: 视频编码 > `audioCodec`: 音频编码 > `tmdbid`: TMDBID diff --git a/app/core/meta/customization.py b/app/core/meta/customization.py new file mode 100644 index 00000000..ed221f87 --- /dev/null +++ b/app/core/meta/customization.py @@ -0,0 +1,47 @@ +import regex as re + +from app.db.systemconfig_oper import SystemConfigOper +from app.schemas.types import SystemConfigKey +from app.utils.singleton import Singleton + + +class CustomizationMatcher(metaclass=Singleton): + """ + 识别自定义占位符 + """ + customization = None + custom_separator = None + + def __init__(self): + self.systemconfig = SystemConfigOper() + self.customization = None + self.custom_separator = None + + def match(self, title=None): + """ + :param title: 资源标题或文件名 + :return: 匹配结果 + """ + if not title: + return "" + if not self.customization: + # 自定义占位符 + customization = self.systemconfig.get(SystemConfigKey.Customization) + if not customization: + return "" + if isinstance(customization, str): + customization = customization.replace("\n", ";").strip(";").split(";") + self.customization = "|".join([f"({item})" for item in customization]) + + customization_re = re.compile(r"%s" % self.customization) + # 处理重复多次的情况,保留先后顺序(按添加自定义占位符的顺序) + unique_customization = {} + for item in re.findall(customization_re, title): + if not isinstance(item, tuple): + item = (item,) + for i in range(len(item)): + if item[i] and unique_customization.get(item[i]) is None: + unique_customization[item[i]] = i + unique_customization = list(dict(sorted(unique_customization.items(), key=lambda x: x[1])).keys()) + separator = self.custom_separator or "@" + return separator.join(unique_customization) diff --git a/app/core/meta/metaanime.py b/app/core/meta/metaanime.py index 57ed3a51..ed2a2cc2 100644 --- a/app/core/meta/metaanime.py +++ b/app/core/meta/metaanime.py @@ -1,6 +1,7 @@ import re import zhconv import anitopy +from app.core.meta.customization import CustomizationMatcher from app.core.meta.metabase import MetaBase from app.core.meta.releasegroup import ReleaseGroupsMatcher from app.utils.string import StringUtils @@ -144,6 +145,8 @@ class MetaAnime(MetaBase): self.resource_team = \ ReleaseGroupsMatcher().match(title=original_title) or \ anitopy_info_origin.get("release_group") or None + # 自定义占位符 + self.customization = CustomizationMatcher().match(title=original_title) or None # 视频编码 self.video_encode = anitopy_info.get("video_term") if isinstance(self.video_encode, list): diff --git a/app/core/meta/metabase.py b/app/core/meta/metabase.py index d2b159ef..296ae2bb 100644 --- a/app/core/meta/metabase.py +++ b/app/core/meta/metabase.py @@ -51,6 +51,8 @@ class MetaBase(object): resource_pix: Optional[str] = None # 识别的制作组/字幕组 resource_team: Optional[str] = None + # 识别的自定义占位符 + customization: Optional[str] = None # 视频编码 video_encode: Optional[str] = None # 音频编码 @@ -492,6 +494,9 @@ class MetaBase(object): # 制作组/字幕组 if not self.resource_team: self.resource_team = meta.resource_team + # 自定义占位符 + if not self.customization: + self.customization = meta.customization # 特效 if not self.resource_effect: self.resource_effect = meta.resource_effect diff --git a/app/core/meta/metavideo.py b/app/core/meta/metavideo.py index 3c01ea84..f95bc25a 100644 --- a/app/core/meta/metavideo.py +++ b/app/core/meta/metavideo.py @@ -2,6 +2,7 @@ import re from pathlib import Path from app.core.config import settings +from app.core.meta.customization import CustomizationMatcher from app.core.meta.metabase import MetaBase from app.core.meta.releasegroup import ReleaseGroupsMatcher from app.utils.string import StringUtils @@ -130,6 +131,8 @@ class MetaVideo(MetaBase): self.part = None # 制作组/字幕组 self.resource_team = ReleaseGroupsMatcher().match(title=original_title) or None + # 自定义占位符 + self.customization = CustomizationMatcher().match(title=original_title) or None def __fix_name(self, name: str): if not name: diff --git a/app/modules/filetransfer/__init__.py b/app/modules/filetransfer/__init__.py index 0c4c1247..62c6944a 100644 --- a/app/modules/filetransfer/__init__.py +++ b/app/modules/filetransfer/__init__.py @@ -542,7 +542,9 @@ class FileTransferModule(_ModuleBase): # 剧集标题 "episode_title": episode_title, # 文件后缀 - "fileExt": file_ext + "fileExt": file_ext, + # 自定义占位符 + "customization": meta.customization } @staticmethod diff --git a/app/schemas/types.py b/app/schemas/types.py index 340a3e1d..bcac684d 100644 --- a/app/schemas/types.py +++ b/app/schemas/types.py @@ -58,6 +58,8 @@ class SystemConfigKey(Enum): NotificationChannels = "NotificationChannels" # 自定义制作组/字幕组 CustomReleaseGroups = "CustomReleaseGroups" + # 自定义占位符 + Customization = "Customization" # 自定义识别词 CustomIdentifiers = "CustomIdentifiers" # 搜索优先级规则