ajax.php
changeset 2 860ba7141641
parent 0 c63de9eb7045
child 3 e7447a6044ec
--- a/ajax.php	Sun Mar 23 15:24:06 2008 -0400
+++ b/ajax.php	Sun Mar 23 20:24:33 2008 -0400
@@ -9,5 +9,104 @@
  * This script is in the public domain. Use it for good, not evil.
  */
 
+status('initializing Services_JSON');
+$json = new Services_JSON(SERVICES_JSON_LOOSE_TYPE);
 
+// keep track of playlist refresh
+$playlist_last_refresh = time();
 
+/**
+ * Terminate a request with an error string formatted as JSON.
+ * @param string Error message
+ */
+
+function json_die($msg)
+{
+  global $json;
+  echo $json->encode(array(
+      'mode' => 'error',
+      'error' => $msg
+    ));
+  return true;
+}
+
+function ajax_request_handler($httpd)
+{
+  global $playlist, $mime_types, $json;
+  
+  // Set content type
+  $httpd->header("Content-type: {$mime_types['js']}");
+  
+  // get PATH_INFO
+  $pathinfo = @substr(@substr($_SERVER['REQUEST_URI'], 1), @strpos(@substr($_SERVER['REQUEST_URI'], 1), '/')+1);
+  if ( empty($pathinfo) )
+  {
+    return json_die('No action specified on URI');
+  }
+  
+  $params = explode('/', $pathinfo);
+  $action =& $params[0];
+  switch ( $action )
+  {
+    case 'stop':
+    case 'next':
+    case 'prev':
+      echo dcop_action('player', 'stop');
+      break;
+    case 'play':
+      echo dcop_action('player', 'playPause');
+      break;
+    case 'jump':
+      $tid =& $params[1];
+      if ( !preg_match('/^[0-9]+$/', $tid) )
+      {
+        return die_json('Invalid track ID');
+      }
+      $tid = intval($tid);
+      dcop_action('playlist', "playByIndex $tid");
+      $return = array(
+        'current_track_length' => $playlist[$tid]['length_int'],
+        'current_track_pos' => 0
+      );
+      echo $json->encode($return);
+      break;
+    case 'volume':
+      $volume =& $params[1];
+      if ( !preg_match('/^[0-9]+$/', $volume) )
+      {
+        return die_json('Invalid track ID');
+      }
+      $volume = intval($volume);
+      dcop_action('player', "setVolume $volume");
+      $return = array(
+        'volume' => $volume
+        );
+      echo $json->encode($return);
+      break;
+    case 'refresh':
+      global $playlist_last_refresh, $playlist, $playlist_last_md5;
+      if ( $playlist_last_refresh + 60 < time() )
+      {
+        rebuild_playlist();
+      }
+      $current_track = dcop_action('playlist', 'getActiveIndex');
+      $return = array(
+          'is_playing' => dcop_action('player', 'isPlaying'),
+          'current_track' => $current_track,
+          'volume' => dcop_action('player', 'getVolume'),
+          // include the MD5 of the playlist so that if it changes, the
+          // client can refresh (otherwise things get madly corrupted)
+          'playlist_hash' => $playlist_last_md5
+        );
+      if ( isset($playlist[$current_track]) )
+      {
+        $return['current_track_length'] = $playlist[$current_track]['length_int'];
+        $return['current_track_pos'] = dcop_action('player', 'trackCurrentTime');
+      }
+      echo $json->encode($return);
+      break;
+    default:
+      return json_die("Undefined action: $action");
+  }
+}
+