/** * Composant AudioPlayer - Intégration complète * Assemble tous les composants du player pour une expérience complète */ import React, { useRef, useEffect, useState } from 'react'; import { usePlayer } from '../hooks/usePlayer'; import { useKeyboardShortcuts } from '../hooks/useKeyboardShortcuts'; import { TrackInfo } from './TrackInfo'; import { PlayPauseButton } from './PlayPauseButton'; import { NextPreviousButtons } from './NextPreviousButtons'; import { ProgressBar } from './ProgressBar'; import { TimeDisplay } from './TimeDisplay'; import { VolumeControl } from './VolumeControl'; import { RepeatShuffleButtons } from './RepeatShuffleButtons'; import { QualitySelector } from './QualitySelector'; import { PlaybackSpeedControl } from './PlaybackSpeedControl'; import { PlayerError } from './PlayerError'; import { PlayerLoading } from './PlayerLoading'; import { cn } from '@/lib/utils'; import type { AudioQuality } from './QualitySelector'; import type { PlaybackSpeed } from './PlaybackSpeedControl'; export interface AudioPlayerProps { className?: string; autoPlay?: boolean; preload?: 'none' | 'metadata' | 'auto'; showQualitySelector?: boolean; showSpeedControl?: boolean; compact?: boolean; } export function AudioPlayer({ className, autoPlay = false, preload = 'metadata', showQualitySelector = true, showSpeedControl = true, compact = false, }: AudioPlayerProps) { const audioRef = useRef(null); const player = usePlayer(audioRef); const [error, setError] = useState(null); const [isLoading, setIsLoading] = useState(false); const [quality, setQuality] = useState('auto'); const [playbackSpeed, setPlaybackSpeed] = useState(1); // Activer les raccourcis clavier useKeyboardShortcuts(player, { enabled: true, seekStep: 5, volumeStep: 5, }); // Gérer le lifecycle de l'élément audio useEffect(() => { const audio = audioRef.current; if (!audio) return; // Configuration initiale audio.preload = preload; audio.autoplay = autoPlay; // Gérer les erreurs const handleError = () => { const error = new Error('Erreur de lecture audio'); setError(error); setIsLoading(false); }; // Gérer le chargement const handleLoadStart = () => { setIsLoading(true); setError(null); }; const handleCanPlay = () => { setIsLoading(false); setError(null); }; // Gérer la vitesse de lecture const updatePlaybackRate = () => { if (audio) { audio.playbackRate = playbackSpeed; } }; audio.addEventListener('error', handleError); audio.addEventListener('loadstart', handleLoadStart); audio.addEventListener('canplay', handleCanPlay); updatePlaybackRate(); return () => { audio.removeEventListener('error', handleError); audio.removeEventListener('loadstart', handleLoadStart); audio.removeEventListener('canplay', handleCanPlay); }; }, [preload, autoPlay, playbackSpeed]); // Mettre à jour la vitesse de lecture quand elle change useEffect(() => { const audio = audioRef.current; if (audio) { audio.playbackRate = playbackSpeed; } }, [playbackSpeed]); const handlePlayPause = () => { if (player.isPlaying) { player.pause(); } else { player.resume(); } }; const handleRetry = () => { setError(null); if (player.currentTrack) { player.play(player.currentTrack); } }; const canGoNext = player.queue.length > 0 && player.currentIndex < player.queue.length - 1; const canGoPrevious = player.queue.length > 0 && player.currentIndex > 0; if (compact) { return (
); } return (
{/* Élément audio HTML - invisible mais nécessaire pour la lecture */}
); } export default AudioPlayer;