diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index 11391ec..35e4310 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -104,7 +104,7 @@ jobs: python scripts/build.py --platform macos $REFRESH_ARG - name: Package dmg - run: hdiutil create -volname "StreamCap" -srcfolder "dist/StreamCap.app" -ov -format UDZO "dist/StreamCap-macos.dmg" + run: bash scripts/create_macos_dmg.sh "dist/StreamCap.app" "dist/StreamCap-macos.dmg" - name: Upload artifact uses: actions/upload-artifact@v4 diff --git a/scripts/create_macos_dmg.sh b/scripts/create_macos_dmg.sh new file mode 100644 index 0000000..79683c3 --- /dev/null +++ b/scripts/create_macos_dmg.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env bash +set -euo pipefail + +APP_PATH="${1:-dist/StreamCap.app}" +DMG_PATH="${2:-dist/StreamCap-macos.dmg}" +VOLUME_NAME="${3:-StreamCap}" +BACKGROUND_IMAGE="${4:-assets/images/dmg.jpg}" + +if [ ! -d "$APP_PATH" ]; then + echo "App bundle not found: $APP_PATH" >&2 + exit 1 +fi + +if [ ! -f "$BACKGROUND_IMAGE" ]; then + echo "DMG background image not found: $BACKGROUND_IMAGE" >&2 + exit 1 +fi + +WORK_DIR="$(mktemp -d)" +MOUNT_DIR="$WORK_DIR/mount" +RW_DMG="$WORK_DIR/$VOLUME_NAME-rw.dmg" +DEVICE="" + +cleanup() { + if [ -n "$DEVICE" ]; then + hdiutil detach "$DEVICE" -quiet || true + fi + rm -rf "$WORK_DIR" +} +trap cleanup EXIT + +mkdir -p "$MOUNT_DIR" + +APP_SIZE_MB="$(du -sm "$APP_PATH" | awk '{print $1}')" +DMG_SIZE_MB="$((APP_SIZE_MB + 200))" + +hdiutil create "$RW_DMG" \ + -volname "$VOLUME_NAME" \ + -size "${DMG_SIZE_MB}m" \ + -fs HFS+ \ + -format UDRW \ + -quiet + +DEVICE="$(hdiutil attach "$RW_DMG" -readwrite -noverify -noautoopen -mountpoint "$MOUNT_DIR" | awk '/Apple_HFS/ {print $1; exit}')" + +cp -R "$APP_PATH" "$MOUNT_DIR/" +ln -s /Applications "$MOUNT_DIR/Applications" +mkdir -p "$MOUNT_DIR/.background" +cp "$BACKGROUND_IMAGE" "$MOUNT_DIR/.background/background.jpg" + +osascript <