chiark / gitweb /
Empty back= should be treated as if absent
[disorder] / server / lookup.c
index cb28f2c292e44a2ccf201d2f0fb264036488510a..6dc254cdee33c30d96f4c16b8a27409e18f9c737 100644 (file)
@@ -28,6 +28,9 @@
 /** @brief Cached data */
 static unsigned flags;
 
+/** @brief Map of hashes to queud data */
+static hash *queuemap;
+
 struct queue_entry *dcgi_queue;
 struct queue_entry *dcgi_playing;
 struct queue_entry *dcgi_recent;
@@ -43,21 +46,29 @@ rights_type dcgi_rights;
 int dcgi_enabled;
 int dcgi_random_enabled;
 
+static void queuemap_add(struct queue_entry *q) {
+  if(!queuemap)
+    queuemap = hash_new(sizeof (struct queue_entry *));
+  for(; q; q = q->next)
+    hash_add(queuemap, q->id, &q, HASH_INSERT_OR_REPLACE);
+}
+
 /** @brief Fetch cachable data */
 void dcgi_lookup(unsigned want) {
   unsigned need = want ^ (flags & want);
   struct queue_entry *r, *rnext;
-#if 0
-  const char *dir, *re;
-#endif
   char *rs;
 
   if(!dcgi_client || !need)
     return;
-  if(need & DCGI_QUEUE)
+  if(need & DCGI_QUEUE) {
     disorder_queue(dcgi_client, &dcgi_queue);
-  if(need & DCGI_PLAYING)
+    queuemap_add(dcgi_queue);
+  }
+  if(need & DCGI_PLAYING) {
     disorder_playing(dcgi_client, &dcgi_playing);
+    queuemap_add(dcgi_playing);
+  }
   if(need & DCGI_NEW)
     disorder_new_tracks(dcgi_client, &dcgi_new, &dcgi_nnew, 0);
   if(need & DCGI_RECENT) {
@@ -69,26 +80,11 @@ void dcgi_lookup(unsigned want) {
       dcgi_recent = r;
       r = rnext;
     }
+    queuemap_add(dcgi_recent);
   }
   if(need & DCGI_VOLUME)
     disorder_get_volume(dcgi_client,
                         &dcgi_volume_left, &dcgi_volume_right);
-#if 0
-  /* DCGI_FILES and DCGI_DIRS are looking obsolete now */
-  if(need & (DCGI_FILES|DCGI_DIRS)) {
-    if(!(dir = cgi_get("directory")))
-      dir = "";
-    re = cgi_get("regexp");
-    if(need & DCGI_DIRS)
-      if(disorder_directories(dcgi_client, dir, re,
-                              &dirs, &ndirs))
-        ndirs = 0;
-    if(need & DCGI_FILES)
-      if(disorder_files(dcgi_client, dir, re,
-                        &files, &nfiles))
-        nfiles = 0;
-  }
-#endif
   if(need & DCGI_RIGHTS) {
     dcgi_rights = RIGHT_READ;  /* fail-safe */
     if(!disorder_userinfo(dcgi_client, disorder_user(dcgi_client),
@@ -102,9 +98,28 @@ void dcgi_lookup(unsigned want) {
   flags |= need;
 }
 
+/** @brief Locate a track by ID */
+struct queue_entry *dcgi_findtrack(const char *id) {
+  struct queue_entry **qq;
+
+  if(queuemap && (qq = hash_find(queuemap, id)))
+    return *qq;
+  dcgi_lookup(DCGI_PLAYING);
+  if(queuemap && (qq = hash_find(queuemap, id)))
+    return *qq;
+  dcgi_lookup(DCGI_QUEUE);
+  if(queuemap && (qq = hash_find(queuemap, id)))
+    return *qq;
+  dcgi_lookup(DCGI_RECENT);
+  if(queuemap && (qq = hash_find(queuemap, id)))
+    return *qq;
+  return NULL;
+}
+
 void dcgi_lookup_reset(void) {
   /* Forget everything we knew */
   flags = 0;
+  queuemap = 0;
   dcgi_recent = 0;
   dcgi_queue = 0;
   dcgi_playing = 0;