diff --git a/client/players/CastPlayer.js b/client/players/CastPlayer.js index 8937a108..f5508eab 100644 --- a/client/players/CastPlayer.js +++ b/client/players/CastPlayer.js @@ -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 diff --git a/client/players/LocalPlayer.js b/client/players/LocalPlayer.js index db0798c0..81644fdc 100644 --- a/client/players/LocalPlayer.js +++ b/client/players/LocalPlayer.js @@ -76,6 +76,7 @@ export default class LocalPlayer extends EventEmitter { this.loadCurrentTrack() } else { console.log(`[LocalPlayer] Ended`) + this.emit('finished') } } evtError(error) { diff --git a/client/players/PlayerHandler.js b/client/players/PlayerHandler.js index fdc25278..bb029537 100644 --- a/client/players/PlayerHandler.js +++ b/client/players/PlayerHandler.js @@ -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 diff --git a/server/Server.js b/server/Server.js index c34fde26..080cac75 100644 --- a/server/Server.js +++ b/server/Server.js @@ -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')))) diff --git a/server/objects/user/MediaProgress.js b/server/objects/user/MediaProgress.js index 9cb266a2..bb5e1d62 100644 --- a/server/objects/user/MediaProgress.js +++ b/server/objects/user/MediaProgress.js @@ -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