import fs from 'fs/promises' import path from 'path' async function main() { // variable for incoming variable let mediaDir = '' let outputDir = '' let recurse = false let imagesOnly = false let dryRun = false // get command line arguments process.argv.forEach(function (val, index) { // console.log(index + ': ' + val) if (val == '-dir') { // console.log(process.argv[index + 1]) mediaDir = process.argv[index + 1] || '' } if (val == '--dry-run') { dryRun = true } if (val == '--images') { imagesOnly = true } if (val == '-r' || val == '-R') { recurse = true } if (val == '-o') { outputDir = process.argv[index + 1] } }) // if no media dir jump out if (!mediaDir) { console.log('no directory passed to script') return 0 } // variable to hold media let media = [] let images = [] // read directory const dirList = await fs.readdir(mediaDir) if (!recurse) { media = dirList.filter(i => i.match(/.(mp\d|m\d\w)$/i)) images = dirList.filter(i => i.match(/.(jp\w*g|png)$/i)) } // clean up directory for json let parent_dir = mediaDir .match(/(?<=\/)(\w|\d)+\/*$/i)[0] .replace(/\/$/i, '') if (!outputDir) { outputDir = '.' } const obj = await Promise.all(media.map(async (m, i) => { const _r = { title: '', details: '', parent_dir, media: m, image: images[i], } if (recurse) { const rDir = path.join(mediaDir, m) const files = await fs.readdir(rDir) _r.album = true _r.tracks = files } return _r })) const json = JSON.stringify(obj, null, 2) let output = `${parent_dir}.json` if (dryRun) { console.log(json) } else { fs.writeFile(path.join(outputDir, output), json) } } main()