const Sequelize = require('sequelize') const Database = require('../../Database') const PlaybackSession = require('../../models/PlaybackSession') const fsExtra = require('../../libs/fsExtra') module.exports = { /** * * @param {number} year YYYY * @returns {Promise} */ async getListeningSessionsForYear(year) { const sessions = await Database.playbackSessionModel.findAll({ where: { createdAt: { [Sequelize.Op.gte]: `${year}-01-01`, [Sequelize.Op.lt]: `${year + 1}-01-01` } } }) return sessions }, /** * * @param {number} year YYYY * @returns {Promise} */ async getNumAuthorsAddedForYear(year) { const count = await Database.authorModel.count({ where: { createdAt: { [Sequelize.Op.gte]: `${year}-01-01`, [Sequelize.Op.lt]: `${year + 1}-01-01` } } }) return count }, /** * * @param {number} year YYYY * @returns {Promise} */ async getBooksAddedForYear(year) { const books = await Database.bookModel.findAll({ attributes: ['id', 'title', 'coverPath', 'duration', 'createdAt'], where: { createdAt: { [Sequelize.Op.gte]: `${year}-01-01`, [Sequelize.Op.lt]: `${year + 1}-01-01` } }, include: { model: Database.libraryItemModel, attributes: ['id', 'mediaId', 'mediaType', 'size'], required: true }, order: Database.sequelize.random() }) return books }, /** * * @param {number} year YYYY */ async getStatsForYear(year) { const booksAdded = await this.getBooksAddedForYear(year) let totalBooksAddedSize = 0 let totalBooksAddedDuration = 0 const booksWithCovers = [] for (const book of booksAdded) { // Grab first 25 that have a cover if (book.coverPath && !booksWithCovers.includes(book.libraryItem.id) && booksWithCovers.length < 25 && await fsExtra.pathExists(book.coverPath)) { booksWithCovers.push(book.libraryItem.id) } if (book.duration && !isNaN(book.duration)) { totalBooksAddedDuration += book.duration } if (book.libraryItem.size && !isNaN(book.libraryItem.size)) { totalBooksAddedSize += book.libraryItem.size } } const numAuthorsAdded = await this.getNumAuthorsAddedForYear(year) const listeningSessions = await this.getListeningSessionsForYear(year) let totalListeningTime = 0 for (const listeningSession of listeningSessions) { totalListeningTime += (listeningSession.timeListening || 0) } // Stats for total books, size and duration for everything added this year or earlier const [totalStatResultsRow] = await Database.sequelize.query(`SELECT SUM(li.size) AS totalSize, SUM(b.duration) AS totalDuration, COUNT(*) AS totalItems FROM libraryItems li, books b WHERE b.id = li.mediaId AND li.mediaType = 'book' AND li.createdAt < ":nextYear-01-01";`, { replacements: { nextYear: year + 1 } }) const totalStatResults = totalStatResultsRow[0] return { numListeningSessions: listeningSessions.length, numBooksAdded: booksAdded.length, numAuthorsAdded, totalBooksAddedSize, totalBooksAddedDuration: Math.round(totalBooksAddedDuration), booksAddedWithCovers: booksWithCovers, totalBooksSize: totalStatResults?.totalSize || 0, totalBooksDuration: totalStatResults?.totalDuration || 0, totalListeningTime, numBooks: totalStatResults?.totalItems || 0 } } }