diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 5632d6b..b586d8b 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "core-js": "^3.8.3", "cors": "^2.8.5", + "csv-parser": "^3.0.0", "express-session": "^1.17.3", "music-metadata": "^7.13.0", "node-fetch": "^2.7.0", @@ -5683,6 +5684,20 @@ "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz", "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, + "node_modules/csv-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/csv-parser/-/csv-parser-3.0.0.tgz", + "integrity": "sha512-s6OYSXAK3IdKqYO33y09jhypG/bSDHPuyCme/IdEHfWpLf/jKcpitVFyOC6UemgGk8v7Q5u2XE0vvwmanxhGlQ==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "csv-parser": "bin/csv-parser" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz", @@ -9524,8 +9539,7 @@ "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "node_modules/minipass": { "version": "3.3.6", @@ -19112,6 +19126,14 @@ "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz", "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, + "csv-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/csv-parser/-/csv-parser-3.0.0.tgz", + "integrity": "sha512-s6OYSXAK3IdKqYO33y09jhypG/bSDHPuyCme/IdEHfWpLf/jKcpitVFyOC6UemgGk8v7Q5u2XE0vvwmanxhGlQ==", + "requires": { + "minimist": "^1.2.0" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz", @@ -22218,8 +22240,7 @@ "minimist": { "version": "1.2.8", "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "minipass": { "version": "3.3.6", diff --git a/frontend/package.json b/frontend/package.json index 730ec48..e0ad58e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,6 +14,7 @@ "dependencies": { "core-js": "^3.8.3", "cors": "^2.8.5", + "csv-parser": "^3.0.0", "express-session": "^1.17.3", "music-metadata": "^7.13.0", "node-fetch": "^2.7.0", diff --git a/frontend/src/indexer.js b/frontend/src/indexer.js index 622e1e7..2bc5ba3 100644 --- a/frontend/src/indexer.js +++ b/frontend/src/indexer.js @@ -1,13 +1,24 @@ +/* +* MusicPlayerV2 - indexer.js +* +* Created by Janis Hutz 11/05/2023, Licensed under the GPL V3 License +* https://janishutz.com, development@janishutz.com +* +* +*/ + const fs = require( 'fs' ); const imageFetcher = require( './imageFetcher.js' ); const musicMetadata = require( 'music-metadata' ); const allowedFileTypes = [ '.mp3', '.wav', '.flac' ]; +const csv = require( 'csv-parser' ); +const path = require( 'path' ); let indexedData = {}; let coverArtIndex = {}; module.exports.index = ( req ) => { - return new Promise( ( reject, resolve ) => { + return new Promise( ( resolve, reject ) => { fs.readdir( req.query.dir, { encoding: 'utf-8' }, ( err, dat ) => { if ( err ) { res.status( 404 ).send( 'ERR_DIR_NOT_FOUND' ); @@ -27,8 +38,19 @@ module.exports.index = ( req ) => { } ); } -const parseExistingData = () => { - +const parseExistingData = ( dat, dir ) => { + return new Promise( ( resolve, reject ) => { + if ( dat.includes( 'songlist.csv' ) ) { + let results = {}; + fs.createReadStream( path.join( dir + '/songlist.csv' ) ).pipe( csv( [ 'name', 'artist', 'dancingStyle', 'tempo' ] ) ).on( 'data', ( data ) => { + results[ req.query.dir + '/' + dat[ file ] ] = data; + } ).on( 'end', () => { + resolve( results ); + } ); + } else if ( dat.includes( 'songlist.json' ) ) { + resolve( JSON.parse( fs.readFileSync( path.join( dir + '/songlist.json' ) ) ) ); + } + } ); } const parseDir = async ( dat, req ) => {