const cheerio = require('cheerio'); const fs = require('fs'); const autoprefixer = require('autoprefixer'); const postcss = require('postcss'); const tailwindcss = require('tailwindcss'); const downloadSchedule = async (sportKey) => { const cacheFile = `${__dirname}/cache/${sportKey}.html`; if (!fs.existsSync(cacheFile)) { const response = await fetch(`https://olympics.com/en/paris-2024/schedule/${sportKey}`); const content = await response.text(); fs.writeFileSync(cacheFile, content); } const html = fs.readFileSync(cacheFile, 'utf-8'); const $ = cheerio.load(html); return JSON.parse($('#__NEXT_DATA__').text()); }; const getSportIcon = (sport) => { switch (sport.toLowerCase()) { case "3x3-basketball": return "🏀③" case "basketball": return "🏀"; case "football": return "⚽"; case "handball": return "🤾"; case "hockey": return "🏑"; case "rugby-sevens": return "🏉"; case "volleyball": return "🏐"; case "water-polo": return "🤽"; default: throw new Error(`No icon set for ${sport}`); } }; const getFlagIcon = (country) => { if (country.toLowerCase().startsWith("winner oqt")) { return "🏳️"; } switch (country.toLowerCase()) { case "angola": return "🇦🇴"; case "argentina": return "🇦🇷"; case "australia": return "🇦🇺"; case "azerbaijan": return "🇦🇿"; case "belgium": return "🇧🇪"; case "brazil": return "🇧🇷"; case "canada": return "🇨🇦"; case "china": return "🇨🇳"; case "colombia": return "🇨🇴"; case "croatia": return "🇭🇷"; case "denmark": return "🇩🇰"; case "dominican republic": return "🇩🇴"; case "fiji": return "🇫🇯"; case "france": return "🇫🇷"; case "egypt": return "🇪🇬"; case "germany": return "🇩🇪"; case "great britain": return "🇬🇧"; case "greece": return "🇬🇷"; case "guinea": return "🇬🇳"; case "hungary": return "🇭🇺"; case "india": return "🇮🇳"; case "iraq": return "🇮🇶"; case "ireland": return "🇮🇪"; case "israel": return "🇮🇱"; case "italy": return "🇮🇱"; case "japan": return "🇯🇵"; case "kenya": return "🇰🇪"; case "latvia": return "🇱🇻"; case "lithuania": return "🇱🇹"; case "korea": return "🇰🇷"; case "mali": return "🇲🇱"; case "montenegro": return "🇲🇪"; case "morocco": return "🇲🇦"; case "nigeria": return "🇳🇬"; case "netherlands": return "🇳🇱"; case "new zealand": return "🇳🇿"; case "norway": return "🇳🇴"; case "paraguay": return "🇵🇾"; case "poland": return "🇵🇱"; case "puerto rico": return "🇵🇷"; case "romania": return "🇷🇴"; case "serbia": return "🇷🇸"; case "south africa": return "🇿🇦"; case "south sudan": return "🇸🇸"; case "slovenia": return "🇸🇮"; case "samoa": return "🇼🇸"; case "spain": return "🇪🇸"; case "sweden": return "🇸🇪"; case "türkiye": return "🇹🇷"; case "ukraine": return "🇺🇦"; case "united states": return "🇺🇸"; case "uruguay": return "🇺🇾"; case "uzbekistan": return "🇺🇿"; case "zambia": return "🇿🇲"; default: throw new Error(`No flag set for ${country}`); } } const SPORTS = []; const TEAMS = []; const EVENTS = []; const OUTPUT = []; const generateCalendar = (title, key, events) => { const lines = []; lines.push(`BEGIN:VCALENDAR`); lines.push(`VERSION:2.0`); lines.push(`PRODID:-//fabrice404//olympics-calendar//${key}//EN`); lines.push(`X-WR-CALNAME:${title}`); lines.push(`NAME:${title}`); events.forEach((event) => { lines.push(`BEGIN:VEVENT`); lines.push( ...Object.entries(event) .filter(([key, value]) => !key.startsWith('_')) .map(([key, value]) => `${key}:${value}`) ); lines.push(`END:VEVENT`); }); lines.push(`END:VCALENDAR`); const folder = `${__dirname}/docs/${key}.ics`.split('/').slice(0, -1).join('/'); fs.mkdirSync(folder, { recursive: true }) fs.writeFileSync(`${__dirname}/docs/${key}.ics`, lines.join('\r\n')); } const generateSportCalendar = (sportKey) => { const sport = SPORTS.find((sport) => sport.key === sportKey); const events = EVENTS.filter((event) => event._SPORT === sport.key); const key = `${sportKey}/general`; const title = `${sport.icon} ${sport.name} | Paris 2024`; generateCalendar(title, key, events); OUTPUT.push(`
`); } const generateSportTeamCalendar = (sportKey, teamKey) => { const sport = SPORTS.find((sport) => sport.key === sportKey); const team = TEAMS.find((team) => team.key === teamKey); const events = EVENTS.filter((event) => event._SPORT === sport.key && (event._TEAM1 === team.key || event._TEAM2 === team.key)); const key = `${sportKey}/${teamKey}`; const title = `${team.icon} ${team.name} ${sport.name} | Paris 2024`; generateCalendar(title, key, events); OUTPUT.push(`