const emojiMap = (genre, artist) => { const DEFAULT = "🎧"; if (artist === "Augury") return "β˜„οΈ"; if (artist === "Autopsy") return "🧟"; if (artist === "Black Flag") return "🏴"; if (artist === "Bruce Springsteen") return "πŸ‡ΊπŸ‡Έ"; if (artist === "Carcass") return "πŸ₯Ό"; if (artist === "Counting Crows") return "πŸ¦β€β¬›"; if (artist === "David Bowie") return "πŸ‘¨πŸ»β€πŸŽ€"; if (artist === "Full of Hell & Nothing") return "🫨🎸"; if (artist === "Imperial Triumphant") return "🎭"; if (artist === "Mastodon") return "πŸ‹"; if (artist === "Minor Threat") return "πŸ‘¨πŸ»β€πŸ¦²"; if (artist === "Taylor Swift") return "πŸ‘ΈπŸΌ"; // early return for bad input if (!genre) return DEFAULT; if (genre.includes("death metal")) 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") ) 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 headers = { headers: { "Content-Type": "application/json", "Cache-Control": "public, max-age=0, must-revalidate", "Netlify-CDN-Cache-Control": "public, max-age=0, stale-while-revalidate=210", }, }; 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.body) return data.json(); return {}; }) .catch(); if (Object.keys(traktRes).length) { if (traktRes["type"] === "episode") { return Response.json( { content: `πŸ“Ί ${traktRes["show"]["title"]} β€’ ${traktRes["episode"]["title"]}`, }, headers ); } if (traktRes["type"] === "movie") { return Response.json( { content: `πŸŽ₯ ${traktRes["movie"]["title"]}`, }, headers ); } } const nbaRes = await fetch( "https://cdn.nba.com/static/json/liveData/scoreboard/todaysScoreboard_00.json" ) .then((data) => data.json()) .catch(); const games = nbaRes?.scoreboard?.games; if (games && games.length) { const isAmPm = (hours) => (hours >= 12 ? "pm" : "am"); const game = games.find((game) => game.gameCode.includes("LAL")); if (game) { const startDate = new Date(game.gameTimeUTC); const startTime = startDate.toLocaleString("en-US", { timeZone: "America/Los_Angeles", }); const endDate = startDate.setHours(startDate.getHours() + 3); const endTime = new Date(endDate).toLocaleString("en-US", { timeZone: "America/Los_Angeles", }); const nowDate = new Date(); const now = nowDate.toLocaleString("en-US", { timeZone: "America/Los_Angeles", }); const isCorrectDate = now.split(",")[0] === startTime.split(",")[0] && now.split(",")[0] === endTime.split(",")[0] && isAmPm(startDate.getHours()) === isAmPm(nowDate.getHours()); const nowHour = parseInt(now.split(",")[1].split(":")[0].trim()); const startHour = parseInt(startTime.split(",")[1].split(":")[0].trim()); const endHour = parseInt(endTime.split(",")[1].split(":")[0].trim()); const nowMinutes = parseInt(now.split(",")[1].split(":")[1].trim()); const startMinutes = parseInt( startTime.split(",")[1].split(":")[1].trim() ); const endMinutes = parseInt(endTime.split(",")[1].split(":")[1].trim()); const res = { content: `πŸ€ ${game["awayTeam"]["teamName"]} (${game["awayTeam"]["wins"]}-${game["awayTeam"]["losses"]}) @ ${game["homeTeam"]["teamName"]} (${game["homeTeam"]["wins"]}-${game["homeTeam"]["losses"]})`, }; if (isCorrectDate) { if ( nowHour === startHour && nowMinutes >= startMinutes && nowHour < endHour ) return Response.json(res, headers); if (nowHour > startHour && nowHour < endHour) return Response.json(res); if ( nowHour > startHour && nowMinutes <= endMinutes && nowHour == endHour ) return Response.json(res, headers); } } } const trackRes = await fetch( `https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=coryd_&api_key=${MUSIC_KEY}&limit=1&format=json`, { type: "json", } ).catch(); const trackData = await trackRes.json(); const mbidRes = await fetch("https://coryd.dev/api/mbids", { type: "json", }).catch(); const mbidData = await mbidRes.json(); const track = trackData["recenttracks"]["track"][0]; const artist = track["artist"]["#text"]; let mbid = track["artist"]["mbid"]; let genre = ""; const mbidMap = (artist) => { return mbidData[artist.toLowerCase()] || ""; }; // mbid mismatches if (mbidMap(artist) !== "") mbid = mbidMap(artist); const artistUrl = mbid ? `https://musicbrainz.org/artist/${mbid}` : `https://musicbrainz.org/search?query=${track["artist"]["#text"].replace( /\s+/g, "+" )}&type=artist`; const trackUrl = track["mbid"] ? `https://musicbrainz.org/track/${track["mbid"]}` : track["url"]; if (mbid && mbid !== "") { const genreUrl = `https://musicbrainz.org/ws/2/artist/${mbid}?inc=aliases+genres&fmt=json`; const genreRes = await fetch(genreUrl, { type: "json", }).catch(); const genreData = await genreRes.json(); genre = genreData.genres.sort((a, b) => b.count - a.count)[0]?.["name"] || ""; } return Response.json( { content: `${emojiMap( genre, track["artist"]["#text"] )} ${track["name"]} by ${ track["artist"]["#text"] }`, }, headers ); }; export const config = { path: "/api/now-playing" };