diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index de14a7ba2f82d..67b7fa02478e4 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -82,7 +82,6 @@ body: label: Installation Method description: When you select an unofficial installation method, you must have verified that the bug is also present in one of the official installation methods. Please make sure you uninstall the unofficial installation before installing one of the official installations. If you can't reproduce this in one of the official installation methods, you should report the bug to the maintainer of the unofficial installation method you used. options: - - .apk (Alpine Linux Package) - .AppImage - .deb - .dmg @@ -93,6 +92,7 @@ body: - .rpm - .zip / .7z - .apk (FreeTubeAndroid Unofficial) + - .apk (Alpine Linux Package Unofficial) - AUR (Unofficial) - Chocolatey (Unofficial) - Homebrew (Unofficial) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d22e3d7a77d16..584bdc723b0a0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -213,27 +213,6 @@ jobs: name: freetube-${{ steps.versionNumber.outputs.result }}.arm64.rpm path: build/freetube-${{ steps.versionNumber.outputs.result }}.aarch64.rpm - - name: Upload Alpine .apk x64 Artifact - uses: actions/upload-artifact@v4 - if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64') - with: - name: freetube-${{ steps.versionNumber.outputs.result }}-alpine-amd64.apk - path: build/freetube-${{ steps.versionNumber.outputs.result }}.apk - - - name: Upload Alpine .apk ARMv7l Artifact - uses: actions/upload-artifact@v4 - if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-armv7l') - with: - name: freetube-${{ steps.versionNumber.outputs.result }}-alpine-armv7l.apk - path: build/freetube-${{ steps.versionNumber.outputs.result }}-armv7l.apk - - - name: Upload Alpine .apk ARM64 Artifact - uses: actions/upload-artifact@v4 - if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-arm64') - with: - name: freetube-${{ steps.versionNumber.outputs.result }}-alpine-arm64.apk - path: build/freetube-${{ steps.versionNumber.outputs.result }}-arm64.apk - - name: Upload Pacman .pacman x64 Artifact uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64') diff --git a/.github/workflows/flatpak.yml b/.github/workflows/flatpak.yml index 3696960a64f50..2b9c10ac9861f 100644 --- a/.github/workflows/flatpak.yml +++ b/.github/workflows/flatpak.yml @@ -19,17 +19,16 @@ jobs: with: repository: flathub/io.freetubeapp.FreeTube token: ${{ secrets.FLATHUB_TOKEN }} - - name: GitHub API exec action + - name: Get Repo Release List uses: moustacheful/github-api-exec-action@v0 - id: api_results + id: list_results with: # Command to execute, (e.g: `pulls.create`), see https://octokit.github.io/rest.js/ for available commands - command: repos.getRelease + command: repos.listReleases payload: > { "owner": "FreeTubeApp", - "repo": "FreeTube", - "release_id": ${{ secrets.UPLOAD_ID }} + "repo": "FreeTube" } env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -39,7 +38,7 @@ jobs: uses: bluwy/substitute-string-action@v3 id: sub with: - _input-text: ${{ fromJson(steps.api_results.outputs.result).tag_name }} + _input-text: ${{ fromJson(steps.list_results.outputs.result)[0].tag_name }} -beta: '' v: '' - name: Create Release Branch @@ -51,24 +50,24 @@ jobs: with: version: v${{ steps.sub.outputs.result }}-beta repository: FreeTubeApp/FreeTube - file: freetube-${{ steps.sub.outputs.result }}-linux-x64-portable.zip + file: freetube-${{ steps.sub.outputs.result }}-beta-linux-x64-portable.zip - name: Download ARM Release uses: fabriciobastian/download-release-asset-action@v1.0.6 with: version: v${{ steps.sub.outputs.result }}-beta repository: FreeTubeApp/FreeTube - file: freetube-${{ steps.sub.outputs.result }}-linux-arm64-portable.zip + file: freetube-${{ steps.sub.outputs.result }}-beta-linux-arm64-portable.zip - name: Set x64 Hash Variable id: hash-x64 run: | echo 'HASH_X64<> $GITHUB_ENV - sha256sum freetube-${{ steps.sub.outputs.result }}-linux-x64-portable.zip | awk '{print $1}' >> $GITHUB_ENV + sha256sum freetube-${{ steps.sub.outputs.result }}-beta-linux-x64-portable.zip | awk '{print $1}' >> $GITHUB_ENV echo 'EOF' >> $GITHUB_ENV - name: Set ARM Hash Variable id: hash-arm64 run: | echo 'HASH_ARM64<> $GITHUB_ENV - sha256sum freetube-${{ steps.sub.outputs.result }}-linux-arm64-portable.zip | awk '{print $1}' >> $GITHUB_ENV + sha256sum freetube-${{ steps.sub.outputs.result }}-beta-linux-arm64-portable.zip | awk '{print $1}' >> $GITHUB_ENV echo 'EOF' >> $GITHUB_ENV - name: Set Date Variable id: current-date @@ -80,7 +79,7 @@ jobs: uses: mikefarah/yq@v4.45.1 with: # The Command which should be run - cmd: yq -i '.modules[0].sources[0].url = "https://github.com/FreeTubeApp/FreeTube/releases/download/v${{ steps.sub.outputs.result }}-beta/freetube-${{ steps.sub.outputs.result }}-linux-x64-portable.zip"' io.freetubeapp.FreeTube.yml + cmd: yq -i '.modules[0].sources[0].url = "https://github.com/FreeTubeApp/FreeTube/releases/download/v${{ steps.sub.outputs.result }}-beta/freetube-${{ steps.sub.outputs.result }}-beta-linux-x64-portable.zip"' io.freetubeapp.FreeTube.yml - name: Update x64 Hash in yml File uses: mikefarah/yq@v4.45.1 with: @@ -90,25 +89,24 @@ jobs: uses: mikefarah/yq@v4.45.1 with: # The Command which should be run - cmd: yq -i '.modules[0].sources[1].url = "https://github.com/FreeTubeApp/FreeTube/releases/download/v${{ steps.sub.outputs.result }}-beta/freetube-${{ steps.sub.outputs.result }}-linux-arm64-portable.zip"' io.freetubeapp.FreeTube.yml + cmd: yq -i '.modules[0].sources[1].url = "https://github.com/FreeTubeApp/FreeTube/releases/download/v${{ steps.sub.outputs.result }}-beta/freetube-${{ steps.sub.outputs.result }}-beta-linux-arm64-portable.zip"' io.freetubeapp.FreeTube.yml - name: Update ARM Hash in yml File uses: mikefarah/yq@v4.45.1 with: # The Command which should be run cmd: yq -i '.modules[0].sources[1].sha256 = "${{ env.HASH_ARM64 }}"' io.freetubeapp.FreeTube.yml - name: Add Patch Notes to XML File - run: xmlstarlet ed -L -i /application/releases/release[1] -t elem -n releaseTMP -v "" -i //releaseTMP -t attr -n version -v "${{ steps.sub.outputs.result }} Beta" -i //releaseTMP -t attr -n date -v "${{ env.CURRENT_DATE }}" -s //releaseTMP -t elem -n url -v "" -s //releaseTMP/url -t text -n "" -v "https://github.com/FreeTubeApp/FreeTube/releases/tag/v${{ steps.sub.outputs.result }}-beta" -r //releaseTMP -v "release" io.freetubeapp.FreeTube.metainfo.xml + run: xmlstarlet ed -L -i /component/releases/release[1] -t elem -n releaseTMP -v "" -i //releaseTMP -t attr -n version -v "${{ steps.sub.outputs.result }} Beta" -i //releaseTMP -t attr -n date -v "${{ env.CURRENT_DATE }}" -s //releaseTMP -t elem -n url -v "" -s //releaseTMP/url -t text -n "" -v "https://github.com/FreeTubeApp/FreeTube/releases/tag/v${{ steps.sub.outputs.result }}-beta" -r //releaseTMP -v "release" io.freetubeapp.FreeTube.metainfo.xml - name: Remove Release Files run: | - rm freetube-${{ steps.sub.outputs.result }}-linux-x64-portable.zip - rm freetube-${{ steps.sub.outputs.result }}-linux-arm64-portable.zip + rm freetube-${{ steps.sub.outputs.result }}-beta-linux-x64-portable.zip + rm freetube-${{ steps.sub.outputs.result }}-beta-linux-arm64-portable.zip - name: Commit Files uses: stefanzweifel/git-auto-commit-action@v5 with: # Optional but recommended # Defaults to "Apply automatic changes" commit_message: Update files for v${{ steps.sub.outputs.result }} - token: ${{ secrets.FLATHUB_TOKEN }} # Optional options appended to `git-commit` # See https://git-scm.com/docs/git-commit for a list of available options diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 70075ee77e745..40a3f89549672 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,6 +6,11 @@ name: Upload Release # or API. on: workflow_dispatch: + inputs: + releaseId: + type: string + required: true + description: Release ID # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: @@ -94,8 +99,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-linux-x64-portable.zip + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-linux-x64-portable.zip asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}.zip asset_content_type: application/zip @@ -105,8 +110,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-linux-x64-portable.7z + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-linux-x64-portable.7z asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}.7z asset_content_type: application/x-7z-compressed @@ -116,8 +121,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-linux-armv7l-portable.zip + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-linux-armv7l-portable.zip asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-armv7l.zip asset_content_type: application/zip @@ -127,8 +132,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-linux-armv7l-portable.7z + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-linux-armv7l-portable.7z asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-armv7l.7z asset_content_type: application/x-7z-compressed @@ -138,8 +143,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-linux-arm64-portable.zip + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-linux-arm64-portable.zip asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-arm64.zip asset_content_type: application/zip @@ -149,8 +154,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-linux-arm64-portable.7z + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-linux-arm64-portable.7z asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-arm64.7z asset_content_type: application/x-7z-compressed @@ -160,8 +165,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube_${{ steps.getPackageInfo.outputs.version }}_amd64.deb + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube_${{ steps.getPackageInfo.outputs.version }}_beta_amd64.deb asset_path: build/freetube_${{ steps.getPackageInfo.outputs.version }}_amd64.deb asset_content_type: application/vnd.debian.binary-package @@ -171,8 +176,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube_${{ steps.getPackageInfo.outputs.version }}_armv7l.deb + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube_${{ steps.getPackageInfo.outputs.version }}_beta_armv7l.deb asset_path: build/freetube_${{ steps.getPackageInfo.outputs.version }}_armv7l.deb asset_content_type: application/vnd.debian.binary-package @@ -182,8 +187,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube_${{ steps.getPackageInfo.outputs.version }}_arm64.deb + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube_${{ steps.getPackageInfo.outputs.version }}_beta_arm64.deb asset_path: build/freetube_${{ steps.getPackageInfo.outputs.version }}_arm64.deb asset_content_type: application/vnd.debian.binary-package @@ -193,8 +198,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-amd64.AppImage + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-amd64.AppImage asset_path: build/FreeTube-${{ steps.getPackageInfo.outputs.version }}.AppImage asset_content_type: application/vnd.appimage @@ -204,8 +209,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-armv7l.AppImage + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-armv7l.AppImage asset_path: build/FreeTube-${{ steps.getPackageInfo.outputs.version }}-armv7l.AppImage asset_content_type: application/vnd.appimage @@ -215,8 +220,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-arm64.AppImage + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-arm64.AppImage asset_path: build/FreeTube-${{ steps.getPackageInfo.outputs.version }}-arm64.AppImage asset_content_type: application/vnd.appimage @@ -226,8 +231,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}.amd64.rpm + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta.amd64.rpm asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}.x86_64.rpm asset_content_type: application/x-rpm @@ -239,52 +244,19 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}.arm64.rpm + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta.arm64.rpm asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}.aarch64.rpm asset_content_type: application/x-rpm - - name: Upload Alpine .apk x64 Release - uses: actions/upload-release-asset@v1 - if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64') - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-alpine-amd64.apk - asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}.apk - asset_content_type: application/octet-stream - - - name: Upload Alpine .apk ARMv7l Release - uses: actions/upload-release-asset@v1 - if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-armv7l') - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-alpine-armv7l.apk - asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-armv7l.apk - asset_content_type: application/octet-stream - - - name: Upload Alpine .apk ARM64 Release - uses: actions/upload-release-asset@v1 - if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-arm64') - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-alpine-arm64.apk - asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-arm64.apk - asset_content_type: application/octet-stream - - name: Upload Pacman .pacman x64 Release uses: actions/upload-release-asset@v1 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64') env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-amd64.pacman + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-amd64.pacman asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}.pacman asset_content_type: application/x-zstd-compressed-tar @@ -294,8 +266,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-setup-x64.exe + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-setup-x64.exe asset_path: build/freetube Setup ${{ steps.getPackageInfo.outputs.version }}.exe asset_content_type: application/x-ms-dos-executable @@ -305,8 +277,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-win-x64-portable.exe + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-win-x64-portable.exe asset_path: build/FreeTube ${{ steps.getPackageInfo.outputs.version }}.exe asset_content_type: application/x-ms-dos-executable @@ -316,8 +288,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-win-x64-portable.zip + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-win-x64-portable.zip asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-win.zip asset_content_type: application/zip @@ -327,8 +299,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-win-x64-portable.7z + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-win-x64-portable.7z asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-win.7z asset_content_type: application/x-7z-compressed @@ -338,8 +310,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-setup-arm64.exe + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-setup-arm64.exe asset_path: build/freetube Setup ${{ steps.getPackageInfo.outputs.version }}.exe asset_content_type: application/x-ms-dos-executable @@ -349,8 +321,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-win-arm64-portable.exe + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-win-arm64-portable.exe asset_path: build/FreeTube ${{ steps.getPackageInfo.outputs.version }}.exe asset_content_type: application/x-ms-dos-executable @@ -360,8 +332,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-win-arm64-portable.zip + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-win-arm64-portable.zip asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-arm64-win.zip asset_content_type: application/zip @@ -371,8 +343,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-win-arm64-portable.7z + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-win-arm64-portable.7z asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-arm64-win.7z asset_content_type: application/x-7z-compressed @@ -382,8 +354,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-mac-x64.dmg + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-mac-x64.dmg asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}.dmg asset_content_type: application/x-apple-diskimage @@ -393,8 +365,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-mac-x64.zip + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-mac-x64.zip asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-mac.zip asset_content_type: application/zip @@ -404,8 +376,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-mac-x64.7z + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-mac-x64.7z asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-mac.7z asset_content_type: application/x-7z-compressed @@ -415,8 +387,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-mac-arm64.dmg + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-mac-arm64.dmg asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-arm64.dmg asset_content_type: application/x-apple-diskimage @@ -426,8 +398,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-mac-arm64.zip + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-mac-arm64.zip asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-arm64-mac.zip asset_content_type: application/x-apple-diskimage @@ -437,7 +409,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} - asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-mac-arm64.7z + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-mac-arm64.7z asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-arm64-mac.7z asset_content_type: application/x-7z-compressed diff --git a/.github/workflows/updateSite.yml b/.github/workflows/updateSite.yml new file mode 100644 index 0000000000000..f38a2e58aff59 --- /dev/null +++ b/.github/workflows/updateSite.yml @@ -0,0 +1,68 @@ +# This is a basic workflow that is manually triggered + +name: Update Site Version Number + +# Controls when the action will run. Workflow runs when manually triggered using the UI +# or API. +on: + workflow_dispatch: + release: + types: [published] + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v5 + with: + repository: FreeTubeApp/FreeTubeApp.io + token: ${{ secrets.FLATHUB_TOKEN }} + - name: Get Repo Release List + uses: moustacheful/github-api-exec-action@v0 + id: list_results + with: + # Command to execute, (e.g: `pulls.create`), see https://octokit.github.io/rest.js/ for available commands + command: repos.listReleases + payload: > + { + "owner": "FreeTubeApp", + "repo": "FreeTube" + } + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Create Current Version Variable + uses: bluwy/substitute-string-action@v3 + id: current + with: + _input-text: ${{ fromJson(steps.list_results.outputs.result)[0].tag_name }} + -beta: '' + v: '' + - name: Create Previous Version Variable + uses: bluwy/substitute-string-action@v3 + id: previous + with: + _input-text: ${{ fromJson(steps.list_results.outputs.result)[1].tag_name }} + -beta: '' + v: '' + - name: Set Master Branch + # Currently the default branch is master, but if that changes later, then this acts as a failsafe. + run: | + git checkout master + - name: Update index.php + run: | + sed -i 's/${{ steps.previous.outputs.result }}/${{ steps.current.outputs.result }}/g' src/index.php + - name: Commit Files + uses: stefanzweifel/git-auto-commit-action@v6 + with: + # Optional but recommended + # Defaults to "Apply automatic changes" + commit_message: Update version number to v${{ steps.current.outputs.result }} + + # Optional options appended to `git-commit` + # See https://git-scm.com/docs/git-commit for a list of available options + commit_options: '--no-verify --signoff' + + # Optional: Disable dirty check and always try to create a commit and push + skip_dirty_check: true diff --git a/_scripts/build.js b/_scripts/build.js index de43f6f7e681b..ee1b7fa1c87e3 100644 --- a/_scripts/build.js +++ b/_scripts/build.js @@ -36,7 +36,7 @@ if (platform === 'darwin') { arch = Arch.armv7l } - targets = Platform.LINUX.createTarget(['deb', 'zip', '7z', 'apk', 'rpm', 'AppImage', 'pacman'], arch) + targets = Platform.LINUX.createTarget(['deb', 'zip', '7z', 'rpm', 'AppImage', 'pacman'], arch) } builder diff --git a/_scripts/ebuilder.config.js b/_scripts/ebuilder.config.js index 6929ef6ff2ded..14d0d9df1f262 100644 --- a/_scripts/ebuilder.config.js +++ b/_scripts/ebuilder.config.js @@ -46,7 +46,7 @@ const config = { linux: { category: 'Network', icon: '_icons/icon.svg', - target: ['deb', 'zip', '7z', 'apk', 'rpm', 'AppImage', 'pacman'], + target: ['deb', 'zip', '7z', 'rpm', 'AppImage', 'pacman'], }, // See the following issues for more information // https://github.com/jordansissel/fpm/issues/1503 diff --git a/_scripts/sigFrameConfig.js b/_scripts/sigFrameConfig.js new file mode 100644 index 0000000000000..c244fb2a1f9a6 --- /dev/null +++ b/_scripts/sigFrameConfig.js @@ -0,0 +1,13 @@ +const { hash } = require('crypto') +const { join } = require('path') +const { readFileSync } = require('fs') + +const path = join(__dirname, '../src/renderer/sigFrameScript.js') +const rawScript = readFileSync(path, 'utf8') + +const script = rawScript.split(/\r?\n/).map(line => line.trim()).filter(line => !line.startsWith('//')).join('') + +module.exports.sigFrameTemplateParameters = { + sigFrameSrc: `data:text/html,${encodeURIComponent(``)}`, + sigFrameCspHash: `sha512-${hash('sha512', script, 'base64')}` +} diff --git a/_scripts/webpack.renderer.config.js b/_scripts/webpack.renderer.config.js index 11f1cf828711c..f3e8c8e59870f 100644 --- a/_scripts/webpack.renderer.config.js +++ b/_scripts/webpack.renderer.config.js @@ -12,6 +12,7 @@ const { SHAKA_LOCALES_PREBUNDLED, SHAKA_LOCALES_TO_BE_BUNDLED } = require('./getShakaLocales') +const { sigFrameTemplateParameters } = require('./sigFrameConfig') const isDevMode = process.env.NODE_ENV === 'development' @@ -132,9 +133,9 @@ const config = { 'process.env.SHAKA_LOCALES_PREBUNDLED': JSON.stringify(SHAKA_LOCALES_PREBUNDLED) }), new HtmlWebpackPlugin({ - excludeChunks: ['processTaskWorker'], filename: 'index.html', - template: path.resolve(__dirname, '../src/index.ejs') + template: path.resolve(__dirname, '../src/index.ejs'), + templateParameters: sigFrameTemplateParameters }), new VueLoaderPlugin(), new MiniCssExtractPlugin({ diff --git a/package.json b/package.json index cd11646dbbfb4..5473fc8244332 100644 --- a/package.json +++ b/package.json @@ -2,12 +2,12 @@ "name": "freetube", "productName": "FreeTube", "description": "A private YouTube client", - "version": "0.23.1", + "version": "0.23.13", "license": "AGPL-3.0-or-later", "main": "./dist/main.js", "private": true, "author": { - "name": "PrestonN", + "name": "FreeTube Team", "email": "FreeTubeApp@protonmail.com", "url": "https://github.com/FreeTubeApp/FreeTube" }, @@ -61,20 +61,20 @@ "@fortawesome/vue-fontawesome": "^2.0.10", "@seald-io/nedb": "^4.0.4", "autolinker": "^4.1.0", - "bgutils-js": "^3.1.3", + "bgutils-js": "^3.2.0", "electron-context-menu": "^4.0.4", "marked": "^15.0.6", "path-browserify": "^1.0.1", "portal-vue": "^2.1.7", "process": "^0.11.10", - "shaka-player": "^4.13.0", + "shaka-player": "^4.13.4", "swiper": "^11.2.1", "vue": "^2.7.16", "vue-i18n": "^8.28.2", "vue-observe-visibility": "^1.0.0", "vue-router": "^3.6.5", "vuex": "^3.6.2", - "youtubei.js": "^13.0.0" + "youtubei.js": "^16.0.0" }, "devDependencies": { "@babel/core": "^7.26.7", @@ -88,7 +88,7 @@ "css-loader": "^7.1.2", "css-minimizer-webpack-plugin": "^7.0.0", "electron": "^34.0.1", - "electron-builder": "^25.1.8", + "electron-builder": "^26.0.13", "eslint": "^9.19.0", "eslint-plugin-jsdoc": "^50.6.3", "eslint-plugin-jsonc": "^2.19.1", diff --git a/src/botGuardScript.js b/src/botGuardScript.js index 11da8855a6472..c648703ac87c6 100644 --- a/src/botGuardScript.js +++ b/src/botGuardScript.js @@ -1,37 +1,86 @@ -import { BG } from 'bgutils-js' +import { BG, buildURL, GOOG_API_KEY } from 'bgutils-js' // This script has it's own webpack config, as it gets passed as a string to Electron's evaluateJavaScript function // in src/main/poTokenGenerator.js -export default async function(visitorData) { + +/** + * Based on: https://github.com/LuanRT/BgUtils/blob/main/examples/node/innertube-challenge-fetcher-example.ts + * @param {string} videoId + * @param {import('youtubei.js').Session['context']} context + */ +export default async function (videoId, context) { const requestKey = 'O43z0dpjhgX20SCx4KAo' - const bgConfig = { - fetch: (input, init) => fetch(input, init), - requestKey, - globalObj: window, - identifier: visitorData + const challengeResponse = await fetch( + 'https://www.youtube.com/youtubei/v1/att/get?prettyPrint=false&alt=json', + { + method: 'POST', + headers: { + Accept: '*/*', + 'Content-Type': 'application/json', + 'X-Goog-Visitor-Id': context.client.visitorData, + 'X-Youtube-Client-Version': context.client.clientVersion, + 'X-Youtube-Client-Name': '1' + }, + body: JSON.stringify({ + engagementType: 'ENGAGEMENT_TYPE_UNBOUND', + context + }), + } + ) + + if (!challengeResponse.ok) { + throw new Error(`Request to ${challengeResponse.url} failed with status ${challengeResponse.status}\n${await challengeResponse.text()}`) + } + + const challengeData = await challengeResponse.json() + + if (!challengeData.bgChallenge) { + throw new Error('Failed to get BotGuard challenge') } - const challenge = await BG.Challenge.create(bgConfig) + let interpreterUrl = challengeData.bgChallenge.interpreterUrl.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue - if (!challenge) { - throw new Error('Could not get challenge') + if (interpreterUrl.startsWith('//')) { + interpreterUrl = `https:${interpreterUrl}` } - const interpreterJavascript = challenge.interpreterJavascript.privateDoNotAccessOrElseSafeScriptWrappedValue + const bgScriptResponse = await fetch(interpreterUrl) + const interpreterJavascript = await bgScriptResponse.text() if (interpreterJavascript) { // eslint-disable-next-line no-new-func new Function(interpreterJavascript)() } else { - console.warn('Unable to load VM.') + throw new Error('Could not load VM.') } - const poTokenResult = await BG.PoToken.generate({ - program: challenge.program, - globalName: challenge.globalName, - bgConfig + const botGuard = await BG.BotGuardClient.create({ + program: challengeData.bgChallenge.program, + globalName: challengeData.bgChallenge.globalName, + globalObj: window + }) + + const webPoSignalOutput = [] + const botGuardResponse = await botGuard.snapshot({ webPoSignalOutput }, 10_000) + + const integrityTokenResponse = await fetch(buildURL('GenerateIT', true), { + method: 'POST', + headers: { + 'content-type': 'application/json+protobuf', + 'x-goog-api-key': GOOG_API_KEY, + 'x-user-agent': 'grpc-web-javascript/0.1', + }, + body: JSON.stringify([requestKey, botGuardResponse]) }) - return poTokenResult.poToken + const response = await integrityTokenResponse.json() + + if (typeof response[0] !== 'string') { + throw new Error('Could not get integrity token') + } + + const integrityTokenBasedMinter = await BG.WebPoMinter.create({ integrityToken: response[0] }, webPoSignalOutput) + + return await integrityTokenBasedMinter.mintAsWebsafeString(videoId) } diff --git a/src/index.ejs b/src/index.ejs index 40f7075a171a6..ecdc7f73fe4b9 100644 --- a/src/index.ejs +++ b/src/index.ejs @@ -13,7 +13,18 @@
- <% if (!process.env.IS_ELECTRON) { %> + <% if (process.env.IS_ELECTRON) { %> + + <% } else { %> + +