Auto-weight-logger2 / src /streamlit_app.py
Sanjayraju30's picture
Update src/streamlit_app.py
e667809 verified
raw
history blame
3.19 kB
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 # This must return (weight, confidence)
# Page setup
st.set_page_config(page_title="βš–οΈ Auto Weight Logger", layout="centered")
st.title("βš–οΈ Auto Weight Logger")
# Store keys/state
if "camera_key" not in st.session_state:
st.session_state.camera_key = str(uuid.uuid4())
if "captured_time" not in st.session_state:
st.session_state.captured_time = ""
# Select input type
input_mode = st.radio("πŸ“Έ Select Input Method", ["Camera", "Upload"], horizontal=True)
# Clear/reset
if st.button("πŸ” Clear / Retake"):
st.session_state.camera_key = str(uuid.uuid4())
st.session_state.captured_time = ""
st.rerun()
# Init
image_bytes = None
image = None
# Capture time (IST)
def get_current_ist_time():
ist = pytz.timezone("Asia/Kolkata")
return datetime.now(ist).strftime("%Y-%m-%d %I:%M:%S %p")
# Handle camera
if input_mode == "Camera":
cam_photo = st.camera_input("πŸ“· Take a photo", key=st.session_state.camera_key)
if cam_photo:
image_bytes = cam_photo.getvalue()
st.session_state.captured_time = get_current_ist_time()
# Handle upload
elif input_mode == "Upload":
uploaded_file = st.file_uploader("πŸ“ Upload an image (JPG/PNG)", type=["jpg", "jpeg", "png"])
if uploaded_file:
image_bytes = uploaded_file.read()
st.session_state.captured_time = get_current_ist_time()
# Process if image exists
if image_bytes:
try:
image = Image.open(io.BytesIO(image_bytes))
st.subheader("πŸ–ΌοΈ Snapshot Image")
st.image(image, use_column_width=True)
if len(image_bytes) > 5 * 1024 * 1024:
st.error("❌ Image is too large (>5MB).")
st.stop()
with st.spinner("πŸ” Running OCR..."):
weight, confidence = extract_weight_from_image(image)
# Show captured time
st.markdown(f"### πŸ•’ Captured At (IST): `{st.session_state.captured_time}`")
# Show weight
if not weight or confidence < 80:
st.markdown(f"### πŸ“¦ Captured Weight: `Not Detected`")
st.warning(f"⚠️ OCR Confidence too low ({int(confidence)}%)")
else:
st.markdown(f"### πŸ“¦ Captured Weight: `{weight} g`")
st.success(f"βœ… OCR Confidence: {int(confidence)}%")
# Generate Salesforce URL
device_id = "BAL-001"
image_url = "" # optional
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 Weight in Salesforce]({salesforce_url})", unsafe_allow_html=True)
except UnidentifiedImageError:
st.error("❌ Invalid image file.")
except Exception as e:
st.error("❌ Unexpected error.")
st.exception(e)