File size: 6,562 Bytes
5779747
 
 
 
19de063
e50e82a
5779747
 
 
 
e50e82a
19de063
5779747
963c867
 
5779747
 
 
 
 
 
 
 
8e725cb
 
5779747
 
 
 
 
 
 
8e725cb
5779747
 
963c867
8e725cb
963c867
8e725cb
963c867
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c8ba898
 
 
 
 
 
e50e82a
963c867
 
5779747
8e725cb
 
5779747
 
 
 
 
 
 
19de063
 
 
 
 
 
 
5779747
8e725cb
5779747
 
 
 
 
 
 
963c867
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
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!")