- Show full-screen downloading modal with progress bar, percent and KB detail, cancel button
- Track dl_total/dl_expected without LVGL locks, update via ui_timer (200ms)
- Normalize audio URLs (relative /api/files/ -> PB prefix), grow PSRAM fetch buffer 64K->600K, handle timeouts and require 95% of Content-Length
- Persist per-episode playback position in state.json positions map, restore on select_ep/go_next/go_prev
- Save position periodically (5s), on pause, on hide, and on natural finish (clears completed)
- Fix seek on resume using byte estimate and total_decoded_samples correction
- Verified symbols: 111 undefined, all exported
- pos_sec integer division bug samples/hz ==0
- use total_decoded_samples / hz
- reset last_pct on select/start
- document playback stack overflow fix and ID3 skip
Tested: fetch 37/232, download 4.3MB, playback open_stream ok no crash, progress should now show