File size: 3,262 Bytes
3c15f87
6f318d3
 
 
 
 
7cec5a0
6f318d3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6c00184
6f318d3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3c15f87
 
 
 
 
 
 
 
 
 
6f318d3
3c15f87
 
6f318d3
 
3c15f87
 
6f318d3
3c15f87
 
 
6f318d3
3c15f87
6f318d3
3c15f87
6f318d3
a383192
3c15f87
6f318d3
3c15f87
6f318d3
3c15f87
 
6f318d3
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
import gradio as gr
import requests
from pydub import AudioSegment
import shazamio
import os
import time
token = os.environ.get('TOKEN')
# Replace with your actual client ID and client secret
client_id = os.environ.get('SOUNDCLOUD_CLIENT_ID')
client_secret = os.environ.get('SOUNDCLOUD_CLIENT_SECRET')

def download_audio(streaming_url, output_path, headers):
    response = requests.get(streaming_url, headers=headers, stream=True)
    with open(output_path, 'wb') as f:
        for chunk in response.iter_content(chunk_size=8192):
            f.write(chunk)

async def identify_track(shazam, audio_chunk):
    temp_file = 'temp_chunk.wav'
    audio_chunk.export(temp_file, format='wav')
    result = await shazam.recognize_file(temp_file)
    if result and 'track' in result:
        track_data = result['track']
        return {
            'title': track_data['title'],
            'subtitle': track_data['subtitle']
        }
    else:
        return None

async def process_dj_set(track_url, progress=gr.Progress()):
    headers = {
        'Authorization': 'Bearer ' + f'{token}'
    }
    resolve_response = requests.get(f'https://api.soundcloud.com/resolve.json?url={track_url}', headers=headers)
    if resolve_response.status_code != 200:
        return "Failed to resolve track URL.", ""
    track_data = resolve_response.json()
    streaming_url = track_data['stream_url']
    download_audio(streaming_url, 'track.wav', headers)
    audio = AudioSegment.from_wav('track.wav')
    chunk_duration = 30000  # 30 seconds
    overlap = 10000  # 10 seconds
    chunks = []
    start = 0
    while start + chunk_duration < len(audio):
        end = start + chunk_duration
        chunk = audio[start:end]
        chunks.append((start, chunk))
        start += chunk_duration - overlap
    shazam = shazamio.Shazam()
    tracklist = []
    for start_time, chunk in chunks:
        progress(0.1)
        track_info = await identify_track(shazam, chunk)
        if track_info:
            timestamp = time.strftime("%M:%S", time.gmtime(start_time / 1000))
            tracklist.append(f"{timestamp} - {track_info['title']} by {track_info['subtitle']}")
    tracklist_output = "\n".join(tracklist)
    download_content = tracklist_output
    return tracklist_output, download_content

css = """
#col-container {
    margin: 0 auto;
    max-width: 640px;
}
"""

with gr.Blocks(css=css) as demo:
    with gr.Column(elem_id="col-container"):
        gr.Markdown("# SoundCloud DJ Set Track Identifier")

        with gr.Row():
            track_url = gr.Text(
                label="SoundCloud DJ Set URL",
                show_label=False,
                max_lines=1,
                placeholder="Enter SoundCloud DJ set URL",
                container=False,
            )

            run_button = gr.Button("Process", scale=0, variant="primary")

        result = gr.Textbox(label="Tracklist", show_label=False)

        with gr.Accordion("Download Tracklist", open=False):
            download_button = gr.File(label="Download")

        gr.Examples(examples=["https://soundcloud.com/your-track-url"], inputs=[track_url])

    run_button.click(process_dj_set, inputs=track_url, outputs=[result, download_button])

if __name__ == "__main__":
    demo.launch()