revert(macos): drop PodTui.app / bundled-mpv Now Playing attribution
The pinned mpv binary breaks on brew ffmpeg major drift (libavcodec.62 vs .63 shipped a dead player); making it self-contained costs ~100MB for an app icon. Removing the whole machinery: build.ts app-bundle assembly, audio-player bundled-binary resolver + probe (spawns PATH mpv again), CI mpv install + bundle smoke checks, AppIcon.icns, README note. Cover-art staging (curl + --cover-art-files) is unrelated and stays.
This commit is contained in:
124
build.ts
124
build.ts
@@ -131,130 +131,6 @@ if (COMPILE) {
|
||||
}
|
||||
}
|
||||
|
||||
// macOS app bundle: PodTui.app. We run our audio backend (mpv) from
|
||||
// INSIDE the bundle (Contents/MacOS/mpv) so macOS attributes its Now
|
||||
// Playing session to PodTui — the source-app icon + name in Control
|
||||
// Center / lock screen — instead of a blank placeholder for an
|
||||
// unbundled binary. AudioPlayer's resolver prefers this sibling.
|
||||
if (platform === "darwin") {
|
||||
const appRoot = join(tarRoot, "PodTui.app");
|
||||
const macosDir = join(appRoot, "Contents", "MacOS");
|
||||
const resDir = join(appRoot, "Contents", "Resources");
|
||||
mkdirSync(macosDir, { recursive: true });
|
||||
mkdirSync(resDir, { recursive: true });
|
||||
|
||||
copyFileSync(outfile, join(macosDir, "podtui"));
|
||||
for (const lib of [`libopentui.${libExt}`, cavacoreLib]) {
|
||||
const s = join("dist", lib);
|
||||
if (existsSync(s)) copyFileSync(s, join(macosDir, lib));
|
||||
}
|
||||
|
||||
const mpvResolve = Bun.spawnSync(["which", "mpv"]);
|
||||
const mpvPath =
|
||||
mpvResolve.exitCode === 0 ? mpvResolve.stdout.toString().trim() : "";
|
||||
if (mpvPath) {
|
||||
copyFileSync(mpvPath, join(macosDir, "mpv"));
|
||||
} else {
|
||||
// A darwin release tarball without a bundled mpv silently ships
|
||||
// without Now Playing attribution (blank icon). Fail loudly so CI
|
||||
// can't produce it — the runner must have mpv installed.
|
||||
console.error(
|
||||
"Error: mpv not found in PATH — PodTui.app requires a bundled mpv for macOS Now Playing attribution (brew install mpv on the build machine)",
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const icnsSrc = join("assets", "App Icon", "AppIcon.icns");
|
||||
if (existsSync(icnsSrc)) {
|
||||
copyFileSync(icnsSrc, join(resDir, "AppIcon.icns"));
|
||||
} else {
|
||||
console.warn(
|
||||
"Warning: assets/App Icon/AppIcon.icns missing — app bundle has no icon",
|
||||
);
|
||||
}
|
||||
|
||||
// Version for the bundle comes from src/index.tsx (single source of
|
||||
// truth — release.yml requires bumping it in the tag commit).
|
||||
const srcIndex = await Bun.file(join("src", "index.tsx")).text();
|
||||
const versionMatch = srcIndex.match(/const VERSION = "([^"]+)"/);
|
||||
const bundleVersion = versionMatch?.[1];
|
||||
if (!bundleVersion) {
|
||||
console.error("Error: could not read VERSION from src/index.tsx");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
Bun.write(
|
||||
join(appRoot, "Contents", "Info.plist"),
|
||||
`<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleName</key>
|
||||
<string>PodTui</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>PodTui</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.mikefreno.podtui</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>podtui</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>AppIcon</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>${bundleVersion}</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>${bundleVersion}</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>12.0</string>
|
||||
</dict>
|
||||
</plist>
|
||||
`,
|
||||
);
|
||||
|
||||
// Ad-hoc sign so the bundle launches cleanly on fresh machines.
|
||||
// Identity overridable via PODTUI_CODESIGN_IDENTITY (e.g. a Developer
|
||||
// ID cert for release builds); default ad-hoc.
|
||||
const signIdentity = process.env.PODTUI_CODESIGN_IDENTITY || "-";
|
||||
const sign = Bun.spawnSync([
|
||||
"codesign",
|
||||
"--force",
|
||||
"--deep",
|
||||
"-s",
|
||||
signIdentity,
|
||||
appRoot,
|
||||
]);
|
||||
if (sign.exitCode !== 0) {
|
||||
console.warn(
|
||||
`Warning: codesign failed (${sign.stderr.toString().trim()}) — app bundle unsigned`,
|
||||
);
|
||||
}
|
||||
|
||||
// Sign the nested mpv LAST with our bundle identifier. mediaremoted
|
||||
// resolves the Now Playing client from the registering process's
|
||||
// code-signing identifier — without an explicit --identifier codesign
|
||||
// stamps "mpv" (its basename) and the audio center shows a blank
|
||||
// placeholder. Must run after the bundle sign above (a later bundle
|
||||
// re-seal would re-derive the basename identifier).
|
||||
const signMpv = Bun.spawnSync([
|
||||
"codesign",
|
||||
"--force",
|
||||
"-s",
|
||||
signIdentity,
|
||||
"--identifier",
|
||||
"com.mikefreno.podtui",
|
||||
join(macosDir, "mpv"),
|
||||
]);
|
||||
if (signMpv.exitCode !== 0) {
|
||||
console.warn(
|
||||
`Warning: nested mpv signing failed (${signMpv.stderr
|
||||
.toString()
|
||||
.trim()}) — Now Playing attribution won't work`,
|
||||
);
|
||||
}
|
||||
console.log(`App bundle: ${appRoot}`);
|
||||
}
|
||||
|
||||
const tar = Bun.spawnSync([
|
||||
"tar",
|
||||
"-czf",
|
||||
|
||||
Reference in New Issue
Block a user