Files
bincio-activity/bincio/extract/sport.py
T
Davide Scaini e71e8783ab added skiing
2026-03-29 10:51:26 +02:00

71 lines
1.9 KiB
Python

"""Sport name normalisation."""
import re
_MAPPING: dict[str, str] = {
# cycling variants (FIT enums, GPX types, Strava API/CSV types)
"cycling": "cycling",
"biking": "cycling",
"bike": "cycling",
"ride": "cycling",
"road_biking": "cycling",
"road_cycling": "cycling",
"mountain_biking": "cycling",
"mountain_bike_ride": "cycling",
"gravel_cycling": "cycling",
"gravel_ride": "cycling",
"cyclocross": "cycling",
"indoor_cycling": "cycling",
"indoor_ride": "cycling",
"virtual_ride": "cycling",
"e_biking": "cycling",
"ebikeride": "cycling",
"e_bike_ride": "cycling",
"ebike_ride": "cycling",
"handcycle": "cycling",
"velomobile": "cycling",
# running
"running": "running",
"run": "running",
"trail_running": "running",
"trail_run": "running",
"treadmill_running": "running",
"treadmill": "running",
"virtual_run": "running",
"outdoor_run": "running",
"indoor_run": "running",
"track_run": "running",
# hiking
"hiking": "hiking",
"hike": "hiking",
"outdoor_hike": "hiking",
# walking
"walking": "walking",
"walk": "walking",
"outdoor_walk": "walking",
# skiing
"skiing": "skiing",
"cross_country_skiing": "skiing",
"nordic_skiing": "skiing",
"downhill_skiing": "skiing",
"alpine_skiing": "skiing",
"skate_skiing": "skiing",
"backcountry_skiing": "skiing",
# swimming
"swimming": "swimming",
"swim": "swimming",
"open_water_swimming": "swimming",
"lap_swimming": "swimming",
}
BAS_SPORTS = {"cycling", "running", "hiking", "walking", "swimming", "skiing", "other"}
def normalise_sport(raw: object) -> str:
if raw is None:
return "other"
key = str(raw).lower().strip().replace(" ", "_").replace("-", "_")
# Strip leading date-like prefixes e.g. "20231117outdoor_run" → "outdoor_run"
key = re.sub(r"^\d+", "", key)
return _MAPPING.get(key, "other")