This commit is contained in:
2026-09-10 00:07:22 +02:00
parent 43ff87ed62
commit 73ffe02bbb
12 changed files with 1327 additions and 275 deletions
+99
View File
@@ -408,6 +408,105 @@ export default (router, tpl) => {
return res.reply({ body });
}
const isOnara = !!(cfg.onara !== undefined ? cfg.onara : cfg.websrv?.onara);
if (mode === 'item' && isOnara) {
const itemHtml = tpl.render('ajax-item', data, req);
const isRandom = req.cookies.random_mode === '1';
let itemPage = 1;
if (req.params.page) {
itemPage = parseInt(req.params.page, 10) || 1;
} else if (!isRandom && data.item) {
try {
itemPage = await f0cklib.getItemPage({
targetItemId: data.item.id,
targetItemPinned: data.item.is_pinned,
user: req.params.user,
tag: reqTag,
mime: req.cookies.mime !== undefined ? req.cookies.mime : (req.query?.mime || req.url.qs?.mime || req.params.mime || null),
hall: req.params.hall,
fav: req.params.mode == 'favs',
mode: req.mode,
ratings: (() => { if (req.mode === 2 || req.mode === 3) return null; const r = req.cookies.ratings; return r ? decodeURIComponent(r).split(/[|,]/).filter(x => ['sfw','nsfw','nsfl','untagged'].includes(x)) : null; })(),
session: req.session,
user_id: req.session?.id,
is_admin: req.session?.admin,
exclude: req.session ? (req.session.excluded_tags || []) : [],
strict: !!(req.query?.strict || req.url.qs?.strict || req.session?.strict_mode),
minXdScore: req.url.qs?.min_xd !== undefined ? +req.url.qs.min_xd : (req.session?.min_xd_score || 0),
tagger: req.url.qs?.tagger || null
});
} catch (err) {
console.error('[ONARA] getItemPage error:', err);
itemPage = 1;
}
}
let gridData = await f0cklib.getf0cks({
user: req.params.user,
tag: reqTag,
mime: req.cookies.mime !== undefined ? req.cookies.mime : (req.query?.mime || req.url.qs?.mime || req.params.mime || null),
page: itemPage,
hall: req.params.hall,
fav: req.params.mode == 'favs',
mode: req.mode,
ratings: (() => { if (req.mode === 2 || req.mode === 3) return null; const r = req.cookies.ratings; return r ? decodeURIComponent(r).split(/[|,]/).filter(x => ['sfw','nsfw','nsfl','untagged'].includes(x)) : null; })(),
session: req.session,
user_id: req.session?.id,
is_admin: req.session?.admin,
exclude: req.session ? (req.session.excluded_tags || []) : [],
url: decodeURIComponent(req.url.pathname || req.url),
strict: !!(req.query?.strict || req.url.qs?.strict || req.session?.strict_mode),
explicitStrict: !!(req.query?.strict || req.url.qs?.strict),
random: isRandom,
minXdScore: req.url.qs?.min_xd !== undefined ? +req.url.qs.min_xd : (req.session?.min_xd_score || 0),
lang: req.lang,
tagger: req.url.qs?.tagger || null
});
if (!gridData || !gridData.success) {
gridData = {
items: [],
pagination: { start: 1, end: 1, current: 1, page: 1, cheat: [1], prev: null, next: null },
total: 0,
success: true,
link: { main: '/', path: 'p/', suffix: '' },
tmp: {}
};
}
const activeId = data.item ? data.item.id : req.params.itemid;
const activeSlug = data.item ? data.item.slug : null;
// Mark the active item in the grid for instant highlight
let foundInGrid = false;
if (Array.isArray(gridData.items)) {
for (const it of gridData.items) {
if ((activeSlug && it.slug === activeSlug) || (it.id === activeId)) {
it.is_onara_active = true;
foundInGrid = true;
} else {
it.is_onara_active = false;
}
}
// If not in first page of feed, unshift it so thumbnail is present in background
if (!foundInGrid && data.item) {
gridData.items.unshift({ ...data.item, is_onara_active: true });
}
}
gridData.session = data.session;
gridData.is_onara_item = true;
gridData.onara_item_html = itemHtml;
gridData.item = data.item;
gridData.page_meta = data.page_meta;
gridData.hidePagination = false;
const body = tpl.render('index', gridData, req);
console.log(`[${new Date().toISOString()}] [ROUTE] Render complete (onara direct item) in ${Date.now() - tRenderStart}ms. Total route time: ${Date.now() - tRouteStart}ms`);
return res.reply({ body });
}
const body = tpl.render(mode, data, req);
console.log(`[${new Date().toISOString()}] [ROUTE] Render complete in ${Date.now() - tRenderStart}ms. Total route time: ${Date.now() - tRouteStart}ms`);