feat: enqueue streams in running player
This commit is contained in:
@@ -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") }
|
||||
|
||||
Reference in New Issue
Block a user