1 #!/usr/bin/env python2.5
3 """Simple program to display local gigs
5 Intended for use on the N900, uses the devices gps to find local gigs.
8 __author__ = "Jon Staley"
9 __copyright__ = "Copyright 2010 Jon Staley"
13 from xml.dom.minidom import parseString
14 from datetime import datetime, date
24 def parse_xml(self, xml, lat, long):
25 """ Parse xml into a dict """
26 # TODO: filter to todays events only
29 dom = parseString(xml)
31 events = dom.getElementsByTagName('event')
33 title = event.getElementsByTagName('title')[0].childNodes[0].data
35 artists_element = event.getElementsByTagName('artists')[0]
37 for artist in artists_element.getElementsByTagName('artist'):
38 artist_list.append(artist.childNodes[0].data)
39 artists = ', '.join(artist_list)
41 venue_details = event.getElementsByTagName('venue')[0]
42 venue_name = venue_details.getElementsByTagName('name')[0].childNodes[0].data
43 address = self.get_address(venue_details.getElementsByTagName('location')[0])
44 geo_data = venue_details.getElementsByTagName('geo:point')[0]
45 venue_lat = geo_data.getElementsByTagName('geo:lat')[0].childNodes[0].data
46 venue_long = geo_data.getElementsByTagName('geo:long')[0].childNodes[0].data
47 distance = location.distance_between(float(lat),
52 start_date = self.parse_date(event.getElementsByTagName('startDate')[0].childNodes[0].data)
54 events_list.append({'title': title,
62 def get_address(self, location):
63 """ Return the venues address details from the xml element """
68 if location.getElementsByTagName('street')[0].childNodes:
69 street = location.getElementsByTagName('street')[0].childNodes[0].data
70 if location.getElementsByTagName('city')[0].childNodes:
71 city = location.getElementsByTagName('city')[0].childNodes[0].data
72 if location.getElementsByTagName('country')[0].childNodes:
73 country = location.getElementsByTagName('country')[0].childNodes[0].data
74 if location.getElementsByTagName('postalcode')[0].childNodes:
75 postalcode = location.getElementsByTagName('postalcode')[0].childNodes[0].data
76 return '\n'.join([street, city, country, postalcode])
78 def parse_date(self, date_string):
79 """ Parse date string into datetime object """
80 fmt = "%a, %d %b %Y %H:%M:%S"
81 result = time.strptime(date_string, fmt)
82 return datetime(result.tm_year,
95 self.url_base = "http://ws.audioscrobbler.com/2.0/"
96 self.api_key = "1928a14bdf51369505530949d8b7e1ee"
99 program = hildon.Program.get_instance()
100 self.win = hildon.StackableWindow()
101 self.win.set_title('Gig Finder')
102 self.win.connect("destroy", gtk.main_quit, None)
104 pannable_area = hildon.PannableArea()
106 self.table = gtk.Table(columns=1)
107 self.table.set_row_spacings(10)
108 self.table.set_col_spacings(10)
110 pannable_area.add_with_viewport(self.table)
112 self.win.add(pannable_area)
120 def update_gigs(self):
125 events = parser.parse_xml(xml, self.lat, self.long)
126 self.add_events(events)
129 """ Return xml from lastfm """
130 method = "geo.getevents"
131 params = urllib.urlencode({'method': method,
132 'api_key': self.api_key,
133 'distance': self.distance,
136 response = urllib.urlopen(self.url_base, params)
137 return response.read()
139 def get_lat_long(self):
140 """ Access gps and return current long lats """
141 # TODO: Improve geolocation code, very crude atm
142 control = location.GPSDControl.get_default()
143 device = location.GPSDevice()
147 self.lat, self.long = fix[4:6]
148 #self.lat, self.long = ('51.546228', '-0.075016')
150 def show_details(self, widget, data):
151 """ Open new window showing gig details """
152 win = hildon.StackableWindow()
153 win.set_title(data['title'])
155 win.vbox = gtk.VBox()
158 scroll = hildon.PannableArea()
159 win.vbox.pack_start(scroll, True, True, 0)
161 view = hildon.TextView()
162 view.set_editable(False)
163 view.unset_flags(gtk.CAN_FOCUS)
164 view.set_wrap_mode(gtk.WRAP_WORD)
165 buffer = view.get_buffer()
166 end = buffer.get_end_iter()
167 buffer.insert(end, '%s\n' % data['title'])
168 buffer.insert(end, 'Artists: %s\n' % data['artists'])
169 buffer.insert(end, 'Venue: %s\n' % data['venue'])
170 buffer.insert(end, data['address'])
171 buffer.insert(end, 'When: %s\n' % data['date'].strftime('%H:%M'))
172 buffer.insert(end, '\n')
173 scroll.add_with_viewport(view)
177 def add_events(self, events):
178 """ Return table of buttons """
181 button = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
182 hildon.BUTTON_ARRANGEMENT_VERTICAL)
183 button.set_text(event['title'], "distance: %0.02f km" % event['distance'])
184 button.connect("clicked", self.show_details, event)
185 self.table.attach(button, 0, 1, pos, pos+1)
190 #hildon.hildon_gtk_window_set_progress_indicator(win, 1)
191 #banner = hildon.hildon_banner_show_information(win,
193 # "Retrieving gig info")
195 #hildon.hildon_gtk_window_set_progress_indicator(win, 0)
198 if __name__ == "__main__":