File size: 3,857 Bytes
ab28a19
 
 
 
1ac0332
 
 
 
 
7d50d22
1ac0332
 
 
 
 
 
 
 
ab28a19
7d50d22
 
 
fc41fb4
 
1ac0332
 
 
 
 
 
 
 
 
7d50d22
1ac0332
 
 
7d50d22
1ac0332
 
 
7d50d22
1ac0332
 
 
 
 
 
 
 
 
 
 
 
136c2ab
ab28a19
118a5f9
1ac0332
136c2ab
ab28a19
 
 
 
7d50d22
ab28a19
 
 
 
fc41fb4
7d50d22
ab28a19
 
1ac0332
7d50d22
ab28a19
fc41fb4
 
118a5f9
1ac0332
 
 
 
 
fc41fb4
7d50d22
1ac0332
 
7d50d22
1ac0332
 
7d50d22
1ac0332
 
 
7d50d22
ab28a19
136c2ab
 
 
ab28a19
fc41fb4
ab28a19
16e732a
3c7f2ec
1ac0332
16e732a
ab28a19
 
136c2ab
 
 
ab28a19
fc41fb4
 
ab28a19
118a5f9
136c2ab
ab28a19
1ac0332
 
ab28a19
 
 
 
 
 
 
fcdb38d
16e732a
ff5d792
271a312
e3aff9f
136c2ab
fc41fb4
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
import gradio as gr
import yt_dlp
import os
from pydub import AudioSegment
from redis import Redis
import re
import requests
import io


redis = Redis(
    host="amused-walleye-31373.upstash.io",
    port=31373,
    password="67212443600c45ffa962e19ea9202605",
    ssl=True,
    db=0
)


worker_base_url = "https://server.jessejesse.workers.dev" 


os.makedirs("downloads", exist_ok=True)

def sanitize_filename(filename):
    """Sanitize the filename by removing or replacing special characters."""
    return re.sub(r'[^a-zA-Z0-9_-]', '_', filename)

def save_ringtone_to_worker(song_name, file_path):
    """Upload the ringtone to Cloudflare Worker storage (R2 or KV) and save its URL in Redis."""
    try:
        sanitized_song_name = sanitize_filename(song_name)
        
       
        with open(file_path, 'rb') as file:
            file_data = file.read()
        
        
        response = requests.put(
            f"{worker_base_url}/{sanitized_song_name}",
            data=file_data,
            headers={"Content-Type": "audio/mpeg"} 
        )
        
        if response.status_code == 200:
            file_url = f"{worker_base_url}/{sanitized_song_name}"
            redis.set(sanitized_song_name, file_url)  # Save the URL to Redis
            print(f"Saved {sanitized_song_name} URL to Redis: {file_url}")
        else:
            print(f"Failed to upload file. Status code: {response.status_code}")
        
    except Exception as e:
        print(f"Error uploading to Worker storage: {e}")

def process_youtube_url(url, uploaded_file):
    try:
        filename = None
        song_name = None

        if url:
            ydl_opts = {
                'format': 'bestaudio/best',
                'outtmpl': 'downloads/%(id)s.%(ext)s',
                'cookiefile': 'cookies.txt'  #cookies 
            }

            with yt_dlp.YoutubeDL(ydl_opts) as ydl:
                info = ydl.extract_info(url, download=True)
                filename = os.path.join('downloads', f"{info['id']}.webm")
                song_name = info['title'] 

        elif uploaded_file:
            filename = uploaded_file.name
            song_name = os.path.splitext(uploaded_file.name)[0]  

        if not filename or not os.path.exists(filename):
            return None, None  # No file, no output

        # Convert to MP3
        mp3_filename = f"downloads/{song_name}.mp3"
        if not os.path.exists(mp3_filename):
            audio = AudioSegment.from_file(filename)
            audio.export(mp3_filename, format="mp3")
        
       
        ringtone_filename_m4r = f"downloads/{song_name}.m4r"
        if not os.path.exists(ringtone_filename_m4r):
            ringtone_audio = AudioSegment.from_file(mp3_filename)[:20000]  #20 seconds
            ringtone_audio.export(ringtone_filename_m4r, format="mp4")

       
        save_ringtone_to_worker(f"{song_name}.mp3", mp3_filename)
        save_ringtone_to_worker(f"{song_name}.m4r", ringtone_filename_m4r)

        return mp3_filename, ringtone_filename_m4r 

    except Exception as e:
        print(f"Error: {e}")
        return None, None

# Gradio UI
with gr.Blocks() as interface:
    gr.HTML("""
        <h1>Python YouTube Ringtones</h1>
        <p>Insert a URL to create ringtones or Upload an MP3 to convert.</p>
    """)
    
    with gr.Row():
        youtube_url = gr.Textbox(label="Enter YouTube URL", placeholder="Paste the URL here...")
        mp3_upload = gr.File(label="Upload MP3 (Optional)")

    with gr.Row():
        mp3_download = gr.File(label="Download Android Ringtone")
        iphone_ringtone = gr.File(label="Download iPhone Ringtone")

    process_button = gr.Button("Create Ringtones")
    process_button.click(process_youtube_url, inputs=[youtube_url, mp3_upload], outputs=[mp3_download, iphone_ringtone])

interface.launch(share=True)