File size: 4,303 Bytes
ef28b60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# @title utils/logger.py
import logging
import sys
from datetime import datetime
from pathlib import Path
from typing import Optional, Dict, Any, Callable

class SpotMakerLogger:
    """
    Logger dla aplikacji SpotMaker.
    Obs艂uguje:
    - Logowanie do pliku i konsoli
    - 艢ledzenie post臋pu dla GUI
    - Logowanie szczeg贸艂owe dla ka偶dego modu艂u
    """
    def __init__(self, log_dir: str = "logs"):
        self.log_dir = Path(log_dir)
        self.log_dir.mkdir(parents=True, exist_ok=True)
        
        # Inicjalizacja g艂贸wnego loggera
        self.logger = logging.getLogger('SpotMaker')
        self.logger.setLevel(logging.DEBUG)
        
        # Format log贸w
        formatter = logging.Formatter(
            '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
        )
        
        # Handler dla pliku
        file_handler = logging.FileHandler(
            self.log_dir / f"spotmaker_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log",
            encoding='utf-8'
        )
        file_handler.setLevel(logging.DEBUG)
        file_handler.setFormatter(formatter)
        
        # Handler dla konsoli
        console_handler = logging.StreamHandler(sys.stdout)
        console_handler.setLevel(logging.INFO)
        console_handler.setFormatter(formatter)
        
        self.logger.addHandler(file_handler)
        self.logger.addHandler(console_handler)
        
        # Stan dla GUI
        self.current_progress: Dict[str, float] = {}
        self.current_status: Dict[str, str] = {}
        
        # Callback dla aktualizacji UI
        self.update_ui_callback: Optional[Callable] = None
        
    def log(self, module: str, message: str, level: str = "info") -> None:
        """
        Loguje wiadomo艣膰 z okre艣lonego modu艂u.
        
        Args:
            module: Nazwa modu艂u (np. 'video_gen', 'audio_gen')
            message: Tre艣膰 wiadomo艣ci
            level: Poziom logowania ('debug', 'info', 'warning', 'error', 'critical')
        """
        log_method = getattr(self.logger, level.lower())
        formatted_msg = f"[{module}] {message}"
        log_method(formatted_msg)
        
        # Aktualizacja interfejsu je艣li zdefiniowano callback
        if self.update_ui_callback:
            self.update_ui_callback(formatted_msg)
        
    def update_progress(self, module: str, progress: float, status: Optional[str] = None) -> Dict[str, Any]:
        """
        Aktualizuje post臋p operacji dla danego modu艂u.
        
        Args:
            module: Nazwa modu艂u
            progress: Warto艣膰 post臋pu (0-100)
            status: Opcjonalny status tekstowy
            
        Returns:
            Dict zawieraj膮cy aktualny stan dla GUI
        """
        self.current_progress[module] = min(max(progress, 0), 100)
        if status:
            self.current_status[module] = status
            self.log(module, f"Status: {status} | Post臋p: {progress:.1f}%")
        
        return {
            'progress': self.current_progress,
            'status': self.current_status
        }
    
    def get_module_progress(self, module: str) -> float:
        """Zwraca aktualny post臋p dla danego modu艂u."""
        return self.current_progress.get(module, 0.0)
    
    def get_module_status(self, module: str) -> str:
        """Zwraca aktualny status dla danego modu艂u."""
        return self.current_status.get(module, "Nieaktywny")
    
    def reset_module(self, module: str) -> None:
        """Resetuje post臋p i status dla danego modu艂u."""
        self.current_progress[module] = 0.0
        self.current_status[module] = "Zresetowano"
        self.log(module, "Zresetowano stan modu艂u")
    
    def format_error(self, module: str, error: Exception) -> str:
        """
        Formatuje b艂膮d do logowania.
        
        Args:
            module: Nazwa modu艂u
            error: Obiekt wyj膮tku
            
        Returns:
            Sformatowana wiadomo艣膰 b艂臋du
        """
        error_msg = f"[{module}] B艂膮d: {str(error)}"
        self.logger.error(error_msg)
        return error_msg

    def set_ui_callback(self, callback_fn: Callable[[str], None]) -> None:
        """Ustawia funkcj臋 callback do aktualizacji interfejsu."""
        self.update_ui_callback = callback_fn