From 081df808d90e80a46a56f8e9d6253554910955b9 Mon Sep 17 00:00:00 2001 From: Flummi Date: Tue, 4 Jan 2022 21:03:48 +0100 Subject: [PATCH] lekker thumbnailer jongen --- debug/thumbnailer.mjs | 73 +++++++++++++++++++++++++++++++++++++ mugge.png | Bin 0 -> 66333 bytes package.json | 2 + src/inc/trigger/parser.mjs | 70 ++++++++++++++++++++++------------- 4 files changed, 119 insertions(+), 26 deletions(-) create mode 100644 debug/thumbnailer.mjs create mode 100644 mugge.png diff --git a/debug/thumbnailer.mjs b/debug/thumbnailer.mjs new file mode 100644 index 0000000..87a1d9e --- /dev/null +++ b/debug/thumbnailer.mjs @@ -0,0 +1,73 @@ +import cfg from "../src/inc/config.mjs"; +import sql from "../src/inc/sql.mjs"; +import { promises as fs } from "fs"; +import { exec as _exec } from "child_process"; +import fetch from "flumm-fetch-cookies"; + +const exec = cmd => new Promise((resolve, reject) => { + _exec(cmd, { maxBuffer: 5e3 * 1024 }, (err, stdout, stderr) => { + if(err) + return reject(err); + if(stderr) + console.error(stderr); + resolve({ stdout: stdout }); + }); +}); + +const _args = process.argv.slice(2); +const _itemid = +_args[0] || 1; + +const items = await sql('items').where('id', _itemid);//.where('mime', 'like', 'audio/%'); +let count = 1; +let total = items.length; + +for(let item of items) { + const itemid = item.id; + const filename = item.dest; + const mime = item.mime; + try { + if(mime.startsWith('video/') || mime == 'image/gif') + await exec(`ffmpegthumbnailer -i./public/b/${filename} -s1024 -o./tmp/${itemid}.png`); + else if(mime.startsWith('image/') && mime != 'image/gif') + await exec(`convert ./public/b/${filename} ./tmp/${itemid}.png`); + else if(mime.startsWith('audio/')) { + if(item.src.match(/soundcloud/)) { + const cover = (await exec(`yt-dlp -f 'bv*[height<=720]+ba/b[height<=720] / wv*+ba/w' --get-thumbnail "${item.src}"`)).stdout.trim(); + if(!cover.match(/default_avatar/)) { + try { + await exec(`wget "${cover}" -O ./tmp/${itemid}.jpg`); + const size = (await fs.stat(`./tmp/${itemid}.jpg`)).size; + if(size >= 0) + await exec(`convert ./tmp/${itemid}.jpg ./tmp/${itemid}.png`); + await fs.unlink(`./tmp/${itemid}.jpg`); + } catch(err) {} + } + else + await exec(`ffmpeg -i ./public/b/${filename} -update 1 -map 0:v -map 0:1 -c copy ./tmp/${itemid}.png`); + } + else + await exec(`ffmpeg -i ./public/b/${filename} -update 1 -map 0:v -map 0:1 -c copy ./tmp/${itemid}.png`); + await fs.copyFile(`./tmp/${itemid}.png`, `./public/ca/${itemid}.png`); + } + + await exec(`convert "./tmp/${itemid}.png" -resize "128x128^" -gravity center -crop 128x128+0+0 +repage ./public/t/${itemid}.png`); + await fs.unlink(`./tmp/${itemid}.png`); + + } catch(err) { + await fs.copyFile('./mugge.png', `./public/t/${itemid}.png`); + } + console.log(`current: ${itemid} (${count} / ${total})`); + count++; +} + +/*for(let item of items) { + try { + const itemid = item.id; + const filename = item.dest; + await exec(`ffmpegthumbnailer -i./public/b/${filename} -s1024 -o./debug/tmp/${itemid}`); + await exec(`convert "./debug/tmp/${itemid}" -resize "128x128^" -gravity center -crop 128x128+0+0 +repage ./public/t/${itemid}.png`); + await fs.unlink(`./debug/tmp/${itemid}`); + console.log(`current: ${itemid} (${count} / ${total})`); + } catch(err) {} + count++; +};*/ diff --git a/mugge.png b/mugge.png new file mode 100644 index 0000000000000000000000000000000000000000..56bb78a88c50af0a43acc1a9087975d4b33fcc67 GIT binary patch literal 66333 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index f8c9fcb..d06b04e 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,8 @@ "start": "node --experimental-json-modules src/index.mjs", "trigger": "node --experimental-json-modules debug/trigger.mjs", "autotagger": "node --experimental-json-modules debug/autotagger.mjs", + "thumbnailer": "node --experimental-json-modules debug/thumbnailer.mjs", + "test": "node --experimental-json-modules debug/test.mjs", "clean": "node --experimental-json-modules debug/clean.mjs" }, "author": "Flummi", diff --git a/src/inc/trigger/parser.mjs b/src/inc/trigger/parser.mjs index 6d2decb..3852790 100644 --- a/src/inc/trigger/parser.mjs +++ b/src/inc/trigger/parser.mjs @@ -127,52 +127,70 @@ export default async bot => { stamp: ~~(new Date() / 1000), active: 1 }); - const insertq = (await sql('items').where('dest', filename).limit(1))[0].id; + const itemid = (await sql('items').where('dest', filename).limit(1))[0].id; // generate thumbnail try { - let thumb_orig = (await exec(`yt-dlp -f 'bv*[height<=720]+ba/b[height<=720] / wv*+ba/w' --get-thumbnail "${link}"`)).stdout.trim(); - if(!thumb_orig.startsWith("http")) { - if(mime.startsWith("image") && mime !== "image/gif") - thumb_orig = `./public/b/${filename}`; - else if(!mime.startsWith("audio")) { - await exec(`ffmpegthumbnailer -i./public/b/${filename} -s1024 -o./tmp/${insertq}`); - thumb_orig = `./tmp/${insertq}`; - } - else if(mime.startsWith("audio")) { - await exec(`ffmpeg -i ./public/b/${filename} -update 1 -map 0:v -map 0:1 -c copy ./tmp/${insertq}.png`) - await exec(`cp ./tmp/${insertq}.png ./public/ca/${insertq}.png`) - thumb_orig = `./tmp/${insertq}.png`; + if(mime.startsWith('video/') || mime == 'image/gif') + await exec(`ffmpegthumbnailer -i./public/b/${filename} -s1024 -o./tmp/${itemid}.png`); + else if(mime.startsWith('image/') && mime != 'image/gif') + await exec(`convert ./public/b/${filename} ./tmp/${itemid}.png`); + else if(mime.startsWith('audio/')) { + if(link.match(/soundcloud/)) { + const cover = (await exec(`yt-dlp -f 'bv*[height<=720]+ba/b[height<=720] / wv*+ba/w' --get-thumbnail "${link}"`)).stdout.trim(); + if(!cover.match(/default_avatar/)) { + try { + await exec(`wget "${cover}" -O ./tmp/${itemid}.jpg`); + const size = (await fs.promises.stat(`./tmp/${itemid}.jpg`)).size; + if(size >= 0) + await exec(`convert ./tmp/${itemid}.jpg ./tmp/${itemid}.png`); + await fs.promises.unlink(`./tmp/${itemid}.jpg`); + } catch(err) {} + } + else + await exec(`ffmpeg -i ./public/b/${filename} -update 1 -map 0:v -map 0:1 -c copy ./tmp/${itemid}.png`); } + else + await exec(`ffmpeg -i ./public/b/${filename} -update 1 -map 0:v -map 0:1 -c copy ./tmp/${itemid}.png`); + await fs.promises.copyFile(`./tmp/${itemid}.png`, `./public/ca/${itemid}.png`); } - await exec(`convert "${thumb_orig}" -resize "128x128^" -gravity center -crop 128x128+0+0 +repage ./public/t/${insertq}.png`); - await fs.promises.unlink(`./tmp/${insertq}`).catch(_=>{}); + + await exec(`convert "./tmp/${itemid}.png" -resize "128x128^" -gravity center -crop 128x128+0+0 +repage ./public/t/${itemid}.png`); + await fs.promises.unlink(`./tmp/${itemid}.png`); + } catch(err) { - e.reply("\x033>no thumb lol"); - console.error(err); + await fs.promises.copyFile('./mugge.png', `./public/t/${itemid}.png`); } let speed = lib.calcSpeed(size, end); speed = !Number.isFinite(speed) ? "yes" : `${speed.toFixed(2)} Mbit/s`; - // tagger + // autotagger let tag; - if(mime.startsWith("image")) { - const body = { headers: { Authorization: `Basic ${cfg.tagger.btoa}` } }; - const res = await (await fetch(`${cfg.tagger.endpoint}/categories/nsfw_beta?image_url=${cfg.main.url}/b/${filename}`, body)).json(); - if(res) { - tag = (res.result.categories[0].name.en === "safe") ? "sfw" : "nsfw"; + try { + if(mime.startsWith('image') && mime != 'image/gif') { + const body = { headers: { Authorization: `Basic ${cfg.tagger.btoa}` } }; + const res = await (await fetch(`${cfg.tagger.endpoint}/categories/nsfw_beta?image_url=${cfg.main.url}/b/${filename}`, body)).json(); + if(res) + tag = (res.result.categories[0].name.en === 'safe') ? 'sfw' : 'nsfw'; + } + else if(mime.startsWith('audio')) { + tag = 'sfw'; + } + if(tag === 'sfw' || tag === 'nsfw') { await sql("tags_assign").insert({ tag_id: tag === "sfw" ? 1 : 2, - item_id: insertq, - user_id: 7 // user: autotagger + item_id: itemid, + user_id: 7 // user: autotagger (ID: 7) }); } + } catch(err) { + console.error(err); } e.reply([ - `[f0cked] link: ${cfg.main.url}/${insertq} | size: ${lib.formatSize(size)} | speed: ${speed}` + (tag ? ` | ${tag}` : "") + `[f0cked] link: ${cfg.main.url}/${itemid} | size: ${lib.formatSize(size)} | speed: ${speed}` + (tag ? ` | ${tag}` : "") ]); });