mirror of
https://github.com/comatory/fb2iCal
synced 2025-02-19 13:10:53 +01:00
allow passing FB event number as parameter
This commit is contained in:
parent
97317aeaa4
commit
acebfe3658
@ -1,13 +1,29 @@
|
||||
const request = require('request')
|
||||
const { checkURLFormat, checkNumberURLParameter } = require('./utils')
|
||||
|
||||
const useMobileURL = (originalURL) => {
|
||||
const url = new URL(originalURL)
|
||||
const urlWithProtocol = originalURL.includes('http') ?
|
||||
originalURL :
|
||||
`https://${originalURL}`
|
||||
const url = new URL(urlWithProtocol)
|
||||
|
||||
return `${url.protocol}//mobile.facebook.com${url.port}${url.pathname}${url.hash}`
|
||||
}
|
||||
|
||||
const createURL = (originalURL) => {
|
||||
if (checkURLFormat(originalURL)) {
|
||||
return originalURL
|
||||
}
|
||||
|
||||
if (checkNumberURLParameter(originalURL)) {
|
||||
return `https://facebook.com/events/${originalURL}`
|
||||
}
|
||||
|
||||
return ''
|
||||
}
|
||||
|
||||
const crawl = async (originalURL) => {
|
||||
const url = useMobileURL(originalURL)
|
||||
const url = useMobileURL(createURL(originalURL))
|
||||
return new Promise((resolve, reject) => {
|
||||
console.info(`Started request for URL: ${url}`)
|
||||
request({
|
||||
|
@ -7,7 +7,7 @@ const rateLimit = require('express-rate-limit')
|
||||
const crawl = require('./crawler')
|
||||
const parseHTML = require('./parser')
|
||||
const generateICS = require('./ics')
|
||||
const { genericErrorHandler, checkFBURL } = require('./middlewares')
|
||||
const { genericErrorHandler, checkURLParameter } = require('./middlewares')
|
||||
|
||||
const port = process.env.PORT
|
||||
const app = express()
|
||||
@ -36,9 +36,9 @@ app.get('*', (req, res) => {
|
||||
res.status(400).render('404')
|
||||
})
|
||||
|
||||
app.use('/download', checkFBURL)
|
||||
app.use('/download', checkURLParameter)
|
||||
app.use('/download', rateLimit())
|
||||
app.post('/download', async (req, res) => {
|
||||
app.post('/download', async (req, res, next) => {
|
||||
const { url } = req.body
|
||||
|
||||
try {
|
||||
@ -52,7 +52,8 @@ app.post('/download', async (req, res) => {
|
||||
.send(200, new Buffer(ics, 'utf8'))
|
||||
}
|
||||
} catch (err) {
|
||||
return next(err)
|
||||
next(err)
|
||||
return
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
const FBURLError = () => new Error('Not a valid Facebook URL!')
|
||||
const { checkValidURL } = require('./utils')
|
||||
const MissingURLParameter = () => new Error('Please provide valid URL or event number.')
|
||||
|
||||
const sendJSON = (req) => {
|
||||
return req.accepts().includes('application/json')
|
||||
@ -19,27 +20,17 @@ const genericErrorHandler = (err, req, res, next) => {
|
||||
.render('error', { error: err.toString() })
|
||||
}
|
||||
|
||||
const checkFBURL = (req, res, next) => {
|
||||
const checkURLParameter = (req, res, next) => {
|
||||
const { url } = req.body
|
||||
|
||||
if (!url) {
|
||||
return next(FBURLError())
|
||||
if (!url || !checkValidURL(url)) {
|
||||
return next(MissingURLParameter())
|
||||
}
|
||||
|
||||
try {
|
||||
const FBURL = new URL(url)
|
||||
if (!(/facebook/.test(FBURL.hostname))) {
|
||||
return next(FBURLError())
|
||||
}
|
||||
} catch (err) {
|
||||
return next(err)
|
||||
}
|
||||
|
||||
|
||||
return next()
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
genericErrorHandler,
|
||||
checkFBURL,
|
||||
checkURLParameter,
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
const dayjs = require('dayjs')
|
||||
const cheerio = require('cheerio')
|
||||
const { createParserError } = require('./utils')
|
||||
|
||||
// NOTE: Specific formatting for `ics` library
|
||||
const parseDates = (startDate, endDate) => {
|
||||
@ -79,15 +80,16 @@ const parseHTML = (html) => {
|
||||
return data
|
||||
}, null)
|
||||
|
||||
const eventData = rawData ?
|
||||
JSON.parse(rawData.slice(12, -5)) :
|
||||
{}
|
||||
if (!rawData) {
|
||||
throw createParserError()
|
||||
}
|
||||
|
||||
const eventData = JSON.parse(rawData.slice(12, -5))
|
||||
const data = parseEventData(eventData)
|
||||
|
||||
return data
|
||||
} catch (err) {
|
||||
throw err
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -270,6 +270,10 @@
|
||||
return
|
||||
}
|
||||
|
||||
if (!form.reportValidity()) {
|
||||
return
|
||||
}
|
||||
|
||||
event.preventDefault()
|
||||
|
||||
const formData = new URLSearchParams()
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Worker v2
|
||||
// Worker v3
|
||||
|
||||
self.addEventListener('install', (event) => {
|
||||
event.waitUntil(
|
||||
@ -6,8 +6,8 @@ self.addEventListener('install', (event) => {
|
||||
return cache.addAll([
|
||||
'/',
|
||||
'/favicon.ico',
|
||||
'/scripts.js?2',
|
||||
'/style.css?2',
|
||||
'/scripts.js?3',
|
||||
'/style.css?3',
|
||||
])
|
||||
})
|
||||
)
|
||||
|
26
lib/utils.js
Normal file
26
lib/utils.js
Normal file
@ -0,0 +1,26 @@
|
||||
const checkValidURL = (url) => {
|
||||
return checkURLFormat(url) ||
|
||||
checkNumberURLParameter(url)
|
||||
}
|
||||
|
||||
const checkURLFormat = (url) => {
|
||||
return /^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/.test(url)
|
||||
}
|
||||
|
||||
const checkNumberURLParameter = (url) => {
|
||||
return /^\d+$/.test(url)
|
||||
}
|
||||
|
||||
const createParserError = () => {
|
||||
const err = new Error('Unable to parse event data.')
|
||||
err.statusCode = 422
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
checkValidURL,
|
||||
checkURLFormat,
|
||||
checkNumberURLParameter,
|
||||
createParserError,
|
||||
}
|
@ -5,7 +5,7 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="manifest" href="/manifest.json">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/icon-180.png">
|
||||
<link rel="stylesheet" type="text/css" href="/style.css?2">
|
||||
<link rel="stylesheet" type="text/css" href="/style.css?3">
|
||||
<title>Facebook Event to iCal Converter</title>
|
||||
</head>
|
||||
|
||||
@ -24,7 +24,14 @@
|
||||
</p>
|
||||
|
||||
<form action='/download' method='POST' id="form">
|
||||
<input id="url" type='text' name='url' placeholder='Paste / type FB event URL here...' />
|
||||
<input
|
||||
required
|
||||
pattern="^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?|\d+$"
|
||||
id="url"
|
||||
name="url"
|
||||
placeholder="Paste / type FB event URL or event number..."
|
||||
title="Please insert Facebook Event URL / Number"
|
||||
/>
|
||||
<input id="submit" type='submit' value='Submit' />
|
||||
</form>
|
||||
|
||||
@ -71,6 +78,6 @@
|
||||
<a href="#" title="Source code coming soon">Source</a>
|
||||
</footer>
|
||||
|
||||
<script src="/scripts.js?2"></script>
|
||||
<script src="/scripts.js?3"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
Loading…
x
Reference in New Issue
Block a user