Функция: реализованы консольный логгер и презентер для обработки аудиокниг

- Добавлен ConsoleLogger для подробного логирования этапов обработки аудиокниг в консоли.

- Введен ConsolePresenter для форматированного вывода результатов сканирования в консоль.

- Создан ProcessAudioBooksUseCase для обработки полного конвейера обработки аудиокниг, включая сканирование папок, извлечение метаданных, поиск торрентов и запись результатов.

- Реализована проверка LLM для улучшения метаданных.

- Добавлена ​​обработка ошибок и логирование на всех этапах обработки.
This commit is contained in:
Dmitriy Fofanov
2026-02-20 00:35:43 +03:00
parent 7d119927a1
commit 402ce7f4f1
26 changed files with 4323 additions and 0 deletions
+73
View File
@@ -0,0 +1,73 @@
// Package domain определяет порты (интерфейсы), через которые usecase-слой
// взаимодействует с инфраструктурой. Зависимость направлена внутрь — инфраструктура
// реализует эти интерфейсы, а usecase зависит только от абстракций.
package domain
import "context"
// FolderLister возвращает список подпапок (потенциальных аудиокниг) в корневой директории.
type FolderLister interface {
ListSubfolders(ctx context.Context, root string) ([]string, error)
}
// MetadataExtractor извлекает метаданные из первого аудиофайла в указанной папке.
type MetadataExtractor interface {
Extract(ctx context.Context, folderPath string) (*AudioBookInfo, error)
}
// TorrentSearcher ищет аудиокнигу по всем трекерам через TorrAPI.
type TorrentSearcher interface {
// SearchByTitle делает первый запрос: поиск по названию.
SearchByTitle(ctx context.Context, author, album string, year int) (map[TrackerName][]TorrentSearchResult, error)
// SearchByQuery делает поиск по произвольной строке query.
SearchByQuery(ctx context.Context, query string) (map[TrackerName][]TorrentSearchResult, error)
// GetDetailByID делает второй запрос: детали раздачи по ID трекера.
GetDetailByID(ctx context.Context, tracker TrackerName, id string) (*TorrentDetail, error)
}
// ResultWriter создаёт папку результата, пишет metadata.json, переносит файлы.
type ResultWriter interface {
// WriteResult создаёт структуру папок, metadata.json и перемещает аудиофайлы.
WriteResult(ctx context.Context, book *EnrichedBookInfo, resultRoot string) (string, error)
}
// CoverDownloader скачивает обложку по URL и сохраняет в указанную папку.
type CoverDownloader interface {
Download(ctx context.Context, url string, destFolder string) error
}
// LLMClient предоставляет доступ к Large Language Model через API.
type LLMClient interface {
// GenerateCompletion отправляет запрос к LLM и возвращает сгенерированный текст.
GenerateCompletion(ctx context.Context, req *LLMRequest) (*LLMResponse, error)
}
// Presenter отвечает за отображение результатов пользователю.
type Presenter interface {
RenderResults(results []ScanResult)
RenderProcessResults(results []ProcessResult)
}
// ProcessLogger логирует процесс обработки аудиокниг.
type ProcessLogger interface {
// LogStart логирует начало обработки книги.
LogStart(folderName string)
// LogExtraction логирует этап извлечения метаданных.
LogExtraction()
// LogLLMValidation логирует этап валидации через LLM.
LogLLMValidation()
// LogSearch логирует этап поиска на трекерах.
LogSearch()
// LogWrite логирует этап записи результата.
LogWrite()
// LogCoverDownload логирует этап скачивания обложки.
LogCoverDownload()
// LogComplete логирует успешное завершение обработки книги.
LogComplete(folderName string)
// LogError логирует ошибку обработки.
LogError(folderName string, err error)
// LogWarning логирует предупреждение.
LogWarning(message string)
// Finish завершает работу логгера (например, прогресс-бара).
Finish()
}