Spaces:
Running
Running
File size: 2,908 Bytes
ab28a19 1ac0332 7d50d22 1344028 fc41fb4 1ac0332 136c2ab a3b0d99 ab28a19 118a5f9 1ac0332 136c2ab 1344028 ab28a19 1344028 ab28a19 fc41fb4 4bb038f ab28a19 1344028 ab28a19 1ac0332 4bb038f ab28a19 1344028 fc41fb4 4bb038f 118a5f9 1344028 1ac0332 3df1079 1344028 1ac0332 3df1079 1ac0332 4bb038f ab28a19 136c2ab 4bb038f ab28a19 fc41fb4 ab28a19 16e732a 3c7f2ec 1ac0332 16e732a 3df1079 ab28a19 136c2ab ab28a19 fc41fb4 ab28a19 118a5f9 4bb038f ab28a19 1ac0332 ab28a19 fcdb38d 16e732a ff5d792 271a312 e3aff9f 136c2ab fc41fb4 5ba25ef 4bb038f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
import gradio as gr
import yt_dlp
import os
from pydub import AudioSegment
import re
# Create downloads directory if it doesn't exist
os.makedirs("downloads", exist_ok=True)
def sanitize_filename(filename):
"""Sanitize the filename by removing or replacing special characters."""
return re.sub(r'[^a-zA-Z0-9_-]', '_', filename)
def process_youtube_url(url, uploaded_file):
"""Process the YouTube URL or uploaded file to create ringtones."""
try:
filename = None
song_name = None
# Download the song if a URL is provided
if url:
ydl_opts = {
'format': 'bestaudio/best',
'outtmpl': 'downloads/%(id)s.%(ext)s',
'cookiefile': 'cookies.txt' # Optional: use cookies for authentication
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
info = ydl.extract_info(url, download=True)
filename = os.path.join('downloads', f"{info['id']}.webm")
song_name = sanitize_filename(info['title'])
# Use uploaded file if URL is not provided
elif uploaded_file:
filename = uploaded_file.name
song_name = sanitize_filename(os.path.splitext(uploaded_file.name)[0])
# Ensure file exists
if not filename or not os.path.exists(filename):
return None, None, None
# Convert to MP3 if not already converted
mp3_filename = f"downloads/{song_name}.mp3"
if not os.path.exists(mp3_filename):
audio = AudioSegment.from_file(filename)
audio.export(mp3_filename, format="mp3")
# Convert to M4R (iPhone ringtone format), limiting length to 20 seconds
ringtone_filename_m4r = f"downloads/{song_name}.m4r"
if not os.path.exists(ringtone_filename_m4r):
ringtone_audio = AudioSegment.from_file(mp3_filename)[:20000] # 20 seconds
ringtone_audio.export(ringtone_filename_m4r, format="mp4")
# Return file names for download
return mp3_filename, ringtone_filename_m4r
except Exception as e:
print(f"Error: {e}")
return None, None
# Gradio UI
with gr.Blocks() as interface:
gr.HTML("""
<h1>Python YouTube Ringtones</h1>
<p>Insert a URL to create ringtones or Upload an MP3 to convert.</p>
""")
with gr.Row():
youtube_url = gr.Textbox(label="Enter YouTube URL", placeholder="Paste the URL here...")
mp3_upload = gr.File(label="Upload MP3 (Optional)")
with gr.Row():
mp3_download = gr.File(label="Download Android Ringtone")
iphone_ringtone = gr.File(label="Download iPhone Ringtone")
process_button = gr.Button("Create Ringtones")
process_button.click(process_youtube_url, inputs=[youtube_url, mp3_upload], outputs=[mp3_download, iphone_ringtone])
interface.launch(share=True)
|