9a6ecbe890e3cfe21275a5c04e4ab84e47bafcbd
[pywienerlinien] / scotty
1 #!/usr/bin/env python
2 # -*- coding: UTF-8 -*-
3
4 import argparse
5 import sys
6
7 from gotovienna.utils import *
8 from gotovienna.routing import *
9
10 parser = argparse.ArgumentParser(description='Get public transport route for Vienna')
11 parser.add_argument('-ot', metavar='type', type=str, help='origin type: %s' % ' | '.join(POSITION_TYPES), default=None, choices=POSITION_TYPES)
12 parser.add_argument('-dt', metavar='type', type=str, help='destination type: %s' % ' | '.join(POSITION_TYPES), default=None, choices=POSITION_TYPES)
13 parser.add_argument('origin', nargs='?', help='origin station name')
14 parser.add_argument('destination', nargs='?', help='destination station name')
15
16 args = parser.parse_args()
17
18 if not args.origin:
19     args.origin = raw_input('Origin: ')
20
21 if not args.destination:
22     args.destination = raw_input('Destination: ')
23
24 def do_search(args):
25     if isinstance(args.origin, unicode):
26         args.origin = args.origin.encode('utf-8', 'ignore')
27     elif isinstance(args.destination, unicode):
28         args.destination = args.destination.encode('utf-8', 'ignore')
29
30     result = search((args.origin, args.ot),
31             (args.destination, args.dt))
32
33     return sParser(result.read())
34
35 print >>sys.stderr, 'Searching...',
36 parser = do_search(args)
37 print >>sys.stderr, 'done.'
38
39 while parser.state == PageType.CORRECTION:
40     origin_corr, destination_corr = parser.get_correction()
41
42     if origin_corr:
43         print
44         print '* Origin ambiguous:'
45         lo = None
46         while not lo or not lo.isdigit() or int(lo) > len(origin_corr):
47             for idx, correction in enumerate(origin_corr):
48                 print '%3d. %s' % (idx+1, correction)
49             lo = sys.stdin.readline().strip()
50
51         args.origin = origin_corr[int(lo) - 1]
52
53     if destination_corr:
54         print
55         print '* Destination ambiguous:'
56         ld = None
57         while not ld or not ld.isdigit() or int(ld) > len(destination_corr):
58             for idx, correction in enumerate(destination_corr):
59                 print '%3d. %s' % (idx+1, correction)
60             ld = sys.stdin.readline().strip()
61
62         args.destination = destination_corr[int(ld) - 1]
63
64     parser = do_search(args)
65
66 if parser.state == PageType.RESULT:
67     parser = parser.get_result()
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 else:
97     print 'Error - unknown page returned.'
98