ai-enlarger.mjs

javascriptCreated 25 Jan 2026, 08:2919 views
Upscale, Retouch, and Sharpen image.
#tools#utility#image
javascript
/***
  @ Base: https://play.google.com/store/apps/details?id=com.app.aiimglarger
  @ Author: Shannz
  @ Note: Upscale, Retouch, and Sharpen image.
***/

import axios from 'axios';
import FormData from 'form-data';
import fs from 'fs';
import { Buffer } from 'buffer';

const CONFIG = {
    BASE_URL: "https://photoai.imglarger.com/api/PhoAi",
    HEADERS: {
        'User-Agent': 'Dart/3.9 (dart:io)',
        'Accept-Encoding': 'gzip'
    }
};

const generateRandomUser = () => `${crypto.randomBytes(8).toString('hex')}_aiimglarger`;

const prepareFile = async (input) => {
    if (Buffer.isBuffer(input)) return input;
    if (input.startsWith('http')) {
        const res = await axios.get(input, { responseType: 'arraybuffer' });
        return Buffer.from(res.data);
    }
    if (fs.existsSync(input)) return fs.createReadStream(input);
    return null;
};

const pollStatus = async (code, type) => {
    const maxAttempts = 20;
    let attempts = 0;

    while (attempts < maxAttempts) {
        try {
            const { data } = await axios.post(`${CONFIG.BASE_URL}/CheckStatus`, {
                code: code,
                type: parseInt(type),
                username: generateRandomUser
            }, {
                headers: { ...CONFIG.HEADERS, 'Content-Type': 'application/json;charset=UTF-8' }
            });

            if (data.data?.status === 'success') {
                return { success: true, url: data.data.downloadUrls[0], data: data.data };
            }

            if (data.data?.status === 'failed') {
                return { success: false, msg: 'Processing failed on server' };
            }

            await new Promise(resolve => setTimeout(resolve, 3000));
            attempts++;
        } catch (e) {
            return { success: false, msg: e.message };
        }
    }
    return { success: false, msg: 'Timeout' };
};

export const photoAi = {
    upscale: async (imageInput, scale = '4') => {
        try {
            const file = await prepareFile(imageInput);
            const form = new FormData();
            form.append('type', '0');
            form.append('username', generateRandomUser);
            form.append('scaleRadio', scale.toString());
            form.append('file', file, { filename: 'image.jpg' });

            const { data } = await axios.post(`${CONFIG.BASE_URL}/Upload`, form, {
                headers: { ...CONFIG.HEADERS, ...form.getHeaders() }
            });

            if (data.code === 200 && data.data) {
                return await pollStatus(data.data, 0);
            }
            return { success: false, msg: data.msg || 'Upload failed' };
        } catch (error) {
            return { success: false, msg: error.message };
        }
    },

    retouch: async (imageInput) => {
        try {
            const file = await prepareFile(imageInput);
            const form = new FormData();
            form.append('type', '3');
            form.append('username', generateRandomUser);
            form.append('file', file, { filename: 'image.jpg' });

            const { data } = await axios.post(`${CONFIG.BASE_URL}/Upload`, form, {
                headers: { ...CONFIG.HEADERS, ...form.getHeaders() }
            });

            if (data.code === 200 && data.data) {
                return await pollStatus(data.data, 3);
            }
            return { success: false, msg: data.msg || 'Upload failed' };
        } catch (error) {
            return { success: false, msg: error.message };
        }
    },

    sharpen: async (imageInput) => {
        try {
            const file = await prepareFile(imageInput);
            const form = new FormData();
            form.append('type', '1');
            form.append('username', generateRandomUser);
            form.append('file', file, { filename: 'image.jpg' });

            const { data } = await axios.post(`${CONFIG.BASE_URL}/Upload`, form, {
                headers: { ...CONFIG.HEADERS, ...form.getHeaders() }
            });

            if (data.code === 200 && data.data) {
                return await pollStatus(data.data, 1);
            }
            return { success: false, msg: data.msg || 'Upload failed' };
        } catch (error) {
            return { success: false, msg: error.message };
        }
    }
};