Addlicense file
[gigfinder] / gig_finder.py
1 #!/usr/bin/env python2.5
2
3 """Simple program to display local gigs
4
5 Intended for use on the N900, uses the devices gps to find local gigs.
6 """
7
8 __author__ = "Jon Staley"
9 __copyright__ = "Copyright 2010 Jon Staley"
10 __license__ = "MIT"
11 __version__ = "0.0.1"
12
13 from xml.dom.minidom import parseString
14 from datetime import datetime, date
15 import urllib
16 import time
17 import gtk
18 import hildon
19
20 def parse_xml(xml):
21     """ Parse xml into a dict """
22     # TODO: filter to todays events only
23     events_list = []
24     today = date.today()
25     dom = parseString(xml)
26
27     events = dom.getElementsByTagName('event')
28     for event in events:
29         title = event.getElementsByTagName('title')[0].childNodes[0].data
30         
31         artists_element = event.getElementsByTagName('artists')[0]
32         artist_list = []
33         for artist in artists_element.getElementsByTagName('artist'):
34             artist_list.append(artist.childNodes[0].data)
35         artists = ', '.join(artist_list)
36
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,
40                             'venue': venue,
41                             'artists': artists,
42                             'date': start_date})
43     return events_list
44
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, 
50                     result.tm_mon, 
51                     result.tm_mday, 
52                     result.tm_hour, 
53                     result.tm_min, 
54                     result.tm_sec)
55
56 def get_long_lat():
57     """ Access gps and return current long lats """
58     # TODO: Add code to retrieve location
59     return ("-0.08370637893676758", "51.523230495031505")
60
61 def get_xml(window):
62     """ Return xml from lastfm """
63     hildon.hildon_gtk_window_set_progress_indicator(window, 1)
64     banner = hildon.hildon_banner_show_information(window,
65                                                   "Updating", 
66                                                   "Retrieving gig info")
67     
68     url_base = "http://ws.audioscrobbler.com/2.0/"
69     api_key = "1928a14bdf51369505530949d8b7e1ee"
70     method = "geo.getevents"
71     long, lat = get_long_lat()
72     distance = '0.5'
73     params = urllib.urlencode({'method': method,
74                                'api_key': api_key,
75                                'distance': distance,
76                                'long': long,
77                                'lat': lat})
78     response = urllib.urlopen(url_base, params)
79     banner.hide()
80     hildon.hildon_gtk_window_set_progress_indicator(window, 0)
81     return response.read()
82
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)
88
89     table.show()
90     pos = 0
91     for event in events:
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)
97         pos += 1
98     return table
99
100 def show_details(widget, data):
101     """ Open new window showing gig details """
102     win = hildon.StackableWindow()
103     win.set_title(data['title'])
104
105     win.vbox = gtk.VBox()
106     win.add(win.vbox)
107
108     scroll = hildon.PannableArea()
109     win.vbox.pack_start(scroll, True, True, 0)
110
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)
123
124     win.show_all()
125
126 def main():
127     program = hildon.Program.get_instance()
128     win = hildon.StackableWindow()
129     win.set_title('Gig Finder')
130     win.connect("destroy", gtk.main_quit, None)
131
132     pannable_area = hildon.PannableArea()
133    
134     xml = get_xml(win)
135     events = parse_xml(xml)
136
137     table = create_table(events)
138     pannable_area.add_with_viewport(table)
139
140     win.add(pannable_area)
141     win.show_all()
142     gtk.main()
143
144 if __name__ == "__main__":
145     main()