KGet 1.7.0
Added
- Batch download (
--batch urls.txt): download multiple files in parallel from a plain-text file — one URL per line, lines starting with#are skipped as comments. All URLs run concurrently via OS threads.--outputis treated as the destination directory. Per-URL[OK]/[FAIL]status printed; summary at the end. - History tab in macOS app: new "History" sidebar item reads the persistent
history.jsonproduced by the Rust CLI. Shows all-time downloads with date, file size, and status badge. Hover a row to reveal a re-download button that re-queues the URL and switches to the "All Downloads" view. - Drag-and-drop URL into the macOS window: drag any HTTP/HTTPS/FTP/magnet link from Safari, Chrome, or any other app and drop it onto the KGet window. A translucent blue overlay appears while hovering; on drop the URL lands in the input bar ready to start.
- Clipboard monitor in macOS app: the app silently watches the clipboard every 1.5 s. When a new HTTP, HTTPS, FTP, SFTP, or magnet URL is detected, a dismissable banner slides in below the URL bar with a one-click "Download" button. The banner is suppressed if the URL is already in the current download list.
- Custom HTTP headers (
-H "Name: Value"): pass one or more-Hflags to inject arbitrary request headers into both simple and turbo (advanced) downloads. Multiple headers can be stacked. Works in single-URL, batch, and interactive modes. - Speed sparkline in macOS app: each active download row now shows a 44×16 pt miniature real-time speed graph that accumulates the last 30 speed readings. Built with SwiftUI
Path+ gradient fill via the newSparklineViewcomponent. - Auto-extract archives:
kget --extractautomatically runsunzip,tar, or7zon the downloaded file when the extension is.zip,.tar.gz,.tgz,.tar.bz2,.tar.xz, or.7z. Controllable via the new "Auto-extract archives" toggle in the macOS Settings → Downloads tab. - Download scheduling (
--at "HH:MM"): defer a CLI download to a specific local wall-clock time. The process sleeps until the target minute is reached, then starts the download. Works with single-URL, advanced, and batch modes. - yt-dlp integration (
--ytdlp, auto-detected): ifyt-dlp(oryoutube-dl) is installed, URLs from YouTube, Vimeo, Twitch, TikTok, Instagram, Bilibili, and 10+ other platforms are automatically routed through it. Quality preset selectable via--quality best|1080p|720p|480p|360p|audio. macOS app detects video URLs and adds a global default quality picker in Settings → Downloads. - WebDAV support (
webdav://,webdavs://): newWebDavDownloaderadapter insrc/webdav/mod.rsconvertswebdav://→http://andwebdavs://→https://, extracts embedded credentials (webdav://user:pass@host/path), and injects an HTTP BasicAuthorizationheader. Detected automatically from URL scheme; explicit--webdavflag also available. Compatible with Synology, Nextcloud, Nextcloud, Apache WebDAV, and any RFC 4918 server. - Share Extension (
Share > KGet): the macOS Share Extension (macos-app/ShareExtension/) is now complete and functional.ShareViewControllerencodes the shared URL askget://download?url=<encoded>and opens the main app viaNSWorkspace.KGetApp.swiftparses the new format and starts the download. The extension is compiled and embedded intoKGet.app/Contents/PlugIns/KGetShareExtension.appexbybuild-native-macos.sh. - Public library API overhaul (
src/builder.rs,src/error.rs,src/events.rs,src/checksum.rs):- Builder pattern —
kget::builder(url)andkget::batch([...])entry points replace positional args. Fluent methods:.output(),.connections(),.speed_limit(),.proxy(),.proxy_auth(),.sha256/sha512/sha1/md5/blake3(),.verify_from(),.header(),.retry(),.range(),.quiet(). - Typed errors —
KgetErrorenum (Network,Io,ChecksumMismatch,Protocol,Cancelled,NotFound,SidecarError,Other) withFromimpls forreqwest::Error,std::io::Error, andBox<dyn Error>. - Event channel —
.spawn()returns(JoinHandle, Receiver<DownloadEvent>)withProgress { percent, speed_bps, eta_secs },Status,Completed,Errorvariants. - Download metrics —
DownloadResultstruct returned by.download()withpath,bytes_downloaded,avg_speed_bps,duration,connections_used,checksums. - In-memory download —
.download_to_bytes() -> Vec<u8>and.download_to_reader() -> impl Read(no filesystem writes). - HTTP range —
.range(start, end)sendsRange: bytes=start-end; works with in-memory and on-disk paths. - Sidecar checksum verification —
.verify_from(url)downloads and parses GNU (<hash> <file>) and BSD (SHA256 (file) = hash) sidecar files, auto-selects algorithm by hash length. - Multi-algorithm checksums — SHA-256, SHA-512, SHA-1 (via
sha1crate), MD5 (viamd-5crate), BLAKE3 (viablake3crate).ChecksumAlgorithmenum +compute_checksum()insrc/checksum.rs. - Configurable retry —
RetryConfig { max_attempts, backoff: Backoff::Exponential { base_ms, max_ms }, retry_on_status }. Permanent errors (Cancelled,NotFound,ChecksumMismatch) never retry. - Batch with concurrency control —
BatchBuilder::concurrency(n)uses a Rayon thread pool; returnsVec<BatchResult>(one per URL). - Async API —
DownloadBuilder::download_async()andBatchBuilder::download_all_async()behind--features async. Both usetokio::task::spawn_blockingso they never block the executor.
- Builder pattern —
Fixed
AdvancedDownloader::new()panicked on HTTP client build failure — changed return type fromSelftoResult<Self, …>so the error propagates instead of crashing.- Parallel throttle was per-thread — with N connections and a 1 MB/s limit, actual throughput was N×1 MB/s. Replaced per-thread busy-wait with a global
Arc<Mutex<TokenBucket>>shared across all rayon workers; aggregate rate is now bounded correctly. file.set_len(total_size)happened before confirming range support — if the server returned 200 instead of 206, the file was preallocated and then overwritten by a full-stream download producing a corrupted result. Preallocation now only occurs whensupports_rangeis confirmed.- ISO integrity prompt read from stdin in library/automation context —
AdvancedDownloadernow has aResumePolicyfield (Ask/AlwaysResume/AlwaysRestart). Library callers setAlwaysResumeto avoid blocking.Ask(default) preserves the existing interactive behavior. - Wrong ISO MIME type —
"application/x-iso9001"(ISO 9001 quality standard) corrected to"application/x-iso9660-image". verify_file_sha256printed to stdout unconditionally — allprintln!calls removed; messages are now sent only via the optional callback.- Simple downloader retried on 404/403/410 — permanent 4xx errors now fail immediately; only transient 5xx responses and connection errors are retried.
validate_filenamewas insufficient — now also rejects: null bytes (\0), path traversal sequences (..), filenames longer than 255 bytes, and Windows reserved device names (CON, PRN, AUX, NUL, COM1–COM9, LPT1–LPT9) — case-insensitive, with or without extension.sftp/mod.rs:CheckResult::Failuresilently continued — the libssh2 internal error case now returns a hard error and aborts the connection instead of bypassing host-key verification.
Added (continued)
- Homebrew tap (
brew install kget):Formula/kget.rbadded to the repository. Install withbrew tap davimf721/kget && brew install kget. Optional features selectable at install time:--with-gui(egui graphical interface) and--with-torrent(native BitTorrent client).release.shautomatically patches the formula SHA256 after each tag push. - egui GUI — missing features parity with macOS app:
- Speed sparkline per active download (44×16pt, last 30 speed readings, gradient fill).
- Clipboard monitor — polls every 1.5 s; shows dismissable banner with one-click download when a new downloadable URL is detected.
- Drag-and-drop URL — detects
hovered_filesfor visual overlay; reads URL from dropped bytes (browser link drags) or from.url/.weblocshortcut files. - History tab in sidebar — loads
history.jsonfrom disk; shows all-time entries with date, size, status, error, re-download and Copy URL buttons. - WebDAV URL validation —
webdav://andwebdavs://now accepted byvalidate_input(). - Updated protocol chips in empty state — HTTP, FTP, WebDAV, Torrent, yt-dlp.
Changed
- macOS SwiftUI app — complete redesign:
NavigationSplitViewlayout with collapsible sidebar for filter navigation (All / Active / Completed / Failed with live count badges); clean URL input bar with inline Turbo toggle; simplified 3px thin progress bar with shimmer animation replacing the busy multi-segment bar; download rows with status dot, type badges (Turbo / ISO / Torrent), and compact action icons;CleanProgressBarcomponent used throughout;TypeBadgecomponent for download type labels; empty state with protocol chips; material-backed window background. - egui GUI (Linux/Windows) — complete redesign: Apple-inspired system-adaptive color palette (light:
#F2F2F7background, white cards / dark: pure black,#1C1C1Ecards); left sidebar (180px) with Library navigation and per-category count badges; light/dark toggle button in sidebar; URL input card with Apple-style↓icon, inline Turbo/Verify toggles; 3px thin progress bar with shimmer; download cards with status dot, type badges, clean action buttons; proper card shadows; status bar with live stats. - egui theme is now system-adaptive: reads OS dark/light preference at startup; manual override button in sidebar.
Downloads
KGet-1.7.0-macOS-Native.dmgkget-1.7.0-linux-arm64kget-1.7.0-linux-arm64.tar.gzkget-1.7.0-linux-x64kget-1.7.0-linux-x64-statickget-1.7.0-linux-x64-static.tar.gzkget-1.7.0-linux-x64.tar.gzkget-1.7.0-macos-arm64kget-1.7.0-macos-arm64.tar.gzkget-1.7.0-windows-x64.exekget-1.7.0-windows-x64.zipSHA256SUMS-1.7.0.txt: checksums for all release assets.
Install
Homebrew (macOS / Linux):
brew tap davimf721/kget
brew install kgetRust / crates.io:
cargo install Kget --version 1.7.0