- Improved maintainability and testability of metadata extraction logic
- **gui.py reduced from 2828 to ~2640 lines (-188 lines, -6.6%)**
- All cover-related logic centralized in CoverManager
- **Performance & Stability**:
- Thread-safe track extras cache with automatic cleanup
- **Cover pixmap cache (LRU, 100 entries)** for instant display on re-hover
- **Background cover preloading** when opening playlists (first 50 tracks)
- Smart cache checks before launching download threads
- Skip re-display if cover already shown (0ms overhead)
- Graceful shutdown handling for background workers
- Proper cleanup of event filters on application exit
- Better error handling for widget lifecycle and API failures
- Protected against RuntimeError when widgets deleted during shutdown
- **Fixed BPM display issue**: BPM callback now properly invoked in main thread using Qt signals
- **UI/UX Improvements**:
- BPM field shows loading state instead of blank placeholder
- Immediate visual feedback when hovering tracks
- Smooth asynchronous data loading without blocking UI
- Cache system ensures instant display on re-hover
## Bug Fixes
- **Fixed BPM not displaying**: Corrected callback invocation from worker thread to main thread
- **Fixed Qt threading issues**: Replaced `QMetaObject.invokeMethod` with direct signal-based approach
- **Fixed "widgets deleted during extras apply"**: Changed from QueuedConnection to direct call
- **Fixed race conditions**: Proper thread-safe callback storage and invocation
## Not Displayed (API Limitations)
Certain metadata fields are **not displayed** because they are generally **not provided** by the public TIDAL API and are therefore **not applicable** in this interface:
- ❌ Genres
- ❌ Label
- ❌ Producers
- ❌ Composers
For details, see `docs/missing_metadata.md`.
## Technical Details
- New components: `InfoTabWidget`, `HoverManager`, `TrackInfoFormatter`, `CoverManager`
- Event filtering on tree view viewport for precise hover detection
- Signal-based architecture for decoupled communication
- Qt Signal (`s_invoke_callback`) for thread-safe callback invocation
- Worker thread pattern for async API calls without blocking UI
- Full conformance to AGENTS.md standards (type hints, docstrings, tests)
## Documentation
- Updated `docs/missing_metadata.md` with current API limitations
- Created `docs/feature_hover_info.md` with comprehensive feature documentation
- Added technical architecture diagrams and troubleshooting guides
- Documented BPM loading flow and caching strategy