86 lines
2.7 KiB
JavaScript
86 lines
2.7 KiB
JavaScript
import 'dotenv/config'
|
|
import { JSDOM } from 'jsdom'
|
|
import sanitizeHtml from 'sanitize-html'
|
|
|
|
export function markdownLinkRegex(url) {
|
|
return new RegExp(
|
|
`(\\[).*?(\\]\\(https:\\/\\/${url.replaceAll('.', '\\.')}\\))`,
|
|
'i',
|
|
)
|
|
}
|
|
|
|
export function markdownCharEscape(text) {
|
|
return text.replaceAll('-', '\\-')
|
|
}
|
|
|
|
export async function getRSSItemTitle(feedUrl) {
|
|
const res = await fetch(feedUrl)
|
|
const data = await res.text()
|
|
const dom = new JSDOM(data)
|
|
const item = dom.window.document.querySelector('item')
|
|
const title = item.querySelector('title').textContent
|
|
return markdownCharEscape(
|
|
sanitizeHtml(title, {
|
|
allowedTags: [],
|
|
allowedAttributes: {},
|
|
})?.trim(),
|
|
)
|
|
}
|
|
|
|
export async function getJsonFeedItemTitle(feedUrl) {
|
|
const res = await fetch(feedUrl)
|
|
const data = await res.json()
|
|
const post = data.items[0]
|
|
const { title, image } = post
|
|
const cleanTitle = markdownCharEscape(title)
|
|
return image ? `${cleanTitle} ` : cleanTitle
|
|
}
|
|
|
|
export async function getJsonFeedItemContent(feedUrl) {
|
|
const res = await fetch(feedUrl)
|
|
const data = await res.json()
|
|
const post = data.items[0]
|
|
const { content_html, image } = post
|
|
const title = sanitizeHtml(content_html, {
|
|
allowedTags: [],
|
|
allowedAttributes: {},
|
|
})?.trim()
|
|
const cleanTitle = markdownCharEscape(title)
|
|
return image ? `${cleanTitle} ` : cleanTitle
|
|
}
|
|
|
|
export async function getMalojaScrobble(malojaUrl) {
|
|
const res = await fetch(`${malojaUrl}/apis/mlj_1/scrobbles?perpage=1`)
|
|
const data = await res.json()
|
|
const scrobble = data.list[0]
|
|
const {
|
|
title,
|
|
album: { artists },
|
|
} = scrobble.track
|
|
const cleanTitle = markdownCharEscape(title)
|
|
const cleanArtists = markdownCharEscape(artists.join(', '))
|
|
return markdownCharEscape(`${cleanTitle}<br />by ${cleanArtists}`)
|
|
}
|
|
|
|
export async function getLetterboxdActivity(username) {
|
|
const res = await fetch(`https://letterboxd.com/${username}/rss/`)
|
|
const data = await res.text()
|
|
const dom = new JSDOM(data)
|
|
const item = dom.window.document.querySelector('item')
|
|
const title = item.querySelector('title').textContent
|
|
const cleanTitle = markdownCharEscape(title)
|
|
const image = item.querySelector('description > img').src
|
|
return `${cleanTitle} `
|
|
}
|
|
|
|
export async function getTraktEpisode(username, id) {
|
|
const res = await fetch(
|
|
`https://trakt.tv/users/${username}/history/episodes/added/asc.atom?slurm=${process.env.TRAKT_SLURM}`,
|
|
)
|
|
const data = await res.text()
|
|
const dom = new JSDOM(data)
|
|
const entry = dom.window.document.querySelector('entry')
|
|
const title = entry.querySelector('title').textContent
|
|
const cleanTitle = markdownCharEscape(title)
|
|
return `${cleanTitle} `
|
|
}
|