// 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() }