import { createClient } from '@supabase/supabase-js'; import slugify from 'slugify'; const sanitizeMediaString = (str) => { const sanitizedString = str.normalize('NFD').replace(/[\u0300-\u036f\u2010—\.\?\(\)\[\]\{\}]/g, '').replace(/\.{3}/g, ''); return slugify(sanitizedString, { replacement: '-', remove: /[#,&,+()$~%.'":*?<>{}]/g, lower: true, }); }; const regionNames = new Intl.DisplayNames(['en'], { type: 'region' }); const getCountryName = (countryCode) => regionNames.of(countryCode.trim()) || countryCode.trim(); const parseCountryField = (countryField) => { if (!countryField) return null; const delimiters = [',', '/', '&', 'and']; let countries = [countryField]; delimiters.forEach(delimiter => { countries = countries.flatMap(country => country.split(delimiter)); }); return countries.map(getCountryName).join(', '); }; const fetchGenreById = async (supabase, genreId) => { const { data, error } = await supabase .from('genres') .select('emoji') .eq('id', genreId) .single(); if (error) { console.error('Error fetching genre:', error); return null; } return data.emoji; }; export default { async fetch(request, env) { const SUPABASE_URL = env.SUPABASE_URL; const SUPABASE_KEY = env.SUPABASE_KEY; const supabase = createClient(SUPABASE_URL, SUPABASE_KEY); const { data, error } = await supabase .from('listens') .select(` track_name, artist_name, listened_at, artists (mbid, genres, country, emoji) `) .order('listened_at', { ascending: false }) .range(0, 1); const headers = { "Content-Type": "application/json", "Cache-Control": "public, s-maxage=360, stale-while-revalidate=1080", }; if (error) { console.error('Error fetching data:', error); return new Response(JSON.stringify({ error: "Failed to fetch the latest track" }), { headers }); } if (data.length === 0) { return new Response(JSON.stringify({ message: "No recent tracks found" }), { headers }); } const scrobbleData = data[0]; const genreEmoji = await fetchGenreById(supabase, scrobbleData.artists.genres); const emoji = scrobbleData.artists.emoji || genreEmoji; return new Response(JSON.stringify({ content: `${emoji || '🎧'} ${scrobbleData.track_name} by ${ scrobbleData.artist_name }`, }), { headers }); } };