emmental/trackdb/__init__.py

90 lines
2.4 KiB
Python
Raw Normal View History

# Copyright 2020 (c) Anna Schumaker.
from lib import bus
from lib import data
from lib import publisher
from lib import tag
from lib import tagstore
from lib import thread
from . import allocator
from . import tags
from . import track
import pathlib
import threading
db_file = "trackdb.pickle"
save_bus = bus.Bus(500)
Tracks = allocator.TrackAllocator()
class LibraryTag(tag.Tag):
def __init__(self, path):
super().__init__(path)
self.clear = thread.Thread(self.__do_clear__)
self.scan = thread.Thread(self.__do_scan__)
def __setstate__(self, state):
super().__setstate__(state)
self.tracks = [ Tracks[i] for i in state["tracks"] ]
self.clear = thread.Thread(self.__do_clear__)
self.scan = thread.Thread(self.__do_scan__)
def __do_scan__(self):
for trak in Tracks.autoremove(self):
self.remove_track(trak)
track_set = set([ t.filepath() for t in Tracks.list_tracks(self) ])
for f in self.name.rglob("*"):
if f not in track_set and f.is_file():
if (track := Tracks.allocate(self, f)) != None:
self.add_track(track)
def __do_clear__(self):
for trak in self.tracks:
Tracks.remove(trak)
self.tracks.clear()
class LibraryStore(tagstore.TagStore):
def __alloc_tag__(self, name, sort):
return LibraryTag(name)
def add(self, name):
return super().__add_tag__(name, None, None)
def remove(self, lib):
lib.clear()
super().remove(lib)
Library = LibraryStore()
def _do_save():
with data.DataFile(db_file, data.WRITE) as f:
f.pickle([ tags.Artist, tags.Album, tags.Genre, tags.Decade, tags.Year, Tracks, Library ])
def save(*args):
save_bus.board(_do_save)
def load():
global Library
global Tracks
with data.DataFile(db_file, data.READ) as f:
if f.exists():
(tags.Artist, tags.Album, tags.Genre, tags.Decade, tags.Year, Tracks, Library) = f.unpickle()
def __register_callbacks():
Library.Added.register(save)
Library.Removed.register(save)
Tracks.Added.register(save)
Tracks.Removed.register(save)
Tracks.Updated.register(save)
__register_callbacks()
def reset():
Tracks.reset()
Library.reset()
tags.reset()
save_bus.clear()
data.DataFile(db_file, data.READ).remove()
__register_callbacks()