File size: 2,026 Bytes
882426e
34a0e7b
882426e
34a0e7b
882426e
34a0e7b
 
 
 
 
882426e
 
34a0e7b
882426e
34a0e7b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
882426e
34a0e7b
 
882426e
34a0e7b
 
 
 
882426e
34a0e7b
 
 
 
 
 
 
882426e
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
import gradio as gr
from yt_dlp import YoutubeDL
import os
from pydub import AudioSegment

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

def download_soundcloud(url, file_format, duration_sec):
    # Download best audio first (usually m4a)
    ydl_opts = {
        'format': 'bestaudio/best',
        'outtmpl': os.path.join(DOWNLOADS_FOLDER, '%(title)s.%(ext)s')
    }
    
    with YoutubeDL(ydl_opts) as ydl:
        info = ydl.extract_info(url, download=True)
    
    original_file = os.path.join(DOWNLOADS_FOLDER, f"{info['title']}.{info['ext']}")
    
    # Load audio and trim to duration
    audio = AudioSegment.from_file(original_file)
    duration_ms = min(len(audio), int(duration_sec * 1000))
    trimmed_audio = audio[:duration_ms]
    
    # Determine output file path
    if file_format.lower() == "mp3":
        output_file = os.path.splitext(original_file)[0] + ".mp3"
        trimmed_audio.export(output_file, format="mp3")
    elif file_format.lower() == "opus":
        output_file = os.path.splitext(original_file)[0] + ".opus"
        trimmed_audio.export(output_file, format="opus")
    else:  # keep original format
        output_file = os.path.splitext(original_file)[0] + f".{info['ext']}"
        trimmed_audio.export(output_file, format=info['ext'])
    
    return output_file

# Gradio interface
with gr.Blocks() as iface:
    url_input = gr.Textbox(label="SoundCloud URL", value="https://soundcloud.com/antonio-antetomaso/mutiny-on-the-bounty-closing-titles-cover")
    format_choice = gr.Dropdown(choices=["mp3", "m4a", "opus"], value="mp3", label="Select format")
    duration_slider = gr.Slider(minimum=5, maximum=300, value=30, step=5, label="Duration (seconds)")
    download_button = gr.Button("Download")
    download_file = gr.File(label="Download your track")
    
    download_button.click(
        fn=download_soundcloud,
        inputs=[url_input, format_choice, duration_slider],
        outputs=download_file
    )

iface.launch(show_error=True)