|
import streamlit as st |
|
import pandas as pd |
|
from datetime import datetime |
|
import os |
|
import threading |
|
import time |
|
from PIL import Image |
|
from io import BytesIO |
|
import aiofiles |
|
import asyncio |
|
import base64 |
|
|
|
|
|
if 'file_history' not in st.session_state: |
|
st.session_state['file_history'] = [] |
|
if 'auto_capture_running' not_in st.session_state: |
|
st.session_state['auto_capture_running'] = False |
|
if 'cam_file' not_in st.session_state: |
|
st.session_state['cam_file'] = None |
|
|
|
|
|
def save_to_history(file_type, file_path): |
|
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") |
|
st.session_state['file_history'].append({ |
|
"Timestamp": timestamp, |
|
"Type": file_type, |
|
"Path": file_path |
|
}) |
|
|
|
|
|
def auto_capture(): |
|
if st.session_state['auto_capture_running'] and 'cam_img' in st.session_state: |
|
cam_img = st.session_state['cam_img'] |
|
if cam_img: |
|
filename = f"auto_snap_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg" |
|
with open(filename, "wb") as f: |
|
f.write(cam_img.getvalue()) |
|
save_to_history("πΌοΈ Image", filename) |
|
threading.Timer(10, auto_capture).start() |
|
|
|
|
|
with st.sidebar: |
|
st.header("ποΈπΈ Snap Shack") |
|
if st.button("β° Start Auto-Snap"): |
|
st.session_state['auto_capture_running'] = True |
|
auto_capture() |
|
if st.button("βΉοΈ Stop Auto-Snap"): |
|
st.session_state['auto_capture_running'] = False |
|
|
|
|
|
st.subheader("π Snap Stash") |
|
if st.session_state['file_history']: |
|
images = [f for f in st.session_state['file_history'] if f['Type'] == "πΌοΈ Image"] |
|
if images: |
|
st.write("πΌοΈ Images") |
|
for img in images: |
|
st.write(f"- {img['Path']} @ {img['Timestamp']}") |
|
else: |
|
st.write("π³οΈ Empty Stash!") |
|
|
|
|
|
st.title("πΈ Snap Craze") |
|
|
|
|
|
st.header("πΈπ₯ Snap Zone") |
|
cam_img = st.camera_input("π· Snap It!", key="cam") |
|
if cam_img: |
|
filename = f"cam_snap_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg" |
|
if st.session_state['cam_file'] and os.path.exists(st.session_state['cam_file']): |
|
os.remove(st.session_state['cam_file']) |
|
with open(filename, "wb") as f: |
|
f.write(cam_img.getvalue()) |
|
st.session_state['cam_file'] = filename |
|
st.session_state['cam_img'] = cam_img |
|
save_to_history("πΌοΈ Image", filename) |
|
st.image(Image.open(filename), caption="Latest Snap", use_column_width=True) |
|
|
|
|
|
st.header("π₯π Drop Zone") |
|
uploaded_files = st.file_uploader("πΈ Toss Pics", accept_multiple_files=True, type=['jpg', 'png']) |
|
if uploaded_files: |
|
for uploaded_file in uploaded_files: |
|
file_path = f"uploaded_{uploaded_file.name}" |
|
with open(file_path, "wb") as f: |
|
f.write(uploaded_file.read()) |
|
save_to_history("πΌοΈ Image", file_path) |
|
|
|
|
|
st.header("πͺ Snap Show") |
|
if st.session_state['file_history']: |
|
images = [f for f in st.session_state['file_history'] if f['Type'] == "πΌοΈ Image"] |
|
if images: |
|
st.subheader("πΌοΈ Pic Parade") |
|
cols = st.columns(3) |
|
for i, img in enumerate(images): |
|
with cols[i % 3]: |
|
st.image(img['Path'], caption=img['Path'], use_column_width=True) |
|
st.markdown(f'<a href="data:image/jpeg;base64,{base64.b64encode(open(img["Path"], "rb").read()).decode()}" download="{os.path.basename(img["Path"])}">π₯ Snag It!</a>', unsafe_allow_html=True) |
|
else: |
|
st.write("π« No snaps yet!") |
|
|
|
|
|
st.header("β³ Snap Saga") |
|
if st.session_state['file_history']: |
|
df = pd.DataFrame(st.session_state['file_history']) |
|
st.dataframe(df) |
|
else: |
|
st.write("π³οΈ Nothing snapped yet!") |