name: Executables

on:
  workflow_dispatch:
  push:
    branches:
    - master
    tags-ignore:
    - "*"

env:
  DATE_FORMAT: "%Y.%m.%d"

jobs:
  build:

    if: github.repository == 'mikf/gallery-dl'
    runs-on: ${{ matrix.os }}
    defaults:
      run:
        shell: bash
    strategy:
      fail-fast: false
      matrix:
        os: ["windows-latest", "macOS-latest"]
        architecture: ["x64"]
        python-version: ["3.13"]
        python-packages: [""]
        include:
        - os: "ubuntu-latest"
          architecture: "x64"
          python-version: "3.13"
          python-packages: "secretstorage"
        - os: "windows-2022"
          architecture: "x86"
          python-version: "3.8"
          python-packages: "toml"

    steps:
    - uses: actions/checkout@v4

    - name: Set up Python ${{ matrix.python-version }} ${{ matrix.architecture }}
      uses: actions/setup-python@v5
      with:
        python-version: ${{ matrix.python-version }}
        architecture: ${{ matrix.architecture }}

    - name: Environment Variables
      run: |
        echo "DATE=$(date '+${{ env.DATE_FORMAT }}')" >> "$GITHUB_ENV"
        echo "LABEL=$(python ./scripts/pyinstaller.py --print --os '${{ matrix.os }}' --arch '${{ matrix.architecture }}')" >> "$GITHUB_ENV"

    - name: Update Version
      # use Python since its behavior is consistent across operating systems
      shell: python
      run: |
        import re
        path = "./gallery_dl/version.py"
        with open(path) as fp:
            content = fp.read()
        content = re.sub(
            r'\b(__version__ = "[^"]+)',
            r"\1:${{ env.DATE }}",
            content)
        content = re.sub(
            r'\b(__variant__ =).+',
            r'\1 "dev/${{ env.LABEL }}"',
            content)
        with open(path, "w") as fp:
            fp.write(content)

    - name: Build executable
      run: |
        pip install requests requests[socks] yt-dlp[default] pyyaml ${{ matrix.python-packages }} pyinstaller
        pip install truststore || true
        python ./scripts/pyinstaller.py --label '${{ env.LABEL }}'

    - uses: actions/upload-artifact@v4
      with:
        name: executable-${{ matrix.os }}-${{ matrix.architecture }}-${{ matrix.python-version }}
        path: dist/*
        retention-days: 1
        compression-level: 0

  release:

    needs: build
    runs-on: ubuntu-latest

    steps:
    - uses: actions/download-artifact@v4

    - name: Environment Variables
      run: echo "DATE=$(date '+${{ env.DATE_FORMAT }}')" >> "$GITHUB_ENV"

    - name: Body
      run: printf 'https://github.com/%s/commit/%s' '${{ github.repository }}' '${{ github.sha }}' > body.md

    - uses: ncipollo/release-action@v1
      with:
        owner: gdl-org
        repo: builds
        tag: ${{ env.DATE }}
        bodyFile: body.md
        artifacts: "executable-*/*"
        allowUpdates: true
        makeLatest: true
        token: ${{ secrets.REPO_TOKEN }}
