Как устроены компоненты Mister Download Manager.
Крейты
| Путь | Крейт | Роль |
|---|---|---|
crates/engine |
mdm-engine |
Загружает один файл по HTTP(S) или FTP(S): зондирование, планировщик сегментов, рабочие соединения, состояние возобновления, ограничения на хост, ограничитель скорости, контрольные суммы, прокси-скрипты |
crates/app |
mdm-app |
Настольное приложение (misterdownloadmanager.exe, egui): список, категории, очереди, планировщик, диалоги, трей, настройки |
crates/cli |
mdm-cli |
Загрузки без графического интерфейса с индикатором прогресса (get, resume) |
crates/mcp |
mdm-mcp |
Сервер MCP (misterdownloadmanager-mcp): список ИИ-помощников, добавление и управление загрузками запущенного приложения через API автоматизации |
crates/nmhost |
mdm-nmhost |
Хост нативных сообщений браузера: принимает перехваченные загрузки от расширения и передает их приложению |
crates/ipc |
mdm-ipc |
Канал единственного экземпляра (локальный сокет, защищенный токеном), папка данных и правила перехвата, общие для приложения и хоста |
crates/tools |
mdm-tools |
Видеостраницы через yt-dlp и ffmpeg (запускаются как отдельные программы) |
crates/crash |
mdm-crash |
Отчеты о сбоях и зависаниях: процесс монитора, минидампы вне процесса, символизированные стеки, текст отчета и журналы выпуска (crash-reports.md) |
crates/torrent |
mdm-torrent |
BitTorrent и magnet-ссылки через librqbit |
crates/labserver |
mdm-labserver |
HTTP Range-сервер с журналом запросов и внедрением ошибок, а также FTP/FTPS-сервер со своими ошибками, для тестов и бенчмарков |
extension/ |
— | Расширение для Chromium (MV3) и Firefox |
docs/ |
— | Руководство пользователя и учебные пособия (открываются через Справка), этот файл, данные бенчмарков |
website/ |
— | Страницы будущего веб-сайта (еще не опубликованы) |
Зависимости направлены внутрь: app, cli, mcp и nmhost используют engine и ipc; движок ничего не знает о пользовательском интерфейсе. Приложение видит движок только через его события (прогресс, снимки таблицы сегментов, завершено, сбой).
Движок
Download
├─ probe() size, resumable?, validators (ETag / Last-Modified), file name
├─ Planner (pure) segment table: when a connection is free, the largest remaining
│ part is split in half (planner.rs, tested by random simulation)
├─ Worker × N one HTTP/1.1 connection each, reused across segments; slow ones
│ are dropped and their part re-split
│ └─ writes at its offset into <name>.mdm.part (created sparse)
├─ HostLimits learns how many connections each server accepts
├─ Limiter (shared) per-download and global token buckets
├─ State segment table saved atomically (craft-atomic) for crash-safe resume
└─ events → channel Progress, Done, Failed
Когда все сегменты загружены, файл .part проверяется на соответствие ожидаемому размеру и переименовывается; дата файла может соответствовать дате сервера.
FTP и FTPS (ftp.rs) проходят через тот же планировщик, рабочие процессы и состояние: сегмент — это REST + RETR в управляющей сессии вместо диапазонного GET, SIZE и MDTM заменяют заголовки, а сессии объединяются для каждой загрузки и повторно используются между сегментами.
Приложение
Одно окно egui, отрисованное по фиксированным пиксельным координатам, плюс один непосредственный видовой экран для каждого диалога. app.rs хранит состояние (загрузки, очереди, настройки, выделение в списке) и преобразует команды меню, панели инструментов, клавиш и IPC в действия. Каждый диалог является собственным модулем и возвращает Outcome (открыт, закрыт, завершен со значением). Вызовы, специфичные для Windows, ограничены win32.rs, а их аналоги для Linux и macOS — unix.rs (начиная с сессии, хоста браузеров, звуков, показать в папке, обработчика сбоев); все остальные файлы — безопасный, переносимый Rust. Шрифты берутся из системы: папка Fonts в Windows, системные шрифты macOS, fontconfig в Linux (theme.rs).
Список загрузок и настройки сохраняются атомарно в %APPDATA%\misterdownloadmanager\ (downloads.json). Хост браузера читает тот же файл для правил перехвата, поэтому изменение в Параметры применяется к следующей перехваченной загрузке.
Интеграция с браузером
page ──► extension ──native messaging──► mdm-nmhost ──ipc──► app
Расширение запрашивает у хоста, какие типы файлов перехватывать, проверяет каждую загрузку на соответствие им и отменяет загрузку браузера только после того, как приложение ее приняло; в противном случае браузер сохраняет ее.
Переводы
Каждый текст, отображаемый пользовательским интерфейсом, проходит через crate::i18n (каталоги craft-i18n, i18n/<locale>.tsv). tools/i18n/extract.py перестраивает i18n/en.tsv из исходного кода, с примечанием для переводчиков к каждому тексту (что это, где отображается, его заполнители).
Тесты и бенчмарки
cargo testзапускает модульные тесты и сквозные загрузки против mdm-labserver с внедренными ошибками (медленные, отброшенные и отклоненные соединения, серверы без диапазонов, изменяющиеся файлы). tools/bench запускает опубликованное сравнение скоростей; его необработанные данные находятся в docs/bench/.
Бесплатно, с открытым исходным кодом, без рекламы, без пробного периода.
Загрузить Mister Download Manager