jefflix-website/app/api/music/slskd/results/[searchId]/route.ts

55 lines
1.4 KiB
TypeScript

import { NextResponse } from 'next/server'
import { slskdFetch } from '@/lib/slskd'
interface SlskdFile {
filename: string
size: number
bitRate: number
length: number
}
interface SlskdSearchResponse {
username: string
files: SlskdFile[]
freeUploadSlots: number
speed: number
}
export async function GET(
_request: Request,
{ params }: { params: Promise<{ searchId: string }> }
) {
const { searchId } = await params
try {
const res = await slskdFetch(`/searches/${searchId}`)
if (!res.ok) {
throw new Error(`slskd results returned ${res.status}`)
}
const data = await res.json()
const isComplete = data.state === 'Completed' || data.state === 'TimedOut'
// Flatten results: each response has username + files
const results = (data.responses || [])
.filter((r: SlskdSearchResponse) => r.files?.length > 0)
.slice(0, 20)
.map((r: SlskdSearchResponse) => ({
username: r.username,
freeSlots: r.freeUploadSlots,
speed: r.speed,
files: r.files.slice(0, 5).map((f: SlskdFile) => ({
filename: f.filename,
size: f.size,
bitRate: f.bitRate,
length: f.length,
})),
}))
return NextResponse.json({ results, isComplete })
} catch (error) {
console.error('Soulseek results error:', error)
return NextResponse.json({ error: 'Failed to get results' }, { status: 502 })
}
}