library: Implement library path validation

I scan the track database and remove files that no longer exist.  I
don't yet add in new tracks found in the directories.

Signed-off-by: Anna Schumaker <schumaker.anna@gmail.com>
This commit is contained in:
Anna Schumaker 2013-12-22 15:38:27 -05:00 committed by Anna Schumaker
parent e0f28cb366
commit b759b9743d
3 changed files with 1470 additions and 287 deletions

View File

@ -235,7 +235,7 @@ void library :: Track :: print()
/*
* Internal library functions
*/
static void do_update(unsigned int, const std :: string &);
static void do_scan_path(unsigned int, const std :: string &);
static void read_tags(unsigned int lib_id, const std :: string &path)
{
@ -266,7 +266,7 @@ static void process_path(unsigned int lib_id, const std :: string &dir,
std :: string path = dir + "/" + name;
if (g_file_test(path.c_str(), G_FILE_TEST_IS_DIR) == true)
do_update(lib_id, path);
do_scan_path(lib_id, path);
else
read_tags(lib_id, path);
}
@ -279,7 +279,7 @@ static void save_all_dbs()
track_db.save();
}
static void do_update(unsigned int lib_id, const std :: string &path)
static void do_scan_path(unsigned int lib_id, const std :: string &path)
{
GDir *dir;
const char *name;
@ -296,6 +296,31 @@ static void do_update(unsigned int lib_id, const std :: string &path)
}
}
static void do_validate_library(unsigned int lib_id)
{
std :: string path;
if (track_db.size() == 0)
return;
for (unsigned int i = track_db.first(); i <= track_db.last(); i = track_db.next(i)) {
if (track_db[i].library_id != lib_id)
continue;
path = library_db[lib_id].root_path + "/" + track_db[i].filepath;
if (g_file_test(path.c_str(), G_FILE_TEST_EXISTS) == false) {
dprint("Removing file: %s\n", path.c_str());
track_db.remove(i);
}
}
}
static void do_update_library(unsigned int lib_id)
{
do_validate_library(lib_id);
do_scan_path(lib_id, library_db[lib_id].root_path);
}
/*
@ -331,7 +356,7 @@ void library :: update_path(unsigned int id)
return;
if (library_db[id].valid == false)
return;
do_update(id, library_db[id].root_path);
do_update_library(id);
}
bool library :: lookup(unsigned int id, library :: Song *song)

View File

@ -137,6 +137,27 @@ void test_5()
test_lookup("5d", 42, true);
/* Lookup beyond db */
test_lookup("5e", 100000, false);
print("\n");
}
/* Test validation code */
void test_6()
{
library :: reset();
test_add_dir("6a", "/tmp/library/0", true);
print("\n");
print("6b: Updating library 0 (nothing should change)\n");
library :: update_path(0);
library :: print_db(library :: DB_TRACK);
print("\n");
print("6c: Delete /tmp/library/0/Artist 2\n");
system("rm -rf /tmp/library/0/Artist\\ 2/");
library :: update_path(0);
library :: print_db(library :: DB_TRACK);
print("\n");
}
int main(int argc, char **argv)
@ -148,6 +169,7 @@ int main(int argc, char **argv)
test_2();
test_3();
test_4();
//test_5();
test_5();
test_6();
return 0;
}

File diff suppressed because it is too large Load Diff