Esempio n. 1
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=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')
     ]
Esempio n. 2
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 safe_int(a.findtext('playcount')),
                                   rank = a.attrib['rank'].strip() and safe_int(a.attrib['rank'])
                                   )
                     )
                for a in data.findall('album')
                ]
Esempio n. 3
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 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')
             ]
Esempio n. 4
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 safe_int(a.findtext('playcount')),
                                   rank = a.attrib['rank'].strip() and safe_int(a.attrib['rank'])
                                   )
                     )
                for a in data.findall('album')
                ]
Esempio n. 5
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 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')
             ]
Esempio n. 6
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 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')
     ]
Esempio n. 7
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 = 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
Esempio n. 8
0
 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')
             ]
Esempio n. 9
0
    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')
                ]
Esempio n. 10
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 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')
             ]
Esempio n. 11
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 = 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
Esempio n. 12
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 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')
             ]
Esempio n. 13
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 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')
     ]
Esempio n. 14
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 = 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')
             ]
Esempio n. 15
0
 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))
Esempio n. 16
0
 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
Esempio n. 17
0
 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
Esempio n. 18
0
 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')
                                   ]
                        )
Esempio n. 19
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=safe_int(tag.findtext('count')),
                ))
Esempio n. 20
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')
            ])
Esempio n. 21
0
 def get_count_attribute_sum(artists):
     return {
         count_attribute:
         reduce(
             lambda x, y:
             (x + safe_int(eval(y.findtext(count_attribute)))), artists,
             0)
     }
Esempio n. 22
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')
                ]
Esempio n. 23
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'
Esempio 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'
Esempio n. 25
0
    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)
Esempio n. 26
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 = safe_int(tag.findtext('count')),
                              )
                 )
Esempio n. 27
0
    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')
                         )
Esempio n. 28
0
 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}
     )
Esempio n. 29
0
 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')
             ]
Esempio n. 30
0
 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)
Esempio n. 31
0
 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'),
     )
Esempio n. 32
0
 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)
Esempio n. 33
0
 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')
             ]
Esempio n. 34
0
 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')
     ]
Esempio n. 35
0
    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)
Esempio n. 36
0
    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)
Esempio n. 37
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=safe_int(t.findtext('count')),
             )) for t in data.findall('tag')
     ]
Esempio n. 38
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')
        ]
Esempio n. 39
0
    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')
        ]
Esempio n. 40
0
    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'))
Esempio n. 41
0
 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'),
                   )
Esempio n. 42
0
    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)
Esempio n. 43
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')
                   ]
         )
Esempio n. 44
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 = 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
Esempio n. 45
0
 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')
     ]
Esempio n. 46
0
    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)
Esempio n. 47
0
 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')
                 ]
Esempio n. 48
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 = 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
Esempio n. 49
0
    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)
Esempio n. 50
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 = safe_int(t.findtext('count')),
                               )
                 )
             for t in data.findall('tag')
             ]
Esempio n. 51
0
 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
Esempio n. 52
0
        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
Esempio n. 53
0
    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)
Esempio n. 54
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=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')]),
                 )
Esempio n. 55
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=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')]),
                 )
Esempio n. 56
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 = safe_int(t.findtext('count'))
                               )
                 )
             for t in data.findall('tag')
             ]
Esempio n. 57
0
    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')]),
                         )
Esempio n. 58
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 = safe_int(t.findtext('count'))
                               )
                 )
             for t in data.findall('tag')
             ]
Esempio n. 59
0
 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'))
Esempio n. 60
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=safe_int(u.findtext('weight'))))
         for u in data.findall('user')
     ]