1
1
Files
audio-catalyst/cmd/main.go
Dmitriy Fofanov 72a66f1664 Добавить тесты репозитория файловой системы и реализовать функциональность журналирования файлов.
- Реализовать тесты для поиска MP3-файлов и переименования/организации папок книг в репозитории файловой системы.
- Создать FileLogger для записи сообщений в файл с поддержкой различных уровней журналирования и управления размером файлов.
- Разработать репозиторий RuTracker для обработки поиска торрентов, получения метаданных и загрузки торрент-файлов.
- Добавить тесты для нормализации URL в репозиторий RuTracker.
- Реализовать адаптер логгера TUI для отображения логов в терминальном интерфейсе и, при необходимости, для записи логов в базовый логгер.
- Создать менеджер TUI для управления пользовательским интерфейсом приложения, включая главное меню, экран обработки, настройки и отображение результатов.
2025-09-29 20:40:05 +03:00

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("Обработка аудиокниг завершена успешно")
}
}