Files
rippy/rippy-windows/test/metadaten-570.test.ts
T
HitonabiandClaude Opus 5 3dacd7cb4f fix(v5): Erkennung vergleicht auch den Originaltitel und ignoriert Akzente
WAS: TMDb antwortet mit language=de-DE auf Deutsch („Der Patriot", „Déjà Vu
– Wettlauf gegen die Zeit"), die Disc trägt den Originaltitel
(THE_PATRIOT, DEJA_VU). Der wörtliche Vergleich prüft jetzt title UND
original_title (name/original_name bei Serien); Akzente fallen vor dem
Vergleich (NFD, ohneAkzente) — auch bei Wort-Überlappung und Abdeckung.
WARUM: Durchsicht 12.09.2026, Fund F14 (Sonde 1): „Déjà Vu" ≠ „Deja Vu",
„Der Patriot" ≠ „The Patriot" — nur 60 % statt 95 %, die Automatik
wartete. Tests mit genau diesen Titeln.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 21:41:11 +02:00

60 lines
2.7 KiB
TypeScript
Raw 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.
// 5.7.0 (Durchsicht 12.09.2026, F14): Der wörtliche Vergleich kennt jetzt
// Akzente und den Originaltitel. Die drei Filme des Commanders (Der
// Patriot, Déjà Vu, Training Day) tragen englische Labels, TMDb antwortet
// auf Deutsch — vorher ein Vorschlag mit 60 %, die Automatik wartete.
import { describe, expect, it } from 'vitest'
import { gleichBedeutend, ohneAkzente, wortUeberlappung, zuordnen } from '../src/kern/metadaten/zuordnung'
const keinOmdb = { verfuegbar: false, lookup: async () => null }
function tmdb(filme: Array<{ id: number; title: string; original_title?: string }>) {
return {
verfuegbar: true,
searchMovie: async () => filme,
searchTv: async () => [],
movieDetails: async (id: number) => {
const f = filme.find((x) => x.id === id)
return f === undefined ? null : { id, title: f.title, release_date: '2000-06-28', overview: 'Ü', vote_count: 100 }
},
tvDetails: async () => null,
findByImdb: async () => null,
}
}
describe('ohneAkzente und gleichBedeutend', () => {
it('Déjà Vu ist Deja Vu', () => {
expect(ohneAkzente('Déjà Vu')).toBe('Deja Vu')
expect(gleichBedeutend('Déjà Vu', 'Deja Vu')).toBe(true)
expect(gleichBedeutend('Amélie', 'AMELIE')).toBe(true)
expect(wortUeberlappung('Déjà Vu', 'Deja Vu')).toBe(1)
})
it('Umlaute bleiben unterscheidbar genug (ä → a, ß → ss)', () => {
expect(gleichBedeutend('Der Baader Meinhof Komplex', 'Der Baader Meinhof Komplex')).toBe(true)
expect(gleichBedeutend('Das Boot', 'Das Bot')).toBe(false)
})
})
describe('zuordnen mit Originaltitel', () => {
it('Label „The Patriot" trifft „Der Patriot" (original_title) wörtlich — 0,95', async () => {
const z = await zuordnen('The Patriot', tmdb([{ id: 8489, title: 'Der Patriot', original_title: 'The Patriot' }]), keinOmdb)
expect(z.confidence).toBe(0.95)
expect(z.titel).toBe('Der Patriot')
})
it('Label „Deja Vu" trifft „Déjà Vu Wettlauf gegen die Zeit" über den Originaltitel', async () => {
const z = await zuordnen(
'Deja Vu',
tmdb([
{ id: 7551, title: 'Déjà Vu Wettlauf gegen die Zeit', original_title: 'Deja Vu' },
{ id: 1, title: 'Déjà Vu', original_title: 'Déjà Vu' },
]),
keinOmdb,
)
expect(z.confidence).toBe(0.95)
expect(z.titel).toBe('Déjà Vu Wettlauf gegen die Zeit')
})
it('ohne Originaltitel und ohne wörtlichen Treffer bleibt es ein Vorschlag', async () => {
const z = await zuordnen('The Patriot', tmdb([{ id: 1, title: 'Der Patriot' }, { id: 2, title: 'Patriot Games' }, { id: 3, title: 'Der Patriot 2' }, { id: 4, title: 'Patrioten' }]), keinOmdb)
expect(z.confidence).toBe(0.6)
})
})