121 lines
3.7 KiB
Go
121 lines
3.7 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,
|
|
)
|
|
// Подключаем репортер прогресса к TUI
|
|
processUseCase.SetProgressReporter(func(s entities.ProcessingStatus) {
|
|
tuiManager.SendStatusUpdate(s)
|
|
})
|
|
|
|
// Создание процессора для обработки команд
|
|
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("Запуск обработки аудиокниг...")
|
|
}
|
|
|
|
// Запускаем обработку (репортинг прогресса выполняет use case)
|
|
if err := p.processUseCase.Execute(p.config); err != nil {
|
|
if p.logger != nil {
|
|
p.logger.Error("Ошибка обработки: %v", err)
|
|
}
|
|
return
|
|
}
|
|
|
|
if p.logger != nil {
|
|
p.logger.Success("Обработка аудиокниг завершена успешно")
|
|
}
|
|
}
|