| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- #!/usr/bin/env node
- /* eslint-disable no-process-exit */
- "use strict";
- // record a live hls-stream storing an on-demand ready version
- var hlsrecord = require('commander');
- hlsrecord.version(require('../package').version)
- .usage('[options] <url>')
- .option('-o, --output <dir>', 'Output directory')
- .option('-c, --create-dir', 'Explicitly create output dir')
- .option('-b, --begin-date <date>', 'Start recording at', dateValue)
- .option('-e, --end-date <date>', 'Stop recording at', dateValue)
- .option('-s, --start-offset <seconds>', 'Playback start time offset', parseFloat)
- .option('--extension <label>', 'preserve vendor extension', function (val) {
- return (hlsrecord.extension || []).concat(val);
- })
- .option('--segment-ext <label>', 'preserve vendor segment extension', function (val) {
- return (hlsrecord.segmentExt || []).concat(val);
- })
- // .option('-a, --user-agent <string>', 'HTTP User-Agent')
- // .option('-f, --full', 'record all variants')
- .parse(process.argv);
- function dateValue(val) {
- // FIXME: negative values doesn't work with commander - https://github.com/visionmedia/commander.js/issues/61
- if (val === 'now') return new Date();
- if (val.length && (val[0] === '+' || val[0] === '-'))
- return new Date(Math.round(new Date().getTime() / 1000 + parseInt(val, 10)) * 1000);
- if (parseInt(val, 10) == val)
- return new Date(parseInt(val, 10) * 1000);
- return new Date(val);
- }
- var fs = require('fs');
- var HlsSegmentReader = require('hls-segment-reader');
- var recorder = require('../lib/recorder');
- var src = hlsrecord.args[0];
- if (!src) {
- hlsrecord.help();
- process.exit(-1);
- }
- var outDir = hlsrecord.output || 'stream';
- if (hlsrecord.createDir)
- fs.mkdirSync(outDir);
- if (hlsrecord.beginDate)
- console.log('fetching from:', hlsrecord.beginDate);
- if (hlsrecord.endDate)
- console.log('fetching until:', hlsrecord.endDate);
- var extensions = {};
- (hlsrecord.extension || []).forEach(function(ext) {
- extensions[ext] = false;
- });
- (hlsrecord.segmentExt || []).forEach(function(ext) {
- extensions[ext] = true;
- });
- var readerOptions = {
- withData: true,
- fullStream: !hlsrecord.beginDate,
- startDate: hlsrecord.beginDate,
- stopDate: hlsrecord.endDate,
- maxStallTime: 5 * 60 * 1000,
- extensions: extensions,
- highWaterMark: 0,
- };
- function createReader(src) {
- var r = new HlsSegmentReader(src, readerOptions);
- r.on('error', function(err) {
- console.error('reader error', err);
- });
- return r;
- }
- var rdr = createReader(src);
- recorder(rdr, outDir, { subreader:createReader, startOffset: hlsrecord.startOffset }).start();
|