summaryrefslogtreecommitdiff
path: root/static/player.js
diff options
context:
space:
mode:
Diffstat (limited to 'static/player.js')
-rw-r--r--static/player.js170
1 files changed, 170 insertions, 0 deletions
diff --git a/static/player.js b/static/player.js
new file mode 100644
index 0000000..70b5a6d
--- /dev/null
+++ b/static/player.js
@@ -0,0 +1,170 @@
+audio = null;
+
+// pre-load some icons
+cache_images = new Array(
+ 'music-cached.png',
+ 'music-queued.png',
+ 'loading.gif'
+);
+var img = new Image();
+for(var i = 0; i < cache_images.length; i++) {
+ img.src = '/static/icons/' + cache_images[i];
+}
+
+function MusicListing(type, path, name, cached) {
+ this.type = type;
+ this.path = path;
+ this.name = name ? name : path.split('/').pop();
+ this.a = document.createElement('a');
+ this.a.tag = path;
+
+ this.play = function() {
+ var transcode = document.getElementById('trans_enabled').checked;
+ var trans_from = document.getElementById('trans_from').value;
+ var trans_to = document.getElementById('trans_to').value;
+ var p = path;
+ if(transcode)
+ p += '?decoder=' + trans_from + '&encoder=' + trans_to;
+ log('playing ' + p);
+ change_url('/files/' + p);
+ audio.play();
+ }
+
+ this.cache = function() {
+ var path = '/cache?path=' + encodeURIComponent(this.path) +
+ '&decoder=' + document.getElementById('trans_from').value +
+ '&encoder=' + document.getElementById('trans_to').value;
+ var a = this.a;
+ var ml = this;
+ var xmlhttp = new XMLHttpRequest();
+ a.setAttribute('class', 'file file-queued');
+ xmlhttp.open('GET', path);
+ xmlhttp.send(null);
+ }
+
+ this.get_anchor = function() {
+ var a = this.a;
+ var className = type;
+ if(cached)
+ className += ' file-cached'
+ a.setAttribute('class', className);
+ a.setAttribute('href', '#');
+ a.appendChild(document.createTextNode(this.name));
+ var ml = this;
+
+ a.onclick = function() {
+ if(type == 'dir') {
+ list(path);
+ } else if(type == 'file') {
+ var transcode = document.getElementById('trans_enabled').checked;
+ var trans_from = document.getElementById('trans_from').value;
+ var trans_to = document.getElementById('trans_to').value;
+
+ var p = path;
+ if(transcode) {
+ ml.cache(p);
+ } else {
+ ml.play();
+ }
+ }
+ return false;
+ }
+ return a;
+ }
+}
+
+function set_current(path) {
+ document.getElementById('current-dir').innerHTML = 'Directory: ' + path;
+}
+
+function log(s) {
+ logbox = document.getElementById('logbox');
+ logbox.value += s + '\n';
+ logbox.scrollTop = logbox.scrollHeight;
+}
+
+function change_url(url) {
+ audio.set_src(url);
+
+ var audio_src_url = document.getElementById('audio-src-url');
+ audio_src_url.innerHTML = 'Playing: ' + url.replace('&', '&amp;');
+}
+
+function output_link(obj) {
+ var a = obj.get_anchor();
+
+ var li = document.createElement('li');
+ li.appendChild(a);
+
+ var song_links = document.getElementById('song-links');
+ song_links.appendChild(li);
+}
+
+function list(root) {
+ log('listing ' + root);
+ var xmlhttp = new XMLHttpRequest();
+ xmlhttp.onreadystatechange = function() {
+ if(xmlhttp.readyState == 4) {
+ set_current(root);
+ var json = JSON.parse(xmlhttp.responseText);
+ document.getElementById('song-links').innerHTML = '';
+ // add "up" link
+ if(root.length > 1) {
+ up = root.substr(0, root.lastIndexOf('/'));
+ if(up.length == 0)
+ up = '/';
+ l = new MusicListing('dir', up, '..');
+ output_link(l);
+ }
+ for(var i = 0; i < json.length; i++) {
+ var type = json[i]["type"];
+ var path = json[i]["name"];
+ var name = path.substring(path.lastIndexOf('/')+1);
+ var cached = type == "file" ? json[i]["cached"] : false;
+ var l = new MusicListing(type, path, name, cached);
+ output_link(l);
+ }
+ }
+ }
+
+ path = '/list?directory=' + encodeURIComponent(root);
+ xmlhttp.open('GET', path);
+ xmlhttp.send();
+}
+
+var source = null;
+
+function get_a(path) {
+ var as = document.getElementsByTagName('a');
+ for(var i = 0; i < as.length; i++) {
+ var a = as[i];
+ if(a.tag == path)
+ return a;
+ }
+}
+
+function event_handler(event) {
+ data = JSON.parse(event.data);
+ switch(data['type']) {
+ case 'cached':
+ case 'recoding':
+ log('[' + data['type'] + '] ' + data['path']);
+ var a = get_a(data['path']);
+ if(a)
+ a.setAttribute('class', 'file file-' + data['type']);
+ break;
+ default:
+ log('[event] unknown type: ' + data['type']);
+ }
+}
+
+window.onload = function() {
+ source = new EventSource('/events');
+ source.onopen = function() { log('event source opened'); }
+ source.onmessage = event_handler;
+ source.onerror = function(event) { log('event source error'); }
+ log('event source status: ' + source.readyState);
+
+ audio = new Audio();
+ list('/');
+}