From 7944cd0084bbefd1c732645d59231e4cdc895f89 Mon Sep 17 00:00:00 2001 From: Llloooggg Date: Thu, 15 May 2025 22:21:25 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- image_compressor.py | 68 ++++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/image_compressor.py b/image_compressor.py index 28abfe6..108d82d 100644 --- a/image_compressor.py +++ b/image_compressor.py @@ -233,7 +233,8 @@ def compress_with_pillow(path: Path) -> Tuple[bool, Path]: def compress_image(path: Path): - global processed_count, skipped_count, skipped_size_count, error_count, total_saved_bytes, total_images_original_size, total_images_new_size, processed_hashes + global processed_count, skipped_count, skipped_size_count, error_count + global total_saved_bytes, total_images_original_size, total_images_new_size, processed_hashes try: original_size = path.stat().st_size @@ -241,41 +242,41 @@ def compress_image(path: Path): h = file_hash(path) - if path.stat().st_size < MAX_SIZE: + if original_size < MAX_SIZE: logging.info( - f"Пропущено (малый размер): {path} ({path.stat().st_size // 1024} KB)" + f"Пропущено (малый размер): {path} ({original_size // 1024} KB)" ) processed_hashes.add(h) skipped_size_count += 1 total_images_new_size += original_size return + file_path_str = str(path) + with db_lock: cursor.execute( "SELECT filename FROM processed_images WHERE hash = ?", (h,) ) row = cursor.fetchone() - file_path = str(path) if row: - processed_hashes.add(h) - skipped_count += 1 - total_images_new_size += original_size - - hash_files = row[0].split("|") - if file_path in hash_files: + existing_paths = set(row[0].split("|")) + if file_path_str in existing_paths: logging.info( f"Пропущено (уже обработано): {path} ({original_size // 1024} KB)" ) else: - hash_files.append(file_path) + existing_paths.add(file_path_str) cursor.execute( "UPDATE processed_images SET filename = ? WHERE hash = ?", - ("|".join(hash_files), h), + ("|".join(sorted(existing_paths)), h), ) conn.commit() logging.info( f"Пропущено (дубликат хэша, другой путь): {path} ({original_size // 1024} KB)" ) + processed_hashes.add(h) + skipped_count += 1 + total_images_new_size += original_size return ext = path.suffix.lower() @@ -288,48 +289,47 @@ def compress_image(path: Path): total_images_new_size += new_size if result: - h = file_hash(final_path) - - processed_count += 1 - + new_hash = file_hash(final_path) saved = original_size - new_size - total_saved_bytes += saved percent = (1 - new_size / original_size) * 100 + logging.info( - f"Сжато: {path} ({original_size//1024} KB -> {new_size//1024} KB, {percent:.2f}%)" + f"Сжато: {path} ({original_size // 1024} KB -> {new_size // 1024} KB, {percent:.2f}%)" ) with db_lock: cursor.execute( "SELECT filename FROM processed_images WHERE hash = ?", - (h,), + (new_hash,), ) row = cursor.fetchone() - file_path = str(final_path) if row: - hash_files = row[0].split("|") - if file_path not in hash_files: - hash_files.append(file_path) - cursor.execute( - "UPDATE processed_images SET filename = ? WHERE hash = ?", - ("|".join(hash_files), h), - ) - conn.commit() + paths = set(row[0].split("|")) + paths.add(str(final_path)) + cursor.execute( + "UPDATE processed_images SET filename = ? WHERE hash = ?", + ("|".join(sorted(paths)), new_hash), + ) else: cursor.execute( "INSERT INTO processed_images(hash, filename) VALUES(?, ?)", - (h, file_path), + (new_hash, str(final_path)), ) - conn.commit() - else: - error_count += 1 + conn.commit() - processed_hashes.add(h) + processed_hashes.add(new_hash) + processed_count += 1 + total_saved_bytes += saved + else: + logging.error(f"Не удалось сжать: {path}") + processed_hashes.add(h) + error_count += 1 + total_images_new_size += original_size except Exception as e: + logging.error(f"Ошибка при обработке {path}: {e}") error_count += 1 total_images_new_size += original_size - logging.error(f"Ошибка при обработке {path}: {e}") def find_images(root: Path):