Files
ocr-screenshot-gallery/OCR-scripts/ocr_screenshots.py
T
2025-11-16 01:42:27 -05:00

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()