first commit
This commit is contained in:
@@ -0,0 +1,275 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
补充处理之前跳过的项目(有子目录的多作者/多版本食材与特产)。
|
||||
|
||||
规则:
|
||||
- 子目录名含"效率版/高效率/中效率/效率路线/效率" → 用该效率版子目录的 json 创建配置组
|
||||
- 其余 → 创建空配置组(projects=[]),用户手动添加路线 json
|
||||
|
||||
用法:
|
||||
python fill_skipped_groups.py
|
||||
"""
|
||||
import os
|
||||
import json
|
||||
import sys
|
||||
|
||||
BASE = r"C:\Program Files\BetterGI\BetterGI\User"
|
||||
AUTOPATHING = os.path.join(BASE, "AutoPathing")
|
||||
SCRIPTGROUP = os.path.join(BASE, "ScriptGroup")
|
||||
|
||||
IGNORE_NAMES = {"desktop.ini", "icon.ico", "Thumbs.db"}
|
||||
|
||||
REGION_ORDER = ["蒙德", "璃月", "稻妻", "须弥", "枫丹", "纳塔", "挪德卡莱"]
|
||||
CATEGORIES = ["地方特产", "食材与炼金"]
|
||||
|
||||
|
||||
def region_sort_key(name):
|
||||
try:
|
||||
return (REGION_ORDER.index(name), name)
|
||||
except ValueError:
|
||||
return (len(REGION_ORDER), name)
|
||||
|
||||
|
||||
def load_config_template():
|
||||
template_path = os.path.join(SCRIPTGROUP, "子探测单元.json")
|
||||
with open(template_path, "r", encoding="utf-8") as f:
|
||||
return json.load(f)["config"]
|
||||
|
||||
|
||||
def get_next_group_index():
|
||||
max_index = 0
|
||||
for fn in os.listdir(SCRIPTGROUP):
|
||||
if not fn.lower().endswith(".json"):
|
||||
continue
|
||||
fp = os.path.join(SCRIPTGROUP, fn)
|
||||
try:
|
||||
with open(fp, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
idx = data.get("index", 0)
|
||||
if isinstance(idx, int) and idx > max_index:
|
||||
max_index = idx
|
||||
except Exception:
|
||||
continue
|
||||
return max_index + 1
|
||||
|
||||
|
||||
def detect_structure(category_path):
|
||||
has_any_direct_json = False
|
||||
for entry in os.listdir(category_path):
|
||||
entry_path = os.path.join(category_path, entry)
|
||||
if not os.path.isdir(entry_path):
|
||||
continue
|
||||
sub_entries = [e for e in os.listdir(entry_path) if e not in IGNORE_NAMES]
|
||||
has_json = any(
|
||||
fn.lower().endswith(".json") and os.path.isfile(os.path.join(entry_path, fn))
|
||||
for fn in sub_entries
|
||||
)
|
||||
if has_json:
|
||||
has_any_direct_json = True
|
||||
break
|
||||
return "two" if has_any_direct_json else "three"
|
||||
|
||||
|
||||
def list_items(category_path, structure):
|
||||
result = []
|
||||
if structure == "two":
|
||||
for item in os.listdir(category_path):
|
||||
ip = os.path.join(category_path, item)
|
||||
if not os.path.isdir(ip):
|
||||
continue
|
||||
result.append((item, item, ip))
|
||||
result.sort(key=lambda x: x[0])
|
||||
else:
|
||||
for region in os.listdir(category_path):
|
||||
rp = os.path.join(category_path, region)
|
||||
if not os.path.isdir(rp):
|
||||
continue
|
||||
for item in os.listdir(rp):
|
||||
ip = os.path.join(rp, item)
|
||||
if not os.path.isdir(ip):
|
||||
continue
|
||||
result.append(((region, item), item, ip))
|
||||
result.sort(key=lambda x: (region_sort_key(x[0][0]), x[0][1]))
|
||||
return result
|
||||
|
||||
|
||||
def analyze_item(item_path):
|
||||
entries = os.listdir(item_path)
|
||||
subdirs = [e for e in entries
|
||||
if os.path.isdir(os.path.join(item_path, e)) and e not in IGNORE_NAMES]
|
||||
json_files = [e for e in entries
|
||||
if e.lower().endswith(".json")
|
||||
and os.path.isfile(os.path.join(item_path, e))
|
||||
and e not in IGNORE_NAMES]
|
||||
return subdirs, sorted(json_files)
|
||||
|
||||
|
||||
def list_jsons_in_dir(dir_path):
|
||||
"""列出某目录下直接包含的 json 文件(排除系统文件)。"""
|
||||
if not os.path.isdir(dir_path):
|
||||
return []
|
||||
result = []
|
||||
for e in os.listdir(dir_path):
|
||||
if e in IGNORE_NAMES:
|
||||
continue
|
||||
if e.lower().endswith(".json") and os.path.isfile(os.path.join(dir_path, e)):
|
||||
result.append(e)
|
||||
return sorted(result)
|
||||
|
||||
|
||||
def pick_efficiency_subdir(subdirs):
|
||||
"""按优先级选取效率版子目录,返回子目录名或 None。"""
|
||||
priorities = ["效率版", "高效率", "中效率", "效率路线", "效率"]
|
||||
for keyword in priorities:
|
||||
for sd in subdirs:
|
||||
if keyword in sd:
|
||||
return sd
|
||||
return None
|
||||
|
||||
|
||||
def build_group(group_index, name, folder_name, json_files, config_template):
|
||||
projects = []
|
||||
for i, jf in enumerate(json_files, 1):
|
||||
projects.append({
|
||||
"name": jf,
|
||||
"folderName": folder_name,
|
||||
"jsScriptSettingsObject": None,
|
||||
"index": i,
|
||||
"type": "Pathing",
|
||||
"status": "Enabled",
|
||||
"schedule": "Daily",
|
||||
"runNum": 1,
|
||||
"allowJsNotification": True,
|
||||
"allowJsHTTPHash": ""
|
||||
})
|
||||
return {
|
||||
"index": group_index,
|
||||
"name": name,
|
||||
"config": config_template,
|
||||
"projects": projects
|
||||
}
|
||||
|
||||
|
||||
def main():
|
||||
config_template = load_config_template()
|
||||
report_path = os.path.join(
|
||||
os.path.dirname(os.path.abspath(__file__)),
|
||||
"补充报告_跳过项目.txt"
|
||||
)
|
||||
|
||||
eff_created = [] # (category, group_key, name, eff_subdir, route_count, file_path)
|
||||
empty_created = [] # (category, group_key, name, subdirs, file_path)
|
||||
write_errors = []
|
||||
|
||||
group_index = get_next_group_index()
|
||||
print(f"[信息] 起始 group index: {group_index}")
|
||||
|
||||
for category in CATEGORIES:
|
||||
category_path = os.path.join(AUTOPATHING, category)
|
||||
if not os.path.isdir(category_path):
|
||||
continue
|
||||
structure = detect_structure(category_path)
|
||||
items = list_items(category_path, structure)
|
||||
|
||||
for group_key, name, item_path in items:
|
||||
subdirs, json_files = analyze_item(item_path)
|
||||
if not subdirs:
|
||||
continue # 无子目录,之前已创建,跳过
|
||||
|
||||
# 构造 folderName
|
||||
if structure == "two":
|
||||
folder_name = f"{category}\\{name}"
|
||||
else:
|
||||
region, _ = group_key
|
||||
folder_name = f"{category}\\{region}\\{name}"
|
||||
|
||||
# 检查是否已存在同名配置组(避免覆盖之前创建的)
|
||||
out_path = os.path.join(SCRIPTGROUP, f"{name}.json")
|
||||
if os.path.exists(out_path):
|
||||
# 已存在,跳过
|
||||
continue
|
||||
|
||||
eff_subdir = pick_efficiency_subdir(subdirs)
|
||||
if eff_subdir:
|
||||
# 用效率版子目录的 json
|
||||
eff_path = os.path.join(item_path, eff_subdir)
|
||||
# 效率版子目录可能直接含 json,也可能再含子目录(一般直接含)
|
||||
eff_jsons = list_jsons_in_dir(eff_path)
|
||||
if not eff_jsons:
|
||||
# 效率版子目录下无直接 json,创建空配置组
|
||||
group = build_group(group_index, name, folder_name, [], config_template)
|
||||
try:
|
||||
with open(out_path, "w", encoding="utf-8") as f:
|
||||
json.dump(group, f, ensure_ascii=False, indent=2)
|
||||
empty_created.append((category, group_key, name, subdirs, out_path))
|
||||
group_index += 1
|
||||
except Exception as e:
|
||||
write_errors.append((name, str(e)))
|
||||
continue
|
||||
group = build_group(group_index, name, folder_name, eff_jsons, config_template)
|
||||
try:
|
||||
with open(out_path, "w", encoding="utf-8") as f:
|
||||
json.dump(group, f, ensure_ascii=False, indent=2)
|
||||
eff_created.append((category, group_key, name, eff_subdir, len(eff_jsons), out_path))
|
||||
group_index += 1
|
||||
except Exception as e:
|
||||
write_errors.append((name, str(e)))
|
||||
else:
|
||||
# 无效率版 → 创建空配置组
|
||||
group = build_group(group_index, name, folder_name, [], config_template)
|
||||
try:
|
||||
with open(out_path, "w", encoding="utf-8") as f:
|
||||
json.dump(group, f, ensure_ascii=False, indent=2)
|
||||
empty_created.append((category, group_key, name, subdirs, out_path))
|
||||
group_index += 1
|
||||
except Exception as e:
|
||||
write_errors.append((name, str(e)))
|
||||
|
||||
# 生成报告
|
||||
lines = []
|
||||
lines.append("=" * 70)
|
||||
lines.append("BetterGI 跳过项目补充处理报告")
|
||||
lines.append("=" * 70)
|
||||
lines.append("")
|
||||
|
||||
lines.append(f"【使用效率版创建】共 {len(eff_created)} 个")
|
||||
lines.append("-" * 70)
|
||||
cur_cat = None
|
||||
for category, gk, name, eff_sd, cnt, fp in eff_created:
|
||||
if category != cur_cat:
|
||||
cur_cat = category
|
||||
lines.append(f"\n[{category}]")
|
||||
lines.append(f" {name}")
|
||||
lines.append(f" 效率版: {eff_sd} ({cnt} 条路线)")
|
||||
lines.append("")
|
||||
|
||||
lines.append(f"【创建空配置组(需手动添加路线)】共 {len(empty_created)} 个")
|
||||
lines.append("-" * 70)
|
||||
cur_cat = None
|
||||
for category, gk, name, subdirs, fp in empty_created:
|
||||
if category != cur_cat:
|
||||
cur_cat = category
|
||||
lines.append(f"\n[{category}]")
|
||||
lines.append(f" {name}")
|
||||
lines.append(f" 候选子目录: {subdirs}")
|
||||
lines.append("")
|
||||
|
||||
if write_errors:
|
||||
lines.append("【写入错误】")
|
||||
lines.append("-" * 70)
|
||||
for name, err in write_errors:
|
||||
lines.append(f" {name}: {err}")
|
||||
lines.append("")
|
||||
|
||||
lines.append("=" * 70)
|
||||
report = "\n".join(lines)
|
||||
|
||||
with open(report_path, "w", encoding="utf-8") as f:
|
||||
f.write(report)
|
||||
|
||||
print(report)
|
||||
print(f"\n报告已保存: {report_path}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user