myAudio / app.py
shiue20's picture
Update app.py
e59cd7f verified
import os
import tempfile
import socket
from yt_dlp import YoutubeDL
import gradio as gr
def is_internet_available():
try:
socket.gethostbyname('www.youtube.com')
return True
except socket.error:
return False
def download_media(url, format_choice):
if not url.strip():
raise gr.Error("⚠️ Please enter a valid YouTube or TikTok URL.")
if not is_internet_available():
raise gr.Error("❌ No internet access detected. Please enable internet in your deployment environment.")
temp_dir = tempfile.mkdtemp()
# File template
output_path = os.path.join(temp_dir, "%(title)s.%(ext)s")
# yt-dlp options differ based on format
if format_choice == "Audio (MP3)":
ydl_opts = {
'format': 'bestaudio/best',
'outtmpl': output_path,
'quiet': True,
'no_warnings': True,
'noplaylist': True,
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '192',
}],
'socket_timeout': 15,
}
else: # Video
ydl_opts = {
'format': 'bestvideo+bestaudio/best',
'outtmpl': output_path,
'quiet': True,
'no_warnings': True,
'noplaylist': True,
'merge_output_format': 'mp4',
'socket_timeout': 15,
}
try:
with YoutubeDL(ydl_opts) as ydl:
info = ydl.extract_info(url, download=True)
downloaded_file = ydl.prepare_filename(info)
# If audio, extension is mp3 due to postprocessor
if format_choice == "Audio (MP3)":
downloaded_file = os.path.splitext(downloaded_file)[0] + ".mp3"
if not os.path.exists(downloaded_file):
raise gr.Error("❌ Download failed. File not found.")
return downloaded_file
except Exception as e:
err = str(e)
if "Failed to extract" in err or "player response" in err:
raise gr.Error(
"❌ Extraction error β€” YouTube/TikTok may have changed.\n"
"Try updating yt-dlp using:\n\n`pip install -U yt-dlp`"
)
else:
raise gr.Error(f"❌ Error: {err}")
demo = gr.Interface(
fn=download_media,
inputs=[
gr.Textbox(label="πŸŽ₯ Enter YouTube or TikTok URL"),
gr.Radio(["Audio (MP3)", "Video (MP4)"], label="Select format", value="Audio (MP3)")
],
outputs=gr.File(label="πŸ“ Downloaded File"),
title="🎬 Audio/Video Downloader",
description="Download audio (MP3) or video (MP4) from YouTube or TikTok by pasting a valid URL.",
theme="default"
)
if __name__ == "__main__":
demo.launch()