Shell out to ffprobe (already in the container image) during scan to populate duration_ms per track. Without this, scrubbing/seeking in clients is a no-op because every track is reported as 0ms.
ffprobe failures log a warning and record duration_ms=0 so a single bad file doesn't sink the whole scan.
Tighten the incremental skip to also require duration_ms > 0, so existing libraries scanned before this change get backfilled on the next rescan rather than requiring a wipe.
Test plan
go build ./...
go test -short ./internal/library/...
Rebuild image, rescan, confirm tracks now report nonzero duration and clients can scrub
## Summary
- Shell out to `ffprobe` (already in the container image) during scan to populate `duration_ms` per track. Without this, scrubbing/seeking in clients is a no-op because every track is reported as 0ms.
- ffprobe failures log a warning and record `duration_ms=0` so a single bad file doesn't sink the whole scan.
- Tighten the incremental skip to also require `duration_ms > 0`, so existing libraries scanned before this change get backfilled on the next rescan rather than requiring a wipe.
## Test plan
- [x] `go build ./...`
- [x] `go test -short ./internal/library/...`
- [ ] Rebuild image, rescan, confirm tracks now report nonzero duration and clients can scrub
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
ffprobe(already in the container image) during scan to populateduration_msper track. Without this, scrubbing/seeking in clients is a no-op because every track is reported as 0ms.duration_ms=0so a single bad file doesn't sink the whole scan.duration_ms > 0, so existing libraries scanned before this change get backfilled on the next rescan rather than requiring a wipe.Test plan
go build ./...go test -short ./internal/library/...