Skip to main content

Concurrent HTTP download orchestration with async I/O

Project description

Rheo

PyPI Python License CI codecov

Concurrent HTTP download orchestration with async I/O

What It Is

A Python library for managing multiple asynchronous HTTP downloads. Built on asyncio and aiohttp, it handles concurrency, tracks state, emits events, and lets you monitor progress.

Installation

pip install rheopy

Quick Start

import asyncio
from pathlib import Path
from rheo import DownloadManager
from rheo.domain import FileConfig

async def main():
    files = [
        FileConfig(url="https://example.com/file1.zip", priority=1),
        FileConfig(url="https://example.com/file2.pdf", priority=2),
    ]

    async with DownloadManager(download_dir=Path("./downloads"), max_concurrent=3) as manager:
        await manager.add(files)
        await manager.wait_until_complete()

    print("All downloads complete!")

asyncio.run(main())

Key Features

  • Concurrent downloads with worker pool
  • Priority queue
  • Selective cancellation (cancel individual downloads by ID)
  • Hash validation (MD5, SHA256, SHA512)
  • Retry logic with exponential backoff
  • Real-time speed & ETA tracking
  • File exists handling (skip, overwrite, or error)
  • Event-driven architecture with typed DownloadEventType and Subscription handles (manager.on() returns a handle with unsubscribe())
  • HTTP client abstraction (BaseHttpClient, default AiohttpClient)
  • CLI tool (rheo download)
  • Full type hints

CLI Usage

# Basic download
rheo download https://example.com/file.zip

# With hash verification
rheo download https://example.com/file.zip --hash sha256:abc123...

# Custom output directory
rheo download https://example.com/file.zip -o /path/to/dir

See CLI Reference for complete command documentation.

Documentation

Listen to Events

Subscribe to lifecycle events via manager.on(), which returns a Subscription handle:

from rheo.events import DownloadEventType, DownloadCompletedEvent

def on_completed(event: DownloadCompletedEvent) -> None:
    print(f"done: {event.download_id}")

async with DownloadManager(download_dir=Path("./downloads")) as manager:
    sub = manager.on(DownloadEventType.COMPLETED, on_completed)
    await manager.add([FileConfig(url="https://example.com/file.zip")])
    await manager.wait_until_complete()
    # sub.unsubscribe() when no longer needed

Use "*" to receive all events. Type-hint your handler for autocomplete on event fields.

Examples

Check examples/ for working code:

  • 01_basic_download.py - Simple single file download
  • 02_multiple_with_priority.py - Multiple files with priorities
  • 03_hash_validation.py - File integrity verification
  • 04_progress_display.py - Real-time progress bar with speed/ETA
  • 05_event_logging.py - Lifecycle event debugging
  • 06_batch_summary.py - Batch download with summary report

Project Status

Alpha - Core functionality works, but API may change before 1.0.

  • Python: 3.12+
  • License: MIT

Questions?

Open an issue on GitHub or check the full documentation.

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

rheopy-0.6.0.tar.gz (55.2 kB view details)

Uploaded Source

Built Distribution

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

rheopy-0.6.0-py3-none-any.whl (78.7 kB view details)

Uploaded Python 3

File details

Details for the file rheopy-0.6.0.tar.gz.

File metadata

  • Download URL: rheopy-0.6.0.tar.gz
  • Upload date:
  • Size: 55.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.2.1 CPython/3.14.2 Linux/6.11.0-1018-azure

File hashes

Hashes for rheopy-0.6.0.tar.gz
Algorithm Hash digest
SHA256 306d210a8640be738f17427298cbe9821b9a9773e6d5cc9d633c02e6bbe80be8
MD5 0d85908223d07ca81f58c9b60c1d4722
BLAKE2b-256 566b1f8ae120f58ca36bd6e1c30a50c78300056936d8830ba8516949a8a59f31

See more details on using hashes here.

File details

Details for the file rheopy-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: rheopy-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 78.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.2.1 CPython/3.14.2 Linux/6.11.0-1018-azure

File hashes

Hashes for rheopy-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1c4f0bca982882a0c2582e3c8a50d810d351a377929f27015ccbbe155b218eaa
MD5 590162eaa68f4f352311519252f960f3
BLAKE2b-256 415ecd8d1ff0c6509dfc8cc05ff3fa4b66a2ce97024c6ecb4ba3338fa9b22720

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