Files
2026-10-08 10:06:46 +02:00

91 lines
5.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Test réseau de backend/src/lyrics/Lyrics.js contre LRCLIB réel (node lyrics.live.js) : affiche les résultats
const { check, done, req } = require("./_setup");
const L = req("src/lyrics/Lyrics.js");
// Formes rencontrées en vrai : titres YouTube bruts, chaînes VEVO / Topic, morceaux Spotify propres
const SONGS = [
{ type: "youtube", id: "FGBhQbmPwH8", title: "Daft Punk - One More Time (Official Video)", author: "Daft Punk", duration: 320, expectSynced: true },
{ type: "youtube", id: "dQw4w9WgXcQ", title: "Rick Astley - Never Gonna Give You Up (Official Music Video)", author: "Rick Astley", duration: 213, expectSynced: true },
{ type: "youtube", id: "spotify-papaoutai", title: "Papaoutai", author: "Stromae", duration: 232, expectSynced: true },
{ type: "youtube", id: "fJ9rUzIMcZQ", title: "Queen – Bohemian Rhapsody (Official Video Remastered)", author: "Queen Official", duration: 360 },
{ type: "youtube", id: "topic-test", title: "Get Lucky (feat. Pharrell Williams and Nile Rodgers)", author: "Daft Punk - Topic", duration: 369 },
{ type: "youtube", id: "nope", title: "zzqx introuvable 8472 kq", author: "Personne", duration: 100, expectMiss: true },
];
function preview(result) {
if (!result.ok) return `échec ${result.error}`;
const first = result.synced ? result.lines.find(l => l.text) : null;
return `${result.source} · ${result.instrumental ? "instrumental" : result.synced ? `synchronisées (${result.lines.length} lignes, 1re à ${(first.t / 1000).toFixed(2)} s : « ${first.text} »)` : "texte seul"}`
+ ` · match ${result.match.artist} - ${result.match.track} (${result.match.album || "?"}, ${result.match.duration} s, id ${result.match.id ?? "-"})`;
}
(async () => {
for (const song of SONGS) {
const t = Date.now();
const result = await L.getLyricsForSong(song);
console.log(`\n${song.title} / ${song.author}\n requête : ${JSON.stringify(L.guessQuery(song))}\n ${preview(result)} [${Date.now() - t} ms]`);
if (song.expectMiss) check("introuvable → NOT_FOUND", !result.ok && result.error === "NOT_FOUND", result);
else check(`trouvé : ${song.title}`, result.ok && !!(result.plain || result.instrumental), result.error);
if (song.expectSynced) {
check(`synchronisées : ${song.title}`, result.ok && result.synced);
// Horodatages exploitables : croissants, en ms, dans la durée du morceau
const lines = result.ok && Array.isArray(result.lines) ? result.lines : [];
const texts = lines.filter(l => l.text);
const sorted = lines.every((l, i) => Number.isInteger(l.t) && l.t >= 0 && (i === 0 || l.t >= lines[i - 1].t));
const last = lines.length ? lines[lines.length - 1].t : 0;
check(`horodatages croissants (${texts.length} lignes)`, texts.length >= 10 && sorted && last > 30000 && last <= (song.duration + 15) * 1000, { lines: lines.length, last });
check("User-Agent identifiant envoyé", /^Subsonics-Chopin\/\S+ \(https?:\/\//.test(L.USER_AGENT));
}
check("songKey", result.songKey === `${song.type}:${song.id}`);
}
const t = Date.now();
await L.getLyricsForSong(SONGS[0]);
check("2e appel servi par le cache", Date.now() - t < 50);
const search = await L.searchCandidates("daft punk one more time");
console.log(`\nsearchCandidates : ${search.ok ? search.results.length + " résultats" : search.error}`);
if (search.ok) for (const c of search.results.slice(0, 5)) console.log(` #${c.id} ${c.artist} - ${c.track} (${c.album}, ${c.duration} s${c.synced ? ", synchro" : ""})`);
check("searchCandidates ok", search.ok && search.results.length > 0);
if (search.ok && search.results.length) {
const byId = await L.getById(search.results[0].id);
console.log(`getById(${search.results[0].id}) : ${preview(byId)}`);
check("getById ok", byId.ok);
}
const legacy = await L.getLyrics("Daft Punk - One More Time");
check("getLyrics (compat) renvoie du texte", typeof legacy === "string" && legacy.length > 20);
// Repli : LRCLIB rendu injoignable, Deezer + lyrics.ovh réels
console.log("\nRepli lyrics.ovh (LRCLIB simulé en panne)");
const realFetch = globalThis.fetch;
const hosts = [];
globalThis.fetch = async (input, options) => {
const host = new URL(String(input)).host;
hosts.push(host);
if (host === "lrclib.net") throw new TypeError("fetch failed");
return realFetch(input, options);
};
try {
L.clearCache();
const t0 = Date.now();
const fallback = await L.getLyricsForSong({ type: "youtube", id: "ovh-test", title: "Coldplay - Yellow (Official Video)", author: "Coldplay", duration: 269 });
console.log(` ${fallback.ok ? preview(fallback) : "échec " + fallback.error} [${Date.now() - t0} ms] · hôtes : ${[...new Set(hosts)].join(", ")}`);
check("repli tenté (Deezer puis lyrics.ovh)", hosts.includes("api.deezer.com") && hosts.includes("api.lyrics.ovh"), [...new Set(hosts)]);
if (fallback.ok) {
check("repli : texte seul depuis lyrics.ovh", fallback.source === "lyrics.ovh" && !fallback.synced && fallback.lines === null && fallback.plain.length > 100);
} else {
// lyrics.ovh est souvent en panne : signalé sans faire échouer le test
console.log(` AVERTISSEMENT : lyrics.ovh n'a rien renvoyé (${fallback.error}), le repli n'a pas pu être vérifié de bout en bout`);
check("repli en panne → UNAVAILABLE (LRCLIB injoignable)", fallback.error === "UNAVAILABLE");
}
} finally {
globalThis.fetch = realFetch;
}
done();
})().catch((error) => {
console.error(error);
process.exitCode = 1;
});