|
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 base64 |
|
from imutils.video import VideoStream |
|
import cv2 |
|
from pydub import AudioSegment |
|
from pydub.playback import play |
|
import pypdf |
|
import numpy as np |
|
|
|
|
|
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 |
|
|
|
|
|
def save_to_history(file_type, file_path, data=None): |
|
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") |
|
if file_type == "πΌοΈ Image" and data is not None: |
|
cv2.imwrite(file_path, cv2.cvtColor(data, cv2.COLOR_RGB2BGR)) |
|
elif file_type == "π΅ Audio" and data is not None: |
|
data.export(file_path, format="wav") |
|
elif file_type == "π PDF" and data is not None: |
|
with open(file_path, "wb") as f: |
|
f.write(data) |
|
st.session_state['file_history'].append({ |
|
"Timestamp": timestamp, |
|
"Type": file_type, |
|
"Path": file_path |
|
}) |
|
|
|
|
|
def auto_capture(streams): |
|
while st.session_state['auto_capture_running']: |
|
for i, stream in enumerate(streams): |
|
frame = stream.read() |
|
if frame is not None: |
|
filename = f"cam{i}_auto_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg" |
|
save_to_history("πΌοΈ Image", filename, frame) |
|
time.sleep(10) |
|
|
|
|
|
with st.sidebar: |
|
st.header("ποΈπΈ Snap Shack") |
|
streams = [ |
|
VideoStream(src=0).start(), |
|
VideoStream(src=1).start() |
|
] |
|
if st.button("β° Start Auto-Snap"): |
|
st.session_state['auto_capture_running'] = True |
|
threading.Thread(target=auto_capture, args=(streams,), daemon=True).start() |
|
if st.button("βΉοΈ Stop Auto-Snap"): |
|
st.session_state['auto_capture_running'] = False |
|
|
|
|
|
if st.button("ποΈ Record Audio (5s)"): |
|
audio = AudioSegment.silent(duration=5000) |
|
filename = f"audio_{datetime.now().strftime('%Y%m%d_%H%M%S')}.wav" |
|
save_to_history("π΅ Audio", filename, audio) |
|
|
|
st.subheader("π Snap Stash") |
|
if st.session_state['file_history']: |
|
images = [f for f in st.session_state['file_history'] if f['Type'] == "πΌοΈ Image"] |
|
audios = [f for f in st.session_state['file_history'] if f['Type'] == "π΅ Audio"] |
|
pdfs = [f for f in st.session_state['file_history'] if f['Type'] == "π PDF"] |
|
if images: |
|
st.write("πΌοΈ Images") |
|
for img in images: |
|
st.write(f"- {img['Path']} @ {img['Timestamp']}") |
|
if audios: |
|
st.write("π΅ Audios") |
|
for aud in audios: |
|
st.write(f"- {aud['Path']} @ {aud['Timestamp']}") |
|
if pdfs: |
|
st.write("π PDFs") |
|
for pdf in pdfs: |
|
st.write(f"- {pdf['Path']} @ {pdf['Timestamp']}") |
|
else: |
|
st.write("π³οΈ Empty Stash!") |
|
|
|
|
|
st.title("πΈ Multi-Lib Snap Craze") |
|
|
|
|
|
st.header("πΈπ₯ Snap Zone") |
|
cols = st.columns(2) |
|
placeholders = [cols[0].empty(), cols[1].empty()] |
|
for i, (placeholder, stream) in enumerate(zip(placeholders, streams)): |
|
frame = stream.read() |
|
if frame is not None: |
|
placeholder.image(frame, caption=f"Live Cam {i}", use_container_width=True) |
|
else: |
|
placeholder.error(f"π¨ No feed from Cam {i}") |
|
|
|
if st.button(f"πΈ Snap Cam {i}", key=f"snap{i}"): |
|
frame = stream.read() |
|
if frame is not None: |
|
filename = f"cam{i}_snap_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg" |
|
save_to_history("πΌοΈ Image", filename, frame) |
|
|
|
|
|
st.header("π₯π Drop Zone") |
|
uploaded_files = st.file_uploader("ππΈ Upload PDFs or Images", accept_multiple_files=True, type=['pdf', 'jpg', 'png']) |
|
if uploaded_files: |
|
for uploaded_file in uploaded_files: |
|
file_type = "π PDF" if uploaded_file.type == "application/pdf" else "πΌοΈ Image" |
|
file_path = f"uploaded_{uploaded_file.name}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.{uploaded_file.name.split('.')[-1]}" |
|
if file_type == "πΌοΈ Image": |
|
img = Image.open(uploaded_file) |
|
img_array = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) |
|
save_to_history(file_type, file_path, img_array) |
|
st.image(img, caption=uploaded_file.name, use_container_width=True) |
|
else: |
|
save_to_history(file_type, file_path, uploaded_file.getvalue()) |
|
with pypdf.PdfReader(uploaded_file) as reader: |
|
st.write(f"PDF Pages: {len(reader.pages)}") |
|
|
|
|
|
st.header("πͺ Snap Show") |
|
if st.session_state['file_history']: |
|
images = [f for f in st.session_state['file_history'] if f['Type'] == "πΌοΈ Image"] |
|
audios = [f for f in st.session_state['file_history'] if f['Type'] == "π΅ Audio"] |
|
pdfs = [f for f in st.session_state['file_history'] if f['Type'] == "π PDF"] |
|
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) |
|
if audios: |
|
st.subheader("π΅ Audio Alley") |
|
for aud in audios: |
|
if os.path.exists(aud['Path']): |
|
st.audio(aud['Path']) |
|
with open(aud['Path'], "rb") as f: |
|
aud_data = f.read() |
|
st.markdown(f'<a href="data:audio/wav;base64,{base64.b64encode(aud_data).decode()}" download="{os.path.basename(aud["Path"])}">π₯ Snag It!</a>', unsafe_allow_html=True) |
|
if pdfs: |
|
st.subheader("π PDF Plaza") |
|
for pdf in pdfs: |
|
if os.path.exists(pdf['Path']): |
|
with open(pdf['Path'], "rb") as f: |
|
pdf_data = f.read() |
|
st.markdown(f'<a href="data:application/pdf;base64,{base64.b64encode(pdf_data).decode()}" download="{os.path.basename(pdf["Path"])}">π₯ Download {os.path.basename(pdf["Path"])}</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!") |
|
|
|
|
|
def cleanup(): |
|
for stream in streams: |
|
stream.stop() |
|
|
|
import atexit |
|
atexit.register(cleanup) |