// functions/userplaylist/[id].js // note that, since this NEEDS a playlist to yknow, be public, this only works for PUBLIC playlists (and you will need an account) 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/i.test( userAgent ); const playlistId = params.id; if (isBot && playlistId) { try { // Try public_playlists collection first (for shared playlists) let pbUrl = `https://monodb.samidy.com/api/collections/public_playlists/records?filter=(uuid='${playlistId}')`; let response = await fetch(pbUrl); // Fall back to user_playlists for private/owned playlists if (!response.ok) { pbUrl = `https://monodb.samidy.com/api/collections/user_playlists/records/${playlistId}`; response = await fetch(pbUrl); } if (response.ok) { let playlist = await response.json(); // Handle public_playlists response (returns { items: [...] }) if (playlist.items && Array.isArray(playlist.items)) { if (playlist.items.length > 0) { playlist = playlist.items[0]; } else { throw new Error('Playlist not found'); } } if (!playlist) throw new Error('Playlist not found'); const title = playlist.name || playlist.title || playlist.playlist_name || 'User Playlist'; let tracks = []; try { tracks = Array.isArray(playlist.tracks) ? playlist.tracks : playlist.tracks ? JSON.parse(playlist.tracks) : []; } catch (e) { console.error('Failed to parse tracks JSON', e); } const trackCount = tracks.length; const playlistDescription = playlist.description || ''; const description = playlistDescription ? `${playlistDescription}\n${trackCount} Tracks • Listen on Monochrome` : `User Playlist • ${trackCount} Tracks\nListen on Monochrome`; let imageUrl = 'https://monochrome.samidy.com/assets/appicon.png'; const coverUrl = playlist.cover || playlist.image || playlist.playlist_cover || ''; if (coverUrl) { if (coverUrl.startsWith('http')) { imageUrl = coverUrl; } else { imageUrl = `https://monodb.samidy.com/api/files/${playlist.collectionId}/${playlist.id}/${coverUrl}`; } } else if ( tracks.length > 0 && typeof tracks[0] === 'object' && tracks[0].album && tracks[0].album.cover ) { const cover = tracks[0].album.cover; imageUrl = `https://resources.tidal.com/images/${cover.replace(/-/g, '/')}/1280x1280.jpg`; } const pageUrl = new URL(request.url).href; const metaHtml = `
${description}