-
Notifications
You must be signed in to change notification settings - Fork 0
/
BlocksManager.js
75 lines (63 loc) · 1.69 KB
/
BlocksManager.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
const fs = require('fs-extra');
const mp3Duration = require('mp3-duration');
const constants = require('./constants');
const Block = require('./Block');
class BlocksManager {
constructor(name, format){
this.name = name;
this.format = format;
this.blocks = [];
this.liveBlock = null;
this.loadBlocks();
}
getBlocksFile(){
return constants.recordingsFolder + this.name + '/blocks.json';
}
loadBlocks(){
try {
const json = fs.readFileSync(this.getBlocksFile());
this.blocks = JSON.parse(json).map(block => new Block(block));
} catch(e){
console.log('no blocks.json for station ' + this.name);
}
}
notifyLiveBlockStart(blockStart){
const folder = constants.recordingsFolder + this.name;
const file = blockStart + '.' + this.format;
const path = folder + '/' + file;
this.liveBlock = new Block(blockStart, file, path);
this.addBlock(this.liveBlock);
}
notifyLiveBlockEnd(){
this.liveBlock = null;
this.synchronizeBlocks();
}
sortBlocks(){
this.blocks.sort((block1, block2) => { // sort blocks descending (newest first)
return (parseInt(block1.name) < parseInt(block2.name))? 1 : -1;
});
}
async synchronizeBlocks(){
for(let block of this.blocks){
if(!block.duration){
block.duration = await this.determineDuration(block);
await this.saveBlocks();
}
}
}
async determineDuration(block){
if(this.format === 'mp3'){
return await mp3Duration(block.path);
}
return null;
}
addBlock(block){
this.blocks.unshift(block); // we want new blocks at the top
this.saveBlocks();
}
async saveBlocks(){
const json = JSON.stringify(this.blocks, null, 4);
await fs.writeFile(this.getBlocksFile(), json);
}
}
module.exports = BlocksManager;