Merge recent changes
authorJon <jmstaley@gmail.com>
Mon, 17 May 2010 00:40:18 +0000 (01:40 +0100)
committerJon <jmstaley@gmail.com>
Mon, 17 May 2010 00:40:18 +0000 (01:40 +0100)
src/opt/gigfinder/events.py [new file with mode: 0644]
src/opt/gigfinder/gigfinder.py
src/opt/gigfinder/locator.py
src/opt/gigfinder/resultsparser.py [new file with mode: 0644]

diff --git a/src/opt/gigfinder/events.py b/src/opt/gigfinder/events.py
new file mode 100644 (file)
index 0000000..1e2abd7
--- /dev/null
@@ -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
index 42d4d6c..7e159ef 100755 (executable)
@@ -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)
 
index 089a822..e562e8d 100644 (file)
@@ -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 (file)
index 0000000..793cb4c
--- /dev/null
@@ -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)