00b3dddca6
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>
48 lines
1.6 KiB
TypeScript
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"),
|
|
});
|
|
}
|