fix(backend): Kuenstler vor Dauer in der Suchkaskade, mit Regressionsprobe
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
748b1446a2
commit
2f87a12f08
3 files changed
+203
-16
No files matched your search
+28
-16
@@ -390,29 +390,41 @@ async function downloadTrack({ jobId, artist, rawArtist, albumArtist, title, alb
|
||||
log(jobId, '⚠️ Kein YTM-Treffer — Fallback zu YouTube…');
|
||||
await spawnYtdlp([`ytsearch5:${query}`, ...PI_FILTERED, ...mf(dur, true, true), ...baseArgs]);
|
||||
}
|
||||
// Findet sich im Dauerfenster nichts, wird ZUERST die DAUER gelockert und der Kuenstler
|
||||
// BEHALTEN — nicht umgekehrt. Der Kuenstler ist das staerkere Merkmal: die erwartete Dauer
|
||||
// stammt aus den Metadaten und gehoert oft zu einer anderen Fassung, waehrend Kanalname und
|
||||
// artist-Feld den Song tatsaechlich benennen.
|
||||
//
|
||||
// Vorher lief es andersherum, und genau daran ist am 24.9.2026 "Dearly Beloved" von TPR
|
||||
// gescheitert: erwartet wurden 230 s (Deezer kennt TPR nicht und lieferte "Dearly Beloved I"
|
||||
// von Project Destati), der richtige Upload dauert 136 s und fiel aus dem Fenster — waehrend
|
||||
// eine Rockband namens DEARLY BELOVED mit ihrem Stueck "LSD" bei 250 s mitten hinein passte.
|
||||
// Deren BANDNAME erfuellte die Titelpruefung. Der Schritt ohne Kanalpruefung griff zuerst zu.
|
||||
//
|
||||
// Es faellt KEIN Schritt weg, nur die Reihenfolge dreht sich: was vorher gefunden wurde, wird
|
||||
// weiter gefunden, nur gegebenenfalls eine Stufe spaeter (geprueft, siehe scripts/filter-probe.mjs).
|
||||
if (!hasAudio()) {
|
||||
// 3. YTM all-10 — no channel check (label channels, etc.)
|
||||
log(jobId, '⚠️ Erweitere Suche auf top 10 mit Dauerbeschränkung…');
|
||||
await tryYtm(0, mf(dur, true));
|
||||
}
|
||||
if (!hasAudio()) {
|
||||
// 4. YT top-10 — no channel check
|
||||
await spawnYtdlp([`ytsearch10:${query}`, ...PI_FILTERED_10, ...mf(dur, true), ...baseArgs]);
|
||||
}
|
||||
// No duration match. "Mittelweg": relax the duration constraint but REQUIRE the artist
|
||||
// channel (+ title). This catches legit tracks whose YT upload duration drifts from the
|
||||
// iTunes value, while never grabbing a same-titled video by someone else. If nothing
|
||||
// matches title+channel we download NOTHING and the job fails cleanly (see end of fn) —
|
||||
// far better than silently saving the wrong song (e.g. a "recognize" fan clip).
|
||||
if (!hasAudio()) {
|
||||
// 5. YTM all — no duration, but channel + title required
|
||||
// 3. YTM all — ohne Dauer, aber Kuenstler + Titel verlangt
|
||||
log(jobId, '⚠️ Kein Treffer im Dauerbereich — suche ohne Dauer, aber mit Künstler-Channel…');
|
||||
await tryYtm(0, mf(null, true, true));
|
||||
}
|
||||
if (!hasAudio()) {
|
||||
// 6. YT top-10 — no duration, but channel + title required
|
||||
// 4. YT top-10 — ohne Dauer, aber Kuenstler + Titel verlangt
|
||||
await spawnYtdlp([`ytsearch10:${query}`, ...PI_FILTERED_10, ...mf(null, true, true), ...baseArgs]);
|
||||
}
|
||||
// Letzter Ausweg: Kanalpruefung fallen lassen, dafuer die Dauer wieder verlangen. Das faengt
|
||||
// offizielle Uploads von Label-Kanaelen, die den Kuenstler weder im Kanalnamen noch im
|
||||
// artist-Feld tragen. Bleibt auch das ohne Treffer, wird NICHTS geladen und der Auftrag
|
||||
// scheitert sauber — besser als still den falschen Song zu speichern.
|
||||
if (!hasAudio()) {
|
||||
// 5. YTM all-10 — ohne Kanalpruefung, dafuer im Dauerfenster
|
||||
log(jobId, '⚠️ Erweitere Suche auf top 10 mit Dauerbeschränkung…');
|
||||
await tryYtm(0, mf(dur, true));
|
||||
}
|
||||
if (!hasAudio()) {
|
||||
// 6. YT top-10 — ohne Kanalpruefung, dafuer im Dauerfenster
|
||||
await spawnYtdlp([`ytsearch10:${query}`, ...PI_FILTERED_10, ...mf(dur, true), ...baseArgs]);
|
||||
}
|
||||
} else {
|
||||
log(jobId, `🔍 Suche YT Music: "${query}"`);
|
||||
// 1. YTM top-5 — strict: title + variant + channel check
|
||||
|
||||
Reference in new issue
Block a user