|
@@ -21,6 +21,7 @@ function HlsStreamRecorder(reader, dst, options) {
|
|
|
this.seq = 0;
|
|
this.seq = 0;
|
|
|
this.index = null;
|
|
this.index = null;
|
|
|
|
|
|
|
|
|
|
+ this.startOffset = parseFloat(options.startOffset);
|
|
|
this.subreader = options.subreader;
|
|
this.subreader = options.subreader;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -42,43 +43,51 @@ HlsStreamRecorder.prototype.updateIndex = function(update) {
|
|
|
|
|
|
|
|
if (!this.index) {
|
|
if (!this.index) {
|
|
|
this.index = new m3u8parse.M3U8Playlist(update);
|
|
this.index = new m3u8parse.M3U8Playlist(update);
|
|
|
- this.index.segments = [];
|
|
|
|
|
- this.index.first_seq_no = self.seq;
|
|
|
|
|
- this.index.type = 'EVENT';
|
|
|
|
|
- this.index.ended = false;
|
|
|
|
|
-
|
|
|
|
|
- debug('programs', this.index.programs);
|
|
|
|
|
- if (this.subreader) {
|
|
|
|
|
- for (var programNo in this.index.programs) {
|
|
|
|
|
- var programs = this.index.programs[programNo];
|
|
|
|
|
-
|
|
|
|
|
- // remove backup sources
|
|
|
|
|
- var used = {};
|
|
|
|
|
- programs = programs.filter(function(program) {
|
|
|
|
|
- var bw = parseInt(program.info.bandwidth, 10);
|
|
|
|
|
- var res = !(bw in used);
|
|
|
|
|
- used[bw] = true;
|
|
|
|
|
- return res;
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
- this.index.programs[programNo] = programs;
|
|
|
|
|
-
|
|
|
|
|
- programs.forEach(function(program, index) {
|
|
|
|
|
- var programUrl = url.resolve(self.reader.baseUrl, program.uri);
|
|
|
|
|
- debug('url', programUrl);
|
|
|
|
|
- var dir = self.variantName(program.info, index);
|
|
|
|
|
- program.uri = path.join(dir, 'index.m3u8');
|
|
|
|
|
- program.recorder = new HlsStreamRecorder(self.subreader(programUrl), path.join(self.dst, dir)).start();
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ if (!this.index.variant) {
|
|
|
|
|
+ this.index.segments = [];
|
|
|
|
|
+ this.index.first_seq_no = self.seq;
|
|
|
|
|
+ this.index.type = 'EVENT';
|
|
|
|
|
+ this.index.ended = false;
|
|
|
|
|
+ this.index.discontinuity_sequence = 0; // not allowed in event playlists
|
|
|
|
|
+ if (!isNaN(this.startOffset)) {
|
|
|
|
|
+ var offset = this.startOffset;
|
|
|
|
|
+ if (offset < 0) offset = Math.min(offset, -3 * this.target_duration);
|
|
|
|
|
+ this.index.start = { offset: offset };
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- // TODO: handle groups!!
|
|
|
|
|
- this.index.groups = {};
|
|
|
|
|
- this.index.iframes = {};
|
|
|
|
|
} else {
|
|
} else {
|
|
|
- this.index.programs = {};
|
|
|
|
|
- this.index.groups = {};
|
|
|
|
|
- this.index.iframes = {};
|
|
|
|
|
|
|
+ debug('programs', this.index.programs);
|
|
|
|
|
+ if (this.subreader) {
|
|
|
|
|
+ for (var programNo in this.index.programs) {
|
|
|
|
|
+ var programs = this.index.programs[programNo];
|
|
|
|
|
+
|
|
|
|
|
+ // remove backup sources
|
|
|
|
|
+ var used = {};
|
|
|
|
|
+ programs = programs.filter(function(program) {
|
|
|
|
|
+ var bw = parseInt(program.info.bandwidth, 10);
|
|
|
|
|
+ var res = !(bw in used);
|
|
|
|
|
+ used[bw] = true;
|
|
|
|
|
+ return res;
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ this.index.programs[programNo] = programs;
|
|
|
|
|
+
|
|
|
|
|
+ programs.forEach(function(program, index) {
|
|
|
|
|
+ var programUrl = url.resolve(self.reader.baseUrl, program.uri);
|
|
|
|
|
+ debug('url', programUrl);
|
|
|
|
|
+ var dir = self.variantName(program.info, index);
|
|
|
|
|
+ program.uri = path.join(dir, 'index.m3u8');
|
|
|
|
|
+ program.recorder = new HlsStreamRecorder(self.subreader(programUrl), path.join(self.dst, dir), { startOffset: self.startOffset }).start();
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // TODO: handle groups!!
|
|
|
|
|
+ this.index.groups = {};
|
|
|
|
|
+ this.index.iframes = {};
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.index.programs = {};
|
|
|
|
|
+ this.index.groups = {};
|
|
|
|
|
+ this.index.iframes = {};
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// hook end listener
|
|
// hook end listener
|