From 02cb1cd73809bb55c5fcf7deef5fa498f0d1da84 Mon Sep 17 00:00:00 2001 From: Quentin Millardet Date: Sat, 6 Jan 2024 22:16:59 +0100 Subject: [PATCH] Ajout de la route de copie --- server.http | 6 +++ server/app.js | 2 + server/routes/copieManager.js | 27 +++++++++++++ server/service/CopyManagerService.js | 58 ++++++++++++++++++++++++++++ server/service/LightshowService.js | 38 ++++++++++++++++++ server/service/deviceinformation.js | 18 +++++++++ 6 files changed, 149 insertions(+) create mode 100644 server/routes/copieManager.js create mode 100644 server/service/CopyManagerService.js diff --git a/server.http b/server.http index 265cb0a..92bc66f 100644 --- a/server.http +++ b/server.http @@ -16,6 +16,12 @@ Content-Type: application/x-www-form-urlencoded device = /dev/diskC +### Post information of unkow device +POST {{host}}/copy/server +Content-Type: application/x-www-form-urlencoded + +device=/dev/disk3&mountpoint=Test&lightshowName=Ghostbuster + ### Send POST request with body as parameters diff --git a/server/app.js b/server/app.js index 933e151..6b6e507 100644 --- a/server/app.js +++ b/server/app.js @@ -7,6 +7,7 @@ var logger = require('morgan'); var deviceRouter = require('./routes/device'); var usersRouter = require('./routes/users'); var lightshowRouter = require('./routes/lightshow'); +var copieManagerRouter = require('./routes/copieManager'); var app = express(); @@ -23,6 +24,7 @@ app.use(express.static(path.join(__dirname, 'public'))); app.use('/devices', deviceRouter); app.use('/users', usersRouter); app.use('/lightshow', lightshowRouter); +app.use('/copy', copieManagerRouter); // catch 404 and forward to error handler app.use(function(req, res, next) { diff --git a/server/routes/copieManager.js b/server/routes/copieManager.js new file mode 100644 index 0000000..06f1f82 --- /dev/null +++ b/server/routes/copieManager.js @@ -0,0 +1,27 @@ +var express = require('express'); +var router = express.Router(); + +const CopyManagerService = require('../service/CopyManagerService') + +/* GET users listing. */ +router.post('/server', async function(req, res, next) { + //console.log(req.body.hasOwnProperty('device')) + let device = req.body.device; + let mountpoint = req.body.mountpoint.replace(/\\/g, ''); + let lightshowName = req.body.lightshowName.replace(/\\/g, ''); + try { + + let copyManagerService = new CopyManagerService(); + await copyManagerService.copyFromDisk( + device, + mountpoint, + lightshowName + ) + res.status(200).json({}) + } catch (e){ + res.status(500).json({'message' : e.stack}) + } + +}); + +module.exports = router; diff --git a/server/service/CopyManagerService.js b/server/service/CopyManagerService.js new file mode 100644 index 0000000..146a9be --- /dev/null +++ b/server/service/CopyManagerService.js @@ -0,0 +1,58 @@ +const fs = require('fs'); + +const LigthshowManager = require('./LightshowService') +const DeviceManager = require('./deviceinformation'); +const { join } = require('node:path'); + + +class CopyManagerService{ + async copyFromDisk(device, mountPointLabel, lightshowName ){ + let lightshowManagerService = new LigthshowManager(); + + if (!lightshowManagerService.isExistLightshowOnServer(lightshowName)){ + throw new Error('Ce ligtshow n\'existe pas') + } + let ligthsowAudioFile = lightshowManagerService.getAudioFileName(lightshowName); + let ligthsowFseqFile = lightshowManagerService.getFseqLigthshow(lightshowName); + + let baseDevice = await this.#getDeviceBaseWithLigthShow(device, mountPointLabel); + + await this.#moveTeslaCamDir(device, mountPointLabel) + + if (this.#isAlreadyExistLightshow(baseDevice, lightshowName)){ + throw new Error('Already exist Lighttshow on device, please check file') + } + fs.mkdirSync(baseDevice, { recursive: true }) + fs.copyFileSync(ligthsowAudioFile, baseDevice+lightshowName + '.mp3' ) + fs.copyFileSync(ligthsowFseqFile, baseDevice + lightshowName + '.fseq' ) + + } + + #isAlreadyExistLightshow(deviceMountPouint, lightshowName){ + let ligthshowBase = deviceMountPouint + lightshowName; + let fseq = fs.existsSync( ligthshowBase+ '.fseq') + let wav = fs.existsSync(ligthshowBase + '.wav') + let mp3 = fs.existsSync(ligthshowBase + '.mp3') + return mp3 || wav || fseq; + } + + async #moveTeslaCamDir(device, mountPointLabel){ + let deviceManager = new DeviceManager(); + let deviceMountPoint = await deviceManager.getMountPoint(device, mountPointLabel); + let teslacamDir = deviceMountPoint + '/TeslaCam/' + if(fs.existsSync(teslacamDir)){ + let date = new Date(); + fs.renameSync(teslacamDir, deviceMountPoint + '/TeslaCam-old/' ) + } + return true; + + } + + async #getDeviceBaseWithLigthShow(device, mountPointLabel){ + let deviceManager = new DeviceManager(); + let deviceMountPoint = await deviceManager.getMountPoint(device, mountPointLabel); + return deviceMountPoint + '/Lightshow/' + } +} + +module.exports = CopyManagerService \ No newline at end of file diff --git a/server/service/LightshowService.js b/server/service/LightshowService.js index f2ec329..08156b7 100644 --- a/server/service/LightshowService.js +++ b/server/service/LightshowService.js @@ -1,6 +1,8 @@ const { PrismaClient } = require('@prisma/client') +const fs = require('fs') const prisma = new PrismaClient() +const usbLightshow = process.env.LIGHTSHOW_DIR || ''; class LigthshowService{ @@ -22,6 +24,42 @@ class LigthshowService{ // }, // }) // } + + isExistLightshowOnServer(ligthshowName){ + let audio = this.getAudioFileName(ligthshowName) !== null; + let fseq = this.getFseqLigthshow(ligthshowName) !== null; + return audio && fseq; + } + + #getBaseFile(ligthshowName){ + return usbLightshow + '/' + ligthshowName + } + + getAudioFileName(ligthshowName){ + let base = this.#getBaseFile(ligthshowName) + let extensions = [ 'mp3', 'wav'] + let filename = null; + extensions.forEach((ext) => { + let tmpfileName = base + '.' + ext + if (fs.existsSync(tmpfileName) && filename === null){ + filename = tmpfileName; + }else if (fs.existsSync(tmpfileName) && filename !== null){ + throw new Error('Multiple audio file for the same Lightshow') + } + }) + return filename; + + } + + getFseqLigthshow(ligthshowName){ + let filename = null; + let base2 = usbLightshow + '/' + ligthshowName + let tmp = base2 + '.fseq' + if (fs.existsSync(tmp)){ + filename = tmp; + } + return filename; + } } diff --git a/server/service/deviceinformation.js b/server/service/deviceinformation.js index 4aba6a9..da54058 100644 --- a/server/service/deviceinformation.js +++ b/server/service/deviceinformation.js @@ -28,5 +28,23 @@ class Deviceinformation { }) return element; } + + + async getMountPoint( deviceName, pointName){ + const drivelist = require('drivelist'); + + const drives =await drivelist.list() + let element = null; + drives.forEach((drive) => { + if (drive.device === deviceName ){ + drive.mountpoints.forEach((mountPoint) => { + if (mountPoint.label === pointName){ + element = mountPoint.path + } + }) + } + }) + return element; + } } module.exports = Deviceinformation \ No newline at end of file