From 10fd3292fd2c11506eafb219b654d63d930d3807 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Sun, 10 Nov 2013 16:09:31 -0500 Subject: [PATCH] library: Scan a directory I don't build up a complete set of databases yet, but I do create the Artist name database to use later. Signed-off-by: Anna Schumaker --- include/library.h | 17 ++++++ lib/Sconscript | 2 +- lib/library.cpp | 106 +++++++++++++++++++++++++++++++++++++- tests/library/library.cpp | 17 ++++++ 4 files changed, 139 insertions(+), 3 deletions(-) diff --git a/include/library.h b/include/library.h index d24c736a..2b0c3f74 100644 --- a/include/library.h +++ b/include/library.h @@ -18,6 +18,22 @@ namespace library DB_TRACK, }; + + class Artist : public DatabaseEntry { + public: + std:: string name; + + Artist(); + Artist(const std :: string &); + void read(File &); + void write(File &); +#ifdef CONFIG_DEBUG + void print(); +#endif /* CONFIG_DEBUG */ + bool operator==(const Artist &); + }; + + class Library : public DatabaseEntry { public: std::string root_path; @@ -37,6 +53,7 @@ namespace library void init(); bool add_path(const std::string &); void del_path(unsigned int); + void update_path(unsigned int); #ifdef CONFIG_DEBUG void print_db(DB_Type); void reset(); diff --git a/lib/Sconscript b/lib/Sconscript index 3bb38bb7..52690be8 100644 --- a/lib/Sconscript +++ b/lib/Sconscript @@ -21,7 +21,7 @@ modules = { "GROUP" : Module("group.cpp", depends = [ "INDEX" ]), "IDLE" : Module("idle.cpp"), "INDEX" : Module("index.cpp", depends = [ "FILE" ]), - "LIBRARY" : Module("library.cpp", depends = [ "DATABASE", "IDLE" ]), + "LIBRARY" : Module("library.cpp", package = "taglib", depends = [ "DATABASE", "IDLE" ]), ########################### ########################### diff --git a/lib/library.cpp b/lib/library.cpp index 376be636..2c308089 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -4,12 +4,51 @@ #include #include +#include +#include - +static Database artist_db("artist.db", DB_UNIQUE); static Database library_db("library.db", DB_NORMAL); +/* + * library :: Artist: Artist tag information + */ +library :: Artist :: Artist() + : name("") +{ +} + +library :: Artist :: Artist(const std::string &artist_name) + : name(artist_name) +{ +} + +void library :: Artist :: read(File &f) +{ + name = f.getline(); +} + +void library :: Artist :: write(File &f) +{ + f << name; +} + +#ifdef CONFIG_DEBUG +void library :: Artist :: print() +{ + :: print("Artist: %s", name.c_str()); +} +#endif /* CONFIG_DEBUG */ + +bool library :: Artist :: operator==(const library :: Artist &rhs) +{ + return name == rhs.name; +} + + + /* * library :: Library: Basic information about each directory in the library */ @@ -53,6 +92,54 @@ bool library :: Library :: operator==(library :: Library &rhs) +/* + * Internal library functions + */ +static void do_update(unsigned int, const std :: string &); + +static void read_tags(unsigned int lib_id, const std :: string &path) +{ + TagLib :: Tag *tag; + TagLib :: FileRef ref(path.c_str()); + + if (ref.isNull()) { + print("ERROR: Could not read tags for file %s", path.c_str()); + return; + } + + tag = ref.tag(); + artist_db.insert(tag->artist().to8Bit(true)); +} + +static void process_path(unsigned int lib_id, const std :: string &dir, + const std :: string &name) +{ + std :: string path = dir + "/" + name; + + if (g_file_test(path.c_str(), G_FILE_TEST_IS_DIR) == true) + do_update(lib_id, path); + else + read_tags(lib_id, path); +} + +static void do_update(unsigned int lib_id, const std :: string &path) +{ + GDir *dir; + const char *name; + + dir = g_dir_open(path.c_str(), 0, NULL); + if (dir == NULL) + return; + + name = g_dir_read_name(dir); + while (name != NULL) { + process_path(lib_id, path, name); + name = g_dir_read_name(dir); + } +} + + + /* * API used by the GUI begins here */ @@ -64,11 +151,13 @@ void library :: init() bool library :: add_path(const std::string &dir) { + unsigned int id; if (g_file_test(dir.c_str(), G_FILE_TEST_IS_DIR) == false) return false; - library_db.insert(library :: Library(dir, true)); + id = library_db.insert(library :: Library(dir, true)); library_db.save(); + update_path(id); return true; } @@ -78,10 +167,22 @@ void library :: del_path(unsigned int id) library_db.save(); } +void library :: update_path(unsigned int id) +{ + if (id > library_db.size()) + return; + if (library_db[id].valid == false) + return; + do_update(id, library_db[id].root_path); +} + #ifdef CONFIG_DEBUG void library :: print_db(DB_Type type) { switch (type) { + case DB_ARTIST: + artist_db.print(); + break; case DB_LIBRARY: library_db.print(); break; @@ -92,6 +193,7 @@ void library :: print_db(DB_Type type) void library :: reset() { + artist_db.clear(); library_db.clear(); } #endif /* CONFIG_DEBUG */ diff --git a/tests/library/library.cpp b/tests/library/library.cpp index d6c7d0fd..939700fa 100644 --- a/tests/library/library.cpp +++ b/tests/library/library.cpp @@ -29,6 +29,13 @@ void test_del_dir(const std::string &test, const unsigned int path_id) library :: print_db(library :: DB_LIBRARY); } +void test_print_dbs(const std::string &test) +{ + print("Test %s\n", test.c_str()); + library :: print_db(library :: DB_GENRE); +} + + /* Add paths library that SHOULD fail */ void test_0() { @@ -77,6 +84,15 @@ void test_3() print("\n"); } +/* Test scanning a single path */ +void test_4() +{ + library :: reset(); + test_add_dir("4a", "/tmp/library/0", true); + + library :: print_db(library :: DB_ARTIST); +} + int main(int argc, char **argv) { gen_library(); @@ -85,5 +101,6 @@ int main(int argc, char **argv) test_1(); test_2(); test_3(); + test_4(); return 0; }