- Реализовать тесты для поиска MP3-файлов и переименования/организации папок книг в репозитории файловой системы. - Создать FileLogger для записи сообщений в файл с поддержкой различных уровней журналирования и управления размером файлов. - Разработать репозиторий RuTracker для обработки поиска торрентов, получения метаданных и загрузки торрент-файлов. - Добавить тесты для нормализации URL в репозиторий RuTracker. - Реализовать адаптер логгера TUI для отображения логов в терминальном интерфейсе и, при необходимости, для записи логов в базовый логгер. - Создать менеджер TUI для управления пользовательским интерфейсом приложения, включая главное меню, экран обработки, настройки и отображение результатов.
152 lines
7.1 KiB
Markdown
152 lines
7.1 KiB
Markdown
# AudioBook Catalyst
|
||
|
||
AudioBook Catalyst — утилита для автоматической обработки аудиокниг: поиск метаданных на RuTracker, формирование глав, скачивание обложек, сохранение metadata.json и организация папок библиотеки.
|
||
|
||
## Возможности
|
||
- Сканирование директории с аудиокнигами (MP3).
|
||
- Поиск и парсинг метаданных со страниц RuTracker.
|
||
- Извлечение полей: Title, Subtitle, Authors, Narrators, Series, Genres, Year, Publisher, Description, Chapters, Tags.
|
||
- Корректный парсинг заголовка из `<span style="font-size: 24px">` и подзаголовка из `<title>` без хвостов `RuTracker.org`.
|
||
- Скачивание обложки и сохранение `cover.jpg/png`.
|
||
- Автоматическое создание глав по MP3-файлам с примерной длительностью, стартами/финишами.
|
||
- Переименование папки книги по подзаголовку и перенос в организованную библиотеку: `organized/<Буква>/<Автор>/<Книга>`.
|
||
- TUI-интерфейс на базе tview.
|
||
- Логи в TUI и файл.
|
||
|
||
## Структура проекта
|
||
```
|
||
internal/
|
||
application/
|
||
usecases/ # Процессы: обработка аудиокниг
|
||
domain/
|
||
entities/ # Сущности: AudioBook, AudioBookMetadata, Torrent, ...
|
||
repositories/ # Интерфейсы репозиториев (FS, RuTracker, Logger)
|
||
services/ # Бизнес-логика: AudioBookService, MetadataService
|
||
infrastructure/
|
||
config/ # Репозиторий конфигурации (YAML)
|
||
filesystem/ # Репозиторий файловой системы
|
||
logging/ # Логирование
|
||
rutracker/ # Клиент RuTracker, парсинг страниц
|
||
presentation/
|
||
tui/ # TUI интерфейс
|
||
cmd/ # Точка входа приложения
|
||
README.md # Это описание
|
||
Makefile # Команды сборки/тестов
|
||
config.yaml(.example) # Конфигурация
|
||
```
|
||
|
||
## Установка
|
||
Требуется Go 1.21+.
|
||
|
||
```powershell
|
||
# Клонируйте репозиторий и перейдите в папку проекта
|
||
# Установите зависимости
|
||
make deps
|
||
# Сборка
|
||
make build
|
||
# Запуск
|
||
make run
|
||
```
|
||
|
||
Если не используете Makefile, можно собрать так:
|
||
```powershell
|
||
$env:GOOS='windows'; $env:GOARCH='amd64'; $env:CGO_ENABLED='1'; go build -o audio-catalyst.exe ./cmd
|
||
./audio-catalyst.exe
|
||
```
|
||
|
||
## Конфигурация
|
||
Файл `config.yaml`:
|
||
```yaml
|
||
scanner:
|
||
source_directory: "./audiobooks"
|
||
target_directory: "./organized"
|
||
|
||
rutracker:
|
||
base_url: "https://rutracker.org/forum/tracker.php"
|
||
user_agent: "Mozilla/5.0 ..."
|
||
request_delay: 2000
|
||
username: "<login>"
|
||
password: "<password>"
|
||
|
||
processing:
|
||
parallel_workers: 3
|
||
timeout_seconds: 30
|
||
retry_attempts: 3
|
||
|
||
output:
|
||
log_level: "debug"
|
||
progress_bar: true
|
||
log_to_file: true
|
||
log_file_name: "audio-catalyst.log"
|
||
log_max_size_mb: 2
|
||
```
|
||
|
||
- `scanner.source_directory` — директория с исходными аудиокнигами.
|
||
- `scanner.target_directory` — корень организованной библиотеки.
|
||
|
||
## Запуск
|
||
- Запустите приложение `audio-catalyst.exe`.
|
||
- В TUI выберите «Начать обработку аудиокниг».
|
||
|
||
Процесс:
|
||
1) Сканирование `source_directory` — поиск папок, где есть MP3.
|
||
2) Поиск на RuTracker по имени папки, очистка названия.
|
||
3) Загрузка страницы темы, парсинг метаданных.
|
||
4) Формирование `metadata.json` и загрузка `cover.*`.
|
||
5) Переименование папки по Subtitle (без хвостов `RuTracker.org`).
|
||
6) Перенос в `target_directory/Буква/Автор/`.
|
||
|
||
Если книга не найдена на RuTracker — папка пропускается.
|
||
|
||
## Правила парсинга
|
||
- Title: из `<span style="font-size: 24px">`, затем нормализация (снятие префиксов автора, хвостов в скобках).
|
||
- Subtitle: полный `<title>`, отрезаются окончания типа `:: RuTracker.org`.
|
||
- Series: ищется в post-b «Серия», а также по шаблонам «Цикл «…»».
|
||
- Tags: текст первого подходящего `viewforum.php` (снятие префикса `[Аудио]`).
|
||
- Description: текст после «Описание» до `post-br` или следующего «post-b»; декодирование HTML-сущностей.
|
||
- Cover: `<a:has(img)>`, `<var.postImg title=...>`, `img data-*|src`, `og:image`.
|
||
|
||
## Организация библиотеки
|
||
После сохранения метаданных и обложки:
|
||
- Папка переименовывается в Subtitle.
|
||
- Переносится в `target_directory/<Первая буква автора>/<Фамилия Имя>/<Subtitle>`.
|
||
- Имена очищаются от недопустимых для Windows символов и хвостов `RuTracker.org`.
|
||
|
||
## Тестирование
|
||
```powershell
|
||
make test
|
||
```
|
||
Покрыты тестами:
|
||
- domain/services: главы, очистка титулов, парсинг заголовков/серии/тегов.
|
||
- infrastructure/rutracker: нормализация URL.
|
||
- infrastructure/filesystem: поиск MP3, переименование и организация папок.
|
||
- application/usecases: сквозные сценарии (пропуск, успешный путь).
|
||
|
||
Покрытие:
|
||
```powershell
|
||
make coverage
|
||
start ./coverage.html
|
||
```
|
||
|
||
## Разработка
|
||
Основные команды:
|
||
- `make deps` — зависимости
|
||
- `make build` — сборка
|
||
- `make run` — запуск
|
||
- `make test` — тесты
|
||
- `make coverage` — покрытие
|
||
- `make fmt` / `make vet` / `make lint`
|
||
|
||
## Архитектура
|
||
- Clean Architecture: слои domain/application/infrastructure/presentation.
|
||
- Взаимодействие через интерфейсы репозиториев.
|
||
- Use case `ProcessAudioBooksUseCase` оркестрирует процесс:
|
||
- ScanDirectory → RuTracker.Login → Search → GetTopicMetadata → CreateChapters → DownloadCover → SaveMetadata → Rename → Organize.
|
||
|
||
## Известные ограничения
|
||
- Оценка длительности глав приблизительная (по размеру файла).
|
||
- Возможны изменения разметки RuTracker — парсер может потребовать корректировок.
|
||
|
||
## Лицензия
|
||
MIT
|