download / src /streamlit_app.py
Neon-AI's picture
Update src/streamlit_app.py
2e2192c verified
import streamlit as st
import subprocess
import os
import zipfile
import uuid
import shutil
st.set_page_config(page_title="MP4 → HLS Converter", layout="centered")
st.title("🎬 MP4 → HLS (m3u8) Converter")
st.caption("Uses FFmpeg • No re-encode • Streaming-safe")
uploaded_file = st.file_uploader("Upload MP4 file", type=["mp4"])
if uploaded_file:
job_id = str(uuid.uuid4())
workdir = f"/tmp/{job_id}"
os.makedirs(workdir, exist_ok=True)
input_path = os.path.join(workdir, "input.mp4")
output_path = os.path.join(workdir, "output.m3u8")
zip_path = os.path.join(workdir, "hls.zip")
# Save file
with open(input_path, "wb") as f:
f.write(uploaded_file.read())
st.success("File uploaded")
if st.button("Convert to HLS"):
with st.spinner("Running FFmpeg…"):
cmd = [
"ffmpeg",
"-y",
"-i", input_path,
"-codec", "copy",
"-start_number", "0",
"-hls_time", "6",
"-hls_list_size", "0",
"-f", "hls",
output_path
]
result = subprocess.run(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
if result.returncode != 0:
st.error("FFmpeg failed")
st.text(result.stderr.decode())
shutil.rmtree(workdir)
st.stop()
# Zip output
with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zipf:
for file in os.listdir(workdir):
if file.endswith(".ts") or file.endswith(".m3u8"):
zipf.write(
os.path.join(workdir, file),
arcname=file
)
st.success("Conversion complete")
with open(zip_path, "rb") as f:
st.download_button(
label="⬇️ Download HLS (ZIP)",
data=f,
file_name="test2.zip",
mime="application/zip"
)