def get_top_artists(api, country): """ Get the most popular artists on Last.fm by country @param api: an instance of L{Api} @type api: L{Api} @param country: a country name, as defined by the ISO 3166-1 country names standard @type country: L{str} @return: most popular artists of the country @rtype: L{list} of L{Artist} @note: Use L{Country.top_artists} instead of using this method directly. """ params = {'method': 'geo.getTopArtists', 'country': country} data = api._fetch_data(params).find('topartists') return [ Artist(api, name=a.findtext('name'), mbid=a.findtext('mbid'), stats=Stats(subject=a.findtext('name'), rank=safe_int(a.attrib['rank']), playcount=safe_int(a.findtext('playcount'))), url='http://' + a.findtext('url'), image={'large': a.findtext('image')}) for a in data.findall('artist') ]
def get_top_albums(self, period = None): params = self._default_params({'method': 'user.getTopAlbums'}) if period is not None: params.update({'period': period}) data = self._api._fetch_data(params).find('topalbums') return [ Album( self._api, subject = self, name = a.findtext('name'), artist = Artist( self._api, subject = self, name = a.findtext('artist/name'), mbid = a.findtext('artist/mbid'), url = a.findtext('artist/url'), ), mbid = a.findtext('mbid'), url = a.findtext('url'), image = dict([(i.get('size'), i.text) for i in a.findall('image')]), stats = Stats( subject = a.findtext('name'), playcount = a.findtext('playcount').strip() and safe_int(a.findtext('playcount')), rank = a.attrib['rank'].strip() and safe_int(a.attrib['rank']) ) ) for a in data.findall('album') ]
def get_top_tracks(self, period = None): params = self._default_params({'method': 'user.getTopTracks'}) if period is not None: params.update({'period': period}) data = self._api._fetch_data(params).find('toptracks') return [ Track( self._api, subject = self, name = t.findtext('name'), artist = Artist( self._api, subject = self, name = t.findtext('artist/name'), mbid = t.findtext('artist/mbid'), url = t.findtext('artist/url'), ), mbid = t.findtext('mbid'), stats = Stats( subject = t.findtext('name'), rank = t.attrib['rank'].strip() and safe_int(t.attrib['rank']) or None, playcount = t.findtext('playcount') and safe_int(t.findtext('playcount')) or None ), streamable = (t.findtext('streamable') == '1'), full_track = (t.find('streamable').attrib['fulltrack'] == '1'), image = dict([(i.get('size'), i.text) for i in t.findall('image')]), ) for t in data.findall('track') ]
def top_tracks(self): """top tracks for the tag""" params = self._default_params({'method': 'tag.getTopTracks'}) data = self._api._fetch_data(params).find('toptracks') return [ Track( self._api, subject = self, name = t.findtext('name'), artist = Artist( self._api, subject = self, name = t.findtext('artist/name'), mbid = t.findtext('artist/mbid'), url = t.findtext('artist/url'), ), mbid = t.findtext('mbid'), stats = Stats( subject = t.findtext('name'), rank = t.attrib['rank'].strip() and safe_int(t.attrib['rank']) or None, tagcount = t.findtext('tagcount') and safe_int(t.findtext('tagcount')) or None ), streamable = (t.findtext('streamable') == '1'), full_track = (t.find('streamable').attrib['fulltrack'] == '1'), image = dict([(i.get('size'), i.text) for i in t.findall('image')]), ) for t in data.findall('track') ]
def top_tracks(self): """top tracks for the tag""" params = self._default_params({'method': 'tag.getTopTracks'}) data = self._api._fetch_data(params).find('toptracks') return [ Track( self._api, subject=self, name=t.findtext('name'), artist=Artist( self._api, subject=self, name=t.findtext('artist/name'), mbid=t.findtext('artist/mbid'), url=t.findtext('artist/url'), ), mbid=t.findtext('mbid'), stats=Stats(subject=t.findtext('name'), rank=t.attrib['rank'].strip() and safe_int(t.attrib['rank']) or None, tagcount=t.findtext('tagcount') and safe_int(t.findtext('tagcount')) or None), streamable=(t.findtext('streamable') == '1'), full_track=(t.find('streamable').attrib['fulltrack'] == '1'), image=dict([(i.get('size'), i.text) for i in t.findall('image')]), ) for t in data.findall('track') ]
def get_artists(self, limit = None, page = None): params = self._default_params({'method': 'library.getArtists'}) if limit is not None: params.update({'limit': limit}) if page is not None: params.update({'page': page}) try: data = self._api._fetch_data(params).find('artists') total_pages = safe_int(data.attrib['totalPages']) yield total_pages for a in data.findall('artist'): yield Artist( self._api, subject = self, name = a.findtext('name'), mbid = a.findtext('mbid'), stats = Stats( subject = a.findtext('name'), playcount = a.findtext('playcount') and safe_int(a.findtext('playcount')) or None, tagcount = a.findtext('tagcount') and safe_int(a.findtext('tagcount')) or None ), url = a.findtext('url'), streamable = (a.findtext('streamable') == "1"), image = dict([(i.get('size'), i.text) for i in a.findall('image')]), ) except LastfmError: yield None
def top_tracks(self): """ top tracks of the artist @rtype: L{list} of L{Track} """ params = self._default_params({'method': 'artist.getTopTracks'}) data = self._api._fetch_data(params).find('toptracks') return [ Track( self._api, subject = self, name = t.findtext('name'), artist = self, mbid = t.findtext('mbid'), stats = Stats( subject = t.findtext('name'), playcount = safe_int(t.findtext('playcount')), rank = safe_int(t.attrib['rank']) ), streamable = (t.findtext('streamable') == '1'), full_track = (t.find('streamable').attrib['fulltrack'] == '1'), image = dict([(i.get('size'), i.text) for i in t.findall('image')]), ) for t in data.findall('track') ]
def top_albums(self): """ top albums of the artist @rtype: L{list} of L{Album} """ params = self._default_params({'method': 'artist.getTopAlbums'}) data = self._api._fetch_data(params).find('topalbums') return [ Album( self._api, subject = self, name = a.findtext('name'), artist = self, mbid = a.findtext('mbid'), url = a.findtext('url'), image = dict([(i.get('size'), i.text) for i in a.findall('image')]), stats = Stats( subject = a.findtext('name'), playcount = safe_int(a.findtext('playcount')), rank = safe_int(a.attrib['rank']) ) ) for a in data.findall('album') ]
def top_albums(self): """top albums for the tag""" params = self._default_params({'method': 'tag.getTopAlbums'}) data = self._api._fetch_data(params).find('topalbums') return [ Album( self._api, subject = self, name = a.findtext('name'), artist = Artist( self._api, subject = self, name = a.findtext('artist/name'), mbid = a.findtext('artist/mbid'), url = a.findtext('artist/url'), ), mbid = a.findtext('mbid'), url = a.findtext('url'), image = dict([(i.get('size'), i.text) for i in a.findall('image')]), stats = Stats( subject = a.findtext('name'), tagcount = a.findtext('tagcount') and safe_int(a.findtext('tagcount')) or None, rank = a.attrib['rank'].strip() and safe_int(a.attrib['rank']) or None ) ) for a in data.findall('album') ]
def top_albums(self): """top albums for the tag""" params = self._default_params({'method': 'tag.getTopAlbums'}) data = self._api._fetch_data(params).find('topalbums') return [ Album(self._api, subject=self, name=a.findtext('name'), artist=Artist( self._api, subject=self, name=a.findtext('artist/name'), mbid=a.findtext('artist/mbid'), url=a.findtext('artist/url'), ), mbid=a.findtext('mbid'), url=a.findtext('url'), image=dict([(i.get('size'), i.text) for i in a.findall('image')]), stats=Stats(subject=a.findtext('name'), tagcount=a.findtext('tagcount') and safe_int(a.findtext('tagcount')) or None, rank=a.attrib['rank'].strip() and safe_int(a.attrib['rank']) or None)) for a in data.findall('album') ]
def get_top_artists(api, country): """ Get the most popular artists on Last.fm by country @param api: an instance of L{Api} @type api: L{Api} @param country: a country name, as defined by the ISO 3166-1 country names standard @type country: L{str} @return: most popular artists of the country @rtype: L{list} of L{Artist} @note: Use L{Country.top_artists} instead of using this method directly. """ params = {'method': 'geo.getTopArtists', 'country': country} data = api._fetch_data(params).find('topartists') return [ Artist( api, name = a.findtext('name'), mbid = a.findtext('mbid'), stats = Stats( subject = a.findtext('name'), rank = safe_int(a.attrib['rank']), playcount = safe_int(a.findtext('playcount')) ), url = 'http://' + a.findtext('url'), image = {'large': a.findtext('image')} ) for a in data.findall('artist') ]
def create_from_data(api, subject, data): return WeeklyChart( subject=subject, start=datetime.utcfromtimestamp(safe_int( data.attrib['from'])).replace(tzinfo=UTC), end=datetime.utcfromtimestamp(safe_int( data.attrib['to'])).replace(tzinfo=UTC))
def _check_chart_params(params, subject, start = None, end = None): if xor(start is None, end is None): raise InvalidParametersError("both start and end have to be provided.") if start is not None and end is not None: if not (isinstance(start, datetime) and isinstance(end, datetime)): raise InvalidParametersError("start and end must be datetime.datetime instances") params.update({ 'from': safe_int(calendar.timegm(start.timetuple())), 'to': safe_int(calendar.timegm(end.timetuple())) }) return params
def _check_chart_params(params, subject, start=None, end=None): if xor(start is None, end is None): raise InvalidParametersError( "both start and end have to be provided.") if start is not None and end is not None: if not (isinstance(start, datetime) and isinstance(end, datetime)): raise InvalidParametersError( "start and end must be datetime.datetime instances") params.update({ 'from': safe_int(calendar.timegm(start.timetuple())), 'to': safe_int(calendar.timegm(end.timetuple())) }) return params
def compare(api, type1, type2, value1, value2, limit = None): params = { 'method': 'tasteometer.compare', 'type1': type1, 'type2': type2, 'value1': value1, 'value2': value2 } if limit is not None: params.update({'limit': limit}) data = api._fetch_data(params).find('comparison/result') return Tasteometer( score = safe_float(data.findtext('score')), matches = safe_int(data.find('artists').attrib['matches']), artists = [ Artist( api, name = a.findtext('name'), url = a.findtext('url'), image = dict([(i.get('size'), i.text) for i in a.findall('image')]), ) for a in data.findall('artists/artist') ] )
def _search_yield_func(api, tag): return Tag(api, name=tag.findtext('name'), url=tag.findtext('url'), stats=Stats( subject=tag.findtext('name'), count=safe_int(tag.findtext('count')), ))
def create_from_data(api, subject, data): w = WeeklyChart( subject=subject, start=datetime.utcfromtimestamp(safe_int( data.attrib['from'])).replace(tzinfo=UTC), end=datetime.utcfromtimestamp(safe_int( data.attrib['to'])).replace(tzinfo=UTC), ) count_attribute = data.find('artist').findtext( 'playcount') and 'playcount' or 'weight' def get_count_attribute(artist): return { count_attribute: safe_int(eval(artist.findtext(count_attribute))) } def get_count_attribute_sum(artists): return { count_attribute: reduce( lambda x, y: (x + safe_int(eval(y.findtext(count_attribute)))), artists, 0) } return WeeklyArtistChart( subject=subject, start=datetime.utcfromtimestamp(safe_int( data.attrib['from'])).replace(tzinfo=UTC), end=datetime.utcfromtimestamp(safe_int( data.attrib['to'])).replace(tzinfo=UTC), stats=Stats(subject=subject, **get_count_attribute_sum(data.findall('artist'))), artists=[ Artist( api, subject=w, name=a.findtext('name'), mbid=a.findtext('mbid'), stats=Stats(subject=a.findtext('name'), rank=safe_int(a.attrib['rank']), **get_count_attribute(a)), url=a.findtext('url'), ) for a in data.findall('artist') ])
def get_count_attribute_sum(artists): return { count_attribute: reduce( lambda x, y: (x + safe_int(eval(y.findtext(count_attribute)))), artists, 0) }
def get_top_tracks(api, country, location = None): """ Get the most popular tracks on Last.fm by country @param api: an instance of L{Api} @type api: L{Api} @param country: a country name, as defined by the ISO 3166-1 country names standard @type country: L{str} @param location: a metro name, to fetch the charts for (must be within the country specified) (optional) @return: most popular tracks of the country @rtype: L{list} of L{Track} @note: Use L{Country.top_tracks} and L{Country.get_top_tracks} instead of using this method directly. """ params = {'method': 'geo.getTopTracks', 'country': country} if location is not None: params.update({'location': location}) data = api._fetch_data(params).find('toptracks') return [ Track( api, name = t.findtext('name'), mbid = t.findtext('mbid'), artist = Artist( api, name = t.findtext('artist/name'), mbid = t.findtext('artist/mbid'), url = t.findtext('artist/url') ), stats = Stats( subject = t.findtext('name'), rank = safe_int(t.attrib['rank']), playcount = safe_int(t.findtext('playcount')) ), streamable = (t.findtext('streamable') == '1'), full_track = (t.find('streamable').attrib['fulltrack'] == '1'), url = 'http://' + t.findtext('url'), image = {'large': t.findtext('image')} ) for t in data.findall('track') ]
def _fill_info(self): data = Track._fetch_data(self._api, self.artist.name, self.name) self._id = safe_int(data.findtext('id')) self._mbid = data.findtext('mbid') self._url = data.findtext('url') self._duration = safe_int(data.findtext('duration')) self._streamable = (data.findtext('streamable') == '1') self._full_track = (data.find('streamable').attrib['fulltrack'] == '1') self._image = dict([(i.get('size'), i.text) for i in data.findall('image')]) self._stats = Stats( subject = self, listeners = safe_int(data.findtext('listeners')), playcount = safe_int(data.findtext('playcount')), ) self._artist = Artist( self._api, name = data.findtext('artist/name'), mbid = data.findtext('artist/mbid'), url = data.findtext('artist/url') ) if data.find('album') is not None: self._album = Album( self._api, artist = self._artist, name = data.findtext('album/title'), mbid = data.findtext('album/mbid'), url = data.findtext('album/url'), image = dict([(i.get('size'), i.text) for i in data.findall('album/image')]) ) self._position = data.find('album').attrib['position'].strip() \ and safe_int(data.find('album').attrib['position']) if data.find('wiki') is not None: self._wiki = Wiki( self, published = datetime(*(time.strptime( data.findtext('wiki/published').strip(), '%a, %d %b %Y %H:%M:%S +0000' )[0:6])).replace(tzinfo = UTC), summary = data.findtext('wiki/summary'), content = data.findtext('wiki/content') ) else: self._wiki = 'na'
def search(cls, api, search_item, limit=None, page=None, **kwds): from lastfm.api import Api cls_name = cls.__name__.lower() params = {'method': '%s.search' % cls_name, cls_name: search_item} for kwd in kwds: if kwds[kwd] is not None: params[kwd] = kwds[kwd] if limit: params.update({'limit': limit}) if page is not None: params.update({'page': page}) data = api._fetch_data(params).find('results') total_pages = safe_int(data.findtext("{%s}totalResults" % Api.SEARCH_XMLNS))/ \ safe_int(data.findtext("{%s}itemsPerPage" % Api.SEARCH_XMLNS)) + 1 yield total_pages for a in data.findall('%smatches/%s' % (cls_name, cls_name)): yield cls._search_yield_func(api, a)
def _search_yield_func(api, tag): return Tag( api, name = tag.findtext('name'), url = tag.findtext('url'), stats = Stats( subject = tag.findtext('name'), count = safe_int(tag.findtext('count')), ) )
def _fill_info(self): data = Artist._fetch_data(self._api, self.name) self._name = data.findtext('name') self._mbid = data.findtext('mbid') self._url = data.findtext('url') self._image = dict([(i.get('size'), i.text) for i in data.findall('image')]) self._streamable = (data.findtext('streamable') == 1) if not self._stats: self._stats = Stats( subject = self, listeners = safe_int(data.findtext('stats/listeners')), playcount = safe_int(data.findtext('stats/playcount')) ) # self._similar = [ # Artist( # self._api, # subject = self, # name = a.findtext('name'), # url = a.findtext('url'), # image = dict([(i.get('size'), i.text) for i in a.findall('image')]) # ) # for a in data.findall('similar/artist') # ] self._top_tags = [ Tag( self._api, subject = self, name = t.findtext('name'), url = t.findtext('url') ) for t in data.findall('tags/tag') ] self._bio = Wiki( self, published = data.findtext('bio/published').strip() and datetime(*(time.strptime( data.findtext('bio/published').strip(), '%a, %d %b %Y %H:%M:%S +0000' )[0:6])).replace(tzinfo = UTC), summary = data.findtext('bio/summary'), content = data.findtext('bio/content') )
def create_from_data(cls, subject, key_func, start = None, end = None): chart_type = cls.mro()[0]._chart_type period = cls.mro()[3]._period globals()["%slyChart" % period['name'].title().replace(' ','')]._check_chart_params({}, subject, start, end) mcl = MonthlyChart.get_chart_list(subject) if start is None and end is None: start = mcl[-period['duration']].start end = mcl[-1].end wcl = subject.weekly_chart_list period_wcl = [wc for wc in wcl if start < wc.start < end or start < wc.end < end] period_wacl = [] for wc in period_wcl: try: period_wacl.append( getattr(subject, "get_weekly_%s_chart" % chart_type)(wc.start, wc.end)) except LastfmError as ex: logging.log_silenced_exceptions(ex) stats_dict = period_wacl[0].__dict__["_%ss" % chart_type][0].stats.__dict__ count_attribute = [k for k in stats_dict.keys() if stats_dict[k] is not None and k not in ['_rank', '_subject']][0] items = {} for wac in period_wacl: for item in wac.__dict__["_%ss" % chart_type]: key = key_func(item) mw_start = max(wac.start, start) mw_end = min(wac.end, end) count = item.stats.__dict__[count_attribute] * (mw_end - mw_start).days / 7.0 if key in items: items[key].stats.__dict__[count_attribute] += count else: items[key] = item items[key].stats.__dict__[count_attribute] = count items = items.values() items = [a for a in items if a.stats.__dict__[count_attribute] >= 1] items.sort(key = lambda a: a.stats.__dict__[count_attribute], reverse=True) for i,item in enumerate(items): item.stats._rank = i + 1 item.stats.__dict__[count_attribute] = safe_int(item.stats.__dict__[count_attribute]) return globals()[ "%sly%sChart" % ( period['name'].title().replace(' ',''), chart_type.capitalize() )]( subject = subject, start = start, end = end, stats = Stats( subject = subject, **{count_attribute[1:]: sum(a.stats.__dict__[count_attribute] for a in items)} ), **{"%ss" % chart_type: items} )
def playlists(self): """playlists of the user""" params = self._default_params({'method': 'user.getPlaylists'}) data = self._api._fetch_data(params).find('playlists') return [ User.Playlist( self._api, id = safe_int(p.findtext('id')), title = p.findtext('title'), date = datetime(*( time.strptime( p.findtext('date').strip(), '%Y-%m-%dT%H:%M:%S' )[0:6]) ).replace(tzinfo = UTC), size = safe_int(p.findtext('size')), creator = self ) for p in data.findall('playlist') ]
def get_recommended_events(self, limit = None, page = None): params = {'method': 'user.getRecommendedEvents'} if limit is not None: params.update({'limit': limit}) if page is not None: params.update({'page': page}) data = self._api._fetch_data(params, sign = True, session = True).find('events') total_pages = safe_int(data.attrib['totalPages']) yield total_pages for e in data.findall('event'): yield Event.create_from_data(self._api, e)
def _search_yield_func(api, album): return Album( api, name=album.findtext('name'), artist=Artist(api, name=album.findtext('artist')), id=safe_int(album.findtext('id')), url=album.findtext('url'), image=dict([(i.get('size'), i.text) for i in album.findall('image')]), streamable=(album.findtext('streamable') == '1'), )
def _fill_info(self): data = Album._fetch_data(self._api, self.artist.name, self.name) self._id = safe_int(data.findtext('id')) self._mbid = data.findtext('mbid') self._url = data.findtext('url') self._release_date = data.findtext('releasedate') and data.findtext('releasedate').strip() and \ datetime(*(time.strptime(data.findtext('releasedate').strip(), '%d %b %Y, 00:00')[0:6])).replace(tzinfo = UTC) self._image = dict([(i.get('size'), i.text) for i in data.findall('image')]) if not self._stats: self._stats = Stats( subject=self, listeners=safe_int(data.findtext('listeners')), playcount=safe_int(data.findtext('playcount')), ) self._top_tags = [ Tag(self._api, subject=self, name=t.findtext('name'), url=t.findtext('url')) for t in data.findall('toptags/tag') ]
def get_past_events(self, limit = None, page = None): params = self._default_params({'method': 'user.getPastEvents'}) if limit is not None: params.update({'limit': limit}) if page is not None: params.update({'page': page}) data = self._api._fetch_data(params).find('events') total_pages = safe_int(data.attrib['totalPages']) yield total_pages for e in data.findall('event'): yield Event.create_from_data(self._api, e)
def get_top_tags(api): params = {'method': 'tag.getTopTags'} data = api._fetch_data(params).find('toptags') return [ Tag(api, name=t.findtext('name'), url=t.findtext('url'), stats=Stats( subject=t.findtext('name'), count=safe_int(t.findtext('count')), )) for t in data.findall('tag') ]
def get_top_tracks(api, country, location=None): """ Get the most popular tracks on Last.fm by country @param api: an instance of L{Api} @type api: L{Api} @param country: a country name, as defined by the ISO 3166-1 country names standard @type country: L{str} @param location: a metro name, to fetch the charts for (must be within the country specified) (optional) @return: most popular tracks of the country @rtype: L{list} of L{Track} @note: Use L{Country.top_tracks} and L{Country.get_top_tracks} instead of using this method directly. """ params = {'method': 'geo.getTopTracks', 'country': country} if location is not None: params.update({'location': location}) data = api._fetch_data(params).find('toptracks') return [ Track(api, name=t.findtext('name'), mbid=t.findtext('mbid'), artist=Artist(api, name=t.findtext('artist/name'), mbid=t.findtext('artist/mbid'), url=t.findtext('artist/url')), stats=Stats(subject=t.findtext('name'), rank=safe_int(t.attrib['rank']), playcount=safe_int(t.findtext('playcount'))), streamable=(t.findtext('streamable') == '1'), full_track=(t.find('streamable').attrib['fulltrack'] == '1'), url='http://' + t.findtext('url'), image={'large': t.findtext('image')}) for t in data.findall('track') ]
def top_albums(self): """ top albums of the artist @rtype: L{list} of L{Album} """ params = self._default_params({'method': 'artist.getTopAlbums'}) data = self._api._fetch_data(params).find('topalbums') return [ Album(self._api, subject=self, name=a.findtext('name'), artist=self, mbid=a.findtext('mbid'), url=a.findtext('url'), image=dict([(i.get('size'), i.text) for i in a.findall('image')]), stats=Stats(subject=a.findtext('name'), playcount=safe_int(a.findtext('playcount')), rank=safe_int(a.attrib['rank']))) for a in data.findall('album') ]
def _fill_info(self): data = Artist._fetch_data(self._api, self.name) self._name = data.findtext('name') self._mbid = data.findtext('mbid') self._url = data.findtext('url') self._image = dict([(i.get('size'), i.text) for i in data.findall('image')]) self._streamable = (data.findtext('streamable') == 1) if not self._stats: self._stats = Stats( subject=self, listeners=safe_int(data.findtext('stats/listeners')), playcount=safe_int(data.findtext('stats/playcount'))) # self._similar = [ # Artist( # self._api, # subject = self, # name = a.findtext('name'), # url = a.findtext('url'), # image = dict([(i.get('size'), i.text) for i in a.findall('image')]) # ) # for a in data.findall('similar/artist') # ] self._top_tags = [ Tag(self._api, subject=self, name=t.findtext('name'), url=t.findtext('url')) for t in data.findall('tags/tag') ] self._bio = Wiki( self, published=data.findtext('bio/published').strip() and datetime(*(time.strptime( data.findtext('bio/published').strip(), '%a, %d %b %Y %H:%M:%S +0000')[0:6])).replace(tzinfo=UTC), summary=data.findtext('bio/summary'), content=data.findtext('bio/content'))
def _search_yield_func(api, album): return Album( api, name = album.findtext('name'), artist = Artist( api, name = album.findtext('artist') ), id = safe_int(album.findtext('id')), url = album.findtext('url'), image = dict([(i.get('size'), i.text) for i in album.findall('image')]), streamable = (album.findtext('streamable') == '1'), )
def get_past_events(self, limit=None, page=None): params = self._default_params({"method": "venue.getPastEvents"}) if limit is not None: params.update({"limit": limit}) if page is not None: params.update({"page": page}) data = self._api._fetch_data(params).find("events") total_pages = safe_int(data.attrib["totalPages"]) yield total_pages for e in data.findall("event"): yield Event.create_from_data(self._api, e)
def create_from_data(api, subject, data): w = WeeklyChart( subject = subject, start = datetime.utcfromtimestamp(safe_int(data.attrib['from'])).replace(tzinfo = UTC), end = datetime.utcfromtimestamp(safe_int(data.attrib['to'])).replace(tzinfo = UTC), ) count_attribute = data.find('artist').findtext('playcount') and 'playcount' or 'weight' def get_count_attribute(artist): return {count_attribute: safe_int(eval(artist.findtext(count_attribute)))} def get_count_attribute_sum(artists): return {count_attribute: reduce( lambda x, y:(x + safe_int(eval(y.findtext(count_attribute)))), artists, 0 )} return WeeklyArtistChart( subject = subject, start = datetime.utcfromtimestamp(safe_int(data.attrib['from'])).replace(tzinfo = UTC), end = datetime.utcfromtimestamp(safe_int(data.attrib['to'])).replace(tzinfo = UTC), stats = Stats( subject = subject, **get_count_attribute_sum(data.findall('artist')) ), artists = [ Artist( api, subject = w, name = a.findtext('name'), mbid = a.findtext('mbid'), stats = Stats( subject = a.findtext('name'), rank = safe_int(a.attrib['rank']), **get_count_attribute(a) ), url = a.findtext('url'), ) for a in data.findall('artist') ] )
def get_authenticated_user(api): data = api._fetch_data({'method': 'user.getInfo'}, sign=True, session=True).find('user') user = User( api, name = data.findtext('name'), url = data.findtext('url'), ) user._language = data.findtext('lang') user._country = Country(api, name = Country.ISO_CODES[data.findtext('country')]) user._age = safe_int(data.findtext('age')) user._gender = data.findtext('gender') user._subscriber = (data.findtext('subscriber') == "1") user._stats = Stats(subject = user, playcount = data.findtext('playcount')) return user
def top_tracks(self): """ top tracks of the artist @rtype: L{list} of L{Track} """ params = self._default_params({'method': 'artist.getTopTracks'}) data = self._api._fetch_data(params).find('toptracks') return [ Track( self._api, subject=self, name=t.findtext('name'), artist=self, mbid=t.findtext('mbid'), stats=Stats(subject=t.findtext('name'), playcount=safe_int(t.findtext('playcount')), rank=safe_int(t.attrib['rank'])), streamable=(t.findtext('streamable') == '1'), full_track=(t.find('streamable').attrib['fulltrack'] == '1'), image=dict([(i.get('size'), i.text) for i in t.findall('image')]), ) for t in data.findall('track') ]
def search(cls, api, search_item, limit=None, page=None, **kwds): from lastfm.api import Api cls_name = cls.__name__.lower() params = {"method": "%s.search" % cls_name, cls_name: search_item} for kwd in kwds: if kwds[kwd] is not None: params[kwd] = kwds[kwd] if limit: params.update({"limit": limit}) if page is not None: params.update({"page": page}) data = api._fetch_data(params).find("results") total_pages = ( safe_int(data.findtext("{%s}totalResults" % Api.SEARCH_XMLNS)) / safe_int(data.findtext("{%s}itemsPerPage" % Api.SEARCH_XMLNS)) + 1 ) yield total_pages for a in data.findall("%smatches/%s" % (cls_name, cls_name)): yield cls._search_yield_func(api, a)
def _fill_info(self): data = Album._fetch_data(self._api, self.artist.name, self.name) self._id = safe_int(data.findtext('id')) self._mbid = data.findtext('mbid') self._url = data.findtext('url') self._release_date = data.findtext('releasedate') and data.findtext('releasedate').strip() and \ datetime(*(time.strptime(data.findtext('releasedate').strip(), '%d %b %Y, 00:00')[0:6])).replace(tzinfo = UTC) self._image = dict([(i.get('size'), i.text) for i in data.findall('image')]) if not self._stats: self._stats = Stats( subject = self, listeners = safe_int(data.findtext('listeners')), playcount = safe_int(data.findtext('playcount')), ) self._top_tags = [ Tag( self._api, subject = self, name = t.findtext('name'), url = t.findtext('url') ) for t in data.findall('toptags/tag') ]
def get_authenticated_user(api): data = api._fetch_data({'method': 'user.getInfo'}, sign = True, session = True).find('user') user = User( api, name = data.findtext('name'), url = data.findtext('url'), ) user._language = data.findtext('lang') user._country = Country(api, name = Country.ISO_CODES[data.findtext('country')]) user._age = safe_int(data.findtext('age')) user._gender = data.findtext('gender') user._subscriber = (data.findtext('subscriber') == "1") user._stats = Stats(subject = user, playcount = data.findtext('playcount')) return user
def get_events(api, location, latitude=None, longitude=None, distance=None, page=None): """ Get the events for a location. @param api: an instance of L{Api} @type api: L{Api} @param location: location to retrieve events for (optional) @type location: L{str} @param latitude: latitude value to retrieve events for (optional) @type latitude: L{float} @param longitude: longitude value to retrieve events for (optional) @type longitude: L{float} @param distance: find events within a specified distance (optional) @type distance: L{float} @return: events for the location @rtype: L{lazylist} of L{Event} @raise InvalidParametersError: Either location or latitude and longitude has to be provided. Otherwise exception is raised. @note: Use L{Location.events} instead of using this method directly. """ if reduce(lambda x, y: x and y is None, [location, latitude, longitude], True): raise InvalidParametersError( "Either location or latitude and longitude has to be provided") params = {'method': 'geo.getEvents', 'location': location} if distance is not None: params.update({'distance': distance}) if latitude is not None and longitude is not None: params.update({'lat': latitude, 'long': longitude}) if page is not None: params.update({'page': page}) data = api._fetch_data(params).find('events') total_pages = safe_int(data.attrib['totalpages']) yield total_pages for e in data.findall('event'): yield Event.create_from_data(api, e)
def get_top_tags(api): params = {'method': 'tag.getTopTags'} data = api._fetch_data(params).find('toptags') return [ Tag( api, name = t.findtext('name'), url = t.findtext('url'), stats = Stats( subject = t.findtext('name'), count = safe_int(t.findtext('count')), ) ) for t in data.findall('tag') ]
def get_tracks(self, limit = None, page = None): params = self._default_params({'method': 'library.getTracks'}) if limit is not None: params.update({'limit': limit}) if page is not None: params.update({'page': page}) try: data = self._api._fetch_data(params).find('tracks') total_pages = safe_int(data.attrib['totalPages']) yield total_pages for t in data.findall('track'): yield Track( self._api, subject = self, name = t.findtext('name'), artist = Artist( self._api, subject = self, name = t.findtext('artist/name'), mbid = t.findtext('artist/mbid'), url = t.findtext('artist/url'), ), mbid = t.findtext('mbid'), stats = Stats( subject = t.findtext('name'), playcount = t.findtext('playcount') and safe_int(t.findtext('playcount')) or None, tagcount = t.findtext('tagcount') and safe_int(t.findtext('tagcount')) or None ), streamable = (t.findtext('streamable') == '1'), full_track = (t.find('streamable').attrib['fulltrack'] == '1'), image = dict([(i.get('size'), i.text) for i in t.findall('image')]), ) except LastfmError: yield None
def get_events(api, location, latitude = None, longitude = None, distance = None, page = None): """ Get the events for a location. @param api: an instance of L{Api} @type api: L{Api} @param location: location to retrieve events for (optional) @type location: L{str} @param latitude: latitude value to retrieve events for (optional) @type latitude: L{float} @param longitude: longitude value to retrieve events for (optional) @type longitude: L{float} @param distance: find events within a specified distance (optional) @type distance: L{float} @return: events for the location @rtype: L{lazylist} of L{Event} @raise InvalidParametersError: Either location or latitude and longitude has to be provided. Otherwise exception is raised. @note: Use L{Location.events} instead of using this method directly. """ if reduce(lambda x,y: x and y is None, [location, latitude, longitude], True): raise InvalidParametersError( "Either location or latitude and longitude has to be provided") params = {'method': 'geo.getEvents', 'location': location} if distance is not None: params.update({'distance': distance}) if latitude is not None and longitude is not None: params.update({'lat': latitude, 'long': longitude}) if page is not None: params.update({'page': page}) data = api._fetch_data(params).find('events') total_pages = safe_int(data.attrib['totalpages']) yield total_pages for e in data.findall('event'): yield Event.create_from_data(api, e)
def _search_yield_func(api, track): return Track( api, name = track.findtext('name'), artist = Artist( api, name=track.findtext('artist') ), url = track.findtext('url'), stats = Stats( subject=track.findtext('name'), listeners=safe_int(track.findtext('listeners')) ), streamable = (track.findtext('streamable') == '1'), full_track = (track.find('streamable').attrib['fulltrack'] == '1'), image = dict([(i.get('size'), i.text) for i in track.findall('image')]), )
def get_top_tags(self, limit = None): params = self._default_params({'method': 'user.getTopTags'}) if limit is not None: params.update({'limit': limit}) data = self._api._fetch_data(params).find('toptags') return [ Tag( self._api, subject = self, name = t.findtext('name'), url = t.findtext('url'), stats = Stats( subject = t.findtext('name'), count = safe_int(t.findtext('count')) ) ) for t in data.findall('tag') ]
def recommended_artists(self, page = None): params = {'method': 'user.getRecommendedArtists'} if page is not None: params.update({'page': page}) data = self._api._fetch_data(params, sign = True, session = True).find('recommendations') total_pages = safe_int(data.attrib['totalPages']) yield total_pages for a in data.findall('artist'): yield Artist( self._api, name = a.findtext('name'), mbid = a.findtext('mbid'), url = a.findtext('url'), streamable = (a.findtext('streamable') == "1"), image = dict([(i.get('size'), i.text) for i in a.findall('image')]), )
def members(self, page=None): """ members of the group @rtype: L{lazylist} of L{User} """ params = self._default_params({'method': 'group.getMembers'}) if page is not None: params.update({'page': page}) data = self._api._fetch_data(params).find('members') total_pages = safe_int(data.attrib['totalPages']) yield total_pages for u in data.findall('user'): yield User(self._api, name=u.findtext('name'), real_name=u.findtext('realname'), image=dict([(i.get('size'), i.text) for i in u.findall('image')]), url=u.findtext('url'))
def top_fans(self): """ top fans of the artist @rtype: L{list} of L{User} """ params = self._default_params({'method': 'artist.getTopFans'}) data = self._api._fetch_data(params).find('topfans') return [ User(self._api, subject=self, name=u.findtext('name'), url=u.findtext('url'), image=dict([(i.get('size'), i.text) for i in u.findall('image')]), stats=Stats(subject=u.findtext('name'), weight=safe_int(u.findtext('weight')))) for u in data.findall('user') ]