audiobookshelf/server/controllers/KOReaderController.js
2025-07-01 14:26:57 +02:00

140 lines
3.8 KiB
JavaScript

const Logger = require('../Logger')
const Database = require('../Database')
const { Op } = require('sequelize')
class KOReaderController {
tmpUsers = []
/**
* GET: /public/auth/users
* Authenticate user for KOReader
* @param {import('express').Request} req
* @param {import('express').Response} res
*/
async authenticateUser(req, res) {
console.log('KOReaderController.authenticateUser called')
console.log('req.user:', req.body)
// Check if user is authenticated
return res.status(200).json({
authorized: 'OK'
})
}
async updateProgress(req, res) {
try {
const doc = req.body.document
console.log(doc)
if (!doc) {
return res.status(400).json({ error: 'Document field is missing' })
}
const percentage = Number(req.body.percentage)
const progress = req.body.progress
const device = req.body.device
const device_id = req.body.device_id
const timestamp = Math.floor(Date.now() / 1000)
if (percentage && progress && device) {
const data = {
percentage,
progress,
device,
device_id,
timestamp
}
console.log(data)
// Needs to be saved later
return res.status(200).json({
document: doc,
timestamp
})
} else {
return res.status(400).json({ error: 'Invalid fields' })
}
} catch (error) {
return res.status(500).json({ error: 'Internal server error' })
}
}
/**
* GET: public/sync/:documentHash
* Get reading progress for a document by its hash
* @param {import('express').Request} req
* @param {import('express').Response} res
*/
async getProgress(req, res) {
const { documentHash } = req.params
console.log('KOReaderController.getProgress called with documentHash:', documentHash)
if (!documentHash) {
return res.status(400).json({ error: 'Document hash is required' })
}
try {
const book = await Database.bookModel.findOne({
where: {
[Op.or]: [{ md5FileHash: documentHash }, { md5FilenameHash: documentHash }]
},
include: [
{
model: Database.mediaProgressModel,
where: {
// Idk how we will map this later. For now enter your user ID here
userId: '50a15f71-8504-4046-be75-8cf38212d7d1',
mediaItemType: 'book'
},
required: false
}
]
})
if (!book) {
return res.status(404).json({ error: 'Book not found for the provided hash' })
}
const mediaProgress = book.mediaProgresses?.[0]
if (!mediaProgress) {
return res.json({
percentage: 0,
progress: 0,
device: null,
device_id: null,
timestamp: Math.floor(Date.now() / 1000)
})
}
// Convert progress to KOReader format
const progressPercentage = mediaProgress.ebookProgress || 0
// Seems not to work currently at all
const progressValue = mediaProgress.ebookLocation.replace('epubcfi(', '').replace(/\)$/, '')
console.log(`Progress for hash "${documentHash}":`, {
percentage: progressPercentage,
progress: progressValue,
device: '1',
device_id: '1',
timestamp: Math.floor(mediaProgress.updatedAt.getTime() / 1000)
})
return res.status(200).json({
percentage: progressPercentage,
progress: progressValue,
device: '1',
device_id: '1',
timestamp: Math.floor(mediaProgress.updatedAt.getTime() / 1000)
})
} catch (error) {
Logger.error(`[KOReaderController] Failed to get progress for hash "${documentHash}":`, error)
return res.status(500).json({ error: 'Internal server error' })
}
}
}
module.exports = new KOReaderController()