55 lines
1.4 KiB
TypeScript
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 })
|
|
}
|
|
}
|