X-Git-Url: https://git.distorted.org.uk/~mdw/disorder/blobdiff_plain/1e97629da2ea6c1ae328912ba82d4595eb08b700..9d61799376c6d4a51b5386ddb432693ad31129a6:/server/lookup.c diff --git a/server/lookup.c b/server/lookup.c index cb28f2c..6dc254c 100644 --- a/server/lookup.c +++ b/server/lookup.c @@ -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;