Add feed discovery plugin

This commit is contained in:
Anthony Ettinger 2026-06-09 09:34:31 +00:00
parent e47616bf9d
commit 5cfeea6b57
37 changed files with 2432 additions and 5 deletions

View file

@ -0,0 +1,34 @@
import type { FeedDiscoveryConfig } from "./types.js";
const DEFAULT_TIMEOUT_MS = 8_000;
const DEFAULT_MAX_BODY_BYTES = 1_000_000;
export function readFeedDiscoveryConfig(env: NodeJS.ProcessEnv = process.env): FeedDiscoveryConfig {
return {
cacheTtlSeconds: readNumber(env.LOGICSRC_FEEDS_CACHE_TTL_SECONDS, 86_400),
maxProviders: readNumber(env.LOGICSRC_FEEDS_MAX_PROVIDERS, 10),
maxProbes: readNumber(env.LOGICSRC_FEEDS_MAX_PROBES, 50),
requestTimeoutMs: readNumber(env.LOGICSRC_FEEDS_REQUEST_TIMEOUT_MS, DEFAULT_TIMEOUT_MS),
maxBodyBytes: readNumber(env.LOGICSRC_FEEDS_MAX_BODY_BYTES, DEFAULT_MAX_BODY_BYTES),
userAgent: env.LOGICSRC_FEEDS_USER_AGENT || "LogicSrcFeedDiscovery/0.1",
opmlPaths: splitList(env.LOGICSRC_FEEDS_OPML_PATHS),
candidateUrls: splitList(env.LOGICSRC_FEEDS_CANDIDATE_URLS),
podcastIndexApiKey: env.PODCASTINDEX_API_KEY,
podcastIndexApiSecret: env.PODCASTINDEX_API_SECRET
};
}
function readNumber(value: string | undefined, fallback: number) {
if (!value) {
return fallback;
}
const parsed = Number(value);
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
}
function splitList(value: string | undefined) {
return (value ?? "")
.split(",")
.map((entry) => entry.trim())
.filter(Boolean);
}