From 7ea14392ecb857e755dca5c971cb37ddeb8914ba Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Wed, 25 Aug 2021 12:11:47 -0400 Subject: [PATCH] scanner: Add a DirectoryTask For iterating through a directory and creating tasks based on the files found. I had to add a subdirectory to the Test Album to make sure subdirs are handled properly here. Signed-off-by: Anna Schumaker --- scanner/task.py | 17 +++++++++++++++++ scanner/test_task.py | 25 +++++++++++++++++++++++++ tools/generate_tracks.py | 1 + 3 files changed, 43 insertions(+) diff --git a/scanner/task.py b/scanner/task.py index d3dc6ab..459ee32 100644 --- a/scanner/task.py +++ b/scanner/task.py @@ -44,3 +44,20 @@ class ImportTask(FileTask): FileTask.run_task(self) if track := db.track.Table.lookup(self.filepath): track.last_played(self.playcount, self.lastplayed) + + +class DirectoryTask(Task): + def __init__(self, library, dirpath): + Task.__init__(self) + self.library = library + self.dirpath = dirpath + + def run_task(self): + res = [ ] + for f in self.dirpath.iterdir(): + if f.is_file(): + res.append(FileTask(self.library, f)) + elif f.is_dir(): + res.append(DirectoryTask(self.library, f)) + res.append(CommitTask()) + return res diff --git a/scanner/test_task.py b/scanner/test_task.py index 2a3df07..5576dde 100644 --- a/scanner/test_task.py +++ b/scanner/test_task.py @@ -82,3 +82,28 @@ class TestScannerImportTask(unittest.TestCase): self.assertEqual(track.playcount, 4) self.assertEqual(track.lastplayed, datetime.datetime.combine(today, datetime.time())) + + +class TestScannerDirectoryTask(unittest.TestCase): + def setUp(self): + db.reset() + + def test_scanner_directory_task(self): + lib = db.library.Table.find(test_tracks) + dt = task.DirectoryTask(lib, test_tracks) + + self.assertIsInstance(dt, task.Task) + self.assertEqual(dt.library, lib) + self.assertEqual(dt.dirpath, test_tracks) + + tasks = dt.run_task() + self.assertIsNotNone(tasks) + self.assertEqual(len(tasks), 15) + + file_tasks = [ t for t in tasks if isinstance(t, task.FileTask) ] + dir_tasks = [ t for t in tasks if isinstance(t, task.DirectoryTask) ] + commit_task = [ t for t in tasks if isinstance(t, task.CommitTask) ] + + self.assertEqual(len(file_tasks), 13) + self.assertEqual(len(dir_tasks), 1) + self.assertEqual(len(commit_task), 1) diff --git a/tools/generate_tracks.py b/tools/generate_tracks.py index a060ebd..fd14d57 100644 --- a/tools/generate_tracks.py +++ b/tools/generate_tracks.py @@ -77,6 +77,7 @@ generate_track(60, "Test Album/11 - Test Track 11.ogg", { "Title" : "Test Track "tracknumber" : "11" }) with open(os.path.join(data, "Test Album/text.txt"), 'w') as f: f.write("Test Text") +os.makedirs("data/Test Album/Test Subdir", exist_ok=True) # Create a giant library for testing for artistno in range(1, 26):