Update src/libpoketube/init/pages-404-and-main.js

This commit is contained in:
ashley 2025-11-15 20:36:58 +01:00
parent 49c25ddb1a
commit d6b90620ea

View File

@ -36,82 +36,81 @@ function getJson(str) {
module.exports = function (app, config, renderTemplate) { module.exports = function (app, config, renderTemplate) {
app.get("/app", async function (req, res) { app.get("/app", async function (req, res) {
const { fetch } = await import("undici"); const { fetch } = await import("undici");
if (req.useragent && req.useragent.isMobile && req.query.tab !== "search") {
// redirect mobiles to /app?tab=search
if (req.useragent && req.useragent.isMobile) {
return res.redirect("/app?tab=search"); return res.redirect("/app?tab=search");
} }
// no more trending fetch
let tab = ""; let tab = "";
if (req.query.tab) { if (req.query.tab) {
tab = `/?type=${capitalizeFirstLetter(req.query.tab)}`; tab = `/?type=${capitalizeFirstLetter(req.query.tab)}`;
} }
const invtrend = await fetch(`${config.invapi}/trending${tab}`, { // t is now empty string
headers: { "User-Agent": config.useragent }, const t = " ";
});
const t = getJson(await invtrend.text());
const p = "";
const p = ""
let j = { results: [], meta: {} }; let j = { results: [], meta: {} };
// Small helper to coerce various payload shapes into { results: [] }
const normalizeSearchData = (data) => { const normalizeSearchData = (data) => {
if (!data) return { results: [] }; if (!data) return { results: [] };
if (Array.isArray(data)) return { results: data }; if (Array.isArray(data)) return { results: data };
if (Array.isArray(data.results)) return { results: data.results, meta: data.meta || {} }; if (Array.isArray(data.results)) return { results: data.results, meta: data.meta || {} };
if (Array.isArray(data.items)) return { results: data.items, meta: data.meta || {} }; if (Array.isArray(data.items)) return { results: data.items, meta: data.meta || {} };
if (Array.isArray(data.videos)) return { results: data.videos, meta: data.meta || {} }; if (Array.isArray(data.videos)) return { results: data.videos, meta: data.meta || {} };
return { results: [], meta: { note: "unrecognized search payload shape" } }; return { results: [], meta: { note: "unrecognized search payload shape" } };
}; };
try { try {
// Accept multiple query aliases; trim to avoid spaces-only values.
const query = const query =
(typeof req.query.mobilesearch === "string" && req.query.mobilesearch.trim()) ?? (typeof req.query.mobilesearch === "string" && req.query.mobilesearch.trim()) ??
(typeof req.query.query === "string" && req.query.query.trim()) ?? (typeof req.query.query === "string" && req.query.query.trim()) ??
(typeof req.query.q === "string" && req.query.q.trim()) ?? (typeof req.query.q === "string" && req.query.q.trim()) ??
""; "";
// Keep "0" valid
const continuation = (req.query.continuation ?? "1").toString(); const continuation = (req.query.continuation ?? "1").toString();
if (query) { if (query) {
const searchUrl = `${config.invapi}/search?q=${encodeURIComponent(query)}&type=video&page=${encodeURIComponent(continuation)}`; const searchUrl = `${config.invapi}/search?q=${encodeURIComponent(query)}&type=video&page=${encodeURIComponent(
continuation
)}`;
const res = await fetch(searchUrl, { const resSearch = await fetch(searchUrl, {
headers: { "User-Agent": config.useragent }, headers: { "User-Agent": config.useragent },
}); });
if (!res.ok) { if (!resSearch.ok) {
j = { j = {
results: [], results: [],
error: true, error: true,
meta: { status: res.status, statusText: res.statusText, url: searchUrl }, meta: { status: resSearch.status, statusText: resSearch.statusText, url: searchUrl },
}; };
console.error("[mobilesearch] HTTP error", j.meta); console.error("[mobilesearch] HTTP error", j.meta);
} else { } else {
const ct = res.headers.get("content-type") || ""; const ct = resSearch.headers.get("content-type") || "";
let data; let data;
if (ct.includes("application/json")) { if (ct.includes("application/json")) {
data = await res.json(); data = await resSearch.json();
} else { } else {
const txt = await res.text(); const txt = await resSearch.text();
data = await Promise.resolve(getJson(txt)); data = await Promise.resolve(getJson(txt));
} }
j = normalizeSearchData(data); j = normalizeSearchData(data);
} }
} else { } else {
j = { results: [], error: true, meta: { reason: "missing query" } }; j = { results: [], error: true, meta: { reason: "missing query" } };
console.warn("[mobilesearch] Missing query parameter (mobilesearch/q/query)"); console.warn("[mobilesearch] Missing query param (mobilesearch/q/query)");
} }
// expose continuation back to the template even if not provided
j.meta = { ...(j.meta || {}), continuation }; j.meta = { ...(j.meta || {}), continuation };
} catch (err) { } catch (err) {
j = { j = {
results: [], results: [],
error: true, error: true,
meta: { reason: "exception", message: String(err && err.message || err) }, meta: { reason: "exception", message: String((err && err.message) || err) },
}; };
console.error("[mobilesearch] Exception:", err); console.error("[mobilesearch] Exception:", err);
} }
@ -121,14 +120,16 @@ module.exports = function (app, config, renderTemplate) {
isMobile: req.useragent.isMobile, isMobile: req.useragent.isMobile,
p, p,
mobilesearch: req.query.mobilesearch, mobilesearch: req.query.mobilesearch,
q:req.query.q, q: req.query.q,
inv: t, inv: t,
turntomins, turntomins,
continuation: req.query.continuation, continuation: req.query.continuation,
j, j,
}); });
}); });
app.get("/:v*?", async function (req, res) { app.get("/:v*?", async function (req, res) {
const uaos = req.useragent.os; const uaos = req.useragent.os;