Initial commit
commit
1eb5a8eaed
@ -0,0 +1 @@
|
|||||||
|
node_modules
|
||||||
@ -0,0 +1,95 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const express = require('express');
|
||||||
|
const app = express();
|
||||||
|
const fileUpload = require('express-fileupload');
|
||||||
|
|
||||||
|
app.use(express.json());
|
||||||
|
app.use(fileUpload());
|
||||||
|
|
||||||
|
const port = 8080;
|
||||||
|
|
||||||
|
app.listen(port, () => {
|
||||||
|
console.log(`Server is running at http://localhost:${port}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
app.use(express.static('public'));
|
||||||
|
|
||||||
|
let videoDirs = [
|
||||||
|
'./public/videos',
|
||||||
|
'/media/pi/USB'
|
||||||
|
];
|
||||||
|
|
||||||
|
let fileEndings = [
|
||||||
|
'.mp4',
|
||||||
|
'.mkv',
|
||||||
|
'.avi',
|
||||||
|
'.mov',
|
||||||
|
'.flv',
|
||||||
|
'.wmv',
|
||||||
|
'.webm',
|
||||||
|
'.m4v',
|
||||||
|
'.mpg',
|
||||||
|
'.mpeg',
|
||||||
|
'.3gp',
|
||||||
|
'.3g2',
|
||||||
|
'.m2v',
|
||||||
|
'.m4v'
|
||||||
|
];
|
||||||
|
|
||||||
|
app.get('/videos', (req, res) => {
|
||||||
|
const list = [];
|
||||||
|
|
||||||
|
for (const dir of videoDirs) {
|
||||||
|
fs.readdirSync(dir, { recursive: true }).forEach(fileName => {
|
||||||
|
if (!fileEndings.includes(path.extname(fileName))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const file = {
|
||||||
|
name: fileName,
|
||||||
|
path: path.resolve(dir, fileName)
|
||||||
|
};
|
||||||
|
list.push(file);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json(list);
|
||||||
|
});
|
||||||
|
|
||||||
|
let process = null;
|
||||||
|
|
||||||
|
app.post('/play', (req, res) => {
|
||||||
|
if (process) {
|
||||||
|
process.kill();
|
||||||
|
}
|
||||||
|
|
||||||
|
let video = req.query.video;
|
||||||
|
|
||||||
|
console.log(video);
|
||||||
|
|
||||||
|
if (video.startsWith('/media/pi/USB')) {
|
||||||
|
fs.copyFileSync(video, path.join('/tmp/', path.basename(video)));
|
||||||
|
video = path.join('/tmp/', path.basename(video))
|
||||||
|
}
|
||||||
|
|
||||||
|
process = require('child_process').spawn('ffplay', [video], {env: {DISPLAY: ':0'}});
|
||||||
|
res.json({ status: 'ok' });
|
||||||
|
});
|
||||||
|
|
||||||
|
app.post('/upload', function (req, res) {
|
||||||
|
|
||||||
|
if (!req.files || Object.keys(req.files).length === 0) {
|
||||||
|
return res.status(400).send('No files were uploaded.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// The name of the input field (i.e. "sampleFile") is used to retrieve the uploaded file
|
||||||
|
const uploadPath = path.join(__dirname, '/public/videos/');
|
||||||
|
|
||||||
|
req.files.file.mv(uploadPath + req.files.file.name, function (err) {
|
||||||
|
if (err) {
|
||||||
|
return res.status(500);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
res.redirect('/');
|
||||||
|
});
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"name": "video-player",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"express": "^4.18.3",
|
||||||
|
"express-fileupload": "^1.5.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>PI Video Player</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<form ref='uploadForm'
|
||||||
|
id='uploadForm'
|
||||||
|
action='/upload'
|
||||||
|
method='post'
|
||||||
|
encType="multipart/form-data">
|
||||||
|
<input type="file" name="file" />
|
||||||
|
<input type='submit' value='Upload!' />
|
||||||
|
</form>
|
||||||
|
<div id="videos"></div>
|
||||||
|
<script src="/main.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
async function main() {
|
||||||
|
const response = await fetch('/videos');
|
||||||
|
const videos = await response.json();
|
||||||
|
const videoDiv = document.getElementById('videos');
|
||||||
|
|
||||||
|
videoDiv.innerHTML = '';
|
||||||
|
|
||||||
|
for (const video of videos) {
|
||||||
|
const button = document.createElement('button');
|
||||||
|
button.textContent = video.name;
|
||||||
|
button.addEventListener('click', () => {
|
||||||
|
fetch(`/play?video=${video.path}`, { method: 'POST' });
|
||||||
|
});
|
||||||
|
videoDiv.appendChild(button);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
||||||
Loading…
Reference in New Issue