GolinksPRO Download Manager
  1. Accueil
  2. Aide
  3. Architecture

Architecture

How GolinksPRO Download Manager's pieces fit together.

Bibliothèques

Chemin Bibliothèque Rôle
crates/engine mdm-engine Télécharge un fichier via HTTP(S) ou FTP(S) : sonde, planificateur de segments, travailleurs de connexion, état de reprise, limites par hôte, limiteur de vitesse, sommes de contrôle, scripts proxy
crates/app mdm-app L'application de bureau (misterdownloadmanager.exe, egui) : liste, catégories, files d'attente, planificateur, dialogues, barre d'état système, paramètres
crates/cli mdm-cli Téléchargements sans interface avec progression (get, resume), vidéos, torrents et commandes de l'API d'automatisation : une bibliothèque exécutée par le programme de l'application (misterdownloadmanager --cli …), et misterdownloadmanager-cli, un petit lanceur qui la démarre avec les mêmes arguments, terminal et code de sortie
crates/mcp mdm-mcp Le serveur MCP (misterdownloadmanager-mcp) : les assistants IA listent, ajoutent et contrôlent les téléchargements de l'application en cours via l'API d'automatisation
crates/remote mdm-remote Le contrôle à distance (#141) : le serveur HTTPS qu'un téléphone ou un ordinateur appairé sur le réseau local utilise (sa page, les codes d'appairage, les jetons d'appareil, le certificat auto-signé) ; chaque requête devient une commande de l'API d'automatisation à laquelle l'application répond
crates/nmhost mdm-nmhost L'hôte de messagerie native du navigateur : prend les téléchargements capturés de l'extension et les transmet à l'application
crates/ipc mdm-ipc Le canal à instance unique (un socket local protégé par un jeton), le dossier de données et les règles de capture partagées par l'application et l'hôte
crates/debrid mdm-debrid Comptes de débridage (#44) : les API officielles des services (Real-Debrid, AllDebrid, Premiumize) transforment un lien d’hébergeur de fichiers en un lien direct que le moteur télécharge.
crates/extract mdm-extract Extraction d’archives (#37) : zip, tar, gz et xz en cours ; 7z et RAR via 7-Zip installé, exécuté comme un programme distinct.
crates/geo mdm-geo Emplacement du serveur d’un téléchargement (#140) : une table de correspondance IP-pays construite à partir des données Lite de DB-IP (tools/geo/build.py), consultée uniquement sur cet ordinateur, et les drapeaux des pays.
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 Rapports de crash et de blocage : le processus de surveillance, les minidumps hors processus, les piles symbolisées, le texte du rapport et les journaux de publication (crash-reports.md)
crates/torrent mdm-torrent Liens BitTorrent et magnet via librqbit
crates/labserver mdm-labserver Un serveur HTTP Range avec un journal de requêtes et une injection de pannes, et un serveur FTP/FTPS avec ses propres pannes, pour les tests et les benchmarks
extension/ — L'extension Chromium (MV3) et Firefox
docs/ — Le guide de l'utilisateur et les tutoriels, ce fichier, les données de référence ; le site web fait du guide ses pages d'aide, que Aide ouvre
website/ — Les pages de misterdownloadmanager.com (accueil, téléchargement, fonctionnalités, thèmes, FAQ) ; tools/website/build.py ajoute l’aide de docs/ et les actualités du CHANGELOG, en 22 langues, et GitHub Pages les publie.

Les dépendances pointent vers l'intérieur : app, cli, mcp, nmhost et remote utilisent engine et ipc ; le moteur ne sait rien de l'interface utilisateur. L'application ne voit le moteur qu'à travers ses événements (progression, instantanés de la table des segments, terminé, échec).

Moteur

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

Lorsque tous les segments sont terminés, le fichier partiel est vérifié par rapport à la taille attendue et renommé à sa place ; la date du fichier peut suivre celle du serveur.

La première requête d'un téléchargement (get) suit les redirections et les pages qui mènent d'elles-mêmes à un fichier (l'actualisation d'une page d'attente). Les sites dont les liens ne sont pas l'adresse du fichier ont un module dans sites/ (Google Drive : sites/gdrive.rs) : il transforme le lien en adresse du fichier, lit les pages propres au site (un formulaire de confirmation, une page d'erreur) et nomme ses refus (Error::Refused), avec des fonctions pures testées sans réseau. Le serveur de laboratoire joue un tel site sur ses vrais noms d'hôte pour les tests de bout en bout (labserver/src/drive.rs).

FTP et FTPS (ftp.rs) passent par le même planificateur, les mêmes travailleurs et le même état : un segment est REST + RETR sur une session de contrôle au lieu d'un GET, SIZE et MDTM à plage remplacent les en-têtes, et les sessions sont regroupées par téléchargement et réutilisées entre les segments.

Application

Une fenêtre egui peinte à des coordonnées de pixels fixes, plus une fenêtre d'affichage immédiate par boîte de dialogue. app.rs contient l'état (téléchargements, files d'attente, paramètres, sélection de la liste) et transforme les commandes de menu, de barre d'outils, de clavier et IPC en actions. Chaque boîte de dialogue est son propre module et renvoie un Outcome (ouvert, fermé, terminé avec une valeur). Les appels spécifiques à Windows sont confinés à win32.rs et leurs équivalents Linux et macOS à unix.rs (démarrage de la session, hôte des navigateurs, sons, afficher dans le dossier, gestionnaire de plantage) ; tous les autres fichiers sont du Rust sûr et portable. Les polices proviennent du système : dossier Polices de Windows, polices système de macOS, fontconfig sur Linux (theme.rs). Sous Windows, le texte latin, grec et cyrillique est dessiné par DirectWrite en mode GDI-classique (win32.rs, via le hook de rastérisation de glyphes d'egui), de sorte que la forme optimisée et la largeur en pixels entiers de chaque lettre sont combinées ; les autres scripts sont mis en forme et dessinés par egui.

Thèmes

Chaque couleur et taille avec laquelle un contrôle est dessiné provient du thème actif (#45). Un thème est une palette claire et une sombre, des métriques, des styles de contrôle et un style d’icône (palette.rs) :

  • Rôles de la palette. palette.rs déclare chaque rôle avec une clé stable ("button.hot", "list.row", "caption"…), une description et les valeurs claires et sombres de l’apparence classique, écrites (l’apparence classique n’est pas dérivée). Les peintres partagés (winui.rs, chrome.rs, list.rs, scrollbar.rs) les lisent via theme::colors() et theme::metrics() et décident des états de chaque contrôle à partir de ceux-ci ; aucun code de peinture ne contient sa propre couleur.
  • Palettes dérivées. derive.rs crée une palette complète à partir de quelques graines (arrière-plan, surface, texte, accent…), mélangeant tous les autres rôles en OKLab et maintenant le contraste WCAG (4,5:1 pour le texte, 3:1 pour les bords) ; Contraste élevé renforce chaque bord. native.rs initialise le thème Natif à partir de l’accent et du contraste du système (paramètres de Windows, le portail freedesktop sur Linux, l’accent de 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).
  • Fichiers de thème. themefile.rs lit TOML ou JSON depuis le dossier de données themes (un fichier, ou <id>/theme.toml avec des icônes à côté). Un fichier ne nomme que ce qu’il modifie ; le reste provient du thème qu’il inherits (l’ID d’un thème intégré ou un autre fichier, l’apparence classique par défaut), le long d’une chaîne dans laquelle un cycle est refusé. Les clés inconnues sont des avertissements, pas des erreurs. Les thèmes de style intégrés sont également de tels fichiers, inclus dans le programme (crates/app/assets/themes).
  • Jeux d’icônes. themeicons.rs dessine les icônes d’un thème (nommées par leur fonction : tb-add-url, cat-music…, SVG ou PNG à 16, 24, 32 et 48 px, -symbolic encrées dans la couleur du texte) là où l’apparence classique dessine les siennes ; un besoin que le jeu ne satisfait pas conserve l’icône classique.

L’emplacement des contrôles d’une fenêtre reste sa disposition. Il en va de même pour les icônes devant les noms de fichiers (fileicons.rs) : les listes d’images système du shell Windows, celles du Finder de macOS (NSWorkspace), le thème d’icônes du bureau Linux (xdgicons.rs, shared-mime-info et la spécification Icon Theme Specification). Chaque type est recherché une fois par taille de pixel, sur un thread d’arrière-plan. Les icônes de Tango (fournies) sont utilisées jusqu’à ce que l’icône du système soit prête, et partout où le système n’en a pas.

Dessin

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.

Affichage → Taille de l’interface (scale.rs, #262) est le facteur de zoom d’egui sur l’échelle propre de l’affichage : chaque fenêtre est agencée en points, elle s’ouvre donc d’autant plus grande ; une fenêtre plus grande que l’écran défile.

Données

La liste de téléchargements et les paramètres sont enregistrés de manière atomique dans le dossier de données (downloads.json) : %APPDATA%\misterdownloadmanager\ sur Windows, ~/.local/share/misterdownloadmanager sur Linux, ~/Library/Application Support/misterdownloadmanager sur macOS, un dossier data à côté d’une copie portable, ou MDM_DATA_DIR (mdm_ipc::data_dir). L’hôte du navigateur lit le même fichier pour les règles de capture, de sorte qu’une modification dans Options s’applique au prochain téléchargement capturé.

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.

L’emplacement du serveur d’un téléchargement (#140) est le pays de l’adresse à laquelle il s’est connecté, recherché dans la table de mdm-geo sur cet ordinateur (countries.rs le nomme dans la langue de l’interface) ; la tâche de publication reconstruit la table à partir des données du mois (tools/geo/build.py --release).

Intégration au navigateur

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

L’extension demande à l’hôte quels types de fichiers prendre en charge, vérifie chaque téléchargement par rapport à ceux-ci, et n’annule le téléchargement du navigateur qu’après que l’application l’a accepté ; sinon, le navigateur le conserve, et l’extension indique pourquoi.

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.

Contrôle à distance

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

--headless(headless.rs, #157) exécute le même App sans eframe : une boucle appelle son tick (ce que logic exécute à chaque image) sur un egui::Context nu, réveillé par le canal de commande, et jamais son ui ; les commandes sont ajoutées au fur et à mesure que la télécommande les ajoute (pas de fenêtre). Les Dockerfile et docker/ (Compose, modèle d’Unraid) l’exécutent sur un serveur (server.md).

Le serveur s'exécute sur le runtime Tokio de l'application, un écouteur par adresse de réseau local. Chaque requête est vérifiée (Host, Origin, jeton), transformée en un mdm_ipc::Command marqué remote (un champ qu'aucune ligne de requête ne peut définir) et transmise à l'application via le même canal que la ligne de commande ; l'application y répond lors de sa prochaine image, comme elle répond à l'API d'automatisation. Sa page est intégrée (crates/remote/web) et ses textes proviennent des catalogues de l'application (remote.rs).

Traductions

Chaque texte affiché par l’interface utilisateur passe par crate::i18n (catalogues craft-i18n, i18n/<locale>.tsv). tools/i18n/extract.py reconstruit i18n/en.tsv à partir de la source, avec une note pour les traducteurs sur chaque texte (ce qu’il est, où il apparaît, ses espaces réservés). tools/i18n/translate.py complète ce qui manque aux autres catalogues (lignes marquées #, machine), en suivant le guide de style de chaque langue (i18n/style/) et le glossaire ; une ligne révisée par une personne n’est jamais remplacée, et CI (reviewed_guard.py) échoue à un changement qui en supprime une. Le site web a ses propres catalogues (i18n/site/, tools/website/translate_site.py).

Images

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

Contributeurs

tools/contributors.pylit qui a ouvert des pull requests et des problèmes, et qui a commenté, à partir de l'API publique de GitHub (le mainteneur, Claude et les bots sont exclus) pour chaque endroit qui les remercie : la page d'accueil du site web, /contributors.html et chaque version sur la page Nouveautés (build.py, sur chaque build), les notes de chaque version (release.yml, les personnes actives depuis la version précédente) et le README (python tools/contributors.py readme lors de la préparation de chaque version : ses photos rondes sont validées dans art/contributors/, car GitHub ne peut pas arrondir une image dans un README).

Tests et benchmarks

cargo testexécute des tests unitaires et des téléchargements de bout en bout contre mdm-labserver avec des pannes injectées (connexions lentes, interrompues et refusées, serveurs sans plages, fichiers changeants). tools/bench exécute la comparaison de vitesse publiée ; ses données brutes se trouvent dans docs/bench/.

Gratuit, open source, sans publicité ni période d’essai.

Download GolinksPRO Download Manager