in source/stale-playlist-detector/playlist.js [136:171]
_onEnter: async function(input) {
// compare current sample to last changed sample
if (classobject.changed(input)) {
// changed
let change_duration_seconds = input.timeseconds - classobject.last_sample.timeseconds;
classobject.last_sample = input;
logger.info(`changed after ${change_duration_seconds}s [${classobject.options.url}]`);
classobject.change_durations.push(change_duration_seconds);
while (classobject.change_durations.length > classobject.change_durations_max) {
classobject.change_durations.shift();
}
// logger.info(JSON.stringify(classobject.change_durations));
classobject.p90_duration = jstat.percentile(classobject.change_durations, 0.90).toFixed(1);
classobject.mean_duration = jstat.mean(classobject.change_durations).toFixed(1);
classobject.median_duration = jstat.median(classobject.change_durations).toFixed(1);
classobject.min_duration = jstat.min(classobject.change_durations).toFixed(1);
classobject.max_duration = jstat.max(classobject.change_durations).toFixed(1);
logger.info(`p90 duration is ${classobject.p90_duration}s from ${classobject.change_durations.length} samples [${classobject.options.url}]`);
logger.info(`mean duration is ${classobject.mean_duration}s from ${classobject.change_durations.length} samples [${classobject.options.url}]`);
logger.info(`median duration is ${classobject.median_duration}s from ${classobject.change_durations.length} samples [${classobject.options.url}]`);
logger.info(`min duration is ${classobject.min_duration}s from ${classobject.change_durations.length} samples [${classobject.options.url}]`);
logger.info(`max duration is ${classobject.max_duration}s from ${classobject.change_durations.length} samples [${classobject.options.url}]`);
this.transition("fresh");
} else {
// not changed
let max_duration = Number.parseInt(classobject.last_sample.duration * classobject.options.detector_options.duration_multiplier);
logger.info(`maximum allowed duration is ${max_duration}s [${classobject.options.url}]`);
let expected_update = classobject.last_sample.timeseconds + max_duration;
logger.info(`change due by ${new Date(expected_update * 1000).toTimeString()} ${expected_update} [${classobject.options.url}]`);
if (input.timeseconds > expected_update) {
this.transition("stale");
} else {
this.transition("fresh");
}
}
}