uploads test
This commit is contained in:
parent
29bc2b8ddd
commit
dabbc7d862
11 changed files with 121 additions and 44 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -2,3 +2,4 @@
|
||||||
/db
|
/db
|
||||||
/package-lock.json
|
/package-lock.json
|
||||||
/uploads
|
/uploads
|
||||||
|
/videos
|
19
client/player.js
Normal file
19
client/player.js
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
import Route from "../route.js";
|
||||||
|
import auth from "../form/auth.js";
|
||||||
|
import initDb from "../db.js";
|
||||||
|
|
||||||
|
let db = await initDb();
|
||||||
|
|
||||||
|
let main = new Route([auth], async function (req, res, input) {
|
||||||
|
let { username } = input;
|
||||||
|
let videoData = await db.all('SELECT * FROM video WHERE id = ?', [
|
||||||
|
req.query.id
|
||||||
|
]);
|
||||||
|
videoData = videoData[0];
|
||||||
|
return res.render('player', {
|
||||||
|
username,
|
||||||
|
videoData
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
export default main;
|
19
client/upload.js
Normal file
19
client/upload.js
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
import Route from "../route.js";
|
||||||
|
import auth from "../form/auth.js";
|
||||||
|
|
||||||
|
// TODO: rewrite
|
||||||
|
let main = new Route([auth], async function (req, res, input) {
|
||||||
|
let { username } = input;
|
||||||
|
return res.render('form', {
|
||||||
|
data: [
|
||||||
|
{ label: "Video file", type: "file", name: "file" },
|
||||||
|
{ label: "Name", type: "text", name: "title" },
|
||||||
|
{ label: "Description", type: "text", name: "desc" }
|
||||||
|
],
|
||||||
|
'route': '/api/upload/upload',
|
||||||
|
'title': 'Upload Content',
|
||||||
|
username
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
export default main;
|
2
db.js
2
db.js
|
@ -14,6 +14,8 @@ async function initDb() {
|
||||||
await db.run(`CREATE TABLE IF NOT EXISTS auth (username TEXT, password TEXT);`);
|
await db.run(`CREATE TABLE IF NOT EXISTS auth (username TEXT, password TEXT);`);
|
||||||
await db.run(`CREATE TABLE IF NOT EXISTS token (username TEXT, token TEXT);`);
|
await db.run(`CREATE TABLE IF NOT EXISTS token (username TEXT, token TEXT);`);
|
||||||
|
|
||||||
|
await db.run(`CREATE TABLE IF NOT EXISTS video (id TEXT, title TEXT, desc TEXT, username TEXT);`);
|
||||||
|
|
||||||
return db;
|
return db;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
38
form/upload.js
Normal file
38
form/upload.js
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
import Route from "../route.js";
|
||||||
|
import initDb from "../db.js";
|
||||||
|
import { randomUUID } from 'node:crypto';
|
||||||
|
import {exec} from 'node:child_process';
|
||||||
|
import { promisify } from "node:util";
|
||||||
|
import auth from "../form/auth.js";
|
||||||
|
|
||||||
|
const execP = promisify(exec);
|
||||||
|
|
||||||
|
let db = await initDb();
|
||||||
|
|
||||||
|
// TODO: rewrite
|
||||||
|
let main = new Route([auth], async function (req, res, input) {
|
||||||
|
let { username } = input;
|
||||||
|
let id = randomUUID();
|
||||||
|
|
||||||
|
let { title, desc } = req.body;
|
||||||
|
if (!title || !desc || !req.file) return { 'success': false, 'message': 'Some fields are missing' }; // probably should not re-use these strings
|
||||||
|
|
||||||
|
let {path} = req.file;
|
||||||
|
|
||||||
|
try {
|
||||||
|
await execP(`ffmpeg -i ${path} videos/${id}.mp4`);
|
||||||
|
} catch (err) {
|
||||||
|
return { 'success': false, 'message': 'Video is invalid'}
|
||||||
|
}
|
||||||
|
|
||||||
|
await db.run('INSERT INTO video (id, title, desc, username) VALUES (?, ?, ?, ?)', [
|
||||||
|
id,
|
||||||
|
title,
|
||||||
|
desc,
|
||||||
|
username
|
||||||
|
]);
|
||||||
|
|
||||||
|
return { 'message': 'Video created', 'success': true, 'redirect': '/client/video?id='+id };
|
||||||
|
});
|
||||||
|
|
||||||
|
export default main;
|
5
index.js
5
index.js
|
@ -11,6 +11,7 @@ const upload = multer({ dest: 'uploads/' });
|
||||||
|
|
||||||
app.use(cookieParser());
|
app.use(cookieParser());
|
||||||
app.use('/static', express.static('static'));
|
app.use('/static', express.static('static'));
|
||||||
|
app.use('/videos', express.static('videos'));
|
||||||
app.engine('.ejs', ejs.__express);
|
app.engine('.ejs', ejs.__express);
|
||||||
app.set('views', './views');
|
app.set('views', './views');
|
||||||
app.set('view engine', 'ejs');
|
app.set('view engine', 'ejs');
|
||||||
|
@ -31,6 +32,10 @@ app.post('/api/form/:route', upload.none(), async (req, res) => {
|
||||||
res.send(await iterate(req, res, 'form'));
|
res.send(await iterate(req, res, 'form'));
|
||||||
})
|
})
|
||||||
|
|
||||||
|
app.post('/api/upload/:route', upload.single('file'), async (req, res) => {
|
||||||
|
res.send(await iterate(req, res, 'form'));
|
||||||
|
})
|
||||||
|
|
||||||
app.listen(port, () => {
|
app.listen(port, () => {
|
||||||
console.log(`App listening on port ${port}`)
|
console.log(`App listening on port ${port}`)
|
||||||
})
|
})
|
10
routes.js
10
routes.js
|
@ -2,25 +2,31 @@ import main from "./client/main.js";
|
||||||
import auth from "./form/auth.js";
|
import auth from "./form/auth.js";
|
||||||
import login from "./client/login.js";
|
import login from "./client/login.js";
|
||||||
import register from "./client/register.js";
|
import register from "./client/register.js";
|
||||||
|
import upload from "./client/upload.js";
|
||||||
|
import player from "./client/player.js";
|
||||||
import loginB from "./form/login.js";
|
import loginB from "./form/login.js";
|
||||||
import registerB from "./form/register.js";
|
import registerB from "./form/register.js";
|
||||||
|
import uploadB from "./form/upload.js";
|
||||||
|
|
||||||
const routes = {
|
const routes = {
|
||||||
get: {},
|
get: {},
|
||||||
form: {},
|
form: {},
|
||||||
client: {}
|
client: {},
|
||||||
};
|
};
|
||||||
|
|
||||||
routes.client = {
|
routes.client = {
|
||||||
main,
|
main,
|
||||||
login,
|
login,
|
||||||
register
|
register,
|
||||||
|
upload,
|
||||||
|
video: player
|
||||||
}
|
}
|
||||||
routes.get = {
|
routes.get = {
|
||||||
};
|
};
|
||||||
routes.form = {
|
routes.form = {
|
||||||
login: loginB,
|
login: loginB,
|
||||||
register: registerB,
|
register: registerB,
|
||||||
|
upload: uploadB,
|
||||||
auth
|
auth
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -27,10 +27,10 @@
|
||||||
inkscape:zoom="2.8284272"
|
inkscape:zoom="2.8284272"
|
||||||
inkscape:cx="123.39013"
|
inkscape:cx="123.39013"
|
||||||
inkscape:cy="141.77491"
|
inkscape:cy="141.77491"
|
||||||
inkscape:window-width="1860"
|
inkscape:window-width="1499"
|
||||||
inkscape:window-height="1004"
|
inkscape:window-height="1080"
|
||||||
inkscape:window-x="30"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="46"
|
inkscape:window-y="16"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="1"
|
||||||
inkscape:current-layer="layer1"
|
inkscape:current-layer="layer1"
|
||||||
showgrid="false" />
|
showgrid="false" />
|
||||||
|
@ -44,8 +44,8 @@
|
||||||
offset="0"
|
offset="0"
|
||||||
id="stop6" />
|
id="stop6" />
|
||||||
<stop
|
<stop
|
||||||
style="stop-color:#ff1111;stop-opacity:1;"
|
style="stop-color:#da0000;stop-opacity:1;"
|
||||||
offset="0.72731298"
|
offset="0.38542777"
|
||||||
id="stop7" />
|
id="stop7" />
|
||||||
<stop
|
<stop
|
||||||
style="stop-color:#4f0000;stop-opacity:1;"
|
style="stop-color:#4f0000;stop-opacity:1;"
|
||||||
|
@ -62,19 +62,6 @@
|
||||||
fy="140.8663"
|
fy="140.8663"
|
||||||
r="108.59156"
|
r="108.59156"
|
||||||
gradientUnits="userSpaceOnUse" />
|
gradientUnits="userSpaceOnUse" />
|
||||||
<filter
|
|
||||||
inkscape:collect="always"
|
|
||||||
style="color-interpolation-filters:sRGB"
|
|
||||||
id="filter11"
|
|
||||||
x="-0.12659915"
|
|
||||||
y="-0.08366658"
|
|
||||||
width="1.2531983"
|
|
||||||
height="1.1673332">
|
|
||||||
<feGaussianBlur
|
|
||||||
inkscape:collect="always"
|
|
||||||
stdDeviation="3.8961098"
|
|
||||||
id="feGaussianBlur11" />
|
|
||||||
</filter>
|
|
||||||
</defs>
|
</defs>
|
||||||
<g
|
<g
|
||||||
inkscape:label="Layer 1"
|
inkscape:label="Layer 1"
|
||||||
|
@ -108,26 +95,5 @@
|
||||||
d="M 80.567225,178.82227 H 98.435368 L 81.928509,219.7296 h 17.061348"
|
d="M 80.567225,178.82227 H 98.435368 L 81.928509,219.7296 h 17.061348"
|
||||||
id="path6" />
|
id="path6" />
|
||||||
</g>
|
</g>
|
||||||
<g
|
|
||||||
id="g11"
|
|
||||||
style="mix-blend-mode:normal;filter:url(#filter11)"
|
|
||||||
transform="translate(15.185,1.7031898)">
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:20;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d="M 20.63569,98.589129 H 72.37674 L 24.577583,181.3797 h 49.4048"
|
|
||||||
id="path8" />
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d="M 34.506057,124.20157 61.311986,151.0075"
|
|
||||||
id="path9" />
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:8.26156;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d="M -7.4993527,58.596639 H 10.36879 L -6.1380687,99.503969 H 10.923279"
|
|
||||||
id="path10" />
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:8.26156;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d="M 80.567225,178.82227 H 98.435368 L 81.928509,219.7296 h 17.061348"
|
|
||||||
id="path11" />
|
|
||||||
</g>
|
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 3.4 KiB |
|
@ -110,3 +110,7 @@ form {
|
||||||
.header img {
|
.header img {
|
||||||
height: 2em;
|
height: 2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
video {
|
||||||
|
width: 690px;
|
||||||
|
}
|
|
@ -4,8 +4,11 @@
|
||||||
<%if (username=='!nobody' ) { %>
|
<%if (username=='!nobody' ) { %>
|
||||||
<div class="button"><a href="/client/login">Login</a></div>
|
<div class="button"><a href="/client/login">Login</a></div>
|
||||||
<% } else { %>
|
<% } else { %>
|
||||||
<a href="/client/user?user=<%= username %>">
|
<a href="/client/user?id=<%= username %>">
|
||||||
<%= username %>
|
<%= username %>
|
||||||
</a>
|
</a>
|
||||||
|
<a href="/client/upload">
|
||||||
|
Upload
|
||||||
|
</a>
|
||||||
<% } %>
|
<% } %>
|
||||||
</div>
|
</div>
|
14
views/player.ejs
Normal file
14
views/player.ejs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<%- include('header.ejs') -%>
|
||||||
|
<div class='area'>
|
||||||
|
<h1>Video</h1>
|
||||||
|
<video controls src='/videos/<%= videoData.id %>.mp4'></video>
|
||||||
|
<div><b>
|
||||||
|
<%= videoData.title %>
|
||||||
|
</b>
|
||||||
|
</div>
|
||||||
|
<div>by <a href="/client/user?id=<%= videoData.username %>">
|
||||||
|
<%= videoData.username %>
|
||||||
|
</a></div>
|
||||||
|
<!-- todo: custom video player-->
|
||||||
|
</div>
|
||||||
|
<%- include('footer.ejs') -%>
|
Loading…
Reference in a new issue