Spaces:
Running
Running
File size: 5,051 Bytes
147c80a 1c67333 0849a69 105e5dd 0849a69 105e5dd f5d080d 493b19b f5d080d 493b19b f5d080d 105e5dd 0849a69 105e5dd 0849a69 493b19b 0849a69 ebff356 0849a69 fe3623b ebff356 ae98033 7a5da51 fe3623b 0849a69 7a5da51 0849a69 6542b78 0849a69 105e5dd 0849a69 493b19b 0849a69 493b19b 0849a69 493b19b 0849a69 493b19b 0849a69 493b19b 0849a69 493b19b 0849a69 493b19b 0849a69 493b19b 0849a69 493b19b 0849a69 493b19b 105e5dd 493b19b 0849a69 493b19b 0849a69 493b19b c3db4af 493b19b c3db4af 493b19b c3db4af ebff356 493b19b c3db4af 0849a69 c846fe2 b52d3e9 493b19b 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 135 136 137 138 139 140 141 142 143 |
import gradio as gr
import subprocess
import os
import logging
import pyperclip
logging.basicConfig(level=logging.INFO)
DOWNLOAD_FOLDER = './output'
COOKIES_PATH = './cookies.txt'
# Ensure the download folder exists
if not os.path.exists(DOWNLOAD_FOLDER):
os.makedirs(DOWNLOAD_FOLDER)
def create_readme():
readme_path = os.path.join(DOWNLOAD_FOLDER, 'readme.txt')
try:
with open(readme_path, 'w') as readme_file:
readme_file.write(
"Android: copy the .mp3 to the ringtones folder and reboot device.\n"
"iPhone: drag and drop the .m4r file in iTunes and sync device."
)
return f"readme.txt created at: {readme_path}"
except Exception as e:
return f"Failed to create readme.txt: {str(e)}"
def download_video(url):
try:
output_path = os.path.join(DOWNLOAD_FOLDER, '%(title)s.mp4')
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 command: {' '.join(command)}")
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
logging.info(f"STDOUT: {stdout.decode()}")
logging.error(f"STDERR: {stderr.decode()}")
if process.returncode == 0:
video_filename = get_video_filename(output_path)
if video_filename:
return f"Video downloaded: {video_filename}\n" + create_readme()
else:
return "Error: Video file not found."
else:
return f"Error downloading video: {stderr.decode()}"
except Exception as e:
return f"Failed to download video: {str(e)}"
def android_download():
try:
video_filename = get_video_filename(f'{DOWNLOAD_FOLDER}/%(title)s.mp4')
if video_filename:
android_path = f'{DOWNLOAD_FOLDER}/AndroidRingtone.mp3'
command = ['ffmpeg', '-i', video_filename, '-t', '20', '-q:a', '0', '-map', 'a', android_path]
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
process.communicate()
if process.returncode == 0:
return "Android ringtone created successfully", android_path
else:
return f"Error creating Android ringtone: {process.stderr.read().decode()}", None
else:
return "Error: Video file not found for Android ringtone.", None
except Exception as e:
return f"Failed to create Android ringtone: {str(e)}", None
def iphone_download():
try:
iphone_path = f'{DOWNLOAD_FOLDER}/iPhoneRingtone.m4r'
command = [
'ffmpeg',
'-i', f'{DOWNLOAD_FOLDER}/AndroidRingtone.mp3',
'-t', '20',
'-acodec', 'aac',
'-b:a', '128k',
'-f', 'mp4',
iphone_path
]
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
process.communicate()
if process.returncode == 0:
return "iPhone ringtone created successfully", iphone_path
else:
return f"Error creating iPhone ringtone: {process.stderr.read().decode()}", None
except Exception as e:
return f"Failed to create iPhone ringtone: {str(e)}", None
def get_video_filename(output_path):
"""Finds and returns the actual downloaded filename"""
for file in os.listdir(DOWNLOAD_FOLDER):
if file.endswith(".mp4"):
return os.path.join(DOWNLOAD_FOLDER, file)
return None
def paste_from_clipboard():
"""Get URL from clipboard"""
return pyperclip.paste()
def clear_input():
"""Clear the input and output"""
return "", ""
# Gradio UI
with gr.Blocks() as iface:
gr.Markdown("## 🎵 YouTube Ringtone Creator")
url_input = gr.Textbox(label="Enter YouTube URL", placeholder="Paste URL here")
status_output = gr.Textbox(label="Status", interactive=False)
android_download_link = gr.File(label="Download Android Ringtone", interactive=False)
iphone_download_link = gr.File(label="Download iPhone Ringtone", interactive=False)
download_button = gr.Button("Download Video")
android_button = gr.Button("Create Android Ringtone")
iphone_button = gr.Button("Create iPhone Ringtone")
paste_button = gr.Button("Paste URL from Clipboard")
clear_button = gr.Button("Clear")
download_button.click(download_video, inputs=url_input, outputs=status_output)
android_button.click(android_download, outputs=[status_output, android_download_link])
iphone_button.click(iphone_download, outputs=[status_output, iphone_download_link])
paste_button.click(paste_from_clipboard, outputs=url_input)
clear_button.click(clear_input, outputs=[url_input, status_output])
iface.launch(share=True)
|