Files
tvbox/tools/copy_xbpq.py

98 lines
2.9 KiB
Python

import json
import os
import shutil
import sys
def load_json(path):
with open(path, "r", encoding="utf-8") as f:
return json.load(f)
def extract_local_paths(value):
"""提取字符串中的本地路径(支持 ./ 和 ../),忽略 URL。按 ? 与常见分隔符切分。"""
if not isinstance(value, str):
return []
paths = []
for part in value.split("?"):
for token in part.replace("&", " ").replace("$", " ").split():
token = token.strip()
if token.startswith("./") or token.startswith("../"):
token = token.split("&", 1)[0].split("$", 1)[0]
paths.append(token)
return paths
def collect_local_paths(obj):
"""递归收集任意结构(dict/list/str)中的本地路径字符串"""
found = []
if isinstance(obj, str):
found.extend(extract_local_paths(obj))
elif isinstance(obj, dict):
for v in obj.values():
found.extend(collect_local_paths(v))
elif isinstance(obj, list):
for v in obj:
found.extend(collect_local_paths(v))
return found
def iter_all_local_paths(sites):
"""提取整份 sites 里所有本地路径(不限制区间),递归含 ext 字典"""
all_paths = []
for item in sites:
if isinstance(item, dict):
all_paths.extend(collect_local_paths(item))
# 去重,保留顺序
seen, deduped = set(), []
for p in all_paths:
if p not in seen:
seen.add(p)
deduped.append(p)
return deduped
def main():
base_dir = os.path.dirname(os.path.abspath(__file__))
if len(sys.argv) >= 2:
json_path = sys.argv[1]
else:
json_path = os.path.join(base_dir, "output", "api.json")
if not os.path.exists(json_path):
print(f"⚠️ 找不到文件: {json_path}")
sys.exit(1)
data = load_json(json_path)
sites = data.get("sites", [])
# 直接提取整份 json 的全部本地路径,不做区间判断
paths = iter_all_local_paths(sites)
if not paths:
print("⚠️ 未在 sites 中找到任何本地文件")
return
# 源来自 output 目录,按 json 相对路径复制到项目根(保留子目录,避免 404 且 py/js/json 不混淆)
src_base = os.path.normpath(os.path.join(base_dir, "output"))
dst_base = os.path.normpath(os.path.join(base_dir, ".."))
copied = 0
missing = 0
for path in paths:
rel = path.replace("./", "", 1).replace("../", "", 1)
src = os.path.join(src_base, rel)
dst = os.path.join(dst_base, rel)
if not os.path.exists(src):
print(f"⚠️ 源文件不存在: {src}")
missing += 1
continue
os.makedirs(os.path.dirname(dst), exist_ok=True)
shutil.copy2(src, dst)
print(f"✅ 已复制: {dst}")
copied += 1
print(f"完成: 复制 {copied} 个,缺失 {missing} 个")
if __name__ == "__main__":
main()