X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fstrfsong.c;h=ac0e0490986ccf1740ab6a248cc0abbb9724c67f;hb=e61081294d74aa85924910e37701b72fed9bb8ae;hp=714a0b0040c9fb932bfea7589d4003e2f725033c;hpb=e67ad30e9bea8ce099b4a6311cf2b20ce6d86263;p=ncmpc.git diff --git a/src/strfsong.c b/src/strfsong.c index 714a0b0..ac0e049 100644 --- a/src/strfsong.c +++ b/src/strfsong.c @@ -1,5 +1,5 @@ /* ncmpc (Ncurses MPD Client) - * (c) 2004-2009 The Music Player Daemon Project + * (c) 2004-2010 The Music Player Daemon Project * Project homepage: http://musicpd.org * This program is free software; you can redistribute it and/or modify @@ -19,6 +19,9 @@ #include "strfsong.h" #include "charset.h" +#include "utils.h" + +#include #include @@ -46,6 +49,64 @@ skip(const gchar * p) return p; } +#ifndef NCMPC_MINI + +static char * +concat_tag_values(const char *a, const char *b) +{ + return g_strconcat(a, ", ", b, NULL); +} + +static char * +song_more_tag_values(const struct mpd_song *song, enum mpd_tag_type tag, + const char *first) +{ + const char *p = mpd_song_get_tag(song, tag, 1); + char *buffer, *prev; + + if (p == NULL) + return NULL; + + buffer = concat_tag_values(first, p); + for (unsigned i = 2; (p = mpd_song_get_tag(song, tag, i)) != NULL; + ++i) { + prev = buffer; + buffer = concat_tag_values(buffer, p); + g_free(prev); + } + + return buffer; +} + +#endif /* !NCMPC_MINI */ + +static char * +song_tag_locale(const struct mpd_song *song, enum mpd_tag_type tag) +{ + const char *value = mpd_song_get_tag(song, tag, 0); + char *result; +#ifndef NCMPC_MINI + char *all; +#endif /* !NCMPC_MINI */ + + if (value == NULL) + return NULL; + +#ifndef NCMPC_MINI + all = song_more_tag_values(song, tag, value); + if (all != NULL) + value = all; +#endif /* !NCMPC_MINI */ + + result = utf8_to_locale(value); + +#ifndef NCMPC_MINI + g_free(all); +#endif /* !NCMPC_MINI */ + + return result; +} + static gsize _strfsong(gchar *s, gsize max, @@ -134,15 +195,15 @@ _strfsong(gchar *s, if(*end != '%') n--; else if (strncmp("%file%", p, n) == 0) - temp = utf8_to_locale(song->file); + temp = utf8_to_locale(mpd_song_get_uri(song)); else if (strncmp("%artist%", p, n) == 0) - temp = song->artist ? utf8_to_locale(song->artist) : NULL; + temp = song_tag_locale(song, MPD_TAG_ARTIST); else if (strncmp("%title%", p, n) == 0) - temp = song->title ? utf8_to_locale(song->title) : NULL; + temp = song_tag_locale(song, MPD_TAG_TITLE); else if (strncmp("%album%", p, n) == 0) - temp = song->album ? utf8_to_locale(song->album) : NULL; + temp = song_tag_locale(song, MPD_TAG_ALBUM); else if (strncmp("%shortalbum%", p, n) == 0) { - temp = song->album ? utf8_to_locale(song->album) : NULL; + temp = song_tag_locale(song, MPD_TAG_ALBUM); if (temp) { gchar *temp2 = g_strndup(temp, 25); if (strlen(temp) > 25) { @@ -155,30 +216,27 @@ _strfsong(gchar *s, } } else if (strncmp("%track%", p, n) == 0) - temp = song->track ? utf8_to_locale(song->track) : NULL; + temp = song_tag_locale(song, MPD_TAG_TRACK); else if (strncmp("%name%", p, n) == 0) - temp = song->name ? utf8_to_locale(song->name) : NULL; + temp = song_tag_locale(song, MPD_TAG_NAME); else if (strncmp("%date%", p, n) == 0) - temp = song->date ? utf8_to_locale(song->date) : NULL; + temp = song_tag_locale(song, MPD_TAG_DATE); else if (strncmp("%genre%", p, n) == 0) - temp = song->genre ? utf8_to_locale(song->genre) : NULL; + temp = song_tag_locale(song, MPD_TAG_GENRE); else if (strncmp("%shortfile%", p, n) == 0) { - if( strstr(song->file, "://") ) - temp = utf8_to_locale(song->file); + const char *uri = mpd_song_get_uri(song); + if (strstr(uri, "://") != NULL) + temp = utf8_to_locale(uri); else - temp = utf8_to_locale(g_basename(song->file)); + temp = utf8_to_locale(g_basename(uri)); } else if (strncmp("%time%", p, n) == 0) { - if (song->time != MPD_SONG_NO_TIME) { - if (song->time > 3600) { - temp = g_strdup_printf("%d:%02d:%02d", - song->time / 3600, - (song->time % 3600) / 60, - song->time % 60); - } else { - temp = g_strdup_printf("%d:%02d", - song->time / 60, - song->time % 60); - } + unsigned duration = mpd_song_get_duration(song); + + if (duration > 0) { + char buffer[32]; + format_duration_short(buffer, sizeof(buffer), + duration); + temp = g_strdup(buffer); } }