aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPřemysl Eric Janouch <p@janouch.name>2023-03-07 01:20:51 +0100
committerPřemysl Eric Janouch <p@janouch.name>2023-03-07 01:53:50 +0100
commitd58856571daa110658fdff13ffcfd9728c1a7648 (patch)
treef9e7122ef55015f54c162cb461851d6cb7868ce4
parent61fac878add8392928c46a750cbd1efce0d0982e (diff)
downloadnncmpp-d58856571daa110658fdff13ffcfd9728c1a7648.tar.gz
nncmpp-d58856571daa110658fdff13ffcfd9728c1a7648.tar.xz
nncmpp-d58856571daa110658fdff13ffcfd9728c1a7648.zip
Improve display of files lacking proper metadata
-rw-r--r--nncmpp.c59
1 files changed, 44 insertions, 15 deletions
diff --git a/nncmpp.c b/nncmpp.c
index ef49c08..17c7685 100644
--- a/nncmpp.c
+++ b/nncmpp.c
@@ -1,7 +1,7 @@
/*
* nncmpp -- the MPD client you never knew you needed
*
- * Copyright (c) 2016 - 2022, Přemysl Eric Janouch <p@janouch.name>
+ * Copyright (c) 2016 - 2023, Přemysl Eric Janouch <p@janouch.name>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted.
@@ -1838,10 +1838,24 @@ app_layout_song_info (void)
chtype attrs[2] = { APP_ATTR (NORMAL), APP_ATTR (HIGHLIGHT) };
- char *title;
+ // Split the path for files lying within MPD's "music_directory".
+ const char *file = compact_map_find (map, "file");
+ const char *subroot_basename = NULL;
+ if (file && *file != '/' && !strstr (file, "://"))
+ {
+ const char *last_slash = strrchr (file, '/');
+ if (last_slash)
+ subroot_basename = last_slash + 1;
+ else
+ subroot_basename = file;
+ }
+
+ const char *title = NULL;
+ const char *name = compact_map_find (map, "name");
if ((title = compact_map_find (map, "title"))
- || (title = compact_map_find (map, "name"))
- || (title = compact_map_find (map, "file")))
+ || (title = name)
+ || (title = subroot_basename)
+ || (title = file))
{
struct layout l = {};
app_push (&l, g.ui->padding (attrs[0], 0.25, 1));
@@ -1851,23 +1865,38 @@ app_layout_song_info (void)
app_flush_layout (&l);
}
- char *artist = compact_map_find (map, "artist");
- char *album = compact_map_find (map, "album");
- if (!artist && !album)
- return;
-
+ // Showing a blank line is better than having the controls jump around
+ // while switching between files that we do and don't have enough data for.
struct layout l = {};
app_push (&l, g.ui->padding (attrs[0], 0.25, 1));
- if (artist)
+ char *artist = compact_map_find (map, "artist");
+ char *album = compact_map_find (map, "album");
+ if (artist || album)
+ {
+ if (artist)
+ {
+ app_push (&l, g.ui->label (attrs[0], "by "));
+ app_push (&l, g.ui->label (attrs[1], artist));
+ }
+ if (album)
+ {
+ app_push (&l, g.ui->label (attrs[0], &" from "[!artist]));
+ app_push (&l, g.ui->label (attrs[1], album));
+ }
+ }
+ else if (subroot_basename && subroot_basename != file)
{
- app_push (&l, g.ui->label (attrs[0], "by "));
- app_push (&l, g.ui->label (attrs[1], artist));
+ char *parent = xstrndup (file, subroot_basename - file - 1);
+ app_push (&l, g.ui->label (attrs[0], "in "));
+ app_push (&l, g.ui->label (attrs[1], parent));
+ free (parent);
}
- if (album)
+ else if (file && *file != '/' && strstr (file, "://")
+ && name && name != title)
{
- app_push (&l, g.ui->label (attrs[0], &" from "[!artist]));
- app_push (&l, g.ui->label (attrs[1], album));
+ // This is likely to contain the name of an Internet radio.
+ app_push (&l, g.ui->label (attrs[1], name));
}
app_push_fill (&l, g.ui->padding (attrs[0], 0, 1));