+
+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]