diff --git a/src/views/discover/TorrentCardListView.vue b/src/views/discover/TorrentCardListView.vue index a08bcf67..18b7f35a 100644 --- a/src/views/discover/TorrentCardListView.vue +++ b/src/views/discover/TorrentCardListView.vue @@ -71,7 +71,34 @@ function initOptions(data: Context) { // 对季过滤选项进行排序 const sortSeasonFilterOptions = computed(() => { return seasonFilterOptions.value.sort((a, b) => { - // 按字符串降序排序 + // 按季,集降序排序 + const parseSeasonEpisode = (str: string) => { + const seasonRangeMatch = str.match(/S(\d+)(?:-S(\d+))?/); + const episodeRangeMatch = str.match(/E(\d+)(?:-E(\d+))?/); + return { + seasonStart : seasonRangeMatch?.[1] ? parseInt(seasonRangeMatch[1]) : 0, + seasonEnd : seasonRangeMatch?.[2] ? parseInt(seasonRangeMatch[2]) : 0, + episodeStart : episodeRangeMatch?.[1] ? parseInt(episodeRangeMatch[1]) : 0, + episodeEnd : episodeRangeMatch?.[2] ? parseInt(episodeRangeMatch[2]) : 0 + } + } + const parsedA = parseSeasonEpisode(a) + const parsedB = parseSeasonEpisode(b) + // 先按季降序排序 + if (parsedB.seasonStart !== parsedA.seasonStart) { + return parsedB.seasonStart - parsedA.seasonStart + } + if (parsedB.seasonEnd !== parsedA.seasonEnd) { + return parsedB.seasonEnd - parsedA.seasonEnd + } + // 按集降序排序 + if (parsedB.episodeStart !== parsedA.episodeStart) { + return parsedB.episodeStart - parsedA.episodeStart + } + if (parsedB.episodeEnd !== parsedA.episodeEnd) { + return parsedB.episodeEnd - parsedA.episodeEnd + } + // 兜底 return b.localeCompare(a) }) }) @@ -112,7 +139,10 @@ watchEffect(() => { groupedDataList.value?.forEach(value => { if (value.length > 0) { const matchData = value.filter(data => { - const { meta_info, torrent_info } = data + const { + meta_info, + torrent_info, + } = data // 季、制作组、视频编码 return ( // 站点过滤