diff options
| author | Magnus Holmgren <magnushol@gmail.com> | 2007-11-15 20:22:03 +0000 |
|---|---|---|
| committer | Magnus Holmgren <magnushol@gmail.com> | 2007-11-15 20:22:03 +0000 |
| commit | 7aa4ae6e4507bcf8f9956e852940e41422a57a8f (patch) | |
| tree | 32c1345dd2fd7590d6d1e56f2fa89e1174eb7a78 | |
| parent | f801714572e4c2c6731682ed450f98242d26a767 (diff) | |
| download | rockbox-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.c | 92 |
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) |