// functions/unreleased/[sheetId].js const ARTISTS_NDJSON_URL = 'https://assets.artistgrid.cx/artists.ndjson'; const ASSETS_BASE_URL = 'https://assets.artistgrid.cx'; function getSheetId(url) { if (!url) return null; const match = url.match(/spreadsheets\/d\/([a-zA-Z0-9-_]+)/); return match ? match[1] : null; } function normalizeArtistName(name) { return name.toLowerCase().replace(/[^a-z0-9]/g, ''); } async function loadArtistsData() { try { const response = await fetch(ARTISTS_NDJSON_URL); if (!response.ok) throw new Error('Network response was not ok'); const text = await response.text(); return text .trim() .split('\n') .filter((line) => line.trim()) .map((line) => { try { return JSON.parse(line); } catch { return null; } }) .filter((item) => item !== null); } catch (e) { console.error('Failed to load Artists List:', e); return []; } } export async function onRequest(context) { const { request, params, env } = context; const userAgent = request.headers.get('User-Agent') || ''; const isBot = /discordbot|twitterbot|facebookexternalhit|bingbot|googlebot|slurp|whatsapp|pinterest|slackbot|telegrambot|linkedinbot|mastodon|signal|snapchat|redditbot|skypeuripreview|viberbot|linebot|embedly|quora|outbrain|tumblr|duckduckbot|yandexbot|rogerbot|showyoubot|kakaotalk|naverbot|seznambot|mediapartners|adsbot|petalbot|applebot|ia_archiver/i.test( userAgent ); const sheetId = params.sheetId; if (isBot && sheetId) { try { const artists = await loadArtistsData(); const artist = artists.find((a) => getSheetId(a.url) === sheetId); if (artist && artist.name) { const normalizedName = normalizeArtistName(artist.name); const imageUrl = `${ASSETS_BASE_URL}/${normalizedName}.webp`; const pageUrl = new URL(request.url).href; const title = `${artist.name} | Unreleased`; const description = `Stream unreleased music by ${artist.name} on Monochrome`; const metaHtml = `
${description}