forked from Kometa-Team/Kometa
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ergast.py
172 lines (159 loc) · 8.25 KB
/
ergast.py
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
from datetime import datetime, timedelta
from modules import util
from modules.util import Failed
logger = util.logger
base_url = "http://ergast.com/api/f1/"
translations = {
"nl": {
"70th Anniversary": "70th Anniversary", "Abu Dhabi": "Abu Dhabi", "Argentine": "Argentinië", "Australian": "Australië",
"Austrian": "Oostenrijk", "Azerbaijan": "Azerbeidzjan", "Bahrain": "Bahrein", "Belgian": "België", "Brazilian": "Brazilië",
"British": "Groot-Brittannië", "Caesars Palace": "Caesars Palace", "Canadian": "Canada", "Chinese": "China", "Dallas": "Dallas",
"Detroit": "Detroit", "Dutch": "Nederland", "Eifel": "Eifel", "Emilia Romagna": "Emilia Romagna", "European": "Europa",
"French": "Frankrijk", "German": "Duitsland", "Hungarian": "Hongarije", "Indian": "India", "Indianapolis 500": "Indianapolis 500",
"Italian": "Italië", "Japanese": "Japan", "Korean": "Zuid-Korea", "Luxembourg": "Luxemburg", "Malaysian": "Maleisië",
"Mexican": "Mexico", "Mexico City": "Mexico City", "Miami": "Miami", "Monaco": "Monaco", "Moroccan": "Marroko",
"Pacific": "Pacific", "Pescara": "Pescara", "Portuguese": "Portugal", "Qatar": "Qatar", "Russian": "Rusland",
"Sakhir": "Sakhir", "San Marino": "San Marino", "Saudi Arabian": "Saudi Arabië", "Singapore": "Singapore",
"South African": "Zuid-Afrika", "Spanish": "Spanje", "Styrian": "Stiermarken", "Swedish": "Zweden", "Swiss": "Zwitserland",
"São Paulo": "São Paulo", "Turkish": "Turkije", "Tuscan": "Toscane", "United States": "Verenigde Staten"
}
}
terms = {
"free practice 1": ["free practice 1", "vrije training 1", "fp1", "vt1"],
"free practice 2": ["free practice 2", "vrije training 2", "fp2", "vt2"],
"free practice 3": ["free practice 3", "vrije training 3", "fp3", "vt3"],
"pre": ["pre", "voorbeschouwing"],
"post": ["post", "nabeschouwing"],
"quali": ["quali", "kwalificatie"],
"shootout": ["shootout"],
"notebook": ["notebook", "notitieboekje"],
"preview": ["preview", "seizoensvoorbeschouwing"],
"summary": ["summary", "samenvatting"],
"highlight": ["highlight", "hoogtepunten"],
}
names = {
"nl": {
"Formula 1 Cafe": "Formule 1 Cafe",
"Free Practice 1": "Vrije Training 1",
"Free Practice 2": "Vrije Training 2",
"Free Practice 3": "Vrije Training 3",
"Pre-Sprint Race Build-up": "Sprint Race Voorbeschouwing",
"Post-Sprint Race Analysis": "Sprint Race Nabeschouwing",
"Sprint Race Session": "Sprint Race",
"Ted's Sprint Notebook": "Ted's Sprint Notitieboekje",
"Pre-Qualifying Build-up": "Kwalificatie Voorbeschouwing",
"Post-Qualifying Analysis": "Kwalificatie Nabeschouwing",
"Qualifying Session": "Kwalificatie",
"Season Preview": "Seizoensvoorbeschouwing",
"Pre-Race Buildup": "Voorbeschouwing",
"Post-Race Analysis": "Nabeschouwing",
"Live from the Grid": "Vanaf de grid",
"Highlights": "Samenvatting",
"Race Session": "Race",
"Ted's Race Notebook": "Ted's Race Notitieboekje",
"Ted's Qualifying Notebook": "Ted's Kwalificatie Notitieboekje",
"Pre-Sprint Shootout Build-up": "Sprint Shootout Voorbeschouwing",
"Post-Sprint Shootout Analysis": "Sprint Shootout Nabeschouwing",
"Sprint Shootout Session": "Sprint Shootout",
}
}
class Race:
def __init__(self, data, language):
self._data = data
self._language = language
self.season = util.check_num(self._data["season"], is_int=True)
self.round = util.check_num(self._data["round"], is_int=True)
self.name = self._data["raceName"]
try:
self.date = datetime.strptime(self._data["date"], "%Y-%m-%d")
except (ValueError, TypeError):
self.date = None
def format_name(self, round_prefix, shorten_gp):
if self._language:
output = f"GP {self.name.replace(' Grand Prix', '')}" if shorten_gp else self.name
for eng_value, trans_value in translations[self._language].items():
output = output.replace(eng_value, trans_value)
else:
output = self.name.replace("Grand Prix", "GP") if shorten_gp else self.name
if round_prefix:
output = f"{self.round:02} - {output}"
return output
def session_info(self, title, sprint_weekend):
title = title.lower()
if "cafe" in title:
output = "Formula 1 Cafe"
elif any([x in title for x in terms["free practice 1"]]):
output = "Free Practice 1"
elif any([x in title for x in terms["free practice 2"]]):
output = "Free Practice 2"
elif any([x in title for x in terms["free practice 3"]]):
output = "Free Practice 3"
elif "shootout" in title:
if any([x in title for x in terms["pre"]]):
output = "Pre-Sprint Shootout Build-up"
elif any([x in title for x in terms["post"]]):
output = "Post-Sprint Shootout Analysis"
else:
output = "Sprint Shootout Session"
elif "sprint" in title:
if any([x in title for x in terms["pre"]]):
output = "Pre-Sprint Race Build-up"
elif any([x in title for x in terms["post"]]):
output = "Post-Sprint Race Analysis"
elif any([x in title for x in terms["notebook"]]):
output = "Ted's Sprint Notebook"
else:
output = "Sprint Race Session"
elif any([x in title for x in terms["quali"]]):
if any([x in title for x in terms["pre"]]):
output = "Pre-Qualifying Build-up"
elif any([x in title for x in terms["post"]]):
output = "Post-Qualifying Analysis"
elif any ([x in title for x in terms["notebook"]]):
output = "Ted's Qualifying Notebook"
else:
output = "Qualifying Session"
elif any([x in title for x in terms["preview"]]):
output = "Season Preview"
elif any([x in title for x in terms["pre"]]):
output = "Pre-Race Buildup"
elif any([x in title for x in terms["post"]]):
output = "Post-Race Analysis"
elif "grid" in title:
output = "Live from the Grid"
elif any([x in title for x in terms["summary"] + terms["highlight"]]):
output = "Highlights"
elif any([x in title for x in terms["notebook"]]):
output = "Ted's Race Notebook"
else:
output = "Race Session"
if "2160" in title or "4K" in title:
output = f"{output} (4K)"
if (sprint_weekend and any([x in output for x in ["Sprint", "Free Practice 2"]])) or \
(not sprint_weekend and any([x in output for x in ["Qualifying", "Free Practice 3"]])):
video_date = self.date - timedelta(days=1)
elif (sprint_weekend and any([x in output for x in ["Qualifying", "Free Practice 1", "Formula 1 Cafe"]])) or \
(not sprint_weekend and any([x in output for x in ["Free Practice 1", "Free Practice 2", "Formula 1 Cafe"]])):
video_date = self.date - timedelta(days=2)
else:
video_date = self.date
if self._language and self._language in names and output in names[self._language]:
output = names[self._language][output]
return output, video_date
class Ergast:
def __init__(self, config):
self.config = config
def get_races(self, year, language, ignore_cache=False):
expired = None
if self.config.Cache and not ignore_cache:
race_list, expired = self.config.Cache.query_ergast(year, self.config.Cache.expiration)
if race_list and expired is False:
return [Race(r, language) for r in race_list]
response = self.config.get(f"{base_url}{year}.json")
if response.status_code < 400:
races = [Race(r, language) for r in response.json()["MRData"]["RaceTable"]["Races"]]
if self.config.Cache and not ignore_cache:
self.config.Cache.update_ergast(expired, year, races, self.config.Cache.expiration)
return races
else:
raise Failed(f"Ergast Error: F1 Season: {year} Not found")