Skip to content

tonhowtf/omniget: Open-source desktop app for downloading, organizing and studying media. Native cross-platform (Tauri + Rust + Svelte). PDF/EPUB reader with focus mode, timestamped notes and spaced repetition. Media downloads via yt-dlp (1.800+ sites). Extensible plugin system.

AI Investigation

OmniGet Repository Investigation

Investigation of tonhowtf/omniget and related plugins. Date: June 18, 2026


Table of Contents

  1. Oldest Commit
  2. Download Tools by Platform
  3. Online Courses Architecture

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)

Instagram

  • Primary: Native Rust extractor
  • Instagram embed API → GraphQL (instagram.com/graphql/query) → direct CDN download via reqwest
  • Fallback: yt-dlp (when embed/GQL fail or CDN returns HTML/login wall)

Reddit

  • 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)

Pinterest

  • Primary: Native Rust extractor
  • HTML scrape of pin page for pinimg.com video/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 (legacy module)
  • 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
  • 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:

  1. Native Rust extractor (site API or page scrape → direct CDN URL)
  2. Direct HTTP download (reqwest)
  3. yt-dlp fallback if native extraction fails
  4. 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:

  1. Instagram
  2. Pinterest
  3. TikTok
  4. Twitter
  5. Twitch (clips only)
  6. Bluesky
  7. Reddit
  8. YouTube
  9. Vimeo
  10. Bilibili
  11. Douyin
  12. Magnet (librqbit)
  13. P2P (custom relay)
  14. Gallery-dl
  15. Direct file
  16. 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) → Tauri plugin_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]

  1. Check plugin is installed/loaded (list_plugins)
  2. get_platforms / get_platform_config — login methods, command names, UI features
  3. Auth per platform (browser webview, cookies, email/password, token, OTP)
  4. List courses via platform *_list_courses
  5. DownloadpluginInvoke("courses", config.commands.download, { courseJson, outputDir })
  6. Progress via Tauri events → download-listener.tsCourseDownloadItem on 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 / YouTubeyt-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 www and enterprise portals
  • Curriculum: Udemy API 2.0 subscriber-curriculum-items (paginated)
  • Per lecture:
  • Direct MP4 from media_sources when available
  • Otherwise HLS → download as .tsFFmpeg 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:
  • .m3u8MediaProcessor::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

  1. Core app handles generic media (YouTube, social, torrents, galleries) via native extractors + yt-dlp/gallery-dl/librqbit
  2. Courses plugin handles education platforms via platform-specific APIs + HLS/yt-dlp/FFmpeg
  3. Study plugin (separate) turns downloaded course folders into a watchable library with progress and notes
  4. README marketing lists many course platforms; current plugin code implements 4: Hotmart, Udemy, Kiwify, Rocketseat

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