# Downly - Python Download Manager
*A fast and efficient Python download manager.*
(For downloading torrents visit [torrentix](https://github.com/Amir-Hossein-ID/torrentix))
## 🚀 Features
- **Synchronous downloads** for faster performance
- **Resume support** for interrupted downloads (even if the process is killed!)
- **Progress tracking** with a clean CLI output
## 📦 Installation
```sh
pip install downly
```
## 💻 Command Line Usage
```sh
downly https://example.com/file.zip [options]
```
## 🐍 Direct Usage
```python
import asyncio
from downly import Downloader
async def main():
d = Downloader("https://example.com/file.zip")
await d.start()
if __name__ =='__main__':
asyncio.run(main())
```
### Non-Blocking Downloads
```python
async def main():
d = Downloader("https://example.com/file.zip")
download = await d.start(block=False)
await asyncio.sleep(3) # do other stuff while downloading
await download # wait for download to finish
```
### Pause and resume Downloads
```python
async def main():
d = Downloader("https://example.com/file.zip")
await d.start(block=False)
await d.pause()
# do other stuff
await d.start() # resume download
```
### Automatically Saves download state
- Start download: `await d.start()`
- Something Happens and the process terminates:
```sh
7%|██ | 21.2M/296M [00:12<02:36, 1.75MB/s]
Ctrl^C (Keyboard Interrupt)
```
- Start Download Again: `await d.start()`
- Download starts from where it was stopped:
```sh
7%|██ | 21.2M/296M [00:12<02:36, 1.75MB/s]
```
## 🛠 Configuration
You can customize Downly’s settings by passing options:
```python
async def main():
d = Downloader(
"https://example.com/file.zip",
path='myfolder/myfilename.zip',
chunk_size=1024*1024*2, # 2MB
n_connections=16) # 16 synchronous connections
await d.start()
```
## 🔥 Roadmap
- [ ] Proxies Support
- [ ] More control over User agents, number of retries, ...
## 📜 License
MIT License. See [LICENSE](LICENSE) for details.
Raw data
{
"_id": null,
"home_page": null,
"name": "downly",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "download, url, fast, download manager",
"author": null,
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/41/66/a4142a2b6c27d101808ff3b4b4a872bfa7b729f9aae8a3ebf3a0e6994e08/downly-0.2.0.tar.gz",
"platform": null,
"description": "# Downly - Python Download Manager\n\n*A fast and efficient Python download manager.*\n\n(For downloading torrents visit [torrentix](https://github.com/Amir-Hossein-ID/torrentix))\n\n## \ud83d\ude80 Features\n- **Synchronous downloads** for faster performance\n- **Resume support** for interrupted downloads (even if the process is killed!)\n- **Progress tracking** with a clean CLI output\n\n## \ud83d\udce6 Installation\n```sh\npip install downly\n```\n\n## \ud83d\udcbb Command Line Usage\n\n```sh\ndownly https://example.com/file.zip [options]\n```\n\n## \ud83d\udc0d Direct Usage\n\n```python\nimport asyncio\nfrom downly import Downloader\n\nasync def main():\n d = Downloader(\"https://example.com/file.zip\")\n await d.start()\n\nif __name__ =='__main__':\n asyncio.run(main())\n```\n\n### Non-Blocking Downloads\n```python\nasync def main():\n d = Downloader(\"https://example.com/file.zip\")\n download = await d.start(block=False)\n\n await asyncio.sleep(3) # do other stuff while downloading\n\n await download # wait for download to finish\n```\n\n### Pause and resume Downloads\n```python\nasync def main():\n d = Downloader(\"https://example.com/file.zip\")\n await d.start(block=False)\n await d.pause()\n\n # do other stuff\n\n await d.start() # resume download\n```\n\n### Automatically Saves download state\n- Start download: `await d.start()`\n- Something Happens and the process terminates:\n```sh\n 7%|\u2588\u2588 | 21.2M/296M [00:12<02:36, 1.75MB/s]\nCtrl^C (Keyboard Interrupt)\n```\n- Start Download Again: `await d.start()`\n- Download starts from where it was stopped:\n```sh\n 7%|\u2588\u2588 | 21.2M/296M [00:12<02:36, 1.75MB/s]\n```\n\n## \ud83d\udee0 Configuration\nYou can customize Downly\u2019s settings by passing options:\n```python\nasync def main():\n d = Downloader(\n \"https://example.com/file.zip\",\n path='myfolder/myfilename.zip',\n chunk_size=1024*1024*2, # 2MB\n n_connections=16) # 16 synchronous connections \n await d.start()\n```\n\n\n## \ud83d\udd25 Roadmap\n- [ ] Proxies Support\n- [ ] More control over User agents, number of retries, ...\n\n## \ud83d\udcdc License\nMIT License. See [LICENSE](LICENSE) for details.\n",
"bugtrack_url": null,
"license": null,
"summary": "Yet another download manager in python.",
"version": "0.2.0",
"project_urls": {
"Homepage": "https://github.com/Amir-Hossein-ID/Downly"
},
"split_keywords": [
"download",
" url",
" fast",
" download manager"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "e47bc6a225cc49bfc42d7743e91a9f885f4fae643d5b39a29f957b1f1cfdef87",
"md5": "42fa270d03318325a998056ddfc168a0",
"sha256": "0e5700166ed18b22bdaf50d527890c43b41bd04cbfe9d5da0e4dc6bf51e3bfa9"
},
"downloads": -1,
"filename": "downly-0.2.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "42fa270d03318325a998056ddfc168a0",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 6251,
"upload_time": "2025-04-29T15:41:55",
"upload_time_iso_8601": "2025-04-29T15:41:55.645832Z",
"url": "https://files.pythonhosted.org/packages/e4/7b/c6a225cc49bfc42d7743e91a9f885f4fae643d5b39a29f957b1f1cfdef87/downly-0.2.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4166a4142a2b6c27d101808ff3b4b4a872bfa7b729f9aae8a3ebf3a0e6994e08",
"md5": "c728cf4dadaee583f75d8456a08e49ce",
"sha256": "b1e0693e345acabd20e84b7b933d859184bbd4232cfd7f51f87c143fc89bb14f"
},
"downloads": -1,
"filename": "downly-0.2.0.tar.gz",
"has_sig": false,
"md5_digest": "c728cf4dadaee583f75d8456a08e49ce",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 5894,
"upload_time": "2025-04-29T15:41:57",
"upload_time_iso_8601": "2025-04-29T15:41:57.491318Z",
"url": "https://files.pythonhosted.org/packages/41/66/a4142a2b6c27d101808ff3b4b4a872bfa7b729f9aae8a3ebf3a0e6994e08/downly-0.2.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-04-29 15:41:57",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Amir-Hossein-ID",
"github_project": "Downly",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "aiohttp",
"specs": []
},
{
"name": "aiofiles",
"specs": []
},
{
"name": "tqdm",
"specs": []
}
],
"lcname": "downly"
}