toonmix.mjs

Anime art generator with ai.

#tools#ai#image
37
9 Jan 2026, 07:12
RawEdit
javascript0 lines
/***
  @ Base: https://play.google.com/store/apps/details?id=com.mediagenerator.toonmix
  @ Author: Shannz
  @ Note: Anime art generator with ai.
***/

import axios from 'axios';
import fs from 'fs';
import crypto from 'crypto';

const CONFIG = {
    AUTH_URL: "https://www.googleapis.com/identitytoolkit/v3/relyingparty/signupNewUser?key=AIzaSyCtEPD7MFc27-uR8FB2diwOy9FxXOsHu1o",
    API_URL: "https://us-central1-media-generator-b03ac.cloudfunctions.net",
    HEADERS: {
        COMMON: {
            'User-Agent': 'okhttp/3.12.13',
            'Accept-Encoding': 'gzip',
            'Content-Type': 'application/json; charset=utf-8',
            'firebase-instance-id-token': 'e4u8BWbsR0Kmsh1mJp7eLW:APA91bESjXNGuiWgSc_Wj7xBpMw4FIQDwT3ZcsCfooTg5Yw20cIHlWR4Ogwjz-Z_uG2uLcKT0BGh9agoehsxZOI_JtVkn6fitN_LzYtksnJDzAYb-HZvBRk'
        },
        SIGNUP: {
            'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 15; 25028RN03A Build/AP3A.240905.015.A2)',
            'Connection': 'Keep-Alive',
            'X-Android-Package': 'com.mediagenerator.toonmix',
            'X-Android-Cert': '61ED377E85D386A8DFEE6B864BD85B0BFAA5AF81',
            'Accept-Language': 'id-ID, en-US',
            'X-Client-Version': 'Android/Fallback/X24000001/FirebaseCore-Android',
            'X-Firebase-GMPID': '1:29143983185:android:0af50ff515b110ffd74470',
            'X-Firebase-Client': 'H4sIAAAAAAAA_6tWykhNLCpJSk0sKVayio7VUSpLLSrOzM9TslIyUqoFAFyivEQfAAAA'
        }
    }
};

let session = {
    idToken: null,
    refreshToken: null,
    localId: null,
    expiry: 0
};

const uploadToCloud = async (buffer) => {
    try {
        const filename = `toonmix-${crypto.randomUUID()}.png`;
        const { data } = await axios.post('https://api.cloudsky.biz.id/get-upload-url', {
            fileKey: filename,
            contentType: 'image/png',
            fileSize: buffer.length
        });

        await axios.put(data.uploadUrl, buffer, {
            headers: { 
                'Content-Type': 'image/png', 
                'Content-Length': buffer.length
            }
        });

        return `https://api.cloudsky.biz.id/file?key=${encodeURIComponent(filename)}`;
    } catch (error) {
        console.error(`[Cloud Upload Error]: ${error.message}`);
        return null;
    }
};

const toBase64 = async (input) => {
    try {
        let buffer;
        if (Buffer.isBuffer(input)) {
            buffer = input;
        } else if (input.startsWith('http')) {
            const res = await axios.get(input, { responseType: 'arraybuffer' });
            buffer = Buffer.from(res.data);
        } else if (fs.existsSync(input)) {
            buffer = fs.readFileSync(input);
        } else {
            return null;
        }
        return buffer.toString('base64');
    } catch (e) { return null; }
};

const createPayload = (prompt, params = {}) => {
    const defaultParams = {
        seed: Math.floor(Math.random() * 1000000000),
        width: 1024,
        height: 1024,
        steps: 28,
        cfg_scale: 5,
        model: "nai-diffusion-4-5-curated",
        sampler: "k_euler_ancestral"
    };

    const p = { ...defaultParams, ...params };

    return {
        "negative_prompt": p.negative_prompt || null,
        "params": {
            "cfg_rescale": 0,
            "seed": {
                "@type": "type.googleapis.com/google.protobuf.Int64Value",
                "value": String(p.seed)
            },
            "cfgScale": p.cfg_scale,
            "noise_schedule": "karras",
            "width": {
                "@type": "type.googleapis.com/google.protobuf.Int64Value",
                "value": String(p.width)
            },
            "model": p.model,
            "steps": {
                "@type": "type.googleapis.com/google.protobuf.Int64Value",
                "value": String(p.steps)
            },
            "height": {
                "@type": "type.googleapis.com/google.protobuf.Int64Value",
                "value": String(p.height)
            },
            "cfg_scale": p.cfg_scale,
            "sampler": p.sampler,
            "add_quality_tags": true,
            "negative_quality_tags_type": "heavy"
        },
        "prompt": prompt
    };
};

export const toonmix = {
    signup: async () => {
        try {
            const payload = { "clientType": "CLIENT_TYPE_ANDROID" };
            
            const response = await axios.post(CONFIG.AUTH_URL, payload, {
                headers: CONFIG.HEADERS.SIGNUP
            });

            const data = response.data;
            if (data.idToken) {
                session.idToken = data.idToken;
                session.refreshToken = data.refreshToken;
                session.localId = data.localId;
                session.expiry = Date.now() + (parseInt(data.expiresIn) * 1000);
                return session.idToken;
            }
            return null;
        } catch (error) {
            console.error(`[Signup Error]: ${error.message}`);
            return null;
        }
    },

    generateImage: async (prompt, options = {}) => {
        try {
            if (!session.idToken) await toonmix.signup();
            if (!session.idToken) return { success: false, msg: 'Auth Failed' };

            const payload = {
                data: createPayload(prompt, options)
            };

            const response = await axios.post(`${CONFIG.API_URL}/generateImage`, payload, {
                headers: {
                    ...CONFIG.HEADERS.COMMON,
                    'authorization': `Bearer ${session.idToken}`
                }
            });

            if (response.data?.result?.image) {
                const imgBuffer = Buffer.from(response.data.result.image, 'base64');
                const url = await uploadToCloud(imgBuffer);
                return {
                    success: true,
                    url: url,
                    metadata: response.data.result.metadata
                };
            }

            return { success: false, msg: 'No image returned from API' };

        } catch (error) {
            console.error(`[Generate Error]: ${error.message}`);
            return { success: false, msg: error.message };
        }
    },

    genImageByReference: async (imageReference, prompt, options = {}) => {
        try {
            if (!session.idToken) await toonmix.signup();
            if (!session.idToken) return { success: false, msg: 'Auth Failed' };

            const base64Img = await toBase64(imageReference);
            if (!base64Img) return { success: false, msg: 'Invalid Input Image' };

            const payloadParams = createPayload(prompt, options);

            const payload = {
                data: {
                    ...payloadParams,
                    image: base64Img,
                    strength: options.strength || 0.7,
                    noise: options.noise || 0.2
                }
            };

            const response = await axios.post(`${CONFIG.API_URL}/generateImg2Img`, payload, {
                headers: {
                    ...CONFIG.HEADERS.COMMON,
                    'authorization': `Bearer ${session.idToken}`
                }
            });

            if (response.data?.result?.image) {
                const imgBuffer = Buffer.from(response.data.result.image, 'base64');
                const url = await uploadToCloud(imgBuffer);
                return {
                    success: true,
                    url: url,
                    metadata: response.data.result.metadata
                };
            }

            return { success: false, msg: 'No image returned from API' };

        } catch (error) {
            console.error(`[Img2Img Error]: ${error.message}`);
            return { success: false, msg: error.message };
        }
    }
};