diff --git a/app/templates/index.html b/app/templates/index.html index c9a9b60..3311d25 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -3752,11 +3752,9 @@ }); } - // 如果没有剧集识别模式,添加默认模式 - if (!this.formData.episode_patterns || this.formData.episode_patterns.length === 0) { - this.formData.episode_patterns = [ - { regex: '第(\\d+)集|第(\\d+)期|第(\\d+)话|(\\d+)集|(\\d+)期|(\\d+)话|[Ee][Pp]?(\\d+)|(\\d+)[-_\\s]*4[Kk]|\\[(\\d+)\\]|【(\\d+)】|_?(\\d+)_?' } - ]; + // 确保剧集识别模式字段存在(但不自动添加默认规则) + if (!this.formData.episode_patterns) { + this.formData.episode_patterns = []; } // 如果当前标签是历史记录,则加载历史记录 @@ -9656,14 +9654,12 @@ // 其他模态框:文件夹排在文件前面 if (a.dir && !b.dir) return -1; if (!a.dir && b.dir) return 1; - // 其他模态框:使用拼音排序 - let aValue = pinyinPro.pinyin(a.file_name, { toneType: 'none', type: 'string' }).toLowerCase(); - let bValue = pinyinPro.pinyin(b.file_name, { toneType: 'none', type: 'string' }).toLowerCase(); - if (this.fileSelect.sortOrder === 'asc') { - return aValue > bValue ? 1 : -1; - } else { - return aValue < bValue ? 1 : -1; + // 其他模态框:使用与任务列表一致的自然排序算法 + const ka = sortFileByName(a), kb = sortFileByName(b); + for (let i = 0; i < ka.length; ++i) { + if (ka[i] !== kb[i]) return this.fileSelect.sortOrder === 'asc' ? (ka[i] > kb[i] ? 1 : -1) : (ka[i] < kb[i] ? 1 : -1); } + return 0; } } if (field === 'file_name_re') { @@ -9693,28 +9689,48 @@ bValue = String(b.episode_number); } } else { - // 否则尝试从重命名结果中提取数字进行数值排序 + // 否则使用智能排序:优先数值排序,其次日期排序,最后字符串排序 const aRename = a.file_name_re || ''; const bRename = b.file_name_re || ''; - // 尝试提取数字(包括小数) - const aMatch = aRename.match(/(\d+(?:\.\d+)?)/); - const bMatch = bRename.match(/(\d+(?:\.\d+)?)/); + // 尝试提取所有数字进行数值排序 + const aNumbers = aRename.match(/\d+/g); + const bNumbers = bRename.match(/\d+/g); - if (aMatch && bMatch) { + if (aNumbers && bNumbers && aNumbers.length > 0 && bNumbers.length > 0) { // 如果都能提取到数字,进行数值比较 - aValue = parseFloat(aMatch[1]); - bValue = parseFloat(bMatch[1]); + // 优先比较第一个数字,如果相同则比较后续数字 + for (let i = 0; i < Math.max(aNumbers.length, bNumbers.length); i++) { + const aNum = parseInt(aNumbers[i] || '0', 10); + const bNum = parseInt(bNumbers[i] || '0', 10); + if (aNum !== bNum) { + aValue = aNum; + bValue = bNum; + break; + } + } + // 如果所有数字都相同,使用自然排序 + if (aValue === undefined) { + aValue = aRename; + bValue = bRename; + } } else { - // 否则使用重命名后的文件名进行拼音排序 - aValue = pinyinPro.pinyin(aRename, { toneType: 'none', type: 'string' }).toLowerCase(); - bValue = pinyinPro.pinyin(bRename, { toneType: 'none', type: 'string' }).toLowerCase(); + // 否则使用自然排序(支持数值和日期的智能排序) + aValue = aRename; + bValue = bRename; } } if (this.fileSelect.sortOrder === 'asc') { + // 字符串使用自然排序,数值直接比较 + if (typeof aValue === 'string' && typeof bValue === 'string') { + return aValue.localeCompare(bValue, undefined, { numeric: true, sensitivity: 'base' }); + } return aValue > bValue ? 1 : -1; } else { + if (typeof aValue === 'string' && typeof bValue === 'string') { + return bValue.localeCompare(aValue, undefined, { numeric: true, sensitivity: 'base' }); + } return aValue < bValue ? 1 : -1; } } @@ -9838,28 +9854,49 @@ bValue = String(b.episode_number); } } else { - // 否则尝试从重命名结果中提取数字进行数值排序 + // 否则使用智能排序:优先数值排序,其次日期排序,最后字符串排序 const aRename = a.file_name_re || ''; const bRename = b.file_name_re || ''; - // 尝试提取数字(包括小数) - const aMatch = aRename.match(/(\d+(?:\.\d+)?)/); - const bMatch = bRename.match(/(\d+(?:\.\d+)?)/); + // 尝试提取所有数字进行数值排序 + const aNumbers = aRename.match(/\d+/g); + const bNumbers = bRename.match(/\d+/g); - if (aMatch && bMatch) { + if (aNumbers && bNumbers && aNumbers.length > 0 && bNumbers.length > 0) { // 如果都能提取到数字,进行数值比较 - aValue = parseFloat(aMatch[1]); - bValue = parseFloat(bMatch[1]); + // 优先比较第一个数字,如果相同则比较后续数字 + for (let i = 0; i < Math.max(aNumbers.length, bNumbers.length); i++) { + const aNum = parseInt(aNumbers[i] || '0', 10); + const bNum = parseInt(bNumbers[i] || '0', 10); + if (aNum !== bNum) { + aValue = aNum; + bValue = bNum; + break; + } + } + // 如果所有数字都相同,使用自然排序 + if (aValue === undefined) { + aValue = aRename; + bValue = bRename; + } } else { - // 否则使用重命名后的文件名进行拼音排序 - aValue = pinyinPro.pinyin(aRename, { toneType: 'none', type: 'string' }).toLowerCase(); - bValue = pinyinPro.pinyin(bRename, { toneType: 'none', type: 'string' }).toLowerCase(); + // 否则使用自然排序(支持数值和日期的智能排序) + aValue = aRename; + bValue = bRename; } } if (order === 'asc') { + // 如果都是字符串,使用自然排序 + if (typeof aValue === 'string' && typeof bValue === 'string') { + return aValue.localeCompare(bValue, undefined, { numeric: true, sensitivity: 'base' }); + } return aValue > bValue ? 1 : -1; } else { + // 如果都是字符串,使用自然排序 + if (typeof aValue === 'string' && typeof bValue === 'string') { + return bValue.localeCompare(aValue, undefined, { numeric: true, sensitivity: 'base' }); + } return aValue < bValue ? 1 : -1; } } @@ -10921,7 +10958,7 @@ this.fileSelect.paths = []; this.fileSelect.error = undefined; this.fileSelect.selectedFiles = []; - // 设置排序方式为按重命名结果降序排序 + // 预览默认按重命名列降序(与任务列表一致) this.fileSelect.sortBy = "file_name_re"; this.fileSelect.sortOrder = "desc"; // 展示当前文件夹的文件 @@ -13326,11 +13363,9 @@ }); } - // 如果没有剧集识别模式,添加默认模式 - if (!this.formData.episode_patterns || this.formData.episode_patterns.length === 0) { - this.formData.episode_patterns = [ - { regex: '第(\\d+)集|第(\\d+)期|第(\\d+)话|(\\d+)集|(\\d+)期|(\\d+)话|[Ee][Pp]?(\\d+)|(\\d+)[-_\\s]*4[Kk]|\\[(\\d+)\\]|【(\\d+)】|_?(\\d+)_?' } - ]; + // 确保剧集识别模式字段存在(但不自动添加默认规则) + if (!this.formData.episode_patterns) { + this.formData.episode_patterns = []; } // 如果当前标签是历史记录,则加载历史记录