File size: 3,559 Bytes
2c19cb5
105e5dd
 
 
 
dd81a22
105e5dd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c79f358
 
 
 
 
105e5dd
 
 
 
dd81a22
 
 
105e5dd
dd81a22
 
 
 
 
105e5dd
 
 
 
 
a3cf940
 
c79f358
0f01192
c79f358
 
 
 
 
 
 
0f01192
c79f358
a3cf940
0f01192
105e5dd
 
2a7f166
105e5dd
 
 
 
 
0ee9fa3
6ed23fa
885477c
6ed23fa
0ee9fa3
885477c
105e5dd
 
a58d3c7
105e5dd
 
 
0c13716
126430d
105e5dd
 
0c13716
126430d
105e5dd
 
 
2c19cb5
a3cf940
0f01192
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
import os
import gradio as gr
import yt_dlp
from pydub import AudioSegment
import re
import subprocess

if not os.path.exists("downloads"):
    os.makedirs("downloads")

def sanitize_filename(filename):
    return re.sub(r'[^a-zA-Z0-9_-]', '_', filename)

def process_youtube_or_audio(url, recorded_audio):
    try:
        filename = None
        song_name = None

        if url:
            ydl_opts = {
                'format': 'bestaudio/best',
                'outtmpl': 'downloads/%(id)s.%(ext)s',
                'cookiefile': 'cookies.txt'
            }
            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'])

        elif recorded_audio:
            filename = recorded_audio
            song_name = "recorded_audio"
        
        if not filename or not os.path.exists(filename):
            return None, None

        audio = AudioSegment.from_file(filename)
        
        if len(audio) > 20000: 
            audio = audio[:20000]

        mp3_filename = f"downloads/{song_name}.mp3"
        if not os.path.exists(mp3_filename):
            audio.export(mp3_filename, format="mp3")

        m4a_filename = f"downloads/{song_name}.m4a"
        if not os.path.exists(m4a_filename):
            subprocess.run(['ffmpeg', '-i', mp3_filename, '-vn', '-acodec', 'aac', '-b:a', '192k', m4a_filename])

        m4r_filename = f"downloads/{song_name}.m4r"
        if not os.path.exists(m4r_filename):
            os.rename(m4a_filename, m4r_filename)

        return mp3_filename, m4r_filename

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

with gr.Blocks(css="""
    body { font-family: Arial, sans-serif; text-align: center; }
    .light-btn { 
        background-color: #ADD8E6; 
        color: #333; 
        border: 2px solid #ccc; 
        padding: 10px 20px; 
        font-size: 16px; 
        cursor: pointer; 
    }
    .light-btn:hover { 
        background-color: #87CEFA; 
    }
""") as interface:

    gr.HTML("""
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
        <h1><i class="fa fa-music"></i>&nbsp;PYTRR</h1>
        <p>Enter a YouTube URL or record your own audio to create a ringtone.</p>
    """)

    with gr.Row():
        with gr.Column(scale=1, min_width=250):
            gr.HTML('<label><i class="fa fa-link"></i>Add YouTube URL</label>')
            youtube_url = gr.Textbox(placeholder="Paste link here...", show_label=False)

        with gr.Column(scale=1, min_width=250):
            gr.HTML('<label><i class="fa fa-microphone"></i>Record Audio Ringtone</label>')
            audio_record = gr.Audio(sources=["microphone"], type="filepath", show_label=False)

    with gr.Row():
        process_button = gr.Button("🎵 Create Ringtones", elem_classes="light-btn")

    with gr.Row():
        with gr.Column(scale=1, min_width=250):
            gr.HTML('<label><i class="fa fa-android"></i>&nbsp;Android Ringtone</label>')
            mp3_download = gr.File(label="MP3")

        with gr.Column(scale=1, min_width=250):
            gr.HTML('<label><i class="fa fa-apple"></i>&nbsp;iPhone Ringtone</label>')
            iphone_ringtone = gr.File(label="M4R")

    process_button.click(process_youtube_or_audio, inputs=[youtube_url, audio_record], outputs=[mp3_download, iphone_ringtone])

interface.launch(share=True)