Facebook-Events-iCal-Converter/lib/parser.js

80 lines
1.8 KiB
JavaScript
Raw Normal View History

2019-10-15 22:45:03 +02:00
const dayjs = require('dayjs')
const cheerio = require('cheerio')
2019-10-15 09:22:08 +02:00
const parseDates = (startDate, endDate) => {
const start = [
startDate.year(),
startDate.month() + 1,
startDate.date(),
startDate.hour(),
startDate.minute(),
]
2019-10-15 09:22:08 +02:00
const duration = { hours: 1 }
return {
start,
duration,
2019-10-15 22:45:03 +02:00
}
}
2019-10-15 22:45:03 +02:00
const parseEventData = (eventData) => {
const startDate = eventData.startDate && dayjs(eventData.startDate)
const endDate = eventData.endDate && dayjs(eventData.endDate)
const { start, duration } = parseDates(startDate, endDate)
const { location } = eventData || {}
const { address } = location || {}
2019-10-15 22:45:03 +02:00
const locationStr = location && [
location.name || '',
address.streetAddress || '',
address.addressLocality || '',
address.postalCode || '',
address.addressCountry || '',
].join(', ')
const title = eventData.name
const url = eventData.url
const description = eventData.description
2019-10-15 22:45:03 +02:00
return {
start,
duration,
location: locationStr,
title,
url,
description,
}
}
2019-10-15 22:45:03 +02:00
const parseHTML = (html) => {
try {
// NOTE: Mobile web should have serialized
// event info in one of the script tags
const $ = cheerio.load(html)
const $scripts = $('head script[type="application/ld+json"]')
const rawData = $scripts.toArray().reduce((data, node) => {
const firstNode = node.children[0]
2019-10-15 22:45:03 +02:00
if (!firstNode || !firstNode.data) {
return data
}
2019-10-15 22:45:03 +02:00
if (firstNode.data.startsWith('//<![CDATA')) {
return firstNode.data
}
2019-10-15 22:45:03 +02:00
return data
}, null)
2019-10-15 22:45:03 +02:00
const eventData = JSON.parse(rawData.slice(12, -5))
const data = parseEventData(eventData)
2019-10-15 22:45:03 +02:00
console.log(data)
return data
} catch (err) {
throw err
return
2019-10-15 09:22:08 +02:00
}
}
module.exports = parseHTML