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}` : "") ]); });