Ctrl K
ComunidadGuías…

ARCHITECTURE.ru.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# 📐 Avalon MediaCard — Архитектурное руководство и технический обзор

<p align="center">
  <a href="ARCHITECTURE.md">English</a> • <strong>Русский</strong>
</p>

В данном документе подробно описаны внутренние архитектурные паттерны, топология системы, матрица видеоплееров и инженерные принципы платформы **Avalon MediaCard**.

---

## 🏛️ Высокоуровневая архитектура системы

Платформа Avalon MediaCard построена на принципах **Чистой Архитектуры (Clean Architecture)** в рамках единой кодовой базы на **Kotlin Multiplatform (KMP)**:

```mermaid
graph TD
    subgraph Clients["Слой клиентов (Compose Multiplatform)"]
        W["Веб-клиент<br/>(WasmGC + JS)"]
        D["Десктоп-клиент<br/>(JVM: Linux / Windows / macOS)"]
        A["Android TV & Смартфоны<br/>(10-Foot D-Pad UI)"]
    end

    subgraph Core["Серверное ядро Avalon (Ktor 3.x / Netty)"]
        RPC["Шлюз сигналинга Kotlin-RPC<br/>(WebSockets)"]
        SDUI["Координатор манифестов и слотов SDUI"]
        REC["Векторный рекомендательный движок<br/>(Affinity & Decay Math)"]
        DB[("Слой базы данных<br/>(PostgreSQL 17+ / SQLite via Exposed)")]
    end

    subgraph Contract["Общий контракт и SDK"]
        SDK["avalon-media-card-core-contract<br/>(Единый источник истины)"]
    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)**<br/>*(Linux / Windows / macOS)* | **LibMPV**<br/>*(через JNA C-Interop)* | VAAPI, NVDEC, D3D11VA, VideoToolbox | Нативный пиксель-перфектный ASS/SSA | Прямой JNA-мост к памяти без оверхеда, HDR tone mapping, мгновенное переключение дорожек, поддержка любых кодеков. |
| **Android & Android TV**<br/>*(ТВ, планшеты, смартфоны)* | **AndroidX Media3**<br/>*(ExoPlayer + FFmpeg расширения)* | Android MediaCodec API | Media3 Native + Custom Overlay | **100% оптимизация под пульты (D-Pad)**, Leanback 10-foot интерфейс, встроенные расширения FFmpeg для аудио/видео. |
| **Веб (Web)**<br/>*(WasmGC и современные браузеры)* | **PlaysVideo / Mediabunny**<br/>*(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.