File size: 3,801 Bytes
3f2aeda
 
a93b6a1
a856a85
fe6ce24
23f730c
26a38d9
3f2aeda
 
 
 
 
 
 
 
 
 
0ab6f43
 
3f2aeda
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0ab6f43
 
 
 
 
79a8582
0ab6f43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3f2aeda
 
 
bcbd89a
 
 
 
 
 
 
 
 
 
 
0ab6f43
 
 
 
 
23f730c
0ab6f43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bcbd89a
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
import express from "express";
import os from "os";
import morgan from "morgan";
import bytes from "bytes";
import { FormData, Blob } from "formdata-node";
import { fileTypeFromBuffer } from "file-type";
import { Client } from "@gradio/client";

const app = express();
app.set('json spaces', 4);
app.use(morgan('dev'));
app.use(express.json({ limit: "500mb" }));
app.use(express.urlencoded({ limit: '500mb', extended: true }));
app.use((req, res, next) => {
  next()
})

const apikey = "@SadTeam77"

app.all('/', (req, res) => {
	const status = {}
	const used = process.memoryUsage()
	for (let key in used) status[key] = formatSize(used[key])
	
	const totalmem = os.totalmem()
	const freemem = os.freemem()
	status.memoryUsage = `${formatSize(totalmem - freemem)} / ${formatSize(totalmem)}`

    console.log("YOUR IP: " + req.ip)
	
	res.json({
		creator: "@SadTeams",
		message: 'Hello World!!',
		uptime: new Date(process.uptime() * 1000).toUTCString().split(' ')[4],
		status
	})
})

app.post('/api/img2img', async (req, res) => {
	try {
		console.log(req.body)
		const { images, prompt, status } = req.body
        if (!images) return res.json({ success: false, message: 'Required an images!' })
        if (!prompt) return res.json({ succese: false, message: 'Require an Promot text Image!'})
        if (!status) return res.json({ success: false, message: 'Required an status text!' })

        if(status !== apikey) return res.json({ success: false, message: 'Invalid status!' })
        if (/^(https?|http):\/\//i.test(images)) {
          const data_img = await axios.request({
            method: "GET",
            url: images,
            responseType: "arraybuffer"
          })
          const response = await processImage2Img(data_img.data, prompt)
          const type_img = await fileType.fromBuffer(response)
          res.setHeader('Content-Type', type_img.mime)
          res.send(response)
        } else if (images && typeof images == 'string' && isBase64(images)) {
	   	  const response = await processImage2Img(Buffer.from(images, "base64"), prompt)
          const type_img = await fileType.fromBuffer(response)
          res.setHeader('Content-Type', type_img.mime)
          res.send(response)
        } else {
          res.json({
            success: false, message: 'No url or base64 detected!!' 
          })
        }
	} catch (e) {
		console.log(e)
		e = String(e)
		res.json({ error: true, message: e === '[object Object]' ? 'Internal Server Error' : e })
	}
})

const PORT = process.env.PORT || 7860
app.listen(PORT, () => {
  console.log('App running on port', PORT)
})

function formatSize(num) {
	return bytes(+num || 0, { unitSeparator: ' ' })
}
function isBase64(str) {
	try {
		return btoa(atob(str)) === str
	} catch {
		return false
	}
}

async function processImage2Img(imgBuffer, prompt) {
  return new Promise(async (resolve, reject) => {
    try {
      const type = fileTypeFromBuffer(imgBuffer);
      const convertingBlob = new Blob([imgBuffer], { type: type.mime });

      const form = new FormData();
      form.append('image', convertingBlob, "image" + type.ext);
						
      const app = await Client.connect("Manjushri/SDXL-Turbo-Img2Img-CPU");
      const result = await app.predict("/predict", [
				  form, 	// blob in 'Raw Image.' Image component		
				  prompt, // string  in 'Prompt Input Text. 77 Token (Keyword or Symbol) Maximum' Textbox component		
				  1, // number (numeric value between 1 and 5) in 'Number of Iterations' Slider component		
				  987654321987654321, // number (numeric value between 0 and 987654321987654321) in 'Seed' Slider component		
				  0.1, // number (numeric value between 0.1 and 1) in 'Strength' Slider component
  ]);
      resolve(result.data);
    } catch(e) {
      reject(e.message);
    }
  });
}