2026-01-16 16:21:28 +00:00

74 lines
2.0 KiB
TypeScript

// app/api/music/tracks/route.ts
import { NextResponse } from 'next/server';
import { readdir } from 'fs/promises';
import { join } from 'path';
export const dynamic = 'force-dynamic';
interface Track {
title: string;
fileName: string;
artist: string;
theme: string;
}
function parseFileName(fileName: string): Track {
// Remove file extension
const nameWithoutExt = fileName.replace(/\.(mp4|mp3|wav|ogg)$/i, '');
// Parse format: [music_name]_[theme/genre].[format]
const parts = nameWithoutExt.split('_');
if (parts.length >= 2) {
const theme = parts[parts.length - 1].toLowerCase();
const title = parts.slice(0, -1).join(' ');
return {
title: title.replace(/-/g, ' ').replace(/\b\w/g, l => l.toUpperCase()),
fileName: fileName,
artist: theme.charAt(0).toUpperCase() + theme.slice(1) + ' Collection',
theme: theme
};
}
// Fallback for files that don't follow the naming convention
return {
title: nameWithoutExt.replace(/-|_/g, ' ').replace(/\b\w/g, l => l.toUpperCase()),
fileName: fileName,
artist: 'Unknown Artist',
theme: 'general'
};
}
export async function GET() {
try {
// Path to your music directory
const musicDir = join(process.cwd(), 'public', 'files', 'music');
// Read all files in the directory
const files = await readdir(musicDir);
// Filter for audio/video files and parse them
const tracks = files
.filter(file => /\.(mp4|mp3|wav|ogg)$/i.test(file))
.map(file => parseFileName(file))
.sort((a, b) => {
// Sort by theme first, then by title
if (a.theme !== b.theme) {
return a.theme.localeCompare(b.theme);
}
return a.title.localeCompare(b.title);
});
return NextResponse.json({ tracks });
} catch (error) {
console.error('Error reading music directory:', error);
// Return fallback tracks if directory reading fails
return NextResponse.json({
tracks: [
]
});
}
}