import requests, json
from os import getenv
from flask import Flask, request, abort
# consts
metric_map = {
"spots": "free_slots",
"bikes": "avl_bikes",
"capacity": "total_slots",
"location": "coordinates"
}
url = "https://vancouver-ca.smoove.pro/api-public/stations"
#with open('live_dump.json') as f:
# old_data = json.load(f)
# data = old_data
# init globals
data = None
app = Flask(__name__)
def refresh_data():
global data
# try to get new data
try:
new = requests.get(url)
except requests.exceptions.RequestException:
app.logger.error("failed to get data")
data = None
else:
data = new.json()["result"]
# main function to get data from api
def get_bikes(station, metric):
refresh_data()
# if refresh failed, return 404
if not data:
return 502
# find the station
match = False
for each in data:
split = each['name'].split(' ', 1)
id = split[0]
name = split[1]
if station == id or station == name:
match = each
break
# return 404 if no match
if not match:
return 404
if metric == "both":
result = "Spots: " + str(match["avl_bikes"]) + '
'
result += "Bikes: " + str(match["free_slots"])
return result
return(str(match[metric]))
# interprets REST requests at a given location
# you can get /api/station/metric to get just one metric w/o formatting
@app.route('/api//', methods=['GET'])
def get_metric_info(station, metric):
try:
metric_map[metric]
except KeyError:
abort(404, description="Sorry, that metric does not exist")
result = get_bikes(station, metric_map[metric])
if result == 404:
abort(404, description="Sorry, that station does not exist")
elif result == 502:
abort(502, description="Sorry, the API server isn't responding right now")
else:
return result
# interprets REST requests at a given location
# get /api/station (can be a number or name) returns bikes+slots available
@app.route('/api//', methods=['GET'])
def get_station_info(station):
result = get_bikes(station, "both")
if result == 404:
abort(404, description="Sorry, that station does not exist")
elif result == 502:
abort(502, description="Sorry, the API server isn't responding right now")
else:
return result