#!/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