catacomb/src
Luna de122817af Desktop: shuffle + library backup + theme contrast fixes
Three asks the user surfaced after this session's web-UI wave: bring
the desktop UI to parity with what shipped over there, and fix the
theme contrast bugs where button labels disappeared on certain
themes.

Shuffle (desktop)
- 🎲 button next to ⟳ Rescan in the top bar.
- New `App::shuffle_play` mirrors the web logic: pick a random video
  from {unwatched + has video_path}, fall back to {any downloaded
  video} when everything's been watched, status message either way.
- Uses `rand::seq::SliceRandom::choose` — `rand` was already a
  dependency (via hash_password).
- Plays via the existing `play_with_tracking` path so mpv IPC +
  resume position both work.

Library backup (desktop)
- New "💾 Save library backup…" button under a new "Backup" section
  in the Settings panel.
- Opens an rfd save dialog off the UI thread (mirroring the existing
  cookies file-picker pattern), default filename
  `yt-offline-<unix-ts>.db`.
- New `backup_save_tx/rx` mpsc channel; `update()` polls it and
  `std::fs::copy`s `yt-offline.db` into the chosen destination,
  surfacing the byte count in the status line.

Theme contrast
- Root cause: four of the seven themes set `override_text_color`
  globally, which shadows the per-widget `fg_stroke.color`. That
  meant the "active" widget state (e.g. Dracula's light-purple
  button) rendered light-grey text on a light background —
  invisible. Trans was the worst offender: hot-pink override on
  a light-pink inactive button.
- Fix: set `override_text_color = None` on dracula, trans,
  emo_nocturnal, and emo_coffin. Each already had per-widget
  fg_stroke colours tuned for high contrast against the matching
  bg_fill — those just weren't being used.
- Trans theme additionally gets a pure-black `inactive.fg_stroke`
  (over the light pink button) and a darker `noninteractive.fg_stroke`
  (over the pale pink panel) for maximum legibility. Emo Scene Queen
  was already correct (no override) and stays as-is.

55 unit tests still pass.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 03:09:50 -07:00
..
web_ui Shuffle button: play a random unwatched video 2026-05-25 22:36:27 -07:00
app.rs Desktop: shuffle + library backup + theme contrast fixes 2026-05-26 03:09:50 -07:00
config.rs Add bundled yt-dlp, music library, Plex metadata, sort by date; security + perf hardening 2026-05-23 04:54:26 -07:00
database.rs Channel folder hierarchy (Tartube parity 1.2) 2026-05-25 22:07:42 -07:00
download_options.rs Per-video state flags + smart folders + comments capture (Tartube parity 1.3/1.4) 2026-05-25 21:57:52 -07:00
downloader.rs Per-channel download options (Tartube parity Phase 1.1) 2026-05-25 10:47:57 -07:00
library.rs Channel folder hierarchy (Tartube parity 1.2) 2026-05-25 22:07:42 -07:00
main.rs Per-channel download options (Tartube parity Phase 1.1) 2026-05-25 10:47:57 -07:00
maintenance.rs Add bundled yt-dlp, music library, Plex metadata, sort by date; security + perf hardening 2026-05-23 04:54:26 -07:00
platform.rs Upload date in UI; extract HTML_UI; Twitch clips mode; DB connection pool 2026-05-25 01:17:08 -07:00
plex.rs Add multi-platform support: TikTok, Twitch, Vimeo, Bandcamp, SoundCloud, Odysee 2026-05-24 22:16:40 -07:00
stats.rs Add statistics view, editable source_url, rewrite security audit 2026-05-23 05:34:29 -07:00
theme.rs Desktop: shuffle + library backup + theme contrast fixes 2026-05-26 03:09:50 -07:00
web.rs Per-folder "Check all" action + DB backup download 2026-05-25 22:11:01 -07:00
ytdlp_bin.rs Switch bundled yt-dlp to a Python venv with curl_cffi for impersonation 2026-05-24 23:17:27 -07:00