Mister Download Manager
  1. Главная
  2. Справка
  3. Архитектура

Архитектура

Как устроены компоненты 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