build: bundle playback and YouTube dependencies

Build pinned LGPL playback libraries and package standalone YouTube helpers inside the signed native app. Keep the CLI inside the app and relocate private library links for installation without runtime Homebrew dependencies.

Record adaptive fixture completion in its EXIT trap: cancellation can exit with status 143 before the TERM trap writes its marker, while native pause and quality preservation remain correct.
This commit is contained in:
2026-10-12 01:17:22 +02:00
parent 8eba97579f
commit 31c4759c1d
13 changed files with 911 additions and 113 deletions
+19 -8
View File
@@ -17,18 +17,29 @@ struct FFmpegRuntimeChecks {
let required = try String(contentsOf: realApp.appendingPathComponent("Contents/Resources/ffmpeg-libraries.txt"), encoding: .utf8)
.split(separator: "\n").map(String.init)
let frameworks = app.appendingPathComponent("Contents/Frameworks", isDirectory: true)
try FileManager.default.createDirectory(at: frameworks, withIntermediateDirectories: true)
require(FFmpegRuntime.error(for: app) != nil, "missing dependency metadata blocks startup")
var unavailable = required
let family = URL(fileURLWithPath: required[0]).lastPathComponent.split(separator: ".")[0]
unavailable[0] = directory.appendingPathComponent("\(family).999999.dylib").path
try (unavailable.joined(separator: "\n") + "\n").write(to: manifest, atomically: true, encoding: .utf8)
require(FFmpegRuntime.error(for: app) != nil, "an unavailable ABI library blocks startup")
try Data("not a dynamic library".utf8).write(to: URL(fileURLWithPath: unavailable[0]))
require(FFmpegRuntime.error(for: app) != nil, "an existing but unloadable library also blocks startup")
for invalid in [
"/" + required[0], "../" + required[0], "subdirectory/" + required[0],
"libavformat.dylib", "libavformat..dylib", "libavformat.one.dylib",
"libavformat.1.dylib\r", "libavformat.1.dylib\0"
] {
var entries = required
entries[0] = invalid
try (entries.joined(separator: "\n") + "\n").write(to: manifest, atomically: true, encoding: .utf8)
require(FFmpegRuntime.error(for: app) != nil, "unsafe or unversioned metadata blocks startup")
}
try Array(repeating: required[0], count: 5).joined(separator: "\n").write(to: manifest, atomically: true, encoding: .utf8)
require(FFmpegRuntime.error(for: app) != nil, "duplicated entries cannot omit required library families")
try (required.joined(separator: "\n") + "\n").write(to: manifest, atomically: true, encoding: .utf8)
require(FFmpegRuntime.error(for: app) == nil, "all recorded native libraries load successfully")
require(FFmpegRuntime.error(for: app) != nil, "missing bundled libraries block startup")
let brokenLibrary = frameworks.appendingPathComponent(required[0])
try Data("not a dynamic library".utf8).write(to: brokenLibrary)
require(FFmpegRuntime.error(for: app) != nil, "an existing but unloadable bundled library blocks startup")
try FileManager.default.removeItem(at: frameworks)
try FileManager.default.copyItem(at: realApp.appendingPathComponent("Contents/Frameworks"), to: frameworks)
require(FFmpegRuntime.error(for: app) == nil, "isolated relocated copies of bundled native libraries load successfully")
print("FFmpeg runtime checks passed")
}
}