mm.site/scripts/files2json.js

98 lines
1.8 KiB
JavaScript
Raw Normal View History

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()