Ejemplo n.º 1
0
 def get_recent_tracks(self,
                       limit=None,
                       timefrom=None,
                       timeto=None,
                       page=None):
     params = self._default_params({'method': 'user.getRecentTracks'})
     if limit is not None:
         params.update({'limit': limit})
     if timefrom is not None:
         params.update({'from': timefrom})
     if timeto is not None:
         params.update({'to': timeto})
     if page is not None:
         params.update({'page': page})
     data = self._api._fetch_data(params,
                                  no_cache=True).find('recenttracks')
     total_pages = int(data.attrib['totalPages'])
     yield total_pages
     for t in data.findall('track'):
         track = Track(
             self._api,
             subject=self,
             name=t.findtext('name'),
             artist=Artist(
                 self._api,
                 subject=self,
                 name=t.findtext('artist'),
                 mbid=t.find('artist').attrib['mbid'],
             ),
             album=Album(
                 self._api,
                 subject=self,
                 name=t.findtext('album'),
                 artist=Artist(
                     self._api,
                     subject=self,
                     name=t.findtext('artist'),
                     mbid=t.find('artist').attrib['mbid'],
                 ),
                 mbid=t.find('album').attrib['mbid'],
             ),
             mbid=t.findtext('mbid'),
             streamable=(t.findtext('streamable') == '1'),
             url=t.findtext('url'),
             image=dict([(i.get('size'), i.text)
                         for i in t.findall('image')]),
             played_on=datetime(*(time.strptime(
                 t.findtext('date').strip(), '%d %b %Y, %H:%M')[0:6]))
             if t.findtext('date') else datetime(
                 *datetime.now().timetuple()[0:6]),
             bypass_registry=True)
         if 'nowplaying' in t.attrib and t.attrib['nowplaying'] == 'true':
             self._now_playing = track
         yield track
Ejemplo n.º 2
0
 def get_recent_tracks(self, limit=None, page=1, fr=None, to=None): #from 1/1/2012 to 1/1/2014 #  to = 1388534400, fr = 1325376000
     params = self._default_params({'method': 'user.getRecentTracks'})
     if limit is not None:
         params.update({'limit': limit})
         params.update({'page': page})
     if fr is not None:
         params.update({'from': fr}) # set time window
     if to is not None:
         params.update({'to': to}) # set time window
        # params.update({'extended': 1})
     data = self._api._fetch_data(params, no_cache=True).find('recenttracks')
     return [
             Track(
                   self._api,
                   subject = self,
                   name = t.findtext('name'),
                   artist = Artist(
                                   self._api,
                                   subject = self,
                                   name = t.findtext('artist'),
                                   mbid = t.find('artist').attrib['mbid'],
                                   ),
                   album = Album(
                                 self._api,
                                 subject = self,
                                 name = t.findtext('album'),
                                 artist = Artist(
                                                 self._api,
                                                 subject = self,
                                                 name = t.findtext('artist'),
                                                 mbid = t.find('artist').attrib['mbid'],
                                                 ),
                                 mbid = t.find('album').attrib['mbid'],
                                 ),
                   mbid = t.findtext('mbid'),
                   streamable = (t.findtext('streamable') == '1'),
                   url = t.findtext('url'),
                   image = dict([(i.get('size'), i.text) for i in t.findall('image')]),
                   played_on = datetime(*(
                                        time.strptime(
                                                      t.findtext('date').strip(),
                                                      '%d %b %Y, %H:%M'
                                                      )[0:6])
                                        ).replace(
                                        tzinfo = UTC
                                        ) if t.findtext('date') else datetime(*datetime.utcnow().timetuple()[0:6]).replace(tzinfo=UTC),
                   now_playing = True if 'nowplaying' in t.attrib and t.attrib['nowplaying'] == 'true' else False
                   )
                   for t in data.findall('track')
                   ]
Ejemplo n.º 3
0
 def get_info(api, artist=None, album=None, mbid=None):
     """
     Get the data for the album.
     
     @param api:      an instance of L{Api}
     @type api:       L{Api}
     @param artist:   the album artist name 
     @type artist:    L{str} OR L{Artist}
     @param album:    the album name
     @type album:     L{str}
     @param mbid:     MBID of the album
     @type mbid:      L{str}
     
     @return:         an Album object corresponding to the provided album name
     @rtype:          L{Album}
     
     @raise lastfm.InvalidParametersError: Either album and artist parameters or 
                                           mbid parameter has to be provided. 
                                           Otherwise exception is raised.
     
     @note: Use the L{Api.get_album} method instead of using this method directly.
     """
     data = Album._fetch_data(api, artist, album, mbid)
     a = Album(
         api,
         name=data.findtext('name'),
         artist=Artist(
             api,
             name=data.findtext('artist'),
         ),
     )
     a._fill_info()
     return a
Ejemplo n.º 4
0
 def loved_tracks(self):
     params = self._default_params({'method': 'user.getLovedTracks'})
     data = self._api._fetch_data(params).find('lovedtracks')
     return [
             Track(
                 self._api,
                 subject = self,
                 name = t.findtext('name'),
                 artist = Artist(
                     self._api,
                     subject = self,
                     name = t.findtext('artist/name'),
                     mbid = t.findtext('artist/mbid'),
                     url = t.findtext('artist/url'),
                 ),
                 mbid = t.findtext('mbid'),
                 image = dict([(i.get('size'), i.text) for i in t.findall('image')]),
                 loved_on = datetime(*(
                     time.strptime(
                         t.findtext('date').strip(),
                         '%d %b %Y, %H:%M'
                         )[0:6])
                     )
                 )
             for t in data.findall('track')
             ]
Ejemplo n.º 5
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.º 6
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.º 7
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 = float(data.findtext('score')),
                        matches = int(data.find('artists').attrib['matches']),
                        artists = [
                                   Artist(
                                           api,
                                           name = a.findtext('name'),
                                           url = a.findtext('url'),
                                           image = dict([(i.get('size'), i.text) for i in a.findall('image')]),
                                           )
                                   for a in data.findall('artists/artist')
                                   ]
                        )
Ejemplo n.º 8
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.º 9
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.º 10
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.º 11
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.º 12
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.º 13
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.º 14
0
 def _search_yield_func(api, album):
     return Album(
         api,
         name=album.findtext('name'),
         artist=Artist(api, name=album.findtext('artist')),
         id=int(album.findtext('id')),
         url=album.findtext('url'),
         image=dict([(i.get('size'), i.text)
                     for i in album.findall('image')]),
         streamable=(album.findtext('streamable') == '1'),
     )
Ejemplo n.º 15
0
 def get_info(api, artist=None, track=None, mbid=None):
     data = Track._fetch_data(api, artist, track, mbid)
     t = Track(
         api,
         name=data.findtext('name'),
         artist=Artist(
             api,
             name=data.findtext('artist/name'),
         ),
     )
     t._fill_info()
     return t
Ejemplo n.º 16
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.º 17
0
 def get_recent_tracks(self, limit=None):
     params = self._default_params({'method': 'user.getRecentTracks'})
     if limit is not None:
         params.update({'limit': limit})
     data = self._api._fetch_data(params,
                                  no_cache=True).find('recenttracks')
     return [
         Track(self._api,
               subject=self,
               name=t.findtext('name'),
               artist=Artist(
                   self._api,
                   subject=self,
                   name=t.findtext('artist'),
                   mbid=t.find('artist').attrib['mbid'],
               ),
               album=Album(
                   self._api,
                   subject=self,
                   name=t.findtext('album'),
                   artist=Artist(
                       self._api,
                       subject=self,
                       name=t.findtext('artist'),
                       mbid=t.find('artist').attrib['mbid'],
                   ),
                   mbid=t.find('album').attrib['mbid'],
               ),
               mbid=t.findtext('mbid'),
               streamable=(t.findtext('streamable') == '1'),
               url=t.findtext('url'),
               image=dict([(i.get('size'), i.text)
                           for i in t.findall('image')]),
               played_on=datetime(*(time.strptime(
                   t.findtext('date').strip(), '%d %b %Y, %H:%M')[0:6])))
         for t in data.findall('track')
     ]
Ejemplo n.º 18
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.º 19
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 = 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')]),
                         )
Ejemplo n.º 20
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.º 21
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.º 22
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.º 23
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.º 24
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 = int(data.attrib['totalPages'])
                yield total_pages

                for t in data.findall('track'):
                    yield Track(
                        self._api,
                        subject=self,
                        name=t.findtext('name'),
                        artist=Artist(
                            self._api,
                            subject=self,
                            name=t.findtext('artist/name'),
                            mbid=t.findtext('artist/mbid'),
                            url=t.findtext('artist/url'),
                        ),
                        mbid=t.findtext('mbid'),
                        stats=Stats(subject=t.findtext('name'),
                                    playcount=t.findtext('playcount')
                                    and int(t.findtext('playcount')) or None,
                                    tagcount=t.findtext('tagcount')
                                    and int(t.findtext('tagcount')) or None),
                        streamable=(t.findtext('streamable') == '1'),
                        full_track=(
                            t.find('streamable').attrib['fulltrack'] == '1'),
                        image=dict([(i.get('size'), i.text)
                                    for i in t.findall('image')]),
                    )
            except LastfmError:
                yield None
Ejemplo n.º 25
0
    def create_from_data(api, data):
        """
        Create the Event object from the provided XML element.
        
        @param api:      an instance of L{Api}
        @type api:       L{Api}
        @param data:     XML element
        @type data:      C{xml.etree.ElementTree.Element}
        
        @return:         an Event object corresponding to the provided XML element
        @rtype:          L{Event}
        
        @note: Use the L{Api.get_event} method instead of using this method directly.
        """
        start_date = None

        if data.findtext('startTime') is not None:
            start_date = datetime(*(time.strptime(
                "%s %s" % (data.findtext('startDate').strip(),
                           data.findtext('startTime').strip()),
                '%a, %d %b %Y %H:%M')[0:6]))
        else:
            try:
                start_date = datetime(*(time.strptime(
                    data.findtext('startDate').strip(),
                    '%a, %d %b %Y %H:%M:%S')[0:6]))
            except ValueError:
                try:
                    start_date = datetime(*(time.strptime(
                        data.findtext('startDate').strip(), '%a, %d %b %Y')
                                            [0:6]))
                except ValueError:
                    pass

        latitude = data.findtext('venue/location/{%s}point/{%s}lat' %
                                 ((Location.XMLNS, ) * 2))
        longitude = data.findtext('venue/location/{%s}point/{%s}long' %
                                  ((Location.XMLNS, ) * 2))

        return Event(
            api,
            id=int(data.findtext('id')),
            title=data.findtext('title'),
            artists=[
                Artist(api, name=a.text)
                for a in data.findall('artists/artist')
            ],
            headliner=Artist(api, name=data.findtext('artists/headliner')),
            venue=Venue(
                api,
                id=int(data.findtext('venue/url').split('/')[-1]),
                name=data.findtext('venue/name'),
                location=Location(
                    api,
                    city=data.findtext('venue/location/city'),
                    country=Country(
                        api, name=data.findtext('venue/location/country')),
                    street=data.findtext('venue/location/street'),
                    postal_code=data.findtext('venue/location/postalcode'),
                    latitude=(latitude.strip() != '') and float(latitude)
                    or None,
                    longitude=(longitude.strip() != '') and float(longitude)
                    or None,
                    #timezone = data.findtext('venue/location/timezone')
                ),
                url=data.findtext('venue/url')),
            start_date=start_date,
            description=data.findtext('description'),
            image=dict([(i.get('size'), i.text)
                        for i in data.findall('image')]),
            url=data.findtext('url'),
            stats=Stats(
                subject=int(data.findtext('id')),
                attendance=int(data.findtext('attendance')),
                reviews=int(data.findtext('reviews')),
            ),
            tag=data.findtext('tag'))