Mediatheken ohne bekannte Art verschwanden wortlos

`isSupported` war `movie || show`. Alles Übrige fiel heraus — auch eine
Mediathek mit gemischtem Inhalt, die Jellyfin ohne `CollectionType`
meldet. Wer Filme und Serien nicht getrennt hat, sah sie nirgends:
nicht in der Seitenleiste, nicht auf der Startseite, und nirgends eine
Meldung. Eine unbekannte Art ist kein Grund, etwas zu verschweigen.

Musik, Fotos und Live-TV bleiben draußen, und das aus jeweils eigenem
Grund — jetzt aufgezählt statt stillschweigend.

Die Attrappe blättert außerdem richtig: vorher kam immer alles auf
einmal und `TotalRecordCount` war die Länge der Antwort, womit eine App,
die richtig blättert, genauso aussah wie eine, die es gar nicht
versucht. Damit ist belegt, dass die Mediathek alle 252 Titel holt —
in fünf Seiten, bis StartIndex 240.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-20 11:10:38 +02:00
co-authored by Claude Opus 5
parent 682049b45a
commit 9c66727aca
3 changed files with 55 additions and 3 deletions
+35 -1
View File
@@ -66,6 +66,21 @@ def item(key, name, kind, overview, *, resume=None, series=None):
"SeriesPrimaryImageTag": "p-" + series[0]})
return d
# Wie viele erfundene Titel die Mediathek zusätzlich führt.
#
# Zum Prüfen des Nachladens: mit einer Handvoll Titeln passt alles auf eine
# Seite, und ob überhaupt eine zweite angefordert wird, sieht man nie.
FUELLUNG = int(os.environ.get("FLIXY_STUB_LIBRARY", "0"))
def fuellmaterial(kind):
return [
item(f"fill-{kind}-{n}", f"Titel {n:03d}", kind, "Erfunden, zum Blättern.")
for n in range(1, FUELLUNG + 1)
]
# Was an Seiten angefragt wurde — die eigentliche Messung.
PAGE_LOG = []
def page(items):
return {"Items": items, "TotalRecordCount": len(items), "StartIndex": 0}
@@ -123,6 +138,10 @@ class Handler(BaseHTTPRequestHandler):
"CollectionType": "movies"},
{"Id": "lib-shows", "Name": "Serien", "Type": "CollectionFolder",
"CollectionType": "tvshows"},
# Ohne `CollectionType` — so meldet Jellyfin eine Mediathek
# mit gemischtem Inhalt. Genau die ist vorher wortlos
# herausgefallen.
{"Id": "lib-mixed", "Name": "Gemischtes", "Type": "CollectionFolder"},
]))
if p == f"/Users/{USER_ID}/Items/Latest":
return self.reply([item(*t) for t in TITLES[:6]])
@@ -154,7 +173,22 @@ class Handler(BaseHTTPRequestHandler):
parent = q.get("ParentId", [""])[0]
kind = "Series" if parent == "lib-shows" else "Movie"
chosen = [t for t in TITLES if t[2] == kind] or TITLES
return self.reply(page([item(*t) for t in chosen]))
gesamt = [item(*t) for t in chosen] + fuellmaterial(kind)
# **Blättern wie der echte Server.** Vorher kam immer alles auf
# einmal und `TotalRecordCount` war die Länge der Antwort — damit
# sah eine App, die richtig blättert, genauso aus wie eine, die
# es gar nicht versucht. Jetzt steht in der Antwort, wie viele es
# insgesamt gibt, und geliefert wird nur der verlangte Ausschnitt.
start = int(q.get("StartIndex", ["0"])[0])
grenze = int(q.get("Limit", [str(len(gesamt))])[0])
ausschnitt = gesamt[start:start + grenze]
PAGE_LOG.append({"start": start, "limit": grenze,
"geliefert": len(ausschnitt), "gesamt": len(gesamt)})
return self.reply({"Items": ausschnitt,
"TotalRecordCount": len(gesamt),
"StartIndex": start})
if p == "/__pages":
return self.reply(PAGE_LOG)
if p == "/__reports":
return self.reply(REPORTS)
if p == "/Genres":