171 lines
5 KiB
JavaScript
171 lines
5 KiB
JavaScript
export default class RecordPlayer {
|
|
//--------------------------
|
|
// constructor
|
|
//--------------------------
|
|
constructor() {
|
|
this.audio = null;
|
|
this.tracklist = "";
|
|
this.currentTrackIndex = -1;
|
|
this.trackListCount = 0;
|
|
this.playing = false;
|
|
this.controlText = document.querySelector(".control-text");
|
|
this.tapePlaylist = document.getElementById("playlist");
|
|
this.nextBtn = document.getElementById("control-next");
|
|
this.backBtn = document.getElementById("control-back");
|
|
this.progress = document.querySelector(".audio-progress");
|
|
|
|
this.setUpAudio();
|
|
}
|
|
|
|
setUpAudio() {
|
|
let self = this;
|
|
//create element
|
|
this.audio = document.createElement("audio");
|
|
this.audio.controls = false;
|
|
//set event listners
|
|
this.audio.addEventListener(
|
|
"timeupdate",
|
|
(e) => this.handleTimeUpdate(e),
|
|
false
|
|
);
|
|
|
|
this.audio.addEventListener("ended", () => self.control("next"), false);
|
|
|
|
this.nextBtn.addEventListener("click", () => {
|
|
self.control("next");
|
|
});
|
|
|
|
this.backBtn.addEventListener("click", () => {
|
|
self.control("back");
|
|
});
|
|
}
|
|
|
|
setTrackList(tracklist) {
|
|
this.tracklist = tracklist;
|
|
this.trackListCount = this.tracklist.length;
|
|
this.buildPlaylist(this.tracklist);
|
|
}
|
|
|
|
buildPlaylist(tracklist) {
|
|
//clear playlist
|
|
this.tapePlaylist.innerHTML = "";
|
|
//build playlist ui
|
|
for (var i = 0, length = tracklist.length; i < length; i++) {
|
|
let sleeve = document.createElement("div");
|
|
let select = document.createElement("button");
|
|
sleeve.className = "sleeve";
|
|
sleeve.id = "sleeve_" + i;
|
|
select.id = tracklist[i].file;
|
|
select.className = "selectBtn";
|
|
let recordTitle = document.createElement("label");
|
|
recordTitle.id = "title_" + i;
|
|
recordTitle.innerText = tracklist[i].title;
|
|
let recordAlbum = document.createElement("label");
|
|
recordAlbum.id = "album_" + i;
|
|
recordAlbum.innerText = tracklist[i].album;
|
|
let recordArtist = document.createElement("label");
|
|
recordArtist.id = "artist_" + i;
|
|
recordArtist.innerText = tracklist[i].artist;
|
|
|
|
sleeve.appendChild(select);
|
|
sleeve.appendChild(recordTitle);
|
|
sleeve.appendChild(recordAlbum);
|
|
sleeve.appendChild(recordArtist);
|
|
|
|
this.tapePlaylist.appendChild(sleeve);
|
|
|
|
select.addEventListener("click", (e) => this.handleButton(e), false);
|
|
}
|
|
}
|
|
|
|
playRecord(file) {
|
|
for (var i = 0, length = this.tracklist.length; i < length; i++) {
|
|
let sleeve = document.getElementById("sleeve_" + i);
|
|
let album = document.getElementById("album_" + i);
|
|
let artist = document.getElementById("artist_" + i);
|
|
//handle pause state
|
|
if (file == this.tracklist[i].file) {
|
|
//if index is same, play our pause
|
|
if (i === this.currentTrackIndex) {
|
|
if (this.playing) {
|
|
this.audio.pause();
|
|
sleeve.style.opacity = 0.5;
|
|
this.playing = false;
|
|
return;
|
|
} else {
|
|
console.log("play");
|
|
this.audio.play();
|
|
sleeve.style.opacity = 1;
|
|
this.playing = true;
|
|
return;
|
|
}
|
|
} else {
|
|
//if index is different play next track
|
|
this.currentTrackIndex = i;
|
|
this.controlText.innerText = this.tracklist[i].title;
|
|
sleeve.classList.add("playing");
|
|
sleeve.classList.remove("not-playing");
|
|
album.classList.add("label-playing");
|
|
album.classList.remove("label-notplaying");
|
|
artist.classList.add("label-playing");
|
|
artist.classList.remove("label-notplaying");
|
|
}
|
|
} else {
|
|
sleeve.classList.add("not-playing");
|
|
sleeve.classList.remove("playing");
|
|
album.classList.add("label-notplaying");
|
|
artist.classList.add("label-notplaying");
|
|
}
|
|
}
|
|
|
|
let record =
|
|
"assets/audio/tapes/" +
|
|
this.tracklist[this.currentTrackIndex].tape +
|
|
"/" +
|
|
this.tracklist[this.currentTrackIndex].file;
|
|
|
|
this.audio.src = record;
|
|
this.audio.volume = 0.5;
|
|
this.playing = true;
|
|
this.audio.play();
|
|
}
|
|
|
|
control(task) {
|
|
this.playing = false;
|
|
let fresh = "";
|
|
switch (task) {
|
|
case "next":
|
|
fresh = this.currentTrackIndex + 1;
|
|
if (fresh > this.tracklist.length - 1) fresh = 0;
|
|
|
|
break;
|
|
case "back":
|
|
fresh = this.currentTrackIndex - 1;
|
|
if (fresh < 0) fresh = this.tracklist.length - 1;
|
|
break;
|
|
}
|
|
this.playRecord(this.tracklist[fresh].file);
|
|
}
|
|
|
|
//event handlers
|
|
handleButton(e) {
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
this.playRecord(e.target.id);
|
|
}
|
|
|
|
handleTimeUpdate(e) {
|
|
var s = parseInt(this.audio.currentTime % 60);
|
|
if (s < 10) {
|
|
s = "0" + s;
|
|
}
|
|
var m = parseInt((this.audio.currentTime / 60) % 60);
|
|
if (m < 10) {
|
|
m = "0" + m;
|
|
}
|
|
|
|
var currentProgress = this.audio.currentTime / this.audio.duration;
|
|
var visProgress = 350 * currentProgress;
|
|
this.progress.style.width = visProgress + "px";
|
|
}
|
|
}
|