AI Investigation
OmniGet Repository Investigation
Investigation of tonhowtf/omniget and related plugins. Date: June 18, 2026
Table of Contents
Oldest Commit
The root commit on tonhowtf/omniget is:
| Field | Value |
|---|---|
| Hash | afe52b8eb17888f4c4bc9652dad87f3c1d6562d9 |
| Author | Tonho \<tonhowtf@gmail.com> |
| Date | February 12, 2026 at 23:25:44 (-0300) |
| Message | add .gitignore file to exclude dependencies, build artifacts, and environment files |
It is the root commit (no parent). It added a single file, .gitignore, with 48 lines.
GitHub link: https://github.com/tonhowtf/omniget/commit/afe52b8eb17888f4c4bc9652dad87f3c1d6562d9
Download Tools by Platform
OmniGet uses a layered downloader architecture: dedicated Rust extractors for major platforms, bundled external CLI tools, and a catch-all fallback. Platforms are tried in registration order in src-tauri/src/lib.rs — first match wins.
Bundled / External Tools
| Tool | Role |
|---|---|
| yt-dlp | Primary engine for YouTube, Vimeo, Douyin, and ~1,800+ generic sites; also fallback for Instagram, Reddit, TikTok, Twitter/X, Pinterest, Bluesky, Twitch |
| FFmpeg | Muxing (Reddit DASH, Bilibili DASH), yt-dlp post-processing, metadata embedding, video ops |
| gallery-dl | Image/gallery sites (auto-downloaded on first use, not listed in Settings deps UI) |
| aria2c | Optional parallel fragment downloader passed to yt-dlp when available |
| librqbit (Rust crate) | Magnet links and .torrent files |
Built-in Rust (reqwest, HlsDownloader, direct_downloader) |
Native HTTP/API extraction and direct CDN downloads |
Per-Platform Breakdown
YouTube
- Tool: yt-dlp only (info + download + playlists)
- Primary: Native Rust extractor
- Instagram embed API → GraphQL (
instagram.com/graphql/query) → direct CDN download viareqwest - Fallback: yt-dlp (when embed/GQL fail or CDN returns HTML/login wall)
- Primary: Native Rust extractor
- Reddit JSON API (
reddit.com/comments/{id}.json) - Direct download from
v.redd.it/i.redd.it/ gallery URLs - FFmpeg muxes separate video+audio streams
- Fallback: yt-dlp
TikTok
- Primary: Native Rust extractor
- Scrapes page JSON (
__UNIVERSAL_DATA_FOR_REHYDRATION__) for video/photo carousel URLs - Direct CDN download
- Fallback: yt-dlp (with
--referer https://www.tiktok.com/)
Twitter / X
- Primary: Native Rust extractor
- X GraphQL API (
api.x.com/graphql/.../TweetDetail) + guest token activation - Direct CDN download from
pbs.twimg.com/video.twimg.com - Fallback: yt-dlp (with cookie headers when available)
- Primary: Native Rust extractor
- HTML scrape of pin page for
pinimg.comvideo/image URLs - Direct download
- Fallback: yt-dlp
Bluesky
- Primary: Native Rust extractor
- AT Protocol API (
public.api.bsky.app/xrpc/app.bsky.feed.getPostThread) - HlsDownloader for video; direct download for images/GIFs
- Fallback: yt-dlp
Twitch
- Clips only (native handler): Twitch GQL API (
gql.twitch.tv/gql) → authenticated clip CDN URLs → direct download - Fallback for clips: yt-dlp
- VODs / live streams: No dedicated handler — routed to generic yt-dlp
Vimeo
- Tool: yt-dlp only
Bilibili
- Metadata / no login: yt-dlp (
legacymodule) - Logged-in downloads: Native Bilibili API engine (official API, DASH stream URLs, FFmpeg mux)
- Fallback: yt-dlp if API engine fails
Douyin (Chinese TikTok)
- Tool: yt-dlp only
Image / Gallery Sites
- Tool: gallery-dl for these hosts:
deviantart.com, pixiv.net, artstation.com, flickr.com, tumblr.com,
danbooru.donmai.us, gelbooru.com, e621.net, rule34.xxx, konachan.com,
yande.re, newgrounds.com, kemono.su/party, coomer.su, fanbox.cc,
weibo.com, 4chan, imgur.com, imgchest.com, nhentai.net,
hentai-foundry.com, baraag.net, wallhaven.cc, subscribestar.adult
Torrents / Magnets
- Tool: librqbit (embedded BitTorrent client, not a separate binary)
P2P Sharing (p2p: URLs)
- Tool: Custom relay protocol (
relay.tonho.wtf:9009) — not yt-dlp or torrent
Direct Media URLs (.mp4, .m3u8, etc.)
- Tool: Built-in direct HTTP / HLS downloader (no yt-dlp)
Everything Else (http/https)
- Tool: generic yt-dlp catch-all (~1,800+ sites per README)
- Uses yt-dlp for extraction; may use aria2c for fragments, FFmpeg for mux/convert, and built-in HLS/direct download when yt-dlp returns direct URLs
Summary Pattern
Most major social platforms follow the same design:
- Native Rust extractor (site API or page scrape → direct CDN URL)
- Direct HTTP download (
reqwest) - yt-dlp fallback if native extraction fails
- FFmpeg when separate video/audio streams need muxing
YouTube, Vimeo, and Douyin skip step 1 and go straight to yt-dlp. Gallery/image boards use gallery-dl. Torrents use librqbit.
Platform Registration Order
From src-tauri/src/lib.rs:
- TikTok
- Twitch (clips only)
- Bluesky
- YouTube
- Vimeo
- Bilibili
- Douyin
- Magnet (librqbit)
- P2P (custom relay)
- Gallery-dl
- Direct file
- Generic yt-dlp (catch-all)
Online Courses Architecture
Online courses are not handled by the core platforms/ downloaders. They run through a separate native plugin that the main app loads, installs, and talks to over IPC.
Architecture Overview
┌─────────────────────────────────────────────────────────────────┐
│ OmniGet core (omniget repo) │
│ │
│ /courses UI (SvelteKit) │
│ ↓ │
│ plugin_command (Tauri IPC) │
│ ↓ │
│ PluginHostImpl → libomniget_plugin_courses (.dylib/.so/.dll) │
│ ↓ │
│ Tauri events: download-progress, udemy-download-progress │
│ ↓ │
│ download-listener.ts → course download store │
│ │
│ /study UI → study plugin (separate) │
└─────────────────────────────────────────────────────────────────┘
Plugin System
Courses live in omniget-plugin-courses — a Rust cdylib loaded at runtime via libloading.
Install & Update
- On first launch,
ensure_default_plugins()pulls from omniget-plugins/plugins.json - Downloads the latest GitHub release ZIP (platform-specific artifact) into:
- macOS:
~/Library/Application Support/wtf.tonho.omniget/plugins/courses/ - Windows:
%APPDATA%\wtf.tonho.omniget\plugins\courses\ - Linux:
$XDG_DATA_HOME/wtf.tonho.omniget/plugins/courses/ - Auto-updates by comparing installed version to GitHub releases
Communication
- Frontend:
pluginInvoke("courses", command, args)→ Tauriplugin_command - Plugin exposes commands like
get_platforms,hotmart_list_courses,start_udemy_course_download - Plugin gets host services via
PluginHost: emit events, read cookies, proxy config, yt-dlp/ffmpeg paths, output dirs
Shared Utilities (main omniget-core)
course_utils.rs provides:
- Save lesson descriptions (HTML/markdown/text)
- Download attachments via HTTP
- Write .complete marker when a course finishes
- is_course_complete() check for resume/skip logic
UI Flow (Main App)
Routes: /courses and /courses/[platform]
- Check plugin is installed/loaded (
list_plugins) get_platforms/get_platform_config— login methods, command names, UI features- Auth per platform (browser webview, cookies, email/password, token, OTP)
- List courses via platform
*_list_courses - Download —
pluginInvoke("courses", config.commands.download, { courseJson, outputDir }) - Progress via Tauri events →
download-listener.ts→CourseDownloadItemon downloads page
The platform page is data-driven: login tabs, search, cancel, and download arg names all come from plugin config.
Implemented Platforms (Plugin v1.0.4)
The plugin registry advertises "35+ platforms", but the current plugin source only registers 4 platforms in get_all_platform_configs():
| Platform | Auth | List API | Download Command |
|---|---|---|---|
| Hotmart | Browser webview → cookies | hotmart_list_courses |
start_course_download |
| Udemy | Browser / cookie paste / OTP | udemy_list_courses |
start_udemy_course_download |
| Kiwify | Email+password (Firebase) or token | kiwify_list_courses |
start_kiwify_course_download |
| Rocketseat | API token | rocketseat_list_courses (+ search) |
start_rocketseat_course_download |
The main app's FALLBACK_PLATFORMS still lists Teachable, Kajabi, Gumroad, Skool, Wondrium, Thinkific — those are UI placeholders if the plugin isn't loaded. Selecting them without plugin support shows "update plugin for platform".
Per-Platform Course Download Mechanics
Hotmart
- Auth: Hotmart SSO cookies + Bearer token → saved to
hotmart_session.json - API: Hotmart Club APIs (
api-club-*,consumer.hotmart.com) for course list, modules, lesson content - Per lesson:
- Native Hotmart media URLs → HLS via
MediaProcessor::download_hls - Embedded PandaVideo → HLS
- Embedded Vimeo / YouTube → yt-dlp
- HTML lesson content parsed for iframe players (
parser.rs) - Attachments (PDFs etc.) via Hotmart attachment API →
Materiais/folder - Optional descriptions and complementary reading links
- Concurrency: 3 lessons in parallel (
CONCURRENT_LESSONS) - Output structure:
CourseName/1. Module/1. Lesson/...
Udemy
- Auth: Udemy OAuth client credentials + session cookies; supports
wwwand enterprise portals - Curriculum: Udemy API 2.0
subscriber-curriculum-items(paginated) - Per lecture:
- Direct MP4 from
media_sourceswhen available - Otherwise HLS → download as
.ts→ FFmpeg remux to.mp4 - Captions: VTT → SRT conversion
- Supplementary assets: PDFs, files via
download_urls - DRM lectures skipped (count reported in
udemy-download-complete) - Events: separate
udemy-download-progress/udemy-download-complete
Kiwify
- Auth: Firebase Identity Toolkit (
verifyPassword) or stored token - API: Kiwify CDN/API for course structure and lesson details
- Per lesson:
.m3u8→MediaProcessor::download_hls- Other URLs → yt-dlp, then direct HTTP fallback
- Lesson HTML descriptions saved via
course_utils - Attachment files from lesson detail
Rocketseat
- Auth: Bearer token to
skylab-api.rocketseat.com.br - Videos: Bunny.net embed URLs (
player.mediadelivery.net) → yt-dlp - Structure: modules/lessons from Skylab API
Course Download Tools
| Tool | Used For |
|---|---|
| Native Rust + reqwest | All platform APIs, auth, listing, most HTTP |
Built-in HLS downloader (MediaProcessor) |
Hotmart native/Panda, Udemy, Kiwify m3u8 |
FFmpeg (via MediaProcessor::remux) |
Udemy HLS → MP4 |
| yt-dlp | Hotmart embedded Vimeo/YouTube, Kiwify fallback, Rocketseat Bunny embeds |
Browser webview (open_auth_webview in main app) |
Hotmart/Udemy login cookie capture |
| chromiumoxide (plugin dependency) | Headless/browser automation where needed |
Courses do not go through the core download queue (PlatformRegistry). They run in the plugin's own tokio::spawn tasks with CancellationToken for cancel.
Post-Download: Study Mode
Playback, resume, notes, and library catalog are handled by a separate study plugin (invoked as pluginInvoke("study", "study:courses:list", ...) etc.). It:
- Scans downloaded folders on disk (
study:rescan) - Indexes courses/lessons in its own DB
- Powers
/study/course/[id]/lesson/[lid]player, progress, timestamped notes
The study plugin isn't in the public omniget-plugins registry JSON (only courses/telegram/convert are listed), but the main app and README treat it as a first-class bundled plugin — likely shipped inside release builds.
Official Plugin Registry
From omniget-plugins/plugins.json:
| Plugin ID | Repo | Purpose |
|---|---|---|
courses |
tonhowtf/omniget-plugin-courses | Course downloads |
telegram |
tonhowtf/omniget-plugin-telegram | Telegram media |
convert |
tonhowtf/omniget-plugin-convert | FFmpeg media conversion |
Key Takeaways
- Core app handles generic media (YouTube, social, torrents, galleries) via native extractors + yt-dlp/gallery-dl/librqbit
- Courses plugin handles education platforms via platform-specific APIs + HLS/yt-dlp/FFmpeg
- Study plugin (separate) turns downloaded course folders into a watchable library with progress and notes
- README marketing lists many course platforms; current plugin code implements 4: Hotmart, Udemy, Kiwify, Rocketseat
Related Repositories
| Repo | Role |
|---|---|
| tonhowtf/omniget | Main desktop app (Tauri + SvelteKit) |
| tonhowtf/omniget-plugin-courses | Course downloader plugin |
| tonhowtf/omniget-plugins | Plugin registry / marketplace metadata |
| tonhowtf/omniget-plugin-telegram | Telegram downloader plugin |
| tonhowtf/omniget-plugin-convert | Media converter plugin |