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:
co-authored by
Claude Opus 5
parent
682049b45a
commit
9c66727aca
@@ -143,6 +143,10 @@ public struct JellyfinBackend: MediaBackend {
|
|||||||
switch library.kind {
|
switch library.kind {
|
||||||
case .movie: items.append(URLQueryItem(name: "IncludeItemTypes", value: "Movie"))
|
case .movie: items.append(URLQueryItem(name: "IncludeItemTypes", value: "Movie"))
|
||||||
case .show: items.append(URLQueryItem(name: "IncludeItemTypes", value: "Series"))
|
case .show: items.append(URLQueryItem(name: "IncludeItemTypes", value: "Series"))
|
||||||
|
// Gemischter Inhalt: Filme **und** Serien, aber eben nur die. Ohne
|
||||||
|
// diese Angabe liefert `Recursive` auch jede einzelne Folge, und das
|
||||||
|
// Raster füllt sich mit Folge 3 von Staffel 2 statt mit Titeln.
|
||||||
|
case .other: items.append(URLQueryItem(name: "IncludeItemTypes", value: "Movie,Series"))
|
||||||
default: break
|
default: break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,8 +30,22 @@ public struct MediaLibrary: Sendable, Equatable, Identifiable {
|
|||||||
///
|
///
|
||||||
/// Musik und Fotos sind bewusst außen vor: sie bräuchten eigene Ansichten
|
/// Musik und Fotos sind bewusst außen vor: sie bräuchten eigene Ansichten
|
||||||
/// und eigene Wiedergabe, und eine halbherzige Musikansicht ist schlechter
|
/// und eigene Wiedergabe, und eine halbherzige Musikansicht ist schlechter
|
||||||
/// als gar keine.
|
/// als gar keine. Live-TV hat einen eigenen Bildschirm und gehört nicht
|
||||||
public var isSupported: Bool { kind == .movie || kind == .show }
|
/// noch einmal in die Mediathekenliste.
|
||||||
|
///
|
||||||
|
/// **`other` zählt dazu.** Hier stand vorher `movie || show`, und alles
|
||||||
|
/// Übrige fiel wortlos 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, nirgends eine Meldung. Eine
|
||||||
|
/// unbekannte Art ist kein Grund, etwas zu verschweigen — sie ist nur
|
||||||
|
/// ein Grund, nichts über den Inhalt anzunehmen.
|
||||||
|
public var isSupported: Bool {
|
||||||
|
switch kind {
|
||||||
|
case .movie, .show, .other: true
|
||||||
|
case .music, .photo, .liveTV: false
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Eine Reihe auf der Startseite oder in den Suchergebnissen.
|
/// Eine Reihe auf der Startseite oder in den Suchergebnissen.
|
||||||
|
|||||||
@@ -66,6 +66,21 @@ def item(key, name, kind, overview, *, resume=None, series=None):
|
|||||||
"SeriesPrimaryImageTag": "p-" + series[0]})
|
"SeriesPrimaryImageTag": "p-" + series[0]})
|
||||||
return d
|
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):
|
def page(items):
|
||||||
return {"Items": items, "TotalRecordCount": len(items), "StartIndex": 0}
|
return {"Items": items, "TotalRecordCount": len(items), "StartIndex": 0}
|
||||||
|
|
||||||
@@ -123,6 +138,10 @@ class Handler(BaseHTTPRequestHandler):
|
|||||||
"CollectionType": "movies"},
|
"CollectionType": "movies"},
|
||||||
{"Id": "lib-shows", "Name": "Serien", "Type": "CollectionFolder",
|
{"Id": "lib-shows", "Name": "Serien", "Type": "CollectionFolder",
|
||||||
"CollectionType": "tvshows"},
|
"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":
|
if p == f"/Users/{USER_ID}/Items/Latest":
|
||||||
return self.reply([item(*t) for t in TITLES[:6]])
|
return self.reply([item(*t) for t in TITLES[:6]])
|
||||||
@@ -154,7 +173,22 @@ class Handler(BaseHTTPRequestHandler):
|
|||||||
parent = q.get("ParentId", [""])[0]
|
parent = q.get("ParentId", [""])[0]
|
||||||
kind = "Series" if parent == "lib-shows" else "Movie"
|
kind = "Series" if parent == "lib-shows" else "Movie"
|
||||||
chosen = [t for t in TITLES if t[2] == kind] or TITLES
|
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":
|
if p == "/__reports":
|
||||||
return self.reply(REPORTS)
|
return self.reply(REPORTS)
|
||||||
if p == "/Genres":
|
if p == "/Genres":
|
||||||
|
|||||||
Reference in New Issue
Block a user