94 lines
2.8 KiB
Bash
Executable File
94 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -u
|
|
|
|
json_probe() {
|
|
local tesseract_ready=false
|
|
local zbar_ready=false
|
|
local english_ready=false
|
|
|
|
command -v tesseract >/dev/null 2>&1 && tesseract_ready=true
|
|
command -v zbarimg >/dev/null 2>&1 && zbar_ready=true
|
|
if [[ "$tesseract_ready" == true ]] && tesseract --list-langs 2>/dev/null | grep -qx 'eng'; then
|
|
english_ready=true
|
|
fi
|
|
|
|
jq -cn \
|
|
--argjson tesseract "$tesseract_ready" \
|
|
--argjson zbar "$zbar_ready" \
|
|
--argjson english "$english_ready" \
|
|
'{tesseract: $tesseract, zbar: $zbar, english: $english}'
|
|
}
|
|
|
|
json_error() {
|
|
jq -cn --arg error "$1" '{ok: false, text: "", codeType: "", codeValue: "", error: $error}'
|
|
}
|
|
|
|
analyze_file() {
|
|
local image="${1:-}"
|
|
if [[ -z "$image" || ! -f "$image" || ! -r "$image" ]]; then
|
|
json_error 'The captured image is unavailable.'
|
|
return 2
|
|
fi
|
|
if ! command -v tesseract >/dev/null 2>&1; then
|
|
json_error 'Local text recognition is not installed. Install tesseract and zbar.'
|
|
return 3
|
|
fi
|
|
if ! tesseract --list-langs 2>/dev/null | grep -qx 'eng'; then
|
|
json_error 'The English Tesseract language pack is not installed.'
|
|
return 4
|
|
fi
|
|
|
|
local work_dir
|
|
work_dir="$(mktemp -d)" || {
|
|
json_error 'Panama could not create recognition workspace.'
|
|
return 5
|
|
}
|
|
trap 'rm -rf "$work_dir"' RETURN
|
|
|
|
local text=''
|
|
local ocr_error=''
|
|
local ocr_status=0
|
|
text="$(tesseract "$image" stdout -l eng --psm 3 2>"$work_dir/tesseract.err")" || ocr_status=$?
|
|
ocr_error="$(<"$work_dir/tesseract.err")"
|
|
|
|
# ZBar is additive: OCR remains useful when the optional code reader is
|
|
# absent. The first symbol is surfaced because the result sheet is designed
|
|
# for one deliberate screen selection, not bulk barcode inventory.
|
|
local code_line=''
|
|
local code_type=''
|
|
local code_value=''
|
|
if command -v zbarimg >/dev/null 2>&1; then
|
|
code_line="$(zbarimg --quiet "$image" 2>/dev/null | sed -n '1p')"
|
|
if [[ -n "$code_line" ]]; then
|
|
code_type="${code_line%%:*}"
|
|
code_value="${code_line#*:}"
|
|
fi
|
|
fi
|
|
|
|
if ((ocr_status != 0)) && [[ -z "$code_value" ]]; then
|
|
[[ -n "$ocr_error" ]] || ocr_error='Tesseract could not read the captured image.'
|
|
json_error "$ocr_error"
|
|
return 6
|
|
fi
|
|
|
|
jq -cn \
|
|
--arg text "$text" \
|
|
--arg codeType "$code_type" \
|
|
--arg codeValue "$code_value" \
|
|
'{ok: true, text: $text, codeType: $codeType, codeValue: $codeValue, error: ""}'
|
|
}
|
|
|
|
case "${1:-}" in
|
|
probe)
|
|
json_probe
|
|
;;
|
|
analyze-file)
|
|
analyze_file "${2:-}"
|
|
;;
|
|
*)
|
|
json_error 'Usage: screen-intelligence probe | analyze-file IMAGE'
|
|
exit 64
|
|
;;
|
|
esac
|