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 <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-08-25 12:11:47 -04:00
parent 9cced017ad
commit 7ea14392ec
3 changed files with 43 additions and 0 deletions

View File

@ -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

View File

@ -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)

View File

@ -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):