0b7fc29ac4
Co-authored-by: Dt8333 <25431943+Dt8333@users.noreply.github.com> Co-authored-by: Soulter <905617992@qq.com>
72 lines
3.0 KiB
Python
72 lines
3.0 KiB
Python
import os
|
|
|
|
from astrbot.core import logger
|
|
|
|
|
|
def path_Mapping(mappings, srcPath: str) -> str:
|
|
"""路径映射处理函数。尝试支援 Windows 和 Linux 的路径映射。
|
|
Args:
|
|
mappings: 映射规则列表
|
|
srcPath: 原路径
|
|
Returns:
|
|
str: 处理后的路径
|
|
"""
|
|
for mapping in mappings:
|
|
rule = mapping.split(":")
|
|
if len(rule) == 2:
|
|
from_, to_ = mapping.split(":")
|
|
elif len(rule) > 4 or len(rule) == 1:
|
|
# 切割后大于4个项目,或者只有1个项目,那肯定是错误的,只能是2,3,4个项目
|
|
logger.warning(f"路径映射规则错误: {mapping}")
|
|
continue
|
|
# rule.len == 3 or 4
|
|
elif os.path.exists(rule[0] + ":" + rule[1]):
|
|
# 前面两个项目合并路径存在,说明是本地Window路径。后面一个或两个项目组成的路径本地大概率无法解析,直接拼接
|
|
from_ = rule[0] + ":" + rule[1]
|
|
if len(rule) == 3:
|
|
to_ = rule[2]
|
|
else:
|
|
to_ = rule[2] + ":" + rule[3]
|
|
else:
|
|
# 前面两个项目合并路径不存在,说明第一个项目是本地Linux路径,后面一个或两个项目直接拼接。
|
|
from_ = rule[0]
|
|
if len(rule) == 3:
|
|
to_ = rule[1] + ":" + rule[2]
|
|
else:
|
|
# 这种情况下存在四个项目,说明规则也是错误的
|
|
logger.warning(f"路径映射规则错误: {mapping}")
|
|
continue
|
|
|
|
from_ = from_.removesuffix("/")
|
|
from_ = from_.removesuffix("\\")
|
|
to_ = to_.removesuffix("/")
|
|
to_ = to_.removesuffix("\\")
|
|
# logger.debug(f"\t路径映射-规则(处理): {from_} -> {to_}")
|
|
|
|
url = srcPath.removeprefix("file://")
|
|
if url.startswith(from_):
|
|
srcPath = url.replace(from_, to_, 1)
|
|
if ":" in srcPath:
|
|
# Windows路径处理
|
|
srcPath = srcPath.replace("/", "\\")
|
|
else:
|
|
has_replaced_processed = False
|
|
if srcPath.startswith("."):
|
|
# 相对路径处理。如果是相对路径,可能是Linux路径,也可能是Windows路径
|
|
sign = srcPath[1]
|
|
# 处理两个点的情况
|
|
if sign == ".":
|
|
sign = srcPath[2]
|
|
if sign == "/":
|
|
srcPath = srcPath.replace("\\", "/")
|
|
has_replaced_processed = True
|
|
elif sign == "\\":
|
|
srcPath = srcPath.replace("/", "\\")
|
|
has_replaced_processed = True
|
|
if not has_replaced_processed:
|
|
# 如果不是相对路径或不能处理,默认按照Linux路径处理
|
|
srcPath = srcPath.replace("\\", "/")
|
|
logger.info(f"路径映射: {url} -> {srcPath}")
|
|
return srcPath
|
|
return srcPath
|