-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscript.js
126 lines (116 loc) · 3.79 KB
/
script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
let currentMusic = 0;
let songData = []; //this global variable stores song data
const music = document.querySelector("#audio");
const slider = document.querySelector(".slider");
const songName = document.querySelector(".song-name");
const artistName = document.querySelector(".artist-name");
const disk = document.querySelector(".disk");
const currentTime = document.querySelector(".current-time");
const songDuration = document.querySelector(".song-duration");
const playBtn = document.querySelector(".play-btn");
const forwardBtn = document.querySelector(".forward-btn");
const backwardBtn = document.querySelector(".backward-btn");
playBtn.addEventListener('click', ()=>{
if(playBtn.classList.contains('pause')){
music.pause();
}else{
music.play();
}
playBtn.classList.toggle('pause');
disk.classList.toggle('play');
})
//alternative code for toggle function
// playBtn.addEventListener('click', ()=>{
// if(music.paused){
// music.play();
// playBtn.classList.add('paused');
// disk.classList.add('play');
// }else {
// music.pause();
// playBtn.classList.remove('pause');
// disk.classList.remove('play');
// }
// });
// setting up music to be played:
const setMusic = (i)=>{
slider.value = 0; //range value set to 0
//using data from the JSON file
const song = songData[i];
currentMusic = i;
music.src = song.path;
songName.innerHTML = song.name;
artistName.innerHTML = song.artist;
disk.style.backgroundImage = `url('${song.cover}')`;
currentTime.innerHTML = '00:00';
//without the setTimeOut function, there will be a slight delay when setting up the music source and accessing its duration
// setTimeout(() => {
// slider.max = music.duration;
// songDuration.innerHTML = formatTime(music.duration);
// }, 300);
//listening for 'loadedmetadata' event on the music element which is fired when the duration and other metadata of the audio have been loaded.
music.addEventListener('loadedmetadata', ()=>{
slider.max = music.duration;
songDuration.innerHTML = formatTime(music.duration);
});
};
// Fetch the JSON file and load the song data
fetch('songList.json')
.then(response => response.json())
.then(data=>{
//checking if JSON is being loaded
console.log(data);
songData = data; //assign the data to the global variable
setMusic(9); //call setMusic after the data is loaded
})
//error handling
.catch(error => {
console.error('Error loading JSON file', error);
});
//formatting the song duration to mins and seconds format
const formatTime = (time)=>{
let min = Math.floor(time / 60);
if(min<10){
min = `0${min}`
}
let sec = Math.floor(time % 60);
if(sec < 10){
sec = `0${sec}`
}
return `${min} : ${sec}`;
}
//slider
setInterval(() => {
slider.value = music.currentTime;
currentTime.innerHTML = formatTime(music.currentTime);
//when current time = slider's max time value (when the song ends), move to the next item
if(Math.floor(music.currentTime) == Math.floor(slider.max)){
forwardBtn.click();
}
}, 500)
slider.addEventListener('change', ()=>{
music.currentTime =slider.value;
})
const playMusic =()=>{
music.play();
playBtn.classList.remove('pause');
disk.classList.add('play');
}
//forward and backward button functions
forwardBtn.addEventListener('click', ()=>{
if(currentMusic >= songData.length - 1){
currentMusic = 0;
}else{
currentMusic++;
}
setMusic(currentMusic);
playMusic();
});
backwardBtn.addEventListener('click', ()=>{
if(currentMusic <= 0){
currentMusic = songData.length - 1;
}else{
currentMusic--;
}
setMusic(currentMusic);
playBtn.click();
})