radiance 0.7.1

Video art software designed for live performance
Documentation
name: Build Release

on:
  push:
    tags:
      - '*'
  workflow_dispatch:

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        target: [x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu, x86_64-pc-windows-gnu, x86_64-apple-darwin, aarch64-apple-darwin]
        include:
          - target: x86_64-unknown-linux-gnu
            os: ubuntu-latest
            output_name: radiance
            artifact_name: radiance-linux-x86_64
          - target: aarch64-unknown-linux-gnu
            os: ubuntu-latest
            output_name: radiance
            artifact_name: radiance-linux-aarch64
          - target: x86_64-pc-windows-gnu
            os: ubuntu-latest
            output_name: radiance.exe
            artifact_name: radiance-windows-x86_64
          - target: x86_64-apple-darwin
            os: macos-latest
            output_name: radiance
            artifact_name: radiance-macos-x86_64
          - target: aarch64-apple-darwin
            os: macos-latest
            output_name: radiance
            artifact_name: radiance-macos-aarch64
      fail-fast: false

    steps:
      - name: Checkout radiance repository
        uses: actions/checkout@v4
        with:
          path: radiance

      - name: Checkout libmpv-static-build repository
        uses: actions/checkout@v4
        with:
          repository: ervanalb/libmpv-static-build
          path: libmpv-static-build

      - name: Get libmpv-static-build commit hash
        id: libmpv-hash
        run: |
          cd libmpv-static-build
          echo "hash=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT

      - name: Install build tools (Linux)
        if: runner.os == 'Linux'
        run: |
          sudo apt-get update
          sudo apt-get install -y \
            pkg-config \
            clang
          case "${{ matrix.target }}" in
            x86_64-unknown-linux-gnu)
              ;;
            aarch64-unknown-linux-gnu)
              sudo apt-get install -y \
                gcc-aarch64-linux-gnu \
                g++-aarch64-linux-gnu \
                libc6-dev-arm64-cross \
                libc6-arm64-cross
              ;;
            x86_64-pc-windows-gnu)
              sudo apt-get install -y \
                mingw-w64 \
                mingw-w64-tools
              ;;
          esac

      - name: Install build tools (macOS)
        if: runner.os == 'macOS'
        run: |
          brew install \
            pkg-config \
            autoconf \
            automake \
            libtool \
            yasm \
            nasm \
            cmake \
            meson \
            ninja
          pip3 install --break-system-packages jinja2 mako

      - name: Restore libmpv static build cache
        id: cache-libmpv
        uses: actions/cache/restore@v4
        with:
          path: libmpv-static-build/${{ matrix.target }}/output
          key: libmpv-static-${{ runner.os }}-${{ matrix.target }}-${{ steps.libmpv-hash.outputs.hash }}

      - name: Install libmpv build dependencies
        if: runner.os == 'Linux' && steps.cache-libmpv.outputs.cache-hit != 'true'
        run: |
          sudo apt-get install -y \
            build-essential \
            autoconf \
            automake \
            libtool \
            yasm \
            nasm \
            git \
            python3 \
            python3-pip \
            cmake \
            meson \
            python3-mako \
            bison \
            flex \
            ninja-build
          if [ "${{ matrix.target }}" = "x86_64-pc-windows-gnu" ]; then
            sudo update-alternatives --set x86_64-w64-mingw32-gcc /usr/bin/x86_64-w64-mingw32-gcc-posix
            sudo update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix
          fi

      - name: Build libmpv static libraries
        if: steps.cache-libmpv.outputs.cache-hit != 'true'
        run: |
          cd libmpv-static-build
          ./scripts/prepare_sysroot.sh download
          ./scripts/all.sh download
          TARGET=${{ matrix.target }} ./scripts/prepare_sysroot.sh build
          TARGET=${{ matrix.target }} ./scripts/all.sh build

      - name: Save libmpv static build cache
        if: steps.cache-libmpv.outputs.cache-hit != 'true'
        uses: actions/cache/save@v4
        with:
          path: libmpv-static-build/${{ matrix.target }}/output
          key: libmpv-static-${{ runner.os }}-${{ matrix.target }}-${{ steps.libmpv-hash.outputs.hash }}

      - name: Install rust toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target }}

      - name: Build radiance
        run: |
          cd radiance
          TARGET=${{ matrix.target }} ./.github/scripts/build.sh

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.artifact_name }}
          path: radiance/target/${{ matrix.target }}/release/${{ matrix.output_name }}

  create-universal-macos:
    runs-on: macos-latest
    needs: build
    steps:
      - name: Checkout radiance repository
        uses: actions/checkout@v4

      - name: Install ImageMagick
        run: brew install imagemagick

      - name: Download x86_64 macOS binary
        uses: actions/download-artifact@v4
        with:
          name: radiance-macos-x86_64
          path: macos-x86_64

      - name: Download aarch64 macOS binary
        uses: actions/download-artifact@v4
        with:
          name: radiance-macos-aarch64
          path: macos-aarch64

      - name: Create universal binary
        run: |
          lipo -create \
            macos-x86_64/radiance \
            macos-aarch64/radiance \
            -output radiance-universal
          chmod +x radiance-universal

      - name: Create .app bundle
        run: |
          # Create app bundle structure
          mkdir -p Radiance.app/Contents/MacOS
          mkdir -p Radiance.app/Contents/Resources

          # Move the universal binary into the bundle
          mv radiance-universal Radiance.app/Contents/MacOS/radiance

          # Create Info.plist
          cat > Radiance.app/Contents/Info.plist << 'EOF'
          <?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>CFBundleDevelopmentRegion</key>
              <string>en</string>
              <key>CFBundleExecutable</key>
              <string>radiance</string>
              <key>CFBundleIconFile</key>
              <string>radiance.icns</string>
              <key>CFBundleIdentifier</key>
              <string>video.radiance</string>
              <key>CFBundleInfoDictionaryVersion</key>
              <string>6.0</string>
              <key>CFBundleName</key>
              <string>Radiance</string>
              <key>CFBundlePackageType</key>
              <string>APPL</string>
              <key>CFBundleShortVersionString</key>
              <string>0.1.0</string>
              <key>CFBundleVersion</key>
              <string>0.1.0</string>
              <key>LSMinimumSystemVersion</key>
              <string>11.0</string>
              <key>NSHighResolutionCapable</key>
              <true/>
              <key>NSMicrophoneUsageDescription</key>
              <string>Radiance uses audio input for beat tracking and music-reactive visuals.</string>
          </dict>
          </plist>
          EOF

          # Create iconset from logo
          mkdir radiance.iconset

          # Generate all required icon sizes
          magick library/logo.png -resize 16x16 radiance.iconset/icon_16x16.png
          magick library/logo.png -resize 32x32 radiance.iconset/icon_16x16@2x.png
          magick library/logo.png -resize 32x32 radiance.iconset/icon_32x32.png
          magick library/logo.png -resize 64x64 radiance.iconset/icon_32x32@2x.png
          magick library/logo.png -resize 128x128 radiance.iconset/icon_128x128.png
          magick library/logo.png -resize 256x256 radiance.iconset/icon_128x128@2x.png
          magick library/logo.png -resize 256x256 radiance.iconset/icon_256x256.png
          magick library/logo.png -resize 512x512 radiance.iconset/icon_256x256@2x.png
          magick library/logo.png -resize 512x512 radiance.iconset/icon_512x512.png
          magick library/logo.png -resize 1024x1024 radiance.iconset/icon_512x512@2x.png

          # Convert iconset to icns
          iconutil -c icns radiance.iconset -o Radiance.app/Contents/Resources/radiance.icns

          # Clean up iconset
          rm -rf radiance.iconset

      - name: Create DMG
        run: |
          # Create a temporary directory for the DMG contents
          mkdir dmg-contents
          cp -R Radiance.app dmg-contents/

          # Create an alias to the Applications folder
          ln -s /Applications dmg-contents/Applications

          # Create the DMG
          hdiutil create -volname "Radiance" -srcfolder dmg-contents -ov -format UDZO Radiance.dmg

      - name: Upload DMG artifact
        uses: actions/upload-artifact@v4
        with:
          name: radiance-macos-universal
          path: Radiance.dmg

      - name: Delete individual macOS artifacts
        uses: geekyeggo/delete-artifact@v5
        with:
          name: |
            radiance-macos-x86_64
            radiance-macos-aarch64

  create-release:
    runs-on: ubuntu-latest
    needs: [build, create-universal-macos]
    if: startsWith(github.ref, 'refs/tags/')
    steps:
      - name: Download all artifacts
        uses: actions/download-artifact@v4
        with:
          path: artifacts

      - name: Prepare release files
        run: |
          mkdir release-files
          VERSION=${GITHUB_REF#refs/tags/}

          # Linux binaries
          cp artifacts/radiance-linux-x86_64/radiance release-files/radiance-${VERSION}-linux-x86_64
          cp artifacts/radiance-linux-aarch64/radiance release-files/radiance-${VERSION}-linux-aarch64

          # Windows binary
          cp artifacts/radiance-windows-x86_64/radiance.exe release-files/radiance-${VERSION}-windows-x86_64.exe

          # macOS DMG
          cp artifacts/radiance-macos-universal/Radiance.dmg release-files/Radiance-${VERSION}-macos-universal.dmg

      - name: Create release
        uses: softprops/action-gh-release@v2
        with:
          files: |
            release-files/radiance-*-linux-x86_64
            release-files/radiance-*-linux-aarch64
            release-files/radiance-*-windows-x86_64.exe
            release-files/Radiance-*-macos-universal.dmg
          token: ${{ secrets.GITHUB_TOKEN }}