mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
Use email header x-beehiiv-type to detect beehiiv newsletter and get the newsletter url from the header x-newsletter
This commit is contained in:
parent
88f6e20bfc
commit
4f12580b1c
2 changed files with 13 additions and 50 deletions
|
|
@ -6,36 +6,19 @@ export class BeehiivHandler extends ContentHandler {
|
|||
this.name = 'beehiiv'
|
||||
}
|
||||
|
||||
findNewsletterHeaderHref(dom: Document): string | undefined {
|
||||
const readOnline = dom.querySelectorAll('table tr td a')
|
||||
let res: string | undefined = undefined
|
||||
readOnline.forEach((e) => {
|
||||
if (e.textContent === 'Read Online') {
|
||||
res = e.getAttribute('href') || undefined
|
||||
}
|
||||
})
|
||||
return res
|
||||
}
|
||||
|
||||
async isNewsletter(input: {
|
||||
from: string
|
||||
headers: Record<string, string | string[]>
|
||||
dom: Document
|
||||
}): Promise<boolean> {
|
||||
const dom = input.dom
|
||||
if (dom.querySelectorAll('img[src*="beehiiv.net"]').length > 0) {
|
||||
const beehiivUrl = this.findNewsletterHeaderHref(dom)
|
||||
if (beehiivUrl) {
|
||||
return Promise.resolve(true)
|
||||
}
|
||||
}
|
||||
return false
|
||||
return Promise.resolve(
|
||||
input.headers['x-beehiiv-type']?.toString() === 'newsletter'
|
||||
)
|
||||
}
|
||||
|
||||
async parseNewsletterUrl(
|
||||
headers: Record<string, string | string[]>,
|
||||
html: string
|
||||
): Promise<string | undefined> {
|
||||
return this.findNewsletterUrl(html)
|
||||
return Promise.resolve(headers['x-newsletter']?.toString())
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -170,21 +170,13 @@ describe('Newsletter email test', () => {
|
|||
})
|
||||
|
||||
it('returns BeehiivHandler for beehiiv.com newsletter', async () => {
|
||||
const html = load('./test/data/beehiiv-newsletter.html')
|
||||
const handler = await getNewsletterHandler({
|
||||
html,
|
||||
html: '',
|
||||
from: '',
|
||||
headers: {},
|
||||
})
|
||||
expect(handler).to.be.instanceOf(BeehiivHandler)
|
||||
})
|
||||
|
||||
it('returns BeehiivHandler for milkroad newsletter', async () => {
|
||||
const html = load('./test/data/milkroad-newsletter.html')
|
||||
const handler = await getNewsletterHandler({
|
||||
html,
|
||||
from: '',
|
||||
headers: {},
|
||||
headers: {
|
||||
'x-newsletter': 'https://www.milkroad.com/p/bored-ape-amazon',
|
||||
'x-beehiiv-type': 'newsletter'
|
||||
},
|
||||
})
|
||||
expect(handler).to.be.instanceOf(BeehiivHandler)
|
||||
})
|
||||
|
|
@ -277,24 +269,12 @@ describe('Newsletter email test', () => {
|
|||
})
|
||||
|
||||
context('when email is from beehiiv', () => {
|
||||
before(() => {
|
||||
nock('https://u23463625.ct.sendgrid.net')
|
||||
.head(
|
||||
'/ss/c/AX1lEgEQaxtvFxLaVo0GBo_geajNrlI1TGeIcmMViR3pL3fEDZnbbkoeKcaY62QZk0KPFudUiUXc_uMLerV4nA/3k5/3TFZmreTR0qKSCgowABnVg/h30/zzLik7UXd1H_n4oyd5W8Xu639AYQQB2UXz-CsssSnno'
|
||||
)
|
||||
.reply(301, undefined, {
|
||||
Location: 'https://www.milkroad.com/p/talked-guy-spent-30m-beeple',
|
||||
})
|
||||
nock('https://www.milkroad.com')
|
||||
.head('/p/talked-guy-spent-30m-beeple')
|
||||
.reply(200, '')
|
||||
})
|
||||
|
||||
it('gets the URL from the header', async () => {
|
||||
const html = load('./test/data/beehiiv-newsletter.html')
|
||||
const url = await new BeehiivHandler().findNewsletterUrl(html)
|
||||
const url = await new BeehiivHandler().parseNewsletterUrl({
|
||||
'x-newsletter': 'https://www.milkroad.com/p/bored-ape-amazon',
|
||||
}, '')
|
||||
expect(url).to.startWith(
|
||||
'https://www.milkroad.com/p/talked-guy-spent-30m-beeple'
|
||||
'https://www.milkroad.com/p/bored-ape-amazon'
|
||||
)
|
||||
})
|
||||
})
|
||||
|
|
|
|||
Loading…
Reference in a new issue