Smartbar
Project description
SmartBar
SmartBar is a powerful, automatic, and extensible progress bar library for Python, built with smart I/O tracking and multi-threading support.
It provides real-time progress, ETA, speed tracking, and works seamlessly with file and network I/O using with blocks — no manual .update() needed.
Features
- Thread-safe and supports concurrent usage
- Supports multiple bars simultaneously
- Automatically wraps
open(),requests.get(), andaiohttp - Tracks both reading and writing operations
- Smart speed and ETA calculation (combines recent + average)
- Fully customizable output and bar style
- Pause, resume, ignore, and manual update support
- Works with
withandasync withcontexts
Installation
pip install smartbar
Basic Example
from smartbar import SmartBar
import requests
with SmartBar("Downloading", length=40) as bar:
r = requests.get("https://example.com/file", stream=True)
for chunk in r.iter_content(1024):
pass # progress is auto-tracked
Custom Style & Live Animation
from smartbar import SmartBar
import requests
import time
BAR1 = "%(DESC). \033[48;5;214m[%(BAR)]\033[0m %(CUR)/%(TOTAL) (%(PERCENT)) | %(SPEED) | ETA: %(ETA)"
BAR2 = "%(DESC).. \033[48;5;214m[%(BAR)]\033[0m %(CUR)/%(TOTAL) (%(PERCENT)) | %(SPEED) | ETA: %(ETA)"
BAR3 = "%(DESC)... \033[48;5;214m[%(BAR)]\033[0m %(CUR)/%(TOTAL) (%(PERCENT)) | %(SPEED) | ETA: %(ETA)"
url = "https://download.samplelib.com/mp4/sample-20s.mp4"
with SmartBar("Downloading", custom_bar_output=BAR1) as bar:
response = requests.get(url, stream=True)
with open("video.mp4", "wb") as f:
stime = time.time()
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
if time.time() - stime > 1:
# Animate bar every second
bar.custom_bar_output = BAR2 if bar.custom_bar_output == BAR1 else (
BAR3 if bar.custom_bar_output == BAR2 else BAR1
)
stime = time.time()
Manual Progress (Disable Auto Tracking)
import time
from smartbar import SmartBar
BAR1 = "%(DESC). {} SEC \033[48;5;214m[%(BAR)]\033[0m %(CUR)/%(TOTAL) (%(PERCENT)) | %(SPEED) | ETA: %(ETA)"
BAR2 = "%(DESC).. {} SEC \033[48;5;214m[%(BAR)]\033[0m %(CUR)/%(TOTAL) (%(PERCENT)) | %(SPEED) | ETA: %(ETA)"
BAR3 = "%(DESC)... {} SEC \033[48;5;214m[%(BAR)]\033[0m %(CUR)/%(TOTAL) (%(PERCENT)) | %(SPEED) | ETA: %(ETA)"
SEC = 10
with SmartBar("Waiting", auto_bar=False, mode="items") as bar:
bar.total = SEC
start = time.time()
last = time.time()
while True:
now = time.time()
if now - last > 1:
elapsed = int(now - start)
seconds_left = max(0, SEC - elapsed)
if bar.custom_bar_output == BAR1:
bar.custom_bar_output = BAR2.format(seconds_left)
elif bar.custom_bar_output == BAR2:
bar.custom_bar_output = BAR3.format(seconds_left)
else:
bar.custom_bar_output = BAR1.format(seconds_left)
bar.add(now - last)
last = now
if bar.current >= bar.total:
break
Async Support
import aiohttp
import asyncio
from smartbar import SmartBar
async def download():
async with SmartBar("Async Download") as bar:
async with aiohttp.ClientSession() as session:
async with session.get("https://example.com") as resp:
async for chunk in resp.content.iter_chunked(1024):
pass # progress auto-tracked
asyncio.run(download())
Pause, Resume & Ignore
from smartbar import SmartBar
import requests
with SmartBar("Download") as bar:
r = requests.get("https://example.com/file", stream=True)
bar.pause()
# Do something non-tracked...
bar.resume()
bar.ignore(r) # disables tracking for this object
Format Variables
You can customize the output bar using these placeholders:
| Placeholder | Meaning |
|---|---|
%(DESC) |
Bar description |
%(BAR) |
The visual progress bar |
%(CUR) |
Current value |
%(TOTAL) |
Total expected value |
%(PERCENT) |
Percentage completed |
%(SPEED) |
Transfer speed |
%(ETA) |
Estimated time remaining |
Example:
"%(BAR)" → [#######.......]
bar_style
with SmartBar("Waiting", auto_bar=False, mode="items", bar_style="simple", style=r"——") as bar:
pass
custom_bar_style
example_style = { # [Foreground, Background]
"BAR": {
"+": [0xFFFFFF, 0x000000],
"-": [0x888888, None],
},
"DESC": [0xAAAAAA, None],
"CUR": [0xAAAAAA, None],
"TOTAL": [0xAAAAAA, None],
"PERCENT": [0xAAAAAA, None],
"SPEED": [0xAAAAAA, None],
"ETA": [0xAAAAAA, None],
}
with SmartBar("Waiting", auto_bar=False, mode="items", custom_bar_style=example_style, style=r"——") as bar:
pass
License
MIT
Author
lama2923
GitHub: https://github.com/lama2923
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file smartbar-1.1.1.tar.gz.
File metadata
- Download URL: smartbar-1.1.1.tar.gz
- Upload date:
- Size: 11.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6139d9db35c871c3d45a5a7df3563c06d91fbd88051afc458f3f0d9d6ed9e3a1
|
|
| MD5 |
4f6e69dad223a9dbd85eb4c4d26b16e8
|
|
| BLAKE2b-256 |
a71631374e61f6540bc20dcd9e5f2b0c8aa88448bd3783f5bff6b5ace7847778
|
File details
Details for the file smartbar-1.1.1-py3-none-any.whl.
File metadata
- Download URL: smartbar-1.1.1-py3-none-any.whl
- Upload date:
- Size: 9.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6a92888436d76a20a3d8c68afdd6f87c93f925d773f90fba0b886b899206b99a
|
|
| MD5 |
96f515d3fc3d295362b382928801982c
|
|
| BLAKE2b-256 |
e4053b789b051b49f862514448032e3367b8976dca5bf7c1f850a7955c68deb6
|