Der Aufmacher zeigte monatelang denselben Film

Er war nun einmal der erste in "Weiterschauen", und genommen wurden
schlicht die ersten fünf der Liste. Jetzt wird gezogen — aber nicht bei
jedem Blick: der Zufall hängt an einem Zeitfenster von sechs Stunden.
Wer die App dreimal am Abend öffnet, findet sich zurecht; wer am
nächsten Morgen wiederkommt, sieht etwas anderes.

Titel ohne Hintergrundbild sind dabei nicht ausgeschlossen, sondern
ziehen ein schlechteres Los. Sie ganz auszusperren war zu hart — in
einer Mediathek, in der wenige Titel eines tragen, blieben immer
dieselben drei übrig.

Dieselbe Regel im Web, damit beide nicht auseinanderlaufen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-14 16:34:09 +02:00
co-authored by Claude Opus 5
parent daa836fd8c
commit c3f9afdb07
2 changed files with 106 additions and 6 deletions
+25 -1
View File
@@ -610,7 +610,7 @@ async function renderHome() {
...views.map((v, i) => ({ title: `Neu in ${v.Name}`, items: latest[i] || [] })),
].filter((r) => r.items.length);
const featured = [...resume, ...(latest[0] || [])].filter((i) => hasImg(i, 'Backdrop')).slice(0, 5);
const featured = pickFeatured([...resume, ...next, ...latest.flat()]);
c.innerHTML = '';
if (featured.length) c.appendChild(buildHero(featured));
@@ -622,6 +622,30 @@ async function renderHome() {
}
}
/* Wählt aus, was oben groß steht — dieselbe Regel wie in der App.
----------------------------------------------------------------------------
Zwei Dinge auf einmal: die Auswahl wechselt alle sechs Stunden, und ein
Titel ohne Hintergrundbild zieht ein schlechteres Los. Bei jedem Laden zu
würfeln wäre unruhig — man tippt auf etwas, geht zurück, und es ist weg;
einmal täglich wäre zu träge. */
function pickFeatured(items) {
// Ein Startwert, der sich alle sechs Stunden ändert. Derselbe für alle
// Aufrufe im selben Fenster, damit die Auswahl beim Zurückblättern steht.
let seed = Math.floor(Date.now() / (6 * 3600 * 1000)) * 2654435761 % 2147483647;
const rnd = () => (seed = (seed * 16807) % 2147483647) / 2147483647;
const seen = new Set();
return items
.filter((it) => !seen.has(it.Id) && seen.add(it.Id))
// Wer ein Hintergrundbild hat, zieht aus [0,1) — wer keines hat, nur aus
// [0,0.2). Solange es genug mit Bild gibt, kommt er nicht nach vorn; gibt
// es wenige, hat er seine Chance.
.map((it) => ({ it, key: rnd() * (hasImg(it, 'Backdrop') ? 1 : 0.2) }))
.sort((a, b) => b.key - a.key)
.slice(0, 5)
.map((x) => x.it);
}
/* Der Aufmacher wechselt von selbst, wie in der App — übergeblendet, nicht
durchgeblättert, damit keine Naht wandert. */
function buildHero(items) {