2024-02-07 21:34:11 +00:00
#!/usr/bin/python3
# Copyright (c) 2024 Antonia <antonia@antonia.is>
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
import sys
import json
import urllib . request
import time
2024-02-08 11:17:08 +00:00
import argparse
2024-02-07 21:34:11 +00:00
2024-02-08 11:17:08 +00:00
parser = argparse . ArgumentParser ( description = ' Travelynx Integration for waybar ' )
parser . add_argument ( " token " , help = " travelynx status API token " )
parser . add_argument ( " -l " , " --last-checkin " , metavar = " MINUTES " , help = " keep showing last checkin for a given amount of minutes, 0 for indefinitely " , type = int , )
parser . add_argument ( " -d " , " --ds-100 " , action = " store_true " , help = " Prefer DS100 codes for stations " , default = False )
args = parser . parse_args ( )
token = args . token
2024-02-07 21:34:11 +00:00
contents = urllib . request . urlopen ( " https://travelynx.de/api/v1/status/ " + token ) . read ( )
response = json . loads ( contents )
2024-02-08 11:17:08 +00:00
st = " "
2024-02-07 21:34:11 +00:00
2024-09-02 21:30:56 +00:00
def humantime ( t ) :
return time . strftime ( " % H: % M " , time . localtime ( int ( t ) ) )
def delay ( s , i ) :
return ( int ( s [ " real " + i ] ) - int ( s [ " scheduled " + i ] ) ) / / 60
def timestring ( s , i ) :
if not " real " + i in s :
return humantime ( s [ " scheduled " + i ] )
dl = delay ( s , i )
ht = humantime ( s [ " real " + i ] )
if dl > 0 :
return ht + " (+ %d ) " % dl
if dl < 0 :
return ht + " ( %d ) " % dl
return ht
2024-02-08 11:17:08 +00:00
def get_destination ( response ) :
2024-02-07 21:34:11 +00:00
if " toStation " in response :
s = response [ " toStation " ]
2024-02-08 11:17:08 +00:00
if " ds100 " in s and s [ " ds100 " ] and args . ds_100 :
s [ " prefname " ] = s [ " ds100 " ]
2024-02-07 21:34:11 +00:00
else :
2024-02-08 11:17:08 +00:00
s [ " prefname " ] = s [ " name " ]
return s
else :
return None
2024-02-08 17:18:58 +00:00
tooltip = " "
2024-02-08 11:17:08 +00:00
checked_in = response [ " checkedIn " ]
if checked_in or args . last_checkin is not None :
s = get_destination ( response )
elapsed = int ( time . time ( ) ) - int ( s [ " realTime " ] )
if checked_in or args . last_checkin == 0 or args . last_checkin * 60 > elapsed :
2024-09-02 21:30:56 +00:00
tstr = timestring ( s , " Time " )
st = f ' { s [ " prefname " ] } { tstr } '
2024-02-08 17:18:58 +00:00
if " train " in response :
train = response [ " train " ]
2024-09-02 21:30:56 +00:00
if train [ " line " ] is not None :
tooltip = f ' <b> { train [ " type " ] } { train [ " line " ] } ( { train [ " no " ] } )</b> to { s [ " name " ] } '
else :
tooltip = f ' <b> { train [ " type " ] } { train [ " no " ] } </b> to { s [ " name " ] } '
2024-02-08 11:17:08 +00:00
2024-09-02 21:30:56 +00:00
if " intermediateStops " in response :
stops = response [ " intermediateStops " ]
now = time . time ( )
for stop in stops :
if stop [ " realDeparture " ] is not None and int ( stop [ " realDeparture " ] ) > now :
dep = timestring ( stop , " Departure " )
arr = timestring ( stop , " Arrival " )
tooltip = tooltip + f ' \n { arr } – { dep } <b> { stop [ " name " ] } </b> '
elif int ( stop [ " scheduledDeparture " ] ) > now :
dep = humantime ( stop [ " scheduledDeparture " ] )
arr = humantime ( stop [ " scheduledArrival " ] )
tooltip = tooltip + f ' \n <i> { arr } – { dep } </i> <b> { stop [ " name " ] } </b> '
2024-02-08 11:17:08 +00:00
2024-02-07 21:34:11 +00:00
2024-02-08 17:18:58 +00:00
print ( json . dumps ( { " text " : st , " tooltip " : tooltip , " class " : " active " , " percentage " : " " } ) )