From 90a86133dbc21680394a9aceef8dfbbf77f724a1 Mon Sep 17 00:00:00 2001 From: Flummi Date: Wed, 5 Jan 2022 20:21:50 +0100 Subject: [PATCH] webp lol --- debug/thumbnailer.mjs | 46 +++++++++++++++++++++------------- public/s/css/f0ck.css | 2 +- public/s/js/admin.js | 2 +- src/inc/routes/inc/f0cklib.mjs | 11 +++++--- src/inc/trigger/f0ck.mjs | 6 +++-- src/inc/trigger/parser.mjs | 24 ++++++++++-------- src/index.mjs | 2 +- views/admin/search.html | 2 +- views/index.html | 2 +- views/item.html | 6 ++--- views/settings.html | 2 +- views/snippets/navbar.html | 2 +- 12 files changed, 63 insertions(+), 44 deletions(-) diff --git a/debug/thumbnailer.mjs b/debug/thumbnailer.mjs index 87a1d9e..c9a2ec4 100644 --- a/debug/thumbnailer.mjs +++ b/debug/thumbnailer.mjs @@ -1,8 +1,6 @@ -import cfg from "../src/inc/config.mjs"; import sql from "../src/inc/sql.mjs"; -import { promises as fs } from "fs"; +import 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) => { @@ -15,9 +13,13 @@ const exec = cmd => new Promise((resolve, reject) => { }); const _args = process.argv.slice(2); -const _itemid = +_args[0] || 1; +const _itemid = +_args[0] || 0; -const items = await sql('items').where('id', _itemid);//.where('mime', 'like', 'audio/%'); +let items; +if(_itemid > 0) + items = await sql('items').where('id', _itemid); +else + items = await sql('items').orderBy('id', 'asc')/*.whereNot('src', 'like', '%soundcloud%')*/.where('mime', 'like', 'audio/%'); let count = 1; let total = items.length; @@ -25,36 +27,44 @@ for(let item of items) { const itemid = item.id; const filename = item.dest; const mime = item.mime; + const link = item.src; 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(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.stat(`./tmp/${itemid}.jpg`)).size; - if(size >= 0) + const size = (await fs.promises.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) {} + await exec(`convert ./tmp/${itemid}.jpg -resize 50% ./public/ca/${itemid}.webp`); + } + } catch(err) { + //console.log(err); + } } - else + else { await exec(`ffmpeg -i ./public/b/${filename} -update 1 -map 0:v -map 0:1 -c copy ./tmp/${itemid}.png`); + await exec(`convert ./tmp/${itemid}.png ./public/ca/${itemid}.webp`); + } } - else + 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 ./public/ca/${itemid}.webp`); + } } - 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`); - + await exec(`convert "./tmp/${itemid}.png" -resize "128x128^" -gravity center -crop 128x128+0+0 +repage ./public/t/${itemid}.webp`); + await fs.promises.unlink(`./tmp/${itemid}.png`).catch(err => {}); + await fs.promises.unlink(`./tmp/${itemid}.jpg`).catch(err => {}); } catch(err) { - await fs.copyFile('./mugge.png', `./public/t/${itemid}.png`); + //console.log(err); + await exec(`convert ./mugge.png ./public/t/${itemid}.webp`); } console.log(`current: ${itemid} (${count} / ${total})`); count++; diff --git a/public/s/css/f0ck.css b/public/s/css/f0ck.css index af15f64..56f1e2a 100644 --- a/public/s/css/f0ck.css +++ b/public/s/css/f0ck.css @@ -1376,7 +1376,7 @@ table.table thead tr { table.table th, table.table td { padding: 7px 15px; } -table.table tbody tr:nth-of-type(even) { +table.table tbody tr:nth-of-type(odd) { background-color: var(--badge-tag); } diff --git a/public/s/js/admin.js b/public/s/js/admin.js index d7b2b89..d347027 100644 --- a/public/s/js/admin.js +++ b/public/s/js/admin.js @@ -217,7 +217,7 @@ const flash = ({ type, msg }) => { a.setAttribute('flow', 'down'); const img = document.createElement('img'); - img.src = `/t/${f.avatar}.png`; + img.src = `/t/${f.avatar}.webp`; img.style.height = "32px"; img.style.width = "32px"; diff --git a/src/inc/routes/inc/f0cklib.mjs b/src/inc/routes/inc/f0cklib.mjs index b998890..1e98f6d 100644 --- a/src/inc/routes/inc/f0cklib.mjs +++ b/src/inc/routes/inc/f0cklib.mjs @@ -201,11 +201,11 @@ export default { .select("tags_assign.item_id", "tags.tag") .leftJoin("tags_assign", "tags_assign.tag_id", "tags.id") .where("tags.tag", "ilike", "%"+tag+"%") - .groupBy("tags_assign.item_id", "tags.tag") + .groupBy("tags.tag", "tags_assign.item_id") .as("st"), "st.item_id", "items.id" ) - .groupBy('items.id', 'st.item_id', 'st.tag'); + .groupBy('st.tag', 'st.item_id', 'items.id'); } else items = items.groupBy('items.id'); @@ -215,6 +215,9 @@ export default { items = items.andWhere("items.mime", "ilike", mime + "/%"); items = await items; + + if(tag) + items = items.filter((v, i, s) => i === s.findIndex(t => t.id === v.id)); const item = items.findIndex(i => i.id === itemid); const actitem = items[item]; @@ -227,7 +230,7 @@ export default { } const tags = await lib.getTags(itemid); - const cheat = items.slice(Math.max(0, item - 3), item + 4).map(i => i.id); + const cheat = [...new Set(items.slice(Math.max(0, item - 3), item + 4).map(i => i.id))]; const link = lib.genLink({ user, tag, mime, type: o.fav ? 'favs' : 'f0cks' }); const favorites = await sql('favorites') .select('user.user', 'user_options.avatar') @@ -249,7 +252,7 @@ export default { short: url.parse(actitem.src).hostname, }, thumbnail: `${cfg.websrv.paths.thumbnails}/${actitem.id}.png`, - coverart: `${cfg.websrv.paths.coverarts}/${actitem.id}.png`, + coverart: `${cfg.websrv.paths.coverarts}/${actitem.id}.webp`, dest: `${cfg.websrv.paths.images}/${actitem.dest}`, mime: actitem.mime, size: lib.formatSize(actitem.size), diff --git a/src/inc/trigger/f0ck.mjs b/src/inc/trigger/f0ck.mjs index 1177a8d..a1ca85d 100644 --- a/src/inc/trigger/f0ck.mjs +++ b/src/inc/trigger/f0ck.mjs @@ -51,13 +51,15 @@ export default async bot => { case "stats": const dirs = { b: await fs.readdir("./public/b"), - t: await fs.readdir("./public/t") + t: await fs.readdir("./public/t"), + ca: await fs.readdir("./public/ca") }; const sizes = { b: lib.formatSize((await Promise.all(dirs.b.map(async file => (await fs.stat(`./public/b/${file}`)).size))).reduce((a, b) => b + a)), t: lib.formatSize((await Promise.all(dirs.t.map(async file => (await fs.stat(`./public/t/${file}`)).size))).reduce((a, b) => b + a)), + ca: lib.formatSize((await Promise.all(dirs.ca.map(async file => (await fs.stat(`./public/ca/${file}`)).size))).reduce((a, b) => b + a)), }; - return e.reply(`${dirs.b.length} f0cks: ${sizes.b}, ${dirs.t.length} thumbnails: ${sizes.t}`); + return e.reply(`${dirs.b.length} f0cks: ${sizes.b}, ${dirs.t.length} thumbnails: ${sizes.t}, ${dirs.ca.length} coverarts: ${sizes.ca}`); case "limit": return e.reply(`up to ${lib.formatSize(cfg.main.maxfilesize)} (${lib.formatSize(cfg.main.maxfilesize * 2.5)} for admins)`); case "thumb": diff --git a/src/inc/trigger/parser.mjs b/src/inc/trigger/parser.mjs index 3852790..8d09362 100644 --- a/src/inc/trigger/parser.mjs +++ b/src/inc/trigger/parser.mjs @@ -142,24 +142,28 @@ export default async bot => { try { await exec(`wget "${cover}" -O ./tmp/${itemid}.jpg`); const size = (await fs.promises.stat(`./tmp/${itemid}.jpg`)).size; - if(size >= 0) + if(size >= 0) { await exec(`convert ./tmp/${itemid}.jpg ./tmp/${itemid}.png`); - await fs.promises.unlink(`./tmp/${itemid}.jpg`); + await exec(`convert ./tmp/${itemid}.jpg -resize 50% ./public/ca/${itemid}.webp`); + } } catch(err) {} } - else + else { await exec(`ffmpeg -i ./public/b/${filename} -update 1 -map 0:v -map 0:1 -c copy ./tmp/${itemid}.png`); + await exec(`convert ./tmp/${itemid}.png ./public/ca/${itemid}.webp`); + } } - else + 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 ./tmp/${itemid}.png ./public/ca/${itemid}.webp`); + } } - - 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`); - + + await exec(`convert "./tmp/${itemid}.png" -resize "128x128^" -gravity center -crop 128x128+0+0 +repage ./public/t/${itemid}.webp`); + await fs.promises.unlink(`./tmp/${itemid}.png`).catch(err => {}); + await fs.promises.unlink(`./tmp/${itemid}.jpg`).catch(err => {}); } catch(err) { - await fs.promises.copyFile('./mugge.png', `./public/t/${itemid}.png`); + await exec(`convert ./mugge.png ./public/t/${itemid}.webp`); } let speed = lib.calcSpeed(size, end); diff --git a/src/index.mjs b/src/index.mjs index d797f6f..b6c0ac3 100644 --- a/src/index.mjs +++ b/src/index.mjs @@ -65,7 +65,7 @@ import flummpress from "flummpress"; if(req.cookies.session) { const user = await sql("user_sessions") // get user - .select("user.id", "user.login", "user.user", "user.level", "user_sessions.id as sess_id", "user_options.mode", "user_options.theme", "user_options.avatar") + .select("user.id", "user.login", "user.user", "user.level", "user_sessions.id as sess_id", "user_options.*") .where("user_sessions.session", lib.md5(req.cookies.session)) .leftJoin("user", "user.id", "user_sessions.user_id") .leftJoin("user_options", "user_options.user_id", "user_sessions.user_id") diff --git a/views/admin/search.html b/views/admin/search.html index d20bf6b..956453b 100644 --- a/views/admin/search.html +++ b/views/admin/search.html @@ -15,7 +15,7 @@ @each(result as line) - + {{ line.id }} {{ line.tag }} {{ line.username }} diff --git a/views/index.html b/views/index.html index 811d88f..0563074 100644 --- a/views/index.html +++ b/views/index.html @@ -4,7 +4,7 @@ @if(tmp.tag)

tag: @if(session){!! tmp.tag.toLowerCase() !!}@else{!! tmp.tag.toLowerCase() !!}@endif@if(tmp.mime) ({{ tmp.mime }}s)@else (all)@endif

@endif
@each(items as item) -

+

@endeach
diff --git a/views/item.html b/views/item.html index c007f9b..a0da280 100644 --- a/views/item.html +++ b/views/item.html @@ -45,7 +45,7 @@
- {{ item.id }} + {{ item.id }} @if(session) ({{ user.name }}) @@ -67,7 +67,7 @@ @if(typeof item.tags !== "undefined") @each(item.tags as tag) - {!! tag.tag !!}@if(session) ×@endif + {!! tag.tag !!}@if(session) ×@endif @endeach @endif @@ -78,7 +78,7 @@ @if(item.favorites.length && session) @each(item.favorites as fav) - + @endeach @endif diff --git a/views/settings.html b/views/settings.html index ee48a33..a816547 100644 --- a/views/settings.html +++ b/views/settings.html @@ -1,6 +1,6 @@ @include(snippets/header)

Settings

-@if(session.avatar)@endif +@if(session.avatar)@endif

Account

diff --git a/views/snippets/navbar.html b/views/snippets/navbar.html index 64251c1..da67e28 100644 --- a/views/snippets/navbar.html +++ b/views/snippets/navbar.html @@ -5,7 +5,7 @@