function timeToPastText(timestamp) { const difference = Date.now() - timestamp return [ ["year", 365 * 24 * 60 * 60 * 1000], ["month", 30 * 24 * 60 * 60 * 1000], ["week", 7 * 24 * 60 * 60 * 1000], ["day", 24 * 60 * 60 * 1000], ["hour", 60 * 60 * 1000], ["minute", 60 * 1000], ["second", 1 * 1000] ].reduce((acc, [unitName, unitValue]) => { if (acc) return acc if (difference > unitValue) { const number = Math.floor(difference / unitValue) const pluralUnit = unitName + (number == 1 ? "" : "s") return `${number} ${pluralUnit} ago` } }, null) || "just now" } function lengthSecondsToLengthText(seconds) { return [Math.floor(seconds/3600), Math.floor(seconds/60)%60, seconds%60] .reduce((a, c, i, t) => ( a ? a : c || i == 1 ? t.slice(i) : false ), false) .map((x, i) => i === 0 ? x : (x+"").padStart(2, "0")) .join(":") } /** * Second and Invidious don't return quite the same data. This * function normalises them so that all the useful properties are * available no matter the kind of instance. The video is modified * in-place. * * Changes: * - second__lengthText is added, may be [hh:]mm:ss or "LIVE" * - publishedText may be changed to "Live now" */ function normaliseVideoInfo(video) { if (!video.second__lengthText && video.lengthSeconds > 0) { video.second__lengthText = lengthSecondsToLengthText(video.lengthSeconds) } if (!video.second__lengthText && video.lengthSeconds === 0) { video.second__lengthText = "LIVE" video.liveNow = true } if (video.publishedText === "0 seconds ago") { video.publishedText = "Live now" } } module.exports.timeToPastText = timeToPastText module.exports.lengthSecondsToLengthText = lengthSecondsToLengthText module.exports.normaliseVideoInfo = normaliseVideoInfo