From 9cb5df6acf14b37c901f9689956c5624dc419a8d Mon Sep 17 00:00:00 2001 From: Jon Date: Mon, 22 Mar 2010 00:01:16 +0000 Subject: [PATCH] Start refactoring code --- gig_finder.py | 301 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 178 insertions(+), 123 deletions(-) diff --git a/gig_finder.py b/gig_finder.py index 38a040e..e2f1c19 100644 --- a/gig_finder.py +++ b/gig_finder.py @@ -16,130 +16,185 @@ import urllib import time import gtk import hildon +import location +import time -def parse_xml(xml): - """ Parse xml into a dict """ - # TODO: filter to todays events only - events_list = [] - today = date.today() - dom = parseString(xml) - - events = dom.getElementsByTagName('event') - for event in events: - 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 = event.getElementsByTagName('venue')[0].getElementsByTagName('name')[0].childNodes[0].data - start_date = parse_date(event.getElementsByTagName('startDate')[0].childNodes[0].data) - events_list.append({'title': title, - 'venue': venue, - 'artists': artists, - 'date': start_date}) - return events_list - -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) - -def get_long_lat(): - """ Access gps and return current long lats """ - # TODO: Add code to retrieve location - return ("-0.08370637893676758", "51.523230495031505") - -def get_xml(window): - """ Return xml from lastfm """ - hildon.hildon_gtk_window_set_progress_indicator(window, 1) - banner = hildon.hildon_banner_show_information(window, - "Updating", - "Retrieving gig info") +class GigParser: + + def parse_xml(self, xml, lat, long): + """ Parse xml into a dict """ + # TODO: filter to todays events only + events_list = [] + today = date.today() + dom = parseString(xml) + + events = dom.getElementsByTagName('event') + for event in events: + 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)) + + start_date = self.parse_date(event.getElementsByTagName('startDate')[0].childNodes[0].data) + + events_list.append({'title': title, + 'venue': venue_name, + 'address': address, + 'distance': distance, + 'artists': artists, + 'date': start_date}) + return events_list - url_base = "http://ws.audioscrobbler.com/2.0/" - api_key = "1928a14bdf51369505530949d8b7e1ee" - method = "geo.getevents" - long, lat = get_long_lat() - distance = '0.5' - params = urllib.urlencode({'method': method, - 'api_key': api_key, - 'distance': distance, - 'long': long, - 'lat': lat}) - response = urllib.urlopen(url_base, params) - banner.hide() - hildon.hildon_gtk_window_set_progress_indicator(window, 0) - return response.read() - -def create_table(events): - """ Return table of buttons """ - table = gtk.Table(columns=1) - table.set_row_spacings(10) - table.set_col_spacings(10) - - table.show() - pos = 0 - 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'], "") - button.connect("clicked", show_details, event) - table.attach(button, 0, 1, pos, pos+1) - pos += 1 - return table - -def show_details(widget, data): - """ Open new window showing gig details """ - win = hildon.StackableWindow() - win.set_title(data['title']) - - win.vbox = gtk.VBox() - win.add(win.vbox) - - scroll = hildon.PannableArea() - win.vbox.pack_start(scroll, True, True, 0) - - view = hildon.TextView() - view.set_editable(False) - view.unset_flags(gtk.CAN_FOCUS) - 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, 'When: %s\n' % data['date'].strftime('%H:%M')) - buffer.insert(end, '\n') - scroll.add_with_viewport(view) - - win.show_all() - -def main(): - program = hildon.Program.get_instance() - win = hildon.StackableWindow() - win.set_title('Gig Finder') - win.connect("destroy", gtk.main_quit, None) - - pannable_area = hildon.PannableArea() - - xml = get_xml(win) - events = parse_xml(xml) - - table = create_table(events) - pannable_area.add_with_viewport(table) - - win.add(pannable_area) - win.show_all() - gtk.main() + 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 GigFinder: + + def __init__(self): + self.lat = None + self.long = None + self.url_base = "http://ws.audioscrobbler.com/2.0/" + self.api_key = "1928a14bdf51369505530949d8b7e1ee" + self.distance = '10' + + program = hildon.Program.get_instance() + self.win = hildon.StackableWindow() + self.win.set_title('Gig Finder') + self.win.connect("destroy", gtk.main_quit, None) + + pannable_area = hildon.PannableArea() + + self.table = gtk.Table(columns=1) + self.table.set_row_spacings(10) + self.table.set_col_spacings(10) + + pannable_area.add_with_viewport(self.table) + + self.win.add(pannable_area) + + self.update_gigs() + + def main(self): + self.win.show_all() + gtk.main() + + def update_gigs(self): + """ Get gig info """ + parser = GigParser() + self.get_lat_long() + xml = self.get_xml() + events = parser.parse_xml(xml, self.lat, self.long) + self.add_events(events) + + def get_xml(self): + """ Return xml from lastfm """ + method = "geo.getevents" + params = urllib.urlencode({'method': method, + 'api_key': self.api_key, + 'distance': self.distance, + 'long': self.long, + 'lat': self.lat}) + response = urllib.urlopen(self.url_base, params) + return response.read() + + def get_lat_long(self): + """ Access gps and return current long lats """ + # TODO: Improve geolocation code, very crude atm + control = location.GPSDControl.get_default() + device = location.GPSDevice() + control.start() + fix = device.fix + control.stop() + self.lat, self.long = fix[4:6] + #self.lat, self.long = ('51.546228', '-0.075016') + + def show_details(self, widget, data): + """ Open new window showing gig details """ + win = hildon.StackableWindow() + win.set_title(data['title']) + + win.vbox = gtk.VBox() + win.add(win.vbox) + + scroll = hildon.PannableArea() + win.vbox.pack_start(scroll, True, True, 0) + + view = hildon.TextView() + view.set_editable(False) + view.unset_flags(gtk.CAN_FOCUS) + 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, data['address']) + buffer.insert(end, 'When: %s\n' % data['date'].strftime('%H:%M')) + buffer.insert(end, '\n') + scroll.add_with_viewport(view) + + win.show_all() + + def add_events(self, events): + """ Return table of buttons """ + pos = 0 + 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.connect("clicked", self.show_details, event) + self.table.attach(button, 0, 1, pos, pos+1) + pos += 1 + + + + #hildon.hildon_gtk_window_set_progress_indicator(win, 1) + #banner = hildon.hildon_banner_show_information(win, + # "Updating", + # "Retrieving gig info") + #banner.hide() + #hildon.hildon_gtk_window_set_progress_indicator(win, 0) + if __name__ == "__main__": - main() + finder = GigFinder() + finder.main() -- 1.7.9.5