Ejemplo n.º 1
0
 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')
         ])
Ejemplo n.º 2
0
 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')
     ]
Ejemplo n.º 3
0
 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')
     ]
Ejemplo n.º 4
0
        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
Ejemplo n.º 5
0
    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')
                ]
Ejemplo n.º 6
0
 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')
             ]
Ejemplo n.º 7
0
 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[:]
Ejemplo n.º 8
0
 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')
     ]
Ejemplo n.º 9
0
 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')
             ]
Ejemplo n.º 10
0
 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')),
                ))
Ejemplo n.º 11
0
    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')
            ])
Ejemplo n.º 12
0
    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
Ejemplo n.º 13
0
 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')
     ]
Ejemplo n.º 14
0
 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')]),
     )
Ejemplo n.º 15
0
 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')
         ])
Ejemplo n.º 16
0
 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)
Ejemplo n.º 17
0
 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')
     ]
Ejemplo n.º 18
0
 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
Ejemplo n.º 19
0
    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
Ejemplo n.º 20
0
 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')
     ]
Ejemplo n.º 21
0
 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')
     ]
Ejemplo n.º 22
0
 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
Ejemplo n.º 23
0
 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')
     ]
Ejemplo n.º 24
0
    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'
Ejemplo n.º 25
0
 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
Ejemplo n.º 26
0
 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')
     ]
Ejemplo n.º 27
0
    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
Ejemplo n.º 28
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=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')
        ]
Ejemplo n.º 29
0
 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')
     ]
Ejemplo n.º 30
0
 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')
     ]