How GolinksPRO Download Manager's pieces fit together.
Crates
| Percorso | Crate | Ruolo |
|---|---|---|
crates/engine |
mdm-engine |
Scarica un file tramite HTTP(S) o FTP(S): sonda, pianificatore dei segmenti, worker di connessione, stato di ripresa, limiti per host, limitatore di velocità, checksum, script proxy |
crates/app |
mdm-app |
L'app desktop (misterdownloadmanager.exe, egui): elenco, categorie, code, Pianificatore, finestre, area di notifica, impostazioni |
crates/cli |
mdm-cli |
Download senza interfaccia utente con avanzamento (get, resume), video, torrent e i comandi dell'API di automazione: una libreria eseguita dal programma dell'app (misterdownloadmanager --cli …), e misterdownloadmanager-cli, un piccolo launcher che la avvia con gli stessi argomenti, terminale e codice di uscita |
crates/mcp |
mdm-mcp |
Il server MCP (misterdownloadmanager-mcp): gli assistenti AI elencano, aggiungono e gestiscono i download dell'app in esecuzione tramite l'API di automazione |
crates/remote |
mdm-remote |
Il controllo remoto (#141): il server HTTPS usato da un telefono o computer associato sulla rete locale (la sua pagina, i codici di associazione, i token del dispositivo, il certificato autofirmato); ogni richiesta diventa un comando API di automazione a cui l'app risponde |
crates/nmhost |
mdm-nmhost |
L'host di messaggistica nativa del browser: riceve i download acquisiti dall'estensione e li passa all'app |
crates/ipc |
mdm-ipc |
Il canale a istanza singola (un socket locale protetto da token), la cartella dei dati e le regole di acquisizione condivise dall'app e dall'host |
crates/debrid |
mdm-debrid |
Account debrid (#44): le API ufficiali dei servizi (Real-Debrid, AllDebrid, Premiumize) trasformano il collegamento di un file hosting in un collegamento diretto che il motore scarica |
crates/extract |
mdm-extract |
Estrazione degli archivi (#37): zip, tar, gz e xz all'interno del processo; 7z e RAR tramite un 7-Zip installato, eseguito come programma separato |
crates/geo |
mdm-geo |
Posizione del server di un download (#140): una tabella di intervalli da IP a paese creata dai dati Lite di DB-IP (tools/geo/build.py), consultata solo su questo computer, e le bandiere dei paesi |
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 |
Rapporti di arresti anomali e blocchi: il processo di monitoraggio, minidump esterni al processo, stack con simboli, il testo del rapporto e i log della release (crash-reports.md) |
crates/torrent |
mdm-torrent |
BitTorrent e link magnet tramite librqbit |
crates/labserver |
mdm-labserver |
Un server HTTP Range con un log delle richieste e iniezione di errori, e un server FTP/FTPS con errori propri, per test e benchmark |
extension/ |
— | L'estensione per Chromium (MV3) e Firefox |
docs/ |
— | La guida per l'utente e i tutorial, questo file e i dati di benchmark; il sito web usa la guida come pagine della guida, aperte da Guida |
website/ |
— | Le pagine di misterdownloadmanager.com (home, download, funzionalità, temi, FAQ); tools/website/build.py aggiunge la guida da docs/ e le notizie dal CHANGELOG, in 22 lingue, e GitHub Pages le pubblica |
Le dipendenze puntano verso l'interno: app, cli, mcp, nmhost e remote usano engine e ipc; il motore non sa nulla dell'interfaccia utente. L'app vede il motore solo attraverso i suoi eventi (avanzamento, istantanee della tabella dei segmenti, completato, non riuscito).
Motore
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 tutti i segmenti sono completati, il file parziale viene verificato rispetto alla dimensione prevista e rinominato nella posizione finale; la data del file può seguire quella del server.
La prima richiesta di un download (get) segue i reindirizzamenti e le pagine che portano direttamente a un file (l'aggiornamento automatico di una pagina di attesa). I siti i cui collegamenti non puntano all'indirizzo del file hanno un modulo in sites/ (Google Drive: sites/gdrive.rs): trasforma il collegamento nell'indirizzo del file, legge le pagine del sito (un modulo di conferma, una pagina di errore) e descrive i rifiuti del sito (Error::Refused), usando funzioni pure testate senza connessione. Per i test end-to-end, il server di laboratorio riproduce un sito simile usando i suoi nomi host reali (labserver/src/drive.rs).
FTP e FTPS (ftp.rs) usano lo stesso pianificatore, gli stessi worker e lo stesso stato: un segmento è REST + RETR su una sessione di controllo invece di un GET con intervalli; SIZE e MDTM sostituiscono le intestazioni, e le sessioni vengono raggruppate per download e riutilizzate tra i segmenti.
App
Una finestra egui disegnata con coordinate fisse in pixel, più una viewport immediata per ogni finestra. app.rs contiene lo stato (download, code, impostazioni, la selezione dell'elenco) e trasforma i comandi di menu, barra degli strumenti, tastiera e IPC in azioni. Ogni finestra è un modulo a sé stante e restituisce un Outcome (aperta, chiusa, completata con un valore). Le chiamate specifiche per Windows sono confinate in win32.rs e le loro controparti per Linux e macOS in unix.rs (avvio della sessione, host dei browser, suoni, mostra nella cartella, gestore degli arresti anomali); ogni altro file è Rust sicuro e portatile. I caratteri provengono dal sistema: la cartella Fonts di Windows, i caratteri di sistema di macOS, fontconfig su Linux (theme.rs). Su Windows, il testo latino, greco e cirillico è disegnato da DirectWrite in modalità GDI-classic (win32.rs, tramite l'hook del rasterizzatore di glifi di egui), in modo che la forma suggerita e la larghezza in pixel interi di ogni lettera si uniscano; gli altri script sono formattati e disegnati da egui.
Temi
Ogni colore e dimensione con cui viene disegnato un controllo deriva dal tema attivo (#45). Un tema è una palette chiara e una scura, metriche, stili dei controlli e uno stile delle icone (palette.rs):
- Ruoli della palette.
palette.rsdichiara ogni ruolo con una chiave stabile ("button.hot","list.row","caption"…), una descrizione e i valori chiari e scuri dell'aspetto classico, scritti esplicitamente (l'aspetto classico non è derivato). I painter condivisi (winui.rs,chrome.rs,list.rs,scrollbar.rs) li leggono tramitetheme::colors()etheme::metrics()e decidono gli stati di ogni controllo da essi; nessun codice di disegno contiene un colore proprio. - Palette derivate.
derive.rscrea un'intera palette da pochi semi (sfondo, superficie, testo, colore principale…), mescolando ogni altro ruolo in OKLab e mantenendo il contrasto WCAG (4,5:1 per il testo, 3:1 per i bordi); Contrasto elevato rafforza inoltre tutti i bordi.native.rsricava i semi del tema Nativo dal colore principale e dal contrasto del sistema (impostazioni di Windows, il portale freedesktop su Linux, il colore principale di 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). - File dei temi.
themefile.rslegge TOML o JSON dalla cartella dei datithemes(un file, o<id>/theme.tomlcon icone accanto). Un file nomina solo ciò che cambia; il resto proviene dal tema cheinherits(l'ID di un tema integrato o un altro file, l'aspetto classico per impostazione predefinita), lungo una catena in cui i cicli vengono rifiutati. Le chiavi sconosciute sono avvisi, non errori. I temi di stile integrati sono anch'essi tali file, inclusi nel programma (crates/app/assets/themes). - Set di icone.
themeicons.rsdisegna le icone di un tema (nominate in base al loro scopo:tb-add-url,cat-music…, SVG o PNG a 16, 24, 32 e 48 px, quelle-symboliccolorate con il colore del testo) dove l'aspetto classico disegna le proprie; dove il set non ha un'icona, resta quella classica.
La disposizione dei controlli di una finestra resta il suo layout. Lo stesso vale per le icone prima dei nomi dei file (fileicons.rs): gli elenchi di immagini di sistema della shell di Windows, quelli del Finder di macOS (NSWorkspace), il tema delle icone del desktop Linux (xdgicons.rs, shared-mime-info e la Icon Theme Specification). Ogni tipo viene cercato una volta per dimensione in pixel, su un thread in background. Le icone di Tango (incluse) vengono usate finché l'icona del sistema non è pronta, e ovunque il sistema non ne abbia.
Disegno
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.
Visualizza → Dimensioni interfaccia (scale.rs, #262) è il fattore di zoom di egui sulla scala del display: ogni finestra è disposta in punti, quindi si apre ingrandita di altrettanto; una finestra più grande dello schermo si può scorrere.
Dati
L'elenco dei download e le impostazioni vengono salvati atomicamente nella cartella dei dati (downloads.json): %APPDATA%\misterdownloadmanager\ su Windows, ~/.local/share/misterdownloadmanager su Linux, ~/Library/Application Support/misterdownloadmanager su macOS, una cartella data accanto a una copia portatile, o MDM_DATA_DIR (mdm_ipc::data_dir). L'host del browser legge lo stesso file per le regole di acquisizione, quindi una modifica in Opzioni si applica al prossimo download acquisito.
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.
La posizione del server di un download (#140) è il paese dell'indirizzo a cui si è connesso, cercato nella tabella di mdm-geo su questo computer (countries.rs lo nomina nella lingua dell'interfaccia); il job di release ricostruisce la tabella dai dati del mese (tools/geo/build.py --release).
Integrazione con i browser
page ──► extension ──native messaging──► mdm-nmhost ──ipc──► app
L'estensione chiede all'host quali tipi di file prendere, verifica ogni download rispetto a essi e annulla il download del browser solo dopo che l'app lo ha accettato; altrimenti il browser lo mantiene e l'estensione ne spiega il 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.
Controllo remoto
phone ──HTTPS (paired token)──► mdm-remote ──ipc::Sink──► app (answer, remote_add)
--headless(headless.rs, #157) esegue lo stesso App senza eframe: un ciclo chiama il suo tick (ciò che logic esegue a ogni fotogramma) su un semplice egui::Context, risvegliato dal canale di comando, e mai il suo ui; i comandi vengono aggiunti come li aggiunge il controllo remoto (nessuna finestra). I Dockerfile e docker/ (Compose, il template di Unraid) lo eseguono su un server (server.md).
Il server viene eseguito sul runtime Tokio dell'app, un listener per ogni indirizzo di rete locale. Ogni richiesta viene controllata (Host, Origin, token), trasformata in un mdm_ipc::Command contrassegnato remote (un campo che nessuna riga di richiesta può impostare) e consegnata all'app tramite lo stesso canale della riga di comando; l'app risponde ad essa al fotogramma successivo, come risponde all'API di automazione. La sua pagina è integrata (crates/remote/web) e i suoi testi provengono dai cataloghi dell'app (remote.rs).
Traduzioni
Ogni testo mostrato dall'interfaccia utente passa attraverso crate::i18n (cataloghi craft-i18n, i18n/<locale>.tsv). tools/i18n/extract.py ricostruisce i18n/en.tsv dalla sorgente, con una nota per i traduttori su ogni testo (cos'è, dove appare, i suoi segnaposto). tools/i18n/translate.py completa ciò che manca agli altri cataloghi (righe contrassegnate #, machine), seguendo la guida di stile di ogni lingua (i18n/style/) e il glossario; una riga revisionata da una persona non viene mai sostituita, e la CI (reviewed_guard.py) blocca una modifica che ne elimini una. Il sito web ha i suoi cataloghi (i18n/site/, tools/website/translate_site.py).
Immagini
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).
Collaboratori
tools/contributors.pylegge chi ha aperto pull request e issue, e chi ha commentato, dall'API pubblica di GitHub (il maintainer, Claude e i bot sono esclusi) per ogni sezione che li ringrazia: la home page del sito web, /contributors.html e ogni release nella pagina Novità (build.py, su ogni build), le note di ogni release (release.yml, le persone attive dalla release precedente) e il README (python tools/contributors.py readme alla preparazione di ogni release: le sue foto rotonde sono incluse nel commit in art/contributors/, poiché GitHub non può arrotondare un'immagine in un README).
Test e benchmark
cargo testesegue test unitari e download end-to-end contro mdm-labserver con errori iniettati (connessioni lente, interrotte e rifiutate, server che non supportano le richieste per intervalli, file che cambiano). tools/bench esegue il confronto di velocità pubblicato; i suoi dati grezzi si trovano in docs/bench/.
Gratuito, open source, senza pubblicità, senza periodo di prova.
Download GolinksPRO Download Manager