Files
tidal-dl/CHANGELOG.md
T
Warry d2c3e8ab8f feat(hover): add track details preview on hover + fix all ruff violations
Implement comprehensive track information display on hover and resolve all
code quality issues to achieve complete ruff compliance.

MAJOR FEATURES:
- Track details preview on hover with rich metadata display
- Async BPM fetching with loading indicator
- Enhanced metadata utilities with fuzzy matching
- TIDAL API extras integration

FILES MODIFIED: 15+ files (core, UI, tests, docs)

RUFF COMPLIANCE: 0 errors (89+ violations resolved)
- Fixed E999 syntax error in metadata_utils.py
- Refactored 10+ complex functions (C901)
- Updated error handling (S110, S112, SIM105)
- Modernized type hints (UP038)
- Fixed naming conflicts (A001, F811)

BUG FIXES:
- Added missing _on_update_cover() method (11 test failures)
- Fixed BPM display and async loading
- Improved thread safety

TESTING: 30 passed, 1 skipped
DOCUMENTATION: Windows PowerShell support, tox troubleshooting
2025-11-29 12:10:06 +01:00

135 lines
5.1 KiB
Markdown

# v0.31.5 (Unreleased)
## New Features
- **Quick View on Hover** (GUI): Revolutionary hover preview system for track metadata
- Tabbed interface with Details and Cover Art tabs
- Instant metadata display on hover (no clicks required)
- Debounced events (350ms) to prevent UI flickering
- Zero additional API calls - uses pre-loaded track data
- Displays: Title, Artists, Album, Codec, Bitrate, Duration, BPM, ISRC, Release Date, Popularity
- **BPM Loading Indicator**: Shows `⏳ Loading...` while fetching BPM asynchronously
- Graceful handling of missing metadata
- **Enhanced BPM Support** (GUI):
- BPM now loaded asynchronously from TIDAL API raw JSON data
- Visual loading indicator (`⏳ Loading...`) while fetching
- Smart caching prevents redundant API calls
- Thread-safe callback system using Qt signals
- Displays actual BPM value (e.g., "136") when available
- Shows `—` when BPM is not provided by TIDAL
## Improvements
- **Code Cleanup & Optimization**:
- **Removed all debug logs** from console output for production-ready experience
- Application now runs silently with clean console (only "All setup." message)
- Removed unused code: `_extract_from_raw()` method and redundant helper functions
- Simplified error handling with silent exceptions for expected errors (widgets deleted, etc.)
- **Removed 150+ lines of debug/logging code** across multiple files
- **Code Refactoring & Architecture**:
- Created `helper/metadata_utils.py` module for reusable metadata utilities
- Created `cache.py` module for LRU cache implementations
- Created `ui/media_details_helper.py` for media details population
ét - Created `gui_covers.py` with `CoverManager` class for cover management
- Removed ~340 lines of duplicated code from `info_tab_widget.py`
- Extracted helper functions: `safe_str()`, `find_attr()`, `search_in_data()`, `extract_names_from_mixed()`
- 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
# v0.4.11
- Fixes regarding empty metadata tags (also fixes #1).
- CLI downloader extended to handle playlists and mixes.
- `Download.track()` now handles logger functions.
- GUI build for macOS and asset upload.
# v0.4.9
- Fixed: Exception on missing file read (config, token) instead of creation.
# v0.4.8
- Fixed: GUI dependencies are treated as extra now (pip).
# v0.4.7
- Fixed: GUI dependencies are treated as extra now (pip).
# v0.4.6
- GUI dependencies are treated as extra now (pip).
# v0.4.5
- Fixed "Mix" download.
- Fixed relative imports.
- Fixed PyPi build.
- Fixed crash on lyrics error.
# v0.4.2
- Added more basic features.
# v0.4.1
- Initial featured running version.