emmental/trackdb/__init__.py

86 lines
2.0 KiB
Python
Raw Normal View History

# Copyright 2020 (c) Anna Schumaker.
from lib import data
from lib import idle
from lib import publisher
from . import library
from . import track
import pathlib
import threading
db_file = "trackdb.pickle"
need_save = False
idle_id = None
save_lock = threading.Lock()
library_paths = [ ]
LibraryAdded = publisher.Publisher()
LibraryRemoved = publisher.Publisher()
def add_path(path):
if get_library(path) == None:
lib = library.LibraryPath(path)
library_paths.append(lib)
LibraryAdded.publish(lib)
return lib
def get_library(path):
for lib in library_paths:
if lib.path == pathlib.Path(path):
return lib
return None
def get_track(trackid):
for lib in library_paths:
if (track := lib[trackid]) != None:
return track
return None
def remove_path(path):
lib = get_library(path)
library_paths.remove(lib)
LibraryRemoved.publish(lib)
def _do_save():
global need_save
global idle_id
with save_lock:
if need_save == False:
idle_id = None
return idle.REMOVE
with data.DataFile(db_file, data.WRITE) as f:
with library.IDLock:
f.pickle([ library.NextID, library_paths ])
need_save = False
return idle.CONTINUE
def save(*args):
global need_save
global idle_id
with save_lock:
if need_save == False:
need_save = True
if idle_id == None:
idle_id = idle.add(_do_save)
def __register_callbacks():
LibraryAdded.register(save)
LibraryRemoved.register(save)
library.TrackAdded.register(save)
library.TrackRemoved.register(save)
track.TrackUpdated.register(save)
__register_callbacks()
def reset():
global need_save
global idle_id
library_paths.clear()
LibraryAdded.reset()
LibraryRemoved.reset()
library.reset()
track.reset()
data.DataFile(db_file, data.READ).remove()
__register_callbacks()
need_save = False
idle_id = None