import fs from 'fs' import path from 'path' import { eventHandler } from 'h3' import { getCardFromDate } from '../../../utils/cards' export default eventHandler(async (event) => { const dirPath = path.join(process.cwd(), '/mnt/media/files/music') const urlPrefix = `https://files.erudi.fr/music` try { let allTracks: any[] = [] const items = await fs.promises.readdir(dirPath, { withFileTypes: true }) // Process files const files = items .filter((item) => item.isFile() && !item.name.startsWith('.') && !item.name.endsWith('.jpg')) .map((item) => item.name) // Process folders const folders = items .filter((item) => item.isDirectory() && !item.name.startsWith('.')) .map((folder, index) => ({ id: `folder-${index}`, boxId: 'ESFOLDER', title: folder.name.replace(/_/g, ' ').trim(), type: 'folder', order: 0, date: new Date(), card: getCardFromDate(new Date()) })) const tracks = files.map((file, index) => { const EXT_RE = /\.(mp3|flac|wav|opus)$/i const nameWithoutExt = file.replace(EXT_RE, '') // On split sur __ const parts = nameWithoutExt.split('__') let stamp = parts[0] || '' let artist = parts[1] || '' let title = parts[2] || '' title = title.replaceAll('_', ' ') artist = artist.replaceAll('_', ' ') // Parser la date depuis le stamp let year = 2020, month = 1, day = 1, hour = 0 if (stamp.length === 10) { year = Number(stamp.slice(0, 4)) month = Number(stamp.slice(4, 6)) day = Number(stamp.slice(6, 8)) hour = Number(stamp.slice(8, 10)) } const date = new Date(year, month - 1, day, hour) const card = getCardFromDate(date) const url = `${urlPrefix}/${encodeURIComponent(file)}` const coverId = `${urlPrefix}/${encodeURIComponent(file).replace(EXT_RE, '.jpg')}` return { id: Number(`${year}${index + 1}`), boxId: `ESPLAYLIST`, year, date, title: title.trim(), artist: artist.trim(), url, coverId, card, order: 0, type: 'playlist' } }) tracks.sort((a, b) => b.date.getTime() - a.date.getTime()) // Combine folders and tracks const allItems = [...folders, ...tracks] // Sort by date (newest first) and assign order allItems.sort((a, b) => b.date.getTime() - a.date.getTime()) allItems.forEach((item, i) => (item.order = i + 1)) return allItems } catch (error) { return { success: false, error: (error as Error).message } } })