Add offline cache & preload, Save/add-to-playlist UI, Settings page; player stream fallback + progressive-first ordering; protocol-asset feature; refresh Windows installers

This commit is contained in:
Jonathan Sykes
2026-06-14 11:36:01 +08:00
parent 5375843c82
commit 63560a8e61
12 changed files with 766 additions and 35 deletions

View File

@@ -18,6 +18,13 @@ or Node runtime.
- 🎵 **Audio-only mode** — great for music, saves bandwidth
- 📂 **On-device playlists** — create, rename, delete, add/remove videos. Stored
locally as JSON; nothing leaves your machine
- 💾 **Offline cache / preload** — a **Save** button and an **Add to playlist**
button on the now-playing video download a self-contained copy into a permanent
file cache, so it plays instantly and works offline. Videos added to a playlist
are auto-preloaded and kept until you remove them.
-**Settings page** — playback defaults (quality, volume, audio-only) plus cache
management: see storage used, toggle auto-preload, and delete cached videos
individually or all at once
- 🕘 **Watch history**
- ⏯ Full controls: seek, volume, playback speed, quality switching, fullscreen,
next/prev, and keyboard shortcuts (`space`, `←/→`, `f`, `m`)
@@ -57,6 +64,17 @@ The web UI talks to the native side over whichever bridge is present
| `yt.streams { videoId }` | `ytStreams` | `{ ok, data:{ meta, audioUrl, qualities[] } }` |
| `store.load {}` | `storeLoad` | playlists / history / settings |
| `store.save { data }` | `storeSave` | `{ ok }` |
| `cache.download { videoId }` | `cache_download` | downloads a single-file copy into the offline cache |
| `cache.status { videoId }` | `cache_status` | `{ ok, cached, path?, size? }` |
| `cache.list {}` | `cache_list` | `{ ok, items:[{id,size,path}], total }` |
| `cache.delete { videoId }` | `cache_delete` | removes one cached file |
| `cache.clear {}` | `cache_clear` | removes all cached files |
> The offline cache is implemented in the **Tauri (Windows)** shell. Files live
> in `<app_cache_dir>/videos/<videoId>.<ext>` and persist until deleted from the
> Settings page. The frontend falls back to live streaming if a cached file is
> missing, and the cache calls degrade gracefully on shells that don't implement
> them.
Because the bridge is size-limited, the Zig handlers parse `yt-dlp`'s large JSON
and return only the compact fields the UI needs.
@@ -98,6 +116,21 @@ The installer lands in
`src-tauri\target\release\bundle\` (`nsis\*-setup.exe` and `msi\*.msi`).
`yt-dlp.exe` is bundled as an app resource, so the installed app is self-contained.
### One-shot release
`scripts\release.ps1` does the whole flow — build, copy installers into
`.\releases`, then commit and push through WSL git:
```powershell
pwsh -File scripts\release.ps1
```
To only commit + push from WSL (e.g. after building separately):
```bash
bash scripts/push.sh "your commit message"
```
> Already in WSL and just want it running fast? Your WSL is WSLg-enabled, so you
> can instead build the **Linux** (zero-native) target and its window appears on
> your Windows desktop — see [Setup & run](#setup--run). That needs WSL running