Fix:Mark media as finished if less than 5 seconds remain on a sync and call progress sync again when last track ends #635

This commit is contained in:
advplyr 2022-05-29 12:55:14 -05:00
parent 6161daeef0
commit 93b8e11378
5 changed files with 18 additions and 6 deletions

View File

@ -52,12 +52,12 @@ export default class CastPlayer extends EventEmitter {
return
}
// var currentItemId = media.currentItemId
var currentItemId = media.media.itemId
if (currentItemId && this.currentTrackIndex !== currentItemId - 1) {
this.currentTrackIndex = currentItemId - 1
}
// TODO: Emit finished event
if (media.playerState !== this.castPlayerState) {
this.emit('stateChange', media.playerState)
this.castPlayerState = media.playerState

View File

@ -76,6 +76,7 @@ export default class LocalPlayer extends EventEmitter {
this.loadCurrentTrack()
} else {
console.log(`[LocalPlayer] Ended`)
this.emit('finished')
}
}
evtError(error) {

View File

@ -101,6 +101,7 @@ export default class PlayerHandler {
this.player.on('timeupdate', this.playerTimeupdate.bind(this))
this.player.on('buffertimeUpdate', this.playerBufferTimeUpdate.bind(this))
this.player.on('error', this.playerError.bind(this))
this.player.on('finished', this.playerFinished.bind(this))
}
playerError() {
@ -111,6 +112,16 @@ export default class PlayerHandler {
}
}
playerFinished() {
this.stopPlayInterval()
var currentTime = this.player.getCurrentTime()
this.ctx.setCurrentTime(currentTime)
// TODO: Add listening time between last sync and now?
this.sendProgressSync(currentTime)
}
playerStateChange(state) {
console.log('[PlayerHandler] Player state change', state)
this.playerState = state

View File

@ -173,9 +173,6 @@ class Server {
// Metadata folder static path
app.use('/metadata', this.authMiddleware.bind(this), express.static(global.MetadataPath))
// TODO: Are these necessary?
// Downloads folder static path
// app.use('/downloads', this.authMiddleware.bind(this), express.static(this.downloadManager.downloadDirPath))
// Static folder
app.use(express.static(Path.join(global.appRoot, 'static')))
@ -212,7 +209,7 @@ class Server {
const dyanimicRoutes = [
'/item/:id',
'/item/:id/manage',
'/item/:id/chapters',
'/audiobook/:id/chapters',
'/audiobook/:id/edit',
'/library/:library',
'/library/:library/search',
@ -220,6 +217,7 @@ class Server {
'/library/:library/authors',
'/library/:library/series/:id?',
'/config/users/:id',
'/config/users/:id/sessions',
'/collection/:id'
]
dyanimicRoutes.forEach((route) => app.get(route, (req, res) => res.sendFile(Path.join(distPath, 'index.html'))))

View File

@ -89,7 +89,9 @@ class MediaProgress {
}
}
if (this.progress >= 1 && !this.isFinished) {
var timeRemaining = this.duration - this.currentTime
// If time remaining is less than 5 seconds then mark as finished
if ((this.progress >= 1 || (!isNaN(timeRemaining) && timeRemaining < 5)) && !this.isFinished) {
this.isFinished = true
this.finishedAt = Date.now()
this.progress = 1