#!/bin/bash # ----------------------------------------------------------------------------- # WCX Thumbnail OCR # # Extracts text from a local image file or an image URL using the Google Cloud # Vision API. # # The script: # 1. Accepts either a local image path or an HTTP/HTTPS image URL. # 2. Reads or downloads the image and encodes it as Base64. # 3. Sends the image to Google Cloud Vision using TEXT_DETECTION. # 4. Extracts the first detected text annotation from the API response. # 5. Writes the OCR text to standard output or to a file specified with -o. # # Requirements: # - GOOGLE_VISION_API_KEY must be set in the environment. # - curl is required for HTTP requests and remote image downloads. # - base64 is required for encoding the image. # - jq is recommended and is required for clean plain-text output. # # Usage: # ocr.sh [-o output-file] # # Examples: # ./ocr.sh thumbnail.jpg # ./ocr.sh "https://example.com/thumbnail.jpg" # ./ocr.sh "https://example.com/thumbnail.jpg" -o ocr-result.txt # # Output contract: # - Without -o, the detected OCR text is written to standard output. # - With -o, the OCR text is written to the specified file and a completion # message is written to standard output. # - A non-zero exit status indicates invalid input, missing configuration, # missing dependencies, an API failure, or that no text was detected. # # The output is raw OCR text. Its structure is not guaranteed by Google Vision # and must be parsed and validated separately before being stored as metadata. # ----------------------------------------------------------------------------- # --- KONFIGURATION --- # Skriptet förväntar sig nu miljövariabeln: GOOGLE_VISION_API_KEY # --------------------- usage() { echo "Användning: $0 [-o utdatafil]" echo "Exempel 1: $0 kvitto.jpg" echo "Exempel 2: export GOOGLE_VISION_API_KEY=\"din_nyckel\" && $0 https://example.com/image.png -o text.txt" exit 1 } # 1. Kontrollera att miljövariabeln är satt if [ -z "$GOOGLE_VISION_API_KEY" ]; then echo "Fel: Miljövariabeln GOOGLE_VISION_API_KEY är inte satt." >&2 echo "Kör detta i terminalen först: export GOOGLE_VISION_API_KEY=\"din_faktiska_nyckel\"" >&2 exit 1 fi # Kontrollera att vi fick minst ett argument if [ $# -lt 1 ]; then usage fi INPUT="$1" OUTPUT_FILE="" # Hantera flaggor för utdatafil (-o) if [ "$2" == "-o" ] && [ -n "$3" ]; then OUTPUT_FILE="$3" fi # 2. Hantera bilden (lokal fil vs URL) och koda till Base64 if [[ "$INPUT" =~ ^https?:// ]]; then # Det är en URL - ladda ner och koda till Base64 i minnet if ! command -v curl &> /dev/null; then echo "Fel: curl krävs men är inte installerat." >&2 exit 1 fi BASE64_IMAGE=$(curl -s "$INPUT" | base64) else # Det är en lokal fil if [ ! -f "$INPUT" ]; then echo "Fel: Filen '$INPUT' hittades inte." >&2 exit 1 fi # Hanterar både Mac (base64) och Linux (base64 -w 0) för att undvika radbrytningar i Base64-strängen if [[ "$OSTYPE" == "darwin"* ]]; then BASE64_IMAGE=$(base64 "$INPUT") else BASE64_IMAGE=$(base64 -w 0 "$INPUT") fi fi # 3. Skapa JSON-payloaden JSON_PAYLOAD=$(cat < /dev/null; then RESULT=$(curl -s -X POST \ -H "Content-Type: application/json; charset=utf-8" \ -d "$JSON_PAYLOAD" \ "https://vision.googleapis.com/v1/images:annotate?key=$GOOGLE_VISION_API_KEY" | jq -r '.responses[0].textAnnotations[0].description') else echo "Tips: Installera 'jq' (t.ex. 'brew install jq' eller 'apt install jq') för att få ren text." >&2 RESULT=$(curl -s -X POST \ -H "Content-Type: application/json; charset=utf-8" \ -d "$JSON_PAYLOAD" \ "https://vision.googleapis.com/v1/images:annotate?key=$GOOGLE_VISION_API_KEY") fi # Kontrollera om vi fick något svar eller om det blev fel if [ "$RESULT" == "null" ] || [ -z "$RESULT" ]; then echo "Ingen text hittades eller så uppstod ett API-fel." >&2 exit 1 fi # 5. Skriv ut resultatet (till fil eller stdout) if [ -n "$OUTPUT_FILE" ]; then echo "$RESULT" > "$OUTPUT_FILE" echo "Klart! Texten har sparats i $OUTPUT_FILE" else echo "$RESULT" fi