From fd92995255948365d3963c82a763c22b8b46ac82 Mon Sep 17 00:00:00 2001 From: tkrmagid Date: Fri, 11 Sep 2026 15:35:14 +0900 Subject: [PATCH] =?UTF-8?q?fix(YoutubeMusic):=20=EC=B5=9C=EC=83=81?= =?UTF-8?q?=EC=9C=84=20=EA=B2=B0=EA=B3=BC=EA=B0=80=20=EC=BB=A4=EB=B2=84/MR?= =?UTF-8?q?=EB=A5=98=EB=A9=B4=20null=20=EB=B0=98=ED=99=98=ED=95=98?= =?UTF-8?q?=EC=97=AC=20ytsearch=20Topic=20=ED=8F=B4=EB=B0=B1=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9(=EC=9E=AC=EC=83=9D=20=ED=92=88=EC=A7=88=20=EB=B3=B4?= =?UTF-8?q?=ED=98=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot/src/utils/api/YoutubeMusic.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/bot/src/utils/api/YoutubeMusic.ts b/bot/src/utils/api/YoutubeMusic.ts index 54e52a3..0b84401 100644 --- a/bot/src/utils/api/YoutubeMusic.ts +++ b/bot/src/utils/api/YoutubeMusic.ts @@ -6,6 +6,8 @@ import { SongItem } from "../../types/Track"; import { Logger } from "../Logger"; const customPREF = "tz=Asia.Seoul&hl=ko&gl=KR&last_quality=1080"; +// 커버/MR/노래방/라이브 등 2차 창작물 판별용. 원곡이 아닌 결과를 후순위/배제하는 데 쓴다. +const JUNK_RE = /(\bMR\b|inst(?:rumental)?|instrumental|karaoke|노래방|\bcover\b|커버|nightcore|sped ?up|slowed|8d audio|리믹스|remix|male version|남자\s?버전|여자\s?버전|가사|lyrics?)/i; export const ORIGIN = "https://music.youtube.com"; const proxy = Config.proxyUrl ? new ProxyAgent(Config.proxyUrl) : undefined; const searchCache = new Map(); @@ -204,8 +206,7 @@ export const YoutubeMusic = { // YTM이 필터 없는 검색에서 커버/MR/노래방/라이브를 상위로 올리는 경우가 있어, // 명백한 2차 창작물은 뒤로 보낸다(원곡 우선). 동점이면 원래 순서 유지(안정 정렬). - const junk = /(\bMR\b|inst(?:rumental)?|instrumental|karaoke|노래방|\bcover\b|커버|nightcore|sped ?up|slowed|8d audio|리믹스|remix|male version|남자\s?버전|여자\s?버전|가사|lyrics?)/i; - const scored = results.map((r, i) => ({ r, i, junk: junk.test(r.title) ? 1 : 0 })); + const scored = results.map((r, i) => ({ r, i, junk: JUNK_RE.test(r.title) ? 1 : 0 })); scored.sort((a, b) => a.junk - b.junk || a.i - b.i); return scored.map((s) => s.r); } catch (error) { @@ -218,7 +219,10 @@ export const YoutubeMusic = { const lowerQuery = query.toLocaleLowerCase().trim(); if (searchCache.has(lowerQuery)) return searchCache.get(lowerQuery) ?? null; const video = (await this.getSearchFull(query) ?? [])?.[0]; - if (video?.url) searchCache.set(lowerQuery, video.url); - return video?.url ?? null; + // 최상위 결과가 커버/MR/노래방류면 null을 반환해, 호출측(LavalinkManager)이 + // 더 깨끗한 `ytsearch:... Topic`(공식 오디오) 폴백을 쓰도록 한다. + if (!video?.url || JUNK_RE.test(video.title)) return null; + searchCache.set(lowerQuery, video.url); + return video.url; } }; \ No newline at end of file