Blogger-Toolkit / app.py
lexicalspace's picture
Update app.py
4ed0744 verified
raw
history blame
2.84 kB
import streamlit as st
import streamlit.components.v1 as components
from bs4 import BeautifulSoup
import markdown
import re
# --- PAGE CONFIG ---
st.set_page_config(
page_title="Lexical Tools",
page_icon="⚡",
layout="centered",
initial_sidebar_state="expanded"
)
# --- SIDEBAR ---
st.sidebar.title("Navigation")
query_params = st.query_params
default_index = 1 if query_params.get("mode") == "downloader" else 0
app_mode = st.sidebar.radio(
"Choose Tool:",
["Webmaster Toolkit", "YouTube Downloader"],
index=default_index
)
# ==========================================
# VIEW 1: YOUTUBE DOWNLOADER (Swarm Mode)
# ==========================================
if app_mode == "YouTube Downloader":
# main.py
# Hugging Face Space: YouTube → MP3 API + UI
# Works on CPU, no API key, no login
import os
import uuid
from fastapi import FastAPI
from fastapi.responses import FileResponse
import yt_dlp
import gradio as gr
OUTPUT_DIR = "downloads"
os.makedirs(OUTPUT_DIR, exist_ok=True)
app = FastAPI()
def download_mp3(youtube_url: str):
uid = str(uuid.uuid4())
out_file = os.path.join(OUTPUT_DIR, f"{uid}.mp3")
ydl_opts = {
'format': 'bestaudio/best',
'outtmpl': out_file.replace('.mp3', '.%(ext)s'),
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '192',
}],
'quiet': True,
'noplaylist': True,
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download([youtube_url])
return out_file
# ---------- API ENDPOINT ----------
@app.get("/mp3")
def mp3_api(url: str):
mp3_path = download_mp3(url)
return FileResponse(mp3_path, filename="audio.mp3", media_type="audio/mpeg")
# ---------- UI ----------
def ui_download(url):
mp3_path = download_mp3(url)
return mp3_path
ui = gr.Interface(
fn=ui_download,
inputs=gr.Textbox(label="YouTube URL"),
outputs=gr.File(label="Download MP3"),
title="YouTube → MP3 Converter",
description="Paste YouTube link and get MP3 audio"
)
if __name__ == "__main__":
ui.launch(server_name="0.0.0.0", server_port=7860)
# -----------------------------
# requirements.txt (create this file manually):
# fastapi
# uvicorn
# yt-dlp
# gradio
# ffmpeg-python
components.html(html_code, height=350)
# ==========================================
# VIEW 2: WEBMASTER TOOLKIT (Server Side)
# ==========================================
elif app_mode == "Webmaster Toolkit":
st.title("⚡ Webmaster's Toolkit")
# ... (Keep your existing toolkit logic here if needed) ...
tab1, tab2 = st.tabs(["📝 Text Cleaner", "🖼️ Media Optimizer"])
# Just a placeholder for the logic you already have
with tab1:
st.write("Text Cleaner Active")