Updated the ZAudioLibrary class, insert of facade object, to acess the lightmediascan...
[zukebox] / zukebox_server / src / plugins / audio_library / library.py
old mode 100644 (file)
new mode 100755 (executable)
index ee1f0bb..9f85861
 
 import os.path
-from lightmediascanner import LightMediaScanner
 
 from brisa.core.plugin import PluginInterface
 from brisa.core.config import manager as mgr
 from brisa.core import webserver
 
+from lightmediascanner import LightMediaScanner
+from zukebox_server.src.plugins.audio_library.zfacade import ZFacade
+
 plugin_section = "zukebox_server_plugin-audio-library"
+
+class AudioLibraryResource(webserver.CustomResource):
+
+    def get_render(self, uri, request):
+        id = uri.split("/")[-1].split("-")[1]
+        path = self.facade.get_file_path(id)
+        if path:
+            return webserver.StaticFile(str(id), path)
+        else:
+            return None
+
 class ZAudioLibrary(PluginInterface):
     """Audio Library enables sharing of locally stored audios
     
     """
-    name = "audio_library"
+    name = "zukebox_audio_library"
     usage = mgr.get_parameter_bool(plugin_section, "enable")
     db_path = mgr.get_parameter(plugin_section, "database_location")
-    lms = None
-    audio_types = ["audio-dummy", "id3", "ogg", "pls", "m3u", "rm", "asf", "flac"]
     containers = {}
     containers_cb = {}
+    lms = None
+    audio_types = ["audio-dummy", "id3", "ogg", "pls", "m3u", "rm", "asf", "flac"]
+    facade=ZFacade(self.db_path, webserver)
 
     def load(self):
         self._load_config()
-        self.do_scan()
-        self._load_audio()
+        self._load_scanner()
+
+        if self.usage_audio: 
+            self._load_audio()
+
+    def unload(self):
+        self.facade.exit()
 
     def publish(self, webserver):
-        webserver.add_resource(self.name, AudioLibraryResource())
+        #facade=ZFacade(self.db_path, webserver)
+        webserver.add_resource(AudioLibraryResource(self.name))
 
     def _load_config(self):
-        self.audio_folder = mgr.get_parameter(plugin_section, "audio_folder")
-        self.already_scanned = mgr.get_parameter_bool(plugin_section, ".scanned")
+        self.usage_audio = mgr.get_parameter_bool(plugin_section, 
+                                                  "enable_audio_listing")
+        self.audio_folders = mgr.get_parameter_as_list(plugin_section,
+                                                       "audio_folders",
+                                                       ":" )
+        self.already_scanned = mgr.get_parameter_bool(plugin_section,
+                                                      ".scanned")
+
         if not self.already_scanned:
             mgr.set_parameter(plugin_section, ".scanned", True)
             mgr.save()
 
-    def do_scan(self):
-        self.lms = LightMediaScanner(self.db_path, self.audio_types, "utf8",
-                3, 3)
-        self.lms.check(self.audio_folder)
-        self.lms.process(self.audio_folder)
+    def _load_scanner(self):
+        self.lms = LightMediaScanner(self.db_path)
+
+        for parser in self.audio_types:
+            self.lms.parser_find_and_add(parser)
 
     def _load_audio(self):
+        if self.already_scanned:
+            self._check_audio_folder(self.audio_folders)
+        else:
+            self._process_audio_folder()
+
         rp = self.plugin_manager.root_plugin
         audio_container = rp.get_container("Audio")
+
         if not audio_container:
             audio_container = rp.add_container("Audio", 0)
 
         self.all_container = rp.add_container("All Audios",
-                audio_container.id, self)
+                                              audio_container.id, self)
         self.containers[self.all_container.id] = self.all_container
+        self.containers_cb[self.all_container.id] = self.facade.get_audio_all()
+        
+        playlist_container = rp.get_container('Playlists')
 
-    def process_audio_folder(self):
+
+    def _process_audio_folder(self):
         if self.lms is not None:
-            self.lms.process(self.audio_folder)
+            for folder in self.audio_folders:
+                self.lms.process(folder)
         else:
             raise Exception("Could not process audio folder lms is None")
 
-    def check_audio_folder(self):
+    def _check_audio_folder(self):
         if self.lms is not None:
-            self.lms.check(self.audio_folder)
+            for folder in self.audio_folder:
+                self.lms.check(folder)
         else:
             raise Exception("Could not check audio folder lms is None")
 
-    def browse(self,id, browse_flag, filter, starting_index, requested_count, sort_criteria):
+    def browse(self,id, browse_flag, filter, starting_index, requested_count,
+               sort_criteria):
         if id in self.containers:
             if not self.containers[id].items:
-                # add the items from callback
                 self.containers[id].items = self.containers_cb[id]()
             return self.containers[id].items
+        else:
+            return self._inner_browse(id)
 
-class AudioLibraryResource(webserver.CustomResource):
-    def get_render(self, uri, request):
-        id = uri.split("/")[-1].split("-")[1]
-        #path = 
-        return webserver.Data("", "")
+
+    def _inner_browse(self, id):
+        namespace, id = id.split(':')[1].split('-')
+        if not namespace or not id:
+            return []
+        
+        return {'audio': lambda id: self.facade.get_audio_item(id),
+                'genre': lambda id: self.facade.get_audio_genre(id),
+                'album': lambda id: self.facade.get_audio_album(id),
+                'artist': lambda id: self.facade.get_audio_artist(id)
+               }