How GolinksPRO Download Manager's pieces fit together.
Crates
| Caminho | Crate | Função |
|---|---|---|
crates/engine |
mdm-engine |
Baixa um arquivo via HTTP(S) ou FTP(S): sonda, planejador de segmentos, workers de conexão, estado de retomada, limites por host, limitador de velocidade, somas de verificação, scripts de proxy |
crates/app |
mdm-app |
O aplicativo para desktop (misterdownloadmanager.exe, egui): lista, categorias, filas, agendador, caixas de diálogo, bandeja do sistema, configurações |
crates/cli |
mdm-cli |
Downloads sem interface com progresso (get, resume), vídeos, torrents e os comandos da API de automação: uma biblioteca que o programa do aplicativo executa (misterdownloadmanager --cli …), e misterdownloadmanager-cli, um pequeno iniciador que a executa com os mesmos argumentos, terminal e código de saída |
crates/mcp |
mdm-mcp |
O servidor MCP (misterdownloadmanager-mcp): assistentes de IA podem listar, adicionar e controlar os downloads do aplicativo em execução por meio da API de automação |
crates/remote |
mdm-remote |
O controle remoto (#141): o servidor HTTPS que um telefone ou computador emparelhado na rede local usa (sua página, códigos de emparelhamento, tokens de dispositivo, o certificado autoassinado); cada solicitação se torna um comando da API de automação que o aplicativo responde |
crates/nmhost |
mdm-nmhost |
O host de mensagens nativas do navegador: recebe downloads capturados da extensão e os entrega ao aplicativo |
crates/ipc |
mdm-ipc |
O canal de instância única (um socket local protegido por token), a pasta de dados e as regras de captura compartilhadas pelo aplicativo e pelo host |
crates/debrid |
mdm-debrid |
Contas Debrid (#44): as APIs oficiais dos serviços (Real-Debrid, AllDebrid, Premiumize) transformam um link de host de arquivo em um link direto que o motor de download baixa |
crates/extract |
mdm-extract |
Extração de arquivos compactados (#37): zip, tar, gz e xz em processo; 7z e RAR por meio de um 7-Zip instalado, executado como programa próprio |
crates/geo |
mdm-geo |
Localização do servidor de um download (#140): uma tabela de faixas de IP para país, construída a partir dos dados Lite do DB-IP (tools/geo/build.py), consultada apenas neste computador, e as bandeiras dos países |
crates/tools |
mdm-tools |
Video pages through yt-dlp and ffmpeg, image galleries through gallery-dl (run as separate programs); while a network adapter is chosen, their connections go through a proxy of GDM's on 127.0.0.1 that binds them to it (relay.rs) |
crates/crash |
mdm-crash |
Relatórios de falhas e travamentos: o processo de monitoramento, minidumps fora do processo, pilhas simbolizadas, o texto do relatório e os logs de lançamento (crash-reports.md) |
crates/torrent |
mdm-torrent |
BitTorrent e links magnet por meio de librqbit |
crates/labserver |
mdm-labserver |
Um servidor HTTP Range com um log de requisições e injeção de falhas, e um servidor FTP/FTPS com suas próprias falhas, para testes e benchmarks |
extension/ |
— | A extensão para Chromium (MV3) e Firefox |
docs/ |
— | O guia do usuário e os tutoriais, este arquivo, os dados de benchmark; o site transforma o guia em suas páginas de ajuda, que Ajuda abre |
website/ |
— | As próprias páginas do misterdownloadmanager.com (início, download, recursos, temas, FAQ); tools/website/build.py adiciona a ajuda de docs/ e as notícias do CHANGELOG, em 22 idiomas, e o GitHub Pages as publica |
As dependências apontam para dentro: app, cli, mcp, nmhost e remote usam engine e ipc; o motor não sabe nada da interface do usuário. O aplicativo vê o motor apenas através de seus eventos (progresso, instantâneos da tabela de segmentos, concluído, falhou).
Motor
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
Quando todos os segmentos são concluídos, o arquivo temporário é verificado em relação ao tamanho esperado e renomeado para o nome definitivo; a data do arquivo pode ser definida de acordo com a do servidor.
A primeira solicitação de um download (get) segue redirecionamentos e páginas que levam automaticamente a um arquivo (como a atualização de uma página de espera). Sites cujos links não apontam diretamente para o arquivo têm um módulo em sites/ (Google Drive: sites/gdrive.rs): ele transforma o link no endereço do arquivo, lê as páginas do próprio site (como um formulário de confirmação ou uma página de erro) e identifica os motivos de recusa (Error::Refused). As funções puras são testadas sem rede. O servidor de laboratório simula esse tipo de site usando os nomes reais dos hosts para os testes de ponta a ponta (labserver/src/drive.rs).
FTP e FTPS (ftp.rs) usam o mesmo planejador, os mesmos workers e o mesmo estado: um segmento é REST + RETR em uma sessão de controle, em vez de um GET com intervalo; SIZE e MDTM substituem os cabeçalhos; as sessões são agrupadas por download e reutilizadas entre segmentos.
Aplicativo
Uma janela egui desenhada em coordenadas de pixel fixas, mais uma viewport imediata por caixa de diálogo. app.rs mantém o estado (downloads, filas, configurações, a seleção da lista) e transforma comandos de menu, barra de ferramentas, teclado e IPC em ações. Cada caixa de diálogo é seu próprio módulo e retorna um Outcome (aberto, fechado, concluído com um valor). Chamadas exclusivas do Windows são restritas a win32.rs e suas contrapartes Linux e macOS a unix.rs (começando com a sessão, o host dos navegadores, sons, mostrar na pasta, o manipulador de falhas); todos os outros arquivos são Rust seguro e portátil. As fontes vêm do sistema: pasta Fonts do Windows, fontes do sistema do macOS, fontconfig no Linux (theme.rs). No Windows, texto latino, grego e cirílico é desenhado por DirectWrite no modo GDI-classic (win32.rs, através do hook do rasterizador de glifos do egui), então a forma sugerida de cada letra e a largura de pixel inteiro se unem; outros scripts são formatados e desenhados por egui.
Temas
Cada cor e tamanho com que um controle é desenhado vêm do tema ativo (#45). Um tema é uma paleta clara e escura, métricas, estilos de controle e um estilo de ícone (palette.rs):
- Funções da paleta.
palette.rsdeclara cada função com uma chave estável ("button.hot","list.row","caption"…), uma descrição e os valores claros e escuros da aparência clássica, escritos (a aparência clássica não é derivada). Os pintores compartilhados (winui.rs,chrome.rs,list.rs,scrollbar.rs) os leem através detheme::colors()etheme::metrics()e decidem os estados de cada controle a partir deles; nenhum código de pintura mantém uma cor própria. - Paletas derivadas.
derive.rscria uma paleta completa a partir de algumas sementes (fundo, superfície, texto, destaque…), misturando todas as outras funções em OKLab e mantendo o contraste WCAG (4.5:1 para texto, 3:1 para bordas); o Alto contraste reforça cada borda por cima.native.rssemeia o tema Nativo a partir do destaque e contraste do sistema (configurações do Windows, o portal freedesktop no Linux, o destaque do macOS). - Control styles.
palette::Controlsnames each control's shape (text boxes, check boxes, buttons, progress bars, scroll bars, the focus mark, the title bar); the style themes (Metro, Adwaita, Breeze, Luna, Aero, Aqua) pick theirs, and on Windows GDM then draws the title bar itself (thecaption.*roles). - Arquivos de tema.
themefile.rslê TOML ou JSON da pasta de dadosthemes(um arquivo, ou<id>/theme.tomlcom ícones ao lado). Um arquivo nomeia apenas o que ele muda; o resto vem do tema que eleinherits(um ID de um tema embutido ou outro arquivo, a aparência clássica por padrão), em uma cadeia na qual um ciclo é recusado. Chaves desconhecidas são avisos, não erros. Os temas de estilo embutidos também são esses arquivos, carregados no programa (crates/app/assets/themes). - Conjuntos de ícones.
themeicons.rsdesenha os ícones de um tema (nomeados pelo que são:tb-add-url,cat-music…, SVG ou PNG em 16, 24, 32 e 48 px,-symboliccoloridos na cor do texto) onde a aparência clássica desenha os seus; uma necessidade que o conjunto não tem mantém o ícone clássico.
Onde uma janela coloca seus controles permanece seu layout. O mesmo acontece com os ícones antes dos nomes de arquivo (fileicons.rs): as listas de imagens do sistema do shell do Windows, do Finder do macOS (NSWorkspace), o tema de ícones da área de trabalho do Linux (xdgicons.rs, shared-mime-info e a Especificação de Tema de Ícones). Cada tipo é consultado uma vez por tamanho de pixel, em um thread em segundo plano. Os ícones do Tango (incluídos) são usados até que o ícone do sistema esteja pronto, e onde o sistema não tiver nenhum.
Desenho
The windows are drawn with OpenGL (eframe's glow) or with the system's own graphics API through
eframe's wgpu, with that one backend only: Direct3D 12 on Windows (the default there), Vulkan on
Linux, Metal on macOS (choices there; OpenGL stays their default until real graphics cards have
tried them, #206). View → Draw with picks one, from the next start. One code path does it on
every system (crates/app/src/renderer.rs): when the chosen one can't start, the other one is
tried, so the windows always open. A watched start with the system's API leaves a marker until
its first frame is drawn: a start that ends before it (a crash inside the driver), one whose
first frame doesn't come within 10 seconds (GDM then starts again with OpenGL), or a graphics
card lost twice in 10 minutes is remembered with its reason, which the menu shows.
Exibir → Tamanho da interface (scale.rs, #262) é o fator de zoom do egui sobre a escala própria da tela: cada janela é disposta em pontos, então ela abre muito maior; uma maior que a tela rola.
Dados
A lista de downloads e as configurações são salvas atomicamente na pasta de dados (downloads.json): %APPDATA%\misterdownloadmanager\ no Windows, ~/.local/share/misterdownloadmanager no Linux, ~/Library/Application Support/misterdownloadmanager no macOS, uma pasta data ao lado de uma cópia portátil, ou MDM_DATA_DIR (mdm_ipc::data_dir). O host do navegador lê o mesmo arquivo para as regras de captura, então uma mudança em Opções se aplica ao próximo download capturado.
Sign-in secrets (debrid accounts, Sites Logins' and the proxy's passwords) live in the system's
keychain (secrets.rs, #44): Windows Credential Manager (win32.rs), the Secret Service on Linux
or the macOS keychain (unix.rs). The settings keep a keychain:<service>/<scope>/<key>
reference in their place, written only once the keychain has confirmed the secret; without a
keychain (or with a locked one, never unlocked for GDM) the secret stays in the settings as
before.
A localização do servidor de um download (#140) é o país do endereço ao qual ele se conectou, consultado na tabela de mdm-geo neste computador (countries.rs o nomeia no idioma da interface); o trabalho de lançamento reconstrói a tabela a partir dos dados do mês (tools/geo/build.py --release).
Integração com o navegador
page ──► extension ──native messaging──► mdm-nmhost ──ipc──► app
A extensão pergunta ao host quais tipos de arquivo aceitar, verifica cada download em relação a eles e cancela o download do navegador somente depois que o aplicativo o aceitou; caso contrário, o navegador o mantém, e a extensão diz o porquê.
The host serves only GDM's own extension. Its IDs are in one place, mdm_ipc::extension
(crates/ipc/src/extension.rs): the unpacked copy's (UNPACKED_ID, from the manifest's public
key), the Chrome Web Store's (STORE_ID, signed with the store's own key: pack.ps1 leaves the
manifest's key out of the store's copy), the Firefox add-on's (FIREFOX_ID) and its
addons.mozilla.org page; the Edge and Opera stores' are placeholders, never served, until the
extension is listed there. The host writes each browser's manifest with those IDs, and the app
offers the store's copy (Add to Chrome, Add to Firefox) before the unpacked one.
Controle remoto
phone ──HTTPS (paired token)──► mdm-remote ──ipc::Sink──► app (answer, remote_add)
--headless(headless.rs, #157) executa o mesmo App sem eframe: um loop chama seu tick (o que logic executa a cada quadro) em um egui::Context nu, acordado pelo canal de comando, e nunca seu ui; os comandos são adicionados conforme o controle remoto os adiciona (sem janela). O Dockerfile e o docker/ (Compose, template do Unraid) o executam em um servidor (server.md).
O servidor é executado no tempo de execução Tokio do aplicativo, um ouvinte por endereço de rede local. Cada solicitação é verificada (Host, Origin, token), transformada em um mdm_ipc::Command marcado remote (um campo que nenhuma linha de solicitação pode definir) e entregue ao aplicativo através do mesmo canal da linha de comando; o aplicativo a responde em seu próximo quadro, assim como responde à API de automação. Sua página é incorporada (crates/remote/web) e seus textos vêm dos catálogos do aplicativo (remote.rs).
Traduções
Todo texto que a UI mostra passa por crate::i18n (catálogos craft-i18n, i18n/<locale>.tsv). tools/i18n/extract.py reconstrói i18n/en.tsv da fonte, com uma nota para tradutores em cada texto (o que é, onde aparece, seus placeholders). tools/i18n/translate.py preenche o que os outros catálogos não têm (linhas marcadas #, machine), seguindo o guia de estilo de cada idioma (i18n/style/) e o glossário; uma linha revisada por uma pessoa nunca é substituída, e o CI (reviewed_guard.py) falha em uma mudança que a remove. O site tem seus próprios catálogos (i18n/site/, tools/website/translate_site.py).
Imagens
The help pages' pictures (docs/images/help/) come from one list, tools/shots/shots.toml:
tools/shots/make.py opens each window through GDM's own /show <window> command line in a test
instance off the screen, crops and annotates it from the window's accessibility tree, and writes
lossless WebP; make.py check (CI) keeps the list, the pages and the files in step. The
published ones are taken on GitHub's Windows runner (docs-shots.yml).
Colaboradores
tools/contributors.pylê quem abriu pull requests e issues, e quem comentou, da API pública do GitHub (o mantenedor, Claude e bots são excluídos) para cada lugar que os agradece: a página inicial do site, /contributors.html e cada lançamento na página Notícias (build.py, em cada compilação), as notas de cada lançamento (release.yml, as pessoas ativas desde o lançamento anterior) e o README (python tools/contributors.py readme na preparação de cada lançamento: suas fotos redondas são commitadas em art/contributors/, já que o GitHub não consegue arredondar uma imagem em um README).
Testes e benchmarks
cargo testexecuta testes de unidade e downloads de ponta a ponta contra mdm-labserver com falhas injetadas (conexões lentas, perdidas e recusadas, servidores sem intervalos, arquivos em mudança). tools/bench executa a comparação de velocidade publicada; seus dados brutos estão em docs/bench/.
Gratuito, de código aberto, sem anúncios, sem período de teste.
Download GolinksPRO Download Manager