refactor: Optimize code comments.

This commit is contained in:
blueeon 2024-03-29 11:41:27 +08:00
parent d7e879dda3
commit c30a11744d
6 changed files with 42 additions and 43 deletions

View File

@ -6,23 +6,17 @@ export async function POST(req: NextRequest) {
try { try {
const body = await req.json(); const body = await req.json();
const { prompt, tags, title, make_instrumental, wait_audio } = body; const { prompt, tags, title, make_instrumental, wait_audio } = body;
// 校验输入参数
if (!prompt || !tags || !title) { if (!prompt || !tags || !title) {
return new NextResponse(JSON.stringify({ error: 'Prompt, tags, and title are required' }), { return new NextResponse(JSON.stringify({ error: 'Prompt, tags, and title are required' }), {
status: 400, status: 400,
headers: { 'Content-Type': 'application/json' } headers: { 'Content-Type': 'application/json' }
}); });
} }
// 调用 SunoApi.custom_generate 方法生成定制音频
const audioInfo = await (await sunoApi).custom_generate( const audioInfo = await (await sunoApi).custom_generate(
prompt, tags, title, prompt, tags, title,
make_instrumental == true, make_instrumental == true,
wait_audio == true wait_audio == true
); );
// 使用 NextResponse 构建成功响应
return new NextResponse(JSON.stringify(audioInfo), { return new NextResponse(JSON.stringify(audioInfo), {
status: 200, status: 200,
headers: { 'Content-Type': 'application/json' } headers: { 'Content-Type': 'application/json' }
@ -35,7 +29,6 @@ export async function POST(req: NextRequest) {
headers: { 'Content-Type': 'application/json' } headers: { 'Content-Type': 'application/json' }
}); });
} }
// 使用 NextResponse 构建错误响应
return new NextResponse(JSON.stringify({ error: 'Internal server error' }), { return new NextResponse(JSON.stringify({ error: 'Internal server error' }), {
status: 500, status: 500,
headers: { 'Content-Type': 'application/json' } headers: { 'Content-Type': 'application/json' }

View File

@ -7,7 +7,6 @@ export async function POST(req: NextRequest) {
const body = await req.json(); const body = await req.json();
const { prompt, make_instrumental, wait_audio } = body; const { prompt, make_instrumental, wait_audio } = body;
// 校验输入参数
if (!prompt) { if (!prompt) {
return new NextResponse(JSON.stringify({ error: 'Prompt is required' }), { return new NextResponse(JSON.stringify({ error: 'Prompt is required' }), {
status: 400, status: 400,
@ -15,10 +14,8 @@ export async function POST(req: NextRequest) {
}); });
} }
// 调用 SunoApi.generate 方法生成音频
const audioInfo = await (await sunoApi).generate(prompt, make_instrumental == true, wait_audio == true); const audioInfo = await (await sunoApi).generate(prompt, make_instrumental == true, wait_audio == true);
// 使用 NextResponse 构建成功响应
return new NextResponse(JSON.stringify(audioInfo), { return new NextResponse(JSON.stringify(audioInfo), {
status: 200, status: 200,
headers: { 'Content-Type': 'application/json' } headers: { 'Content-Type': 'application/json' }
@ -31,7 +28,6 @@ export async function POST(req: NextRequest) {
headers: { 'Content-Type': 'application/json' } headers: { 'Content-Type': 'application/json' }
}); });
} }
// 使用 NextResponse 构建错误响应
return new NextResponse(JSON.stringify({ error: 'Internal server error: ' + JSON.stringify(error.response.data.detail) }), { return new NextResponse(JSON.stringify({ error: 'Internal server error: ' + JSON.stringify(error.response.data.detail) }), {
status: 500, status: 500,
headers: { 'Content-Type': 'application/json' } headers: { 'Content-Type': 'application/json' }

View File

@ -5,26 +5,23 @@ export const dynamic = "force-dynamic";
export async function GET(req: NextRequest) { export async function GET(req: NextRequest) {
if (req.method === 'GET') { if (req.method === 'GET') {
try { try {
// 修复了获取查询参数的方式
const url = new URL(req.url); const url = new URL(req.url);
const songIds = url.searchParams.get('ids'); const songIds = url.searchParams.get('ids');
let audioInfo = []; let audioInfo = [];
if (songIds && songIds.length > 0) { if (songIds && songIds.length > 0) {
const idsArray = songIds.split(','); const idsArray = songIds.split(',');
// 调用 SunoApi.get 方法获取音频信息
audioInfo = await (await sunoApi).get(idsArray); audioInfo = await (await sunoApi).get(idsArray);
} else { } else {
audioInfo = await (await sunoApi).get(); audioInfo = await (await sunoApi).get();
} }
// 使用 NextResponse 构建成功响应
return new NextResponse(JSON.stringify(audioInfo), { return new NextResponse(JSON.stringify(audioInfo), {
status: 200, status: 200,
headers: { 'Content-Type': 'application/json' } headers: { 'Content-Type': 'application/json' }
}); });
} catch (error) { } catch (error) {
console.error('Error fetching audio:', error); console.error('Error fetching audio:', error);
// 使用 NextResponse 构建错误响应
return new NextResponse(JSON.stringify({ error: 'Internal server error' }), { return new NextResponse(JSON.stringify({ error: 'Internal server error' }), {
status: 500, status: 500,
headers: { 'Content-Type': 'application/json' } headers: { 'Content-Type': 'application/json' }

View File

@ -4,17 +4,17 @@ export const dynamic = "force-dynamic";
export async function GET(req: NextRequest) { export async function GET(req: NextRequest) {
if (req.method === 'GET') { if (req.method === 'GET') {
try { try {
// 调用 SunoApi.get_limit 方法获取剩余的信用额度
const limit = await (await sunoApi).get_credits(); const limit = await (await sunoApi).get_credits();
// 使用 NextResponse 构建成功响应
return new NextResponse(JSON.stringify(limit), { return new NextResponse(JSON.stringify(limit), {
status: 200, status: 200,
headers: { 'Content-Type': 'application/json' } headers: { 'Content-Type': 'application/json' }
}); });
} catch (error) { } catch (error) {
console.error('Error fetching limit:', error); console.error('Error fetching limit:', error);
// 使用 NextResponse 构建错误响应
return new NextResponse(JSON.stringify({ error: 'Internal server error' }), { return new NextResponse(JSON.stringify({ error: 'Internal server error' }), {
status: 500, status: 500,
headers: { 'Content-Type': 'application/json' } headers: { 'Content-Type': 'application/json' }

View File

@ -9,20 +9,20 @@ const logger = pino();
export interface AudioInfo { export interface AudioInfo {
id: string; id: string; // Unique identifier for the audio
title?: string; title?: string; // Title of the audio
image_url?: string; image_url?: string; // URL of the image associated with the audio
lyric?: string; lyric?: string; // Lyrics of the audio
audio_url?: string; audio_url?: string; // URL of the audio file
video_url?: string; video_url?: string; // URL of the video associated with the audio
created_at: string; created_at: string; // Date and time when the audio was created
model_name: string; model_name: string; // Name of the model used for audio generation
gpt_description_prompt?: string; gpt_description_prompt?: string; // Prompt for GPT description
prompt?: string; prompt?: string; // Prompt for audio generation
status: string; status: string; // Status
type?: string; type?: string;
tags?: string; tags?: string; // Genre of music.
duration?: string; duration?: string; // Duration of the audio
} }
class SunoApi { class SunoApi {
@ -45,7 +45,7 @@ class SunoApi {
} }
})) }))
this.client.interceptors.request.use((config) => { this.client.interceptors.request.use((config) => {
if (this.currentToken) { // 使用当前token的状态 if (this.currentToken) { // Use the current token status
config.headers['Authorization'] = `Bearer ${this.currentToken}`; config.headers['Authorization'] = `Bearer ${this.currentToken}`;
} }
return config; return config;
@ -58,27 +58,33 @@ class SunoApi {
return this; return this;
} }
/**
* Get the session ID and save it for later use.
*/
private async getAuthToken() { private async getAuthToken() {
// 获取会话ID的URL // URL to get session ID
const getSessionUrl = `${SunoApi.CLERK_BASE_URL}/v1/client?_clerk_js_version=4.70.5`; const getSessionUrl = `${SunoApi.CLERK_BASE_URL}/v1/client?_clerk_js_version=4.70.5`;
// 获取会话ID // Get session ID
const sessionResponse = await this.client.get(getSessionUrl); const sessionResponse = await this.client.get(getSessionUrl);
const sid = sessionResponse.data.response['last_active_session_id']; const sid = sessionResponse.data.response['last_active_session_id'];
if (!sid) { if (!sid) {
throw new Error("Failed to get session id"); throw new Error("Failed to get session id");
} }
// 保存会话ID以备后用 // Save session ID for later use
this.sid = sid; this.sid = sid;
} }
/**
* Keep the session alive.
* @param isWait Indicates if the method should wait for the session to be fully renewed before returning.
*/
public async keepAlive(isWait?: boolean): Promise<void> { public async keepAlive(isWait?: boolean): Promise<void> {
if (!this.sid) { if (!this.sid) {
throw new Error("Session ID is not set. Cannot renew token."); throw new Error("Session ID is not set. Cannot renew token.");
} }
// 续订会话令牌的URL // URL to renew session token
const renewUrl = `${SunoApi.CLERK_BASE_URL}/v1/client/sessions/${this.sid}/tokens/api?_clerk_js_version=4.70.0`; const renewUrl = `${SunoApi.CLERK_BASE_URL}/v1/client/sessions/${this.sid}/tokens/api?_clerk_js_version=4.70.0`;
// 续订会话令牌 // Renew session token
const renewResponse = await this.client.post(renewUrl); const renewResponse = await this.client.post(renewUrl);
logger.info("KeepAlive...\n"); logger.info("KeepAlive...\n");
if (isWait) { if (isWait) {
@ -86,10 +92,17 @@ class SunoApi {
} }
const newToken = renewResponse.data['jwt']; const newToken = renewResponse.data['jwt'];
console.log("newToken:===\n\n", newToken); console.log("newToken:===\n\n", newToken);
// 更新请求头中的Authorization字段使用新的JWT令牌 // Update Authorization field in request header with the new JWT token
this.currentToken = newToken; this.currentToken = newToken;
} }
/**
* Generate a song based on the prompt.
* @param prompt The text prompt to generate audio from.
* @param make_instrumental Indicates if the generated audio should be instrumental.
* @param wait_audio Indicates if the method should wait for the audio file to be fully generated before returning.
* @returns
*/
public async generate( public async generate(
prompt: string, prompt: string,
make_instrumental: boolean = false, make_instrumental: boolean = false,

View File

@ -3,9 +3,9 @@ import pino from "pino";
const logger = pino(); const logger = pino();
/** /**
* * Pause for a specified number of seconds.
* @param x * @param x Minimum number of seconds.
* @param y * @param y Maximum number of seconds (optional).
*/ */
export const sleep = (x: number, y?: number): Promise<void> => { export const sleep = (x: number, y?: number): Promise<void> => {
let timeout = x * 1000; let timeout = x * 1000;