89 lines
5.4 KiB
Markdown
89 lines
5.4 KiB
Markdown
# GenAudioBookInfo
|
||
|
||
[](https://go.dev "Go version")
|
||
[](https://github.dfv24.com/fofanov.dmitry/GenAudioBookInfo/releases/latest "Latest release")
|
||
[](https://github.dfv24.com/fofanov.dmitry/GenAudioBookInfo/commits/branch/master "Last Commit")
|
||
[](https://github.dfv24.com/fofanov.dmitry/GenAudioBookInfo/issues "Open Issues")
|
||
[](https://github.dfv24.com/fofanov.dmitry/GenAudioBookInfo/issues?type=comment&state=closed "Closed Issues")
|
||
[](https://github.dfv24.com/fofanov.dmitry/GenAudioBookInfo "Languages")
|
||
[](https://opensource.org/licenses/MIT "License: MIT")
|
||
|
||
Go-утилита для обработки аудиокниг: сканирует папки, извлекает/нормализует теги, ищет данные через TorrAPI, (опционально) валидирует через OpenRouter, генерирует metadata.json (AudioBookShelf) и раскладывает по структуре.
|
||
|
||
**Что делает программа:**
|
||
|
||
1. **Сканирует** каталог и находит папки с аудиофайлами (MP3, M4B, FLAC и др.)
|
||
2. **Извлекает метаданные** из тегов первого аудиофайла (автор, название, жанр, год)
|
||
3. **Исправляет кодировку** — автоматически устраняет mojibake в тегах (UTF-8 → Latin-1)
|
||
4. **Валидирует метаданные** через LLM (OpenRouter) — нормализует формат автора, убирает мусор из названия
|
||
5. **Ищет аудиокнигу** на торрент-трекерах через TorrAPI (RuTracker, Kinozal, NoNameClub, RuTor) — получает описание, постер, жанр
|
||
6. **Скачивает обложку** (`cover.jpg`) из найденной раздачи
|
||
7. **Формирует `metadata.json`** в формате [AudioBookShelf](https://www.audiobookshelf.org/) с главами, нарраторами, серией
|
||
8. **Организует файлы** в структурированную иерархию: `result/<Буква>/<Автор>/<Автор - Название [Год]>/`
|
||
|
||
Обработка ведётся **параллельно** (настраиваемый пул воркеров) с отображением прогресс-бара и поддержкой graceful shutdown.
|
||
|
||
## Архитектура
|
||
|
||
Проект построен по принципам **Clean Architecture**:
|
||
|
||
```
|
||
cmd/
|
||
genaudiobookinfo/
|
||
main.go ← Composition Root (точка входа, DI)
|
||
|
||
internal/
|
||
domain/
|
||
audiobook.go ← Сущности (entities)
|
||
ports.go ← Интерфейсы-порты (FolderLister, MetadataExtractor, Presenter)
|
||
|
||
usecase/
|
||
scan_audiobooks.go ← Бизнес-логика (Fan-Out / Fan-In, Worker Pool)
|
||
|
||
infrastructure/
|
||
folder_lister.go ← Реализация FolderLister (файловая система)
|
||
metadata_extractor.go ← Реализация MetadataExtractor (dhowden/tag)
|
||
audio_utils.go ← Утилиты (определение аудиоформатов)
|
||
|
||
presentation/
|
||
console_presenter.go ← Реализация Presenter (форматированный вывод)
|
||
```
|
||
|
||
### Паттерны
|
||
|
||
| Паттерн | Где применяется |
|
||
|---|---|
|
||
| **Clean Architecture** | Разделение на domain / usecase / infrastructure / presentation |
|
||
| **Dependency Injection** | Конструкторы принимают интерфейсы, Composition Root в `main.go` |
|
||
| **Ports & Adapters** | `domain/ports.go` — порты; infrastructure и presentation — адаптеры |
|
||
| **Fan-Out / Fan-In** | `usecase/scan_audiobooks.go` — параллельное сканирование через каналы |
|
||
| **Worker Pool** | Настраиваемое количество горутин-воркеров |
|
||
| **Graceful Shutdown** | Обработка SIGINT/SIGTERM через `context.Context` |
|
||
|
||
## Сборка
|
||
|
||
```bash
|
||
go build -o genaudiobookinfo.exe ./cmd/genaudiobookinfo/
|
||
```
|
||
|
||
## Использование
|
||
|
||
```bash
|
||
# Сканировать каталог с аудиокнигами
|
||
genaudiobookinfo.exe D:\Audiobooks
|
||
|
||
# Указать количество воркеров
|
||
genaudiobookinfo.exe -workers 8 D:\Audiobooks
|
||
|
||
# Установить таймаут
|
||
genaudiobookinfo.exe -timeout 60s D:\Audiobooks
|
||
```
|
||
|
||
## Поддерживаемые форматы
|
||
|
||
MP3, M4A, M4B, OGG, OPUS, FLAC, WMA, AAC, WAV
|
||
|
||
## Зависимости
|
||
|
||
- [dhowden/tag](https://github.com/dhowden/tag) — чтение метаданных аудиофайлов
|