How GolinksPRO Download Manager's pieces fit together.
Crates
| Caminho | Crate | Função |
|---|---|---|
crates/engine |
mdm-engine |
Transfere um ficheiro por HTTP(S) ou FTP(S): sonda, planeador de segmentos, trabalhadores de ligação, estado de retoma, limites por anfitrião, limitador de velocidade, somas de verificação, scripts de proxy |
crates/app |
mdm-app |
A aplicação de ambiente de trabalho (misterdownloadmanager.exe, egui): lista, categorias, filas, agendador, diálogos, tabuleiro, definições |
crates/cli |
mdm-cli |
Transferências sem interface com progresso (get, resume), vídeos, torrents e comandos da API de automação: uma biblioteca executada pelo programa da aplicação (misterdownloadmanager --cli …), e misterdownloadmanager-cli, um pequeno iniciador que executa a biblioteca com os mesmos argumentos, terminal e código de saída |
crates/mcp |
mdm-mcp |
O servidor MCP (misterdownloadmanager-mcp): os assistentes de IA usam a API de automação para listar, adicionar e controlar as transferências da aplicação em execução |
crates/remote |
mdm-remote |
O controlo remoto (#141): o servidor HTTPS que um telemóvel ou computador emparelhado na rede local usa (a sua página, códigos de emparelhamento, tokens de dispositivo, o certificado autoassinado); cada pedido torna-se um comando da API de automação a que a aplicação responde |
crates/nmhost |
mdm-nmhost |
O anfitrião de mensagens nativas do navegador: recebe as transferências capturadas da extensão e as entrega à aplicação |
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 partilhadas pela aplicação e pelo anfitrião |
crates/debrid |
mdm-debrid |
Contas Debrid (#44): as APIs oficiais dos serviços (Real-Debrid, AllDebrid, Premiumize) transformam uma ligação de um anfitrião de ficheiros numa ligação direta que o motor transfere |
crates/extract |
mdm-extract |
Extração de arquivos (#37): zip, tar, gz e xz em processo; 7z e RAR através de um 7-Zip instalado, executado como programa próprio |
crates/geo |
mdm-geo |
Onde está o servidor de uma transferência (#140): uma tabela de intervalos 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 bloqueios: o processo de monitorização, minidumps fora do processo, pilhas simbolizadas, o texto do relatório e os registos de lançamento (crash-reports.md) |
crates/torrent |
mdm-torrent |
BitTorrent e ligações magnéticas através de librqbit |
crates/labserver |
mdm-labserver |
Um servidor HTTP Range com registo de pedidos e injeção de falhas, e um servidor FTP/FTPS com falhas próprias, para testes e testes de desempenho |
extension/ |
— | A extensão para Chromium (MV3) e Firefox |
docs/ |
— | O guia do utilizador e os tutoriais, este ficheiro e os dados dos testes de desempenho; o site usa o guia como páginas de ajuda, que são abertas através de Ajuda |
website/ |
— | As páginas próprias de misterdownloadmanager.com (início, transferência, funcionalidades, temas, FAQ); tools/website/build.py adiciona a ajuda de docs/ e as notícias do CHANGELOG, em 22 idiomas, e o GitHub Pages publica-o |
As dependências apontam para dentro: app, cli, mcp, nmhost e remote usam engine e ipc; o motor não sabe nada da IU. A aplicação vê o motor apenas através dos 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 estão concluídos, o ficheiro temporário é verificado face ao tamanho esperado e colocado no destino com o nome final; a data do ficheiro pode ser a do servidor.
O primeiro pedido de uma transferência (get) segue redirecionamentos e páginas que levam a um ficheiro por si só (como a atualização automática de uma página de espera). Os sites cujas ligações não correspondem ao endereço do ficheiro têm um módulo em sites/ (Google Drive: sites/gdrive.rs): esse módulo transforma a ligação no endereço do ficheiro, lê as páginas do próprio site (um formulário de confirmação, uma página de erro) e identifica os motivos de recusa (Error::Refused), recorrendo a funções puras testadas sem ligação à rede. O servidor de laboratório simula esse site nos nomes de anfitrião reais para os testes de ponta a ponta (labserver/src/drive.rs).
FTP e FTPS (ftp.rs) usam o mesmo planeador, processos de ligação e estado: um segmento é REST + RETR numa sessão de controlo, em vez de um GET com intervalo; SIZE e MDTM substituem os cabeçalhos, e as sessões são agrupadas por transferência e reutilizadas entre segmentos.
Aplicação
Uma janela egui desenhada em coordenadas de píxeis fixas, mais uma área de visualização imediata por cada caixa de diálogo. app.rs guarda o estado (transferências, filas, definições, a seleção da lista) e transforma os comandos de menu, barra de ferramentas, teclado e IPC em ações. Cada caixa de diálogo é o seu próprio módulo e devolve um Outcome (aberto, fechado, concluído com um valor). As chamadas exclusivas do Windows estão confinadas a win32.rs e as suas contrapartes para Linux e macOS a unix.rs (a iniciar pela sessão, o anfitrião dos navegadores, sons, mostrar na pasta, o gestor de falhas); todos os outros ficheiros são Rust seguro e portátil. As fontes vêm do sistema: a pasta Fontes do Windows, as fontes de sistema do macOS, fontconfig no Linux (theme.rs). No Windows, o texto latino, grego e cirílico é desenhado pelo DirectWrite no modo GDI-clássico (win32.rs, através do gancho do rasterizador de glifos do egui), para que a forma sugerida e a largura de píxel inteiro de cada letra se unam; outros scripts são formatados e desenhados pelo egui.
Temas
Cada cor e tamanho com que um controlo é desenhado provém do tema ativo (#45). Um tema é uma paleta clara e escura, métricas, estilos de controlo 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 claro e escuro do aspeto clássico, escritos por extenso (o aspeto clássico não é derivado). Os pintores partilhados (winui.rs,chrome.rs,list.rs,scrollbar.rs) leem-nos através detheme::colors()etheme::metrics()e decidem os estados de cada controlo a partir deles; nenhum código de pintura conté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 arestas); o Alto contraste reforça cada aresta por cima.native.rssemeia o tema Nativo a partir do destaque e contraste do sistema (definiçõ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). - Ficheiros de tema.
themefile.rslê TOML ou JSON da pasta de dadosthemes(um ficheiro, ou<id>/theme.tomlcom ícones ao lado). Um ficheiro nomeia apenas o que altera; o resto vem do tema queinherits(um ID incorporado ou outro ficheiro, o aspeto clássico por predefinição), numa cadeia em que um ciclo é recusado. Chaves desconhecidas são avisos, não erros. Os temas de estilo incorporados também são esses ficheiros, transportados no programa (crates/app/assets/themes). - Conjuntos de ícones.
themeicons.rsdesenha os ícones de um tema (nomeados pelo que servem:tb-add-url,cat-music…, SVG ou PNG a 16, 24, 32 e 48 px,-symbolictintados na cor do texto) onde o aspeto clássico desenha os seus; uma necessidade que o conjunto não tem mantém o ícone clássico.
Onde uma janela coloca os seus controlos mantém o seu esquema. O mesmo acontece com os ícones antes dos nomes dos ficheiros (fileicons.rs): as listas de imagens do sistema da shell do Windows, do Finder do macOS (NSWorkspace), o tema de ícones do ambiente de trabalho Linux (xdgicons.rs, shared-mime-info e a Especificação de Tema de Ícones). Cada tipo é procurado uma vez por tamanho de pixel, num processo 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 tem 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.
Ver → Tamanho da interface (scale.rs, #262) é o fator de zoom do egui sobre a escala do próprio ecrã: cada janela é disposta em pontos, por isso abre muito maior; uma maior que o ecrã rola.
Dados
A lista de transferências e as definições são guardadas 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 anfitrião do navegador lê o mesmo ficheiro para as regras de captura, por isso uma alteração em Opções aplica-se à próxima transferência capturada.
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 uma transferência (#140) é o país do endereço ao qual se ligou, procurado na tabela de mdm-geo neste computador (countries.rs nomeia-o no idioma da interface); a tarefa 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 anfitrião que tipos de ficheiro deve aceitar, verifica cada transferência em relação a eles e cancela a transferência do navegador apenas depois de a aplicação a ter aceite; caso contrário, o navegador mantém-na e a extensão explica o motivo.
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.
Controlo remoto
phone ──HTTPS (paired token)──► mdm-remote ──ipc::Sink──► app (answer, remote_add)
--headless(headless.rs, #157) executa o mesmo App sem eframe: um ciclo chama o seu tick (o que logic executa em cada fotograma) num egui::Context simples, ativado pelo canal de comando, e nunca o seu ui; os comandos são adicionados à medida que o controlo remoto os adiciona (sem janela). O Dockerfile e o docker/ (Compose, modelo do Unraid) executam-no num servidor (server.md).
O servidor é executado no runtime Tokio da aplicação, um ouvinte por endereço de rede local. Cada pedido é verificado (Host, Origin, token), transformado num mdm_ipc::Command marcado remote (um campo que nenhuma linha de pedido pode definir) e entregue à aplicação através do mesmo canal que o da linha de comandos; a aplicação responde-lhe no seu próximo frame, tal como responde à API de automação. A sua página é incorporada (crates/remote/web) e os seus textos vêm dos catálogos da aplicação (remote.rs).
Traduções
Cada texto que a IU mostra passa por crate::i18n (catálogos craft-i18n, i18n/<locale>.tsv). tools/i18n/extract.py reconstrói i18n/en.tsv a partir da fonte, com uma nota para os tradutores em cada texto (o que é, onde aparece, os seus marcadores de posição). tools/i18n/translate.py preenche o que falta nos outros catálogos (linhas marcadas #, machine), seguindo o guia de estilo de cada idioma (i18n/style/) e o glossário; uma linha revista por uma pessoa nunca é substituída, e o CI (reviewed_guard.py) falha uma alteração que a elimine. O site tem os 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).
Contribuidores
tools/contributors.pylê quem abriu pedidos de pull e problemas, e quem comentou, a partir da API pública do GitHub (o mantenedor, Claude e bots excluídos) para cada local que lhes 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: as suas fotos redondas são submetidas em art/contributors/, uma vez que o GitHub não consegue arredondar uma imagem num README).
Testes e benchmarks
cargo testexecuta testes unitários e transferências de ponta a ponta contra mdm-labserver com falhas simuladas (ligações lentas, interrompidas e recusadas, servidores sem suporte para intervalos, ficheiros que mudam). tools/bench executa a comparação de velocidade publicada; os dados em bruto estão em docs/bench/.
Gratuito, de código aberto, sem anúncios, sem período de avaliação.
Download GolinksPRO Download Manager