summaryrefslogtreecommitdiff
path: root/bin/nvm
blob: 8e506dd2e8246c1cbe006a2fdb4ec4b2bffbb64a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/usr/bin/env python3
# vim:tabstop=4 softtabstop=4 shiftwidth=4 textwidth=160 smarttab expandtab colorcolumn=160
#
# Copyright (C) 2021 Daniel Friesel
#
# SPDX-License-Identifier: BSD-2-Clause

import argparse

import aiohttp
from aiohttp import web
from datetime import datetime
import dateutil.parser

from jinja2 import Environment, FileSystemLoader, select_autoescape

import json
import os

headers = {
    "Access-Control-Allow-Origin": "*",
    "Content-Type": "text/html; charset=utf-8",
}

db_rest_api = os.getenv("NVM_DB_REST_API", "https://v5.db.transport.rest")

env = Environment(loader=FileSystemLoader("templates"), autoescape=select_autoescape())

class Departure:
    def __init__(self, obj):
        self.__dict__.update(obj)
        if "line" in obj:
            self.line = Line(self.line)
        self.when = dateutil.parser.parse(self.when)
        self.plannedWhen = dateutil.parser.parse(self.plannedWhen)

class Line:
    def __init__(self, obj):
        self.__dict__.update(obj)

async def show_departure_board(request):
    try:
        eva = int(request.match_info.get("eva"))
    except ValueError:
        return web.HTTPBadRequest(text="EVA must be a number at the moment")

    async with aiohttp.ClientSession() as session:
        async with session.get(
            f"{db_rest_api}/stops/{eva}/departures?results=60&duration=120&stopovers=true"
        ) as response:
            departures = await response.text()
            departures = json.loads(departures)

    if type(departures) is dict and departures.get("error", False):
        return web.HTTPNotFound(body=json.dumps(departures), headers=headers)

    departures = list(map(Departure, departures))
    departure_board = env.get_template("departure_list.html")
    return web.Response(body=departure_board.render(title="Noot", departures=departures), headers=headers)

if __name__ == "__main__":

    parser = argparse.ArgumentParser(description="eva to efa gateway")
    parser.add_argument("--port", type=int, metavar="PORT", default=8080)
    parser.add_argument("--prefix", type=str, metavar="PATH", default="/")
    args = parser.parse_args()

    app = web.Application()
    app.router.add_get(f"{args.prefix}board/{{eva}}", show_departure_board)
    app.router.add_static(f"{args.prefix}static", "static")
    web.run_app(app, host="localhost", port=args.port)