From: Jon Date: Mon, 17 May 2010 00:40:18 +0000 (+0100) Subject: Merge recent changes X-Git-Url: http://git.maemo.org/git/?p=gigfinder;a=commitdiff_plain;h=69662219a729a4e95f5c0bd7e653290f221ab12e;hp=14e2bbf33c259505375525641b4c53b0499a8472 Merge recent changes --- diff --git a/src/opt/gigfinder/events.py b/src/opt/gigfinder/events.py new file mode 100644 index 0000000..1e2abd7 --- /dev/null +++ b/src/opt/gigfinder/events.py @@ -0,0 +1,63 @@ +import urllib +import urllib2 + +from resultsparser import parse_xml + +class Events: + def __init__(self): + self.api_key = '1928a14bdf51369505530949d8b7e1ee' + self.url_base = 'http://ws.audioscrobbler.com/2.0/' + self.format = 'json' + self.method = 'geo.getevents' + + def get_events(self, lat, lng, distance): + """ Retrieve xml and parse into events list """ + events = [] + for page in ['1', '2', '3']: + xml = self.get_xml(lat, lng, distance, page=page) + events.extend(parse_xml(xml, + lat, + lng)) + return self.sort_events(events) + + def sort_events(self, events): + """ Sort gig by distance """ + if len(events) > 1: + events.sort(cmp=self.distance_cmp, key=lambda x: x['distance']) + 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, + 'long': lng, + 'lat': lat, + 'format': self.format}) + 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: + return 1 + elif x == y: + return 0 + else: + return -1 diff --git a/src/opt/gigfinder/gigfinder.py b/src/opt/gigfinder/gigfinder.py index 42d4d6c..7e159ef 100755 --- a/src/opt/gigfinder/gigfinder.py +++ b/src/opt/gigfinder/gigfinder.py @@ -10,13 +10,8 @@ __copyright__ = "Copyright 2010 Jon Staley" __license__ = "MIT" __version__ = "0.0.1" -from xml.dom.minidom import parseString -from datetime import datetime, date -import urllib -import time import gtk import hildon -import location import time import gobject import os.path @@ -24,119 +19,14 @@ from threading import Thread import thread from locator import LocationUpdater +from events import Events gtk.gdk.threads_init() -class GigParser: - - def parse_xml(self, xml, lat, long): - """ Parse xml into a dict """ - events_list = [] - today = date.today() - dom = parseString(xml) - - events = dom.getElementsByTagName('event') - for event in events: - start_date = self.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) - - venue_details = event.getElementsByTagName('venue')[0] - venue_name = venue_details.getElementsByTagName('name')[0].childNodes[0].data - address = self.get_address(venue_details.getElementsByTagName('location')[0]) - geo_data = venue_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(long), - 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(self, location): - """ Return the venues address details from the xml element """ - street = '' - city = '' - country = '' - postalcode = '' - if location.getElementsByTagName('street')[0].childNodes: - street = location.getElementsByTagName('street')[0].childNodes[0].data - if location.getElementsByTagName('city')[0].childNodes: - city = location.getElementsByTagName('city')[0].childNodes[0].data - if location.getElementsByTagName('country')[0].childNodes: - country = location.getElementsByTagName('country')[0].childNodes[0].data - if location.getElementsByTagName('postalcode')[0].childNodes: - postalcode = location.getElementsByTagName('postalcode')[0].childNodes[0].data - return '\n'.join([street, city, country, postalcode]) - - def parse_date(self, date_string): - """ Parse date string into datetime object """ - fmt = "%a, %d %b %Y %H:%M:%S" - result = time.strptime(date_string, fmt) - return datetime(result.tm_year, - result.tm_mon, - result.tm_mday, - result.tm_hour, - result.tm_min, - result.tm_sec) - - -class Events: - - def __init__(self): - self.api_key = "1928a14bdf51369505530949d8b7e1ee" - self.url_base = "http://ws.audioscrobbler.com/2.0/" - self.parser = GigParser() - - def get_events(self, lat, long, distance): - """ Retrieve xml and parse into events list """ - events = [] - for page in ['1', '2', '3']: - xml = self.get_xml(lat, long, distance, page=page) - events.extend(self.parser.parse_xml(xml, - lat, - long)) - return self.sort_events(events) - - def sort_events(self, events): - """ Sort gig by distance """ - events.sort(cmp=self.distance_cmp, key=lambda x: x['distance']) - return events - - def get_xml(self, lat, long, distance, page="1"): - """ Return xml from lastfm """ - method = "geo.getevents" - params = urllib.urlencode({'method': method, - 'api_key': self.api_key, - 'distance': distance, - 'long': long, - '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: - return 1 - elif x == y: - return 0 - else: - return -1 - +# TODO: +# Add user settings for distance, date +# maybe switch to json +# maybe do km to mile conversions class GigFinder: @@ -149,10 +39,6 @@ class GigFinder: self.events = Events() self.win = hildon.StackableWindow() self.app_title = "Gig Finder" - # TODO: - # Add user settings for distance, date - # refactor gui code, - # maybe do km to mile conversions def main(self): """ Build the gui and start the update thread """ @@ -216,7 +102,7 @@ class GigFinder: message) def hide_message(self): - """ Hide banner and sete progress indicator """ + """ Hide banner and set progress indicator """ self.banner.hide() hildon.hildon_gtk_window_set_progress_indicator(self.win, 0) diff --git a/src/opt/gigfinder/locator.py b/src/opt/gigfinder/locator.py index 089a822..e562e8d 100644 --- a/src/opt/gigfinder/locator.py +++ b/src/opt/gigfinder/locator.py @@ -7,10 +7,13 @@ class LocationUpdater: self.lat = None self.long = None self.loop = gobject.MainLoop() + self.fix_count = 0 self.control = location.GPSDControl.get_default() - self.control.set_properties(preferred_method=location.METHOD_AGNSS, - preferred_interval=location.INTERVAL_DEFAULT) + self.control.set_properties(preferred_method=location\ + .METHOD_USER_SELECTED, + preferred_interval=location\ + .INTERVAL_DEFAULT) self.control.connect("error-verbose", self.on_error, self.loop) self.control.connect("gpsd-stopped", self.on_stop, self.loop) @@ -35,8 +38,10 @@ class LocationUpdater: if device.fix: # once fix is found and long, lat available set long lat if device.fix[1] & location.GPS_DEVICE_LATLONG_SET: - self.lat, self.long = device.fix[4:6] - data.stop() + self.fix_count += 1 + if self.fix_count > 1: + self.lat, self.long = device.fix[4:6] + data.stop() def on_stop(self, control, data): """ Stop the location service """ @@ -45,6 +50,7 @@ class LocationUpdater: def start_location(self, data): """ Start the location service """ + self.fix_count = 0 data.start() return False diff --git a/src/opt/gigfinder/resultsparser.py b/src/opt/gigfinder/resultsparser.py new file mode 100644 index 0000000..793cb4c --- /dev/null +++ b/src/opt/gigfinder/resultsparser.py @@ -0,0 +1,81 @@ +from xml.dom.minidom import parseString +from datetime import datetime, date +import time + +import location + +def parse_json(json, lat, lng): + """ Parse json into usable format """ + pass + +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" + result = time.strptime(date_string, fmt) + return datetime(result.tm_year, + result.tm_mon, + result.tm_mday, + result.tm_hour, + result.tm_min, + result.tm_sec)