Die Mediathek hörte bei I auf, und jede Folge stand doppelt
Zwei Befunde aus dem laufenden Betrieb. Die Liste holte genau eine Seite. Der Server gibt höchstens 200 Einträge je Zug — das ist richtig so —, nur fragte die Oberfläche nie nach der zweiten. Bei 455 Filmen endete die Mediathek mitten im Alphabet, ohne Hinweis, dass da noch etwas kommt. Jetzt wird beim Scrollen nachgeladen, und die Zahl sagt „200 von 455" statt einer Behauptung, die man beim Scrollen widerlegt. Dabei kam heraus, dass ein IntersectionObserver eine Seite braucht, die auch gezeichnet wird: im Fenster im Hintergrund löst er nicht aus, und beim Prüfen blieb die Liste genau deshalb bei 200 stehen. Daneben steht jetzt eine Prüfung am Scrollereignis, die überall greift. Der zweite Befund: jede Folge zeigte zwei gleich aussehende Knopfreihen. Es sind zwei Dateien — Plex' „Optimized for Mobile"-Kopien. Flaro kannte „optimized", aber nicht „Optimized for Mobile", und sah ohnehin nur den unmittelbaren Elternordner; Plex legt die Fassung aber als `Plex Versions/Optimized for Mobile/<Serie>/<Staffel>/…` ab. Jetzt wird drei Ebenen hoch gesucht, die Schublade `Plex Versions` benennt keine Serie mehr, und an der Folge steht „Mobil" statt einer zweiten, unerklärten Reihe. Nicht um Plex zu bedienen — die Dateien liegen nun einmal so auf der Platte. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
960cca3dae
commit
8809b9f46f
@@ -140,12 +140,32 @@ public static partial class FileNames
|
||||
if (hinten.Length > 0 && IstFassungsname(hinten)) return Vereinheitlichen(hinten);
|
||||
}
|
||||
|
||||
var ordner = Path.GetFileName(Path.GetDirectoryName(pfad) ?? "");
|
||||
if (ordner.Length > 0 && IstFassungsname(ordner)) return Vereinheitlichen(Saeubern(ordner));
|
||||
// **Drei Ebenen hoch, nicht nur eine.** Plex legt seine zweite Fassung
|
||||
// als `Plex Versions/Optimized for Mobile/<Serie>/<Staffel>/…` ab —
|
||||
// der Ordner, der die Fassung benennt, steht dort also weit über der
|
||||
// Datei. Drei Ebenen decken das ab, ohne irgendwann die Mediathek
|
||||
// selbst für eine Fassung zu halten.
|
||||
var ordner = Path.GetDirectoryName(pfad);
|
||||
for (var ebene = 0; ebene < 3 && !string.IsNullOrEmpty(ordner); ebene++)
|
||||
{
|
||||
var name = Path.GetFileName(ordner);
|
||||
if (name.Length > 0 && IstFassungsname(name)) return Vereinheitlichen(Saeubern(name));
|
||||
ordner = Path.GetDirectoryName(ordner);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>Ordner, die nur Fassungen einsammeln und keine Serie benennen.</summary>
|
||||
///
|
||||
/// <remarks>
|
||||
/// <c>Plex Versions</c> ist kein Titel, sondern eine Schublade. Ohne diese
|
||||
/// Prüfung hiesse die Serie so, und darunter läge der halbe Bestand ein
|
||||
/// zweites Mal.
|
||||
/// </remarks>
|
||||
private static bool IstFassungsordner(string name) =>
|
||||
IstFassungsname(name) || Schlank(name).Equals("plexversions", StringComparison.OrdinalIgnoreCase);
|
||||
|
||||
/// <summary>Macht aus einer gemessenen Höhe einen Namen: 2160 wird „4K".</summary>
|
||||
///
|
||||
/// <remarks>
|
||||
@@ -194,6 +214,13 @@ public static partial class FileNames
|
||||
{
|
||||
["mobil"] = "Mobil", ["mobile"] = "Mobil",
|
||||
["optimiert"] = "Mobil", ["optimized"] = "Mobil",
|
||||
// Wie Plex seine zweite Fassung nennt. Nicht um Plex zu bedienen,
|
||||
// sondern weil die Dateien nun einmal so auf der Platte liegen:
|
||||
// ohne diese Zeilen steht jede Folge zweimal untereinander, mit
|
||||
// zwei gleich aussehenden Knopfreihen und ohne Hinweis, warum.
|
||||
["optimizedformobile"] = "Mobil",
|
||||
["optimiertfürmobilgeräte"] = "Mobil",
|
||||
["optimiertfuermobilgeraete"] = "Mobil",
|
||||
["directorscut"] = "Director's Cut", ["directorcut"] = "Director's Cut",
|
||||
["extended"] = "Extended", ["extendedcut"] = "Extended",
|
||||
["theatrical"] = "Kinofassung", ["kinofassung"] = "Kinofassung",
|
||||
@@ -355,8 +382,17 @@ public static partial class FileNames
|
||||
// sie benennt — dann bleibt nur der Dateiname.
|
||||
if (unterhalb is null || !unterhalb.Contains('/')) return null;
|
||||
|
||||
var erster = unterhalb[..unterhalb.IndexOf('/')];
|
||||
return Saubermachen(erster);
|
||||
// **Schubladen überspringen.** Unter `Plex Versions/Optimized for
|
||||
// Mobile/` steht die Serie erst darunter; wer den ersten Ordner
|
||||
// nimmt, legt eine Serie namens „Plex Versions" an.
|
||||
var teile = unterhalb.Split('/');
|
||||
foreach (var teil in teile[..^1])
|
||||
{
|
||||
if (IstFassungsordner(teil) || IstStaffelordner(teil)) continue;
|
||||
return Saubermachen(teil);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
var ordner = Path.GetDirectoryName(pfad);
|
||||
|
||||
Reference in New Issue
Block a user