exports.setup = function(mstream, program){ const fs = require('fs'); // File System const fe = require('path'); const masterFileTypesArray = ["mp3", "flac", "wav", "ogg", "aac", "m4a"]; // parse directories mstream.post('/dirparser', function (req, res) { var directories = []; var filesArray = []; // Return vpaths if no path is given if(req.body.dir === '' || req.body.dir === '/' ){ for(let dir of req.user.vpaths){ directories.push({ type:"directory", name: dir }) } return res.json( { path: '/', contents: directories} ); } var directory = req.body.dir; let pathInfo = program.getVPathInfo(directory); if(pathInfo == false){ res.status(500).json({ error: 'Could not find file' }); return; } // Make sure the user has access to the given vpath and that the vapth exists if(!req.user.vpaths.includes(pathInfo.vpath) ){ res.status(500).json({ error: 'Access Denied' }); return; } var path = pathInfo.fullPath; // Make sure it's a directory if(!fs.statSync(path).isDirectory()){ res.status(500).json({ error: 'Not a directory' }); return; } // Will only show these files. Prevents people from snooping around var fileTypesArray; if(req.body.filetypes){ fileTypesArray = req.body.filetypes; }else{ fileTypesArray = masterFileTypesArray; } // get directory contents var files = fs.readdirSync( path); // loop through files for (let i=0; i < files.length; i++) { try{ var stat = fs.statSync(fe.join(path, files[i])); }catch(error){ // Bad file, ignore and continue continue; } // Handle Directories if(stat.isDirectory()){ directories.push({ type:"directory", name:files[i] }); }else{ // Handle Files var extension = getFileType(files[i]); if (fileTypesArray.indexOf(extension) > -1 && masterFileTypesArray.indexOf(extension) > -1) { filesArray.push({ type:extension, name:files[i] }); } } } // Sort it becasue we can't rely on the OS returning it pre-sorted directories.sort(function (a, b) { return a.name.localeCompare(b.name); }); filesArray.sort(function (a, b) { return a.name.localeCompare(b.name); }); // Format direcotry string for retrun value directory = directory.replace(/\\/g, '/'); if(directory.slice(-1) !== '/'){ directory += '/'; } // Send back combined list of directories and mp3s res.json( { path:directory, contents:directories.concat(filesArray)} ); }); function getFileType(filename){ return filename.split(".").pop(); } }