X-Git-Url: http://git.maemo.org/git/?p=gigfinder;a=blobdiff_plain;f=gigfinder.py;h=b6f5b7cb07339119795b621ffb29b881f4f83ddc;hp=9f6cca8d10b116982e8ad11cf5a1d4a742528e35;hb=7d0f8d93b8c9424d53e200fb2cfb3831df582616;hpb=77b4dbf1866ecacff14c55fd4c1378e2f348a9f0 diff --git a/gigfinder.py b/gigfinder.py old mode 100644 new mode 100755 index 9f6cca8..b6f5b7c --- a/gigfinder.py +++ b/gigfinder.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2.5 +#!/usr/bin/env python """Simple program to display local gigs @@ -10,10 +10,6 @@ __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 @@ -22,144 +18,27 @@ import gobject from threading import Thread import thread -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 LocationUpdater: - - def __init__(self): - self.lat = None - self.long = None - self.loop = gobject.MainLoop() - - self.control = location.GPSDControl.get_default() - self.control.set_properties(preferred_method=location.METHOD_AGNSS, - 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) +from locator import LocationUpdater +from events import Events - self.device = location.GPSDevice() - self.device.connect("changed", self.on_changed, self.control) - - def update_location(self): - """ Run the loop and update lat and long """ - self.reset() - gobject.idle_add(self.start_location, self.control) - self.loop.run() - - def on_error(self, control, error, data): - """ Handle errors """ - print "location error: %d... quitting" % error - data.quit() - - def on_changed(self, device, data): - """ Set long and lat """ - if not device: - return - 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() - - def on_stop(self, control, data): - """ Stop the location service """ - print "quitting" - data.quit() +gtk.gdk.threads_init() - def start_location(self, data): - """ Start the location service """ - data.start() - return False - - def reset(self): - """ Reset coordinates """ - self.lat = None - self.long = None - self.device.reset_last_known() +# TODO: +# Add user settings for distance, date +# maybe switch to json +# maybe do km to mile conversions 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' self.banner = None - self.parser = GigParser() self.location = LocationUpdater() + 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 """ @@ -199,10 +78,13 @@ class GigFinder: gobject.idle_add(self.location.update_location) # if no gps fix wait + # TODO: needs a timeout while not self.location.lat or not self.location.long: time.sleep(1) - events = self.get_events(self.location.lat, self.location.long) + events = self.events.get_events(self.location.lat, + self.location.long, + self.distance) gobject.idle_add(self.hide_message) gobject.idle_add(self.show_events, events) thread.exit() @@ -215,22 +97,13 @@ 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) - def get_events(self, lat, long): - """ Retrieve xml and parse into events list """ - xml = self.get_xml(lat, long) - events = self.parser.parse_xml(xml, - lat, - long) - return events - def show_events(self, events): """ Sort events, set new window title and add events to table """ if events: - events = self.sort_gigs(events) self.win.set_title('%s (%s)' % (self.app_title, len(events))) self.add_events(events) else: @@ -240,31 +113,6 @@ class GigFinder: vbox.show_all() self.win.add(vbox) - def distance_cmp(self, x, y): - """ Compare distances for list sort """ - if x > y: - return 1 - elif x == y: - return 0 - else: - return -1 - - def sort_gigs(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): - """ Return xml from lastfm """ - method = "geo.getevents" - params = urllib.urlencode({'method': method, - 'api_key': self.api_key, - 'distance': self.distance, - 'long': long, - 'lat': lat}) - response = urllib.urlopen(self.url_base, params) - return response.read() - def create_menu(self): """ Build application menu """ update_button = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)