emmental/trackdb/__init__.py

86 lines
2.2 KiB
Python
Raw Normal View History

# Copyright 2020 (c) Anna Schumaker.
from . import allocator
from . import tags
from . import track
import lib
import pathlib
import threading
File = "trackdb.pickle"
Bus = lib.bus.Bus(500)
Tracks = allocator.TrackAllocator()
class LibraryTag(lib.tag.Tag):
def __init__(self, path):
super().__init__(path)
self.clear = lib.thread.Thread(self.__do_clear__)
self.scan = lib.thread.Thread(self.__do_scan__)
def __setstate__(self, state):
super().__setstate__(state)
self.tracks = [ Tracks[i] for i in state["tracks"] ]
self.clear = lib.thread.Thread(self.__do_clear__)
self.scan = lib.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(lib.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 lib.data.DataFile(File, lib.data.WRITE) as f:
f.pickle([ tags.get_state(), Tracks, Library ])
def save(*args):
Bus.board(_do_save)
def load():
global Library
global Tracks
with lib.data.DataFile(File, lib.data.READ) as f:
if f.exists():
(tagstate, Tracks, Library) = f.unpickle()
tags.set_state(*tagstate)
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()
Bus.clear()
lib.data.DataFile(File, lib.data.READ).remove()
__register_callbacks()