seamus

commit b2d85d000bb9186dd010a799d56a746ab6585681

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;