Spaces:
Sleeping
Sleeping
File size: 4,621 Bytes
147c80a 1c67333 0849a69 105e5dd 0849a69 105e5dd f5d080d 493b19b f5d080d 27009b8 105e5dd 0849a69 27009b8 105e5dd 27009b8 0849a69 7f30883 ebff356 0849a69 27009b8 fe3623b ebff356 27009b8 ebff356 ae98033 27009b8 0849a69 7f30883 27009b8 7f30883 27009b8 0849a69 27009b8 0849a69 27009b8 7f30883 27009b8 0849a69 27009b8 0849a69 27009b8 9588f0c 0849a69 9588f0c 0849a69 9588f0c 0849a69 27009b8 105e5dd 27009b8 0849a69 27009b8 0849a69 27009b8 9588f0c c3db4af 27009b8 493b19b 27009b8 9588f0c 27009b8 9588f0c 27009b8 9588f0c 27009b8 c3db4af 27009b8 9588f0c 27009b8 c3db4af 0849a69 c846fe2 b52d3e9 493b19b 7f30883 27009b8 7a5da51 b52d3e9 ae98033 |
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 gradio as gr
import subprocess
import os
import logging
import pyperclip
logging.basicConfig(level=logging.INFO)
DOWNLOAD_FOLDER = './output'
COOKIES_PATH = './cookies.txt'
if not os.path.exists(DOWNLOAD_FOLDER):
os.makedirs(DOWNLOAD_FOLDER)
def create_readme():
path = os.path.join(DOWNLOAD_FOLDER, 'readme.txt')
try:
with open(path, 'w') as f:
f.write("Android: Copy .mp3 to ringtones folder and reboot. iPhone: Drag .m4r into iTunes and sync.")
return f"readme.txt created at: {path}"
except Exception as e:
return f"Failed to create readme.txt: {str(e)}"
def get_video_filename():
for file in os.listdir(DOWNLOAD_FOLDER):
if file.endswith(".mp4"):
return os.path.join(DOWNLOAD_FOLDER, file)
return None
def download_video(url):
try:
output_path = os.path.join(DOWNLOAD_FOLDER, '%(title)s.%(ext)s')
command = ['yt-dlp', '-f', 'mp4', '-o', output_path, url]
if os.path.exists(COOKIES_PATH):
command.extend(['--cookies', COOKIES_PATH])
else:
return f"Error: Cookies file {COOKIES_PATH} not found."
logging.info(f"Running: {' '.join(command)}")
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
logging.info(stdout.decode())
logging.error(stderr.decode())
if process.returncode == 0:
video_file = get_video_filename()
if video_file:
return f"Video downloaded: {os.path.basename(video_file)}\n" + create_readme()
else:
return "Error: Video file not found."
else:
return f"Download error: {stderr.decode()}"
except Exception as e:
return f"Failed to download video: {str(e)}"
def android_download():
try:
video_file = get_video_filename()
if not video_file:
return "Error: No video file found.", None
output_file = os.path.join(DOWNLOAD_FOLDER, 'AndroidRingtone.mp3')
command = ['ffmpeg', '-i', video_file, '-t', '20', '-q:a', '0', '-map', 'a', output_file]
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
if process.returncode == 0:
return "Android ringtone created successfully", output_file
else:
return f"FFmpeg error: {stderr.decode()}", None
except Exception as e:
return f"Error creating Android ringtone: {str(e)}", None
def iphone_download():
try:
input_file = os.path.join(DOWNLOAD_FOLDER, 'AndroidRingtone.mp3')
output_file = os.path.join(DOWNLOAD_FOLDER, 'iPhoneRingtone.m4r')
command = ['ffmpeg', '-i', input_file, '-t', '20', '-acodec', 'aac', '-b:a', '128k', '-f', 'mp4', output_file]
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
if process.returncode == 0:
return "iPhone ringtone created successfully", output_file
else:
return f"FFmpeg error: {stderr.decode()}", None
except Exception as e:
return f"Error creating iPhone ringtone: {str(e)}", None
def paste_from_clipboard():
return pyperclip.paste()
def clear_input():
return "", "", None, None
with gr.Blocks() as iface:
gr.Markdown("# π΅ YouTube to Ringtone Converter")
url_input = gr.Textbox(label="YouTube URL", placeholder="Paste URL here")
status_output = gr.Textbox(label="Status", interactive=False)
with gr.Row():
download_button = gr.Button("π₯ Download Video")
android_button = gr.Button("π± Android Ringtone")
iphone_button = gr.Button("π iPhone Ringtone")
with gr.Row():
paste_button = gr.Button("π Paste from Clipboard")
clear_button = gr.Button("π§Ή Clear")
with gr.Row():
android_file = gr.File(label="β¬οΈ Android Ringtone (.mp3)", interactive=False)
iphone_file = gr.File(label="β¬οΈ iPhone Ringtone (.m4r)", interactive=False)
download_button.click(download_video, inputs=url_input, outputs=status_output)
android_button.click(android_download, outputs=[status_output, android_file])
iphone_button.click(iphone_download, outputs=[status_output, iphone_file])
paste_button.click(paste_from_clipboard, outputs=url_input)
clear_button.click(clear_input, outputs=[url_input, status_output, android_file, iphone_file])
iface.launch(share=True)
|