Добавлены страницы вики для GenAudioBookInfo: Home, Installation, Makefile, OpenRouter, Output Structure, TorrAPI и Sidebar.
Создана структура документации, описывающая функциональность, установку, использование CLI, архитектуру и интеграции с TorrAPI и OpenRouter. Добавлены примеры конфигурации и метаданных, а также описание структуры выходных данных.
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
# Архитектура
|
||||
|
||||
GenAudioBookInfo построен по принципам **Чистой архитектуры** (Clean Architecture / Hexagonal Architecture).
|
||||
Бизнес-логика не зависит от внешних библиотек, баз данных или UI-фреймворков.
|
||||
|
||||
---
|
||||
|
||||
## Слои
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────┐
|
||||
│ cmd/genaudiobookinfo/main.go (Composition Root / DI) │
|
||||
├──────────────────────────────────────────────────────────┤
|
||||
│ presentation/ TUI, ConsoleLogger, Presenter │
|
||||
├──────────────────────────────────────────────────────────┤
|
||||
│ usecase/ Бизнес-логика. Нет зависимостей │
|
||||
│ от infra, только интерфейсы │
|
||||
├──────────────────────────────────────────────────────────┤
|
||||
│ domain/ Сущности + интерфейсы (порты) │
|
||||
├──────────────────────────────────────────────────────────┤
|
||||
│ infrastructure/ Адаптеры: FS, HTTP, теги, YAML │
|
||||
└──────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
Зависимости направлены **внутрь**: `main → usecase → domain ← infrastructure`.
|
||||
|
||||
---
|
||||
|
||||
## Структура папок
|
||||
|
||||
```
|
||||
genaudiobookinfo/
|
||||
├── cmd/
|
||||
│ └── genaudiobookinfo/
|
||||
│ └── main.go # Точка входа, DI, TUI запуск
|
||||
├── internal/
|
||||
│ ├── domain/
|
||||
│ │ ├── audiobook.go # Агрегат AudioBookInfo, EnrichedBookInfo
|
||||
│ │ ├── llm.go # Интерфейс LLMClient
|
||||
│ │ ├── ports.go # Все порты: FolderLister, MetadataExtractor,
|
||||
│ │ │ # TorrentSearcher, ResultWriter, CoverDownloader,
|
||||
│ │ │ # ProcessLogger, ProcessResult
|
||||
│ │ └── torrent.go # Сущности TorrentInfo, TorrentDetail
|
||||
│ ├── usecase/
|
||||
│ │ └── scan_audiobooks.go # Конвейер (Pipeline + Fan-Out/Fan-In)
|
||||
│ ├── infrastructure/ # Адаптеры (реализации портов)
|
||||
│ │ ├── folder_lister.go # FSFolderLister
|
||||
│ │ ├── metadata_extractor.go # TagMetadataExtractor (dhowden/tag)
|
||||
│ │ ├── torrapi_client.go # TorrAPIClient (HTTP)
|
||||
│ │ ├── result_writer.go # FSResultWriter (создание папок, JSON, копирование)
|
||||
│ │ ├── cover_downloader.go # HTTPCoverDownloader
|
||||
│ │ ├── openrouter_client.go # OpenRouterClient (LLM через REST)
|
||||
│ │ ├── audio_utils.go # Утилиты: длительность, формат, список файлов
|
||||
│ │ ├── console_windows.go # SetConsoleUTF8 для Windows
|
||||
│ │ └── console_other.go # Заглушка для non-Windows
|
||||
│ ├── nameparser/
|
||||
│ │ └── parser.go # Разбор "Автор - Название" из имени папки
|
||||
│ └── presentation/
|
||||
│ ├── tui_logger.go # TUILogger (Bubbletea, Dracula)
|
||||
│ ├── console_logger.go # ConsoleLogger (fallback без TUI)
|
||||
│ └── console_presenter.go # Финальная сводка в stdout
|
||||
├── config.yaml
|
||||
├── go.mod
|
||||
├── go.sum
|
||||
├── Makefile
|
||||
└── README.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Интерфейсы (порты)
|
||||
|
||||
Определены в `internal/domain/ports.go`:
|
||||
|
||||
| Интерфейс | Назначение | Адаптер |
|
||||
|---|---|---|
|
||||
| `FolderLister` | Перечислить подпапки | `FSFolderLister` |
|
||||
| `MetadataExtractor` | Извлечь теги из аудиофайла | `TagMetadataExtractor` |
|
||||
| `TorrentSearcher` | Поиск + детали раздачи | `TorrAPIClient` |
|
||||
| `ResultWriter` | Записать результат на диск | `FSResultWriter` |
|
||||
| `CoverDownloader` | Скачать обложку | `HTTPCoverDownloader` |
|
||||
| `LLMClient` | Нормализовать автора/название | `OpenRouterClient` |
|
||||
| `ProcessLogger` | Отчитываться о прогрессе | `TUILogger` / `ConsoleLogger` |
|
||||
|
||||
---
|
||||
|
||||
## Паттерны
|
||||
|
||||
| Паттерн | Где применён |
|
||||
|---|---|
|
||||
| Pipeline | `ExecuteForFolders` → `processOneBook` → writer |
|
||||
| Fan-Out / Fan-In | Worker Pool в `ExecuteForFolders` |
|
||||
| Semaphore | `searchSem` — ограничение параллелизма к TorrAPI |
|
||||
| Dependency Injection | `main.go` — Composition Root без фреймворка |
|
||||
| Repository / Port-Adapter | Все `infrastructure/` адаптеры |
|
||||
| Strategy | `ProcessLogger` — TUI или Console выбирается в `main.go` |
|
||||
| Graceful Shutdown | `context.WithTimeout` + `signal.Notify` (SIGINT, SIGTERM) |
|
||||
|
||||
---
|
||||
|
||||
## TUI (Bubbletea)
|
||||
|
||||
`presentation/tui_logger.go` реализует полноэкранный интерфейс:
|
||||
|
||||
- **Верхняя панель**: текущая книга, статус, прогресс-бар `N / Total`, спиннер, последние 5 событий
|
||||
- **Нижняя панель**: полный лог с цветами (Dracula palette)
|
||||
|
||||
Цветовая схема:
|
||||
|
||||
| Тип | Цвет |
|
||||
|---|---|
|
||||
| INFO | `#00FFFF` cyan |
|
||||
| WARN | `#FFFF00` yellow |
|
||||
| ERROR | `#FF5555` red |
|
||||
| OK | `#50FA7B` green |
|
||||
| DEBUG | `#6272A4` gray |
|
||||
Reference in New Issue
Block a user