Add podroll endpoint integration and env docs

This commit is contained in:
svemagie
2026-03-09 09:30:36 +01:00
parent 8daa96afe2
commit 3153cf95f2
5 changed files with 72 additions and 0 deletions

11
.env.example Normal file
View File

@@ -0,0 +1,11 @@
# Optional Podroll endpoint settings
# Default mount path in indiekit.config.mjs is /podrollapi
PODROLL_MOUNT_PATH=/podrollapi
# FreshRSS greader API URL for episode sync
# Example: https://freshrss.example/api/query.php?user=USER&t=TOKEN&f=greader
PODROLL_EPISODES_URL=
# FreshRSS OPML export URL for source sync
# Example: https://freshrss.example/api/query.php?user=USER&t=TOKEN&f=opml
PODROLL_OPML_URL=

View File

@@ -23,6 +23,7 @@
- GitHub activity + API: `/github`
- Funkwhale activity + API: `/funkwhale`
- Last.fm activity + API: `/lastfmapi`
- Podroll dashboard + API: `/podrollapi`
- ActivityPub federation + admin reader: `/activitypub`
- ActivityPub discovery: `/.well-known/webfinger`, `/nodeinfo/2.1`
@@ -82,6 +83,15 @@
- If `FUNKWHALE_INSTANCE` points to a host that does not expose Funkwhale's API routes, API responses now degrade to empty data instead of repeated 500 errors.
- If these variables are missing, the endpoints still exist but return empty activity until credentials are configured.
## Podroll endpoint
- Podroll endpoint is enabled via `@rmdes/indiekit-endpoint-podroll` and mounted at `/podrollapi` by default.
- Optional environment variables:
- `PODROLL_MOUNT_PATH` (default `/podrollapi`)
- `PODROLL_EPISODES_URL` (FreshRSS greader endpoint URL used for episode sync)
- `PODROLL_OPML_URL` (FreshRSS OPML export URL used for podcast source sync)
- If `PODROLL_EPISODES_URL` and `PODROLL_OPML_URL` are not set, the endpoint still loads and can be configured from its admin dashboard.
## ActivityPub
- ActivityPub federation is enabled via `@rmdes/indiekit-endpoint-activitypub`.

View File

@@ -1,6 +1,7 @@
import "dotenv/config";
import path from "node:path";
import { fileURLToPath } from "node:url";
import PodrollEndpoint from "@rmdes/indiekit-endpoint-podroll";
const mongoUsername = process.env.MONGO_USERNAME || process.env.MONGO_USER || "";
const mongoPassword = process.env.MONGO_PASSWORD || "";
@@ -84,6 +85,9 @@ const activityPubDebugDashboard =
const activityPubDebugPassword = process.env.AP_DEBUG_PASSWORD || "";
const activityPubAlsoKnownAs = process.env.AP_ALSO_KNOWN_AS || "";
const redisUrl = process.env.REDIS_URL || "";
const podrollMountPath = process.env.PODROLL_MOUNT_PATH || "/podrollapi";
const podrollEpisodesUrl = process.env.PODROLL_EPISODES_URL || "";
const podrollOpmlUrl = process.env.PODROLL_OPML_URL || "";
const configDir = path.dirname(fileURLToPath(import.meta.url));
const homepageContentDir =
process.env.HOMEPAGE_CONTENT_DIR ||
@@ -182,6 +186,11 @@ export default {
"@rmdes/indiekit-endpoint-conversations",
"@rmdes/indiekit-endpoint-funkwhale",
"@rmdes/indiekit-endpoint-lastfm",
new PodrollEndpoint({
mountPath: podrollMountPath,
episodesUrl: podrollEpisodesUrl,
opmlUrl: podrollOpmlUrl,
}),
"@rmdes/indiekit-endpoint-activitypub",
],
"@indiekit/store-github": {

41
package-lock.json generated
View File

@@ -19,6 +19,7 @@
"@rmdes/indiekit-endpoint-github": "^1.2.3",
"@rmdes/indiekit-endpoint-homepage": "^1.0.22",
"@rmdes/indiekit-endpoint-lastfm": "^1.0.12",
"@rmdes/indiekit-endpoint-podroll": "^1.0.11",
"@rmdes/indiekit-endpoint-posts": "^1.0.0-beta.25",
"@rmdes/indiekit-endpoint-webmention-io": "^1.0.7",
"@rmdes/indiekit-post-type-page": "^1.0.4",
@@ -2200,6 +2201,24 @@
"@indiekit/indiekit": ">=1.0.0-beta.25"
}
},
"node_modules/@rmdes/indiekit-endpoint-podroll": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@rmdes/indiekit-endpoint-podroll/-/indiekit-endpoint-podroll-1.0.11.tgz",
"integrity": "sha512-ShCVRfeGntKhXUtCDOIKbAAWBHM+ssj+QVCCGNq7rFL5tSdFEKFtwVCIYS/nvrQztzN1tCxT5AjjGGrXc9Xz9g==",
"license": "MIT",
"dependencies": {
"@indiekit/error": "^1.0.0-beta.25",
"express": "^5.0.0",
"sanitize-html": "^2.13.0",
"xml2js": "^0.6.2"
},
"engines": {
"node": ">=20"
},
"peerDependencies": {
"@indiekit/indiekit": ">=1.0.0-beta.25"
}
},
"node_modules/@rmdes/indiekit-endpoint-posts": {
"version": "1.0.0-beta.25",
"resolved": "https://registry.npmjs.org/@rmdes/indiekit-endpoint-posts/-/indiekit-endpoint-posts-1.0.0-beta.25.tgz",
@@ -6937,6 +6956,28 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"license": "ISC"
},
"node_modules/xml2js": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz",
"integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==",
"license": "MIT",
"dependencies": {
"sax": ">=0.6.0",
"xmlbuilder": "~11.0.0"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/xmlbuilder": {
"version": "11.0.1",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
"integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
"license": "MIT",
"engines": {
"node": ">=4.0"
}
},
"node_modules/xss": {
"version": "1.0.15",
"resolved": "https://registry.npmjs.org/xss/-/xss-1.0.15.tgz",

View File

@@ -31,6 +31,7 @@
"@rmdes/indiekit-endpoint-github": "^1.2.3",
"@rmdes/indiekit-endpoint-homepage": "^1.0.22",
"@rmdes/indiekit-endpoint-lastfm": "^1.0.12",
"@rmdes/indiekit-endpoint-podroll": "^1.0.11",
"@rmdes/indiekit-endpoint-posts": "^1.0.0-beta.25",
"@rmdes/indiekit-endpoint-webmention-io": "^1.0.7",
"@rmdes/indiekit-post-type-page": "^1.0.4",