Start moving to json
[gigfinder] / src / opt / gigfinder / gigfinder.py
index 998e609..016247a 100755 (executable)
@@ -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()