Создана структура документации, описывающая функциональность, установку, использование CLI, архитектуру и интеграции с TorrAPI и OpenRouter. Добавлены примеры конфигурации и метаданных, а также описание структуры выходных данных.
76 lines
4.0 KiB
Go
76 lines
4.0 KiB
Go
// 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)
|
||
// LogInfo логирует информационное сообщение (штатное событие).
|
||
LogInfo(message string)
|
||
// Finish завершает работу логгера (например, прогресс-бара).
|
||
Finish()
|
||
}
|