1
1

Добавить функциональность репортинга прогресса обработки аудиокниг и экран конфигурации

This commit is contained in:
Dmitriy Fofanov
2025-09-30 14:04:38 +03:00
parent 72a66f1664
commit e4ba057abb
3 changed files with 317 additions and 120 deletions

View File

@@ -16,6 +16,8 @@ type ProcessAudioBooksUseCase struct {
logger repositories.Logger
audioBookSvc *services.AudioBookService
metadataSvc *services.MetadataService
// Репортер прогресса
progress func(entities.ProcessingStatus)
}
// NewProcessAudioBooksUseCase создает новый use case
@@ -33,6 +35,11 @@ func NewProcessAudioBooksUseCase(
}
}
// SetProgressReporter задает функцию репортинга прогресса
func (uc *ProcessAudioBooksUseCase) SetProgressReporter(f func(entities.ProcessingStatus)) {
uc.progress = f
}
// Execute выполняет обработку аудиокниг
func (uc *ProcessAudioBooksUseCase) Execute(config *entities.Config) error {
uc.logger.Info("🚀 Начало процесса обработки аудиокниг")
@@ -42,35 +49,58 @@ func (uc *ProcessAudioBooksUseCase) Execute(config *entities.Config) error {
audioBooks, err := uc.audioBookRepo.ScanDirectory(config.Scanner.SourceDirectory)
if err != nil {
uc.logger.Error("❌ Критическая ошибка сканирования: %v", err)
if uc.progress != nil {
uc.progress(entities.ProcessingStatus{Current: 0, Total: 0, Status: "Ошибка сканирования", Error: err})
}
return fmt.Errorf("ошибка сканирования: %w", err)
}
uc.logger.Info("📊 Найдено %d аудиокниг", len(audioBooks))
total := len(audioBooks)
uc.logger.Info("📊 Найдено %d аудиокниг", total)
if len(audioBooks) == 0 {
if total == 0 {
uc.logger.Warning("⚠️ Аудиокниги не найдены")
if uc.progress != nil {
uc.progress(entities.ProcessingStatus{Current: 0, Total: 0, Status: "Книги не найдены"})
}
return nil
}
// Сообщаем общее количество до начала обработки
if uc.progress != nil {
uc.progress(entities.ProcessingStatus{Current: 0, Total: total, Status: "Начинаем обработку"})
}
// Авторизация в RuTracker
if err := uc.rutrackerRepo.Login(); err != nil {
uc.logger.Error("❌ Ошибка авторизации в RuTracker: %v", err)
if uc.progress != nil {
uc.progress(entities.ProcessingStatus{Current: 0, Total: total, Status: "Ошибка авторизации", Error: err})
}
return fmt.Errorf("ошибка авторизации: %w", err)
}
uc.logger.Success("✅ Авторизация в RuTracker успешна")
// Обработка каждой аудиокниги
for i, book := range audioBooks {
uc.logger.Info("📋 Обработка книги %d/%d: \"%s\"", i+1, len(audioBooks), book.Title)
uc.logger.Info("📋 Обработка книги %d/%d: \"%s\"", i+1, total, book.Title)
if err := uc.processAudioBook(book); err != nil {
uc.logger.Error("❌ Ошибка обработки книги \"%s\": %v", book.Title, err)
continue
}
// Увеличиваем прогресс после завершения обработки книги (успешно или нет)
if uc.progress != nil {
uc.progress(entities.ProcessingStatus{Current: i + 1, Total: total, Status: fmt.Sprintf("Готово %d/%d", i+1, total)})
}
uc.logger.Success("✅ Книга \"%s\" обработана", book.Title)
}
if uc.progress != nil {
uc.progress(entities.ProcessingStatus{Current: total, Total: total, Status: "Обработка завершена"})
}
uc.logger.Success("🎉 Обработка завершена успешно!")
return nil
}