Spaces:
Sleeping
Sleeping
File size: 5,142 Bytes
2c19cb5 147c80a 1c67333 147c80a 1c67333 105e5dd 05939d0 1c67333 105e5dd 1c67333 105e5dd 1c67333 105e5dd 1c67333 105e5dd 8f7f666 105e5dd 1c67333 105e5dd 1c67333 105e5dd a6f5db7 8f7f666 1c67333 8f7f666 1c67333 105e5dd 8f7f666 147c80a 419ec35 1c67333 8f7f666 105e5dd 419ec35 105e5dd 1c67333 dd81a22 1c67333 dd81a22 1c67333 105e5dd 1c67333 8f7f666 1c67333 15bbfba 1c67333 cab48b5 e7c74c6 105e5dd 1c67333 8f7f666 4383f3c 419ec35 1c67333 a6f5db7 1c67333 a6f5db7 105e5dd 1c67333 6bc8fde 8f7f666 105e5dd 2c19cb5 cab48b5 c25ac20 a6f5db7 06224c9 8f7f666 |
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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
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):
"""Sanitize filenames to avoid special characters."""
return re.sub(r'[^a-zA-Z0-9_-]', '_', filename)
def process_youtube_or_audio(url, recorded_audio, start_time, end_time):
try:
filename = None
song_name = None
# If URL is provided, download the YouTube audio
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'])
# If an audio file is uploaded, use that instead
elif recorded_audio:
filename = recorded_audio.name # Use the uploaded file's name
song_name = "recorded_audio"
if not filename or not os.path.exists(filename):
return None, None
# Process the audio file (trim according to start and end time)
audio = AudioSegment.from_file(filename)
start_time_ms = start_time * 1000
end_time_ms = end_time * 1000
start_time_ms = max(0, min(start_time_ms, len(audio)))
end_time_ms = max(start_time_ms, min(end_time_ms, len(audio)))
trimmed_audio = audio[start_time_ms:end_time_ms]
# Export the audio to MP3 and M4R formats
mp3_filename = f"downloads/{song_name}.mp3"
trimmed_audio.export(mp3_filename, format="mp3")
m4a_filename = f"downloads/{song_name}.m4a"
subprocess.run([
'ffmpeg', '-i', mp3_filename, '-vn', '-acodec', 'aac', '-b:a', '192k', m4a_filename
], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
m4r_filename = f"downloads/{song_name}.m4r"
os.rename(m4a_filename, m4r_filename)
return os.path.abspath(mp3_filename), os.path.abspath(m4r_filename)
except Exception as e:
print(f"Error: {e}")
return None, None
# Gradio Interface
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="fas fa-music"></i> PYTR</h1>
<p>Python YouTube Ringtones. Enter a YouTube URL or record audio to create ringtones.</p>
<p>
<a href="https://ringtones.JesseJesse.xyz" target="_blank">Ringtones</a>
<a href="https://pub-c1de1cb456e74d6bbbee111ba9e6c757.r2.dev/iphone.png" target="_blank">iPhone xfers</a>
<a href="https://youtube.com" target="_blank">YouTube</a>
</p>
""")
with gr.Row():
with gr.Column(scale=1, min_width=250):
gr.HTML('<label><i class="fas fa-link"></i> YouTube URL</label>')
youtube_url = gr.Textbox(placeholder="Enter the URL here...", show_label=False)
with gr.Column(scale=1, min_width=250):
gr.HTML('<label><i class="fas fa-file-audio"></i> Upload Audio</label>')
audio_upload = gr.File(label="Upload Audio", type="file", show_label=False)
with gr.Row():
gr.HTML("<h3>Trim Audio (Optional)</h3>")
with gr.Row():
start_time = gr.Slider(0, 20, value=0, label="Start Time (seconds)")
end_time = gr.Slider(1, 20, value=20, label="End Time (seconds)")
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> Android Ringtone</label>')
mp3_download = gr.File(label="Android")
android_instructions = gr.Textbox(label="Install", placeholder="Move the .mp3 file to the ringtones folder", lines=2)
with gr.Column(scale=1, min_width=250):
gr.HTML('<label> iPhone Ringtone</label>')
iphone_ringtone = gr.File(label="Apple")
iphone_instructions = gr.Textbox(label="Install", placeholder="Open GarageBand on your iPhone. Create a new project with Audio Recorder. Tap on the Tracks view (≡ icon in top-left). Tap the Loop icon (top-right corner). Select 'Files', then tap 'Browse items from the Files app'. Locate your .m4r file and tap it to import into GarageBand.", lines=4)
process_button.click(process_youtube_or_audio, inputs=[youtube_url, audio_upload, start_time, end_time], outputs=[mp3_download, iphone_ringtone])
interface.launch(share=True)
|