# 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) — чтение метаданных аудиофайлов