合并命名模式的设置框,并实现自动切换

This commit is contained in:
x1ao4 2025-04-21 00:07:56 +08:00
parent 243ddff74d
commit 6f969f9416

View File

@ -257,24 +257,18 @@
<div class="form-group row">
<label class="col-sm-2 col-form-label">命名方式</label>
<div class="col-sm-10">
<div class="input-group mb-3">
<div class="input-group">
<div class="input-group-prepend">
<button type="button" class="btn" :class="!task.use_sequence_naming ? 'btn-primary' : 'input-group-text'" @click="toggleNamingMode(task, false)">正则命名</button>
<span class="input-group-text">{{ task.use_sequence_naming ? '顺序命名' : '正则命名' }}</span>
</div>
<input type="text" name="pattern[]" class="form-control" v-model="task.pattern" placeholder="匹配表达式" list="magicRegex" :disabled="task.use_sequence_naming">
<input type="text" name="replace[]" class="form-control" v-model="task.replace" placeholder="替换表达式" :disabled="task.use_sequence_naming">
<input type="text" name="pattern[]" class="form-control" v-model="task.pattern" placeholder="匹配表达式 (E{} 或 S01E{} 表示顺序命名模式)" list="magicRegex" @input="detectNamingMode(task)">
<input type="text" name="replace[]" class="form-control" v-model="task.replace" placeholder="替换表达式 (正则模式时有效)" @input="detectNamingMode(task)">
<div class="input-group-append">
<div class="input-group-text">
<input type="checkbox" title="忽略后缀" v-model="task.ignore_extension">&nbsp;忽略后缀
</div>
</div>
</div>
<div class="input-group">
<div class="input-group-prepend">
<button type="button" class="btn" :class="task.use_sequence_naming ? 'btn-primary' : 'input-group-text'" @click="toggleNamingMode(task, true)">顺序命名</button>
</div>
<input type="text" class="form-control" v-model="task.sequence_naming" :placeholder='`例如: 雁回时 - S01E{}{}将被替换为序号支持识别第X期/集/话、SXXEXX、纯数字序号、日期等格式排序`' :disabled="!task.use_sequence_naming">
</div>
<datalist id="magicRegex">
<option v-for="(value, key) in formData.magic_regex" :key="key" :value="`${key}`" v-html="`${value.pattern.replace('<', '<\u200B')} → ${value.replace}`"></option>
</datalist>
@ -475,19 +469,6 @@
return size + unitArr[index];
}
},
watch: {
'task.use_sequence_naming': function(newVal, oldVal) {
if (newVal) {
if (!this.task.sequence_naming) {
this.task.sequence_naming = this.task.taskname + " - E{}";
}
this.task.pattern_disabled = true;
} else {
this.task.sequence_naming = null;
this.task.pattern_disabled = false;
}
}
},
mounted() {
this.fetchData();
this.checkNewVersion();
@ -498,6 +479,24 @@
this.smart_param.showSuggestions = false;
}
});
// 初始化时检查所有任务的命名模式
setTimeout(() => {
if (this.formData.tasklist && this.formData.tasklist.length > 0) {
this.formData.tasklist.forEach(task => {
// 检查现有的顺序命名设置
if (task.use_sequence_naming && task.sequence_naming) {
// 已经设置过顺序命名的,将顺序命名模式转换为匹配表达式
if (!task.pattern || task._pattern_backup) {
task.pattern = task.sequence_naming;
}
} else {
// 检测是否包含顺序命名模式
this.detectNamingMode(task);
}
});
}
}, 500);
},
methods: {
changeTab(tab) {
@ -558,6 +557,16 @@
}
},
saveConfig() {
// 保存前处理每个任务的命名模式
if (this.formData.tasklist && this.formData.tasklist.length > 0) {
this.formData.tasklist.forEach(task => {
// 如果是顺序命名模式确保sequence_naming字段已正确设置
if (task.use_sequence_naming && task.pattern && task.pattern.includes('E{}')) {
task.sequence_naming = task.pattern;
}
});
}
axios.post('/update', this.formData)
.then(response => {
alert(response.data);
@ -598,7 +607,18 @@
}
}
}
// 初始化新任务的命名模式相关字段
if (newTask.taskname) {
// 默认使用正则命名模式
newTask.pattern = ".*"; // 默认匹配所有文件
newTask.replace = ""; // 默认保持原文件名
newTask.use_sequence_naming = false;
newTask.sequence_naming = "";
}
this.formData.tasklist.push(newTask);
// 滚到最下
setTimeout(() => {
$('#collapse_' + (this.formData.tasklist.length - 1)).collapse('show').on('shown.bs.collapse', () => {
@ -807,29 +827,71 @@
this.changeShareurl(task);
this.smart_param.showSuggestions = false;
},
toggleNamingMode(task, use_sequence_naming) {
// 设置命名模式
task.use_sequence_naming = use_sequence_naming;
detectNamingMode(task) {
// 检测是否为顺序命名模式
const sequencePatterns = ['E{}', 'EP{}', 'S\\d+E{}', '第{}集', '第{}话', '第{}期'];
let isSequenceNaming = false;
if (use_sequence_naming) {
// 启用顺序命名
if (!task.sequence_naming) {
task.sequence_naming = task.taskname ? (task.taskname + " - E{}") : "E{}";
}
// 禁用正则匹配
task._pattern_backup = task.pattern;
task._replace_backup = task.replace;
task.pattern = "";
task.replace = "";
} else {
// 禁用顺序命名
task._sequence_backup = task.sequence_naming;
// 恢复正则匹配
if (task._pattern_backup) {
task.pattern = task._pattern_backup;
task.replace = task._replace_backup;
// 保存当前值以支持撤销操作
const currentValue = task.pattern;
if (task.pattern) {
// 检查是否包含任何顺序命名模式
isSequenceNaming = sequencePatterns.some(pattern => {
const regexPattern = pattern.replace('{}', '\\{\\}');
return new RegExp(regexPattern).test(task.pattern);
});
// 或者用户直接输入包含{}的格式,且替换表达式为空
if (!isSequenceNaming && task.pattern.includes('{}') && (!task.replace || task.replace === '')) {
isSequenceNaming = true;
}
}
// 处理模式切换
if (isSequenceNaming) {
// 如果当前不是顺序命名模式,则保存现有的正则表达式
if (!task.use_sequence_naming) {
task._pattern_backup = task.pattern;
task._replace_backup = task.replace;
task.use_sequence_naming = true;
}
// 设置序列命名模式
task.sequence_naming = task.pattern;
} else {
// 如果当前是顺序命名模式,但现在检测不到顺序命名模式
if (task.use_sequence_naming) {
// 如果用户正在删除内容(当前值为空或比上一次更短)
if (!currentValue || (task._lastPatternValue && currentValue.length < task._lastPatternValue.length)) {
// 保持当前编辑状态,不切换模式
task.sequence_naming = currentValue;
// 只有当完全删除后才切换回正则模式
if (!currentValue) {
task.use_sequence_naming = false;
if (task._pattern_backup) {
task.pattern = "";
task.replace = task._replace_backup || "";
}
task.sequence_naming = null;
}
} else if (task._pattern_backup && !task.pattern.includes('{}')) {
// 正常切换回正则命名模式(非删除操作)
task.use_sequence_naming = false;
task.pattern = task._pattern_backup;
task.replace = task._replace_backup;
task._sequence_backup = task.sequence_naming;
task.sequence_naming = null;
} else if (!task._pattern_backup && !task.pattern.includes('{}')) {
// 没有备份,但需要切换回正则模式
task.use_sequence_naming = false;
task.sequence_naming = null;
}
}
}
// 保存当前值,用于下次比较
task._lastPatternValue = currentValue;
// 强制Vue更新视图
this.$forceUpdate();
},