Skip to content

Commit 9f57d8e

Browse files
committed
server analyzer update
1 parent bc389f8 commit 9f57d8e

File tree

3 files changed

+129
-87
lines changed

3 files changed

+129
-87
lines changed

bootstrap.js

Lines changed: 56 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,67 @@ http.createServer(function (request, response) {
1616

1717
var urlParts = url.parse(request.url);
1818

19-
console.log(urlParts.path);
20-
21-
switch(urlParts.path) {
22-
case '/':
23-
fs.readFile('client/index.html', function(error, html) {
24-
response.writeHead(200, { 'Content-Type': 'text/html' });
25-
response.write(html);
19+
if (urlParts.path.split('.').pop() === 'js') {
20+
21+
// not secure but this is a prototype
22+
fs.readFile('client' + urlParts.path, function(error, fileContent) {
23+
24+
if (!error) {
25+
26+
response.writeHead(200, { 'Content-Type': 'application/javascript' });
27+
response.write(fileContent);
2628
response.end();
27-
});
28-
break;
29-
case '/getwavedata':
30-
var trackId = '415208';
31-
getWaveData(trackId);
32-
break;
33-
default:
34-
response.writeHead(404, { 'Content-Type': 'text/html' });
35-
response.write('page not found');
36-
response.end();
29+
30+
} else {
31+
32+
response.writeHead(404, { 'Content-Type': 'text/html' });
33+
response.write('page not found');
34+
response.end();
35+
36+
}
37+
38+
});
39+
40+
} else {
41+
42+
switch(urlParts.path) {
43+
case '/':
44+
fs.readFile('client/index.html', function(error, html) {
45+
46+
if (!error) {
47+
48+
response.writeHead(200, { 'Content-Type': 'text/html' });
49+
response.write(html);
50+
response.end();
51+
52+
} else {
53+
54+
response.writeHead(404, { 'Content-Type': 'text/html' });
55+
response.write('page not found');
56+
response.end();
57+
58+
}
59+
60+
});
61+
break;
62+
case '/getwavedata':
63+
var trackId = '1135703';
64+
var peaksAmount = '200';
65+
getWaveData(trackId, peaksAmount);
66+
break;
67+
default:
68+
response.writeHead(404, { 'Content-Type': 'text/html' });
69+
response.write('page not found');
70+
response.end();
71+
72+
}
3773
}
3874

3975
}).listen(serverPort, serverIp);
4076

4177
console.log('server is listening, ip: ' + serverIp + ', port: ' + serverPort);
4278

43-
var getWaveData = function getWaveDataFunction(trackId) {
79+
var getWaveData = function getWaveDataFunction(trackId, peaksAmount) {
4480

4581
var audioDataAnalyzer = new AudioDataAnalyzer();
4682

@@ -53,12 +89,11 @@ var getWaveData = function getWaveDataFunction(trackId) {
5389

5490
if (!error) {
5591

56-
audioDataAnalyzer.getPCMValues(trackPath, function getValuesCallback(error, values) {
92+
audioDataAnalyzer.getPeaks(trackPath, peaksAmount, function getValuesCallback(error, peaks) {
5793

5894
if (!error) {
5995

60-
console.log(values);
61-
console.log('values count: ' + values.length);
96+
console.log(peaks);
6297

6398
} else {
6499

library/audioDataAnalyzer.js

Lines changed: 71 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ analyzer.prototype.getData = function getDataFunction(trackPath, callback) {
120120
* @param {type} callback
121121
* @returns {undefined}
122122
*/
123-
analyzer.prototype.getPCMValues = function getValuesFunction(trackPath, callback) {
123+
analyzer.prototype.getPeaks = function getValuesFunction(trackPath, peaksAmount, callback) {
124124

125125
this.getData(trackPath, function(error, trackData) {
126126

@@ -129,7 +129,7 @@ analyzer.prototype.getPCMValues = function getValuesFunction(trackPath, callback
129129
console.log('ffprobe track data: ');
130130
console.log(trackData);
131131

132-
// get audio pcm
132+
// get audio pcm as 16bit little endians
133133
var ffmpegSpawn = childProcess.spawn(
134134
'ffmpeg',
135135
[
@@ -138,106 +138,113 @@ analyzer.prototype.getPCMValues = function getValuesFunction(trackPath, callback
138138
'-f',
139139
's16le',
140140
'-ac',
141-
trackData.channels,
141+
//trackData.channels,
142+
// put everything into one channel
143+
1,
142144
'-acodec',
143145
'pcm_s16le',
144146
'-ar',
145147
trackData.sampleRate,
146148
'-y',
147-
'pipe:1'
149+
'pipe:1' // pipe to stdout
148150
]
149151
);
150152

151153
var stdoutOuputString = '';
152154
var stderrOuputString = '';
155+
156+
var samples = [];
153157

154-
// TODO: uncomment for ffprobe
155-
//ffmpegSpawn.stdout.setEncoding('utf8');
156-
157-
var oddByte = null;
158-
var channel = 0;
159-
160-
//var outputCounter = 0;
161-
162-
var maxValue = 0;
163-
164-
//var output = [];
165-
166-
//var counter = 0;
167-
168-
ffmpegSpawn.stdout.on('data', function(data) {
158+
ffmpegSpawn.stdout.on('data', function(buffer) {
159+
160+
// each buffer contains a certain amount of bytes (8bit)
161+
// https://trac.ffmpeg.org/wiki/audio%20types
169162

163+
// and we convert them to signed 16-bit little endians
170164
// http://nodejs.org/api/buffer.html#buffer_buf_readint16le_offset_noassert
171-
// https://github.com/jhurliman/node-pcm/blob/master/lib/pcm.js
172-
173-
var value;
165+
166+
174167
var i;
175-
var dataLen = data.length;
176-
var percentageOfMax = 0;
177-
178-
//counter++;
179-
180-
for (i=0; i < dataLen; i += 2) {
181-
182-
value = data.readInt16LE(i, true);
183-
184-
//channel = ++channel % 2;
185-
186-
//console.log('B: ' + value + ' / ' + channel);
168+
var dataLen = buffer.length;
169+
170+
// each buffer data contains 8bit but we read 16bit so i += 2
171+
for (i = 0; i < dataLen; i += 2) {
187172

188-
//outputCounter++;
173+
var positiveSample = Math.abs(buffer.readInt16LE(i, false));
189174

190-
//if (value > maxValue) maxValue = value;
175+
samples.push(positiveSample);
191176

192-
// maxValue is 32767
177+
}
193178

194-
// (value / maxValue)*100 = percentage of max
195-
percentageOfMax = (value / 32767)*100;
179+
});
196180

197-
//return false;
198-
199-
//outputCounter++;
181+
ffmpegSpawn.stdout.on('end', function(data) {
200182

201-
}
183+
console.log('ffmpegSpawn stdout end');
202184

203-
console.log(i);
185+
var samplesLength = samples.length;
204186

205-
//console.log('outputCounter: ' + outputCounter);
187+
if (samplesLength > peaksAmount) {
206188

207-
//console.log(maxValue); // 32767
189+
var samplesCountPerPeak = Math.floor(samplesLength / peaksAmount);
190+
var peaks = [];
191+
var peaksInPercent = [];
208192

209-
// get absolute value
210-
//var absolutePercentageOfMaxMath = Math.abs(percentageOfMax);
193+
var i;
194+
var start = 0;
195+
var end = start + samplesCountPerPeak;
196+
var highestPeak = 0;
211197

212-
//output.push(absolutePercentageOfMaxMath);
198+
for (i = 0; i < peaksAmount; i++) {
199+
200+
var peaksGroup = samples.slice(start, end);
201+
var x;
202+
var samplesSum = 0;
203+
var peaksGroupLength = peaksGroup.length;
213204

214-
//console.log(absolutePercentageOfMaxMath);
205+
for (x = 0; x < peaksGroupLength; x++) {
215206

216-
/*var bar = '';
207+
samplesSum += peaksGroup[x];
217208

218-
for (i=0; i < absolutePercentageOfMaxMath/10; i++) {
209+
}
219210

220-
bar += '*';
211+
peaks.push(samplesSum);
212+
213+
if (samplesSum > highestPeak) {
214+
215+
highestPeak = samplesSum;
216+
217+
}
221218

222-
}*/
219+
start += samplesCountPerPeak;
220+
end += samplesCountPerPeak;
223221

224-
//console.log(bar);
222+
}
223+
224+
var y;
225+
var peaksLength = peaks.length;
225226

226-
});
227+
for (y = 0; y < peaksLength; y++) {
227228

228-
ffmpegSpawn.stdout.on('end', function(data) {
229+
var peakInPercent = Math.round((peaks[y] / highestPeak) * 100);
229230

230-
console.log('ffmpegSpawn stdout end');
231-
//console.log(counter);
232-
//console.log(outputCounter);
231+
peaksInPercent.push(peakInPercent);
233232

234-
if (output.length > 0) {
233+
}
235234

236-
callback(false, output);
235+
callback(false, peaksInPercent);
237236

238237
} else {
239-
240-
callback('no output recieved');
238+
239+
if (samplesLength === 0) {
240+
241+
callback('no output recieved');
242+
243+
} else if (samplesLength < peaksAmount) {
244+
245+
callback('not enough peaks in this song for a full wave');
246+
247+
}
241248

242249
}
243250

library/trackDownloader.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ downloader.prototype.downloadIfNotExists = function downloadIfNotExists(trackId,
118118

119119
};
120120

121-
var downloadFile = function downloadFileFunction(trackId, callback, trackPath, format) {
121+
downloader.prototype.downloadFile = function downloadFileFunction(trackId, callback, trackPath, format) {
122122

123123
console.log('downloadFile: ' + trackId);
124124

@@ -166,7 +166,7 @@ var downloadFile = function downloadFileFunction(trackId, callback, trackPath, f
166166

167167
httpResponse.on('end', function() {
168168

169-
console.log('file ' + trackFileName + ' got downloaded into ' + trackPath);
169+
console.log('file ' + trackPath + ' got downloaded into ' + trackPath);
170170

171171
writeStream.end();
172172

0 commit comments

Comments
 (0)