Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
import * as cheerio from 'cheerio'
export type Time = {
hour: number
minutes: number
}
export type Talk = {
startTime: Time
endTime: Time
title: string
speaker: string
location: string
link: string
tags: string[]
}
export const fetchAgenda = async () => {
const response = await fetch('http://ndcsydney.com/agenda')
const body: string = await response.text()
const talks: Talk[] = []
const $ = cheerio.load(body)
$('section.day').map((i, el) => {
// prettier-ignore
const dayElements = el.childNodes
.filter(c => c.type === 'tag')[0]
.children
.filter(c => c.type === 'tag')
for (var index = 0; index < dayElements.length / 2; index += 2) {
const slotEl = cheerio(dayElements[index])
const talkSlot = slotEl.text().split(' - ')
const startParts = talkSlot[0].split(':')
const endParts = talkSlot[1].split(':')
const startTime: Time = { hour: Number(startParts[0]), minutes: Number(startParts[1]) }
const endTime: Time = { hour: Number(endParts[0]), minutes: Number(endParts[1]) }
cheerio(dayElements[index + 1]).find('.boxed-talk').each((j, talkEl) => {
const $talk = cheerio(talkEl)
const tags = talkEl.attribs['data-slugs'].split(',')
const link = talkEl.attribs.href
const location = $talk.find('.venue').text()
const title = $talk.find('h2').text()
const speaker = $talk.find('.speaker').text()
talks.push({
title,
speaker,
location,
link,
tags,
startTime,
endTime
})
})
}
})
return talks
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.