|
import streamlit as st |
|
import pandas as pd |
|
from datetime import datetime |
|
import cv2 |
|
from pydub import AudioSegment |
|
import imageio |
|
import av |
|
import moviepy.editor as mp |
|
import os |
|
import numpy as np |
|
from io import BytesIO |
|
|
|
|
|
if 'file_history' not in st.session_state: |
|
st.session_state['file_history'] = [] |
|
if 'ping_code' not in st.session_state: |
|
st.session_state['ping_code'] = "" |
|
if 'uploaded_files' not in st.session_state: |
|
st.session_state['uploaded_files'] = [] |
|
|
|
|
|
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 |
|
}) |
|
|
|
|
|
st.title("πΈποΈ Capture Craze") |
|
|
|
|
|
with st.sidebar: |
|
st.header("ποΈπΈ Tune-Up Zone") |
|
library_choice = st.selectbox("π Pick a Tool", ["OpenCV", "PyDub", "ImageIO", "PyAV", "MoviePy", "JS Audio"]) |
|
resolution = st.select_slider("π Snap Size", options=["320x240", "640x480", "1280x720"], value="640x480") |
|
fps = st.slider("β±οΈ Speed Snap", 1, 60, 30) |
|
|
|
|
|
st.subheader("π Ping-a-Tron") |
|
col1, col2, col3, col4 = st.columns(4) |
|
with col1: |
|
digit1 = st.selectbox("1οΈβ£", [str(i) for i in range(10)], key="d1") |
|
with col2: |
|
digit2 = st.selectbox("2οΈβ£", [str(i) for i in range(10)], key="d2") |
|
with col3: |
|
digit3 = st.selectbox("3οΈβ£", [str(i) for i in range(10)], key="d3") |
|
with col4: |
|
digit4 = st.selectbox("4οΈβ£", [str(i) for i in range(10)], key="d4") |
|
ping_code = digit1 + digit2 + digit3 + digit4 |
|
st.session_state['ping_code'] = ping_code |
|
st.write(f"π Code: {ping_code}") |
|
|
|
|
|
st.header("πΈποΈ Tool Titans") |
|
|
|
|
|
with st.expander("1οΈβ£ π· OpenCV Fiesta"): |
|
st.write("π₯ Snap Star: Real-time pixel magic!") |
|
st.subheader("π₯ Top Tricks") |
|
|
|
st.write("πΈπ₯ Video Snap") |
|
if st.button("π¬ Go Live", key="opencv_1"): |
|
|
|
cap = cv2.VideoCapture(0) |
|
frame_placeholder = st.empty() |
|
for _ in range(50): |
|
ret, frame = cap.read() |
|
if ret: |
|
frame_placeholder.image(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) |
|
cap.release() |
|
|
|
st.write("ποΈβ¨ Gray Snap") |
|
if st.button("π· Save Gray", key="opencv_2"): |
|
|
|
cap = cv2.VideoCapture(0) |
|
ret, frame = cap.read() |
|
if ret: |
|
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) |
|
file_path = f"opencv_gray_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg" |
|
cv2.imwrite(file_path, gray) |
|
save_to_history("Image", file_path) |
|
st.image(file_path, caption="π€ Gray Vibes") |
|
cap.release() |
|
|
|
st.write("π΅οΈββοΈπ Edge Snap") |
|
if st.button("πͺ Edge It", key="opencv_3"): |
|
|
|
cap = cv2.VideoCapture(0) |
|
ret, frame = cap.read() |
|
if ret: |
|
edges = cv2.Canny(frame, 100, 200) |
|
file_path = f"opencv_edges_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg" |
|
cv2.imwrite(file_path, edges) |
|
save_to_history("Image", file_path) |
|
st.image(file_path, caption="π Edge Lord") |
|
cap.release() |
|
|
|
|
|
with st.expander("2οΈβ£ ποΈ PyDub Party"): |
|
st.write("π Audio Ace: Mixmaster vibes!") |
|
st.subheader("π₯ Top Tricks") |
|
|
|
st.write("π€π©οΈ Load Jam") |
|
if st.button("π΅ Load Sound", key="pydub_1"): |
|
|
|
uploaded_audio = st.file_uploader("ποΈ Drop a WAV", type=['wav'], key="pydub_load") |
|
if uploaded_audio: |
|
sound = AudioSegment.from_file(uploaded_audio) |
|
file_path = f"pydub_load_{datetime.now().strftime('%Y%m%d_%H%M%S')}.wav" |
|
sound.export(file_path, format="wav") |
|
save_to_history("Audio", file_path) |
|
st.audio(file_path) |
|
|
|
st.write("ππ‘ Export Snap") |
|
if st.button("πΆ MP3 It", key="pydub_2"): |
|
|
|
uploaded_audio = st.file_uploader("ποΈ Drop a WAV", type=['wav'], key="pydub_export") |
|
if uploaded_audio: |
|
sound = AudioSegment.from_file(uploaded_audio) |
|
file_path = f"pydub_mp3_{datetime.now().strftime('%Y%m%d_%H%M%S')}.mp3" |
|
sound.export(file_path, format="mp3") |
|
save_to_history("Audio", file_path) |
|
st.audio(file_path) |
|
|
|
st.write("πΆπΎ Reverse Blast") |
|
if st.button("π Flip It", key="pydub_3"): |
|
|
|
uploaded_audio = st.file_uploader("ποΈ Drop a WAV", type=['wav'], key="pydub_reverse") |
|
if uploaded_audio: |
|
sound = AudioSegment.from_file(uploaded_audio) |
|
reversed_sound = sound.reverse() |
|
file_path = f"pydub_rev_{datetime.now().strftime('%Y%m%d_%H%M%S')}.wav" |
|
reversed_sound.export(file_path, format="wav") |
|
save_to_history("Audio", file_path) |
|
st.audio(file_path) |
|
|
|
|
|
with st.expander("3οΈβ£ πΉ ImageIO Bash"): |
|
st.write("π₯ Easy Snap: Pixel lightweight champ!") |
|
st.subheader("π₯ Top Tricks") |
|
|
|
st.write("πΉπ Frame Peek") |
|
if st.button("πΈ Snap It", key="imageio_1"): |
|
|
|
reader = imageio.get_reader('<video0>') |
|
frame = reader.get_next_data() |
|
file_path = f"imageio_frame_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg" |
|
imageio.imwrite(file_path, frame) |
|
save_to_history("Image", file_path) |
|
st.image(file_path) |
|
|
|
st.write("π¨οΈπ Crunch Snap") |
|
if st.button("π Slim Pic", key="imageio_2"): |
|
|
|
reader = imageio.get_reader('<video0>') |
|
frame = reader.get_next_data() |
|
file_path = f"imageio_comp_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg" |
|
imageio.imwrite(file_path, frame, quality=85) |
|
save_to_history("Image", file_path) |
|
st.image(file_path, caption="π Slim Fit") |
|
|
|
st.write("ποΈπ€‘ GIF Blast") |
|
if st.button("π GIF It", key="imageio_3"): |
|
|
|
reader = imageio.get_reader('<video0>') |
|
frames = [reader.get_next_data() for _ in range(10)] |
|
file_path = f"imageio_gif_{datetime.now().strftime('%Y%m%d_%H%M%S')}.gif" |
|
imageio.mimwrite(file_path, frames, fps=5) |
|
save_to_history("GIF", file_path) |
|
st.image(file_path, caption="π€‘ GIF Party") |
|
|
|
|
|
with st.expander("4οΈβ£ π¬ PyAV Rave"): |
|
st.write("π₯ AV King: FFmpeg-powered chaos!") |
|
st.subheader("π₯ Top Tricks") |
|
|
|
st.write("π₯π₯ Video Jam") |
|
if st.button("π¬ Roll It", key="pyav_1"): |
|
|
|
container = av.open('/dev/video0') |
|
stream = container.streams.video[0] |
|
file_path = f"pyav_vid_{datetime.now().strftime('%Y%m%d_%H%M%S')}.mp4" |
|
output = av.open(file_path, 'w') |
|
out_stream = output.add_stream('h264', rate=30) |
|
for i, frame in enumerate(container.decode(stream)): |
|
if i > 30: break |
|
out_frame = frame.reformat(out_stream.width, out_stream.height) |
|
output.mux(out_stream.encode(out_frame)) |
|
output.close() |
|
container.close() |
|
save_to_history("Video", file_path) |
|
st.video(file_path) |
|
|
|
st.write("π¬πΏ Audio Rip") |
|
if st.button("π΅ Snag Sound", key="pyav_2"): |
|
|
|
container = av.open('/dev/video0', 'r', format='v4l2') |
|
file_path = f"pyav_audio_{datetime.now().strftime('%Y%m%d_%H%M%S')}.wav" |
|
output = av.open(file_path, 'w') |
|
out_stream = output.add_stream('pcm_s16le', rate=44100) |
|
for packet in container.demux(): |
|
for frame in packet.decode(): |
|
if frame.is_corrupt: continue |
|
if hasattr(frame, 'to_ndarray'): |
|
output.mux(out_stream.encode(frame)) |
|
if os.path.getsize(file_path) > 100000: break |
|
output.close() |
|
container.close() |
|
save_to_history("Audio", file_path) |
|
st.audio(file_path) |
|
|
|
st.write("π€β¨ Flip Snap") |
|
if st.button("π Twist It", key="pyav_3"): |
|
|
|
container = av.open('/dev/video0') |
|
stream = container.streams.video[0] |
|
file_path = f"pyav_filter_{datetime.now().strftime('%Y%m%d_%H%M%S')}.mp4" |
|
output = av.open(file_path, 'w') |
|
out_stream = output.add_stream('h264', rate=30) |
|
graph = av.filter.Graph() |
|
filt = graph.add("negate") |
|
for i, frame in enumerate(container.decode(stream)): |
|
if i > 30: break |
|
filt.push(frame) |
|
out_frame = filt.pull() |
|
output.mux(out_stream.encode(out_frame.reformat(out_stream.width, out_stream.height))) |
|
output.close() |
|
container.close() |
|
save_to_history("Video", file_path) |
|
st.video(file_path, caption="π€ Flip Vibes") |
|
|
|
|
|
with st.expander("5οΈβ£ πΌ MoviePy Gala"): |
|
st.write("π₯ Edit Queen: Video diva vibes!") |
|
st.subheader("π₯ Top Tricks") |
|
|
|
st.write("ποΈπ Frame Dance") |
|
if st.button("π¬ Spin It", key="moviepy_1"): |
|
|
|
cap = cv2.VideoCapture(0) |
|
frames = [cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2RGB) for _ in range(30)] |
|
cap.release() |
|
file_path = f"moviepy_seq_{datetime.now().strftime('%Y%m%d_%H%M%S')}.mp4" |
|
clip = mp.ImageSequenceClip(frames, fps=15) |
|
clip.write_videofile(file_path) |
|
save_to_history("Video", file_path) |
|
st.video(file_path) |
|
|
|
st.write("ππ Size Snap") |
|
if st.button("βοΈ Trim It", key="moviepy_2"): |
|
|
|
cap = cv2.VideoCapture(0) |
|
frames = [cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2RGB) for _ in range(30)] |
|
cap.release() |
|
temp_path = "temp.mp4" |
|
mp.ImageSequenceClip(frames, fps=15).write_videofile(temp_path) |
|
clip = mp.VideoFileClip(temp_path).resize((320, 240)) |
|
file_path = f"moviepy_resized_{datetime.now().strftime('%Y%m%d_%H%M%S')}.mp4" |
|
clip.write_videofile(file_path) |
|
save_to_history("Video", file_path) |
|
st.video(file_path, caption="π Tiny King") |
|
|
|
st.write("π¬π€ Join Jam") |
|
if st.button("π Link It", key="moviepy_3"): |
|
|
|
cap = cv2.VideoCapture(0) |
|
frames1 = [cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2RGB) for _ in range(15)] |
|
frames2 = [cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2RGB) for _ in range(15)] |
|
cap.release() |
|
clip1 = mp.ImageSequenceClip(frames1, fps=15) |
|
clip2 = mp.ImageSequenceClip(frames2, fps=15) |
|
final_clip = mp.concatenate_videoclips([clip1, clip2]) |
|
file_path = f"moviepy_concat_{datetime.now().strftime('%Y%m%d_%H%M%S')}.mp4" |
|
final_clip.write_videofile(file_path) |
|
save_to_history("Video", file_path) |
|
st.video(file_path, caption="π€ Duo Dance") |
|
|
|
|
|
with st.expander("6οΈβ£ π΅ JS Audio Jam"): |
|
st.write("π Web Wizard: Browser-based sound sorcery!") |
|
st.subheader("π₯ Top Tricks") |
|
|
|
|
|
record_js = """ |
|
<div> |
|
<button id="recordBtn" onclick="startRecording()">ποΈ Record</button> |
|
<button id="stopBtn" onclick="stopRecording()" disabled>βΉοΈ Stop</button> |
|
<audio id="audioPlayback" controls></audio> |
|
</div> |
|
<script> |
|
let mediaRecorder; |
|
let audioChunks = []; |
|
navigator.mediaDevices.getUserMedia({ audio: true }) |
|
.then(stream => { |
|
mediaRecorder = new MediaRecorder(stream); |
|
mediaRecorder.ondataavailable = e => audioChunks.push(e.data); |
|
mediaRecorder.onstop = () => { |
|
const audioBlob = new Blob(audioChunks, { type: 'audio/wav' }); |
|
const audioUrl = URL.createObjectURL(audioBlob); |
|
document.getElementById('audioPlayback').src = audioUrl; |
|
audioChunks = []; |
|
}; |
|
}); |
|
function startRecording() { |
|
mediaRecorder.start(); |
|
document.getElementById('recordBtn').disabled = true; |
|
document.getElementById('stopBtn').disabled = false; |
|
} |
|
function stopRecording() { |
|
mediaRecorder.stop(); |
|
document.getElementById('recordBtn').disabled = false; |
|
document.getElementById('stopBtn').disabled = true; |
|
} |
|
</script> |
|
""" |
|
st.write("π€π©οΈ Mic Drop") |
|
st.markdown(record_js, unsafe_allow_html=True) |
|
|
|
|
|
tone_js = """ |
|
<button onclick="playTone()">πΆ Beep!</button> |
|
<script> |
|
function playTone() { |
|
const audioCtx = new (window.AudioContext || window.webkitAudioContext)(); |
|
const oscillator = audioCtx.createOscillator(); |
|
oscillator.type = 'sine'; |
|
oscillator.frequency.setValueAtTime(440, audioCtx.currentTime); |
|
oscillator.connect(audioCtx.destination); |
|
oscillator.start(); |
|
setTimeout(() => oscillator.stop(), 500); |
|
} |
|
</script> |
|
""" |
|
st.write("ππ‘ Tone Snap") |
|
st.markdown(tone_js, unsafe_allow_html=True) |
|
|
|
|
|
st.header("π₯π Drop Zone") |
|
uploaded_files = st.file_uploader("πΈπ΅π₯ Toss Media", accept_multiple_files=True, type=['jpg', 'png', 'mp4', 'wav', 'mp3']) |
|
if uploaded_files: |
|
for uploaded_file in uploaded_files: |
|
file_type = uploaded_file.type.split('/')[0] |
|
file_path = f"uploaded_{uploaded_file.name}" |
|
with open(file_path, 'wb') as f: |
|
f.write(uploaded_file.read()) |
|
st.session_state['uploaded_files'].append({ |
|
"Name": uploaded_file.name, |
|
"Type": file_type, |
|
"Path": file_path |
|
}) |
|
|
|
|
|
st.header("πͺ Media Mania") |
|
if st.session_state['uploaded_files']: |
|
images = [f for f in st.session_state['uploaded_files'] if f['Type'] == 'image'] |
|
audios = [f for f in st.session_state['uploaded_files'] if f['Type'] == 'audio'] |
|
videos = [f for f in st.session_state['uploaded_files'] if f['Type'] == 'video'] |
|
|
|
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['Name'], use_column_width=True) |
|
|
|
if audios: |
|
st.subheader("π΅ Sound Splash") |
|
for audio in audios: |
|
st.audio(audio['Path'], format=f"audio/{audio['Name'].split('.')[-1]}") |
|
st.write(f"π€ {audio['Name']}") |
|
|
|
if videos: |
|
st.subheader("π₯ Vid Vortex") |
|
for video in videos: |
|
st.video(video['Path']) |
|
st.write(f"π¬ {video['Name']}") |
|
else: |
|
st.write("π« No loot 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!") |