From 33e0987d7325191b82bc99b51ef3426b5d300e80 Mon Sep 17 00:00:00 2001 From: Vito0912 <86927734+Vito0912@users.noreply.github.com> Date: Sat, 7 Dec 2024 10:09:14 +0100 Subject: [PATCH 1/6] Added mediaMetadata to playbackSessions --- server/managers/PlaybackSessionManager.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/server/managers/PlaybackSessionManager.js b/server/managers/PlaybackSessionManager.js index ce43fc8c..d0daa3ba 100644 --- a/server/managers/PlaybackSessionManager.js +++ b/server/managers/PlaybackSessionManager.js @@ -175,6 +175,12 @@ class PlaybackSessionManager { // New session from local session = new PlaybackSession(sessionJson) session.deviceInfo = deviceInfo + // This makes sure that the client's metadata is preferred over the library's metadata, if available, to make a non-breaking change + if(session.mediaMetadata == null) { + // Only sync important metadata + const { title, subtitle, narrators, authors, series, genres } = libraryItem.media.metadata || {}; + session.mediaMetadata = { title, subtitle, narrators, authors, series, genres }; + } session.setDuration(libraryItem, sessionJson.episodeId) Logger.debug(`[PlaybackSessionManager] Inserting new session for "${session.displayTitle}" (${session.id})`) await Database.createPlaybackSession(session) From 89167543fa18e43eab06bf194bbc1996bb08b648 Mon Sep 17 00:00:00 2001 From: Vito0912 <86927734+Vito0912@users.noreply.github.com> Date: Sat, 7 Dec 2024 10:25:52 +0100 Subject: [PATCH 2/6] added author for podcasts --- server/managers/PlaybackSessionManager.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/managers/PlaybackSessionManager.js b/server/managers/PlaybackSessionManager.js index d0daa3ba..8dd7bc36 100644 --- a/server/managers/PlaybackSessionManager.js +++ b/server/managers/PlaybackSessionManager.js @@ -178,8 +178,8 @@ class PlaybackSessionManager { // This makes sure that the client's metadata is preferred over the library's metadata, if available, to make a non-breaking change if(session.mediaMetadata == null) { // Only sync important metadata - const { title, subtitle, narrators, authors, series, genres } = libraryItem.media.metadata || {}; - session.mediaMetadata = { title, subtitle, narrators, authors, series, genres }; + const { title, subtitle, narrators, authors, author, series, genres } = libraryItem.media.metadata || {}; + session.mediaMetadata = { title, subtitle, narrators, authors, series, genres, author}; } session.setDuration(libraryItem, sessionJson.episodeId) Logger.debug(`[PlaybackSessionManager] Inserting new session for "${session.displayTitle}" (${session.id})`) From 2fbb31e0ea84fabe0e08564141d427e3ab385cbf Mon Sep 17 00:00:00 2001 From: Vito0912 <86927734+Vito0912@users.noreply.github.com> Date: Sat, 7 Dec 2024 10:37:00 +0100 Subject: [PATCH 3/6] added null saftey and added displayTitle and displayAuthor --- server/managers/PlaybackSessionManager.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/server/managers/PlaybackSessionManager.js b/server/managers/PlaybackSessionManager.js index 8dd7bc36..e8704470 100644 --- a/server/managers/PlaybackSessionManager.js +++ b/server/managers/PlaybackSessionManager.js @@ -178,8 +178,14 @@ class PlaybackSessionManager { // This makes sure that the client's metadata is preferred over the library's metadata, if available, to make a non-breaking change if(session.mediaMetadata == null) { // Only sync important metadata - const { title, subtitle, narrators, authors, author, series, genres } = libraryItem.media.metadata || {}; - session.mediaMetadata = { title, subtitle, narrators, authors, series, genres, author}; + const { title, subtitle, narrators, authors, author, series, genres } = libraryItem?.media?.metadata || {} + session.mediaMetadata = { title, subtitle, narrators, authors, series, genres, author} + } + if(session.displayTitle == null || session.displayTitle === '') { + session.displayTitle = libraryItem?.media?.metadata?.title ?? '' + } + if(session.displayAuthor == null || session.displayAuthor === '') { + session.displayAuthor = libraryItem?.media?.metadata?.authors?.map(a => a.name).join(', ') ?? libraryItem?.media?.metadata?.author ?? '' } session.setDuration(libraryItem, sessionJson.episodeId) Logger.debug(`[PlaybackSessionManager] Inserting new session for "${session.displayTitle}" (${session.id})`) From f9bbd7117405e393c8bef56653cb279575896c32 Mon Sep 17 00:00:00 2001 From: Vito0912 <86927734+Vito0912@users.noreply.github.com> Date: Tue, 17 Dec 2024 15:27:37 +0100 Subject: [PATCH 4/6] added type to be saved. Should support podcasts It should support everything important from the podcast metadata: https://api.audiobookshelf.org/#podcast-metadata And the book metadata: https://api.audiobookshelf.org/#book-metadata --- server/managers/PlaybackSessionManager.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/managers/PlaybackSessionManager.js b/server/managers/PlaybackSessionManager.js index e8704470..1f40f38e 100644 --- a/server/managers/PlaybackSessionManager.js +++ b/server/managers/PlaybackSessionManager.js @@ -178,8 +178,8 @@ class PlaybackSessionManager { // This makes sure that the client's metadata is preferred over the library's metadata, if available, to make a non-breaking change if(session.mediaMetadata == null) { // Only sync important metadata - const { title, subtitle, narrators, authors, author, series, genres } = libraryItem?.media?.metadata || {} - session.mediaMetadata = { title, subtitle, narrators, authors, series, genres, author} + const { title, subtitle, narrators, authors, author, series, genres, type } = libraryItem?.media?.metadata || {} + session.mediaMetadata = { title, subtitle, narrators, authors, author, series, genres, type } } if(session.displayTitle == null || session.displayTitle === '') { session.displayTitle = libraryItem?.media?.metadata?.title ?? '' From e6ab05e1772eef30c0be27d47d3c9d7a5cf43627 Mon Sep 17 00:00:00 2001 From: Vito0912 <86927734+Vito0912@users.noreply.github.com> Date: Fri, 18 Apr 2025 07:29:34 +0200 Subject: [PATCH 5/6] update so also populates data if mediaMetadata is not null --- server/managers/PlaybackSessionManager.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/server/managers/PlaybackSessionManager.js b/server/managers/PlaybackSessionManager.js index dab142ab..beaa7207 100644 --- a/server/managers/PlaybackSessionManager.js +++ b/server/managers/PlaybackSessionManager.js @@ -176,11 +176,23 @@ class PlaybackSessionManager { session = new PlaybackSession(sessionJson) session.deviceInfo = deviceInfo // This makes sure that the client's metadata is preferred over the library's metadata, if available, to make a non-breaking change - if(session.mediaMetadata == null) { - // Only sync important metadata - const { title, subtitle, narrators, authors, author, series, genres, type } = libraryItem?.media?.metadata || {} - session.mediaMetadata = { title, subtitle, narrators, authors, author, series, genres, type } + if (session.mediaMetadata == null) { + session.mediaMetadata = {} } + + const { title, subtitle, narrators, authors, author, series, genres, type } = libraryItem?.media?.metadata || {} + session.mediaMetadata = { + title: session.mediaMetadata.title || title, + subtitle: session.mediaMetadata.subtitle || subtitle, + narrators: session.mediaMetadata.narrators || narrators, + authors: session.mediaMetadata.authors || authors, + author: session.mediaMetadata.author || author, + series: session.mediaMetadata.series || series, + genres: session.mediaMetadata.genres || genres, + type: session.mediaMetadata.type || type, + ...session.mediaMetadata + } + if(session.displayTitle == null || session.displayTitle === '') { session.displayTitle = libraryItem?.media?.metadata?.title ?? '' } From 2caa861b8a56694f70ad26229d3e2d6899c7301d Mon Sep 17 00:00:00 2001 From: advplyr Date: Fri, 18 Apr 2025 17:04:11 -0500 Subject: [PATCH 6/6] Update local session mediaMetadata with current item mediaMetadata for undefined values --- server/managers/PlaybackSessionManager.js | 27 +++++++++-------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/server/managers/PlaybackSessionManager.js b/server/managers/PlaybackSessionManager.js index beaa7207..f410cdaf 100644 --- a/server/managers/PlaybackSessionManager.js +++ b/server/managers/PlaybackSessionManager.js @@ -175,29 +175,24 @@ class PlaybackSessionManager { // New session from local session = new PlaybackSession(sessionJson) session.deviceInfo = deviceInfo - // This makes sure that the client's metadata is preferred over the library's metadata, if available, to make a non-breaking change + if (session.mediaMetadata == null) { session.mediaMetadata = {} } - const { title, subtitle, narrators, authors, author, series, genres, type } = libraryItem?.media?.metadata || {} - session.mediaMetadata = { - title: session.mediaMetadata.title || title, - subtitle: session.mediaMetadata.subtitle || subtitle, - narrators: session.mediaMetadata.narrators || narrators, - authors: session.mediaMetadata.authors || authors, - author: session.mediaMetadata.author || author, - series: session.mediaMetadata.series || series, - genres: session.mediaMetadata.genres || genres, - type: session.mediaMetadata.type || type, - ...session.mediaMetadata + // Populate mediaMetadata with the current library items metadata for any keys not set by client + const libraryItemMediaMetadata = libraryItem.media.oldMetadataToJSON() + for (const key in libraryItemMediaMetadata) { + if (session.mediaMetadata[key] === undefined) { + session.mediaMetadata[key] = libraryItemMediaMetadata[key] + } } - if(session.displayTitle == null || session.displayTitle === '') { - session.displayTitle = libraryItem?.media?.metadata?.title ?? '' + if (session.displayTitle == null || session.displayTitle === '') { + session.displayTitle = libraryItem.title } - if(session.displayAuthor == null || session.displayAuthor === '') { - session.displayAuthor = libraryItem?.media?.metadata?.authors?.map(a => a.name).join(', ') ?? libraryItem?.media?.metadata?.author ?? '' + if (session.displayAuthor == null || session.displayAuthor === '') { + session.displayAuthor = libraryItem.authorNamesFirstLast } session.duration = libraryItem.media.getPlaybackDuration(sessionJson.episodeId)