Files
MoviePilot/app/sdk/string.py

166 lines
6.4 KiB
Python

"""为插件保留历史 StringUtils 类的轻量兼容门面。"""
from functools import wraps
from inspect import signature
from typing import Callable
from app.domain.episode import compact_numbers, format_ranges
from app.domain.site import extract_domain, urls_match
from app.domain.title import is_media_title_like, parse_search_keyword
from app.domain.torrent import is_magnet_link
from app.foundation.crypto import HashUtils
from app.foundation.dom import DomUtils
from app.foundation.size import format_compact_size, format_size, parse_size
from app.foundation.temporal import (
format_approx_duration,
format_duration,
format_minutes,
format_remaining,
format_timestamp,
normalize_datetime,
parse_datetime,
parse_timestamp,
)
from app.foundation.text import (
common_prefix,
contains_chinese,
contains_japanese,
contains_korean,
cookiejar_to_string,
count_words,
escape_markdown,
extract_named_ids,
format_amount,
is_all_chinese,
is_english_word,
is_number,
natural_sort_key,
normalize_upper,
parse_bool,
parse_float,
parse_int,
random_string,
remove_punctuation,
sanitize_filename,
split_by_bytes,
strip_optional,
title_case,
)
from app.foundation.url import (
base_url,
host_label,
is_link,
parse_address,
second_level_label,
split_netloc,
)
from app.foundation.version import compare_version
def _legacy_alias(function: Callable, **keyword_aliases: str) -> Callable:
"""创建支持旧关键字名称的静态方法转发器。"""
@wraps(function)
def call(*args, **kwargs):
"""把旧关键字转换为 canonical 参数后调用真实实现。"""
for legacy_name, canonical_name in keyword_aliases.items():
if legacy_name in kwargs:
kwargs[canonical_name] = kwargs.pop(legacy_name)
return function(*args, **kwargs)
canonical_to_legacy = {
canonical_name: legacy_name
for legacy_name, canonical_name in keyword_aliases.items()
}
call.__signature__ = signature(function).replace(
parameters=[
parameter.replace(
name=canonical_to_legacy.get(parameter.name, parameter.name)
)
for parameter in signature(function).parameters.values()
]
)
return call
def _legacy_md5_hash(data) -> str:
"""保持 StringUtils.md5_hash 对空值和对象文本化的历史语义。"""
if not data:
return ""
return HashUtils.md5(str(data))
class StringUtils:
"""组合已拆分实现,保持插件使用的历史静态方法接口。"""
num_filesize = staticmethod(parse_size)
str_timelong = staticmethod(_legacy_alias(format_approx_duration, time_sec="seconds"))
str_secends = staticmethod(_legacy_alias(format_duration, time_sec="seconds"))
is_chinese = staticmethod(_legacy_alias(contains_chinese, word="value"))
is_japanese = staticmethod(_legacy_alias(contains_japanese, word="value"))
is_korean = staticmethod(_legacy_alias(contains_korean, word="value"))
is_all_chinese = staticmethod(_legacy_alias(is_all_chinese, word="value"))
is_english_word = staticmethod(_legacy_alias(is_english_word, word="value"))
str_int = staticmethod(_legacy_alias(parse_int, text="value"))
str_float = staticmethod(_legacy_alias(parse_float, text="value"))
clear = staticmethod(
_legacy_alias(
remove_punctuation,
text="value",
replace_word="replacement",
)
)
clear_upper = staticmethod(_legacy_alias(normalize_upper, text="value"))
str_filesize = staticmethod(_legacy_alias(format_compact_size, pre="precision"))
format_size = staticmethod(format_size)
url_equal = staticmethod(_legacy_alias(urls_match, url1="first", url2="second"))
get_url_netloc = staticmethod(split_netloc)
get_url_domain = staticmethod(extract_domain)
get_url_sld = staticmethod(second_level_label)
get_url_host = staticmethod(host_label)
get_base_url = staticmethod(base_url)
clear_file_name = staticmethod(_legacy_alias(sanitize_filename, name="value"))
generate_random_str = staticmethod(_legacy_alias(random_string, randomlength="length"))
get_time = staticmethod(_legacy_alias(parse_datetime, date="value"))
unify_datetime_str = staticmethod(_legacy_alias(normalize_datetime, datetime_str="value"))
format_timestamp = staticmethod(format_timestamp)
str_to_timestamp = staticmethod(_legacy_alias(parse_timestamp, date_str="value"))
to_bool = staticmethod(_legacy_alias(parse_bool, text="value", default_val="default"))
str_from_cookiejar = staticmethod(_legacy_alias(cookiejar_to_string, cj="cookiejar"))
get_idlist = staticmethod(_legacy_alias(extract_named_ids, dicts="entries"))
md5_hash = staticmethod(_legacy_md5_hash)
str_timehours = staticmethod(format_minutes)
str_amount = staticmethod(_legacy_alias(format_amount, curr="currency"))
count_words = staticmethod(_legacy_alias(count_words, text="value"))
is_media_title_like = staticmethod(_legacy_alias(is_media_title_like, text="value"))
split_text = staticmethod(_legacy_alias(split_by_bytes, text="value"))
get_keyword = staticmethod(parse_search_keyword)
str_title = staticmethod(_legacy_alias(title_case, s="value"))
escape_markdown = staticmethod(_legacy_alias(escape_markdown, content="value"))
get_domain_address = staticmethod(
_legacy_alias(parse_address, prefix="include_scheme")
)
str_series = staticmethod(_legacy_alias(compact_numbers, array="numbers"))
format_ep = staticmethod(_legacy_alias(format_ranges, nums="numbers"))
is_number = staticmethod(_legacy_alias(is_number, text="value"))
find_common_prefix = staticmethod(
_legacy_alias(common_prefix, str1="first", str2="second")
)
compare_version = staticmethod(
_legacy_alias(
compare_version,
v1="source",
compare_type="comparison",
v2="target",
)
)
diff_time_str = staticmethod(_legacy_alias(format_remaining, time_str="value"))
safe_strip = staticmethod(strip_optional)
is_valid_html_element = staticmethod(_legacy_alias(DomUtils.has_child_elements, elem="element"))
is_link = staticmethod(_legacy_alias(is_link, text="value"))
is_magnet_link = staticmethod(is_magnet_link)
natural_sort_key = staticmethod(_legacy_alias(natural_sort_key, text="value"))
__all__ = ["StringUtils"]