Create "gotovienna" package; split CLI code
[pywienerlinien] / scotty
1 #!/usr/bin/env python
2 # -*- coding: UTF-8 -*-
3
4 from BeautifulSoup import BeautifulSoup, NavigableString
5 from urllib2 import urlopen
6 from urllib import urlencode
7 import settings
8 from datetime import datetime, time
9 from textwrap import wrap
10 import argparse
11 import sys
12 import os.path
13
14 from gotovienna.routing import *
15
16 parser = argparse.ArgumentParser(description='Get public transport route for Vienna')
17 parser.add_argument('-ot', metavar='type', type=str, help='origin type: %s' % ' | '.join(POSITION_TYPES), default='stop', choices=POSITION_TYPES)
18 parser.add_argument('-dt', metavar='type', type=str, help='destination type: %s' % ' | '.join(POSITION_TYPES), default='stop', choices=POSITION_TYPES)
19 parser.add_argument('origin')
20 parser.add_argument('destination')
21
22 args = parser.parse_args()
23 html = search((args.origin, args.ot), (args.destination, args.dt)).read()
24
25 parser = sParser(html)
26 state = parser.check_page()
27
28 if state == PageType.CORRECTION:
29     try:
30         cor = parser.get_correction()
31         if cor[0]:
32             print
33             print '* Origin ambiguous:'
34             lo = None
35             while not lo or not lo.isdigit() or int(lo) > len(cor[0]):
36                 i = 1
37                 for c in cor[0]:
38                     print '%d. %s' % (i, c)
39                     i += 1
40                 lo = sys.stdin.readline().strip()
41             
42             args.origin = cor[0][int(lo) - 1]
43             
44         if cor[1]:
45             print
46             print '* Destination ambiguous:'
47             ld = None
48             while not ld or not ld.isdigit() or int(ld) > len(cor[1]):
49                 j = 1
50                 for c in cor[1]:
51                     print '%d. %s' % (j, c)
52                     j += 1
53                 ld = sys.stdin.readline().strip()
54                 
55             args.destination = cor[1][int(ld) - 1]
56         
57         html = search((args.origin.encode('UTF-8'), args.ot), (args.destination.encode('UTF-8'), args.dt)).read()
58
59         parser = sParser(html)
60         state = parser.check_page()
61         
62     except ParserError:
63         print 'PANIC at correction page'
64         
65 if state == PageType.RESULT:
66     parser = rParser(html)
67     try:
68         overviews = parser.overview
69         details = parser.details
70         l = ''
71         while not l == 'q':
72             for idx, overview in enumerate(overviews):
73                 if not overview['date'] or not overview['time']:
74                     # XXX: Bogus data for e.g. Pilgramgasse->Karlsplatz?!
75                     continue
76
77                 print '%d. [%s] %s-%s (%s)' % (idx + 1,
78                         overview['date'],
79                         overview['time'][0],
80                         overview['time'][1],
81                         overview['duration'])
82             print 'q. Quit'
83             l = sys.stdin.readline().strip()
84             print
85             print '~' * 100
86             
87             if l.isdigit() and int(l) <= len(details):
88                 for detail in details[int(l) - 1]:
89                     if detail['time'] and detail['station']:
90                         time = '%s - %s' % (detail['time'][0].strftime(TIMEFORMAT), detail['time'][1].strftime(TIMEFORMAT))
91                         print '[%s] %s\n%s' % (time, ' -> '.join(detail['station']), '\n'.join(detail['info']))
92                     else:
93                         print '\n'.join(detail['info'])
94                     print '-' * 100
95             print
96             
97     except ParserError:
98         print 'parsererror'
99         
100 elif state == PageType.UNKNOWN:
101     print 'PANIC unknown result'