ROADMAP: mark 3.6/3.7 DONE, log search + transcript work (3.9)

Reflect this session's shipped Phase 3 features: comment-viewer
enhancements (3.6), perceptual-hash dedup (3.7), and the beyond-plan
full-text search + transcript tooling (3.9). Update the vs-Tartube table
(+3 'we lead' rows: full-text search, transcript viewer, content-aware
dedup; score 17 ahead / 1 behind / 13 tied), the Recently-shipped list,
and the closing next-moves note (now RSS feed / smart auto-tagging /
Windows-macOS).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Luna 2026-06-07 07:25:18 -07:00
parent a5613b36ae
commit 4800a0fc22

View file

@ -46,12 +46,15 @@ cases maturity. The plan below is now mostly "surpass" work.
| Error classification + suggested fixes | ✅ 9-class + hints | ✅ rescue recipes | Tied | | Error classification + suggested fixes | ✅ 9-class + hints | ✅ rescue recipes | Tied |
| Stability hardening | ✅ crash log + disk-full preflight + hang watchdog + poison-recover locks | partial | We lead | | Stability hardening | ✅ crash log + disk-full preflight + hang watchdog + poison-recover locks | partial | We lead |
| Desktop UI scale | ✅ global egui zoom, persisted | ✅ GTK native | Tied | | Desktop UI scale | ✅ global egui zoom, persisted | ✅ GTK native | Tied |
| Full-text search (titles/desc/transcripts) | ✅ SQLite FTS5 + snippets | ❌ name filter only | We lead |
| Transcript viewer (search + click-to-seek) | ✅ web pane + desktop window | ❌ | We lead |
| Content-aware dedup (perceptual) | ✅ ffmpeg→dHash, duration-bucketed | ❌ ID-only | We lead |
| Maturity / edge cases | ~months | ~years | **Tartube leads** | | Maturity / edge cases | ~months | ~years | **Tartube leads** |
Score: 14 ahead, 1 behind, 13 tied. **Phase 1 (Tartube parity) is Score: 17 ahead, 1 behind, 13 tied. **Phase 1 (Tartube parity) is
complete** — the only thing Tartube still leads on is years-of-edge-cases complete** and several Phase 3 "surpass" features have landed — the only
maturity, which is time, not a feature. Everything below is "surpass" thing Tartube still leads on is years-of-edge-cases maturity, which is
territory plus test/doc investment. time, not a feature.
## Phase 1 — COMPLETE ## Phase 1 — COMPLETE
@ -149,26 +152,26 @@ A "remote library" mode where one yt-offline instance can browse
another's library (read-only) over the same axum API. Useful for a another's library (read-only) over the same axum API. Useful for a
"home archive + travel laptop" setup. "home archive + travel laptop" setup.
### 3.6 Comment viewer enhancements ### 3.6 Comment viewer enhancements — DONE
The comments capture (1.4) already ships a viewer. Surpass Tartube The web comment viewer is now threaded with per-thread collapse/expand,
(which only dumps the raw JSON) with: in-comment full-text search (highlighted), sort (top / newest / oldest),
an uploader (OP) badge, and a "new since last visit" highlight + count
(localStorage per-video timestamp). Sentiment chips were dropped as
low-value. (Comments stay a web-only viewer; the desktop captures them
but points you at the web UI.)
- Threaded display with collapse/expand at any depth. ### 3.7 Library-wide deduplication — DONE
- Full-text search within a video's comments.
- "New since last visit" highlights.
- Sentiment / keyword filter chips.
### 3.7 Library-wide deduplication `maintenance` still finds exact duplicate video IDs; on top of that,
`fingerprint.rs` adds content-aware dedup — ffmpeg keyframe-seek samples
Right now `maintenance` finds duplicates only by yt-dlp video ID — it 6 frames/video → 9×8 grayscale → 64-bit dHash, grouped within a Hamming
catches "you downloaded this exact video twice," but not the same content threshold but only inside a duration-tolerance window (sorted sliding
re-uploaded under a *different* ID (a reupload, a cross-platform mirror, a window + union-find) to stay near-linear. A `video_fingerprint` cache
re-encode). Surpass by perceptual-hashing sampled frames (ffmpeg → dHash) table (keyed by path+mtime like `info_cache`) makes it one-time per video.
and grouping videos whose fingerprints match within a Hamming threshold, Surfaced as a review-only "Similar content" report (background job +
even across IDs/resolutions/encodings. A new `video_fingerprint` cache progress) in both the web and desktop Maintenance views; never
table (keyed by path+mtime like `info_cache`) makes it a one-time cost per auto-deletes. Measured ~0.5 s/video serial (~65 ms across 8 cores).
video; bucket by duration first to keep the comparison sub-quadratic.
### 3.8 Plugin / scripting hook ### 3.8 Plugin / scripting hook
@ -176,6 +179,16 @@ Lua or WASM-based hooks that run on download events: pre-download
filename rewriter, post-download archive uploader, custom metadata filename rewriter, post-download archive uploader, custom metadata
enricher. Inverts the "we hardcode everything" model. enricher. Inverts the "we hardcode everything" model.
### 3.9 Library-wide full-text search + transcript tooling — DONE
Beyond the original plan. A `video_search` FTS5 index over titles,
channels, descriptions, **and subtitle transcripts** (mtime-gated build,
refreshed after every scan; ranked hits with highlighted snippets),
surfaced as a 🔍 search in both UIs. Plus a searchable, click-to-seek
**transcript viewer** — a pane beside the web player (live-highlights the
current line) and a floating desktop window that seeks mpv over IPC —
backed by a shared `vtt` WebVTT/SRT parser.
## Phase 4 — Stretch / blue-sky ## Phase 4 — Stretch / blue-sky
Probably never, or much later. Probably never, or much later.
@ -190,6 +203,19 @@ Probably never, or much later.
Roughly reverse-chronological. Items that closed out a roadmap line. Roughly reverse-chronological. Items that closed out a roadmap line.
- **Transcripts in search** (3.9) — subtitle text folded into the FTS
index so search matches spoken words; FTS5 column-add migration.
- **Perceptual-hash dedup** (3.7) — `fingerprint.rs` (ffmpeg→dHash,
duration-bucketed grouping) + `video_fingerprint` cache; background
"Similar content" review job in both Maintenance views.
- **Library-wide full-text search + transcript viewer** (3.9) — `video_search`
FTS5 index (titles/channels/descriptions); 🔍 search + a click-to-seek,
live-highlighting transcript pane (web) / window (desktop) over a shared
`vtt` parser.
- **Comment viewer enhancements** (3.6) — threaded collapse/expand,
in-comment search, sort, OP badge, new-since-last-visit.
- **Configurable SponsorBlock** — off / mark / remove, global + per-channel
(was a hardcoded `--sponsorblock-mark all`).
- **Hang watchdog + poison-recover locks** (2.5) — SIGKILL a yt-dlp/ffmpeg - **Hang watchdog + poison-recover locks** (2.5) — SIGKILL a yt-dlp/ffmpeg
job silent for 5 min (classified retryable so it re-queues); recover job silent for 5 min (classified retryable so it re-queues); recover
poisoned `WebState` mutexes instead of cascading a panic into a dead poisoned `WebState` mutexes instead of cascading a panic into a dead
@ -245,10 +271,15 @@ Roughly reverse-chronological. Items that closed out a roadmap line.
- **Phase 1** (Tartube parity) is **complete** — kept above for the record. - **Phase 1** (Tartube parity) is **complete** — kept above for the record.
- **Phase 2** is complete: integration tests (2.1), docs site (2.2), - **Phase 2** is complete: integration tests (2.1), docs site (2.2),
error recovery (2.3), restore (2.4), stability hardening (2.5). error recovery (2.3), restore (2.4), stability hardening (2.5).
- **Phase 3** is the "surpass" work now that we're at parity. - **Phase 3** is the "surpass" work now that we're at parity. Shipped so
far: WebSocket progress (3.3), comment viewer (3.6), perceptual-hash
dedup (3.7), and full-text search + transcript tooling (3.9). Still open:
Windows/macOS binaries (3.1), Android (3.2), smart auto-tagging (3.4),
federation (3.5), plugin hooks (3.8).
- **Phase 4** items might be valuable, but commit to nothing. - **Phase 4** items might be valuable, but commit to nothing.
Items inside a phase are loosely ordered by user-visible impact, not strict Items inside a phase are loosely ordered by user-visible impact, not strict
prerequisite. With parity reached, the highest-leverage next moves are prerequisite. With the easy "surpass" wins banked, the highest-leverage
**3.1 (Windows/macOS binaries)** for reach and **3.7 (perceptual-hash remaining moves are **3.1 (Windows/macOS binaries)** for reach and a
dedup)** / **3.6 (comment-viewer)** for features Tartube can't match. **RSS/podcast feed** or **smart auto-tagging (3.4)** for self-contained
features Tartube can't match.