aboutsummaryrefslogtreecommitdiff
path: root/util/progressStats.js
diff options
context:
space:
mode:
Diffstat (limited to 'util/progressStats.js')
-rw-r--r--util/progressStats.js83
1 files changed, 83 insertions, 0 deletions
diff --git a/util/progressStats.js b/util/progressStats.js
new file mode 100644
index 0000000..f9794ed
--- /dev/null
+++ b/util/progressStats.js
@@ -0,0 +1,83 @@
+class ProgressStats {
+ constructor (trackerName, totalTasks) {
+ this.trackerName = trackerName
+ this.totalTasks = totalTasks
+ this.taskCounter = 0
+ }
+
+ logNext () {
+ this.taskCounter++
+ if (!this.beginTime) {
+ this.beginTime = new Date()
+ }
+ }
+
+ /**
+ * Begin a new task. Print the current progress and then increment the number of tasks.
+ * @param {string} A short message about the current task progress
+ * @param {[boolean]} logTimeLeft whether or not to log the time left.
+ */
+ beginTask (message, logTimeLeft) {
+ this.printStats(message, logTimeLeft)
+ this.logNext()
+ }
+
+ /**
+ * Print the current progress.
+ * @param {string} A short message about the current task progress
+ * @param {[boolean]} logTimeLeft whether or not to log the time left.
+ */
+ printStats (message, logTimeLeft) {
+ message = `${message}; ${this.trackerName} progress: ${this.getPercentage()}% done`
+ if (logTimeLeft) {
+ message = `${message} - ${this.getTimeLeft()} left`
+ }
+ console.log(message)
+ }
+
+ /**
+ * calculates the percentage of finished downloads
+ * @returns {string}
+ */
+ getPercentage () {
+ var current = (this.taskCounter / this.totalTasks)
+ return Math.round(current * 1000.0) / 10.0
+ }
+
+ /**
+ * calculates the time left and outputs it in human readable format
+ * calculation is based on the average time per task so far
+ *
+ * @returns {string}
+ */
+ getTimeLeft () {
+ if (this.taskCounter === 0) return '?'
+ const averageTimePerTask = (Date.now() - this.beginTime.getTime()) / this.taskCounter
+ var tasksLeft = this.totalTasks - this.taskCounter
+ var millisecondsLeft = averageTimePerTask * tasksLeft
+ return this.formatMilliseconds(millisecondsLeft)
+ }
+
+ /**
+ * inspired from https://stackoverflow.com/questions/19700283/how-to-convert-time-milliseconds-to-hours-min-sec-format-in-javascript
+ * @param millisec
+ * @returns {string}
+ */
+ formatMilliseconds (millisec) {
+ var seconds = (millisec / 1000).toFixed(1)
+ var minutes = (millisec / (1000 * 60)).toFixed(1)
+ var hours = (millisec / (1000 * 60 * 60)).toFixed(1)
+ var days = (millisec / (1000 * 60 * 60 * 24)).toFixed(1)
+ if (seconds < 60) {
+ return seconds + ' seconds'
+ } else if (minutes < 60) {
+ return minutes + ' minutes'
+ } else if (hours < 24) {
+ return hours + ' hours'
+ } else {
+ return days + ' days'
+ }
+ }
+}
+
+module.exports = ProgressStats