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 |
ডাউনলোড ইঞ্জিনের মাধ্যমে ফাইল হোস্টের লিঙ্ককে সরাসরি লিঙ্কে পরিণত করে (Real-Debrid, AllDebrid, Premiumize) এই পরিষেবাগুলির নিজস্ব API। |
crates/extract |
mdm-extract |
আর্কাইভ এক্সট্রাকশন (#37): zip, tar, gz এবং xz প্রক্রিয়াধীন; 7z এবং RAR ইনস্টল করা 7-Zip-এর মাধ্যমে, যা নিজস্ব প্রোগ্রাম হিসেবে চলে। |
crates/geo |
mdm-geo |
ডাউনলোডের সার্ভার কোথায় (#140): DB-IP-এর Lite ডেটা (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/ |
— | ব্যবহারকারীর নির্দেশিকা ও টিউটোরিয়াল, এই ফাইল, বেঞ্চমার্ক ডেটা; ওয়েবসাইট এই নির্দেশিকাকে তার সহায়তা পৃষ্ঠা হিসেবে ব্যবহার করে, যা সহায়তা (Help) খোলে |
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/-এ একটি মডিউল আছে (গুগল ড্রাইভ: 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। ফন্টগুলি সিস্টেম থেকে আসে: 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::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ডেটা ফোল্ডারের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)।
সার্ভার অ্যাপের Tokio রানটাইমে চলে, প্রতিটি স্থানীয় নেটওয়ার্ক ঠিকানার জন্য একটি লিসেনার। প্রতিটি অনুরোধ পরীক্ষা করা হয় (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.pyযারা পুল রিকোয়েস্ট এবং ইস্যু খুলেছেন, এবং যারা মন্তব্য করেছেন, তাদের তালিকা GitHub-এর পাবলিক এপিআই থেকে পড়ে (রক্ষণাবেক্ষণকারী, ক্লদ এবং বট বাদ দিয়ে) প্রতিটি স্থানে তাদের ধন্যবাদ জানানোর জন্য: ওয়েবসাইটের হোম পেজ, /contributors.html এবং নিউজ পেজের প্রতিটি রিলিজ (build.py, প্রতিটি বিল্ডে), প্রতিটি রিলিজের নোট (release.yml, আগের রিলিজের পর থেকে সক্রিয় ব্যক্তিরা) এবং README (python tools/contributors.py readme প্রতিটি রিলিজের প্রস্তুতির সময়: এর গোলাকার ছবিগুলো art/contributors/-এ কমিট করা হয়, কারণ GitHub README-তে একটি ছবি গোলাকার করতে পারে না)।
পরীক্ষা এবং বেঞ্চমার্ক
cargo testmdm-labserver এর বিরুদ্ধে ইউনিট পরীক্ষা এবং এন্ড-টু-এন্ড ডাউনলোড চালায় ইনজেক্টেড ফল্ট সহ (ধীর, বাদ পড়া এবং প্রত্যাখ্যান করা সংযোগ, রেঞ্জ ছাড়া সার্ভার, ফাইল পরিবর্তন)। tools/bench প্রকাশিত গতি তুলনা চালায়; এর কাঁচা ডেটা docs/bench/ এ রয়েছে।
বিনামূল্যে, ওপেন সোর্স, কোনো বিজ্ঞাপন নেই, কোনো ট্রায়াল নেই।
Download GolinksPRO Download Manager