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:
co-authored by
Claude Opus 5
parent
a609b2d087
commit
ac64b20a5b
+73
-27
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user