dizquetv/src/channel-cache.js
2020-09-24 19:00:17 -04:00

141 lines
4.1 KiB
JavaScript

const SLACK = require('./constants').SLACK;
let cache = {};
let programPlayTimeCache = {};
let fillerPlayTimeCache = {};
let configCache = {};
async function getChannelConfig(channelDB, channelId) {
//with lazy-loading
if ( typeof(configCache[channelId]) === 'undefined') {
let channel = await channelDB.getChannel(channelId)
if (channel == null) {
configCache[channelId] = [];
} else {
//console.log("channel=" + JSON.stringify(channel) );
configCache[channelId] = [channel];
}
}
//console.log("channel=" + JSON.stringify(configCache[channelId]).slice(0,200) );
return configCache[channelId];
}
function saveChannelConfig(number, channel ) {
configCache[number] = [channel];
}
function getCurrentLineupItem(channelId, t1) {
if (typeof(cache[channelId]) === 'undefined') {
return null;
}
let recorded = cache[channelId];
let lineupItem = JSON.parse( JSON.stringify(recorded.lineupItem) );
let diff = t1 - recorded.t0;
let rem = lineupItem.duration - lineupItem.start;
if (typeof(lineupItem.streamDuration) !== 'undefined') {
rem = Math.min(rem, lineupItem.streamDuration);
}
if ( (diff <= SLACK) && (diff + SLACK < rem) ) {
//closed the stream and opened it again let's not lose seconds for
//no reason
let originalT0 = recorded.lineupItem.originalT0;
if (typeof(originalT0) === 'undefined') {
originalT0 = recorded.t0;
}
if (t1 - originalT0 <= SLACK) {
lineupItem.originalT0 = originalT0;
return lineupItem;
}
}
lineupItem.start += diff;
if (typeof(lineupItem.streamDuration)!=='undefined') {
lineupItem.streamDuration -= diff;
if (lineupItem.streamDuration < SLACK) { //let's not waste time playing some loose seconds
return null;
}
}
if(lineupItem.start + SLACK > lineupItem.duration) {
return null;
}
return lineupItem;
}
function getKey(channelId, program) {
let serverKey = "!unknown!";
if (typeof(program.serverKey) !== 'undefined') {
if (typeof(program.serverKey) !== 'undefined') {
serverKey = "plex|" + program.serverKey;
}
}
let programKey = "!unknownProgram!";
if (typeof(program.key) !== 'undefined') {
programKey = program.key;
}
return channelId + "|" + serverKey + "|" + programKey;
}
function getFillerKey(channelId, fillerId) {
return channelId + "|" + fillerId;
}
function recordProgramPlayTime(channelId, lineupItem, t0) {
let remaining;
if ( typeof(lineupItem.streamDuration) !== 'undefined') {
remaining = lineupItem.streamDuration;
} else {
remaining = lineupItem.duration - lineupItem.start;
}
programPlayTimeCache[ getKey(channelId, lineupItem) ] = t0 + remaining;
if (typeof(lineupItem.fillerId) !== 'undefined') {
fillerPlayTimeCache[ getFillerKey(channelId, lineupItem.fillerId) ] = t0 + remaining;
}
}
function getProgramLastPlayTime(channelId, program) {
let v = programPlayTimeCache[ getKey(channelId, program) ];
if (typeof(v) === 'undefined') {
return 0;
} else {
return v;
}
}
function getFillerLastPlayTime(channelId, fillerId) {
let v = fillerPlayTimeCache[ getFillerKey(channelId, fillerId) ];
if (typeof(v) === 'undefined') {
return 0;
} else {
return v;
}
}
function recordPlayback(channelId, t0, lineupItem) {
recordProgramPlayTime(channelId, lineupItem, t0);
cache[channelId] = {
t0: t0,
lineupItem: lineupItem,
}
}
function clear() {
//it's not necessary to clear the playback cache and it may be undesirable
configCache = {};
cache = {};
}
module.exports = {
getCurrentLineupItem: getCurrentLineupItem,
recordPlayback: recordPlayback,
clear: clear,
getProgramLastPlayTime: getProgramLastPlayTime,
getChannelConfig: getChannelConfig,
saveChannelConfig: saveChannelConfig,
getFillerLastPlayTime: getFillerLastPlayTime,
}