{"id":29730513,"url":"https://github.com/arvpo/blazer","last_synced_at":"2025-07-25T05:38:08.460Z","repository":{"id":44730142,"uuid":"389993173","full_name":"arvpo/blazer","owner":"arvpo","description":"concurrent file downloader","archived":false,"fork":false,"pushed_at":"2022-03-31T18:39:43.000Z","size":333,"stargazers_count":16,"open_issues_count":23,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-07-10T21:29:02.078Z","etag":null,"topics":["concurrency","downloader","fast","go","golang","wget-alternative"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arvpo.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-07-27T13:26:01.000Z","updated_at":"2023-11-15T22:44:25.000Z","dependencies_parsed_at":"2022-07-20T15:17:53.867Z","dependency_job_id":null,"html_url":"https://github.com/arvpo/blazer","commit_stats":null,"previous_names":["arvyshka/blazer","arvpyrna/blazer","arvpo/blazer"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/arvpo/blazer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arvpo%2Fblazer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arvpo%2Fblazer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arvpo%2Fblazer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arvpo%2Fblazer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arvpo","download_url":"https://codeload.github.com/arvpo/blazer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arvpo%2Fblazer/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266962246,"owners_count":24012994,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-25T02:00:09.625Z","response_time":70,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["concurrency","downloader","fast","go","golang","wget-alternative"],"created_at":"2025-07-25T05:38:06.053Z","updated_at":"2025-07-25T05:38:08.438Z","avatar_url":"https://github.com/arvpo.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"left\"\u003e\n  \u003ca href=\"https://goreportcard.com/report/github.com/arvryna/blazer\"\u003e\n    \u003cimg src=\"https://goreportcard.com/badge/github.com/arvryna/blazer\" /\u003e\n  \u003c/a\u003e\n   \u003ca href=\"http://makeapullrequest.com\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n# Blazer - Concurrent file downloader\n\nA CLI tool to download files from anywhere concurrently using the power of go-routines written using stdlib without any dependencies.\n\n## Features\n- Control thread count\n- Resume from interruption\n- File integrity check - SHA256\n\n## Install\n3 different ways:\n- ``` go get -u github.com/arvryna/blazer ```\n- Download specific version from releases: https://github.com/arvryna/blazer/releases\n- Build from source: \n```\ngit clone git@github.com:arvryna/blazer.git\nmake package\n```\n\n## Usage\n``` blazer -url=example.com/1.mp4 -t=10  ```\n\n## Flags \n```\nblazer -h\nUsage of blazer:\n  -checksum string\n    \tchecksum SHA256(currently supported) to verify file\n  -out string\n    \toutput path to store the downloaded file\n  -t int\n    \tThread count - Number of concurrent downloads (default 10)\n  -url string\n    \tValid URL to download\n  -v\tprints current version of blazer\n\n```\n\n## Benchmarks\n| Name       |Size    | Blazer                  | cURL          | Wget         |\n| -----------|--------| -----------             | ----          | -----        |\n| Debian ISO | 300 MB | 1min 10 sec (25 threads)| 2min 40 sec   | 3 min 10 sec |\n| Windows-10 | 5.4 GB | 20min 52sec (25 threads)| 46min 52 sec  | 40 min 25 sec|\n\n## Demo\n[![asciicast](https://asciinema.org/a/DInboSaUY2Ik9JIOcY4vZHRY9.svg)](https://asciinema.org/a/DInboSaUY2Ik9JIOcY4vZHRY9)\n\n# Usage examples:\n- Integration with node.js server [here](https://github.com/teyalite/client-sever-multithreading-downloader)\n\n# FAQ\n\n## How blazer works ?\nBlazer makes use of [RFC7233](https://datatracker.ietf.org/doc/html/rfc7233) to identify the size of the resource to download, and then initiates partial downloads concurrently with the help of multiple go-routines, once all segements are downloaded, we finally merge all the individual segments into the final file. Number of segments = thread count passed as param to blazer CLI\n\n## How file resumption work ?\n* If download is either interrupted manually or because of any network errors (Timeout RCP(connection reset by peer) - may happen if \"-t\" is a large number than server can handle) then those segments may fail and you may have to restart the download with same URL and thread count for retry to work because, temp folder name is a hash of URL and thread count. \n\n* When download is re-initiated, blazer downloads only the segments that were not successful during the previous attempt. Because a temproary download cache is stored in the current directory of download, which will be used to restart from where it was left off.\n\n* File resumption won't work if the number of threads used is different from the previous attempt.\n\n# Roadmap:\n* Possiblity of adding a config file for ~/.blazerc in home directory, to add new features like storing history of downloads\n* Ability to perform concurrent file uploads\n* Figuring out optimal thread count at runtime by considering various factors like network speed, server bandwidth, etc.,\n* Showing an interactive progress bar with higher accuracy\n* Add more algorithms for file integrity check\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farvpo%2Fblazer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farvpo%2Fblazer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farvpo%2Fblazer/lists"}