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
21 """ Parse xml into a dict """
22 # TODO: filter to todays events only
25 dom = parseString(xml)
27 events = dom.getElementsByTagName('event')
29 title = event.getElementsByTagName('title')[0].childNodes[0].data
31 artists_element = event.getElementsByTagName('artists')[0]
33 for artist in artists_element.getElementsByTagName('artist'):
34 artist_list.append(artist.childNodes[0].data)
35 artists = ', '.join(artist_list)
37 venue = event.getElementsByTagName('venue')[0].getElementsByTagName('name')[0].childNodes[0].data
38 start_date = parse_date(event.getElementsByTagName('startDate')[0].childNodes[0].data)
39 events_list.append({'title': title,
45 def parse_date(date_string):
46 """ Parse date string into datetime object """
47 fmt = "%a, %d %b %Y %H:%M:%S"
48 result = time.strptime(date_string, fmt)
49 return datetime(result.tm_year,
57 """ Access gps and return current long lats """
58 # TODO: Add code to retrieve location
59 return ("-0.08370637893676758", "51.523230495031505")
62 """ Return xml from lastfm """
63 hildon.hildon_gtk_window_set_progress_indicator(window, 1)
64 banner = hildon.hildon_banner_show_information(window,
66 "Retrieving gig info")
68 url_base = "http://ws.audioscrobbler.com/2.0/"
69 api_key = "1928a14bdf51369505530949d8b7e1ee"
70 method = "geo.getevents"
71 long, lat = get_long_lat()
73 params = urllib.urlencode({'method': method,
78 response = urllib.urlopen(url_base, params)
80 hildon.hildon_gtk_window_set_progress_indicator(window, 0)
81 return response.read()
83 def create_table(events):
84 """ Return table of buttons """
85 table = gtk.Table(columns=1)
86 table.set_row_spacings(10)
87 table.set_col_spacings(10)
92 button = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
93 hildon.BUTTON_ARRANGEMENT_VERTICAL)
94 button.set_text(event['title'], "")
95 button.connect("clicked", show_details, event)
96 table.attach(button, 0, 1, pos, pos+1)
100 def show_details(widget, data):
101 """ Open new window showing gig details """
102 win = hildon.StackableWindow()
103 win.set_title(data['title'])
105 win.vbox = gtk.VBox()
108 scroll = hildon.PannableArea()
109 win.vbox.pack_start(scroll, True, True, 0)
111 view = hildon.TextView()
112 view.set_editable(False)
113 view.unset_flags(gtk.CAN_FOCUS)
114 view.set_wrap_mode(gtk.WRAP_WORD)
115 buffer = view.get_buffer()
116 end = buffer.get_end_iter()
117 buffer.insert(end, '%s\n' % data['title'])
118 buffer.insert(end, 'Artists: %s\n' % data['artists'])
119 buffer.insert(end, 'Venue: %s\n' % data['venue'])
120 buffer.insert(end, 'When: %s\n' % data['date'].strftime('%H:%M'))
121 buffer.insert(end, '\n')
122 scroll.add_with_viewport(view)
127 program = hildon.Program.get_instance()
128 win = hildon.StackableWindow()
129 win.set_title('Gig Finder')
130 win.connect("destroy", gtk.main_quit, None)
132 pannable_area = hildon.PannableArea()
135 events = parse_xml(xml)
137 table = create_table(events)
138 pannable_area.add_with_viewport(table)
140 win.add(pannable_area)
144 if __name__ == "__main__":