-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapplication.py
More file actions
72 lines (62 loc) · 2.67 KB
/
application.py
File metadata and controls
72 lines (62 loc) · 2.67 KB
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
import datetime
import os
from pathlib import Path
from PyQt6.QtWidgets import QApplication
from PyQt6.QtCore import QObject, pyqtSignal, QRunnable, QThreadPool
from loguru import logger
from domain import Document, IConverter
class Worker(QRunnable):
def __init__(self, converter: IConverter, files: list[Document], output_dir: Path):
super().__init__()
self.converter = converter
self.files = files
self.output_dir = output_dir
self.signals = WorkerSignals()
def run(self):
total_files = len(self.files)
for i, doc in enumerate(self.files):
try:
counter = f"Файл {i + 1} из {total_files}:"
file_size_mb = os.path.getsize(doc.path) / (1024 * 1024)
log_message = f"{counter} {doc.path.name} ({file_size_mb:.2f} МБ)"
logger.info(log_message)
self.converter.convert(doc.path, self.output_dir)
except Exception as e:
logger.error(f"Сбой при обработке {doc.path.name}: {e}")
finally:
progress = int((i + 1) / total_files * 100)
self.signals.progress.emit(progress)
self.signals.finished.emit()
class WorkerSignals(QObject):
progress = pyqtSignal(int)
finished = pyqtSignal()
class Controller(QObject):
conversion_started = pyqtSignal()
conversion_progress = pyqtSignal(int)
conversion_finished = pyqtSignal(str)
def __init__(self, converter: IConverter):
super().__init__()
self.converter = converter
self.files: list[Document] = []
self.thread_pool = QThreadPool.globalInstance()
def add_files(self, paths: list[str]):
for p in paths:
self.files.append(Document(path=Path(p)))
def clear_files(self):
self.files.clear()
def run_conversion(self):
if not self.files: return
self.conversion_started.emit()
timestamp = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
output_dir = Path(timestamp)
output_dir.mkdir(exist_ok=True)
worker = Worker(self.converter, list(self.files), output_dir)
worker.signals.progress.connect(self.conversion_progress.emit)
worker.signals.finished.connect(lambda: self.on_worker_finish(output_dir))
self.thread_pool.start(worker)
def on_worker_finish(self, output_dir: Path):
abs_path = str(output_dir.resolve())
QApplication.clipboard().setText(abs_path)
logger.success(f"Конвертация завершена. Путь скопирован.")
self.conversion_finished.emit(abs_path)
self.clear_files()