add quickjs but has bugs
This commit is contained in:
67
spec/quickjs_runtime.md
Normal file
67
spec/quickjs_runtime.md
Normal file
@@ -0,0 +1,67 @@
|
||||
# Feature Specification: QuickJS Runtime Integration for yt-dlp
|
||||
|
||||
## 1. Context & Objective
|
||||
`yt-dlp` increasingly relies on a JavaScript runtime to execute complex decryption scripts (e.g., signature extraction) required by YouTube and other platforms. Without a JS runtime, downloads may fail or be throttled.
|
||||
The objective is to automatically manage the **QuickJS** runtime binary (download, update, store) alongside the existing `yt-dlp` binary and configure the download process to utilize it via environment variable injection.
|
||||
|
||||
## 2. Technical Requirements
|
||||
|
||||
### 2.1. Binary Management
|
||||
The application must manage the QuickJS binary lifecycle identically to how it currently handles `yt-dlp`.
|
||||
|
||||
* **Source Repository:** [https://github.com/quickjs-ng/quickjs](https://github.com/quickjs-ng/quickjs)
|
||||
* **Storage Location:** The user's AppData `bin` directory (same as `yt-dlp`).
|
||||
* Windows: `%APPDATA%\StreamCapture\bin\`
|
||||
* macOS: `~/Library/Application Support/StreamCapture/bin/`
|
||||
* **Unified Naming on Disk:**
|
||||
Regardless of the source filename, the binary must be renamed upon saving to ensure consistent invocation:
|
||||
* **Windows:** `qjs.exe`
|
||||
* **macOS:** `qjs`
|
||||
|
||||
### 2.2. Download & Update Logic
|
||||
* **Check:** On app launch (or `init_ytdlp`), check if `qjs` exists.
|
||||
* **Download:** If missing, fetch the appropriate asset from the latest GitHub release of `quickjs-ng/quickjs`.
|
||||
* *Note:* Logic must detect OS/Arch to pick the correct asset (e.g., `windows-x86_64`, `macos-x86_64/arm64`).
|
||||
* **Permissions:** On macOS/Linux, ensure `chmod +x` is applied.
|
||||
* **Update:** When `update_ytdlp` is triggered, also check/redownload the latest `qjs` binary.
|
||||
|
||||
### 2.3. Execution & Environment Injection
|
||||
To enable `yt-dlp` to find the `qjs` binary without hardcoding absolute paths in the flags (which can be fragile), we will modify the **subprocess environment**.
|
||||
|
||||
* **Command Flag:** Always pass `--js-runtime qjs` to the `yt-dlp` command.
|
||||
* **Environment Modification:**
|
||||
Before spawning the `yt-dlp` child process in Rust, dynamically modify its `PATH` environment variable.
|
||||
* **Action:** Prepend the absolute path of the application's `bin` directory to the system `PATH`.
|
||||
* **Result:** When `yt-dlp` looks for `qjs`, it will find it in the injected `PATH`.
|
||||
|
||||
## 3. Implementation Plan
|
||||
|
||||
### Step 1: Refactor `src-tauri/src/ytdlp.rs`
|
||||
* Rename file/module to `src-tauri/src/binary_manager.rs` (Optional, or just expand `ytdlp.rs`).
|
||||
* Add constants/functions for QuickJS:
|
||||
* `get_qjs_binary_name()`
|
||||
* `download_qjs()`: Similar logic to `download_ytdlp` but parsing QuickJS release assets.
|
||||
|
||||
### Step 2: Update `src-tauri/src/commands.rs`
|
||||
* Update `init_ytdlp` to initialize **both** binaries.
|
||||
* Update `update_ytdlp` to update **both** binaries.
|
||||
|
||||
### Step 3: Update `src-tauri/src/downloader.rs`
|
||||
* In `download_video` and `fetch_metadata`:
|
||||
1. Resolve the absolute path to the `bin` directory.
|
||||
2. Read the current system `PATH`.
|
||||
3. Construct a new `PATH` string: `bin_dir + delimiter + system_path`.
|
||||
4. Configure the `Command`:
|
||||
```rust
|
||||
Command::new(...)
|
||||
.env("PATH", new_path)
|
||||
.arg("--js-runtime")
|
||||
.arg("qjs")
|
||||
...
|
||||
```
|
||||
|
||||
## 4. Acceptance Criteria
|
||||
1. **File Existence:** `qjs.exe` (Win) or `qjs` (Mac) appears in the `bin` folder after app startup.
|
||||
2. **Process Execution:** The logs show `yt-dlp` running successfully.
|
||||
3. **Verification:** If a specific video requires JS interpretation (often indicated by slow downloads or errors without JS), it proceeds smoothly.
|
||||
4. **Clean Logs:** No "PhantomJS not found" or "JS engine not found" warnings in the logs.
|
||||
Reference in New Issue
Block a user