GolinksPRO Download Manager
  1. Início
  2. Ajuda
  3. Arquitetura

Arquitetura

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.rs declara 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 de theme::colors() e theme::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.rs cria 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.rs semeia 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::Controls names 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 (the caption.* roles).
  • Arquivos de tema. themefile.rs lê TOML ou JSON da pasta de dados themes (um arquivo, ou <id>/theme.toml com ícones ao lado). Um arquivo nomeia apenas o que ele muda; o resto vem do tema que ele inherits (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.rs desenha 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, -symbolic coloridos 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