- Реализовать тесты для поиска MP3-файлов и переименования/организации папок книг в репозитории файловой системы. - Создать FileLogger для записи сообщений в файл с поддержкой различных уровней журналирования и управления размером файлов. - Разработать репозиторий RuTracker для обработки поиска торрентов, получения метаданных и загрузки торрент-файлов. - Добавить тесты для нормализации URL в репозиторий RuTracker. - Реализовать адаптер логгера TUI для отображения логов в терминальном интерфейсе и, при необходимости, для записи логов в базовый логгер. - Создать менеджер TUI для управления пользовательским интерфейсом приложения, включая главное меню, экран обработки, настройки и отображение результатов.
139 lines
4.0 KiB
Go
139 lines
4.0 KiB
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
|
|
"audio-catalyst/internal/application/usecases"
|
|
"audio-catalyst/internal/domain/entities"
|
|
"audio-catalyst/internal/domain/repositories"
|
|
"audio-catalyst/internal/infrastructure/config"
|
|
"audio-catalyst/internal/infrastructure/filesystem"
|
|
"audio-catalyst/internal/infrastructure/logging"
|
|
"audio-catalyst/internal/infrastructure/rutracker"
|
|
"audio-catalyst/internal/presentation/tui"
|
|
)
|
|
|
|
func main() {
|
|
// Загрузка конфигурации
|
|
configRepo := config.NewRepository()
|
|
appConfig, err := configRepo.Load("config.yaml")
|
|
if err != nil {
|
|
log.Fatalf("Ошибка загрузки конфигурации: %v", err)
|
|
}
|
|
|
|
// Инициализация базового логгера (в файл)
|
|
fileLogger, err := logging.NewFileLogger(
|
|
appConfig.Output.LogFileName,
|
|
appConfig.Output.LogLevel,
|
|
appConfig.Output.LogMaxSizeMB,
|
|
appConfig.Output.LogToFile,
|
|
)
|
|
if err != nil {
|
|
log.Printf("Предупреждение: не удалось инициализировать логгер: %v", err)
|
|
}
|
|
if fileLogger != nil {
|
|
defer fileLogger.Close()
|
|
}
|
|
|
|
// Инициализация TUI
|
|
tuiManager := tui.NewManager()
|
|
tuiManager.Initialize()
|
|
|
|
// Оборачиваем логгер адаптером, чтобы видеть логи в TUI
|
|
var logger repositories.Logger
|
|
logger = tui.NewUILogger(fileLogger, tuiManager)
|
|
|
|
// Инициализация репозиториев
|
|
fsRepo := filesystem.NewRepository()
|
|
rutrackerRepo, err := rutracker.NewRepository(
|
|
appConfig.RuTracker.Username,
|
|
appConfig.RuTracker.Password,
|
|
)
|
|
if err != nil {
|
|
log.Fatalf("Ошибка создания RuTracker репозитория: %v", err)
|
|
}
|
|
defer rutrackerRepo.Close()
|
|
|
|
// Инициализация use case
|
|
processUseCase := usecases.NewProcessAudioBooksUseCase(
|
|
fsRepo,
|
|
rutrackerRepo,
|
|
logger,
|
|
)
|
|
|
|
// Создание процессора для обработки команд
|
|
processor := &ApplicationProcessor{
|
|
processUseCase: processUseCase,
|
|
config: appConfig,
|
|
tuiManager: tuiManager,
|
|
logger: logger,
|
|
}
|
|
|
|
// Привязываем запуск обработки к TUI
|
|
tuiManager.SetOnStartProcessing(func() {
|
|
processor.StartProcessing()
|
|
})
|
|
|
|
// Запуск обработчика команд в горутине
|
|
go processor.HandleCommands()
|
|
|
|
// Запуск TUI
|
|
if err := tuiManager.Run(); err != nil {
|
|
log.Fatalf("Ошибка запуска TUI: %v", err)
|
|
}
|
|
}
|
|
|
|
// ApplicationProcessor обрабатывает команды приложения
|
|
type ApplicationProcessor struct {
|
|
processUseCase *usecases.ProcessAudioBooksUseCase
|
|
config *entities.Config
|
|
tuiManager *tui.Manager
|
|
logger repositories.Logger
|
|
}
|
|
|
|
// HandleCommands обрабатывает команды от пользователя
|
|
func (p *ApplicationProcessor) HandleCommands() {
|
|
// Пока оставим пустым — команды приходят через UI callbacks
|
|
}
|
|
|
|
// StartProcessing запускает обработку аудиокниг
|
|
func (p *ApplicationProcessor) StartProcessing() {
|
|
if p.logger != nil {
|
|
p.logger.Info("Запуск обработки аудиокниг...")
|
|
}
|
|
|
|
// Обновим UI статус
|
|
p.tuiManager.SendStatusUpdate(entities.ProcessingStatus{
|
|
Current: 0,
|
|
Total: 1,
|
|
Status: "Начинаем обработку...",
|
|
Error: nil,
|
|
})
|
|
|
|
// Запускаем обработку
|
|
if err := p.processUseCase.Execute(p.config); err != nil {
|
|
if p.logger != nil {
|
|
p.logger.Error("Ошибка обработки: %v", err)
|
|
}
|
|
p.tuiManager.SendStatusUpdate(entities.ProcessingStatus{
|
|
Current: 0,
|
|
Total: 1,
|
|
Status: "Ошибка обработки",
|
|
Error: err,
|
|
})
|
|
return
|
|
}
|
|
|
|
// Успешное завершение
|
|
p.tuiManager.SendStatusUpdate(entities.ProcessingStatus{
|
|
Current: 1,
|
|
Total: 1,
|
|
Status: "Обработка завершена успешно!",
|
|
Error: nil,
|
|
})
|
|
|
|
if p.logger != nil {
|
|
p.logger.Success("Обработка аудиокниг завершена успешно")
|
|
}
|
|
}
|