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: `πŸ“Ί ${traktRes['show']['title']} β€’ ${traktRes['episode']['title']}`, + content: `πŸ“Ί ${traktRes["show"]["title"]} β€’ ${traktRes["episode"]["title"]}`, }, headers - ) + ); } - if (traktRes['type'] === 'movie') { + if (traktRes["type"] === "movie") { return Response.json( { - content: `πŸŽ₯ ${traktRes['movie']['title']}`, + 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', + 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'])} ${ - track['name'] - } by ${track['artist']['#text']}`, + content: `${emojiMap( + genre, + track["artist"]["#text"] + )} ${track["name"]} by ${ + track["artist"]["#text"] + }`, }, 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": {