def get_recent_tracks(self, limit=None, timefrom=None, timeto=None, page=None): params = self._default_params({'method': 'user.getRecentTracks'}) if limit is not None: params.update({'limit': limit}) if timefrom is not None: params.update({'from': timefrom}) if timeto is not None: params.update({'to': timeto}) if page is not None: params.update({'page': page}) data = self._api._fetch_data(params, no_cache=True).find('recenttracks') total_pages = int(data.attrib['totalPages']) yield total_pages for t in data.findall('track'): track = Track( self._api, subject=self, name=t.findtext('name'), artist=Artist( self._api, subject=self, name=t.findtext('artist'), mbid=t.find('artist').attrib['mbid'], ), album=Album( self._api, subject=self, name=t.findtext('album'), artist=Artist( self._api, subject=self, name=t.findtext('artist'), mbid=t.find('artist').attrib['mbid'], ), mbid=t.find('album').attrib['mbid'], ), mbid=t.findtext('mbid'), streamable=(t.findtext('streamable') == '1'), url=t.findtext('url'), image=dict([(i.get('size'), i.text) for i in t.findall('image')]), played_on=datetime(*(time.strptime( t.findtext('date').strip(), '%d %b %Y, %H:%M')[0:6])) if t.findtext('date') else datetime( *datetime.now().timetuple()[0:6]), bypass_registry=True) if 'nowplaying' in t.attrib and t.attrib['nowplaying'] == 'true': self._now_playing = track yield track
def get_recent_tracks(self, limit=None, page=1, fr=None, to=None): #from 1/1/2012 to 1/1/2014 # to = 1388534400, fr = 1325376000 params = self._default_params({'method': 'user.getRecentTracks'}) if limit is not None: params.update({'limit': limit}) params.update({'page': page}) if fr is not None: params.update({'from': fr}) # set time window if to is not None: params.update({'to': to}) # set time window # params.update({'extended': 1}) data = self._api._fetch_data(params, no_cache=True).find('recenttracks') return [ Track( self._api, subject = self, name = t.findtext('name'), artist = Artist( self._api, subject = self, name = t.findtext('artist'), mbid = t.find('artist').attrib['mbid'], ), album = Album( self._api, subject = self, name = t.findtext('album'), artist = Artist( self._api, subject = self, name = t.findtext('artist'), mbid = t.find('artist').attrib['mbid'], ), mbid = t.find('album').attrib['mbid'], ), mbid = t.findtext('mbid'), streamable = (t.findtext('streamable') == '1'), url = t.findtext('url'), image = dict([(i.get('size'), i.text) for i in t.findall('image')]), played_on = datetime(*( time.strptime( t.findtext('date').strip(), '%d %b %Y, %H:%M' )[0:6]) ).replace( tzinfo = UTC ) if t.findtext('date') else datetime(*datetime.utcnow().timetuple()[0:6]).replace(tzinfo=UTC), now_playing = True if 'nowplaying' in t.attrib and t.attrib['nowplaying'] == 'true' else False ) for t in data.findall('track') ]
def get_info(api, artist=None, album=None, mbid=None): """ Get the data for the album. @param api: an instance of L{Api} @type api: L{Api} @param artist: the album artist name @type artist: L{str} OR L{Artist} @param album: the album name @type album: L{str} @param mbid: MBID of the album @type mbid: L{str} @return: an Album object corresponding to the provided album name @rtype: L{Album} @raise lastfm.InvalidParametersError: Either album and artist parameters or mbid parameter has to be provided. Otherwise exception is raised. @note: Use the L{Api.get_album} method instead of using this method directly. """ data = Album._fetch_data(api, artist, album, mbid) a = Album( api, name=data.findtext('name'), artist=Artist( api, name=data.findtext('artist'), ), ) a._fill_info() return a
def loved_tracks(self): params = self._default_params({'method': 'user.getLovedTracks'}) data = self._api._fetch_data(params).find('lovedtracks') 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'), image = dict([(i.get('size'), i.text) for i in t.findall('image')]), loved_on = datetime(*( time.strptime( t.findtext('date').strip(), '%d %b %Y, %H:%M' )[0:6]) ) ) for t in data.findall('track') ]
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_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 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 = float(data.findtext('score')), matches = 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 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 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_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 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_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 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 _search_yield_func(api, album): return Album( api, name=album.findtext('name'), artist=Artist(api, name=album.findtext('artist')), id=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_info(api, artist=None, track=None, mbid=None): data = Track._fetch_data(api, artist, track, mbid) t = Track( api, name=data.findtext('name'), artist=Artist( api, name=data.findtext('artist/name'), ), ) t._fill_info() return t
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 get_recent_tracks(self, limit=None): params = self._default_params({'method': 'user.getRecentTracks'}) if limit is not None: params.update({'limit': limit}) data = self._api._fetch_data(params, no_cache=True).find('recenttracks') return [ Track(self._api, subject=self, name=t.findtext('name'), artist=Artist( self._api, subject=self, name=t.findtext('artist'), mbid=t.find('artist').attrib['mbid'], ), album=Album( self._api, subject=self, name=t.findtext('album'), artist=Artist( self._api, subject=self, name=t.findtext('artist'), mbid=t.find('artist').attrib['mbid'], ), mbid=t.find('album').attrib['mbid'], ), mbid=t.findtext('mbid'), streamable=(t.findtext('streamable') == '1'), url=t.findtext('url'), image=dict([(i.get('size'), i.text) for i in t.findall('image')]), played_on=datetime(*(time.strptime( t.findtext('date').strip(), '%d %b %Y, %H:%M')[0:6]))) for t in data.findall('track') ]
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 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 = 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 _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 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 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 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 = 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 int(t.findtext('playcount')) 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')]), ) except LastfmError: yield None
def create_from_data(api, data): """ Create the Event object from the provided XML element. @param api: an instance of L{Api} @type api: L{Api} @param data: XML element @type data: C{xml.etree.ElementTree.Element} @return: an Event object corresponding to the provided XML element @rtype: L{Event} @note: Use the L{Api.get_event} method instead of using this method directly. """ start_date = None if data.findtext('startTime') is not None: start_date = datetime(*(time.strptime( "%s %s" % (data.findtext('startDate').strip(), data.findtext('startTime').strip()), '%a, %d %b %Y %H:%M')[0:6])) else: try: start_date = datetime(*(time.strptime( data.findtext('startDate').strip(), '%a, %d %b %Y %H:%M:%S')[0:6])) except ValueError: try: start_date = datetime(*(time.strptime( data.findtext('startDate').strip(), '%a, %d %b %Y') [0:6])) except ValueError: pass latitude = data.findtext('venue/location/{%s}point/{%s}lat' % ((Location.XMLNS, ) * 2)) longitude = data.findtext('venue/location/{%s}point/{%s}long' % ((Location.XMLNS, ) * 2)) return Event( api, id=int(data.findtext('id')), title=data.findtext('title'), artists=[ Artist(api, name=a.text) for a in data.findall('artists/artist') ], headliner=Artist(api, name=data.findtext('artists/headliner')), venue=Venue( api, id=int(data.findtext('venue/url').split('/')[-1]), name=data.findtext('venue/name'), location=Location( api, city=data.findtext('venue/location/city'), country=Country( api, name=data.findtext('venue/location/country')), street=data.findtext('venue/location/street'), postal_code=data.findtext('venue/location/postalcode'), latitude=(latitude.strip() != '') and float(latitude) or None, longitude=(longitude.strip() != '') and float(longitude) or None, #timezone = data.findtext('venue/location/timezone') ), url=data.findtext('venue/url')), start_date=start_date, description=data.findtext('description'), image=dict([(i.get('size'), i.text) for i in data.findall('image')]), url=data.findtext('url'), stats=Stats( subject=int(data.findtext('id')), attendance=int(data.findtext('attendance')), reviews=int(data.findtext('reviews')), ), tag=data.findtext('tag'))