130 lines
3.1 KiB
Bash
Executable File
130 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# rofi_ocr_search.sh - Search and open OCR'd screenshot files using rofi
|
|
# This script displays OCR'd screenshot data in rofi and allows opening selected files
|
|
|
|
# Constants
|
|
DATABASE_PATH="$HOME/screenshot_ocr.db"
|
|
SCREENSHOTS_DIR="$HOME/Screenshots"
|
|
ROFI_PROMPT="Screenshot OCR"
|
|
MAX_DISPLAY_LENGTH=100
|
|
|
|
# Check if required programs are installed
|
|
check_dependencies() {
|
|
local missing=0
|
|
|
|
if ! command -v rofi >/dev/null 2>&1; then
|
|
echo "Error: rofi is not installed. Please install it with:"
|
|
echo " sudo pacman -S rofi"
|
|
missing=1
|
|
fi
|
|
|
|
if ! command -v sqlite3 >/dev/null 2>&1; then
|
|
echo "Error: sqlite3 is not installed. Please install it with:"
|
|
echo " sudo pacman -S sqlite"
|
|
missing=1
|
|
fi
|
|
|
|
if ! command -v xdg-open >/dev/null 2>&1; then
|
|
echo "Error: xdg-open is not installed. Please install it with:"
|
|
echo " sudo pacman -S xdg-utils"
|
|
missing=1
|
|
fi
|
|
|
|
if [ ! -f "$DATABASE_PATH" ]; then
|
|
echo "Error: Database not found at $DATABASE_PATH"
|
|
echo "Run the OCR script first to create and populate the database."
|
|
missing=1
|
|
fi
|
|
|
|
if [ $missing -eq 1 ]; then
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Format OCR text for display in rofi
|
|
format_ocr_text() {
|
|
local text="$1"
|
|
|
|
# Replace newlines with spaces
|
|
text="${text//$'\n'/ }"
|
|
|
|
# Remove multiple spaces
|
|
text=$(echo "$text" | tr -s ' ')
|
|
|
|
# Truncate if too long
|
|
if [ ${#text} -gt $MAX_DISPLAY_LENGTH ]; then
|
|
text="${text:0:$MAX_DISPLAY_LENGTH}..."
|
|
fi
|
|
|
|
echo "$text"
|
|
}
|
|
|
|
# Get entries from database and format for rofi
|
|
get_entries_for_rofi() {
|
|
sqlite3 -separator '|' "$DATABASE_PATH" "
|
|
SELECT filename, ocr_text, full_path
|
|
FROM ocr_results
|
|
ORDER BY filename
|
|
" | while IFS='|' read -r filename ocr_text path; do
|
|
formatted_text=$(format_ocr_text "$ocr_text")
|
|
echo "$filename | $formatted_text"
|
|
echo "$path" >> /tmp/ocr_paths.$$
|
|
done
|
|
}
|
|
|
|
# Main function
|
|
main() {
|
|
check_dependencies
|
|
|
|
# Create temporary file for paths
|
|
rm -f /tmp/ocr_paths.$$ 2>/dev/null
|
|
touch /tmp/ocr_paths.$$
|
|
|
|
# Get all entries and display in rofi
|
|
selection=$(get_entries_for_rofi | rofi -dmenu -i -p "$ROFI_PROMPT" \
|
|
-width 80 \
|
|
-lines 15 \
|
|
-font "mono 10" \
|
|
-matching fuzzy)
|
|
|
|
# Exit if no selection made
|
|
if [ -z "$selection" ]; then
|
|
rm -f /tmp/ocr_paths.$$ 2>/dev/null
|
|
exit 0
|
|
fi
|
|
|
|
# Extract filename from selection
|
|
filename=$(echo "$selection" | cut -d '|' -f1 | xargs)
|
|
|
|
# Find the corresponding line number
|
|
line_number=1
|
|
sqlite3 -separator '|' "$DATABASE_PATH" "
|
|
SELECT filename
|
|
FROM ocr_results
|
|
ORDER BY filename
|
|
" | while read -r db_filename; do
|
|
if [ "$db_filename" = "$filename" ]; then
|
|
break
|
|
fi
|
|
line_number=$((line_number + 1))
|
|
done
|
|
|
|
# Get the full path from our temporary file
|
|
file_path=$(sed -n "${line_number}p" /tmp/ocr_paths.$$)
|
|
|
|
# Open the file if path exists
|
|
if [ -n "$file_path" ] && [ -f "$file_path" ]; then
|
|
xdg-open "$file_path" &
|
|
echo "Opening: $file_path"
|
|
else
|
|
echo "Error: Could not find file path for $filename"
|
|
fi
|
|
|
|
# Clean up
|
|
rm -f /tmp/ocr_paths.$$ 2>/dev/null
|
|
}
|
|
|
|
# Run the main function
|
|
main
|