74 lines
2.0 KiB
TypeScript
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: [
|
|
]
|
|
});
|
|
}
|
|
}
|