initial import: random background api

This commit is contained in:
shumengya
2026-03-29 10:58:33 +08:00
commit f68e19a3bd
62 changed files with 985 additions and 0 deletions

22
functions/api/list.js Normal file
View File

@@ -0,0 +1,22 @@
import { getVariantPayload, loadManifest } from '../lib/background.js';
export async function onRequestGet(context) {
const { request } = context;
const manifest = await loadManifest(request);
return Response.json(
{
generated_at: manifest?.generated_at || null,
variants: {
mobile: summarizeVariant(manifest, 'mobile'),
desktop: summarizeVariant(manifest, 'desktop'),
},
},
{ headers: { 'Cache-Control': 'no-store, max-age=0', 'Access-Control-Allow-Origin': '*' } },
);
}
function summarizeVariant(manifest, variant) {
const { folder, images } = getVariantPayload(manifest, variant);
return { folder, count: images.length, images };
}

36
functions/api/random.js Normal file
View File

@@ -0,0 +1,36 @@
import { buildAssetUrl, detectVariant, getVariantPayload, loadManifest, pickRandom } from '../lib/background.js';
export async function onRequestGet(context) {
const { request } = context;
const url = new URL(request.url);
const format = (url.searchParams.get('format') || 'redirect').toLowerCase();
const manifest = await loadManifest(request);
const variant = detectVariant(request);
const { folder, images } = getVariantPayload(manifest, variant);
if (!images.length) {
return Response.json(
{ error: 'no images available', variant, folder },
{ status: 404, headers: { 'Cache-Control': 'no-store, max-age=0', 'Access-Control-Allow-Origin': '*' } },
);
}
const filename = pickRandom(images);
const assetUrl = buildAssetUrl(request, folder, filename);
if (format === 'json') {
return Response.json(
{ variant, folder, filename, url: assetUrl, count: images.length },
{ headers: { 'Cache-Control': 'no-store, max-age=0', 'Access-Control-Allow-Origin': '*' } },
);
}
return new Response(null, {
status: 302,
headers: {
Location: assetUrl,
'Cache-Control': 'no-store, max-age=0',
'Access-Control-Allow-Origin': '*',
},
});
}