GolinksPRO Download Manager
  1. Trang chủ
  2. Trợ giúp
  3. Kiến trúc

Kiến trúc

How GolinksPRO Download Manager's pieces fit together.

Crates

Đường dẫn Crate Vai trò
crates/engine mdm-engine Tải xuống một tệp qua HTTP(S) hoặc FTP(S): thăm dò, lập kế hoạch phân đoạn, các worker kết nối, trạng thái tiếp tục, giới hạn mỗi máy chủ, bộ giới hạn tốc độ, tổng kiểm tra, tập lệnh proxy
crates/app mdm-app Ứng dụng máy tính để bàn (misterdownloadmanager.exe, egui): danh sách, danh mục, hàng đợi, bộ lập lịch, hộp thoại, khay hệ thống, cài đặt
crates/cli mdm-cli Tải xuống không giao diện với tiến độ (get, resume), video, torrent và các lệnh của API tự động hóa: một thư viện mà chương trình ứng dụng chạy (misterdownloadmanager --cli …), và misterdownloadmanager-cli, một trình khởi chạy nhỏ bắt đầu nó với cùng các đối số, thiết bị đầu cuối và mã thoát
crates/mcp mdm-mcp Máy chủ MCP (misterdownloadmanager-mcp): trợ lý AI có thể liệt kê, thêm và điều khiển các lượt tải xuống trong ứng dụng đang chạy thông qua API tự động hóa
crates/remote mdm-remote Điều khiển từ xa (#141): máy chủ HTTPS mà điện thoại hoặc máy tính đã ghép nối trên mạng cục bộ sử dụng (trang của nó, mã ghép nối, mã thông báo thiết bị, chứng chỉ tự ký); mỗi yêu cầu trở thành lệnh API tự động hóa mà ứng dụng trả lời
crates/nmhost mdm-nmhost Máy chủ nhắn tin gốc của trình duyệt: lấy các lượt tải xuống đã bị chặn từ tiện ích mở rộng và chuyển chúng cho ứng dụng
crates/ipc mdm-ipc Kênh một phiên bản (một socket cục bộ được bảo vệ bằng token), thư mục dữ liệu và các quy tắc chặn được chia sẻ bởi ứng dụng và máy chủ
crates/debrid mdm-debrid Tài khoản Debrid (#44): API chính thức của các dịch vụ (Real-Debrid, AllDebrid, Premiumize) biến liên kết của máy chủ tệp thành liên kết trực tiếp để công cụ tải xuống
crates/extract mdm-extract Giải nén kho lưu trữ (#37): zip, tar, gz và xz đang xử lý; 7z và RAR thông qua 7-Zip đã cài đặt, chạy như một chương trình riêng
crates/geo mdm-geo Vị trí máy chủ của một lượt tải xuống (#140): bảng dải IP-đến-quốc gia được xây dựng từ dữ liệu Lite của DB-IP (tools/geo/build.py), chỉ tra cứu trên máy tính này và cờ của các quốc gia
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 Báo cáo sự cố và treo: tiến trình giám sát, minidump ngoài tiến trình, các stack đã được biểu tượng hóa, văn bản báo cáo và nhật ký phát hành (crash-reports.md)
crates/torrent mdm-torrent BitTorrent và liên kết magnet thông qua librqbit
crates/labserver mdm-labserver Một máy chủ HTTP Range với nhật ký yêu cầu và lỗi được chèn, và một máy chủ FTP/FTPS với các lỗi riêng, để kiểm tra và đánh giá hiệu suất
extension/ — Tiện ích mở rộng Chromium (MV3) và Firefox
docs/ — Hướng dẫn sử dụng và các bài hướng dẫn, tệp này, dữ liệu điểm chuẩn; trang web biến hướng dẫn thành các trang trợ giúp của nó, mà Trợ giúp sẽ mở ra
website/ — Các trang của misterdownloadmanager.com (trang chủ, tải xuống, tính năng, chủ đề, FAQ); tools/website/build.py thêm trợ giúp từ docs/ và tin tức từ CHANGELOG, bằng 22 ngôn ngữ, và GitHub Pages xuất bản

Các phần phụ thuộc hướng vào trong: app, cli, mcp, nmhost và remote sử dụng engine và ipc; công cụ không biết gì về giao diện người dùng. Ứng dụng chỉ thấy công cụ thông qua các sự kiện của nó (tiến trình, ảnh chụp nhanh bảng phân đoạn, đã hoàn tất, đã thất bại).

Engine

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

Khi mọi phân đoạn hoàn tất, tệp tạm thời được kiểm tra với kích thước dự kiến và đổi tên vào đúng vị trí; ngày của tệp có thể theo ngày của máy chủ.

Yêu cầu tải xuống đầu tiên (get) sẽ theo các chuyển hướng và các trang tự động dẫn đến một tệp (làm mới trang chờ). Các trang web có liên kết không phải là địa chỉ của tệp sẽ có một mô-đun trong sites/ (Google Drive: sites/gdrive.rs): nó biến liên kết thành địa chỉ của tệp, đọc các trang riêng của trang web (biểu mẫu xác nhận, trang lỗi) và đặt tên cho các từ chối của nó (Error::Refused), với các hàm thuần túy được kiểm tra mà không cần mạng. Máy chủ phòng thí nghiệm đóng vai trò là một trang web như vậy trên các tên máy chủ thực của nó để kiểm tra đầu cuối (labserver/src/drive.rs).

FTP và FTPS (ftp.rs) đi qua cùng một bộ lập kế hoạch, worker và trạng thái: một phân đoạn là REST + RETR trên một phiên điều khiển thay vì một GET có phạm vi, SIZE và MDTM thay thế cho các tiêu đề, và các phiên được gộp theo mỗi lượt tải xuống và được tái sử dụng giữa các phân đoạn.

Ứng dụng

Một cửa sổ egui được vẽ theo tọa độ pixel cố định, cộng thêm một khung nhìn tức thời cho mỗi hộp thoại. app.rs giữ trạng thái (các lượt tải xuống, hàng đợi, cài đặt, lựa chọn của danh sách) và chuyển các lệnh từ menu, thanh công cụ, phím tắt và IPC thành hành động. Mỗi hộp thoại là một mô-đun riêng và trả về một Outcome (mở, đóng, hoàn tất với một giá trị). Các lệnh gọi chỉ dành cho Windows được giới hạn trong win32.rs và các lệnh tương ứng trên Linux và macOS trong unix.rs (bắt đầu với phiên, máy chủ trình duyệt, âm thanh, hiển thị trong thư mục, trình xử lý sự cố); mọi tệp khác đều là Rust an toàn, có thể di động. Phông chữ đến từ hệ thống: thư mục Phông chữ của Windows, phông chữ hệ thống của macOS, fontconfig trên Linux (theme.rs). Trên Windows, văn bản Latin, Hy Lạp và Cyrillic được vẽ bằng DirectWrite ở chế độ GDI-classic (win32.rs, thông qua hook rasterizer glyph của egui), do đó hình dạng gợi ý và chiều rộng pixel nguyên của mỗi chữ cái được kết hợp; các tập lệnh khác được định hình và vẽ bằng egui.

Chủ đề

Mọi màu sắc và kích thước mà một điều khiển được vẽ đều đến từ chủ đề đang hoạt động (#45). Một chủ đề là một bảng màu sáng và tối, các số liệu, kiểu điều khiển và kiểu biểu tượng (palette.rs):

  • Vai trò bảng màu. palette.rs khai báo mỗi vai trò bằng một khóa ổn định ("button.hot", "list.row", "caption"…), một mô tả và các giá trị sáng và tối của giao diện cổ điển, được viết rõ ràng (giao diện cổ điển không được suy ra). Các bộ vẽ chung (winui.rs, chrome.rs, list.rs, scrollbar.rs) đọc chúng thông qua theme::colors() và theme::metrics() và quyết định trạng thái của mỗi điều khiển từ đó; không có mã vẽ nào giữ màu riêng của nó.
  • Bảng màu phái sinh. derive.rs tạo ra một bảng màu hoàn chỉnh từ một vài hạt giống (nền, bề mặt, văn bản, điểm nhấn…), trộn mọi vai trò khác trong OKLab và giữ độ tương phản WCAG (4.5:1 cho văn bản, 3:1 cho các cạnh); Độ tương phản cao tăng cường mọi cạnh lên trên. native.rs gieo hạt chủ đề Native từ điểm nhấn và độ tương phản của hệ thống (cài đặt của Windows, cổng freedesktop trên Linux, điểm nhấn của 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).
  • Tệp chủ đề. themefile.rs đọc TOML hoặc JSON từ thư mục dữ liệu themes (một tệp, hoặc <id>/theme.toml với các biểu tượng bên cạnh). Một tệp chỉ đặt tên những gì nó thay đổi; phần còn lại đến từ chủ đề mà nó inherits (ID của một chủ đề tích hợp hoặc một tệp khác, giao diện cổ điển theo mặc định), theo một chuỗi mà một chu kỳ bị từ chối. Các khóa không xác định là cảnh báo, không phải lỗi. Các chủ đề kiểu tích hợp cũng là các tệp như vậy, được mang trong chương trình (crates/app/assets/themes).
  • Bộ biểu tượng. themeicons.rs vẽ các biểu tượng của một chủ đề (được đặt tên theo mục đích của chúng: tb-add-url, cat-music…, SVG hoặc PNG ở 16, 24, 32 và 48 px, các biểu tượng -symbolic được tô màu văn bản) nơi giao diện cổ điển vẽ của riêng nó; một nhu cầu mà bộ không có sẽ giữ biểu tượng cổ điển.

Vị trí một cửa sổ đặt các điều khiển của nó vẫn là bố cục của nó. Các biểu tượng trước tên tệp cũng vậy (fileicons.rs): danh sách hình ảnh hệ thống của Windows shell, của macOS Finder (NSWorkspace), chủ đề biểu tượng của máy tính để bàn Linux (xdgicons.rs, shared-mime-info và Icon Theme Specification). Mỗi loại được tra cứu một lần cho mỗi kích thước pixel, trên một luồng nền. Các biểu tượng của Tango (được đóng gói) thay thế cho đến khi biểu tượng của hệ thống sẵn sàng và ở bất cứ nơi nào hệ thống không có.

Vẽ

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.

Xem → Kích thước giao diện (scale.rs, #262) là hệ số phóng đại của egui trên tỷ lệ hiển thị của màn hình: mỗi cửa sổ được bố trí theo điểm, vì vậy nó mở lớn hơn bấy nhiêu; một cửa sổ lớn hơn màn hình sẽ cuộn.

Dữ liệu

Danh sách tải xuống và cài đặt được lưu một cách nguyên tử vào thư mục dữ liệu (downloads.json): %APPDATA%\misterdownloadmanager\ trên Windows, ~/.local/share/misterdownloadmanager trên Linux, ~/Library/Application Support/misterdownloadmanager trên macOS, một thư mục data bên cạnh một bản sao di động, hoặc MDM_DATA_DIR (mdm_ipc::data_dir). Máy chủ trình duyệt đọc cùng một tệp cho các quy tắc chụp, vì vậy một thay đổi trong Tùy chọn áp dụng cho lần tải xuống được chụp tiếp theo.

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.

Vị trí máy chủ của một lượt tải xuống (#140) là quốc gia của địa chỉ mà nó đã kết nối, được tra cứu trong bảng của mdm-geo trên máy tính này (countries.rs đặt tên nó bằng ngôn ngữ giao diện); công việc phát hành xây dựng lại bảng từ dữ liệu của tháng (tools/geo/build.py --release).

Tích hợp trình duyệt

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

Tiện ích mở rộng hỏi máy chủ loại tệp nào cần lấy, kiểm tra từng lượt tải xuống theo chúng và chỉ hủy tải xuống của trình duyệt sau khi ứng dụng đã chấp nhận; nếu không, trình duyệt sẽ giữ nó và tiện ích mở rộng sẽ cho biết lý do.

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.

Điều khiển từ xa

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

--headless(headless.rs, #157) chạy cùng App mà không có eframe: một vòng lặp gọi tick của nó (những gì logic chạy ở mỗi khung hình) trên một egui::Context trần, được đánh thức bởi kênh lệnh, và không bao giờ ui của nó; các lệnh được thêm vào khi điều khiển từ xa thêm chúng (không có cửa sổ). Dockerfile và docker/ (Compose, mẫu của Unraid) chạy nó trên một máy chủ (server.md).

Máy chủ chạy trên thời gian chạy Tokio của ứng dụng, một trình nghe cho mỗi địa chỉ mạng cục bộ. Mỗi yêu cầu được kiểm tra (Host, Origin, mã thông báo), biến thành một mdm_ipc::Command được đánh dấu remote (một trường mà không dòng yêu cầu nào có thể đặt) và được chuyển đến ứng dụng thông qua cùng một kênh với dòng lệnh; ứng dụng trả lời nó ở khung tiếp theo, giống như nó trả lời API tự động hóa. Trang của nó được tích hợp sẵn (crates/remote/web) và các văn bản của nó đến từ các danh mục của ứng dụng (remote.rs).

Bản dịch

Mọi văn bản mà giao diện người dùng hiển thị đều thông qua crate::i18n (danh mục craft-i18n, i18n/<locale>.tsv). tools/i18n/extract.py xây dựng lại i18n/en.tsv từ nguồn, với một ghi chú cho người dịch trên mỗi văn bản (nó là gì, nó hiển thị ở đâu, các phần giữ chỗ của nó). tools/i18n/translate.py điền vào những gì các danh mục khác thiếu (các hàng được đánh dấu #, machine), tuân theo hướng dẫn kiểu của mỗi ngôn ngữ (i18n/style/) và bảng thuật ngữ; một hàng mà một người đã xem xét sẽ không bao giờ bị thay thế, và CI (reviewed_guard.py) sẽ thất bại nếu có thay đổi làm mất một hàng. Trang web có các danh mục riêng của nó (i18n/site/, tools/website/translate_site.py).

Hình ảnh

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

Người đóng góp

tools/contributors.pyđọc thông tin về những người đã mở yêu cầu kéo (pull request) và vấn đề (issue), cũng như những người đã bình luận, từ API công khai của GitHub (người bảo trì, Claude và các bot được bỏ qua) cho mọi nơi cảm ơn họ: trang chủ của trang web, /contributors.html và mỗi bản phát hành trên trang Tin tức (build.py, trên mỗi bản dựng), ghi chú của mỗi bản phát hành (release.yml, những người hoạt động kể từ bản phát hành trước) và README (python tools/contributors.py readme trong quá trình chuẩn bị mỗi bản phát hành: ảnh tròn của họ được cam kết trong art/contributors/, vì GitHub không thể làm tròn ảnh trong README).

Kiểm tra và đánh giá hiệu suất

cargo testchạy các bài kiểm tra đơn vị và tải xuống end-to-end chống lại mdm-labserver với các lỗi được chèn (kết nối chậm, bị ngắt và bị từ chối, máy chủ không có phạm vi, tệp thay đổi). tools/bench chạy so sánh tốc độ đã xuất bản; dữ liệu thô của nó nằm trong docs/bench/.

Miễn phí, mã nguồn mở, không quảng cáo, không dùng thử.

Download GolinksPRO Download Manager