import { getStore } from '@netlify/blobs' const emojiMap = (genre, artist) => { const DEFAULT = "π§"; const normalizedArtist = artist?.toLowerCase(); if (normalizedArtist === "afi") return "β΅οΈπ "; if (normalizedArtist === "agalloch") return "ποΈ"; if (normalizedArtist === "augury") return "βοΈ"; if (normalizedArtist === "autopsy") return "π§"; if (normalizedArtist === "bedsore") return "ποΈ"; if (normalizedArtist === "birds in row") return "π¦ π¦π¦’"; if (normalizedArtist === "black flag") return "π΄"; if (normalizedArtist === "blink-182") return "π΅"; if (normalizedArtist === "blood incantation") return "π½"; if (normalizedArtist === "bolt thrower") return "βοΈ" if (normalizedArtist === "bruce springsteen") return "πΊπΈ"; if (normalizedArtist === "carcass") return "π₯Ό"; if (normalizedArtist === "counting crows") return "π¦ββ¬"; if (normalizedArtist === "david bowie") return "π¨π»βπ€"; if (normalizedArtist === "cevoid of thought") return "π«π"; if (normalizedArtist === "drug church") return "πβͺοΈ"; if (normalizedArtist === "fleshwater") return "π€"; if (normalizedArtist === "full of hell & nothing") return "π«¨πΈ"; if (normalizedArtist === "imperial triumphant") return "π"; if (normalizedArtist === "mastodon") return "π"; if (normalizedArtist === "minor threat") return "π¨π»βπ¦²"; if (normalizedArtist === "nothing") return "π³οΈ"; if (normalizedArtist === "panopticon") return "πͺπͺ¦"; if (normalizedArtist === "radiohead") return "π»"; if (normalizedArtist === "taylor swift") return "πΈπΌ"; if (normalizedArtist === "thrice") return "π¨βπ¨π"; if (normalizedArtist === "webbed wing") return "π€‘"; // early return for bad input if (!genre) return DEFAULT; if (genre.includes("death metal") || genre.includes("death-doom")) return "π"; if (genre.includes("black metal") || genre.includes("blackgaze")) return "πͺ¦"; if (genre.includes("metal")) return "π€"; if (genre.includes("emo") || genre.includes("blues")) return "π’"; if (genre.includes("grind") || genre.includes("powerviolence")) return "π«¨"; if ( genre.includes("country") || genre.includes("americana") || genre.includes("bluegrass") || genre.includes("folk") || genre.includes("songwriter") ) return "πͺ"; if (genre.includes("post-punk")) return "π"; if (genre.includes("dance-punk")) return "πͺ©"; if (genre.includes("punk") || genre.includes("hardcore")) return "β"; if (genre.includes("hip hop")) return "π€"; if (genre.includes("progressive") || genre.includes("experimental")) return "π€"; if (genre.includes("jazz")) return "πΊ"; if (genre.includes("psychedelic")) return "π"; if (genre.includes("dance") || genre.includes("electronic")) return "π»"; if (genre.includes("ambient")) return "π€«"; if ( genre.includes("alternative") || genre.includes("rock") || genre.includes("shoegaze") || genre.includes("screamo") || genre.includes("grunge") ) return "πΈ"; return DEFAULT; }; export default async () => { const TV_KEY = Netlify.env.get("API_KEY_TRAKT"); const MUSIC_KEY = Netlify.env.get("API_KEY_LASTFM"); const scrobbles = getStore('scrobbles') const headers = { "Content-Type": "application/json", "Cache-Control": "public, s-maxage=360, stale-while-revalidate=1080", }; const traktRes = await fetch("https://api.trakt.tv/users/cdransf/watching", { headers: { "Content-Type": "application/json", "trakt-api-version": 2, "trakt-api-key": TV_KEY, }, }) .then((data) => { if (data.ok) return data.json(); throw new Error('Something went wrong with the Trakt endpoint.'); }) .catch(err => { console.log(err); return {} }); if (Object.keys(traktRes).length) { if (traktRes["type"] === "episode") { return new Response(JSON.stringify({ content: `πΊ <a href="https://trakt.tv/shows/${traktRes["show"]["ids"]["slug"]}">${traktRes["show"]["title"]}</a> β’ <a href="https://trakt.tv/shows/${traktRes["show"]["ids"]["slug"]}/seasons/${traktRes["episode"]["season"]}/episodes/${traktRes["episode"]["number"]}">${traktRes["episode"]["title"]}</a>`, }), { headers } ) } if (traktRes["type"] === "movie") { return new Response(JSON.stringify({ content: `π₯ <a href="https://trakt.tv/movies/${traktRes["movie"]["ids"]["slug"]}">${traktRes["movie"]["title"]}</a>`, }), { headers } ) } } const scrobbleData = await scrobbles.get('window', { type: 'json'}) return new Response(JSON.stringify({ content: `${emojiMap( scrobbleData['genre'], scrobbleData['artist'] )} ${scrobbleData['track']} by <a href="${scrobbleData['url']}">${ scrobbleData['artist'] }</a>`, }), { headers } ) }; export const config = { cache: "manual", path: "/api/now-playing" };