X-Git-Url: http://git.maemo.org/git/?p=gigfinder;a=blobdiff_plain;f=src%2Fopt%2Fgigfinder%2Fgigfinder.py;h=016247a530ca1257ee8fa586798817e049dd237c;hp=998e609d85a04870abb6259005510254bb8123a3;hb=19cbc70c06bdedf3561851edda11a42ae282b79a;hpb=f1c76dbba4d149bfd639f8da73e9196b0d2556de diff --git a/src/opt/gigfinder/gigfinder.py b/src/opt/gigfinder/gigfinder.py index 998e609..016247a 100755 --- a/src/opt/gigfinder/gigfinder.py +++ b/src/opt/gigfinder/gigfinder.py @@ -10,128 +10,23 @@ __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 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/" - - def get_events(self, lat, long, distance): - """ Retrieve xml and parse into events list """ - xml = self.get_xml(lat, long, distance) - events = 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): - """ Return xml from lastfm """ - method = "geo.getevents" - params = urllib.urlencode({'method': method, - 'api_key': self.api_key, - 'distance': distance, - 'long': long, - 'lat': lat}) - 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: @@ -140,15 +35,10 @@ class GigFinder: self.long = None 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 """ @@ -158,6 +48,7 @@ class GigFinder: self.win.set_title(self.app_title) self.win.connect("destroy", gtk.main_quit, None) self.win.set_app_menu(menu) + self.add_button_area() Thread(target=self.update_gigs).start() @@ -185,18 +76,23 @@ class GigFinder: def update_gigs(self): """ Get gig info """ gobject.idle_add(self.show_message, "Getting events") - 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) + + if not 'applications' in os.path.abspath(__file__): + 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) + else: + self.location.lat = float(51.517369) + self.location.long = float(-0.082998) + events = self.events.get_events(self.location.lat, self.location.long, - self.distance) - gobject.idle_add(self.hide_message) + self.distance,) gobject.idle_add(self.show_events, events) + gobject.idle_add(self.hide_message) thread.exit() def show_message(self, message): @@ -207,7 +103,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) @@ -264,36 +160,29 @@ class GigFinder: 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, 'When: %s\n' % data['date'].strftime('%H:%M %d/%m/%Y')) buffer.insert(end, '\n') scroll.add_with_viewport(view) win.show_all() - def add_table(self): - """ Add table for events """ - self.table = gtk.Table(columns=1) - self.table.set_row_spacings(10) - self.table.set_col_spacings(10) - + def add_button_area(self): + self.box = gtk.VBox(True,0) self.pannable_area = hildon.PannableArea() - self.pannable_area.add_with_viewport(self.table) + self.pannable_area.add_with_viewport(self.box) self.pannable_area.show_all() self.win.add(self.pannable_area) def add_events(self, events): """ Add a table of buttons """ - self.add_table() - 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 - self.table.show_all() - + self.box.pack_start(button) + self.box.show_all() + if __name__ == "__main__": finder = GigFinder() finder.main()