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.rsdé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 viatheme::colors()ettheme::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.rscré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.rsinitialise 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::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). - Fichiers de thème.
themefile.rslit TOML ou JSON depuis le dossier de donnéesthemes(un fichier, ou<id>/theme.tomlavec des icônes à côté). Un fichier ne nomme que ce qu’il modifie ; le reste provient du thème qu’ilinherits(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.rsdessine 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,-symbolicencré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