Files
GenAudioBookInfo/README.md

87 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# GenAudioBookInfo
[![](https://img.shields.io/badge/Go-1.23+-00ADD8?logo=go)](https://go.dev "Go version")
[![](https://img.shields.io/gitea/v/release/fofanov/genaudiobookinfo?gitea_url=https://github.dfv24.com&label=release)](https://github.dfv24.com/fofanov/genaudiobookinfo/releases/latest "Latest release")
[![](https://img.shields.io/gitea/last-commit/fofanov/genaudiobookinfo?gitea_url=https://github.dfv24.com)](https://github.dfv24.com/fofanov/genaudiobookinfo/commits/branch/main "Last Commit")
[![](https://img.shields.io/gitea/issues/open/fofanov/genaudiobookinfo?gitea_url=https://github.dfv24.com)](https://github.dfv24.com/fofanov/genaudiobookinfo/issues "Open Issues")
[![](https://img.shields.io/badge/License-MIT-blue.svg)](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) — чтение метаданных аудиофайлов