chiark / gitweb /
By default, disable user management over TCP (since it tends to have
[disorder] / server / choose.c
index f22bf6fa1878a6583702d2f798c4f24c96f83b36..06c9601b76e90a2b197961f34b7e915d0980ea0b 100644 (file)
@@ -53,6 +53,8 @@
 #include "trackdb-int.h"
 #include "version.h"
 #include "trackname.h"
+#include "queue.h"
+#include "server-queue.h"
 
 static DB_TXN *global_tid;
 
@@ -106,6 +108,16 @@ static long ntracks;
 static char **required_tags;
 static char **prohibited_tags;
 
+static int queue_contains(const struct queue_entry *head,
+                          const char *track) {
+  const struct queue_entry *q;
+
+  for(q = head->next; q != head; q = q->next)
+    if(!strcmp(q->track, track))
+      return 1;
+  return 0;
+}
+
 /** @brief Compute the weight of a track
  * @param track Track name (UTF-8)
  * @param data Track data
@@ -141,10 +153,15 @@ static unsigned long compute_weight(const char *track,
   if((s = kvp_get(prefs, "played_time"))) {
     last = atoll(s);
     now = time(0);
-    if(now < last + 8 * 3600)       /* TODO configurable */
+    if(now < last + config->replay_min)
       return 0;
   }
 
+  /* Reject tracks currently in the queue or in the recent list */
+  if(queue_contains(&qhead, track)
+     || queue_contains(&phead, track))
+    return 0;
+
   /* We'll need tags for a number of things */
   track_tags = parsetags(kvp_get(prefs, "tags"));
 
@@ -156,6 +173,16 @@ static unsigned long compute_weight(const char *track,
   if(*required_tags && !tag_intersection(track_tags, required_tags))
     return 0;
 
+  /* Use the configured weight if available */
+  if((s = kvp_get(prefs, "weight"))) {
+    long n;
+    errno = 0;
+
+    n = strtol(s, 0, 10);
+    if((errno == 0 || errno == ERANGE) && n >= 0)
+      return n;
+  }
+  
   return 90000;
 }
 
@@ -165,11 +192,15 @@ static int collect_tracks_callback(const char *track,
                                    struct kvp *prefs,
                                   void attribute((unused)) *u,
                                   DB_TXN attribute((unused)) *tid) {
-  const unsigned long weight = compute_weight(track, data, prefs);
+  unsigned long weight = compute_weight(track, data, prefs);
 
   if(weight) {
     struct weighted_track *const t = xmalloc(sizeof *t);
 
+    /* Clamp weight so that we can fit in billions of tracks when we do
+     * arithmetic in long long */
+    if(weight > 0x7fffffff)
+      weight = 0x7fffffff;
     t->next = tracks;
     t->track = track;
     t->weight = weight;
@@ -237,6 +268,9 @@ int main(int argc, char **argv) {
     log_default = &log_syslog;
   }
   if(config_read(0)) fatal(0, "cannot read configuration");
+  /* Find out current queue/recent list */
+  queue_read();
+  recent_read();
   /* Generate the candidate track list */
   trackdb_init(TRACKDB_NO_RECOVER);
   trackdb_open(TRACKDB_NO_UPGRADE|TRACKDB_READ_ONLY);