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)