Skip to main content

🏀 korb
A CLI toolkit for DBB basketball league analysis

Python 3.10+ Zero dependencies MIT License


korb is a zero-dependency Python CLI that parses HTML from the DBB (Deutscher Basketball Bund) legacy JSP platform and provides standings, results, schedules, predictions, and more.

Features

  • 📊 Standings — full league table with points, differentials, averages
  • 🏀 Team — game-by-game results, sparklines, quality metrics
  • 📋 Ergebnisse — all completed game results with optional team filter
  • 📅 Schedule — with back-to-back detection, filtering, pending games
  • 🔮 Predict — efficiency-model-based final standings forecast
  • 🥇 Top — quick leaderboard with ASCII bar chart
  • 📥 Download — fetch fresh HTML data directly from basketball-bund.net
  • 🔧 --json — machine-readable output for data commands (not download)

Installation

# With uv (recommended)
git clone https://github.com/malvavisc0/korb && cd korb
uv sync

# With pip (end-user install)
pip install .

After installation, the korb CLI is available inside the virtual environment. Use uv run korb to invoke it, or activate the venv first.

Quick Start

# Download league data
uv run korb --ligaid 51187 download

# View standings
uv run korb --ligaid 51187 standings

# Download fresh data + predict in one go
uv run korb --ligaid 51187 --download predict

Finding your Liga ID

The --ligaid value comes from the liga_id parameter in the DBB league URL:

https://www.basketball-bund.net/index.jsp?Action=103&liga_id=51187
                                                           ^^^^^
                                                           this is your liga ID

Commands

download — Fetch HTML data

uv run korb --ligaid 12345 download
uv run korb download --all   # refresh all previously downloaded leagues

Saves ergebnisse.html and spielplan.html into files/<ligaid>/.

standings — League table

uv run korb --ligaid 12345 standings

ergebnisse — Game results

uv run korb --ligaid 12345 ergebnisse
uv run korb --ligaid 12345 ergebnisse --team "Hawks"

team — Deep dive on a single team

uv run korb --ligaid 12345 team "Thunder"
uv run korb --ligaid 12345 team "Thunder" --bars --last-k 5 --metrics

schedule — Game calendar

uv run korb --ligaid 12345 schedule --pending
uv run korb --ligaid 12345 schedule --team "Hawks" --pending --b2b

predict — Forecast final standings

uv run korb --ligaid 12345 predict

top — Quick leaderboard

uv run korb --ligaid 12345 top -n 5

Global flags

Flag Description
--json Output as JSON instead of formatted tables
--download, -d Fetch fresh data before running the command
--ligaid, -l Liga ID (resolves file paths automatically)
--results, -r Explicit path to HTML results file
--schedule, -s Explicit path to HTML schedule file
--version, -V Show version

How Predictions Work

The predict command estimates final standings using a multiplicative efficiency model:

Factor How it works
Offensive rating Team's scored points vs. league average (>1.0 = above avg)
Defensive rating Points allowed vs. league average (>1.0 = worse defense)
Recency weighting 60-day half-life — recent games count more
Recent form Last 5 games blended at 30% weight into ratings
Home advantage 3% scoring boost applied symmetrically
B2B fatigue ≤36h between games → 5% offense/defense penalty
New teams <3 games → ratings blended toward league average
No draws Ties broken by home advantage (basketball has OT)

Project Structure

korb/
├── __init__.py      # Package marker & version
├── __main__.py      # CLI entry point & command handlers
├── core.py          # Shared models, HTML parsing, utilities
├── download.py      # HTTP downloader, headers, rate limiting
├── ergebnisse.py    # Game results viewer & filter
├── predict.py       # Multiplicative efficiency prediction model
├── schedule.py      # HTML schedule parser & filters
├── standings.py     # Standings calculator
└── team.py          # Team results viewer & metrics

Requirements: Python 3.10+ · uv · No runtime dependencies

Note: Downloaded HTML files and --ligaid paths resolve relative to your current working directory (files/<ligaid>/). Run korb from the project root or pass explicit --results / --schedule paths.

Development

# Install with dev tools
uv sync --group dev

# Lint, format & type-check
uv run ruff check korb/ tests/
uv run ruff format korb/ tests/
uv run basedpyright korb

# Run tests
uv run pytest

Project conventions are documented in docs/coding-standard.md.

License

MIT

Metadata

Release files for korb 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for korb 0.3.0
File Size Uploaded Provenance Actions
korb-0.3.0.tar.gz 40.6 kB Without provenance Details for korb-0.3.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for korb 0.3.0
File Interpreter ABI Platform Actions
korb-0.3.0-py3-none-any.whl Python 3 none any Details for korb-0.3.0-py3-none-any.whl

Total release size: 68.3 kB

Release files / korb-0.3.0.tar.gz

Download URL korb-0.3.0.tar.gz
Size 40.6 kB
Tags Source
SHA-256 checksum
How to use checksums
7a3ff54a1c212c4ab5b7a915d6ff4e36137ee911d55780e3e8661129a65af2df
BLAKE2b-256 checksum
How to use checksums
c8d7c96702a805698cf1a1a8ba0c8a5151fbf87277904fd6b80d76105dc4f917
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / korb-0.3.0-py3-none-any.whl

Download URL korb-0.3.0-py3-none-any.whl
Size 27.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3fe7586fa622d869d6009c3817fda5b3f2751b283b55e88edfff459120abdd7d
BLAKE2b-256 checksum
How to use checksums
9cd6ddeeab0858618ffedc97ccad59362cce2c0f31629e3e76c883df8c1163e8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for korb 0.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page