File size: 5,616 Bytes
095af13
e868aa0
 
095af13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59f11b4
095af13
 
 
 
 
 
 
 
 
 
21d123c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3ffe5fa
21d123c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a8a9771
3a98f24
bcb7e7d
3a98f24
bcb7e7d
 
a8a9771
21d123c
3a98f24
21d123c
 
 
 
 
e868aa0
 
3a98f24
21d123c
1ec6ae1
21d123c
e868aa0
21d123c
 
 
 
 
e868aa0
 
 
 
 
21d123c
 
 
 
 
 
 
095af13
 
 
 
4ca849c
095af13
 
 
 
 
 
 
 
 
4ca849c
ceeb8a8
4ca849c
095af13
 
4ca849c
095af13
 
 
 
 
4ca849c
 
095af13
 
 
 
 
 
 
 
 
 
8c53df2
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
const os = require('os')
const mime = require('mime')
const axios = require('axios')
const bytes = require('bytes')
const sharp = require('sharp')
const morgan = require('morgan')
const express = require('express')
const PDFDocument = require('pdfkit')

const app = express()
app.set('json spaces', 4)
app.use(morgan('dev'))
app.use(express.json())

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)}`
	
	res.json({
		creator: '@rippanteq7',
		message: 'Hello World',
		uptime: new Date(process.uptime() * 1000).toUTCString().split(' ')[4],
		status
	})
})

app.post('/imagetopdf', async (req, res) => {
	try {
		console.log(req.body)
		const { images } = req.body
		if (!images) return res.json({ success: false, message: 'Required an array image url' })
		
		const buffer = await toPDF(images)
		res.setHeader('Content-Disposition', `attachment; filename=${Math.random().toString(36).slice(2)}.pdf`)
		res.setHeader('Content-Type', 'application/pdf')
		res.setHeader('Content-Length', buffer.byteLength)
		res.send(buffer)
	} catch (e) {
		console.log(e)
		e = String(e)
		res.json({ error: true, message: e === '[object Object]' ? 'Internal Server Error' : e })
	}
})

app.all('/yt', async (req, res) => {
	if (!['GET', 'POST'].includes(req.method)) return res.status(405).json({ success: false, message: 'Method Not Allowed' })
	
	try {
		const url = req.method !== 'GET' ? req.body.url : req.query.url
		if (!url) return res.json({ success: false, message: 'Input parameter url' })
		if (!/^https?:\/\//.test(url)) return res.json({ success: false, message: 'Invalid url' })
		
		const response = await fetch(`https://srvcdn3.2convert.me/api/json?url=${url}`, { headers: { referer: 'https://y2mate.is/' }})
		const json = await response.json()
		if (json.error) return res.json({ success: false, message: json.message || json.errorMessage })
		
		const { duration } = json.formats
		const result = {
			...json.formats,
			lengthSeconds: +duration,
			duration: new Date(duration * 1000).toUTCString().split(' ')[4],
			video: {},
			audio: {}
		}
		
		for (const type of ['video', 'audio']) {
			json.formats[type].forEach((data) => {
				const { quality: q, fileType, needConvert, fileSize, url: dlUrl } = data
				const quality = type === 'video' ? q : `${q}kbps`
				
				result[type][quality] = {
					quality,
					fileType,
					fileSizeH: formatSize(fileSize),
					fileSize,
					needConvert,
					url: !needConvert ? dlUrl : `https://${process.env.SPACE_HOST}${req.path}/convert?hash=${encodeURIComponent(dlUrl)}`
				}
			})
		}
		
		res.json({ success: true, result })
	} catch (e) {
		console.log(e)
		e = String(e)
		res.status(500).json({ error: true, message: e === '[object Object]' ? 'Internal Server Error' : e })
	}
})

app.get('/yt/convert', async (req, res) => {
	try {
		const { hash } = req.query
		if (!hash) return res.json({ success: false, message: 'Invalid hash' })
		
		const fetchPost = (url, body) => (fetch(url, {
			method: 'POST', body,
			headers: {
				'Content-Type': 'application/x-www-form-urlencoded',
				'Referer': 'https://y2mate.is/'
			}
		}))
		
		const reqTaskId = await fetchPost('https://srvcdn3.2convert.me/api/json', `hash=${encodeURIComponent(hash)}`)
		if (!reqTaskId.ok) return res.json({ success: false, message: 'Hash not found' })
		
		const reqTaskJson = await reqTaskId.json()
		if (reqTaskJson.error) return res.json({ success: false, message: reqTaskJson.message })
		
		let result
		while (!result) {
			const fetchTaskId = await fetchPost('https://srvcdn3.2convert.me/api/json/task', `taskId=${reqTaskJson.taskId}`)
			const fetchTaskJson = await fetchTaskId.json()
			console.log(fetchTaskJson)
			if (fetchTaskJson.status === 'finished') {
				result = fetchTaskJson
				break
			}
			await new Promise(resolve => setTimeout(resolve, 1000))
		}
		
		const { download, title, ext } = result
		const response = await axios.get(download, { responseType: 'stream' })
		res.setHeader('Content-Disposition', `attachment; filename=${title}.${ext}`)
		res.setHeader('Content-Type', mime.types[ext])
		response.data.pipe(res)
	} catch (e) {
		console.log(e)
		e = String(e)
		res.status(500).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 toPDF(urls) {
	return new Promise(async (resolve, reject) => {
		try {
			if (!Array.isArray(urls)) urls = [urls]
			const doc = new PDFDocument({ margin: 0, size: 'A4' })
			const buffers = []
			
			for (let i = 0; i < urls.length; i++) {
				const response = await fetch(urls[i], { headers: { referer: urls[i] }})
				if (!response.ok) continue
				
				const type = response.headers.get('content-type')
				if (!/image/.test(type)) continue
				
				let buffer = Buffer.from(await response.arrayBuffer())
				if (/gif|webp/.test(type)) buffer = await sharp(buffer).png().toBuffer()
				
				doc.image(buffer, 0, 0, { fit: [595.28, 841.89], align: 'center', valign: 'center' })
				if (urls.length !== i + 1) doc.addPage()
			}
			
			doc.on('data', (chunk) => buffers.push(chunk))
			doc.on('end', () => resolve(Buffer.concat(buffers)))
			doc.on('error', reject)
			doc.end()
		} catch (e) {
			console.log(e)
			reject(e)
		}
	})
}