fix(YoutubeMusic): 최상위 결과가 커버/MR류면 null 반환하여 ytsearch Topic 폴백 사용(재생 품질 보호)
This commit is contained in:
@@ -6,6 +6,8 @@ import { SongItem } from "../../types/Track";
|
|||||||
import { Logger } from "../Logger";
|
import { Logger } from "../Logger";
|
||||||
|
|
||||||
const customPREF = "tz=Asia.Seoul&hl=ko&gl=KR&last_quality=1080";
|
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";
|
export const ORIGIN = "https://music.youtube.com";
|
||||||
const proxy = Config.proxyUrl ? new ProxyAgent(Config.proxyUrl) : undefined;
|
const proxy = Config.proxyUrl ? new ProxyAgent(Config.proxyUrl) : undefined;
|
||||||
const searchCache = new Map<string, string>();
|
const searchCache = new Map<string, string>();
|
||||||
@@ -204,8 +206,7 @@ export const YoutubeMusic = {
|
|||||||
|
|
||||||
// YTM이 필터 없는 검색에서 커버/MR/노래방/라이브를 상위로 올리는 경우가 있어,
|
// YTM이 필터 없는 검색에서 커버/MR/노래방/라이브를 상위로 올리는 경우가 있어,
|
||||||
// 명백한 2차 창작물은 뒤로 보낸다(원곡 우선). 동점이면 원래 순서 유지(안정 정렬).
|
// 명백한 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_RE.test(r.title) ? 1 : 0 }));
|
||||||
const scored = results.map((r, i) => ({ r, i, junk: junk.test(r.title) ? 1 : 0 }));
|
|
||||||
scored.sort((a, b) => a.junk - b.junk || a.i - b.i);
|
scored.sort((a, b) => a.junk - b.junk || a.i - b.i);
|
||||||
return scored.map((s) => s.r);
|
return scored.map((s) => s.r);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -218,7 +219,10 @@ export const YoutubeMusic = {
|
|||||||
const lowerQuery = query.toLocaleLowerCase().trim();
|
const lowerQuery = query.toLocaleLowerCase().trim();
|
||||||
if (searchCache.has(lowerQuery)) return searchCache.get(lowerQuery) ?? null;
|
if (searchCache.has(lowerQuery)) return searchCache.get(lowerQuery) ?? null;
|
||||||
const video = (await this.getSearchFull(query) ?? [])?.[0];
|
const video = (await this.getSearchFull(query) ?? [])?.[0];
|
||||||
if (video?.url) searchCache.set(lowerQuery, video.url);
|
// 최상위 결과가 커버/MR/노래방류면 null을 반환해, 호출측(LavalinkManager)이
|
||||||
return video?.url ?? null;
|
// 더 깨끗한 `ytsearch:... Topic`(공식 오디오) 폴백을 쓰도록 한다.
|
||||||
|
if (!video?.url || JUNK_RE.test(video.title)) return null;
|
||||||
|
searchCache.set(lowerQuery, video.url);
|
||||||
|
return video.url;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user