Fixes #508
Summary
The System page's Storage card previously reported only the disk hosting the application — in Docker/NAS setups that's a small boot/app device (e.g. a 4 GB USB DOM), while the audiobook library lives on a separate mount that was never shown. This adds per-disk reporting so the System page shows available space for the System disk, the App Data (config) volume, and every configured root folder.
Changes
Added
GET /api/v1/system/storagenow returns adisks[]array with an independently-measured entry for the System disk (container root, e.g.docker.imgon Unraid), the App Data disk (config volume holding the database/logs/cache), and each configured root folder (one row per folder, no dedupe). Missing or inaccessible paths yield anunavailableentry instead of failing the request.- System page Storage card renders these as a stacked per-disk list: label + mount point, a full-width usage bar, and free of total per row.
IDiskSpaceProbeseam abstracting disk measurement — WindowsGetDiskFreeSpaceEx(handles drive paths, mounted-folder junctions, and UNC/NAS shares) with aDriveInfo/statvfs fallback on Unix — so NAS roots are measured and the logic is unit-testable.- Defensive clamping of used bytes/percentage for filesystems that report free space exceeding total (reserved blocks, over-provisioning, ZFS/Btrfs, network shares).
Changed
- Legacy top-level
StorageInfofields are retained for compatibility but now describe the App Data disk (config volume);driveNamecarries that path (wasDriveInfo.Name, e.g./). Per-disk detail is indisks[]. API consumers relying on these fields should note the changed meaning. ProgressBar's size formatter gains aTBunit (multi-terabyte mounts previously displayed as thousands of GB).
Fixed
- System page Storage no longer reports only the application/boot device — it reflects the disk(s) where the lib...
Automated Canary build