Source code for livef1.adapters.functions

# Standard Library Imports
from urllib.parse import urljoin

# Internal Project Imports
from .livetimingf1_adapter import livetimingF1_request
from ..utils.exceptions import livef1Exception

[docs] def download_data( season_identifier: int = None, location_identifier: str = None, session_identifier: str | int = None ): """ Downloads and filters F1 data based on the provided season, location, and session identifiers. Parameters ---------- season_identifier : :class:`int` The unique identifier for the F1 season. This is a required parameter. location_identifier : :class:`str` The location (circuit or country name) for filtering meetings (races). session_identifier : :class:`str` The session name (e.g., 'FP1', 'Qualifying') or key (integer) to filter a specific session within a meeting. Returns ---------- dict The filtered dataset containing the requested season, meeting, or session data. Raises ---------- livef1Exception Raised if any of the required parameters are missing or if no matching data is found. Examples ------------- .. code-block:: python print("Hello World") """ # Initialize a variable to store the final filtered data last_data = None # Ensure a season identifier is provided (mandatory) if season_identifier is None: raise livef1Exception("Please provide at least a `season_identifier`.") try: # Download full season data using the F1 API season_data = livetimingF1_request(urljoin(str(season_identifier) + "/", "Index.json")) last_data = season_data # Default to entire season data initially # If a location (race circuit) is provided, filter the season data to find the specific meeting (race) if location_identifier: meeting_data = next( (meeting for meeting in season_data["Meetings"] if meeting["Location"] == location_identifier), None ) if meeting_data: last_data = meeting_data # Update with filtered meeting data else: raise livef1Exception(f"Meeting at location '{location_identifier}' not found.") else: meeting_data = season_data["Meetings"] # If a session (e.g., FP1, Qualifying) is provided, further filter the meeting data if session_identifier: if isinstance(session_identifier, str): # Filter by session name (string match) session_data = next( (session for session in meeting_data['Sessions'] if session['Name'] == session_identifier), None ) elif isinstance(session_identifier, int): # Filter by session key (integer match) session_data = next( (session for session in meeting_data['Sessions'] if session['Key'] == session_identifier), None ) if session_data: last_data = session_data # Update with filtered session data else: raise livef1Exception(f"Session with identifier '{session_identifier}' not found.") except Exception as e: # Catch any exception and wrap it in a custom livef1Exception raise livef1Exception(e) from e # Return the final filtered data (season, meeting, or session) return last_data