GolinksPRO Download Manager
  1. Beranda
  2. Bantuan
  3. Arsitektur

Arsitektur

How GolinksPRO Download Manager's pieces fit together.

Crates

Jalur Crate Peran
crates/engine mdm-engine Mengunduh satu berkas melalui HTTP(S) atau FTP(S): probe, perencana segmen, pekerja koneksi, status lanjutkan, batas per host, pembatas kecepatan, checksum, skrip proxy
crates/app mdm-app Aplikasi desktop (misterdownloadmanager.exe, egui): daftar, kategori, antrean, penjadwal, dialog, baki, pengaturan
crates/cli mdm-cli Unduhan tanpa antarmuka dengan progres (get, resume), video, torrent, dan perintah API otomatisasi: pustaka yang dijalankan oleh program aplikasi (misterdownloadmanager --cli …), dan misterdownloadmanager-cli, peluncur kecil yang memulainya dengan argumen, terminal, dan kode keluar yang sama
crates/mcp mdm-mcp Server MCP (misterdownloadmanager-mcp): asisten AI dapat melihat, menambahkan, dan mengontrol unduhan aplikasi yang sedang berjalan melalui API otomatisasi
crates/remote mdm-remote Kontrol jarak jauh (#141): server HTTPS yang digunakan ponsel atau komputer yang dipasangkan di jaringan lokal (halamannya, kode pemasangan, token perangkat, sertifikat yang ditandatangani sendiri); setiap permintaan menjadi perintah API otomatisasi yang dijawab aplikasi
crates/nmhost mdm-nmhost Host pesan asli peramban: mengambil unduhan yang ditangkap dari ekstensi dan menyerahkannya ke aplikasi
crates/ipc mdm-ipc Saluran satu instans (soket lokal yang dilindungi token), folder data, dan aturan penangkapan yang dibagikan oleh aplikasi dan host
crates/debrid mdm-debrid Akun debrid (#44): API resmi layanan (Real-Debrid, AllDebrid, Premiumize) mengubah tautan host file menjadi tautan langsung yang diunduh oleh mesin
crates/extract mdm-extract Ekstraksi arsip (#37): zip, tar, gz, dan xz sedang dalam proses; 7z dan RAR melalui 7-Zip yang terinstal, dijalankan sebagai programnya sendiri
crates/geo mdm-geo Lokasi server unduhan (#140): tabel rentang IP-ke-negara yang dibuat dari data DB-IP Lite (tools/geo/build.py), dicari hanya di komputer ini, dan bendera negara
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 Laporan kerusakan dan macet: proses monitor, minidump di luar proses, tumpukan bersimbol, teks laporan dan log rilis (crash-reports.md)
crates/torrent mdm-torrent BitTorrent dan tautan magnet melalui librqbit
crates/labserver mdm-labserver Server HTTP Range dengan log permintaan dan injeksi kesalahan, dan server FTP/FTPS dengan kesalahannya sendiri, untuk pengujian dan tolok ukur
extension/ — Ekstensi Chromium (MV3) dan Firefox
docs/ — Panduan pengguna dan tutorial, berkas ini, data benchmark; situs web menjadikan panduan sebagai halaman bantuannya, yang dibuka oleh Bantuan
website/ — Halaman misterdownloadmanager.com sendiri (beranda, unduh, fitur, tema, FAQ); tools/website/build.py menambahkan bantuan dari docs/ dan berita dari CHANGELOG, dalam 22 bahasa, dan GitHub Pages memublikasikannya

Ketergantungan mengarah ke dalam: app, cli, mcp, nmhost, dan remote menggunakan engine dan ipc; mesin tidak tahu apa-apa tentang UI. Aplikasi hanya melihat mesin melalui kejadiannya (kemajuan, cuplikan tabel segmen, selesai, gagal).

Mesin

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

Setelah semua segmen selesai, file sementara diperiksa apakah ukurannya sesuai harapan, lalu dipindahkan ke lokasi akhir dengan nama yang sesuai; tanggal file dapat mengikuti tanggal dari server.

Permintaan pertama unduhan (get) mengikuti pengalihan dan halaman yang mengarahkan ke file, seperti penyegaran otomatis di halaman tunggu. Situs yang tautannya bukan alamat file memiliki modul di sites/ (Google Drive: sites/gdrive.rs): modul ini mengubah tautan menjadi alamat file, membaca halaman milik situs (formulir konfirmasi, halaman kesalahan), dan mengidentifikasi alasan penolakannya (Error::Refused). Fungsi-fungsi murninya diuji tanpa jaringan. Server lab meniru situs tersebut dengan nama host aslinya untuk pengujian menyeluruh (labserver/src/drive.rs).

FTP dan FTPS (ftp.rs) menggunakan perencana, pekerja, dan status yang sama: segmen berupa REST + RETR pada sesi kontrol, bukan GET; SIZE dan MDTM berjangka digunakan sebagai pengganti header, dan sesi dikumpulkan per unduhan serta digunakan kembali antarsegmen.

Aplikasi

Satu jendela egui digambar ke koordinat piksel tetap, ditambah satu viewport langsung per dialog. app.rs menyimpan status (unduhan, antrean, pengaturan, pilihan daftar) dan mengubah perintah menu, bilah alat, tombol, dan IPC menjadi tindakan. Setiap dialog adalah modulnya sendiri dan mengembalikan Outcome (terbuka, tertutup, selesai dengan nilai). Panggilan khusus Windows terbatas pada win32.rs dan padanan Linux serta macOS-nya pada unix.rs (dimulai dengan sesi, host peramban, suara, tampilkan di folder, penangan crash); setiap file lainnya aman, Rust portabel. Font berasal dari sistem: folder Font Windows, font sistem macOS, fontconfig di Linux (theme.rs). Di Windows, teks Latin, Yunani, dan Kiril digambar oleh DirectWrite dalam mode GDI-klasik (win32.rs, melalui kait rasterizer glyph egui), sehingga bentuk berpetunjuk dan lebar piksel penuh setiap huruf menyatu; skrip lain dibentuk dan digambar oleh egui.

Tema

Setiap warna dan ukuran kontrol digambar berasal dari tema aktif (#45). Sebuah tema adalah palet terang dan gelap, metrik, gaya kontrol, dan gaya ikon (palette.rs):

  • Peran palet. palette.rs mendeklarasikan setiap peran dengan kunci stabil ("button.hot", "list.row", "caption"…), deskripsi, dan nilai terang serta gelap tampilan klasik, dituliskan (tampilan klasik tidak diturunkan). Pelukis bersama (winui.rs, chrome.rs, list.rs, scrollbar.rs) membacanya melalui theme::colors() dan theme::metrics() dan memutuskan status setiap kontrol darinya; tidak ada kode lukisan yang memiliki warna sendiri.
  • Palet turunan. derive.rs membuat seluruh palet dari beberapa benih (latar belakang, permukaan, teks, aksen…), mencampur setiap peran lain di OKLab dan menjaga kontras WCAG (4.5:1 untuk teks, 3:1 untuk tepi); Kontras tinggi memperkuat setiap tepi di atasnya. native.rs memberi benih tema Sistem dari aksen dan kontras sistem (pengaturan Windows, portal freedesktop di Linux, aksen 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).
  • File tema. themefile.rs membaca TOML atau JSON dari folder data themes (satu file, atau <id>/theme.toml dengan ikon di sampingnya). Sebuah file hanya menamai apa yang diubahnya; sisanya berasal dari tema yang inherits (ID bawaan atau file lain, tampilan klasik secara default), menyusuri rantai di mana siklus ditolak. Kunci yang tidak dikenal adalah peringatan, bukan kesalahan. Tema gaya bawaan juga merupakan file semacam itu, dibawa dalam program (crates/app/assets/themes).
  • Set ikon. themeicons.rs menggambar ikon tema (dinamai berdasarkan fungsinya: tb-add-url, cat-music…, SVG atau PNG pada 16, 24, 32, dan 48 px, -symbolic yang diwarnai dengan warna teks) di mana tampilan klasik menggambar ikonnya sendiri; kebutuhan yang tidak dimiliki set akan mempertahankan ikon klasik.

Di mana jendela menempatkan kontrolnya tetap menjadi tata letaknya. Begitu juga ikon sebelum nama file (fileicons.rs): daftar gambar sistem shell Windows, Finder macOS (NSWorkspace), tema ikon desktop Linux (xdgicons.rs, shared-mime-info dan Spesifikasi Tema Ikon). Setiap jenis dicari sekali per ukuran piksel, pada utas latar belakang. Ikon Tango (dibundel) berfungsi sampai ikon sistem siap, dan di mana pun sistem tidak memilikinya.

Menggambar

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.

Tampilan → Ukuran antarmuka (scale.rs, #262) adalah faktor zoom egui di atas skala tampilan sendiri: setiap jendela ditata dalam poin, sehingga terbuka lebih besar; yang lebih besar dari layar akan menggulir.

Data

Daftar unduhan dan pengaturan disimpan secara atomik ke folder data (downloads.json): %APPDATA%\misterdownloadmanager\ di Windows, ~/.local/share/misterdownloadmanager di Linux, ~/Library/Application Support/misterdownloadmanager di macOS, folder data di samping salinan portabel, atau MDM_DATA_DIR (mdm_ipc::data_dir). Host browser membaca file yang sama untuk aturan pengambilan, sehingga perubahan di Opsi berlaku untuk unduhan yang diambil berikutnya.

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.

Lokasi server unduhan (#140) adalah negara dari alamat yang terhubung, dicari di tabel mdm-geo di komputer ini (countries.rs menamainya dalam bahasa antarmuka); tugas rilis membangun kembali tabel dari data bulan itu (tools/geo/build.py --release).

Integrasi browser

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

Ekstensi meminta host jenis file apa yang akan diambil, memeriksa setiap unduhan terhadapnya, dan membatalkan unduhan browser hanya setelah aplikasi menerimanya; jika tidak, browser menyimpannya, dan ekstensi mengatakan alasannya.

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.

Kontrol jarak jauh

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

--headless(headless.rs, #157) menjalankan App yang sama tanpa eframe: sebuah loop memanggil tick-nya (apa yang dijalankan logic di setiap bingkai) pada egui::Context kosong, dibangunkan oleh saluran perintah, dan tidak pernah ui-nya; perintah ditambahkan saat remote control menambahkannya (tanpa jendela). Dockerfile dan docker/ (Compose, template Unraid) menjalankannya di server (server.md).

Server berjalan pada runtime Tokio aplikasi, satu pendengar per alamat jaringan lokal. Setiap permintaan diperiksa (Host, Origin, token), diubah menjadi mdm_ipc::Command yang ditandai remote (bidang yang tidak dapat diatur oleh baris permintaan) dan diserahkan ke aplikasi melalui saluran yang sama dengan baris perintah; aplikasi menjawabnya pada bingkai berikutnya, seperti halnya menjawab API otomatisasi. Halamannya dibuat di dalam (crates/remote/web) dan teksnya berasal dari katalog aplikasi (remote.rs).

Terjemahan

Setiap teks yang ditampilkan UI melewati crate::i18n (katalog craft-i18n, i18n/<locale>.tsv). tools/i18n/extract.py membangun kembali i18n/en.tsv dari sumber, dengan catatan untuk penerjemah pada setiap teks (apa itu, di mana ditampilkan, placeholder-nya). tools/i18n/translate.py mengisi apa yang tidak dimiliki katalog lain (baris yang ditandai #, machine), mengikuti panduan gaya setiap bahasa (i18n/style/) dan glosarium; baris yang ditinjau seseorang tidak pernah diganti, dan CI (reviewed_guard.py) menggagalkan perubahan yang menghapus satu. Situs web memiliki katalognya sendiri (i18n/site/, tools/website/translate_site.py).

Gambar

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

Kontributor

tools/contributors.pymembaca siapa yang membuka permintaan tarik dan isu, dan siapa yang berkomentar, dari API publik GitHub (pemelihara, Claude, dan bot tidak disertakan) untuk setiap tempat yang berterima kasih kepada mereka: halaman beranda situs web, /contributors.html dan setiap rilis di halaman Berita (build.py, pada setiap build), catatan setiap rilis (release.yml, orang-orang yang aktif sejak rilis sebelumnya) dan README (python tools/contributors.py readme pada persiapan setiap rilis: foto bulatnya di-commit di art/contributors/, karena GitHub tidak dapat membulatkan gambar di README).

Pengujian dan tolok ukur

cargo testmenjalankan pengujian unit dan unduhan ujung-ke-ujung terhadap mdm-labserver dengan kesalahan yang disuntikkan (koneksi lambat, terputus, dan ditolak, server tanpa rentang, berkas yang berubah). tools/bench menjalankan perbandingan kecepatan yang diterbitkan; data mentahnya ada di docs/bench/.

Gratis, sumber terbuka, tanpa iklan, tanpa masa uji coba.

Download GolinksPRO Download Manager