1
1

Добавить тесты репозитория файловой системы и реализовать функциональность журналирования файлов.

- Реализовать тесты для поиска MP3-файлов и переименования/организации папок книг в репозитории файловой системы.
- Создать FileLogger для записи сообщений в файл с поддержкой различных уровней журналирования и управления размером файлов.
- Разработать репозиторий RuTracker для обработки поиска торрентов, получения метаданных и загрузки торрент-файлов.
- Добавить тесты для нормализации URL в репозиторий RuTracker.
- Реализовать адаптер логгера TUI для отображения логов в терминальном интерфейсе и, при необходимости, для записи логов в базовый логгер.
- Создать менеджер TUI для управления пользовательским интерфейсом приложения, включая главное меню, экран обработки, настройки и отображение результатов.
This commit is contained in:
Dmitriy Fofanov
2025-09-29 20:40:05 +03:00
parent 49bea780aa
commit 72a66f1664
32 changed files with 4073 additions and 22 deletions

151
README.md
View File

@@ -1,2 +1,151 @@
# audio-catalyst
# 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