feat: show skip offer countdown and transitions

This commit is contained in:
2026-10-22 14:09:53 +02:00
parent 70672321a1
commit 53369424e6
13 changed files with 453 additions and 40 deletions
+63
View File
@@ -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"],