diff --git a/public/s/css/f0ck.css b/public/s/css/f0ck.css index eacc4ff..88f73c0 100644 --- a/public/s/css/f0ck.css +++ b/public/s/css/f0ck.css @@ -170,21 +170,27 @@ html[theme="paper"] { --pagination-border-color: rgba(0,0,0,.8) rgba(0,0,0,.65) rgba(0,0,0,.5); --metadata-bg: #fff; --badge-bg: #fff; - --posts-meta-bg: #000000b8; + --posts-meta-bg: #000000db; --badge-sfw: #68a728; --badge-nsfw: #a72828; --badge-tag: #6c6c6c; --scrollbar-color: #6c6c6c; } +html[theme="paper"] body { + color: var(--black); +} + html[theme="paper"] a#next { color: var(--white) !important; -webkit-text-stroke: 1px var(--black); + font-size: 40; } html[theme="paper"] a#prev { color: var(--white) !important; -webkit-text-stroke: 1px var(--black); + font-size: 40; } html[theme="paper"] .about { @@ -197,6 +203,23 @@ html[theme="paper"] .about a:hover { html[theme="paper"] div#posts > a::after { color: var(--white); + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} + +html[theme="paper"] .v0ck_player_controls > input[type="range"][name="volume"]::-webkit-slider-thumb { + background: var(--white); + box-shadow: -100vw 0 0 100vw var(--white); +} + +html[theme="paper"] .v0ck_player_controls > input[type="range"][name="volume"]::-moz-range-thumb { + background: var(--white); + box-shadow: -100vw 0 0 100vw var(--white); +} + +html[theme="paper"] div#posts > a { + box-shadow: 1px 1px 1px black; + border-radius: 5px; } html[theme="paper"] .v0ck_progress_filled { @@ -220,6 +243,11 @@ html[theme="paper"] .embed-responsive-image { background: var(--white); } +html[theme="paper"] .v0ck_player_button svg:hover { + fill: var(--black); + stroke: var(--white); +} + html[theme="atmos"] { --accent: #1fb2b0; --bg: #161618; @@ -334,7 +362,7 @@ div#posts { margin: 0; padding: 0; margin-top: 15px; - margin-bottom: 15px; + margin-bottom: 35px; } @media (max-width: 376px) { @@ -489,9 +517,12 @@ span.f0ck { background-color: var(--nav-link-hover-bg); } -.nav-link[data-toggle="dropdown"]::after { +.nav-link[data-toggle="dropdown"].ddcontent::after { content: "\00a0(" attr(content) ")\00a0\25bc"; } +.nav-link[data-toggle="dropdown"]:not(.ddcontent)::after { + content: "\00a0\25bc"; +} @media (max-width: 768px) { .nav-link[data-toggle="dropdown"]::after { @@ -866,6 +897,10 @@ span#tags { grid-column: 1/4; } +span#tags:empty { + display: none; +} + .badge-success { color: var(--white); background-color: var(--badge-sfw); @@ -1129,3 +1164,26 @@ div#flash.warn { border-bottom: 2px solid #dad55e; color: #777620; } + +/* sfw/nsfw indexpage */ +div#posts > a > p { + height: 100%; + width: 100%; +} +div#posts > a > p:before { + content: ""; + position: absolute; + right: 0; + bottom: 0; + height: 10px; + width: 10px; +} +div#posts > a[data-mode="sfw"] > p:before { + background-color: #5cb85c; +} +div#posts > a[data-mode="nsfw"] > p:before { + background-color: #a72828; +} +div#posts > a[data-mode="null"] > p:before { + background-color: #dcd512; +} diff --git a/public/s/js/admin.js b/public/s/js/admin.js index 46fedf5..41e48a8 100644 --- a/public/s/js/admin.js +++ b/public/s/js/admin.js @@ -22,13 +22,13 @@ const flash = ({ type, msg }) => { flashActive = true; flashContainer.animate( [ { bottom: "-28px" }, { bottom: 0 } ], { - duration: 400, + duration: 500, fill: "both" } ).onfinish = () => setTimeout(() => { flashContainer.animate( [ { bottom: 0 }, { bottom: "-28px" } ], { - duration: 400, + duration: 500, fill: "both" } ).onfinish = () => flashActive = false; diff --git a/src/inc/routes/index.mjs b/src/inc/routes/index.mjs index 92e9876..66dd17c 100644 --- a/src/inc/routes/index.mjs +++ b/src/inc/routes/index.mjs @@ -13,10 +13,12 @@ const allowedMimes = [ "audio", "image", "video", "%" ]; router.get(/^\/(audio\/?|image\/?|video\/?)?(p\/\d+)?$/, async (req, res) => { const tmpmime = (allowedMimes.filter(n => req.url.split[0].startsWith(n))[0] ? req.url.split[0] : ""); const mime = tmpmime + "%"; - + const tmp = req.cookies.session ? "" : "id in (select item_id from tags_assign where tag_id = 1 group by item_id)"; + const total = ( await sql("items") - .where("mime", "like", mime) + .whereRaw(tmp) + .andWhere("items.mime", "like", mime) .count("* as total") )[0].total; @@ -25,9 +27,10 @@ router.get(/^\/(audio\/?|image\/?|video\/?)?(p\/\d+)?$/, async (req, res) => { const offset = (page - 1) * cfg.websrv.eps; const rows = await sql("items") - .select("id", "mime") - .where("mime", "like", mime) - .orderBy("id", "desc") + .select("items.id", "items.mime") + .whereRaw(tmp) + .andWhere("items.mime", "like", mime) + .orderBy("items.id", "desc") .offset(offset) .limit(cfg.websrv.eps); @@ -62,6 +65,7 @@ router.get(/^\/((audio\/|video\/|image\/)?[0-9]+)$/, async (req, res) => { let id = false; let mime = ""; let tmpmime = false; + const tmp = req.cookies.session ? "" : "id in (select item_id from tags_assign where tag_id = 1 group by item_id)"; if(allowedMimes.filter(n => req.url.split[0].startsWith(n))[0] ? req.url.split[0] : "") { mime = tmpmime = req.url.split[0]; @@ -73,18 +77,18 @@ router.get(/^\/((audio\/|video\/|image\/)?[0-9]+)$/, async (req, res) => { } mime += "/%"; - const query = (await sql("items").where("id", id).andWhere("mime", "like", mime).limit(1))?.shift(); + const query = (await sql("items").whereRaw(tmp).andWhere("id", id).andWhere("mime", "like", mime).limit(1))?.shift(); if(!query?.id) return res.redirect("/404"); const tags = await sql("tags_assign").leftJoin("tags", "tags.id", "tags_assign.tag_id").where("tags_assign.item_id", id); - const qmin = await sql("items").select("id").where("mime", "like", mime).orderBy("id").limit(1); - const qmax = await sql("items").select("id").where("mime", "like", mime).orderBy("id", "desc").limit(1); + const qmin = await sql("items").select("id").whereRaw(tmp).andWhere("mime", "like", mime).orderBy("id").limit(1); + const qmax = await sql("items").select("id").whereRaw(tmp).andWhere("mime", "like", mime).orderBy("id", "desc").limit(1); - const qnext = (await sql("items").select("id").where("id", ">", id).andWhere("mime", "like", mime).orderBy("id").limit(3)).reverse(); - const qprev = await sql("items").select("id").where("id", "<", id).andWhere("mime", "like", mime).orderBy("id", "desc").limit(3); + const qnext = (await sql("items").select("id").whereRaw(tmp).andWhere("id", ">", id).andWhere("mime", "like", mime).orderBy("id").limit(3)).reverse(); + const qprev = await sql("items").select("id").whereRaw(tmp).andWhere("id", "<", id).andWhere("mime", "like", mime).orderBy("id", "desc").limit(3); const cheat = qnext.concat([{ id: id }].concat(qprev)).map(e => +e.id); const next = qnext[qnext.length - 1] ? qnext[qnext.length - 1].id : false; diff --git a/src/inc/routes/random.mjs b/src/inc/routes/random.mjs index f57244e..3ee3eab 100644 --- a/src/inc/routes/random.mjs +++ b/src/inc/routes/random.mjs @@ -5,7 +5,8 @@ const allowedMimes = [ "audio", "image", "video", "%" ]; router.get(/^\/random(\/image|\/video|\/audio)?$/, async (req, res) => { const mime = (allowedMimes.filter(n => req.url.split[1]?.startsWith(n))[0] ? req.url.split[1] : "") + "%"; - const rows = await sql("items").select("id").where("mime", "like", mime).orderByRaw("rand()").limit(1); + const tmp = req.cookies.session ? "" : "id in (select item_id from tags_assign where tag_id = 1 group by item_id)"; + const rows = await sql("items").select("id").whereRaw(tmp).andWhere("mime", "like", mime).orderByRaw("rand()").limit(1); res.redirect(`/${req.url.split[1] ? req.url.split[1] + "/" : ""}${rows[0].id}`); }); diff --git a/src/inc/trigger/f0ck.mjs b/src/inc/trigger/f0ck.mjs index d926aeb..73f7b9a 100644 --- a/src/inc/trigger/f0ck.mjs +++ b/src/inc/trigger/f0ck.mjs @@ -4,6 +4,37 @@ import cfg from "../../inc/config.mjs"; import sql from "../sql.mjs"; import lib from "../lib.mjs"; +const cleanTags = async () => { + const tags = await sql("tags").leftJoin("tags_assign", "tags_assign.tag_id", "tags.id").whereNull("tags_assign.item_id"); + if(tags.length === 0) + return 0; + + let deleteTag = sql("tags"); + let dtags = 0; + tags.forEach(tag => { + if(["sfw", "nsfw"].includes(tag.tag.toLowerCase())) + return dtags; + deleteTag = deleteTag.orWhere("id", tag.id); + dtags++; + }); + await deleteTag.del(); + return dtags; +}; + +const countf0cks = async () => { + const tagged = (await sql("items").whereRaw("id in (select item_id from tags_assign group by item_id)").count("* as total"))[0].total; + const untagged = (await sql("items").whereRaw("id not in (select item_id from tags_assign group by item_id)").count("* as total"))[0].total; + const sfw = (await sql("items").whereRaw("id in (select item_id from tags_assign where tag_id = 1 group by item_id)").count("* as total"))[0].total; + const nsfw = (await sql("items").whereRaw("id in (select item_id from tags_assign where tag_id = 2 group by item_id)").count("* as total"))[0].total; + return { + tagged, + untagged, + total: tagged + untagged, + sfw, + nsfw + }; +}; + export default async bot => { return [{ @@ -47,6 +78,14 @@ export default async bot => { e.reply("hay hay patron, hemen!"); exec("sudo systemctl restart f0ck"); break; + case "cleanTags": + const tags = await cleanTags(); + e.reply(tags + " tags removed"); + break; + case "status": + const tmpc = await countf0cks(); + e.reply(`tagged: ${tmpc.tagged}; untagged: ${tmpc.untagged}; sfw: ${tmpc.sfw}; nsfw: ${tmpc.nsfw}; total: ${tmpc.total}`); + break; default: return; } diff --git a/src/inc/trigger/parser.mjs b/src/inc/trigger/parser.mjs index 56f80ea..fd66edb 100644 --- a/src/inc/trigger/parser.mjs +++ b/src/inc/trigger/parser.mjs @@ -52,7 +52,7 @@ export default async bot => { meta = JSON.parse((await exec(`youtube-dl -f "bestvideo[ext=mp4,filesize<${maxfilesize}k][width<2000][height<=1200]+bestaudio[ext=m4a,filesize<${maxfilesize}k]/bestvideo[width<2000][height<=1200]+bestaudio/best[width<2000][height<=1200]/best" --skip-download --dump-json "${link}"`)).stdout); } catch(err) { - //e.reply("(╯° °)╯︵ ┻━┻)"); + e.reply("[error] f0ck has no bock :("); console.error(err); return; } @@ -74,10 +74,12 @@ export default async bot => { let source; if(meta.ext === "mp4") { source = (await exec(`youtube-dl "${link}" --max-filesize ${maxfilesize}k -f "bestvideo[ext=mp4,filesize<${maxfilesize}k][width<2000][height<=1200]+bestaudio[ext=m4a,filesize<${maxfilesize}k]/bestvideo[width<2000][height<=1200]+bestaudio/best[width<2000][height<=1200]/best" --merge-output-format mp4 -o ./tmp/${filename}`)).stdout.trim(); + //change yt-dlp to youtube-dl if problem ^ //console.log("mp4 lol"); } else { source = (await exec(`youtube-dl "${link}" --max-filesize ${maxfilesize}k -f "bestvideo[filesize<${maxfilesize}k][width<2000][height<=1200][ext=${meta.ext}]+bestaudio[filesize<${maxfilesize}k][ext=${meta.ext}]/best" -o ./tmp/${filename}`)).stdout.trim(); + //change yt-dlp to youtube-dl if problem ^ //console.log("alles andere lol"); } //console.log(source); @@ -149,7 +151,7 @@ export default async bot => { speed = !Number.isFinite(speed) ? "yes" : `${speed.toFixed(2)} Mbit/s`; e.reply([ - `link: ${cfg.main.url}/${insertq} | size: ${lib.formatSize(size)} | speed: ${speed}` + `[f0cked] link: ${cfg.main.url}/${insertq} | size: ${lib.formatSize(size)} | speed: ${speed}` ]); }); diff --git a/views/snippets/navbar_admin.html b/views/snippets/navbar_admin.html index 064705b..213c024 100644 --- a/views/snippets/navbar_admin.html +++ b/views/snippets/navbar_admin.html @@ -1,5 +1,5 @@