aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/database.c26
-rw-r--r--src/directory.c30
-rw-r--r--src/directory.h10
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);