add a zfacade.py
[zukebox] / zukebox_server / src / plugins / audio_library / zfacade.py
1
2 from sqlite3 import dbapi2 as sqlite
3 from brisa.upnp.didl.didl_lite import *
4 from brisa.core import log
5
6 class ZFacade:
7         
8         def __init__(self, path, websrv=None):
9                 self.db_path = path
10                 self.webserver = websrv
11                 
12         def exit(self):
13                 self.webserver = None
14
15         def get_path(self):
16                 print self.db_path
17                 return self.db_path
18
19         def get_webserver(self):
20                 return self.webserver
21
22         def get_conn(self):
23                 return sqlite.connect(self.db_path)
24
25
26         def get_file_path(self, id):
27                 """ Returns the file path with this id."""
28                 conn = self.get_conn()
29                 path = ''
30
31                 try:
32                         c = conn.execute('SELECT path FROM files WHERE id=?', (id,))
33                         path = str(c.fetchall()[0][0])
34                         c.close()
35                 except Exception, e:
36                         log.error('error retrieving file path: %s' % e)
37
38                 conn.close()
39                 return path
40
41
42         def get_audio_item(self, id):
43                 """ Returns the audio item (if exists) given its id."""
44                 conn = self.get_conn()
45                 url = '%s/audio_library/audio-' % self.webserver.get_listen_url()
46                 c = conn.execute('SELECT files.path, audios.id, '\
47                                 'audios.title, audio_albums.name, '\
48                                 'audio_artists.name, audio_genres.name, '\
49                                 'audios.trackno FROM audios INNER JOIN '\
50                                 'audio_albums INNER JOIN audio_artists '\
51                                 'INNER JOIN audio_genres INNER JOIN files ON '\
52                                 'audios.album_id=audio_albums.id AND '\
53                                 'audios.genre_id=audio_genres.id AND '\
54                                 'audios.artist_id=audio_artists.id '\
55                                 'where files.id=? AND audios.id=?',
56                                 (id, id))
57                 result = c.fetchall()
58                 c.close()
59                 conn.close()
60
61                 if not result or len(result) < 1:
62                         return []
63
64                 r = result[0]
65                 track = MusicTrack('audio_library:audio-%d' % r[1], '', r[2], genres=[r[5]],
66                                         artists=[r[4]], albums=[r[3]],
67                                         original_track_number=r[6])
68                 track.add_resource(Resource('%s%d' % (url, r[1]), 'http-get:*:audio/%s:*' %
69                                         str(r[0]).split('.')[-1]))
70
71                 return [track]
72
73
74         def get_audio_all(self):
75                 """ Returns all audio."""
76                 conn = self.get_conn()
77                 url = '%s/audio_library/audio-' % self.webserver.get_listen_url()
78                 c = conn.execute('SELECT files.path, audios.id, '\
79                                 'audios.title, audio_albums.name, '\
80                                 'audio_artists.name, audio_genres.name, '\
81                                 'audios.trackno FROM audios INNER JOIN '\
82                                 'audio_albums INNER JOIN audio_artists '\
83                                 'INNER JOIN audio_genres INNER JOIN files ON '\
84                                 'audios.album_id=audio_albums.id AND '\
85                                 'audios.genre_id=audio_genres.id AND '\
86                                 'audios.artist_id=audio_artists.id AND '\
87                                 'audios.id = files.id', ())
88
89                 ans = []
90
91                 for r in c:
92                         track = MusicTrack('audio_library:audio-%d' % r[1], '', r[2],
93                                         genres=[r[5]], artists=[r[4]], albums=[r[3]],
94                                         original_track_number=r[6])
95                         track.add_resource(Resource('%s%d' % (url, r[1]),
96                                         'http-get:*:audio/%s:*' % str(r[0]).split('.')[-1]))
97                         ans.append(track)
98
99                 c.close()
100                 conn.close()
101                 return ans
102
103
104         def get_audio_genres(self):
105                 """ Returns all audio genres."""
106                 conn = self.get_conn()
107                 c = conn.execute('SELECT ? || id, name FROM audio_genres',
108                                 ('audio_library:genre-', ))
109
110                 result = []
111
112                 for r in c:
113                         if r[1] == 'genre':
114                                 r = (r[0], 'Unknown Genre')
115                         result.append(MusicGenre(**dict(zip(['id', 'title'], r))))
116
117                 c.close()
118                 conn.close()
119                 return result
120
121
122         def get_audio_genre(self, id):
123                 """ Returns an audio genre given its id."""
124                 conn = self.get_conn()
125                 url = '%s/%s/audio-' % (self.webserver.get_listen_url(), 'audio_library')
126                 c = conn.execute('SELECT files.path, audios.id, '\
127                                 'audios.title, audio_albums.name, '\
128                                 'audio_artists.name, audio_genres.name, '\
129                                 'audios.trackno FROM audios INNER JOIN '\
130                                 'audio_albums INNER JOIN audio_artists '\
131                                 'INNER JOIN audio_genres INNER JOIN files ON '\
132                                 'audios.album_id=audio_albums.id AND '\
133                                 'audios.genre_id=audio_genres.id AND '\
134                                 'audios.artist_id=audio_artists.id AND '\
135                                 'audios.id = files.id WHERE audios.genre_id '\
136                                 '= ?', (id, ))
137                 ans = []
138
139                 for r in c:
140                         track = MusicTrack('audio_library:audio-%d' % r[1], '', r[2],
141                                 genres=[r[5]], artists=[r[4]], albums=[r[3]],
142                                 original_track_number=r[6])
143                         track.add_resource(Resource('%s%d' % (url, r[1]),
144                                 'http-get:*:audio/%s:*' % str(r[0]).split('.')[-1]))
145                         ans.append(track)
146
147                 c.close()
148                 conn.close()
149                 return ans
150
151         def get_audio_artists(self):
152                 """ Returns all audio artists."""
153                 conn = self.get_conn()
154                 c = conn.execute('SELECT ? || id, name FROM audio_artists',
155                                 ('audio_library:artist-', ))
156
157                 rows = c.fetchall()
158                 c.close()
159                 conn.close()
160
161                 return [MusicArtist(**dict(zip(['id', 'title'], r))) for r in rows]
162
163
164         def get_audio_artist(self, id):
165                 """ Returns an audio artist given its id."""
166                 conn = self.get_conn()
167                 url = '%s/%s/audio-' % (self.webserver.get_listen_url(), 'audio_library')
168                 c = conn.execute('SELECT files.path, audios.id, '\
169                                 'audios.title, audio_albums.name, '\
170                                 'audio_artists.name, audio_genres.name, '\
171                                 'audios.trackno FROM audios INNER JOIN '\
172                                 'audio_albums INNER JOIN audio_artists '\
173                                 'INNER JOIN audio_genres INNER JOIN files ON '\
174                                 'audios.album_id=audio_albums.id AND '\
175                                 'audios.genre_id=audio_genres.id AND '\
176                                 'audios.artist_id=audio_artists.id AND '\
177                                 'audios.id = files.id WHERE audios.artist_id '\
178                                 '= ?', (id, ))
179
180                 ans = []
181
182                 for r in c:
183                         track = MusicTrack('audio_library:audio-%d' % r[1], '', r[2],
184                                 genres=[r[5]], artists=[r[4]], albums=[r[3]],
185                                 original_track_number=r[6])
186                         track.add_resource(Resource('%s%d' % (url, r[1]), 'http-get:*:audio/%s:*' %
187                                 str(r[0]).split('.')[-1]))
188                         ans.append(track)
189
190                 c.close()
191                 conn.close()
192                 return ans
193
194
195         def get_audio_albums(self):
196                 """ Returns all audio albums."""
197                 conn = self.get_conn()
198                 c = conn.execute('SELECT ? || id, name FROM audio_albums',
199                                 ('audio_library:album-', ))
200                 ret = [MusicAlbum(**dict(zip(['id', 'title'], r))) for r in c]
201                 c.close()
202                 conn.close()
203                 return ret
204
205
206         def get_audio_album(self, id):
207                 """ Returns an audio album given its id."""
208                 conn = self.get_conn()
209                 url = '%s/%s/audio-' % (self.webserver.get_listen_url(), 'audio_library')
210                 c = conn.execute('SELECT files.path, audios.id, '\
211                                 'audios.title, audio_albums.name, '\
212                                 'audio_artists.name, audio_genres.name, '\
213                                 'audios.trackno FROM audios INNER JOIN '\
214                                 'audio_albums INNER JOIN audio_artists '\
215                                 'INNER JOIN audio_genres INNER JOIN files ON '\
216                                 'audios.album_id=audio_albums.id AND '\
217                                 'audios.genre_id=audio_genres.id AND '\
218                                 'audios.artist_id=audio_artists.id AND '\
219                                 'audios.id = files.id WHERE audios.album_id '\
220                                 '= ?', (id, ))
221
222                 ans = []
223
224                 for r in c:
225                         track = MusicTrack('audio_library:audio-%d' % r[1], '', r[2],
226                                 genres=[r[5]], artists=[r[4]], albums=[r[3]],
227                                 original_track_number=r[6])
228                         track.add_resource(Resource('%s%d' % (url, r[1]),
229                                 'http-get:*:audio/%s:*' % str(r[0]).split('.')[-1]))
230                         ans.append(track)
231
232                 c.close()
233                 conn.close()
234                 return ans
235
236
237         def get_playlists(self):
238                 """ Returns all playlists."""
239                 conn = self.get_conn()
240                 url = '%s/audio_library/playlist-' % self.webserver.get_listen_url()
241                 ans = []
242
243                 c = conn.execute('SELECT id, title FROM playlists', ())
244
245                 for r in c:
246                         playlist = PlaylistItem('audio_library:playlist-%d' % r[0], title=r[1])
247                         playlist.add_resource(Resource('%s%d' % (url, r[0]),
248                                                 'http-get:*:audio/mpegurl:*'))
249                         ans.append(playlist)
250
251                 c.close()
252                 conn.close()
253                 return ans
254
255
256         def get_playlist(self, id):
257                 """ Returns a single playlist item based on its id."""
258                 conn = self.get_conn()
259                 url = '%s/audio_library/playlist-' % self.webserver.get_listen_url()
260                 c = conn.execute('SELECT title FROM playlists WHERE id=?', (id, ))
261                 rows = c.fetchall()
262                 c.close()
263                 conn.close()
264
265                 if not rows or len(rows) < 1:
266                         return []
267
268                 playlist = PlaylistItem('audio_library:playlist-%d' % id, title=rows[0][0])
269                 playlist.add_resource(Resource('%s%d' % (url, id),
270                                         'http-get:*:audio/mpegurl:*'))
271
272                 return [playlist]