#!/usr/bin/env python3 from datetime import datetime, timedelta from requests import get from subprocess import check_output from sys import argv, exit LINK_MODE = False if len(argv) > 1 and argv[1] == '--link': LINK_MODE = True # bundlewrap.utils.text.format_duration, but trimmed down def format_time(seconds): if seconds is None: return "?" seconds = int(seconds) components = [] if seconds >= 3600: hours = int(seconds / 3600) seconds -= hours * 3600 components.append('{}h'.format(hours)) if seconds >= 60: minutes = int(seconds / 60) seconds -= minutes * 60 components.append('{}m'.format(minutes)) if not components: components.append('now') return " ".join(components) try: wifi_ssid = check_output("iw dev wlp3s0 link | awk '/SSID/ {print $2}'", shell=True).decode().strip().lower() if wifi_ssid not in ( 'wifi@db', 'wifionice' ): exit(0) now = datetime.now() trip_info_req = get('https://iceportal.de/api1/rs/tripInfo/trip') trip_info_req.raise_for_status() trip_info = trip_info_req.json()['trip'] ice_status_req = get('https://iceportal.de/api1/rs/status') ice_status_req.raise_for_status() ice_status = ice_status_req.json() if LINK_MODE: check_output(['xdg-open', 'https://travelynx.franzi.business/s/{}?train={}%20{}'.format( trip_info['stopInfo']['actualLast'], trip_info['trainType'], trip_info['vzn'], )]) exit(0) next_stop_id = trip_info['stopInfo']['actualNext'] for stop in trip_info['stops']: if stop['station']['evaNr'] == next_stop_id: if stop['timetable']['departureDelay']: delay = ' | {}'.format(stop['timetable']['departureDelay']) else: delay = '' if stop['timetable'].get('actualArrivalTime', 0): arrival = datetime.fromtimestamp(stop['timetable']['actualArrivalTime']/1000) arrival_in = arrival - now else: arrival = datetime.now() arrival_in = timedelta() next_stop = '{} [{}] {} ({}{})'.format( stop['station']['name'], stop['track']['actual'], arrival.strftime('%H:%M'), format_time(arrival_in.total_seconds()), delay ) break else: next_stop = 'Endstation, bitte Aussteigen' net_current = ice_status['connectivity']['currentState'] net_future = ice_status['connectivity']['nextState'] if net_current not in (None, 'NO_INFO') or net_future not in (None, 'NO_INFO'): net = ' (Net: {} > [{}] {})'.format( net_current, format_time(ice_status['connectivity']['remainingTimeSeconds']), net_future, ) else: net = '' print('{}km/h > {}{}'.format( ice_status['speed'], next_stop, net, )) except Exception as e: print(repr(e)) exit(0)