summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Holmgren <magnushol@gmail.com>2007-11-15 20:22:03 +0000
committerMagnus Holmgren <magnushol@gmail.com>2007-11-15 20:22:03 +0000
commit7aa4ae6e4507bcf8f9956e852940e41422a57a8f (patch)
tree32c1345dd2fd7590d6d1e56f2fa89e1174eb7a78
parentf801714572e4c2c6731682ed450f98242d26a767 (diff)
downloadrockbox-7aa4ae6e4507bcf8f9956e852940e41422a57a8f.zip
rockbox-7aa4ae6e4507bcf8f9956e852940e41422a57a8f.tar.gz
rockbox-7aa4ae6e4507bcf8f9956e852940e41422a57a8f.tar.bz2
rockbox-7aa4ae6e4507bcf8f9956e852940e41422a57a8f.tar.xz
Improved use of album name when locating the album art file: replace chars that are invalid in file names; double quotes to single quotes, other invalid chars to underscore (now only very long album names could cause a problem). Also removed some unecessary code and reduced stack usage a bit.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15630 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/recorder/albumart.c92
1 files changed, 58 insertions, 34 deletions
diff --git a/apps/recorder/albumart.c b/apps/recorder/albumart.c
index ef89b06..d99280c 100644
--- a/apps/recorder/albumart.c
+++ b/apps/recorder/albumart.c
@@ -109,6 +109,30 @@ static bool file_exists(const char *file)
return true;
}
+/* Make sure part of path only contain chars valid for a FAT32 long name.
+ * Double quotes are replaced with single quotes, other unsupported chars
+ * are replaced with an underscore.
+ *
+ * path - path to modify.
+ * offset - where in path to start checking.
+ * count - number of chars to check.
+ */
+static void fix_path_part(char* path, int offset, int count)
+{
+ static const char invalid_chars[] = "*/:<>?\\|";
+ int i;
+
+ path += offset;
+
+ for (i = 0; i <= count; i++, path++)
+ {
+ if (*path == '"')
+ *path = '\'';
+ else if (strchr(invalid_chars, *path))
+ *path = '_';
+ }
+}
+
/* Look for the first matching album art bitmap in the following list:
* ./<trackname><size>.bmp
* ./<albumname><size>.bmp
@@ -127,37 +151,37 @@ static bool search_files(const struct mp3entry *id3, const char *size_string,
char dir[MAX_PATH + 1];
bool found = false;
const char *trackname;
+ int dirlen;
+ int albumlen;
if (!id3 || !buf)
return false;
trackname = id3->path;
strip_filename(dir, sizeof(dir), trackname);
+ dirlen = strlen(dir);
+ albumlen = id3->album ? strlen(id3->album) : 0;
/* the first file we look for is one specific to the track playing */
strip_extension(path, sizeof(path) - strlen(size_string) - 4, trackname);
strcat(path, size_string);
strcat(path, ".bmp");
found = file_exists(path);
- if (!found && id3->album && strlen(id3->album) > 0)
+ if (!found && albumlen > 0)
{
/* if it doesn't exist,
* we look for a file specific to the track's album name */
- snprintf(path, sizeof(path) - 1,
- "%s%s%s.bmp",
- (strlen(dir) >= 1) ? dir : "",
- id3->album, size_string);
- path[sizeof(path) - 1] = 0;
+ snprintf(path, sizeof(path),
+ "%s%s%s.bmp", dir, id3->album, size_string);
+ fix_path_part(path, dirlen, albumlen);
found = file_exists(path);
}
if (!found)
{
/* if it still doesn't exist, we look for a generic file */
- snprintf(path, sizeof(path)-1,
- "%scover%s.bmp",
- (strlen(dir) >= 1) ? dir : "", size_string);
- path[sizeof(path)-1] = 0;
+ snprintf(path, sizeof(path),
+ "%scover%s.bmp", dir, size_string);
found = file_exists(path);
}
@@ -165,33 +189,33 @@ static bool search_files(const struct mp3entry *id3, const char *size_string,
{
/* if it still doesn't exist,
* we continue to search in the parent directory */
- char temp[MAX_PATH + 1];
- strncpy(temp, dir, strlen(dir) - 1);
- temp[strlen(dir) - 1] = 0;
-
- strip_filename(dir, sizeof(dir), temp);
+ strcpy(path, dir);
+ path[dirlen - 1] = 0;
+ strip_filename(dir, sizeof(dir), path);
+ dirlen = strlen(dir);
}
- if (!found && id3->album && strlen(id3->album) > 0)
+ /* only try parent if there is one */
+ if (dirlen > 0)
{
- /* we look in the parent directory
- * for a file specific to the track's album name */
- snprintf(path, sizeof(path)-1,
- "%s%s%s.bmp",
- (strlen(dir) >= 1) ? dir : "",
- id3->album, size_string);
- found = file_exists(path);
- }
-
- if (!found)
- {
- /* if it still doesn't exist, we look in the parent directory
- * for a generic file */
- snprintf(path, sizeof(path)-1,
- "%scover%s.bmp",
- (strlen(dir) >= 1) ? dir : "", size_string);
- path[sizeof(path)-1] = 0;
- found = file_exists(path);
+ if (!found && albumlen > 0)
+ {
+ /* we look in the parent directory
+ * for a file specific to the track's album name */
+ snprintf(path, sizeof(path),
+ "%s%s%s.bmp", dir, id3->album, size_string);
+ fix_path_part(path, dirlen, albumlen);
+ found = file_exists(path);
+ }
+
+ if (!found)
+ {
+ /* if it still doesn't exist, we look in the parent directory
+ * for a generic file */
+ snprintf(path, sizeof(path),
+ "%scover%s.bmp", dir, size_string);
+ found = file_exists(path);
+ }
}
if (!found)