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
 
 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 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"
 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
     
     """
 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")
     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 = {}
     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()
 
     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):
 
     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):
 
     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()
 
         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):
 
     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")
         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",
         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[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:
         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")
 
         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:
         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")
 
         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:
         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
                 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)
+               }