Terminal Media Downloader, Audio Mastering & Transcoding Workstation
Haustus is a high-throughput CLI and TUI media workstation supporting 11 Dedicated Platforms and Universal Ingestion for 1000+ Websites (via yt-dlp) and direct media streams. Built with Python, yt-dlp, Rich, Mutagen, and imageio-ffmpeg.
Quick Start
1. Install
pip install haustus
Or from source:
git clone https://github.com/Sonata-Of-Death/Haustus.git
cd Haustus
pip install -e .
2. Run
# Interactive Arrow-Key Menu
haustus
# Or download any media link directly in best quality
haustus "https://www.youtube.com/watch?v=..."
Architecture Overview
┌─────────────────────────────────────────────────────────────────────────────┐
│ USER INTERFACE (TUI / CLI) │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ Interactive Arrow-Key Menu (Single Enter, Instant [Esc] Return) │ │
│ │ Fast Terminal Navigation, Multi-Profile Sessions & Preset Defaults │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────┬──────────────────────────────────────┘
│
┌──────────────────────────────────────▼──────────────────────────────────────┐
│ CORE INGESTION & NETWORK RESILIENCE │
│ ┌──────────────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │
│ │ Multi-Profile Sessions │ │ Adaptive Network │ │ Session Ledger │ │
│ │ Isolated Temp Storage │ │ Full Jitter + CB │ │ Atomic Checkpoint │ │
│ └──────────────────────────┘ └───────────────────┘ └───────────────────┘ │
│ ┌────────────────────────────────────────────────────────────────────────┐ │
│ │ High-Throughput Engine: 16-Stream aria2c + Token-Bucket Pacing │ │
│ └────────────────────────────────────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────────────────────────────────────┐ │
│ │ Rich Live Dashboard: Real-time Speed, ETA, Percentage, Size │ │
│ └────────────────────────────────────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────────────────────────────────────┐ │
│ │ Smart History & Missing File Ledger (Atomic Verification) │ │
│ └────────────────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────┬──────────────────────────────────────┘
│
┌──────────────────────────────────────▼──────────────────────────────────────┐
│ STUDIO MEDIA POST-PROCESSING │
│ ┌──────────────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │
│ │ GPU Video Transcoding │ │ EBU R128 Audio │ │ Subtitle Embedder │ │
│ │ NVENC / VAAPI / SVT-AV1 │ │ Two-Pass -16 LUFS │ │ Soft Mux (.srt) │ │
│ └──────────────────────────┘ └───────────────────┘ └───────────────────┘ │
│ ┌────────────────────────────────────────────────────────────────────────┐ │
│ │ Mutagen ID3v2.4 & MP4 Cover Art / Metadata Atom Injection │ │
│ └────────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
Supported Platforms
| Platform | Supported Media | Requires Cookies? |
|---|---|---|
| Full HD Reels, Photo Carousels in subfolders, 24h Stories, Story Highlights, Saved Posts, Reposts | Optional (Required for Stories & Saved) | |
| TikTok | Watermark-free HD Videos, Photo Slideshow albums, Original Music, Saved / Favorites, Collections, Reposts | Optional (Required for Favorites) |
| YouTube | Up to 4K/1080p with audio, Shorts, Interactive Playlist picker (Watch Later, Liked), Full Channels | Optional (Age-gate / Private) |
| X (Twitter) | Full HD media tweets, video broadcasts, photo sets, Bookmarks, Retweets, Archive ingestion (bookmarks.json) |
Optional (Required for Bookmarks) |
| SoundCloud | Audio tracks, sets, artist discographies, user liked tracks with cover art embedding | Optional (Required for Liked) |
| DASH video with merged audio, multi-image galleries, Subreddit feeds (Hot/Top/New), Saved / Upvoted | Optional (Required for Saved / Upvoted) | |
Full HD/SD Reels, Public video posts, Watch URLs, short links (fb.watch), Saved collections |
Optional (Required for Saved) | |
Video pins, original uncompressed images (/originals/ CDN pattern) with metadata JSON, full Boards |
Optional (Required for Saved Boards) | |
| Twitch | Stream clips (clips.twitch.tv), past broadcasts (VODs), channel archives, audio extraction |
Optional (Required for Sub-only VODs) |
| Threads | Single post videos, original high-resolution photo carousels with metadata.json, creator profiles |
Optional |
| Spotify | Track/Album/Playlist metadata & cover art resolution with high-fidelity audio discovery | Optional (Session via sp_dc) |
| 1000+ Universal Sites | Vimeo, Bilibili, Dailymotion, Loom, Streamable, Rumble, Bandcamp, and direct media URLs | No |
System Requirements
- Python:
>= 3.10 - FFmpeg: Handled automatically via
imageio-ffmpegor discovered from system PATH. - aria2c (Optional): Required only when passing the
--aria2multi-stream acceleration flag. Install via your package manager:- Windows:
winget install aria2orchoco install aria2 - macOS:
brew install aria2 - Linux:
sudo apt install aria2
- Windows:
Usage
1. Interactive Menu (TUI)
Run without arguments to launch the interactive arrow-key interface:
haustus
- Arrow Keys (
Up/Down) orW/S: Move selection. - Single Enter: Confirm selection.
- Number Keys (
0-9): Quick jump to numbered item. [H]or[?]: Open / close keyboard shortcuts help overlay.[Esc]: Return to previous menu or abort prompt.
2. Common CLI Commands
Single Media Downloads
# 1080p Video
haustus "https://www.youtube.com/watch?v=..." -q 1080
# 320 kbps Audiophile MP3 with Embedded Cover Art & ID3 Tags
haustus "https://www.youtube.com/watch?v=..." -a -aq 320 -af mp3 --embed-metadata
# Specific Clip Range (HH:MM:SS format)
haustus "https://www.youtube.com/watch?v=..." --clip "01:20-03:45"
# Bandwidth Speed Limit Capped at 2 MB/s
haustus "https://www.youtube.com/watch?v=..." --speed-limit 2M
Batch & Smart Filters
# Batch download from text file (one URL per line)
haustus -f links.txt
# Cap playlist download at first 20 items uploaded in the last 7 days
haustus -p "https://www.youtube.com/playlist?list=..." --count-limit 20 --date-after now-7days
# Shorts only under 60 seconds
haustus -u "@channel" --shorts-only
# Specific items in a playlist
haustus -p "https://www.youtube.com/playlist?list=..." --items "1,3,5-10"
Authenticated Collections
# Instagram Saved Posts & Stories
haustus --saved
haustus --instagram-stories "@creator"
# TikTok Saved Favorites & Reposts
haustus --tiktok-saved
haustus --tiktok-reposts
# X (Twitter) Bookmarks
haustus --x-bookmarks
# Reddit Subreddit Feed Batch
haustus --reddit-subreddit "EarthPorn" --reddit-sort top --reddit-timeframe week
# Spotify Playlist to 320k Tagged MP3s
haustus --spotify-playlist "https://open.spotify.com/playlist/..." --audio-quality 320
Command Line Arguments Reference
| Flag | Long Flag | Description | Default |
|---|---|---|---|
urls |
Positional URL(s) from 11 platforms or 1000+ universal sites | None | |
-f |
--file |
Path to text file containing URLs (one per line) | None |
-u |
--user |
Username or profile/channel URL | None |
-p |
--playlist |
YouTube playlist URL | None |
-q |
--quality |
Target video resolution (best, 2160, 1440, 1080, 720, 480, 360) |
best |
-a |
--audio |
Enable Audio-Only extraction mode | False |
-aq |
--audio-quality |
Audio bitrate (320, 256, 192, 128, 64, best) |
192 |
-af |
--audio-format |
Audio container format (mp3, m4a, flac, wav, opus) |
mp3 |
-o |
--output |
Destination directory for downloaded media | ~/Desktop/HaustusDownloads |
-c |
--cookies |
Path to Netscape cookies.txt or raw cookie token string |
None |
--clip |
Download specific time range only (e.g. 01:20-03:45) |
None | |
--subtitles |
Download and embed subtitles (.srt / .vtt) into media container | False |
|
--speed-limit |
Download bandwidth rate limit (e.g. 2M, 5M, 10M, 500K) |
None | |
--embed-metadata |
Force embedding thumbnail cover art and metadata tags | None | |
--no-embed-metadata |
Force disabling embedding cover art and metadata tags | None | |
--count-limit |
Cap download batch at maximum number of items | None | |
--date-after |
Filter items uploaded after date (YYYYMMDD or now-7days) |
None | |
--shorts-only |
Download short videos only (<= 60s) |
False |
|
--items |
Specify playlist item indices or range (e.g. 1,3,5-10) |
None | |
--archive |
Force checking download history archive | None | |
--no-archive |
Force ignoring download history archive | None | |
--saved |
Download all saved posts from authenticated Instagram account | False |
|
--instagram-stories |
Download active 24h Instagram Stories for username | None | |
--instagram-highlights |
Download Instagram Story Highlights for username | None | |
--instagram-reposts |
Download reposted posts and reels from Instagram account | False |
|
--instagram-json |
Path to Instagram data export JSON file | None | |
--tiktok-saved |
Download favorite videos from authenticated TikTok account | False |
|
--tiktok-reposts |
Download reposted videos from authenticated TikTok account | False |
|
--tiktok-cookies |
Netscape cookies file or raw TikTok sessionid | None | |
--tiktok-collection |
URL of TikTok collection to batch download | None | |
--tiktok-json |
Path to TikTok user_data.json data export file | None | |
--x-bookmarks |
Download saved bookmarks from authenticated X account | False |
|
--x-reposts |
Download reposted tweets/media from authenticated X account | False |
|
--x-cookies |
Netscape cookies file or raw X auth_token | None | |
--x-json |
Path to X archive JSON or JS file (bookmarks.json, tweets.json) | None | |
--soundcloud-likes |
Download liked tracks for SoundCloud username or URL | None | |
--soundcloud-cookies |
Netscape cookies file or raw SoundCloud oauth_token | None | |
--reddit-saved |
Download saved posts from authenticated Reddit account | False |
|
--reddit-upvoted |
Download upvoted posts from authenticated Reddit account | False |
|
--reddit-subreddit |
Subreddit name or URL to download in bulk | None | |
--reddit-sort |
Subreddit sorting order (hot, new, top, rising) |
hot |
|
--reddit-timeframe |
Subreddit time window (hour, day, week, month, year, all) |
day |
|
--reddit-cookies |
Netscape cookies file or raw Reddit session token | None | |
--facebook-saved |
Download saved videos from authenticated Facebook account | False |
|
--facebook-cookies |
Netscape cookies file or raw Facebook c_user/xs cookie string | None | |
--pinterest-board |
URL of Pinterest board to batch download | None | |
--pinterest-saved |
Download saved pins and boards from authenticated Pinterest account | False |
|
--pinterest-cookies |
Netscape cookies file or raw Pinterest _pinterest_sess token | None | |
--twitch-channel |
Twitch streamer/channel URL to batch download clips/VODs | None | |
--twitch-cookies |
Netscape cookies file or raw auth-token for Twitch | None | |
--threads-profile |
Threads username or profile URL to batch download | None | |
--threads-cookies |
Netscape cookies file or raw sessionid for Threads | None | |
--spotify-playlist |
Spotify playlist, album, or collection URL to batch download | None | |
--spotify-cookies |
Netscape cookies file or raw sp_dc token for Spotify | None | |
--aria2 |
Enable 16-connection segmented multi-stream download via aria2c | False |
|
--normalize |
Enable two-pass EBU R128 (-16 LUFS) loudness normalization | False |
|
--transcode |
Enable GPU-accelerated video transcoding (NVENC/VAAPI/AV1) | False |
|
--parallel |
Enable high-throughput multi-threaded parallel batch execution | False |
|
--delay |
Polite delay in seconds between download requests | 2.0 |
|
--proxy |
HTTP/HTTPS/SOCKS5 proxy URI (e.g. http://127.0.0.1:7890) |
None |
Troubleshooting
- HTTP 429 Too Many Requests: The platform is rate-limiting your IP. Use
--delay 5.0to throttle requests, or configure a proxy with--proxy. - Session Expired / Authentication Failed: Cookies expire over time. Open
haustus-> Settings -> Accounts and re-enter your updated session token or Netscape cookies file. - aria2c executable not found: Ensure
aria2cis installed and reachable on your system PATH before using--aria2. - Unclosed Terminal Buffers on Windows: Haustus automatically configures UTF-8 and ANSI escape sequence processing on Windows terminals. If running in legacy cmd.exe, prefer Windows Terminal or PowerShell 7+.
Testing
The test suite covers configuration persistence, cookie isolation, network resilience backoff, format extraction, platform dispatchers, and UI components:
python -m unittest discover -s tests
Disclaimer & Legal Notice
Haustus is designed and intended strictly for personal, educational, and backup archiving purposes. Users are solely responsible for ensuring that their media downloads comply with the Terms of Service of each respective platform and respect the copyrights and intellectual property rights of content creators. The developers assume no liability for misuse.
License
Released under the MIT License. Copyright (c) 2026 Adham Mohamed (Sonata-Of-Death).
Third-Party Notice: Haustus utilizes open-source libraries including
yt-dlp(Unlicense),requests(Apache-2.0),rich(MIT), andimageio-ffmpeg(BSD-2-Clause).
mutagenis licensed under GPL-2.0-or-later; it is installed separately from PyPI as an external dependency and is not bundled or distributed with this source code repository.imageio-ffmpegdownloads or uses an external FFmpeg binary build which may be compiled under GPL (or LGPL depending on enabled codecs and build flags), which is also retrieved independently at runtime and is not distributed as part of this codebase.
Metadata
Release files for haustus 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| haustus-1.0.0.tar.gz | 159.3 kB | Without provenance | Details for haustus-1.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| haustus-1.0.0-py3-none-any.whl | Python 3 | none | any | Details for haustus-1.0.0-py3-none-any.whl |
Total release size: 315.4 kB
Release files / haustus-1.0.0.tar.gz
| Download URL | haustus-1.0.0.tar.gz |
|---|---|
| Size | 159.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c44563ec7fe0ed645c88e61cf59af6ae66f63bee8cf89cf2dcdb6f828e553ea1
|
|
BLAKE2b-256 checksum How to use checksums |
f80b0aa76bf7ad7e1c43297a194947bfb2327bb699d53d1fab931c1c5d8c0588
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.15.1
|
Release files / haustus-1.0.0-py3-none-any.whl
| Download URL | haustus-1.0.0-py3-none-any.whl |
|---|---|
| Size | 156.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
415e1bc2b1ce0a75364679691a7be781331dc30250727886daec8e035eeee09e
|
|
BLAKE2b-256 checksum How to use checksums |
2f6c14894273c7d1550e8c32100c1409a2630add39add44cedf4ad83295c6b19
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.15.1
|
Security for haustus 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.