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

- Добавлен 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
+131
View File
@@ -0,0 +1,131 @@
package domain
// TorrentSearchResult — результат поиска по одному трекеру.
type TorrentSearchResult struct {
Name string `json:"Name"`
ID string `json:"Id"`
URL string `json:"Url"`
Torrent string `json:"Torrent"`
Size string `json:"Size"`
DownloadCount string `json:"Download_Count,omitempty"`
Checked string `json:"Checked,omitempty"`
Category string `json:"Category"`
Seeds string `json:"Seeds"`
Peers string `json:"Peers"`
Date string `json:"Date"`
Comments string `json:"Comments,omitempty"`
Time string `json:"Time,omitempty"`
Title string `json:"Title,omitempty"`
OriginalName string `json:"Original_Name,omitempty"`
Year string `json:"Year,omitempty"`
Language string `json:"Language,omitempty"`
Format string `json:"Format,omitempty"`
}
// TorrentNoResult — ответ трекера «ничего не найдено».
type TorrentNoResult struct {
Result string `json:"Result"`
}
// TorrentDetailFile — файл внутри раздачи.
type TorrentDetailFile struct {
Name string `json:"Name"`
Size string `json:"Size"`
}
// TorrentDetail — детальная информация о раздаче (второй запрос).
type TorrentDetail struct {
Name string `json:"Name"`
URL string `json:"Url"`
Hash string `json:"Hash"`
Magnet string `json:"Magnet"`
Torrent string `json:"Torrent"`
IMDbLink string `json:"IMDb_link"`
KinopoiskLink string `json:"Kinopoisk_link"`
IMDbID string `json:"IMDb_id"`
KinopoiskID string `json:"Kinopoisk_id"`
Year string `json:"Year"`
Release string `json:"Release"`
Type string `json:"Type"`
Duration string `json:"Duration"`
Audio string `json:"Audio"`
Language string `json:"Language"`
Directer string `json:"Directer"`
Actors string `json:"Actors"`
Description string `json:"Description"`
Quality string `json:"Quality"`
Video string `json:"Video"`
Poster string `json:"Poster"`
Files []TorrentDetailFile `json:"Files"`
}
// TrackerName — тип для имён трекеров с определённым порядком обхода.
type TrackerName string
const (
TrackerRuTracker TrackerName = "RuTracker"
TrackerKinozal TrackerName = "Kinozal"
TrackerNoNameClub TrackerName = "NoNameClub"
TrackerRuTor TrackerName = "RuTor"
)
// TrackerPriority — порядок обхода трекеров.
var TrackerPriority = []TrackerName{
TrackerRuTracker,
TrackerKinozal,
TrackerNoNameClub,
TrackerRuTor,
}
// TrackerAPIPath — путь API для второго запроса по трекеру.
var TrackerAPIPath = map[TrackerName]string{
TrackerRuTracker: "rutracker",
TrackerKinozal: "kinozal",
TrackerNoNameClub: "nonamclub",
TrackerRuTor: "rutor",
}
// EnrichedBookInfo — итоговая обогащённая информация об аудиокниге.
type EnrichedBookInfo struct {
AudioBook *AudioBookInfo
Detail *TorrentDetail
TrackerName TrackerName
DestFolder string // путь к папке назначения
Processed bool // успешно обработана
ErrorMessage string // сообщение об ошибке
}
// BookMetadata — JSON-структура файла metadata.json.
type BookMetadata struct {
Tags []string `json:"tags"`
Chapters []ChapterInfo `json:"chapters"`
Title string `json:"title"`
Subtitle string `json:"subtitle"`
Authors []string `json:"authors"`
Narrators []string `json:"narrators"`
Series []string `json:"series"`
Genres []string `json:"genres"`
PublishedYear string `json:"publishedYear"`
PublishedDate string `json:"publishedDate"`
Publisher string `json:"publisher"`
Description string `json:"description"`
ISBN string `json:"isbn"`
ASIN string `json:"asin"`
Language string `json:"language"`
Explicit bool `json:"explicit"`
Abridged bool `json:"abridged"`
}
// ChapterInfo — информация о главе.
type ChapterInfo struct {
ID int `json:"id"`
Start float64 `json:"start"`
End float64 `json:"end"`
Title string `json:"title"`
}
// ProcessResult — результат полной обработки одной аудиокниги.
type ProcessResult struct {
Book *EnrichedBookInfo
Err error
}