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 }