From a2c4ad5fad89f91d11811288c7781fb75712b9a3 Mon Sep 17 00:00:00 2001 Message-Id: From: Mark Wooding Date: Sun, 11 May 2008 13:55:21 +0100 Subject: [PATCH] remove action; better findtrack; more template fiddling Organization: Straylight/Edgeware From: Richard Kettlewell --- server/actions.c | 32 +++++++++++++++++ server/disorder-cgi.h | 1 + server/lookup.c | 38 ++++++++++++++++++-- server/macros-disorder.c | 32 ++++------------- templates/credits.tmpl | 14 ++++---- templates/macros.tmpl | 62 +++++++++++++++++++++++++++++--- templates/options.labels | 12 +++---- templates/playing.tmpl | 76 +++++++--------------------------------- templates/topbarend.tmpl | 9 +++-- 9 files changed, 164 insertions(+), 112 deletions(-) diff --git a/server/actions.c b/server/actions.c index 1a6f7c9..8e975e4 100644 --- a/server/actions.c +++ b/server/actions.c @@ -119,6 +119,37 @@ static void act_random_enable(void) { redirect(0); } +static void act_remove(void) { + const char *id; + struct queue_entry *q; + + if(dcgi_client) { + if(!(id = cgi_get("id"))) + error(0, "missing 'id' argument"); + else if(!(q = dcgi_findtrack(id))) + error(0, "unknown queue id %s", id); + else switch(q->state) { + case playing_isscratch: + case playing_failed: + case playing_no_player: + case playing_ok: + case playing_quitting: + case playing_scratched: + error(0, "does not make sense to scratch %s", id); + break; + case playing_paused: /* started but paused */ + case playing_started: /* started to play */ + disorder_scratch(dcgi_client, id); + break; + case playing_random: /* unplayed randomly chosen track */ + case playing_unplayed: /* haven't played this track yet */ + disorder_remove(dcgi_client, id); + break; + } + } + redirect(0); +} + /** @brief Table of actions */ static const struct action { /** @brief Action name */ @@ -132,6 +163,7 @@ static const struct action { { "playing", act_playing }, { "random-disable", act_random_disable }, { "random-enable", act_random_enable }, + { "remove", act_remove }, }; /** @brief Expand a template diff --git a/server/disorder-cgi.h b/server/disorder-cgi.h index a85b9f9..95b36c6 100644 --- a/server/disorder-cgi.h +++ b/server/disorder-cgi.h @@ -70,6 +70,7 @@ void dcgi_expansions(void); char *dcgi_cookie_header(void); void dcgi_login(void); void dcgi_get_cookie(void); +struct queue_entry *dcgi_findtrack(const char *id); void option_set(const char *name, const char *value); const char *option_label(const char *key); diff --git a/server/lookup.c b/server/lookup.c index cb28f2c..452cd53 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,6 +46,13 @@ 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); @@ -54,10 +64,14 @@ void dcgi_lookup(unsigned want) { 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,6 +83,7 @@ void dcgi_lookup(unsigned want) { dcgi_recent = r; r = rnext; } + queuemap_add(dcgi_recent); } if(need & DCGI_VOLUME) disorder_get_volume(dcgi_client, @@ -102,9 +117,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 *q, **qq; + + if(queuemap && (qq = hash_find(id))) + return *q; + dcgi_lookup(DCGI_PLAYING); + if(queuemap && (qq = hash_find(id))) + return *q; + dcgi_lookup(DCGI_QUEUE); + if(queuemap && (qq = hash_find(id))) + return *q; + dcgi_lookup(DCGI_RECENT); + if(queuemap && (qq = hash_find(id))) + return *q; + return NULL; +} + void dcgi_lookup_reset(void) { /* Forget everything we knew */ flags = 0; + queuemap = 0; dcgi_recent = 0; dcgi_queue = 0; dcgi_playing = 0; diff --git a/server/macros-disorder.c b/server/macros-disorder.c index e58324b..6c81d56 100644 --- a/server/macros-disorder.c +++ b/server/macros-disorder.c @@ -26,24 +26,6 @@ /** @brief For error template */ char *dcgi_error_string; -/** @brief Locate a track by ID */ -static struct queue_entry *findtrack(const char *id) { - struct queue_entry *q; - - dcgi_lookup(DCGI_PLAYING); - if(dcgi_playing && !strcmp(dcgi_playing->id, id)) - return dcgi_playing; - dcgi_lookup(DCGI_QUEUE); - for(q = dcgi_queue; q; q = q->next) - if(!strcmp(q->id, id)) - return q; - dcgi_lookup(DCGI_RECENT); - for(q = dcgi_recent; q; q = q->next) - if(!strcmp(q->id, id)) - return q; - return NULL; -} - /** @brief Return @p i as a string */ static const char *make_index(int i) { char *s; @@ -150,7 +132,7 @@ static int exp_part(int nargs, char *s; if(track[0] != '/') { - struct queue_entry *q = findtrack(track); + struct queue_entry *q = dcgi_findtrack(track); if(q) track = q->track; @@ -187,7 +169,7 @@ static int exp_who(int attribute((unused)) nargs, char **args, struct sink *output, void attribute((unused)) *u) { - struct queue_entry *q = findtrack(args[0]); + struct queue_entry *q = dcgi_findtrack(args[0]); if(q && q->submitter) return sink_writes(output, cgi_sgmlquote(q->submitter)) < 0 ? -1 : 0; @@ -203,7 +185,7 @@ static int exp_when(int attribute((unused)) nargs, char **args, struct sink *output, void attribute((unused)) *u) { - struct queue_entry *q = findtrack(args[0]); + struct queue_entry *q = dcgi_findtrack(args[0]); const struct tm *w = 0; if(q) { @@ -250,7 +232,7 @@ static int exp_length(int attribute((unused)) nargs, name = args[0]; else { /* Track identified by queue ID */ - if(!(q = findtrack(args[0]))) + if(!(q = dcgi_findtrack(args[0]))) return 0; if(q->state == playing_started || q->state == playing_paused) if(sink_printf(output, "%ld:%02ld/", q->sofar / 60, q->sofar % 60) < 0) @@ -272,7 +254,7 @@ static int exp_removable(int attribute((unused)) nargs, char **args, struct sink *output, void attribute((unused)) *u) { - struct queue_entry *q = findtrack(args[0]); + struct queue_entry *q = dcgi_findtrack(args[0]); /* TODO would be better to reject recent */ if(!q || !dcgi_client) @@ -291,7 +273,7 @@ static int exp_movable(int attribute((unused)) nargs, char **args, struct sink *output, void attribute((unused)) *u) { - struct queue_entry *q = findtrack(args[0]); + struct queue_entry *q = dcgi_findtrack(args[0]); /* TODO would be better to recent playing/recent */ if(!q || !dcgi_client) @@ -668,7 +650,7 @@ static int exp_state(int attribute((unused)) nargs, char **args, struct sink *output, void attribute((unused)) *u) { - struct queue_entry *q = findtrack(args[0]); + struct queue_entry *q = dcgi_findtrack(args[0]); if(q) return sink_writes(output, playing_states[q->state]) < 0 ? -1 : 0; diff --git a/templates/credits.tmpl b/templates/credits.tmpl index 8bdadca..cb8d48f 100644 --- a/templates/credits.tmpl +++ b/templates/credits.tmpl @@ -1,9 +1,4 @@ -

DisOrder -version @version@ © 2003-2008 Richard Kettlewell

-@@ - +}@# +

+ DisOrder + version @version + © 2003-2008 Richard Kettlewell et al +

diff --git a/templates/macros.tmpl b/templates/macros.tmpl index cb763b2..8714a08 100644 --- a/templates/macros.tmpl +++ b/templates/macros.tmpl @@ -18,9 +18,61 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -@define {ifmanage} {yes} {no} - {@if {@eq {@arg{action}}{manage}} - {@yes} - {@no}} +@# Expand to @yes for the Manage page and @no for the playing page +@define {ifmanage} {yes no} + {@if {@eq {@arg{action}}{manage}} + {@yes} + {@no}} -}@@@ +@# Expand to &back=manage or to nothing +@define {back} {} + {@ifmanage{&back=manage}{}} + +@# Expand to the time that @id will be played +@define {mwhen} {what id} + {@when{@id}} + +@# Expand to the 'who' field for @id +@define {mwho} {what id} + {@if{@eq{@who{@id}}{}} + {@if{@eq{@state{@id}}{random}} + {@label{@what.randomtrack}} + { }} + {@who{@id}}} + +@# Expand to the artist for @track +@define {martist} {what track} + {@right{play} + {@part{@track}{short}{artist}} + {@part{@track}{short}{artist}}} + +@# Expand to the album for @track +@define {malbum} {what track} + {@right{play} + {@part{@track}{short}{album}} + {@part{@track}{short}{album}}} + +@# Expand to the title for @track +@define {mtitle} {what track} + {@part{@track}{short}{title}} + +@# Expand to the remove/scratch entry for @id +@define {mremove} {what id} + {@if{@removable{@id}} + { + @label{@what.scratch} + } + {@label{@what.scratch}}} + +}@# diff --git a/templates/options.labels b/templates/options.labels index 55d661a..ef6272d 100644 --- a/templates/options.labels +++ b/templates/options.labels @@ -15,12 +15,12 @@ label playing.randomtrack   label queue.randomtrack random # Short and long text for scratch (remove playing track) button -label playing.scratch Scratch -label playing.scratchverbose "stop playing this track" +label playing.remove Scratch +label playing.removeverbose "stop playing this track" # Short and long text for remove queued track button -label playing.remove Remove -label playing.removeverbose "remove track from queue" +label queue.remove Remove +label queue.removeverbose "remove track from queue" # Text for banner above currently playing track label playing.now "Now playing" @@ -239,8 +239,8 @@ label heading.length Length # Role images. See the documentation for @images:NAME@. label images.enabled tick.png label images.disabled cross.png -label images.scratch cross.png -label images.noscratch nocross.png +label images.remove cross.png +label images.noremove nocross.png label images.noup noup.png label images.upall upup.png label images.noupall noupup.png diff --git a/templates/playing.tmpl b/templates/playing.tmpl index 084f5c3..d0e0000 100644 --- a/templates/playing.tmpl +++ b/templates/playing.tmpl @@ -19,12 +19,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --> @discard{ - @define {ifmanage} {yes no} - {@if {@eq {@arg{action}}{manage}} - {@yes} - {@no}} - @define {back} {} - {@ifmanage{&back=manage}{}} @include{macros.tmpl} }@# @@ -154,39 +148,13 @@ USA @label{playing.now} - @when{@id} - @if{@eq{@who{@id}}{}} - {@if{@eq{@state{@id}}{random}} - {@label{playing.randomtrack}} - { }} - {@who{@id}} - - @right{play} - {@part{@id}{short}{artist}} - {@part{short}{artist}} - - @right{play} - {@part{short}{album}} - {@part{short}{album}} - - @part{@id}{short}{title} + @mwhen{playing}{@id} + @mwho{playing}{@id} + @martist{playing}{@track} + @malbum{playing}{@track} + @mtitle{playing}{@track} @length{@id} - @if{@removabl{@id}} - { - @label{playing.scratch}} - {@label{playing.scratch}} - + @mremove{playing}{@id} @ifmanage{     @@ -202,31 +170,13 @@ USA } @queue{ - @when - @if{@eq{@who@}{}@}{@if{@eq{@state@}{random}@}{@label{queue.randomtrack}}{ }@}{@who@} - @right{play}{@part{@id}{short}{artist}}{@part{@id}{short}{artist}} - @right{play}{@part{@id}{short}{album}}{@part{@id}{short}{album}@} - @part{@id}{short}{title} + @mwhen{queue}{@id} + @mwho{queue}{@id} + @martist{queue}{@track} + @malbum{queue}{@track} + @mtitle{queue}{@track} @length - @if{@removable@}{@label{playing.remove}}{@label{playing.remove}} + @mremove{queue}{@id} @if{@eq{@arg{action}}{manage}}{ @if{@or{@isfirst@} @@ -286,7 +236,7 @@ USA } -@include{topbarend}@# +@include{topbarend.tmpl}@# @discard{ diff --git a/templates/topbarend.tmpl b/templates/topbarend.tmpl index 5eca359..887dba2 100644 --- a/templates/topbarend.tmpl +++ b/templates/topbarend.tmpl @@ -1,8 +1,6 @@ -@include:credits@ -@@ - +}@# +@include{credits.tmpl}@# -- [mdw]