62 lines
2.0 KiB
TypeScript
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 });
|
|
}
|
|
}
|