Package lastfm :: Module event
[hide private]
[frames] | no frames]

Source Code for Module lastfm.event

  1  #!/usr/bin/env python 
  2   
  3  __author__ = "Abhinav Sarkar <abhinav@abhinavsarkar.net>" 
  4  __version__ = "0.2" 
  5  __license__ = "GNU Lesser General Public License" 
  6   
  7  from lastfm.base import LastfmBase 
  8  from lastfm.mixins import Cacheable, Sharable, Shoutable 
9 10 -class Event(LastfmBase, Cacheable, Sharable, Shoutable):
11 """A class representing an event.""" 12 STATUS_ATTENDING = 0 13 STATUS_MAYBE = 1 14 STATUS_NOT = 2 15
16 - def init(self, 17 api, 18 id = None, 19 title = None, 20 artists = None, 21 headliner = None, 22 venue = None, 23 start_date = None, 24 description = None, 25 image = None, 26 url = None, 27 stats = None, 28 tag = None):
29 if not isinstance(api, Api): 30 raise InvalidParametersError("api reference must be supplied as an argument") 31 Sharable.init(self, api) 32 Shoutable.init(self, api) 33 34 self._api = api 35 self._id = id 36 self._title = title 37 self._artists = artists 38 self._headliner = headliner 39 self._venue = venue 40 self._start_date = start_date 41 self._description = description 42 self._image = image 43 self._url = url 44 self._stats = stats and Stats( 45 subject = self, 46 attendance = stats.attendance, 47 reviews = stats.reviews 48 ) 49 self._tag = tag
50 51 @property
52 - def id(self):
53 """id of the event""" 54 return self._id
55 56 @property
57 - def title(self):
58 """title of the event""" 59 return self._title
60 61 @property
62 - def artists(self):
63 """artists performing in the event""" 64 return self._artists
65 66 @property
67 - def headliner(self):
68 """headliner artist of the event""" 69 return self._headliner
70 71 @property
72 - def venue(self):
73 """venue of the event""" 74 return self._venue
75 76 @property
77 - def start_date(self):
78 """start date of the event""" 79 return self._start_date
80 81 @property
82 - def description(self):
83 """description of the event""" 84 return self._description
85 86 @property
87 - def image(self):
88 """poster of the event""" 89 return self._image
90 91 @property
92 - def url(self):
93 """url of the event's page""" 94 return self._url
95 96 @property
97 - def stats(self):
98 """stats of the event""" 99 return self._stats
100 101 @property
102 - def tag(self):
103 """tags for the event""" 104 return self._tag
105
106 - def attend(self, status = STATUS_ATTENDING):
107 if status not in [Event.STATUS_ATTENDING, Event.STATUS_MAYBE, Event.STATUS_NOT]: 108 InvalidParametersError("status has to be 0, 1 or 2") 109 params = self._default_params({'method': 'event.attend', 'status': status}) 110 self._api._post_data(params)
111 112 @staticmethod
113 - def get_info(api, event):
114 params = {'method': 'event.getInfo', 'event': event} 115 data = api._fetch_data(params).find('event') 116 return Event.create_from_data(api, data)
117 118 @staticmethod
119 - def create_from_data(api, data):
120 start_date = None 121 122 if data.findtext('startTime') is not None: 123 start_date = datetime(*( 124 time.strptime( 125 "%s %s" % ( 126 data.findtext('startDate').strip(), 127 data.findtext('startTime').strip() 128 ), 129 '%a, %d %b %Y %H:%M' 130 )[0:6]) 131 ) 132 else: 133 try: 134 start_date = datetime(*( 135 time.strptime( 136 data.findtext('startDate').strip(), 137 '%a, %d %b %Y %H:%M:%S' 138 )[0:6]) 139 ) 140 except ValueError: 141 try: 142 start_date = datetime(*( 143 time.strptime( 144 data.findtext('startDate').strip(), 145 '%a, %d %b %Y' 146 )[0:6]) 147 ) 148 except ValueError: 149 pass 150 151 152 return Event( 153 api, 154 id = int(data.findtext('id')), 155 title = data.findtext('title'), 156 artists = [Artist(api, name = a.text) for a in data.findall('artists/artist')], 157 headliner = Artist(api, name = data.findtext('artists/headliner')), 158 venue = Venue( 159 api, 160 name = data.findtext('venue/name'), 161 location = Location( 162 api, 163 city = data.findtext('venue/location/city'), 164 country = Country( 165 api, 166 name = data.findtext('venue/location/country') 167 ), 168 street = data.findtext('venue/location/street'), 169 postal_code = data.findtext('venue/location/postalcode'), 170 latitude = float(data.findtext( 171 'venue/location/{%s}point/{%s}lat' % ((Location.XMLNS,)*2) 172 )), 173 longitude = float(data.findtext( 174 'venue/location/{%s}point/{%s}long' % ((Location.XMLNS,)*2) 175 )), 176 #timezone = data.findtext('venue/location/timezone') 177 ), 178 url = data.findtext('venue/url') 179 ), 180 start_date = start_date, 181 description = data.findtext('description'), 182 image = dict([(i.get('size'), i.text) for i in data.findall('image')]), 183 url = data.findtext('url'), 184 stats = Stats( 185 subject = int(data.findtext('id')), 186 attendance = int(data.findtext('attendance')), 187 reviews = int(data.findtext('reviews')), 188 ), 189 tag = data.findtext('tag') 190 )
191
192 - def _default_params(self, extra_params = []):
193 if not self.id: 194 raise InvalidParametersError("id has to be provided.") 195 params = {'event': self.id} 196 params.update(extra_params) 197 return params
198 199 @staticmethod
200 - def _hash_func(*args, **kwds):
201 try: 202 return hash(kwds['id']) 203 except KeyError: 204 raise InvalidParametersError("id has to be provided for hashing")
205
206 - def __hash__(self):
207 return Event._hash_func(id = self.id)
208
209 - def __eq__(self, other):
210 return self.id == other.id
211
212 - def __lt__(self, other):
213 return self.start_date < other.start_date
214
215 - def __repr__(self):
216 return "<lastfm.Event: %s at %s on %s>" % (self.title, self.venue.name, self.start_date.strftime("%x"))
217 218 from datetime import datetime 219 import time 220 221 from lastfm.api import Api 222 from lastfm.artist import Artist 223 from lastfm.error import InvalidParametersError 224 from lastfm.geo import Location, Country 225 from lastfm.stats import Stats 226 from lastfm.venue import Venue 227