| const axios = require('axios'); | |
| const FormData = require('form-data'); | |
| const aiLabs = { | |
| api: { | |
| base: 'https://text2video.aritek.app', | |
| endpoints: { | |
| text2img: '/text2img', | |
| generate: '/txt2videov3', | |
| video: '/video' | |
| } | |
| }, | |
| headers: { | |
| 'user-agent': 'NB Android/1.0.0', | |
| 'accept-encoding': 'gzip', | |
| 'content-type': 'application/json', | |
| authorization: '' | |
| }, | |
| state: { | |
| token: null | |
| }, | |
| setup: { | |
| cipher: 'hbMcgZLlzvghRlLbPcTbCpfcQKM0PcU0zhPcTlOFMxBZ1oLmruzlVp9remPgi0QWP0QW', | |
| shiftValue: 3, | |
| dec(text, shift) { | |
| return [...text].map(c => | |
| /[a-z]/.test(c) | |
| ? String.fromCharCode((c.charCodeAt(0) - 97 - shift + 26) % 26 + 97) | |
| : /[A-Z]/.test(c) | |
| ? String.fromCharCode((c.charCodeAt(0) - 65 - shift + 26) % 26 + 65) | |
| : c | |
| ).join(''); | |
| }, | |
| decrypt: async () => { | |
| if (aiLabs.state.token) return aiLabs.state.token; | |
| const input = aiLabs.setup.cipher; | |
| const shift = aiLabs.setup.shiftValue; | |
| const decrypted = aiLabs.setup.dec(input, shift); | |
| aiLabs.state.token = decrypted; | |
| aiLabs.headers.authorization = decrypted; | |
| return decrypted; | |
| } | |
| }, | |
| deviceId() { | |
| return Array.from({ length: 16 }, () => | |
| Math.floor(Math.random() * 16).toString(16) | |
| ).join(''); | |
| }, | |
| text2img: async (prompt) => { | |
| if (!prompt?.trim()) { | |
| return { | |
| success: false, | |
| code: 400, | |
| result: { | |
| error: 'Yang bener aja anjirr, inputnya kosong begitu πΏ' | |
| } | |
| }; | |
| } | |
| const token = await aiLabs.setup.decrypt(); | |
| const form = new FormData(); | |
| form.append('prompt', prompt); | |
| form.append('token', token); | |
| try { | |
| const url = aiLabs.api.base + aiLabs.api.endpoints.text2img; | |
| const res = await axios.post(url, form, { | |
| headers: { | |
| ...aiLabs.headers, | |
| ...form.getHeaders() | |
| } | |
| }); | |
| const { code, url: imageUrl } = res.data; | |
| if (code !== 0 || !imageUrl) { | |
| return { | |
| success: false, | |
| code: res.status, | |
| result: { | |
| error: 'Error bree π' | |
| } | |
| }; | |
| } | |
| return { | |
| success: true, | |
| code: res.status, | |
| result: { | |
| url: imageUrl.trim(), | |
| prompt | |
| } | |
| }; | |
| } catch (err) { | |
| return { | |
| success: false, | |
| code: err.response?.status || 500, | |
| result: { | |
| error: err.message || 'Error bree π' | |
| } | |
| }; | |
| } | |
| }, | |
| generate: async ({ prompt = '', type = 'video', isPremium = 1 } = {}) => { | |
| if (!prompt?.trim() || !/^[a-zA-Z0-9\s.,!?'-]+$/.test(prompt)) { | |
| return { | |
| success: false, | |
| code: 400, | |
| result: { | |
| error: 'Promptnya kagak boleh kosong bree.. apalagi ada karakternya aneh begitu :v kagak boleh yak π' | |
| } | |
| }; | |
| } | |
| if (!/^(image|video)$/.test(type)) { | |
| return { | |
| success: false, | |
| code: 400, | |
| result: { | |
| error: 'Tipenya kagak valid.. lu bisa pake image atau video yak.. βΊοΈ' | |
| } | |
| }; | |
| } | |
| if (type === 'image') { | |
| return await aiLabs.text2img(prompt); | |
| } else { | |
| await aiLabs.setup.decrypt(); | |
| const payload = { | |
| deviceID: aiLabs.deviceId(), | |
| isPremium, | |
| prompt, | |
| used: [], | |
| versionCode: 59 | |
| }; | |
| try { | |
| const url = aiLabs.api.base + aiLabs.api.endpoints.generate; | |
| const res = await axios.post(url, payload, { headers: aiLabs.headers }); | |
| const { code, key } = res.data; | |
| if (code !== 0 || !key || typeof key !== 'string') { | |
| return { | |
| success: false, | |
| code: res.status, | |
| result: { | |
| error: 'Heumm.. Gagal bree ngambil Keynya π«΅π»π·' | |
| } | |
| }; | |
| } | |
| return await aiLabs.video(key); | |
| } catch (err) { | |
| return { | |
| success: false, | |
| code: err.response?.status || 500, | |
| result: { | |
| error: err.message || 'Error bree... π' | |
| } | |
| }; | |
| } | |
| } | |
| }, | |
| video: async (key) => { | |
| if (!key || typeof key !== 'string') { | |
| return { | |
| success: false, | |
| code: 400, | |
| result: { | |
| error: 'Keynya kagak valid bree... ππ' | |
| } | |
| }; | |
| } | |
| await aiLabs.setup.decrypt(); | |
| const payload = { keys: [key] }; | |
| const url = aiLabs.api.base + aiLabs.api.endpoints.video; | |
| const maxAttempts = 100; | |
| const delay = 2000; | |
| let attempt = 0; | |
| while (attempt < maxAttempts) { | |
| attempt++; | |
| try { | |
| const res = await axios.post(url, payload, { | |
| headers: aiLabs.headers, | |
| timeout: 15000 | |
| }); | |
| const { code, datas } = res.data; | |
| if (code === 0 && Array.isArray(datas) && datas.length > 0) { | |
| const data = datas[0]; | |
| if (!data.url || data.url.trim() === '') { | |
| await new Promise(r => setTimeout(r, delay)); | |
| continue; | |
| } | |
| return { | |
| success: true, | |
| code: res.status, | |
| result: { | |
| url: data.url.trim(), | |
| safe: data.safe === 'true', | |
| key: data.key, | |
| progress: '100%' | |
| } | |
| }; | |
| } | |
| } catch (err) { | |
| const retry = ['ECONNRESET', 'ECONNABORTED', 'ETIMEDOUT'].includes(err.code); | |
| if (retry && attempt < maxAttempts) { | |
| await new Promise(r => setTimeout(r, delay)); | |
| continue; | |
| } | |
| return { | |
| success: false, | |
| code: err.response?.status || 500, | |
| result: { | |
| error: 'Error bree...', | |
| attempt | |
| } | |
| }; | |
| } | |
| } | |
| return { | |
| success: false, | |
| code: 504, | |
| result: { | |
| error: 'Proses videonya kelamaan, keknya lagi ngambek tuh Server AI nya wkwk... ', | |
| attempt | |
| } | |
| }; | |
| } | |
| }; | |
| const handler = async (req, res) => { | |
| try { | |
| const { prompt } = req.query; | |
| if (!prompt) { | |
| return res.status(400).json({ | |
| success: false, | |
| error: 'Missing required parameter: prompt' | |
| }); | |
| } | |
| const result = await aiLabs.generate({ | |
| prompt: prompt, | |
| type: 'video', | |
| isPremium: 1 | |
| }); | |
| if (!result.success) { | |
| return res.status(result.code).json({ | |
| author: "Herza", | |
| success: false, | |
| error: result.result.error | |
| }); | |
| } | |
| res.json({ | |
| author: "Herza", | |
| success: true, | |
| result: result.result | |
| }); | |
| } catch (error) { | |
| res.status(500).json({ | |
| success: false, | |
| error: error.message | |
| }); | |
| } | |
| }; | |
| module.exports = { | |
| name: 'AI Labs Text to Video', | |
| description: 'Generate video from text prompt using AI Labs', | |
| type: 'GET', | |
| routes: ['api/AI/text2video'], | |
| tags: ['ai', 'video', 'text-to-video', 'generator'], | |
| main: ['AI'], | |
| parameters: ['prompt', 'key'], | |
| enabled: true, | |
| handler | |
| }; |