File size: 4,117 Bytes
2c19cb5
105e5dd
 
 
 
dd81a22
105e5dd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c79f358
 
 
 
 
105e5dd
 
 
 
dd81a22
 
 
105e5dd
dd81a22
 
 
 
716ee4b
105e5dd
 
 
 
 
a3cf940
 
c79f358
0f01192
c79f358
 
 
 
 
 
 
0f01192
c79f358
a3cf940
0f01192
9a463d8
 
 
 
 
 
 
 
 
105e5dd
 
 
1d91f2c
723b668
885477c
6ed23fa
1d91f2c
885477c
105e5dd
 
a58d3c7
105e5dd
 
 
c70cbee
 
8223453
105e5dd
 
c70cbee
 
9a463d8
105e5dd
 
 
2c19cb5
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
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 os.path.abspath(mp3_filename), os.path.abspath(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="fas fa-music"></i>&nbsp;PYTR</h1>
    <p>Python YouTube Ringtones. Enter a YouTube URL or record audio to create ringtones.</p>
    <p>
        <a href="https://ringtone.JesseJesse.xyz" target="_blank">ringtone.JesseJesse.xyz</a> | 
        <a href="https://sudo-self.github.io/pytr/" target="_blank">GitHub</a>
    </p>
  """)

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

        with gr.Column(scale=1, min_width=250):
            gr.HTML('<label><i class="fas fa-microphone"></i>&nbsp;Record Audio</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>&nbsp;Android Ringtone</label>')
            mp3_download = gr.File(label="Android")
            android_instructions = gr.Textbox(label="install", placeholder="Place the downloaded .mp3 file in the ringtones folder", lines=2)

        with gr.Column(scale=1, min_width=250):
            gr.HTML('<label>&nbsp;iPhone Ringtone</label>')
            iphone_ringtone = gr.File(label="Apple")
            iphone_instructions = gr.Textbox(label="install", placeholder="Swipe left and open the Garage Band App. Then long-press on the Ringtone file, select share, choose ringtone, and click export to complete the import.", lines=2)

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

interface.launch(share=True)