7 Commits

Author SHA1 Message Date
Sebastian 23508fdc89 mount: fix iPod automount (lsblk flags + udisks suffixed paths)
Two bugs kept the connected iPod from being auto-mounted:

- `lsblk -o PATH,LABEL -n -l -P` is invalid (--pairs and --list are
  mutually exclusive), so device lookup by label always failed with
  "no block device found" — a regression from the earlier parse fix.
  Drop -l.
- udisks mounted the iPod volume at /media/sebastian/IPOD1 because the
  configured directory /media/sebastian/IPOD already exists, so even a
  resolved device failed with AlreadyMounted. The configured mount point
  is now treated as a hint: mounted_path_for() resolves an exact mount or
  the lowest-numbered udisks-suffixed sibling (IPOD → IPOD1) from
  /proc/self/mountinfo, and the sync destination, storage stats, settings
  display and fatsort resolution all use the real mount.

Also harden fatsort: resolve_fatsort_target now refuses to run when the
path is not a mount point, so findmnt can never fall back to the root
filesystem's block device.

Verified on the connected iPod: mounted_path_for → IPOD1,
resolve_block_device → /dev/sdb2, mount_device → "already mounted at
/media/sebastian/IPOD1", UI shows ● mounted with 9.7 GiB free · 92% and
mount point ✓ /media/sebastian/IPOD1.

Bump to 0.3.3.
2026-09-10 20:20:40 +02:00
Sebastian 9366186245 mirror: true overall progress via --check-first + visible scan phase
With SFTP remotes rclone lists the tree while transferring, so the
`Transferred:` total grows during the run: the first ticks showed a
single file's percentage (e.g. 2.9 MiB / 8.6 MiB, 35%) which then
collapsed to 0% once the real 113 GiB total appeared. That is what
looked like "progress per album".

- pass --check-first: rclone finishes the remote listing before any
  transfer starts, so the byte total is final and the gauge is a true
  overall percentage for the whole mirror
- while scanning, no bytes move yet, so the panel now shows
  `Scanning remote · 11,810 items listed` and `0 B / 113 GiB to transfer`
  (parsed from rclone's `Checks: … Listed N`) instead of a bogus 0% bar
- once transfers start the display switches back to percentage +
  bytes + current file

Verified against the real storagebox remote (capped with
RCLONE_MAX_TRANSFER): scan ticks show listed counts climbing to 11,810
with the pending total, then transfers show `9.984 MiB / 113.477 GiB`
with the final denominator and no per-file percentage jumps.

Bump to 0.3.2.
2026-09-10 20:13:23 +02:00
Sebastian 0ffe32ae08 mirror: stop per-file lines resetting the progress gauge to 0%
parse_rclone_stats still accepted rclone's `Transferring:` entries
(`*  a.bin: 25% / 60 MiB, 0 B/s, -`) because they contain " / " and "%".
rclone writes them right after the byte-weighted line on every tick, and
since the last per-file entry is glued to the *next* tick's byte line,
the parsed order per second is: good byte line -> per-file 0% -> (one
second later) glued byte line. The gauge therefore displayed 0% almost
continuously and only ever looked right at the end.

Require a real stats body to start with the transferred byte amount.
Per-file lines now only feed the "current file" display (they already
did, as a fallback) and can no longer touch pct/done/total.

Verified with the real engine + rclone (bwlimit): mirror state now goes
0 -> 25 -> 50 -> 75 -> 100 with proper byte counts. The replay test now
asserts the exact parse sequence [10%, 40%] so a regression fails when a
per-file or file-count line sneaks in as 0%.

Bump to 0.3.1.
2026-09-10 20:03:34 +02:00
Sebastian 42a3f0c35a design pass: responsive layout, clearer cards, better sync/log states
Dashboard:
- DEVICE card: storage is now a compact "276.2 GiB free · 40%" value plus a
  usage bar on its own row (only when it cannot collide with the text) — the
  old "total · free" value was truncated mid-number; gauge labels no longer
  set an explicit fg so ratatui's colour swap keeps them readable over both
  filled and empty bar cells
- LIBRARY card: paths are marked ✓/✗ (missing dirs are a common failure) and
  long values are ellipsized instead of hard-clipped; absolute local
  storagebox sources get the same check
- SYNC STATUS: device names adapt to the card width, statuses go time-only on
  narrow cards, and the summary footer is two compact lines (no trailing "…")
- responsive: sidebar 28/34 cols, compact labels for narrow cards, short
  terminal drops the decorative SYNC PATH card (it previously lost its only
  content row and rendered empty)

Sync tab:
- hero "READY TO SYNC" panel for the selected device (name, firmware, mount
  state, key hint, last sync) instead of a mostly empty LAST SYNC card
- after a run finishes, keep the step timeline visible with final statuses and
  a LAST RUN result banner, plus an "s run again" hint (previously the steps
  were discarded and only a summary line remained)
- steps connected as a timeline

Chrome:
- shared panel/firmware/chip/arrow/key-hint helpers in components; softer
  panel borders (theme::BORDER) and a softer sidebar selection highlight
- title bar reduced to one row and now shows mirror on/off + ready/syncing
  instead of the truncated config path
- logs header shows warning/error counts; cards use one consistent style

Bump to 0.3.0.
2026-09-10 19:55:11 +02:00
Sebastian ed492e7047 release: bump version to 0.2.0
Covers the mount-safety/abort/UI review fixes and the rclone mirror
progress fix. `dap-tui --version` now identifies the build.
2026-09-10 19:46:59 +02:00
Sebastian 88b53e50d1 dashboard: per-player settings, storage usage; drop Config tab
- Remove the separate Config tab (3 tabs now); each player's settings
  (content type, mount point, music folder, fat order, sync command) are shown
  in a PLAYER SETTINGS card on the dashboard
- Show mounted storage on the device card: total/free space (statvfs) plus a
  usage gauge
- Add library + sync-pipeline cards and full-width SYNC PATH chain
- Update keybar/help/README for 3 tabs
2026-08-22 09:57:53 +02:00
Sebastian 16a5a4327e dap-tui: ratatui device-sync dashboard
Full rewrite of dap-sync as a Rust TUI on ratatui:
- Tokyo Night theme, gradient title rule, rounded panels
- Devices sidebar with live mount status + last-sync age
- Dashboard / Sync / Logs / Config tabs
- Live sync engine: rclone mirror, NFC-aware diff, rsync
  progress parsing, podkit + mlove (fatsort) finalize
- Abort-safe subprocess handling, persisted sync state
2026-08-22 09:26:15 +02:00