Add scheduled listening refresh and configurable fetch cache

This commit is contained in:
svemagie
2026-03-09 15:02:17 +01:00
parent 015866f4f9
commit 0f5e8d1ec9
6 changed files with 54 additions and 7 deletions

View File

@@ -27,6 +27,9 @@ AUTHOR_TITLE=
AUTHOR_PRONOUN=
SITE_LOCALE=de
# --- Where page (OwnYourSwarm/Swarm checkins) ---
OWNYOURSWARM_FEED_URL=
OWNYOURSWARM_FEED_TOKEN=
# --- 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=

View File

@@ -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

View File

@@ -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([

View File

@@ -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([

View File

@@ -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([

View File

@@ -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([