From 0f5e8d1ec935754b285f1564a1f29c038f84b7a4 Mon Sep 17 00:00:00 2001 From: svemagie <869694+svemagie@users.noreply.github.com> Date: Mon, 9 Mar 2026 15:02:17 +0100 Subject: [PATCH] Add scheduled listening refresh and configurable fetch cache --- .env.example | 9 ++++++--- .github/workflows/deploy.yml | 12 ++++++++++++ _data/funkwhaleActivity.js | 10 +++++++++- _data/lastfmActivity.js | 10 +++++++++- theme/_data/funkwhaleActivity.js | 10 +++++++++- theme/_data/lastfmActivity.js | 10 +++++++++- 6 files changed, 54 insertions(+), 7 deletions(-) diff --git a/.env.example b/.env.example index d7a5d6a..2ccd00a 100644 --- a/.env.example +++ b/.env.example @@ -27,6 +27,9 @@ AUTHOR_TITLE= AUTHOR_PRONOUN= SITE_LOCALE=de -# --- Where page (OwnYourSwarm/Swarm checkins) --- -OWNYOURSWARM_FEED_URL= -OWNYOURSWARM_FEED_TOKEN= \ No newline at end of file +# --- Listening cache (EleventyFetch) --- +# Shared cache duration for listening data fetches during build (examples: 2m, 5m, 15m) +LISTENING_FETCH_CACHE_DURATION=5m +# Optional per-source overrides +FUNKWHALE_FETCH_CACHE_DURATION= +LASTFM_FETCH_CACHE_DURATION= diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 80f3ebb..3419a5d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -3,6 +3,9 @@ name: Build & Deploy on: push: branches: [main] + schedule: + - cron: "*/15 * * * *" + workflow_dispatch: jobs: build-and-deploy: @@ -42,6 +45,9 @@ jobs: SITE_LOCALE: ${{ secrets.SITE_LOCALE }} OWNYOURSWARM_FEED_URL: ${{ secrets.OWNYOURSWARM_FEED_URL }} OWNYOURSWARM_FEED_TOKEN: ${{ secrets.OWNYOURSWARM_FEED_TOKEN }} + LISTENING_FETCH_CACHE_DURATION: ${{ secrets.LISTENING_FETCH_CACHE_DURATION }} + FUNKWHALE_FETCH_CACHE_DURATION: ${{ secrets.FUNKWHALE_FETCH_CACHE_DURATION }} + LASTFM_FETCH_CACHE_DURATION: ${{ secrets.LASTFM_FETCH_CACHE_DURATION }} run: | { printf 'SITE_URL=%s\n' "$SITE_URL" @@ -63,6 +69,9 @@ jobs: printf 'SITE_LOCALE=%s\n' "$SITE_LOCALE" printf 'OWNYOURSWARM_FEED_URL=%s\n' "$OWNYOURSWARM_FEED_URL" printf 'OWNYOURSWARM_FEED_TOKEN=%s\n' "$OWNYOURSWARM_FEED_TOKEN" + printf 'LISTENING_FETCH_CACHE_DURATION=%s\n' "$LISTENING_FETCH_CACHE_DURATION" + printf 'FUNKWHALE_FETCH_CACHE_DURATION=%s\n' "$FUNKWHALE_FETCH_CACHE_DURATION" + printf 'LASTFM_FETCH_CACHE_DURATION=%s\n' "$LASTFM_FETCH_CACHE_DURATION" } > .env - name: Build site @@ -82,6 +91,9 @@ jobs: MASTODON_USER: ${{ secrets.MASTODON_USER }} OWNYOURSWARM_FEED_URL: ${{ secrets.OWNYOURSWARM_FEED_URL }} OWNYOURSWARM_FEED_TOKEN: ${{ secrets.OWNYOURSWARM_FEED_TOKEN }} + LISTENING_FETCH_CACHE_DURATION: ${{ secrets.LISTENING_FETCH_CACHE_DURATION }} + FUNKWHALE_FETCH_CACHE_DURATION: ${{ secrets.FUNKWHALE_FETCH_CACHE_DURATION }} + LASTFM_FETCH_CACHE_DURATION: ${{ secrets.LASTFM_FETCH_CACHE_DURATION }} - name: Deploy via SCP uses: appleboy/scp-action@v0.1.7 diff --git a/_data/funkwhaleActivity.js b/_data/funkwhaleActivity.js index 4824942..63f2af3 100644 --- a/_data/funkwhaleActivity.js +++ b/_data/funkwhaleActivity.js @@ -8,6 +8,11 @@ import EleventyFetch from "@11ty/eleventy-fetch"; const INDIEKIT_URL = process.env.INDIEKIT_URL || process.env.SITE_URL || "https://example.com"; const FUNKWHALE_INSTANCE = process.env.FUNKWHALE_INSTANCE || ""; +const DEFAULT_FETCH_CACHE_DURATION = "5m"; +const LISTENING_FETCH_CACHE_DURATION = + (process.env.LISTENING_FETCH_CACHE_DURATION || "").trim() || DEFAULT_FETCH_CACHE_DURATION; +const FUNKWHALE_FETCH_CACHE_DURATION = + (process.env.FUNKWHALE_FETCH_CACHE_DURATION || "").trim() || LISTENING_FETCH_CACHE_DURATION; /** * Fetch from Indiekit's public Funkwhale API endpoint @@ -22,7 +27,7 @@ async function fetchFromIndiekit(endpoint) { try { console.log(`[funkwhaleActivity] Fetching from Indiekit: ${url}`); const data = await EleventyFetch(url, { - duration: "15m", + duration: FUNKWHALE_FETCH_CACHE_DURATION, type: "json", }); console.log(`[funkwhaleActivity] Indiekit ${endpoint} success via ${url}`); @@ -61,6 +66,9 @@ function formatDuration(seconds) { export default async function () { try { console.log("[funkwhaleActivity] Fetching Funkwhale data..."); + console.log( + `[funkwhaleActivity] EleventyFetch cache duration: ${FUNKWHALE_FETCH_CACHE_DURATION}` + ); // Fetch all data from Indiekit API const [nowPlaying, listenings, favorites, stats] = await Promise.all([ diff --git a/_data/lastfmActivity.js b/_data/lastfmActivity.js index bb85a61..7be3ff0 100644 --- a/_data/lastfmActivity.js +++ b/_data/lastfmActivity.js @@ -8,6 +8,11 @@ import EleventyFetch from "@11ty/eleventy-fetch"; const INDIEKIT_URL = process.env.INDIEKIT_URL || process.env.SITE_URL || "https://example.com"; const LASTFM_USERNAME = process.env.LASTFM_USERNAME || ""; +const DEFAULT_FETCH_CACHE_DURATION = "5m"; +const LISTENING_FETCH_CACHE_DURATION = + (process.env.LISTENING_FETCH_CACHE_DURATION || "").trim() || DEFAULT_FETCH_CACHE_DURATION; +const LASTFM_FETCH_CACHE_DURATION = + (process.env.LASTFM_FETCH_CACHE_DURATION || "").trim() || LISTENING_FETCH_CACHE_DURATION; /** * Fetch from Indiekit's public Last.fm API endpoint @@ -22,7 +27,7 @@ async function fetchFromIndiekit(path) { try { console.log(`[lastfmActivity] Fetching from Indiekit: ${url}`); const data = await EleventyFetch(url, { - duration: "15m", + duration: LASTFM_FETCH_CACHE_DURATION, type: "json", }); console.log(`[lastfmActivity] Indiekit ${path} success via ${url}`); @@ -40,6 +45,9 @@ async function fetchFromIndiekit(path) { export default async function () { try { console.log("[lastfmActivity] Fetching Last.fm data..."); + console.log( + `[lastfmActivity] EleventyFetch cache duration: ${LASTFM_FETCH_CACHE_DURATION}` + ); // Fetch all data from Indiekit API const [nowPlaying, scrobbles, loved, stats] = await Promise.all([ diff --git a/theme/_data/funkwhaleActivity.js b/theme/_data/funkwhaleActivity.js index 4824942..63f2af3 100644 --- a/theme/_data/funkwhaleActivity.js +++ b/theme/_data/funkwhaleActivity.js @@ -8,6 +8,11 @@ import EleventyFetch from "@11ty/eleventy-fetch"; const INDIEKIT_URL = process.env.INDIEKIT_URL || process.env.SITE_URL || "https://example.com"; const FUNKWHALE_INSTANCE = process.env.FUNKWHALE_INSTANCE || ""; +const DEFAULT_FETCH_CACHE_DURATION = "5m"; +const LISTENING_FETCH_CACHE_DURATION = + (process.env.LISTENING_FETCH_CACHE_DURATION || "").trim() || DEFAULT_FETCH_CACHE_DURATION; +const FUNKWHALE_FETCH_CACHE_DURATION = + (process.env.FUNKWHALE_FETCH_CACHE_DURATION || "").trim() || LISTENING_FETCH_CACHE_DURATION; /** * Fetch from Indiekit's public Funkwhale API endpoint @@ -22,7 +27,7 @@ async function fetchFromIndiekit(endpoint) { try { console.log(`[funkwhaleActivity] Fetching from Indiekit: ${url}`); const data = await EleventyFetch(url, { - duration: "15m", + duration: FUNKWHALE_FETCH_CACHE_DURATION, type: "json", }); console.log(`[funkwhaleActivity] Indiekit ${endpoint} success via ${url}`); @@ -61,6 +66,9 @@ function formatDuration(seconds) { export default async function () { try { console.log("[funkwhaleActivity] Fetching Funkwhale data..."); + console.log( + `[funkwhaleActivity] EleventyFetch cache duration: ${FUNKWHALE_FETCH_CACHE_DURATION}` + ); // Fetch all data from Indiekit API const [nowPlaying, listenings, favorites, stats] = await Promise.all([ diff --git a/theme/_data/lastfmActivity.js b/theme/_data/lastfmActivity.js index bb85a61..7be3ff0 100644 --- a/theme/_data/lastfmActivity.js +++ b/theme/_data/lastfmActivity.js @@ -8,6 +8,11 @@ import EleventyFetch from "@11ty/eleventy-fetch"; const INDIEKIT_URL = process.env.INDIEKIT_URL || process.env.SITE_URL || "https://example.com"; const LASTFM_USERNAME = process.env.LASTFM_USERNAME || ""; +const DEFAULT_FETCH_CACHE_DURATION = "5m"; +const LISTENING_FETCH_CACHE_DURATION = + (process.env.LISTENING_FETCH_CACHE_DURATION || "").trim() || DEFAULT_FETCH_CACHE_DURATION; +const LASTFM_FETCH_CACHE_DURATION = + (process.env.LASTFM_FETCH_CACHE_DURATION || "").trim() || LISTENING_FETCH_CACHE_DURATION; /** * Fetch from Indiekit's public Last.fm API endpoint @@ -22,7 +27,7 @@ async function fetchFromIndiekit(path) { try { console.log(`[lastfmActivity] Fetching from Indiekit: ${url}`); const data = await EleventyFetch(url, { - duration: "15m", + duration: LASTFM_FETCH_CACHE_DURATION, type: "json", }); console.log(`[lastfmActivity] Indiekit ${path} success via ${url}`); @@ -40,6 +45,9 @@ async function fetchFromIndiekit(path) { export default async function () { try { console.log("[lastfmActivity] Fetching Last.fm data..."); + console.log( + `[lastfmActivity] EleventyFetch cache duration: ${LASTFM_FETCH_CACHE_DURATION}` + ); // Fetch all data from Indiekit API const [nowPlaying, scrobbles, loved, stats] = await Promise.all([