htmlnode.jsvideo-streamingkodi

Implementing a node.js script to add media player to Kodi web interface


I am attempting to implement an answer to a slightly different question from here: How to stream video to browser with Kodi

stackoverflow user @YRabl unvoted answer, entitled "I've modified the Chorus webinterface to allow streaming with a nodejs process in the background." gives the full script as well as the required mods to the existing interface.

However I have n o clue how i would insert the .js script into the process of opening the local URL and when I attempt to simply run the script itself, it throws the following errors:

app.listen(<8080>, function () {
       ^
SyntaxError: Unexpected token <
at Module._compile (internal/modules/cjs/loader.js:723:23)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
at startup (internal/bootstrap/node.js:283:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)

I have absolutely zero experience with node.js. Could someone help me decipher what I am seeing and how to properly implement this solution? The original thread is over 4 years old not likely to resurrect. Any help is appreciated. tnx in advance!

For simplicity, here is the original .js script:

const express = require('express')
const fs = require('fs')
const path = require('path')
const app = express()
const url = require('url')
const gracefulFs = require('graceful-fs')
gracefulFs.gracefulify(fs)

app.get('/video', function(req, res) {
  var q = url.parse(req.url, true).query;
  var filepath = q.src;
  fs.stat(filepath, function(err, stats){
    if (err){
        if (err.code === 'ENOENT'){
            //404 Error if file not found
            res.writeHead(404, {
                "Accept-Ranges" : "bytes",
                "Content-Range" : "bytes " + start + "-" + end + "/" + total,
                "Content-Length" : chunksize,
                "Content-Type" : "video/mp4"
            });
        }
        res.end(err);
    }
    
    var start;
    var end;
    var chunksize;
    var total = stats.size;
    
    var range = req.headers.range;
    if (range) {
        var parts = range.replace(/bytes=/, "").split("-");
        start = parseInt(parts[0], 10);
        end = parts[1] ? parseInt(parts[1], 10) : total - 1;
    } else {
        start = 0;
        end = total - 1;
    }
    
    if (start > end || start < 0 || end > total - 1){
        //error 416 is "Range Not Satisfiable"
        res.writeHead(416, {
            "Accept-Ranges" : "bytes",
            "Content-Range" : "*/" + stats.size,
            "Content-Type" : "video/mp4"
        });
        res.end();
        return;
    }
    
    if (start == 0 && end == (total -1)){
        res.writeHead(200, {
            'Accept-Ranges': 'bytes',
            'Content-Range': `bytes ${start}-${end}/${total}`,
            'Content-Length': total,
            'Content-Type': 'video/mp4'
        });
    } else {
        chunksize = (end - start) + 1;
        res.writeHead(206, {
            'Content-Range': `bytes ${start}-${end}/${total}`,
            'Accept-Ranges': 'bytes',
            'Content-Length': chunksize,
            'Content-Type': 'video/mp4'
        });
    }
    var stream = fs.createReadStream(filepath, {
        start : start, 
        end : end
    }).on("open", function() {
        stream.pipe(res);
    }).on("error", function(err) {
        console.log(err);
        res.end(err);
    });
  });
});

app.listen(<port>, function () {
  console.log('Listening on port <port>!');
});


Solution

  • The error you are getting is because you didn't replace the <port> placeholder with the actual port on the last three lines of the code.