🏀 korb
A CLI toolkit for DBB basketball league analysis
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 (notdownload)
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
--ligaidpaths resolve relative to your current working directory (files/<ligaid>/). Runkorbfrom the project root or pass explicit--results/--schedulepaths.
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
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)
| 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)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| 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.