91 lines
2.5 KiB
JavaScript
91 lines
2.5 KiB
JavaScript
/*
|
|
NodeJS Video Streamer - index.js
|
|
By: Johnathon Slightham
|
|
*/
|
|
const express = require("express");
|
|
const app = express();
|
|
const fs = require("fs");
|
|
const bodyParser = require('body-parser');
|
|
const cors = require('cors');
|
|
const mongoose = require('mongoose');
|
|
const config = require('./DB.js');
|
|
const postRoute = require('./post.route');
|
|
const fileUpload = require('express-fileupload');
|
|
|
|
printWelcome();
|
|
// Connect to database
|
|
mongoose.Promise = global.Promise;
|
|
mongoose.connect(config.DB, { useNewUrlParser: true, useUnifiedTopology: true}).then(
|
|
() => {console.log('Connected to database') },
|
|
err => { console.log('Can not connect to the database: '+ err)}
|
|
);
|
|
|
|
// Express
|
|
app.use(cors());
|
|
app.use(bodyParser.urlencoded({extended: true}));
|
|
app.use(bodyParser.json());
|
|
app.use(fileUpload());
|
|
app.use('/posts', postRoute);
|
|
app.listen(8000, function () {
|
|
console.log("Express listening on port 8000");
|
|
});
|
|
|
|
/*
|
|
Get thumbnail for video with :id
|
|
*/
|
|
app.get("/thumbnails/:id", (req, res) => {
|
|
let id = req.params.id;
|
|
if(id)
|
|
res.sendFile(__dirname + "/thumbnails/" + id + ".jpg");
|
|
else
|
|
res.send(500);
|
|
});
|
|
|
|
/*
|
|
Stream video with :id
|
|
*/
|
|
app.get("/video2/:id", (req, res) => {
|
|
|
|
let id = req.params.id; // ID of video to be streamed
|
|
|
|
// Check if the header includes range
|
|
const range = req.headers.range;
|
|
if (!range) {
|
|
res.status(400).send("Missing range header");
|
|
}
|
|
|
|
const videoPath = "videos/" + id + ".mp4"; // path of the video
|
|
const videoSize = fs.statSync("videos/" + id + ".mp4").size; // size of the video
|
|
|
|
// Parse Range
|
|
const CHUNK_SIZE = 5 ** 6; // Half megabyte
|
|
let start = Number(range.replace(/\D/g, ""));
|
|
let end = Math.min(start + CHUNK_SIZE, videoSize - 1);
|
|
|
|
// Create headers
|
|
const contentLength = end - start + 1;
|
|
const headers = {
|
|
"Content-Range": `bytes ${start}-${end}/${videoSize}`,
|
|
"Accept-Ranges": "bytes",
|
|
"Content-Length": contentLength,
|
|
"Content-Type": "video/mp4",
|
|
};
|
|
|
|
// HTTP Status 206 for Partial Content
|
|
res.writeHead(206, headers);
|
|
|
|
// create video read stream for this particular chunk
|
|
const videoStream = fs.createReadStream(videoPath, { start, end });
|
|
|
|
// Stream the video chunk to the client
|
|
videoStream.pipe(res);
|
|
});
|
|
|
|
|
|
function printWelcome(){
|
|
console.log("-----------------------------------");
|
|
console.log("NodeJS-Video-Streamer by jslightham");
|
|
console.log("Version 1.0");
|
|
console.log("-----------------------------------");
|
|
console.log();
|
|
} |