Files
Lyra/web/src/app/api/config/route.ts
T
Jonathan 00b3dddca6 feat: Qobuz auth-token (user_id + token) login as a reliable alternative to email/password
Qobuz's email/password API login returns 401 even with valid credentials
(a known Qobuz limitation, unaffected by streamrip version). Add settings
fields for a Qobuz user ID + auth token (token stored encrypted); when both
are present StreamripClient uses use_auth_token=True, else falls back to
email/password.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 00:46:17 +02:00

48 lines
1.6 KiB
TypeScript

import { prisma } from "@/lib/db";
import { encryptSecret } from "@/lib/crypto";
// settings field -> (config key, is secret)
const FIELDS: Record<string, { key: string; secret: boolean }> = {
qobuzEmail: { key: "qobuz.email", secret: false },
qobuzPassword: { key: "qobuz.password", secret: true },
qobuzUserId: { key: "qobuz.user_id", secret: false },
qobuzToken: { key: "qobuz.auth_token", secret: true },
slskdUrl: { key: "slskd.url", secret: false },
slskdApiKey: { key: "slskd.api_key", secret: true },
};
export async function PUT(request: Request) {
let body: Record<string, unknown>;
try {
body = (await request.json()) as Record<string, unknown>;
} catch {
return Response.json({ error: "invalid JSON" }, { status: 400 });
}
for (const [field, { key, secret }] of Object.entries(FIELDS)) {
const raw = body[field];
if (typeof raw !== "string" || raw === "") continue; // absent or "unchanged"
const value = secret ? encryptSecret(raw) : raw;
await prisma.config.upsert({
where: { key },
create: { key, value, secret },
update: { value, secret },
});
}
return Response.json({ ok: true });
}
export async function GET() {
const rows = await prisma.config.findMany();
const byKey = new Map(rows.map((r) => [r.key, r]));
return Response.json({
qobuzEmail: byKey.get("qobuz.email")?.value ?? "",
qobuzUserId: byKey.get("qobuz.user_id")?.value ?? "",
slskdUrl: byKey.get("slskd.url")?.value ?? "",
qobuzPasswordSet: byKey.has("qobuz.password"),
qobuzTokenSet: byKey.has("qobuz.auth_token"),
slskdApiKeySet: byKey.has("slskd.api_key"),
});
}