UNPKG

mp3player

Version:

A mp3 player,get data by ajax and play by audiocontext or mediasource.it can download and reprocessing while playing

95 lines (90 loc) 3.46 kB
const http = require('http'); const fs = require('fs'); const path = require('path'); const mime = require('mime');//根据文件后缀获取文件类型工具 const server = http.createServer((req, res) => { console.log(req.url); var realPath; if(req.url.indexOf('?')>-1){ realPath = __dirname+req.url.substring(0,req.url.indexOf('?')); }else{ realPath = __dirname+req.url; } var exist = fs.existsSync(realPath); if(exist){ sendFile(realPath,req,res); }else{ res.writeHead(404,'file not exist'); res.end(); } }); server.listen(8000); function sendFile(realPath,req,res){ var stat = fs.statSync(realPath); //判断是请求头中是否有range部分 if (req.headers.range) { var size = stat.size; //获取文件大小 //暂且写在这里 function getRange() { var range = req.headers.range; if (range.indexOf(",") != -1) { //这里只处理了一个分段的情况 return false; } //range:bytes=0-255[,256-511] var parts = range.replace(/bytes=/, '').split("-"); var partiaStart = parts[0]; var partialEnd = parts[1]; var start = parseInt(partiaStart); //起始位置 //如果是bytes=0-,就是整个文件大小 var end = partialEnd ? parseInt(partialEnd) : size - 1; if (isNaN(start) || isNaN(end)) return false; //分段的大小 var chunkSize = end - start + 1; return { 'start': start, 'end': end, 'chunkSize': chunkSize }; } var rangeData = getRange(); if (rangeData) { //createReadStream原生支持range var raw = fs.createReadStream(realPath, { 'start': rangeData.start, 'end': rangeData.end }); //状态码206 res.writeHead(206, 'Partial Content', { 'Content-Type': mime.lookup(path.basename(realPath)), 'Content-Range': 'bytes ' + rangeData.start + '-' + rangeData.end + '/' + size, 'Content-Length': rangeData.chunkSize, 'Access-Control-Allow-Origin': '*', "Access-Control-Allow-Headers": "Content-Range,Range", "Access-Control-Expose-Headers": "Content-Range,Range" }); raw.on('data',function(chunk){ // 加密数据 for(let i=0; i<chunk.length; i++){ chunk[i] = chunk[i]^255; } res.write(chunk); }); raw.on('end', function(){ console.log('read end'); res.end(); }); // raw.pipe(res); } else { res.writeHead(416, "not ok!"); res.end(); } console.log('send media file:'+realPath); } else { res.writeHead(200, { 'Content-Type': mime.lookup(path.basename(realPath)), 'Access-Control-Allow-Origin': '*', "Access-Control-Allow-Headers": "Content-Range,Range" }); if(req.method.toLowerCase() == 'get' || req.method.toLowerCase() == 'post'){ var file = fs.readFileSync(realPath); res.end(file); console.log('send static file:'+realPath); }else{ res.end(); } } } console.log('listen 8000')