Arhitectura
Expert
Află unde stă codul și ce reguli se aplică, înainte să schimbi ceva mare.
Pe scurt
Link către Pe scurtHolyArrs este un singur program Go cu aplicația web inclusă. Servește aplicația web și un API JSON pe portul 6262 și își ține datele în 2 fișiere SQLite din dosarul de configurare. Apelează programe de descărcare, Surse (prin Jackett sau Prowlarr), servere media, canale de alerte și serverul de metadate HolyArrs.
Urmărește o singură cerere. Cineva cere un film în Explore.
requestsnotează cererea.- După aprobare,
moviescere variante de lasources. - Regulile de alegere din
mediafilesle notează cu puncte. downloadstrimite cea mai bună variantă la programul de descărcare.- Când se termină,
mediafilesimportă fișierul. mediaserversșialertssunt anunțate.
Harta codului
Link către Harta coduluiapp/backend/cmd/holyarrs/ main.go starts the program; wiring.go builds the modules and joins themapp/backend/internal/<module>/ one flat folder per moduleapp/backend/internal/core/ plumbing every module may useapp/backend/tools/ dev-only programsapp/frontend/ the SvelteKit web app; embed.go bundles its buildapp/frontend/src/routes/<page>/ thin pages that combine module partsapp/frontend/src/lib/<module>/ each module's web codeapp/frontend/src/lib/ui/ parts used by 2 or more modules, and nothing elseapp/frontend/src/lib/core/ server client, app state, helpersapp/tests/ end-to-end tests (Playwright)deploy/ the Dockerfile and release scriptsdocs/ guides and these pagesgo.mod stă în rădăcina depozitului, pentru că go:embed nu poate ajunge într-un dosar părinte.
Unde găsești ce
Link către Unde găsești ce| Vrei să schimbi | Caută în |
|---|---|
| Cum se alege o variantă | internal/mediafiles |
| Un client de program de descărcare | internal/downloads, teste de contract în internal/downloads/conformance_test.go |
| Un canal de alerte | internal/alerts |
| Conectare, utilizatori, chei API | internal/accounts |
| Asistentul de la prima pornire | internal/setup, app/frontend/src/routes/welcome |
| Importul unui fișier terminat (despachetare, etichete, potrivire) | internal/importer |
| Dosarele Bibliotecii, preluare și redenumire | internal/library |
| Cum se aleg și se ordonează rândurile și rafturile | internal/suggest |
| Ce părți din aplicație sunt pornite | internal/core/parts |
| Adresa unei pagini | app/frontend/src/routes/ |
| O migrare | internal/core/database/migrations/ |
| Imaginea Docker | deploy/Dockerfile |
Regulile
Link către RegulileVerificările din app/backend/tools/structurecheck opresc build-ul când se încalcă o regulă. Le rulezi cu linia din Testare.
- Ordinea straturilor. Un modul importă doar module de pe un strat mai jos, și doar pachetul lor de bază. Modulele de pe același strat nu se importă niciodată între ele.
- Apel în sus. Când un modul de jos are nevoie de ceva de la unul de sus, cel de sus trimite în jos date simple, sau cel de jos definește o interfață mică pe care o completează
wiring.go. - SQL rămâne acasă. Doar fișierele
store*.goale unui modul conțin SQL, și doar pentru tabelele lui. Ca să citești rândurile altui modul, apelează serviciul lui. - Tabelele comune aparțin lui core. Ajungi la
settings,schedules,secrets,jobsșieventsprin ajutoarele din core. - O singură ieșire. Orice apel spre exterior trece prin
core/outbound. - Funcțiile reținute înregistrează un comutator în
core/startup. Cât timp e oprit, ruta nu există, iar pagina ascunde funcția. - Fără pachete cu de toate. Fără
util,common,sharedsauhelpers.
Ordinea straturilor e în Module.
Pentru experți
Link către Pentru experțiÎn interiorul unui modul
Fiecare modul din backend folosește aceleași nume de fișiere.
| Fișier | Conține |
|---|---|
routes.go |
Rutele API, fiecare cu permisiunea de care are nevoie |
service.go și fișierele pe teme |
Logica pe care o apelează alte module |
store.go, store_<topic>.go |
Tot SQL-ul pentru tabelele proprii ale modulului |
types.go |
Înregistrările modulului |
În partea web, lib/<module>/ conține index.ts (ce pot folosi alte module), părțile lui Svelte și testele lor, plus api.ts și state.svelte.ts doar când are apeluri sau stare proprii.
Pachetele core
Core este instalația de bază. Nu are reguli de produs și nu importă niciun modul.
| Pachet | Conține |
|---|---|
core/database |
Deschiderea și migrarea ambelor fișiere SQLite, ajutoare pentru interogări, setări și evenimente, câmpuri comune de rând, tăierea istoricului |
core/files |
Ajutoare pentru fișiere și dosare, spațiu liber pe disc |
core/releasename |
Calitate, grup și numere de episod dintr-un nume de variantă |
core/outbound |
Singura cale de a apela servere externe, cu verificări de adresă |
core/secrets |
Depozitul de chei și rotirea cheilor |
core/logs |
Jurnalul aplicației și notele de oprire forțată |
core/jobs |
Coada de sarcini, programele și buclele care repornesc după o cădere |
core/webserver |
Instalația routerului, URL base, compresie, trimitere live |
core/startup |
Utilizatorul de rulare, mod cu memorie puțină, comutatoare pentru funcții reținute, limită de memorie, părți |
core/parts |
Comutatoarele de părți pe care le întreabă fiecare modul înainte să servească sau să ruleze |
core/model |
Tipuri comune, cum ar fi actori și subiecte |
Când core trebuie să atingă datele unui modul, modulul înregistrează un cârlig în core, în wiring.go. Rotirea cheilor funcționează așa.
Datele
| Fișier | Conține |
|---|---|
holyarrs.db |
Biblioteca, cererile, setările și tot ce contează |
holyarrs-events.db |
Istoricul și alte rânduri de evenimente. Crește și e tăiat fără să atingă fișierul principal |
Migrările sunt fișiere SQL numerotate în core/database/migrations/main și core/database/migrations/events. Rulează la pornire.
Vezi și
Link către Vezi șiHolyArrs este gratuit. Dacă ți-a economisit timp, dă-i o stea pe GitHub, sponsorizează-l sau cumpără-mi o cafea.