Merge branch 'master' into experimental
[pywienerlinien] / scotty
diff --git a/scotty b/scotty
index 8375815..c768149 100755 (executable)
--- a/scotty
+++ b/scotty
@@ -1,26 +1,41 @@
 #!/usr/bin/env python
 # -*- coding: UTF-8 -*-
 
-from BeautifulSoup import BeautifulSoup, NavigableString
-from urllib2 import urlopen
-from urllib import urlencode
-import settings
-from datetime import datetime, time
-from textwrap import wrap
 import argparse
 import sys
-import os.path
 
+from gotovienna.utils import *
 from gotovienna.routing import *
 
 parser = argparse.ArgumentParser(description='Get public transport route for Vienna')
-parser.add_argument('-ot', metavar='type', type=str, help='origin type: %s' % ' | '.join(POSITION_TYPES), default='stop', choices=POSITION_TYPES)
-parser.add_argument('-dt', metavar='type', type=str, help='destination type: %s' % ' | '.join(POSITION_TYPES), default='stop', choices=POSITION_TYPES)
-parser.add_argument('origin')
-parser.add_argument('destination')
+parser.add_argument('-ot', metavar='type', type=str, help='origin type: %s' % ' | '.join(POSITION_TYPES), default=None, choices=POSITION_TYPES)
+parser.add_argument('-dt', metavar='type', type=str, help='destination type: %s' % ' | '.join(POSITION_TYPES), default=None, choices=POSITION_TYPES)
+parser.add_argument('origin', nargs='?', help='origin station name')
+parser.add_argument('destination', nargs='?', help='destination station name')
 
 args = parser.parse_args()
 
+if not args.origin:
+    args.origin = raw_input('Origin: ')
+
+if not args.destination:
+    args.destination = raw_input('Destination: ')
+
+def do_search(args):
+    if isinstance(args.origin, unicode):
+        args.origin = args.origin.encode('utf-8', 'ignore')
+    elif isinstance(args.destination, unicode):
+        args.destination = args.destination.encode('utf-8', 'ignore')
+
+    result = search((args.origin, args.ot),
+            (args.destination, args.dt))
+
+    return sParser(result.read())
+
+print >>sys.stderr, 'Searching...\n',
+parser = do_search(args)
+print >>sys.stderr, 'done.'
+
 finished = False
 while not finished:
 
@@ -32,12 +47,9 @@ while not finished:
     if state == PageType.CORRECTION:
         try:
             cor = parser.get_correction()
-            print "A", args.origin, args.destination
             origin, origin_place = split_station(args.origin)
             destination, destination_place = split_station(args.destination)
             
-            print "B", origin, origin_place, destination, destination_place
-            
             # FIXME refactoring
             
             if cor.has_key('origin'):
@@ -92,7 +104,6 @@ while not finished:
     
                 destination_place = cor['destination_place'][int(l) - 1]
                 
-            print origin, origin_place, destination, destination_place
             args.origin = '%s, %s' % (origin, origin_place)
             args.destination = '%s, %s' %(destination, destination_place)
             
@@ -108,15 +119,17 @@ while not finished:
             l = ''
             while not l == 'q':
                 for idx, overview in enumerate(overviews):
-                    if not overview['date'] or not overview['time']:
+                    timespan = overview['timespan']
+                    if not timespan:
                         # XXX: Bogus data for e.g. Pilgramgasse->Karlsplatz?!
                         continue
-    
-                    print '%d. [%s] %s-%s (%s)' % (idx + 1,
-                            overview['date'],
-                            overview['time'][0],
-                            overview['time'][1],
-                            overview['duration'])
+                    
+                    str_timespan = timespan[0].strftime('[%y-%d-%m] %H:%M')
+                    str_timespan += '-' + timespan[1].strftime('%H:%M')
+                    timedelta = timespan[1] - timespan[0]
+                    print '%d. %s (%s)' % (idx + 1,
+                            str_timespan,
+                            timedelta)
                 print 'q. Quit'
                 l = sys.stdin.readline().strip()
                 print
@@ -124,8 +137,8 @@ while not finished:
     
                 if l.isdigit() and int(l) <= len(details):
                     for detail in details[int(l) - 1]:
-                        if detail['time'] and detail['station']:
-                            time = '%s - %s' % (detail['time'][0].strftime(TIMEFORMAT), detail['time'][1].strftime(TIMEFORMAT))
+                        if detail['timespan'] and detail['station']:
+                            time = '%s - %s' % (detail['timespan'][0].strftime(TIMEFORMAT), detail['timespan'][1].strftime(TIMEFORMAT))
                             print '[%s] %s\n%s' % (time, ' -> '.join(detail['station']), '\n'.join(detail['info']))
                         else:
                             print '\n'.join(detail['info'])
@@ -139,3 +152,64 @@ while not finished:
     
     elif state == PageType.UNKNOWN:
         print 'PANIC unknown result'
+
+while parser.state == PageType.CORRECTION:
+    origin_corr, destination_corr = parser.get_correction()
+
+    if origin_corr:
+        print
+        print '* Origin ambiguous:'
+        lo = None
+        while not lo or not lo.isdigit() or int(lo) > len(origin_corr):
+            for idx, correction in enumerate(origin_corr):
+                print '%3d. %s' % (idx+1, correction)
+            lo = sys.stdin.readline().strip()
+
+        args.origin = origin_corr[int(lo) - 1]
+
+    if destination_corr:
+        print
+        print '* Destination ambiguous:'
+        ld = None
+        while not ld or not ld.isdigit() or int(ld) > len(destination_corr):
+            for idx, correction in enumerate(destination_corr):
+                print '%3d. %s' % (idx+1, correction)
+            ld = sys.stdin.readline().strip()
+
+        args.destination = destination_corr[int(ld) - 1]
+
+    parser = do_search(args)
+
+if parser.state == PageType.RESULT:
+    parser = parser.get_result()
+    overviews = parser.overview
+    details = parser.details
+    l = ''
+    while not l == 'q':
+        for idx, overview in enumerate(overviews):
+            if not overview['date'] or not overview['time']:
+                # XXX: Bogus data for e.g. Pilgramgasse->Karlsplatz?!
+                continue
+
+            print '%d. [%s] %s-%s (%s)' % (idx + 1,
+                    overview['date'],
+                    overview['time'][0],
+                    overview['time'][1],
+                    overview['duration'])
+        print 'q. Quit'
+        l = sys.stdin.readline().strip()
+        print
+        print '~' * 79
+
+        if l.isdigit() and int(l) <= len(details):
+            for detail in details[int(l) - 1]:
+                if detail['time'] and detail['station']:
+                    time = '%s - %s' % (detail['time'][0].strftime(TIMEFORMAT), detail['time'][1].strftime(TIMEFORMAT))
+                    print '[%s] %s\n%s' % (time, ' -> '.join(detail['station']), '\n'.join(detail['info']))
+                else:
+                    print '\n'.join(detail['info'])
+                print '-' * 79
+        print
+else:
+    print 'Error - unknown page returned.'
+