How GolinksPRO Download Manager's pieces fit together.
بستهها
| مسیر | بسته | نقش |
|---|---|---|
crates/engine |
mdm-engine |
بارگیری یک فایل از طریق HTTP(S) یا FTP(S): بررسی اولیه، برنامهریز قطعهها، کارگرهای اتصال، وضعیت ادامه بارگیری، محدودیت برای هر میزبان، محدودکننده سرعت، جمعهای کنترلی و اسکریپتهای پروکسی |
crates/app |
mdm-app |
برنامه دسکتاپ (misterdownloadmanager.exe، egui): لیست، دستهبندیها، صفها، زمانبندی، دیالوگها، سینی، تنظیمات |
crates/cli |
mdm-cli |
دانلودهای بدون رابط کاربری با نمایش پیشرفت (get, resume)، ویدئوها، تورنتها و دستورات API اتوماسیون: یک کتابخانه که برنامه اصلی اجرا میکند (misterdownloadmanager --cli …)، و misterdownloadmanager-cli، یک راهانداز کوچک که آن را با همان آرگومانها، ترمینال و کد خروج اجرا میکند |
crates/mcp |
mdm-mcp |
سرور MCP (misterdownloadmanager-mcp): دستیارهای هوش مصنوعی از طریق API خودکارسازی، فهرست بارگیریهای برنامه در حال اجرا را میبینند، بارگیری اضافه میکنند و آنها را کنترل میکنند |
crates/remote |
mdm-remote |
کنترل از راه دور (#141): سرور HTTPS که یک تلفن یا رایانه جفتشده در شبکه محلی از آن استفاده میکند (صفحه آن، کدهای جفتسازی، توکنهای دستگاه، گواهی خودامضا)؛ هر درخواست به یک دستور API اتوماسیون تبدیل میشود که برنامه به آن پاسخ میدهد. |
crates/nmhost |
mdm-nmhost |
میزبان پیامرسانی بومی مرورگر: بارگیریهای گرفته شده را از افزونه دریافت کرده و به برنامه تحویل میدهد |
crates/ipc |
mdm-ipc |
کانال تکنمونه (سوکت محلی محافظتشده با توکن)، پوشه دادهها و قواعد دریافت مشترک بین برنامه و میزبان |
crates/debrid |
mdm-debrid |
حسابهای Debrid (شماره 44): APIهای رسمی این سرویسها (Real-Debrid، AllDebrid، Premiumize) پیوند میزبان فایل را به یک پیوند مستقیم تبدیل میکنند که موتور بارگیری میکند. |
crates/extract |
mdm-extract |
استخراج آرشیو (شماره 37): zip، tar، gz و xz در حال پردازش؛ 7z و RAR از طریق 7-Zip نصبشده، که به عنوان یک برنامه مستقل اجرا میشود. |
crates/geo |
mdm-geo |
محل سرور بارگیری (شماره 140): یک جدول محدوده IP به کشور که از دادههای Lite مربوط به DB-IP (tools/geo/build.py) ساخته شده است، فقط در این رایانه جستجو میشود، و پرچم کشورها. |
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 |
گزارشهای خرابی و هنگکردن: فرایند پایش، مینیدامپهای خارج از فرایند، پشتههای نمادگذاریشده، متن گزارش و گزارشهای انتشار (crash-reports.md) |
crates/torrent |
mdm-torrent |
لینکهای BitTorrent و مگنت از طریق librqbit |
crates/labserver |
mdm-labserver |
سرور HTTP Range با گزارش درخواستها و تزریق خطا، و سرور FTP/FTPS با خطاهای مخصوص خود، برای آزمونها و سنجش کارایی |
extension/ |
— | افزونه Chromium (MV3) و Firefox |
docs/ |
— | راهنمای کاربر و آموزشها، این فایل و دادههای سنجش کارایی؛ وبسایت راهنما را به صفحههای راهنمای خود تبدیل میکند که با انتخاب راهنما باز میشوند |
website/ |
— | صفحات خود misterdownloadmanager.com (خانه، بارگیری، ویژگیها، پوستهها، پرسشهای متداول)؛ tools/website/build.py راهنمای docs/ و اخبار CHANGELOG را به 22 زبان اضافه میکند و GitHub Pages آن را منتشر میکند. |
وابستگیها به سمت داخل هستند: app، cli، mcp، nmhost و remote از engine و ipc استفاده میکنند؛ موتور چیزی از رابط کاربری نمیداند. برنامه موتور را فقط از طریق رویدادهای آن (پیشرفت، عکسهای لحظهای جدول سگمنت، پایانیافته، ناموفق) میبیند.
موتور
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
پس از تکمیل همه قطعهها، فایل موقت با اندازه مورد انتظار مقایسه میشود و سپس به نام نهایی تغییر میکند؛ تاریخ فایل نیز میتواند از سرور گرفته شود.
درخواست نخست بارگیری (get) تغییرمسیرها و صفحههایی را دنبال میکند که خودکار به فایل میرسند (با تازهسازی صفحه انتظار). برای سایتهایی که پیوندهایشان نشانی فایل نیست، ماژولی در sites/ وجود دارد (Google Drive: sites/gdrive.rs): این ماژول پیوند را به نشانی فایل تبدیل میکند، صفحههای خود سایت را میخواند (فرم تأیید یا صفحه خطا) و دلیل رد درخواست را مشخص میکند (Error::Refused). توابع خالص آن بدون اتصال به شبکه آزموده میشوند. سرور آزمایشگاه برای آزمونهای سرتاسری، چنین سایتی را با نامهای میزبان واقعی آن شبیهسازی میکند (labserver/src/drive.rs).
FTP و FTPS (ftp.rs) از همان برنامهریز، کارگرها و وضعیت استفاده میکنند: هر قطعه با REST + RETR در یک نشست کنترلی، بهجای یک GET محدودهدار، دریافت میشود؛ SIZE و MDTM جای سرآیندها را میگیرند و نشستها برای هر بارگیری در یک مخزن نگه داشته میشوند و بین قطعهها دوباره استفاده میشوند.
برنامه
یک پنجره egui که در مختصات پیکسلی ثابت ترسیم شده، بهعلاوه یک درگاه دید فوری برای هر گفتگو. app.rs وضعیت را نگه میدارد (بارگیریها، صفها، تنظیمات، انتخاب لیست) و دستورات منو، نوار ابزار، کلید و IPC را به عمل تبدیل میکند. هر گفتگو ماژول خاص خود را دارد و یک Outcome برمیگرداند (باز، بسته، انجام شده با یک مقدار). فراخوانیهای مختص Windows به win32.rs و معادلهای Linux و macOS آنها به unix.rs محدود میشوند (شروع با نشست، میزبان مرورگرها، صداها، نمایش در پوشه، کنترلکننده خرابی)؛ هر فایل دیگری Rust ایمن و قابل حمل است. فونتها از سیستم میآیند: پوشه Fonts Windows، فونتهای سیستمی macOS، fontconfig در Linux (theme.rs). در Windows، متن لاتین، یونانی و سیریلیک توسط DirectWrite در حالت GDI-classic ترسیم میشود (win32.rs، از طریق هوک rasterizer گلیف egui)، بنابراین شکل hint شده هر حرف و عرض تمامپیکسلی آن با هم میآیند؛ سایر اسکریپتها توسط egui شکل داده و ترسیم میشوند.
پوستهها
هر رنگ و اندازهای که یک کنترل با آن ترسیم میشود، از پوسته فعال (شماره 45) میآید. یک پوسته شامل یک پالت روشن و تیره، معیارها، سبکهای کنترل و یک سبک آیکون (palette.rs) است:
- نقشهای پالت.
palette.rsهر نقش را با یک کلید پایدار ("button.hot"،"list.row"،"caption"…)، یک توضیح و مقادیر روشن و تیره ظاهر کلاسیک، به صورت نوشتهشده (ظاهر کلاسیک مشتق نشده است) اعلام میکند. نقاشان مشترک (winui.rs،chrome.rs،list.rs،scrollbar.rs) آنها را از طریقtheme::colors()وtheme::metrics()میخوانند و وضعیتهای هر کنترل را از آنها تعیین میکنند؛ هیچ کد ترسیمی رنگ خاص خود را ندارد. - پالتهای مشتقشده.
derive.rsیک پالت کامل را از چند دانه (پسزمینه، سطح، متن، برجستهسازی…) میسازد، هر نقش دیگر را در OKLab ترکیب میکند و کنتراست WCAG را حفظ میکند (4.5:1 برای متن، 3:1 برای لبهها)؛ کنتراست بالا هر لبه را تقویت میکند.native.rsپوسته بومی را از برجستهسازی و کنتراست سیستم (تنظیمات Windows، پورتال freedesktop در Linux، برجستهسازی 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). - فایلهای پوسته.
themefile.rsفایلهای TOML یا JSON را از پوشهthemesدادهها میخواند (یک فایل، یا<id>/theme.tomlبا آیکونهای کنار آن). یک فایل فقط آنچه را که تغییر میدهد نامگذاری میکند؛ بقیه از پوستهای میآید کهinherits(شناسه یک پوسته داخلی یا فایل دیگر، ظاهر کلاسیک به طور پیشفرض) آن را به ارث میبرد، در یک زنجیره که چرخه در آن رد میشود. کلیدهای ناشناخته هشدار هستند، نه خطا. پوستههای سبک داخلی نیز چنین فایلهایی هستند که در برنامه حمل میشوند (crates/app/assets/themes). - مجموعه آیکونها.
themeicons.rsآیکونهای یک پوسته را ترسیم میکند (با توجه به کاربردشان نامگذاری شدهاند:tb-add-url،cat-music…، SVG یا PNG در 16، 24، 32 و 48 پیکسل، آیکونهای-symbolicکه با رنگ متن رنگآمیزی شدهاند) در جایی که ظاهر کلاسیک آیکونهای خود را ترسیم میکند؛ نیازی که مجموعه فاقد آن است، آیکون کلاسیک را حفظ میکند.
محل قرارگیری کنترلها در یک پنجره، طرحبندی آن باقی میماند. همینطور آیکونهای قبل از نام فایلها (fileicons.rs): لیست تصاویر سیستمی پوسته Windows، Finder در macOS (NSWorkspace)، پوسته آیکون دسکتاپ Linux (xdgicons.rs، shared-mime-info و Icon Theme Specification). هر نوع یک بار برای هر اندازه پیکسل، در یک رشته پسزمینه جستجو میشود. آیکونهای Tango (بستهبندی شده) تا زمانی که آیکون سیستم آماده شود، و هر جا که سیستم آیکونی ندارد، جایگزین میشوند.
ترسیم
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.
نما → اندازه رابط (scale.rs، شماره 262) عامل زوم egui بر روی مقیاس نمایشگر است: هر پنجره در نقاط چیده میشود، بنابراین به همان اندازه بزرگتر باز میشود؛ پنجرهای بزرگتر از صفحه پیمایش میکند.
دادهها
لیست بارگیری و تنظیمات به صورت اتمی در پوشه دادهها (downloads.json) ذخیره میشوند: %APPDATA%\misterdownloadmanager\ در Windows، ~/.local/share/misterdownloadmanager در Linux، ~/Library/Application Support/misterdownloadmanager در macOS، یک پوشه data در کنار یک کپی قابل حمل، یا MDM_DATA_DIR (mdm_ipc::data_dir). میزبان مرورگر همان فایل را برای قوانین ضبط میخواند، بنابراین تغییری در گزینهها برای بارگیری ضبطشده بعدی اعمال میشود.
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.
مکان سرور یک بارگیری (شماره 140) کشور آدرسی است که به آن متصل شده است، که در جدول mdm-geo در این رایانه جستجو میشود (countries.rs آن را به زبان رابط نامگذاری میکند)؛ کار انتشار جدول را دوباره از دادههای ماه میسازد (tools/geo/build.py --release).
یکپارچهسازی با مرورگر
page ──► extension ──native messaging──► mdm-nmhost ──ipc──► app
افزونه از میزبان میپرسد که چه نوع فایلهایی را بگیرد، هر بارگیری را در برابر آنها بررسی میکند و بارگیری مرورگر را فقط پس از پذیرش آن توسط برنامه لغو میکند؛ در غیر این صورت مرورگر آن را نگه میدارد و افزونه دلیل آن را میگوید.
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.
کنترل از راه دور
phone ──HTTPS (paired token)──► mdm-remote ──ipc::Sink──► app (answer, remote_add)
--headless(headless.rs، شماره 157) همان App را بدون eframe اجرا میکند: یک حلقه tick آن را (آنچه logic در هر فریم اجرا میکند) روی یک egui::Context خالی فراخوانی میکند، که توسط کانال فرمان بیدار میشود، و هرگز ui آن را فراخوانی نمیکند؛ فرمانها همانطور که کنترل از راه دور آنها را اضافه میکند، اضافه میشوند (بدون پنجره). Dockerfile و docker/ (Compose، قالب Unraid) آن را روی یک سرور اجرا میکنند (server.md).
سرور بر روی زمان اجرای Tokio برنامه، یک شنونده برای هر آدرس شبکه محلی، اجرا میشود. هر درخواست بررسی میشود (Host، Origin، توکن)، به یک mdm_ipc::Command با علامت remote (یک فیلد که هیچ خط درخواستی نمیتواند آن را تنظیم کند) تبدیل میشود و از طریق همان کانال خط فرمان به برنامه تحویل داده میشود؛ برنامه در فریم بعدی خود به آن پاسخ میدهد، همانطور که به API اتوماسیون پاسخ میدهد. صفحه آن در crates/remote/web ساخته شده است و متون آن از کاتالوگهای برنامه (remote.rs) میآیند.
ترجمهها
هر متنی که رابط کاربری نشان میدهد از طریق crate::i18n (کاتالوگهای craft-i18n، i18n/<locale>.tsv) عبور میکند. tools/i18n/extract.py i18n/en.tsv را از منبع بازسازی میکند، با یک یادداشت برای مترجمان در مورد هر متن (چیست، کجا نشان داده میشود، جاینگهدارهای آن). tools/i18n/translate.py آنچه را که کاتالوگهای دیگر فاقد آن هستند (ردیفهای مشخص شده #, machine) پر میکند، با پیروی از راهنمای سبک هر زبان (i18n/style/) و واژهنامه؛ ردیفی که توسط یک شخص بازبینی شده است هرگز جایگزین نمیشود، و CI (reviewed_guard.py) تغییری را که یکی را حذف میکند، رد میکند. وبسایت کاتالوگهای خود را دارد (i18n/site/، tools/website/translate_site.py).
تصاویر
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).
مشارکتکنندگان
tools/contributors.pyنام افرادی را که درخواستهای پول و ایشو باز کردهاند و کسانی که نظر دادهاند، از API عمومی GitHub میخواند (نگهدارنده، کلود و رباتها حذف شدهاند) برای هر جایی که از آنها تشکر میشود: صفحه اصلی وبسایت، /contributors.html و هر انتشار در صفحه اخبار (build.py، در هر بیلد)، یادداشتهای هر انتشار (release.yml، افرادی که از انتشار قبلی فعال بودهاند) و فایل README (python tools/contributors.py readme در آمادهسازی هر انتشار: عکسهای گرد آنها در art/contributors/ ثبت میشوند، زیرا GitHub نمیتواند یک تصویر را در README گرد کند).
آزمایشها و بنچمارکها
cargo testآزمایشهای واحد و بارگیریهای سرتاسری را در برابر mdm-labserver با خطاهای تزریق شده (اتصالات کند، قطع شده و رد شده، سرورهای بدون محدوده، فایلهای در حال تغییر) اجرا میکند. tools/bench مقایسه سرعت منتشر شده را اجرا میکند؛ دادههای خام آن در docs/bench/ است.
رایگان، متنباز، بدون تبلیغات، بدون دوره آزمایشی.
Download GolinksPRO Download Manager