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)