summaryrefslogtreecommitdiff
path: root/bin/efa-gw
blob: fc6e949a3690654fe26f347e309eb56bf6d9d68d (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
72
73
74
75
76
77
78
79
80
81
#!/usr/bin/env python3
# vim:tabstop=4 softtabstop=4 shiftwidth=4 textwidth=160 smarttab expandtab colorcolumn=160

import argparse

import aiohttp
from aiohttp import web

import csv
import json

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

occupancy_map = {"MANY_SEATS": 1, "FEW_SEATS": 2, "STANDING_ONLY": 3}

eva_to_name = dict()


def load_eva_to_name(filename):
    ret = dict()
    with open(filename, "r") as f:
        f.readline()
        cr = csv.reader(f, delimiter=";")
        for city, place, _, _, _, _, _, name, _, eva, transports in cr:
            if "TRAIN" in transports:
                ret[int(eva)] = name
    return ret


def get_occupancy(occupancy):
    try:
        return occupancy_map[occupancy]
    except KeyError:
        return None


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

    try:
        station = eva_to_name[eva]
    except KeyError:
        return web.HTTPNotFound(text="Unknown EVA")

    async with aiohttp.ClientSession() as session:
        async with session.get(
            f"https://vrrf.finalrewind.org/{station}.json?line=RE,RB,S&backend=efa.VRR2"
        ) as response:
            content = await response.text()
            content = json.loads(content)
            reply = dict()

            for train in content["raw"]:
                if train["train_no"]:
                    reply[train["train_no"]] = {
                        "occupancy": get_occupancy(train["occupancy"])
                    }

            return web.Response(body=json.dumps(reply), headers=headers)


if __name__ == "__main__":

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

    eva_to_name = load_eva_to_name(args.eva_csv)
    app = web.Application()
    app.add_routes([web.get(f"{args.prefix}{{eva}}.json", handle_eva)])
    web.run_app(app, host="localhost", port=args.port)