updated feed handling to use dedicated handlers for each feed type

This commit is contained in:
dylan 2025-12-28 16:56:40 +00:00
parent b3b8658b72
commit 385f24a28a

View file

@ -1,7 +1,36 @@
import 'dotenv/config' import 'dotenv/config'
import { items, linkFormat } from './config.js' import { items, linkFormat } from './config.js'
import { markdownCharEscape } from './utils.js' import {
getAtomFeed,
getHardcoverActivity,
getJsonFeedItemTitle,
getLetterboxdActivity,
getListenBrainzScrobble,
getMastodonPost,
getRSSItemTitle,
getSourceTubeActivity,
getSteamRecentlyPlayed,
getTraktEpisode,
getTraktMovie,
htmlServiceLinkRegex,
markdownCharEscape,
markdownServiceLinkRegex,
} from './utils.js'
const feedHandlers = {
rss: getRSSItemTitle,
atom: getAtomFeed,
json: getJsonFeedItemTitle,
'source.tube': getSourceTubeActivity,
mastodon: getMastodonPost,
letterboxd: getLetterboxdActivity,
'trakt-episode': getTraktEpisode,
'trakt-movie': getTraktMovie,
steam: getSteamRecentlyPlayed,
listenbrainz: getListenBrainzScrobble,
hardcover: getHardcoverActivity,
}
const OMGLOL_API = `https://api.omg.lol/address/${process.env.OMGLOL_USERNAME}/now` const OMGLOL_API = `https://api.omg.lol/address/${process.env.OMGLOL_USERNAME}/now`
@ -32,11 +61,24 @@ export default async function now() {
let newNow = now let newNow = now
await Promise.all( await Promise.all(
items.map(async ({ id, regex, getLatest }) => { items.map(async (item) => {
try { try {
const latest = await getLatest() const handler = feedHandlers[item.feedType]
console.log(`${id}: ${latest.text}`) if (!handler) {
console.log(`${id} URL: ${latest.url}`) throw new Error(`Unknown feedType: ${item.feedType}`)
}
// build feedUrl from template if provided
let feedUrl = item.feedUrl
if (item.feedUrlTemplate) {
feedUrl = item.feedUrlTemplate
.replace('{userId}', item.userId || '')
.replace('{instance}', item.instance || '')
}
const latest = await handler(feedUrl || { ...item, feedUrl })
console.log(`${item.id}: ${latest.text}`)
console.log(`${item.id} URL: ${latest.url}`)
// Apply markdown escaping only for markdown links // Apply markdown escaping only for markdown links
const displayText = const displayText =
@ -45,6 +87,12 @@ export default async function now() {
: markdownCharEscape(latest.text) : markdownCharEscape(latest.text)
if (latest && latest.text && latest.url) { if (latest && latest.text && latest.url) {
// generate regex based on id and linkFormat
const regex =
linkFormat === 'html'
? htmlServiceLinkRegex(item.id)
: markdownServiceLinkRegex(item.id)
newNow = newNow.replace(regex, (match, openTag, closeTag) => { newNow = newNow.replace(regex, (match, openTag, closeTag) => {
// Replace href in opening tag // Replace href in opening tag
const updatedOpenTag = openTag.replace( const updatedOpenTag = openTag.replace(