- src/ 下 18 个模块按职责拆分(常量/日志/配置/缓存/TMDB/识别/AI/链接等) - 新增 build.sh:按依赖顺序拼接模块生成单文件分发脚本 - 含 bash -n 语法检查与重复函数检查 - --check 模式可校验产物与源码同步(可接 CI) - media_organizer.sh 改为构建产物(除 6 行生成说明外与原文件逐字节一致) - README 新增「构建与开发(源码结构)」章节 - .gitignore 忽略运行时缓存 mo_cache/ 与参考仓库 3rd-party/
107 lines
3.5 KiB
Bash
Executable File
107 lines
3.5 KiB
Bash
Executable File
#!/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
|