GolinksPRO Download Manager
  1. Strona główna
  2. Pomoc
  3. Architektura

Architektura

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.rs deklaruje 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 przez theme::colors() i theme::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.rs tworzy 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.rs zasila motyw Natywny akcentem i kontrastem systemu (ustawienia Windows, portal freedesktop w systemie Linux, akcent 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).
  • Pliki motywów. themefile.rs odczytuje TOML lub JSON z folderu danych themes (jeden plik lub <id>/theme.toml z ikonami obok). Plik nazywa tylko to, co zmienia; reszta pochodzi z motywu, który inherits (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.rs rysuje ikony motywu (nazwane według przeznaczenia: tb-add-url, cat-music…, SVG lub PNG w rozmiarach 16, 24, 32 i 48 px, -symbolic w 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