Jede Zahl sagt jetzt, was sie ist — und woher sie kommt

Nebeneinander standen „7,2" und „12", beide ohne Beschriftung. Die 12
konnte alles heissen: zwölf Folgen, zwölf von hundert Punkten, ab zwölf
Jahren. Die Auskunft steckte im Tooltip, und den sieht nur, wer schon
vermutet, dass dort etwas steht. Jetzt trägt jeder Wert seine Quelle:
FSK 12, TMDB 7,2, IMDb 7,4, MC 62.

Bei Rotten Tomatoes ist „RT 87%" ebenfalls keine Auskunft, denn dort
stehen zwei Zahlen — die der Kritik und die des Publikums, oft weit
auseinander. Also „RT Kritik" und „RT Publikum", auch wenn nur eine
der beiden da ist.

Und das Publikum wird mitverlangt: `tomatoes=true` legt die Felder
derselben Antwort bei, kostet keine zweite Anfrage und nichts vom
Tageskontingent. Ob etwas darin steht, ist eine andere Frage — seit 2018
wird berichtet, dass dort `N/A` steht, und die Frage, ob die Felder je
wieder Daten führen, ist bei OMDb seit 2017 unbeantwortet offen. Darum
wird nichts erwartet und nichts erzwungen: steht eine Zahl da, erscheint
sie; steht `N/A`, entsteht keine Wertung. Die Probe unter Einstellungen →
Metadaten zeigt, was wirklich kam.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-08 22:41:41 +02:00
co-authored by Claude Opus 5
parent a609b2d087
commit ac64b20a5b
4 changed files with 229 additions and 30 deletions
+73 -27
View File
@@ -26,15 +26,41 @@ type Art = 'filme' | 'serien';
*
* **Kein Logo.** Die Marken von IMDb und Rotten Tomatoes mitzuliefern
* hiesse, fremde Zeichen auszuliefern; ein Kürzel sagt dasselbe und gehört
* uns. */
* uns.
*
* **Rotten Tomatoes trägt zwei Zahlen, und „RT 87%" sagt nicht, welche.**
* Dort steht der Wert der Kritik neben dem des Publikums; beide heissen
* gleich und sind oft weit auseinander. Deshalb steht die Hälfte dabei —
* auch wenn nur eine der beiden da ist. */
const QUELLENKUERZEL: Record<string, string> = {
imdb: 'IMDb', rottenTomatoes: 'RT', metacritic: 'MC',
imdb: 'IMDb',
rottenTomatoes: 'RT Kritik',
rottenTomatoesAudience: 'RT Publikum',
metacritic: 'MC',
};
const QUELLENNAMEN: Record<string, string> = {
imdb: 'IMDb', rottenTomatoes: 'Rotten Tomatoes', metacritic: 'Metacritic',
/** Was im Tooltip steht — ein ganzer Satz, nicht nur der Name. */
const QUELLENERKLAERUNG: Record<string, string> = {
imdb: 'Bewertung bei IMDb',
rottenTomatoes: 'Rotten Tomatoes: die Wertung der Kritik (Tomatometer)',
rottenTomatoesAudience: 'Rotten Tomatoes: die Wertung des Publikums',
metacritic: 'Bewertung bei Metacritic',
};
/** In welcher Reihenfolge sie stehen, unabhängig davon, wie sie ankamen.
*
* **Die beiden Werte von Rotten Tomatoes gehören nebeneinander.** Der
* Server hängt den Publikumswert hinten an, weil er in der Antwort an
* anderer Stelle steht als die übrigen; zwischen ihnen stünde dann
* Metacritic. */
const QUELLENFOLGE = ['imdb', 'rottenTomatoes', 'rottenTomatoesAudience', 'metacritic'];
/** Eine Quelle, die es noch nicht gab, steht hinten statt vorn. */
function rang(quelle: string): number {
const stelle = QUELLENFOLGE.indexOf(quelle);
return stelle < 0 ? QUELLENFOLGE.length : stelle;
}
export function detailseite(art: Art, id: string, zurueck: () => void): HTMLElement {
const wurzel = document.createElement('div');
wurzel.className = 'detail';
@@ -215,6 +241,27 @@ export function detailseite(art: Art, id: string, zurueck: () => void): HTMLElem
return kopf;
}
/** Eine Wertung mit ihrer Quelle davor.
*
* **Der Name steht im Bild, nicht im Tooltip.** Eine Zahl ohne Quelle ist
* keine Auskunft — und ein Tooltip sieht nur, wer schon vermutet, dass
* dort etwas steht. Der Stern bleibt der Wertung von TMDB vorbehalten;
* ihn für vier Quellen zu wiederholen hiesse, vier gleich aussehende
* Zahlen nebeneinanderzustellen. */
function wertung(quelle: string, wert: string, titel: string, stern = false): HTMLElement {
const b = document.createElement('span');
b.className = 'bewertung' + (stern ? '' : ' fremd');
const name = document.createElement('span');
name.className = 'bewertungsquelle';
name.textContent = quelle;
if (stern) b.innerHTML = icons.stern;
b.append(name, document.createTextNode(wert));
b.title = titel;
return b;
}
/** Jahr · Genres · Laufzeit · Freigabe · Bewertung — eine Zeile. */
function eckdaten(eintrag: Film | Serie): HTMLElement {
const zeile = document.createElement('div');
@@ -234,39 +281,38 @@ export function detailseite(art: Art, id: string, zurueck: () => void): HTMLElem
zeile.appendChild(t);
}
// **Jede Zahl sagt, was sie ist.** Hier standen „7,2" und „12"
// nebeneinander, beide ohne Beschriftung — und die 12 konnte alles
// heissen: zwölf Folgen, zwölf von hundert Punkten, ab zwölf Jahren.
// Die Auskunft steckte im Tooltip, und den sieht nur, wer schon
// vermutet, dass dort etwas steht.
if (eintrag.contentRating) {
const f = document.createElement('span');
f.className = 'freigabe';
f.textContent = eintrag.contentRating;
// Eine reine Zahl ist eine Altersangabe und heisst hierzulande FSK.
// „PG-13" steht für sich — „FSK PG-13" wäre falsch.
f.textContent = /^\d+$/.test(eintrag.contentRating)
? `FSK ${eintrag.contentRating}`
: eintrag.contentRating;
f.title = 'Altersfreigabe';
zeile.appendChild(f);
}
if (eintrag.rating) {
const b = document.createElement('span');
b.className = 'bewertung';
b.innerHTML = icons.stern;
b.append(document.createTextNode(eintrag.rating.toFixed(1)));
b.title = 'Bewertung bei TMDB';
zeile.appendChild(b);
zeile.appendChild(wertung('TMDB', eintrag.rating.toFixed(1), 'Bewertung bei TMDB', true));
}
// **Fremde Bewertungen daneben, nicht statt dessen.**
//
// Jede Quelle in ihrer eigenen Form: IMDb zählt bis zehn, Rotten
// Tomatoes in Prozent, Metacritic bis hundert. „87 %" in „8,7 von 10"
// umzurechnen wäre eine Lüge über die Quelle — man kennt sie so, wie
// sie dort steht.
(eintrag.externalRatings ?? []).forEach(w => {
const b = document.createElement('span');
b.className = 'bewertung fremd';
const name = document.createElement('span');
name.className = 'bewertungsquelle';
name.textContent = QUELLENKUERZEL[w.source] ?? w.source;
b.append(name, document.createTextNode(w.display));
b.title = `Bewertung bei ${QUELLENNAMEN[w.source] ?? w.source}`;
zeile.appendChild(b);
});
// Die fremden Wertungen daneben, jede in ihrer eigenen Form: IMDb zählt
// bis zehn, Rotten Tomatoes in Prozent, Metacritic bis hundert. „87 %"
// in „8,7 von 10" umzurechnen wäre eine Lüge über die Quelle.
[...(eintrag.externalRatings ?? [])]
.sort((a, b) => rang(a.source) - rang(b.source))
.forEach(w => {
zeile.appendChild(wertung(
QUELLENKUERZEL[w.source] ?? w.source,
w.display,
QUELLENERKLAERUNG[w.source] ?? `Bewertung bei ${w.source}`));
});
return zeile;
}