mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2025-08-03 09:44:41 +02:00
Update more API endpoints to use new user model
This commit is contained in:
parent
9facf77ff1
commit
afc16358ca
23 changed files with 856 additions and 404 deletions
|
@ -39,7 +39,7 @@ class PlaybackSessionManager {
|
|||
|
||||
/**
|
||||
*
|
||||
* @param {import('express').Request} req
|
||||
* @param {import('../controllers/SessionController').RequestWithUser} req
|
||||
* @param {Object} [clientDeviceInfo]
|
||||
* @returns {Promise<DeviceInfo>}
|
||||
*/
|
||||
|
@ -48,7 +48,7 @@ class PlaybackSessionManager {
|
|||
const ip = requestIp.getClientIp(req)
|
||||
|
||||
const deviceInfo = new DeviceInfo()
|
||||
deviceInfo.setData(ip, ua, clientDeviceInfo, serverVersion, req.user?.id)
|
||||
deviceInfo.setData(ip, ua, clientDeviceInfo, serverVersion, req.userNew?.id)
|
||||
|
||||
if (clientDeviceInfo?.deviceId) {
|
||||
const existingDevice = await Database.getDeviceByDeviceId(clientDeviceInfo.deviceId)
|
||||
|
@ -67,18 +67,25 @@ class PlaybackSessionManager {
|
|||
|
||||
/**
|
||||
*
|
||||
* @param {import('express').Request} req
|
||||
* @param {import('../controllers/SessionController').RequestWithUser} req
|
||||
* @param {import('express').Response} res
|
||||
* @param {string} [episodeId]
|
||||
*/
|
||||
async startSessionRequest(req, res, episodeId) {
|
||||
const deviceInfo = await this.getDeviceInfo(req, req.body?.deviceInfo)
|
||||
Logger.debug(`[PlaybackSessionManager] startSessionRequest for device ${deviceInfo.deviceDescription}`)
|
||||
const { user, libraryItem, body: options } = req
|
||||
const session = await this.startSession(user, deviceInfo, libraryItem, episodeId, options)
|
||||
const { libraryItem, body: options } = req
|
||||
const session = await this.startSession(req.userNew, deviceInfo, libraryItem, episodeId, options)
|
||||
res.json(session.toJSONForClient(libraryItem))
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {import('../models/User')} user
|
||||
* @param {*} session
|
||||
* @param {*} payload
|
||||
* @param {import('express').Response} res
|
||||
*/
|
||||
async syncSessionRequest(user, session, payload, res) {
|
||||
if (await this.syncSession(user, session, payload)) {
|
||||
res.sendStatus(200)
|
||||
|
@ -89,7 +96,7 @@ class PlaybackSessionManager {
|
|||
|
||||
async syncLocalSessionsRequest(req, res) {
|
||||
const deviceInfo = await this.getDeviceInfo(req, req.body?.deviceInfo)
|
||||
const user = req.user
|
||||
const user = req.userNew
|
||||
const sessions = req.body.sessions || []
|
||||
|
||||
const syncResults = []
|
||||
|
@ -104,6 +111,13 @@ class PlaybackSessionManager {
|
|||
})
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {import('../models/User')} user
|
||||
* @param {*} sessionJson
|
||||
* @param {*} deviceInfo
|
||||
* @returns
|
||||
*/
|
||||
async syncLocalSession(user, sessionJson, deviceInfo) {
|
||||
const libraryItem = await Database.libraryItemModel.getOldById(sessionJson.libraryItemId)
|
||||
const episode = sessionJson.episodeId && libraryItem && libraryItem.isPodcast ? libraryItem.media.getEpisode(sessionJson.episodeId) : null
|
||||
|
@ -174,41 +188,58 @@ class PlaybackSessionManager {
|
|||
progressSynced: false
|
||||
}
|
||||
|
||||
const userProgressForItem = user.getMediaProgress(session.libraryItemId, session.episodeId)
|
||||
const mediaItemId = session.episodeId || libraryItem.media.id
|
||||
let userProgressForItem = user.getMediaProgress(mediaItemId)
|
||||
if (userProgressForItem) {
|
||||
if (userProgressForItem.lastUpdate > session.updatedAt) {
|
||||
if (userProgressForItem.updatedAt.valueOf() > session.updatedAt) {
|
||||
Logger.debug(`[PlaybackSessionManager] Not updating progress for "${session.displayTitle}" because it has been updated more recently`)
|
||||
} else {
|
||||
Logger.debug(`[PlaybackSessionManager] Updating progress for "${session.displayTitle}" with current time ${session.currentTime} (previously ${userProgressForItem.currentTime})`)
|
||||
result.progressSynced = user.createUpdateMediaProgress(libraryItem, session.mediaProgressObject, session.episodeId)
|
||||
const updateResponse = await user.createUpdateMediaProgressFromPayload({
|
||||
libraryItemId: libraryItem.id,
|
||||
episodeId: session.episodeId,
|
||||
...session.mediaProgressObject
|
||||
})
|
||||
result.progressSynced = !!updateResponse.mediaProgress
|
||||
if (result.progressSynced) {
|
||||
userProgressForItem = updateResponse.mediaProgress
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Logger.debug(`[PlaybackSessionManager] Creating new media progress for media item "${session.displayTitle}"`)
|
||||
result.progressSynced = user.createUpdateMediaProgress(libraryItem, session.mediaProgressObject, session.episodeId)
|
||||
const updateResponse = await user.createUpdateMediaProgressFromPayload({
|
||||
libraryItemId: libraryItem.id,
|
||||
episodeId: session.episodeId,
|
||||
...session.mediaProgressObject
|
||||
})
|
||||
result.progressSynced = !!updateResponse.mediaProgress
|
||||
if (result.progressSynced) {
|
||||
userProgressForItem = updateResponse.mediaProgress
|
||||
}
|
||||
}
|
||||
|
||||
// Update user and emit socket event
|
||||
if (result.progressSynced) {
|
||||
const itemProgress = user.getMediaProgress(session.libraryItemId, session.episodeId)
|
||||
if (itemProgress) {
|
||||
await Database.upsertMediaProgress(itemProgress)
|
||||
SocketAuthority.clientEmitter(user.id, 'user_item_progress_updated', {
|
||||
id: itemProgress.id,
|
||||
sessionId: session.id,
|
||||
deviceDescription: session.deviceDescription,
|
||||
data: itemProgress.toJSON()
|
||||
})
|
||||
}
|
||||
SocketAuthority.clientEmitter(user.id, 'user_item_progress_updated', {
|
||||
id: userProgressForItem.id,
|
||||
sessionId: session.id,
|
||||
deviceDescription: session.deviceDescription,
|
||||
data: userProgressForItem.getOldMediaProgress()
|
||||
})
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {import('../controllers/SessionController').RequestWithUser} req
|
||||
* @param {*} res
|
||||
*/
|
||||
async syncLocalSessionRequest(req, res) {
|
||||
const deviceInfo = await this.getDeviceInfo(req, req.body?.deviceInfo)
|
||||
const user = req.user
|
||||
const sessionJson = req.body
|
||||
const result = await this.syncLocalSession(user, sessionJson, deviceInfo)
|
||||
const result = await this.syncLocalSession(req.userNew, sessionJson, deviceInfo)
|
||||
if (result.error) {
|
||||
res.status(500).send(result.error)
|
||||
} else {
|
||||
|
@ -216,6 +247,13 @@ class PlaybackSessionManager {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {import('../models/User')} user
|
||||
* @param {*} session
|
||||
* @param {*} syncData
|
||||
* @param {import('express').Response} res
|
||||
*/
|
||||
async closeSessionRequest(user, session, syncData, res) {
|
||||
await this.closeSession(user, session, syncData)
|
||||
res.sendStatus(200)
|
||||
|
@ -223,7 +261,7 @@ class PlaybackSessionManager {
|
|||
|
||||
/**
|
||||
*
|
||||
* @param {import('../objects/user/User')} user
|
||||
* @param {import('../models/User')} user
|
||||
* @param {DeviceInfo} deviceInfo
|
||||
* @param {import('../objects/LibraryItem')} libraryItem
|
||||
* @param {string|null} episodeId
|
||||
|
@ -241,7 +279,8 @@ class PlaybackSessionManager {
|
|||
const shouldDirectPlay = options.forceDirectPlay || (!options.forceTranscode && libraryItem.media.checkCanDirectPlay(options, episodeId))
|
||||
const mediaPlayer = options.mediaPlayer || 'unknown'
|
||||
|
||||
const userProgress = libraryItem.isMusic ? null : user.getMediaProgress(libraryItem.id, episodeId)
|
||||
const mediaItemId = episodeId || libraryItem.media.id
|
||||
const userProgress = user.getMediaProgress(mediaItemId)
|
||||
let userStartTime = 0
|
||||
if (userProgress) {
|
||||
if (userProgress.isFinished) {
|
||||
|
@ -292,6 +331,13 @@ class PlaybackSessionManager {
|
|||
return newPlaybackSession
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {import('../models/User')} user
|
||||
* @param {*} session
|
||||
* @param {*} syncData
|
||||
* @returns
|
||||
*/
|
||||
async syncSession(user, session, syncData) {
|
||||
const libraryItem = await Database.libraryItemModel.getOldById(session.libraryItemId)
|
||||
if (!libraryItem) {
|
||||
|
@ -303,20 +349,19 @@ class PlaybackSessionManager {
|
|||
session.addListeningTime(syncData.timeListened)
|
||||
Logger.debug(`[PlaybackSessionManager] syncSession "${session.id}" (Device: ${session.deviceDescription}) | Total Time Listened: ${session.timeListening}`)
|
||||
|
||||
const itemProgressUpdate = {
|
||||
const updateResponse = await user.createUpdateMediaProgressFromPayload({
|
||||
libraryItemId: libraryItem.id,
|
||||
episodeId: session.episodeId,
|
||||
duration: syncData.duration,
|
||||
currentTime: syncData.currentTime,
|
||||
progress: session.progress
|
||||
}
|
||||
const wasUpdated = user.createUpdateMediaProgress(libraryItem, itemProgressUpdate, session.episodeId)
|
||||
if (wasUpdated) {
|
||||
const itemProgress = user.getMediaProgress(session.libraryItemId, session.episodeId)
|
||||
if (itemProgress) await Database.upsertMediaProgress(itemProgress)
|
||||
})
|
||||
if (updateResponse.mediaProgress) {
|
||||
SocketAuthority.clientEmitter(user.id, 'user_item_progress_updated', {
|
||||
id: itemProgress.id,
|
||||
id: updateResponse.mediaProgress.id,
|
||||
sessionId: session.id,
|
||||
deviceDescription: session.deviceDescription,
|
||||
data: itemProgress.toJSON()
|
||||
data: updateResponse.mediaProgress.getOldMediaProgress()
|
||||
})
|
||||
}
|
||||
this.saveSession(session)
|
||||
|
@ -325,6 +370,13 @@ class PlaybackSessionManager {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {import('../models/User')} user
|
||||
* @param {*} session
|
||||
* @param {*} syncData
|
||||
* @returns
|
||||
*/
|
||||
async closeSession(user, session, syncData = null) {
|
||||
if (syncData) {
|
||||
await this.syncSession(user, session, syncData)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue