Spaces:
Sleeping
Sleeping
import streamlit as st | |
import pandas as pd | |
from datetime import datetime | |
import cv2 | |
from pydub import AudioSegment | |
import imageio | |
import av | |
import moviepy as mp | |
import os | |
import numpy as np | |
from io import BytesIO | |
# ππ₯ Initialize session state like a galactic DJ spinning tracks! | |
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'] = [] | |
# ππΎ Save to history like a time-traveling scribe! | π β¨ save_to_history("Image", "pic.jpg") - Stamps a pic in the history books like a boss! | |
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 | |
}) | |
# ππ¨ Main UI kicks off like a cosmic art show! | |
st.title("πΈποΈ Capture Craze") | |
# ποΈ Sidebar config like a spaceship control panel! | |
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) | |
# π’ DTMF ping code like a retro phone hacker! | |
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}") | |
# πΈπ Library showcase like a tech talent show! | |
st.header("πΈποΈ Tool Titans") | |
# 1. OpenCV - π· Pixel party time! | |
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"): | |
# π·π₯ Snags webcam like a paparazzi pro! | πΈ cap = cv2.VideoCapture(0) - Grabs live feed faster than gossip spreads! | |
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"): | |
# ποΈβ¨ Saves grayscale like an artsy ghost! | π cv2.imwrite("gray.jpg", cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)) - Ditches color like a moody poet! | |
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"): | |
# π΅οΈββοΈπ Finds edges sharper than a detectiveβs wit! | πΌοΈ edges = cv2.Canny(frame, 100, 200) - Outlines like a crime scene sketch! | |
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() | |
# 2. PyDub - ποΈ Audio mixing madness! | |
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"): | |
# π€π©οΈ Grabs audio like a sonic thief! | ποΈ AudioSegment.from_file("sound.wav") - Nabs tracks like a sound bandit! | |
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"): | |
# ππ‘ Spits out tracks like a beat factory! | π΅ sound.export("out.mp3") - Pumps tunes like a hit machine! | |
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"): | |
# πΆπΎ Flips sound like a time-travel DJ! | π§ sound.reverse() - Spins audio back like a retro remix! | |
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) | |
# 3. ImageIO - πΌοΈ Pixel playtime! | |
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"): | |
# πΉπ Grabs frames like a shy stalker! | π· reader = imageio.get_reader('<video0>') - Sneaks a peek at your cam! | |
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"): | |
# π¨οΈπ Compresses like a diet guru! | πΌοΈ imageio.imwrite("pic.jpg", frame, quality=85) - Shrinks pics like a tight squeeze! | |
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"): | |
# ποΈπ€‘ Makes GIFs like a circus juggler! | π₯ imageio.mimwrite("gif.gif", [f1, f2], fps=5) - Flips frames into fun! | |
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") | |
# 4. PyAV - π¬ AV rock fest! | |
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"): | |
# π₯π₯ Captures like a rockstar shredding! | πΉ container = av.open('/dev/video0') - Rocks the cam like a live gig! | |
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"): | |
# π¬πΏ Pulls audio like a popcorn thief! | ποΈ frames = [f for f in av.open('vid.mp4').decode()] - Steals sound like a ninja! | |
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"): | |
# π€β¨ Flips colors like a rebel teen! | π¨ graph = av.filter.Graph().add("negate").pull() - Inverts like a goth makeover! | |
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") | |
# 5. MoviePy - π₯ Editing extravaganza! | |
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"): | |
# ποΈπ Twirls frames like a dance diva! | π₯ clip = mp.ImageSequenceClip([f1, f2], fps=15) - Makes vids like a pro choreographer! | |
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"): | |
# ππ Resizes like a royal tailor! | βοΈ clip = mp.VideoFileClip("vid.mp4").resize((320, 240)) - Fits vids like a bespoke suit! | |
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"): | |
# π¬π€ Stitches clips like a love guru! | π₯ final = mp.concatenate_videoclips([clip1, clip2]) - Hooks up vids like a matchmaker! | |
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") | |
# 6. JS Audio - π΅ Browser beats! | |
with st.expander("6οΈβ£ π΅ JS Audio Jam"): | |
st.write("π Web Wizard: Browser-based sound sorcery!") | |
st.subheader("π₯ Top Tricks") | |
# π€π©οΈ Record audio with MediaRecorder | |
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) | |
# ππ‘ Play tone with Web Audio API | |
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) | |
# π Upload zone like a media drop party! | |
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 | |
}) | |
# πΌοΈπ΅π₯ Gallery like a media circus! | |
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!") | |
# π 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!") |