if artist is not None:
for child in artist:
if child.tag == 'name':
- ret['artist'] = child.text
+ ret['artist_name'] = child.text
elif child.tag == 'id':
ret['artist_id'] = int(child.text)
for child in element:
cache_time = 60*60*24
rate_limit = 1.0 # max queries per second
- def __init__(self, order,
- select=['id', 'name', 'image', 'artist_name'],
+ def __init__(self,
+ select=['id', 'name', 'image', 'artist_name', 'artist_id'],
request='album',
- track=['track_album', 'album_artist'],
- count=5):
+ track=['track_album', 'album_artist']):
if request == 'track':
- self.url = "%s%s/%s/json/%s?n=%s&order=%s" % (_GET2, '+'.join(select), request, '+'.join(track), count, order)
+ self.url = "%s%s/%s/json/%s" % (_GET2, '+'.join(select), request, '+'.join(track))
else:
- self.url = "%s%s/%s/json/?n=%s&order=%s" % (_GET2, '+'.join(select), request, count, order)
+ self.url = "%s%s/%s/json/" % (_GET2, '+'.join(select), request)
+ def __call__(self, order=None, count=5, query=None, albumids=None):
+ return self.emit(order=order, count=count, query=query, albumids=albumids)
+
+ def emit(self, order=None, count=5, query=None, albumids=None):
+ """ratelimited query"""
+ self._ratelimit()
+ paramdict = {'n':count}
+ if order is not None:
+ paramdict['order'] = order
+ if query is not None:
+ paramdict['searchquery'] = query
+ if albumids is not None:
+ paramdict['album_id'] = " ".join(str(_id) for _id in albumids)
+ params = urllib.urlencode(paramdict)
+ url = self.url + "?%s" % (params)
+ f = urllib.urlopen(url)
+ ret = simplejson.load(f)
+ f.close()
+ return ret
def _ratelimit(self):
now = time.time()
time.sleep(self.rate_limit - (now - self.last_query))
self.last_query = now
- def __call__(self):
- """ratelimited query"""
- self._ratelimit()
- f = urllib.urlopen(self.url)
- ret = simplejson.load(f)
- f.close()
- return ret
@staticmethod
def album_cover(albumid, size=200):
return _GET2+ 'stream/track/redirect/?id=%d&streamencoding=mp31'%(trackid)
class Queries(object):
- albums_this_week = Query(order='ratingweek_desc')
- albums_all_time = Query(order='ratingtotal_desc')
- albums_this_month = Query(order='ratingmonth_desc')
- albums_today = Query(order='ratingday_desc')
- playlists_all_time = Query(select=['id','name', 'user_idstr'], request='playlist', order='ratingtotal_desc')
- tracks_this_month = Query(select=['id', 'name',
- 'stream',
- 'album_name', 'artist_name',
- 'album_id', 'artist_id'],
- request='track',
- order='ratingmonth_desc')
+ @staticmethod
+ def albums_this_week():
+ return Query().emit(order='ratingweek_desc')
+ @staticmethod
+ def albums_all_time():
+ return Query().emit(order='ratingtotal_desc')
+ @staticmethod
+ def albums_this_month():
+ return Query().emit(order='ratingmonth_desc')
+ @staticmethod
+ def albums_today():
+ return Query().emit(order='ratingday_desc')
+ @staticmethod
+ def playlists_all_time():
+ q = Query(select=['id','name', 'user_idstr'], request='playlist')
+ return q.emit(order='ratingtotal_desc')
+
+ @staticmethod
+ def tracks_this_month():
+ q = Query(select=['id', 'name',
+ 'stream',
+ 'album_name', 'artist_name',
+ 'album_id', 'artist_id'],
+ request='track')
+ return q.emit(order='ratingmonth_desc')
+
+ @staticmethod
+ def search_albums(query):
+ q = Query()
+ return q.emit(order='searchweight_desc', query=query)
+
+ @staticmethod
+ def search_artists(query):
+ q = Query(request='artist', select=['id', 'name', 'image'])
+ return q.emit(order='searchweight_desc', query=query)
+
+ @staticmethod
+ def album_tracks(albumids, select=['id', 'name', 'numalbum']):
+ #http://api.jamendo.com/get2/id+name/track/jsonpretty/?album_id=33+46
+ q = Query(select=select,
+ request='track')
+ ret = q.emit(albumids=albumids, count=100)
+ for track in ret:
+ track['mp3'] = Query.track_mp3(int(track['id']))
+ track['ogg'] = Query.track_ogg(int(track['id']))
+ return ret
import logging
import gobject
+# we don't use the local DB...
from jamaendo.api import LocalDB, Query, Queries, refresh_dump
from jamaui.player import Player, Playlist
def on_search(self, w):
txt = self.entry.get_text()
print "Search for: %s" % (txt)
- db = LocalDB()
- db.connect()
- for album in db.search_albums(txt):
- title = "%s - %s" % (album['artist'], album['name'])
+ #db = LocalDB()
+ #db.connect()
+ for album in Queries.search_albums(query=txt):
+ title = "%s - %s" % (album['artist_name'], album['name'])
self.idmap[title] = album
print "Found %s" % (album)
self.results.append_text(title)
current_selection = results.get_current_text()
album = self.idmap[current_selection]
- selected = [album['id']]
+ selected = [int(album['id'])]
print "Selected: %s" % (selected)
- album = None
- db = LocalDB()
- db.connect()
- for a in db.get_albums(selected):
- album = a
- break
-
- if album:
- tracks = album['tracks']
+ tracks = Queries.album_tracks(selected)
+ if tracks:
print "Playing: %s" % (tracks)
self.pwnd = PlayerWindow(tracks)
self.pwnd.show_all()
player.connect("clicked", self.on_player)
self.menu.append(player)
- refresh = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
- refresh.set_label("Refresh")
- refresh.connect("clicked", self.on_refresh)
- self.menu.append(refresh)
+ # Don't use localdb ATM
+ #refresh = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
+ #refresh.set_label("Refresh")
+ #refresh.connect("clicked", self.on_refresh)
+ #self.menu.append(refresh)
menu_about = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
menu_about.set_label("About")