From 96eebb84cc04d8e1101f9a696cd55c32044f7295 Mon Sep 17 00:00:00 2001 From: talynone Date: Mon, 27 Apr 2026 01:45:02 -0700 Subject: [PATCH 1/6] Add Windows 11 ARM native build support --- .github/workflows/release.yml | 8 ++-- package.json | 4 ++ scripts/download-bins.js | 78 ++++++++++++++++++++++++++++++++++- 3 files changed, 86 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bbb1909..86926be 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,6 +22,8 @@ jobs: args: '--target aarch64-unknown-linux-gnu --config ./src-tauri/tauri.linux-aarch64.conf.json' - platform: 'windows-latest' args: '' + - platform: 'windows-11-arm' + args: '--target aarch64-pc-windows-msvc' runs-on: ${{ matrix.platform }} steps: - name: 🚚 Checkout repository @@ -56,7 +58,7 @@ jobs: run: npm run download - name: 📄 Read and Process CHANGELOG (Unix) - if: matrix.platform != 'windows-latest' + if: matrix.platform != 'windows-latest' && matrix.platform != 'windows-11-arm' id: changelog_unix shell: bash run: | @@ -77,7 +79,7 @@ jobs: fi - name: 📄 Read and Process CHANGELOG (Windows) - if: matrix.platform == 'windows-latest' + if: matrix.platform == 'windows-latest' || matrix.platform == 'windows-11-arm' id: changelog_windows shell: pwsh run: | @@ -106,7 +108,7 @@ jobs: with: tagName: ${{ github.ref_name }} releaseName: ${{ github.event.repository.name }}-${{ github.ref_name }} - releaseBody: ${{ matrix.platform == 'windows-latest' && steps.changelog_windows.outputs.content || steps.changelog_unix.outputs.content }} + releaseBody: ${{ (matrix.platform == 'windows-latest' || matrix.platform == 'windows-11-arm') && steps.changelog_windows.outputs.content || steps.changelog_unix.outputs.content }} releaseDraft: true prerelease: false includeUpdaterJson: true diff --git a/package.json b/package.json index 975763f..2f33a9d 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,10 @@ "tauri:build:macos-x64": "npm run tauri build -- --config ./src-tauri/tauri.macos-x86_64.conf.json", "tauri:dev:macos-arm64": "npm run tauri dev -- --config ./src-tauri/tauri.macos-aarch64.conf.json", "tauri:build:macos-arm64": "npm run tauri build -- --config ./src-tauri/tauri.macos-aarch64.conf.json", + "tauri:dev:windows-x64": "npm run tauri dev -- --target x86_64-pc-windows-msvc", + "tauri:build:windows-x64": "npm run tauri build -- --target x86_64-pc-windows-msvc", + "tauri:dev:windows-arm64": "npm run tauri dev -- --target aarch64-pc-windows-msvc", + "tauri:build:windows-arm64": "npm run tauri build -- --target aarch64-pc-windows-msvc", "download": "node ./scripts/download-bins.js" }, "dependencies": { diff --git a/scripts/download-bins.js b/scripts/download-bins.js index eb59329..068726e 100644 --- a/scripts/download-bins.js +++ b/scripts/download-bins.js @@ -38,6 +38,19 @@ const binaries = { path.join(downloadDir, 'yt-dlp-x86_64-pc-windows-msvc.exe') ] }, + { + name: 'yt-dlp-aarch64-pc-windows-msvc', + platform: 'win32', + url: `https://github.com/yt-dlp/yt-dlp-nightly-builds/releases${versions['yt-dlp'] === 'latest' ? '/latest' : ''}/download${versions['yt-dlp'] !== 'latest' ? '/'+versions['yt-dlp'] : ''}/yt-dlp_arm64.exe`, + src: path.join(downloadDir, 'yt-dlp-aarch64-pc-windows-msvc.exe'), + dest: [ + path.join(binDir, 'yt-dlp-aarch64-pc-windows-msvc.exe') + ], + archive: null, + cleanup: [ + path.join(downloadDir, 'yt-dlp-aarch64-pc-windows-msvc.exe') + ] + }, { name: 'yt-dlp-x86_64-unknown-linux-gnu', platform: 'linux', @@ -102,6 +115,28 @@ const binaries = { path.join(downloadDir, 'ffmpeg-master-latest-win64-gpl') ] }, + { + name: 'ffmpeg-ffprobe-aarch64-pc-windows-msvc', + platform: 'win32', + url: `https://github.com/yt-dlp/FFmpeg-Builds/releases${versions['ffmpeg-ffprobe'] === 'latest' ? '/latest' : ''}/download${versions['ffmpeg-ffprobe'] !== 'latest' ? '/'+versions['ffmpeg-ffprobe'] : ''}/ffmpeg-master-latest-winarm64-gpl.zip`, + src: path.join(downloadDir, 'ffmpeg-master-latest-winarm64-gpl.zip'), + dest: null, + archive: { + type: 'zip', + binSrc: [ + path.join(downloadDir, 'ffmpeg-master-latest-winarm64-gpl', 'bin', 'ffmpeg.exe'), + path.join(downloadDir, 'ffmpeg-master-latest-winarm64-gpl', 'bin', 'ffprobe.exe') + ], + binDest: [ + path.join(binDir, 'ffmpeg-aarch64-pc-windows-msvc.exe'), + path.join(binDir, 'ffprobe-aarch64-pc-windows-msvc.exe') + ] + }, + cleanup: [ + path.join(downloadDir, 'ffmpeg-master-latest-winarm64-gpl.zip'), + path.join(downloadDir, 'ffmpeg-master-latest-winarm64-gpl') + ] + }, { name: 'ffmpeg-ffprobe-x86_64-unknown-linux-gnu', platform: 'linux', @@ -256,6 +291,26 @@ const binaries = { path.join(downloadDir, 'deno.exe') ] }, + { + name: 'deno-aarch64-pc-windows-msvc', + platform: 'win32', + url: `https://github.com/denoland/deno/releases${versions['deno'] === 'latest' ? '/latest' : ''}/download${versions['deno'] !== 'latest' ? '/v'+versions['deno'] : ''}/deno-aarch64-pc-windows-msvc.zip`, + src: path.join(downloadDir, 'deno-aarch64-pc-windows-msvc.zip'), + dest: null, + archive: { + type: 'zip', + binSrc: [ + path.join(downloadDir, 'deno.exe') + ], + binDest: [ + path.join(binDir, 'deno-aarch64-pc-windows-msvc.exe') + ] + }, + cleanup: [ + path.join(downloadDir, 'deno-aarch64-pc-windows-msvc.zip'), + path.join(downloadDir, 'deno.exe') + ] + }, { name: 'deno-x86_64-unknown-linux-gnu', platform: 'linux', @@ -358,6 +413,26 @@ const binaries = { path.join(downloadDir, `aria2-${versions['aria2c']}-win-64bit-build1`) ] }, + { + name: 'aria2c-aarch64-pc-windows-msvc', + platform: 'win32', + url: `https://github.com/minnyres/aria2-windows-arm64/releases/download/v${versions['aria2c']}/aria2_${versions['aria2c']}_arm64.zip`, + src: path.join(downloadDir, `aria2_${versions['aria2c']}_arm64.zip`), + dest: null, + archive: { + type: 'zip', + binSrc: [ + path.join(downloadDir, 'aria2c.exe') + ], + binDest: [ + path.join(binDir, 'aria2c-aarch64-pc-windows-msvc.exe') + ] + }, + cleanup: [ + path.join(downloadDir, `aria2_${versions['aria2c']}_arm64.zip`), + path.join(downloadDir, 'aria2c.exe') + ] + }, { name: 'aria2c-x86_64-unknown-linux-gnu', platform: 'linux', @@ -406,7 +481,8 @@ const binaries = { url: `https://github.com/jim60105/bgutil-ytdlp-pot-provider-rs/releases${versions['neodlp-pot'] === 'latest' ? '/latest' : ''}/download${versions['neodlp-pot'] !== 'latest' ? '/v'+versions['neodlp-pot'] : ''}/bgutil-pot-windows-x86_64.exe`, src: path.join(downloadDir, 'bgutil-pot-windows-x86_64.exe'), dest: [ - path.join(binDir, 'neodlp-pot-x86_64-pc-windows-msvc.exe') + path.join(binDir, 'neodlp-pot-x86_64-pc-windows-msvc.exe'), + path.join(binDir, 'neodlp-pot-aarch64-pc-windows-msvc.exe') ], archive: null, cleanup: [ From 2a7aa2ab5a017fa30362564c49c464baacbf552c Mon Sep 17 00:00:00 2001 From: talynone Date: Mon, 27 Apr 2026 01:57:23 -0700 Subject: [PATCH 2/6] Allow manual workflow dispatches for tesitng --- .github/workflows/release.yml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 86926be..13a71b5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,6 +2,12 @@ on: push: tags: - 'v*.*.*' + workflow_dispatch: + inputs: + tag_name: + description: 'Draft release tag (e.g. v0.4.5-test)' + required: true + default: 'v0.0.0-test' name: 🚀 Release on GitHub jobs: @@ -64,11 +70,11 @@ jobs: run: | if [ -f CHANGELOG.md ]; then # Extract version number from tag - VERSION_NUM=$(echo "${{ github.ref_name }}" | sed -E 's/^v([0-9]+\.[0-9]+\.[0-9]+)(-.*)?$/\1/') + VERSION_NUM=$(echo "${{ inputs.tag_name || github.ref_name }}" | sed -E 's/^v([0-9]+\.[0-9]+\.[0-9]+)(-.*)?$/\1/') # Read and replace placeholders CONTENT=$(cat CHANGELOG.md) - CONTENT=${CONTENT///${{ github.ref_name }}} + CONTENT=${CONTENT///${{ inputs.tag_name || github.ref_name }}} CONTENT=${CONTENT///$VERSION_NUM} echo "content<> $GITHUB_OUTPUT @@ -85,11 +91,11 @@ jobs: run: | if (Test-Path "CHANGELOG.md") { # Extract version number from tag - $version_num = "${{ github.ref_name }}" -replace '^v([0-9]+\.[0-9]+\.[0-9]+)(-.*)?$','$1' + $version_num = "${{ inputs.tag_name || github.ref_name }}" -replace '^v([0-9]+\.[0-9]+\.[0-9]+)(-.*)?$','$1' # Read and replace placeholders $content = Get-Content -Path CHANGELOG.md -Raw - $content = $content -replace '', "${{ github.ref_name }}" + $content = $content -replace '', "${{ inputs.tag_name || github.ref_name }}" $content = $content -replace '', "$version_num" "content<> $env:GITHUB_OUTPUT @@ -106,8 +112,8 @@ jobs: TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} with: - tagName: ${{ github.ref_name }} - releaseName: ${{ github.event.repository.name }}-${{ github.ref_name }} + tagName: ${{ inputs.tag_name || github.ref_name }} + releaseName: ${{ github.event.repository.name }}-${{ inputs.tag_name || github.ref_name }} releaseBody: ${{ (matrix.platform == 'windows-latest' || matrix.platform == 'windows-11-arm') && steps.changelog_windows.outputs.content || steps.changelog_unix.outputs.content }} releaseDraft: true prerelease: false From 7f49fb6318f85bb36ca752059d41bbb6a6be9cf6 Mon Sep 17 00:00:00 2001 From: talynone Date: Mon, 27 Apr 2026 02:11:56 -0700 Subject: [PATCH 3/6] Pass arg to downloader so only needed arch binaries are downloaded --- scripts/download-bins.js | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/scripts/download-bins.js b/scripts/download-bins.js index 068726e..5944d43 100644 --- a/scripts/download-bins.js +++ b/scripts/download-bins.js @@ -12,8 +12,23 @@ const downloadDir = path.join(projectRoot, 'src-tauri', 'resources', 'downloads' const binDir = path.join(projectRoot, 'src-tauri', 'binaries'); const platform = os.platform(); +const arch = os.arch(); const targetPlatform = process.argv[2]; -const targetBin = process.argv[3]; +const targetArch = process.argv[3]; +const targetBin = process.argv[4]; + +function getArchesForBin(bin) { + const paths = [ + ...(bin.dest || []), + ...((bin.archive && bin.archive.binDest) || []) + ]; + const arches = new Set(); + for (const p of paths) { + if (p.includes('-x86_64-') || p.includes('-x64-')) arches.add('x64'); + if (p.includes('-aarch64-') || p.includes('-arm64-')) arches.add('arm64'); + } + return arches; +} const versions = { 'yt-dlp': '2026.03.21.233500', @@ -603,15 +618,21 @@ if (targetPlatform && !['win32', 'linux', 'darwin', 'all'].includes(targetPlatfo process.exit(1); } +if (targetArch && !['x64', 'arm64', 'all'].includes(targetArch)) { + console.error(`ERROR: Invalid arch specified: '${targetArch}'. Use one of: x64, arm64, or all`); + process.exit(1); +} + if (targetBin && !binaries.hasOwnProperty(targetBin) && targetBin !== 'all') { console.error(`ERROR: Invalid binary specified: '${targetBin}'. Use one of: ${Object.keys(binaries).join(', ')}, or all`); process.exit(1); } const effectivePlatform = targetPlatform || platform; +const effectiveArch = targetArch || arch; const effectiveBin = targetBin || 'all'; -console.log(`RUNNING: 📦 Binary Downloader (platform: ${effectivePlatform} | binary: ${effectiveBin})`); +console.log(`RUNNING: 📦 Binary Downloader (platform: ${effectivePlatform} | arch: ${effectiveArch} | binary: ${effectiveBin})`); Object.keys(binaries).forEach((binKey) => { if (effectiveBin !== 'all' && binKey !== effectiveBin) { @@ -623,6 +644,13 @@ Object.keys(binaries).forEach((binKey) => { return; } + if (effectiveArch !== 'all') { + const binArches = getArchesForBin(bin); + if (!binArches.has(effectiveArch)) { + return; + } + } + downloadAndProcess(bin); }); }); From b1bd29c5387f9084e37789189b99640646d784aa Mon Sep 17 00:00:00 2001 From: talynone Date: Mon, 27 Apr 2026 03:06:46 -0700 Subject: [PATCH 4/6] Runner now passes arch --- .github/workflows/release.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 13a71b5..d037984 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,16 +19,28 @@ jobs: matrix: include: - platform: 'macos-latest' + target_platform: 'darwin' + target_arch: 'arm64' args: '--target aarch64-apple-darwin --config ./src-tauri/tauri.macos-aarch64.conf.json' - platform: 'macos-latest' + target_platform: 'darwin' + target_arch: 'x64' args: '--target x86_64-apple-darwin --config ./src-tauri/tauri.macos-x86_64.conf.json' - platform: 'ubuntu-22.04' + target_platform: 'linux' + target_arch: 'x64' args: '--target x86_64-unknown-linux-gnu --config ./src-tauri/tauri.linux-x86_64.conf.json' - platform: 'ubuntu-22.04-arm' + target_platform: 'linux' + target_arch: 'arm64' args: '--target aarch64-unknown-linux-gnu --config ./src-tauri/tauri.linux-aarch64.conf.json' - platform: 'windows-latest' + target_platform: 'win32' + target_arch: 'x64' args: '' - platform: 'windows-11-arm' + target_platform: 'win32' + target_arch: 'arm64' args: '--target aarch64-pc-windows-msvc' runs-on: ${{ matrix.platform }} steps: @@ -61,7 +73,7 @@ jobs: run: npm install - name: 📥 Download binaries - run: npm run download + run: npm run download -- ${{ matrix.target_platform }} ${{ matrix.target_arch }} - name: 📄 Read and Process CHANGELOG (Unix) if: matrix.platform != 'windows-latest' && matrix.platform != 'windows-11-arm' From a7ac5b07b45b94fad6c1766f1e8d5aa2d4c95247 Mon Sep 17 00:00:00 2001 From: talynone Date: Mon, 27 Apr 2026 03:30:39 -0700 Subject: [PATCH 5/6] Updated Changelog with Windows ARM 64 download links, removed note that x64 version should be installed/used on arm64. --- CHANGELOG.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d851e8e..221900c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,12 +34,10 @@ | Architecture | Windows (msi) ⬆️ | Windows (exe) ⬆️ | Linux (deb) | Linux (rpm) | Linux (AppImage) ⬆️ | MacOS (dmg) ⬆️ | MacOS (app) ⬆️ | | :---- | :---- | :---- | :---- | :---- | :---- | :---- | :---- | | x86_64 | [Download](https://github.com/neosubhamoy/neodlp/releases/download//NeoDLP__x64_en-US.msi) | [Download](https://github.com/neosubhamoy/neodlp/releases/download//NeoDLP__x64-setup.exe) | [Download](https://github.com/neosubhamoy/neodlp/releases/download//NeoDLP__amd64.deb) | [Download](https://github.com/neosubhamoy/neodlp/releases/download//NeoDLP--1.x86_64.rpm) | 🚫 [Download](https://github.com/neosubhamoy/neodlp/releases/download//NeoDLP__amd64.AppImage) | [Download](https://github.com/neosubhamoy/neodlp/releases/download//NeoDLP__x64.dmg) | [Download](https://github.com/neosubhamoy/neodlp/releases/download//NeoDLP_x64.app.tar.gz) | -| ARM64 | N/A | 🪟 [Download](https://github.com/neosubhamoy/neodlp/releases/download//NeoDLP__x64-setup.exe) | [Download](https://github.com/neosubhamoy/neodlp/releases/download//NeoDLP__arm64.deb) | [Download](https://github.com/neosubhamoy/neodlp/releases/download//NeoDLP--1.aarch64.rpm) | N/A | ⚠️ [Download](https://github.com/neosubhamoy/neodlp/releases/download//NeoDLP__aarch64.dmg) | ⚠️ [Download](https://github.com/neosubhamoy/neodlp/releases/download//NeoDLP_aarch64.app.tar.gz) | +| ARM64 | [Download](https://github.com/neosubhamoy/neodlp/releases/download//NeoDLP__arm64_en-US.msi) | [Download](https://github.com/neosubhamoy/neodlp/releases/download//NeoDLP__arm64-setup.exe) | [Download](https://github.com/neosubhamoy/neodlp/releases/download//NeoDLP__arm64.deb) | [Download](https://github.com/neosubhamoy/neodlp/releases/download//NeoDLP--1.aarch64.rpm) | N/A | ⚠️ [Download](https://github.com/neosubhamoy/neodlp/releases/download//NeoDLP__aarch64.dmg) | ⚠️ [Download](https://github.com/neosubhamoy/neodlp/releases/download//NeoDLP_aarch64.app.tar.gz) | > ⬆️ icon indicates this packaging format supports in-built app-updater -> 🪟 Windows x86_64 binary also works on ARM64 (Windows on ARM) devices with emulation (Not planning to release native Windows ARM64 build anytime soon as, x86_64 one works fine on ARM64 without noticeable performance impact) - > 🚫 Linux AppImage builds are experimental and does not support neodlp's browser intergration features and yt-dlp updates due to it's limitations. Also, don't run the AppImage with portable (.home, .config) folders, it will break things (it is highly recommended to use native [DEB, RPM, AUR] builds if possible for the full experiance, otherwise AppImages are good for trying out NeoDLP without installing) > ⚠️ MacOS ARM64 binary downloads are experimental and may not open on Apple Silicon Macs if downloaded from browser (You will get 'Damaged File' error) it's because the binaries are not signed (signing MacOS binaries requires 99$/year Apple Developer Account subscription, which I can't afford RN!) and Apple Silicon Macs don't allow unsigned apps (downloaded from browser) to be installed on the system. If you want to use NeoDLP on your Apple Silicon Macs, There are few ways you can bypass these restrictions: From b5b5946efa531bf2783f361d6516ecb590fb1558 Mon Sep 17 00:00:00 2001 From: talynone Date: Tue, 28 Apr 2026 02:51:29 -0700 Subject: [PATCH 6/6] Update scripts/download-bins.js Co-authored-by: Subhamoy Biswas <86715146+neosubhamoy@users.noreply.github.com> --- scripts/download-bins.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/download-bins.js b/scripts/download-bins.js index 5944d43..19b09fb 100644 --- a/scripts/download-bins.js +++ b/scripts/download-bins.js @@ -23,9 +23,9 @@ function getArchesForBin(bin) { ...((bin.archive && bin.archive.binDest) || []) ]; const arches = new Set(); - for (const p of paths) { - if (p.includes('-x86_64-') || p.includes('-x64-')) arches.add('x64'); - if (p.includes('-aarch64-') || p.includes('-arm64-')) arches.add('arm64'); + for (const path of paths) { + if (path.includes('-x86_64-') || path.includes('-x64-')) arches.add('x64'); + if (path.includes('-aarch64-') || path.includes('-arm64-')) arches.add('arm64'); } return arches; }