2021-08-25 10:41:39 -04:00
|
|
|
# Copyright 2021 (c) Anna Schumaker.
|
2021-08-25 10:46:57 -04:00
|
|
|
import db
|
2021-10-10 16:22:13 -04:00
|
|
|
import datetime
|
2021-08-25 10:41:39 -04:00
|
|
|
from gi.repository import GObject
|
2021-08-25 11:28:40 -04:00
|
|
|
from . import metadata
|
2021-08-25 10:41:39 -04:00
|
|
|
|
|
|
|
class Task(GObject.GObject):
|
|
|
|
def run_task(self): raise NotImplementedError
|
2021-08-25 10:46:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
class CommitTask(Task):
|
2021-12-09 22:09:40 -05:00
|
|
|
def run_task(self):
|
|
|
|
db.sql.commit()
|
|
|
|
db.sql.optimize()
|
2021-08-25 11:28:40 -04:00
|
|
|
|
|
|
|
|
|
|
|
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())
|
2021-11-13 21:12:15 -05:00
|
|
|
album = artist.find_album(meta.album(), meta.release())
|
2021-10-10 11:43:02 -04:00
|
|
|
disc = album.find_disc(meta.discnumber(), meta.discsubtitle())
|
2021-10-09 16:20:24 -04:00
|
|
|
decade = db.decade.Table.find(meta.decade())
|
2021-10-09 15:31:23 -04:00
|
|
|
year = decade.find_year(meta.year())
|
2021-10-09 16:20:24 -04:00
|
|
|
track = db.track.Table.insert(self.library, artist, album, disc,
|
|
|
|
decade, year, meta.tracknumber(),
|
|
|
|
meta.length(), meta.title(),
|
|
|
|
self.filepath)
|
2021-08-25 11:28:40 -04:00
|
|
|
for genre in meta.genres():
|
2021-10-15 16:06:02 -04:00
|
|
|
db.genre.Table.find(genre).add_track(track)
|
2021-08-25 11:36:50 -04:00
|
|
|
|
|
|
|
|
2021-08-25 12:11:47 -04:00
|
|
|
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
|
2021-08-25 16:09:18 -04:00
|
|
|
|
|
|
|
|
|
|
|
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:
|
2021-10-07 13:58:09 -04:00
|
|
|
db.sql.commit()
|
2021-08-25 16:54:09 -04:00
|
|
|
|
|
|
|
|
|
|
|
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() ]
|
2021-08-26 10:28:36 -04:00
|
|
|
|
|
|
|
|
|
|
|
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)
|
2021-10-07 13:58:09 -04:00
|
|
|
db.sql.commit()
|
2021-08-26 10:36:32 -04:00
|
|
|
|
|
|
|
|
|
|
|
class RemoveLibraryTask(Task):
|
|
|
|
def __init__(self, library):
|
|
|
|
Task.__init__(self)
|
|
|
|
self.library = library
|
|
|
|
|
|
|
|
def run_task(self):
|
|
|
|
db.library.Table.delete(self.library)
|
2021-10-07 13:58:09 -04:00
|
|
|
db.sql.commit()
|
2021-08-26 10:53:32 -04:00
|
|
|
|
|
|
|
|
|
|
|
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) ]
|
2021-11-05 15:26:55 -04:00
|
|
|
|
|
|
|
|
|
|
|
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)
|