youtube-to-mp3 / app.py
pierreguillou's picture
Update app.py
3e4b7ce verified
import gradio as gr
import subprocess
import os
import tempfile
import re
def download_youtube_mp3(video_url):
"""
Downloads the audio from a YouTube video in MP3 format using yt-dlp.
Args:
video_url (str): The YouTube video URL.
Returns:
tuple: (status, result) where status is a boolean indicating success and result is either the MP3 file path or an error message
"""
try:
# Create a temporary directory for the download
temp_dir = tempfile.mkdtemp()
# Options for yt-dlp
output_filename_template = os.path.join(temp_dir, "%(title)s.%(ext)s")
command = [
"yt-dlp",
"-x", # Extract audio
"--audio-format", "mp3",
"--audio-quality", "0", # 0 for best VBR quality
"-o", output_filename_template,
video_url
]
# Execute the command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
if process.returncode == 0:
# Find the MP3 file in the temporary directory
for file in os.listdir(temp_dir):
if file.endswith(".mp3"):
mp3_path = os.path.join(temp_dir, file)
return True, mp3_path
return False, "Error: MP3 file not found after conversion"
else:
error_output = stderr.decode('utf-8', errors='ignore')
# Check if it's a YouTube authentication error
if "Sign in to confirm you're not a bot" in error_output or "cookies" in error_output:
return False, "YouTube requires authentication for this video. This app cannot download videos that require login. Try another video or use the app locally."
return False, f"Download error: {error_output}"
except Exception as e:
return False, f"An error occurred: {str(e)}"
# Gradio Interface
def youtube_to_mp3(youtube_url):
if not youtube_url:
return "Please enter a valid YouTube URL"
# Check if the URL is valid
if not re.match(r'^(https?://)?(www\.)?(youtube\.com|youtu\.?be)/.+$', youtube_url):
return "Invalid YouTube URL. Please enter a URL in the format https://www.youtube.com/watch?v=..."
success, result = download_youtube_mp3(youtube_url)
if success and os.path.isfile(result):
return result
else:
return result # This is an error message
# Create the interface
demo = gr.Interface(
fn=youtube_to_mp3,
inputs=gr.Textbox(label="YouTube Video URL", placeholder="https://www.youtube.com/watch?v=..."),
outputs=gr.Textbox(label="Result"),
title="YouTube to MP3 Converter",
description="""Download the audio from a YouTube video in MP3 format.
**Important note**: Due to YouTube restrictions, some videos requiring authentication cannot be downloaded in this Hugging Face Spaces environment. For full functionality, run this application locally or in [Google Colab](https://github.com/piegu/language-models/blob/master/youtube_video_to_audio.ipynb).""",
examples=[["https://www.youtube.com/watch?v=jNQXAC9IVRw"]] # First YouTube video (Me at the zoo)
)
if __name__ == "__main__":
# Specific parameters for Hugging Face Spaces
demo.launch(server_name="0.0.0.0",
server_port=7860,
share=False,
ssr_mode=False)