diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml deleted file mode 100644 index 05d31c5a..00000000 --- a/.github/workflows/create-release.yml +++ /dev/null @@ -1,81 +0,0 @@ -name: Create New Release - -on: - workflow_dispatch: - inputs: - new_tag: - description: 'Tag name for the new release' - required: true - -jobs: - create_release: - runs-on: ubuntu-latest - steps: - - name: Check out code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Get latest release tag from GitHub - id: latest_release - uses: actions/github-script@v6 - with: - script: | - try { - const latestRelease = await github.rest.repos.getLatestRelease({ - owner: context.repo.owner, - repo: context.repo.repo - }); - core.info(`Latest release tag: ${latestRelease.data.tag_name}`); - core.setOutput('last_release', latestRelease.data.tag_name); - } catch (error) { - core.info("No previous release found."); - // If no release exists, output an empty string. - core.setOutput('last_release', ''); - } - - - name: Set new release tag from input - id: new_tag - run: | - echo "NEW_TAG=${{ github.event.inputs.new_tag }}" >> $GITHUB_OUTPUT - - - name: Generate commit log for new release - id: commits - run: | - LAST_RELEASE="${{ steps.latest_release.outputs.last_release }}" - NEW_TAG="${{ steps.new_tag.outputs.NEW_TAG }}" - - if [ -z "$NEW_TAG" ]; then - echo "No new tag provided. Exiting." - exit 1 - fi - - if [ -z "${LAST_RELEASE}" ]; then - echo "No previous release found, using the repository’s initial commit as the starting point." - FIRST_COMMIT=$(git rev-list --max-parents=0 HEAD) - RANGE="${FIRST_COMMIT}..${NEW_TAG}" - else - RANGE="${LAST_RELEASE}..${NEW_TAG}" - fi - - echo "Comparing commits between: ${RANGE}" - LOG=$(git log "${RANGE}" --no-merges --pretty=format:"- %h %s by %an") - - echo "LOG<> "$GITHUB_ENV" - echo "$LOG" >> "$GITHUB_ENV" - echo "EOF" >> "$GITHUB_ENV" - - # Create or update the GitHub release for the new tag. - - name: Create / Update GitHub Release for new tag - uses: softprops/action-gh-release@master - with: - tag_name: ${{ steps.new_tag.outputs.NEW_TAG }} - name: "${{ steps.new_tag.outputs.NEW_TAG }}" - body: ${{ env.LOG }} - append_body: false - generate_release_notes: false - make_latest: true - draft: false - prerelease: false - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/native-build.yml b/.github/workflows/native-build.yml new file mode 100644 index 00000000..75fd02c8 --- /dev/null +++ b/.github/workflows/native-build.yml @@ -0,0 +1,110 @@ +name: Build WebView wrappers + +on: + workflow_dispatch: + inputs: + tag: + required: true + description: "Ref to build from (e.g. v1.0.0)" + +env: + PYTHON_VERSION: 3.11 + PNPM_VERSION: 10 + NODE_VERSION: 20 + +jobs: + build: + permissions: + packages: write + contents: write + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout source repo + uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.tag }} + + - name: Cache Chocolatey packages + if: matrix.os == 'windows-latest' + uses: actions/cache@v4 + with: + path: C:\ProgramData\chocolatey\lib + key: choco-${{ runner.os }}-qt6 + restore-keys: | + choco-${{ runner.os }}- + + - name: Install Qt (Windows) + if: matrix.os == 'windows-latest' + run: choco install -y qt6-base-dev + + - name: Cache Python venv + id: cache-python + uses: actions/cache@v4 + with: + path: .venv + key: uv-${{ runner.os }}-${{ env.PYTHON_VERSION }}-${{ hashFiles('uv.lock') }} + restore-keys: | + uv-${{ runner.os }}-${{ env.PYTHON_VERSION }}- + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + architecture: "x64" + + - name: Install Python dependencies + run: | + pip install uv + uv venv --system-site-packages --relocatable + uv sync --link-mode=copy --active + + - name: Install PyInstaller + Qt backend (Windows) + if: matrix.os == 'windows-latest' + run: | + uv pip install pyinstaller pywebview QtPy PySide6 + + - name: Install PyInstaller + Qt backend (Other OSs) + if: matrix.os != 'windows-latest' + run: | + uv pip install pyinstaller pywebview[qt] + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: ${{ env.PNPM_VERSION }} + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: pnpm + cache-dependency-path: "ui/pnpm-lock.yaml" + + - name: Build frontend + working-directory: ui + run: | + pnpm install --production --prefer-offline --frozen-lockfile + pnpm run generate + + - name: Build native binary + run: | + uv run pyinstaller ./app.spec + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: app-${{ matrix.os }}-${{ github.event.inputs.tag }} + path: dist/* + + - name: Upload to GitHub Release + if: startsWith(github.ref, 'refs/tags/') + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ github.event.inputs.tag }} + files: dist/* + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index ac6b82f6..15753c9c 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,13 @@ live streams, and includes features like scheduling downloads, sending notificat * Apply `yt-dlp` options per custom defined conditions. * Custom browser extensions, bookmarklets and iOS shortcuts to send links to YTPTube instance. +### Side project + +We have a side project related to YTPTube, which takes YTPTube source code and build an executable for Windows, macOS and Linux. +The project is in early stages, and might not even work yet. However keep an eye at [This build action](https://github.com/arabcoders/ytptube/actions/workflows/native-build.yml) for builds, simply select last successful build and download the executable for your platform. Help us test out the platforms +and report any issues you might find. We only have windows/linux machines to test on, so we need your help to test it out on macOS. + + # Installation ## Run using docker command