@gibme/tablo.tv 20.0.3 → 22.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +160 -47
- package/dist/lighthouse.d.ts +1 -2
- package/dist/lighthouse.js +151 -199
- package/dist/lighthouse.js.map +1 -1
- package/dist/live_transcoder.d.ts +5 -0
- package/dist/live_transcoder.js +114 -91
- package/dist/live_transcoder.js.map +1 -1
- package/dist/tablo.d.ts +2 -2
- package/dist/tablo.js +285 -295
- package/dist/tablo.js.map +1 -1
- package/dist/tablo_api.d.ts +0 -1
- package/dist/tablo_api.js +52 -75
- package/dist/tablo_api.js.map +1 -1
- package/package.json +21 -23
package/dist/live_transcoder.js
CHANGED
|
@@ -18,15 +18,6 @@
|
|
|
18
18
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
19
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
20
|
// SOFTWARE.
|
|
21
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
22
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
23
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
24
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
25
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
26
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
27
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
28
|
-
});
|
|
29
|
-
};
|
|
30
21
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
31
22
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
32
23
|
};
|
|
@@ -41,6 +32,22 @@ const which_1 = __importDefault(require("which"));
|
|
|
41
32
|
const crypto_1 = require("crypto");
|
|
42
33
|
const timer_1 = __importDefault(require("@gibme/timer"));
|
|
43
34
|
class LiveTranscoder extends events_1.EventEmitter {
|
|
35
|
+
id;
|
|
36
|
+
device;
|
|
37
|
+
channel_id;
|
|
38
|
+
output_path;
|
|
39
|
+
filename;
|
|
40
|
+
auto_restart;
|
|
41
|
+
static instances = new Map();
|
|
42
|
+
ffmpeg_path;
|
|
43
|
+
process;
|
|
44
|
+
timer;
|
|
45
|
+
emitter = new events_1.EventEmitter();
|
|
46
|
+
restart_count = 0;
|
|
47
|
+
stopping = false;
|
|
48
|
+
static MAX_RESTARTS = 5;
|
|
49
|
+
static READY_TIMEOUT = 30_000;
|
|
50
|
+
static MIN_KEEPALIVE = 60;
|
|
44
51
|
/**
|
|
45
52
|
* Creates a new live transcoder instance.
|
|
46
53
|
*
|
|
@@ -64,69 +71,75 @@ class LiveTranscoder extends events_1.EventEmitter {
|
|
|
64
71
|
this.output_path = output_path;
|
|
65
72
|
this.filename = filename;
|
|
66
73
|
this.auto_restart = auto_restart;
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
+
try {
|
|
75
|
+
this.ffmpeg_path = ffmpeg_static_1.default ?? which_1.default.sync('ffmpeg');
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
throw new Error('ffmpeg is not installed. Install ffmpeg or ensure ffmpeg-static provides a valid binary.');
|
|
79
|
+
}
|
|
80
|
+
this.emitter.on('abort', async () => {
|
|
81
|
+
this.stopping = true;
|
|
74
82
|
if (this.process) {
|
|
75
|
-
(_a = this.process.stdin) === null || _a === void 0 ? void 0 : _a.write('q', error => {
|
|
76
|
-
if (error) {
|
|
77
|
-
this.emit('error', error);
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
83
|
try {
|
|
81
84
|
if (!this.process.killed) {
|
|
82
85
|
this.process.kill();
|
|
83
86
|
}
|
|
84
87
|
}
|
|
85
|
-
catch
|
|
88
|
+
catch {
|
|
86
89
|
}
|
|
87
90
|
delete this.process;
|
|
88
|
-
|
|
91
|
+
this.timer?.destroy();
|
|
89
92
|
delete this.timer;
|
|
90
93
|
if (this.session) {
|
|
91
|
-
|
|
94
|
+
await this.device.deleteSession(this.session);
|
|
92
95
|
}
|
|
93
96
|
this.active = false;
|
|
94
97
|
this.emitter.emit('stopped');
|
|
95
98
|
}
|
|
96
|
-
})
|
|
99
|
+
});
|
|
97
100
|
this.emitter.on('stopped', () => {
|
|
98
101
|
try {
|
|
99
|
-
const current_path = (0, path_1.resolve)(output_path, `./${this.id}`);
|
|
100
|
-
|
|
102
|
+
const current_path = (0, path_1.resolve)(this.output_path, `./${this.id}`);
|
|
103
|
+
const base = (0, path_1.resolve)(this.output_path);
|
|
104
|
+
if (current_path.startsWith(base) && (0, fs_1.existsSync)(current_path)) {
|
|
101
105
|
(0, fs_1.rmSync)(current_path, { recursive: true, force: true });
|
|
102
106
|
}
|
|
103
107
|
}
|
|
104
|
-
catch
|
|
108
|
+
catch {
|
|
105
109
|
}
|
|
110
|
+
LiveTranscoder.instances.delete(this.id);
|
|
106
111
|
this.emit('stopped');
|
|
107
112
|
});
|
|
113
|
+
const base_path = (0, path_1.resolve)(output_path);
|
|
108
114
|
this.full_path = (0, path_1.resolve)(output_path, `./${this.id}`);
|
|
115
|
+
if (!this.full_path.startsWith(base_path)) {
|
|
116
|
+
throw new Error('Resolved output path escapes the base output directory');
|
|
117
|
+
}
|
|
109
118
|
if ((0, fs_1.existsSync)(this.full_path)) {
|
|
110
119
|
(0, fs_1.rmSync)(this.full_path, { recursive: true, force: true });
|
|
111
120
|
}
|
|
112
121
|
(0, fs_1.mkdirSync)(this.full_path, { recursive: true });
|
|
113
122
|
this.full_path = (0, path_1.resolve)(this.full_path, `./${this.filename}`);
|
|
114
123
|
}
|
|
124
|
+
_use_count = 0;
|
|
115
125
|
get use_count() {
|
|
116
126
|
return this._use_count;
|
|
117
127
|
}
|
|
128
|
+
_active = false;
|
|
118
129
|
get active() {
|
|
119
130
|
return this._active;
|
|
120
131
|
}
|
|
121
132
|
set active(active) {
|
|
122
133
|
this._active = active;
|
|
123
134
|
}
|
|
135
|
+
_full_path = '';
|
|
124
136
|
get full_path() {
|
|
125
137
|
return this._full_path;
|
|
126
138
|
}
|
|
127
139
|
set full_path(path) {
|
|
128
140
|
this._full_path = path;
|
|
129
141
|
}
|
|
142
|
+
_session;
|
|
130
143
|
get session() {
|
|
131
144
|
return this._session;
|
|
132
145
|
}
|
|
@@ -134,8 +147,7 @@ class LiveTranscoder extends events_1.EventEmitter {
|
|
|
134
147
|
this._session = session;
|
|
135
148
|
}
|
|
136
149
|
get channel() {
|
|
137
|
-
|
|
138
|
-
return (_a = this.session) === null || _a === void 0 ? void 0 : _a.channel;
|
|
150
|
+
return this.session?.channel;
|
|
139
151
|
}
|
|
140
152
|
get relative_path() {
|
|
141
153
|
if (this.id) {
|
|
@@ -163,22 +175,20 @@ class LiveTranscoder extends events_1.EventEmitter {
|
|
|
163
175
|
* @param filename
|
|
164
176
|
* @param auto_restart
|
|
165
177
|
*/
|
|
166
|
-
static instance(
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
return instance;
|
|
181
|
-
});
|
|
178
|
+
static async instance(device, channel_id, output_path, filename = 'stream.m3u8', auto_restart = true) {
|
|
179
|
+
const info = await device.info();
|
|
180
|
+
if (!info) {
|
|
181
|
+
throw new Error('Failed to retrieve device information');
|
|
182
|
+
}
|
|
183
|
+
const id = (0, crypto_1.createHash)('sha256')
|
|
184
|
+
.update(JSON.stringify({ server_id: info.server_id, channel_id }))
|
|
185
|
+
.digest('hex');
|
|
186
|
+
let instance = this.instances.get(id);
|
|
187
|
+
if (!instance) {
|
|
188
|
+
instance = new LiveTranscoder(id, device, channel_id, output_path, filename, auto_restart);
|
|
189
|
+
this.instances.set(id, instance);
|
|
190
|
+
}
|
|
191
|
+
return instance;
|
|
182
192
|
}
|
|
183
193
|
on(event, listener) {
|
|
184
194
|
return super.on(event, listener);
|
|
@@ -196,47 +206,54 @@ class LiveTranscoder extends events_1.EventEmitter {
|
|
|
196
206
|
*
|
|
197
207
|
* If a session is successfully started, the live transcoder will attempt to start a new transcoding process.
|
|
198
208
|
*/
|
|
199
|
-
start() {
|
|
200
|
-
|
|
201
|
-
if (this.active) {
|
|
202
|
-
this._use_count++;
|
|
203
|
-
this.emit('ready');
|
|
204
|
-
return true;
|
|
205
|
-
}
|
|
206
|
-
this.session = yield this.device.watchChannel(this.channel_id);
|
|
207
|
-
if (!this.session) {
|
|
208
|
-
this.emit('error', new Error('Failed to start session'));
|
|
209
|
-
return false;
|
|
210
|
-
}
|
|
211
|
-
this.timer = new timer_1.default((this.session.keepalive - 30) * 1000);
|
|
212
|
-
this.timer.on('tick', () => __awaiter(this, void 0, void 0, function* () {
|
|
213
|
-
if (this.session) {
|
|
214
|
-
yield this.device.keepaliveSession(this.session);
|
|
215
|
-
}
|
|
216
|
-
}));
|
|
209
|
+
async start() {
|
|
210
|
+
if (this.active) {
|
|
217
211
|
this._use_count++;
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
212
|
+
this.emit('ready');
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
this.session = await this.device.watchChannel(this.channel_id);
|
|
216
|
+
if (!this.session) {
|
|
217
|
+
this.emit('error', new Error('Failed to start session'));
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
const keepalive_interval = Math.max(this.session.keepalive - 30, LiveTranscoder.MIN_KEEPALIVE) * 1000;
|
|
221
|
+
this.timer = new timer_1.default(keepalive_interval);
|
|
222
|
+
this.timer.on('tick', async () => {
|
|
223
|
+
if (this.session) {
|
|
224
|
+
await this.device.keepaliveSession(this.session);
|
|
230
225
|
}
|
|
231
|
-
return started;
|
|
232
226
|
});
|
|
227
|
+
this._use_count++;
|
|
228
|
+
this.restart_count = 0;
|
|
229
|
+
const started = this.start_ffmpeg();
|
|
230
|
+
if (started) {
|
|
231
|
+
const deadline = Date.now() + LiveTranscoder.READY_TIMEOUT;
|
|
232
|
+
const check = () => setTimeout(() => {
|
|
233
|
+
if ((0, fs_1.existsSync)(this.full_path)) {
|
|
234
|
+
this.active = true;
|
|
235
|
+
this.emit('ready');
|
|
236
|
+
}
|
|
237
|
+
else if (Date.now() >= deadline) {
|
|
238
|
+
this.emit('error', new Error('Timed out waiting for ffmpeg to produce output'));
|
|
239
|
+
this.emitter.emit('abort');
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
check();
|
|
243
|
+
}
|
|
244
|
+
}, 100);
|
|
245
|
+
check();
|
|
246
|
+
}
|
|
247
|
+
return started;
|
|
233
248
|
}
|
|
234
249
|
/**
|
|
235
250
|
* Stops the live transcoder.
|
|
236
251
|
*/
|
|
237
252
|
stop() {
|
|
238
|
-
this._use_count
|
|
239
|
-
|
|
253
|
+
if (this._use_count > 0) {
|
|
254
|
+
this._use_count--;
|
|
255
|
+
}
|
|
256
|
+
if (this.active && this._use_count <= 0) {
|
|
240
257
|
this.emitter.emit('abort');
|
|
241
258
|
}
|
|
242
259
|
}
|
|
@@ -262,28 +279,34 @@ class LiveTranscoder extends events_1.EventEmitter {
|
|
|
262
279
|
windowsHide: false,
|
|
263
280
|
stdio: ['pipe', 'ignore', 'ignore']
|
|
264
281
|
});
|
|
265
|
-
|
|
266
|
-
this.
|
|
282
|
+
const handle_restart = () => {
|
|
283
|
+
if (this.stopping) {
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
267
286
|
if (!this.auto_restart) {
|
|
268
287
|
this.emitter.emit('abort');
|
|
288
|
+
return;
|
|
269
289
|
}
|
|
270
|
-
|
|
271
|
-
|
|
290
|
+
this.restart_count++;
|
|
291
|
+
if (this.restart_count > LiveTranscoder.MAX_RESTARTS) {
|
|
292
|
+
this.emit('error', new Error(`ffmpeg exceeded maximum restart attempts (${LiveTranscoder.MAX_RESTARTS})`));
|
|
293
|
+
this.emitter.emit('abort');
|
|
294
|
+
return;
|
|
272
295
|
}
|
|
296
|
+
const delay = Math.min(1000 * Math.pow(2, this.restart_count - 1), 30_000);
|
|
297
|
+
setTimeout(() => this.start_ffmpeg(), delay);
|
|
298
|
+
};
|
|
299
|
+
this.process.on('error', error => {
|
|
300
|
+
this.emit('error', error);
|
|
301
|
+
handle_restart();
|
|
273
302
|
});
|
|
274
303
|
this.process.on('exit', code => {
|
|
275
304
|
this.emit('exit', code);
|
|
276
|
-
|
|
277
|
-
this.emitter.emit('abort');
|
|
278
|
-
}
|
|
279
|
-
else {
|
|
280
|
-
this.start_ffmpeg();
|
|
281
|
-
}
|
|
305
|
+
handle_restart();
|
|
282
306
|
});
|
|
283
307
|
return true;
|
|
284
308
|
}
|
|
285
309
|
}
|
|
286
|
-
exports.LiveTranscoder = LiveTranscoder;
|
|
287
|
-
LiveTranscoder.instances = new Map();
|
|
288
310
|
exports.default = LiveTranscoder;
|
|
311
|
+
exports.LiveTranscoder = LiveTranscoder;
|
|
289
312
|
//# sourceMappingURL=live_transcoder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live_transcoder.js","sourceRoot":"","sources":["../src/live_transcoder.ts"],"names":[],"mappings":";AAAA,iEAAiE;AACjE,EAAE;AACF,+EAA+E;AAC/E,gFAAgF;AAChF,+EAA+E;AAC/E,4EAA4E;AAC5E,wEAAwE;AACxE,2DAA2D;AAC3D,EAAE;AACF,iFAAiF;AACjF,kDAAkD;AAClD,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAC3E,8EAA8E;AAC9E,yEAAyE;AACzE,gFAAgF;AAChF,gFAAgF;AAChF,YAAY
|
|
1
|
+
{"version":3,"file":"live_transcoder.js","sourceRoot":"","sources":["../src/live_transcoder.ts"],"names":[],"mappings":"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"}
|
package/dist/tablo.d.ts
CHANGED
|
@@ -189,13 +189,13 @@ export declare namespace Tablo {
|
|
|
189
189
|
};
|
|
190
190
|
export type Tuner = {
|
|
191
191
|
in_use: boolean;
|
|
192
|
-
channel:
|
|
192
|
+
channel: Channel | null;
|
|
193
193
|
recording: string | null;
|
|
194
194
|
channel_identifier: string | null;
|
|
195
195
|
};
|
|
196
196
|
export type Settings = {
|
|
197
197
|
led: string;
|
|
198
|
-
|
|
198
|
+
extend_live_recordings: boolean;
|
|
199
199
|
auto_delete_recordings: boolean;
|
|
200
200
|
exclude_duplicates: boolean;
|
|
201
201
|
preferred_audio_track: string;
|