fpl-solver / fpl_api.py
AnayShukla's picture
Clean Production Release
f7cecf3
import requests
BASE_URL = "https://fantasy.premierleague.com/api"
AFCON_GW = 16
def calculate_fts(transfers, first_gw, next_gw, fh_gws, wc_gws):
"""Exact logic ported from open-fpl-solver dev/solver.py"""
n_transfers = {gw: 0 for gw in range(2, next_gw + 2)}
for t in transfers:
if t["event"] in n_transfers:
n_transfers[t["event"]] += 1
fts = {gw: 0 for gw in range(first_gw + 1, next_gw + 2)}
fts[first_gw + 1] = 1
for i in range(first_gw + 2, next_gw + 1):
if i == AFCON_GW:
fts[i] = 5
continue
if (i - 1) in fh_gws or (i - 1) in wc_gws:
fts[i] = fts[i - 1]
continue
fts[i] = fts[i - 1] - n_transfers[i - 1]
fts[i] = max(fts[i], 0)
fts[i] += 1
fts[i] = min(fts[i], 5)
return fts.get(next_gw, 1)
def get_fpl_team_data(team_id: int):
print(f"Executing strict open-fpl-solver logic for Team ID: {team_id}...")
static = requests.get(f"{BASE_URL}/bootstrap-static/").json()
element_to_type = {x["id"]: x["element_type"] for x in static["elements"]}
next_gw = next(x["id"] for x in static["events"] if x["is_next"])
start_prices = {
x["id"]: x["now_cost"] - x["cost_change_start"] for x in static["elements"]
}
transfers = requests.get(f"{BASE_URL}/entry/{team_id}/transfers/").json()[::-1]
history = requests.get(f"{BASE_URL}/entry/{team_id}/history/").json()
chips = history["chips"]
fh_gws = [x["event"] for x in chips if x["name"] == "freehit"]
wc_gws = [x["event"] for x in chips if x["name"] == "wildcard"]
first_gw = history["current"][0]["event"]
first_gw_data = requests.get(
f"{BASE_URL}/entry/{team_id}/event/{first_gw}/picks/"
).json()
# Calculate exact purchase prices and ITB
squad = {x["element"]: start_prices[x["element"]] for x in first_gw_data["picks"]}
itb = 1000 - sum(squad.values())
for t in transfers:
if t["event"] in fh_gws:
continue
itb += t["element_out_cost"]
itb -= t["element_in_cost"]
if t["element_in"]:
squad[t["element_in"]] = t["element_in_cost"]
if t["element_out"] and t["element_out"] in squad:
del squad[t["element_out"]]
fts = calculate_fts(transfers, first_gw, next_gw, fh_gws, wc_gws)
picks = []
for player_id, purchase_price in squad.items():
now_cost = next(
x["now_cost"] for x in static["elements"] if x["id"] == player_id
)
diff = now_cost - purchase_price
selling_price = purchase_price + (diff // 2) if diff > 0 else now_cost
picks.append(
{
"id": player_id,
"purchase_price": purchase_price / 10.0,
"selling_price": selling_price / 10.0,
"now_cost": now_cost / 10.0,
}
)
return {"in_the_bank": itb / 10.0, "free_transfers": fts, "squad": picks}