name: Release Voicemeeter Compact on: release: types: [published] push: tags: ['v*.*.*'] workflow_dispatch: jobs: build: runs-on: windows-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.12' - name: Install Poetry uses: snok/install-poetry@v1 with: version: latest virtualenvs-create: true virtualenvs-in-project: true - name: Install Task uses: go-task/setup-task@v1 with: version: 3.x - name: Download Forest TTK Theme run: | # Clone the Forest theme repository git clone https://github.com/rdbende/Forest-ttk-theme.git temp-forest-theme # Copy the required theme files to theme/forest Copy-Item "temp-forest-theme\forest-dark.tcl" "theme\forest\" Copy-Item "temp-forest-theme\forest-light.tcl" "theme\forest\" Copy-Item "temp-forest-theme\forest-dark" "theme\forest\" -Recurse Copy-Item "temp-forest-theme\forest-light" "theme\forest\" -Recurse # Clean up Remove-Item temp-forest-theme -Recurse -Force shell: pwsh - name: Download Azure TTK Theme run: | # Clone the Azure theme repository git clone https://github.com/rdbende/Azure-ttk-theme.git temp-azure-theme # Copy the required theme files to theme/azure Copy-Item "temp-azure-theme\azure.tcl" "theme\azure\" Copy-Item "temp-azure-theme\theme" "theme\azure\" -Recurse # Clean up Remove-Item temp-azure-theme -Recurse -Force shell: pwsh - name: Cache Poetry dependencies uses: actions/cache@v4 with: path: .venv key: venv-${{ runner.os }}-${{ hashFiles('**/poetry.lock') }} - name: Install Poetry plugins run: poetry self add poethepoet shell: bash - name: Replace path dependencies with PyPI versions run: | poetry remove voicemeeter-api vban-cmd || true poetry add voicemeeter-api vban-cmd shell: bash - name: Install dependencies shell: pwsh run: | # Install project dependencies poetry install --with build # Verify PyInstaller is available Write-Host "Verifying PyInstaller installation..." poetry show pyinstaller - name: Get Poetry executable path shell: pwsh run: | $poetryPath = Get-Command poetry | Select-Object -ExpandProperty Source Write-Host "Poetry path: $poetryPath" echo "POETRY_BIN=$poetryPath" >> $env:GITHUB_ENV - name: Build artifacts with dynamic taskfile run: task --taskfile Taskfile.dynamic.yml build-all shell: bash env: POETRY_BIN: ${{ env.POETRY_BIN }} - name: Create release archives run: task --taskfile Taskfile.dynamic.yml compress-all shell: bash env: POETRY_BIN: ${{ env.POETRY_BIN }} - name: Verify build outputs shell: pwsh run: | Write-Host "Verifying build outputs..." $expectedFiles = @( "dist/sunvalley-basic.zip", "dist/sunvalley-banana.zip", "dist/sunvalley-potato.zip", "dist/forest-dark-basic.zip", "dist/forest-dark-banana.zip", "dist/forest-dark-potato.zip", "dist/forest-light-basic.zip", "dist/forest-light-banana.zip", "dist/forest-light-potato.zip", "dist/azure-dark-basic.zip", "dist/azure-dark-banana.zip", "dist/azure-dark-potato.zip", "dist/azure-light-basic.zip", "dist/azure-light-banana.zip", "dist/azure-light-potato.zip" ) $missingFiles = @() $foundFiles = @() foreach ($file in $expectedFiles) { if (Test-Path $file) { $size = [math]::Round((Get-Item $file).Length / 1MB, 2) $foundFiles += "$file ($size MB)" } else { $missingFiles += $file } } Write-Host "Found files:" $foundFiles | ForEach-Object { Write-Host " $_" } if ($missingFiles.Count -gt 0) { Write-Host -ForegroundColor Red "Missing files:" $missingFiles | ForEach-Object { Write-Host " $_" } exit 1 } Write-Host -ForegroundColor Green "All expected files found!" # Sunvalley theme variants - name: Upload build artifacts - Sunvalley Basic uses: actions/upload-artifact@v4 with: name: sunvalley-basic path: dist/sunvalley-basic.zip - name: Upload build artifacts - Sunvalley Banana uses: actions/upload-artifact@v4 with: name: sunvalley-banana path: dist/sunvalley-banana.zip - name: Upload build artifacts - Sunvalley Potato uses: actions/upload-artifact@v4 with: name: sunvalley-potato path: dist/sunvalley-potato.zip # Forest theme variants (dark) - name: Upload build artifacts - Forest Basic Dark uses: actions/upload-artifact@v4 with: name: forest-dark-basic path: dist/forest-dark-basic.zip - name: Upload build artifacts - Forest Banana Dark uses: actions/upload-artifact@v4 with: name: forest-dark-banana path: dist/forest-dark-banana.zip - name: Upload build artifacts - Forest Potato Dark uses: actions/upload-artifact@v4 with: name: forest-dark-potato path: dist/forest-dark-potato.zip # Forest theme variants (light) - name: Upload build artifacts - Forest Basic Light uses: actions/upload-artifact@v4 with: name: forest-light-basic path: dist/forest-light-basic.zip - name: Upload build artifacts - Forest Banana Light uses: actions/upload-artifact@v4 with: name: forest-light-banana path: dist/forest-light-banana.zip - name: Upload build artifacts - Forest Potato Light uses: actions/upload-artifact@v4 with: name: forest-light-potato path: dist/forest-light-potato.zip # Azure theme variants (dark) - name: Upload build artifacts - Azure Basic Dark uses: actions/upload-artifact@v4 with: name: azure-dark-basic path: dist/azure-dark-basic.zip - name: Upload build artifacts - Azure Banana Dark uses: actions/upload-artifact@v4 with: name: azure-dark-banana path: dist/azure-dark-banana.zip - name: Upload build artifacts - Azure Potato Dark uses: actions/upload-artifact@v4 with: name: azure-dark-potato path: dist/azure-dark-potato.zip # Azure theme variants (light) - name: Upload build artifacts - Azure Basic Light uses: actions/upload-artifact@v4 with: name: azure-light-basic path: dist/azure-light-basic.zip - name: Upload build artifacts - Azure Banana Light uses: actions/upload-artifact@v4 with: name: azure-light-banana path: dist/azure-light-banana.zip - name: Upload build artifacts - Azure Potato Light uses: actions/upload-artifact@v4 with: name: azure-light-potato path: dist/azure-light-potato.zip - name: Build Summary shell: pwsh run: | Write-Host -ForegroundColor Green "Build completed successfully!" Write-Host "" Write-Host "Built artifacts (15 theme variants):" Write-Host " Sunvalley Theme:" Write-Host " - voicemeeter-compact-sunvalley-basic.zip" Write-Host " - voicemeeter-compact-sunvalley-banana.zip" Write-Host " - voicemeeter-compact-sunvalley-potato.zip" Write-Host " Forest Theme:" Write-Host " - voicemeeter-compact-forest-dark-basic.zip" Write-Host " - voicemeeter-compact-forest-dark-banana.zip" Write-Host " - voicemeeter-compact-forest-dark-potato.zip" Write-Host " - voicemeeter-compact-forest-light-basic.zip" Write-Host " - voicemeeter-compact-forest-light-banana.zip" Write-Host " - voicemeeter-compact-forest-light-potato.zip" Write-Host " Azure Theme:" Write-Host " - voicemeeter-compact-azure-dark-basic.zip" Write-Host " - voicemeeter-compact-azure-dark-banana.zip" Write-Host " - voicemeeter-compact-azure-dark-potato.zip" Write-Host " - voicemeeter-compact-azure-light-basic.zip" Write-Host " - voicemeeter-compact-azure-light-banana.zip" Write-Host " - voicemeeter-compact-azure-light-potato.zip" release: if: startsWith(github.ref, 'refs/tags/v') needs: build runs-on: ubuntu-latest permissions: contents: write steps: - name: Checkout code uses: actions/checkout@v4 - name: Download all artifacts uses: actions/download-artifact@v4 - name: Create Release run: | TAG_NAME=${GITHUB_REF#refs/tags/} gh release create $TAG_NAME \ --title "Voicemeeter Compact $TAG_NAME" \ --notes "## Voicemeeter Compact Release $TAG_NAME ### Theme Variants Choose your preferred theme and Voicemeeter version: **Sunvalley Theme** - **sunvalley-basic.zip** - For Voicemeeter Basic - **sunvalley-banana.zip** - For Voicemeeter Banana - **sunvalley-potato.zip** - For Voicemeeter Potato **Forest Theme** - **forest-dark-basic.zip** - Dark theme for Voicemeeter Basic - **forest-dark-banana.zip** - Dark theme for Voicemeeter Banana - **forest-dark-potato.zip** - Dark theme for Voicemeeter Potato - **forest-light-basic.zip** - Light theme for Voicemeeter Basic - **forest-light-banana.zip** - Light theme for Voicemeeter Banana - **forest-light-potato.zip** - Light theme for Voicemeeter Potato **Azure Theme** - **azure-dark-basic.zip** - Dark theme for Voicemeeter Basic - **azure-dark-banana.zip** - Dark theme for Voicemeeter Banana - **azure-dark-potato.zip** - Dark theme for Voicemeeter Potato - **azure-light-basic.zip** - Light theme for Voicemeeter Basic - **azure-light-banana.zip** - Light theme for Voicemeeter Banana - **azure-light-potato.zip** - Light theme for Voicemeeter Potato ### Requirements - Windows 10/11 - Voicemeeter (Basic/Banana/Potato) installed - Python 3.10+ (if running from source) ### Installation 1. Download the zip file matching your Voicemeeter version and preferred theme 2. Extract and run the executable - no installation required 3. The application will automatically detect your Voicemeeter installation ### Notes - Built with PyInstaller for standalone execution - Each variant is scaled for its specific Voicemeeter version - Themes provide different visual styles while maintaining full functionality" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Upload release assets run: | TAG_NAME=${GITHUB_REF#refs/tags/} find . -name "*.zip" -exec gh release upload $TAG_NAME {} \; env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}