| const axios = require('axios'); |
|
|
| class YesChatMusicGenerator { |
| constructor() { |
| this.userAgent = "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Mobile Safari/537.36"; |
| } |
|
|
| async getBypassToken() { |
| try { |
| const response = await axios.get('https://anabot.my.id/api/tools/bypass', { |
| params: { |
| url: 'https://www.yeschat.ai/', |
| siteKey: '0x4AAAAAAATOXAtQtziH-Rwq', |
| type: 'turnstile-min', |
| apikey: 'freeApikey' |
| }, |
| headers: { |
| 'accept': '*/*' |
| } |
| }); |
|
|
| if (response.data.success && response.data.data?.result?.token) { |
| return response.data.data.result.token; |
| } |
| throw new Error('Failed to get token from response'); |
| } catch (error) { |
| throw new Error(`Failed to get bypass token: ${error.message}`); |
| } |
| } |
|
|
| async generateSongLyrics({ |
| prompt, |
| title = "Tanpa Judul", |
| style = "Happy", |
| instrumental = false, |
| customMode = true, |
| }) { |
| const token = await this.getBypassToken(); |
| if (!token || typeof token !== "string") { |
| throw new Error("Failed to get bypass token."); |
| } |
|
|
| const res = await axios.post( |
| "https://aiarticle.erweima.ai/api/v1/secondary-page/api/create", |
| { |
| prompt, |
| channel: "MUSIC", |
| id: 1018, |
| type: "features", |
| source: "yeschat.ai", |
| style, |
| title, |
| customMode, |
| instrumental, |
| }, |
| { |
| headers: { |
| authority: "aiarticle.erweima.ai", |
| accept: "application/json, text/plain, */*", |
| "accept-language": "ms-MY,ms;q=0.9,en-US;q=0.8,en;q=0.7,id;q=0.6", |
| origin: "https://www.yeschat.ai", |
| referer: "https://www.yeschat.ai/", |
| "sec-ch-ua": '"Not A(Brand";v="8", "Chromium";v="132"', |
| "sec-ch-ua-mobile": "?1", |
| "sec-ch-ua-platform": '"Android"', |
| "sec-fetch-dest": "empty", |
| "sec-fetch-mode": "cors", |
| "sec-fetch-site": "cross-site", |
| "user-agent": this.userAgent, |
| uniqueid: Date.now(), |
| verify: token, |
| }, |
| } |
| ); |
|
|
| if (res.data.code !== 200) { |
| throw new Error(res.data.msg || "Failed to generate lyrics"); |
| } |
|
|
| const recordId = res.data?.data?.recordId; |
| return this.pollGeneratedResult(recordId); |
| } |
|
|
| pollGeneratedResult(recordId, interval = 5000) { |
| return new Promise((resolve, reject) => { |
| const url = `https://aiarticle.erweima.ai/api/v1/secondary-page/api/${recordId}`; |
| const timer = setInterval(async () => { |
| try { |
| const { data } = await axios.get(url, { |
| headers: { |
| authority: "aiarticle.erweima.ai", |
| accept: "application/json, text/plain, */*", |
| "accept-language": "ms-MY,ms;q=0.9,en-US;q=0.8,en;q=0.7,id;q=0.6", |
| origin: "https://www.yeschat.ai", |
| referer: "https://www.yeschat.ai/", |
| "sec-ch-ua": '"Not A(Brand";v="8", "Chromium";v="132"', |
| "sec-ch-ua-mobile": "?1", |
| "sec-ch-ua-platform": '"Android"', |
| "sec-fetch-dest": "empty", |
| "sec-fetch-mode": "cors", |
| "sec-fetch-site": "cross-site", |
| "user-agent": this.userAgent, |
| }, |
| }); |
|
|
| if (data.code !== 200) { |
| clearInterval(timer); |
| return reject(new Error(data.msg || "Unexpected error")); |
| } |
|
|
| if (data.data?.failCode && data.data?.failMsg) { |
| clearInterval(timer); |
| return reject(new Error(data.data.failMsg)); |
| } |
|
|
| if (data.data?.state && data.data.completeData) { |
| clearInterval(timer); |
| return resolve(JSON.parse(data.data.completeData)); |
| } |
| } catch (err) { |
| clearInterval(timer); |
| return reject(err); |
| } |
| }, interval); |
| }); |
| } |
| } |
|
|
| const handler = async (req, res) => { |
| try { |
| const { mode, prompt, lyrics, title, style, instrumental } = req.query; |
|
|
| if (!mode) { |
| return res.status(400).json({ |
| success: false, |
| error: 'Missing required parameter: mode (custom/ai)' |
| }); |
| } |
|
|
| const modeNormalized = mode.toLowerCase(); |
|
|
| if (modeNormalized !== 'custom' && modeNormalized !== 'ai') { |
| return res.status(400).json({ |
| success: false, |
| error: 'Invalid mode. Use "custom" for Custom Lyrics or "ai" for AI Lyrics' |
| }); |
| } |
|
|
| let finalPrompt; |
| let customMode; |
|
|
| if (modeNormalized === 'custom') { |
| if (!lyrics) { |
| return res.status(400).json({ |
| success: false, |
| error: 'Missing required parameter: lyrics (required for Custom Lyrics mode)' |
| }); |
| } |
| finalPrompt = lyrics; |
| customMode = true; |
| } else { |
| if (!prompt) { |
| return res.status(400).json({ |
| success: false, |
| error: 'Missing required parameter: prompt (required for AI Lyrics mode)' |
| }); |
| } |
| finalPrompt = prompt; |
| customMode = false; |
| } |
|
|
| const generator = new YesChatMusicGenerator(); |
|
|
| const result = await generator.generateSongLyrics({ |
| prompt: finalPrompt, |
| title: title || "Tanpa Judul", |
| style: style || "Happy", |
| instrumental: instrumental === 'true', |
| customMode: customMode |
| }); |
|
|
| res.json({ |
| author: "Herza", |
| success: true, |
| mode: modeNormalized === 'custom' ? 'Custom Lyrics' : 'AI Lyrics', |
| result: result |
| }); |
|
|
| } catch (error) { |
| res.status(500).json({ |
| success: false, |
| error: error.message |
| }); |
| } |
| }; |
|
|
| module.exports = { |
| name: 'SunoV2 Music Generator', |
| type: 'GET', |
| routes: ['api/AI/sunov2'], |
| tags: ['ai', 'music', 'generator'], |
| main: ['AI'], |
| limit: 12, |
| parameters: ['mode', 'prompt', 'lyrics', 'title', 'style', 'instrumental', 'key'], |
| enabled: true, |
| handler |
| }; |