2025-12-03 21:56:50 +00:00
# Player Feature
## Vue d'ensemble
Le module Player fournit une solution complète de lecture audio pour l'application VEZA. Il inclut tous les composants nécessaires pour une expérience de lecture audio complète et moderne.
## Architecture
### Structure des fichiers
```
features/player/
├── components/ # Composants UI
│ ├── AudioPlayer.tsx # Composant principal (intégration complète)
│ ├── MiniPlayer.tsx # Version compacte du player
│ ├── TrackInfo.tsx # Affichage des informations de la piste
│ ├── PlayPauseButton.tsx # Bouton play/pause
│ ├── NextPreviousButtons.tsx # Boutons next/previous
│ ├── ProgressBar.tsx # Barre de progression
│ ├── TimeDisplay.tsx # Affichage du temps
│ ├── VolumeControl.tsx # Contrôle du volume
│ ├── RepeatShuffleButtons.tsx # Boutons repeat/shuffle
│ ├── QualitySelector.tsx # Sélecteur de qualité
│ ├── PlaybackSpeedControl.tsx # Contrôle de vitesse
│ ├── PlayerError.tsx # Affichage des erreurs
│ └── PlayerLoading.tsx # État de chargement
├── hooks/ # Hooks React
│ ├── usePlayer.ts # Hook principal
│ ├── useKeyboardShortcuts.ts # Raccourcis clavier
│ └── useUsernameAvailability.ts # (auth feature)
├── store/ # State management
│ └── playerStore.ts # Store Zustand
├── services/ # Services
│ └── playerService.ts # Service audio
├── types.ts # Types TypeScript
└── index.ts # Exports publics
```
## Utilisation
### Composant principal AudioPlayer
```tsx
import { AudioPlayer } from '@/features/player';
function MyComponent() {
return (
< AudioPlayer
autoPlay={false}
preload="metadata"
showQualitySelector={true}
showSpeedControl={true}
compact={false}
/>
);
}
```
### Props du AudioPlayer
- `className?: string` - Classes CSS personnalisées
- `autoPlay?: boolean` - Lecture automatique (défaut: false)
- `preload?: 'none' | 'metadata' | 'auto'` - Stratégie de préchargement (défaut: 'metadata')
- `showQualitySelector?: boolean` - Afficher le sélecteur de qualité (défaut: true)
- `showSpeedControl?: boolean` - Afficher le contrôle de vitesse (défaut: true)
- `compact?: boolean` - Mode compact (défaut: false)
### MiniPlayer
```tsx
import { MiniPlayer } from '@/features/player';
function MyComponent() {
const [isVisible, setIsVisible] = useState(false);
return (
< MiniPlayer
isVisible={isVisible}
onToggle={() => setIsVisible(false)}
onClose={() => setIsVisible(false)}
position="bottom"
/>
);
}
```
### Hook usePlayer
```tsx
import { usePlayer } from '@/features/player';
function MyComponent() {
const audioRef = useRef< HTMLAudioElement > (null);
const player = usePlayer(audioRef);
// Utiliser l'état et les contrôles
const { currentTrack, isPlaying, play, pause } = player;
return (
< div >
{currentTrack & & < p > {currentTrack.title}< / p > }
< button onClick = {isPlaying ? pause : ( ) = > play()}>
{isPlaying ? 'Pause' : 'Play'}
< / button >
< / div >
);
}
```
### Raccourcis clavier
Les raccourcis clavier sont activés automatiquement dans `AudioPlayer` :
- `Espace` : Play/Pause
- `Flèche gauche` : Reculer de 5 secondes
- `Flèche droite` : Avancer de 5 secondes
- `Flèche haut` : Augmenter le volume
- `Flèche bas` : Diminuer le volume
## Composants individuels
### TrackInfo
Affiche les informations de la piste (titre, artiste, cover, métadonnées).
```tsx
import { TrackInfo } from '@/features/player';
2025-12-13 02:34:34 +00:00
< TrackInfo track = {track} showCover = {true} coverSize = "md" showMetadata = {true} / > ;
2025-12-03 21:56:50 +00:00
```
### PlayPauseButton
Bouton pour contrôler la lecture/pause.
```tsx
import { PlayPauseButton } from '@/features/player';
< PlayPauseButton
isPlaying={isPlaying}
onClick={handlePlayPause}
size="md"
variant="default"
2025-12-13 02:34:34 +00:00
/>;
2025-12-03 21:56:50 +00:00
```
### ProgressBar
Barre de progression avec interaction drag et seek.
```tsx
import { ProgressBar } from '@/features/player';
< ProgressBar
currentTime={currentTime}
duration={duration}
onSeek={handleSeek}
showTooltip={true}
2025-12-13 02:34:34 +00:00
/>;
2025-12-03 21:56:50 +00:00
```
### VolumeControl
Contrôle du volume avec slider et bouton mute.
```tsx
import { VolumeControl } from '@/features/player';
< VolumeControl
volume={volume}
muted={muted}
onVolumeChange={setVolume}
onMuteToggle={toggleMute}
showValue={true}
showSlider={true}
2025-12-13 02:34:34 +00:00
/>;
2025-12-03 21:56:50 +00:00
```
### QualitySelector
Sélecteur de qualité audio.
```tsx
import { QualitySelector } from '@/features/player';
< QualitySelector
currentQuality="high"
onQualityChange={setQuality}
availableQualities={['auto', 'medium', 'high']}
2025-12-13 02:34:34 +00:00
/>;
2025-12-03 21:56:50 +00:00
```
### PlaybackSpeedControl
Contrôle de la vitesse de lecture.
```tsx
import { PlaybackSpeedControl } from '@/features/player';
< PlaybackSpeedControl
currentSpeed={1}
onSpeedChange={setSpeed}
availableSpeeds={[0.5, 1, 1.5, 2]}
2025-12-13 02:34:34 +00:00
/>;
2025-12-03 21:56:50 +00:00
```
## State Management
Le player utilise Zustand pour la gestion d'état globale. Le store est persistant (localStorage).
```tsx
import { usePlayerStore } from '@/features/player';
const { currentTrack, isPlaying, volume, setVolume } = usePlayerStore();
```
## Services
### AudioPlayerService
Service pour gérer l'élément audio HTML directement.
```tsx
import { audioPlayerService } from '@/features/player';
// Initialiser avec un élément audio
audioPlayerService.initialize(audioElement);
// Charger une piste
await audioPlayerService.loadTrack(track);
// Contrôles
await audioPlayerService.play();
audioPlayerService.pause();
audioPlayerService.seek(30); // 30 secondes
audioPlayerService.setVolume(0.5); // 50%
```
## Types
### Track
```typescript
interface Track {
2025-12-26 08:54:51 +00:00
id: string; // UUID from backend
2025-12-03 21:56:50 +00:00
title: string;
artist?: string;
album?: string;
duration: number;
url: string;
cover?: string;
genre?: string;
}
```
### PlayerState
```typescript
interface PlayerState {
currentTrack: Track | null;
isPlaying: boolean;
currentTime: number;
duration: number;
volume: number;
muted: boolean;
queue: Track[];
currentIndex: number;
repeat: 'off' | 'track' | 'playlist';
shuffle: boolean;
}
```
## Tests
Tous les composants incluent des tests unitaires avec une couverture ≥ 80%. Des tests end-to-end sont également disponibles dans `__tests__/player.e2e.test.tsx` .
## Accessibilité
Tous les composants sont accessibles avec :
2025-12-13 02:34:34 +00:00
2025-12-03 21:56:50 +00:00
- Support des lecteurs d'écran (ARIA labels)
- Navigation au clavier
- Focus visible
- Rôles ARIA appropriés
## Performance
- Lazy loading des composants
- Mémoization des callbacks
- Optimisation des re-renders
- Persistance intelligente du state
## Compatibilité
- Navigateurs modernes (Chrome, Firefox, Safari, Edge)
- Support mobile (iOS, Android)
- Dark mode
- Responsive design