diff options
author | Max Kellermann <max@duempel.org> | 2009-04-01 18:41:37 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-04-01 18:41:37 +0200 |
commit | 7f38c3fc78f7dd3c542cdb73bcd45bfe2208a5a8 (patch) | |
tree | 9f3c8de9b5f3ef58960268aab0c2cf8d9e6e0591 | |
parent | 36ec2edacfbf17b5308312ad5617117685004174 (diff) | |
download | mpd-7f38c3fc78f7dd3c542cdb73bcd45bfe2208a5a8.tar.gz mpd-7f38c3fc78f7dd3c542cdb73bcd45bfe2208a5a8.tar.xz mpd-7f38c3fc78f7dd3c542cdb73bcd45bfe2208a5a8.zip |
directory: added directory_lookup_song()
Moved code from db_get_song().
-rw-r--r-- | src/database.c | 26 | ||||
-rw-r--r-- | src/directory.c | 30 | ||||
-rw-r--r-- | src/directory.h | 10 |
3 files changed, 41 insertions, 25 deletions
diff --git a/src/database.c b/src/database.c index 94527e72d..7257930bc 100644 --- a/src/database.c +++ b/src/database.c @@ -110,10 +110,6 @@ db_get_directory(const char *name) struct song * db_get_song(const char *file) { - struct song *song; - struct directory *directory; - char *duplicated, *shortname, *dir; - assert(file != NULL); g_debug("get song: %s", file); @@ -121,27 +117,7 @@ db_get_song(const char *file) if (music_root == NULL) return NULL; - duplicated = g_strdup(file); - shortname = strrchr(duplicated, '/'); - if (!shortname) { - shortname = duplicated; - dir = NULL; - } else { - *shortname = '\0'; - ++shortname; - dir = duplicated; - } - - directory = db_get_directory(dir); - if (directory != NULL) - song = songvec_find(&directory->songs, shortname); - else - song = NULL; - - assert(song == NULL || song->parent == directory); - - g_free(duplicated); - return song; + return directory_lookup_song(music_root, file); } int diff --git a/src/directory.c b/src/directory.c index ef2cd1c2c..85c24fd04 100644 --- a/src/directory.c +++ b/src/directory.c @@ -114,6 +114,36 @@ directory_lookup_directory(struct directory *directory, const char *uri) return found; } +struct song * +directory_lookup_song(struct directory *directory, const char *uri) +{ + char *duplicated, *base; + struct song *song; + + assert(directory != NULL); + assert(uri != NULL); + + duplicated = g_strdup(uri); + base = strrchr(duplicated, '/'); + + if (base != NULL) { + *base++ = 0; + directory = directory_lookup_directory(directory, duplicated); + if (directory == NULL) { + g_free(duplicated); + return NULL; + } + } else + base = duplicated; + + song = songvec_find(&directory->songs, base); + assert(song == NULL || song->parent == directory); + + g_free(duplicated); + return song; + +} + void directory_sort(struct directory *directory) { diff --git a/src/directory.h b/src/directory.h index cd5c53dfb..8207bd3a2 100644 --- a/src/directory.h +++ b/src/directory.h @@ -108,6 +108,16 @@ directory_prune_empty(struct directory *directory); struct directory * directory_lookup_directory(struct directory *directory, const char *uri); +/** + * Looks up a song by its relative URI. + * + * @param directory the parent (or grandparent, ...) directory + * @param uri the relative URI + * @return the song, or NULL if none was found + */ +struct song * +directory_lookup_song(struct directory *directory, const char *uri); + void directory_sort(struct directory *directory); |