TravelContentCreator/scripts/select_additional_images.py

173 lines
5.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import argparse
import logging
from pathlib import Path
import sys
import os # Needed for path checks
# --- Path Setup ---
# Add project root to sys.path to allow importing utils
project_root = Path(__file__).resolve().parent.parent
if str(project_root) not in sys.path:
sys.path.insert(0, str(project_root))
print(f"Added project root {project_root} to sys.path")
try:
# Import the necessary function and class from your utils
from utils.poster_notes_creator import select_additional_images
from utils.output_handler import OutputHandler
except ImportError as e:
print(f"错误: 无法导入所需的模块 'utils.poster_notes_creator''utils.output_handler'.")
print(f"错误详情: {e}")
print(f"Python 搜索路径 (sys.path): {sys.path}")
print("请确保你在项目根目录下运行此脚本,或者 utils 目录在 PYTHONPATH 中。")
sys.exit(1)
try:
# Check for Pillow dependency implicitly used by poster_notes_creator
from PIL import Image
except ImportError:
print("错误: 未找到所需的库 PIL (Pillow)。")
print("请先安装它: pip install Pillow")
sys.exit(1)
# --- Logging Configuration ---
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
logger = logging.getLogger(__name__)
# --- 主程序入口 ---
if __name__ == "__main__":
# 设置命令行参数解析
parser = argparse.ArgumentParser(
description="调用 poster_notes_creator 选择并处理额外配图。"
)
parser.add_argument(
"--run_id",
type=str,
required=True,
help="当前处理流程的运行 ID。"
)
parser.add_argument(
"--topic_index",
type=int,
required=True,
help="当前处理的主题索引。"
)
parser.add_argument(
"--variant_index",
type=int,
required=True,
help="当前处理的变体索引。"
)
parser.add_argument(
"--metadata_path",
type=str,
required=True,
help="指向包含已用图片列表的海报元数据 JSON 文件路径 (通常是 poster_metadata.json)。"
)
parser.add_argument(
"--source_image_dir",
type=str,
required=True,
help="包含源图片的目录路径。"
)
parser.add_argument(
"--output_dir",
type=str,
required=True,
help="用于保存生成结果的根目录。"
)
parser.add_argument(
"--num_additional",
type=int,
default=3,
help="要选择的额外配图数量 (默认为 3)。"
)
parser.add_argument(
"--variation_strength",
type=str,
default="medium",
choices=["low", "medium", "high"],
help="应用于额外配图的微调强度 (默认为 'medium')。"
)
parser.add_argument(
"--extra_effects",
action=argparse.BooleanOptionalAction, # 使用 --extra-effects 或 --no-extra-effects
default=True,
help="是否为额外配图添加额外视觉效果 (例如噪点、微调) (默认为启用)。"
)
parser.add_argument(
"--debug",
action='store_true',
help="启用 DEBUG 级别日志。"
)
# 解析参数
args = parser.parse_args()
# 设置日志级别
if args.debug:
logging.getLogger().setLevel(logging.DEBUG)
logger.info("DEBUG 日志已启用")
# 输入验证
metadata_file = Path(args.metadata_path)
source_dir = Path(args.source_image_dir)
output_root_dir = Path(args.output_dir)
if not metadata_file.is_file():
logger.error(f"指定的元数据文件不存在或不是一个文件: {metadata_file}")
sys.exit(1)
if not source_dir.is_dir():
logger.error(f"指定的源图片目录不存在或不是一个目录: {source_dir}")
sys.exit(1)
# output_dir 的存在性由 OutputHandler 内部处理,这里不检查
if args.num_additional <= 0:
logger.error("选择的额外配图数量必须是一个正整数。")
sys.exit(1)
# --- 执行操作 ---
try:
# 1. 初始化 OutputHandler
# 注意output_handler 需要 output_dir 参数
output_handler = OutputHandler(output_dir=str(output_root_dir))
logger.info(f"OutputHandler 初始化完成,输出根目录: {output_root_dir}")
# 2. 调用 poster_notes_creator 中的函数
logger.info("开始调用 select_additional_images...")
saved_image_paths = select_additional_images(
run_id=args.run_id,
topic_index=args.topic_index,
variant_index=args.variant_index,
poster_metadata_path=str(metadata_file),
source_image_dir=str(source_dir),
num_additional_images=args.num_additional,
output_handler=output_handler, # 传递实例
# output_filename_template 保持默认或根据需要添加参数
variation_strength=args.variation_strength,
extra_effects=args.extra_effects
)
# 3. 打印结果
if saved_image_paths:
print("\n========== 额外配图生成结果 ==========")
for path in saved_image_paths:
print(f" 已保存额外配图: {path}")
print("===================================\n")
logger.info(f"成功生成并保存了 {len(saved_image_paths)} 张额外配图。")
else:
print("\n未能生成或保存任何额外配图。请检查日志获取详细信息。")
logger.warning("select_additional_images 函数没有返回任何有效的图片路径。")
except Exception as e:
logger.exception("执行额外配图选择和处理时发生严重错误:")
print(f"脚本执行过程中发生错误,请查看日志。错误信息: {e}")
sys.exit(1)
logger.info("脚本执行完毕。")