Author: Pedro Lucas Porcellis <porcellis@eletrotupi.com>
queue: display duration + album + index info
include/seamus.h | 2 + src/queue.c | 10 +++++ src/seamus.c | 1 src/ui.c | 88 ++++++++++++++++++++++++++++++++++---------------
diff --git a/include/seamus.h b/include/seamus.h
index a2bea3e920ef1ec73358b62d2ad2ebdb05beddea..50ed47d65dd89cae9f2d52f930842658b97df05f 100644
--- a/include/seamus.h
+++ b/include/seamus.h
@@ -10,6 +10,8 @@ struct seamus_song {
int song_id;
char *title;
char *artist;
+ char *album;
+ unsigned duration;
};
struct seamus_status {
diff --git a/src/queue.c b/src/queue.c
index 5773f26807c87de3801f7eda4f3fe68f0147d944..90e0a4966b8ce9cfd17488ebf33eb8a866138abc 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -34,22 +34,32 @@ const struct mpd_song *song = mpd_entity_get_song(entity);
const char *stitle = mpd_song_get_tag(song, MPD_TAG_TITLE, 0);
const char *sartist = mpd_song_get_tag(song, MPD_TAG_ALBUM_ARTIST, 0);
+ const char *salbum = mpd_song_get_tag(song, MPD_TAG_ALBUM, 0);
if (stitle == NULL) stitle = "";
if (sartist == NULL) sartist = "";
+ if (salbum == NULL) salbum = "";
struct seamus_song *new = &seamus->queue[index];
memset(new, 0, sizeof(*new));
char *title = malloc(strlen(stitle) + 1);
+ if (title == NULL) break;
strcpy(title, stitle);
char *artist = malloc(strlen(sartist) + 1);
+ if (artist == NULL) { free(title); break; }
strcpy(artist, sartist);
+ char *album = malloc(strlen(salbum) + 1);
+ if (album == NULL) { free(title); free(artist); break; }
+ strcpy(album, salbum);
+
new->song_id = mpd_song_get_id(song);
+ new->duration = mpd_song_get_duration(song);
new->title = title;
new->artist = artist;
+ new->album = album;
}
mpd_entity_free(entity);
diff --git a/src/seamus.c b/src/seamus.c
index 04113d0da0e306a5bb298fbaa58e46f924d99eaf..6bb75403e57a62435ddabdddfd14204168d625c3 100755
--- a/src/seamus.c
+++ b/src/seamus.c
@@ -38,6 +38,7 @@ for (i = 0; i < n; i++) {
struct seamus_song *s = &seamus->queue[i];
free(s->title);
free(s->artist);
+ free(s->album);
}
seamus->queue_size = 0;
diff --git a/src/ui.c b/src/ui.c
index 280a1e8bddc485ae0cffce3c3a683ad23095bf9d..269c69570395366950d5e1a18fc117e1d0d9a889 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -636,6 +636,55 @@
return 1;
}
+static void
+format_song_line(const struct seamus_song *song, int index,
+ char *head, size_t headsz,
+ char *body, size_t bodysz,
+ char *tail, size_t tailsz)
+{
+ snprintf(head, headsz, "%d. ", index + 1);
+
+ int pos = snprintf(body, bodysz, "%s - %s", song->artist, song->title);
+ if (song->album && song->album[0]) {
+ snprintf(body + pos, bodysz - pos, " (%s)", song->album);
+ }
+
+ if (song->duration > 0) {
+ unsigned dur_m = song->duration / 60;
+ unsigned dur_s = song->duration % 60;
+ snprintf(tail, tailsz, " [%u:%02u]", dur_m, dur_s);
+ } else {
+ tail[0] = '\0';
+ }
+}
+
+static void
+render_song_body(TickitRenderBuffer *rb, struct seamus_frontend *seamus,
+ const struct seamus_song *song, int idx, const char *text)
+{
+ if (seamus->status->current_song_id == song->song_id
+ && seamus->highlight_index == idx) {
+ tickit_renderbuffer_savepen(rb);
+ TickitPen *pen = tickit_pen_clone(seamus->scrolling_pen);
+ tickit_pen_copy_attr(pen, seamus->playing_pen, TICKIT_PEN_BOLD);
+ tickit_renderbuffer_setpen(rb, pen);
+ tickit_renderbuffer_text(rb, text);
+ tickit_renderbuffer_restore(rb);
+ } else if (seamus->status->current_song_id == song->song_id) {
+ tickit_renderbuffer_savepen(rb);
+ tickit_renderbuffer_setpen(rb, seamus->playing_pen);
+ tickit_renderbuffer_text(rb, text);
+ tickit_renderbuffer_restore(rb);
+ } else if (seamus->highlight_index == idx) {
+ tickit_renderbuffer_savepen(rb);
+ tickit_renderbuffer_setpen(rb, seamus->scrolling_pen);
+ tickit_renderbuffer_text(rb, text);
+ tickit_renderbuffer_restore(rb);
+ } else {
+ tickit_renderbuffer_text(rb, text);
+ }
+}
+
static int
render_queue(struct seamus_frontend *seamus, TickitRenderBuffer *render_buffer)
{
@@ -650,42 +699,27 @@ log_info("Rendering queue rows %d to %d (highlight: %d)", start, end, seamus->highlight_index);
for (int i = start; i < end; ++i) {
struct seamus_song *song = &seamus->queue[i];
-
- int left_padding = 0;
- char *song_str = malloc(
- strlen(song->artist) + strlen(song->title) + 6);
+ char head[16], body[1024], tail[32];
- sprintf(song_str, "%s - %s", song->artist, song->title);
+ format_song_line(song, i, head, sizeof(head), body, sizeof(body), tail, sizeof(tail));
- if (seamus->status->current_song_id == song->song_id) {
- left_padding = 2;
- }
+ int left_padding = (seamus->status->current_song_id == song->song_id) ? 2 : 0;
tickit_renderbuffer_goto(render_buffer, QUEUE_START_LINE + (i - start), left_padding);
- if (seamus->status->current_song_id == song->song_id && seamus->highlight_index == i) {
- tickit_renderbuffer_savepen(render_buffer);
- TickitPen *scrolling_playing_pen = tickit_pen_clone(seamus->scrolling_pen);
- tickit_pen_copy_attr(scrolling_playing_pen, seamus->playing_pen, TICKIT_PEN_BOLD);
+ tickit_renderbuffer_savepen(render_buffer);
+ tickit_renderbuffer_setpen(render_buffer, seamus->dim_pen);
+ tickit_renderbuffer_text(render_buffer, head);
+ tickit_renderbuffer_restore(render_buffer);
- tickit_renderbuffer_setpen(render_buffer, scrolling_playing_pen);
- tickit_renderbuffer_text(render_buffer, song_str);
- tickit_renderbuffer_restore(render_buffer);
- } else if (seamus->status->current_song_id == song->song_id) {
- tickit_renderbuffer_savepen(render_buffer);
- tickit_renderbuffer_setpen(render_buffer, seamus->playing_pen);
- tickit_renderbuffer_text(render_buffer, song_str);
- tickit_renderbuffer_restore(render_buffer);
- } else if (seamus->highlight_index == i) {
+ render_song_body(render_buffer, seamus, song, i, body);
+
+ if (tail[0]) {
tickit_renderbuffer_savepen(render_buffer);
- tickit_renderbuffer_setpen(render_buffer, seamus->scrolling_pen);
- tickit_renderbuffer_text(render_buffer, song_str);
+ tickit_renderbuffer_setpen(render_buffer, seamus->dim_pen);
+ tickit_renderbuffer_text(render_buffer, tail);
tickit_renderbuffer_restore(render_buffer);
- } else {
- tickit_renderbuffer_text(render_buffer, song_str);
}
-
- free(song_str);
}
return 0;