GolinksPRO Download Manager
  1. Ana Sayfa
  2. Yardım
  3. Mimari

Mimari

How GolinksPRO Download Manager's pieces fit together.

Bileşenler

Yol Bileşen Rol
crates/engine mdm-engine HTTP(S) veya FTP(S) üzerinden tek bir dosyayı indirir: yoklama, segment planlayıcı, bağlantı çalışanları, devam durumu, ana bilgisayar başına sınırlar, hız sınırlayıcı, sağlama toplamları, proxy betikleri
crates/app mdm-app Masaüstü uygulaması (misterdownloadmanager.exe, egui): liste, kategoriler, kuyruklar, zamanlayıcı, iletişim kutuları, tepsi, ayarlar
crates/cli mdm-cli İlerleme bilgisiyle arayüzsüz indirmeler (get, resume), videolar, torrentler ve otomasyon API'sinin komutları: uygulamanın programının çalıştırdığı bir kütüphane (misterdownloadmanager --cli …) ve aynı argümanlarla başlatan, terminali ve çıkış kodunu paylaşan küçük bir başlatıcı (misterdownloadmanager-cli)
crates/mcp mdm-mcp MCP sunucusu (misterdownloadmanager-mcp): AI asistanları, çalışan uygulamanın indirmelerini otomasyon API'si aracılığıyla listeler, ekler ve kontrol eder
crates/remote mdm-remote Uzaktan kumanda (#141): yerel ağdaki eşleştirilmiş bir telefon veya bilgisayarın kullandığı HTTPS sunucusu (sayfası, eşleştirme kodları, cihaz belirteçleri, kendinden imzalı sertifika); her istek, uygulamanın yanıtladığı bir otomasyon API komutu haline gelir
crates/nmhost mdm-nmhost Tarayıcının yerel mesajlaşma ana bilgisayarı: yakalanan indirmeleri uzantıdan alır ve uygulamaya iletir
crates/ipc mdm-ipc Tek örnekli kanal (jeton korumalı yerel soket), veri klasörü ve uygulama ile ana bilgisayar tarafından paylaşılan yakalama kuralları
crates/debrid mdm-debrid Debrid hesapları (#44): hizmetlerin resmi API'leri (Real-Debrid, AllDebrid, Premiumize) bir dosya barındırıcının bağlantısını motorun indirdiği doğrudan bir bağlantıya dönüştürür
crates/extract mdm-extract Arşiv çıkarma (#37): zip, tar, gz ve xz işlemde; 7z ve RAR, yüklü bir 7-Zip aracılığıyla kendi programı olarak çalıştırılır
crates/geo mdm-geo İndirmenin sunucusunun konumu (#140): DB-IP'nin Lite verilerinden (tools/geo/build.py) oluşturulmuş, yalnızca bu bilgisayarda aranan bir IP'den ülkeye aralık tablosu ve ülkelerin bayrakları
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 Çökme ve donma raporları: izleyici süreci, işlem dışı minidump'lar, sembolize edilmiş yığınlar, raporun metni ve sürüm günlükleri (crash-reports.md)
crates/torrent mdm-torrent librqbit aracılığıyla BitTorrent ve magnet bağlantıları
crates/labserver mdm-labserver İstek günlüğü ve hata enjeksiyonu olan bir HTTP Range sunucusu ve testler ve karşılaştırmalar için kendi hataları olan bir FTP/FTPS sunucusu
extension/ — Chromium (MV3) ve Firefox uzantısı
docs/ — Kullanım kılavuzu ve eğitimler, bu dosya, kıyaslama verileri; web sitesi kılavuzu Yardım'ın açtığı yardım sayfaları yapar
website/ — misterdownloadmanager.com'un kendi sayfaları (ana sayfa, indirme, özellikler, temalar, SSS); tools/website/build.py, docs/'den yardım ve CHANGELOG'dan haberleri 22 dilde ekler ve GitHub Pages bunları yayınlar

Bağımlılıklar içe doğru işaret eder: app, cli, mcp, nmhost ve remote, engine ve ipc kullanır; motor, kullanıcı arayüzü hakkında hiçbir şey bilmez. Uygulama, motoru yalnızca olayları (ilerleme, segment tablosu anlık görüntüleri, tamamlandı, başarısız oldu) aracılığıyla görür.

Motor

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

Her segment tamamlandığında, parça dosyası beklenen boyuta göre kontrol edilir ve yerine yeniden adlandırılır; dosyanın tarihi sunucunun tarihini takip edebilir.

Bir indirme işleminin ilk isteği (get), yönlendirmeleri ve bir dosyaya kendiliğinden götüren sayfaları (bekleme sayfasının yenilenmesi) takip eder. Bağlantıları dosyanın adresi olmayan siteler, sites/ içinde bir modüle sahiptir (Google Drive: sites/gdrive.rs): bu modül, bağlantıyı dosyanın adresine dönüştürür, sitenin kendi sayfalarını (bir onay formu, bir hata sayfası) okur ve ağ olmadan test edilen saf fonksiyonlarla reddetmelerini adlandırır (Error::Refused). Laboratuvar sunucusu, uçtan uca testler için böyle bir siteyi gerçek ana bilgisayar adlarında oynatır (labserver/src/drive.rs).

FTP ve FTPS (ftp.rs) aynı planlayıcı, çalışanlar ve durum üzerinden geçer: bir segment, aralıklı bir GET yerine bir kontrol oturumunda REST + RETR'tür, SIZE ve MDTM başlıklar için kullanılır ve oturumlar indirme başına havuza alınır ve segmentler arasında yeniden kullanılır.

Uygulama

Sabit piksel koordinatlarına çizilmiş tek bir egui penceresi ve her iletişim kutusu için bir anlık görünüm penceresi. app.rs durumu (indirmeler, kuyruklar, ayarlar, listenin seçimi) tutar ve menü, araç çubuğu, tuş ve IPC komutlarını eylemlere dönüştürür. Her iletişim kutusu kendi modülüdür ve bir Outcome (açık, kapalı, bir değerle tamamlandı) döndürür. Yalnızca Windows'a özgü çağrılar win32.rs ile sınırlıdır ve bunların Linux ve macOS karşılıkları unix.rs ile sınırlıdır (oturumla başlayan, tarayıcıların ana bilgisayarı, sesler, klasörde göster, çökme işleyicisi); diğer her dosya güvenli, taşınabilir Rust'tır. Yazı tipleri sistemden gelir: Windows'un Yazı Tipleri klasörü, macOS'un sistem yazı tipleri, Linux'ta fontconfig (theme.rs). Windows'ta, Latin, Yunan ve Kiril metinleri GDI-klasik modunda DirectWrite tarafından çizilir (win32.rs, egui'nin glif rasterleştirici kancası aracılığıyla), böylece her harfin ipuçlu şekli ve tam piksel genişliği bir araya gelir; diğer betikler egui tarafından şekillendirilir ve çizilir.

Temalar

Bir kontrolün çizildiği her renk ve boyut, etkin temadan (#45) gelir. Bir tema, açık ve koyu bir palet, ölçümler, kontrol stilleri ve bir simge stilidir (palette.rs):

  • Palet rolleri. palette.rs her rolü kararlı bir anahtarla ("button.hot", "list.row", "caption"…), bir açıklamayla ve klasik görünümün açık ve koyu değerleriyle (klasik görünüm türetilmemiştir) açıkça belirtir. Paylaşılan çiziciler (winui.rs, chrome.rs, list.rs, scrollbar.rs) bunları theme::colors() ve theme::metrics() aracılığıyla okur ve her kontrolün durumlarını bunlardan belirler; hiçbir çizim kodu kendi rengini tutmaz.
  • Türetilmiş paletler. derive.rs, birkaç çekirdekten (arka plan, yüzey, metin, vurgu…) tüm bir palet oluşturur, diğer tüm rolleri OKLab'da karıştırır ve WCAG kontrastını (metin için 4.5:1, kenarlar için 3:1) korur; Yüksek karşıtlık, her kenarı üstte güçlendirir. native.rs, Sistem temasını sistemin vurgu ve kontrastından (Windows ayarları, Linux'taki freedesktop portalı, macOS'un vurgusu) besler.
  • 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).
  • Tema dosyaları. themefile.rs, veri klasörünün themes içindeki TOML veya JSON'u okur (tek bir dosya veya yanında simgelerle birlikte <id>/theme.toml). Bir dosya yalnızca değiştirdiği şeyi adlandırır; geri kalanı inherits olduğu temadan (yerleşik bir temanın kimliği veya başka bir dosya, varsayılan olarak klasik görünüm) gelir, bir döngünün reddedildiği bir zincir boyunca. Bilinmeyen anahtarlar hata değil, uyarıdır. Yerleşik stil temaları da programda taşınan bu tür dosyalardır (crates/app/assets/themes).
  • Simge setleri. themeicons.rs, bir temanın simgelerini (ne için olduklarına göre adlandırılır: tb-add-url, cat-music…, 16, 24, 32 ve 48 pikselde SVG veya PNG, metin renginde mürekkep rengiyle çizilmiş -symbolic olanlar) klasik görünümün kendi simgelerini çizdiği yere çizer; setin eksik olduğu bir ihtiyaç, klasik simgeyi korur.

Bir pencerenin kontrollerini nereye koyduğu düzeni olarak kalır. Dosya adlarının önündeki simgeler de öyle (fileicons.rs): Windows kabuğunun sistem görüntü listeleri, macOS Finder'ın (NSWorkspace), Linux masaüstünün simge teması (xdgicons.rs, shared-mime-info ve Simge Teması Spesifikasyonu). Her tür, piksel boyutuna göre bir kez, bir arka plan iş parçacığında aranır. Tango'nun simgeleri (birlikte gelir), sistemin simgesi hazır olana kadar ve sistemde hiç simge yoksa kullanılır.

Çizim

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.

Görünüm → Arayüz boyutu (scale.rs, #262), egui'nin ekranın kendi ölçeği üzerindeki yakınlaştırma faktörüdür: her pencere noktalarda düzenlenir, böylece o kadar daha büyük açılır; ekrandan daha büyük olan kaydırılır.

Veri

İndirme listesi ve ayarlar, veri klasörüne (downloads.json) atomik olarak kaydedilir: Windows'ta %APPDATA%\misterdownloadmanager\, Linux'ta ~/.local/share/misterdownloadmanager, macOS'ta ~/Library/Application Support/misterdownloadmanager, taşınabilir bir kopyanın yanında bir data klasörü veya MDM_DATA_DIR (mdm_ipc::data_dir). Tarayıcı ana bilgisayarı, yakalama kuralları için aynı dosyayı okur, böylece Seçenekler'deki bir değişiklik bir sonraki yakalanan indirmeye uygulanır.

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.

Bir indirmenin sunucu konumu (#140), bağlandığı adresin ülkesidir, bu bilgisayardaki mdm-geo tablosunda aranır (countries.rs arayüz dilinde adlandırır); sürüm işi, tablonun ayın verilerinden (tools/geo/build.py --release) yeniden oluşturur.

Tarayıcı entegrasyonu

page ──► extension ──native messaging──► mdm-nmhost ──ipc──► app

Uzantı, ana bilgisayara hangi dosya türlerini alacağını sorar, her indirmeyi bunlara karşı kontrol eder ve tarayıcının indirmesini yalnızca uygulama kabul ettikten sonra iptal eder; aksi takdirde tarayıcı onu tutar ve uzantı nedenini söyler.

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.

Uzaktan kumanda

phone ──HTTPS (paired token)──► mdm-remote ──ipc::Sink──► app (answer, remote_add)

--headless(headless.rs, #157) aynı App'yi eframe olmadan çalıştırır: bir döngü, komut kanalı tarafından uyandırılan çıplak bir egui::Context üzerinde tick'ünü (her karede logic'ün çalıştırdığı şey) çağırır ve asla ui'sını çağırmaz; komutlar, uzaktan kumandanın eklediği gibi eklenir (pencere yok). Dockerfile ve docker/ (Compose, Unraid'in şablonu) bunu bir sunucuda çalıştırır (server.md).

Sunucu, uygulamanın Tokio çalışma zamanında, yerel ağ adresine göre bir dinleyici ile çalışır. Her istek kontrol edilir (Host, Origin, belirteç), mdm_ipc::Command olarak işaretlenmiş remote (hiçbir istek satırının ayarlayamayacağı bir alan) haline getirilir ve komut satırınınkiyle aynı kanal aracılığıyla uygulamaya iletilir; uygulama, otomasyon API'sini yanıtladığı gibi, bir sonraki çerçevesinde yanıtlar. Sayfası crates/remote/web içinde oluşturulur ve metinleri uygulamanın kataloglarından (remote.rs) gelir.

Çeviriler

Kullanıcı arayüzünün gösterdiği her metin crate::i18n aracılığıyla geçer (craft-i18n katalogları, i18n/<locale>.tsv). tools/i18n/extract.py, i18n/en.tsv'ü kaynaktan yeniden oluşturur, her metin için çevirmenlere bir notla (ne olduğu, nerede gösterildiği, yer tutucuları). tools/i18n/translate.py, diğer katalogların eksiklerini ( #, machine ile işaretlenmiş satırlar) her dilin stil rehberine (i18n/style/) ve sözlüğe uygun olarak doldurur; bir kişinin incelediği bir satır asla değiştirilmez ve CI (reviewed_guard.py), bir satırı düşüren bir değişikliği başarısız kılar. Web sitesinin kendi katalogları vardır (i18n/site/, tools/website/translate_site.py).

Resimler

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).

Katkıda bulunanlar

tools/contributors.pyGitHub'ın herkese açık API'sinden, katkıda bulunanları teşekkür eden her yerde (web sitesinin ana sayfası, /contributors.html ve Haberler sayfasındaki her sürüm (build.py, her derlemede), her sürümün notları (release.yml, önceki sürümden bu yana aktif olan kişiler) ve README (python tools/contributors.py readme her sürüm hazırlığında: yuvarlak fotoğrafları art/contributors/ içinde işlenir, çünkü GitHub bir README'deki bir resmi yuvarlayamaz) için çekme isteklerini ve sorunları kimin açtığını ve kimin yorum yaptığını okur (sürdürücü, Claude ve botlar hariç tutulur).

Testler ve karşılaştırmalar

cargo testYapay olarak oluşturulan hatalarla (yavaşlayan, kesilen ve reddedilen bağlantılar, aralık isteğini desteklemeyen sunucular, değişen dosyalar) mdm-labserver üzerinde birim testleri ve uçtan uca indirme testleri çalıştırır. tools/bench, yayımlanan hız karşılaştırmasını çalıştırır; ham veriler docs/bench/'tedir.

Ücretsiz, açık kaynak, reklamsız, deneme sürümü yok.

Download GolinksPRO Download Manager