now-updater/utils.js
2025-12-17 22:21:52 -08:00

74 lines
2.3 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 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 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
return image ? `${title} ![${title}](${image})` : title
}
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()
return image ? `${title} ![${title}](${image})` : title
}
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
return `${title}<br />by ${artists.join(', ')}`
}
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 image = item.querySelector('description > img').src
return `${title} ![${title}](${image})`
}
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
return `${title} ![${title}](https://widgets.trakt.tv/users/${id}/watched/thumb@2x.jpg?type=episode&image_only=1)`
}