Initial Push
This commit is contained in:
91
API/index.js
Normal file
91
API/index.js
Normal file
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
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();
|
||||
}
|
||||
Reference in New Issue
Block a user