feat: show skip offer countdown and transitions
This commit is contained in:
@@ -134,6 +134,69 @@ struct PlayerCommandChecks {
|
||||
fatalError("FAIL: FIFO source accepted")
|
||||
} catch {}
|
||||
|
||||
let queueFile = directory.appendingPathComponent("queue.json")
|
||||
let resolvedDirectory = realpath(directory.path, nil)!
|
||||
defer { free(resolvedDirectory) }
|
||||
let privateDirectory = URL(fileURLWithPath: String(cString: resolvedDirectory), isDirectory: true)
|
||||
require(chmod(privateDirectory.path, 0o700) == 0, "queue reports require a private owned parent")
|
||||
let youtubeReport = privateDirectory.appendingPathComponent("youtube.jsonl").path
|
||||
let miruroReport = privateDirectory.appendingPathComponent("miruro.jsonl").path
|
||||
let entries: [[String: Any]] = [
|
||||
["url": miruro.absoluteString, "progress_file": miruroReport],
|
||||
["url": canonical.absoluteString, "progress_file": youtubeReport]
|
||||
]
|
||||
func saveQueue(_ value: [String: Any]) throws {
|
||||
try JSONSerialization.data(withJSONObject: value).write(to: queueFile)
|
||||
}
|
||||
try saveQueue(["version": 1, "items": entries])
|
||||
guard case .launchQueue(let deliveredQueue, let queueIndependent, let queueBypass) =
|
||||
try PlayerCommand.parse(["--new-instance", "--no-config", "--queue-file", queueFile.path]) else {
|
||||
fatalError("FAIL: expected stream queue launch")
|
||||
}
|
||||
require(deliveredQueue == queueFile && queueIndependent && queueBypass, "queue CLI preserves independent delivery")
|
||||
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:") &&
|
||||
parsedQueue.entries[1].identity == canonical.absoluteString, "stable identities exclude slugs and transport URLs")
|
||||
let duplicateYouTube = ["url": "https://youtu.be/jNQXAC9IVRw", "progress_file": miruroReport]
|
||||
let duplicateMiruro = ["url": miruro.absoluteString.replacingOccurrences(of: "the-apothecary-diaries-season-3", with: "different-slug"),
|
||||
"progress_file": youtubeReport]
|
||||
let invalidQueues: [[String: Any]] = [
|
||||
["version": 2, "items": entries], ["version": true, "items": entries],
|
||||
["version": 1, "items": []], ["version": 1],
|
||||
["version": 1, "items": Array(repeating: entries[0], count: 4097)],
|
||||
["version": 1, "items": [entries[1], duplicateYouTube]],
|
||||
["version": 1, "items": [entries[0], duplicateMiruro]],
|
||||
["version": 1, "items": [entries[0], ["url": canonical.absoluteString, "progress_file": miruroReport]]],
|
||||
["version": 1, "items": [entries[0], ["url": canonical.absoluteString,
|
||||
"progress_file": privateDirectory.resolvingSymlinksInPath().appendingPathComponent("miruro.jsonl").path]]],
|
||||
["version": 1, "items": [["url": "https://cdn.example/expired.m3u8", "progress_file": youtubeReport]]],
|
||||
["version": 1, "items": [["url": canonical.absoluteString, "progress_file": "relative.jsonl"]]],
|
||||
["version": 1, "items": [["url": canonical.absoluteString, "progress_file": movie.path]]]
|
||||
]
|
||||
for document in invalidQueues {
|
||||
try saveQueue(document)
|
||||
do {
|
||||
_ = try PlayerCommand.parse(["--new-instance", "--queue-file", queueFile.path])
|
||||
fatalError("FAIL: malformed queue must never launch or degrade to single playback")
|
||||
} catch {}
|
||||
}
|
||||
try saveQueue(["version": 1, "items": entries])
|
||||
for arguments in [
|
||||
["--queue-file", queueFile.path], ["--new-instance", "--queue-file"],
|
||||
["--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],
|
||||
["--new-instance", "--queue-file", queueFile.path, "--queue-file", queueFile.path]
|
||||
] {
|
||||
do { _ = try PlayerCommand.parse(arguments); fatalError("FAIL: invalid queue option combination") }
|
||||
catch {}
|
||||
}
|
||||
require(chmod(privateDirectory.path, 0o755) == 0, "make report parent nonprivate for rejection check")
|
||||
do { _ = try StreamQueue.load(from: queueFile); fatalError("FAIL: public report directory accepted") }
|
||||
catch {}
|
||||
require(chmod(privateDirectory.path, 0o700) == 0, "restore private check directory")
|
||||
|
||||
for arguments in [["--url"], ["--url", canonical.absoluteString, movie.path], ["--"],
|
||||
[movie.path, movie.path], ["--unknown"], ["missing.mp4"], [directory.path],
|
||||
["file://remote-host/video.mp4"], ["https://example.com/video.mp4"],
|
||||
|
||||
Reference in New Issue
Block a user