summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhillip Wood <phillip.wood@dunelm.org.uk>2011-11-02 12:54:08 +0000
committerChristophe Fergeau <cfergeau@redhat.com>2012-09-06 19:58:38 +0200
commit25b2d50e06c3a07f32289343011e95fad5e39d86 (patch)
treeb4139db83eca1dd73287f4a19ca2a9a15fa199d8
parent36887a1bd8c2de8daa7045a37a7f1d92e8599340 (diff)
Add default names in pattern parsing when metadata is missing
Add default names for empty path and filename elements where the metadata is missing. https://bugzilla.gnome.org/show_bug.cgi?id=661646
-rw-r--r--src/sj-extracting.c101
1 files changed, 77 insertions, 24 deletions
diff --git a/src/sj-extracting.c b/src/sj-extracting.c
index 5d7ac80..6619873 100644
--- a/src/sj-extracting.c
+++ b/src/sj-extracting.c
@@ -892,6 +892,56 @@ sanitize_path (const char* str, const char* filesystem_type)
return res ? res : g_strdup(str);
}
+/*
+ * Return sanitized name or default if name is empty
+ */
+static char*
+sanitize_name (const char *name, const char *default_name,
+ const char *filesystem_type)
+{
+ const char *n = (sj_str_is_empty (name)) ? default_name : name;
+ return sanitize_path (n, filesystem_type);
+}
+
+/*
+ * Return lowercase sanitized name or default if name is empty
+ */
+static char*
+lower_sanitize_name (const char *name, const char *default_name,
+ const char *filesystem_type)
+{
+ char *tmp, *s;
+ const char *n = (sj_str_is_empty (name)) ? default_name : name;
+ tmp = g_utf8_strdown (n, -1);
+ s = sanitize_path (tmp, filesystem_type);
+ g_free (tmp);
+ return s;
+}
+
+/*
+ * Return sanitized sortname or name if sortname is empty or default
+ * if name is empty
+ */
+static char*
+sanitize_sortname (const char *sortname, const char *name,
+ const char *default_name, const char *filesystem_type)
+{
+ const char *n = (sj_str_is_empty (sortname)) ? name : sortname;
+ return sanitize_name (n, default_name, filesystem_type);
+}
+
+/*
+ * Return lowercase sanitized sortname or name if sortname is empty or
+ * default if name is empty
+ */
+static char*
+lower_sanitize_sortname (const char *sortname, const char *name,
+ const char *default_name, const char *filesystem_type)
+{
+ const char *n = (sj_str_is_empty (sortname)) ? name : sortname;
+ return lower_sanitize_name (n, default_name, filesystem_type);
+}
+
/**
* Parse a filename pattern and replace markers with values from a TrackDetails
* structure.
@@ -922,6 +972,9 @@ filepath_parse_pattern (const char* pattern, const TrackDetails *track)
char *tmp, *str, *filesystem_type = NULL;
GString *s;
GFileInfo *fs_info;
+ const char *default_album = _("Unknown Album");
+ const char *default_artist = _("Unknown Artist");
+ const char *default_track = _("Unknown Track");
if (pattern == NULL || pattern[0] == 0)
return g_strdup (" ");
@@ -966,7 +1019,8 @@ filepath_parse_pattern (const char* pattern, const TrackDetails *track)
*/
switch (*++p) {
case 't':
- string = sanitize_path (track->album->title, filesystem_type);
+ string = sanitize_name (track->album->title, default_album,
+ filesystem_type);
break;
case 'y':
if (track->album->release_date && g_date_valid(track->album->release_date)) {
@@ -976,25 +1030,26 @@ filepath_parse_pattern (const char* pattern, const TrackDetails *track)
}
break;
case 'T':
- tmp = g_utf8_strdown (track->album->title, -1);
- string = sanitize_path (tmp, filesystem_type);
- g_free (tmp);
+ string = lower_sanitize_name (track->album->title, default_album,
+ filesystem_type);
break;
case 'a':
- string = sanitize_path (track->album->artist, filesystem_type);
+ string = sanitize_name (track->album->artist, default_artist,
+ filesystem_type);
break;
case 'A':
- tmp = g_utf8_strdown (track->album->artist, -1);
- string = sanitize_path (tmp, filesystem_type);
- g_free (tmp);
+ string = lower_sanitize_name (track->album->artist, default_artist,
+ filesystem_type);
break;
case 's':
- string = sanitize_path (track->album->artist_sortname ? track->album->artist_sortname : track->album->artist, filesystem_type);
+ string = sanitize_sortname (track->album->artist_sortname,
+ track->album->artist, default_artist,
+ filesystem_type);
break;
case 'S':
- tmp = g_utf8_strdown (track->album->artist_sortname ? track->album->artist_sortname : track->album->artist, -1);
- string = sanitize_path (tmp, filesystem_type);
- g_free(tmp);
+ string = lower_sanitize_sortname (track->album->artist_sortname,
+ track->album->artist, default_artist,
+ filesystem_type);
break;
default:
/* append "%a", and then the unicode character */
@@ -1012,28 +1067,26 @@ filepath_parse_pattern (const char* pattern, const TrackDetails *track)
*/
switch (*++p) {
case 't':
- string = sanitize_path (track->title, filesystem_type);
+ string = sanitize_name (track->title, default_track, filesystem_type);
break;
case 'T':
- tmp = g_utf8_strdown (track->title, -1);
- string = sanitize_path (tmp, filesystem_type);
- g_free(tmp);
+ string = lower_sanitize_name (track->title, default_track,
+ filesystem_type);
break;
case 'a':
- string = sanitize_path (track->artist, filesystem_type);
+ string = sanitize_name (track->artist, default_artist, filesystem_type);
break;
case 'A':
- tmp = g_utf8_strdown (track->artist, -1);
- string = sanitize_path (tmp, filesystem_type);
- g_free(tmp);
+ string = lower_sanitize_name (track->artist, default_artist,
+ filesystem_type);
break;
case 's':
- string = sanitize_path (track->artist_sortname ? track->album->artist_sortname : track->artist, filesystem_type);
+ string = sanitize_sortname (track->artist_sortname, track->artist,
+ default_artist, filesystem_type);
break;
case 'S':
- tmp = g_utf8_strdown (track->artist_sortname ? track->album->artist_sortname : track->artist, -1);
- string = sanitize_path (tmp, filesystem_type);
- g_free(tmp);
+ string = lower_sanitize_sortname (track->artist_sortname, track->artist,
+ default_artist, filesystem_type);
break;
case 'n':
/* Track number */