mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-07-09 02:41:35 +00:00
140 lines
3.8 KiB
JavaScript
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()
|