GolinksPRO Download Manager
  1. होम
  2. सहायता
  3. आर्किटेक्चर

आर्किटेक्चर

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): AI असिस्टेंट चल रहे ऐप के डाउनलोड को ऑटोमेशन API के माध्यम से सूचीबद्ध करते हैं, जोड़ते हैं और नियंत्रित करते हैं
crates/remote mdm-remote रिमोट कंट्रोल (#141): HTTPS सर्वर जिसका उपयोग स्थानीय नेटवर्क पर एक युग्मित फ़ोन या कंप्यूटर करता है (इसका पेज, युग्मन कोड, डिवाइस टोकन, सेल्फ-साइन किया गया प्रमाणपत्र); प्रत्येक अनुरोध एक ऑटोमेशन API कमांड बन जाता है जिसका ऐप जवाब देता है
crates/nmhost mdm-nmhost ब्राउज़र का नेटिव मैसेजिंग होस्ट: एक्सटेंशन से कैप्चर किए गए डाउनलोड लेता है और उन्हें ऐप को सौंपता है
crates/ipc mdm-ipc सिंगल-इंस्टेंस चैनल (एक टोकन-सुरक्षित लोकल सॉकेट), डेटा फ़ोल्डर, और ऐप और होस्ट द्वारा साझा किए गए कैप्चर नियम
crates/debrid mdm-debrid डीब्रिड खाते (#44): सेवाओं के आधिकारिक API (Real-Debrid, AllDebrid, Premiumize) एक फ़ाइल होस्ट के लिंक को सीधे लिंक में बदल देते हैं जिसे इंजन डाउनलोड करता है।
crates/extract mdm-extract आर्काइव एक्सट्रैक्शन (#37): ज़िप, टार, जीज़ेड और एक्सज़ेड प्रक्रिया में; 7ज़ेड और RAR एक स्थापित 7-ज़िप के माध्यम से, अपने प्रोग्राम के रूप में चलते हैं।
crates/geo mdm-geo डाउनलोड का सर्वर कहाँ है (#140): DB-IP के लाइट डेटा (tools/geo/build.py) से बनी एक IP-से-देश रेंज तालिका, केवल इस कंप्यूटर पर देखी जाती है, और देशों के झंडे।
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 librqbit के माध्यम से BitTorrent और मैग्नेट लिंक
crates/labserver mdm-labserver अनुरोध लॉग और फ़ॉल्ट इंजेक्शन के साथ एक HTTP रेंज सर्वर, और परीक्षण और बेंचमार्क के लिए अपनी स्वयं की त्रुटियों के साथ एक FTP/FTPS सर्वर
extension/ — Chromium (MV3) और Firefox एक्सटेंशन
docs/ — उपयोगकर्ता मार्गदर्शिका और ट्यूटोरियल, यह फ़ाइल, बेंचमार्क डेटा; वेबसाइट इस मार्गदर्शिका को अपने सहायता पृष्ठ बनाती है, जिसे सहायता खोलता है
website/ — misterdownloadmanager.com के अपने पेज (होम, डाउनलोड, फीचर्स, थीम्स, FAQ); tools/website/build.py docs/ से मदद और CHANGELOG से समाचार, 22 भाषाओं में जोड़ता है, और GitHub Pages इसे प्रकाशित करता है।

निर्भरताएँ अंदर की ओर इंगित करती हैं: app, cli, mcp, nmhost और remote, engine और ipc का उपयोग करते हैं; इंजन को UI के बारे में कुछ भी नहीं पता। ऐप इंजन को केवल उसकी घटनाओं (प्रगति, सेगमेंट तालिका स्नैपशॉट, समाप्त, विफल) के माध्यम से देखता है।

इंजन

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) उसी प्लानर, वर्कर और स्थिति से होकर गुजरते हैं: एक सेगमेंट एक रेंज्ड GET के बजाय एक कंट्रोल सेशन पर REST + RETR होता है, SIZE और MDTM हेडर के लिए होते हैं, और सेशन प्रति डाउनलोड पूल किए जाते हैं और सेगमेंट के बीच पुन: उपयोग किए जाते हैं।

ऐप

एक egui विंडो निश्चित पिक्सेल निर्देशांक पर चित्रित होती है, साथ ही प्रति संवाद एक तात्कालिक व्यूपोर्ट। app.rs स्थिति (डाउनलोड, कतारें, सेटिंग्स, सूची का चयन) को रखता है और मेनू, टूलबार, कुंजी और IPC कमांड को क्रियाओं में बदलता है। प्रत्येक संवाद अपना मॉड्यूल है और एक Outcome (खुला, बंद, एक मान के साथ किया गया) लौटाता है। केवल Windows-विशिष्ट कॉल win32.rs तक सीमित हैं और उनके Linux और macOS समकक्ष unix.rs तक (सत्र के साथ शुरू करना, ब्राउज़र का होस्ट, ध्वनियाँ, फ़ोल्डर में दिखाना, क्रैश हैंडलर); हर दूसरी फ़ाइल सुरक्षित, पोर्टेबल Rust है। फ़ॉन्ट सिस्टम से आते हैं: Windows का फ़ॉन्ट फ़ोल्डर, macOS के सिस्टम फ़ॉन्ट, Linux पर fontconfig (theme.rs)। Windows पर, लैटिन, ग्रीक और सिरिलिक टेक्स्ट GDI-क्लासिक मोड में DirectWrite द्वारा खींचा जाता है (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 की सेटिंग्स, Linux पर freedesktop पोर्टल, 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 डेटा फ़ोल्डर के themes से TOML या JSON पढ़ता है (एक फ़ाइल, या <id>/theme.toml जिसके बगल में आइकन होते हैं)। एक फ़ाइल केवल वही नाम देती है जो वह बदलती है; बाकी उस थीम से आता है जिसे वह inherits करता है (एक बिल्ट-इन की आईडी या कोई अन्य फ़ाइल, डिफ़ॉल्ट रूप से क्लासिक लुक), एक श्रृंखला में जिसमें एक चक्र को अस्वीकार कर दिया जाता है। अज्ञात कुंजियाँ चेतावनियाँ होती हैं, त्रुटियाँ नहीं। बिल्ट-इन स्टाइल थीम भी ऐसी फ़ाइलें होती हैं, जो प्रोग्राम में होती हैं (crates/app/assets/themes)।
  • आइकन सेट। themeicons.rs एक थीम के आइकन खींचता है (उनके उद्देश्य से नामित: tb-add-url, cat-music…, SVG या PNG 16, 24, 32 और 48 px पर, -symbolic वाले टेक्स्ट रंग में रंगे हुए) जहाँ क्लासिक लुक अपने खुद के खींचता है; एक आवश्यकता जो सेट में नहीं होती है, वह क्लासिक आइकन को रखती है।

एक विंडो अपने कंट्रोल कहाँ रखती है, वह उसका लेआउट रहता है। फ़ाइल नामों से पहले के आइकन भी (fileicons.rs): Windows शेल की सिस्टम इमेज लिस्ट, macOS फाइंडर की (NSWorkspace), Linux डेस्कटॉप की आइकन थीम (xdgicons.rs, shared-mime-info और आइकन थीम स्पेसिफिकेशन)। प्रत्येक प्रकार को प्रति पिक्सेल आकार एक बार, एक बैकग्राउंड थ्रेड पर देखा जाता है। टैंगो के आइकन (बंडल किए गए) तब तक खड़े रहते हैं जब तक सिस्टम का आइकन तैयार नहीं हो जाता, और जहाँ भी सिस्टम में कोई नहीं होता।

ड्राइंग

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) में परमाणु रूप से सहेजा जाता है: Windows पर %APPDATA%\misterdownloadmanager\, Linux पर ~/.local/share/misterdownloadmanager, macOS पर ~/Library/Application Support/misterdownloadmanager, एक पोर्टेबल कॉपी के बगल में एक 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) eframe के बिना वही App चलाता है: एक लूप अपने tick को कॉल करता है (जो logic हर फ्रेम पर चलाता है) एक नंगे egui::Context पर, कमांड चैनल द्वारा जगाया जाता है, और कभी भी अपने ui को नहीं; कमांड वैसे ही जोड़े जाते हैं जैसे रिमोट कंट्रोल उन्हें जोड़ता है (कोई विंडो नहीं)। Dockerfile और docker/ (Compose, Unraid का टेम्पलेट) इसे एक सर्वर पर चलाते हैं (server.md)।

सर्वर ऐप के टोक्यो रनटाइम पर चलता है, प्रति स्थानीय नेटवर्क पते पर एक श्रोता। प्रत्येक अनुरोध की जाँच की जाती है (Host, Origin, टोकन), उसे mdm_ipc::Command के रूप में चिह्नित remote (एक फ़ील्ड जिसे कोई अनुरोध लाइन सेट नहीं कर सकती) में बदल दिया जाता है और कमांड लाइन के समान चैनल के माध्यम से ऐप को सौंप दिया जाता है; ऐप अपने अगले फ्रेम पर इसका जवाब देता है, जैसे वह ऑटोमेशन API का जवाब देता है। इसका पेज crates/remote/web में बनाया गया है और इसके टेक्स्ट ऐप के कैटलॉग (remote.rs) से आते हैं।

अनुवाद

UI द्वारा दिखाए गए हर टेक्स्ट 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.pyGitHub के सार्वजनिक API से यह पढ़ता है कि किसने पुल रिक्वेस्ट और इश्यू खोले, और किसने टिप्पणी की (रखरखावकर्ता, Claude और बॉट को छोड़कर), उन सभी जगहों के लिए जो उन्हें धन्यवाद देती हैं: वेबसाइट का होम पेज, /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