This commit is contained in:
2026-09-12 06:01:50 +02:00
parent 2913b03d50
commit 4f6223640f
15 changed files with 991 additions and 159 deletions
+82 -6
View File
@@ -718,7 +718,10 @@ export default router => {
const ratingsRaw = req.cookies.ratings;
const ratingsArr = ratingsRaw ? decodeURIComponent(ratingsRaw).split(/[|,]/).filter(r => ['sfw','nsfw','nsfl','untagged'].includes(r)) : null;
const mime = req.params?.type === 'videos' ? 'video' : (req.url.qs?.mime || null);
const cookieMime = req.cookies?.mime ? decodeURIComponent(req.cookies.mime).trim() : null;
const mime = (typeof req.url.qs?.mime !== 'undefined')
? (req.url.qs.mime || null)
: (cookieMime || (req.params?.type === 'videos' ? 'video' : null));
let excludeIds = [];
if (req.url.qs?.exclude_ids) {
@@ -744,15 +747,27 @@ export default router => {
res.json({
success: true,
items,
videos: items
items: items.map(item => ({
id: item.id,
title: item.title,
slug: (getEnableItemSlugs() && item.slug) ? item.slug : null,
dest: item.dest,
mime: item.mime,
stamp: item.stamp,
username: item.username,
display_name: item.display_name,
username_color: item.username_color,
has_coverart: item.has_coverart,
rating_class: item.rating_class,
xd_score: item.xd_score,
xd_tier: item.xd_tier,
personalized: !!item.personalized
}))
});
} catch (err) {
console.error("[RECOMMENDATIONS] Failed to fetch personalized recommendations:", err);
res.json({
res.status(500).json({
success: false,
items: [],
videos: [],
error: "Failed to load recommendations"
});
}
@@ -804,6 +819,67 @@ export default router => {
return res.json({ success: false, error: "Tracking failed" }, 500);
}
});
group.get(/\/tag-feed$/, async (req, res) => {
try {
const tag = req.url.qs?.tag ? String(req.url.qs.tag).trim() : null;
if (!tag) {
return res.json({ success: false, error: "Tag is required", items: [], total: 0 }, 400);
}
const limit = Math.min(+(req.url.qs?.limit || 20), 50);
const offset = Math.max(+(req.url.qs?.offset || 0), 0);
const order = req.url.qs?.order === 'asc' ? 'asc' : 'desc';
const focusId = req.url.qs?.focus_id ? String(req.url.qs.focus_id).trim() : null;
let mode = req.mode ?? 0;
if (req.url.qs && req.url.qs.mode && ['0', '1', '2', '3'].includes(req.url.qs.mode)) {
mode = parseInt(req.url.qs.mode);
}
const ratingsRaw = req.cookies.ratings;
const ratingsArr = ratingsRaw ? decodeURIComponent(ratingsRaw).split(/[|,]/).filter(r => ['sfw','nsfw','nsfl','untagged'].includes(r)) : null;
const cookieMime = req.cookies?.mime ? decodeURIComponent(req.cookies.mime).trim() : null;
const mime = (typeof req.url.qs?.mime !== 'undefined')
? (req.url.qs.mime || null)
: (cookieMime || null);
const result = await f0cklib.getTagFeedItems({
tag,
order,
offset,
limit,
focus_id: focusId,
mode,
ratings: ratingsArr,
session: !!req.session,
exclude: req.session?.excluded_tags || [],
user_id: req.session?.id,
is_admin: req.session?.admin,
mime
});
const effectiveOffset = result.offset ?? offset;
return res.json({
success: true,
tag,
order,
total: result.total,
offset: effectiveOffset,
limit: result.limit ?? limit,
items: result.items,
hasMore: (effectiveOffset + result.items.length) < result.total
});
} catch (err) {
console.error("[TAG-FEED] Error loading tag feed items:", err);
return res.json({
success: false,
error: "Failed to load tag feed",
items: [],
total: 0
}, 500);
}
});
group.get(/\/orakel\/user$/, async (req, res) => {
try {