Compare commits

..

1 commit

Author SHA1 Message Date
dylan
df0bc8beab updated image and video replacement logic 2026-01-01 19:53:45 +00:00
3 changed files with 55 additions and 26 deletions

9
.env.example Normal file
View file

@ -0,0 +1,9 @@
OMGLOL_KEY=
OMGLOL_USERNAME=melanie
TRAKT_SLURM=
# optional - only needed if using steam service
STEAM_WEBAPI_KEY=
# optional - only needed if using hardcover service
HARDCOVER_API_KEY=

View file

@ -132,7 +132,12 @@ export default async function now() {
const imageId = `${item.id}-image` const imageId = `${item.id}-image`
const videoId = `${item.id}-video` const videoId = `${item.id}-video`
if (latest.image) { if (latest.image) {
// html image replacement // html image replacement - match by data-service attribute to allow repeated updates
newNow = newNow.replace(
new RegExp(`(<img[^>]*data-service=["']${item.id}["'][^>]*\\bsrc=["'])[^"']*?(["'][^>]*>)`, 'gi'),
`$1${latest.image}$2`,
)
// also handle initial placeholder case
newNow = newNow.replace( newNow = newNow.replace(
new RegExp(`(<img[^>]+src=["'])${imageId}(["'][^>]*>)`, 'gi'), new RegExp(`(<img[^>]+src=["'])${imageId}(["'][^>]*>)`, 'gi'),
`$1${latest.image}$2`, `$1${latest.image}$2`,
@ -143,7 +148,12 @@ export default async function now() {
`$1${latest.image}$2`, `$1${latest.image}$2`,
) )
} else { } else {
// remove img tags if no image available (handle multi-line tags and any attribute order) // remove img tags if no image available - match by data-service attribute
newNow = newNow.replace(
new RegExp(`\\s*<img\\b[^>]*\\bdata-service=["']${item.id}["'][^>]*>\\s*`, 'gis'),
'',
)
// also remove by placeholder src
newNow = newNow.replace( newNow = newNow.replace(
new RegExp(`\\s*<img\\b[^>]*\\bsrc=["']${imageId}["'][^>]*>\\s*`, 'gis'), new RegExp(`\\s*<img\\b[^>]*\\bsrc=["']${imageId}["'][^>]*>\\s*`, 'gis'),
'', '',
@ -156,13 +166,23 @@ export default async function now() {
} }
if (latest.video) { if (latest.video) {
// html video replacement // html video replacement - match by data-service attribute to allow repeated updates
newNow = newNow.replace(
new RegExp(`(<video[^>]*data-service=["']${item.id}["'][^>]*\\bsrc=["'])[^"']*?(["'][^>]*>)`, 'gi'),
`$1${latest.video}$2`,
)
// also handle initial placeholder case
newNow = newNow.replace( newNow = newNow.replace(
new RegExp(`(<video[^>]+src=["'])${videoId}(["'][^>]*>)`, 'gi'), new RegExp(`(<video[^>]+src=["'])${videoId}(["'][^>]*>)`, 'gi'),
`$1${latest.video}$2`, `$1${latest.video}$2`,
) )
} else { } else {
// remove video tags if no video available // remove video tags if no video available - match by data-service attribute
newNow = newNow.replace(
new RegExp(`\\s*<video\\b[^>]*\\bdata-service=["']${item.id}["'][^>]*>[\\s\\S]*?</video>\\s*`, 'gis'),
'',
)
// also remove by placeholder src
newNow = newNow.replace( newNow = newNow.replace(
new RegExp(`\\s*<video\\b[^>]*\\bsrc=["']${videoId}["'][^>]*>[\\s\\S]*?</video>\\s*`, 'gis'), new RegExp(`\\s*<video\\b[^>]*\\bsrc=["']${videoId}["'][^>]*>[\\s\\S]*?</video>\\s*`, 'gis'),
'', '',

View file

@ -7,14 +7,14 @@ export const services = [
// ======================================================================== // ========================================================================
{ {
id: 'weblog', id: 'weblog',
isActive: false, isActive: true,
userId: 'dylan', // your omg.lol username userId: 'dylan', // your omg.lol username
feedUrlTemplate: 'https://{userId}.weblog.lol/feed.json', feedUrlTemplate: 'https://{userId}.weblog.lol/feed.json',
feedType: 'json', feedType: 'json',
}, },
{ {
id: 'some.pics', id: 'some.pics',
isActive: false, isActive: true,
userId: 'dylan', // your omg.lol username userId: 'dylan', // your omg.lol username
feedUrlTemplate: 'https://{userId}.some.pics/rss', feedUrlTemplate: 'https://{userId}.some.pics/rss',
feedType: 'some.pics', feedType: 'some.pics',
@ -25,9 +25,9 @@ export const services = [
// ======================================================================== // ========================================================================
{ {
id: 'blog', id: 'blog',
isActive: true, isActive: false,
feedUrl: 'https://blog.agnes.love/feed/', // direct url to your blog's rss feed feedUrl: 'https://your-blog.com/feed.xml', // direct url to your blog's rss feed
feedType: 'atom', feedType: 'rss',
}, },
// ======================================================================== // ========================================================================
@ -36,7 +36,7 @@ export const services = [
{ {
id: 'lastfm', id: 'lastfm',
isActive: true, isActive: true,
userId: 'keegbovo', // your last.fm username userId: 'lookathimthere', // your last.fm username
feedUrlTemplate: 'https://lfm.xiffy.nl/{userId}', feedUrlTemplate: 'https://lfm.xiffy.nl/{userId}',
feedType: 'rss', feedType: 'rss',
}, },
@ -59,11 +59,11 @@ export const services = [
// ======================================================================== // ========================================================================
{ {
id: 'mastodon', id: 'mastodon',
isActive: true, isActive: false,
userId: 'alien', // your mastodon username userId: 'dylan', // your mastodon username
instance: 'lesbian.alien.dentist', // your mastodon instance instance: 'social.lol', // your mastodon instance
feedUrlTemplate: 'lesbian.alien.dentist/@alien.atom', feedUrlTemplate: 'https://{instance}/@{userId}.rss',
feedType: 'atom', feedType: 'mastodon',
showImage: true, showImage: true,
}, },
{ {
@ -76,9 +76,9 @@ export const services = [
}, },
{ {
id: 'bluesky', id: 'bluesky',
isActive: true, isActive: false,
userId: 'agnes.love', // your bluesky handle userId: 'your-handle.bsky.social', // your bluesky handle
feedUrlTemplate: 'https://bsky.app/profile/agnes.love/rss', feedUrlTemplate: 'https://bsky.app/profile/{userId}/rss',
feedType: 'rss', feedType: 'rss',
}, },
@ -87,7 +87,7 @@ export const services = [
// ======================================================================== // ========================================================================
{ {
id: 'letterboxd', id: 'letterboxd',
isActive: false, isActive: true,
userId: 'stfudonny', // your letterboxd username userId: 'stfudonny', // your letterboxd username
feedUrlTemplate: 'https://letterboxd.com/{userId}/rss/', feedUrlTemplate: 'https://letterboxd.com/{userId}/rss/',
feedType: 'letterboxd', feedType: 'letterboxd',
@ -95,7 +95,7 @@ export const services = [
}, },
{ {
id: 'trakt-episode', id: 'trakt-episode',
isActive: false, isActive: true,
userId: 'crankle', // your trakt username userId: 'crankle', // your trakt username
traktId: '78e1e87b446901f7e4f0883dd4995cec', // your trakt ID traktId: '78e1e87b446901f7e4f0883dd4995cec', // your trakt ID
feedType: 'trakt-episode', feedType: 'trakt-episode',
@ -103,7 +103,7 @@ export const services = [
}, },
{ {
id: 'trakt-movie', id: 'trakt-movie',
isActive: false, isActive: true,
userId: 'crankle', // your trakt username userId: 'crankle', // your trakt username
traktId: '78e1e87b446901f7e4f0883dd4995cec', // your trakt ID traktId: '78e1e87b446901f7e4f0883dd4995cec', // your trakt ID
feedType: 'trakt-movie', feedType: 'trakt-movie',
@ -115,7 +115,7 @@ export const services = [
// ======================================================================== // ========================================================================
{ {
id: 'hardcover', id: 'hardcover',
isActive: false, isActive: true,
userId: '62036', // your hardcover user ID (find in your API token or profile URL) userId: '62036', // your hardcover user ID (find in your API token or profile URL)
feedUrl: 'https://api.hardcover.app/v1/graphql', feedUrl: 'https://api.hardcover.app/v1/graphql',
feedType: 'hardcover', feedType: 'hardcover',
@ -123,8 +123,8 @@ export const services = [
}, },
{ {
id: 'storygraph', id: 'storygraph',
isActive: true, isActive: false,
userId: 'telescopefish', // your storygraph username userId: 'your-username', // your storygraph username
feedUrlTemplate: 'https://app.thestorygraph.com/profile/{userId}.rss', feedUrlTemplate: 'https://app.thestorygraph.com/profile/{userId}.rss',
feedType: 'rss', feedType: 'rss',
}, },
@ -141,7 +141,7 @@ export const services = [
// ======================================================================== // ========================================================================
{ {
id: 'steam', id: 'steam',
isActive: false, isActive: true,
userId: '76561198022952207', // your steam ID 64 (not username) - convert at steamid.io userId: '76561198022952207', // your steam ID 64 (not username) - convert at steamid.io
feedType: 'steam', feedType: 'steam',
}, },
@ -151,7 +151,7 @@ export const services = [
// ======================================================================== // ========================================================================
{ {
id: 'source.tube', id: 'source.tube',
isActive: false, isActive: true,
userId: 'dylan', // your source.tube username userId: 'dylan', // your source.tube username
feedUrlTemplate: 'https://source.tube/{userId}.rss', feedUrlTemplate: 'https://source.tube/{userId}.rss',
feedType: 'source.tube', feedType: 'source.tube',