Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 36 additions & 7 deletions .github/workflows/native-helper-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@ on:
workflow_dispatch:
inputs:
version:
description: 'Version tag (e.g. v0.3.12)'
description: 'Version tag (e.g. v0.3.15)'
required: true
default: 'v0.3.12'
default: 'v0.3.15'

jobs:
build:
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
Expand All @@ -21,10 +22,14 @@ jobs:
target: aarch64-apple-darwin
artifact: MasterSelects-NativeHelper-macos-arm64
ext: ''
- os: macos-13
- os: macos-15-intel
target: x86_64-apple-darwin
artifact: MasterSelects-NativeHelper-macos-x64
ext: ''
- os: windows-latest
target: x86_64-pc-windows-msvc
artifact: MasterSelects-NativeHelper-windows-x64
ext: '.msi'

runs-on: ${{ matrix.os }}
steps:
Expand All @@ -39,18 +44,32 @@ jobs:
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y clang pkg-config
sudo apt-get install -y clang pkg-config libwayland-dev libxkbcommon-dev

- name: Install macOS dependencies
if: runner.os == 'macOS'
run: |
brew install llvm pkg-config
echo "LIBCLANG_PATH=$(brew --prefix llvm)/lib" >> $GITHUB_ENV

- name: Install Windows dependencies
if: runner.os == 'Windows'
shell: pwsh
run: |
dotnet tool install --global wix --version 6.0.2
wix extension add WixToolset.UI.wixext/6.0.2

- name: Build
if: runner.os != 'Windows'
working-directory: tools/native-helper
run: cargo build --release --target ${{ matrix.target }}

- name: Build Windows MSI
if: runner.os == 'Windows'
working-directory: tools/native-helper
shell: cmd
run: scripts\build-msi.bat

- name: Package (Linux)
if: runner.os == 'Linux'
working-directory: tools/native-helper
Expand All @@ -69,12 +88,20 @@ jobs:
chmod +x release/masterselects-helper
cd release && tar czf ../${{ matrix.artifact }}.tar.gz *

- name: Upload artifact
- name: Upload Unix artifact
if: runner.os != 'Windows'
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.artifact }}
path: tools/native-helper/${{ matrix.artifact }}.tar.gz

- name: Upload Windows artifact
if: runner.os == 'Windows'
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.artifact }}
path: tools/native-helper/target/wix/*.msi

release:
needs: build
runs-on: ubuntu-latest
Expand All @@ -101,17 +128,19 @@ jobs:
- Local AI bridge for external agents

### Downloads
- **Windows x64 (MSI)**: Upload manually from `tools/native-helper/target/wix/*.msi`
- **Windows x64 (MSI)**: `MasterSelects-NativeHelper-${{ github.event.inputs.version }}-windows-x64.msi`
- **macOS ARM (Apple Silicon)**: `MasterSelects-NativeHelper-macos-arm64.tar.gz`
- **macOS x64 (Intel)**: `MasterSelects-NativeHelper-macos-x64.tar.gz`
- **Linux x64**: `MasterSelects-NativeHelper-linux-x64.tar.gz`

### Notes
- Keep the helper running while using MasterSelects
- Install [yt-dlp](https://github.com/yt-dlp/yt-dlp) if it is not already available on your system
- Windows MSI builds bundle `yt-dlp.exe`; non-Windows archive installs use a bundled `yt-dlp` when present or a system `yt-dlp` on PATH
- Windows MSI is the preferred package for in-place upgrades
- FFmpeg is not bundled with the helper packages
files: |
artifacts/**/*.tar.gz
artifacts/**/*.msi
overwrite_files: true
draft: false
prerelease: false
2 changes: 2 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,8 @@ cd tools/native-helper
cargo run --release
```

Windows-MSI-Builds bundlen `yt-dlp.exe`; Source-Builds und nicht-Windows-Archive nutzen `yt-dlp` neben dem Helper-Binary oder aus `PATH`.

Ports:

- WebSocket: `9876`
Expand Down
3 changes: 2 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -161,11 +161,12 @@ npm run preview # Built output lokal serven

### Native Helper (optional, cross-platform)
```bash
# All platforms (FFmpeg decode/encode + yt-dlp downloads):
# All platforms:
cd tools/native-helper && cargo run --release

# Windows: requires FFMPEG_DIR + LIBCLANG_PATH env vars (see tools/native-helper/README.md)
```
Windows-MSI-Builds bundlen `yt-dlp.exe`; Source-Builds und nicht-Windows-Archive nutzen `yt-dlp` neben dem Helper-Binary oder aus `PATH`.
Ports: WebSocket `9876`, HTTP `9877`

---
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ cargo run --release # WebSocket :9876, HTTP :9877
| **AI Control** | Local HTTP bridge for external agents to steer the running editor |
| **Download** | yt-dlp integration for YouTube, TikTok, Instagram, Twitter/X, Vimeo, and other supported sites |

**Platforms:** Windows, Linux, macOS. Building the Native Helper requires Rust. Downloads also require `yt-dlp`. See [Native Helper docs](tools/native-helper/README.md) for platform-specific setup.
**Platforms:** Windows, Linux, macOS. Building the Native Helper requires Rust. The Windows MSI bundles `yt-dlp.exe`; source builds and non-Windows archive installs use `yt-dlp` from the helper folder or PATH. See [Native Helper docs](tools/native-helper/README.md) for platform-specific setup.

---

Expand Down Expand Up @@ -224,7 +224,7 @@ This is alpha software. Features get added fast, things break.
- Multicam AI is experimental
- Transitions are experimental
- Firefox project storage requires the Native Helper backend
- Video downloads require Native Helper with yt-dlp installed
- Video downloads require Native Helper; the Windows MSI bundles yt-dlp, while source/non-Windows installs need yt-dlp beside the helper or on PATH
- Audio waveforms may not display for some video formats
- Very long videos (>2 hours) may cause performance issues

Expand All @@ -239,7 +239,7 @@ If something breaks, refresh. If it's still broken, [open an issue](https://gith
- **Video:** WebCodecs, MediaBunny, mp4box, HTMLVideo fallback, and experimental FFmpeg WASM export path
- **Audio:** Web Audio API with 10-band live EQ, element-synced playback, drift correction, and waveform extraction
- **AI:** Built-in OpenAI/Cloud or local Lemonade editor chat with 79 exported tools, Native Helper HTTP bridge for Claude Code / external agents, Claude/Anthropic for experimental multicam EDLs, SAM2 via ONNX Runtime, MatAnyone2 via Native Helper, local Whisper via Hugging Face Transformers, and Kie.ai / hosted cloud / PiAPI-backed generation flows
- **Native:** Rust helper for Firefox storage backend, native decode/encode, and yt-dlp downloads
- **Native:** Rust helper for Firefox storage backend, native decode/encode, and bundled/system yt-dlp downloads
- **Storage:** File System Access API on Chrome, Native Helper backend on Firefox, IndexedDB, local project folders with raw media

---
Expand Down
2 changes: 1 addition & 1 deletion docs/Features/Download-Panel.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ Any site that `yt-dlp` can fetch can still be downloaded even if it is not liste
Downloads require the Native Helper for the actual media transfer.

1. The panel asks the helper for available formats
2. The helper runs `yt-dlp`
2. The helper runs the bundled Windows `yt-dlp.exe` or a system `yt-dlp`
3. Progress callbacks feed percent and transfer speed back into the panel
4. The downloaded file is fetched from the helper
5. If a project is open, the file is written into `Downloads/<Platform>/`
Expand Down
18 changes: 10 additions & 8 deletions docs/Features/Native-Helper.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Browser (MasterSelects App)
v
Native Helper (Rust)
|
| yt-dlp (subprocess)
| bundled or system yt-dlp (subprocess)
| File system (direct)
| AI tool forwarding
|
Expand All @@ -63,8 +63,9 @@ The helper will automatically be detected by the app.
### Windows

1. Download the latest Windows MSI from the toolbar or [GitHub Releases](https://github.com/Sportinger/MasterSelects/releases/latest)
2. Run the MSI installer, then launch `masterselects-helper.exe` if it does not auto-start
3. Use `--console` flag to run in terminal mode instead of tray mode
2. Run the MSI installer. It installs `yt-dlp.exe` next to `masterselects-helper.exe`, so downloads do not need a separate `pip install yt-dlp`
3. Launch `masterselects-helper.exe` if it does not auto-start
4. Use `--console` flag to run in terminal mode instead of tray mode

### macOS

Expand Down Expand Up @@ -105,7 +106,7 @@ The toolbar shows the helper status:

Click the indicator for details:
- Helper version
- yt-dlp availability
- yt-dlp availability (bundled next to the helper or installed on PATH)
- Download directory
- Project root
- File system command support
Expand Down Expand Up @@ -234,10 +235,11 @@ cargo build --release

### Downloads not working

1. Check yt-dlp is installed and available on PATH
2. Run `yt-dlp --version` to verify
3. Check helper log output for errors
4. If YouTube reports bot or sign-in blocking, close Chrome completely and retry so yt-dlp can read cookies
1. On Windows, reinstall or update the helper MSI so the bundled `yt-dlp.exe` is present in the install folder
2. For source builds and non-Windows archive installs, check that `yt-dlp` is installed on PATH or placed next to the helper binary
3. Run `yt-dlp --version` or `<helper install folder>\yt-dlp.exe --version` to verify
4. Check helper log output for errors
5. If YouTube reports bot or sign-in blocking, close Chrome completely and retry so yt-dlp can read cookies

### Connection errors

Expand Down
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@
- Times are always in seconds (float)
- The app requires WebGPU — works in Chrome/Edge 113+
- Native Helper (optional): WebSocket on port 9876, HTTP on port 9877
Needed for: YouTube downloads, yt-dlp, FFmpeg encode/decode
Needed for: YouTube downloads via bundled/system yt-dlp, FFmpeg encode/decode
============================================================
-->

Expand Down
5 changes: 3 additions & 2 deletions src/components/common/NativeHelperStatus.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,11 @@ function getInstallGuide(platform: Platform): InstallGuide {
title: 'How to install on Windows',
steps: [
'Open the GitHub releases page and download the newest published MSI.',
'Run the installer and keep the helper running in the system tray.',
'Run the installer. It includes yt-dlp for downloads.',
'Keep the helper running in the system tray.',
'Return to MasterSelects and press Check connection.',
],
note: 'The current helper release includes downloads, Firefox project save/open, and the local AI bridge.',
note: 'The Windows MSI installs the helper and yt-dlp together, so no separate pip or winget step is needed for downloads.',
};
case 'mac':
return {
Expand Down
3 changes: 2 additions & 1 deletion src/components/common/settings/NativeHelperSettings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ function getInstallSteps(platform: Platform): { steps: string[]; command?: strin
return {
steps: [
'Download the newest MSI from GitHub releases.',
'Run the installer and keep the helper running in the system tray.',
'Run the installer. It includes yt-dlp for downloads.',
'Keep the helper running in the system tray.',
'Return here and press Check connection.',
],
};
Expand Down
2 changes: 1 addition & 1 deletion src/services/nativeHelper/releases.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export const NATIVE_HELPER_TARGET_VERSION = '0.3.14';
export const NATIVE_HELPER_TARGET_VERSION = '0.3.15';
export const NATIVE_HELPER_RELEASES_URL = 'https://github.com/Sportinger/MasterSelects/releases';

const GITHUB_RELEASES_API_URL = 'https://api.github.com/repos/Sportinger/MasterSelects/releases?per_page=20';
Expand Down
2 changes: 1 addition & 1 deletion src/version.ts
Original file line number Diff line number Diff line change
Expand Up @@ -363,7 +363,7 @@ export function getChangelogCalendar(
// Known issues and bugs - shown in What's New dialog
// Remove items when fixed
export const KNOWN_ISSUES: string[] = [
'YouTube download requires Native Helper with yt-dlp installed',
'Non-Windows/source Native Helper builds require yt-dlp beside the helper or on PATH',
'Audio waveforms may not display for some video formats',
'Very long videos (>2 hours) may cause performance issues',
];
2 changes: 1 addition & 1 deletion tools/native-helper/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion tools/native-helper/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "masterselects-helper"
version = "0.3.14"
version = "0.3.15"
edition = "2021"
authors = ["MasterSelects Team"]
description = "Local control, storage, and download helper for MasterSelects"
Expand Down
6 changes: 5 additions & 1 deletion tools/native-helper/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,15 @@ cargo build --release
cmd /c scripts\build-msi.bat
```

`scripts\build-msi.bat` downloads the official `yt-dlp.exe` release binary into `target\release` and bundles it into the MSI next to `masterselects-helper.exe`. Installed Windows helpers therefore do not require a separate `pip install yt-dlp` or system PATH setup for downloads.

### Linux / macOS
```bash
cargo build --release
```

Source builds and archive packages look for `yt-dlp` next to the helper binary first, then fall back to `yt-dlp` on `PATH`.

## Running

```bash
Expand All @@ -49,7 +53,7 @@ WebSocket (JSON commands) on port 9876, HTTP server on port 9877.
| Command | Description |
|---------|-------------|
| `ping` | Connection keepalive |
| `info` | System info (helper features, yt-dlp status, project root, AI bridge status) |
| `info` | System info (helper features, bundled/system yt-dlp status, project root, AI bridge status) |
| `register_client` | Register the running MasterSelects editor session with the helper |
| `ai_tool_result` | Return the result of a forwarded AI tool request |
| `list_formats` | List available download formats for a URL |
Expand Down
Loading
Loading