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)