Spider-Man ist nicht 720p, er ist breit
Die Auflösung wurde allein aus der Höhe gebildet. Ein Kinoformat von 2.39:1 liegt als 1920×800 vor — nach der Höhe gerechnet kam „720p" heraus, und das stand so in der Oberfläche. Jetzt zählt die grössere von Breite und Höhe; Hochformat kippt damit nicht, und 4K-Breitbild heisst nicht mehr 1440p. Die Detailansicht hat zwei Leserschaften, und bisher bekamen beide dasselbe. Wer schauen will, sieht jetzt Laufzeit, Auflösung und die Sprachen — jede einmal, statt „Englisch · Englisch · Englisch · Englisch · Deutsch". Wer die Mediathek betreut, sieht darunter Dateiformat, Grösse und den Ordner. Der Ordner verrät eine falsche Zuordnung in einer Sekunde: steht über der Beschreibung „Hanni & Nanni 3" und der Ordner heisst „Hanni und Nanni", ist die Sache klar. Er kommt nur für Administratoren überhaupt vom Server — versteckt im Client wäre er weiterhin auslesbar. Ein geplanter Titel war unsichtbar. Das ist die Hälfte, die nichts bringt: dass er kommt, ist der Sinn des Planens. Er steht jetzt mit „Verfügbar ab …" in der Mediathek, und die Datei geht trotzdem nicht heraus — Download wie Strom lehnen bis zum Termin ab, auch für Administratoren. Wer vorziehen will, hat „Jetzt veröffentlichen"; eine Hintertür für eine Rolle wäre eine Regel, die manchmal gilt. Was ein Auffrischen geändert hat, steht jetzt unter „Zu prüfen" — in einer eigenen Gruppe mit „Zur Kenntnis" statt „Veröffentlichen". Diese Titel sind sichtbar; es gibt nichts freizugeben, nur etwas abzuhaken. Und das Protokoll sagt endlich, wo es knallt. „InvalidOperationException: Nullable object must have a value." ohne eine einzige Zeile Herkunft ist für niemanden eine Diagnose — weder für den Betreiber noch für mich. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
f44779c899
commit
255eb7c2f0
@@ -112,9 +112,24 @@ public class FreigabeTests
|
||||
Assert.That(await Titel(gast), Is.EqualTo(new[] { "Geheimsache" }));
|
||||
}
|
||||
|
||||
/// <summary>Ein Zeitpunkt in der Zukunft hält ihn zurück — ohne Hintergrunddienst.</summary>
|
||||
/// <summary>Ein geplanter Titel ist sichtbar, aber noch nicht abspielbar.</summary>
|
||||
///
|
||||
/// <remarks>
|
||||
/// <para>
|
||||
/// <b>Zwei Zustände, nicht einer.</b> Ohne Zeitpunkt wartet ein Titel auf
|
||||
/// eine Entscheidung — den soll niemand sehen. Mit einem Zeitpunkt in der
|
||||
/// Zukunft ist die Entscheidung gefallen: er kommt, nur noch nicht. Ihn
|
||||
/// dann zu verstecken hiesse, die Vorfreude zu unterschlagen, die der Sinn
|
||||
/// des Planens ist.
|
||||
/// </para>
|
||||
/// <para>
|
||||
/// <b>Sichtbar heisst aber nicht abspielbar</b>, und das ist der Teil, der
|
||||
/// wirklich zählt: ohne den Riegel bei der Auslieferung wäre „Verfügbar ab
|
||||
/// …" eine Zierde, und die Datei ginge trotzdem heraus.
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
[Test]
|
||||
public async Task Ein_geplanter_Titel_erscheint_erst_zu_seiner_Zeit()
|
||||
public async Task Ein_geplanter_Titel_ist_sichtbar_aber_nicht_abspielbar()
|
||||
{
|
||||
Datei("Geheimsache (2024).mkv");
|
||||
|
||||
@@ -132,7 +147,28 @@ public class FreigabeTests
|
||||
// Auf morgen gelegt.
|
||||
await alsAdmin.PostAsJsonAsync("/api/v1/review/publish",
|
||||
new FreigabeRequest(null, DateTimeOffset.UtcNow.AddDays(1)));
|
||||
Assert.That(await Titel(gast), Is.Empty, "Ein geplanter Titel ist noch nicht sichtbar.");
|
||||
|
||||
Assert.That(await Titel(gast), Is.EqualTo(new[] { "Geheimsache" }),
|
||||
"Ein geplanter Titel steht in der Mediathek — dafür plant man ihn.");
|
||||
|
||||
// **Aber die Datei geht nicht heraus.** Das ist der Teil, der zählt.
|
||||
var filme = await gast.GetFromJsonAsync<Page<MovieResponse>>("/api/v1/movies");
|
||||
var datei = filme!.Items.Single().Files.Single();
|
||||
|
||||
var geladen = await gast.GetAsync($"/api/v1/files/{datei.Id}/download");
|
||||
var gestroemt = await gast.PostAsJsonAsync($"/api/v1/files/{datei.Id}/stream",
|
||||
new StreamRequest(["mp4"], ["h264"], ["aac"]));
|
||||
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(geladen.StatusCode, Is.EqualTo(HttpStatusCode.Forbidden));
|
||||
Assert.That(gestroemt.StatusCode, Is.EqualTo(HttpStatusCode.Forbidden));
|
||||
});
|
||||
|
||||
// **Auch für Administratoren.** Eine Hintertür für eine Rolle wäre
|
||||
// eine Regel, die manchmal gilt; wer vorziehen will, hat den Knopf.
|
||||
var alsAdminGeladen = await alsAdmin.GetAsync($"/api/v1/files/{datei.Id}/download");
|
||||
Assert.That(alsAdminGeladen.StatusCode, Is.EqualTo(HttpStatusCode.Forbidden));
|
||||
|
||||
// Und er steht weiterhin in der Prüfliste — mit seinem Termin.
|
||||
var wartend = await alsAdmin.GetFromJsonAsync<List<Pruefeintrag>>("/api/v1/review");
|
||||
@@ -143,6 +179,10 @@ public class FreigabeTests
|
||||
await alsAdmin.PostAsJsonAsync("/api/v1/review/publish",
|
||||
new FreigabeRequest(null, DateTimeOffset.UtcNow.AddDays(-1)));
|
||||
Assert.That(await Titel(gast), Is.EqualTo(new[] { "Geheimsache" }));
|
||||
|
||||
var jetztGeladen = await gast.GetAsync($"/api/v1/files/{datei.Id}/download");
|
||||
Assert.That(jetztGeladen.StatusCode, Is.Not.EqualTo(HttpStatusCode.Forbidden),
|
||||
"ab dem Termin geht die Datei heraus");
|
||||
}
|
||||
|
||||
/// <summary>Ohne Prüfung erscheint alles sofort — das ist die Vorgabe.</summary>
|
||||
|
||||
Reference in New Issue
Block a user