feat: enqueue streams in running player

This commit is contained in:
2026-10-22 16:03:56 +02:00
parent ac8e284d80
commit 6a4afc9f0e
17 changed files with 416 additions and 61 deletions
+32
View File
@@ -335,6 +335,38 @@ int main(int argc, char **argv) {
expect(firstRows[0], @"progress", firstURL, 12, true);
expect(firstRows[2], @"progress", firstURL, 24, true);
expect(secondRows[0], @"ended", secondURL, 100, true);
const auto liveSingle = root + "/live-single.jsonl", liveNext = root + "/live-next.jsonl";
const auto rollbackPath = root + "/rollback.jsonl";
{
playback::ProgressReports reports(liveSingle);
reports.begin(firstURL);
reports.observe(sample(PLAYER_PAUSED, 7));
const char *identities[] = {secondURL.c_str()}, *destinations[] = {liveNext.c_str()};
reports.registerFiles(identities, destinations, 1);
reports.observe(sample(PLAYER_PAUSED, 8));
const char *conflictingIDs[] = {"miruro:new:1", secondURL.c_str()};
const auto unused = root + "/unused.jsonl";
const char *conflictingPaths[] = {rollbackPath.c_str(), unused.c_str()};
bool refused = false;
try { reports.registerFiles(conflictingIDs, conflictingPaths, 2); } catch (...) { refused = true; }
require(refused, "conflicting later entry rejects the complete registration batch");
reports.registerFile("miruro:new:1", rollbackPath);
reports.begin(secondURL);
reports.observe(sample(PLAYER_PAUSED, 3));
reports.begin(firstURL);
reports.observe(sample(PLAYER_PAUSED, 9));
reports.begin("miruro:unregistered:1");
reports.observe(sample(PLAYER_PAUSED, 55));
refused = false;
try { reports.registerFile(firstURL, unused); } catch (...) { refused = true; }
require(refused, "enqueue cannot rebind the original single identity after its queue row is removed");
reports.finish();
require(reports.error().empty(), "enqueue preserves single reporting and supports owned report revisits");
}
auto singleRows = records(liveSingle), nextRows = records(liveNext);
require(singleRows.count >= 4 && nextRows.count == 2, "active single report survives registration and queued report stays isolated");
for (NSDictionary *row in singleRows) require([row[@"media_url"] isEqual:nativePath(firstURL)], "queued identity never leaks into original single report");
for (NSDictionary *row in nextRows) require([row[@"media_url"] isEqual:nativePath(secondURL)], "queued report has only its registered identity");
const auto replacedPath = root + "/replaced.jsonl";
{
ProgressReporter reporter(replacedPath, [] { return 100.; });