def close(self):
self.fil.close()
- def make_obj(self, element):
+ def make_artist_obj(self, element):
if element.text is not None and element.text != "":
return element.text
else:
- ret = Obj()
+ ret = {}
for child in element:
- if child.tag in ['name', 'id']:
- setattr(ret, child.tag, child.text)
+ if child.tag in ['name', 'id', 'image']:
+ ret[child.tag] = child.text
return ret
- def artist_walker(self):
+ def make_album_obj(self, element):
+ if element.text is not None and element.text != "":
+ return element.text
+ else:
+ ret = {}
+ for child in element:
+ if child.tag in ['name', 'id', 'image']:
+ if child.text:
+ ret[child.tag] = child.text
+ else:
+ ret[child.tag] = ""
+ if child.tag == 'Tracks':
+ tracks = []
+ for track in child:
+ trackd = {}
+ for trackinfo in track:
+ if trackinfo.tag in ['name', 'id', 'numalbum']:
+ trackd[trackinfo.tag] = trackinfo.text
+ tracks.append(trackd)
+ ret['tracks'] = tracks
+ return ret
+
+ def artist_walker(self, name_match):
+ for event, element in etree.iterparse(self.fil, tag="artist"):
+ name = element.xpath('./name')[0].text.lower()
+ if name and name.find(name_match) > -1:
+ yield self.make_artist_obj(element)
+ element.clear()
+ while element.getprevious() is not None:
+ del element.getparent()[0]
+ raise StopIteration
+
+ def album_walker(self, name_match):
+ for event, element in etree.iterparse(self.fil, tag="album"):
+ name = element.xpath('./name')[0].text
+ if name and name.lower().find(name_match) > -1:
+ yield self.make_album_obj(element)
+ element.clear()
+ while element.getprevious() is not None:
+ del element.getparent()[0]
+ raise StopIteration
+
+ def artistid_walker(self, artistids):
for event, element in etree.iterparse(self.fil, tag="artist"):
- yield self.make_obj(element)
+ _id = element.xpath('./id')[0].text
+ if _id and int(_id) in artistids:
+ yield self.make_artist_obj(element)
+ element.clear()
+ while element.getprevious() is not None:
+ del element.getparent()[0]
+ raise StopIteration
+
+ def albumid_walker(self, albumids):
+ for event, element in etree.iterparse(self.fil, tag="album"):
+ _id = element.xpath('./id')[0].text
+ if _id and int(_id) in albumids:
+ yield self.make_album_obj(element)
element.clear()
while element.getprevious() is not None:
del element.getparent()[0]
def search_artists(self, substr):
substr = substr.lower()
- return [artist for artist in self.artist_walker() if artist.name.lower().find(substr) > -1]
+ return (artist for artist in self.artist_walker(substr))
+
+ def search_albums(self, substr):
+ substr = substr.lower()
+ return (album for album in self.album_walker(substr))
+
+ def get_album(self, artistid):
+ return (artist for artist in self.artistid_walker(artistid))
+
+ def get_album(self, albumid):
+ return (album for album in self.albumid_walker(albumid))
+
+_GET2 = '''http://api.jamendo.com/get2/'''
+
+class Query(object):
+ last_query = time.time()
+
+ def __init__(self, order, select=['id', 'name', 'image', 'artist_name'], request='album', track=None, n=8):
+ if request == 'track':
+ self.url = "%s%s/%s/json/%s?n=%s&order=%s" % (_GET2, '+'.join(select), request, '+'.join(track), n, order)
+ else:
+ self.url = "%s%s/%s/json/?n=%s&order=%s" % (_GET2, '+'.join(select), request, n, order)
+
+ def emit(self):
+ """ratelimited query"""
+ now = time.time()
+ if now - self.last_query < 1.0:
+ time.sleep(1.0 - (now - self.last_query))
+ self.last_query = now
+ f = urllib.urlopen(self.url)
+ ret = json.load(f)
+ f.close()
+ return ret
+
+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', 'url', 'stream', 'album_name', 'album_url', 'album_id', 'artist_id', 'artist_name'],
+ request='track',
+ track=['track_album', 'album_artist'],
+ order='ratingmonth_desc')
+
+def get_cover(albumid, size=200):
+ to = '~/.cache/jamaendo/cover-%d-%d.jpg'%(albumid, size)
+ if not os.path.isfile(to):
+ url = _GET2+'image/album/redirect/?id=%d&imagesize=%d'%(albumid, size)
+ urllib.urlretrieve(url, to)
+ return to
+
+def get_ogg_url(trackid):
+ return _GET2+ 'stream/track/redirect/?id=%d&streamencoding=ogg2'%(trackid)
+
+def get_mp3_url(trackid):
+ return _GET2+ 'stream/track/redirect/?id=%d&streamencoding=mp31'%(trackid)