Spaces:
Sleeping
Sleeping
File size: 3,559 Bytes
2c19cb5 105e5dd dd81a22 105e5dd c79f358 105e5dd dd81a22 105e5dd dd81a22 105e5dd a3cf940 c79f358 0f01192 c79f358 0f01192 c79f358 a3cf940 0f01192 105e5dd 2a7f166 105e5dd 0ee9fa3 6ed23fa 885477c 6ed23fa 0ee9fa3 885477c 105e5dd a58d3c7 105e5dd 0c13716 126430d 105e5dd 0c13716 126430d 105e5dd 2c19cb5 a3cf940 0f01192 |
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 98 99 100 101 102 103 104 105 106 107 |
import os
import gradio as gr
import yt_dlp
from pydub import AudioSegment
import re
import subprocess
if not os.path.exists("downloads"):
os.makedirs("downloads")
def sanitize_filename(filename):
return re.sub(r'[^a-zA-Z0-9_-]', '_', filename)
def process_youtube_or_audio(url, recorded_audio):
try:
filename = None
song_name = None
if url:
ydl_opts = {
'format': 'bestaudio/best',
'outtmpl': 'downloads/%(id)s.%(ext)s',
'cookiefile': 'cookies.txt'
}
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'])
elif recorded_audio:
filename = recorded_audio
song_name = "recorded_audio"
if not filename or not os.path.exists(filename):
return None, None
audio = AudioSegment.from_file(filename)
if len(audio) > 20000:
audio = audio[:20000]
mp3_filename = f"downloads/{song_name}.mp3"
if not os.path.exists(mp3_filename):
audio.export(mp3_filename, format="mp3")
m4a_filename = f"downloads/{song_name}.m4a"
if not os.path.exists(m4a_filename):
subprocess.run(['ffmpeg', '-i', mp3_filename, '-vn', '-acodec', 'aac', '-b:a', '192k', m4a_filename])
m4r_filename = f"downloads/{song_name}.m4r"
if not os.path.exists(m4r_filename):
os.rename(m4a_filename, m4r_filename)
return mp3_filename, m4r_filename
except Exception as e:
print(f"Error: {e}")
return None, None
with gr.Blocks(css="""
body { font-family: Arial, sans-serif; text-align: center; }
.light-btn {
background-color: #ADD8E6;
color: #333;
border: 2px solid #ccc;
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
}
.light-btn:hover {
background-color: #87CEFA;
}
""") as interface:
gr.HTML("""
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<h1><i class="fa fa-music"></i> PYTRR</h1>
<p>Enter a YouTube URL or record your own audio to create a ringtone.</p>
""")
with gr.Row():
with gr.Column(scale=1, min_width=250):
gr.HTML('<label><i class="fa fa-link"></i>Add YouTube URL</label>')
youtube_url = gr.Textbox(placeholder="Paste link here...", show_label=False)
with gr.Column(scale=1, min_width=250):
gr.HTML('<label><i class="fa fa-microphone"></i>Record Audio Ringtone</label>')
audio_record = gr.Audio(sources=["microphone"], type="filepath", show_label=False)
with gr.Row():
process_button = gr.Button("🎵 Create Ringtones", elem_classes="light-btn")
with gr.Row():
with gr.Column(scale=1, min_width=250):
gr.HTML('<label><i class="fa fa-android"></i> Android Ringtone</label>')
mp3_download = gr.File(label="MP3")
with gr.Column(scale=1, min_width=250):
gr.HTML('<label><i class="fa fa-apple"></i> iPhone Ringtone</label>')
iphone_ringtone = gr.File(label="M4R")
process_button.click(process_youtube_or_audio, inputs=[youtube_url, audio_record], outputs=[mp3_download, iphone_ringtone])
interface.launch(share=True)
|