9f858617119a0e79919c6f45da487289a7f14678
[zukebox] / zukebox_server / src / plugins / audio_library / library.py
1
2 import os.path
3
4 from brisa.core.plugin import PluginInterface
5 from brisa.core.config import manager as mgr
6 from brisa.core import webserver
7
8 from lightmediascanner import LightMediaScanner
9 from zukebox_server.src.plugins.audio_library.zfacade import ZFacade
10
11 plugin_section = "zukebox_server_plugin-audio-library"
12
13 class AudioLibraryResource(webserver.CustomResource):
14
15     def get_render(self, uri, request):
16         id = uri.split("/")[-1].split("-")[1]
17         path = self.facade.get_file_path(id)
18         if path:
19             return webserver.StaticFile(str(id), path)
20         else:
21             return None
22
23 class ZAudioLibrary(PluginInterface):
24     """Audio Library enables sharing of locally stored audios
25     
26     """
27     name = "zukebox_audio_library"
28     usage = mgr.get_parameter_bool(plugin_section, "enable")
29     db_path = mgr.get_parameter(plugin_section, "database_location")
30     containers = {}
31     containers_cb = {}
32     lms = None
33     audio_types = ["audio-dummy", "id3", "ogg", "pls", "m3u", "rm", "asf", "flac"]
34     facade=ZFacade(self.db_path, webserver)
35
36     def load(self):
37         self._load_config()
38         self._load_scanner()
39
40         if self.usage_audio: 
41             self._load_audio()
42
43     def unload(self):
44         self.facade.exit()
45
46     def publish(self, webserver):
47         #facade=ZFacade(self.db_path, webserver)
48         webserver.add_resource(AudioLibraryResource(self.name))
49
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,
54                                                        "audio_folders",
55                                                        ":" )
56         self.already_scanned = mgr.get_parameter_bool(plugin_section,
57                                                       ".scanned")
58
59         if not self.already_scanned:
60             mgr.set_parameter(plugin_section, ".scanned", True)
61             mgr.save()
62
63     def _load_scanner(self):
64         self.lms = LightMediaScanner(self.db_path)
65
66         for parser in self.audio_types:
67             self.lms.parser_find_and_add(parser)
68
69     def _load_audio(self):
70         if self.already_scanned:
71             self._check_audio_folder(self.audio_folders)
72         else:
73             self._process_audio_folder()
74
75         rp = self.plugin_manager.root_plugin
76         audio_container = rp.get_container("Audio")
77
78         if not audio_container:
79             audio_container = rp.add_container("Audio", 0)
80
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()
85         
86         playlist_container = rp.get_container('Playlists')
87
88
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)
93         else:
94             raise Exception("Could not process audio folder lms is None")
95
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)
100         else:
101             raise Exception("Could not check audio folder lms is None")
102
103     def browse(self,id, browse_flag, filter, starting_index, requested_count,
104                sort_criteria):
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
109         else:
110             return self._inner_browse(id)
111
112
113     def _inner_browse(self, id):
114         namespace, id = id.split(':')[1].split('-')
115         if not namespace or not id:
116             return []
117         
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)
122                }