2020-10-04 12:58:15 -04:00
|
|
|
# Copyright 2020 (c) Anna Schumaker.
|
2020-10-24 21:21:38 -04:00
|
|
|
from lib import data
|
|
|
|
from lib import idle
|
2020-10-10 20:07:53 -04:00
|
|
|
from lib import publisher
|
2020-10-04 15:28:30 -04:00
|
|
|
from . import library
|
2020-10-24 21:21:38 -04:00
|
|
|
from . import track
|
2020-10-04 15:28:30 -04:00
|
|
|
import pathlib
|
2020-10-24 21:21:38 -04:00
|
|
|
import threading
|
2020-10-04 12:58:15 -04:00
|
|
|
|
2020-10-24 21:21:38 -04:00
|
|
|
db_file = "trackdb.pickle"
|
|
|
|
need_save = False
|
|
|
|
idle_id = None
|
|
|
|
save_lock = threading.Lock()
|
2020-10-04 12:58:15 -04:00
|
|
|
library_paths = [ ]
|
2020-10-10 20:07:53 -04:00
|
|
|
LibraryAdded = publisher.Publisher()
|
|
|
|
LibraryRemoved = publisher.Publisher()
|
2020-10-04 12:58:15 -04:00
|
|
|
|
|
|
|
def add_path(path):
|
2020-10-04 15:28:30 -04:00
|
|
|
if get_library(path) == None:
|
|
|
|
lib = library.LibraryPath(path)
|
|
|
|
library_paths.append(lib)
|
2020-10-10 20:07:53 -04:00
|
|
|
LibraryAdded.publish(lib)
|
2020-10-04 15:28:30 -04:00
|
|
|
return lib
|
|
|
|
|
|
|
|
def get_library(path):
|
|
|
|
for lib in library_paths:
|
|
|
|
if lib.path == pathlib.Path(path):
|
|
|
|
return lib
|
|
|
|
return None
|
2020-10-04 12:58:15 -04:00
|
|
|
|
2020-10-11 10:03:16 -04:00
|
|
|
def get_track(trackid):
|
|
|
|
for lib in library_paths:
|
|
|
|
if (track := lib[trackid]) != None:
|
|
|
|
return track
|
|
|
|
return None
|
|
|
|
|
2020-10-04 12:58:15 -04:00
|
|
|
def remove_path(path):
|
2020-10-04 15:28:30 -04:00
|
|
|
lib = get_library(path)
|
|
|
|
library_paths.remove(lib)
|
2020-10-10 20:07:53 -04:00
|
|
|
LibraryRemoved.publish(lib)
|
2020-10-04 12:58:15 -04:00
|
|
|
|
2020-10-24 21:21:38 -04:00
|
|
|
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()
|
|
|
|
|
2020-10-04 12:58:15 -04:00
|
|
|
def reset():
|
2020-10-24 21:21:38 -04:00
|
|
|
global need_save
|
|
|
|
global idle_id
|
2020-10-04 12:58:15 -04:00
|
|
|
library_paths.clear()
|
2020-10-10 20:07:53 -04:00
|
|
|
LibraryAdded.reset()
|
|
|
|
LibraryRemoved.reset()
|
2020-10-10 20:23:28 -04:00
|
|
|
library.reset()
|
2020-10-20 11:10:04 -04:00
|
|
|
track.reset()
|
2020-10-24 21:21:38 -04:00
|
|
|
|
|
|
|
data.DataFile(db_file, data.READ).remove()
|
|
|
|
__register_callbacks()
|
|
|
|
need_save = False
|
|
|
|
idle_id = None
|