diff options
| author | Přemysl Eric Janouch <p@janouch.name> | 2023-03-07 01:20:51 +0100 | 
|---|---|---|
| committer | Přemysl Eric Janouch <p@janouch.name> | 2023-03-07 01:53:50 +0100 | 
| commit | d58856571daa110658fdff13ffcfd9728c1a7648 (patch) | |
| tree | f9e7122ef55015f54c162cb461851d6cb7868ce4 | |
| parent | 61fac878add8392928c46a750cbd1efce0d0982e (diff) | |
| download | nncmpp-d58856571daa110658fdff13ffcfd9728c1a7648.tar.gz nncmpp-d58856571daa110658fdff13ffcfd9728c1a7648.tar.xz nncmpp-d58856571daa110658fdff13ffcfd9728c1a7648.zip | |
Improve display of files lacking proper metadata
| -rw-r--r-- | nncmpp.c | 59 | 
1 files changed, 44 insertions, 15 deletions
| @@ -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)); | 
