import { NextRequest, NextResponse } from "next/server"; import { searchSongs as searchSongsDB, upsertSong } from "@/lib/db/client"; import { searchSongs as searchMB } from "@/lib/musicbrainz/client"; import { z } from "zod"; const QuerySchema = z.object({ q: z.string().min(1).max(200), limit: z.coerce.number().int().min(1).max(50).default(20), }); export async function GET(req: NextRequest) { const params = Object.fromEntries(req.nextUrl.searchParams); const parsed = QuerySchema.safeParse(params); if (!parsed.success) { return NextResponse.json( { error: "Invalid query parameters", details: parsed.error.flatten() }, { status: 400 } ); } const { q, limit } = parsed.data; // Try local DB first let songs = await searchSongsDB(q, limit); // Augment from MusicBrainz when local results are thin if (songs.length < 3) { try { const mbResults = await searchMB(q, limit); for (const s of mbResults) { await upsertSong({ mbid: s.mbid, title: s.title, artist: s.artist, duration_seconds: s.duration_seconds, acousticbrainz_bpm: null, acousticbrainz_time_sig_num: null, source: "musicbrainz", }); } songs = await searchSongsDB(q, limit); } catch (err) { console.error("[songs] MusicBrainz search failed:", err); } } return NextResponse.json({ songs, total: songs.length }); }