Skip to main content

A fast, open-source download manager with parallel segments and resume support

Project description

fetchy

A fast, open-source CLI download manager — a free alternative to IDM.

Python 3.10+ License: MIT PyPI

fetchy splits files into parallel segments using HTTP Range Requests, giving you faster downloads and the ability to resume interrupted transfers — right from your terminal.


Features

  • Parallel downloads — splits files into N segments downloaded simultaneously
  • Resume support — interrupted downloads continue from where they left off
  • Live progress — per-segment bars with speed and ETA
  • Retry logic — transient errors are retried automatically with exponential backoff
  • Cross-platform — works on Windows, macOS, and Linux
  • Zero config — sensible defaults, fully configurable via flags

Installation

pip install fetchy

Or install from source:

git clone https://github.com/yourusername/fetchy.git
cd fetchy
pip install -e .

Usage

# Basic download (4 segments by default)
fetchy get https://example.com/largefile.zip

# Save to a specific directory or filename
fetchy get https://example.com/largefile.zip -o ~/Downloads/
fetchy get https://example.com/largefile.zip -o ~/Downloads/myfile.zip

# Use 8 parallel segments
fetchy get https://example.com/largefile.zip -s 8

# Disable resume (start fresh even if a state file exists)
fetchy get https://example.com/largefile.zip --no-resume

# Show version
fetchy --version

Resuming: if you press Ctrl+C during a download, fetchy saves a .fetchy state file next to the output file. Run the same command again to resume automatically.


How it works

  1. fetchy sends a HEAD request to check the file size and whether the server supports Range requests.
  2. If supported, the file is split into N equally-sized byte ranges.
  3. Each segment is downloaded in parallel using async HTTP (httpx).
  4. Segments are written directly to their correct offset in the pre-allocated output file — no temp files to merge.
  5. Progress and speed are tracked per segment and shown in a live Rich display.
  6. On completion the .fetchy state file is deleted automatically.

Options

Flag Default Description
-o, --output . (current dir) Output file or directory
-s, --segments 4 Number of parallel segments
-r, --retries 5 Max retries per segment
--resume / --no-resume --resume Resume interrupted downloads

Development

# Install with dev dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Run a local download test
fetchy get https://speed.hetzner.de/100MB.bin -s 8

Project structure

fetchy/
├── src/
│   └── fetchy/
│       ├── __init__.py      # version
│       ├── cli.py           # Typer CLI entry point
│       ├── downloader.py    # core engine (segments, resume, retry)
│       └── progress.py      # Rich progress display
├── tests/
│   └── test_downloader.py
├── pyproject.toml
└── README.md

Contributing

Contributions are welcome! Please open an issue first to discuss what you'd like to change.

  1. Fork the repo
  2. Create a feature branch (git checkout -b feature/your-feature)
  3. Commit your changes
  4. Open a pull request

License

MIT — see LICENSE.

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

pyfetchy-0.1.0.tar.gz (37.5 MB view details)

Uploaded Source

Built Distribution

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

pyfetchy-0.1.0-py3-none-any.whl (3.8 kB view details)

Uploaded Python 3

File details

Details for the file pyfetchy-0.1.0.tar.gz.

File metadata

  • Download URL: pyfetchy-0.1.0.tar.gz
  • Upload date:
  • Size: 37.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for pyfetchy-0.1.0.tar.gz
Algorithm Hash digest
SHA256 bc07ac4b1a80af89930d57986091b165a5533b992990e7a5f9b2ef444577e242
MD5 27ac14b700b9ac838a193c3c85f20eef
BLAKE2b-256 960ba721189840139f7cb0c33b3a73c5f6b36470ceea995e1c549c4149c43a35

See more details on using hashes here.

File details

Details for the file pyfetchy-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: pyfetchy-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 3.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for pyfetchy-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 aa96e48110dabb434b638ff5c8ff531b805eced5ccc348df9a939c3c83e97021
MD5 210e308cb624d7050303e06d6dd61cf1
BLAKE2b-256 5795fbc84c9b958779134c9b4c1e8e65d73e31840a1388cb43c5ebf1ffb7f901

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