Spaces:
Running
Running
| import gradio as gr | |
| import requests | |
| import os | |
| import json | |
| from datetime import datetime | |
| # Load Suno API key | |
| SUNO_KEY = os.environ.get("SunoKey", "") | |
| if not SUNO_KEY: | |
| print("⚠️ Warning: SunoKey environment variable not set!") | |
| def test_all_endpoints(): | |
| """Test all possible Suno API endpoints to find the right one""" | |
| results = ["# 🔍 Testing All Suno API Endpoints", ""] | |
| headers = {"Authorization": f"Bearer {SUNO_KEY}"} | |
| endpoints = [ | |
| ("GET", "https://api.sunoapi.org/api/v1/lyrics", "Base lyrics endpoint"), | |
| ("GET", "https://api.sunoapi.org/api/v1/lyrics/record-info", "Record info endpoint"), | |
| ("GET", "https://api.sunoapi.org/api/v1/lyrics/details", "Details endpoint"), | |
| ("POST", "https://api.sunoapi.org/api/v1/lyrics", "Submit lyrics"), | |
| ] | |
| for method, url, description in endpoints: | |
| results.append(f"\n## 🔗 {method} {url.split('/')[-1]}") | |
| results.append(f"**Description:** {description}") | |
| try: | |
| if method == "GET": | |
| response = requests.get(url, headers=headers, timeout=10) | |
| else: # POST | |
| # Try POST with minimal payload | |
| post_headers = headers.copy() | |
| post_headers["Content-Type"] = "application/json" | |
| payload = { | |
| "prompt": "Test endpoint", | |
| "callBackUrl": "http://test.com/callback" | |
| } | |
| response = requests.post(url, json=payload, headers=post_headers, timeout=10) | |
| results.append(f"**HTTP Status:** {response.status_code}") | |
| if response.status_code == 200: | |
| try: | |
| data = response.json() | |
| results.append(f"**Response:** ```json\n{json.dumps(data, indent=2)[:500]}...\n```") | |
| except: | |
| results.append(f"**Response:** {response.text[:200]}...") | |
| else: | |
| results.append(f"**Error:** {response.text[:200]}...") | |
| except Exception as e: | |
| results.append(f"**Exception:** {str(e)}") | |
| return "\n".join(results) | |
| def test_correct_workflow(): | |
| """Test what SHOULD be the correct workflow based on your code""" | |
| results = ["# 🎯 Testing Correct Workflow", ""] | |
| if not SUNO_KEY: | |
| return "❌ No SunoKey configured" | |
| headers = {"Authorization": f"Bearer {SUNO_KEY}"} | |
| # Step 1: Submit lyrics (as per your original working code) | |
| results.append("## 1️⃣ Submit Lyrics") | |
| submit_url = "https://api.sunoapi.org/api/v1/lyrics" | |
| submit_headers = headers.copy() | |
| submit_headers["Content-Type"] = "application/json" | |
| payload = { | |
| "prompt": "Correct workflow test song", | |
| "callBackUrl": "http://correct-test.com/callback" | |
| } | |
| try: | |
| response = requests.post(submit_url, json=payload, headers=submit_headers, timeout=30) | |
| results.append(f"**Status:** {response.status_code}") | |
| if response.status_code == 200: | |
| data = response.json() | |
| results.append(f"**Code:** {data.get('code')}") | |
| results.append(f"**Message:** {data.get('msg', 'No message')}") | |
| if data.get("code") == 200 and "data" in data: | |
| task_id = data["data"]["taskId"] | |
| results.append(f"**Task ID:** `{task_id}`") | |
| # Step 2: Check using record-info endpoint (from your example) | |
| results.append("\n## 2️⃣ Check with /record-info") | |
| record_url = "https://api.sunoapi.org/api/v1/lyrics/record-info" | |
| # Try different query parameters | |
| test_params = [ | |
| {"taskId": task_id}, | |
| {"id": task_id}, | |
| {"record_id": task_id}, | |
| {}, # No params | |
| ] | |
| for params in test_params: | |
| results.append(f"\n**Trying params:** {params}") | |
| try: | |
| record_response = requests.get( | |
| record_url, | |
| headers=headers, | |
| params=params, | |
| timeout=30 | |
| ) | |
| results.append(f"Status: {record_response.status_code}") | |
| if record_response.status_code == 200: | |
| record_data = record_response.json() | |
| results.append(f"Response: ```json\n{json.dumps(record_data, indent=2)[:300]}...\n```") | |
| else: | |
| results.append(f"Error: {record_response.text[:100]}") | |
| except Exception as e: | |
| results.append(f"Exception: {str(e)}") | |
| # Step 3: Also try details endpoint for comparison | |
| results.append("\n## 3️⃣ Check with /details (for comparison)") | |
| details_url = f"https://api.sunoapi.org/api/v1/lyrics/details?taskId={task_id}" | |
| try: | |
| details_response = requests.get(details_url, headers=headers, timeout=30) | |
| results.append(f"Status: {details_response.status_code}") | |
| if details_response.status_code == 200: | |
| details_data = details_response.json() | |
| results.append(f"Response: ```json\n{json.dumps(details_data, indent=2)[:300]}...\n```") | |
| except Exception as e: | |
| results.append(f"Exception: {str(e)}") | |
| else: | |
| results.append("❌ No task ID in response") | |
| else: | |
| results.append(f"❌ Submission failed: {response.text[:200]}") | |
| except Exception as e: | |
| results.append(f"❌ Exception: {str(e)}") | |
| return "\n".join(results) | |
| def check_api_documentation(): | |
| """Show what we know about Suno API""" | |
| return """# 📚 Suno API Documentation | |
| ## 🔍 What We Know: | |
| ### **Endpoints Found:** | |
| 1. `POST /api/v1/lyrics` - Submit lyrics generation | |
| ```json | |
| { | |
| "prompt": "song about...", | |
| "callBackUrl": "https://your-webhook.com/callback" | |
| } |