zenjoul80 commited on
Commit
52fbd36
Β·
verified Β·
1 Parent(s): 9013602

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +79 -0
app.py ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import time, requests, threading
2
+ from flask import Flask, render_template, request, session
3
+ from flask_socketio import SocketIO, emit
4
+
5
+ app = Flask(__name__)
6
+ app.config['SECRET_KEY'] = 'suno_studio_secret_2026'
7
+ socketio = SocketIO(app, cors_allowed_origins="*")
8
+
9
+ # API Base URL
10
+ BASE_URL = "https://api.sunoapi.org/api/v1"
11
+
12
+ @app.route('/')
13
+ def index():
14
+ return render_template('index.html')
15
+
16
+ @socketio.on('save_token')
17
+ def handle_token(data):
18
+ token = data.get('token')
19
+ if token:
20
+ session['api_token'] = token
21
+ emit('status', {'msg': 'πŸ”‘ Token saved. Checking credits...'})
22
+ check_credits(token)
23
+
24
+ def check_credits(token):
25
+ try:
26
+ res = requests.get(f"{BASE_URL}/generate/credit", headers={"Authorization": f"Bearer {token}"})
27
+ emit('credits', {'val': res.json().get('data', 0)})
28
+ except:
29
+ emit('credits', {'val': 'Error'})
30
+
31
+ @socketio.on('start_gen')
32
+ def handle_gen(payload):
33
+ token = session.get('api_token')
34
+ if not token:
35
+ emit('status', {'msg': '❌ Error: No API Token provided.'})
36
+ return
37
+
38
+ # Prepare Headers & SID
39
+ headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
40
+ sid = request.sid
41
+
42
+ # The payload from the frontend already includes model, style, prompt (lyrics), etc.
43
+ try:
44
+ res = requests.post(f"{BASE_URL}/generate/upload-cover", json=payload, headers=headers)
45
+ res.raise_for_status()
46
+ task_id = res.json().get('data', {}).get('task_id')
47
+
48
+ if task_id:
49
+ emit('status', {'msg': f'πŸš€ Task {task_id} is live! Composing...'})
50
+ threading.Thread(target=poll_status, args=(task_id, sid, headers)).start()
51
+ else:
52
+ emit('status', {'msg': '❌ API Error: Task ID not found in response.'})
53
+ except Exception as e:
54
+ emit('status', {'msg': f'❌ Request Failed: {str(e)}'})
55
+
56
+ def poll_status(task_id, sid, headers):
57
+ """Background polling for results."""
58
+ for _ in range(60): # Poll for 10 minutes max
59
+ time.sleep(10)
60
+ try:
61
+ res = requests.get(f"{BASE_URL}/suno/cover/record-info?taskId={task_id}", headers=headers)
62
+ data = res.json().get('data', {})
63
+ status = data.get('status')
64
+
65
+ if status == 'complete':
66
+ socketio.emit('status', {
67
+ 'msg': '✨ Cover Generation Complete!',
68
+ 'url': data.get('audio_url'),
69
+ 'done': True
70
+ }, room=sid)
71
+ return
72
+ elif status == 'failed':
73
+ socketio.emit('status', {'msg': '❌ Suno server reported a failure.'}, room=sid)
74
+ return
75
+ except: break
76
+ socketio.emit('status', {'msg': '⏱️ Polling timed out.'}, room=sid)
77
+
78
+ if __name__ == '__main__':
79
+ socketio.run(app, debug=True)