X-Git-Url: http://git.ieval.ro/?p=app-musicexpo.git;a=blobdiff_plain;f=player.js;h=7adcdd838d4cf4b58754f0174a8f0ca8a2e7f0e8;hp=c81e8fabcecd78ae2b205460ed5162e19f8d1e1a;hb=53fe8e9a125021e64ad9e65eb5afccb527c96138;hpb=2e6185c6246c2e2f6fb213befc518abc33e1ee78 diff --git a/player.js b/player.js index c81e8fa..7adcdd8 100644 --- a/player.js +++ b/player.js @@ -6,7 +6,9 @@ var TYPES = { "MP3": "audio/mpeg" }; -var audio, details, start, data; +var audio, details, start, prev, data; +var hash_to_id = {}, inhibit_handle_hash = false; +var hist = [] function load_song (id) { audio.style.display = "inline"; @@ -24,30 +26,56 @@ function load_song (id) { } details.innerHTML = "Now playing: " + song.artist + " - " + song.title; + inhibit_handle_hash = true; + location.hash = song.hash; + inhibit_handle_hash = false; audio.load(); } function play_random () { start.innerHTML = "Next"; var id = Math.floor(Math.random() * data.length); + hist.push(id); + if(hist.length > 1) + prev.disabled = false; load_song(id); audio.play(); } -function make_onclick_handler (id){ - return function () { - load_song(id); - start.innerHTML = "Next"; - audio.play(); - } +function play_random_after_error () { + hist.pop(); /* Purge offending song from history */ + play_random(); +} + +function play_prev () { + hist.pop(); + var song = hist[hist.length - 1]; + console.log("Will now play: " + song) + if(hist.length <= 1) + prev.disabled = true; + load_song(song); + audio.play(); +} + +function handle_hash(first_run){ + if(!hash_to_id.hasOwnProperty(location.hash) || inhibit_handle_hash) + return; + var id = hash_to_id[location.hash] + if(first_run === true) + hist.push(id) + load_song(id); + start.innerHTML = "Next"; + audio.play(); } window.onload = function () { var container = document.getElementById("player"); - container.innerHTML = '
(or click a song title)
'; + container.innerHTML = '
(or click a song title)
'; audio = document.getElementById("audio"); details = document.getElementById("details"); start = document.getElementById("start_player"); + prev = document.getElementById("prev_player") + prev.disabled = true; data = []; var trs = document.querySelectorAll("tbody tr"); @@ -56,6 +84,7 @@ window.onload = function () { var song = { "artist": tr.getElementsByClassName("artist")[0].textContent, "title": tr.getElementsByClassName("title")[0].textContent, + "hash": tr.getElementsByTagName("a")[0].dataset.hash, "formats": [] }; var formats = tr.getElementsByClassName("formats")[0].getElementsByTagName("a"); @@ -67,11 +96,14 @@ window.onload = function () { }); } data.push(song); - tr.getElementsByClassName("title")[0].onclick = make_onclick_handler(i); + hash_to_id[song.hash] = i; } audio.style.display = "none"; audio.addEventListener('ended', play_random); - audio.addEventListener('error', play_random); + audio.addEventListener('error', play_random_after_error); start.addEventListener('click', play_random); + prev.addEventListener('click', play_prev); + window.onhashchange = handle_hash; + handle_hash(true); };