- Добавлен ConsoleLogger для подробного логирования этапов обработки аудиокниг в консоли. - Введен ConsolePresenter для форматированного вывода результатов сканирования в консоль. - Создан ProcessAudioBooksUseCase для обработки полного конвейера обработки аудиокниг, включая сканирование папок, извлечение метаданных, поиск торрентов и запись результатов. - Реализована проверка LLM для улучшения метаданных. - Добавлена обработка ошибок и логирование на всех этапах обработки.
132 lines
4.9 KiB
Go
132 lines
4.9 KiB
Go
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
|
||
}
|