diff --git a/netlify/edge-functions/now-playing.js b/netlify/edge-functions/now-playing.js index 04941b1d..d7643661 100644 --- a/netlify/edge-functions/now-playing.js +++ b/netlify/edge-functions/now-playing.js @@ -1,144 +1,209 @@ const emojiMap = (genre, artist) => { - const DEFAULT = 'π§' - 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 'πΈπΌ' + const DEFAULT = "π§"; + 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) 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("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') + 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 'π€«' + 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("alternative") || + genre.includes("rock") || + genre.includes("shoegaze") || + genre.includes("screamo") ) - return 'πΈ' - return DEFAULT -} + 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 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', + "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', { + 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, + "Content-Type": "application/json", + "trakt-api-version": 2, + "trakt-api-key": TV_KEY, }, }) .then((data) => { - if (data.body) return data.json() - return {} + if (data.body) return data.json(); + return {}; }) - .catch() + .catch(); if (Object.keys(traktRes).length) { - if (traktRes['type'] === 'episode') { + if (traktRes["type"] === "episode") { return Response.json( { - 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>`, + 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') { + if (traktRes["type"] === "movie") { return Response.json( { - content: `π₯ <a href="https://trakt.tv/movies/${traktRes['movie']['ids']['slug']}">${traktRes['movie']['title']}</a>`, + content: `π₯ <a href="https://trakt.tv/movies/${traktRes["movie"]["ids"]["slug"]}">${traktRes["movie"]["title"]}</a>`, }, 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', + 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 = '' + ).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()] || '' - } + return mbidData[artist.toLowerCase()] || ""; + }; // mbid mismatches - if (mbidMap(artist) !== '') mbid = mbidMap(artist) + if (mbidMap(artist) !== "") mbid = mbidMap(artist); const artistUrl = mbid ? `https://musicbrainz.org/artist/${mbid}` - : `https://musicbrainz.org/search?query=${track['artist']['#text'].replace( + : `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'] + "+" + )}&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` + 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'] || '' + 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'])} <a href="${trackUrl}">${ - track['name'] - }</a> by <a href="${artistUrl}">${track['artist']['#text']}</a>`, + content: `${emojiMap( + genre, + track["artist"]["#text"] + )} <a href="${trackUrl}">${track["name"]}</a> by <a href="${artistUrl}">${ + track["artist"]["#text"] + }</a>`, }, headers - ) -} + ); +}; -export const config = { path: '/api/now-playing' } +export const config = { path: "/api/now-playing" }; diff --git a/package.json b/package.json index 84051063..15d015f0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "coryd.dev", - "version": "4.12.1", + "version": "4.13.1", "description": "The source for my personal site, blog and portfolio. Built using 11ty and hosted on Netlify.", "type": "module", "scripts": {