ai generated solutions to our ai generated problems

This commit is contained in:
2026-05-27 15:13:40 +01:00
parent ac0dcf7522
commit 4ab411a853
3 changed files with 62 additions and 15 deletions
+18 -2
View File
@@ -129,7 +129,7 @@ const CSP_DIRECTIVES = [
"style-src 'self'",
"style-src-elem 'self'",
"style-src-attr 'unsafe-inline'",
"img-src 'self' data: blob: https://*.basemaps.cartocdn.com https://basemaps.cartocdn.com",
"img-src 'self' data: blob: https://*.basemaps.cartocdn.com https://basemaps.cartocdn.com https://lastfm.freetls.fastly.net https://*.lastfm.freetls.fastly.net",
"font-src 'self' data:",
"connect-src 'self' https://challenges.cloudflare.com",
"frame-src https://challenges.cloudflare.com",
@@ -204,6 +204,22 @@ function todayKey() {
return new Date().toISOString().slice(0, 10)
}
function lastfmImage(track) {
const images = Array.isArray(track.image) ? track.image : []
const image = [...images].reverse().find((item) => item?.['#text'])
const url = image?.['#text'] || ''
if (!url) return ''
try {
const parsed = new URL(url)
if (parsed.protocol !== 'https:') return ''
if (parsed.hostname !== 'lastfm.freetls.fastly.net' && !parsed.hostname.endsWith('.lastfm.freetls.fastly.net')) return ''
return parsed.toString()
} catch {
return ''
}
}
function normalizeLastfmTrack(track) {
const artist = track?.artist?.['#text'] || track?.artist?.name || ''
const name = track?.name || ''
@@ -215,7 +231,7 @@ function normalizeLastfmTrack(track) {
name,
album: track?.album?.['#text'] || '',
url: track?.url || '',
image: '',
image: lastfmImage(track),
played_at: track?.date?.uts ? Number(track.date.uts) : null,
}
}
+27 -12
View File
@@ -1908,18 +1908,7 @@ function SongOfDayCard({ onRetry, songOfDay }) {
return (
<article className="mt-3 rounded-lg border border-border bg-fury-white/88 p-3 shadow-sm backdrop-blur">
<div className="flex items-center gap-3">
<div className="grid h-14 w-14 shrink-0 place-items-center overflow-hidden rounded-md border border-border bg-surface">
{track?.image ? (
<img
alt=""
className="h-full w-full object-cover"
loading="lazy"
src={track.image}
/>
) : (
<span className="text-lg font-bold text-fury-cyan"></span>
)}
</div>
<SongArtwork src={track?.image} />
<div className="min-w-0 flex-1">
<p className="text-xs font-semibold uppercase tracking-wide text-fury-cyan">
Song of the day
@@ -1960,6 +1949,32 @@ function SongOfDayCard({ onRetry, songOfDay }) {
)
}
function SongArtwork({ src }) {
const [failed, setFailed] = useState(false)
const showImage = src && !failed
useEffect(() => {
setFailed(false)
}, [src])
return (
<div className="grid h-14 w-14 shrink-0 place-items-center overflow-hidden rounded-md border border-border bg-surface">
{showImage ? (
<img
alt=""
className="h-full w-full object-cover"
loading="lazy"
onError={() => setFailed(true)}
referrerPolicy="no-referrer"
src={src}
/>
) : (
<span className="text-lg font-bold text-fury-cyan"></span>
)}
</div>
)
}
function LandingOverview({ teams, matches, navigate }) {
const activeTeams = teams.slice(0, 4)
const totalPlayers = matches.reduce((sum, match) => sum + Number(match.player_count || 0), 0)
+17 -1
View File
@@ -70,13 +70,29 @@ function normalizeLastfmTrack(track) {
const name = track?.name || ''
if (!artist || !name) return null
const images = Array.isArray(track.image) ? track.image : []
const image = [...images].reverse().find((item) => item?.['#text'])
let imageUrl = ''
try {
const parsed = new URL(image?.['#text'] || '')
if (
parsed.protocol === 'https:' &&
(parsed.hostname === 'lastfm.freetls.fastly.net' ||
parsed.hostname.endsWith('.lastfm.freetls.fastly.net'))
) {
imageUrl = parsed.toString()
}
} catch {
imageUrl = ''
}
return {
id: `${artist.toLowerCase()}::${name.toLowerCase()}`,
artist,
name,
album: track?.album?.['#text'] || '',
url: track?.url || '',
image: '',
image: imageUrl,
played_at: track?.date?.uts ? Number(track.date.uts) : null,
}
}