How GolinksPRO Download Manager's pieces fit together.
الصناديق (Crates)
| المسار | الصندوق (Crate) | الدور |
|---|---|---|
crates/engine |
mdm-engine |
ينزل ملفا واحدا عبر HTTP(S) أو FTP(S): فحص، مخطط تجزئة، عمال اتصال، حالة استئناف، قيود لكل مضيف، محدد سرعة، مجاميع اختبارية، نصوص وكيل |
crates/app |
mdm-app |
تطبيق سطح المكتب (misterdownloadmanager.exe، egui): القائمة، الفئات، قوائم الانتظار، المجدول، مربعات الحوار، علبة النظام، الإعدادات. |
crates/cli |
mdm-cli |
تنزيلات بدون واجهة مع التقدم (get، resume)، ومقاطع الفيديو، والتورنت، وأوامر واجهة برمجة التطبيقات للأتمتة: مكتبة يشغلها برنامج التطبيق (misterdownloadmanager --cli …)، وmisterdownloadmanager-cli، وهو مشغل صغير يبدأ تشغيلها بنفس الوسائط والطرفية ورمز الخروج |
crates/mcp |
mdm-mcp |
خادم MCP (misterdownloadmanager-mcp): مساعدو الذكاء الاصطناعي يسردون ويضيفون ويتحكمون في تنزيلات التطبيق قيد التشغيل عبر واجهة برمجة تطبيقات الأتمتة. |
crates/remote |
mdm-remote |
التحكم عن بعد (#141): خادم HTTPS الذي يستخدمه هاتف أو كمبيوتر مقترن على الشبكة المحلية (صفحته، رموز الاقتران، رموز الجهاز، الشهادة الموقعة ذاتيا)؛ يصبح كل طلب أمرا لواجهة برمجة تطبيقات الأتمتة يستجيب له التطبيق |
crates/nmhost |
mdm-nmhost |
مضيف الرسائل الأصلية للمتصفح: يأخذ التنزيلات الملتقطة من الإضافة ويسلمها إلى التطبيق. |
crates/ipc |
mdm-ipc |
قناة المثيل الواحد (مقبس محلي محمي برمز)، مجلد البيانات، وقواعد الالتقاط المشتركة بين التطبيق والمضيف. |
crates/debrid |
mdm-debrid |
حسابات Debrid (#44): تحول واجهات برمجة التطبيقات الرسمية للخدمات (Real-Debrid، AllDebrid، Premiumize) رابط موقع الاستضافة إلى رابط مباشر يحمله المحرك |
crates/extract |
mdm-extract |
استخراج الأرشيف (#37): zip وtar وgz وxz قيد المعالجة؛ 7z وRAR عبر 7-Zip مثبت، يعمل كبرنامج خاص به |
crates/geo |
mdm-geo |
موقع خادم التنزيل (#140): جدول نطاق IP إلى بلد مبني من بيانات DB-IP Lite (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/ (جوجل درايف: 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، عبر خطاف egui لرسام الحروف)، بحيث تتجمع الأشكال الملمحة لكل حرف وعرض البكسل الكامل؛ ويتم تشكيل ورسم النصوص الأخرى بواسطة 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 shell، قوائم macOS Finder (NSWorkspace)، سمة أيقونات سطح مكتب Linux (xdgicons.rs، shared-mime-info ومواصفات سمة الأيقونات). يتم البحث عن كل نوع مرة واحدة لكل حجم بكسل، على خيط خلفي. أيقونات 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 (حقل لا يمكن لسطر الطلب تعيينه) ويتم تسليمه إلى التطبيق عبر نفس القناة مثل سطر الأوامر؛ يجيب التطبيق عليه في إطاره التالي، كما يجيب على واجهة برمجة تطبيقات الأتمتة. يتم بناء صفحته داخليا (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يقرأ من فتح طلبات السحب والمشكلات، ومن علق، من واجهة برمجة تطبيقات 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