# Copyright 2021 (c) Anna Schumaker. import db import datetime from gi.repository import GObject from . import metadata class Task(GObject.GObject): def run_task(self): raise NotImplementedError class CommitTask(Task): def run_task(self): db.sql.commit() db.sql.optimize() class FileTask(Task): def __init__(self, library, filepath): Task.__init__(self) self.library = library self.filepath = filepath def run_task(self): if db.track.Table.lookup(self.filepath): return with metadata.Metadata(self.filepath) as meta: artist = db.artist.Table.find(meta.artist(), meta.artistsort()) album = artist.find_album(meta.album(), meta.release()) disc = album.find_disc(meta.discnumber(), meta.discsubtitle()) decade = db.decade.Table.find(meta.decade()) year = decade.find_year(meta.year()) track = db.track.Table.insert(self.library, artist, album, disc, decade, year, meta.tracknumber(), meta.length(), meta.title(), self.filepath) for genre in meta.genres(): db.genre.Table.find(genre).add_track(track) 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 class CheckTask(Task): def __init__(self, tracks): Task.__init__(self) self.tracks = tracks def run_task(self): need_commit = False for track in self.tracks: if not track.path.exists(): db.track.Table.delete(track) need_commit = True if need_commit: db.sql.commit() class CheckSchedulerTask(Task): def __init__(self, library): Task.__init__(self) self.library = library def track_chunks(self): tracks = self.library.tracks() while len(tracks) > 0: res = tracks[:50] tracks = tracks[50:] yield res def run_task(self): return [ CheckTask(tracks) for tracks in self.track_chunks() ] class RemoveTask(Task): def __init__(self, tracks): Task.__init__(self) self.tracks = tracks def run_task(self): for track in self.tracks: db.track.Table.delete(track) db.sql.commit() class RemoveLibraryTask(Task): def __init__(self, library): Task.__init__(self) self.library = library def run_task(self): db.library.Table.delete(self.library) db.sql.commit() class RemoveLibrarySchedulerTask(Task): def __init__(self, library): Task.__init__(self) self.library = library def track_chunks(self): tracks = self.library.tracks() while len(tracks) > 0: res = tracks[:50] tracks = tracks[50:] yield res def run_task(self): return [ RemoveTask(tracks) for tracks in self.track_chunks() ] + \ [ RemoveLibraryTask(self.library) ] class EnableLibraryTask(Task): def __init__(self, library, enable): Task.__init__(self) self.library = library self.enable = enable def run_task(self): self.library.set_property("enabled", self.enable)