Skip to main content

Utilities for the MyLaps Event Results API

Project description

speedhive-tools

PyPI version Python 3.10+ License: MIT CI

Python toolkit for the MyLaps Event Results API. Export race events, sessions, laps, and announcements to CSV, SQLite, or JSON with a single command.

Features

  • Full Data Export — Stream events, sessions, laps, and announcements for any organization
  • Multiple Output Formats — CSV, SQLite, JSON, and compressed NDJSON
  • Memory Efficient — Streaming architecture handles large datasets without high RAM usage
  • Resumable Downloads — Checkpoint support for interrupted exports
  • Interactive CLI — Process exported data with guided prompts or batch flags

Installation

From PyPI

pip install speedhive-tools

From Source

git clone https://github.com/ncrosty58/speedhive-tools.git
cd speedhive-tools
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt

Quick Start

1. Export Data

Export all data for an organization (events, sessions, laps, announcements):

python examples/export_full_dump.py --org 30476 --output ./output/full_dump --verbose

2. Process to CSV

Convert the exported NDJSON to flat CSV files:

python examples/processing/extract_laps_to_csv.py \
    --input output/full_dump/30476 \
    --out output/full_dump/30476/laps.csv

3. Or Use the Interactive CLI

python examples/processing/processor_cli.py

Usage

Export Commands

Command Description
export_full_dump.py --org <id> Export all data (events, sessions, laps, announcements)
export_events.py <org_id> Export events for an organization
export_sessions.py <event_id> Export sessions for an event
export_laps.py <session_id> Export lap times for a session
export_results.py <session_id> Export results/classification for a session
export_announcements.py --org <id> Export announcements for an organization
export_championships.py --org <id> Export championships for an organization
export_championships.py --championship <id> Export championship standings
export_lap_chart.py <session_id> Export lap chart data for visualizations

Export Options

python examples/export_full_dump.py \
    --org 30476 \
    --output ./output/full_dump \
    --max-events 10 \
    --max-sessions-per-event 5 \
    --concurrency 2 \
    --verbose \
    --dry-run
Flag Description
--org Organization ID (required, repeatable)
--output Output directory (default: ./output/full_dump)
--max-events Limit number of events to export
--max-sessions-per-event Limit sessions per event
--concurrency Parallel request limit (default: 5)
--token API token for authenticated endpoints
--dry-run Preview without writing files
--verbose Enable detailed logging

Processing Commands

Convert exported NDJSON to analysis-ready formats:

# Extract to CSV
python examples/processing/extract_events_to_csv.py --input <dir> --out events.csv
python examples/processing/extract_sessions_to_csv.py --input <dir> --out sessions.csv
python examples/processing/extract_laps_to_csv.py --input <dir> --out laps.csv
python examples/processing/extract_announcements_to_csv.py --input <dir> --out announcements.csv

# Import to SQLite
python examples/processing/ndjson_to_sqlite.py --input <dir>/laps.ndjson.gz --out dump.db

Processor CLI

Interactive mode for batch processing:

# Interactive - prompts for org and output options
python examples/processing/processor_cli.py

# Non-interactive - process all data types
python examples/processing/processor_cli.py --org 30476 --run-all

Using the Client Library

If you want to build your own programs using the MyLaps API, use the SpeedhiveClient wrapper for a simple, Pythonic interface.

Quick Start

from mylaps_client_wrapper import SpeedhiveClient

client = SpeedhiveClient()

# Get events for an organization
events = client.get_events(org_id=30476, limit=10)
for event in events:
    print(f"{event['name']} - {event.get('date')}")

# Get sessions for an event
sessions = client.get_sessions(event_id=123456)

# Get lap times for a session
laps = client.get_laps(session_id=789012)
for lap in laps:
    print(f"Lap {lap.get('lapNumber')}: {lap.get('lapTime')}")

# Get results/classification
results = client.get_results(session_id=789012)

Available Methods

Method Description
get_organization(org_id) Get organization details
get_events(org_id, limit, offset) Get events for an organization
iter_events(org_id) Iterate all events (handles pagination)
get_event(event_id) Get event details
get_sessions(event_id) Get sessions for an event
get_session(session_id) Get session details
get_laps(session_id) Get all lap times for a session
get_results(session_id) Get classification/standings
get_announcements(session_id) Get session announcements
get_lap_chart(session_id) Get position changes per lap (for visualizations)
get_championships(org_id) Get championships for an organization
get_championship(championship_id) Get championship standings
get_server_time() Get API server time

With Authentication

Some endpoints require authentication:

client = SpeedhiveClient(token="YOUR_API_TOKEN")

Pagination Example

Iterate through all events without worrying about pagination:

client = SpeedhiveClient()

for event in client.iter_events(org_id=30476):
    print(event['name'])
    
    # Get all sessions and laps for each event
    for session in client.get_sessions(event['id']):
        laps = client.get_laps(session['id'])
        print(f"  {session['name']}: {len(laps)} laps")

Using the Raw Client

For advanced use cases, you can access the underlying generated client directly:

import sys
sys.path.insert(0, "mylaps_client")

from event_results_client import Client
from event_results_client.api.organization_controller.get_event_list import sync_detailed
import json

client = Client(base_url="https://api2.mylaps.com")
response = sync_detailed(id=30476, client=client, count=50)
events = json.loads(response.content)

For the full API specification, see the MyLaps API Documentation.

Project Structure

speedhive-tools/
├── mylaps_client/          # Generated OpenAPI client (event_results_client)
├── mylaps_client_wrapper.py # User-friendly API wrapper (SpeedhiveClient)
├── examples/
│   ├── export_full_dump.py          # Bulk exporter (all data for org)
│   ├── export_events.py             # Export events for an org
│   ├── export_sessions.py           # Export sessions for an event
│   ├── export_laps.py               # Export laps for a session
│   ├── export_results.py            # Export results for a session
│   ├── export_announcements.py      # Export announcements
│   ├── export_championships.py      # Export championships/standings
│   ├── export_lap_chart.py          # Export lap chart data
│   └── processing/
│       ├── processor_cli.py         # Interactive processor
│       ├── extract_events_to_csv.py
│       ├── extract_sessions_to_csv.py
│       ├── extract_laps_to_csv.py
│       ├── extract_announcements_to_csv.py
│       └── ndjson_to_sqlite.py
├── tests/                  # Unit tests
└── output/                 # Default export location (gitignored)

Output Format

The exporter creates gzipped NDJSON files:

output/full_dump/<org_id>/
├── events.ndjson.gz
├── sessions.ndjson.gz
├── laps.ndjson.gz
├── announcements.ndjson.gz
└── .checkpoint.json        # Resume state

Development

Run Tests

pip install pytest
pytest

Regenerate API Client

If the MyLaps API spec changes:

pip install openapi-python-client
openapi-python-client generate --url https://api2.mylaps.com/v3/api-docs --output-path ./mylaps_client

Build Distribution

pip install build
python -m build

CI/CD

This project uses GitHub Actions for automated testing and PyPI publishing. Pushing a version tag triggers:

  1. Run test suite
  2. Build sdist and wheel
  3. Publish to PyPI
git tag v0.1.3
git push origin v0.1.3

Contributing

Contributions welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Add tests for new functionality
  4. Submit a pull request

License

MIT © Nathan Crosty

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

speedhive_tools-0.1.4.tar.gz (132.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

speedhive_tools-0.1.4-py3-none-any.whl (46.6 kB view details)

Uploaded Python 3

File details

Details for the file speedhive_tools-0.1.4.tar.gz.

File metadata

  • Download URL: speedhive_tools-0.1.4.tar.gz
  • Upload date:
  • Size: 132.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for speedhive_tools-0.1.4.tar.gz
Algorithm Hash digest
SHA256 0669ef9c7014d253f253f5e6d346de2f2280401824e926d12c3eb1dee5b9cdea
MD5 f6b0b537c029d42309aa56d41e355d02
BLAKE2b-256 67f11413b98e6a25b8c2401472b0545e1e2d184969628dda809db09898b1c392

See more details on using hashes here.

File details

Details for the file speedhive_tools-0.1.4-py3-none-any.whl.

File metadata

File hashes

Hashes for speedhive_tools-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 e6682ea2fa0f17914d47bac3bd13b505d9efa14e77bdb55ddb02b8c6cdfa75d8
MD5 a97a2783c8ae8bf6f74bed7140276ac9
BLAKE2b-256 98adac17e3731e6fba21c32564e5a86064472ec8164831426486d55c0f37f11e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page