instant-image-host
Version:
instant image host
134 lines (126 loc) • 4.44 kB
JavaScript
module.exports = function (vars) {
const { app,
nanoid,
limiter,
checkUploadKey,
checkAuth,
checkFileSize,
express,
fs,
util,
glob: glb,
prettyBytes,
nodeHtmlToImage,
Jimp, ConvertCommand,
upl,
hbjs,
ENV,
qsToJson,
fetchVideoInfo,
ytdl,
urls,
rs,
// s3client
} = vars
const siteUrl = ENV.URL
const glob = util.promisify(glb)
app.post('/upload', [limiter, checkUploadKey, checkFileSize, express.text()], async (req, res) => {
var url = upl.ids[req.discord.id].preferences ? upl.ids[req.discord.id].preferences.domain ? upl.ids[req.discord.id].preferences.domain : 'i.1nch.dev' : 'i.1nch.dev'
var sent = false
var id = rs.generate(16)
urls.new[id] = { uploader: req.discord.id }
urls.users[req.discord.id] ? urls.users[req.discord.id].push(id) : urls.users[req.discord.id] = [id]
fs.writeFileSync('./urls.json', JSON.stringify(urls, null, 2))
var ftype = req.files != null ? req.files.file.mimetype.split('/')[1] : 'txt'
var fgroup = req.files != null ? req.files.file.mimetype.split('/')[0] : 'text/txt'
ftype = ftype == 'plain' ? 'txt' : ftype
function check(id, ftype) {
if (fs.existsSync(`./uploads/${id}.${ftype}`)) {
id = rs.generate(16)
check(id, ftype)
} else return
}
check(id, ftype)
console.log('writing file', `./uploads/${id}.${ftype}`)
fs.writeFileSync(`./uploads/${id}.${ftype}`, req.files.file.data ? req.files.file.data : req.body, req.files.file.data ? 'binary' : 'utf8')
if (fgroup == 'audio') {
var imageHTML = fs.readFileSync('mp3.html').toString().replace('expressFileName', req.files.file.name).replace('expressFileSize', prettyBytes(req.files.file.size))
nodeHtmlToImage({
output: `./uploads/${id}.png`,
html: imageHTML
})
.then(async () => {
await Jimp.read(`./uploads/${id}.png`).then(f => f.crop(0, 0, 400, 100).write(`./uploads/${id}.png`))
var Convert = new ConvertCommand(`./uploads/${id}.${ftype}`, 'mp4', `./uploads/${id}.png`)
Convert.init(function (err, response) {
if (err) {
res.status(500).send('' + err)
} else {
ftype = 'mp4'
return res.status(200).json({
url: `https://${url}/u/${id}.${ftype}`,
thumbnail_url: `https://${url}/u/${id}.${ftype}`,
deletion_url: `https://${url}/delimage/${id}.${ftype}?auth=${upl.ids[req.discord.id].key}`
})
}
});
})
} else if (fgroup == 'video' && ftype != 'mp4') {
hbjs.spawn({ input: `./uploads/${id}.${ftype}`, output: `./uploads/${id}.mp4` })
.on('error', err => {
res.status(500).send('' + err)
})
.on('progress', progress => {
console.log(progress.percentComplete)
if (progress.percentComplete == 100 && !sent) {
var sent = true
res.status(200).json({
url: `https://${url}/u/${id}.mp4`,
thumbnail_url: `https://${url}/u/${id}.mp4`,
deletion_url: `https://${url}/u/${id}.mp4?auth=${upl.ids[req.discord.id].key}`
})
}
})
} else {
res.status(200).json({
url: `https://${url}/u/${id}.${ftype}`,
thumbnail_url: `https://${url}/u/${id}.${ftype}`,
deletion_url: `https://${url}/delimage/${id}.${ftype}?auth=${upl.ids[req.discord.id].key}`
})
}
})
app.post('/yt', [checkAuth], (req, res) => {
})
app.get('/delimage/:id', [checkAuth, checkUploadKey], (req, res) => {
if (upl.keys[req.query.auth] == req.discord.id) {
fs.unlinkSync(`./uploads/${req.params.id}`)
res.status(200).json({
message: 'OK'
})
} else {
res.status(403).json({
message: 'Forbidden'
})
}
})
app.get('/delall', [checkAuth, checkUploadKey], (req, res) => {
if (upl.keys[req.query.auth] == req.discord.id) {
urls.users[req.discord.id].forEach(k => {
glob(`./uploads/${k}.*`).then(files => {
files.forEach(file => {
fs.unlinkSync(`${file}`)
})
})
})
setTimeout(() => {
res.status(200).json({
message: 'OK'
})
}, 2500)
} else {
res.status(403).json({
message: 'Forbidden'
})
}
})
}