100 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // 1. Sélection des éléments du DOM
 | |
| const vinyl = document.getElementById('vinyl');
 | |
| const audio = document.getElementById('audio');
 | |
| const progress = document.getElementById('progress');
 | |
| const currentTimeEl = document.getElementById('currentTime');
 | |
| const durationEl = document.getElementById('duration');
 | |
| const backwardBtn = document.getElementById('backward');
 | |
| const forwardBtn = document.getElementById('forward');
 | |
| const loopBtn = document.getElementById('loop');
 | |
| 
 | |
| // 2. Variables utiles
 | |
| let isPlaying = false;
 | |
| let isLooping = false;
 | |
| 
 | |
| // sokcet.io & arduino serial info
 | |
| const socket = io();
 | |
| socket.on('position', (position) => {
 | |
|   console.log('recieved position', position);
 | |
| });
 | |
| 
 | |
| // 3. Fonctions
 | |
| 
 | |
| // Fonction pour basculer la lecture
 | |
| function togglePlay() {
 | |
|   if (isPlaying) {
 | |
|     audio.pause();
 | |
|     vinyl.style.animationPlayState = 'paused';
 | |
|   } else {
 | |
|     audio.play();
 | |
|     vinyl.style.animationPlayState = 'running';
 | |
|   }
 | |
|   isPlaying = !isPlaying;
 | |
| }
 | |
| 
 | |
| // Mise à jour de la barre de progression
 | |
| function updateProgress() {
 | |
|   const progressPercent = (audio.currentTime / audio.duration) * 100;
 | |
|   progress.value = progressPercent;
 | |
|   currentTimeEl.textContent = formatTime(audio.currentTime);
 | |
| }
 | |
| 
 | |
| // Fonction pour formater le temps (min:sec)
 | |
| function formatTime(time) {
 | |
|   const minutes = Math.floor(time / 60);
 | |
|   const seconds = Math.floor(time % 60);
 | |
|   return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
 | |
| }
 | |
| 
 | |
| // Fonction pour changer la position de lecture en cliquant sur la barre
 | |
| function setProgress(e) {
 | |
|   const width = progress.clientWidth;
 | |
|   const clickX = e.offsetX;
 | |
|   const duration = audio.duration;
 | |
|   audio.currentTime = (clickX / width) * duration;
 | |
| }
 | |
| 
 | |
| // 4. Événements
 | |
| 
 | |
| // Clique sur le vinyle pour basculer lecture
 | |
| vinyl.addEventListener('click', togglePlay);
 | |
| 
 | |
| // Mise à jour de la barre de progression à chaque changement de temps
 | |
| audio.addEventListener('timeupdate', updateProgress);
 | |
| 
 | |
| // Mise à jour de la durée du titre dès que l'audio est chargé
 | |
| audio.addEventListener('loadedmetadata', () => {
 | |
|   durationEl.textContent = formatTime(audio.duration);
 | |
| });
 | |
| 
 | |
| // Permet de cliquer sur la barre de progression
 | |
| progress.addEventListener('click', setProgress);
 | |
| 
 | |
| // Bouton reculer de 10s
 | |
| backwardBtn.addEventListener('click', () => {
 | |
|   audio.currentTime = Math.max(0, audio.currentTime - 10);
 | |
| });
 | |
| 
 | |
| // Bouton avancer de 10s
 | |
| forwardBtn.addEventListener('click', () => {
 | |
|   audio.currentTime = Math.min(audio.duration, audio.currentTime + 10);
 | |
| });
 | |
| 
 | |
| // Bouton pour activer/désactiver la boucle (LOOP)
 | |
| loopBtn.addEventListener('click', () => {
 | |
|   isLooping = !isLooping;
 | |
|   loopBtn.style.backgroundColor = isLooping ? 'white' : 'transparent';
 | |
|   loopBtn.style.color = isLooping ? '#18344b' : 'white';
 | |
| });
 | |
| 
 | |
| // Lorsque l'audio est terminé, on répète si la boucle est activée
 | |
| audio.addEventListener('ended', () => {
 | |
|   if (isLooping) {
 | |
|     audio.currentTime = 0;
 | |
|     audio.play();
 | |
|   } else {
 | |
|     vinyl.style.animationPlayState = 'paused';
 | |
|     isPlaying = false;
 | |
|   }
 | |
| });
 | 
