mirror of
https://github.com/austinried/subtracks.git
synced 2026-11-10 15:11:58 +01:00
Second review round on the downloads block: - `loaded` was completed upstream of the state flow that publishes the map, so `awaitLoaded()` could return while the map was still the initial empty one and the first window after a cold start would stream a track that is already on disk. The collector now assigns the map before completing, and the map is a plain state flow instead of a lazy eager `stateIn` with a bare touch to start it. - A failed download now deletes its partial file, in both the engine-failure and the recovery paths. A failed row used to protect its own partial bytes from the sweep, and the UI offers no delete for it. - A queued row is left queued when the download URL cannot be resolved yet, instead of being failed. At launch the repository's reconcile can run before the source repository has built its client, and failing there turned a resumable download into a dead one. - The poller only considers the active source's rows, so a queued row belonging to another source no longer keeps it polling the database every second. - `SourceRepository.downloadUri` takes the expected source id and returns null unless it is the active one, so a download cannot be enqueued against the previous server's URL during a source switch. - Tests: a stream with no content length still gets its declared length through the production data source factory (the http half of the chain, which the first round left uncovered), and an engine failure is asserted to leave no partial file. The engine's status mapping now runs as a plain unit test.