import urllib
import urllib2
-from resultsparser import parse_xml
+import location
+
+from resultsparser import parse_json
class Event:
def __init__(self,
self.method = 'geo.getevents'
def get_events(self, lat, lng, distance):
- """ Retrieve xml and parse into events list """
+ """ Retrieve json and parse into events list """
events = []
- xml = self.get_xml(lat, lng, distance)
- events.extend(parse_xml(xml,
- lat,
- lng))
- return self.sort_events(events)
+ result = self.get_json(lat, lng, distance)
+ for event in parse_json(result):
+ events.append(Event(event[0],
+ event[1],
+ event[2],
+ event[3],
+ event[4],
+ event[5],
+ event[6]))
+ return self.sort_events(events, lat, lng)
- def sort_events(self, events):
+ def sort_events(self, events, lat, lng):
""" Sort gig by distance """
if len(events) > 1:
- events.sort(cmp=self.distance_cmp, key=lambda x: x['distance'])
+ events.sort(cmp=self.distance_cmp, key=lambda x: x.get_distance_from(lng, lat))
return events
def get_json(self, lat='', lng='', distance=''):
- # testing json results
- lat = '51.5174'
- lng = '-0.0829'
- distance = '10'
params = urllib.urlencode({'method': self.method,
'api_key': self.api_key,
'distance': distance,
url = '%s?%s' % (self.url_base, params)
request = urllib2.Request(url, None)
response = urllib2.urlopen(request)
- return response
-
- def get_xml(self, lat, lng, distance, page='1'):
- """ Return xml from lastfm """
- params = urllib.urlencode({'method': self.method,
- 'api_key': self.api_key,
- 'distance': distance,
- 'long': lng,
- 'lat': lat,
- 'page': page})
- response = urllib.urlopen(self.url_base, params)
return response.read()
-
+
def distance_cmp(self, x, y):
""" Compare distances for list sort """
if x > y:
def show_details(self, widget, data):
""" Open new window showing gig details """
win = hildon.StackableWindow()
- win.set_title(data['title'])
+ win.set_title(data.title)
win.vbox = gtk.VBox()
win.add(win.vbox)
view.set_wrap_mode(gtk.WRAP_WORD)
buffer = view.get_buffer()
end = buffer.get_end_iter()
- buffer.insert(end, '%s\n' % data['title'])
- buffer.insert(end, 'Artists: %s\n' % data['artists'])
- buffer.insert(end, 'Venue: %s\n' % data['venue'])
- buffer.insert(end, '%s\n' % data['address'])
- buffer.insert(end, 'When: %s\n' % data['date'].strftime('%H:%M %d/%m/%Y'))
+ buffer.insert(end, '%s\n' % data.title)
+ buffer.insert(end, 'Artists: %s\n' % data.artists)
+ buffer.insert(end, 'Venue: %s\n' % data.venue_name)
+ buffer.insert(end, '%s\n' % data.address)
+ buffer.insert(end, 'When: %s\n' % data.start_date.strftime('%H:%M %d/%m/%Y'))
buffer.insert(end, '\n')
scroll.add_with_viewport(view)
for event in events:
button = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
hildon.BUTTON_ARRANGEMENT_VERTICAL)
- button.set_text(event['title'], "distance: %0.02f km" % event['distance'])
+ button.set_text(event.title, "distance: %0.02f km" % event.get_distance_from(self.location.long, self.location.lat))
button.connect("clicked", self.show_details, event)
self.box.pack_start(button)
self.box.show_all()
if device.fix:
# once fix is found and long, lat available set long lat
if device.fix[1] & location.GPS_DEVICE_LATLONG_SET:
+ # wait for a second fix before exiting
self.fix_count += 1
if self.fix_count > 1:
self.lat, self.long = device.fix[4:6]
-from xml.dom.minidom import parseString
from datetime import datetime, date
import time
import simplejson
-import location
-
-from events import Event
-
-def parse_json(json, lat, lng):
+def parse_json(json):
""" Parse json into usable format """
events_list = []
today = date.today()
+ json = simplejson.loads(json)
events = json['events']['event']
for event in events:
else:
artist = event['artists']['artist']
- event_obj = Event(event['title'],
- event['venue']['name'],
- address,
- venue_geo['geo:long'],
- venue_geo['geo:lat'],
- artist,
- parse_date(event['startDate']))
- event_list.append(event_obj)
- return event_list
+ yield (event['title'],
+ event['venue']['name'],
+ address,
+ venue_geo['geo:long'],
+ venue_geo['geo:lat'],
+ artist,
+ parse_date(event['startDate']))
-def parse_xml(xml, lat, lng):
- """ Parse xml into a dict """
- events_list = []
- today = date.today()
- dom = parseString(xml)
-
- events = dom.getElementsByTagName('event')
- for event in events:
- start_date = parse_date(event.getElementsByTagName('startDate')[0]\
- .childNodes[0].data)
- if start_date.date() == today:
- title = event.getElementsByTagName('title')[0].childNodes[0].data
-
- artists_element = event.getElementsByTagName('artists')[0]
- artist_list = []
- for artist in artists_element.getElementsByTagName('artist'):
- artist_list.append(artist.childNodes[0].data)
- artists = ', '.join(artist_list)
-
- v_details = event.getElementsByTagName('venue')[0]
- venue_name = v_details.getElementsByTagName('name')[0]\
- .childNodes[0].data
- address = get_address(v_details.getElementsByTagName('location')[0])
- geo_data = v_details.getElementsByTagName('geo:point')[0]
- venue_lat = geo_data.getElementsByTagName('geo:lat')[0]\
- .childNodes[0].data
- venue_long = geo_data.getElementsByTagName('geo:long')[0]\
- .childNodes[0].data
- distance = location.distance_between(float(lat),
- float(lng),
- float(venue_lat),
- float(venue_long))
-
- events_list.append({'title': title,
- 'venue': venue_name,
- 'address': address,
- 'distance': distance,
- 'artists': artists,
- 'date': start_date})
- return events_list
-
-def get_address(location_element):
- """ Return the venues address details from the xml element """
- street = ''
- city = ''
- country = ''
- postalcode = ''
- if location_element.getElementsByTagName('street')[0].childNodes:
- street = location_element.getElementsByTagName('street')[0]\
- .childNodes[0].data
- if location_element.getElementsByTagName('city')[0].childNodes:
- city = location_element.getElementsByTagName('city')[0]\
- .childNodes[0].data
- if location_element.getElementsByTagName('country')[0].childNodes:
- country = location_element.getElementsByTagName('country')[0]\
- .childNodes[0].data
- if location_element.getElementsByTagName('postalcode')[0].childNodes:
- postalcode = location_element.getElementsByTagName('postalcode')[0]\
- .childNodes[0].data
- return '\n'.join([street, city, country, postalcode])
-
def parse_date(date_string):
""" Parse date string into datetime object """
fmt = "%a, %d %b %Y %H:%M:%S"