From: Adriano Couto Date: Fri, 29 May 2009 21:45:59 +0000 (-0400) Subject: add a zfacade.py X-Git-Url: http://vcs.maemo.org/git/?p=zukebox;a=commitdiff_plain;h=f3285016dddce451226caba969f8851ca8cf01bb add a zfacade.py --- diff --git a/zukebox_server/src/plugins/audio_library/zfacade.py b/zukebox_server/src/plugins/audio_library/zfacade.py new file mode 100755 index 0000000..57f6857 --- /dev/null +++ b/zukebox_server/src/plugins/audio_library/zfacade.py @@ -0,0 +1,272 @@ + +from sqlite3 import dbapi2 as sqlite +from brisa.upnp.didl.didl_lite import * +from brisa.core import log + +class ZFacade: + + def __init__(self, path, websrv=None): + self.db_path = path + self.webserver = websrv + + def exit(self): + self.webserver = None + + def get_path(self): + print self.db_path + return self.db_path + + def get_webserver(self): + return self.webserver + + def get_conn(self): + return sqlite.connect(self.db_path) + + + def get_file_path(self, id): + """ Returns the file path with this id.""" + conn = self.get_conn() + path = '' + + try: + c = conn.execute('SELECT path FROM files WHERE id=?', (id,)) + path = str(c.fetchall()[0][0]) + c.close() + except Exception, e: + log.error('error retrieving file path: %s' % e) + + conn.close() + return path + + + def get_audio_item(self, id): + """ Returns the audio item (if exists) given its id.""" + conn = self.get_conn() + url = '%s/audio_library/audio-' % self.webserver.get_listen_url() + c = conn.execute('SELECT files.path, audios.id, '\ + 'audios.title, audio_albums.name, '\ + 'audio_artists.name, audio_genres.name, '\ + 'audios.trackno FROM audios INNER JOIN '\ + 'audio_albums INNER JOIN audio_artists '\ + 'INNER JOIN audio_genres INNER JOIN files ON '\ + 'audios.album_id=audio_albums.id AND '\ + 'audios.genre_id=audio_genres.id AND '\ + 'audios.artist_id=audio_artists.id '\ + 'where files.id=? AND audios.id=?', + (id, id)) + result = c.fetchall() + c.close() + conn.close() + + if not result or len(result) < 1: + return [] + + r = result[0] + track = MusicTrack('audio_library:audio-%d' % r[1], '', r[2], genres=[r[5]], + artists=[r[4]], albums=[r[3]], + original_track_number=r[6]) + track.add_resource(Resource('%s%d' % (url, r[1]), 'http-get:*:audio/%s:*' % + str(r[0]).split('.')[-1])) + + return [track] + + + def get_audio_all(self): + """ Returns all audio.""" + conn = self.get_conn() + url = '%s/audio_library/audio-' % self.webserver.get_listen_url() + c = conn.execute('SELECT files.path, audios.id, '\ + 'audios.title, audio_albums.name, '\ + 'audio_artists.name, audio_genres.name, '\ + 'audios.trackno FROM audios INNER JOIN '\ + 'audio_albums INNER JOIN audio_artists '\ + 'INNER JOIN audio_genres INNER JOIN files ON '\ + 'audios.album_id=audio_albums.id AND '\ + 'audios.genre_id=audio_genres.id AND '\ + 'audios.artist_id=audio_artists.id AND '\ + 'audios.id = files.id', ()) + + ans = [] + + for r in c: + track = MusicTrack('audio_library:audio-%d' % r[1], '', r[2], + genres=[r[5]], artists=[r[4]], albums=[r[3]], + original_track_number=r[6]) + track.add_resource(Resource('%s%d' % (url, r[1]), + 'http-get:*:audio/%s:*' % str(r[0]).split('.')[-1])) + ans.append(track) + + c.close() + conn.close() + return ans + + + def get_audio_genres(self): + """ Returns all audio genres.""" + conn = self.get_conn() + c = conn.execute('SELECT ? || id, name FROM audio_genres', + ('audio_library:genre-', )) + + result = [] + + for r in c: + if r[1] == 'genre': + r = (r[0], 'Unknown Genre') + result.append(MusicGenre(**dict(zip(['id', 'title'], r)))) + + c.close() + conn.close() + return result + + + def get_audio_genre(self, id): + """ Returns an audio genre given its id.""" + conn = self.get_conn() + url = '%s/%s/audio-' % (self.webserver.get_listen_url(), 'audio_library') + c = conn.execute('SELECT files.path, audios.id, '\ + 'audios.title, audio_albums.name, '\ + 'audio_artists.name, audio_genres.name, '\ + 'audios.trackno FROM audios INNER JOIN '\ + 'audio_albums INNER JOIN audio_artists '\ + 'INNER JOIN audio_genres INNER JOIN files ON '\ + 'audios.album_id=audio_albums.id AND '\ + 'audios.genre_id=audio_genres.id AND '\ + 'audios.artist_id=audio_artists.id AND '\ + 'audios.id = files.id WHERE audios.genre_id '\ + '= ?', (id, )) + ans = [] + + for r in c: + track = MusicTrack('audio_library:audio-%d' % r[1], '', r[2], + genres=[r[5]], artists=[r[4]], albums=[r[3]], + original_track_number=r[6]) + track.add_resource(Resource('%s%d' % (url, r[1]), + 'http-get:*:audio/%s:*' % str(r[0]).split('.')[-1])) + ans.append(track) + + c.close() + conn.close() + return ans + + def get_audio_artists(self): + """ Returns all audio artists.""" + conn = self.get_conn() + c = conn.execute('SELECT ? || id, name FROM audio_artists', + ('audio_library:artist-', )) + + rows = c.fetchall() + c.close() + conn.close() + + return [MusicArtist(**dict(zip(['id', 'title'], r))) for r in rows] + + + def get_audio_artist(self, id): + """ Returns an audio artist given its id.""" + conn = self.get_conn() + url = '%s/%s/audio-' % (self.webserver.get_listen_url(), 'audio_library') + c = conn.execute('SELECT files.path, audios.id, '\ + 'audios.title, audio_albums.name, '\ + 'audio_artists.name, audio_genres.name, '\ + 'audios.trackno FROM audios INNER JOIN '\ + 'audio_albums INNER JOIN audio_artists '\ + 'INNER JOIN audio_genres INNER JOIN files ON '\ + 'audios.album_id=audio_albums.id AND '\ + 'audios.genre_id=audio_genres.id AND '\ + 'audios.artist_id=audio_artists.id AND '\ + 'audios.id = files.id WHERE audios.artist_id '\ + '= ?', (id, )) + + ans = [] + + for r in c: + track = MusicTrack('audio_library:audio-%d' % r[1], '', r[2], + genres=[r[5]], artists=[r[4]], albums=[r[3]], + original_track_number=r[6]) + track.add_resource(Resource('%s%d' % (url, r[1]), 'http-get:*:audio/%s:*' % + str(r[0]).split('.')[-1])) + ans.append(track) + + c.close() + conn.close() + return ans + + + def get_audio_albums(self): + """ Returns all audio albums.""" + conn = self.get_conn() + c = conn.execute('SELECT ? || id, name FROM audio_albums', + ('audio_library:album-', )) + ret = [MusicAlbum(**dict(zip(['id', 'title'], r))) for r in c] + c.close() + conn.close() + return ret + + + def get_audio_album(self, id): + """ Returns an audio album given its id.""" + conn = self.get_conn() + url = '%s/%s/audio-' % (self.webserver.get_listen_url(), 'audio_library') + c = conn.execute('SELECT files.path, audios.id, '\ + 'audios.title, audio_albums.name, '\ + 'audio_artists.name, audio_genres.name, '\ + 'audios.trackno FROM audios INNER JOIN '\ + 'audio_albums INNER JOIN audio_artists '\ + 'INNER JOIN audio_genres INNER JOIN files ON '\ + 'audios.album_id=audio_albums.id AND '\ + 'audios.genre_id=audio_genres.id AND '\ + 'audios.artist_id=audio_artists.id AND '\ + 'audios.id = files.id WHERE audios.album_id '\ + '= ?', (id, )) + + ans = [] + + for r in c: + track = MusicTrack('audio_library:audio-%d' % r[1], '', r[2], + genres=[r[5]], artists=[r[4]], albums=[r[3]], + original_track_number=r[6]) + track.add_resource(Resource('%s%d' % (url, r[1]), + 'http-get:*:audio/%s:*' % str(r[0]).split('.')[-1])) + ans.append(track) + + c.close() + conn.close() + return ans + + + def get_playlists(self): + """ Returns all playlists.""" + conn = self.get_conn() + url = '%s/audio_library/playlist-' % self.webserver.get_listen_url() + ans = [] + + c = conn.execute('SELECT id, title FROM playlists', ()) + + for r in c: + playlist = PlaylistItem('audio_library:playlist-%d' % r[0], title=r[1]) + playlist.add_resource(Resource('%s%d' % (url, r[0]), + 'http-get:*:audio/mpegurl:*')) + ans.append(playlist) + + c.close() + conn.close() + return ans + + + def get_playlist(self, id): + """ Returns a single playlist item based on its id.""" + conn = self.get_conn() + url = '%s/audio_library/playlist-' % self.webserver.get_listen_url() + c = conn.execute('SELECT title FROM playlists WHERE id=?', (id, )) + rows = c.fetchall() + c.close() + conn.close() + + if not rows or len(rows) < 1: + return [] + + playlist = PlaylistItem('audio_library:playlist-%d' % id, title=rows[0][0]) + playlist.add_resource(Resource('%s%d' % (url, id), + 'http-get:*:audio/mpegurl:*')) + + return [playlist]