progress
This commit is contained in:
parent
c5477f6a87
commit
405dd3d8e9
11 changed files with 2304 additions and 8 deletions
|
|
@ -1 +1 @@
|
|||
{"access_token": "BQCaBh9gPW8L-lpwtIa_-kf-CvTefOwV-f5A8yMnCNfaXeQ0lZ6CPGLuu1KjbHMStvo-OME_Zg2A4oKGs6xXqYhXls3ZYar1kWWJzs9MsjuQsFCNtAEM81i2nLWrDxhauNRqeU8gKc-AcFnyUcf7c0pzcN6y90YUwmmkglHHqeKbiSewtVyHONqqTAwS1uY6eCTcoVWERcGbo0q1o5xl-o684h4xytscwEJ04_OKMzcSCIhKxK9jhwpqa3HX4wgy", "token_type": "Bearer", "expires_in": 3600, "scope": "user-library-read user-read-private playlist-read-private playlist-read-collaborative user-read-email", "expires_at": 1752392248, "refresh_token": "AQDmfQkPCGObfJeTUIbW1hAAwhSqkuHRA3Qh2dqVYMRh0eCkFMQgPNJDDzF8y-BiaVbj80zePkK_XSfYH1aJutMtNbnsqRKWuxP31BTrMc7pdUdbE7Fma4oH8wpDUKdG3MM"}
|
||||
{"access_token": "BQCbD6wcYO1uJ8rNRJ005LXsDHcLXm8r_m3sANOfce5DfPIAKBZKOjYBVXmEU4JIi3D_le1vcMRCkQtQ7Gyu4PQjZ6BpVkzXnH4IWOa-fFiHuHsFOmDPp4DwTzhrI4AB7zGIAh8n_OSrQRcilTycl_fuDwm9hpxaO9S0sOs6WnLZvrxwzGvaAKz3IF1qTY9ZpPQ-mmcYn59CDRi2WUYMkCuuiI4RrpC0DpMyRYBhX2_PyfY5tVeQLj54WSd4xvC4", "token_type": "Bearer", "expires_in": 3600, "scope": "user-library-read user-read-private playlist-read-private playlist-read-collaborative user-read-email", "expires_at": 1752464571, "refresh_token": "AQDmfQkPCGObfJeTUIbW1hAAwhSqkuHRA3Qh2dqVYMRh0eCkFMQgPNJDDzF8y-BiaVbj80zePkK_XSfYH1aJutMtNbnsqRKWuxP31BTrMc7pdUdbE7Fma4oH8wpDUKdG3MM"}
|
||||
|
|
@ -48,3 +48,111 @@ the matching system should be super extensive and robust and professional. at th
|
|||
|
||||
## TODO LIST:
|
||||
|
||||
### ✅ COMPLETED IMPLEMENTATION:
|
||||
|
||||
1. **✅ SpotifyMatchingModal Creation** - Created elegant QDialog with:
|
||||
- Auto-matching section showing top 5 artist suggestions with confidence scores
|
||||
- Manual search section with real-time artist search
|
||||
- Beautiful UI with proper styling matching the app's theme
|
||||
- Background threads for search operations to keep UI responsive
|
||||
|
||||
2. **✅ Spotify Client Enhancement** - Added to `core/spotify_client.py`:
|
||||
- `Artist` dataclass with full metadata (name, image, popularity, genres, etc.)
|
||||
- `search_artists()` method for artist-specific searches
|
||||
- Full integration with existing SpotifyClient architecture
|
||||
|
||||
3. **✅ Artist Suggestion Engine** - Implemented in modal classes:
|
||||
- `ArtistSuggestionThread` for generating auto-suggestions
|
||||
- `ArtistSearchThread` for manual search results
|
||||
- Multiple matching strategies: direct artist search + track combination search
|
||||
- Confidence scoring using existing MusicMatchingEngine
|
||||
|
||||
4. **✅ UI Integration** - Added to `ui/pages/downloads.py`:
|
||||
- **📱 Matched Download buttons** next to all existing download buttons
|
||||
- Purple theme for matched download buttons to distinguish from regular downloads
|
||||
- Individual track matched downloads (SearchResultItem)
|
||||
- Album track matched downloads (TrackItem)
|
||||
- Full album matched downloads (AlbumResultItem)
|
||||
- Proper signal connections and error handling
|
||||
|
||||
5. **✅ Download Flow Integration** - Enhanced DownloadsPage:
|
||||
- `start_matched_download()` method triggers Spotify modal
|
||||
- `start_matched_album_download()` processes entire albums
|
||||
- `_handle_matched_download()` manages artist selection results
|
||||
- Fallback to normal downloads if Spotify auth fails or user cancels
|
||||
|
||||
6. **✅ Transfer Folder Organization** - Implemented complete folder structure:
|
||||
- **Singles**: `Transfer/ARTIST_NAME/ARTIST_NAME - SINGLE_NAME/SINGLE_NAME.flac`
|
||||
- **Albums**: `Transfer/ARTIST_NAME/ARTIST_NAME - ALBUM_NAME/01 TRACK_NAME.flac`
|
||||
- Automatic detection of single vs album tracks using Spotify API
|
||||
- File sanitization for cross-platform compatibility
|
||||
- Conflict resolution with numbered duplicates
|
||||
|
||||
7. **✅ Album vs Single Detection** - Smart logic implementation:
|
||||
- Spotify API track lookup by artist and title
|
||||
- Confidence-based matching to ensure accuracy
|
||||
- Album detection by comparing album name vs track name
|
||||
- Track numbering for album tracks (extensible for full album metadata)
|
||||
|
||||
8. **✅ Cover Art Integration** - Basic implementation:
|
||||
- Downloads artist images as cover.jpg for albums
|
||||
- Proper error handling and duplicate prevention
|
||||
- Extensible for full album artwork via additional Spotify API calls
|
||||
|
||||
9. **✅ Post-Download Processing** - Integrated with existing download completion:
|
||||
- Hooks into download status monitoring at completion detection
|
||||
- Automatically organizes matched downloads to Transfer folder
|
||||
- Preserves original files in downloads folder for now (can be enhanced)
|
||||
- Proper error handling with fallback to normal download flow
|
||||
|
||||
10. **✅ Error Handling & Fallbacks** - Comprehensive safety measures:
|
||||
- Spotify authentication checks before showing modal
|
||||
- Graceful fallback to normal downloads on any errors
|
||||
- User cancellation handling (proceeds with normal download)
|
||||
- File operation error handling
|
||||
- API rate limiting considerations
|
||||
|
||||
### 🔄 IMPLEMENTATION STATUS:
|
||||
|
||||
**Core Features: COMPLETE ✅**
|
||||
- All major functionality implemented and tested for syntax
|
||||
- UI integration complete with proper styling
|
||||
- Signal/slot architecture properly implemented
|
||||
- Error handling and fallbacks in place
|
||||
|
||||
**Folder Structure: COMPLETE ✅**
|
||||
- Transfer directory organization working
|
||||
- Single vs album detection implemented
|
||||
- File sanitization and conflict resolution
|
||||
|
||||
**API Integration: COMPLETE ✅**
|
||||
- Spotify artist search and matching
|
||||
- Existing MusicMatchingEngine integration
|
||||
- Cover art downloading
|
||||
|
||||
**User Experience: COMPLETE ✅**
|
||||
- Elegant modal interface
|
||||
- Responsive background operations
|
||||
- Clear visual feedback and progress indication
|
||||
- Intuitive matched download buttons
|
||||
|
||||
### 🚀 READY FOR TESTING:
|
||||
|
||||
The Spotify matching system is now fully implemented and ready for testing! All core functionality is in place:
|
||||
|
||||
1. **Matched Download Buttons** - Purple 📱 buttons appear next to all download buttons
|
||||
2. **Artist Matching Modal** - Beautiful interface with auto-suggestions and manual search
|
||||
3. **Smart Organization** - Automatic folder structure based on single/album detection
|
||||
4. **Cover Art** - Downloads artist images for albums
|
||||
5. **Error Safety** - Falls back to normal downloads if anything fails
|
||||
|
||||
### 🔧 POTENTIAL ENHANCEMENTS:
|
||||
|
||||
While the core system is complete, future enhancements could include:
|
||||
- Enhanced album artwork (actual album covers vs artist images)
|
||||
- Audio metadata tagging with Spotify data
|
||||
- Track number detection from full album metadata
|
||||
- Bulk re-organization of existing downloads
|
||||
- Advanced matching algorithms with machine learning
|
||||
- Integration with additional music services
|
||||
|
||||
|
|
|
|||
Binary file not shown.
BIN
core/__pycache__/matching_engine.cpython-312.pyc
Normal file
BIN
core/__pycache__/matching_engine.cpython-312.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/spotify_client.cpython-310.pyc
Normal file
BIN
core/__pycache__/spotify_client.cpython-310.pyc
Normal file
Binary file not shown.
Binary file not shown.
|
|
@ -32,6 +32,33 @@ class Track:
|
|||
external_urls=track_data.get('external_urls')
|
||||
)
|
||||
|
||||
@dataclass
|
||||
class Artist:
|
||||
id: str
|
||||
name: str
|
||||
popularity: int
|
||||
genres: List[str]
|
||||
followers: int
|
||||
image_url: Optional[str] = None
|
||||
external_urls: Optional[Dict[str, str]] = None
|
||||
|
||||
@classmethod
|
||||
def from_spotify_artist(cls, artist_data: Dict[str, Any]) -> 'Artist':
|
||||
# Get the largest image URL if available
|
||||
image_url = None
|
||||
if artist_data.get('images') and len(artist_data['images']) > 0:
|
||||
image_url = artist_data['images'][0]['url']
|
||||
|
||||
return cls(
|
||||
id=artist_data['id'],
|
||||
name=artist_data['name'],
|
||||
popularity=artist_data.get('popularity', 0),
|
||||
genres=artist_data.get('genres', []),
|
||||
followers=artist_data.get('followers', {}).get('total', 0),
|
||||
image_url=image_url,
|
||||
external_urls=artist_data.get('external_urls')
|
||||
)
|
||||
|
||||
@dataclass
|
||||
class Playlist:
|
||||
id: str
|
||||
|
|
@ -171,6 +198,25 @@ class SpotifyClient:
|
|||
logger.error(f"Error searching tracks: {e}")
|
||||
return []
|
||||
|
||||
def search_artists(self, query: str, limit: int = 20) -> List[Artist]:
|
||||
"""Search for artists using Spotify API"""
|
||||
if not self.is_authenticated():
|
||||
return []
|
||||
|
||||
try:
|
||||
results = self.sp.search(q=query, type='artist', limit=limit)
|
||||
artists = []
|
||||
|
||||
for artist_data in results['artists']['items']:
|
||||
artist = Artist.from_spotify_artist(artist_data)
|
||||
artists.append(artist)
|
||||
|
||||
return artists
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error searching artists: {e}")
|
||||
return []
|
||||
|
||||
def get_track_features(self, track_id: str) -> Optional[Dict[str, Any]]:
|
||||
if not self.is_authenticated():
|
||||
return None
|
||||
|
|
|
|||
1209
logs/app.log
1209
logs/app.log
File diff suppressed because it is too large
Load diff
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue