refactor: 拆分 media_organizer.sh 为多模块源码并新增构建脚本

- src/ 下 18 个模块按职责拆分(常量/日志/配置/缓存/TMDB/识别/AI/链接等)
- 新增 build.sh:按依赖顺序拼接模块生成单文件分发脚本
  - 含 bash -n 语法检查与重复函数检查
  - --check 模式可校验产物与源码同步(可接 CI)
- media_organizer.sh 改为构建产物(除 6 行生成说明外与原文件逐字节一致)
- README 新增「构建与开发(源码结构)」章节
- .gitignore 忽略运行时缓存 mo_cache/ 与参考仓库 3rd-party/
This commit is contained in:
Shuery committed 2026-08-14 09:25:08 +08:00
1 parent 452c6f26f9
commit d978a13a83
22 files changed
+10428 -2

No files matched your search

Executable
+106
View File
@@ -0,0 +1,106 @@
#!/usr/bin/env bash
# ============================================================================
# 构建脚本:将 src/ 下的模块拼接为单个自包含分发脚本 media_organizer.sh
#
# 用法:
# ./build.sh 构建 media_organizer.sh(覆盖根目录文件)
# ./build.sh --check 仅校验根目录 media_organizer.sh 是否与最新源码一致
#
# 模块清单(顺序 = 依赖顺序,不可随意调整):
# src/main.sh 文件头注释 + 常量 + 全局变量
# src/lib/log.sh 日志与色彩(最先加载,保证全脚本日志输出一致)
# src/lib/config.sh 配置加载与认证
# src/lib/maps.sh 特典映射与季偏移
# src/lib/strings.sh 字符串工具
# src/lib/cache.sh 缓存管理(cache_* 系列)
# src/lib/tmdb.sh TMDB API(tmdb_api 统一缓存封装)
# src/lib/filename.sh 媒体文件名解析
# src/lib/registry.sh 识别登记与并发池(register_* / emit / pool_run)
# src/lib/identify.sh 媒体识别(电影/电视剧)
# src/lib/ai.sh AI 批处理(请求构造/调用/特典学习)
# src/lib/link.sh 硬链接基础工具(inode 判断/链接/错误处理)
# src/lib/args.sh 帮助与参数解析
# src/lib/process.sh 目录校验/扫描/识别流水线
# src/lib/ai_resolve.sh AI 结果消费(重搜/匹配/回退命名)
# src/lib/link_media.sh 创建硬链接及伴随文件
# src/lib/report.sh 对照表导出与运行汇总
# src/lib/entry.sh main() 唯一入口(文件末尾调用)
# ============================================================================
set -euo pipefail
cd "$(dirname "$0")"
OUT="media_organizer.sh"
MODULES=(
src/main.sh
src/lib/log.sh
src/lib/config.sh
src/lib/maps.sh
src/lib/strings.sh
src/lib/cache.sh
src/lib/tmdb.sh
src/lib/filename.sh
src/lib/registry.sh
src/lib/identify.sh
src/lib/ai.sh
src/lib/link.sh
src/lib/args.sh
src/lib/process.sh
src/lib/ai_resolve.sh
src/lib/link_media.sh
src/lib/report.sh
src/lib/entry.sh
)
# 预检:所有模块存在
for m in "${MODULES[@]}"; do
if [[ ! -f "$m" ]]; then
echo "错误:缺失模块 $m(请先拆分源码或检查模块清单)" >&2
exit 1
fi
done
tmp="$(mktemp)"
trap 'rm -f "$tmp"' EXIT
# 生成:shebang + 生成说明 + 按序拼接全部模块
{
printf '#!/bin/bash\n'
printf '%s\n' \
'################################################################################' \
'# 本文件由 build.sh 从 src/ 自动生成,请勿直接编辑。' \
'# 修改源码请编辑 src/ 下的模块文件(模块清单见 build.sh),然后运行 ./build.sh。' \
'################################################################################'
printf '\n'
for m in "${MODULES[@]}"; do
cat "$m"
done
} >"$tmp"
# 语法检查
if ! bash -n "$tmp"; then
echo "错误:构建产物语法检查未通过" >&2
exit 1
fi
# 重复函数定义检查(防止模块合并后命名冲突)
dups="$(grep -oE '^[A-Za-z_][A-Za-z0-9_]*\(\) \{' "$tmp" | sort | uniq -d || true)"
if [[ -n "$dups" ]]; then
echo "错误:存在重复函数定义:$dups" >&2
exit 1
fi
if [[ "${1:-}" == "--check" ]]; then
if cmp -s "$tmp" "$OUT"; then
echo "OK:$OUT 与最新源码一致"
else
echo "DIFF:$OUT 已过期,请运行 ./build.sh 重新生成" >&2
diff "$OUT" "$tmp" | head -50 >&2 || true
exit 1
fi
else
chmod +x "$tmp"
mv "$tmp" "$OUT"
trap - EXIT
echo "构建完成:$OUT($(wc -l <"$OUT") 行,$(wc -c <"$OUT") 字节)"
fi