mpc: handle ACK responses
[chrome-ext/music-player-client.git] / main.js
diff --git a/main.js b/main.js
index 08efb7289631455ab61597c35011b54d6091429c..88c146f850c6c271ff2caafa0aeb907282b779a7 100644 (file)
--- a/main.js
+++ b/main.js
@@ -3,6 +3,7 @@
 /* Globals to allow easy manipulation via javascript console */
 var mpc;
 var tcpclient;
+var refresh_id = NaN;
 
 function TcpClientSender(tcpclient) {
        this.tcpclient = tcpclient;
@@ -10,6 +11,9 @@ function TcpClientSender(tcpclient) {
 TcpClientSender.prototype.send = function(data, cb) {
        this.tcpclient.sendMessage(data, cb);
 }
+TcpClientSender.prototype.poll = function() {
+       this.tcpclient.poll();
+}
 
 function tramp_mpc_recv(data) {
        mpc.recv(data);
@@ -24,12 +28,13 @@ window.onload = function() {
                'sync',
        ];
        var sync_keys = [
-               'host', 'port',
+               'host', 'port', 'refresh',
        ];
        var options = {
                'host': '192.168.0.2',
                'port': 6600,
                'sync': true,
+               'refresh': 5,
        };
 
        chrome.storage.local.get(local_keys, function(settings) {
@@ -77,7 +82,10 @@ function mpc_connect(host, port) {
                tcpclient.addResponseListener(tramp_mpc_recv);
                mpc = new Mpc(mpc_sender, update_ui);
                console.log('connected to ' + host + ':' + port);
+               console.log('protip: use the "mpc" object to poke mpd directly.\n' +
+                           'you can also do mpc.set_debug(3) to see traffic');
                mpc_refresh();
+               update_refresh_timer();
        });
 }
 
@@ -142,6 +150,19 @@ function show_page(page) {
        }
 }
 
+function do_refresh() {
+       mpc_refresh();
+       refresh_id = window.setTimeout(do_refresh, window['opts_refresh'].value * 1000);
+}
+
+function update_refresh_timer() {
+       if (!isNaN(refresh_id))
+               window.clearTimeout(refresh_id);
+       var rate = window['opts_refresh'].value * 1000;
+       if (rate > 0)
+               refresh_id = window.setTimeout(do_refresh, rate);
+}
+
 function update_local_settings() {
        var setting = {};
        setting[this.id] = this.checked;
@@ -153,6 +174,12 @@ function update_sync_settings() {
        setting[this.id] = this.value;
        var storage = sync_storage(window['opts_sync'].checked);
        storage.set(setting);
+
+       switch (this.id) {
+       case 'refresh':
+               update_refresh_timer();
+               break;
+       }
 }
 
 function init_ui(local_keys, sync_keys, options) {
@@ -165,16 +192,22 @@ function init_ui(local_keys, sync_keys, options) {
 
        /* Setup control tab */
        ui_mpc_status = document.getElementById('status');
-       ui_mpc_metadata = document.getElementById('metadata');
        [
                'consume', 'next', 'pause', 'play', 'previous', 'random', 'repeat',
                'seekcur', 'setvol', 'single', 'stop',
        ].forEach(function(id) {
                var ele = window['ui_mpc_' + id] = document.getElementById(id);
-               ele.onclick = window['tramp_mpc_' + id];
+               ele.onchange = ele.onclick = window['tramp_mpc_' + id];
                ele.title = id;
        });
 
+       /* Setup metadata tab */
+       [
+               'album', 'artist', 'date', 'file', 'title',
+       ].forEach(function(id) {
+               window['ui_mpc_metadata_' + id] = document.getElementById('metadata.' + id);
+       });
+
        /* Setup options tab */
        document.getElementById('connect').onclick = mpc_connect;
        local_keys.forEach(function(id) {
@@ -211,17 +244,27 @@ function update_ui(state, cmd) {
                return;
        }
 
-       if ('file' in state) {
-               // Hack: should be a real object.
-               ui_mpc_metadata.innerText = state['file'];
-               return;
-       }
+       // Hack: should be a real object.
+       ui_mpc_metadata_album.innerText = state.Album;
+       ui_mpc_metadata_artist.innerText = state.Artist;
+       ui_mpc_metadata_title.innerText = state.Title;
+       ui_mpc_metadata_date.innerText = state.Date;
+       ui_mpc_metadata_file.innerText = state.file;
+
+       var time;
+       if ('time' in state)
+               // When stopped, there is no time field at all.
+               time = state.time.split(':');
+       else
+               time = [0, 0];
+       window.ui_mpc_seekcur.max = time[1];
+       window.ui_mpc_seekcur.value = time[0];
+       percent = Math.floor((0.0 + time[0]) * 100 / (0.0 + time[1]));
+       window.ui_mpc_seekcur.title = 'seekcur (' + percent + '%)';
 
-       var time = state.time.split(':');
-       window['ui_mpc_seekcur'].max = time[1];
-       window['ui_mpc_seekcur'].value = time[0];
+       window.ui_mpc_setvol.value = state.volume;
+       window.ui_mpc_setvol.title = 'setvol (' + state.volume + '%)';
 
-       window['ui_mpc_setvol'].value = state.volume;
        [
                'consume', 'random', 'repeat', 'single',
        ].forEach(function(id) {