diff --git a/pybikes/data/ganxeta.json b/pybikes/data/ganxeta.json new file mode 100644 index 000000000..e8b06721f --- /dev/null +++ b/pybikes/data/ganxeta.json @@ -0,0 +1,19 @@ +{ + "instances": [ + { + "tag": "ganxeta-reus", + "meta": { + "city": "Reus", + "name": "Ganxeta", + "country": "ES", + "latitude": 41.1589, + "longitude": 1.10623, + "company": [ + "REUS MOBILITAT I SERVEIS, S.A. (RMS)" + ] + } + } + ], + "system": "ganxeta", + "class": "Ganxeta" +} diff --git a/pybikes/ganxeta.py b/pybikes/ganxeta.py new file mode 100644 index 000000000..620ca7f93 --- /dev/null +++ b/pybikes/ganxeta.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2023, Martín González Gómez + +import json + +from pybikes import BikeShareSystem, BikeShareStation, PyBikesScraper + +ENDPOINT = "https://bks-api.ganxeta.cat/rms-bike-sharing-real-time/graphql" + + +class Ganxeta(BikeShareSystem): + headers = { + "Content-Type": "application/json; charset=utf-8", + } + + payload = { + "operationName": "StationsRealtime", + "query": """query StationsRealtime { + get_data_real_time { + station_id + station_state_id + station_name + station_address + latitude + longitude + bikes_total + bikes_available + bikes_reserved + bikes_maintenance + bikes_occupancy_status + bikes_occupancy_color + racks_total + racks_available + racks_broken + racks_occupancy_status + racks_occupancy_color + station_external_id + } + }""", + } + + def __init__(self, tag, meta): + super(Ganxeta, self).__init__(tag, meta) + + def update(self, scraper=None): + scraper = scraper or PyBikesScraper() + data = scraper.request( + ENDPOINT, + data=json.dumps(Ganxeta.payload), + headers=Ganxeta.headers, + method="POST", + ) + data = json.loads(data) + + stations = [] + + for station in data["data"]["get_data_real_time"]: + stations.append(GanxetaStation(station)) + + self.stations = stations + + +class GanxetaStation(BikeShareStation): + def __init__(self, data): + self.name = data["station_name"] + self.latitude = float(data["latitude"]) + self.longitude = float(data["longitude"]) + + self.bikes = int(data["bikes_available"]) + self.free = int(data["racks_available"]) + + self.extra = { + "uid": data["station_id"], + "address": data["station_address"], + "slots": int(data["racks_total"]), + "number": data["station_external_id"], + }