const express = require('express'); const mm = require('music-metadata'); const util = require('util'); const fs = require('fs'); const path = require('path'); const app = express(); const PORT = process.env.PORT || 7860; app.use(express.static('public')); app.use('/music', express.static('music')); const SUPPORTED_FORMATS = ['.mp3', '.mp4', '.wav', '.flac', '.ogg', '.opus']; // Add or remove formats as needed function isSupportedFormat(filename) { const ext = path.extname(filename).toLowerCase(); return SUPPORTED_FORMATS.includes(ext); } app.get('/tracks', async (req, res) => { const pageNumber = parseInt(req.query.page) || 1; const pageSize = 5; // Number of items per page fs.readdir('music', async (err, files) => { if (err) { console.error('Error reading music directory', err); return res.sendStatus(500); } const filteredFiles = files.filter(file => isSupportedFormat(file)); const pageStart = (pageNumber - 1) * pageSize; const pageEnd = pageStart + pageSize; // Slice files for the requested page const pagedFiles = filteredFiles.slice(pageStart, pageEnd); const trackDetails = []; for (const file of pagedFiles) { const filePath = path.join(__dirname, 'music', file); try { const metadata = await mm.parseFile(filePath, { native: true }); const artwork = metadata.common.picture && metadata.common.picture[0] ? `data:${metadata.common.picture[0].format};base64,${metadata.common.picture[0].data.toString('base64')}` : ''; trackDetails.push({filename: file, artwork}); } catch (error) { console.error(`Error reading metadata for file: ${file}`, error); } } res.json({tracks: trackDetails, total: filteredFiles.length}); }); }); app.listen(PORT, () => console.log(`Server running on port ${PORT}`));