emmental/scanner/task.py

135 lines
3.7 KiB
Python

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