# π Avalon MediaCard β ΠΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ½ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΈ ΡΠ΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ
English β’ Π ΡΡΡΠΊΠΈΠΉ
Π Π΄Π°Π½Π½ΠΎΠΌ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΠ°Π½Ρ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠ΅ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ½ΡΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ½Ρ, ΡΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΌΠ°ΡΡΠΈΡΠ° Π²ΠΈΠ΄Π΅ΠΎΠΏΠ»Π΅Π΅ΡΠΎΠ² ΠΈ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠ½ΡΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ **Avalon MediaCard**.
---
## ποΈ ΠΡΡΠΎΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²Π°Ρ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ° ΡΠΈΡΡΠ΅ΠΌΡ
ΠΠ»Π°ΡΡΠΎΡΠΌΠ° Avalon MediaCard ΠΏΠΎΡΡΡΠΎΠ΅Π½Π° Π½Π° ΠΏΡΠΈΠ½ΡΠΈΠΏΠ°Ρ
**Π§ΠΈΡΡΠΎΠΉ ΠΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ (Clean Architecture)** Π² ΡΠ°ΠΌΠΊΠ°Ρ
Π΅Π΄ΠΈΠ½ΠΎΠΉ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ Π½Π° **Kotlin Multiplatform (KMP)**:
```mermaid
graph TD
subgraph Clients["Π‘Π»ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² (Compose Multiplatform)"]
W["ΠΠ΅Π±-ΠΊΠ»ΠΈΠ΅Π½Ρ
(WasmGC + JS)"]
D["ΠΠ΅ΡΠΊΡΠΎΠΏ-ΠΊΠ»ΠΈΠ΅Π½Ρ
(JVM: Linux / Windows / macOS)"]
A["Android TV & Π‘ΠΌΠ°ΡΡΡΠΎΠ½Ρ
(10-Foot D-Pad UI)"]
end
subgraph Core["Π‘Π΅ΡΠ²Π΅ΡΠ½ΠΎΠ΅ ΡΠ΄ΡΠΎ Avalon (Ktor 3.x / Netty)"]
RPC["Π¨Π»ΡΠ· ΡΠΈΠ³Π½Π°Π»ΠΈΠ½Π³Π° Kotlin-RPC
(WebSockets)"]
SDUI["ΠΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠΎΡ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΎΠ² ΠΈ ΡΠ»ΠΎΡΠΎΠ² SDUI"]
REC["ΠΠ΅ΠΊΡΠΎΡΠ½ΡΠΉ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠ΅Π»ΡΠ½ΡΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ
(Affinity & Decay Math)"]
DB[("Π‘Π»ΠΎΠΉ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
(PostgreSQL 17+ / SQLite via Exposed)")]
end
subgraph Contract["ΠΠ±ΡΠΈΠΉ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ ΠΈ SDK"]
SDK["avalon-media-card-core-contract
(ΠΠ΄ΠΈΠ½ΡΠΉ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΠΈΡΡΠΈΠ½Ρ)"]
end
subgraph Plugins["ΠΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΡΠ΅Π΄Π° ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ²"]
P1["Π Π΅Π·ΠΎΠ»Π²Π΅ΡΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
"]
P2["P2P ΠΈ ΠΊΠ΅ΡΠΈΡΡΡΡΠΈΠ΅ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΡ"]
P3["ΠΡΠΎΠΊΡΠΈ ΡΡΡΠΈΠΌΠΎΠ² ΠΈ Π±Π°Π»Π°Π½ΡΠ΅ΡΠΎΠ²"]
end
W <==>|"ΠΠ²ΡΡΡΠΎΡΠΎΠ½Π½ΠΈΠΉ RPC-ΡΠΈΠ³Π½Π°Π»ΠΈΠ½Π³"| RPC
D <==>|"ΠΠ²ΡΡΡΠΎΡΠΎΠ½Π½ΠΈΠΉ RPC-ΡΠΈΠ³Π½Π°Π»ΠΈΠ½Π³"| RPC
A <==>|"ΠΠ²ΡΡΡΠΎΡΠΎΠ½Π½ΠΈΠΉ RPC-ΡΠΈΠ³Π½Π°Π»ΠΈΠ½Π³"| RPC
RPC <--> SDUI
RPC <--> REC
SDUI <--> DB
REC <--> DB
Core <-->|"ΠΠ·ΠΎΠ»ΡΡΠΈΡ ClassLoader Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ"| Contract
Contract --- P1
Contract --- P2
Contract --- P3
```
---
## π¬ Π£Π½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ° Π²ΠΈΠ΄Π΅ΠΎΠΏΠ»Π΅Π΅ΡΠΎΠ²
Π’ΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΡΠ΅ ΠΌΠ΅Π΄ΠΈΠ°ΡΠ΅ΡΠ²Π΅ΡΡ (ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Plex ΠΈΠ»ΠΈ Jellyfin) ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠ»ΠΎΡΡΠ°Π»ΡΠ½ΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ Π½Π° ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ Ρ
ΠΎΡΡΠ° Π·Π° ΡΡΠ΅Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠ³ΠΎ ΡΡΠ°Π½ΡΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΠΈΠ΄Π΅ΠΎ, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π°ΡΠ΄ΠΈΠΎΠ΄ΠΎΡΠΎΠΆΠ΅ΠΊ ΠΈ Β«Π²ΠΏΠ΅ΠΊΠ°Π½ΠΈΡΒ» ΡΠ»ΠΎΠΆΠ½ΡΡ
Π²Π΅ΠΊΡΠΎΡΠ½ΡΡ
`.ass/.ssa` ΡΡΠ±ΡΠΈΡΡΠΎΠ².
Π Avalon MediaCard ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΈΠ½ΠΎΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ β **Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ° Ρ Π½ΡΠ»Π΅Π²ΡΠΌ ΡΡΠ°Π½ΡΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅**: 100% Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΡΠ±ΡΠΈΡΡΠΎΠ² Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π½Π° ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ΅ΡΠ΅Π· Π½Π°ΡΠΈΠ²Π½ΡΠ΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ Π΄Π²ΠΈΠΆΠΊΠΈ:
| Π¦Π΅Π»Π΅Π²Π°Ρ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° | ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ | ΠΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠ΅ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅ | ΠΡΡΠΈΡΠΎΠ²ΠΊΠ° ΡΡΠ±ΡΠΈΡΡΠΎΠ² | ΠΠ»ΡΡΠ΅Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ |
|---|---|---|---|---|
| **ΠΠ (Desktop)**
*(Linux / Windows / macOS)* | **LibMPV**
*(ΡΠ΅ΡΠ΅Π· JNA C-Interop)* | VAAPI, NVDEC, D3D11VA, VideoToolbox | ΠΠ°ΡΠΈΠ²Π½ΡΠΉ ΠΏΠΈΠΊΡΠ΅Π»Ρ-ΠΏΠ΅ΡΡΠ΅ΠΊΡΠ½ΡΠΉ ASS/SSA | ΠΡΡΠΌΠΎΠΉ JNA-ΠΌΠΎΡΡ ΠΊ ΠΏΠ°ΠΌΡΡΠΈ Π±Π΅Π· ΠΎΠ²Π΅ΡΡ
Π΅Π΄Π°, HDR tone mapping, ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΡΠΎΠΆΠ΅ΠΊ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π»ΡΠ±ΡΡ
ΠΊΠΎΠ΄Π΅ΠΊΠΎΠ². |
| **Android & Android TV**
*(Π’Π, ΠΏΠ»Π°Π½ΡΠ΅ΡΡ, ΡΠΌΠ°ΡΡΡΠΎΠ½Ρ)* | **AndroidX Media3**
*(ExoPlayer + FFmpeg ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ)* | Android MediaCodec API | Media3 Native + Custom Overlay | **100% ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΠ΄ ΠΏΡΠ»ΡΡΡ (D-Pad)**, Leanback 10-foot ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ FFmpeg Π΄Π»Ρ Π°ΡΠ΄ΠΈΠΎ/Π²ΠΈΠ΄Π΅ΠΎ. |
| **ΠΠ΅Π± (Web)**
*(WasmGC ΠΈ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π±ΡΠ°ΡΠ·Π΅ΡΡ)* | **PlaysVideo / Mediabunny**
*(HLS, DASH, MPEG-TS, MP4)* | WebGL / Canvas Direct Draw | WebVTT / ASS.js Canvas | **ΠΠ½ΡΡΡΠΈΠ±ΡΠ°ΡΠ·Π΅ΡΠ½ΡΠΉ Wasm-FFmpeg ΡΡΠ°Π½ΡΠΊΠΎΠ΄Π΅Ρ:** ΠΠΎΠ½Π²Π΅ΠΉΠ΅Ρ Π² Web Worker ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ HEVC/AC3/E-AC3/DTS ΠΏΡΡΠΌΠΎ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ ΠΏΡΠΈ **Π½ΡΠ»Π΅Π²ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠ΅ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ**. |
---
## π₯οΈ Π‘Π΅ΡΠ²Π΅ΡΠ½ΡΠΉ ΡΠ»ΠΎΠΉ (Backend)
* **Π€ΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ ΠΈ ΡΡΠ°Π½ΡΠΏΠΎΡΡ:** **Ktor 3.x** Π½Π° Π΄Π²ΠΈΠΆΠΊΠ΅ Netty Ρ Π΄Π²ΡΠ½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠΌ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠΌ **Kotlin-RPC (`kotlinx-rpc`)** ΠΏΠΎΠ²Π΅ΡΡ
WebSockets.
* **ΠΠ°Π·Π° Π΄Π°Π½Π½ΡΡ
ΠΈ ORM:** SQLite / PostgreSQL 17+ ΠΏΠΎΠ΄ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ **JetBrains Exposed ORM**. ΠΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Ρ Π²Π½ΡΡΡΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΡ
`newSuspendedTransaction(Dispatchers.IO)`. ΠΡΠ·ΠΎΠ²Ρ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΡΡΡ ΠΏΠΎΡΠΎΠΊΠΈ ΠΊΠΎΡΡΡΠΈΠ½.
* **ΠΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²Π΅ΠΊΡΠΎΡΠ½ΡΠΉ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠ΅Π»ΡΠ½ΡΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ:** Π Π°ΡΡΡΠΈΡΡΠ²Π°Π΅Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅ΡΠ½ΡΠ΅ Π²Π΅ΠΊΡΠΎΡΡ Π±Π»ΠΈΠ·ΠΎΡΡΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎ ΠΆΠ°Π½ΡΠ°ΠΌ, ΡΠ΅Π³Π°ΠΌ, ΡΠ΅ΠΆΠΈΡΡΠ΅ΡΠ°ΠΌ, Π°ΠΊΡΠ΅ΡΡΠΊΠΎΠΌΡ ΡΠΎΡΡΠ°Π²Ρ, Π³ΠΎΠ΄Π°ΠΌ Π²ΡΠΏΡΡΠΊΠ°, ΡΠ΅ΠΌΠΏΡ ΠΈ Π½Π°ΡΡΡΠΎΠ΅Π½ΠΈΡ. ΠΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π°ΡΡΡ
Π°Π½ΠΈΠ΅ Π΄Π»Ρ ΡΡΠ°ΡΡΡ
ΠΏΡΠΎΡΠΌΠΎΡΡΠΎΠ² ΠΈ ΡΠ°ΠΊΡΠΎΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ
Π½Π°Ρ
ΠΎΠ΄ΠΎΠΊ (serendipity) Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΏΠΎΠ»ΠΎΠΊ.
* **ΠΠ²ΠΈΠΆΠΎΠΊ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° (Watch Party):** Π£ΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠΎΠΌΠ½Π°ΡΠ°ΠΌΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° Ρ ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠ°ΡΠΈΠ΅ΠΉ ΡΠ΅ΡΠ΅Π²ΡΡ
Π·Π°Π΄Π΅ΡΠΆΠ΅ΠΊ, ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΎΠΏΠΎΡΠ½ΡΡ
ΡΠ°ΠΉΠΌΠΊΠΎΠ΄ΠΎΠ² (anchor positions) ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°ΡΡΠΎΠ²ΡΠΌ Π»ΠΎΠ±Π±ΠΈ ΡΠΎ ΡΡΠ°ΡΡΡΠ°ΠΌΠΈ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ² (*Β«Π‘ΠΌΠΎΡΡΡ ΠΌΠΎΠ»ΡΠ°Β»*, *Β«ΠΠΎΡΠΎΠ² ΠΎΠ±ΡΡΠΆΠ΄Π°ΡΡΒ»*).
---
## π§© ΠΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΡΠ΅Π΄Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ²
Π‘Π΅ΡΠ²Π΅Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ΄Π³ΡΡΠΆΠ°Π΅Ρ ΠΏΠ»Π°Π³ΠΈΠ½Ρ ΠΈΠ· ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° `plugins/` ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΈΠ»ΠΈ Β«Π½Π° Π»Π΅ΡΡΒ» (hot-reload) ΡΠ΅ΡΠ΅Π· ΠΏΠ°Π½Π΅Π»Ρ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ°:
1. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΠ»Π°Π³ΠΈΠ½ `.jar` ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈΡΡΠ΅ΡΡΡ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ Π΄ΠΎΡΠ΅ΡΠ½Π΅ΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ΅ `URLClassLoader`.
2. ΠΠ»Π°Π³ΠΈΠ½Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡΡ Ρ ΡΠ΄ΡΠΎΠΌ ΡΡΡΠΎΠ³ΠΎ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ [`avalon-media-card-core-contract`](https://github.com/ensodai/avalon-media-card-core-contract) (ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ `AvalonPlugin`, `PluginContext`).
3. ΠΡΠΈ ΡΠ±ΠΎΠ΅ ΠΈΠ»ΠΈ Π½Π΅ΠΏΠ΅ΡΠ΅Ρ
Π²Π°ΡΠ΅Π½Π½ΠΎΠΌ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ Π² ΡΡΠΎΡΠΎΠ½Π½Π΅ΠΌ ΠΊΠΎΠ΄Π΅ ΠΏΠ»Π°Π³ΠΈΠ½ ΠΈΠ·ΠΎΠ»ΠΈΡΡΠ΅ΡΡΡ, ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Ρ ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ°.
4. ΠΠΎΡΡΡΠ°Ρ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠ° Π²ΡΠ³ΡΡΠΆΠ°Π΅Ρ ClassLoader ΡΡΠ°ΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ, ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ ΡΠ΅ΡΡΡΡΡ, ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ Π±Π΅Π· ΠΎΠ±ΡΡΠ²Π° Π°ΠΊΡΠΈΠ²Π½ΡΡ
Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠΉ.
---
## π± ΠΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΉ ΡΠ»ΠΎΠΉ (UI)
* **100% ΠΎΠ±ΡΠΈΠΉ Π³ΡΠ°Ρ Compose Multiplatform:** ΠΠ΄ΠΈΠ½Π°Ρ Π΄ΠΈΠ·Π°ΠΉΠ½-ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΈ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Ρ ΠΈΠ· ΠΎΠ±ΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π° Π΄Π»Ρ Desktop JVM, Web (WasmGC) ΠΈ Android.
* **Server-Driven UI (SDUI):** ΠΠΊΡΠ°Π½Ρ ΡΠΎΡΠΌΠΈΡΡΡΡΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΈΠ· ΡΠ·Π»ΠΎΠ²-ΡΠ»ΠΎΡΠΎΠ² (`HeroBanner`, `Carousel`, `ExploreGrid`, `DetailsView`). ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΡΡΡΠΊΡΡΡΡ ΡΠΊΡΠ°Π½Π° ΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ Π² Π²ΠΈΠ΄Π΅ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΡΡ
Flow ΡΠ΅ΡΠ΅Π· WebSocket.
* **ΠΠΏΡΡ 10-Foot TV:** ΠΠ°ΡΠΊΡΠ°Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Android TV ΡΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ Ρ ΡΡΠ΅ΡΠΎΠΌ ΡΠΎΠΊΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΠΏΡΠ»ΡΡΠΎΠΌ (D-Pad ΠΊΠΎΠ»ΡΡΠ° ΡΠΎΠΊΡΡΠ°, Π°Π½ΠΈΠΌΠ°ΡΠΈΡ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ°ΡΡΠΎΡΠ΅ΠΊ, Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠΏΠΈΡΠΊΠΈ ΡΠΏΠΈΠ·ΠΎΠ΄ΠΎΠ²).
---
## π οΈ Π‘Π±ΠΎΡΠΊΠ° Π²ΡΠ΅ΠΉ ΡΠΊΠΎΡΠΈΡΡΠ΅ΠΌΡ ΠΈΠ· ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°
### Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ
* JDK 21+ (ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ OpenJDK ΠΈΠ»ΠΈ Eclipse Temurin)
* Android SDK (build-tools 35+, platform 35) Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ Android
* Node.js & Yarn (Gradle ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΈ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅Ρ ΠΈΡ
Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π΄Π»Ρ ΡΠ°ΡΠ³Π΅ΡΠΎΠ² Wasm/JS)
### ΠΠΎΠΌΠ°Π½Π΄Ρ ΡΠ±ΠΎΡΠΊΠΈ
```bash
# 1. ΠΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ
git clone https://github.com/ensodai/avalon-media-card.git
cd avalon-media-card
# 2. ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
cp .env.example .env
# 3. ΠΠ°ΠΏΡΡΠΊ ΡΠ΅ΡΠ²Π΅ΡΠ° Ktor
./gradlew :server:run
# 4. ΠΠ°ΠΏΡΡΠΊ Π΄Π΅ΡΠΊΡΠΎΠΏΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (JVM)
./gradlew :desktopApp:run
# 5. Π‘Π±ΠΎΡΠΊΠ° ΡΠ΅Π»ΠΈΠ·Π½ΠΎΠ³ΠΎ APK Π΄Π»Ρ Android
./gradlew :androidApp:assembleRelease
# 6. Π‘Π±ΠΎΡΠΊΠ° WebAssembly Π±Π°Π½Π΄Π»Π° Π΄Π»Ρ Π±ΡΠ°ΡΠ·Π΅ΡΠ°
./gradlew :web:wasmJsBrowserDistribution
```
---
## π Π‘Π²ΡΠ·Π°Π½Π½Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ
* [ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ README](README.ru.md) β ΠΡΡΡΡΡΠΉ Π·Π°ΠΏΡΡΠΊ ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ.
* [SDK ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ° ΡΠ΄ΡΠ°](https://github.com/ensodai/avalon-media-card-core-contract) β ΠΠΎΠ»Π½Π°Ρ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², ΡΠ»ΠΎΡΠΎΠ² SDUI ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² RPC.