← Kembali ke Beranda Utama

Dokumentasi Automasi API (window.AM)

Panduan lengkap otomatisasi Headless (Puppeteer / Playwright) untuk AM Preset Player tanpa bergantung pada elemen UI.

Panduan Umum

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.

Referensi API (window.AM)

window.AM.stopDefaultLoad() Fast Execution

Membatalkan / 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();
window.AM.loadPreset(source, [projectName]) Async / Promise

Memuat preset dari berbagai sumber (Share Link AM, Google Drive XML, URL Direct XML, atau Blob/File). Secara otomatis membatalkan pemuatan preset sampel default.

source String (URL) atau File Object XML
projectName (Opsional) String nama project spesifik jika paket AM memiliki >1 project
// 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');
window.AM.getAvailableProjects() & selectProject(projectName) Multi-Project Support

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');
window.AM.getMediaSlots() Synchronous

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
  }
]
*/
window.AM.applyMedia(slotIdOrIndex, mediaInput) Async / Promise

Mengganti gambar / video pada slot media tertentu.

slotIdOrIndex String ID slot (mis. 'am:sig123.jpg') atau Index angka (0)
mediaInput URL direct, DataURL (Base64), Blob, atau File Object
// 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');
window.AM.setAudio(audioInput) Multi-Source Audio

Memasang atau mengganti lagu latar belakang project. Sangat fleksibel mendukung berbagai sumber audio:

Cara A: Audio dari Link TikTok

Mengambil file suara/video publik dari TikTok lewat API internal server.

await window.AM.setAudio('https://www.tiktok.com/@user/video/123456789');

Cara B: Audio dari Google Drive

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');

Cara C: Audio Direct URL / File / Base64

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,...');
window.AM.onLog(callback) & getRenderProgress() Real-time Observer

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();
window.AM.renderVideo(options) Async Render Engine

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,..."

Contoh Lengkap Skrip Node.js (Playwright)

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();
})();