-
Notifications
You must be signed in to change notification settings - Fork 0
/
library_controller.py
118 lines (81 loc) · 3.42 KB
/
library_controller.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import os
from functools import partial
from PyQt5 import QtCore
from library import Library, RemoteLibrary
from storage import GoogleStorage
class StorageThread(QtCore.QThread):
initialized = QtCore.pyqtSignal()
def run(self):
self.storage = GoogleStorage(host_mode=True)
if self.storage.initialized:
self.initialized.emit()
class LibraryController(QtCore.QObject):
def __init__(self, controller, ui):
super().__init__()
self.controller = controller
self.ui = ui
# TODO: load asynchronously, especially the storage code that calls an API.
self.libraries = {}
folders = os.getenv('RD_LIBRARY')
if not folders:
return
for folder in folders.split(':'):
new_library = Library(folder)
self.libraries[new_library.name] = new_library
self.load_track_list(new_library)
self.storage_thread = StorageThread()
self.storage_thread.initialized.connect(self.storage_initialized)
self.storage_thread.start()
def storage_initialized(self):
# host mode
# assume that the local folder and the remote folder are in sync
bucket = os.getenv('RD_STORAGE_GOOGLE_BUCKET')
for library in self.libraries.values():
if isinstance(library, RemoteLibrary):
continue
name = library.name
token = self.storage_thread.storage.token
self.controller.social_controller.greetings.add(f'LIBRARY {bucket} {name} {token}')
def receive(self, timetamp, sender, value):
bucket, name, token = value.split(' ')
for library in self.libraries.values():
print('find', library.name)
if (isinstance(library, RemoteLibrary)
and library.bucket == bucket
and library.name == name):
library.token = token
return
else:
try:
new_library = RemoteLibrary(bucket, name, token)
except Exception as e:
raise e
self.libraries[new_library.name] = new_library
self.load_track_list(new_library)
def load_track_list(self, library):
index, track_list = self.ui.add_track_list(library.name, remote=isinstance(library, RemoteLibrary))
callback = partial(self.load_track, library_name=library.name)
track_list.track_selected.connect(callback)
self.ui.set_track_list(index, library.get_list())
@QtCore.pyqtSlot(int, str)
def load_track(self, deck=-1, name=None, library_name=None, send=True):
if not name:
raise Exception
if deck < 0:
deck = 0
self.ui.decks[deck].track_info.setText('loading...')
self.ui.decks[deck].repaint()
if not library_name:
# search everywhere
library_name = self.find_name_in_library(name)
track = self.libraries[library_name].get(name)
if send is True:
self.controller.send_load(deck, name) # TODO load earlier
self.controller.engine.load_track(deck, track)
self.ui.decks[deck].track_info.setText(name)
def find_name_in_library(self, name):
for library in self.libraries.values():
if name in library.tracks:
return library.name
else:
raise Exception('File name not found in libraries')