Spaces:
Sleeping
Sleeping
| 'use server'; | |
| import fs from 'fs/promises'; | |
| import path from 'path'; | |
| export async function fetchAudioFiles(): Promise<[string, string, string, boolean][] | null> { | |
| const audioPairs: [string, string, string, boolean][] = []; | |
| // Look directly in the audio folder for segment directories | |
| const audioBaseDir = path.join(process.cwd(), 'public', 'audio'); | |
| try { | |
| // Check if directory exists | |
| try { | |
| await fs.access(audioBaseDir); | |
| } catch (error) { | |
| console.error(`Audio directory inaccessible: ${audioBaseDir}`, error); | |
| return null; | |
| } | |
| // Get all folders in the audio directory | |
| const folders = await fs.readdir(audioBaseDir, { withFileTypes: true }); | |
| const audioDirs = folders | |
| .filter(dirent => dirent.isDirectory()) | |
| .map(dirent => dirent.name); | |
| // Process each folder | |
| for (const folderName of audioDirs) { | |
| const folderPath = path.join(audioBaseDir, folderName); | |
| const files = await fs.readdir(folderPath); | |
| // Check if both required files exist | |
| if (files.includes('improved.wav') && files.includes('raw.wav')) { | |
| // Extract voice name from folder name (after hyphen, before first segment) | |
| const voiceName = folderName.split('-')[1]?.split('_segment')[0] || folderName; | |
| // Randomly determine order presentation (but track original files) | |
| const shouldSwap = Math.random() > 0.5; | |
| // Construct URLs relative to public directory with forward slashes for cross-platform compatibility | |
| const improvedUrl = `./audio/${folderName}/improved.wav`.replace(/\\/g, '/'); | |
| const rawUrl = `./audio/${folderName}/raw.wav`.replace(/\\/g, '/'); | |
| // If we swap, raw becomes shown first (A), but we track this with boolean | |
| if (shouldSwap) { | |
| audioPairs.push([rawUrl, improvedUrl, voiceName, true]); // swapped = true | |
| } else { | |
| audioPairs.push([improvedUrl, rawUrl, voiceName, false]); // swapped = false | |
| } | |
| } | |
| } | |
| return audioPairs.length > 0 ? audioPairs : null; | |
| } catch (error) { | |
| console.error('Error reading audio files:', error); | |
| return null; | |
| } | |
| } |