-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearcher.py
79 lines (67 loc) · 2.91 KB
/
searcher.py
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
import logging
from collections import deque
from typing import Set
from PySide6.QtCore import Signal
from directory_scanner import DirectoryScanner
from duplicates_finder import DuplicatesFinder
from file_remover import FileRemover
from interruptible_class import InterruptibleClass
class Searcher(InterruptibleClass):
dir_scanner = DirectoryScanner()
finder = DuplicatesFinder()
remover = FileRemover()
all_files_added = Signal(deque)
search_done = Signal(dict)
file_scanned = Signal()
file_removed = Signal(str)
all_files_removed = Signal()
scanning_started = Signal()
removing_started = Signal()
dir_scanner_interrupted = Signal()
file_remover_interrupted = Signal()
finder_interrupted = Signal()
def __init__(self):
# QObject.__init__(self)
InterruptibleClass.__init__(self, parent=self)
self.search_type = None
self.dir_scanner.all_files_added.connect(self.all_files_added)
self.finder.search_done.connect(self.search_done)
self.finder.file_scanned.connect(self.file_scanned)
self.remover.file_removed.connect(self.file_removed)
self.dir_scanner.interrupted.connect(self.dir_scanner_interrupted)
self.finder.interrupted.connect(self.finder_interrupted)
self.remover.interrupted.connect(self.file_remover_interrupted)
def scan(self, include_directories, exclude_directories, include_masks, exclude_masks, depth, min_file_size,
search_type):
self.scanning_started.emit()
logging.debug(
f"Started scanning with parameters: "
f"{include_directories=} {exclude_directories=} "
f"{include_masks=} {exclude_masks=} "
f"{depth=} {min_file_size=} {search_type=}")
self.dir_scanner.depth = depth
self.dir_scanner.min_file_size = min_file_size
self.dir_scanner.include_directories = include_directories
self.dir_scanner.exclude_directories = exclude_directories
self.dir_scanner.include_masks = include_masks
self.dir_scanner.exclude_masks = exclude_masks
self.search_type = search_type
self._add_task(self.dir_scanner.scan)
self._wait_for_tasks_completion()
def find(self, files):
self._add_task(self.finder.find_duplicates, files, self.search_type)
self._wait_for_tasks_completion()
def remove(self, files_matrix: deque[Set[str]]):
self.removing_started.emit()
self._add_task(self.__remove_handler, files_matrix)
self._wait_for_tasks_completion()
self.all_files_removed.emit()
def __remove_handler(self, files_matrix: deque[Set[str]]):
for files in files_matrix:
self._add_task(self.remover.remove_files, files)
def abort(self):
logging.debug("Interrupting...")
self.dir_scanner.interrupt()
self.finder.interrupt()
self.remover.interrupt()
self.interrupt()