From 416d889d1c37c1f43234df603d99615c5146b3c4 Mon Sep 17 00:00:00 2001 From: Kameron Kenny <1267885+kkenny@users.noreply.github.com> Date: Mon, 7 Oct 2024 14:49:21 -0400 Subject: [PATCH] compare checksums --- BitMover_ui.py | 169 ++++++++++++++++++-------- _dialog_checksum_progress.py | 6 - _dialog_compare_imported_checksums.py | 56 +++++++++ _dialog_find_files.py | 7 -- _dialog_import.py | 8 -- _find_files.py | 7 +- _image_tag.py | 1 - _media_file.py | 2 +- _thread_my_stuff.py | 10 ++ _verify_file_checksum.py | 9 +- 10 files changed, 198 insertions(+), 77 deletions(-) create mode 100644 _dialog_compare_imported_checksums.py diff --git a/BitMover_ui.py b/BitMover_ui.py index e31a11d..20c3799 100755 --- a/BitMover_ui.py +++ b/BitMover_ui.py @@ -20,6 +20,7 @@ from _thread_my_stuff import Worker from _media_file import MediaFile from _file_stuff import path_exists,is_file,create_folder,cmp_hashes from _verify_file_checksum import FileHash +from _dialog_compare_imported_checksums import DialogCompareImportedChecksums basedir = os.path.dirname(__file__) @@ -60,6 +61,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.imp_dialog = DialogImport() self.find_files_dialog = FindProgress() self.checksum_progress_dialog = DialogChecksumProgress() + self.compare_imported_checksums_dialog = DialogCompareImportedChecksums() self.widgets_config() @@ -104,7 +106,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): print("Multithreading with maximum %d threads" % self.threadpool.maxThreadCount()) def toggle_scan_button(self,enable=True): - print(f'toggle_scan_button.enabled: {enable}') self.pushButton_3_scan_dir.setEnabled(enable) def toggle_import_button(self,enable=True): @@ -116,7 +117,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.src_dir) if directory: - print("Selected Directory:", directory) # path = Path(directory) self.src_dir = directory self.lineEdit_src_dir.setText(self.src_dir) @@ -127,7 +127,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.dst_dir) if directory: - print("Selected Directory:", directory) # path = Path(directory) self.dst_dir = directory self.lineEdit_dst_dir.setText(self.dst_dir) @@ -141,21 +140,18 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.config['verify_checksum'] = True else: self.config['verify_checksum'] = False - print(f"verify_checksums: {self.config['verify_checksums']}") def cleanup_files_changed(self): if self.checkBox_cleanup_files.isChecked(): self.config['cleanup_sd'] = True else: self.config['cleanup_sd'] = False - print(f"cleanup_sd: {self.config['cleanup_sd']}") def store_originals_changed(self): if self.checkBox_store_originals.isChecked(): self.config['store_originals'] = True else: self.config['store_originals'] = False - print(f"store_originals: {self.config['store_originals']}") def set_thumbnail(self,thumb_file,scaled=True,ratio=None): self.img_preview.setPixmap(QPixmap(thumb_file)) @@ -261,7 +257,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.set_default_thumbnail() else: self.process_file(i.text()) - print(f'index changed to: {i.text()}') preview = self.get_preview(i.text()) self.update_preview(preview) self.update_metadata(preview) @@ -311,12 +306,10 @@ class MainWindow(QMainWindow, Ui_MainWindow): print(f'output: {s}') def worker_thread_started(self): - print('scan thread started') self.toggle_scan_button(False) self.toggle_import_button(False) def worker_thread_done(self): - print('scan thread complete.') self.toggle_scan_button(True) if 0 < len(self.file_list): self.toggle_import_button(True) @@ -387,8 +380,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): # From _media_import.py def is_video(self,sph): - print(f"Should be sph: {sph}") - print(f"Should be filetype: {self.files[sph]['file_type']}") if self.files[sph]['file_type'] == 'video': r = True else: @@ -412,7 +403,12 @@ class MainWindow(QMainWindow, Ui_MainWindow): total_file_count_callback, checksum_file_callback, checksum_progress_callback, - checksum_dialog_open_callback): + checksum_dialog_open_callback, + compare_checksums_source_file_callback, + compare_checksums_dest_file_callback, + compare_checksums_source_hash_callback, + compare_checksums_dest_hash_callback, + compare_checksums_add_row_callback): """ Copy Files. """ count = int(0) for line in range(self.file_list.count()): @@ -420,7 +416,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): file = item.text() self.process_file(file) sph = self.get_source_path_hash(file) - print(sph) self.src_dir = self.files[sph]['folders']['source_path'] self.dst_dir = self.files[sph]['folders']['destination'] self.path_file_source = path.join(self.src_dir, @@ -429,19 +424,21 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.files[sph]['name']) self.imp_dialog.set_importing_file(self.path_file_source) - self.copy_a_file( - sph, - self.path_file_destination, - progress_callback, - current_file_progress_callback, - imported_file_count_callback, - found_file_callback, - total_file_count_callback, - checksum_file_callback, - checksum_progress_callback, - checksum_dialog_open_callback) - - print(f'check_store_original({sph}): {self.check_store_original(sph)}') + self.copy_a_file(sph, + self.path_file_destination, + progress_callback, + current_file_progress_callback, + imported_file_count_callback, + found_file_callback, + total_file_count_callback, + checksum_file_callback, + checksum_progress_callback, + checksum_dialog_open_callback, + compare_checksums_source_file_callback, + compare_checksums_dest_file_callback, + compare_checksums_source_hash_callback, + compare_checksums_dest_hash_callback, + compare_checksums_add_row_callback) if self.check_store_original(sph) is True: self.path_file_destination_original = path.join(self.dst_dir, @@ -457,7 +454,12 @@ class MainWindow(QMainWindow, Ui_MainWindow): total_file_count_callback, checksum_file_callback, checksum_progress_callback, - checksum_dialog_open_callback) + checksum_dialog_open_callback, + compare_checksums_source_file_callback, + compare_checksums_dest_file_callback, + compare_checksums_source_hash_callback, + compare_checksums_dest_hash_callback, + compare_checksums_add_row_callback) count += 1 @@ -475,7 +477,12 @@ class MainWindow(QMainWindow, Ui_MainWindow): total_file_count_callback, checksum_file_callback, checksum_progress_callback, - checksum_dialog_open_callback): + checksum_dialog_open_callback, + compare_checksums_source_file_callback, + compare_checksums_dest_file_callback, + compare_checksums_source_hash_callback, + compare_checksums_dest_hash_callback, + compare_checksums_add_row_callback): size = path.getsize(self.path_file_source) target_dir = os.path.dirname(target) @@ -489,7 +496,12 @@ class MainWindow(QMainWindow, Ui_MainWindow): total_file_count_callback, checksum_file_callback, checksum_progress_callback, - checksum_dialog_open_callback) + checksum_dialog_open_callback, + compare_checksums_source_file_callback, + compare_checksums_dest_file_callback, + compare_checksums_source_hash_callback, + compare_checksums_dest_hash_callback, + compare_checksums_add_row_callback) if dup_check is False: if self.is_video(fph): self.chunk_size = (1024 * 1024) * 5 @@ -525,7 +537,12 @@ class MainWindow(QMainWindow, Ui_MainWindow): total_file_count_callback, checksum_file_callback, checksum_progress_callback, - checksum_dialog_open_callback): + checksum_dialog_open_callback, + compare_checksums_source_file_callback, + compare_checksums_dest_file_callback, + compare_checksums_source_hash_callback, + compare_checksums_dest_hash_callback, + compare_checksums_add_row_callback): sph = FileHash(_pf).path_hash self.path_file_source = os.path.join(self.files[sph]['folders']['source_path'], @@ -539,10 +556,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): def set_checksum(_pf): - print(f'set_checksum, _pf: {_pf}') if path_exists(_pf) and is_file(_pf): - - self.files[sph]['xx_checksum'][_pf] = FileHash(_pf).get_hash(_pf, progress_callback, current_file_progress_callback, @@ -551,7 +565,12 @@ class MainWindow(QMainWindow, Ui_MainWindow): total_file_count_callback, checksum_file_callback, checksum_progress_callback, - checksum_dialog_open_callback) + checksum_dialog_open_callback, + compare_checksums_source_file_callback, + compare_checksums_dest_file_callback, + compare_checksums_source_hash_callback, + compare_checksums_dest_hash_callback, + compare_checksums_add_row_callback) else: print(f"set_checksum: {_pf} doesn't exist yet or isn't a real file.") @@ -570,8 +589,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): if self.files[sph]['xx_checksum'].get(self.path_file_destination_original) is None: set_checksum(self.path_file_destination_original) - # self.checksum_progress_dialog.close_dialog() - def check_duplicate(self, sph, target, @@ -583,7 +600,12 @@ class MainWindow(QMainWindow, Ui_MainWindow): total_file_count_callback, checksum_file_callback, checksum_progress_callback, - checksum_dialog_open_callback): + checksum_dialog_open_callback, + compare_checksums_source_file_callback, + compare_checksums_dest_file_callback, + compare_checksums_source_hash_callback, + compare_checksums_dest_hash_callback, + compare_checksums_add_row_callback): if path_exists(target): print(f'Path Exists: path_file_source: {self.path_file_source}\ntarget: {target}') self.get_checksum(self.path_file_source, @@ -594,7 +616,12 @@ class MainWindow(QMainWindow, Ui_MainWindow): total_file_count_callback, checksum_file_callback, checksum_progress_callback, - checksum_dialog_open_callback) + checksum_dialog_open_callback, + compare_checksums_source_file_callback, + compare_checksums_dest_file_callback, + compare_checksums_source_hash_callback, + compare_checksums_dest_hash_callback, + compare_checksums_add_row_callback) hash1 = self.files[sph]['xx_checksum'][self.path_file_source] hash2 = self.files[sph]['xx_checksum'][target] @@ -663,17 +690,23 @@ class MainWindow(QMainWindow, Ui_MainWindow): # if self.config['verify_checksum'] is True: # self.checksum_fph = fph # Initialize Widgets - self.checksum_progress_dialog.set_progress(0) + self.compare_imported_checksums_dialog.setup_compare_dialog() worker = Worker(self.t_compare_imported_checksums) worker.signals.started.connect( self.worker_thread_started) worker.signals.started.connect( - self.checksum_progress_dialog.open_dialog) - worker.signals.found_file.connect( - self.checksum_progress_dialog.set_file) - worker.signals.progress.connect( - self.checksum_progress_dialog.set_progress) + self.compare_imported_checksums_dialog.open_dialog) + worker.signals.compare_checksums_source_file.connect( + self.compare_imported_checksums_dialog.set_label_path_file_source) + worker.signals.compare_checksums_dest_file.connect( + self.compare_imported_checksums_dialog.set_label_path_file_dest) + worker.signals.compare_checksums_source_hash.connect( + self.compare_imported_checksums_dialog.set_label_hash_source) + worker.signals.compare_checksums_dest_hash.connect( + self.compare_imported_checksums_dialog.set_label_hash_dest) + worker.signals.compare_checksums_add_row.connect( + self.compare_imported_checksums_dialog.add_table_row) worker.signals.finished.connect( self.thread_complete) worker.signals.finished.connect( @@ -702,15 +735,25 @@ class MainWindow(QMainWindow, Ui_MainWindow): total_file_count_callback, checksum_file_callback, checksum_progress_callback, - checksum_dialog_open_callback): + checksum_dialog_open_callback, + compare_checksums_source_file_callback, + compare_checksums_dest_file_callback, + compare_checksums_source_hash_callback, + compare_checksums_dest_hash_callback, + compare_checksums_add_row_callback): for file in self.files: - _pf = os.path.join(self.files[file]['folders']['source_path'], + _pfs = os.path.join(self.files[file]['folders']['source_path'], self.files[file]['name']) - print(f"source_path: {self.files[file]['folders']['source_path']}") - print(f"name: {self.files[file]['name']}") - print(f'_pf: {_pf}') - self.get_checksum(_pf, + _pfd = os.path.join(self.files[file]['folders']['destination'], + self.files[file]['name']) + + compare_checksums_source_file_callback.emit(_pfs) + compare_checksums_dest_file_callback.emit(_pfd) + compare_checksums_source_hash_callback.emit('Calculating...') + compare_checksums_dest_hash_callback.emit('Calculating...') + + self.get_checksum(_pfs, progress_callback, current_file_progress_callback, imported_file_count_callback, @@ -718,7 +761,19 @@ class MainWindow(QMainWindow, Ui_MainWindow): total_file_count_callback, checksum_file_callback, checksum_progress_callback, - checksum_dialog_open_callback) + checksum_dialog_open_callback, + compare_checksums_source_file_callback, + compare_checksums_dest_file_callback, + compare_checksums_source_hash_callback, + compare_checksums_dest_hash_callback, + compare_checksums_add_row_callback) + + compare_checksums_source_hash_callback.emit( + self.files[file]['xx_checksum'][_pfs]) + + compare_checksums_dest_hash_callback.emit( + self.files[file]['xx_checksum'][_pfd]) + i = 0 c = {} for checksum in self.files[file]['xx_checksum']: @@ -733,6 +788,18 @@ class MainWindow(QMainWindow, Ui_MainWindow): print(f'Checksum failed for: {self.files[file]["name"]}') i += 1 + table_row = { + 'source_path_file': _pfs, + 'dest_path_file': _pfd, + 'source_path_hash': self.files[file]['xx_checksum'][_pfs], + 'dest_path_hash': self.files[file]['xx_checksum'][_pfd], + 'checksum_match': self.files[file]['checksum_match'] + } + print(f"checksum_match:{self.files[file]['checksum_match']}") + print(f"--------Table Row-------\n{table_row}\n--------End-------\n") + + compare_checksums_add_row_callback.emit(table_row) + # Main App app = QApplication(sys.argv) # Main Window diff --git a/_dialog_checksum_progress.py b/_dialog_checksum_progress.py index 61fc55a..058edc3 100644 --- a/_dialog_checksum_progress.py +++ b/_dialog_checksum_progress.py @@ -7,16 +7,13 @@ class DialogChecksumProgress(QDialog, Ui_ChecksumProgressDialog): self.setupUi(self) # self.import_dialog = UI_DialogImport() # self.ui_import_dialog = Ui_DialogImport() - print('DialogImport') def is_shown(self): - print(f'is_shown: {self.isVisible()}') return self.isVisible() def open_dialog(self,should_be_open): if should_be_open is True: if self.is_shown() is False: - print(f'open_checksum_dialog: {self.is_shown()}') self.show() else: print('Checksum dialog already open.') @@ -24,10 +21,7 @@ class DialogChecksumProgress(QDialog, Ui_ChecksumProgressDialog): self.close_dialog() def close_dialog(self): - print('close_import_dialog') if self.is_shown(): - print('inside self.is_shown()') - print('hiding window') self.hide() def set_progress(self, n): diff --git a/_dialog_compare_imported_checksums.py b/_dialog_compare_imported_checksums.py new file mode 100644 index 0000000..dd59859 --- /dev/null +++ b/_dialog_compare_imported_checksums.py @@ -0,0 +1,56 @@ +from PyQt6.QtWidgets import QDialog, QTableWidgetItem +from _Window_comparison_dialog import Ui_FileComparisonDialog + +class DialogCompareImportedChecksums(QDialog, Ui_FileComparisonDialog): + def __init__(self,*args,**kwargs): + super(DialogCompareImportedChecksums,self).__init__(*args,**kwargs) + self.setupUi(self) + # self.import_dialog = UI_DialogImport() + # self.ui_import_dialog = Ui_DialogImport() + + self.table_headers = ['Source File', + 'Destination File', + 'Source Hash', + 'Destination Hash', + 'Checksum Match'] + + def setup_compare_dialog(self): + self.set_table_headers() + self.tableWidget.setRowCount(0) + + def is_shown(self): + return self.isVisible() + + def open_dialog(self): + if self.is_shown() is False: + self.show() + else: + self.close_dialog() + + def close_dialog(self): + if self.is_shown(): + self.hide() + + def set_label_path_file_source(self,value): + self.l_path_file_source.setText(value) + + def set_label_path_file_dest(self,value): + self.l_path_file_dest.setText(value) + + def set_label_hash_source(self,value): + self.l_hash_source.setText(value) + + def set_label_hash_dest(self,value): + self.l_hash_dest.setText(value) + + def set_table_headers(self): + self.tableWidget.setHorizontalHeaderLabels(self.table_headers) + + def add_table_row(self,_dictionary): + row_count = self.tableWidget.rowCount() + self.tableWidget.insertRow(row_count) + self.tableWidget.setItem(row_count, 0, QTableWidgetItem(_dictionary['source_path_file'])) + self.tableWidget.setItem(row_count, 1, QTableWidgetItem(_dictionary['dest_path_file'])) + self.tableWidget.setItem(row_count, 2, QTableWidgetItem(_dictionary['source_path_hash'])) + self.tableWidget.setItem(row_count, 3, QTableWidgetItem(_dictionary['dest_path_hash'])) + self.tableWidget.setItem(row_count, 4, QTableWidgetItem(str(_dictionary['checksum_match']))) diff --git a/_dialog_find_files.py b/_dialog_find_files.py index 40eaa9b..0d6a53e 100644 --- a/_dialog_find_files.py +++ b/_dialog_find_files.py @@ -8,21 +8,14 @@ class FindProgress(QDialog, Ui_FindProgress): # self.set_progress_finding_files(0) def is_shown(self): - print(f'is_shown: {self.isVisible()}') return self.isVisible() def open_find_files_dialog(self): - print(f'open_import_dialog: {self.is_shown()}') if not self.is_shown(): - print('Inside if not self.is_shown') - print('showing window') self.show() def close_find_files_dialog(self): - print('close_import_dialog') if self.is_shown(): - print('inside self.is_shown()') - print('hiding window') self.hide() def set_progress_finding_files(self,n): diff --git a/_dialog_import.py b/_dialog_import.py index 2cf5f0a..5aa44f6 100644 --- a/_dialog_import.py +++ b/_dialog_import.py @@ -7,18 +7,13 @@ class DialogImport(QDialog, Ui_DialogImport): self.setupUi(self) # self.import_dialog = UI_DialogImport() # self.ui_import_dialog = Ui_DialogImport() - print('DialogImport') def is_shown(self): - print(f'is_shown: {self.isVisible()}') return self.isVisible() def open_import_dialog(self): if self.is_shown() is False: - print(f'open_import_dialog: {self.is_shown()}') if not self.is_shown(): - print('Inside if not self.is_shown') - print('showing window') self.show() else: print('Import Dialog already open.') @@ -26,10 +21,7 @@ class DialogImport(QDialog, Ui_DialogImport): self.close_import_dialog() def close_import_dialog(self): - print('close_import_dialog') if self.is_shown(): - print('inside self.is_shown()') - print('hiding window') self.hide() def set_progress_importing(self, n): diff --git a/_find_files.py b/_find_files.py index e89212c..d51aafd 100644 --- a/_find_files.py +++ b/_find_files.py @@ -32,7 +32,12 @@ class FindFiles: total_file_count_callback, checksum_file_callback, checksum_progress_callback, - checksum_dialog_open_callback): + checksum_dialog_open_callback, + compare_checksums_source_file_callback, + compare_checksums_dest_file_callback, + compare_checksums_source_hash_callback, + compare_checksums_dest_hash_callback, + compare_checksums_add_row_callback): file_count = int(0) if len(self.search_types) > 0: for folder, subfolders, filename in os.walk(self.src_dir): diff --git a/_image_tag.py b/_image_tag.py index da44ab4..6890101 100644 --- a/_image_tag.py +++ b/_image_tag.py @@ -17,7 +17,6 @@ class ImageTag: return tag_data def get_image_tags(self): - print(f'get_image_tags, self.path_file_name: {self.path_file_name}') with open(self.path_file_name,'rb') as f: tags = exifread.process_file(f) return tags \ No newline at end of file diff --git a/_media_file.py b/_media_file.py index 9838f9a..cd375ea 100644 --- a/_media_file.py +++ b/_media_file.py @@ -156,5 +156,5 @@ class MediaFile: self.media['image_meta'] = None self.media['video_meta'] = None - print(f'MediaFile, self.media: {self.media}') + # print(f'MediaFile, self.media: {self.media}') return self.media \ No newline at end of file diff --git a/_thread_my_stuff.py b/_thread_my_stuff.py index afdbd53..db6b0d1 100644 --- a/_thread_my_stuff.py +++ b/_thread_my_stuff.py @@ -34,6 +34,11 @@ class WorkerSignals(QObject): checksum_progress = pyqtSignal(int) checksum_file = pyqtSignal(str) checksum_dialog_open = pyqtSignal(bool) + compare_checksums_source_file = pyqtSignal(str) + compare_checksums_dest_file = pyqtSignal(str) + compare_checksums_source_hash = pyqtSignal(str) + compare_checksums_dest_hash = pyqtSignal(str) + compare_checksums_add_row = pyqtSignal(dict) class Worker(QRunnable): """ @@ -66,6 +71,11 @@ class Worker(QRunnable): self.kwargs['checksum_file_callback'] = self.signals.checksum_file self.kwargs['checksum_progress_callback'] = self.signals.checksum_progress self.kwargs['checksum_dialog_open_callback'] = self.signals.checksum_dialog_open + self.kwargs['compare_checksums_source_file_callback'] = self.signals.compare_checksums_source_file + self.kwargs['compare_checksums_dest_file_callback'] = self.signals.compare_checksums_dest_file + self.kwargs['compare_checksums_source_hash_callback'] = self.signals.compare_checksums_source_hash + self.kwargs['compare_checksums_dest_hash_callback'] = self.signals.compare_checksums_dest_hash + self.kwargs['compare_checksums_add_row_callback'] = self.signals.compare_checksums_add_row @pyqtSlot() def run(self): diff --git a/_verify_file_checksum.py b/_verify_file_checksum.py index 2f3779c..86f701c 100644 --- a/_verify_file_checksum.py +++ b/_verify_file_checksum.py @@ -11,7 +11,7 @@ class FileHash: self.path_file = path_file self._path = os.path.dirname(self.path_file) self.chunk_size = chunk_size - self.path_hasher = xxhash.xxh64(self._path) + self.path_hasher = xxhash.xxh64(self.path_file) # noinspection PyArgumentList # self.file_hash = self.get_hash(self.path_file) self.path_hash = self.hash_path() @@ -24,7 +24,12 @@ class FileHash: total_file_count_callback, checksum_file_callback, checksum_progress_callback, - checksum_dialog_open_callback): + checksum_dialog_open_callback, + compare_checksums_source_file_callback, + compare_checksums_dest_file_callback, + compare_checksums_source_hash_callback, + compare_checksums_dest_hash_callback, + compare_checksums_add_row_callback): checksum_dialog_open_callback.emit(True)