GolinksPRO Download Manager
  1. Home
  2. Help
  3. Architectuur

Architectuur

How GolinksPRO Download Manager's pieces fit together.

Crates

Pad Crate Rol
crates/engine mdm-engine Downloadt één bestand via HTTP(S) of FTP(S): probe, segmentplanner, verbindingswerkers, hervattingsstatus, limieten per host, snelheidsbegrenzer, checksums, proxyscripts
crates/app mdm-app De desktop-app (misterdownloadmanager.exe, egui): lijst, categorieën, wachtrijen, planner, dialoogvensters, systeemvak, instellingen
crates/cli mdm-cli Downloads zonder grafische interface met voortgang (get, resume), video's, torrents en opdrachten van de automatiserings-API: een bibliotheek die het programma van de app uitvoert (misterdownloadmanager --cli …), en misterdownloadmanager-cli, een kleine starter die de bibliotheek start met dezelfde argumenten, terminal en afsluitcode
crates/mcp mdm-mcp De MCP-server (misterdownloadmanager-mcp): AI-assistenten kunnen via de automatiserings-API de downloads in de actieve app weergeven, toevoegen en beheren
crates/remote mdm-remote De afstandsbediening (#141): de HTTPS-server die een gekoppelde telefoon of computer op het lokale netwerk gebruikt (de pagina, koppelingscodes, apparaattokens, het zelfondertekende certificaat); elk verzoek wordt een automatiserings-API-opdracht die de app beantwoordt
crates/nmhost mdm-nmhost De native messaging-host van de browser: ontvangt vastgelegde downloads van de extensie en geeft ze door aan de app
crates/ipc mdm-ipc Het kanaal voor één instantie (een met een token beveiligde lokale socket), de gegevensmap en de vastlegregels die de app en de host delen
crates/debrid mdm-debrid Debrid-accounts (#44): de officiële API's van de diensten (Real-Debrid, AllDebrid, Premiumize) zetten een link van een bestandshost om in een directe link die de engine downloadt
crates/extract mdm-extract Archiefuitpakking (#37): zip, tar, gz en xz in uitvoering; 7z en RAR via een geïnstalleerde 7-Zip, uitgevoerd als een eigen programma
crates/geo mdm-geo Waar de server van een download zich bevindt (#140): een IP-naar-land-bereiktabel, opgebouwd uit DB-IP's Lite-gegevens (tools/geo/build.py), alleen op deze computer opgezocht, en de vlaggen van de landen
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 Crash- en vastlooprapporten: het monitorproces, minidumps buiten het proces, van symbolen voorziene stacktraces, de rapporttekst en de releaselogboeken (crash-reports.md)
crates/torrent mdm-torrent BitTorrent en magneetlinks via librqbit
crates/labserver mdm-labserver Een HTTP Range-server met een verzoeklogboek en foutinjectie, en een FTP/FTPS-server met eigen fouten, voor tests en benchmarks
extension/ — De extensie voor Chromium (MV3) en Firefox
docs/ — De gebruikershandleiding en zelfstudies, dit bestand en de benchmarkgegevens; de website gebruikt de handleiding als helppagina's die u opent via Help
website/ — De eigen pagina's van misterdownloadmanager.com (home, download, features, themes, FAQ); tools/website/build.py voegt de help van docs/ en het nieuws van de CHANGELOG toe, in 22 talen, en GitHub Pages publiceert het

Afhankelijkheden wijzen naar binnen: app, cli, mcp, nmhost en remote gebruiken engine en ipc; de engine weet niets van de UI. De app ziet de engine alleen via de gebeurtenissen (voortgang, momentopnamen van de segmenttabel, voltooid, mislukt).

Engine

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

Wanneer alle segmenten zijn voltooid, wordt het deelbestand gecontroleerd op de verwachte grootte en op de juiste plek hernoemd; de datum van het bestand kan die van de server overnemen.

Het eerste verzoek van een download (get) volgt omleidingen en pagina's die vanzelf naar een bestand leiden (zoals het vernieuwen van een wachtpagina). Voor sites waarvan de links niet rechtstreeks naar het bestand verwijzen, is er een module in sites/ (Google Drive: sites/gdrive.rs). Deze zet de link om in het adres van het bestand, leest de eigen pagina's van de site (zoals een bevestigingsformulier of een foutpagina) en geeft aan waarom een verzoek is geweigerd (Error::Refused). De pure functies worden zonder netwerk getest. Voor de end-to-endtests laat de labserver zo'n site draaien op de echte hostnamen (labserver/src/drive.rs).

FTP en FTPS (ftp.rs) gebruiken dezelfde planner, werkers en status: een segment bestaat uit REST + RETR op een controlesessie in plaats van een GET met een bereik. SIZE en MDTM vervangen de headers, en sessies worden per download gepoold en tussen segmenten hergebruikt.

App

Eén egui-venster wordt op vaste pixelcoördinaten getekend, plus één directe viewport per dialoogvenster. app.rs beheert de status (downloads, wachtrijen, instellingen, de selectie van de lijst) en zet menu-, werkbalk-, toets- en IPC-opdrachten om in acties. Elk dialoogvenster is een eigen module en retourneert een Outcome (open, gesloten, voltooid met een waarde). Windows-specifieke aanroepen zijn beperkt tot win32.rs en hun Linux- en macOS-tegenhangers tot unix.rs (beginnend met de sessie, de browserhost, geluiden, tonen in map, de crashhandler); elk ander bestand is veilige, draagbare Rust. Lettertypen komen van het systeem: de map Fonts van Windows, de systeemlettertypen van macOS, fontconfig op Linux (theme.rs). Op Windows wordt Latijnse, Griekse en Cyrillische tekst getekend door DirectWrite in GDI-klassieke modus (win32.rs, via de glyph-rasterizer-hook van egui), zodat de gehintte vorm en de breedte van elk letterteken samenkomen; andere scripts worden gevormd en getekend door egui.

Thema's

Elke kleur en grootte waarmee een besturingselement wordt getekend, komt van het actieve thema (#45). Een thema is een licht en een donker palet, metrische gegevens, besturingsstijlen en een pictogramstijl (palette.rs):

  • Paletrollen. palette.rs declareert elke rol met een stabiele sleutel ("button.hot", "list.row", "caption"…), een beschrijving en de lichte en donkere waarden van de klassieke look, uitgeschreven (de klassieke look is niet afgeleid). De gedeelde tekenaars (winui.rs, chrome.rs, list.rs, scrollbar.rs) lezen deze via theme::colors() en theme::metrics() en bepalen hieruit de statussen van elk besturingselement; geen enkele tekeningcode heeft een eigen kleur.
  • Afgeleide paletten. derive.rs maakt een heel palet uit een paar basiskleuren (achtergrond, oppervlak, tekst, accent…), waarbij elke andere rol in OKLab wordt gemengd en het WCAG-contrast behouden blijft (4,5:1 voor tekst, 3:1 voor randen); Hoog contrast versterkt elke rand daarbovenop. native.rs zaait het Systeemeigen thema uit het accent en contrast van het systeem (Windows-instellingen, het freedesktop-portaal op Linux, macOS-accent).
  • 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).
  • Themabestanden. themefile.rs leest TOML of JSON uit de themes van de gegevensmap (één bestand, of <id>/theme.toml met pictogrammen ernaast). Een bestand benoemt alleen wat het wijzigt; de rest komt van het thema dat het inherits (de id van een ingebouwd thema of een ander bestand, standaard de klassieke look), via een keten waarin een cyclus wordt geweigerd. Onbekende sleutels zijn waarschuwingen, geen fouten. De ingebouwde themastijlen zijn ook zulke bestanden, meegenomen in het programma (crates/app/assets/themes).
  • Pictogramsets. themeicons.rs tekent de pictogrammen van een thema (benoemd naar waarvoor ze dienen: tb-add-url, cat-music…, SVG of PNG op 16, 24, 32 en 48 px, -symbolic exemplaren in de tekstkleur) waar de klassieke look zijn eigen pictogrammen tekent; een behoefte die de set mist, behoudt het klassieke pictogram.

Waar een venster zijn besturingselementen plaatst, blijft de lay-out. Dat geldt ook voor de pictogrammen vóór bestandsnamen (fileicons.rs): de systeemafbeeldingslijsten van de Windows-shell, die van macOS Finder (NSWorkspace), het pictogramthema van de Linux-desktop (xdgicons.rs, shared-mime-info en de Icon Theme Specification). Elk type wordt één keer per pixelgrootte opgezocht, op een achtergrondthread. Tango's pictogrammen (meegeleverd) dienen als tijdelijke aanduiding totdat het systeempictogram gereed is, en overal waar het systeem er geen heeft.

Tekenen

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.

Beeld → Interfasegrootte (scale.rs, #262) is de zoomfactor van egui over de eigen schaal van het scherm: elk venster wordt in punten ingedeeld, dus het opent zoveel groter; een groter dan het scherm scrollt.

Gegevens

De downloadlijst en instellingen worden atomair opgeslagen in de gegevensmap (downloads.json): %APPDATA%\misterdownloadmanager\ op Windows, ~/.local/share/misterdownloadmanager op Linux, ~/Library/Application Support/misterdownloadmanager op macOS, een data map naast een draagbare kopie, of MDM_DATA_DIR (mdm_ipc::data_dir). De browserhost leest hetzelfde bestand voor de vastlegregels, dus een wijziging in Opties is van toepassing op de volgende vastgelegde download.

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.

De serverlocatie van een download (#140) is het land van het adres waarmee het verbinding maakte, opgezocht in de tabel van mdm-geo op deze computer (countries.rs benoemt het in de interfacetaal); de release-taak bouwt de tabel opnieuw op uit de gegevens van de maand (tools/geo/build.py --release).

Browserintegratie

page ──► extension ──native messaging──► mdm-nmhost ──ipc──► app

De extensie vraagt de host welke bestandstypen moeten worden overgenomen, controleert elke download hierop en annuleert de download van de browser pas nadat de app deze heeft geaccepteerd; anders behoudt de browser deze, en de extensie legt uit waarom.

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.

Afstandsbediening

phone ──HTTPS (paired token)──► mdm-remote ──ipc::Sink──► app (answer, remote_add)

--headless(headless.rs, #157) draait dezelfde App zonder eframe: een lus roept de tick aan (wat logic bij elk frame uitvoert) op een kale egui::Context, gewekt door het commandokanaal, en nooit de ui; commando's worden toegevoegd zoals de afstandsbediening ze toevoegt (geen venster). De Dockerfile en docker/ (Compose, Unraid's template) draaien het op een server (server.md).

De server draait op de Tokio-runtime van de app, één listener per lokaal netwerkadres. Elk verzoek wordt gecontroleerd (Host, Origin, token), omgezet in een mdm_ipc::Command gemarkeerd remote (een veld dat geen enkele verzoekregel kan instellen) en via hetzelfde kanaal als de opdrachtregel aan de app doorgegeven; de app beantwoordt het in het volgende frame, net zoals het de automatiserings-API beantwoordt. De pagina wordt ingebouwd (crates/remote/web) en de teksten komen uit de catalogi van de app (remote.rs).

Vertalingen

Elke tekst die de UI toont, gaat via crate::i18n (craft-i18n-catalogi, i18n/<locale>.tsv). tools/i18n/extract.py herbouwt i18n/en.tsv vanuit de bron, met een notitie voor vertalers bij elke tekst (wat het is, waar het wordt getoond, de placeholders). tools/i18n/translate.py vult aan wat de andere catalogi missen (rijen gemarkeerd met #, machine), volgens de stijlgids van elke taal (i18n/style/) en de woordenlijst; een rij die door een persoon is beoordeeld, wordt nooit vervangen, en CI (reviewed_guard.py) mislukt bij een wijziging die er een verwijdert. De website heeft zijn eigen catalogi (i18n/site/, tools/website/translate_site.py).

Afbeeldingen

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).

Medewerkers

tools/contributors.pyleest wie pull requests en issues heeft geopend en wie commentaar heeft gegeven, via de openbare API van GitHub (de beheerder, Claude en bots zijn weggelaten) voor elke plek waar ze worden bedankt: de startpagina van de website, /contributors.html en elke release op de Nieuwspagina (build.py, bij elke build), de notities van elke release (release.yml, de mensen die actief waren sinds de vorige release) en de README (python tools/contributors.py readme bij de voorbereiding van elke release: de ronde foto's worden vastgelegd in art/contributors/, aangezien GitHub geen ronde afbeelding kan maken in een README).

Tests en benchmarks

cargo testvoert unit-tests en end-to-end downloads uit tegen mdm-labserver met geïnjecteerde fouten (trage, verbroken en geweigerde verbindingen, servers zonder bereiken, veranderende bestanden). tools/bench voert de gepubliceerde snelheidsvergelijking uit; de ruwe data staat in docs/bench/.

Gratis, open source, geen advertenties, geen proefversie.

Download GolinksPRO Download Manager