2022-06-01 15:31:52 +02:00
|
|
|
import json
|
|
|
|
import requests
|
|
|
|
|
|
|
|
from uritemplate import URITemplate
|
|
|
|
|
2022-06-05 20:46:37 +02:00
|
|
|
HOST = 'https://ergast.com/api'
|
|
|
|
SERIES = 'f1'
|
2022-06-01 15:31:52 +02:00
|
|
|
|
|
|
|
class Requester():
|
|
|
|
"""
|
|
|
|
Perform requests to the Ergast API
|
|
|
|
"""
|
|
|
|
|
|
|
|
def __init__(self) -> None:
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
def _get_race_results_params(self, param: dict) -> dict:
|
|
|
|
""" Acquire only the appropriate filters for Race/Results data """
|
|
|
|
return {
|
|
|
|
"season": param["season"],
|
|
|
|
"round": param["round"],
|
|
|
|
"filters": {
|
|
|
|
"drivers": param["driver"],
|
|
|
|
"constructors": param["constructor"],
|
|
|
|
"grid": param["grid"],
|
|
|
|
"qualifying": param["qualifying"],
|
|
|
|
"sprint": param["sprint"],
|
|
|
|
"fastest": param["fastest"],
|
|
|
|
"circuits": param["circuit"],
|
|
|
|
"status": param["status"],
|
|
|
|
"results": param["result"],
|
|
|
|
"races": param["races"],
|
|
|
|
"seasons": param["seasons"],
|
|
|
|
},
|
|
|
|
"paging": {
|
|
|
|
"limit": param["limit"],
|
|
|
|
"offset": param["offset"],
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
def _get_race_results_criteria(self, params: dict, resource: str) -> dict:
|
|
|
|
""" Split the data into criteria and resource for Race/Results """
|
|
|
|
criteria = []
|
|
|
|
for key, value in params["filters"].items():
|
|
|
|
if (key != resource and value != None):
|
|
|
|
criteria.append(key)
|
|
|
|
criteria.append(value)
|
|
|
|
|
|
|
|
value = params["filters"][resource]
|
|
|
|
|
|
|
|
return {
|
|
|
|
"resource": resource,
|
|
|
|
"value": value,
|
|
|
|
"criteria": criteria
|
|
|
|
}
|
|
|
|
|
|
|
|
def _get_standings_params(self, param: dict) -> dict:
|
|
|
|
""" Acquire only the appropriate filters for Standings data """
|
|
|
|
return {
|
|
|
|
"season": param["season"],
|
|
|
|
"round": param["round"],
|
|
|
|
"filters": {
|
|
|
|
"standing": param["standing"],
|
|
|
|
"drivers": param["driver"],
|
|
|
|
"constructors": param["constructor"]
|
|
|
|
},
|
|
|
|
"paging": {
|
|
|
|
"limit": param["limit"],
|
|
|
|
"offset": param["offset"],
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
def _get_standings_criteria(self, params: dict, resource: str) -> dict:
|
|
|
|
""" Split the data into criteria and resource for standings """
|
|
|
|
criteria = []
|
|
|
|
for key, value in params["filters"].items():
|
|
|
|
if (key != "standing" and value != None):
|
|
|
|
criteria.append(key)
|
|
|
|
criteria.append(value)
|
|
|
|
|
|
|
|
value = params["filters"]["standing"]
|
|
|
|
|
|
|
|
return {
|
|
|
|
"resource": resource,
|
|
|
|
"value": value,
|
|
|
|
"criteria": criteria
|
|
|
|
}
|
|
|
|
|
|
|
|
def _get_laps_pit_stops_params(self, param: dict) -> dict:
|
|
|
|
""" Acquire only the appropriate filters for Laps and Pit Stops data """
|
|
|
|
return {
|
|
|
|
"season": param["season"],
|
|
|
|
"round": param["round"],
|
|
|
|
"filters": {
|
|
|
|
"pitstops": param["pit_stop"],
|
|
|
|
"laps": param["lap"],
|
|
|
|
"drivers": param["driver"],
|
|
|
|
},
|
|
|
|
"paging": {
|
|
|
|
"limit": param["limit"],
|
|
|
|
"offset": param["offset"],
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
def _get_laps_pit_stops_criteria(self, params: dict, resource: str) -> dict:
|
|
|
|
""" Split the data into criteria and resource for Laps and Pit Stops """
|
|
|
|
criteria = []
|
|
|
|
for key, value in params["filters"].items():
|
|
|
|
if (key != resource and value != None):
|
|
|
|
criteria.append(key)
|
|
|
|
criteria.append(value)
|
|
|
|
|
|
|
|
value = params["filters"][resource]
|
|
|
|
|
|
|
|
return {
|
|
|
|
"resource": resource,
|
|
|
|
"value": value,
|
|
|
|
"criteria": criteria
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2022-06-01 19:31:06 +02:00
|
|
|
def run_request(self, season, round, criteria, resource, value=None, limit=None, offset=None) -> dict:
|
2022-06-01 15:31:52 +02:00
|
|
|
""" Takes values to run the request and return a dict """
|
|
|
|
url_tmpl = URITemplate('https://ergast.com/api{/series}{/season}{/round}'
|
|
|
|
'{/criteria*}{/resource}{/value}.json{?limit,offset}')
|
2022-06-05 20:46:37 +02:00
|
|
|
url = url_tmpl.expand(host=HOST, series=SERIES,
|
2022-06-01 15:31:52 +02:00
|
|
|
season=season, round=round,
|
|
|
|
criteria=criteria, resource=resource,
|
|
|
|
value=value, limit=limit, offset=offset)
|
|
|
|
|
2022-06-01 19:31:06 +02:00
|
|
|
response = requests.get(url)
|
|
|
|
if response.status_code == 200:
|
|
|
|
return json.loads(response.text)
|
|
|
|
else:
|
|
|
|
raise Exception(f"Failed with status code {response.status_code}. Error: {response.reason}")
|
2022-06-01 15:31:52 +02:00
|
|
|
|
|
|
|
#
|
|
|
|
# Race and Results
|
|
|
|
#
|
|
|
|
|
|
|
|
def get_circuits(self, param: dict) -> dict:
|
|
|
|
params = self._get_race_results_params(param)
|
|
|
|
filters = self._get_race_results_criteria(params, "circuits")
|
|
|
|
|
|
|
|
json = self.run_request(season=params["season"], round=params["round"],
|
|
|
|
criteria=filters["criteria"], resource=filters["resource"], value=filters["value"],
|
|
|
|
limit=params["paging"]["limit"], offset=params["paging"]["offset"])
|
|
|
|
|
|
|
|
return json["MRData"]["CircuitTable"]["Circuits"]
|
|
|
|
|
|
|
|
|
|
|
|
def get_constructors(self, param: dict) -> dict:
|
|
|
|
params = self._get_race_results_params(param)
|
|
|
|
filters = self._get_race_results_criteria(params, "constructors")
|
|
|
|
|
|
|
|
json = self.run_request(season=params["season"], round=params["round"],
|
|
|
|
criteria=filters["criteria"], resource=filters["resource"], value=filters["value"],
|
|
|
|
limit=params["paging"]["limit"], offset=params["paging"]["offset"])
|
|
|
|
|
|
|
|
return json["MRData"]["ConstructorTable"]["Constructors"]
|
|
|
|
|
|
|
|
|
|
|
|
def get_drivers(self, param: dict) -> dict:
|
|
|
|
params = self._get_race_results_params(param)
|
|
|
|
filters = self._get_race_results_criteria(params, "drivers")
|
|
|
|
|
|
|
|
json = self.run_request(season=params["season"], round=params["round"],
|
|
|
|
criteria=filters["criteria"], resource=filters["resource"], value=filters["value"],
|
|
|
|
limit=params["paging"]["limit"], offset=params["paging"]["offset"])
|
|
|
|
|
|
|
|
return json["MRData"]["DriverTable"]["Drivers"]
|
|
|
|
|
|
|
|
|
|
|
|
def get_qualifying(self, param: dict) -> dict:
|
|
|
|
params = self._get_race_results_params(param)
|
|
|
|
filters = self._get_race_results_criteria(params, "qualifying")
|
|
|
|
|
|
|
|
json = self.run_request(season=params["season"], round=params["round"],
|
|
|
|
criteria=filters["criteria"], resource=filters["resource"], value=filters["value"],
|
|
|
|
limit=params["paging"]["limit"], offset=params["paging"]["offset"])
|
|
|
|
|
|
|
|
return json["MRData"]["RaceTable"]["Races"]
|
|
|
|
|
|
|
|
def get_sprints(self, param: dict) -> dict:
|
|
|
|
params = self._get_race_results_params(param)
|
|
|
|
filters = self._get_race_results_criteria(params, "sprint")
|
|
|
|
|
|
|
|
json = self.run_request(season=params["season"], round=params["round"],
|
|
|
|
criteria=filters["criteria"], resource=filters["resource"], value=filters["value"],
|
|
|
|
limit=params["paging"]["limit"], offset=params["paging"]["offset"])
|
|
|
|
|
|
|
|
return json["MRData"]["RaceTable"]["Races"]
|
|
|
|
|
|
|
|
def get_results(self, param: dict) -> dict:
|
|
|
|
params = self._get_race_results_params(param)
|
|
|
|
filters = self._get_race_results_criteria(params, "results")
|
|
|
|
|
|
|
|
json = self.run_request(season=params["season"], round=params["round"],
|
|
|
|
criteria=filters["criteria"], resource=filters["resource"], value=filters["value"],
|
|
|
|
limit=params["paging"]["limit"], offset=params["paging"]["offset"])
|
|
|
|
|
|
|
|
return json["MRData"]["RaceTable"]["Races"]
|
|
|
|
|
|
|
|
def get_races(self, param: dict) -> dict:
|
|
|
|
params = self._get_race_results_params(param)
|
|
|
|
filters = self._get_race_results_criteria(params, "races")
|
|
|
|
|
|
|
|
json = self.run_request(season=params["season"], round=params["round"],
|
|
|
|
criteria=filters["criteria"], resource=filters["resource"], value=filters["value"],
|
|
|
|
limit=params["paging"]["limit"], offset=params["paging"]["offset"])
|
|
|
|
|
|
|
|
return json["MRData"]["RaceTable"]["Races"]
|
|
|
|
|
|
|
|
def get_seasons(self, param: dict) -> dict:
|
|
|
|
params = self._get_race_results_params(param)
|
|
|
|
filters = self._get_race_results_criteria(params, "seasons")
|
|
|
|
|
|
|
|
json = self.run_request(season=params["season"], round=params["round"],
|
|
|
|
criteria=filters["criteria"], resource=filters["resource"], value=filters["value"],
|
|
|
|
limit=params["paging"]["limit"], offset=params["paging"]["offset"])
|
|
|
|
|
|
|
|
return json["MRData"]["SeasonTable"]["Seasons"]
|
|
|
|
|
|
|
|
def get_statuses(self, param: dict) -> dict:
|
|
|
|
params = self._get_race_results_params(param)
|
|
|
|
filters = self._get_race_results_criteria(params, "status")
|
|
|
|
|
|
|
|
json = self.run_request(season=params["season"], round=params["round"],
|
|
|
|
criteria=filters["criteria"], resource=filters["resource"], value=filters["value"],
|
|
|
|
limit=params["paging"]["limit"], offset=params["paging"]["offset"])
|
|
|
|
|
|
|
|
return json["MRData"]["StatusTable"]["Status"]
|
|
|
|
|
|
|
|
#
|
|
|
|
# Standings
|
|
|
|
#
|
|
|
|
|
|
|
|
def get_driver_standings(self, param: dict) -> dict:
|
|
|
|
params = self._get_standings_params(param)
|
|
|
|
filters = self._get_standings_criteria(params, "driverStandings")
|
|
|
|
|
|
|
|
json = self.run_request(season=params["season"], round=params["round"],
|
|
|
|
criteria=filters["criteria"], resource=filters["resource"], value=filters["value"],
|
|
|
|
limit=params["paging"]["limit"], offset=params["paging"]["offset"])
|
|
|
|
|
|
|
|
return json["MRData"]["StandingsTable"]["StandingsLists"]
|
|
|
|
|
|
|
|
def get_constructor_standings(self, param: dict) -> dict:
|
|
|
|
params = self._get_standings_params(param)
|
|
|
|
filters = self._get_standings_criteria(params, "constructorStandings")
|
|
|
|
|
|
|
|
json = self.run_request(season=params["season"], round=params["round"],
|
|
|
|
criteria=filters["criteria"], resource=filters["resource"], value=filters["value"],
|
|
|
|
limit=params["paging"]["limit"], offset=params["paging"]["offset"])
|
|
|
|
|
|
|
|
return json["MRData"]["StandingsTable"]["StandingsLists"]
|
|
|
|
|
|
|
|
#
|
|
|
|
# Laps and Pit Stops
|
|
|
|
#
|
|
|
|
|
|
|
|
def get_laps(self, param: dict) -> dict:
|
|
|
|
params = self._get_laps_pit_stops_params(param)
|
|
|
|
filters = self._get_laps_pit_stops_criteria(params, "laps")
|
|
|
|
|
|
|
|
json = self.run_request(season=params["season"], round=params["round"],
|
|
|
|
criteria=filters["criteria"], resource=filters["resource"], value=filters["value"],
|
|
|
|
limit=params["paging"]["limit"], offset=params["paging"]["offset"])
|
|
|
|
|
|
|
|
return json["MRData"]["RaceTable"]["Races"]
|
|
|
|
|
|
|
|
def get_pit_stops(self, param: dict) -> dict:
|
|
|
|
params = self._get_laps_pit_stops_params(param)
|
|
|
|
filters = self._get_laps_pit_stops_criteria(params, "pitstops")
|
|
|
|
|
|
|
|
json = self.run_request(season=params["season"], round=params["round"],
|
|
|
|
criteria=filters["criteria"], resource=filters["resource"], value=filters["value"],
|
|
|
|
limit=params["paging"]["limit"], offset=params["paging"]["offset"])
|
|
|
|
|
|
|
|
return json["MRData"]["RaceTable"]["Races"]
|