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>
60 lines
2.7 KiB
TypeScript
60 lines
2.7 KiB
TypeScript
// 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)
|
||
})
|
||
})
|