Spaces:
Paused
Paused
Update index.js
Browse files
index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
|
|
| 1 |
const os = require('os')
|
| 2 |
const mime = require('mime')
|
| 3 |
const axios = require('axios')
|
|
@@ -12,6 +13,8 @@ app.set('json spaces', 4)
|
|
| 12 |
app.use(morgan('dev'))
|
| 13 |
app.use(express.json())
|
| 14 |
|
|
|
|
|
|
|
| 15 |
app.all('/', (req, res) => {
|
| 16 |
const status = {}
|
| 17 |
const used = process.memoryUsage()
|
|
@@ -31,7 +34,7 @@ app.all('/', (req, res) => {
|
|
| 31 |
|
| 32 |
app.post('/imagetopdf', async (req, res) => {
|
| 33 |
try {
|
| 34 |
-
console.log(req.body)
|
| 35 |
const { images } = req.body
|
| 36 |
if (!images) return res.json({ success: false, message: 'Required an array image url' })
|
| 37 |
|
|
@@ -47,87 +50,19 @@ app.post('/imagetopdf', async (req, res) => {
|
|
| 47 |
}
|
| 48 |
})
|
| 49 |
|
| 50 |
-
app.all('/
|
| 51 |
-
if (!['
|
| 52 |
|
| 53 |
try {
|
| 54 |
-
const
|
| 55 |
-
if (!
|
| 56 |
-
if (!/^https?:\/\//.test(url)) return res.json({ success: false, message: 'Invalid url' })
|
| 57 |
-
|
| 58 |
-
const response = await fetch(`https://srvcdn3.2convert.me/api/json?url=${url}`, { headers: { referer: 'https://y2mate.is/' }})
|
| 59 |
-
const json = await response.json()
|
| 60 |
-
if (json.error) return res.json({ success: false, message: json.message || json.errorMessage })
|
| 61 |
-
|
| 62 |
-
const { duration } = json.formats
|
| 63 |
-
const result = {
|
| 64 |
-
...json.formats,
|
| 65 |
-
lengthSeconds: +duration,
|
| 66 |
-
duration: new Date(duration * 1000).toUTCString().split(' ')[4],
|
| 67 |
-
video: {},
|
| 68 |
-
audio: {}
|
| 69 |
-
}
|
| 70 |
-
|
| 71 |
-
for (const type of ['video', 'audio']) {
|
| 72 |
-
json.formats[type].forEach((data) => {
|
| 73 |
-
const { quality: q, fileType, needConvert, fileSize, url: dlUrl } = data
|
| 74 |
-
const quality = type === 'video' ? q : `${q}kbps`
|
| 75 |
-
|
| 76 |
-
result[type][quality] = {
|
| 77 |
-
quality,
|
| 78 |
-
fileType,
|
| 79 |
-
fileSizeH: formatSize(fileSize),
|
| 80 |
-
fileSize,
|
| 81 |
-
needConvert,
|
| 82 |
-
url: !needConvert ? dlUrl : `https://${process.env.SPACE_HOST}${req.path}/convert?hash=${encodeURIComponent(dlUrl)}`
|
| 83 |
-
}
|
| 84 |
-
})
|
| 85 |
-
}
|
| 86 |
-
|
| 87 |
-
res.json({ success: true, result })
|
| 88 |
-
} catch (e) {
|
| 89 |
-
console.log(e)
|
| 90 |
-
e = String(e)
|
| 91 |
-
res.status(500).json({ error: true, message: e === '[object Object]' ? 'Internal Server Error' : e })
|
| 92 |
-
}
|
| 93 |
-
})
|
| 94 |
-
|
| 95 |
-
app.get('/yt/convert', async (req, res) => {
|
| 96 |
-
try {
|
| 97 |
-
const { hash } = req.query
|
| 98 |
-
if (!hash) return res.json({ success: false, message: 'Invalid hash' })
|
| 99 |
|
| 100 |
-
const
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
'Content-Type': 'application/x-www-form-urlencoded',
|
| 104 |
-
'Referer': 'https://y2mate.is/'
|
| 105 |
-
}
|
| 106 |
-
}))
|
| 107 |
|
| 108 |
-
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
const reqTaskJson = await reqTaskId.json()
|
| 112 |
-
if (reqTaskJson.error) return res.json({ success: false, message: reqTaskJson.message })
|
| 113 |
-
|
| 114 |
-
let result
|
| 115 |
-
while (!result) {
|
| 116 |
-
const fetchTaskId = await fetchPost('https://srvcdn3.2convert.me/api/json/task', `taskId=${reqTaskJson.taskId}`)
|
| 117 |
-
const fetchTaskJson = await fetchTaskId.json()
|
| 118 |
-
console.log(fetchTaskJson)
|
| 119 |
-
if (fetchTaskJson.status === 'finished') {
|
| 120 |
-
result = fetchTaskJson
|
| 121 |
-
break
|
| 122 |
-
}
|
| 123 |
-
await new Promise(resolve => setTimeout(resolve, 1000))
|
| 124 |
-
}
|
| 125 |
-
|
| 126 |
-
const { download, title, ext } = result
|
| 127 |
-
const response = await axios.get(download, { responseType: 'stream' })
|
| 128 |
-
res.setHeader('Content-Disposition', `attachment; filename=${encodeURIComponent(title)}.${ext}`)
|
| 129 |
-
res.setHeader('Content-Type', mime.types[ext])
|
| 130 |
-
response.data.pipe(res)
|
| 131 |
} catch (e) {
|
| 132 |
console.log(e)
|
| 133 |
e = String(e)
|
|
@@ -187,6 +122,14 @@ function formatSize(num) {
|
|
| 187 |
return bytes(+num || 0, { unitSeparator: ' ' })
|
| 188 |
}
|
| 189 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 190 |
function toPDF(urls) {
|
| 191 |
return new Promise(async (resolve, reject) => {
|
| 192 |
try {
|
|
|
|
| 1 |
+
const fs = require('fs')
|
| 2 |
const os = require('os')
|
| 3 |
const mime = require('mime')
|
| 4 |
const axios = require('axios')
|
|
|
|
| 13 |
app.use(morgan('dev'))
|
| 14 |
app.use(express.json())
|
| 15 |
|
| 16 |
+
app.use('/file', express.static(os.tmpdir()))
|
| 17 |
+
|
| 18 |
app.all('/', (req, res) => {
|
| 19 |
const status = {}
|
| 20 |
const used = process.memoryUsage()
|
|
|
|
| 34 |
|
| 35 |
app.post('/imagetopdf', async (req, res) => {
|
| 36 |
try {
|
| 37 |
+
console.log(new Date().toLocaleString('id', { timeZone: 'Asia/Jakarta' }), '\n', req.body)
|
| 38 |
const { images } = req.body
|
| 39 |
if (!images) return res.json({ success: false, message: 'Required an array image url' })
|
| 40 |
|
|
|
|
| 50 |
}
|
| 51 |
})
|
| 52 |
|
| 53 |
+
app.all('/webp2png', async (req, res) => {
|
| 54 |
+
if (!['POST'].includes(req.method)) return res.status(405).json({ success: false, message: 'Method Not Allowed' })
|
| 55 |
|
| 56 |
try {
|
| 57 |
+
const { file } = req.body
|
| 58 |
+
if (!(file && isBase64(file))) return res.json({ success: false, message: 'Payload body file must be filled in base64 format' })
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
|
| 60 |
+
const fileBuffer = Buffer.from(file, 'base64')
|
| 61 |
+
const fileName = `${Math.random().toString(36)}.png`
|
| 62 |
+
const convertData = await sharp(fileBuffer).png().toBuffer()
|
|
|
|
|
|
|
|
|
|
|
|
|
| 63 |
|
| 64 |
+
await fs.promises.writeFile(`${os.tmpdir()}/${fileName}`, convertData)
|
| 65 |
+
res.send(`https://${req.get('host')}/file/${fileName}`)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
} catch (e) {
|
| 67 |
console.log(e)
|
| 68 |
e = String(e)
|
|
|
|
| 122 |
return bytes(+num || 0, { unitSeparator: ' ' })
|
| 123 |
}
|
| 124 |
|
| 125 |
+
function isBase64(str) {
|
| 126 |
+
try {
|
| 127 |
+
return btoa(atob(str)) === str
|
| 128 |
+
} catch {
|
| 129 |
+
return false
|
| 130 |
+
}
|
| 131 |
+
}
|
| 132 |
+
|
| 133 |
function toPDF(urls) {
|
| 134 |
return new Promise(async (resolve, reject) => {
|
| 135 |
try {
|