4 from brisa.core.plugin import PluginInterface
5 from brisa.core.config import manager as mgr
6 from brisa.core import webserver
8 from lightmediascanner import LightMediaScanner
9 from zukebox_server.src.plugins.audio_library.zfacade import ZFacade
11 plugin_section = "zukebox_server_plugin-audio-library"
13 class AudioLibraryResource(webserver.CustomResource):
15 def get_render(self, uri, request):
16 id = uri.split("/")[-1].split("-")[1]
17 path = self.facade.get_file_path(id)
19 return webserver.StaticFile(str(id), path)
23 class ZAudioLibrary(PluginInterface):
24 """Audio Library enables sharing of locally stored audios
27 name = "zukebox_audio_library"
28 usage = mgr.get_parameter_bool(plugin_section, "enable")
29 db_path = mgr.get_parameter(plugin_section, "database_location")
33 audio_types = ["audio-dummy", "id3", "ogg", "pls", "m3u", "rm", "asf", "flac"]
34 facade=ZFacade(self.db_path, webserver)
46 def publish(self, webserver):
47 #facade=ZFacade(self.db_path, webserver)
48 webserver.add_resource(AudioLibraryResource(self.name))
50 def _load_config(self):
51 self.usage_audio = mgr.get_parameter_bool(plugin_section,
52 "enable_audio_listing")
53 self.audio_folders = mgr.get_parameter_as_list(plugin_section,
56 self.already_scanned = mgr.get_parameter_bool(plugin_section,
59 if not self.already_scanned:
60 mgr.set_parameter(plugin_section, ".scanned", True)
63 def _load_scanner(self):
64 self.lms = LightMediaScanner(self.db_path)
66 for parser in self.audio_types:
67 self.lms.parser_find_and_add(parser)
69 def _load_audio(self):
70 if self.already_scanned:
71 self._check_audio_folder(self.audio_folders)
73 self._process_audio_folder()
75 rp = self.plugin_manager.root_plugin
76 audio_container = rp.get_container("Audio")
78 if not audio_container:
79 audio_container = rp.add_container("Audio", 0)
81 self.all_container = rp.add_container("All Audios",
82 audio_container.id, self)
83 self.containers[self.all_container.id] = self.all_container
84 self.containers_cb[self.all_container.id] = self.facade.get_audio_all()
86 playlist_container = rp.get_container('Playlists')
89 def _process_audio_folder(self):
90 if self.lms is not None:
91 for folder in self.audio_folders:
92 self.lms.process(folder)
94 raise Exception("Could not process audio folder lms is None")
96 def _check_audio_folder(self):
97 if self.lms is not None:
98 for folder in self.audio_folder:
99 self.lms.check(folder)
101 raise Exception("Could not check audio folder lms is None")
103 def browse(self,id, browse_flag, filter, starting_index, requested_count,
105 if id in self.containers:
106 if not self.containers[id].items:
107 self.containers[id].items = self.containers_cb[id]()
108 return self.containers[id].items
110 return self._inner_browse(id)
113 def _inner_browse(self, id):
114 namespace, id = id.split(':')[1].split('-')
115 if not namespace or not id:
118 return {'audio': lambda id: self.facade.get_audio_item(id),
119 'genre': lambda id: self.facade.get_audio_genre(id),
120 'album': lambda id: self.facade.get_audio_album(id),
121 'artist': lambda id: self.facade.get_audio_artist(id)