Spaces:
Running
Running
File size: 4,952 Bytes
147c80a 1c67333 0849a69 105e5dd 0849a69 105e5dd f5d080d 493b19b f5d080d 493b19b 7f30883 105e5dd 0849a69 105e5dd 0849a69 493b19b 0849a69 7f30883 ebff356 0849a69 7f30883 fe3623b ebff356 7f30883 ebff356 ae98033 7a5da51 0849a69 7f30883 0849a69 7f30883 0849a69 7f30883 9588f0c 0849a69 9588f0c 7f30883 9588f0c 0849a69 9588f0c 0849a69 9588f0c 0849a69 9588f0c 0849a69 9588f0c 0849a69 7f30883 105e5dd 9588f0c 0849a69 7f30883 0849a69 493b19b 9588f0c c3db4af 493b19b c3db4af 7f30883 493b19b 9588f0c 7f30883 c3db4af 7f30883 9588f0c 7f30883 c3db4af 0849a69 c846fe2 b52d3e9 493b19b 7f30883 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 |
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
os.makedirs(DOWNLOAD_FOLDER, exist_ok=True)
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 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_template = os.path.join(DOWNLOAD_FOLDER, '%(title)s.%(ext)s')
command = ['yt-dlp', '-f', 'mp4', '-o', output_template, url]
if os.path.exists(COOKIES_PATH):
command += ['--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(stdout.decode())
if process.returncode != 0:
return f"Error downloading video: {stderr.decode()}"
video_filename = get_video_filename()
if not video_filename:
return "Error: Downloaded video file not found."
return f"Video downloaded: {video_filename}\n" + create_readme()
except Exception as e:
return f"Exception during video download: {str(e)}"
def android_download():
try:
video_filename = get_video_filename(f'{DOWNLOAD_FOLDER}/%(title)s.mp4')
output_file = f'{DOWNLOAD_FOLDER}/AndroidRingtone.mp3'
if video_filename:
command = ['ffmpeg', '-i', video_filename, '-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"Error creating Android ringtone: {stderr.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:
input_file = f'{DOWNLOAD_FOLDER}/AndroidRingtone.mp3'
output_file = f'{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"Error creating iPhone ringtone: {stderr.decode()}", None
except Exception as e:
return f"Failed to create iPhone ringtone: {str(e)}", None
def paste_from_clipboard():
try:
return pyperclip.paste()
except Exception as e:
return f"Clipboard error: {str(e)}"
def clear_input():
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="Android Ringtone", interactive=False)
iphone_download_link = gr.File(label="iPhone Ringtone", interactive=False)
android_file = gr.File(label="Download Android Ringtone (.mp3)")
iphone_file = gr.File(label="Download iPhone Ringtone (.m4r)")
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(fn=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(fn=paste_from_clipboard, outputs=url_input)
clear_button.click(fn=clear_input, outputs=[url_input, status_output])
iface.launch(share=True)
|