From c4e6230bf8d03ead63bf62d56c33c04fb6112a92 Mon Sep 17 00:00:00 2001 From: woleigedouer <38418090+woleigedouer@users.noreply.github.com> Date: Thu, 30 Apr 2026 22:54:30 +0800 Subject: [PATCH] =?UTF-8?q?fix(tencent):=20=E6=94=AF=E6=8C=81=E5=88=AB?= =?UTF-8?q?=E5=90=8D=E5=8C=B9=E9=85=8D=E4=BB=A5=E6=8F=90=E5=8D=87=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E5=87=86=E7=A1=AE=E5=BA=A6=20(#291)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 extractAliasesFromHintWords 方法从hintWords 提取别名 - 新增 titleOrAliasMatches 方法支持标题和别名匹配 - 在 getAnimeInfo 和 searchAnime 中添加 aliases 字段 - 优化搜索过滤逻辑,使用别名匹配替代单一标题匹配 --- danmu_api/sources/tencent.js | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/danmu_api/sources/tencent.js b/danmu_api/sources/tencent.js index d946c1e..4b9cd09 100644 --- a/danmu_api/sources/tencent.js +++ b/danmu_api/sources/tencent.js @@ -12,6 +12,30 @@ import { SegmentListResponse } from '../models/dandan-model.js'; // 获取腾讯视频弹幕 // ===================== export default class TencentSource extends BaseSource { + extractAliasesFromHintWords(hintWords) { + if (!hintWords || typeof hintWords !== 'string') return []; + + const aliases = []; + const addAlias = (value) => { + const alias = String(value || '').replace(/<\/?em>/g, '').trim(); + if (alias && !aliases.includes(alias)) aliases.push(alias); + }; + + const aliasMatch = hintWords.match(/(?:又名|别名)\s*[::]\s*(.+)$/); + if (!aliasMatch) return aliases; + + aliasMatch[1] + .split(/[、,,/|]+/) + .forEach(addAlias); + + return aliases; + } + + titleOrAliasMatches(anime, queryTitle) { + if (titleMatches(anime.title, queryTitle)) return true; + return Array.isArray(anime.aliases) && anime.aliases.some(alias => titleMatches(alias, queryTitle)); + } + /** * 过滤腾讯视频搜索项 * @param {Object} item - 搜索项 @@ -96,11 +120,13 @@ export default class TencentSource extends BaseSource { } const episodeCount = contentType === '电影' ? 1 : (videoInfo.subjectDoc ? videoInfo.subjectDoc.videoNum : 0); + const aliases = this.extractAliasesFromHintWords(videoInfo.hintWords).filter(alias => alias !== title); return { provider: "tencent", mediaId: mediaId, title: title, + aliases: aliases, type: mediaType, year: videoInfo.year, imageUrl: videoInfo.imgUrl, @@ -400,7 +426,7 @@ export default class TencentSource extends BaseSource { // 使用 map 和 async 时需要返回 Promise 数组,并等待所有 Promise 完成 const processTencentAnimes = await Promise.all(sourceAnimes - .filter(s => titleMatches(s.title, queryTitle)) + .filter(s => this.titleOrAliasMatches(s, queryTitle)) .map(async (anime) => { try { const eps = await this.getEpisodes(anime.mediaId); @@ -443,6 +469,7 @@ export default class TencentSource extends BaseSource { rating: 0, isFavorited: true, source: "tencent", + aliases: anime.aliases || [], }; tmpAnimes.push(transformedAnime);