Spaces:
Sleeping
Sleeping
import streamlit as st | |
from PIL import Image, UnidentifiedImageError | |
import io | |
import uuid | |
import urllib.parse | |
from datetime import datetime | |
import pytz | |
from ocr_engine import extract_weight_from_image # This must return (weight, confidence) | |
# Setup | |
st.set_page_config(page_title="βοΈ Auto Weight Logger", layout="centered") | |
st.title("βοΈ Auto Weight Logger") | |
# Session 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 = "" | |
if "image_bytes" not in st.session_state: | |
st.session_state.image_bytes = None | |
# Function to get IST time | |
def get_current_ist_time(): | |
ist = pytz.timezone("Asia/Kolkata") | |
return datetime.now(ist).strftime("%Y-%m-%d %I:%M:%S %p") | |
# Input selection | |
input_mode = st.radio("πΈ Select Input Method", ["Camera", "Upload"], horizontal=True) | |
# Retake button | |
if st.button("π Clear / Retake"): | |
st.session_state.camera_key = str(uuid.uuid4()) | |
st.session_state.captured_time = "" | |
st.session_state.image_bytes = None | |
st.rerun() | |
# Capture or Upload | |
if input_mode == "Camera": | |
cam_photo = st.camera_input("π· Capture Weight Display", key=st.session_state.camera_key) | |
if cam_photo: | |
st.session_state.image_bytes = cam_photo.getvalue() | |
st.session_state.captured_time = get_current_ist_time() | |
elif input_mode == "Upload": | |
uploaded_file = st.file_uploader("π Upload an image (JPG/PNG)", type=["jpg", "jpeg", "png"]) | |
if uploaded_file: | |
st.session_state.image_bytes = uploaded_file.read() | |
st.session_state.captured_time = get_current_ist_time() | |
# Process image | |
if st.session_state.image_bytes: | |
try: | |
image = Image.open(io.BytesIO(st.session_state.image_bytes)) | |
# Display bullet-point summary | |
st.markdown("### π Captured Information") | |
st.markdown(f""" | |
- π **Captured At (IST):** `{st.session_state.captured_time}` | |
- πΌοΈ **Snapshot Image:** | |
""") | |
st.image(image, use_column_width=True) | |
if len(st.session_state.image_bytes) > 5 * 1024 * 1024: | |
st.error("β Image too large (>5MB). Please upload a smaller image.") | |
st.stop() | |
with st.spinner("π Extracting weight using OCR..."): | |
weight, confidence = extract_weight_from_image(image) | |
if not weight or confidence < 80: | |
st.markdown(f"- β οΈ **Low OCR Confidence:** `{int(confidence)}%` β Please retake or upload a clearer image.") | |
st.markdown("- βοΈ **Detected Weight:** Not reliable") | |
else: | |
st.markdown(f"- βοΈ **Detected Weight:** `{weight} g`") | |
st.markdown(f"- π **OCR Confidence:** `{int(confidence)}%`") | |
# Salesforce link | |
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""" | |
<a href="{salesforce_url}" target="_blank"> | |
<button style=" | |
background-color: #4CAF50; | |
border: none; | |
color: white; | |
padding: 12px 24px; | |
text-align: center; | |
text-decoration: none; | |
display: inline-block; | |
font-size: 16px; | |
border-radius: 8px; | |
cursor: pointer; | |
">π€ Log to Salesforce</button> | |
</a> | |
""", unsafe_allow_html=True | |
) | |
except UnidentifiedImageError: | |
st.error("β Unable to process image. Please upload a valid JPG or PNG.") | |
except Exception as e: | |
st.error("β Unexpected error occurred.") | |
st.exception(e) | |