-
Notifications
You must be signed in to change notification settings - Fork 16
/
streamdvr
executable file
·106 lines (89 loc) · 2.95 KB
/
streamdvr
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/usr/bin/env node
"use strict";
require("events").EventEmitter.prototype._maxListeners = 100;
const fs = require("fs");
const path = require("path");
const yaml = require("js-yaml");
const {Dvr} = require("./lib/core/dvr");
function sleep(time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
class Streamdvr extends Dvr {
constructor() {
super(__dirname);
this.plugins = [];
// Scan the config.yml directory for plugins to load
const allfiles = fs.readdirSync(this.configdir);
const ymlfiles = allfiles.filter((x) => x.match(/.*\.yml$/ig) && !x.match(/.*_updates\.yml/ig) && x !== "config.yml");
for (let i = 0; i < ymlfiles.length; i++) {
const config = yaml.load(fs.readFileSync(path.join(this.configdir, ymlfiles[i]), "utf8"));
if (config && config.plugin) {
// TODO: print better error message if config.plugin doesn't exist
this.plugins.push({
code: require(config.plugin),
name: config.name,
file: config.plugin,
urlback: config.urlback,
enable: config.enable,
handle: null
});
}
}
for (const plugin of this.plugins.values()) {
plugin.handle = new plugin.code.Plugin(plugin.name, this, this.tui, plugin.urlback);
}
process.on("SIGINT", () => {
this.exit();
});
}
start() {
super.start();
for (const plugin of this.plugins.values()) {
if (plugin.enable) {
this.run(plugin.handle);
}
}
}
busy() {
for (const plugin of this.plugins.values()) {
if (plugin.enable && plugin.handle.getNumCapsInProgress() > 0) {
return true;
}
}
return false;
}
async tryExit() {
while (true) {
// delay exiting until all capture and postprocess
// ffmpeg jobs have completed.
if (!this.busy()) {
for (const plugin of this.plugins.values()) {
if (plugin.enable) {
await plugin.handle.disconnect();
}
}
process.exit(0);
} else {
await sleep(1000);
}
}
}
exit() {
// Prevent bad things from happening if user holds down ctrl+c
if (!this.tryingToExit) {
this.tryingToExit = true;
if (this.busy()) {
this.msg("Stopping all recordings...");
}
this.tryExit();
}
// Always pass SIGINT to the recorder
for (const plugin of this.plugins.values()) {
if (plugin.enable) {
plugin.handle.haltAllCaptures();
}
}
}
}
const dvr = new Streamdvr();
dvr.start();