stremio/apps/master-api/src/config.ts
Jos Vooges | STH eb8ae1e85a Fix Stremio playback, folder-aware scan, and remove STH branding.
Parse Plex-style Title (Year) and Show/Season folders; restore notWebReady with direct node stream URLs; hide unavailable titles by default.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-25 02:16:46 +02:00

30 lines
1.2 KiB
TypeScript

import { z } from "zod";
const configSchema = z.object({
NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
PORT: z.coerce.number().default(3000),
HOST: z.string().default("0.0.0.0"),
DATABASE_URL: z.string(),
REDIS_URL: z.string().default("redis://localhost:6379"),
SESSION_SECRET: z.string().min(32),
ADMIN_EMAIL: z.string().email().optional(),
ADMIN_PASSWORD: z.string().min(8).optional(),
TMDB_API_KEY: z.string().optional(),
PUBLIC_URL: z.string().url().default("http://localhost:3000"),
PLAYBACK_IDLE_TIMEOUT_SECONDS: z.coerce.number().default(1200),
PLAYBACK_ABSOLUTE_LIFETIME_SECONDS: z.coerce.number().default(43200),
NODE_HEARTBEAT_INTERVAL_SECONDS: z.coerce.number().default(30),
NODE_OFFLINE_THRESHOLD_SECONDS: z.coerce.number().default(90),
HIDE_UNAVAILABLE_TITLES: z.coerce.boolean().default(true),
});
export type Config = z.infer<typeof configSchema>;
export function loadConfig(): Config {
const result = configSchema.safeParse(process.env);
if (!result.success) {
console.error("Invalid configuration:", result.error.flatten().fieldErrors);
process.exit(1);
}
return result.data;
}