API global window.AM di-inject langsung ke halaman /runtime/preset.html. API ini bersifat Async / Promise-Based, aman dari perubahan UI (antarmuka tombol), dan menangani tugas berat secara otomatis.
https://am.zervida.my.idhttps://am.zervida.my.id/runtime/preset.htmlhttp://localhost:3000/runtime/preset.htmlMembatalkan / menghentikan proses pemuatan preset default bawaan halaman agar skrip otomatisasi Anda tidak perlu menunggu preset sampel selesai di-decode.
// Otomatis dipanggil saat loadPreset(), atau bisa dipanggil manual: window.AM.stopDefaultLoad();
Memuat preset dari berbagai sumber (Share Link AM, Google Drive XML, URL Direct XML, atau Blob/File). Secara otomatis membatalkan pemuatan preset sampel default.
// Contoh 1: Link Share Alight Motion (bisa sertakan nama project jika paket punya >1 project) await window.AM.loadPreset('https://alight.link/xxxx', 'Project 2.xml'); // Contoh 2: Link Google Drive (.xml) await window.AM.loadPreset('https://drive.google.com/file/d/FILE_ID/view'); // Contoh 3: Direct URL File .xml await window.AM.loadPreset('https://am.zervida.my.id/preset/TestVideo.xml');
Mengecek daftar project XML dalam paket Alight Motion (jika ada >1 project) dan berganti ke project lain tanpa perlu mengunduh ulang paket media.
// Cek daftar project XML dalam paket share link yang sudah dimuat const projects = window.AM.getAvailableProjects(); console.log(projects); // Return: [{ name: 'Project 1.xml', title: 'Main', selected: true }, { name: 'Project 2.xml', title: 'Intro', selected: false }] // Pindah ke Project 2 await window.AM.selectProject('Project 2.xml');
Mengambil daftar slot media (gambar/video) yang dibutuhkan preset beserta ID, tipe, dan thumbnail preview Base64.
const slots = window.AM.getMediaSlots(); console.log(slots); /* Result: [ { index: 0, id: "am:sig123.jpg", name: "photo_1.jpg", type: "image", previewUrl: "data:image/jpeg;base64,...", isReplaceable: true } ] */
Mengganti gambar / video pada slot media tertentu.
'am:sig123.jpg') atau Index angka (0)// Mengganti slot ke-0 menggunakan Base64 await window.AM.applyMedia(0, 'data:image/jpeg;base64,...'); // Mengganti berdasarkan ID Slot menggunakan Remote URL await window.AM.applyMedia('am:sig123.jpg', 'https://picsum.photos/800/1200');
Memasang atau mengganti lagu latar belakang project. Sangat fleksibel mendukung berbagai sumber audio:
Mengambil file suara/video publik dari TikTok lewat API internal server.
await window.AM.setAudio('https://www.tiktok.com/@user/video/123456789');
Memutar audio publik dari Google Drive dengan penanganan Range-header otomatis dari server.
await window.AM.setAudio('https://drive.google.com/file/d/DRIVE_AUDIO_ID/view');
Memuat file audio langsung dari URL MP3/WAV, DataURL Base64, atau File lokal.
// Direct URL await window.AM.setAudio('https://example.com/song.mp3'); // Base64 Audio await window.AM.setAudio('data:audio/mp3;base64,...');
Dengarkan log internal player secara real-time atau cek progress rendering video yang sedang berjalan.
// Panggil listener log window.AM.onLog((msg) => console.log('[BROWSER LOG]', msg)); // Cek progress render const prog = window.AM.getRenderProgress(); console.log(prog.progressPct, prog.currentFrame, prog.totalFrames); // Batalkan render jika perlu window.AM.cancelRender();
Mengekspor video secara headless dan mengembalikan hasil berupa DataURL Base64 & Blob URL. Mendukung callback onProgress untuk memantau status secara langsung.
const result = await window.AM.renderVideo({ resolution: 720, // Resolusi: 360, 540, 720, 1080 fps: 30, // Target FPS: 30, 60 quality: 'high', // Kualitas bitrate: 'low', 'medium', 'high' onProgress: (p) => { // Callback progress real-time console.log(`Progress: ${p.progressPct}% (frame ${p.currentFrame}/${p.totalFrames})`); } }); console.log(result.durationSec, result.sizeBytes); // result.base64 berisi "data:video/mp4;base64,..."
Gunakan mode headless: false saat pertama kali mencoba agar Anda dapat melihat langsung proses eksekusi di layar browser:
const { chromium } = require('playwright'); const fs = require('fs'); (async () => { // Gunakan headless: false agar proses terlihat visual const browser = await chromium.launch({ headless: false }); const page = await browser.newPage(); // Buka runtime preset player await page.goto('https://am.zervida.my.id/runtime/preset.html'); // Langkah 1: Muat Preset (Secara otomatis membatalkan preset default) console.log('Memuat preset...'); await page.evaluate(async () => { await window.AM.loadPreset('https://alight.link/xxxx'); }); // Langkah 2: Cek Slot Media & Upload Gambar Pengganti const slots = await page.evaluate(() => window.AM.getMediaSlots()); if (slots.length > 0) { const myPhotoBase64 = 'data:image/jpeg;base64,' + fs.readFileSync('photo.jpg').toString('base64'); await page.evaluate(async ({ slotId, img }) => { await window.AM.applyMedia(slotId, img); }, { slotId: slots[0].id, img: myPhotoBase64 }); } // Langkah 3: Pasang Musik (TikTok / Drive) await page.evaluate(async () => { await window.AM.setAudio('https://www.tiktok.com/@user/video/7123456789'); }); // Langkah 4: Render Video console.log('Mulai rendering video...'); const render = await page.evaluate(async () => { return await window.AM.renderVideo({ resolution: 720, fps: 30, quality: 'high' }); }); // Simpan hasil video ke disk const buffer = Buffer.from(render.base64.split(',')[1], 'base64'); fs.writeFileSync('output.mp4', buffer); console.log('Selesai! File tersimpan ke output.mp4'); await browser.close(); })();