GolinksPRO Download Manager
  1. الرئيسية
  2. تعليمات
  3. البنية الداخلية

البنية الداخلية

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::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).
  • ملفات السمة. 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