1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
# 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.
|