File size: 3,490 Bytes
f4833a4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
const path = require('path');

async function uploadToTmpFiles(buffer, filename) {
    const tempDir = path.join(__dirname, '..', 'temp');
    
    if (!fs.existsSync(tempDir)) {
        fs.mkdirSync(tempDir, { recursive: true });
    }
    
    const tempFile = path.join(tempDir, filename);
    fs.writeFileSync(tempFile, buffer);
    
    const form = new FormData();
    form.append('file', fs.createReadStream(tempFile));
    
    const response = await axios.post('https://tmpfiles.org/api/v1/upload', form, {
        headers: {
            ...form.getHeaders()
        }
    });
    
    if (fs.existsSync(tempFile)) {
        fs.unlinkSync(tempFile);
    }
    
    const uploadUrl = response.data.data.url;
    const directUrl = uploadUrl.replace('tmpfiles.org/', 'tmpfiles.org/dl/');
    
    return directUrl;
}

async function faceSwap(img_url1, img_url2) {
    const response1 = await axios.get(img_url1, { responseType: 'arraybuffer' });
    const base64_1 = Buffer.from(response1.data).toString('base64');
    
    const response2 = await axios.get(img_url2, { responseType: 'arraybuffer' });
    const base64_2 = Buffer.from(response2.data).toString('base64');

    const swapResponse = await axios.post('https://api.faceswapper.ai/swap', {
        target: base64_1,
        source: base64_2,
        type: 'invisible',
        id: 'faceswapper'
    }, {
        headers: {
            'Accept': 'application/json, text/plain, */*',
            'Content-Type': 'application/json',
            'type': 'rapid'
        }
    });

    const base64Data = swapResponse.data.result.replace(/^data:image\/\w+;base64,/, '');
    const buffer = Buffer.from(base64Data, 'base64');
    
    const imageUrl = await uploadToTmpFiles(buffer, `faceswap_${Date.now()}.png`);

    return {
        success: true,
        elapsedTime: swapResponse.data.elapsedTime,
        url: imageUrl
    };
}

const handler = async (req, res) => {
    try {
        const { img, img2, key } = req.query;

        if (!img) {
            return res.status(400).json({
                author: "Herza",
                success: false,
                error: 'Missing required parameter: img'
            });
        }

        if (!img2) {
            return res.status(400).json({
                author: "Herza",
                success: false,
                error: 'Missing required parameter: img2'
            });
        }

        if (!key) {
            return res.status(400).json({
                author: "Herza",
                success: false,
                error: 'Missing required parameter: key'
            });
        }

        const result = await faceSwap(img, img2);

        return res.json({
            author: "Herza",
            success: true,
            data: {
                elapsedTime: result.elapsedTime,
                url: result.url
            }
        });

    } catch (error) {
        res.status(500).json({
            author: "Herza",
            success: false,
            error: error.message,
            timestamp: new Date().toISOString()
        });
    }
};

module.exports = {
    name: 'Face Swap',
    description: 'Swap faces between two images using AI',
    type: 'GET',
    routes: ['api/AI/faceswap'],
    tags: ['AI', 'tools'],
    parameters: ['img', 'img2', 'key'],
    limit: 3,
    enabled: true,
    main: ['AI', 'tools'],
    handler
};