170 lines
4.8 KiB
Python
Executable File
170 lines
4.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import glob
|
|
import os
|
|
import sqlite3
|
|
import subprocess
|
|
from datetime import datetime
|
|
|
|
# Configuration
|
|
SCREENSHOTS_DIR = os.path.expanduser("~/Screenshots")
|
|
DATABASE_PATH = os.path.expanduser("~/screenshot_ocr.db")
|
|
|
|
|
|
def create_database():
|
|
"""Create SQLite database and table if they don't exist."""
|
|
conn = sqlite3.connect(DATABASE_PATH)
|
|
cursor = conn.cursor()
|
|
|
|
# Create table for OCR results
|
|
cursor.execute("""
|
|
CREATE TABLE IF NOT EXISTS ocr_results (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
filename TEXT UNIQUE,
|
|
full_path TEXT,
|
|
ocr_text TEXT,
|
|
file_size INTEGER,
|
|
created_date TEXT,
|
|
ocr_date TEXT
|
|
)
|
|
""")
|
|
|
|
conn.commit()
|
|
conn.close()
|
|
print(f"Database initialized at {DATABASE_PATH}")
|
|
|
|
|
|
def get_processed_files():
|
|
"""Get a set of filenames that have already been processed."""
|
|
conn = sqlite3.connect(DATABASE_PATH)
|
|
cursor = conn.cursor()
|
|
|
|
cursor.execute("SELECT filename FROM ocr_results")
|
|
processed_files = {row[0] for row in cursor.fetchall()}
|
|
|
|
conn.close()
|
|
return processed_files
|
|
|
|
|
|
def perform_ocr(image_path):
|
|
"""Perform OCR on an image file using tesseract."""
|
|
try:
|
|
# Create a temporary output file
|
|
temp_output = f"/tmp/{os.path.basename(image_path)}.txt"
|
|
temp_base = temp_output.replace(".txt", "")
|
|
|
|
# Run tesseract
|
|
subprocess.run(
|
|
["tesseract", image_path, temp_base],
|
|
check=True,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE,
|
|
)
|
|
|
|
# Read OCR text from the output file
|
|
with open(temp_output, "r", encoding="utf-8") as f:
|
|
ocr_text = f.read().strip()
|
|
|
|
# Clean up temporary file
|
|
os.remove(temp_output)
|
|
|
|
return ocr_text
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"Error running tesseract on {image_path}: {str(e)}")
|
|
return ""
|
|
except Exception as e:
|
|
print(f"Error processing {image_path}: {str(e)}")
|
|
return ""
|
|
|
|
|
|
def add_to_database(filename, full_path, ocr_text, file_size, created_date):
|
|
"""Add OCR result to the database."""
|
|
conn = sqlite3.connect(DATABASE_PATH)
|
|
cursor = conn.cursor()
|
|
|
|
try:
|
|
cursor.execute(
|
|
"""
|
|
INSERT INTO ocr_results
|
|
(filename, full_path, ocr_text, file_size, created_date, ocr_date)
|
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
""",
|
|
(
|
|
filename,
|
|
full_path,
|
|
ocr_text,
|
|
file_size,
|
|
created_date,
|
|
datetime.now().isoformat(),
|
|
),
|
|
)
|
|
|
|
conn.commit()
|
|
print(f"Added {filename} to database")
|
|
except sqlite3.IntegrityError:
|
|
print(f"File {filename} already exists in database")
|
|
except Exception as e:
|
|
print(f"Error adding {filename} to database: {str(e)}")
|
|
finally:
|
|
conn.close()
|
|
|
|
|
|
def main():
|
|
"""Main function to process screenshot images."""
|
|
print("Starting OCR process for screenshots...")
|
|
|
|
# Create database if it doesn't exist
|
|
create_database()
|
|
|
|
# Get list of already processed files
|
|
processed_files = get_processed_files()
|
|
print(f"Found {len(processed_files)} already processed files")
|
|
|
|
# Get list of PNG and JPG files
|
|
image_files = glob.glob(os.path.join(SCREENSHOTS_DIR, "*.png"))
|
|
image_files.extend(glob.glob(os.path.join(SCREENSHOTS_DIR, "*.jpg")))
|
|
image_files.extend(glob.glob(os.path.join(SCREENSHOTS_DIR, "*.jpeg")))
|
|
print(f"Found {len(image_files)} image files")
|
|
|
|
# Process each image file
|
|
processed_count = 0
|
|
skipped_count = 0
|
|
error_count = 0
|
|
|
|
for image_path in image_files:
|
|
filename = os.path.basename(image_path)
|
|
|
|
# Skip if already processed
|
|
if filename in processed_files:
|
|
print(f"Skipping {filename} (already processed)")
|
|
skipped_count += 1
|
|
continue
|
|
|
|
print(f"Processing {filename}...")
|
|
|
|
# Get file information
|
|
file_stats = os.stat(image_path)
|
|
file_size = file_stats.st_size
|
|
created_date = datetime.fromtimestamp(file_stats.st_mtime).isoformat()
|
|
|
|
# Perform OCR
|
|
ocr_text = perform_ocr(image_path)
|
|
|
|
if ocr_text:
|
|
# Add to database
|
|
add_to_database(filename, image_path, ocr_text, file_size, created_date)
|
|
processed_count += 1
|
|
else:
|
|
print(f"No OCR text extracted from {filename}")
|
|
error_count += 1
|
|
|
|
print("\nOCR process completed:")
|
|
print(f"- Processed: {processed_count}")
|
|
print(f"- Skipped (already in database): {skipped_count}")
|
|
print(f"- Errors: {error_count}")
|
|
print(f"- Total files in database: {len(processed_files) + processed_count}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|