import streamlit as st from PIL import Image, UnidentifiedImageError import io import uuid import urllib.parse import pytz from datetime import datetime from ocr_engine import extract_weight_from_image # your OCR function # Setup st.set_page_config(page_title="⚖️ Auto Weight Logger", layout="centered") st.title("⚖️ Auto Weight Logger") # IST timezone ist = pytz.timezone('Asia/Kolkata') # Session state if "camera_key" not in st.session_state: st.session_state.camera_key = str(uuid.uuid4()) # Input method input_mode = st.radio("📸 Select Input Method", ["Camera", "Upload"], horizontal=True) # Reset if st.button("🔁 Clear / Retake"): st.session_state.camera_key = str(uuid.uuid4()) st.rerun() # ✅ updated from deprecated st.experimental_rerun() image_bytes = None image = None # Camera input if input_mode == "Camera": cam_photo = st.camera_input("📷 Take a photo of the weight display", key=st.session_state.camera_key) if cam_photo is not None: image_bytes = cam_photo.getvalue() # Upload input elif input_mode == "Upload": uploaded_file = st.file_uploader("📁 Upload a JPG/PNG image", type=["jpg", "jpeg", "png"]) if uploaded_file is not None: try: image_bytes = uploaded_file.read() except Exception as e: st.error("❌ Failed to read uploaded file.") st.exception(e) # Image display and OCR if image_bytes: try: image = Image.open(io.BytesIO(image_bytes)) st.image(image, caption="📸 Snapshot", use_column_width=True) if len(image_bytes) > 5 * 1024 * 1024: st.error("❌ Image too large (>5MB).") st.stop() with st.spinner("🔍 Extracting weight using OCR..."): weight, confidence = extract_weight_from_image(image) if not weight or confidence < 80: st.error(f"⚠️ OCR Confidence too low ({int(confidence)}%). Try again.") else: # IST time captured_time = datetime.now(ist).strftime("%Y-%m-%d %I:%M:%S %p") st.success("✅ OCR Success") st.markdown(f"### 📦 Captured Weight: `{weight} g`") st.markdown(f"### 🕒 Captured At (IST): `{captured_time}`") # Salesforce link device_id = "BAL-001" image_url = "" # optional if stored externally salesforce_url = ( "https://autoweightlogger-dev-ed.my.salesforce-sites.com/" f"weight_logger_page?WeightInput={urllib.parse.quote(str(weight))}" f"&DeviceID={urllib.parse.quote(device_id)}&ImageURL={urllib.parse.quote(image_url)}" ) st.markdown("### 📤 Send to Salesforce") st.markdown(f"[✅ Click to Log in Salesforce]({salesforce_url})", unsafe_allow_html=True) except UnidentifiedImageError: st.error("❌ Unsupported or invalid image format.") except Exception as e: st.error("❌ Unexpected error processing image.") st.exception(e)