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
+22
View File
@@ -154,6 +154,19 @@ struct PlayerCommandChecks {
fatalError("FAIL: expected stream queue launch")
}
require(deliveredQueue == queueFile && queueIndependent && queueBypass, "queue CLI preserves independent delivery")
guard case .enqueue(let appendedQueue, let enqueueBypass) =
try PlayerCommand.parse(["--enqueue", "--no-config", "--queue-file", queueFile.path]) else {
fatalError("FAIL: expected running-player queue delivery")
}
require(appendedQueue == queueFile && enqueueBypass, "enqueue forwards its manifest without requiring a new instance")
let escapedFile = privateDirectory.appendingPathComponent("queue & #?.json")
require(try StreamQueue.enqueueFile(from: StreamQueue.enqueueURL(for: escapedFile)) == escapedFile,
"native URL delivery round trips absolute paths and URL metacharacters")
for text in ["terebi-enqueue://queue?file=relative.json", "terebi-enqueue://other?file=/tmp/a",
"terebi-enqueue://queue?file=/tmp/a&file=/tmp/b", "terebi-enqueue://queue?file=/tmp/a#extra"] {
do { _ = try StreamQueue.enqueueFile(from: URL(string: text)!); fatalError("FAIL: invalid enqueue URL accepted") }
catch {}
}
let parsedQueue = try StreamQueue.load(from: queueFile)
require(parsedQueue.entries.map(\.url) == [miruro, canonical], "stream queue order is supplied, never filename-sorted")
require(parsedQueue.entries[0].identity.hasPrefix("miruro:") &&
@@ -180,6 +193,10 @@ struct PlayerCommandChecks {
_ = try PlayerCommand.parse(["--new-instance", "--queue-file", queueFile.path])
fatalError("FAIL: malformed queue must never launch or degrade to single playback")
} catch {}
do {
_ = try PlayerCommand.parse(["--enqueue", "--queue-file", queueFile.path])
fatalError("FAIL: malformed enqueue must never launch or partially deliver")
} catch {}
}
try saveQueue(["version": 1, "items": entries])
for arguments in [
@@ -187,6 +204,11 @@ struct PlayerCommandChecks {
["--new-instance", "--queue-file", "queue.json"],
["--new-instance", "--queue-file", queueFile.path, "--url", canonical.absoluteString],
["--new-instance", "--queue-file", queueFile.path, "--progress-file", report.path],
["--enqueue"], ["--enqueue", "--url", canonical.absoluteString],
["--enqueue", "--new-instance", "--queue-file", queueFile.path],
["--enqueue", "--enqueue", "--queue-file", queueFile.path],
["--enqueue", "--queue-file", queueFile.path, "--progress-file", report.path],
["--enqueue", "--queue-file", "relative.json"],
["--new-instance", "--queue-file", queueFile.path, "--queue-file", queueFile.path]
] {
do { _ = try PlayerCommand.parse(arguments); fatalError("FAIL: invalid queue option combination") }