def create_from_data(api, subject, data): w = WeeklyChart( subject=subject, start=datetime.utcfromtimestamp(int(data.attrib['from'])), end=datetime.utcfromtimestamp(int(data.attrib['to'])), ) return WeeklyTrackChart( subject=subject, start=datetime.utcfromtimestamp(int(data.attrib['from'])), end=datetime.utcfromtimestamp(int(data.attrib['to'])), stats=Stats(subject=subject, playcount=reduce( lambda x, y: (x + int(y.findtext('playcount'))), data.findall('track'), 0)), tracks=[ Track( api, subject=w, name=t.findtext('name'), mbid=t.findtext('mbid'), artist=Artist( api, name=t.findtext('artist'), mbid=t.find('artist').attrib['mbid'], ), stats=Stats( subject=t.findtext('name'), rank=int(t.attrib['rank']), playcount=int(t.findtext('playcount')), ), url=t.findtext('url'), ) for t in data.findall('track') ])
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=int(a.attrib['rank']), playcount=int(a.findtext('playcount'))), url='http://' + a.findtext('url'), image={'large': a.findtext('image')}) for a in data.findall('artist') ]
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 int(a.findtext('tagcount')) or None, rank=a.attrib['rank'].strip() and int(a.attrib['rank']) or None)) for a in data.findall('album') ]
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 = 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 int(a.findtext('playcount')) or None, tagcount = a.findtext('tagcount') and 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 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 int(a.findtext('playcount')), rank = a.attrib['rank'].strip() and int(a.attrib['rank']) ) ) for a in data.findall('album') ]
def similar(self): """tracks similar to this track""" params = Track._check_params( {'method': 'track.getSimilar'}, self.artist.name, self.name, self.mbid ) data = self._api._fetch_data(params).find('similartracks') 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'), match = safe_float(t.findtext('match')) ), 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_similar(self, limit=None): """ Get the artists similar to this artist. @param limit: the number of artists returned (optional) @type limit: L{int} @return: artists similar to this artist @rtype: L{list} of L{Artist} """ params = self._default_params({'method': 'artist.getSimilar'}) if limit is not None: params.update({'limit': limit}) data = self._api._fetch_data(params).find('similarartists') self._similar = [ Artist(self._api, subject=self, name=a.findtext('name'), mbid=a.findtext('mbid'), stats=Stats( subject=a.findtext('name'), match=float(a.findtext('match')), ), url='http://' + a.findtext('url'), image={'large': a.findtext('image')}) for a in data.findall('artist') ] return self._similar[:]
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 int(t.attrib['rank']) or None, tagcount=t.findtext('tagcount') and 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_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 int(t.attrib['rank']) or None, playcount = t.findtext('playcount') and 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 _search_yield_func(api, tag): return Tag(api, name=tag.findtext('name'), url=tag.findtext('url'), stats=Stats( subject=tag.findtext('name'), count=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 init(self, api, **kwargs): if not isinstance(api, Api): raise InvalidParametersError( "api reference must be supplied as an argument") self._api = api super(Tag, self).init(**kwargs) self._stats = hasattr(self, '_stats') and Stats( subject=self, count=self._stats.count, rank=self._stats.rank) or None
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=int(t.findtext('count')), )) for t in data.findall('tag') ]
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=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 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), ) return WeeklyAlbumChart( 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, playcount=reduce( lambda x, y: (x + safe_int(y.findtext('playcount'))), data.findall('album'), 0)), albums=[ Album( api, subject=w, name=a.findtext('name'), mbid=a.findtext('mbid'), artist=Artist( api, subject=w, name=a.findtext('artist'), mbid=a.find('artist').attrib['mbid'], ), stats=Stats( subject=a.findtext('name'), rank=safe_int(a.attrib['rank']), playcount=safe_int(a.findtext('playcount')), ), url=a.findtext('url'), ) for a in data.findall('album') ])
def init(self, api, **kwargs): if not isinstance(api, Api): raise InvalidParametersError("api reference must be supplied as an argument") self._api = api super(User, self).init(**kwargs) self._stats = hasattr(self, "_stats") and Stats( subject = self, match = self._stats.match, weight = self._stats.weight, playcount = self._stats.playcount ) or None self._library = User.Library(api, self)
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=int(t.findtext('count')))) for t in data.findall('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 = 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 init(self, api, subject=None, **kwargs): """ Create an Artist object by providing all the data related to it. @param api: an instance of L{Api} @type api: L{Api} @param name: the artist name @type name: L{str} @param mbid: MBID of the artist @type mbid: L{str} @param url: URL of the artist on last.fm @type url: L{str} @param image: the images of the artist in various sizes @type image: L{dict} @param streamable: flag indicating if the artist is streamable from last.fm @type streamable: L{bool} @param stats: the artist statistics @type stats: L{Stats} @param similar: artists similar to the provided artist @type similar: L{list} of L{Artist} @param top_tags: top tags for the artist @type top_tags: L{list} of L{Tag} @param bio: biography of the artist @type bio: L{Wiki} @param subject: the subject to which this instance belongs to @type subject: L{User} OR L{Artist} OR L{Tag} OR L{Track} OR L{WeeklyChart} @raise InvalidParametersError: If an instance of L{Api} is not provided as the first parameter then an Exception is raised. """ if not isinstance(api, Api): raise InvalidParametersError( "api reference must be supplied as an argument") self._api = api super(Artist, self).init(**kwargs) self._stats = hasattr(self, "_stats") and Stats( subject=self, listeners=self._stats.listeners, playcount=self._stats.playcount, weight=self._stats.weight, match=self._stats.match, rank=self._stats.rank) or None self._bio = hasattr(self, "_bio") and Wiki( subject=self, published=self._bio.published, summary=self._bio.summary, content=self._bio.content) or None self._subject = subject
def top_tags(self): """top tags for the track""" params = Track._check_params({'method': 'track.getTopTags'}, self.artist.name, self.name, self.mbid) 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=int(t.findtext('count')), )) for t in data.findall('tag') ]
def top_fans(self): """top fans of the track""" params = Track._check_params({'method': 'track.getTopFans'}, self.artist.name, self.name, self.mbid) 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=int(u.findtext('weight')))) for u in data.findall('user') ]
def init(self, api, **kwargs): if not isinstance(api, Api): raise InvalidParametersError( "api reference must be supplied as an argument") self._api = api super(Track, self).init(**kwargs) self._stats = hasattr(self, "_stats") and Stats( subject=self, match=self._stats.match, playcount=self._stats.playcount, rank=self._stats.rank, listeners=self._stats.listeners, ) or None self._wiki = hasattr(self, "_wiki") and Wiki( subject=self, published=self._wiki.published, summary=self._wiki.summary, content=self._wiki.content) or None
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=int(u.findtext('weight')))) for u in data.findall('user') ]
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 init(self, api, subject=None, **kwargs): """ Create an Album object by providing all the data related to it. @param api: an instance of L{Api} @type api: L{Api} @param name: the album name @type name: L{str} @param artist: the album artist name @type artist: L{Artist} @param id: the album ID @type id: L{str} @param mbid: MBID of the album @type mbid: L{str} @param url: URL of the album on last.fm @type url: L{str} @param release_date: release date of the album @type release_date: C{datetime.datetime} @param image: the cover images of the album in various sizes @type image: L{dict} @param stats: the album statistics @type stats: L{Stats} @param top_tags: top tags for the album @type top_tags: L{list} of L{Tag} @param streamable: flag indicating if the album is streamable from last.fm @type streamable: L{bool} @param subject: the subject to which this instance belongs to @type subject: L{User} OR L{Artist} OR L{Tag} OR L{WeeklyChart} @raise InvalidParametersError: If an instance of L{Api} is not provided as the first parameter then an Exception is raised. """ if not isinstance(api, Api): raise InvalidParametersError( "api reference must be supplied as an argument") self._api = api super(Album, self).init(**kwargs) self._stats = hasattr(self, "_stats") and Stats( subject=self, listeners=self._stats.listeners, playcount=self._stats.playcount, match=self._stats.match, rank=self._stats.rank) or None self._subject = subject
def get_neighbours(self, limit=None): params = self._default_params({'method': 'user.getNeighbours'}) if limit is not None: params.update({'limit': limit}) data = self._api._fetch_data(params).find('neighbours') return [ User( self._api, subject=self, name=u.findtext('name'), real_name=u.findtext('realname'), image={'medium': u.findtext('image')}, url=u.findtext('url'), stats=Stats( subject=u.findtext('name'), match=u.findtext('match') and float(u.findtext('match')), ), ) for u in data.findall('user') ]
def get_info(api, name): data = api._fetch_data({'method' : 'user.getInfo', 'user' : name}).find('user') user = User( api, name = data.findtext('name'), real_name = data.findtext('realname'), image = dict([(i.get('size'), i.text) for i in data.findall('image')]), url = data.findtext('url'), ) user._language = data.findtext('lang') if data.findtext('country'): user._country = Country(api, name = Country.ISO_CODES[data.findtext('country')]) if data.findtext('age'): user._age = 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_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=int(t.attrib['rank']), playcount=int(t.findtext('playcount')) if t.findtext('playcount') else None, listeners=int(t.findtext('listeners')) if t.findtext('listeners') else None), 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_artists(self): """top artists for the tag""" params = self._default_params({'method': 'tag.getTopArtists'}) data = self._api._fetch_data(params).find('topartists') return [ Artist( self._api, subject=self, name=a.findtext('name'), mbid=a.findtext('mbid'), stats=Stats(subject=a.findtext('name'), rank=a.attrib['rank'].strip() and safe_int(a.attrib['rank']) 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')]), ) for a in data.findall('artist') ]
def _fill_info(self): data = Album._fetch_data(self._api, self.artist.name, self.name) self._id = 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])) self._image = dict([(i.get('size'), i.text) for i in data.findall('image')]) if not self._stats: self._stats = Stats( subject=self, listeners=int(data.findtext('listeners')), playcount=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') ]