awacke1's picture
Update app.py
963c867 verified
raw
history blame
6.56 kB
import streamlit as st
import pandas as pd
from datetime import datetime
import os
import base64
# 🌟πŸ”₯ Initialize session state like a galactic DJ spinning tracks!
if 'file_history' not in st.session_state:
st.session_state['file_history'] = []
# πŸ“œπŸ’Ύ Save to history like a time-traveling scribe! | πŸ“…βœ¨ save_to_history("πŸ–ΌοΈ Image", "pic.jpg", img_data) - Stamps a pic in the history books like a boss!
def save_to_history(file_type, file_path, img_data):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open(file_path, "wb") as f:
f.write(base64.b64decode(img_data.split(',')[1]))
st.session_state['file_history'].append({
"Timestamp": timestamp,
"Type": file_type,
"Path": file_path
})
# πŸŽ›οΈ Sidebar config like a spaceship control panel!
with st.sidebar:
st.header("πŸŽšοΈπŸ“Έ Snap Shack")
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!")
# 🌍🎨 Main UI kicks off like a cosmic art show!
st.title("πŸ“Έ Multi-Cam Snap Craze")
# πŸ“ΈπŸ“· JS camera zone with multiple streams!
st.header("πŸ“ΈπŸŽ₯ Snap Zone")
multi_cam_html = """
<div id="videoContainer"></div>
<script>
let streams = [];
const container = document.getElementById('videoContainer');
let autoCaptureIntervals = [];
// πŸ“ΉπŸ” Enumerate cameras like a tech detective!
async function enumerateAndStartCameras() {
const devices = await navigator.mediaDevices.enumerateDevices();
const videoDevices = devices.filter(device => device.kind === 'videoinput');
videoDevices.forEach((device, index) => {
const div = document.createElement('div');
div.innerHTML = `
<p>${device.label || 'Camera ' + index}</p>
<video id="video${index}" autoplay playsinline style="width:100%;"></video>
<canvas id="canvas${index}" style="display:none;"></canvas>
<button onclick="takeSnapshot(${index})">πŸ“Έ Snap Cam ${index}</button>
`;
container.appendChild(div);
startStream(device.deviceId, index);
});
}
// πŸ“ΈπŸŽ₯ Start streaming like a live broadcast pro!
async function startStream(deviceId, index) {
const constraints = { video: { deviceId: { exact: deviceId } } };
const stream = await navigator.mediaDevices.getUserMedia(constraints);
const video = document.getElementById(`video${index}`);
video.srcObject = stream;
streams.push(stream);
// Auto-capture every 10 seconds
autoCaptureIntervals[index] = setInterval(() => takeSnapshot(index), 10000);
}
// πŸ“Έβœ‚οΈ Snap a pic like a stealthy paparazzi!
function takeSnapshot(index) {
const video = document.getElementById(`video${index}`);
const canvas = document.getElementById(`canvas${index}`);
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
canvas.getContext('2d').drawImage(video, 0, 0);
const dataUrl = canvas.toDataURL('image/jpeg');
window.parent.postMessage({ type: 'snapshot', data: dataUrl, camIndex: index }, '*');
}
// βΉοΈπŸ“΄ Stop all streams like a broadcast kill switch!
function stopStreams() {
streams.forEach(stream => stream.getTracks().forEach(track => track.stop()));
streams = [];
autoCaptureIntervals.forEach(interval => clearInterval(interval));
autoCaptureIntervals = [];
}
// 🎬 Kick off the camera party!
enumerateAndStartCameras();
window.onunload = stopStreams;
</script>
"""
st.markdown(multi_cam_html, unsafe_allow_html=True)
# πŸ“ΈπŸ“₯ Handle snapshots from JS
def handle_snapshot():
if "snapshot" in st.session_state:
snapshot_data = st.session_state["snapshot"]
cam_index = st.session_state.get("camIndex", 0)
filename = f"cam{cam_index}_snap_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg"
save_to_history("πŸ–ΌοΈ Image", filename, snapshot_data)
st.image(Image.open(BytesIO(base64.b64decode(snapshot_data.split(',')[1]))), caption=f"Cam {cam_index} Snap", use_container_width=True)
del st.session_state["snapshot"]
st.components.v1.html(
"""
<script>
window.addEventListener('message', function(event) {
if (event.data.type === 'snapshot') {
window.streamlitAPI.setComponentValue({snapshot: event.data.data, camIndex: event.data.camIndex});
}
});
</script>
""",
height=0
)
handle_snapshot()
# πŸ“‚ Upload zone like a media drop party!
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}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg"
save_to_history("πŸ–ΌοΈ Image", file_path, base64.b64encode(uploaded_file.getvalue()).decode())
st.image(Image.open(uploaded_file), caption=uploaded_file.name, use_container_width=True)
# πŸ–ΌοΈ Gallery like a media circus!
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]:
if os.path.exists(img['Path']):
st.image(img['Path'], caption=img['Path'], use_container_width=True)
with open(img['Path'], "rb") as f:
img_data = f.read()
st.markdown(f'<a href="data:image/jpeg;base64,{base64.b64encode(img_data).decode()}" download="{os.path.basename(img["Path"])}">πŸ“₯ Snag It!</a>', unsafe_allow_html=True)
else:
st.warning(f"🚨 Missing file: {img['Path']}")
else:
st.write("🚫 No snaps yet!")
# πŸ“œ History log like a time machine!
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!")