How GolinksPRO Download Manager's pieces fit together.
Pakiety
| Ścieżka | Pakiet | Rola |
|---|---|---|
crates/engine |
mdm-engine |
Pobiera jeden plik przez HTTP(S) lub FTP(S): sonda, planowanie segmentów, połączenia, stan wznowienia, limity na hosta, ogranicznik prędkości, sumy kontrolne, skrypty proxy |
crates/app |
mdm-app |
Aplikacja desktopowa (misterdownloadmanager.exe, egui): lista, kategorie, kolejki, harmonogram, okna dialogowe, zasobnik systemowy, ustawienia |
crates/cli |
mdm-cli |
Pobieranie bez interfejsu graficznego z informacją o postępie (get, resume), wideo, torrenty i polecenia API automatyzacji: biblioteka uruchamiana przez program aplikacji (misterdownloadmanager --cli …) oraz misterdownloadmanager-cli, mały program uruchamiający ją z tymi samymi argumentami, terminalem i kodem wyjścia |
crates/mcp |
mdm-mcp |
Serwer MCP (misterdownloadmanager-mcp): lista asystentów AI, dodawanie i kontrolowanie pobierania uruchomionej aplikacji poprzez API automatyzacji |
crates/remote |
mdm-remote |
Zdalne sterowanie (#141): serwer HTTPS, którego używa sparowany telefon lub komputer w sieci lokalnej (jego strona, kody parowania, tokeny urządzeń, certyfikat z podpisem własnym); każde żądanie staje się poleceniem API automatyzacji, na które aplikacja odpowiada |
crates/nmhost |
mdm-nmhost |
Host natywnych wiadomości przeglądarki: pobiera przechwycone pliki z rozszerzenia i przekazuje je do aplikacji |
crates/ipc |
mdm-ipc |
Kanał pojedynczej instancji (lokalny socket chroniony tokenem), folder danych i reguły przechwytywania współdzielone przez aplikację i hosta |
crates/debrid |
mdm-debrid |
Konta debrid (#44): oficjalne API usług (Real-Debrid, AllDebrid, Premiumize) zamieniają link hosta pliku w bezpośredni link, który pobiera silnik. |
crates/extract |
mdm-extract |
Rozpakowywanie archiwów (#37): zip, tar, gz i xz w trakcie; 7z i RAR za pośrednictwem zainstalowanego 7-Zip, uruchamianego jako osobny program. |
crates/geo |
mdm-geo |
Lokalizacja serwera pobierania (#140): tabela zakresów IP-do-kraju zbudowana z danych DB-IP Lite (tools/geo/build.py), wyszukiwana tylko na tym komputerze, oraz flagi krajów. |
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 |
Raporty o awariach i zawieszeniach: proces monitorujący, minidumpy poza procesem, symboliczne stosy, tekst raportu i logi wydania (crash-reports.md) |
crates/torrent |
mdm-torrent |
BitTorrent i linki magnetyczne przez librqbit |
crates/labserver |
mdm-labserver |
Serwer HTTP Range z dziennikiem żądań i wstrzykiwaniem błędów oraz serwer FTP/FTPS z własnymi błędami, używane do testów i testów wydajności |
extension/ |
— | Rozszerzenie dla Chromium (MV3) i Firefox |
docs/ |
— | Podręcznik użytkownika i samouczki, ten plik oraz dane testów wydajności; witryna udostępnia podręcznik jako strony pomocy otwierane przez Pomoc |
website/ |
— | Własne strony misterdownloadmanager.com (strona główna, pobieranie, funkcje, motywy, FAQ); tools/website/build.py dodaje pomoc z docs/ i wiadomości z CHANGELOG, w 22 językach, a GitHub Pages to publikuje. |
Zależności wskazują do wewnątrz: app, cli, mcp, nmhost i remote używają engine i ipc; silnik nic nie wie o interfejsie użytkownika. Aplikacja widzi silnik tylko poprzez jego zdarzenia (postęp, migawki tabeli segmentów, zakończone, nieudane).
Silnik
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
Po pobraniu wszystkich segmentów plik tymczasowy jest sprawdzany pod kątem zgodności z oczekiwanym rozmiarem, a następnie przenoszony pod właściwą nazwę; data pliku może być taka sama jak data na serwerze.
Pierwsze żądanie pobierania (get) podąża za przekierowaniami i samoczynnymi przekierowaniami ze stron do pliku (na przykład odświeżeniem strony oczekiwania). Dla witryn, których linki nie prowadzą bezpośrednio do pliku, w sites/ znajduje się moduł (sites/gdrive.rs dla Google Drive): zamienia link na adres pliku, odczytuje strony witryny (formularz potwierdzenia, stronę błędu) i obsługuje odmowy witryny (Error::Refused). Czyste funkcje modułu są testowane bez połączenia z siecią. Serwer testowy udostępnia taką witrynę pod jej rzeczywistymi nazwami hostów na potrzeby testów end-to-end (labserver/src/drive.rs).
FTP i FTPS (ftp.rs) korzystają z tego samego modułu planowania, obsługi połączeń i stanu: segment jest pobierany przez REST + RETR w sesji kontrolnej zamiast przez zakresowe GET, nagłówki zastępują SIZE i MDTM, a sesje są grupowane w ramach pobierania i ponownie wykorzystywane między segmentami.
Aplikacja
Jedno okno egui renderowane do stałych współrzędnych pikseli, plus jeden natychmiastowy obszar widoku na każde okno dialogowe. app.rs przechowuje stan (pobierane pliki, kolejki, ustawienia, zaznaczenie na liście) i zamienia polecenia z menu, paska narzędzi, klawiatury i IPC w akcje. Każde okno dialogowe jest osobnym modułem i zwraca Outcome (otwarte, zamknięte, zakończone z wartością). Wywołania specyficzne dla Windows są ograniczone do win32.rs, a ich odpowiedniki dla Linux i macOS do unix.rs (rozpoczynanie sesji, host przeglądarek, dźwięki, pokaż w folderze, obsługa awarii); każdy inny plik to bezpieczny, przenośny kod Rust. Czcionki pochodzą z systemu: folder Fonts w Windows, czcionki systemowe w macOS, fontconfig w Linux (theme.rs). W Windows tekst łaciński, grecki i cyrylica są rysowane przez DirectWrite w trybie GDI-classic (win32.rs, poprzez hak rasteryzatora glifów egui), dzięki czemu wskazany kształt każdej litery i szerokość w pełnych pikselach są spójne; inne skrypty są kształtowane i rysowane przez egui.
Motywy
Każdy kolor i rozmiar, z jakim rysowany jest element sterujący, pochodzi z aktywnego motywu (#45). Motyw to jasna i ciemna paleta, metryki, style elementów sterujących i styl ikon (palette.rs):
- Role palety.
palette.rsdeklaruje każdą rolę ze stabilnym kluczem ("button.hot","list.row","caption"…), opisem oraz wartościami jasnymi i ciemnymi klasycznego wyglądu, zapisanymi wprost (klasyczny wygląd nie jest pochodny). Wspólne moduły rysujące (winui.rs,chrome.rs,list.rs,scrollbar.rs) odczytują je przeztheme::colors()itheme::metrics()i na ich podstawie decydują o stanach każdego elementu sterującego; żaden kod rysujący nie przechowuje własnego koloru. - Palety pochodne.
derive.rstworzy całą paletę z kilku „ziaren” (tło, powierzchnia, tekst, akcent…), mieszając każdą inną rolę w OKLab i zachowując kontrast WCAG (4.5:1 dla tekstu, 3:1 dla krawędzi); Wysoki kontrast dodatkowo wzmacnia każdą krawędź.native.rszasila motyw Natywny akcentem i kontrastem systemu (ustawienia Windows, portal freedesktop w systemie Linux, akcent 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). - Pliki motywów.
themefile.rsodczytuje TOML lub JSON z folderu danychthemes(jeden plik lub<id>/theme.tomlz ikonami obok). Plik nazywa tylko to, co zmienia; reszta pochodzi z motywu, któryinherits(ID wbudowanego lub inny plik, domyślnie klasyczny wygląd), w łańcuchu, w którym cykl jest odrzucany. Nieznane klucze to ostrzeżenia, nie błędy. Wbudowane motywy stylów to również takie pliki, przenoszone w programie (crates/app/assets/themes). - Zestawy ikon.
themeicons.rsrysuje ikony motywu (nazwane według przeznaczenia:tb-add-url,cat-music…, SVG lub PNG w rozmiarach 16, 24, 32 i 48 px,-symbolicw kolorze tekstu) tam, gdzie klasyczny wygląd rysuje swoje; brakująca ikona w zestawie zachowuje ikonę klasyczną.
Układ okna z jego elementami sterującymi pozostaje stały. Podobnie jest z ikonami przed nazwami plików (fileicons.rs): listy obrazów systemowych powłoki Windows, macOS Finder (NSWorkspace), motyw ikon pulpitu Linux (xdgicons.rs, shared-mime-info i Icon Theme Specification). Każdy typ jest wyszukiwany raz na rozmiar piksela, w osobnym wątku. Ikony Tango (dołączone) zastępują ikony systemowe, dopóki te nie będą gotowe, oraz wszędzie tam, gdzie system ich nie ma.
Rysowanie
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.
Widok → Rozmiar interfejsu (scale.rs, #262) to współczynnik powiększenia egui ponad własną skalę wyświetlacza: każde okno jest układane w punktach, więc otwiera się o tyle większe; większe niż ekran przewija się.
Dane
Lista pobierania i ustawienia są zapisywane atomowo w folderze danych (downloads.json): %APPDATA%\misterdownloadmanager\ w systemie Windows, ~/.local/share/misterdownloadmanager w systemie Linux, ~/Library/Application Support/misterdownloadmanager w systemie macOS, folder data obok przenośnej kopii lub MDM_DATA_DIR (mdm_ipc::data_dir). Host przeglądarki odczytuje ten sam plik dla reguł przechwytywania, więc zmiana w Opcjach ma zastosowanie do następnego przechwyconego pobierania.
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.
Lokalizacja serwera pobierania (#140) to kraj adresu, z którym się połączono, wyszukany w tabeli mdm-geo na tym komputerze (countries.rs nazywa go w języku interfejsu); zadanie wydania ponownie buduje tabelę z danych z danego miesiąca (tools/geo/build.py --release).
Integracja z przeglądarką
page ──► extension ──native messaging──► mdm-nmhost ──ipc──► app
Rozszerzenie pyta hosta, jakie typy plików ma pobierać, sprawdza każde pobieranie pod ich kątem i anuluje pobieranie przeglądarki dopiero po zaakceptowaniu go przez aplikację; w przeciwnym razie przeglądarka je zachowuje, a rozszerzenie podaje przyczynę.
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.
Zdalne sterowanie
phone ──HTTPS (paired token)──► mdm-remote ──ipc::Sink──► app (answer, remote_add)
--headless(headless.rs, #157) uruchamia ten sam App bez eframe: pętla wywołuje jego tick (to, co logic uruchamia w każdej klatce) na czystym egui::Context, budzona przez kanał poleceń, i nigdy jego ui; polecenia są dodawane, gdy dodaje je zdalne sterowanie (bez okna). Dockerfile i docker/ (Compose, szablon Unraid) uruchamiają go na serwerze (server.md).
Serwer działa w środowisku uruchomieniowym Tokio aplikacji, jeden słuchacz na adres sieci lokalnej. Każde żądanie jest sprawdzane (Host, Origin, token), zamieniane na mdm_ipc::Command oznaczone remote (pole, którego żadna linia żądania nie może ustawić) i przekazywane do aplikacji przez ten sam kanał co wiersz poleceń; aplikacja odpowiada na nie w następnej klatce, tak jak odpowiada na API automatyzacji. Jego strona jest wbudowana (crates/remote/web), a teksty pochodzą z katalogów aplikacji (remote.rs).
Tłumaczenia
Każdy tekst wyświetlany w interfejsie użytkownika przechodzi przez crate::i18n (katalogi craft-i18n, i18n/<locale>.tsv). tools/i18n/extract.py odbudowuje i18n/en.tsv ze źródła, z notatką dla tłumaczy przy każdym tekście (co to jest, gdzie się wyświetla, jego symbole zastępcze). tools/i18n/translate.py uzupełnia to, czego brakuje w innych katalogach (wiersze oznaczone #, machine), zgodnie z przewodnikiem stylistycznym każdego języka (i18n/style/) i słownikiem; wiersz, który został przejrzany przez osobę, nigdy nie jest zastępowany, a CI (reviewed_guard.py) odrzuca zmianę, która go usuwa. Strona internetowa ma własne katalogi (i18n/site/, tools/website/translate_site.py).
Obrazy
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).
Współtwórcy
tools/contributors.pyodczytuje z publicznego API GitHub, kto otwierał żądania ściągnięcia i zgłoszenia oraz kto komentował (z wyłączeniem opiekuna, Claude’a i botów), dla każdego miejsca, które im dziękuje: strony głównej witryny, /contributors.html i każdego wydania na stronie Aktualności (build.py, w każdej kompilacji), notatek do każdego wydania (release.yml, osoby aktywne od poprzedniego wydania) oraz pliku README (python tools/contributors.py readme podczas przygotowywania każdego wydania: okrągłe zdjęcia są zatwierdzane w art/contributors/, ponieważ GitHub nie może zaokrąglić obrazu w pliku README).
Testy i benchmarki
cargo testuruchamia testy jednostkowe i kompleksowe pobieranie w stosunku do mdm-labserver z wstrzykniętymi błędami (wolne, zerwane i odrzucone połączenia, serwery bez zakresów, zmieniające się pliki). tools/bench uruchamia opublikowane porównanie prędkości; jego surowe dane znajdują się w docs/bench/.
Darmowy, open source, bez reklam, bez wersji próbnej.
Download GolinksPRO Download Manager