Spaces:
Sleeping
Sleeping
File size: 4,307 Bytes
ab28a19 1ac0332 ab28a19 fc41fb4 1ac0332 136c2ab ab28a19 118a5f9 1ac0332 136c2ab ab28a19 1ac0332 ab28a19 fc41fb4 1ac0332 ab28a19 1ac0332 ab28a19 fc41fb4 118a5f9 1ac0332 fc41fb4 1ac0332 ab28a19 136c2ab ab28a19 fc41fb4 ab28a19 16e732a 3c7f2ec 1ac0332 16e732a ab28a19 136c2ab ab28a19 fc41fb4 ab28a19 118a5f9 136c2ab ab28a19 1ac0332 ab28a19 fcdb38d 16e732a ff5d792 271a312 e3aff9f 136c2ab fc41fb4 |
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 135 |
import gradio as gr
import yt_dlp
import os
from pydub import AudioSegment
from redis import Redis
import re
import requests
import io
# Set up Redis connection
redis = Redis(
host="amused-walleye-31373.upstash.io",
port=31373,
password="67212443600c45ffa962e19ea9202605",
ssl=True,
db=0
)
# Cloudflare Worker URL
worker_base_url = "https://server.jessejesse.workers.dev" # Your Cloudflare Worker URL
# Ensure downloads directory exists
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 save_ringtone_to_worker(song_name, file_path):
"""Upload the ringtone to Cloudflare Worker storage (R2 or KV) and save its URL in Redis."""
try:
sanitized_song_name = sanitize_filename(song_name)
# Read file contents
with open(file_path, 'rb') as file:
file_data = file.read()
# Upload file to the worker storage (e.g., R2 or KV)
response = requests.put(
f"{worker_base_url}/{sanitized_song_name}",
data=file_data,
headers={"Content-Type": "audio/mpeg"} # For MP3, adjust for other formats
)
if response.status_code == 200:
file_url = f"{worker_base_url}/{sanitized_song_name}"
redis.set(sanitized_song_name, file_url) # Save the URL to Redis
print(f"Saved {sanitized_song_name} URL to Redis: {file_url}")
else:
print(f"Failed to upload file. Status code: {response.status_code}")
except Exception as e:
print(f"Error uploading to Worker storage: {e}")
def process_youtube_url(url, uploaded_file):
try:
filename = None
song_name = None
if url:
ydl_opts = {
'format': 'bestaudio/best',
'outtmpl': 'downloads/%(id)s.%(ext)s',
'cookiefile': 'cookies.txt' # YT cookies (if needed)
}
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 = info['title'] # Use YouTube video title as the song name
elif uploaded_file:
filename = uploaded_file.name
song_name = os.path.splitext(uploaded_file.name)[0] # Use file name as song name
if not filename or not os.path.exists(filename):
return None, None # No file, no output
# Convert to MP3
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")
# Create iPhone ringtone (Apple M4R format)
ringtone_filename_m4r = f"downloads/{song_name}.m4r"
if not os.path.exists(ringtone_filename_m4r):
ringtone_audio = AudioSegment.from_file(mp3_filename)[:20000] # Clip to 20 seconds for ringtone
ringtone_audio.export(ringtone_filename_m4r, format="mp4")
# Save ringtones to Worker and Redis
save_ringtone_to_worker(f"{song_name}.mp3", mp3_filename)
save_ringtone_to_worker(f"{song_name}.m4r", ringtone_filename_m4r)
return mp3_filename, ringtone_filename_m4r # Returning the file paths for download
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)
|