8.7 KiB
剧集提取交互增强与规则预设设计
背景
当前项目已经具备完善的规则系统、批量执行器、冲突处理、Undo、诊断导出与多语言 UI,但在“剧集提取”规则的人机交互上仍偏参数驱动,缺少从真实文件名反向辅助配置的快捷路径。同时,规则能力虽然丰富,用户却缺少“最近使用”和“命名模板”来沉淀高频配置,导致重复输入成本较高。
本设计聚焦两个 P0 优化项:
- 剧集提取交互增强(B 档)
- 最近使用 + 命名模板(B 档)
目标
- 让
episodeExtract从“手动填参数”升级为“可从预览文件名反向辅助配置”。 - 为高频规则提供“自动进入最近使用 + 手动保存模板”的闭环。
- 保持现有三栏布局不变,优先复用
file-selector-panel作为统一状态源。 - 控制实现范围,不在本次引入复杂的样本推导算法或大型 UI 重构。
非目标
- 不做完整的“样本推导规则生成器”。
- 不做字符级自由框选;片段选择只做到 token / 片段级点击。
- 不做模板导入导出、模板分类、跨平台共享策略。
- 不重做整个三栏面板结构。
方案概览
保持当前三栏结构:
- 左栏
config-panel:参数输入、提取辅助区、最近使用、命名模板 - 中栏
file-list-panel:文件筛选与勾选,不做主要改动 - 右栏
preview-panel:预览 + 交互式辅助取值入口
统一状态继续放在 file-selector-panel,由它协调:
- 当前规则配置
ruleConfig - 新增
EpisodeExtractAssistState - 新增规则预设状态(最近使用 / 模板)
config-panel与preview-panel只负责展示和派发事件
一、剧集提取交互增强
1. 提取辅助区
只在 selectedRuleType === 'episodeExtract' 时展示。
建议放在 config-panel 的剧集提取表单下方,包含三块内容:
1.1 样本文件
展示当前样本文件名,并提供按钮:
- 使用随机样本
- 使用首个失败项
- 清空样本
样本文件只用于辅助用户观察与回填,不直接改变 EpisodeExtractRule 的算法输入。
1.2 回填目标
使用单选或 segmented control 选择当前回填目标:
prefixhelperPrehelperPost
该目标决定右栏点击行为把内容写入哪个字段。
1.3 辅助模式
提供两种辅助模式:
- 点击整段文件名回填
- 选择文件名片段回填
辅助模式不改变规则类型,仅改变右栏交互方式。
2. 右栏预览增强
在 episodeExtract 模式下,preview-panel 支持辅助输入。
2.1 整段回填模式
用户在左栏选定目标字段后,可在右栏对某个预览项执行“整段回填”。
默认回填规则:
prefix:回填文件名主体(不含扩展名)helperPre/helperPost:回填选中的整段文本
2.2 片段回填模式
右栏文件名支持按片段点击。片段粒度采用“有意义 token / 文本段”,不做字符级自由选区。
目标:
- 降低实现复杂度
- 支持典型命名场景,如
剧名/S01E08/1080p/字幕组
片段点击后,将片段文本写入当前 fillTarget 对应字段。
3. 失败项快捷修正
对于 episodeExtract 失败项,在右栏提供快捷动作:
- 设为样本
- 取前半段为
prefix - 进入片段选择
这些动作不直接执行重命名,只帮助用户更快修正配置。
4. 更明显的失败提示
在左栏辅助区中,当存在提取失败项时显示状态块,包含:
- 当前失败数量
- 使用首个失败项作为样本
- 切换到片段选择模式
- 仅执行可成功项(说明性提示)
这部分的价值是把“你现在可以怎么修”明确告诉用户。
5. 新增状态模型
建议新增轻量状态:
interface EpisodeExtractAssistState {
sampleFileId: string | null;
sampleFileName: string | null;
fillTarget: 'prefix' | 'helperPre' | 'helperPost';
fillMode: 'full-name' | 'segment';
suggestedFailureFileId: string | null;
}
状态存放在 file-selector-panel 中,由它通过属性传给 config-panel / preview-panel,并响应相关事件更新 ruleConfig。
二、规则预设(最近使用 + 命名模板)
1. 统一数据模型
建议使用统一记录结构:
interface RulePresetRecord {
id: string;
name?: string;
config: RuleConfig;
createdAt: number;
updatedAt: number;
source: 'recent' | 'template';
}
说明:
recent自动记录,可无名称template必须有名称config直接保存完整RuleConfig
2. 存储策略
基于现有 storage 封装新增两组 key:
rulePresets.recentrulePresets.templates
2.1 最近使用
- 最多保留 8 条
- 执行成功且存在真实 rename task 时才记录
- 对相同配置做去重,重复使用时只更新时间并移动到最前
2.2 命名模板
- 用户手动保存
- 支持删除
- 同名保存时提示用户确认覆盖
- 本次不做分类、导入导出
3. 左栏展示方式
在 config-panel 中新增“规则预设”区:
3.1 最近使用
展示最近 5 条(可后续扩展为展开更多),每条显示:
- 规则类型
- 简短摘要
- 应用按钮
3.2 我的模板
展示:
- 模板名
- 规则类型
- 应用
- 删除
并提供按钮:
- 保存当前规则为模板
本次保存交互采用轻量实现(如内嵌输入或简单 prompt 风格),避免引入重型弹窗设计。
4. 应用行为
点击应用最近使用或模板后:
- 更新当前
selectedRuleType - 更新
ruleParams - 触发
config-change - 重建预览
如果应用的是 episodeExtract 规则:
- 重置
fillTarget为默认prefix - 重置
fillMode为默认full-name - 不保留旧的样本运行态上下文
5. 自动沉淀闭环
规则使用闭环如下:
- 用户通过左栏配置 + 右栏辅助完成配置
- 执行成功后自动进入“最近使用”
- 用户可手动“保存为模板”
- 后续直接从“最近使用”或“模板”重新应用
这是本次设计的核心产品价值之一。
三、错误处理
1. 模板存储失败
- 不阻塞主面板
- 给出轻提示或日志
- 模板/最近使用加载失败时回退为空列表
2. 交互辅助失败
例如:
- 未选择回填目标
- 样本文件失效
- 失败项上下文失效
处理方式:
- 回退到默认状态
- 给出轻提示说明下一步操作
3. 模板失效
若模板中的 RuleConfig 无法通过当前版本校验:
- 不应用模板
- 提示“模板已失效”
- 提供删除入口
四、测试策略
1. 工具层测试
新增 rule-presets 相关测试,覆盖:
- 最近使用追加
- 去重
- 截断数量
- 模板保存
- 模板删除
- 覆盖逻辑
2. config-panel 组件测试
覆盖:
episodeExtract时辅助区可见- 最近使用 / 模板区可见
- 应用模板触发
config-change - 保存模板、删除模板、切换辅助模式等事件派发正确
3. file-selector-panel 集成测试
覆盖:
- 应用模板后预览更新
- 辅助回填后
ruleConfig更新 - 执行成功后自动记录最近使用
- 失败项快捷修正动作正确更新辅助状态
五、文件影响范围
修改文件
src/content/components/config-panel.tssrc/content/components/preview-panel.tssrc/content/components/file-selector-panel.tssrc/locales/zh_CN.jsonsrc/locales/zh_TW.jsonsrc/locales/en.json
新增文件
src/types/rule-preset.tssrc/utils/rule-presets.ts- 对应测试文件
六、实施顺序
- 先实现规则预设存储层与类型
- 接入
config-panel的最近使用 / 模板 UI - 在
file-selector-panel中完成预设加载、应用、记录逻辑 - 实现
EpisodeExtractAssistState - 接入
config-panel的提取辅助区 - 接入
preview-panel的整段回填 / 片段回填 / 失败快捷修正 - 补充测试并验证
七、风险与控制
- 风险:交互状态过多导致
file-selector-panel继续膨胀- 控制:把预设逻辑抽到独立工具模块,把辅助状态收敛为单一对象
- 风险:片段选择实现过重
- 控制:本次仅做 token / 文本段级点击,不做自由选区
- 风险:模板兼容性问题
- 控制:应用前统一校验,失效即提示并允许删除
结论
本次实现将不改动总体架构,而是在现有三栏面板上增加两条高价值能力:
- 让
episodeExtract能借助右栏真实文件名进行更自然的配置修正 - 让成功配置能够沉淀为“最近使用”和“命名模板”,形成复用闭环
这是一次以用户体验为中心、同时保持现有工程边界稳定的增强。