1.0.0
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/.idea/
|
||||||
11
LICENSE.txt
Normal file
11
LICENSE.txt
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
Copyright 2022 BarsTiger
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
29
README.md
Normal file
29
README.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# ezzdl
|
||||||
|
Multithreaded downloader with textui colored progress bar
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install ezzdl
|
||||||
|
```
|
||||||
|
|
||||||
|
# Use
|
||||||
|
```python
|
||||||
|
>>> from ezzdl import dl
|
||||||
|
>>> dl(["https://github.com/Cactus-0/cabanchik/raw/master/dist/cabanchik.zip",
|
||||||
|
... "https://github.com/BarsTiger/daun/raw/master/dist/daun.exe",
|
||||||
|
... "https://github.com/BarsTiger/localhost-mc-open/raw/master/localhost_3000_Mc_fusion.exe"],
|
||||||
|
... "folder")
|
||||||
|
[16:20:15] Requesting https://github.com/Cactus-0/cabanchik/raw/master/dist/cabanchik.zip
|
||||||
|
[16:20:15] Requesting https://github.com/BarsTiger/daun/raw/master/dist/daun.exe
|
||||||
|
[16:20:15] Requesting https://github.com/BarsTiger/localhost-mc-open/raw/master/localhost_3000_Mc_fusion.exe
|
||||||
|
[16:20:20] Downloaded D:\Path\To\Folder\folder\daun.exe
|
||||||
|
[16:20:21] Downloaded D:\Path\To\Folder\folder\cabanchik.zip
|
||||||
|
[16:20:32] Downloaded D:\Path\To\Folder\folder\localhost_3000_Mc_fusion.exe
|
||||||
|
cabanchik.zip ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 13.2/13.2 MB • 2.2 MB/s • 0:00:00
|
||||||
|
daun.exe ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 11.4/11.4 MB • 2.2 MB/s • 0:00:00
|
||||||
|
localhost_3000_Mc_fusion.exe ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 37.7/37.7 MB • 2.3 MB/s • 0:00:00
|
||||||
|
```
|
||||||
|
|
||||||
|
# Features
|
||||||
|
- Automatically downloads files from a list of urls and generates its names
|
||||||
|
- Will create a folder with if it doesn't exist
|
||||||
|
- Colored
|
||||||
3
__init__.py
Normal file
3
__init__.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Cool download manager based on rich and its sample code
|
||||||
|
|
||||||
|
from .download import *
|
||||||
70
download.py
Normal file
70
download.py
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
# Idea from rich examples
|
||||||
|
# https://github.com/Textualize/rich/blob/master/examples/downloader.py
|
||||||
|
|
||||||
|
import os.path
|
||||||
|
from concurrent.futures import ThreadPoolExecutor
|
||||||
|
import signal
|
||||||
|
from functools import partial
|
||||||
|
from threading import Event
|
||||||
|
from urllib.request import urlopen
|
||||||
|
from urllib.parse import unquote
|
||||||
|
from time import strftime
|
||||||
|
|
||||||
|
from rich.progress import (
|
||||||
|
BarColumn,
|
||||||
|
DownloadColumn,
|
||||||
|
Progress,
|
||||||
|
TaskID,
|
||||||
|
TextColumn,
|
||||||
|
TimeRemainingColumn,
|
||||||
|
TransferSpeedColumn,
|
||||||
|
)
|
||||||
|
from rich import print
|
||||||
|
|
||||||
|
progress = Progress(
|
||||||
|
TextColumn("[bold blue]{task.fields[filename]}", justify="right"),
|
||||||
|
BarColumn(bar_width=None),
|
||||||
|
"[progress.percentage]{task.percentage:>3.1f}%",
|
||||||
|
"•",
|
||||||
|
DownloadColumn(),
|
||||||
|
"•",
|
||||||
|
TransferSpeedColumn(),
|
||||||
|
"•",
|
||||||
|
TimeRemainingColumn(),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
done_event = Event()
|
||||||
|
|
||||||
|
|
||||||
|
def handle_sigint(signum, frame):
|
||||||
|
done_event.set()
|
||||||
|
|
||||||
|
|
||||||
|
signal.signal(signal.SIGINT, handle_sigint)
|
||||||
|
|
||||||
|
|
||||||
|
def copy_url(task_id: TaskID, url: str, path: str) -> None:
|
||||||
|
print(f"[#1d4b6e][{strftime('%H:%M:%S')}][/] Requesting {url}")
|
||||||
|
response = urlopen(url)
|
||||||
|
progress.update(task_id, total=int(response.info()["Content-length"]))
|
||||||
|
with open(path, "wb") as dest_file:
|
||||||
|
progress.start_task(task_id)
|
||||||
|
for data in iter(partial(response.read, 32768), b""):
|
||||||
|
dest_file.write(data)
|
||||||
|
progress.update(task_id, advance=len(data))
|
||||||
|
if done_event.is_set():
|
||||||
|
return
|
||||||
|
print(f"[#1d4b6e][{strftime('%H:%M:%S')}][/] [#8dc789]Downloaded {os.path.abspath(path)}[/]")
|
||||||
|
|
||||||
|
|
||||||
|
def dl(urls, dest_dir: str):
|
||||||
|
if not os.path.isdir(dest_dir):
|
||||||
|
os.makedirs(dest_dir, exist_ok=True)
|
||||||
|
with progress:
|
||||||
|
with ThreadPoolExecutor(max_workers=len(urls)) as pool:
|
||||||
|
for url in urls:
|
||||||
|
filename = unquote(url.split("/")[-1])
|
||||||
|
dest_path = os.path.join(dest_dir, filename)
|
||||||
|
task_id = progress.add_task("download", filename=filename, start=False)
|
||||||
|
pool.submit(copy_url, task_id, url, dest_path)
|
||||||
2
publish.bat
Normal file
2
publish.bat
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
python setup.py sdist
|
||||||
|
python -m twine upload dist/*
|
||||||
19
setup.py
Normal file
19
setup.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
with open("README.md", "r") as fh:
|
||||||
|
long_description = fh.read()
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name="ezzdl",
|
||||||
|
version="1.0.0",
|
||||||
|
scripts=["download.py"],
|
||||||
|
author="BarsTiger",
|
||||||
|
description="Cool download manager based on rich and its sample code",
|
||||||
|
long_description=long_description,
|
||||||
|
py_modules=["ezzdl"],
|
||||||
|
license='MIT',
|
||||||
|
url='https://github.com/BarsTiger/ezzdl',
|
||||||
|
long_description_content_type="text/markdown",
|
||||||
|
keywords=["threading", "thread", "decorator", "crossplatform"],
|
||||||
|
install_requires=["rich"]
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user