File size: 2,908 Bytes
ab28a19
 
 
 
1ac0332
7d50d22
1344028
fc41fb4
 
1ac0332
 
 
 
136c2ab
a3b0d99
ab28a19
118a5f9
1ac0332
136c2ab
1344028
ab28a19
 
 
 
1344028
ab28a19
 
 
 
fc41fb4
4bb038f
ab28a19
1344028
ab28a19
1ac0332
4bb038f
ab28a19
1344028
fc41fb4
4bb038f
118a5f9
1344028
1ac0332
 
 
 
3df1079
1344028
1ac0332
 
3df1079
1ac0332
 
4bb038f
 
ab28a19
136c2ab
 
4bb038f
ab28a19
fc41fb4
ab28a19
16e732a
3c7f2ec
1ac0332
16e732a
3df1079
ab28a19
136c2ab
 
 
ab28a19
fc41fb4
 
ab28a19
118a5f9
4bb038f
ab28a19
1ac0332
 
ab28a19
 
 
 
 
 
 
fcdb38d
16e732a
ff5d792
271a312
e3aff9f
136c2ab
fc41fb4
5ba25ef
4bb038f
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
import gradio as gr
import yt_dlp
import os
from pydub import AudioSegment
import re

# Create downloads directory if it doesn't exist
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 process_youtube_url(url, uploaded_file):
    """Process the YouTube URL or uploaded file to create ringtones."""
    try:
        filename = None
        song_name = None

        # Download the song if a URL is provided
        if url:
            ydl_opts = {
                'format': 'bestaudio/best',
                'outtmpl': 'downloads/%(id)s.%(ext)s',
                'cookiefile': 'cookies.txt'  # Optional: use cookies for authentication
            }

            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 = sanitize_filename(info['title'])

        # Use uploaded file if URL is not provided
        elif uploaded_file:
            filename = uploaded_file.name
            song_name = sanitize_filename(os.path.splitext(uploaded_file.name)[0])

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

        # Convert to MP3 if not already converted
        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")

        # Convert to M4R (iPhone ringtone format), limiting length to 20 seconds
        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")

        # Return file names for download
        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)