2020-10-04 12:58:15 -04:00
|
|
|
# Copyright 2020 (c) Anna Schumaker.
|
2021-06-26 09:19:12 -04:00
|
|
|
from . import allocator
|
2021-06-23 16:48:10 -04:00
|
|
|
from . import tags
|
2020-10-24 21:21:38 -04:00
|
|
|
from . import track
|
2021-06-27 10:15:31 -04:00
|
|
|
import lib
|
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
|
|
|
|
2021-06-27 10:15:31 -04:00
|
|
|
File = "trackdb.pickle"
|
|
|
|
Bus = lib.bus.Bus(500)
|
2021-06-26 09:19:12 -04:00
|
|
|
Tracks = allocator.TrackAllocator()
|
|
|
|
|
2021-06-27 10:15:31 -04:00
|
|
|
class LibraryTag(lib.tag.Tag):
|
2021-06-26 09:19:12 -04:00
|
|
|
def __init__(self, path):
|
|
|
|
super().__init__(path)
|
2021-06-27 10:15:31 -04:00
|
|
|
self.clear = lib.thread.Thread(self.__do_clear__)
|
|
|
|
self.scan = lib.thread.Thread(self.__do_scan__)
|
2021-06-26 09:19:12 -04:00
|
|
|
|
|
|
|
def __setstate__(self, state):
|
|
|
|
super().__setstate__(state)
|
2021-06-27 10:15:31 -04:00
|
|
|
self.clear = lib.thread.Thread(self.__do_clear__)
|
|
|
|
self.scan = lib.thread.Thread(self.__do_scan__)
|
2021-06-26 09:19:12 -04:00
|
|
|
|
|
|
|
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()
|
2021-06-25 13:32:36 -04:00
|
|
|
|
2021-06-29 13:53:37 -04:00
|
|
|
def fix_tracks(self):
|
|
|
|
for (index, trak) in enumerate(self.tracks):
|
|
|
|
t = Tracks[trak]
|
|
|
|
if t is not None:
|
|
|
|
self.tracks[index] = t
|
|
|
|
|
|
|
|
|
2021-06-25 13:32:36 -04:00
|
|
|
|
2021-06-27 10:15:31 -04:00
|
|
|
class LibraryStore(lib.tagstore.TagStore):
|
2021-06-25 13:32:36 -04:00
|
|
|
def __alloc_tag__(self, name, sort):
|
2021-06-26 09:19:12 -04:00
|
|
|
return LibraryTag(name)
|
2021-06-25 13:32:36 -04:00
|
|
|
|
|
|
|
def add(self, name):
|
|
|
|
return super().__add_tag__(name, None, None)
|
|
|
|
|
|
|
|
def remove(self, lib):
|
|
|
|
lib.clear()
|
|
|
|
super().remove(lib)
|
|
|
|
|
2021-06-29 13:53:37 -04:00
|
|
|
def fix_tracks(self):
|
|
|
|
for (id, tag) in self.store.items():
|
|
|
|
tag.fix_tracks()
|
|
|
|
|
2021-06-25 13:32:36 -04:00
|
|
|
Library = LibraryStore()
|
|
|
|
|
2020-10-04 12:58:15 -04:00
|
|
|
|
2020-10-24 21:21:38 -04:00
|
|
|
def _do_save():
|
2021-07-01 10:14:20 -04:00
|
|
|
try:
|
|
|
|
with lib.data.DataFile(File, lib.data.WRITE) as f:
|
|
|
|
f.pickle([ tags.get_state(), Tracks, Library ])
|
|
|
|
except Exception as e:
|
|
|
|
return lib.bus.RETRY
|
2020-10-24 21:21:38 -04:00
|
|
|
|
|
|
|
def save(*args):
|
2021-06-27 10:15:31 -04:00
|
|
|
Bus.board(_do_save)
|
2020-10-24 21:21:38 -04:00
|
|
|
|
2020-10-25 09:02:19 -04:00
|
|
|
def load():
|
2021-06-25 11:14:55 -04:00
|
|
|
global Library
|
2021-06-26 09:19:12 -04:00
|
|
|
global Tracks
|
2021-06-27 10:15:31 -04:00
|
|
|
with lib.data.DataFile(File, lib.data.READ) as f:
|
2021-06-07 10:02:35 -04:00
|
|
|
if f.exists():
|
2021-06-27 10:15:31 -04:00
|
|
|
(tagstate, Tracks, Library) = f.unpickle()
|
|
|
|
tags.set_state(*tagstate)
|
2021-06-29 13:53:37 -04:00
|
|
|
Tracks.load_tags()
|
|
|
|
Library.fix_tracks()
|
2020-10-25 09:02:19 -04:00
|
|
|
|
2020-10-24 21:21:38 -04:00
|
|
|
def __register_callbacks():
|
2021-06-25 11:14:55 -04:00
|
|
|
Library.Added.register(save)
|
|
|
|
Library.Removed.register(save)
|
2021-06-26 09:19:12 -04:00
|
|
|
Tracks.Added.register(save)
|
|
|
|
Tracks.Removed.register(save)
|
|
|
|
Tracks.Updated.register(save)
|
2020-10-24 21:21:38 -04:00
|
|
|
__register_callbacks()
|
|
|
|
|
2020-10-04 12:58:15 -04:00
|
|
|
def reset():
|
2021-06-26 09:19:12 -04:00
|
|
|
Tracks.reset()
|
2021-06-25 11:14:55 -04:00
|
|
|
Library.reset()
|
2021-06-23 16:48:10 -04:00
|
|
|
tags.reset()
|
2021-06-27 10:15:31 -04:00
|
|
|
Bus.clear()
|
2020-10-24 21:21:38 -04:00
|
|
|
|
2021-06-27 10:15:31 -04:00
|
|
|
lib.data.DataFile(File, lib.data.READ).remove()
|
2020-10-24 21:21:38 -04:00
|
|
|
__register_callbacks()
|