a89c7894cf
Backend: - FastAPI avec PostgreSQL et Redis - Authentification JWT complète - API REST pour musique, playlists, recherche - Streaming audio via yt-dlp - SQLAlchemy 2.0 async Frontend: - Flutter avec thème néon cyberpunk - State management Riverpod - Layout adaptatif desktop/mobile - Lecteur audio avec mini-player Infrastructure: - Docker Compose (PostgreSQL + Redis) - Scripts d'installation automatisés - Scripts de build pour exécutables Fichiers ajoutés: - BUILD_CLIENT_*.bat/sh: Scripts de compilation - BUILD_CLIENT_README.md: Documentation compilation - CHECK_FLUTTER.sh: Vérificateur d'environnement - requirements.txt mis à jour pour Python 3.13 - Modèles SQLAlchemy corrigés (metadata -> extra_metadata) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
5.7 KiB
5.7 KiB
Artist Details Page - Implementation Guide
Overview
Complete Artist Details Page for Spotify Le 2 with neon cyberpunk theme, featuring adaptive layouts for mobile and desktop.
Files Created
1. Provider
frontend/lib/presentation/providers/artist_provider.dartArtistState- Contains artist data, tracks, albums, and loading statesArtistNotifier- Manages artist data fetching and stateartistProvider- Riverpod StateNotifierProviderartistDataProvider- Family provider for specific artist IDs
2. API Endpoints Added
-
frontend/lib/core/constants/api_constants.dart- Added
/music/artistsand/music/albumsendpoints
- Added
-
frontend/lib/infrastructure/datasources/remote/music_api_service.dartgetArtist(String artistId)- Fetch artist detailsgetArtistTopTracks(String artistId)- Fetch artist's top tracksgetArtistAlbums(String artistId)- Fetch artist's albumsgetAlbum(String albumId)- Fetch album detailsgetAlbumTracks(String albumId)- Fetch album tracks
3. Widgets
-
frontend/lib/presentation/widgets/artist/artist_track_tile.dart- Displays track with number, title, duration, and play count
- Animated playing indicator for currently playing track
- Add to queue button
- Neon glow effect for active track
-
frontend/lib/presentation/widgets/artist/artist_album_card.dart- Displays album art, title, release year, and track count
- Gradient border with violet accent
- Horizontal scrollable layout
4. Pages
-
frontend/lib/presentation/pages/artist/artist_details_page.dart- Adaptive entry point (mobile/desktop)
-
frontend/lib/presentation/pages/artist/artist_mobile_page.dart- Vertical scrolling layout
- Hero image with gradient overlay
- Play All button
- Popular tracks section
- Horizontal scrolling albums
- Related tracks section
-
frontend/lib/presentation/pages/artist/artist_desktop_page.dart- Two-column layout
- Larger hero image (220x220)
- Play All button
- Popular tracks in left column
- Albums and related tracks in right column
Features
Visual Design
- Neon Cyberpunk Theme: Cyan, violet, and rose accent colors
- Hero Header: Large artist image with gradient overlay
- Glow Effects: Neon glow on active/hovered elements
- Smooth Animations: Playing indicator, hover states
- Genre Tags: Styled badges for artist genres
Functionality
- Load All Data: Fetches artist, tracks, albums, and recommendations in parallel
- Play All: Plays all tracks from the artist
- Play Track: Plays specific track and sets queue
- Add to Queue: Add individual tracks to queue
- Error Handling: Loading states, error messages, retry functionality
- Responsive Layout: Adapts between mobile (<800px) and desktop (>=800px)
Performance
- Parallel Loading: All artist data fetched simultaneously
- State Management: Efficient Riverpod state handling
- Lazy Loading: Related tracks loaded on demand
- Cached Images: Uses cached_network_image for album art
Usage Example
Navigation
// Navigate to artist details
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => ArtistDetailsPage(
artistId: 'artist-id-here',
),
),
);
Provider Access
// Watch artist state
final artistState = ref.watch(artistProvider);
// Access artist data
final artist = artistState.artist;
final topTracks = artistState.topTracks;
final albums = artistState.albums;
// Load artist data
ref.read(artistProvider.notifier).loadAllArtistData('artist-id');
// Load specific data
ref.read(artistProvider.notifier).loadArtist('artist-id');
ref.read(artistProvider.notifier).loadTopTracks('artist-id');
ref.read(artistProvider.notifier).loadAlbums('artist-id');
Integration with Search
Update search_desktop_page.dart or search_mobile_page.dart:
void _showArtistDetails(Artist artist) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => ArtistDetailsPage(
artistId: artist.id,
),
),
);
}
API Requirements
The backend API should support these endpoints:
GET /api/v1/music/artists/{id}
Response: {
"id": "string",
"name": "string",
"image_url": "string?",
"bio": "string?",
"genres": ["string"],
"popularity": int,
...
}
GET /api/v1/music/artists/{id}/tracks?limit=10
Response: [
{
"id": "string",
"title": "string",
"duration": int?,
"image_url": "string?",
"play_count": int?,
...
}
]
GET /api/v1/music/artists/{id}/albums?limit=20
Response: [
{
"id": "string",
"title": "string",
"release_date": "string?",
"image_url": "string?",
"total_tracks": int,
...
}
]
Theme Integration
The page uses these theme colors from AppColors:
AppColors.primary- Main background (#0A0E27)AppColors.surface- Card background (#1A1F3A)AppColors.cyan- Primary accent (#00F0FF)AppColors.violet- Secondary accent (#BF00FF)AppColors.rose- Tertiary accent (#FF006E)AppColors.onBackground- Primary text (#E0E6FF)AppColors.onSurface- Secondary text (#B0B8D4)AppColors.muted- Muted text (#6A7294)
Dependencies
Ensure these packages are in pubspec.yaml:
dependencies:
flutter:
sdk: flutter
flutter_riverpod: ^2.3.6
cached_network_image: ^3.2.3
equatable: ^2.0.5
dio: ^5.3.2
Future Enhancements
- Biography section with expandable text
- Artist followers count
- Similar artists section
- Concert/tour dates
- Social media links
- Playlists featuring this artist
- Share functionality
- Follow/unfollow artist
- Track duration sorting
- Album filtering by type (single, EP, album)