nextav/src/app/api/files/route.ts

62 lines
2.0 KiB
TypeScript

import { NextResponse } from "next/server";
import fs from "fs";
import path from "path";
import db from '@/db';
const VIDEO_EXTENSIONS = ["mp4", "mkv", "avi", "mov", "wmv", "flv", "webm", "m4v"];
const PHOTO_EXTENSIONS = ["jpg", "jpeg", "png", "gif", "bmp", "webp", "tiff", "svg"];
export async function GET(request: Request) {
const { searchParams } = new URL(request.url);
const dirPath = searchParams.get("path");
if (!dirPath) {
return NextResponse.json({ error: "Path is required" }, { status: 400 });
}
try {
const files = fs.readdirSync(dirPath);
// Get media files from database for this path
const mediaFiles = db.prepare(`
SELECT id, path, type, thumbnail, avg_rating, star_count
FROM media
WHERE path LIKE ?
`).all(`${dirPath}%`) as Array<{id: number, path: string, type: string, thumbnail: string | null, avg_rating: number, star_count: number}>;
const result = files.map((file) => {
const filePath = path.join(dirPath, file);
const stats = fs.statSync(filePath);
const ext = path.extname(file).toLowerCase();
let type = 'file';
const cleanExt = ext.replace('.', '').toLowerCase();
if (VIDEO_EXTENSIONS.some(v => v.toLowerCase() === cleanExt)) {
type = 'video';
} else if (PHOTO_EXTENSIONS.some(p => p.toLowerCase() === cleanExt)) {
type = 'photo';
}
// Find matching media file in database
const mediaFile = mediaFiles.find((m: any) => m.path === filePath);
return {
name: file,
path: filePath,
isDirectory: stats.isDirectory(),
size: stats.size,
type: mediaFile?.type || type,
thumbnail: mediaFile?.thumbnail,
id: mediaFile?.id,
avg_rating: mediaFile?.avg_rating || 0,
star_count: mediaFile?.star_count || 0,
};
});
return NextResponse.json(result);
} catch (error: any) {
return NextResponse.json({ error: error.message }, { status: 500 });
}
}