Skip to content

Instantly share code, notes, and snippets.

@dtrce
Created September 8, 2011 18:39
Show Gist options
  • Save dtrce/1204243 to your computer and use it in GitHub Desktop.
Save dtrce/1204243 to your computer and use it in GitHub Desktop.
streaming mp3 using nodejs
var http = require('http'),
fileSystem = require('fs'),
path = require('path')
util = require('util');
http.createServer(function(request, response) {
var filePath = 'path_to_file.mp3';
var stat = fileSystem.statSync(filePath);
response.writeHead(200, {
'Content-Type': 'audio/mpeg',
'Content-Length': stat.size
});
var readStream = fileSystem.createReadStream(filePath);
// We replaced all the event handlers with a simple call to util.pump()
util.pump(readStream, response);
})
.listen(2000);
@daslicht
Copy link

daslicht commented Mar 7, 2016

Not me

@daslicht
Copy link

@daslicht
Copy link

Ok now I can start a stream at anytime I like , but just by byte offset :/

@vgrafe
Copy link

vgrafe commented May 18, 2016

@daslicht can you share the solution you found to start playback at a specific point?

@edinsoncs
Copy link

good (Y)

@qodesmith
Copy link

@daslicht I'd like to see how you started playback at a specific point as well

Copy link

ghost commented Dec 30, 2016

I'm looking to do the same, is there a way to start the playback at a specific point in time? Any help would be greatly appreciated.

@JhonatanHern
Copy link

It was very useful, I'm working in a personal project and this code was a bless.

@zoecarver
Copy link

thanks! super helpful code

@jconway45
Copy link

jconway45 commented Nov 11, 2018

var http = require('http'),
    url = require('url'),
    fs   = require('fs'),
    filePath = '/home/risto/Downloads/oleg.mp3',
    stat = fs.statSync(filePath);

http.createServer(function(request, response) {
    var queryData = url.parse(request.url, true).query;
    const skip = typeof(queryData.skip) == 'undefined' ? 0 : queryData.skip;
    const startByte = stat.size * skip;

    response.writeHead(200, {
        'Content-Type': 'audio/mpeg',
        'Content-Length': stat.size - startByte
    });

    // We replaced all the event handlers with a simple call to util.pump()
    fs.createReadStream(filePath, {start:startByte}).pipe(response);
})
.listen(2000);

@jconway45
Copy link

This gives you skipping ^^

@image72
Copy link

image72 commented Nov 19, 2018

Video stream with range.
via: https://medium.com/@daspinola/video-stream-with-node-js-and-html5-320b3191a6b6

var http = require('http'),
    url = require('url'),
    fs   = require('fs'),
    filePath = '/home/risto/Downloads/oleg.mp4',
    stat = fs.statSync(filePath);

http.createServer(function(request, response) {        
    const fileSize = stat.size;
    const range = request.headers.range;
    if (range) {
      const parts = range.replace(/bytes=/, "").split("-");
      const start = parseInt(parts[0], 10);
      const end = parts[1] 
        ? parseInt(parts[1], 10)
        : fileSize - 1;
      const chunksize = (end - start) + 1;
      const readStream = fs.createReadStream(filePath, { start, end });
      const head = {
        'Content-Range': `bytes ${start}-${end}/${fileSize}`,
        'Accept-Ranges': 'bytes',
        'Content-Length': chunksize,
        'Content-Type': 'video/mp4',
      };
      response.writeHead(206, head);
      readStream.pipe(response);
    } else {
      const head = {
        'Content-Length': fileSize,
        'Content-Type': 'video/mp4',
      };
      response.writeHead(200, head);
      fs.createReadStream(filePath).pipe(response);
    }
})
.listen(2000);

@dirkk0
Copy link

dirkk0 commented Jul 12, 2022

^^^ works like charm, thanks!

@leruetkins
Copy link

How to make mp3 stream from folder?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment