Live WebXR demo
https://companion.benetou.fr/index.html
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
4.9 KiB
128 lines
4.9 KiB
const express = require('express')
|
|
const fs = require('fs')
|
|
const path = require('path')
|
|
const app = express()
|
|
const port = 3000
|
|
|
|
const converters = ['convert' ]
|
|
|
|
app.get('/fileswithmetadata', (req, res) => {
|
|
// should be sorted by modified date, see mtimeMs from fs.statSync(path)
|
|
let files = []
|
|
let raw = fs.readdirSync('public')
|
|
raw.map( f => files.push( {name: f, metadata: fs.statSync(path.join('public',f)) }) )
|
|
res.json( files )
|
|
// consider also https://github.com/LinusU/fs-xattr
|
|
})
|
|
|
|
app.get('/files', (req, res) => {
|
|
res.json( fs.readdirSync('public') )
|
|
// should be sorted by modified date, see mtimeMs from fs.statSync(path)
|
|
})
|
|
|
|
app.get('/', (req, res) => {
|
|
res.redirect('/index.html')
|
|
})
|
|
|
|
app.use(express.static('public'))
|
|
|
|
app.listen(port, () => {
|
|
console.log(`open https://companion.benetou.fr on your WebXR device`)
|
|
});
|
|
|
|
|
|
app.get('/save-as-new-html/:filename/:pages', (req, res) => {
|
|
pages = req.params.pages
|
|
filename = req.params.filename // unsafe, can rewrite other files
|
|
if (filename.startsWith('/') || filename.includes('..') || !filename.endsWith('.pdf')) return
|
|
try{ JSON.parse(pages) } catch { console.log('not json, file NOT saved!'); res.json('failed saved, not proper JSON!'); return }
|
|
pages = JSON.parse(pages)
|
|
console.log('savedLayout', pages)
|
|
//let savedFilename = Date.now()+'.resorted.pdf'
|
|
require('./converters/html_from_pdf_with_image_urls.js').convert(filename, pages)
|
|
res.json('saved/html/'+filename+'montage.jpg')
|
|
//res.json(savedFilename)
|
|
})
|
|
|
|
app.get('/save-as-new-montage/:filename/:pages', (req, res) => {
|
|
pages = req.params.pages
|
|
filename = req.params.filename // unsafe, can rewrite other files
|
|
if (filename.startsWith('/') || filename.includes('..') || !filename.endsWith('.pdf')) return
|
|
try{ JSON.parse(pages) } catch { console.log('not json, file NOT saved!'); res.json('failed saved, not proper JSON!'); return }
|
|
pages = JSON.parse(pages)
|
|
console.log('savedLayout', pages)
|
|
//let savedFilename = Date.now()+'.resorted.pdf'
|
|
require('./converters/montage.js').convert(filename, pages)
|
|
res.json('saved/montage/'+filename+'montage.jpg')
|
|
//res.json(savedFilename)
|
|
})
|
|
|
|
app.get('/save-as-new-pdf/:filename/:pages', (req, res) => {
|
|
pages = req.params.pages
|
|
filename = req.params.filename // unsafe, can rewrite other files
|
|
if (filename.startsWith('/') || filename.includes('..') || !filename.endsWith('.pdf')) return
|
|
try{ JSON.parse(pages) } catch { console.log('not json, file NOT saved!'); res.json('failed saved, not proper JSON!'); return }
|
|
pages = JSON.parse(pages)
|
|
console.log('savedLayout', pages)
|
|
//let savedFilename = Date.now()+'.resorted.pdf'
|
|
require('./converters/resortedpdf.js').convert(filename, pages)
|
|
res.json('saved/pdf/'+filename)
|
|
//res.json(savedFilename)
|
|
})
|
|
|
|
let savedLayout
|
|
|
|
app.get('/save-layout/:layout', (req, res) => {
|
|
savedLayout = req.params.layout
|
|
// unsafe, assume JSON but could be anything
|
|
try{ JSON.parse(savedLayout) } catch { console.log('not json, file NOT saved!'); res.json('failed saved, not proper JSON!'); return }
|
|
console.log('savedLayout', savedLayout)
|
|
// could be saved to disk, thus to file, too
|
|
let savedFilename = Date.now()+'.layout.json'
|
|
fs.writeFileSync('./public/'+savedFilename, savedLayout)
|
|
// might be better to save in a dedicated directory in ./public
|
|
res.json(savedFilename)
|
|
})
|
|
|
|
let newFiles = []
|
|
fs.watch('public', (eventType, filename) => {
|
|
console.log(`event type is: ${eventType}`); // rename can also be deleting...
|
|
// could consequently check if the file still exists, if not, had been deleted
|
|
if (filename) {
|
|
|
|
console.log(`filename provided: ${filename}`)
|
|
if (eventType == "rename"){
|
|
console.log("fs exists?", fs.existsSync('./public/'+filename)) // false despite existing
|
|
if (!fs.existsSync('./public/'+filename)) {
|
|
console.log(`${filename} deleted`)
|
|
} else {
|
|
// done on uploads because there might be temporary files that "accumuldates" until done then renamed
|
|
sequentialConverters( filename )
|
|
}
|
|
}
|
|
if (eventType == "change"){
|
|
if (newFiles.includes(filename)){
|
|
console.log( 'skip, not a new file')
|
|
} else {
|
|
// sendEventsToAll({filename,eventType}) former SSE way
|
|
// fetch('https://ntfy.benetou.fr/fswatch', { method: 'POST', body: JSON.stringify({filename, eventType}) })
|
|
console.log('new file', filename, '_________________________________________')
|
|
if ( !filename.includes('.live') ) {
|
|
newFiles.push(filename)
|
|
// bypass on convention, e.g. live in the filename
|
|
// alternatively could be a dedicated subdirectory
|
|
} else { console.log('live file, no future ignoring') }
|
|
sequentialConverters( filename )
|
|
}
|
|
}
|
|
} else {
|
|
console.log('filename not provided');
|
|
}
|
|
});
|
|
|
|
function sequentialConverters( filename ){
|
|
require('./converters/pdf.js').convert(filename)
|
|
require('./converters/pdf_json.js').convert(filename)
|
|
require('./converters/ogg_tts.js').convert(filename)
|
|
require('./converters/pdf_xml.js').convert(filename)
|
|
}
|
|
|