Der Abzug vom Server zeigt beides schwarz auf weiß. Erstens: /media/grabbers/devices/1/channels antwortet mit 278 Sendern — unter dem Sammelnamen `DeviceChannel`. Die Hülle kannte nur `Channel` und hat die vollständige Liste als leer verworfen. Zweitens: das Programmraster antwortet, aber nicht auf `type=1`. Die 1 steht bei Plex für Film, und im Programm laufen auch Folgen, Sport und Nachrichten — der Filter hat das Raster geleert. Ohne ihn kommen die Sendungen samt Sendername, Nummer, Logo und Kennung. Das Raster hat jetzt Vorrang vor der Tunerliste, auch wenn beide antworten: nur dort gehören Sender und Programm zusammen, es enthält ohnehin nur die eingeschalteten Sender, und die Tunerliste führt alle 278. Einschalten läuft über die Adresse der laufenden Sendung beim Programmanbieter — Plex behandelt eine laufende Sendung wie einen Film. Die Adresse wird einmal entpackt, bevor sie in die Anfrage geht: sonst kodiert URLComponents ein zweites Mal, und aus %3A wird %253A. Die Tests stehen jetzt auf den echten Antworten aus dem Abzug, nicht auf erfundenen: DeviceChannel mit `name` und `key`, Rastereinträge mit channelVcn, channelID und einer Folge neben einem Film. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Antwort-Vorlagen
Diese Dateien bilden das Antwortformat von Plex nach. Sie sind von Hand geschrieben, nicht von einem laufenden Server mitgeschnitten — es stand bei der Entstehung keiner zur Verfügung.
Sie decken das Format ab, nicht die Wirklichkeit eines gewachsenen Bestands. Sobald ein Server erreichbar ist, gehören sie durch echte Mitschnitte ersetzt:
curl -H "Accept: application/json" \
"http://<server>:32400/library/sections/1/all?X-Plex-Token=<token>" \
> movies-section.json
Erfahrungsgemäß tauchen dabei Fälle auf, die man sich nicht ausdenkt — fehlende
Media-Blöcke bei noch nicht analysierten Dateien, Titel ohne year, Folgen
ohne grandparentThumb. Genau dafür sind die Vorlagen da.